Facebook offline conversions in 2026: how to send CRM sales to Meta now that the upload is gone
So here's a fun way to lose money.
Follow a guide that's two years old. Export your won deals from the CRM. Upload the CSV to an "offline event set" in Meta. Watch it succeed. Feel great.
Except the offline event set doesn't exist anymore. Meta shut down the separate Offline Conversions API in May 2025.
So where do your sales go now? Same place as everything else: the regular Conversions API, into a dataset. An offline sale is basically just a server event that shows up late.
That sounds simpler. And it is. Right until you hit the part nobody mentions.
Late has a limit. Meta rejects events that arrive more than 7 days after they happened.
Let me show you what that does to the classic monthly CSV, with a made-up example. You export 200 won deals on the first of the month. Sales were spread evenly over the last 30 days, so roughly 70 of them are older than a week. Those 70 are dead on arrival. Meta drops them, no error, no warning. You see 130 matches out of 200 rows and assume Meta is being Meta.
It's like the post office quietly binning every letter that took too long, and never telling you. And notice the cruel part: the oldest sales are usually the ones you worked hardest for.
Now, even the rows that survive have to be matched. Meta has no idea who "lead 4471" is. It needs a hashed email or phone, and the click ID (fbclid) if you kept it. That 0 to 10 score in Events Manager, Event Match Quality? It's basically a data hygiene report on your CRM, wearing a Meta costume. Half-empty contacts, fake emails, phone numbers with no country code: they all show up there.
A small thing that ruins a lot of feeds: hashing before cleaning. Email should be lowercase and trimmed. Phone should be digits with the country code. Hash " [email protected] " and you get a perfectly valid hash of a perfectly useless string. It matches nobody, and nothing tells you.
Then two traps that only appear after the first two are fixed.
Double counting. Your pixel reports the purchase. Then the CRM reports the same sale. Meta only treats them as one event if the name and the event_id match. If they don't, one sale becomes two, and your ROAS looks amazing for a week. Until someone opens the bank account.
And stage labels. If you send every stage as "Purchase", you've told Meta a booked call is a sale. It will very faithfully find you more booked calls. Ones that never show up. Send booked, showed, won and paid as different events, then pick which one you optimise on.
Here's the bigger idea underneath all five problems: none of them are Meta being difficult. They're what happens when a process built for a weekly file meets a system built for a live feed. The fix isn't a smarter spreadsheet. It's a different shape: send each stage the moment it happens, with a match key, an event ID, and a name that says what it is.
Whatever you use, do the ten-minute test. Take your last 20 won deals. Count how many show up as events in Events Manager. If that number surprises you, that's your project for this month, more than any new creative.
So how are you doing it? Zapier, the CRM's own action, custom code, or the sales just never go back? No judgment. I suspect that last one is the most common answer.
More on this: Meta offline conversions, and the complete guide to offline conversion tracking.