- Conversion tracking is a chain, not a tag. It breaks at the weakest link, and it breaks silently.
- Decide what a conversion is worth before you build anything. The measurement plan is the hard part; the implementation is mechanical.
- Recover lost signal in this order: enhanced conversions, consent mode v2, first-party collection, then offline imports. Each one plugs a different leak.
- Two 2026 changes catch people out: enhanced conversions for web and leads merged into a single toggle, and offline uploads moved to the Data Manager API.
- If Google Ads and your CRM disagree by more than about 15 percent, you have a tagging fault, not a reporting quirk.
Why your three sources never agree
The conversation usually starts the same way. Google Ads says 412 conversions last month. GA4 says 388. The CRM says 214 enquiries, of which 96 were worth quoting. Someone asks which number is right, and the honest answer is that all three are measuring different things, and at least one of them is measuring it badly.
Some divergence is structural and expected:
- Different credit rules. Google Ads attributes a conversion to the date and campaign of the click. GA4 attributes it to the session in which the event fired. A click on the 28th that converts on the 3rd shows in two different months depending on where you look.
- Different models and windows. The two platforms apply different attribution models and lookback windows by default, so the same event gets divided differently.
- Modelling. Google Ads reports modelled conversions for users it cannot observe directly. GA4 models separately, under different thresholds.
That accounts for a gap of roughly 5 to 15 percent. Anything wider is a fault, and the usual suspects are boringly consistent: the tag fires on a page that users can reach without converting, the thank-you page gets refreshed and counted twice, a form plugin does a soft redirect that the trigger never sees, or the CRM disqualifies half the leads and nobody ever tells Google.
The test that matters
Pick a single day, open your CRM, and count the enquiries that arrived from paid search. Then open Google Ads and count conversions for the same click date. If you cannot reconcile the two within about 15 percent, stop optimising and fix the tracking. Everything downstream, including every bid Google makes on your behalf, is derived from that number.
The anatomy of a conversion signal
It helps to stop thinking of conversion tracking as a tag and start thinking of it as a chain with five links. Every audit finding, every discrepancy and every "the numbers dropped overnight" panic traces back to exactly one of these layers.
The rest of this guide works through that chain in build order. If you are auditing an existing setup rather than building from scratch, the same order works: you cannot judge a bid strategy while the data feeding it is wrong.
Define what actually counts as a conversion
This is the step people skip, and it is the one that determines whether everything after it is worth building. Google Ads will faithfully optimise toward whatever you tell it to value. If you tell it that a click on a phone number is worth the same as a signed job, it will go and buy you a great many clicks on phone numbers.
Primary versus secondary actions
Every conversion action carries a setting that decides whether it feeds bidding. Primary actions are included in the "Conversions" column and used by Smart Bidding. Secondary actions are recorded for observation only, appearing in "All conversions" without influencing bids. The rule of thumb: if you would not spend money to get one more of them, it is not primary.
| Action | Classification | Count | Value |
|---|---|---|---|
| Purchase / transaction | Primary | Every | Dynamic revenue |
| Quote or enquiry form | Primary | One | Modelled lead value |
| Booked call or demo | Primary | One | Modelled lead value |
| Phone call over 60 seconds | Primary | One | Modelled lead value |
| Click on a phone number | Secondary | One | None |
| Add to cart / begin checkout | Secondary | Every | None |
| Newsletter or PDF download | Secondary | One | None |
| Contact page view, time on site, scroll depth | Neither | — | — |
Count: One versus Every
Use Every where a second event is genuinely a second sale, which in practice means ecommerce. Use One for lead generation, where the same person submitting three enquiry forms in an afternoon is still one lead. Getting this backwards is one of the most common causes of a conversion count that looks healthy while the sales pipeline stays flat.
The phone call trap
Counting a click on a tel: link as a conversion measures intent to dial, not a conversation. Use a call tracking number with a minimum duration threshold, typically 45 to 60 seconds, so that misdials and hang-ups do not train your bidding. If you cannot implement call tracking yet, keep the tel: click as a secondary action and never let it near the bidding column.
Conversion goals and campaign-level overrides
Conversion actions are grouped into goals, and campaigns optimise toward the account-default goal set unless you override it at campaign level. This matters more than it sounds: a lead-gen campaign and an ecommerce campaign in the same account should almost never be optimising toward the same goal set. Set the account default to your true primary outcome, then override per campaign where the objective genuinely differs.
Write the measurement plan before you touch a tag
A measurement plan is a single table that maps each business outcome to the event that represents it, the trigger that detects it, the parameters it carries, and where it ends up. It takes about an hour to write and it eliminates almost every ambiguity that would otherwise surface three weeks later as a discrepancy nobody can explain.
| Outcome | Event | Trigger | Key parameters | Destination |
|---|---|---|---|---|
| Online sale | purchase |
Custom event on order confirmation | transaction_id, value, currency, user_data |
Ads (primary), GA4 |
| Enquiry submitted | generate_lead |
Form success callback, not page view | lead_id, form_name, user_data |
Ads (primary), GA4, CRM |
| Qualified enquiry | lead_qualified |
CRM stage change | lead_id, gclid, value |
Ads offline import |
| Job won | lead_won |
CRM stage change | lead_id, gclid, value |
Ads offline import |
Three rules make this plan durable. Use Google's reserved event names (purchase, generate_lead) where they exist, because platform features key off them. Always carry a unique identifier, because it is the only reliable defence against duplicate counting. And decide the identifier once, at the source, so the same lead_id follows the record from the website into the CRM and back out again in the offline import.
The dataLayer push
Whatever your platform, the goal is the same: at the moment of success, push a single well-formed object containing everything downstream tags could need. Clearing the previous ecommerce object first prevents parameters from a prior event bleeding into this one.
window.dataLayer = window.dataLayer || [];
// clear any ecommerce object left over from a previous push
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'AU-10482', // the deduplication key
value: 249.00, // ex-GST, ex-shipping: your real margin base
currency: 'AUD',
items: [
{ item_id: 'SKU-114', item_name: 'Widget', price: 249.00, quantity: 1 }
]
},
user_data: {
email: 'jane.smith@example.com',
phone_number: '+61412345678', // E.164 format, always
address: {
first_name: 'Jane',
last_name: 'Smith',
postal_code: '2000',
country: 'AU'
}
}
});
Decide what value means, once
If value includes GST and shipping on the website but excludes both in your accounting, every target ROAS you set will be wrong by a consistent, invisible margin. Pick the basis that matches how the business measures profitability, write it down in the measurement plan, and use it everywhere.
Implement it in Google Tag Manager
With a clean event, the container work is mechanical. The parts that go wrong are almost never the tag itself; they are the trigger conditions, the variable scope and the consent settings.
The components that matter
| Component | Job | Where it goes wrong |
|---|---|---|
| Google tag | Loads the base library and handles click-ID persistence | Fires on some pages but not the confirmation page, usually because of a consent gate or a trigger exception |
| Custom event trigger | Detects the exact success moment | Set to a page view of the thank-you URL, which counts refreshes, bookmarks and direct visits |
| Data layer variables | Read value, transaction_id and user data | Version 1 versus version 2 data layer scope, returning undefined silently |
| Conversion tag | Sends the event with ID and label | Wrong label pasted from a different conversion action, so two outcomes merge into one |
| Consent settings | Blocks the tag when consent is denied | Left on "no additional consent required", which is a compliance exposure, not a shortcut |
Stop the double count
Duplicate conversions have three usual causes, and each has a specific fix rather than a general one:
- Confirmation page refresh. Fire on a custom event from the success callback rather than a page view, and pass
transaction_idso the platform can discard repeats. - Repeat submitters. Set the conversion action to count One per click for lead generation.
- Two containers, one site. Legacy hard-coded gtag snippets left in the theme while GTM also fires the same conversion. Search the source for
AW-before you assume the container is the only source.
Check auto-tagging first
Auto-tagging appends the GCLID to your landing page URLs and is the foundation for click matching, enhanced conversions and every offline import. It is on by default, but plenty of accounts have had it switched off historically, and some site setups strip query parameters on redirect. If the GCLID never reaches your landing page, nothing else in this guide can work.
Turn on enhanced conversions
Enhanced conversions are the single highest-return item on this list, and the least work. When someone converts, you send a hashed version of the first-party data they just gave you, typically an email address or phone number. Google matches that hash against its own signed-in user data and recovers conversions that a cookie alone would have missed.
Nothing personally identifiable leaves the browser in readable form. The data is normalised, hashed with SHA-256 and sent as a hex string, and the raw values never reach Google.
What changed in 2026
Two structural changes landed this year and both are worth knowing before you configure anything:
- One toggle, not two. Enhanced conversions for web and enhanced conversions for leads have been combined into a single on-off setting. The old requirement to pick one implementation method is gone, and Google Ads now accepts user-provided data from website tags, Data Manager and API connections at the same time. Existing setups were migrated automatically where the customer data terms had already been accepted.
- Uploads moved. From 15 June 2026, offline conversion imports and enhanced conversions for leads uploads migrated to the Data Manager API and are blocked in the Google Ads API. This is covered in step 7, and it is the change most likely to have quietly broken an existing CRM integration.
Normalisation rules
Match rates live or die on formatting. If you hash the data yourself rather than letting the tag do it, these rules are not optional.
| Field | Rule | Example |
|---|---|---|
| Trim whitespace, convert to lowercase | jane.smith@ex.com | |
| Phone | E.164 with country code, no spaces or punctuation | +61412345678 |
| First / last name | Lowercase, strip punctuation and titles | smith |
| Postcode | No hashing, sent in the clear | 2000 |
| Country | Two-letter ISO code, no hashing | AU |
Australian phone numbers are the classic failure here. A CRM full of 0412 345 678 will not match anything until it is converted to +61412345678, and the mismatch is invisible in reporting: you simply see a low match rate and no error.
Verify it before you trust it
Google Ads exposes diagnostics on each conversion action showing coverage, meaning the share of eligible events that arrived with usable user-provided data, and match rate, meaning the share that Google could match. Low coverage is your bug. Low match rate with high coverage is usually a normalisation or audience problem. Allow a few weeks after switching it on before judging performance impact, since the matching needs time to settle.
Configure consent mode v2 deliberately
Consent mode is a signalling layer. Rather than tags simply firing or not firing, they receive four signals describing what the user has agreed to, and adjust their behaviour accordingly. It has been mandatory for EEA and UK traffic since March 2024. It is not mandatory for Australian traffic, but ignoring it is increasingly a poor default.
ad_user_data while assuming enhanced conversions still work. They do not, and nothing in the interface tells you.Basic versus advanced
In basic mode, tags are blocked entirely until consent is granted, so non-consenting users are invisible. In advanced mode, tags load and send cookieless pings carrying no identifiers, which gives Google enough aggregate signal to model the conversions it cannot observe. Advanced mode is almost always the right choice, because basic mode forfeits data you have already paid for.
Modelling is not free, though: it is reported to require roughly 700 ad clicks over seven days per country and domain before Google will model conversions for non-consenting users. Below that threshold, advanced mode still costs nothing and starts working the moment you qualify, but you should not budget for recovered conversions that will never arrive.
<!-- must run BEFORE the Google tag or GTM container loads -->
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){ dataLayer.push(arguments); }
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
analytics_storage: 'denied',
wait_for_update: 500 // ms to wait for the CMP before proceeding
});
</script>
// fired by your CMP when the user makes a choice
gtag('consent', 'update', {
ad_storage: 'granted',
ad_user_data: 'granted',
ad_personalization: 'granted',
analytics_storage: 'granted'
});
Australian context, and a caveat
Australia does not currently impose a GDPR-style cookie consent regime, but the Privacy Act reforms are steadily raising expectations around transparency and consent, and enforcement attention is increasing. Region-specific default states are supported, and many Australian advertisers set a permissive default locally and a denied default for the EEA and UK. That is a legal decision as much as a technical one, so take advice on your own defaults rather than copying someone else's container.
Move collection into a first-party context
Everything so far still travels from the user's browser to Google's domain, where ad blockers, extensions and browser policies can intercept it. First-party collection changes the delivery route so that measurement requests go to your own domain first.
The problem it solves is concrete. Safari's Intelligent Tracking Prevention caps the lifetime of cookies written by JavaScript at seven days, and shorter still in some cross-site cases. A customer who clicks your ad, thinks about it for a fortnight and then converts has, from your tag's point of view, arrived from nowhere.
Two routes, different scope
| Google tag gateway | Server-side GTM | |
|---|---|---|
| What it does | Serves Google scripts and measurement calls through your own domain via a CDN or your tagging server | A full server container you control, receiving events and forwarding them to any vendor |
| Covers | Google properties: Ads and GA4 | Google plus Meta, TikTok, LinkedIn and other conversion APIs |
| Setup | CDN configuration, comparatively light | Server container, custom domain, hosting |
| Ongoing cost | Often none beyond your existing CDN | Hosting, typically modest but real |
| Data control | Limited: delivery route changes, logic stays with Google | Full: enrich, redact or block data before it leaves |
They are not competitors. The most durable setup runs both: the gateway handles first-party script delivery, and the server container handles routing and governance. If you only ever advertise on Google and want the fastest win, start with the gateway.
Close the loop with offline conversions
For any business where the sale happens after the website, everything up to this point measures enquiries, not revenue. Offline conversion import is what lets Google optimise toward the leads that actually turned into work, and it is the step that separates accounts that plateau from accounts that keep improving.
The mechanism is simple. Capture the click identifier when someone lands, store it against the record in your CRM, and send the outcome back when it is known.
<script>
(function () {
var params = new URLSearchParams(window.location.search);
var keys = ['gclid', 'gbraid', 'wbraid'];
keys.forEach(function (key) {
var value = params.get(key);
if (!value) return;
var expires = new Date(Date.now() + 90 * 864e5).toUTCString();
document.cookie = key + '=' + value +
';expires=' + expires + ';path=/;SameSite=Lax';
});
// on form render, copy the stored value into a hidden field
var field = document.getElementById('gclid_field');
var stored = document.cookie.match(/(^|;)\s*gclid=([^;]+)/);
if (field && stored) field.value = stored[2];
})();
</script>
<input type="hidden" name="gclid" id="gclid_field">
Capture all three identifiers, not just gclid. On iOS, privacy-preserving click measurement returns gbraid or wbraid instead, and an integration that only looks for gclid will quietly drop a meaningful share of your mobile leads.
Check your uploads still work
From 15 June 2026, offline conversion imports and enhanced conversions for leads uploads moved to the Data Manager API and are blocked in the Google Ads API. Developer tokens that had not sent a request in the preceding months were not allowlisted for legacy access. If a CRM connector, Zap or in-house script has been uploading conversions for you, confirm it has been repointed. These integrations fail quietly: the uploads stop, the conversion column drifts down, and bidding degrades over weeks without a single error message anywhere you would normally look.
Set values that reflect margin, not revenue
Smart Bidding optimises toward the value you declare. For ecommerce that value is usually available directly, though it should be the figure the business actually earns on rather than the number on the invoice. For lead generation the value has to be modelled, and modelling it badly is better than not modelling it at all: a bidding algorithm given no values treats a tyre-kicker and a commercial contract as identical.
The lead value calculation
Work backwards from the money. Take gross profit per closed job, multiply by the rate at which qualified leads close, then multiply by the rate at which raw enquiries qualify.
| Stage | Working | Value to report |
|---|---|---|
| Job won | $4,200 average job at 35 percent gross margin | $1,470 |
| Qualified enquiry | $1,470 × 30 percent close rate | $441 |
| Raw enquiry | $441 × 45 percent qualification rate | $198 |
Now a target ROAS means something. At a 400 percent target, Google is being told to spend up to about $50 to generate an enquiry, which is a sentence the business can actually agree or disagree with. Revisit the numbers quarterly, because close rates move and stale assumptions compound.
Differentiate where it matters
If some enquiries are structurally worth more, say them so. Pass a different value for a commercial enquiry than a residential one, or for a request for your highest-margin service. Conversion value rules can also adjust value by location, device or audience, which is useful when the same enquiry from a distant suburb costs more to service.
Fixed values are fine to start
Perfect attribution of value is a project. A single, honestly estimated value applied to every enquiry is already a large improvement on no value at all, and it can be refined once the data starts flowing.
Fix attribution and conversion windows
Two settings on each conversion action quietly reshape everything you see in reporting, and most accounts have never touched either.
The attribution model decides how credit is divided when several ads contributed. Data-driven attribution is the default and uses your account's own patterns to assign fractional credit, which is why you will see conversion figures with decimal places. The alternative models are largely legacy at this point.
The conversion window decides how long after a click a conversion still counts. The default click-through window is 30 days and it can be extended up to 90. If your average consideration period is six weeks, a 30-day window is systematically deleting the back half of your performance and making your best-performing top-of-funnel campaigns look wasteful.
QA: prove it works before you trust it
Tracking that has never been tested end to end is a hypothesis. Run this before you change a single bid.
- Complete a genuine test conversion from an ad click, not a direct visit, on both desktop and mobile.
- Confirm the GCLID survives the landing page, any redirect, and arrives in the CRM record.
- Refresh the confirmation page and verify the conversion does not increment a second time.
- Reach the confirmation URL directly, without converting, and verify nothing fires.
- Check the value and currency arriving in the tag match the order, with the same GST treatment every time.
- Decline consent and confirm the tag is genuinely blocked, then accept and confirm it fires.
- Review enhanced conversions diagnostics for coverage and match rate once data has accumulated.
- Search the site source for stray hard-coded
AW-snippets outside the container. - Confirm which conversion actions are primary, and that nothing observational is feeding bidding.
- Reconcile one full week against the CRM before signing it off.
Tag Assistant handles the tag layer, GA4 DebugView confirms events and parameters, and the diagnostics panel on each conversion action in Google Ads surfaces problems the browser cannot see. Use all three; each one is blind to the others' failures.
Then leave it alone
Reporting changes the instant tracking changes, but bidding does not. Smart Bidding needs a fresh window of clean data before its models adjust. Allow two to four weeks before judging performance, and never change tracking and bid targets in the same week, because you will not be able to tell which one moved the numbers.
Common failure modes
These account for the overwhelming majority of what we find in audits, in rough order of frequency.
| Symptom | Likely cause | Fix |
|---|---|---|
| Conversions far exceed CRM enquiries | Page-view trigger on the thank-you URL, or Count set to Every for leads | Move to a success-callback event, set Count to One, pass a unique id |
| Conversions dropped sharply overnight | Site release removed the container, or a consent default changed | Check container presence on the confirmation page and recent CMP changes |
| Value column empty or wildly wrong | Data layer variable returning undefined, or currency mismatch | Verify variable scope in preview mode and set currency explicitly |
| Enhanced conversions match rate very low | Phone numbers not in E.164, or user data absent at fire time | Normalise before hashing, confirm fields populate before the tag fires |
| Mobile conversions under-reported | Integration only captures gclid | Capture gbraid and wbraid as well |
| Offline conversions stopped appearing | Upload path still targeting the retired API endpoint | Repoint the integration to the Data Manager API |
| Long-cycle campaigns look unprofitable | 30-day window truncating late conversions | Extend the click-through window to match the real sales cycle |
| Two conversion actions with identical counts | Same conversion label pasted into both tags | Re-issue labels and separate the tags |
Frequently asked questions
Why do Google Ads and GA4 report different numbers?+
They count different things. Google Ads credits the conversion to the date and campaign of the click, applies its own attribution model and includes modelled conversions. GA4 credits the session in which the event fired, with a different model, window and identity logic. A gap of roughly 5 to 15 percent is normal. Wider than that is a tagging fault.
Do Australian businesses need consent mode v2?+
It is mandatory for EEA and UK traffic, not for Australian traffic. That said, Australian privacy law is tightening, browsers restrict cookies regardless of jurisdiction, and consent mode is what unlocks conversion modelling. Implement it deliberately, and take legal advice on your default consent states rather than copying a container from elsewhere.
How long before better tracking shows up in performance?+
Reporting changes immediately. Bidding takes two to four weeks, because Smart Bidding needs a fresh window of clean data before its models adjust. Resist the urge to change targets during that period.
Should I count every conversion or one per click?+
Every for ecommerce, where a second order is a second sale. One for lead generation, where the same person submitting three forms is still one lead.
Is server-side tagging worth it for a small account?+
It depends on your sales cycle and browser mix. If most conversions happen within a day or two of the click, the gain is modest. If your customers take weeks to decide, or a large share of your traffic is on Safari, first-party collection is often the highest-impact change available. Starting with the tag gateway is the cheaper way to test the theory.
What is the Data Manager API migration?+
From 15 June 2026, offline conversion imports and enhanced conversions for leads uploads migrated to the Data Manager API and are blocked in the Google Ads API. Any connector or script still using the old endpoint needs repointing, otherwise uploads fail silently and bidding loses its downstream signal.
Where this fits
Conversion tracking is the foundation the rest of the account rests on. Once the data is trustworthy, the next questions are structural: whether budget is flowing to the right campaigns, whether Performance Max is spending where you think it is, and whether your search terms are as clean as the reporting suggests. That work is covered in our other guides, and it is the same sequence we follow on client accounts.
If you would rather have this reviewed than build it yourself, our Google Ads consulting engagements start with exactly this audit, and the free audit will tell you which of these layers is currently broken.