Google Ads reporting 10β30% fewer conversions than your sales platform is normal, not broken. The platform de-duplicates conversions, applies a 30-day default attribution window, excludes users who declined consent, and fills gaps with modeled data. Check whether your gap is stable and inside that range before touching a tag.
Consent Mode v2 has been mandatory in the EEA since March 2024, and for traffic where a large share of users reject cookies, measured conversions can drop by up to 40%. That is a measurement loss, not a sales loss. The orders still arrived; Google just never saw the signal. Sites with heavy EEA traffic and aggressive consent banners see the widest gaps, and the number moves when their banner design or CMP settings change.
Attribution timing explains another slice. Google Ads credits a conversion to the click date, so a 12 August click that converted on 4 September lands in the August column on the platform and the September column in Shopify. If you are comparing a daily or weekly view rather than a monthly one, this alone can swing the gap by double digits on low-volume days.
Modeled conversions, which Google estimates for users it cannot observe, typically account for 5β15% of what the platform reports. Cross-device conversions cut the other way and are estimated from logged-in user behaviour rather than tracked directly, so they can push the count up or down depending on how many of your customers stay signed in across devices.
- 10β30% is normal: A persistent gap in that band across weeks usually means tracking is working, not failing.
- Consent Mode costs: EEA consent rejection can cut measured conversions by up to 40% since Consent Mode v2 became mandatory in March 2024.
- Window, not ledger: Search and Shopping default to a 30-day attribution window, adjustable from 1 to 90 days in Google Ads settings.
- Modeled fills the gap: Google's machine-learned estimates commonly make up 5β15% of reported conversions and cannot be reconciled order by order.
- Click date vs sale date: Conversions are timestamped at the click, so monthly reconciliation beats daily comparison for matching Shopify or CRM totals.
Is Google Ads undercounting sales, or is your sales platform overcounting?
The 10β30% gap most advertisers see between Google Ads and their backend is usually described as undercounting. That framing is half wrong. Run the same comparison across a few hundred orders and you will find the sales platform inflating just as often as the ad platform deflates. Shopify counts an order the moment the payment authorises. If that order is cancelled, refunded or charged back three days later, the dashboard still counted it. Google Ads, by default, keeps a conversion in the "Conversions" column until you explicitly upload a refund adjustment through the Google Ads API or a manual offline conversion import. So a merchant with a 6% refund rate is comparing 1,000 Google Ads conversions against 1,060 orders that were never all real revenue.
Deduplication cuts the other way. Google Ads treats multiple conversions from one click as a single conversion when they fire on the same conversion action, so a customer who buys twice in one session from a single ad click registers once. Your WooCommerce or Shopify backend registers two orders, two line items, two payments. Subscriptions, split shipments and B2B accounts that reorder within the attribution window all widen this specific gap, and none of it is a tracking fault.
Time zones, lags, and orders the ads never touched
Then there is timing. Google Ads reports in the account's configured time zone; Shopify reports in the store's time zone, which defaults to wherever the shop was set up. Set one to UTC and the other to America/New_York and you have a four- or five-hour offset, which means a day-boundary comparison is guaranteed to disagree even when every conversion is recorded. Attribution lag adds the rest: roughly 80% of conversions land within seven days of the click but around 10% arrive after 30 days, so a Google Ads number pulled this morning will climb for weeks without any additional ad spend. Pulling today's numbers against today's orders and calling the difference lost revenue is measuring an unfinished dataset.
And plenty of orders in your backend were never ad-driven. Direct traffic, organic search, email, an Amazon marketplace sale, a repeat customer who types the URL. If direct and organic together drive 40% of your revenue, Google Ads should show materially fewer conversions than total orders, and a match would actually be the suspicious result. Before touching a single tag, pull a seven-day cohort from BigQuery or a Looker Studio report using the Google Analytics 4 export, filter to sessions with a paid Google click ID present, and compare that order count to the Google Ads figure. That is the only comparison that isolates a genuine tracking problem from ordinary commerce.
How attribution windows and lag time change the numbers you see
Google Ads stamps a conversion on the date of the click, not the date of the sale. If someone clicks your ad on 2 September and buys on 11 September, that order lands in the 2 September column. Your Shopify dashboard, by contrast, reports it on 11 September. Pull both reports for "last 7 days" on the morning of 14 September and you are comparing two different sets of events: Google is still waiting on sales from clicks it recorded days ago, while Shopify is counting orders from clicks it may never see. The default click-through window is 30 days for Search and can be set to 1, 7, 30, 60 or 90 days in the conversion action settings; the default view-through window for Display is 1 day.
Lag explains most short-horizon mismatches. A 2024 study of ecommerce click data found roughly 80% of conversions arrive within 7 days of the click, but around 10% land after 30 days. So a seven-day report is structurally incomplete β it is not missing conversions, it simply has not finished collecting them. This is also why your daily gap looks worse on Mondays and better on Fridays, and why a campaign paused yesterday still shows conversions tomorrow. Nothing is broken. You are reading a partially filled bucket.
Where the window cuts both ways
Widening the window to 60 or 90 days will pull in more reported conversions, and it will flatter your numbers with sales that would have happened anyway. A 90-day click-through window on a low-consideration product mostly captures people who forgot they clicked. Shortening it to 7 days makes recent performance look dire while making older performance look efficient. The honest trade-off: use 30 days for considered purchases with a research phase (furniture, B2B software, anything above roughly Β£200), and 7 days for impulse categories where the decision is same-session. Then keep that choice fixed, because changing the window retroactively rewrites history and makes month-over-month comparison meaningless.
View-through conversions cut the other way β they add counts your backend has no record of. Someone sees a Display impression on Tuesday, buys on Thursday via a branded search or a direct visit, and the sale appears in Google Ads but traces to organic or email in your CRM. That is a real contributor to the "Google shows more than Shopify" direction too, which is why the two numbers never reconcile into one clean ratio. A stable gap of 10β30% between Google Ads and your backend sales, within the same period, is a 2025 benchmark figure and it is the expected output of a consented, deduplicated measurement stack. Chasing 1:1 means turning on fingerprinting, extending cookie lifetimes past what Consent Mode v2 permits, or wiring server-side identifiers that GDPR does not support. You will get a prettier dashboard and a worse legal position.
What role does Consent Mode v2 play in the gap?
If a meaningful share of your traffic comes from the European Economic Area, Consent Mode v2 is the single largest structural reason your Google Ads numbers sit below your Shopify or WooCommerce order count. Since March 2024, Google requires it for any advertiser serving EEA users, and a tag that fires without a granted ad_storage or ad_user_data signal cannot write the cookies that tie a click to a later purchase. Google's own help documentation puts the exposure at up to 40% of conversions going unobserved when consent is absent or misconfigured. Those orders still land in your backend. They simply never appear as a Google Ads conversion.
Modeled conversions close part of that hole, not all of it. When you have Consent Mode v2 plus Enhanced Conversions enabled and enough consented traffic for the model to train on, Google estimates conversions for the unconsented users using observable signals like campaign, device, geography and time of day. Across accounts using conversion modeling, those estimates typically account for 5β15% of total reported conversions. That is real recovery, but it is a statistical inference: it will systematically miss small-basket, high-variance purchases where the training signal is thin, and it never claims more than a probability-weighted share of the unobserved set.
What "done correctly" actually means
Reimplementing Consent Mode v2 properly recovers 15β25% of previously lost conversions, according to Google's 2025 guidance, and the mechanism is usually mundane. The common failure is a cookie banner that fires denied as the default state but never sends an update command when the user clicks Accept. The tag loads, the page works, and every session is treated as unconsented forever. The next most common failure is a Google Tag Manager setup where the consent signals fire on one container and the conversion tags on another, so the two never talk to each other. You can check the damage in Google Analytics 4 by comparing the consented-user cohort against total sessions: if the ratio is under roughly 60% for EEA traffic on a site with a functional banner, the implementation is leaving recoverable conversions on the table.
The trade-off worth being honest about: aggressive consent framing increases consent rates but invites GDPR complaints, and an over-compliant banner that rejects by default will keep your measured gap wide. For a B2C ecommerce site doing under β¬5m in EEA revenue, the pragmatic answer is a banner that makes Accept as easy as Reject, paired with Enhanced Conversions for leads or Enhanced Conversions for web, and BigQuery export so you can reconcile the consented cohort yourself. For a larger advertiser with legal counsel and a data processing agreement already in place, the same setup plus server-side tagging through Google Tag Manager's server container is the configuration that actually closes the measurement gap rather than merely documenting it. Neither path makes Google Ads an order ledger. Both make the gap stable enough to reconcile against.
The four types of conversion modeling (and when they apply)
Google Ads separates conversions into two buckets: observed and modeled. Observed conversions come from a tag that fired, a click ID that matched, or an Enhanced Conversions payload that survived the trip. Modeled conversions are statistical estimates, generated when the observable signal is missing but the click and the outcome still need to be joined. Both land in the same Conversions column, which is why a number can move without a single tag changing.
- Consent-based modeling. When a user in the EEA rejects cookies, Consent Mode v2 sends a cookieless ping with limited parameters. Google then estimates, from the behavior of consenting users with similar characteristics, whether that click converted. Since Consent Mode v2 became mandatory for EEA traffic in March 2024, this is the single largest source of modeled conversions for European stores. A correctly implemented v2 setup can recover roughly 15–25% of otherwise lost conversions; without it, up to 40% of conversions go unobserved.
- Cross-device modeling. Someone clicks a Search ad on an iPhone during a commute, then buys on a laptop that evening while signed into the same Google account. No cookie spans those two devices. Google bridges them using account-level signals, and the result appears as a cross-device conversion. For logged-in users, these are estimated at 5–20% of total conversions. Signed-out users contribute nothing to this bucket, which is why the figure swings by audience and by market.
- Click-based modeling. Apple's App Tracking Transparency, Safari's Intelligent Tracking Prevention, and Firefox's total cookie protection all break the click-to-conversion chain. Google fills the gap by modeling conversions from the click record alone, weighting by how similar the traffic looks to conversions it can observe. This category grows whenever a browser ships a new restriction. It is also the one marketers most often mistake for a tracking bug, because the conversion count rises in weeks when nothing on the site changed.
- Store visit modeling. For advertisers running Local campaigns or campaigns with location extensions, Google estimates in-store visits from users who clicked an ad, were shown a location, and later matched a visit to that store. The match uses aggregated, anonymized location history from users who have Location History enabled. Store visit conversions typically appear with a lag of several days, and they are reported separately from online conversions. They are never a one-to-one match with POS data.
- Engaged-view and view-through modeling. For Display and YouTube, Google can model conversions from impressions that never produced a click, using a 1-day view-through window by default. These conversions are estimates by definition, because no click exists to attribute. The default 30-day click-through and 1-day view-through windows still apply in 2026, and changing them alters both the reported total and the modeled share inside it.
- Offline and enhanced-conversions modeling. When you upload offline conversions via the Google Ads API or BigQuery, or when Enhanced Conversions hashes first-party data like email addresses, Google matches those records to ad interactions and models the unmatched remainder where signal allows. Match rates vary widely. A clean Enhanced Conversions implementation commonly lands in the 60–80% match range; a messy one can sit below 30%.
The item people get wrong most often is the first one. Consent-based modeling does not fire when you drop a Consent Mode snippet into Google Tag Manager and walk away. It requires a properly configured consent banner, a v2-compliant implementation that sends ad_user_data and ad_personalization parameters, and a baseline of consenting traffic large enough to train the model. On low-traffic EU stores, the model has too little data to work with and simply reports nothing, which reads on a dashboard as a tracking failure rather than a modeling floor.
Modeled conversions are not evenly distributed across campaigns either. A branded Search campaign with high consent rates and logged-in users may show almost none. A prospecting Display campaign targeting cold audiences in Germany will show a large share. That unevenness matters when you reconcile Google Ads against Shopify or WooCommerce: you are comparing a number that includes estimates against a number that includes only what your payment processor confirmed.
Deduplication: why Google Ads counts one conversion when your store counts three
Google Ads applies deduplication at the click level. If one customer clicks your ad once and then places three orders over the following week β a subscription refill, a gift for a colleague, a replacement for something that arrived damaged β the platform records that as one conversion, not three. The rule is per conversion action per click: multiple purchase events tied to the same gclid collapse into a single counted conversion unless you have explicitly configured the action to count "Every" rather than "One." For most ecommerce setups, "One" is the default, and most advertisers never change it.
Shopify and WooCommerce do the opposite. Their order tables have no concept of a click. Every checkout that clears payment creates a row, so a buyer who splits an order to ship to two addresses generates two rows, two revenue figures, and two entries in the daily export you are comparing against. Five orders from three clicks becomes five in Shopify and three in Google Ads. That is a 40% gap with nothing broken anywhere.
Where the same-session split actually bites
The pattern shows up most in high-AOV stores β furniture, industrial parts, B2B supplies β where a single buyer session often produces a quote, a partial order, and a follow-up order within the 30-day click window. It also appears in subscription businesses during the first billing cycle, when a customer signs up and immediately adds a second plan. If you pull a Google Ads report and a Shopify report for the same seven days, then compare them against a Shopify report filtered to unique customers, the second comparison is usually within a few percentage points. The first rarely is.
Two fixes are worth the engineering time. First, check whether your purchase conversion action is set to count "One" or "Every" in Google Ads under Goals β Conversions β Settings; switching to "Every" closes the multi-order gap but inflates your reported conversion count for users who refresh a confirmation page, so it is only safe if you are passing transaction IDs. Second, pass those transaction IDs β Shopify's order number works β through the Google Ads API, Enhanced Conversions, or a BigQuery export via Google Tag Manager. With IDs in place, Google Ads suppresses true duplicates rather than relying on the click-level heuristic. Advertisers who make that change typically see reported conversions rise 8β15% against the same traffic, which is roughly the size of the undercount you have been staring at.
Cross-device and cross-browser gaps: the conversions you'll never see in Google Ads
A shopper taps your Display ad on an iPhone during a commute, adds a Β£60 item to a Shopify cart, then buys it that evening on a work laptop. Google Ads can sometimes stitch those two events together, but only because both devices were signed into the same Google account and the ad click carried a Google Click ID. Google's own 2025 figures put cross-device conversions at roughly 5β20% of total conversions β and that whole band is an estimate, produced by modelling logged-in behaviour, not by observing anything. Log out on either device, or use a work profile on one and a personal one on the other, and the stitch breaks. The click stays attributed to the phone session, the order lands against a desktop visit with no gclid, and Google Ads quietly records nothing.
Browsers do the rest of the damage. Safari's Intelligent Tracking Prevention caps client-side cookies set via document.cookie to 7 days at most β sometimes 24 hours for script-written cookies β which truncates tracking well inside Google's own 30-day click-through window for Search. Firefox's Enhanced Tracking Protection blocks known trackers outright, and Apple's App Tracking Transparency means an iOS app-based purchase only feeds back to Google if the user opts in, which most do not. On a typical UK or US ecommerce account, these cross-device and cross-browser losses together land in the range of 5β20% of the real order count. You will not find them in the Google Ads interface, because they were never recorded there to be found.
Reconciliation checklist: how to compare Google Ads and sales data without panic
This procedure applies whenever a stakeholder asks why Google Ads reports 140 conversions while Shopify reports 190 orders for the same week. It needs read access to the Ads UI (or the Google Ads API for repeatable pulls), the equivalent sales report from your commerce platform, and a written tolerance threshold agreed with finance before anyone opens a spreadsheet. Budget roughly 45 minutes for the first pass and 10 minutes for each subsequent week once the queries are saved in Looker Studio or BigQuery.
- Set both datasets to the same time zone and the same date range. Google Ads reports in the time zone configured on the account, which is often the agency's or the billing address's, not the store's. Shopify reports in the store's time zone; WooCommerce inherits the WordPress site setting. A 7-hour offset produces phantom gaps of 5-15% on any day with an evening traffic spike. Pull 1 January through today on both sides, never "last 7 days", because the two platforms calculate rolling windows against different clocks.
- Compare click-through conversions only. Uncheck "view-through" and "engaged-view" columns in the Ads segment panel. Display and Demand Gen view-through credit lasts 1 day by default, and those conversions have no corresponding order timestamp you can match, so they inflate Google's number without ever appearing in your backend.
- Align the attribution window. Google Ads defaults to 30 days click-through for Search and Shopping. GA4 defaults to 30 days for paid search but uses data-driven attribution with a 90-day lookback for some reports. If your CRM attributes to first touch over 90 days, you are not comparing the same thing. Pick 30-day click-through on both sides for the reconciliation and record the choice.
- Segment by campaign and by device before you look at the total. This is the step people skip, and it is where the real signal hides. A 22% blended gap can be a 2% gap on Brand search and a 45% gap on iOS Display, which points at Apple's App Tracking Transparency rather than at your pixel. Export campaign-by-device rows from both platforms into one sheet and compute the delta per row.
- Apply the tolerance threshold. Industry benchmark for 2025 is that Google Ads reports 10-30% fewer conversions than backend sales in the same period, after Consent Mode v2 losses and cross-device unobserved conversions are accounted for. Set your band at Β±20% for a mature account with Consent Mode v2 implemented correctly, and Β±35% for an account without it or with heavy iOS traffic. Below the band, stop investigating.
- Check the consent state for EEA and UK traffic. Since March 2024 Consent Mode v2 is mandatory for EEA users, and up to 40% of conversions can go unobserved without a certified CMP feeding it. Correct implementation recovers 15-25% of that loss, per Google's own documentation. Filter the gap by country: if the gap is 8% for US orders and 38% for German orders, you have a consent problem, not a tracking bug.
- Add back modeled conversions explicitly. Modeled conversions typically make up 5-15% of total reported conversions for campaigns using conversion modeling. They are estimates, not observed events, so they will not match any row in your order table. Pull the modeled share from the conversion action report and subtract it before you compute the residual gap.
- Reconcile on a 7-day lag, not same-day. Roughly 80% of conversions land within 7 days of the click, but about 10% arrive after 30 days (2024 attribution study). A daily comparison will always look broken. Compare week N against week N-2 sales data to let attribution settle.
A realistic worked example: Google Ads shows 1,240 conversions for August, Shopify shows 1,610 orders. Subtract 96 modeled conversions and 41 view-through, leaves 1,103 observed. Consent-loss adjustment of 18% on the 340 EEA orders adds back roughly 61. Cross-device estimate of 12% adds another 132 orders that Google could not tie to a click. You land at 1,296 against 1,610, a 19.5% residual that sits inside the Β±20% band. Nothing is broken.
The failure mode
The common failure is deciding the gap is a tracking bug and rebuilding the tag setup mid-quarter. You break Enhanced Conversions, reset the learning period, and lose the historical comparison that told you the 20% gap was normal. The other failure is the opposite: declaring "this is just attribution" forever and never investigating, which is how a genuinely broken purchase event on one Shopify checkout variant survives for six weeks. Log the gap weekly in a single sheet with the segmented breakdown. When a single campaign's delta moves outside its own 90-day range, that is the day you open Google Tag Manager.
When the gap is actually a problem (and what to fix first)
A 10β30% gap between Google Ads and backend orders is the benchmark, not a fault. Bands matter more than the raw difference: if Shopify shows 1,000 orders and Google Ads reports 780, that sits inside normal range once you allow for Consent Mode, view-through exclusions and cross-device traffic. If it reports 310, you have a tag problem, not a privacy problem.
Three checks separate the two, and they take under an hour if you do them in the right order. Pull the conversion action report first, because a missing or duplicated tag shows up there immediately. Then confirm Consent Mode v2 is passing advanced signals rather than basic, since basic mode still works but recovers far less. Only then look at attribution windows, which are a config choice rather than a fault.
| Symptom | Typical gap vs backend | Likely cause | Fix and expected recovery |
|---|---|---|---|
| Conversions missing entirely from one campaign | 60β100% lower | Tag never fired, or fires on the thank-you page URL that changed | Re-point the trigger in Google Tag Manager; recovery is the full missing volume, typically same-day |
| Conversion count roughly 2x orders | Backend lower than Ads by 80β120% | Tag installed in both GTM and the theme, or fires on page reload | Remove the duplicate; deduplication only covers same-click repeats, not separate tag IDs |
| Gap widens only for EEA traffic | 25β40% lower for EU sessions, under 10% for US | Consent Mode v2 absent or set to basic since March 2024 | Advanced Consent Mode: Google reports 15β25% conversion recovery on average |
| Gap grows the longer you wait to check | 20% at day 2, 8% at day 14 | Attribution lag rather than loss; 80% of conversions land within 7 days, 10% after 30 | No fix. Compare on a 30-day lag or use BigQuery exports for a stable view |
| Display and YouTube conversions far below expectation | 50β90% lower | Default 1-day view-through window excludes later view conversions | Lengthen the view-through window only if you can defend the incrementality |
| Every metric roughly 5β15% high, no obvious break | Ads exceeds backend | Modeled conversions counted in the reported total | Nothing to fix. Report observed and modeled separately in Looker Studio |
The duplicate-tag row wins most often in practice, because it is the only one where the error is genuinely yours and the correction is instant. It is also the one that flips: if your store runs WooCommerce with a separate checkout subdomain and the GTM container is only loaded on the main domain, you get the opposite failure, a tag that fires on cart views but not on purchase, and chasing duplicates will waste a day. Test both directions with Google Tag Assistant before you change anything, then confirm in the conversion action's debug log that the count moves within 24 hours. If the number does not move after a verified fix, the problem sits in your backend feed, not in Google Ads.
Frequently Asked Questions
Why does Google Ads show fewer conversions than Shopify sales?
Google Ads only counts conversions it can attribute to an ad interaction, and it deduplicates multiple clicks from the same user into a single conversion. It also drops users who declined consent under Consent Mode v2, and applies a 30-day click window on Search. Shopify counts every order regardless of source, including organic, email, and direct traffic that never touched an ad.
How much discrepancy between Google Ads and sales is normal?
A 10-30% gap is typical for ecommerce, with the wider end showing up in the EU where consent rates run lower and cross-device journeys are harder to stitch. Below 10% usually means Consent Mode is firing cleanly and most sales arrive on the same device within the click window. Above 40% points to a tagging fault, not normal attribution loss.
Does Consent Mode v2 reduce conversion tracking?
Yes. When a user declines analytics and ads cookies, Google cannot read the click identifier, and measured conversions for that cohort drop by as much as 40% on European traffic. Modeled conversions recover part of the loss, generally 20-30% of the missing signal, but the remainder stays invisible to Google Ads and shows up only in your backend.
What is the default attribution window in Google Ads?
30 days for click-through conversions on Search, Shopping, and most Performance Max campaigns. Display uses a shorter click window plus a 1-day view-through window, meaning an impression that later leads to a sale can count if the purchase happens within 24 hours. These defaults apply unless you change them in the conversion action settings.
How do I reconcile Google Ads conversions with my CRM?
Export the Google Ads conversion report and your CRM or Shopify order list for the same date range, then force both to a single time zone, usually UTC, before comparing anything. Apply the same 30-day click window to the CRM side, and break the numbers down by campaign and device. Match on order ID or GCLID where your CRM stores it.
Why are my Google Ads conversions delayed?
Google Ads backdates conversions to the time of the click, not the time of the sale, so a purchase today from a click 12 days ago appears retroactively in the older date range. Recent dates therefore look undercounted until the 30-day window closes. Longer lag comes from offline uploads, which can take 24-48 hours to process.