Transaction ID Deduplication
Your Google Ads conversion tags for e-commerce events do not pass a transaction or order ID. Google Ads has no way to deduplicate conversions when a user reloads the confirmation page, navigates back and forward, or hits the order endpoint twice for any other reason. Every refresh counts as a new purchase. The same order can fire two or three times before the user closes the tab.
Why It Matters
Google Ads deduplicates conversions using the transaction ID (`order_id`, `transactionId`, or the `transaction_id` parameter, depending on tagging surface). When two conversion requests arrive with the same transaction ID inside the deduplication window, Google counts only the first one. When the transaction ID is missing, every request is treated as a fresh conversion. The failure modes are common on confirmation pages. A user refreshes to check their order status, the page reloads, the tag fires again. A user navigates back from the order tracking page, then forward to the confirmation page, the tag fires again. A user opens the order email and clicks back to the confirmation page, the tag fires again. Without a transaction ID, each of those duplicates counts. The order is real once. Google Ads thinks it happened two or three times. The severity is warning rather than critical because the inflation is usually 5 to 15 percent rather than 100 percent, and it gets worse as more users land on a confirmation page from non-purchase paths (post-purchase emails, support links, bookmarks). The dashboards look healthy. The reconciliation against the commerce backend is where the gap shows up.
How To Fix It
- Open the AdLint details and list each conversion tag missing a transaction ID parameter.
- Open each tag in GTM. Add a parameter named `transaction_id` (or `order_id`, depending on the gtag version) and bind it to a Data Layer Variable that reads the order ID from the dataLayer.
- Confirm the source: the order or transaction ID should come from the order object pushed at purchase, not from a URL parameter (which can be missing or spoofed) and not from a generated timestamp (which changes on every load).
- Verify in GTM Preview that the conversion request includes a stable transaction ID across page reloads.
- Wait one reporting cycle. Reported volume on the action should drop slightly as duplicates are filtered. Reconcile a sample of orders against the commerce backend to confirm.
Example
Tag: 'AW - Purchase'
Missing parameter: transaction_id
Fix: add transaction_id parameter bound to {{DLV - ecommerce.transaction_id}}.This GTM container has Google Ads conversion tags for e-commerce events that do not pass a transaction or order ID. Per Google's conversion-tracking documentation, Google Ads deduplicates conversions using the transaction ID parameter; without it, page reloads, browser back-forward navigation, and confirmation-page revisits each count as fresh conversions. The result is reported conversion volume inflated by 5 to 15 percent on average, which biases Smart Bidding feedback and produces ROAS reports that diverge from commerce-backend totals. The transaction ID must come from the order object pushed at purchase, not from a URL parameter or generated timestamp. Fix: add a `transaction_id` parameter to each e-commerce conversion tag bound to the order ID from the dataLayer, verify stability across page reloads in Preview, and reconcile reported volume against the commerce backend after one reporting cycle. Source: support.google.com/google-ads/answer/6386790.
Drop this paragraph into your client deliverable. Sources back to the canonical platform documentation linked below.
References
Audit your own files for this check
AdLint runs this check (and 177 others) against your GTM, Google Ads, Meta, TikTok, LinkedIn, Pinterest, Twitter/X, and Snapchat exports. Everything stays in your browser. No uploads, no accounts.
Run a free audit