Troubleshooting Posted by the DataCops team

Google Ads offline conversions not showing up after upload: what to check

Short answer

"Success" only means the file was accepted. Check auto-tagging, an exact GCLID, a click under 90 days old, a conversion time after the click and an import-type action. Often the click ID never reached the CRM.

You upload the file. Google says "success". You refresh the conversions column. Zero.

Nothing makes you feel dumber than a green tick next to an empty report. So let me start with the thing that makes the rest make sense: "success" doesn't mean what you think. It usually means the file was accepted, not that any row matched a click. Those are two very different events, and almost every "it doesn't work" story is someone treating the first as the second.

Here's the order I'd check things in, cheapest first.

1. Is auto-tagging on? Without it, Google never adds the click ID (GCLID) to your landing page URL as ?gclid=, so there was never anything to upload. Ten seconds to check, and it's a shocking share of the mysteries.

2. Is the GCLID exactly the one from the click? Trimmed, lowercased, cut off by a spreadsheet, or copied from the wrong lead: any of those matches nothing. A GCLID is long and case-sensitive. Treat it like a password, not like a name.

3. How old is the click? Google ignores offline conversions uploaded more than 90 days after the click. A long sales cycle can quietly time itself out, and it looks identical to a broken upload.

4. Is the conversion time after the click time, in the format and time zone Google expects? A sale dated before its own click gets thrown away. This one bites people who export from a CRM that stamps dates in a different time zone from the ad account.

5. Is the conversion action an import type? A normal website conversion action won't accept an upload, however correct your file is.

6. Have you waited a day? Uploads aren't instant. Give it time, then read the upload report in Google Ads. It tells you what was rejected and why, which is far more useful than staring at the conversions column.

Let me walk through a made-up example, because the pattern is what matters. You upload 40 rows and 0 match. Check one, two and five pass. Check three passes: all clicks are under 90 days. Check four: the CRM exports UTC and the ad account is in another time zone, so 12 rows are dated before their clicks. That explains 12. The other 28? Open five of them in the CRM: the GCLID field is empty. They never had a click ID. Nothing on the Google side was ever wrong.

That's the insight I'd take away. Most of the time the failure is upstream of Google. The click ID never made it into the CRM in the first place. Everything you do at the upload step is polishing a file that was empty when it started.

A trick that saves hours: build a pre-flight filter before you upload anything. Drop the rows with an empty GCLID. Drop the rows where the click is more than 90 days old. Drop the rows where the conversion time comes before the click. Upload only what's left. You'll upload fewer rows and get a much cleaner result, and the rows you dropped are a free measurement of how big your upstream problem is. If 60 percent of your file gets filtered out, you now know your real project isn't the upload.

And when you do read the upload report, read it by category, not by row. Count how many rows fall into each rejection reason. If one reason owns most of them, fix that one first. Trying to chase individual rows is how an afternoon disappears.

One honest limit: for Google Ads, per-row rejections from Google aren't read back yet, so the upload report in Google Ads is still where you'd look for those. And if you build your own upload against the API, note Google asks new integrations built since June 2026 to use its Data Manager API.

Which of the six turned out to be yours?

For reference, DataCops sends to Google Ads matched by click ID, and its conversion actions start as secondary so nothing changes your bidding until you decide. It doesn't read Google's per-row rejections back yet, so the upload report in Google Ads is still where you'd look for those.

DataCops in short

For this question: DataCops keeps the GCLID on the server from the first visit and shows each upload as sent, held, skipped or failed with the reason, so you see why a conversion did not appear instead of a bare success message.

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: Google Ads offline conversions, and the complete guide to offline conversion tracking.

1 comment

Comments (1)

DataCops team author · 30 Sep 2026

Since it always comes up: the GCLID is the Google Click ID. On some iOS traffic Google uses GBRAID or WBRAID instead. WBRAID appears when a click in a Google app opens your website, GBRAID when it leads to an app. Both can be uploaded as offline conversions, so keep whichever one arrives.

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