Google Ads counting purchases twice? Find and fix duplicate conversions

By Updated

Short answer

One sign your Google Ads conversion tracking is wrong: Google Ads shows more purchases than your store got from Google ads. The usual cause is 2 purchase actions set to Primary, so each order counts twice and bidding thinks your ads earn more. Keep the action that matches your store's orders as Primary, set the other to Secondary, then lower your Target ROAS to match the real numbers.

What this means

A conversion action is 1 thing Google Ads counts as a result, like a purchase. Your account has more than 1 action counting purchases, and more than 1 of them is set to Primary. Primary actions are reported in the Conversions column and used for bidding.

This usually happens by accident over time:

Google can drop repeats inside 1 conversion action. The transaction ID is your order number, sent with the sale. If 2 conversions for the same conversion action share a transaction ID, Google Ads knows the second is a duplicate. Counting happens per tracked conversion action, so 2 separate Primary actions each add the order to your Conversions column.

Why it costs you money

Double counting changes how Google spends your money, on top of inflating the report.

  • Bidding overpays. Target ROAS and Maximize conversion value are Smart Bidding strategies, Google's automatic bidding, and they chase sales value. With every order counted twice, they see twice the value per click and bid higher than your real sales justify. Target CPA and Maximize conversions see twice the orders, so they overpay too.
  • Your targets stop meaning anything. Target ROAS is the return you ask Google to hit. A target set on doubled revenue is really half that target in store terms.
  • Bad campaigns look fine. A campaign losing money can show a healthy return on paper, so nobody cuts it.

To size it, compare Google Ads with your store for the same 30 days. Divide the conversion value Google Ads shows for your purchase goal by the revenue your store shows from Google ads orders. Near 2 means every order is counted twice. Between 1 and 2 can mean a partial overlap, or just the 2 systems crediting sales differently, so check the actions one by one below. Ignore the ratio when your store shows only a handful of orders, since 1 big order swings it. If your store shows no orders from Google ads at all, there's no ratio to work out. Check how your store credits orders before you blame double counting.

Here's a worked example. A store spent $4,000 on Google ads in 30 days. Its own reports show 120 orders from Google ads worth $9,600, a real return on ad spend (ROAS) of 240%. Google Ads shows 2 Primary purchase actions: Action A with 118 conversions worth $9,440, and Action B with 115 worth $9,200. The Conversions column adds them up: 233 conversions worth $18,640, a ROAS of 466%. $18,640 divided by $9,600 is 1.94, so nearly every order counts twice. The campaign's Target ROAS of 450% is really about 232% in store terms. Check both returns with the ROAS calculator.

How to check your account in 2 minutes

  1. Go to Summary under Conversions in the Goals menu.
  2. Find the goal for purchases and open it. List every action inside it and note which ones are marked Primary.
  3. If more than 1 purchase action is Primary, note where each comes from: a website tag, a Google Analytics import, or the Shopify app.
  4. Open Campaigns, select the segment icon and choose Conversion action under Conversions (Google's steps). Set the range to the last 30 days.
  5. Compare the account totals for each purchase action. If 2 of them show nearly the same count and value, they're tracking the same orders. Campaign rows can differ even then, because an attribution model, the rule for how much credit each ad interaction gets, can be set differently on each action.
  6. Check how many orders your store got from Google ads in the same 30 days. The action closest to it is your source of truth.

When it is not a problem

  • Only 1 purchase action is Primary. The others can stay Secondary without harm. Secondary actions are for observation only and show in the All conversions column, so they don't steer bids.
  • The actions track different things. 2 purchase actions for 2 separate stores, 2 countries, or an online shop plus a phone order line aren't duplicates if each order only reaches 1 of them.

One catch: custom goals. A custom goal is a hand-picked group of actions that you apply to chosen campaigns. Its actions are used for reporting and bidding regardless of whether they're set as primary or secondary. So a Secondary duplicate inside one still doubles that campaign's bids. Check those goals separately.

PerfoAds checks this on store accounts only. It flags the account when 2 or more actions in its purchase group are set to Primary. That group covers purchases plus lead, lead form and sign-up actions, so a Primary newsletter sign-up next to your Primary purchase also triggers it. A sign-up counts different people, and it still pulls bids toward cheap sign-ups: handle it like Add to cart set as Primary. PerfoAds can't see your store's orders, so it can't prove 2 actions count the same sale. Steps 5 and 6 above settle that. Because it reads the Primary setting alone, a Secondary duplicate inside a custom goal won't show up. Check those by hand.

How to fix it

  1. Pick one source of truth. Choose the purchase action whose count and value best match your store's orders from Google ads. On Shopify, Google's setup guide says to set the Google & YouTube app conversion as primary.
  2. Set the others to Secondary. Go to Summary in the Goals menu, find the goal, select Edit goal, and in the Conversion action optimization section choose Secondary (observe only) for each extra action (Google's steps). Select Save. You'll still see their numbers in All conversions.
  3. Check the counting setting. Open the action you kept, select Edit settings, then Count. Google calls Every a good choice if you'd like to track and improve your sales.
  4. Send a transaction ID. Make sure your purchase tag passes the order number as a transaction ID. Google says that if a customer returns to the conversion page or reloads the page, the tag could fire again. The ID stops that second count.
  5. Remove old tags. Google's Shopify guide says to remove legacy tags to prevent duplicate measurement. On Shopify, look under Customer events in Settings for a custom pixel that still sends purchases. Google's Tag Assistant check shows which tags fire, and Google says to disable only the duplicated events.
  6. Reset your targets. Your reported conversions and return will drop once the duplicate stops counting. Google warns that a target that's too high may limit the amount of traffic your ads may get. Divide your old Target ROAS by the ratio you found. In the example above, 450% divided by 1.94 gives about 232%. Make this change the same day you switch the extra action to Secondary. Google's goals guide says to avoid frequent manual changes to budgets, targets (CPA or ROAS), or conversion goals while bidding settles.
  7. Give it time. Bidding may show a Learning status, Google's sign that it's adjusting, when the conversion goals or actions you are optimizing to have significantly changed. Google says Learning status never lasts more than 7 days. Judge the new numbers after 1-2 conversion cycles, your usual time from click to sale.

Check it with a query

This lists every active purchase action, what type it is, how it counts, and whether it's Primary. The query uses GAQL, the language Google built for pulling ads data. Paste it into a Google Ads script that calls AdsApp.search(), or run it through the Google Ads API. The fields are in Google's API reference. The type column tells a Google Analytics import (GOOGLE_ANALYTICS_4_PURCHASE) apart from a website tag (WEBPAGE).

SELECT
  conversion_action.name,
  conversion_action.type,
  conversion_action.primary_for_goal,
  conversion_action.counting_type,
  conversion_action.status
FROM conversion_action
WHERE conversion_action.status = 'ENABLED'
  AND conversion_action.category = 'PURCHASE'

More than 1 row with primary_for_goal set to true is the problem. Custom goals ignore this setting, so check them in Google Ads too.

Sources

PerfoAds runs this check on your account

Connect your Google Ads account and PerfoAds checks for this problem, along with the rest of its checks, using your own data.

Check my account

Related problems