Troubleshooting Posted by the DataCops team

Click ID on the contact but not on the opportunity: why the sale never matches

Short answer

The event is built from the opportunity, and the click ID sits on the contact. Copy it onto the opportunity when it is created, or have the workflow fetch it from the contact before sending.

The sale never matches because the event is built from the opportunity, and the opportunity does not carry the click ID your contact has. Copy the click ID onto the opportunity when it is created, or make the workflow look it up from the contact before sending.

This one is sneaky because everything looks right. You open the contact, and there it is: a click ID from the ad, captured when the form was filled in. You open the deal, and the Won event went out. Yet the ad platform shows no match. So where did it go wrong?

Here is the mechanism. Many CRMs keep two separate records. The contact is the person. The opportunity is the deal. Fields you fill on one do not automatically appear on the other. When a form is submitted, the click ID usually lands on the contact. Later, someone creates an opportunity, and the automation that sends the sale reads its fields from the opportunity. The click ID field on that record is empty, so the event goes out with no click ID.

That is not always fatal. If the event still carries a hashed email or phone, Meta and Google can sometimes match on those. But a click ID is the strongest signal you have, because it points at one specific ad click. Losing it drops your match rate, and the drop tends to be worst on the people you most want to count, the ones who filled in a form from a phone and closed weeks later on a laptop.

There are a few ways the split happens. One is timing: the opportunity was created before the form data was written to the contact, so a copy step ran too early and copied nothing. Another is duplicates: the person filled in the form twice with two emails, so there are two contacts, and the deal hangs off the one without the click ID. A third is field mapping: the click ID field exists on both records but has a different name or type on each, so the copy silently fails.

To diagnose, take one closed deal and lay the records side by side. Does the contact have a click ID? Does the opportunity? Was the deal created before or after the form submission? Is there a second contact with the same phone number? Ten minutes with one real example beats an hour of theorising.

Then fix it at the source. Add a click ID field to the opportunity, and set a step that runs when the opportunity is created to copy it across from the contact. Better still, have the Won workflow read the click ID from the contact at send time, so timing never matters. Check the current documentation for your CRM to see which fields a workflow can read from a linked contact.

Here is a made-up example, invented to show the pattern. A mortgage broker runs Google Ads. Leads come in through a form, and the click ID is saved on the contact. Loan officers create the deal by hand two days later. Of 60 closed loans last quarter, only 9 reached Google with a click ID, because officers created most deals after a phone call from a different number, so a new contact was made without any click ID. Merging the duplicates and copying the field lifted the count to 41. It was not perfect, because 19 people had genuinely arrived without a captured click.

That leftover matters. Some click IDs will never exist. Safari limits how long cookies last, and iOS strips click IDs from links in some cases. So aim for most deals matched, not all, and be wary of any tool that promises everything.

Also keep the clock in mind. Click IDs are only useful for a limited time. Google Ads ignores uploads more than 90 days after the click, so a long sales cycle needs the click ID stored somewhere safe from day one.

Have you compared a contact and its opportunity side by side yet? Tell me which fields you see on each and I can help work out where it drops.

DataCops in short

For this question: DataCops keeps the click ID on the server and sends it with the stage, so it does not depend on the ID being copied onto the opportunity.

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

If you only have time for one thing, pick a single closed deal and check whether the click ID exists on the record the Won event reads from.

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