GA4 purchase event checker
Paste your purchase event and see what Google's own reference says is wrong with it, from a missing transaction_id to a value sent as text, no currency or an empty items list. Then copy a corrected version.
Runs in your browser. Nothing you paste is sent to us or anyone else. Tag Manager and Liquid variables are fine, they are reported as code we cannot run rather than guessed at.
Where to find your purchase event
- In the browser. Place a test order, and on the thank-you page open the developer console and type
copy(JSON.stringify(dataLayer)). That copies the whole dataLayer, and the checker picks out the purchase. - In Tag Manager. Preview mode shows each dataLayer push under the Data Layer tab of the purchase event.
- In code. Your theme, checkout extension or custom pixel will have a
dataLayer.pushorgtag('event', 'purchase', ...)call. Paste it as it is.
What it checks, and where each rule comes from
Every rule is Google's, from its purchase event reference unless the row says otherwise. Nothing here is our own preference dressed up as a requirement.
| Field | What Google says |
|---|---|
| event | purchase is the recommended event. Event names are case sensitive, so Purchase is a different event. |
| transaction_id | Required, a string. It is how GA4 avoids counting one order twice. An empty string makes GA4 deduplicate every purchase that has it, on web streams. |
| value | Required, a number. The sum of price times quantity for the items, without shipping or tax. |
| currency | Required whenever value is set. A 3-letter ISO 4217 code, like GBP. |
| items | Required. Each item needs an item_id or an item_name. price and quantity are numbers, and quantity counts as 1 when left out. |
| shipping, tax | Optional, numbers. |
| ecommerce | Through Tag Manager, Google's examples put the order fields inside an ecommerce object, and clear the previous one first with dataLayer.push({ ecommerce: null }). |
What it tells you
- Whether the event you pasted matches Google's purchase reference
- Values sent as text, missing fields, empty IDs and wrong currency codes
- A value that includes shipping and tax
- The Universal Analytics shape, converted to GA4's
What it cannot tell you
Whether the event fires, whether GA4 received it, whether your Tag Manager tag is set to send ecommerce data, or what a variable comes out as on a real order. For that, place a test order with DebugView open. If the purchase is not arriving at all, start here.
Questions people ask
What does a correct GA4 purchase event look like?
An event named purchase, all lowercase, with a unique transaction_id, value as a number, a 3-letter currency code such as GBP, and an items list in which every item has an item_id or an item_name. Through Tag Manager these sit inside an ecommerce object in the dataLayer push. Google sets value to the sum of price times quantity for the items, without shipping or tax. Press "Try a broken example" above and the corrected version shows the shape.
Should the GA4 purchase value include shipping and tax?
No. Google's purchase event reference says to set value to the sum of price times quantity for all items, and not to include shipping or tax. Those have their own shipping and tax parameters.
What happens if the transaction_id is empty?
Google Analytics deduplicates every purchase whose transaction ID is an empty string, so all of them count as one purchase and GA4 undercounts. Send the real order number, different for every order. More on this in duplicate GA4 purchase events.
Does this checker tell me whether GA4 received my purchase?
No. It checks the event you paste against Google's reference. Whether it fires, and whether GA4 received it, needs a test order with DebugView open.
Is what I paste sent anywhere?
No. The checker runs in your browser. Nothing you paste is sent to AuditTag or anyone else.