Conversion tracking for Shopping
How to set up accurate purchase conversion tracking for Google Shopping, the conversion action, tag or GA4 import, conversion value and currency, so value-based bidding has clean numbers to work from.
Value-based bidding is only as good as the revenue numbers you feed it. This walks through setting up a purchase conversion action, importing it via the Google tag or GA4, and, the part most accounts get wrong, passing the actual order value and currency on every sale. Get the value wrong and every ROAS number, benchmark and bid decision downstream is wrong too.
Why this is the foundation, not a formality
Every downstream number in your Shopping account (ROAS, cost per conversion, the target you set, the benchmarks you compare against, the bid each product earns) is built on top of the conversion value your tracking reports. If that value is wrong, nothing above it can be right. A campaign showing a healthy 420% ROAS on a broken value signal isn't performing well; it's lying to you consistently.
Value-based bidding makes this worse in a useful way. Target ROAS and Maximise Conversion Value don't just count sales: they predict value per auction and bid accordingly. Feed them a flat or missing value and they optimise toward a fiction. So conversion tracking isn't the boring setup step before the real work; it's the measurement layer the real work stands on.
The one conversion action that matters
For Shopping, the load-bearing conversion is a purchase. Set up a single primary Purchase action and treat everything else (add-to-cart, begin-checkout) as secondary or observation-only. The two failure modes to avoid:
- Multiple primary purchase actions: a "Purchase" from the tag and a "Purchase" from a GA4 import both counting the same sale. ROAS doubles, bidding over-invests, and the numbers look great until you reconcile against Shopify.
- Counting set to "Every": a three-item basket counts as three conversions. Use One for purchases.
Value and currency: the part accounts get wrong
The most common tracking defect isn't a missing tag: it's a tag that fires with the wrong value. Watch for these:
| Symptom | What's happening | Effect on measurement |
|---|---|---|
| Every conversion worth the same round number | Value hard-coded, not dynamic | ROAS is meaningless; bidding can't tell a £9 sale from a £900 one |
| Value includes tax/shipping inconsistently | Confirmation page passes gross sometimes, net others | ROAS drifts; noisy signal slows learning |
| No currency parameter | Multi-currency orders collapsed to one number | Cross-market ROAS is nonsense |
Value passed as a string with symbols (£49.99) |
Parser reads 0 or drops the event | Silent under-reporting, spend looks efficient |
Send the actual order total, dynamically, with the currency code, on every order. That single discipline fixes most "our ROAS doesn't match reality" tickets.
Deep dive Why accurate value is the input value-based bidding actually optimises
Target ROAS works backwards from a predicted conversion value: for each auction, Google estimates what a click is worth and bids up to the point where predicted value ÷ cost hits your target. That estimate is trained on the values your tag has historically reported. So the value signal isn't just reporting: it's the training data for the bidder.
Three consequences follow:
- Flat values flatten bidding. If every order reports the same number, Google can't learn that some products and queries are worth more, so it bids them all the same. Your genuinely high-value products get under-bid and your cheap ones get over-bid: the exact opposite of what value-based bidding is for.
- Delayed or missing values look like poor performance. If a chunk of sales never fire the tag (checkout on a subdomain the tag doesn't cover, app purchases, phone orders), Google sees the spend but not the return and pulls back: throttling campaigns that are actually profitable.
- This is why product-level economics need clean value first. Product-level tROAS analysis and profit-based decisions both start from reported revenue per product. If the revenue signal is broken, no amount of margin data downstream can rescue the analysis: fix the value at the tag first, then layer economics on top.
The practical test: pull a week of Ads conversion value and reconcile it against the same week's order revenue from your store. They won't match exactly (attribution windows differ), but they should be in the same postcode. A 3× gap is a tracking defect, not an attribution quirk.
GA4 import vs the direct tag
Both are valid; the choice is about consistency, not correctness.
- Direct Google tag: fires on your confirmation page, attributes within Ads' own model, tends to report faster and slightly higher. Simplest when Ads is your primary decision surface.
- GA4 import: one measurement model across Analytics and Ads, useful if you already live in GA4 and want conversions defined once. Adds a small reporting delay.
Whichever you pick, pick one path per purchase. The single most damaging mistake here is running both for the same sale and quietly double-counting for months.
Verifying it actually works
Don't trust the setup screen: trust a test order.
- Use Google Tag Assistant or the Ads conversion diagnostics to confirm the purchase event fires once on the confirmation page.
- Confirm it carries a value and a currency.
- Place a real test order and check the value Ads reports matches the order total (allowing for whether you include tax/shipping: just be consistent).
- A day later, confirm the conversion appears in Ads and the value is sane.
Once the value signal is clean, your ROAS numbers, your attribution comparisons and your product-level bid decisions all inherit that accuracy. Get this right once and everything downstream gets easier.
Step by step
- Create one primary purchase conversion action. In Google Ads go to Goals → Conversions → New conversion action → Website. Create a single Purchase action set to "Primary". Resist creating several overlapping purchase actions, double-counted conversions inflate ROAS and mislead bidding.
- Choose your data source, tag or GA4 import. Either place the Google tag plus an event snippet on your order-confirmation page, or import a purchase event from a linked GA4 property. Pick one path per purchase so the sale is counted once, not by both.
- Pass dynamic conversion value and currency on every order. Send the real order total, not a fixed placeholder, and always include the currency code. A hard-coded value tells Google every sale is worth the same, which destroys value-based bidding.
- Set counting to "One" for purchases. A purchase should count once per conversion, not "Every". "Every" is for actions like leads where repeat submissions matter; for orders it double-counts multi-item baskets.
- Verify with the tag diagnostics and a test order. Use Google Tag Assistant or the Ads diagnostics to confirm the purchase event fires once, with a value and currency, on the confirmation page. Place a real test order and check the value reported matches the order total.
Frequently asked questions
Should I use the Google tag or a GA4 import?
Either works; what matters is that a purchase is counted once. The direct Ads tag tends to attribute slightly more and fire faster; a GA4 import gives you one measurement model across Analytics and Ads. Do not run both for the same purchase or you will double-count.
What conversion value should I send?
The actual order total for that transaction, passed dynamically, with the currency code. If you sell in multiple currencies, send each order in its own currency and let Google convert, never force everything to one hard-coded number.
My Ads and GA4 conversion counts don't match. Is that a bug?
Usually not. They use different attribution models and windows by default, so some divergence is expected. Large or growing gaps are worth tracing, start with whether both are counting the same event once.