GA4 conversion tracking is the foundation everything else stands on — bidding, attribution, budget decisions. It's also the thing most sites get subtly wrong, which is worse than getting it obviously wrong, because subtly wrong data still looks like data.
The mental model: everything is an event
GA4 has no "goals," no session-based conversions — just events with parameters. A key event (the artist formerly known as "conversion") is any event you've flagged as one. The whole game is: fire the right events, with the right parameters, exactly once, and flag the right ones as key events.
The setup, in order
- 1. One data stream per site. Multiple streams for one site (a classic migration leftover) fragments users and double-counts sessions.
- 2. Fire events through GTM, not hardcoded snippets. One management layer, versioned, debuggable. Mixed hardcoded + GTM tags are the #1 source of double-fires.
- 3. Name events deliberately. Use recommended names where they exist (
purchase,generate_lead,sign_up) — GA4 attaches special reporting to them. Invent names only for genuinely custom actions. - 4. Send parameters that matter:
value,currency,transaction_idon purchases. No value = Smart Bidding treats a $500 order like a $5 one. No transaction_id = refresh-duplicates inflate revenue. - 5. Mark key events sparingly. Three to five that map to money. Marking scroll-depth as a key event is how agencies report success while businesses lose money.
The step everyone misses: the Google Ads link
GA4 tracking and Google Ads optimization are separate systems until you connect them properly:
- Link GA4 ↔ Google Ads (admin panel, two clicks, frequently forgotten after migrations).
- Import GA4 key events into Google Ads — or better, tag conversions directly with the Google tag and use GA4 for analysis. Pick ONE as the bidding source. Importing both = double-counted conversions = Smart Bidding optimizing toward fiction.
- Turn on Enhanced Conversions and consent mode if you serve EU/UK traffic; without them, modeled conversions vanish and your data develops holes exactly where iOS users live.
Test with real money on the line: place a real order, submit a real lead. DebugView is nice; a reconciled bank statement is truth.
The five failure modes I find weekly
- Double-counting — GTM tag + hardcoded tag + GA4 import all firing. Symptom: platform reports ~2x backend reality.
- Thank-you-page tracking on a page users can bookmark/refresh — fire on the transaction event, dedupe with transaction_id.
- Cross-domain leaks — checkout on a different domain without cross-domain config = every purchase attributed to "referral," your ads get zero credit, and someone concludes ads don't work.
- Consent banner blocking all tags for all users regardless of choice — check fire rates before vs after banner deploys.
- Nobody reconciles. Platform vs backend, monthly, in a spreadsheet. A stable 15% gap is fine (that's the modern web — shrink it with server-side tracking). A gap that changed suddenly is a broken tag screaming quietly.
The 30-minute monthly ritual
Check: key event counts vs backend, any new "(not set)" spikes, tag fire rates by browser, and whether anyone added rogue tags. Thirty minutes a month keeps the textbook your bidding AI learns from honest — and honest data is the entire ballgame.