GA4 and Google Ads don't match: why the gap doesn't test your tracking
Why GA4 and Google Ads show different revenue, which figure is fit for which purpose, and how to find tracking errors using click IDs stored in your shop.
The gap does not show the most expensive error
If you want to know whether your tracking is right, do not compare GA4 and Google Ads with each other. If both tags hang off the same purchase event in the checkout and that event partly fails, both lose in the same proportion, and the difference stays exactly as it was. That is my own deduction, not a Google rule. Google itself describes discrepancies of often up to 20% as expected, and that does not help you either: a 20% gap can look exactly the same with healthy tracking and with broken tracking.
A worked example with invented figures, in euros per week, same shop, same budget:
| Normal | Purchase event partly broken | Only GA4 tag broken | Only Ads action broken | |
|---|---|---|---|---|
| Shop, all orders | 100,000 | 100,000 | 100,000 | 100,000 |
| Shop, orders with click ID | 50,000 | 50,000 | 50,000 | 50,000 |
| Google Ads, by conversion time | 40,000 | 30,000 | 40,000 | 30,000 |
| GA4, google / cpc | 32,000 | 24,000 | 24,000 | 32,000 |
| GA4, all channels | 88,000 | 66,000 | 66,000 | 88,000 |
| Gap (Ads minus GA4, divided by Ads) | 20% | 20% | 40% | -7% |
| Ads coverage | 80% | 60% | 80% | 60% |
| GA4 capture rate | 88% | 66% | 66% | 88% |
In the second column, a quarter of the revenue measurement is missing, and the gap sits calmly at 20%. With €8,000 in costs, Google Ads then reports a ROAS of 3.75 instead of 5.0. A strategy with a target ROAS of 5.0 sees too little value and may lower bids, even though the shop is selling exactly as before. That costs revenue, and comparing the two platforms reports nothing.
In the two right-hand columns the gap does move, but it does not tell you which side is broken. In my view, it can also move without any fault at all, for example when you change the channel setting or shift budget into campaigns with longer purchase journeys. As a signal, it therefore fails in both directions.
The main check: Ads against orders with a click ID
Compare each source separately against the shop, and compare Google Ads only against the orders that can have come from an ad click. A comparison against the whole shop would spike with every newsletter and every discount campaign.
Ads coverage = Conv. value (by conv. time) of the purchase action ÷ order value of shop orders with a click ID
GA4 capture rate = GA4 purchase revenue across all channels ÷ order value of all shop orders
For this, the shop has to store the click ID with the order, independently of the purchase tag. If the event then fails, the order stays in the system with its ID, and only the numerator drops. This is how you set it up:
- Store all three parameters from the landing page URL: gclid, wbraid (iOS app to website) and gbraid (web to iOS app). The gclid alone is not enough, because Google no longer sends it for iOS traffic from some Google apps.
- Keep the ID on the server side. Safari can limit cookies set via JavaScript to 24 hours after clicks with URL parameters, and anyone who buys two days later is then missing from your denominator.
- Use Conv. value (by conv. time) for the primary purchase action only, the same days and the same value definition (gross or net, with or without shipping), and only count IDs that are younger than your conversion window.
- Check with your data protection adviser beforehand whether, and from which consent onwards, you may store the IDs.
A hundred per cent is not the goal: modelled conversions, including cross-device ones, often have no matching ID in the shop. So I would check the level once with test purchases for each payment method and then take your own corridor from eight full weeks. Investigate if a rate falls outside it two weeks in a row, or immediately in the case of a large swing.
How to read the result:
| What moves | Where to look |
|---|---|
| Ads coverage and GA4 capture rate both fall | Checkout, shared purchase event, cookie banner |
| Only Ads coverage falls | Conversion action in Google Ads, Ads tag |
| Only GA4 capture rate falls | GA4 tag, GA4 consent setting, a single payment method |
| Ads coverage rises for no reason | Double counting, a second primary purchase action |
| Orders with a click ID fall while clicks stay the same | Redirect: if the gclid is lost along the way, the click is not attributed to any later conversion |
Why the figures differ and which one applies to what
The discrepancy itself is usually not an error. Suppose someone clicks your ad on 28 March, returns via organic search on 3 April and buys for €100. Google Ads assigns the value to 28 March, because according to Google the primary columns are based on the time of the click. GA4 shows the purchase in April in its usual reports, and under the Paid and Organic Last Click model the full value goes to the last channel that was clicked, in this case Organic.
Then there is the lookback window: for purchases, GA4 looks back 90 days by default, Google Ads as far as you have set in the conversion action. Both systems also model separately. That is why the two figures will never become one, and they do not need to, as long as you use each for its own question:
| Decision | Figure | Limit |
|---|---|---|
| Campaigns and bids | Google Ads, standard columns | Costs are also tied to the click, so leave out the most recent days, see conversion delay |
| Google against other channels | GA4, Paid and Organic | Shows attribution, not incremental revenue |
| Budget and profit | Shop or inventory management system, after returns | No campaign attribution |
| Is the tracking still measuring? | Ads coverage and GA4 capture rate | Your own corridor instead of a hundred per cent |
| Does Google bring in additional revenue? | None of them, test with a control group | Effort, minimum volume |
Fault found: protect the bidding
Put the date of the break next to shop releases, Tag Manager versions and banner updates, and fix the cause first. Meanwhile, the damage to bidding continues, and that is what data exclusions are for. They apply to click dates and, according to Google, should cover at least 90% of the affected clicks. If the event was broken from the 10th to the 14th and around 90% of your purchases come within 5 days of the click, you exclude the 5th to the 14th. Bids can still drop briefly. In that case, lower the ROAS target temporarily and leave the exclusion in place. According to Google, the tool is not intended for frequent or long-term use.
If only consent drops, for example after a new banner, I treat that as a new baseline. Whether it really is only consent is shown by a test visit with the banner declined in Tag Assistant: the default status has to be "Denied", and in basic mode the Google tags are then blocked, while in advanced mode they send measurements without cookies. If that is confirmed, adjust your corridor and target and leave out the exclusion.
No click IDs, no alarm threshold
If your shop does not store click IDs, you are left with the GA4 capture rate and test purchases until it is rebuilt. The Ads side can then only be checked roughly, and I would not use a comparison against the whole shop as an alarm. If your purchase action comes in as a GA4 import rather than through its own Ads tag, Google Ads depends on GA4, and cases where only one rate falls hardly occur any more. Below roughly 100 orders a week I would compare months; that is a rule of thumb. Long purchase cycles need more time to mature before you assess a week. A large volume of orders by phone or in store should be taken out of the denominator before the comparison. Google information as of November 2026.
Further questions
How large can the discrepancy between GA4 and Google Ads be?
Google describes discrepancies of often up to 20% as expected. That is not a measurement for your shop. I would not set a limit for the gap, but instead monitor coverage against the shop over several weeks.
Should I switch Google Ads in GA4 to Paid and Organic so that the figures match?
I would not do it just to make reports match. According to Google, the change only applies going forward and to all linked Ads accounts, and it can change bidding and reporting. Whether organic visits belong in the bidding is a separate steering decision.
Sources
- Understand your conversion tracking data, Google Ads Help
- Select attribution settings, Google Analytics Help
- Get started with attribution, Google Analytics Help
- Upload click conversions, Google for Developers
- Updates to iOS 14 campaign measurement, Google Ads Help
- Troubleshoot: Website redirects are losing click data, Google Ads Help
- Use data exclusions for conversion data outages, Google Ads Help
- Tracking Prevention in WebKit, WebKit
- Verify consent mode implementation, Tag Manager Help
- Consent mode overview, Google for Developers
Read next
- Tracking and attributionConversion tracking for online shops: building the foundation properly
Which conversion is primary, which parameters are required, Tag Manager or plugin, and how to sign off tracking according to how mature your shop is.
10 min read · 2 November 2026 - Tracking and attributionIncrementality: testing whether Google Ads really adds revenue
Which incrementality tests a mid-sized retailer can realistically run, how to read iROAS against your margin, and what is left without a formal test.
7 min read · 1 November 2026
