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
- 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.
- 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.
- 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.
- 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
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
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
The identifier is the bridge
The GCLID, captured at the visit and carried into the Craft Commerce order.
- 4
The event source decides reliability
Fire from the event listener in PHP rather than a Twig template, which may be cached.
- 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
- 01
Count orders carrying the GCLID
- 02
Follow one real conversion end to end
- 03
Read how this specific build handles order completion
Assumptions carried from another Craft project are the main source of wasted time here.
- 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.
- 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.
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.
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.
Yes, as conversion adjustments tied to the original order and GCLID. It requires the order ID you uploaded as the transaction ID to match the Commerce order reference.
Almost always because the GCLID never reached the Craft Commerce order. 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. Measure coverage before debugging the dispatch.
The GCLID — the click ID Google appends to your landing page URL when auto-tagging is on. For iOS App campaigns and some Shopping traffic you will see GBRAID or WBRAID instead, and those behave differently: WBRAID cannot be used with user-provided data in the same way, and neither joins to an individual user. Enhanced conversions for leads is the alternative path, matching on hashed email or phone rather than a click ID, and it is the right choice when GCLID coverage is poor.
The Craft Commerce order-complete event. Fire from the event listener in PHP rather than a Twig template, which may be cached.
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.
More on Craft → Google Ads
- Craft → Microsoft AdsConnecting Craft CMS to Microsoft Ads
- Craft → Apple Search AdsConnecting Craft CMS to Apple Search Ads
- Craft → Amazon AdsConnecting Craft CMS to Amazon Ads
RELATED GUIDES
Where Craft → Google Ads fits in the rest of your tracking
- Google Ads · Local servicesGoogle Ads conversion tracking for local service businesses
- Google Ads · B2BGoogle Ads conversion tracking for B2B companies
- Google Ads × Ecommerce OrdersHow to reconcile Google Ads against your store's order table
- Google Ads · Comparison page → demoHow to track comparison page visit to demo request for Google Ads
- Concrete CMS → Google AdsConnecting Concrete CMS to Google Ads
- Craft → X AdsConnecting Craft CMS to X Ads
- Local servicesConversion tracking for local businesses, where most conversions bypass the website
- Duda → Google AdsConnecting Duda to Google Ads
Free · 30 min
Get Craft and Google Ads joined properly
Free30 minutesNo obligation
