OJCLabs
Article

How to Fix Conversion Tracking in GA4 Step by Step.

Oussema Djemaa · 8/4/2026 · 12 min read

Bold black editorial blog header with white headline "How to Fix Conversion Tracking in GA4 Step by Step", red diagonal graphic element, and OJC Labs Growth pillar label

GA4 is installed on your site. The green checkmark is there. The real-time view shows visitors. And yet, when someone asks how many conversions came from paid search last month, the honest answer is a number that exists in three different tools, disagrees with itself across all three, and cannot be defended in a room with a spreadsheet. The dashboard is not broken. The implementation is. And the gap between “GA4 is installed” and “GA4 conversion tracking is actually working” is where most businesses have been quietly operating for longer than they realize.

This is the step-by-step path from that gap to a tracking setup that produces numbers you can actually make decisions from.

Step 1 — Audit What GA4 Is Actually Receiving Right Now

Before fixing anything, establish what is genuinely broken versus what is working but misread. Open GA4 → Reports → Realtime and complete an actual conversion action on your site — a form submission, a thank-you page load, a purchase, whichever event you care about. Watch the realtime view. If nothing fires, the event is not being sent. If something fires but is not marked as a conversion, the event exists but has not been configured as a conversion. These are two different problems with two different fixes.

GA4 Realtime overview report showing 8 active users in the last 30 minutes concentrated in the Tunis region, with Google as first user source and Start a Project OJC Labs as the most viewed page
GA4 Realtime (Reports → Realtime) — the first place to check whether a tag is firing. No event within 30 seconds of a test action means the tag is not sending.

Then go to Admin → Events and check the event list. Cross-reference with Admin → Conversions. An event that appears in the event list but not in the conversions list is an event that GA4 knows about but is not counting as a conversion. An event missing from both lists is an event that is not being fired at all.

GA4 Admin Data display Events panel showing key events including close_convert_lead, cta_click, form_submit, purchase, and qualify_lead with star toggles indicating which events are marked as key events, and purchase showing an unfilled star
The star is the key event toggle. Filled = counted as a conversion. Empty = event exists but isn’t in your conversion reports. Note “purchase” — unfilled star, not currently a key event.

This distinction matters because it determines whether the next step is tagging (nothing is firing) or configuration (something is firing but not being counted correctly).

Step 2 — Set Up Conversion Events Correctly in GA4

GA4 measures conversions through events — specific actions that fire when a user completes a meaningful step. According to Google’s own GA4 documentation, the minimum required parameters for an e-commerce purchase event are value and currency. A purchase event without these fields fires as an event, registers in the event count, and shows up in zero revenue reports — which looks exactly like broken tracking when it is actually incomplete tracking.

For lead generation: the most reliable conversion event is a thank-you page view rather than a form submit, because the thank-you page only loads when the submission actually succeeded. A form submit event can fire even when the form returns a validation error, which inflates conversion counts without a corresponding lead existing anywhere in the CRM.

To mark an event as a conversion in GA4: Admin → Events → find the event → toggle “Mark as conversion”. If the event does not exist yet because it has never fired, create it under Admin → Events → Create event, then mark it as a conversion once it has been validated in realtime.

GA4 Admin Events panel showing key events list including close_convert_lead, cta_click, first_visit, form_start, form_submit, page_view, purchase, qualify_lead, scroll, session_start, and user_engagement with stream status showing OJC Labs Production or No stream data detected
Events showing “No stream data detected” are configured as key events but haven’t fired recently. This is the difference between a conversion event that exists and one that’s actually working.

Step 3 — Implement Tags via Google Tag Manager

Hardcoding GA4 events directly into the site’s codebase works, but it creates a dependency on development resources every time a tracking requirement changes. Google Tag Manager sits between the site and the measurement tools, allowing conversion events to be added, modified, and debugged without a code deployment.

The correct setup for a GA4 conversion event in GTM:

  1. Create a GA4 Event Tag with the event name matching exactly what GA4 will be listening for.
  2. Set the trigger to the condition that signals a completed conversion — page path equals /thank-you, or a custom event pushed to the dataLayer by the form on successful submission.
  3. Use GTM’s Preview mode to verify the tag fires on the correct action and does not fire on unrelated interactions.
  4. Publish the container only after Preview confirms the tag behaves correctly. An unpublished GTM container is a tag that does not exist in production — this is the single most common cause of “it worked in Preview but not on the live site” reports.
Google Tag Manager tag configuration panel showing a GA4 Event tag named cta_click with Measurement ID G-CEM1YXK189, event parameters including cta_classes, cta_href, cta_id, cta_location, cta_section, cta_text, page_path, and page_title pulled from dataLayer variables, triggered by a Custom Event trigger named Trigger CTA Click
GTM tag setup for GA4 conversion tracking: event name, dataLayer variable parameters, and the custom event trigger all defined in one place. Every parameter here will appear in GA4’s event detail view.

One thing worth checking immediately: open your GTM container and look at every tag’s publication date. Tags that were last published more than six months ago and have never been audited since may be firing on page structures that no longer exist, or missing page structures that were added after the last publish.

Step 4 — Implement the GA4 Config Tag Correctly

Every GA4 Event Tag in GTM needs to reference a GA4 Configuration Tag that carries the Measurement ID. The Google Tag platform documentation is explicit on this: the configuration tag must fire before any event tags on every page. If the GA4 Configuration Tag fires on “All Pages” but an event tag fires on a trigger that can theoretically load before the configuration tag completes, the event has nowhere to attach and gets lost.

Verify this in GTM’s Preview mode by checking the tag firing order on a conversion page. The configuration tag should always appear before any event tags in the firing sequence.

Google Tag Manager Preview mode debug panel showing Connected status for ojclabs.com with GA4 Base Tag, Form tag, and Conversion Linker in the Tags Fired section, and GA4 CTA Click Tracking, Ads Conversion Contact Form Submit, Book appointment, and Form email submission in the Tags Not Fired section
GTM Preview in action on ojclabs.com — Tags Fired confirms what ran on this page load. GA4 CTA Click Tracking appears in Tags Not Fired, meaning the CTA click trigger condition wasn’t met here. Navigate to a page with a CTA and click it to see it move up.
GA4 Admin DebugView interface showing Waiting for debug events message with 0 debug devices connected and an empty timeline, indicating GTM Preview mode is not currently active on any device
GA4 DebugView idle state — “Waiting for debug events” means no device has debug mode active. Start GTM Preview mode on your site and this timeline populates within seconds.

Step 5 — Set Up Server-Side Tracking via Conversions API

Client-side tracking — a pixel in the browser — has been losing reliability for years. Ad blockers, browser privacy features, and intelligent tracking prevention quietly trim what a browser-based tag can see. For businesses where conversion accuracy directly affects budget decisions, the more durable layer is server-side tracking: sending the conversion event from your own server rather than relying on the visitor’s browser to report it.

For Google: this means sending events directly to the GA4 Measurement Protocol alongside the client-side tag. For Meta: the Conversions API runs parallel to the browser pixel. The principle is the same in both cases — two sources reporting the same event, with deduplication logic preventing double-counting.

Deduplication is non-negotiable when running both client-side and server-side tracking simultaneously. Both the browser tag and the server event must carry the same event_id — a unique identifier generated at the moment of conversion and passed to both layers. Without this, every conversion gets counted twice: once from the browser, once from the server, and the resulting inflated numbers look like strong performance right up until someone reconciles them against actual revenue. The full mechanics of why this happens are covered in Why Your Conversion Tracking Is Broken.

Diagram showing server-side conversion deduplication flow with five steps: Browser event with event_id lead_8f2a, Client-side send via GTM web container preserving the same event_id, Server-side send via CRM backend with the same event_id, Deduplication gate comparing event_name plus event_id accepting the first arrival and suppressing matching retries, and Count showing 1 unique conversion
One user action, two delivery paths, one counted conversion — the event_id generated at the source is what prevents the platform from counting it twice.

Step 6 — Configure Attribution Settings in GA4

GA4’s default attribution model is data-driven, which distributes conversion credit across touchpoints based on observed patterns rather than a fixed rule. This is more accurate than last-click for most businesses, but it requires a minimum volume — roughly 400 conversions and 4,000 ad clicks in 30 days — to function correctly. Below that threshold, GA4 falls back toward last-click without clearly announcing it has done so.

Check your attribution settings: Admin → Attribution Settings. Confirm the lookback window matches the realistic length of your sales cycle. A 30-day lookback on a business with a 90-day average consideration period will misattribute a significant share of conversions to direct or the last touch before close, while ignoring the touchpoints that actually started the relationship.

This is also where the discrepancy between GA4 numbers and Google Ads numbers typically lives — Google Ads applies its own attribution model with its own lookback window, and neither tool is wrong, they are simply answering different questions about the same conversion. Understanding which model each tool uses is a prerequisite for interpreting the gap between them, as detailed in What Is Marketing Attribution and Why It Matters.

GA4 Attribution settings panel showing Reporting attribution model set to Data-driven for paid and organic channels, and Key event lookback window set to 30 Days recommended selected for click-through key events
GA4 Attribution settings (Admin → Events → Attribution settings) — data-driven model, 30-day lookback selected. If your sales cycle runs longer than 30 days, this window is misattributing a share of your conversions to direct or last touch.

Step 7 — Verify With Real Transactions and Monitor

The final step before declaring the implementation complete is end-to-end verification: complete an actual conversion on the live site, not in Preview mode, not on staging, and confirm the event appears in GA4’s realtime view within 30 seconds, shows the correct event parameters (value, currency, transaction ID where applicable), and is being counted as a conversion in the conversion report.

Then set a calendar reminder for 28 days from now. That is when the CrUX-based data and the GA4 comparison period will have enough data to show whether the fix held. Checking Search Console or comparing periods before that window produces artificially pessimistic comparisons.

GA4 Key event performance report showing 11 key events tracked across Google Analytics all channels from July 7 to August 3 2026, with a significant spike in key event volume around July 31 to August 1 visible in the primary channel group over time chart
GA4 Key event performance (Advertising → Key events) — where cross-channel attribution comes together. The spike around July 31 is where fixing the tracking started showing results across all channels simultaneously.

What the Tutorials Conveniently Leave Out

  • Hashed personal data sent to the Conversions API must be normalized before hashing or it matches nothing. Email addresses and phone numbers passed to Meta CAPI or Google’s enhanced conversions must be lowercased and stripped of whitespace before SHA-256 hashing. Hash “User@Email.com ” as-is and the resulting hash will never match the platform’s own hashed record of that user, and the event gets silently discounted with no error thrown anywhere visible.
  • Google Signals data thresholding makes some conversion segments invisible. When Google Signals is enabled in GA4, segments with population sizes below a privacy threshold are withheld from reports entirely. A conversion segment that simply does not appear in a GA4 report is not necessarily a tracking failure — it may be a privacy feature doing exactly what it was designed to do. Check whether Signals is enabled before concluding that a segment’s data is missing due to a tag error.
  • Consent Mode modeling affects reported conversion numbers even when tracking is technically correct. Under Google’s Consent Mode requirements for EEA and UK traffic, users who decline cookies have their conversions modeled rather than measured. The modeled numbers appear in reports alongside measured ones without clear labeling. An apparent drop in conversions in a region where a consent banner was recently added may be Consent Mode working correctly, not a tracking break.
  • Cross-domain tracking breaks conversion attribution silently. If a conversion happens on a different domain from where the session started — a payment processor subdomain, a separate checkout domain, a third-party booking system — GA4 treats the return as a new session from Direct, breaking the attribution chain. GA4’s cross-domain configuration under Admin → Data Streams → Configure tag settings → Configure your domains must include every domain involved in a conversion path, not just the primary site domain.
  • The community catches implementation issues faster than the documentation does. For edge cases, platform bugs, and unusual implementation scenarios, r/analytics surfaces real-world troubleshooting that the official documentation rarely covers. The pattern where GA4 stopped firing conversions after a specific Chrome update, or where a particular CMS plugin breaks the dataLayer push — these tend to appear there weeks before Google updates any support article.
  • A fixed tracking setup still needs to connect to a working downstream funnel. Accurate conversion data is the measurement layer. If the funnel itself leaks leads at every stage, fixing GA4 just gives you more accurate visibility into a broken process rather than a better outcome. Why Funnels Leak Leads and Kill Conversions covers where those losses actually live and how to diagnose them by stage. Think with Google’s research consistently shows that measurement accuracy and conversion rate improvement need to be pursued together rather than sequentially.

Where This Fits

Fixing GA4 conversion tracking is not a one-afternoon task and it is not a permanent one either — it is an implementation that needs to be verified when the site changes, when campaigns change, when consent requirements change, and when new conversion actions are added. The businesses that get accurate conversion data over time are the ones that treat the measurement layer as infrastructure with the same maintenance cadence as everything else.

This is the kind of GA4 conversion tracking work OJC Labs implements for clients: events configured correctly, server-side deduplication in place, attribution set to reflect the actual sales cycle, and a verification process that confirms the implementation is working against real transactions rather than just Preview mode.

If your conversion numbers still do not reconcile across platforms after working through this guide, get in touch and we will find exactly where the break is.


Systems we build

Related systems.

Every article on this blog maps to a real system we design and deploy. If the topic is relevant to your operation, these are the systems worth exploring.


Get started

Need this built?

We design and deploy these systems for operators who need results that compound. If the architecture problem is real, we diagnose it first — no pitch, no scope creep.

Start a diagnosticSee case studies

Related posts.