How to Send CRM Outcomes to Meta as Offline Events
Meta optimises toward whatever you show it. Here is how to show it qualified leads and closed deals instead of form fills.

This post shows you how to send CRM outcomes to Meta as offline events, so campaigns optimise toward qualified leads and closed deals instead of whoever fills in forms most eagerly.
Meta optimises toward whatever you show it. Show it form fills and it will find you people who love filling in forms.
When this fits
You generate leads on Meta Ads and close them elsewhere.
Lead quality varies enough that volume is a misleading metric.
You have a CRM, a spreadsheet, or anything that records outcomes.
How Meta handles offline data now
What used to be a separate Offline Conversions API has largely been folded into the Conversions API.
You send events the same way you would send server events, with an action source indicating they happened offline, plus the event time and your customer matching data.
Older guides describe a separate offline event set system. If you find yourself following one, check the date on it.
What you need to send
Matching data, which decides everything
fbclid and the _fbp cookie, captured at form submission: how to capture fbclid
Hashed email. SHA256, lowercased and trimmed first.
Hashed phone. E.164 format before hashing.
Name, city, postcode, country, hashed, if you have them.
Email alone gets you a mediocre match rate. Email plus click ID plus phone gets you a good one. The difference is usually the whole value of the project.
Event details
An event name, the real timestamp of the outcome, and a value with currency if there is revenue.
Use distinct names per stage. Do not send everything as Lead or you cannot tell the stages apart afterwards.
Let’s implement it
Capture fbclid and _fbp at form submission and store them on the record.
Decide which one or two CRM stages represent real progress.
On stage change, collect the identifiers, the value and the timestamp.
Hash email and phone at send time, not at storage time, so you keep raw values for your own use.
Post to the Conversions API with action_source set to an offline value.
Verify in Meta Events Manager.
Routes for step five: a Make or Zapier scenario, a scheduled job, or server side GTM if you are already running a container.
The timing constraint that catches people
Meta accepts offline events with a timestamp in the past, but only attributes them within its window, currently around 62 days.
So a ninety day sales cycle means your closed deals arrive too late to influence anything. Check your actual cycle length before you build, and if it is long, optimise toward an earlier stage that lands inside the window.
Deduplication
If the same conversion could also be sent from the browser, include an event ID on both so Meta can deduplicate.
For genuinely offline events there is usually nothing to deduplicate against, and including an ID anyway is a good habit that costs nothing.
Before you finish
Send a small test batch and check the match rate in Meta Events Manager. Above 60 percent with email plus click ID is reasonable.
Confirm events show the correct action source and timestamp.
Confirm values are landing rather than showing as zero. Currency mismatches silently zero things.
Compare Meta reported qualified leads against your CRM count after a few weeks.
Give campaigns two weeks to relearn before judging performance.
FAQ
Will my reported conversions go down?
Yes, and that is the point. Qualified leads are rarer than form fills. Cost per conversion rises and lead quality usually rises with it.
Do I still need the pixel?
Yes. The pixel and Conversions API handle on site events. This is about what happens afterwards. Different jobs.
What if hashing is wrong?
You get a low match rate and no error. Test by hashing a known email separately and comparing the strings. Whitespace and capitalisation are the usual culprits.
No CRM, just a sheet?
The same principle applies for Meta. I wrote a full walkthrough of that for Stape using nothing but a spreadsheet: Google Ads offline conversion tracking without a CRM. Click to read it here.
Need this built properly?
Meta will optimise toward whatever you feed it, so feed it revenue. I set up and repair tracking for ecommerce stores and lead generation businesses, so the numbers in your ad accounts match the money in your bank account.
Have a look at what I do, or book a call and we can go through your setup together.



















