Home / Google Ads / Guides / Conversion tracking
Guide · Tracking · Updated August 2026

How to set up Google Ads conversion tracking that you can actually trust.

Almost every account we audit is optimising toward numbers that are quietly wrong. This is the full signal path, from the dataLayer push to the bidding algorithm, and how to make Google Ads, GA4 and your CRM finally tell the same story.

Conversions that happen 100 the real number your CRM knows it Captured by the tag 94 blockers, JS errors, triggers that never fire Survives consent + cookies 79 ITP truncation, denied consent, cross-device Matched back to a click 68 expired cookie, missing GCLID, offline outcome Reaches Smart Bidding 62 wrong window, values never imported
Where the signal goes. Illustrative of a typical untuned lead-generation account. The exact percentages differ by industry and browser mix, but the shape is consistent: the algorithm optimises on a fraction of reality, and treats that fraction as the whole truth.
The short version
  • 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.

Google Ads 412 GA4 key events 388 CRM enquiries 214 Qualified leads 96 SAME MONTH · SAME ACCOUNT · FOUR DIFFERENT ANSWERS
The gap that matters is the bottom one. Bidding is optimising toward 412. The business is paid on 96. Every step in this guide is about narrowing the distance between those two numbers.

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.

01 Interaction layer the actual thing a human did: submitted, purchased, called, booked 02 Data layer the event and its parameters: id, value, currency, user data 03 Tag layer triggers, variables, consent gates, deduplication rules 04 Transport layer browser request or first-party server: where blockers and ITP bite 05 Platform layer conversion action settings, attribution, windows, bidding
Debug in order, top to bottom. Most people start at layer 5 and change bid strategies. The fault is almost always at layer 2 or 3.

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.

Step 01

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.

ActionClassificationCountValue
Purchase / transactionPrimaryEveryDynamic revenue
Quote or enquiry formPrimaryOneModelled lead value
Booked call or demoPrimaryOneModelled lead value
Phone call over 60 secondsPrimaryOneModelled lead value
Click on a phone numberSecondaryOneNone
Add to cart / begin checkoutSecondaryEveryNone
Newsletter or PDF downloadSecondaryOneNone
Contact page view, time on site, scroll depthNeither

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.

Step 02

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.

OutcomeEventTriggerKey parametersDestination
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.

datalayer-purchase.js
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.

Step 03

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.

DATA LAYER event: purchase transaction_id value + currency user_data TAG LAYER Trigger: custom event Google Ads conversion tracking tag Consent: ad_user_data PLATFORM LAYER AW-123456789 / abCdEf conversion ID and label Count: One per click Window: 30 days click Primary, in bidding
One event, one trigger, one tag, one destination. If you have three tags firing on the same outcome "just in case", you have three chances to double-count.

The components that matter

ComponentJobWhere it goes wrong
Google tagLoads the base library and handles click-ID persistenceFires on some pages but not the confirmation page, usually because of a consent gate or a trigger exception
Custom event triggerDetects the exact success momentSet to a page view of the thank-you URL, which counts refreshes, bookmarks and direct visits
Data layer variablesRead value, transaction_id and user dataVersion 1 versus version 2 data layer scope, returning undefined silently
Conversion tagSends the event with ID and labelWrong label pasted from a different conversion action, so two outcomes merge into one
Consent settingsBlocks the tag when consent is deniedLeft 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_id so 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.

Step 04

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.

COLLECTED Jane.Smith@Ex.com NORMALISED jane.smith@ex.com SHA-256 HEX 8f4e1c...b02a97 MATCHED to a click CONVERSIONS RECORDED Cookie only baseline + enhanced recovered
Recovery, not invention. Enhanced conversions surface sales that already happened but could not be attributed. Uplift varies widely by industry and traffic mix, so treat any headline percentage as a range rather than a promise.

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.

FieldRuleExample
EmailTrim whitespace, convert to lowercasejane.smith@ex.com
PhoneE.164 with country code, no spaces or punctuation+61412345678
First / last nameLowercase, strip punctuation and titlessmith
PostcodeNo hashing, sent in the clear2000
CountryTwo-letter ISO code, no hashingAU

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.

Step 06

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.

Browser event fires Your domain yoursite.com.au/metrics CDN or tagging server Google Ads GA4 Meta, TikTok, LinkedIn CAPIs server-side only COOKIE LIFETIME IN SAFARI Set by JavaScript 7 days Set server-side up to 400 days Indicative. Server-set cookies are still subject to CNAME cloaking detection and vendor caps.
The long-consideration fix. If your sales cycle is longer than a week, this is not an optimisation, it is the difference between seeing your conversions and not.

Two routes, different scope

Google tag gatewayServer-side GTM
What it doesServes Google scripts and measurement calls through your own domain via a CDN or your tagging serverA full server container you control, receiving events and forwarding them to any vendor
CoversGoogle properties: Ads and GA4Google plus Meta, TikTok, LinkedIn and other conversion APIs
SetupCDN configuration, comparatively lightServer container, custom domain, hosting
Ongoing costOften none beyond your existing CDNHosting, typically modest but real
Data controlLimited: delivery route changes, logic stays with GoogleFull: 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.

Step 07

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.

capture-click-id.html
<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.

Ad click gclid stored Enquiry hidden field to CRM Outcome known qualified, quoted, won Upload Data Manager API bidding buys more of these Capture gclid, gbraid and wbraid. Upload at least daily, and always within the conversion window.
The loop is the whole point. Until outcomes flow back, Smart Bidding is optimising for form fills, and form fills are not the business.

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.

Step 08

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.

StageWorkingValue 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.

Step 09

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.

day 0 day 30 day 60 day 90 DEFAULT 30-DAY WINDOW AVAILABLE, RARELY USED click counted day 12 invisible day 41
Match the window to the sales cycle, not the default. Lengthening it does not create conversions, it stops discarding them. Expect reported performance to shift for the first few weeks as historical clicks come back into scope.
Step 10

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.

SymptomLikely causeFix
Conversions far exceed CRM enquiriesPage-view trigger on the thank-you URL, or Count set to Every for leadsMove to a success-callback event, set Count to One, pass a unique id
Conversions dropped sharply overnightSite release removed the container, or a consent default changedCheck container presence on the confirmation page and recent CMP changes
Value column empty or wildly wrongData layer variable returning undefined, or currency mismatchVerify variable scope in preview mode and set currency explicitly
Enhanced conversions match rate very lowPhone numbers not in E.164, or user data absent at fire timeNormalise before hashing, confirm fields populate before the tag fires
Mobile conversions under-reportedIntegration only captures gclidCapture gbraid and wbraid as well
Offline conversions stopped appearingUpload path still targeting the retired API endpointRepoint the integration to the Data Manager API
Long-cycle campaigns look unprofitable30-day window truncating late conversionsExtend the click-through window to match the real sales cycle
Two conversion actions with identical countsSame conversion label pasted into both tagsRe-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.

Not sure which layer is broken?

Get a free, no-obligation audit of your Google Ads account. We will trace the full signal path, from tag to bidding, and tell you exactly what is being counted wrong.

Get my free audit →
Keep reading

Related Google Ads guides.