A GA4 conversion setup that does not lie to you

Most GA4 properties report confidently and wrongly. Here is the setup order that produces numbers you can make decisions from.

GA4 will happily report a number for anything. Whether that number describes reality is a separate question, and one worth answering before you move budget because of it.

Step 1: fire events on actions, not page views

The most common broken setup marks the thank-you page view as the conversion. It seems reasonable and it over-counts constantly — someone refreshes, someone bookmarks it, someone hits back and forward, a bot crawls it.

Fire on the actual submit, after your handler confirms success:

gtag('event', 'generate_lead', {
  currency: 'USD',
  value: 50,                      // what a lead is worth to you
  lead_source: 'landing_page',
  form_location: 'hero'
});

Use the reserved names where they exist — generate_lead, purchase, sign_up. GA4 and Google Ads both understand them, so they slot into reporting and bidding without extra mapping.

Step 2: mark key events, and only the real ones

In GA4, Admin → Events → mark as key event. Be strict here. If you mark scroll depth and outbound clicks as key events, your conversion rate becomes meaningless and — worse — Google Ads will import and optimise toward them.

Worth knowing: a "key event" in GA4 is what used to be called a conversion. The rename caught a lot of documentation out, so older guides pointing at a "Conversions" menu are describing the same thing.

Step 3: exclude your own referrals

This one silently destroys attribution. If a visitor goes to Stripe, PayPal or a booking system and comes back, GA4 counts the return as a new session from a referral. Your ad gets no credit; Stripe gets it all.

Admin → Data Streams → Configure tag settings → List unwanted referrals. Add every payment, booking and authentication domain you use.

Step 4: configure cross-domain if you span domains

If your landing page and your booking flow are on different domains, configure cross-domain measurement or one visitor becomes two users with two sessions and no connection between them.

Same screen: Configure your domains. List every domain in the journey.

Under GDPR — and increasingly under the DPDP Act and CCPA — marketing tags must not fire before consent. Consent Mode v2 handles this properly: tags load, but withhold identifiers until consent arrives, and Google models the gap.

// BEFORE the GA4 tag loads
gtag('consent', 'default', {
  ad_storage: 'denied',
  ad_user_data: 'denied',
  ad_personalization: 'denied',
  analytics_storage: 'denied',
  wait_for_update: 500
});

// then, when the visitor accepts
gtag('consent', 'update', {
  ad_storage: 'granted',
  ad_user_data: 'granted',
  ad_personalization: 'granted',
  analytics_storage: 'granted'
});

The default block must come first. A consent banner that fires after the tag has already set cookies is not compliance, it is decoration.

Step 6: attribution — know what you are reading

GA4 defaults to data-driven attribution, which spreads credit across touchpoints. Google Ads reports its own conversions with its own model and lookback window.

They will not match. That is expected, not a bug. Pick one as your source of truth for budget decisions — I use Google Ads for in-platform bidding and GA4 for cross-channel comparison — and never average the two.

The verification checklist

  1. DebugView — submit your own form and watch the event arrive with the right parameters.
  2. Realtime — confirm the key event increments by exactly one.
  3. Load the thank-you page directly. If a conversion fires, you are still tracking a page view.
  4. Check the referral list after 48 hours for your own payment domains.
  5. Compare GA4 leads with actual inbox leads for a week. If they differ by more than about 10%, something above is still wrong.

That last check is the one that matters. Everything else is process; matching GA4's number against the leads that genuinely arrived is the only proof.

Frequently asked

Why does GA4 show fewer conversions than Google Ads?

Different attribution models and different lookback windows. Google Ads credits the ad click within its own window; GA4 uses its own model and may credit a later channel entirely. A gap of 10–30% is normal. A gap of 300% means something is genuinely broken.

Do I need Google Tag Manager, or is gtag.js enough?

For a couple of simple events, gtag.js is fine. Once you have several events, consent mode and more than one platform to feed, Tag Manager saves real time — mainly because you can change tracking without a developer touching the site.

How long should I wait before trusting GA4 data?

Wait 24–48 hours after any change, since GA4 processing is not instant, then validate against a source you control such as your inbox or CRM. Never make a budget decision on the first day of a new setup.