Why does Google keep sending you the wrong leads?
Because it's optimising for exactly what you told it to count, and what you told it to count is form fills. For a trade business the money doesn't happen on the website. It happens on a phone call, on a site visit, on a quote that gets accepted three weeks after the click. Google saw a form fill and then nothing, ever again. A form fill from a tyre kicker and a form fill from a $15,000 repaint look identical to the machine, so it goes and finds you more of whatever fills forms cheapest, which is how accounts end up with sixty leads at $10 each and no work.
The machine isn't broken. It's under-informed. It's doing a precise job on the wrong definition of success, and only you can fix the definition, because only you know which leads became jobs.
What is offline conversion tracking?
It's the mechanism for telling the ad platform what happened after the click, once the outcome finally exists. The plumbing is less mysterious than it sounds.
When someone clicks your Google ad, Google appends a click identifier to your landing page URL. There are three of them, and exactly one arrives with any given click. Click identifiers The normal one is the GCLID, which covers a web ad click landing on your website, and for a trade business with no app it's nearly all you will ever see. The other two exist because of Apple's privacy rules: gbraid appears when a web ad click lands in an iOS app, and wbraid appears when an ad clicked inside an iOS app lands on your webpage. Capture all three anyway. They cost nothing to store.
- The site captures the identifier on the first page of the visit.
First touch wins, so a later organic visit can't overwrite the ad click that started everything.
- The form submission saves it into the CRM as a dedicated custom field.
A field, not a note. The upload step reads a field and can't parse a sentence.
- When something real happens later, the CRM sends the event back with the identifier attached.
Google matches it to the original click, and the campaign finally learns what it produced.
What are the two events, and why does one carry no value?
We set up two offline conversions for every client.
Quote sent fires when the opportunity moves to the proposal stage in the pipeline. It deliberately carries no dollar value. A quote isn't revenue, and if it carried the quoted figure the same job would report money twice, once when quoted and again when won. What quote sent tells Google is simpler and still valuable: this lead was real enough that a human priced the job.
Job accepted fires when the opportunity is marked won, and it carries the actual value of the job. This is the one that changes everything. It's the first time the platform learns that this click, from this search, on this day, was worth $15,000, and that one over there was worth nothing. Feed it enough of those and conversion-based bidding stops optimising for form fills and starts preferring the clicks that resemble the ones that became large jobs. Offline conversion imports
You don't need to take my word for the difference. Run it for a quarter and compare the leads from month one against month three. The change isn't subtle.
How does the same idea work on Meta?
Same principle, different plumbing. Meta's version is the Conversions API, which sends events from your server rather than the browser, so ad blockers and browser privacy settings don't eat them.
The matching is done on hashed data, which is worth understanding because it answers the privacy question properly. Your server takes the email address, lowercases it, strips the whitespace, and runs it through a one-way scramble called SHA-256. Same for the phone number in international format. Meta compares your scrambled values against scrambled values of its own data. Customer information parameters The plain email and phone never travel through this channel, and neither side can read the other's list. Sending several identifiers together raises the match rate substantially compared with sending one.
What breaks this silently?
Three things, and all of them fail without an error message.
The currency defaults to USD in most CRM integrations. Every Australian job value gets inflated by roughly half, the bidding learns from fiction, and nothing anywhere flags it.
The conversion window defaults to 30 days, which is shorter than a lot of trade sales cycles. A job that closes in week six simply isn't counted, and the ads that produced your biggest, slowest jobs look like your worst performers.
And a click identifier needs a few hours on Google's side before an upload referencing it will be accepted. Test the integration the same afternoon you build it and the upload can come back not found, at which point most people conclude the whole thing is broken. It isn't. It's indexing.
Is this worth it at a few hundred dollars a month of ad spend?
The setup is worth doing from day one regardless, because the data compounds and you can't backfill it later. The bidding benefits become obvious as volume grows. Don't skip it because the spend is small, because the whole point is that it makes the same spend buy better leads over time.
Does my CRM need to be anything special?
It needs custom fields, a pipeline with stages, and an integration or API that can fire an event when a stage changes. We build on HighLevel because it does all three without drama, but the pattern isn't exclusive to it. What doesn't work is a spreadsheet, a notes app, or a CRM where the click identifier gets pasted into a comment box.
