Category: Strategy

  • Troubleshooting Conversion Tracking: A 5-Step Process

    TL;DR: Troubleshooting conversion tracking isn’t just about making reports match. Broken tracking degrades your ad platform’s ability to optimize, wastes budget, and erodes trust across teams.

    This article walks through a 5-step diagnostic process for finding where tracking fails, followed by four systems you can build to catch breaks before your stakeholders do. It gets technical in places, especially around server-side GTM.

    If you’re a marketing ops lead, Steps 1-3 are your framework. Steps 4-5 are what you hand to your tracking specialist.


    Your CMO asks why Google Ads shows 12 conversions when the CRM has 87. Your paid social manager is convinced Meta “lost” half the leads. Someone from engineering swears everything is working fine.

    Sound familiar?

    Broken conversion tracking is one of the most expensive problems in B2B marketing, and most teams don’t even know it’s happening until someone compares two dashboards and panics.

    This is my process for troubleshooting conversion tracking issues. I’ve used it across dozens of B2B SaaS and manufacturing clients, and the pattern is remarkably consistent: the tag configuration is rarely the only problem. The real issue is usually the gap between what fires, what gets attributed, and what the ad platform actually does with the signal.

    Let’s get into it.

    Why broken conversion tracking costs more than you think

    Here’s the thing most marketers miss: fixing your tracking isn’t just about making your reports look right. It directly affects how well your campaigns perform.

    Modern ad platforms (Google, Meta, LinkedIn) run on machine learning. Their algorithms optimize bids, targeting, and placements based on conversion signals you send them. When those signals are broken, incomplete, or duplicated, the algorithm makes worse decisions. Not slightly worse. Fundamentally worse.

    I’ve seen B2B companies reduce their cost per qualified lead by 30-40% without changing a single ad or landing page, on accounts where tracking had been silently misconfigured for months. The only change was fixing the conversion signals they were sending to the ad platform. The algorithm was ready to optimize. It just needed clean data to work with.

    When your tracking operates in a European market where consent rates sit around 30-50%, you’re already working with a subset of your total traffic by design. That’s GDPR doing its job. But feeding bad data into that already-limited signal is like navigating with a broken compass in fog. You’ll end up somewhere, but probably not where you wanted.

    Troubleshooting your conversion tracking: the 5-step diagnostic process

    When tracking breaks, resist the temptation to start clicking around in GTM. Work systematically. Here’s the order that saves the most time.

    Step 1: Map your event architecture

    This sounds obvious, but I’m consistently surprised by how many teams can’t answer basic questions about their own setup:

    • What conversion events are you tracking, and for which ad platforms?
    • When exactly does each event fire? (Page load? Form submission callback? CRM webhook?)
    • Where does each event fire from? (Client-side GTM? Server-side GTM? A Conversions API? Direct from the backend?)
    • What parameters does each event carry? (transaction_idvaluecurrency?)

    If you can’t answer these questions without opening your GTM container, you have a documentation problem. And documentation problems always become tracking problems, because nobody can debug what nobody has mapped.

    Pay special attention to conversion events that don’t behave like standard pageviews or form submissions. A HubSpot Meetings scheduler embedded as an iframe, for example, won’t fire events that your GTM container can see by default. You need a custom postMessage listener to bridge the gap between the iframe and your data layer. I wrote a step-by-step guide for tracking HubSpot Meetings via GTM that covers this exact scenario. These kinds of “invisible” conversion points are easy to miss when mapping your architecture, and they’re often the ones that break silently.

    Create a simple data flow diagram. It doesn’t need to be fancy. A whiteboard photo works. What matters is that everyone (marketing, engineering, analytics) looks at the same map. Here’s the minimum it should cover:

    Browser > client-side GTM (cGTM) > server-side GTM (sGTM) > ad platforms (GA4, Google Ads, Meta, LinkedIn)

    Mark which conversion events travel which path, and where parameters like transaction_id and event_id get attached. If you’re running Conversions APIs (Meta CAPI, LinkedIn CAPI) alongside client-side pixels, map both paths and note where deduplication happens.

    For further reading on data flow documentation, Simo Ahava’s blog (simoahava.com) remains the gold standard for understanding GTM architecture concepts.

    Step 2: Understand what the ad platform is actually reporting

    A critical part of troubleshooting conversion tracking is understanding what “conversions” actually means in each platform. You need to know what that number actually represents.

    “We had 157 conversions last week” is meaningless without context.

    Here’s where most confusion lives: different platforms report different things, even when they receive the same event.

    Google Ads only shows attributed conversions. It takes credit for conversions it believes it influenced, based on your attribution model and lookback window.

    Meta Events Manager shows ALL events it receives, regardless of whether Meta had anything to do with them. A conversion from organic search still shows up in Events Manager. It just won’t appear in your Ads Manager reports as an attributed conversion.

    LinkedIn is its own animal. Its default attribution window is 30-day click / 7-day view, which is more generous than most B2B marketers realize. And its CAPI implementation is newer and less battle-tested than Meta’s, so expect rougher edges when debugging.

    This distinction alone explains most “discrepancy” conversations between marketing and engineering. Engineering says “the event fires correctly.” Marketing says “the numbers don’t match.” They’re both right. They’re just looking at fundamentally different things.

    Before debugging anything, check your ad platform configuration:

    • What’s the attribution window? (7 days? 30 days? Post-click only, or including view-through?)
    • For Google Ads: are you using data-driven attribution, last click, or something else?
    • For Meta: are you comparing Events Manager numbers (all events) with Ads Manager numbers (attributed only)?
    • Is Consent Mode v2 properly implemented? If you’re using Basic mode (the compliant default for EU traffic), understand that your reported numbers will reflect consented users only. If you’ve opted into Advanced mode for non-EU traffic, check whether conversion modeling is active.

    Google’s official documentation on attribution settings is worth re-reading whenever you’re troubleshooting discrepancies.

    Step 3: Compare against your source of truth

    You need a reality check. A system that captures what actually happened, independent of what any tracking platform claims.

    For B2B SaaS, this is usually your CRM (HubSpot, Salesforce, Pipedrive). For e-commerce, it’s your order database. Whatever it is, identify it and use it as your baseline.

    In practice, the comparison looks like this: export your CRM deals or leads created this month, pull your GA4 conversion events (or Google Ads conversion count) for the same period, and compare the totals. You’re not looking for a perfect match. You’re looking for the ratio, and whether that ratio is stable over time.

    The numbers will never match perfectly. That’s not the goal. The goal is to confirm:

    • Events aren’t double-firing (the most common silent killer in B2B tracking)
    • Events aren’t missing entirely
    • The ratio between your source of truth and platform-reported data stays within a consistent range

    What’s “expected”? That depends on your consent rate, your attribution window, your traffic mix, and a dozen other variables. With Consent Mode v2 Basic (the standard for EU traffic), your ad platforms will only report on users who gave consent, so a gap between CRM leads and platform-reported conversions is normal and expected. If your CRM shows 100 leads and Meta shows 8, something is broken beyond consent. If your CRM shows 100 and Meta shows 55-75, that’s likely within normal range for a European B2B site, depending on your consent rate and traffic mix.

    Step 4: Verify events are actually firing

    Now we get tactical. Troubleshooting conversion tracking always comes down to this: before you can fix attribution, you need to confirm the events fire when they should.

    GTM Preview Mode is your bread and butter. Click Preview in GTM, navigate your site, trigger the conversion action, and watch the debug pane. It shows you exactly which tags fire, what triggers activated them, and what data layer values were present. For server-side GTM, open the sGTM preview separately and watch the incoming requests, outgoing HTTP requests, and which clients claim them.

    GA4 DebugView (Admin > DebugView) shows you events arriving in real-time. Useful for confirming events make it all the way to GA4.

    Google Ads Diagnostics (Goals > Conversions > Diagnostics) is often overlooked but shows you consent mode status, tag health, and whether conversion modeling is active. Check it.

    Meta Test Events (Events Manager > Test Events) lets you watch events arrive in Meta’s system in real-time.

    Chrome DevTools Network Tab is your fallback when nothing else works. Open DevTools, go to the Network tab, filter for your tracking domains (google-analytics.comfacebook.com, etc.), and trigger the conversion. You’ll see the raw HTTP requests leaving the browser.

    For server-side setups specifically, check your sGTM logs. If you’re using Stape, their monitoring feature can catch issues that Preview Mode might not surface, especially in production traffic.

    A note for marketing ops leads: if the conversion tracking troubleshooting below feels technical, it is. This is where you hand the article to your tracking specialist or agency partner and say “run this checklist.”

    The diagnostic framework (Steps 1-3) is yours. The implementation debugging below is theirs.

    Step 5: Separate “firing” from “attributing”

    This is where experienced practitioners earn their keep, and where most conversion tracking troubleshooting gets real.

    Common attribution killers in B2B:

    Broken UTM parameters. Your LinkedIn campaign sends traffic with utm_source=linkedin, but someone set up a redirect that strips query parameters. The click arrives clean, the event fires, but the ad platform can’t connect it to a campaign. This is especially common with link shorteners, CMS redirects, and enterprise SSO flows.

    Consent management eating your signal. If you’re operating in Europe, your consent management platform is the gatekeeper of what tracking can and can’t happen. And rightfully so. GDPR exists for a reason, and your tracking setup should respect it.

    The baseline here is Consent Mode v2 Basic. Tags don’t load until the user gives consent. If they decline, no data is collected. That’s the compliant default, and for most European B2B setups, it’s the right one. Yes, it means you lose signal from users who decline. That’s the trade-off of operating in a privacy-regulated market, and it’s a trade-off worth making.

    What you need to get right: make sure your CMP actually communicates consent state to your Google tags. After Google’s July 2025 enforcement, sites without proper Consent Mode v2 implementation saw their conversion tracking, remarketing, and demographic reporting silently disabled for EEA/UK traffic. Having a cookie banner is not enough. The banner must signal the four required consent parameters (ad_storagead_user_dataad_personalizationanalytics_storage) The banner must signal the four required consent parameters (ad_storagead_user_dataad_personalizationanalytics_storage) to your tags. If it doesn’t, Google treats your traffic as non-compliant and you get nothing.

    One thing that does work within Basic mode and is worth implementing: Enhanced Conversions. This sends hashed first-party data (email, phone number) alongside your conversion tag, helping Google match conversions to ad clicks even without third-party cookies. It works exclusively with consented traffic and doesn’t change your consent posture at all. For B2B lead gen, where you already collect email on form submission, it’s one of the most practical signal recovery mechanisms available.

    If you have significant non-EU traffic, or if you’re comfortable navigating the compliance trade-offs, you can explore Advanced mode. Advanced mode loads tags before consent and sends cookieless, anonymized pings to Google when consent is denied. Google uses those pings to model estimated conversions. It can recover some of the signal you’d otherwise lose. But it comes with its own compliance considerations, and you should involve your legal team before flipping that switch. It’s an option, not a default.

    Consent blocking in sGTM instead of the web container. This one deserves its own callout because it’s a surprisingly common mistake with severe consequences. If you use Advanced mode with server-side GTM, don’t implement your consent blocking logic in the server container. It’s tempting to add a trigger condition in sGTM that blocks tags when the incoming request shows consent as “denied.” But the first event of a session almost always arrives before the consent update command has fired in the browser, so it still carries a “denied” state. If your sGTM trigger blocks it, you lose the _ss=1 session start signal, and that session’s attribution is gone. Your traffic shows up as “Unassigned” in GA4, and you’ll spend hours debugging something that looks like a platform issue but is actually a trigger misconfiguration.

    The rule: if you want tags blocked until consent, implement that in the web container where Google Tag handles the _ss=1 parameter correctly.

    Keep sGTM as a forwarding layer, not a consent gatekeeper.

    Julius Fedorovicius covers this and nine other session_start pitfalls in detail in his investigation on Analytics Mania.

    sGTM silently stripping or dropping events. Your server-side GTM container can break tracking in ways that are completely invisible from the client side. Two common culprits:

    First, Transformations. If your sGTM container uses an “Allow parameters” transformation that doesn’t explicitly include the _ss=1 parameter, it gets stripped from the outgoing GA4 request. Google never generates the session_start event, sessions break, and traffic shows up as “Unassigned.” Everything looks fine in your client-side preview. The damage only surfaces days later in your reports. Always compare incoming vs. outgoing request parameters in sGTM preview mode.

    Second, trigger-level event filtering. If your GA4 tag in the server container uses a trigger with a regex matching specific event names (say, page_view|form_submit|purchase), any event not in that list gets silently dropped. If a scroll event happens to be the first event in a session and carries the _ss=1 parameter, that session start signal vanishes. The safest approach: forward all GA4 events through sGTM and handle any filtering at the tag level, not the trigger level.

    Missing or duplicated identifiers. Without a transaction_id or lead_id passed through the event, the ad platform can’t deduplicate. If a user submits a form, gets redirected, and the thank-you page fires the event again, you’ve just double-counted a lead. The platform doesn’t know it’s the same lead unless you tell it.

    Client-side vs. server-side deduplication. If you’re running both a client-side pixel and a Conversions API (Meta CAPI, LinkedIn CAPI), you need proper deduplication. The event_id parameter must match between the browser event and the server event. If it doesn’t, the platform counts them as two separate conversions. Meta’s documentation on CAPI deduplication explains the mechanics well.

    The FPID / _ga cookie split. For GA4 specifically, there’s a subtler version of the client/server mismatch. If you’re using server-side GTM with server-managed identification (the default), your sGTM container uses the FPID cookie instead of the standard _ga cookie. If some of your GA4 tags still send data directly to google-analytics.com (because someone forgot to add the server_container_url parameter), those events use the _ga cookie instead. GA4 now sees two different users for what is actually the same person. The events routed through sGTM end up in a session with no session_start event, and you get phantom “Unassigned” traffic.

    The fix: audit every GA4 tag in your web container and confirm they all route through your server container URL. Alternatively, switch to JavaScript-managed identification in your sGTM client settings, which keeps both paths using the same _ga cookie. But know the trade-off: you lose the extended cookie lifetime that server-managed identification provides, which is one of the main reasons people adopt sGTM in the first place.

    Building systems that prevent conversion tracking failures

    Fixing the immediate problem is step one. Building systems that catch problems before your stakeholders do is step two. Here are four things that consistently reduce troubleshooting time and improve data trust across teams.

    1. Store raw data somewhere you control

    Sometimes an event breaks only in specific user journeys that basic debugging won’t reveal. Maybe it fails for mobile Safari users, or for traffic coming through a specific UTM configuration, or for users who navigate through your pricing page before converting.

    Raw data is your insurance policy. Set up a GA4 BigQuery export. If you’re using server-side GTM, you already have an additional point where you can log and store event data before it leaves for the ad platforms.

    The strategic point here: centralizing your tracking through a single server-side GTM container (rather than maintaining multiple client-side pixels) reduces the surface area for things to go wrong. One container, one set of triggers, one place to debug. That’s a much smaller blast radius than six different pixels all running independently in the browser.

    2. Pass identifiers everywhere

    This is the single most impactful change most B2B teams can make.

    Pass a transaction_idopportunity_id, or user_id through every conversion event, and make sure that same identifier exists in your CRM. When something breaks, you can match individual events between your CRM and your ad platforms to pinpoint exactly where the chain breaks.

    Without identifiers, debugging conversion discrepancies is guesswork. With them, it’s forensics.

    3. Build proactive monitoring

    Don’t wait for someone to notice the numbers look off. The best conversion tracking troubleshooting is the kind you never have to do, because a monitoring system caught the problem first:

    Event count timelines. Build a daily or weekly chart of conversion event counts per platform. When the line drops suddenly, investigate immediately. This catches 80% of tracking breaks within 24 hours instead of weeks.

    Cross-platform discrepancy monitoring. If GA4 and your CRM normally differ by 15% but suddenly show a 40% gap, something changed. Set up an automated alert for that.

    Regression tests. Work with your engineering team to codify your tracking expectations: “When this form is submitted, this event should fire with these parameters.” Run these tests automatically with every deployment. This prevents code releases from silently breaking your tracking, which is one of the most common causes of tracking failures in B2B, where marketing and engineering teams often deploy independently.

    Tools like Trackingplan and Avo are purpose-built for this kind of tracking governance. They monitor your data quality in production and alert you when something drifts from your spec.

    4. Simplify ruthlessly

    Every event you track is a potential failure point. Every parameter is a potential mismatch. Every platform integration is a potential deduplication issue.

    Track what you need. Not what you might need someday. Not what someone suggested in a meeting six months ago.

    For most B2B setups, you need the minimum set of events that maps to your actual funnel stages: qualified lead, opportunity created, deal closed, and maybe one or two engagement events that genuinely correlate with pipeline. A handful of clean, reliable events beats twenty that nobody trusts.

    The bottom line

    Broken tracking isn’t just a reporting problem. It’s a performance problem, a trust problem, and ultimately a revenue problem. You’re paying for sophisticated ad platforms and then blinding the very algorithms that make them worth the cost.

    The good news: conversion tracking issues are fixable. And they don’t require a massive replatforming project. They require discipline, documentation, and a systematic approach to diagnosing where the chain breaks.

    Map your events. Understand what the platforms actually report. Compare against reality. Verify firing. Check attribution. And then build the monitoring systems that catch the next break before anyone else notices.

    Your tracking will break again. That’s inevitable. What matters is how fast you find it and how confidently you fix it. Systematic troubleshooting of conversion tracking beats panic every time.