Skip to main content
Craft → Google AdsIntegration guide

Connecting Craft CMS to Google Ads

Craft is a developer-oriented CMS, usually built bespoke by an agency, which means the implementation is whatever that agency decided and nothing is standard. Google Ads knows what you spent and which click it came from, and nothing at all about what happened afterwards. The join between them succeeds or fails on one thing: whether the GCLID reaches the Craft Commerce order before the conversion happens, because Google Ads can only match a conversion it can tie back to a click it recognizes.

Free30 minutesNo obligation

Specific to this pair

Craft Commerce orders into Google Ads with the GCLID stored

Add a GCLID custom field to the Craft Commerce order, filled server-side at cart creation or order completion. Then use the confirmation-page tag with enhanced conversions on hashed email, or upload completed orders through offline import, keeping both on one conversion action. Exclude the confirmation route from caching, and upload refunds as adjustments.

The Google Ads join on a Craft site depends on one custom field: a GCLID column on the Commerce order, filled server-side when the cart is created or the order completes. Craft gives you the tools to add that field cleanly through a field layout and an event listener, but nobody adds it by default, and an agency-built site may already have three half-finished attempts in different templates.

With the GCLID on the order, there are two routes. Either keep the Google tag's purchase conversion on the confirmation page and add enhanced conversions using the order's hashed email, or upload completed orders through offline conversion import from the PHP side. If you do both, they must be the same conversion action or Google counts the order twice; the GCLID-plus-action-plus-time rule only deduplicates within one action.

Static caching matters here too. If the confirmation page is cached, the Google tag can fire with the wrong transaction ID or value, and Google Ads accepts it without complaint. Check the Blitz or template-cache exclusion rules on the order-complete route on this specific build. Refunds and cancellations on the Commerce order can be uploaded as adjustments against the original GCLID and order ID.

Craft → Google Ads · what breaks

Why this join usually fails — Craft → Google Ads

  1. 01

    The GCLID never reaches Craft

    Craft's template caching and static caching plugins both serve stored output, and because every build is custom, where the capture code lives differs per site. There is no standard place to look.

  2. 02

    Every install is bespoke

    There is no standard Craft setup, so an approach that worked on another Craft site may have nothing to attach to on this one. Read the build before quoting.

  3. 03

    The conversion action is the wrong type

    Uploads against a standard website conversion action fail. The action has to be created as 'Import' — and existing actions cannot be converted, so this is discovered late and requires starting a new action with no history.

  4. 04

    Nothing reconciles afterwards

    Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.

Craft → Google Ads · the fix

What working looks like — Craft → Google Ads

  • The GCLID on every order

  • Conversions arriving in Google Ads

    Conversions appear against the campaign, ad group and keyword that produced the click, with the value you sent — which is what lets Smart Bidding optimize toward revenue instead of toward form fills.

  • Reconciled against the source

    Craft CMS's own records are the reference, not either dashboard.

Craft → Google Ads · architecture

How Craft and Google Ads actually connect

  1. 1

    Craft CMS holds the truth

    Craft installs are bespoke by nature. Establish how this particular build models a completed order before assuming anything transfers from another Craft site.

  2. 2

    Google Ads needs a click to match

    Google Ads matches an uploaded conversion back to a click using the GCLID. The conversion action must be created as an import type — an upload against a website-tag conversion action is rejected. Uploads must also land inside Google's window: the click has to be within the last 90 days.

  3. 3

    The identifier is the bridge

    The GCLID, captured at the visit and carried into the Craft Commerce order.

  4. 4

    The event source decides reliability

    Fire from the event listener in PHP rather than a Twig template, which may be cached.

  5. 5

    Deduplication at the destination

    Google deduplicates on the combination of GCLID, conversion action and conversion time. Uploading the same click twice against the same action at the same timestamp is rejected rather than double-counted, but uploading it against a second conversion action counts twice — which is how most double-counting here actually happens.

Craft → Google Ads · normal or broken

Working vs. broken, side by side — Craft → Google Ads

Normal, not a fault

  • The GCLID present on the order

    Visible on the record itself in Craft CMS, not merely captured somewhere on the site.

  • Sent from the Craft Commerce order-complete event

  • Deduplicated correctly

    Google deduplicates on the combination of GCLID, conversion action and conversion time. Uploading the same click twice against the same action at the same timestamp is rejected rather than double-counted, but uploading it against a second conversion action counts twice — which is how most double-counting here actually happens.

  • Reconciles with the source

    Google Ads's count and Craft CMS's records agree within a few percent over a closed window.

Actually broken

  • The GCLID missing on most records

    Craft's template caching and static caching plugins both serve stored output, and because every build is custom, where the capture code lives differs per site. There is no standard place to look.

  • Sent from the browser

    There is no standard Craft setup, so an approach that worked on another Craft site may have nothing to attach to on this one. Read the build before quoting.

  • Counted twice, or not at all

    Uploads against a standard website conversion action fail. The action has to be created as 'Import' — and existing actions cannot be converted, so this is discovered late and requires starting a new action with no history.

  • Nobody has reconciled it

    The dashboard shows a number and no one has compared it to Craft CMS.

Craft → Google Ads · diagnose

Diagnostic order — Craft → Google Ads

  1. 01

    Count orders carrying the GCLID

  2. 02

    Follow one real conversion end to end

  3. 03

    Read how this specific build handles order completion

    Assumptions carried from another Craft project are the main source of wasted time here.

  4. 04

    Check the conversion action type and the upload diagnostics

    In Google Ads, Goals → Conversions → Uploads shows every upload with its error rows. Read the errors rather than the success count; a file can import successfully with most rows rejected.

  5. 05

    Read the match rate, not the success message

    Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.

Craft → Google Ads · prove

How it gets proven — Craft → Google Ads

Against Craft CMS's own records, not against either platform's dashboard.

Source of truth

Craft Commerce's order records in your own database, filtered to completed.

  • The GCLID confirmed present on a live order.
  • The Uploads diagnostics read row by row, with the accepted count reconciled against conversions appearing in campaign reporting.
  • Order custom field confirmed populated on an order placed as an anonymous visitor through cache.

Craft → Google Ads · free audit

What we check in the free audit

  • Count orders carrying the GCLID
  • Follow one real conversion end to end
  • Read how this specific build handles order completion
  • Check the conversion action type and the upload diagnostics
  • Read the match rate, not the success message

Checked against

Craft Commerce's order records in your own database, filtered to completed.

Get my free conversion tracking audit

Free30 minutesNo obligation

Craft → Google Ads · when not to buy

When you don't need this — Craft → Google Ads

  • If Google Ads already reports conversions that reconcile against Craft CMS's records within a few percent, this join is working and there is nothing to buy.
  • Measure identifier coverage yourself first — pull your last hundred orders and count how many carry the GCLID.
  • If the original agency is still engaged, the fastest path is usually specifying the field and having them add the hook.
  • If your sales close inside a few days and your website tag already reports accurately, you may not need offline import at all. It exists to solve the delay between click and revenue.

Craft → Google Ads · what we deliver

What gets built — Craft → Google Ads

  • Identifier capture into Craft

    Capture the identifier and store it as a custom field on the order through a Craft event listener, server-side.

  • Event source: the Craft Commerce order-complete event

    Fire from the event listener in PHP rather than a Twig template, which may be cached.

  • Dispatch to Google Ads

    Offline Conversion Import through the Google Ads API, or a scheduled upload. Enhanced conversions for leads where GCLID coverage is poor and you have consented email addresses.

  • Reversals where they exist

    Refunds and cancelled orders are recorded against the order.

Written guarantee

95%+ tracking accuracy

Measured against Craft Commerce's order records in your own database, filtered to completed.. Miss it and we keep working at no cost.

Get my free conversion tracking audit

From $400 · See packages

FAQ

Craft → Google Ads questions, answered

Read it from the landing URL or the Google click cookie, persist it in a first-party cookie, and write it to a custom order field from a PHP event listener during checkout.

Free · 30 min

Get Craft and Google Ads joined properly

Free30 minutesNo obligation