Analytics

How to Set Up GA4 Conversion Tracking Correctly

GA4 conversion tracking works by sending events to a Google Analytics 4 property, then marking the valuable ones — like purchase, generate_lead, or sign_up — as "key events." A key event is any user action worth measuring and optimizing toward, and when it is shared with a linked Google Ads account it becomes a "conversion" in Google Ads. To set it up correctly you need four things in place: the right event firing exactly once, the right parameters (especially value and currency), the event marked as a key event, and a QA pass in DebugView before you trust a single number. I'm Joyson Johnson, and I've rebuilt tracking on dozens of ad accounts where the media was fine but the data was lying. This guide is the setup I use so your reporting, your Google Ads bidding, and your revenue all agree.

How does the GA4 event model work?

GA4 has one data structure: the event. Every interaction — a page view, a scroll, an add to cart, a purchase — is an event with a name plus a set of parameters. There are no separate hit types like the pageviews, events, and transactions Universal Analytics used.

GA4 events fall into four buckets: automatically collected (session_start, first_visit), enhanced measurement (page_view, scroll, click, file_download), recommended (purchase, generate_lead, add_to_cart — Google's reserved names), and custom events you define. Always use a recommended name when one exists, because GA4 only unlocks built-in reports and predictive metrics for reserved names.

One naming change trips people up. In 2024 Google renamed GA4 "conversions" to "key events." In GA4 you now mark an event as a key event; the word "conversion" is reserved for what a linked Google Ads account counts. Same mechanism, cleaner vocabulary.

  • Event name: max 40 characters, case-sensitive (purchase and Purchase are different events)
  • Parameter name: max 40 characters; parameter value: max 100 characters
  • Up to 25 custom parameters recommended per event; up to 30 key events per standard property
  • Register custom dimensions/metrics in Admin so parameters show up in reports, not just DebugView

How do you mark an event as a key event (conversion) in GA4?

Marking a key event tells GA4 which events matter and makes them eligible to send to Google Ads. You do this once per event, and it applies going forward — it does not retroactively reclassify old data.

There are two paths depending on whether GA4 has already seen the event.

  • If the event is already collecting: Admin → Data display → Key events → find the event → toggle "Mark as key event" on.
  • If the event hasn't fired yet: click "New key event," type the exact event name (e.g. generate_lead), and save. It activates the next time that event arrives.
  • Set the counting method per key event: "Once per event" (count every purchase) vs "Once per session" (count one lead per session even if the form fires twice). Purchases are almost always "Once per event."
  • Only mark events that represent real business value. Marking page_view or a generic click as a key event is the fastest way to inflate your conversion count into meaninglessness.

How do you set up the GA4 purchase event with value and items?

The purchase event is the one you cannot get wrong, because it carries revenue and feeds Google Ads bidding. It needs three things to be usable: a transaction_id (for deduplication), a value plus a currency, and an items array describing what was bought.

Here is the shape of a correct purchase event pushed to the dataLayer (GTM) or sent via gtag:

gtag('event', 'purchase', { transaction_id: 'T-10492', value: 89.90, currency: 'INR', tax: 4.50, shipping: 0, items: [{ item_id: 'SKU-113', item_name: 'Wireless Earbuds', price: 89.90, quantity: 1, item_brand: 'Acme', item_category: 'Audio' }] });

Two rules decide whether GA4 records revenue at all. First, value must be a number (89.90), never a string ("89.90") or a formatted string with symbols ("₹89.90"). Second, currency must be a valid 3-letter ISO 4217 code (INR, USD, EUR). Send value without currency and GA4 will not attribute the revenue.

  • transaction_id: required to deduplicate — GA4 drops a second purchase with the same ID
  • value: total order value as a raw number, matching what you'd reconcile against your backend
  • currency: ISO 4217 code; must be present for value to count
  • items: at least item_id or item_name per line; add price, quantity, item_category for product reports
  • Fire purchase only on a genuine confirmation, and only once — not on a thank-you page that can be reloaded or reached via the back button

How do you link GA4 to Google Ads for conversion tracking?

Linking lets GA4 key events flow into Google Ads as conversions, and lets Google Ads read GA4 audiences and engagement. Without the link (and without auto-tagging), Google Ads can't attribute a GA4 conversion back to the click that drove it.

The setup is a short sequence in Admin, then an import step in Google Ads.

  • In GA4: Admin → Product links → Google Ads links → Link → select your Google Ads account → enable personalized advertising and auto-tagging.
  • Confirm auto-tagging is on in Google Ads (Settings → Account settings). This appends the GCLID that ties clicks to conversions.
  • In Google Ads: Goals → Conversions → New conversion → Import → Google Analytics 4 → select the key events you want to bid toward.
  • Import only the key events you actually optimize for, and set one as Primary. Extra Primary conversions distort Smart Bidding.
  • Expect GA4 and Google Ads counts to differ by roughly 5–10%. Google Ads credits the conversion to the click date and uses its own attribution; GA4 reports on the conversion date with data-driven attribution. Different rules, not a bug.

What are server-side tracking and the Measurement Protocol in GA4?

Server-side tracking sends events from your backend instead of (or in addition to) the browser, which survives ad blockers, ITP cookie limits, and JavaScript failures. In the GA4 world this means two distinct things people often conflate.

Server-side GTM (sGTM) is a Google Tag Manager container running on your own server — usually Cloud Run or App Engine on a subdomain like gtm.yourdomain.com. The browser sends to your server; your server forwards clean, first-party events to GA4. The Measurement Protocol is different: it's a raw HTTP API for sending events straight to GA4 from any backend, with no browser involved.

A Measurement Protocol call is a POST to https://www.google-analytics.com/mp/collect with a measurement_id and an api_secret, carrying a JSON body:

{ "client_id": "1234567.7654321", "events": [{ "name": "purchase", "params": { "transaction_id": "T-10492", "value": 89.90, "currency": "INR", "session_id": "...", "engagement_time_msec": 100 } }] }

The details that make or break it: client_id must match the one from the user's gtag/dataLayer, or the server event won't stitch to the same user and session. Include session_id and engagement_time_msec or the event may not appear in standard reports and Realtime. Generate the api_secret in Admin → Data Streams → your stream → Measurement Protocol API secrets, and keep it server-side only.

  • Use the Measurement Protocol for backend-only events: offline purchases, refunds, subscription renewals, CRM lead-qualification.
  • Pass the same client_id from the browser so web and server events are one journey, not two users.
  • Measurement Protocol events can be marked as key events and imported to Google Ads like any other event.
  • Don't double-fire: if the browser already sent purchase, don't also send it server-side with the same transaction_id unless you're intentionally deduping to server-side only.

What are the most common GA4 conversion tracking mistakes?

Almost every broken GA4 setup I audit fails in one of a handful of predictable ways. Fix these and your numbers become trustworthy.

The two most damaging are double counting and missing revenue — both silently corrupt bidding before anyone notices.

  • Double counting from duplicate firing: the same event goes out via both gtag and GTM, or an enhanced-measurement event plus a manual one. Pick one source per event.
  • Double counting purchases: the confirmation page reloads or is revisited. Deduplicate with transaction_id and, ideally, a client-side flag so it fires once.
  • Missing value or currency: value sent as a string, or value with no currency. Revenue reports show zero and value-based bidding starves.
  • Wrong counting method: leaving a lead form as "Once per event" when users submit twice inflates leads; use "Once per session."
  • Marking low-value events as key events: page_view, scroll, or a generic click turns your conversion count into noise.
  • Auto-tagging off or GCLID stripped by a redirect: Google Ads can't attribute the conversion to the click.
  • Assuming GA4 and Google Ads should match exactly: they won't, because of attribution model and date-basis differences — reconcile the trend, not the decimal.

How do you QA GA4 conversion tracking with DebugView?

DebugView is GA4's live event inspector — it shows events from a single debug-enabled session in real time, with every parameter expanded. Never mark an event as a key event, and never trust a purchase value, until you've watched it land here.

There are three ways to put a session into debug mode, and any one works.

  • Turn on debug: use GTM Preview mode, install the "Google Analytics Debugger" Chrome extension, or send debug_mode: true with your gtag config.
  • Open Admin → DebugView, then trigger the action (submit the form, complete a test purchase).
  • Click the event in the timeline and expand its parameters. Confirm the event name is exactly right, value is a number, currency is a valid code, transaction_id is present, and the items array is populated.
  • Do a duplicate check: complete one purchase and confirm exactly one purchase event appears — not two.
  • Cross-check Realtime and, after 24–48 hours, the Key events report to confirm the event is counting as a key event and revenue is attributed.
  • Only after DebugView is clean should you enable Google Ads import and start bidding on the event.

Frequently asked questions

What's the difference between a key event and a conversion in GA4?
They're the same underlying action. In GA4 you mark an important event as a "key event" (Google renamed "conversions" to "key events" in 2024). The word "conversion" now refers to what a linked Google Ads account counts when that key event is imported and shared with it.
Why is my GA4 conversion count different from Google Ads?
Because they count differently. Google Ads credits the conversion to the click date and applies its own attribution, while GA4 reports on the conversion date using data-driven attribution. A 5–10% difference is normal; reconcile the trend, not the exact number. Large gaps usually mean auto-tagging is off or the GCLID is being stripped by a redirect.
Do I need transaction_id on the GA4 purchase event?
Yes. transaction_id is how GA4 deduplicates purchases — if the same ID arrives twice (a page reload or back-button revisit), GA4 drops the duplicate. Without it, refreshes and revisits inflate both your order count and your revenue.
Why is GA4 showing my conversions but no revenue?
Almost always a value or currency problem. GA4 only records revenue when value is a raw number (89.90, not "₹89.90") and a valid 3-letter ISO 4217 currency code (INR, USD, EUR) is present. Send value without currency and the revenue is discarded even though the event counts.
How long do key events take to show up in GA4?
In DebugView and Realtime, within seconds. In the standard Key events report and revenue metrics, allow 24–48 hours for processing. Use DebugView to validate the setup immediately rather than waiting on the aggregated reports.

Want this run properly on your account?

Start a project
Available for work