ProfitBox360ProfitBox360
Indian Ecommerce research
India · Ecommerce

Google Ads and GA4 Purchase Tracking: How to Avoid Duplicate Conversions

Anupriya Das, Ecommerce Analytics Associate11 min read

What we found

Keep one purchase action as primary in Google Ads: on Shopify, the purchase action from the Google & YouTube app's Google Ads tag. Set the GA4 purchase import and any old tag to secondary. In 2025, 27% of audited Indian Google Ads accounts had both the tag and a GA4 import as primary, and Google Ads reported 23% more purchases than store orders. After duplicates were removed and attribution models adjusted, the gap was 8.5%.

Why does Google Ads count the same purchase twice?#

Two purchase actions are both set as primary, so Google Ads adds them together. The Google Ads tag and a GA4 import each record the same order, and the Conversions column shows two purchases for one sale.

Google Ads uses primary actions for the Conversions column and for bidding. Secondary actions are for observation only: they appear in the All conversions column and aren't used for bidding. Older guides mention an "Include in Conversions" setting; Primary and Secondary have replaced it.

A transaction ID can't stop this kind of double count. Google Ads treats a conversion as a duplicate only when it shares a transaction ID with another conversion in the same conversion action. The tag and the GA4 import are two separate actions, so both count. The "Every" or "One" counting setting also works per action, so it can't merge them either.

Google's multi-source conversions, still in beta, can merge a Google tag with offline uploads and remove duplicates by transaction ID. It doesn't accept imported Google Analytics conversions, because Google says that deduplication must happen inside Google Analytics before import.

Google sets conversion actions based on GA4 key events to secondary, to stop the same event counting twice for bidding. So double counting usually starts when someone switches an import to primary or adds a second purchase tag.

What audits of Indian Google Ads accounts found#

MeasureBenchmark
Audited accounts counting purchases twice (Google Ads tag and GA4 import both primary)27%
Purchases reported by Google Ads above actual store orders23%
Store orders missing from GA4 purchase tracking12%
Purchases reported above store orders after removing duplicates and adjusting attribution models8.5%

These are averages from 2025 audits of Indian Google Ads accounts, from ProfitBox360 research, 2025 (client data and shopper surveys). GA4 loses its missing orders mainly to ad blockers and to shoppers declining cookie consent.

What double counting does to bidding#

Illustrative example: a Shopify store spends ₹3,00,000 a month on Google Ads.

  • The store can match 1,000 orders to Google Ads, at an average order value of ₹1,000
  • Google Ads reports the audit averages: 23% more purchases than store orders before the fix, and 8.5% more after it
  • GA4 records 88% of those orders, missing the average 12%
  • Every purchase is valued at ₹1,000
  • The campaigns bid with a 4x Target ROAS, set before the fix
SourcePurchasesRevenueROASCost per purchase
Store orders matched to Google Ads1,000₹10,00,0003.33x₹300
Google Ads before the fix1,230₹12,30,0004.10x₹243.90
Google Ads after the fix1,085₹10,85,0003.62x₹276.50
GA4880₹8,80,0002.93x₹340.91
  • ROAS = revenue ÷ ₹3,00,000 of spend
  • Cost per purchase = ₹3,00,000 ÷ purchases
  • Removed by the fix: 1,230 − 1,085 = 145 purchases, or ₹1,45,000 of revenue the store never received
  • Left after the fix: 1,085 − 1,000 = 85 purchases, or ₹85,000, still above store orders

Smart Bidding learns from the Conversions column. Before the fix, it sees a sale for every ₹243.90 of spend, when the real cost is ₹300. Target ROAS and Target CPA strategies then bid as if each click is worth more than it is.

Since 17 August 2026, this matters more. Google's target-based bidding now delivers closer to the target you set, instead of beating it when budget is limited. A target set on double-counted purchases steers spend more directly.

Which purchase action should be primary?#

Make the Google Ads tag's purchase action primary and keep the GA4 import as secondary. On Shopify, the tag's purchase action is the one the Google & YouTube app creates.

Google's own Shopify guide says to set the app's conversions as primary and remove legacy tags to prevent duplicate measurement. When you link Google Ads, the app creates purchase, add to cart and checkout started actions. Purchase becomes primary, and the other two are set as secondary.

PointGoogle Ads tag (Google & YouTube app)GA4 purchase import
Default statusPurchase action set as primarySecondary
Time to appear in Google AdsWithin 15 hoursUp to 24 hours after the event
View-through conversionsReported in their own columnNot available
Transaction IDSent automatically by the appDeduplicated inside GA4 before import
Removing cancelled ordersCan be retracted by order IDCan't be adjusted
Enhanced conversionsTurned on in the appThrough GA4 user-provided data collection

GA4 misses 12% of store orders on average. For the store in the example above, that's 120 of its 1,000 orders, or ₹1,20,000 a month. If the GA4 import were the only primary purchase action, Smart Bidding wouldn't learn from those orders.

Both tags depend on the shopper's browser, so neither sees every order. Enhanced conversions, covered below, helps Google match more of them.

How do you fix the purchase goal in Google Ads?#

Set one purchase action to Primary and every other one to Secondary. Then check that no campaign still bids on the GA4 import through its own goals.

  1. In Google Ads, open the Goals menu and go to Summary. Find the Purchase goal and look at the conversion actions grouped in it.
  2. Identify the Google & YouTube app's purchase action, any GA4 import and any action from an old tag.
  3. Click Edit goal. In the action table, choose Primary for the app's purchase action. Choose "Secondary (observe only)" for every other purchase action.
  4. Check that Purchase is an account-default goal, using "Make this an account-default goal". An action is used for bidding by default only when it's primary and its goal is account-default.
  5. Open each campaign's settings and check Conversion goals. A campaign-specific goal overrides the account default.
  6. Take the GA4 import out of any custom goal. A custom goal uses every action in it for reporting and bidding, whether primary or secondary.
  7. Note the date of the change, so you can compare reports on either side of it.

Reset your bidding targets#

Scale your Target ROAS or Target CPA by the share of purchases that remain, so bidding keeps the same real efficiency.

New Target ROAS = old Target ROAS × purchases after the fix ÷ purchases before the fix

New Target CPA = old Target CPA × purchases before the fix ÷ purchases after the fix

In the example, the 4x Target ROAS becomes 4 × 1,085 ÷ 1,230 = 3.53x. Both targets aim for the same ₹3.25 of store-matched revenue for every ₹1 of spend:

  • Before the fix: 4 × 1,000 ÷ 1,230 = ₹3.25
  • After the fix: 3.53 × 1,000 ÷ 1,085 = ₹3.25

Whether ₹3.25 per ₹1 of spend is profitable is a separate question, answered by your break-even ROAS.

Changing a target doesn't start a learning period or reset what Smart Bidding has learned. Changing conversion goals or actions does: Smart Bidding takes 1–2 conversion cycles to learn in most cases. Google won't adjust your targets or budgets for you.

How do transaction IDs stop repeat counting?#

They make one conversion action ignore a repeat of the same order, such as a reload of the Thank you page. They can't merge two different actions.

  • Google Ads: when two conversions in the same action share a transaction ID, the second is treated as a duplicate. IDs can hold up to 64 characters. Shopify's Google & YouTube app sends transaction IDs automatically.
  • GA4: purchase events with the same transaction ID are deduplicated. This works for web data streams, not app streams. Always send a real ID: GA4 treats every purchase with an empty transaction_id as the same purchase.
  • Shopify: the checkout_completed event fires once per checkout, usually on the Thank you page. With post-purchase upsells, it fires on the first upsell offer page instead.
  • Counting: set purchase actions to "Every". Google recommends it for sales, because every sale adds value.

If you add a purchase tag by hand, for example through Google Tag Manager, send the Shopify order ID as the transaction ID. The same ID later lets you match platform purchases to store orders.

Where else can duplicate purchase tags hide on Shopify?#

In old theme code, custom pixels, replacement checkout scripts and extra tracking apps. Any of them can fire a second purchase tag beside the Google & YouTube app.

Shopify notes that one event can be tracked in several places: theme code, an app, or the Customer events section of the admin. Google's guide also says to check for duplicate tags when conversions run through the app and through the storefront or a custom pixel.

  1. Go to Settings > Customer events. List every app pixel and custom pixel. Remove any custom pixel, including a Google Tag Manager one, that sends a Google Ads purchase the app already sends.
  2. Search theme.liquid and other theme files for old gtag.js or Google Ads conversion snippets, and remove them.
  3. Check what replaced your old checkout scripts. Shopify switched off script tags on the Thank you and Order status pages on 28 August 2025 for Plus stores and 26 August 2026 for other stores. If a custom pixel was added during that upgrade, make sure it doesn't repeat the app's purchase event.
  4. Check any third-party tracking app that also sends Google Ads or GA4 purchases.
  5. Place a test order with your browser's developer tools open. Look for more than one request to the same analytics endpoint for that single purchase.

Turn on enhanced conversions#

Switch it on in the Google & YouTube app: open the Settings tab, find Enhanced conversions under Google Ads settings and select Turn on.

Enhanced conversions sends hashed first-party data, such as email address and phone number, when a customer buys. It supplements your existing conversion tags rather than creating a new conversion action.

GA4 has its own version. Once user-provided data collection is set up and GA4 is linked to Google Ads, enhanced conversions pass automatically to Google Ads with any imported conversions.

How do you know the fix worked?#

A month after the fix, expect Google Ads purchases to sit near the 8.5% audit average above store orders, not 23%. For the example store, that means an overstatement near ₹85,000 a month rather than ₹2,30,000.

  • Read the Conversions column. All conversions still includes secondary actions, so it keeps counting the GA4 import.
  • Place a test order and confirm that only one purchase appears in the primary action.
  • Allow 1–2 conversion cycles before judging bidding results.
  • Match Google Ads purchases to store orders by order ID each month, after reporting delays settle.
  • If the gap stays well above 8.5%, look for another duplicate tag before changing anything else.

A gap near 8.5% is the average that remains once duplicates are gone. Track it through the monthly order match rather than hunting for more tags.

FAQ#

Should you delete the GA4 purchase import from Google Ads?#

No. Keep GA4's purchase conversion in Google Ads, but switch it to Secondary (observe only). A secondary action appears in the All conversions column, so GA4 stays available as a cross-check against the Google Ads tag without affecting bidding. Deleting it loses that comparison. Take it out of any custom goal, because custom goals bid on secondary actions too.

Why does All conversions still show both purchase actions?#

Google Ads builds the All conversions column from primary actions plus secondary actions, view-through conversions and a few other extras. So after the GA4 import becomes secondary, All conversions keeps adding it to the Google Ads tag's count. Judge the fix on the Conversions column instead, which holds primary actions only and is the one Smart Bidding uses.

Can cancelled COD orders be removed from Google Ads?#

Yes, if the purchase came through the Google Ads tag with an order ID. Upload retractions under Goals, then Conversions, then Uploads, within 54 days of the conversion. Smart Bidding only uses those uploaded within 7 days. Google Ads can't adjust GA4-imported conversions, which is one more reason to keep the tag as the primary purchase action.

Does turning on enhanced conversions add extra purchases?#

No. Enhanced conversions attaches hashed customer details, such as email address and phone number, to the purchase the Google Ads tag already records. Google uses those details to match that sale to a signed-in user who interacted with an ad. No second conversion action is created, so the same order isn't counted twice.

Will fixing duplicate purchases reset Smart Bidding?#

Yes, briefly. Switching the GA4 import from primary to secondary changes the conversion actions Smart Bidding learns from, and Google says it needs 1–2 conversion cycles to adjust in most cases. Changing a Target ROAS or Target CPA doesn't start a new learning period. Make both changes on the same day, then judge results after a full cycle.

Can a GA4 import be the only primary purchase action?#

Yes. When a store can't run a Google Ads purchase tag, GA4's purchase conversion can be the single primary action. Expect fewer recorded purchases: GA4 misses 12% of store orders in audited Indian accounts, about ₹1,20,000 on every ₹10,00,000. Imports also take up to 24 hours and exclude view-through conversions. Never set both as primary.

Anupriya Das

Ecommerce Analytics Associate, ProfitBox360

Anupriya writes about ecommerce tracking, attribution and profitability. Her articles explain how to interpret store and advertising data, calculate acquisition costs and contribution margins, and recognise gaps that affect business decisions.

How this research is checked, and corrected

More research

Want these numbers read against your own?