Troubleshooting Posted by the DataCops team

Why does my Facebook offline conversions CSV lose rows? (the 7-day limit, with the maths)

Short answer

Meta rejects events more than 7 days old, counted from the sale date. A monthly upload loses roughly three weeks of sales. Send each stage as it happens instead.

If you upload a CSV to Meta and fewer conversions show up than rows in the file, there's a good chance it's not a bug. It's a rule.

Meta rejects events that arrive more than 7 days after they happened.

Not 7 days after the ad click. 7 days after the event itself. So the date that counts is the sale date in your file, not the day you uploaded it. That one distinction explains a huge share of "my upload is broken" threads.

Let me show you the maths, because it's uglier than people expect. Assume 30 sales a month, spread evenly. Upload once a month: on upload day, a week of them is inside the window and three weeks are outside. Roughly 23 of the 30 are dead before you press the button. You keep about a quarter of your sales. Upload weekly: you keep the rows that are under 7 days old at upload, which is all of them if you upload on time and none of the older ones if you're late. Upload daily: you keep nearly everything. (Assumes even spread and on-time uploads. The point is the shape, not the exact numbers.)

The cruel twist: the cheaper the process, the worse it gets. The monthly CSV is the lowest effort and the highest loss. And because there's no loud error, you just see a lower number than expected and put it down to Meta's mysterious ways.

Three things to check.

The event time column. Make sure it holds when the sale happened, not the export date. Some CRMs quietly stamp the export time on everything, which would make every row look brand new and hide the problem, until Meta's own timestamps disagree.

The match keys. A row with no hashed email, no hashed phone and no click ID has nothing to match on, even inside the window. So you can lose rows for two independent reasons at once and never know which.

The process. If yours is still called "upload to the offline event set", it needs a new name and a new shape. That upload was shut down in May 2025. Sales now go through the Conversions API, and the safest rhythm is to send each stage as it happens.

To estimate your own loss, take one month of sales dates and, for each sale, count the days between the sale and your upload. Every sale where that number is over 7 is a dead row. The share of dead rows is your loss rate. It takes five minutes in a spreadsheet.

Most teams that try this find the number is bigger than they guessed, and it's rarely random. It skews toward the oldest and largest deals, because big deals take longer to close and reach the CRM later. So the loss is worst for exactly the sales you'd most like Meta to learn from.

A healthy process has three properties. Latency in hours, not weeks. One event per stage. And something that tells you when a send fails. If yours has all three, you're ahead of most accounts.

How many rows do you lose per upload? If you've never counted, count once. It's usually an uncomfortable number.

For reference, DataCops sends each stage when the CRM reports it, with the click ID or a hashed email and phone, so nothing waits in a folder for a monthly export. There's a separate upload for past customers, up to 20,000 rows on a paid plan.

DataCops in short

For this question: DataCops sends each stage when it happens, not in a monthly file, so nothing ages past Meta's 7-day limit before it is sent.

DataCops is a tool that makes the ads learn from real sales: it sends booked, showed, won and paid stages from your CRM back to your ad platforms, gives every visit a bot verdict with a Real people only switch per platform, warms up new campaigns with your existing customers, and logs every send. It is not an attribution report.

How DataCops does it

  • The sale after the form. HighLevel natively (lead, booked, showed, won with value, paid; cancelled, no-show and lost are never sent), any other CRM through a private webhook, matched to the click by click ID or hashed email and phone.
  • The click is kept on the server. Click IDs are stored for up to 90 days, so a deal that closes weeks later still finds its click.
  • Real people only. Every visit gets a bot verdict against 360+ billion IPs and 350+ monitoring points, with a Real people only switch per ad platform, off by default. CRM events carry no bot flag.
  • Counted once, logged every time. Pixel and server events share an event ID, and a delivery log shows each send as sent, held, skipped or failed, with the reason.
  • One script, one DNS record. Collection runs on your own domain; with DNS on Cloudflare, the free Worker reads the click at the edge before the page loads.

Best for: ad-funded businesses whose sales close in a CRM or on a call: clinics, home services, agencies, B2B and lead gen.

Ads Warmup: tell the ads who pays

Ads Warmup, DataCops' flagship feature, sends customers you already have to Meta, Google Ads and TikTok before a new campaign spends: upload a CSV (only email is required, up to 20,000 rows), see a 0 to 10 match score per person, pick the event, and send. Rows are dated when you send, and Google Ads credits only people who clicked a Google ad. Preview is free; sending needs a paid plan. Check your own consent basis for the list first. See Ads Warmup.

Ways to do this job

OptionBest for
DataCopsCRM stages to Meta and Google Ads, with a bot verdict and a delivery log
Zapier or MakeOne simple CRM-to-ad flow you build and maintain
Direct API uploadTeams with an engineer
Manual CSV uploadOccasional batches

When not to use DataCops

  • You want a reporting dashboard. DataCops cleans and sends what goes into your ads. It is not a multi-touch reporting layer.
  • Your sales never leave one store checkout. If everything happens in one checkout, the platform's own pixel plus server events may be enough.

More on this: Meta offline conversions, and the complete guide to offline conversion tracking.

1 comment

Comments (1)

DataCops team author · 30 Sep 2026

Rule of thumb: if your sales cycle is longer than a week, a weekly or monthly batch is structurally the wrong shape for Meta. Not because you're doing it badly. Because the window is shorter than the batch.

1
Replies from DataCops account holders are coming soon. Until then, questions about your own setup can go to the team.

More threads

See what your own setup is missing

Send CRM sales back to the ad click that started them, logged per send.

Setup in 5 minutes. No credit card.

Live traffic quality

Updated just now

Visits · last 24h

487
Real users
35873.5%
Bots · auto-filtered
12926.5%

Without filtering, 26.5% of your reported traffic is bot noise inflating dashboards and draining ad spend.

Don't trust your analytics!

Make confident, data-driven decisions withactionable ad spend insights.

Setup in 2 minutes
No credit card