The short answer
Meta retired the Offline Conversions API and offline event sets in May 2025. Offline sales now go through the regular Conversions API into your dataset, with action_source set to physical_store, a hashed email or phone, the real time of the sale and a unique ID. Meta rejects events dated more than 7 days before you send them, so a monthly upload silently loses most of its rows. Send each sale when it happens, or at least daily.
DataCops is a tool that sends your CRM, store and Shopify sales to Meta through the Conversions API, gives every visit a bot verdict (Real people only keeps flagged visits out of each platform you choose), logs every send, and warms up new campaigns with the customers you already have (Ads Warmup).
How DataCops does it:
- Warm up with the customers you already have. Sales older than 7 days cannot go to Meta as offline conversions. Ads Warmup sends your past buyer list anyway: upload a CSV (up to 20,000 rows), see a match score for every person, and send them to Meta, Google Ads and TikTok as fresh signal, so a new campaign does not start cold.
- Capture the click first. The click ID is read on your own domain when the visitor lands (or at Cloudflare's edge with the free Worker) and kept on the server for up to 90 days.
- Send each stage when it happens. HighLevel natively (lead, booked, showed, won with value, paid), or any CRM through a webhook, so every sale lands inside Meta's window.
- Match and count once. Click ID or hashed email and phone, with the order or deal ID so a retry never becomes a second sale.
- Send only real people. Every visit gets a bot verdict against 360+ billion IPs, every form email is checked (disposable providers, domains with no mail server and an email risk score), and LeadCops can hold a lead until your CRM confirms it, so fake leads do not train your campaigns.
- Shopify too. The DataCops Shopify app sends online orders plus phone, draft and in-person orders.
- Consent first. A first-party consent banner on your own domain decides what may be sent.
- See what left. A delivery log row for every conversion: sent, held, skipped or failed, with the reason.
Best for: lead gen, HighLevel agencies, B2B with long sales cycles, clinics and home services, and Shopify stores.
What changed in May 2025
Until 2025, offline sales had their own road. You created an offline event set, exported a CSV from your CRM or point of sale, and uploaded it, or you pushed rows to the Offline Conversions API. Online and offline data lived in separate places.
Meta closed that road. The Offline Conversions API and offline event sets were retired, and offline events now travel through the same Conversions API as website events, into the same dataset. Meta's offline events guide asks for action_source set to physical_store for offline and store events.
Before
Offline event set, CSV upload or Offline Conversions API, separate from your pixel data, forgiving about timing.
Now
One dataset, one Conversions API, online and offline together, deduplicated together, and strict about when each event happened.
Most guides still describe the old upload, which is why so many teams believe their feed works while Meta quietly drops it.
Tools that send offline conversions to Meta
| Tool | Best for | Watch out for |
|---|---|---|
| DataCops | Sending every CRM stage and store sale as it happens, plus Ads Warmup for your existing customer list, bots and fake leads filtered first, to Meta plus Google Ads, TikTok and LinkedIn, with a log of every send | Needs a match key at the sale: a form, a checkout or a CRM record |
| Your CRM's own Meta integration | One account, simple stages, mostly Facebook lead form leads | One setup per account, gaps in what it covers, little visibility when a send fails |
| Zapier, Make or n8n | Quick custom connections | No bot filter, no deduplication unless you build it; see the Zapier comparison |
| LeadsBridge | Lead form syncs between many apps | Built around syncing data, not filtering it; see the LeadsBridge comparison |
| Custom code on the Conversions API | Teams with developers and unusual needs | Someone must own retries, deduplication and Meta's changes for the long run |
When not to use DataCops
- One account, most leads from Facebook lead forms, Meta only. Your CRM's own Meta action may be enough. Use it and stop.
- You have developers and unusual requirements. Building directly on the Conversions API gives full control, if someone owns it for the long run.
Sales older than 7 days? Use them to warm up your ads
The 7-day rule means last year's customers can never go to Meta as offline conversions of past ads. But they are still the best description of who buys from you. That is what Ads Warmup, DataCops' flagship feature, is for.
- Upload your customer list. A CSV of past buyers, old leads or booked calls. DataCops reads your columns; only email is required.
- See a match score for every person. An estimate from 0 to 10, based on email, phone, name, location, click ID and customer ID, before anything is sent.
- Pick the event. Purchase, Lead, Complete registration, Add to cart or Schedule.
- Send server-side. Up to 20,000 people per upload go to Meta, Google Ads and TikTok, with a sent, skipped or failed result per person.
Be clear about what it is. Each row is dated when you press send, not with the old sale date, so it does not credit old ads with old sales. It gives a new campaign or a fresh pixel real buyers to learn from on day one, instead of paying to guess. Uploading and previewing are free; sending needs a paid plan.
Offline conversions
New sales, each sent within 7 days, matched to the ad click. Tells Meta which ads work.
Ads Warmup
Your existing customer list, sent today as fresh signal. Tells Meta who your buyers are before you spend.
Use offline conversions for every new sale. Use Ads Warmup for every customer you already have.
The time limit nobody reads twice
Meta's Conversions API documentation is blunt: the event time can be up to 7 days before you send it, and if any event in a request is older, Meta returns an error for the whole request and processes none of it. Meta's offline events guide adds that physical store transactions should be uploaded within 62 days, and recommends uploading in real time or daily. The safe reading is simple: date every event with the real time of the sale, and send within 7 days.
Here is what that does to a monthly upload, as a worked example. Thirty sales spread evenly over a month, uploaded once on the 1st. Only the last week's sales are inside the window. Roughly three quarters of the file is too old, and if those rows travel in the same request as the fresh ones, the fresh ones can be refused with them.
| How often you send | What reaches Meta |
|---|---|
| Weekly file | Most of them, if you never miss a week |
| Daily | Nearly all of them |
| Each sale as it happens | All of them, while the signal is still fresh |
A sale Meta never accepted teaches your ads nothing, however good the deal was.
Three ways to upload offline conversions today
| Way | Good for | Watch out for |
|---|---|---|
| File upload in Events Manager | Occasional imports, small volumes | Manual, easy to send late; check Meta's current help page for the steps |
| Your CRM's own Meta integration or Zapier | One account, one CRM, simple stages | Coverage gaps, one setup per account, little visibility when a send fails |
| Conversions API from a server or tool | Sending each stage as it happens, many accounts, several ad platforms | Someone must own the setup, or use a tool that does |
If you compare tools for this, our native sync vs Zapier vs a dedicated tool guide walks through the trade-offs, and the Zapier comparison covers what usually breaks.
The fields Meta needs
| Field | What to send |
|---|---|
event_name | A standard event such as Purchase or Lead. Use different events for different stages, so a booked call is never counted as a sale. |
event_time | The moment the sale happened, as a Unix timestamp. Never the upload time. |
action_source | physical_store for offline and store events, per Meta's offline guide. |
user_data | Hashed email and phone at minimum; hashed name, city and postcode help. Add the click (fbc) when you have it. |
custom_data | Value and currency for sales. |
event_id / order ID | One ID per sale, reused on every retry, so Meta deduplicates. |
The full vocabulary is in our offline conversions glossary.
Getting a good match
Meta has to find the person behind each row. It does that by matching hashed details against its own accounts, and it scores how well that works as Event Match Quality in Events Manager. Most low scores are a data problem, not a sending problem.
- Normalise before hashing. Emails lowercase and trimmed. Phones with the country code, digits only. A hash of a messy value matches nobody.
- Send more than one key. Email and phone together beat either alone.
- Keep the click. The fbclid from the ad click, captured on the first visit, ties the sale to the ad even when the email differs.
- Check one event by hand. Open a recent purchase in Events Manager and look at which keys arrived.
We go deeper in why Event Match Quality is low for CRM events.
Seven mistakes that lose sales
- Uploading monthly. Most rows are past the 7-day limit before you press the button.
- Upload time as event time. Meta learns the wrong timing, and the rows can be rejected.
- No click ID on the lead. An embedded form or a redirect drops it, and nobody notices.
- Every stage sent as Purchase. Meta then hunts for more booked calls that never pay.
- No shared ID. The pixel and the CRM both report the sale, and it counts twice.
- Hashing unclean data. Valid hashes of useless strings.
- No one watching. A renamed pipeline stage stops the feed, and the first alert is a bad month.
The full walkthrough of where a sale gets lost is in the offline conversions guide.
Fake leads: the problem the upload makes worse
The 2025 change did more than move an endpoint. Offline sales used to sit in their own event set, a little apart from your website data. Now they share one dataset and one pipe. Meta treats a CRM sale as ground truth, the strongest signal you can give it, and its delivery system learns from those signals quickly. Feed it real buyers and it finds more real buyers. Feed it a CRM that also holds bots, fake sign-ups and junk orders, and it learns from the mixture.
The loop closes on whatever you put in it. Junk in the CRM closes the loop on junk.
The B2B loop, clean and dirty
The clean version: someone clicks your Meta ad, downloads a guide, leaves an email. Sales calls, books a demo, sends a proposal, and the deal closes months later. That won deal goes to Meta with its value, matched to the original click, and Meta goes looking for more people like that buyer. For B2B it is the best signal you have.
The dirty version: a bot fills the same form with a believable name and email. It passes validation, lands in the CRM, and sales gives up after two calls. But your integration sends the "new lead" stage, or a "qualified" stage someone ticked in bulk, and that contact goes to Meta as a conversion too. Most teams cannot say which CRM stages flow to Meta. They set it up once, check the match rate and move on, so the junk enters quietly.
Three ways junk gets into an offline feed
- Bot and fake leads in the CRM. Realistic names, real-looking emails, plausible company domains. If any early stage is mapped to an event, they reach Meta as signal.
- Orders that later fall apart. Fraudulent phone or manual orders were real purchases on the day they were sent. The chargeback or refund comes weeks later, after Meta has already learned from the buyer. Read what happens to a refunded sale.
- Wrong timestamps. A weekly batch stamped with the upload date teaches Meta that your buyers convert on your upload schedule, blurs which campaign drove the sale, and pushes rows past the 7-day limit.
Filter before you fire
Checking a lead before it becomes a conversion is cheaper than letting Meta learn the wrong buyer. Four habits do most of the work:
- Send later stages. Booked, showed, won or paid. Bots rarely get that far.
- Check the visit. Was the session that created the contact a real person, or a data centre, VPN or known bot?
- Check the email. Disposable domains, domains with no mail server and brand-new domains are common in fake form fills.
- Hold until the CRM confirms. A lead counts when your team says it is real, not when the form is submitted.
This is the core of click fraud protection and lead generation tracking on DataCops.
The click ID cannot be added later
The fbclid from the ad click has to be stored on the contact at the moment it is created. You cannot add it afterwards, and without it Meta leans entirely on hashed email and phone. It also gets lost more often than people think: embedded forms and redirects drop it, and some browsers, Brave and Firefox among them, strip fbclid from the URL by name before a script can read it. Capturing it on your own domain, or at the edge, is what keeps it.
By CRM: HighLevel, HubSpot, Salesforce and others
| CRM | Its own Meta option | Through DataCops |
|---|---|---|
| HighLevel | A workflow action that covers contacts from a Facebook lead form or with a stored fbclid, set up per sub-account | Native: install once on the agency, pick the sub-accounts. HighLevel tracking |
| HubSpot | HubSpot's own ad conversion events, sent on lifecycle stage changes, with plan limits | Through the webhook |
| Salesforce | Partner connectors or custom code | Flow or Apex posts stages to the webhook. Salesforce guide |
| Pipedrive, Close, Zoho and others | Usually none, or Zapier | The webhook, directly or via Zapier, Make or n8n. Webhook guide |
| Spreadsheet | File upload | Ads Warmup for past customers (upload the list, see a match score per person, send up to 20,000 rows), the webhook for new sales. Sheets and CSV guide |
By business type
| Business | What the offline sale is | Guide |
|---|---|---|
| B2B and SaaS | Demo booked, deal won, first invoice paid, sometimes months after the click | B2B SaaS; SignupCops keeps the click through "Sign in with Google" |
| Home services | Quote booked, job done, invoice paid | Home services |
| Professional services | Consultation held, client signed | Professional services |
| Phone-led sales | A call that turned into a booking or order | Phone calls |
| Agencies | All of the above, across many client accounts | Agencies |
| Shopify stores | Every paid online order, express checkouts included | DataCops Shopify app |
How DataCops does it
- The click is captured on your domain. One script and one DNS record put collection on your own subdomain; with your DNS on Cloudflare, the free Worker reads the click at the edge before the page loads. The click ID is kept on the server for up to 90 days.
- Only real people go through. Every visit gets a bot verdict checked against an IP database covering 360+ billion IPs, and a Real people only switch per platform keeps bot visits out of what Meta learns from. LeadCops can also hold a lead's conversion until your CRM confirms it.
- Each stage goes when it happens. From HighLevel: lead, booked, showed, won with its value, and paid. Cancelled, no-show and lost are never sent. From any other CRM: a private webhook with the event, email or phone, value, currency, order ID and click IDs.
- Returning buyers are recognised. A signed first-party cookie, set by the server on your own domain, lasts up to 400 days where enabled, set only after consent and a clean bot check.
- Ads Warmup for past customers. Your existing customer list, scored per person and sent to Meta, Google Ads and TikTok, so new campaigns start warm. See above.
- It counts once. Pixel and server events share an event ID; the same order ID twice counts once.
- You see every send. A delivery log row per conversion, marked sent, held, skipped or failed, with the reason. For HighLevel the result is written back onto the contact.
- Fake emails are caught. Each form email is checked by fixed rules: disposable providers, domains with no mail server and an email risk score. With LeadCops (Business and up), a lead that fails is held and never billed.
- Consent is respected. The first-party consent manager decides what may be sent; consent is the one hard gate.
- You see the truth on your own site too. First-party analytics, a GA4 alternative, shows the same real-people traffic your ads learn from.
- Health advertisers are covered. Health mode cuts page links to the domain, uses neutral event names and leaves out anything that describes a condition. See Meta health restrictions.
Example of one sale, step by step (illustration, not customer data): a visitor clicks your Meta ad on Monday and fills the form. The click ID is stored on the server, the visit is checked and passes as a real person, and the email passes the check. Three weeks later the deal is marked won in the CRM. Two minutes after that, Meta receives a Purchase with the value, the click ID and the hashed email and phone, and the delivery log shows it as sent.
The same sales also go to Google Ads, TikTok and LinkedIn, through the same server-side setup. Details on the Meta offline conversions page.
Your setup checklist
- Capture the fbclid on every lead, on your own domain.
- Store email and phone, normalised, on every contact.
- Map each CRM stage to its own event; send later stages, not only the lead.
- Send each stage when it happens, never more than 7 days after the sale.
- Use one ID per sale and reuse it on retries.
- Keep bots and fake leads out before they become contacts.
- Send your existing customer list through Ads Warmup before a new campaign spends.
- Check Event Match Quality and your delivery log a week later.
FAQ
Can I upload old customers to Meta if the sales are older than 7 days?
Not as offline conversions of past ads; Meta rejects events dated more than 7 days back. You can send them as fresh signal instead: DataCops Ads Warmup takes a CSV of up to 20,000 customers, gives each a match score from 0 to 10 and sends them to Meta, Google Ads and TikTok dated when you send (on Google Ads, only people who clicked a Google ad are credited), so new campaigns learn from real buyers.
How do I upload offline conversions to Facebook in 2026?
Send them as events through the Conversions API into your Meta dataset, with action_source set to physical_store, a hashed email or phone, the event time of the sale, and a unique event or order ID. The separate Offline Conversions API and offline event sets were retired in May 2025.
Can I still upload a CSV of offline conversions to Meta?
Meta still documents ways to bring offline events into a dataset, but the old offline event set upload is gone, and a monthly file runs straight into the event-time limit. If you upload files, do it daily and check Meta's current help page for the exact steps.
How old can an offline event be when I send it to Meta?
Meta's Conversions API documentation says the event time can be at most 7 days before you send it, and a request with an older event is rejected as a whole. Meta's offline events guide also says to upload physical store transactions within 62 days. Plan for 7 days and send daily, as Meta recommends.
Which action_source should I use for CRM sales?
Meta's offline events guide asks for physical_store for offline and store events. The parameter also accepts values like phone_call, chat, system_generated and other, so use the one that honestly describes where the sale happened.
What is a good match rate for Facebook offline conversions?
There is no single official target. Meta shows Event Match Quality per event in Events Manager. Clean, normalised email and phone on every event, plus the click ID when you have it, is what moves it. Low scores usually mean missing or badly formatted identifiers.
Do I need the fbclid to upload offline conversions?
No, but it helps. Meta can match on hashed email and phone alone. Sending the click (fbc) as well, captured when the visitor first landed, makes the match stronger and ties the sale to the ad click.
How do I stop the same sale counting twice?
Give every sale one ID and send it every time. Pixel and server events with the same event name and event ID are deduplicated by Meta. For CRM sales, build the ID from the order or deal number so a retry cannot become a second sale.
Can I send offline conversions from HighLevel, HubSpot or Salesforce?
Yes. HighLevel has its own Meta action and DataCops installs natively on HighLevel agencies. HubSpot has its own ad conversion events with plan limits. Salesforce, Pipedrive and most other CRMs can post sales to a webhook that sends them to Meta.