Server-side trackingOffline conversionsValue-based bidding

    From counting leads to bidding on what they're worth

    How a multi-million-euro B2B merchandise brand fixed the data its ad platforms were learning from, then taught Google, Meta and Microsoft the difference between a cheap lead and a valuable one.

    Monday Merch · Corporate merchandise · Europe · mondaymerch.com

    50% → 13%
    Website traffic with no identifiable source, before and after
    >3×
    New-customer opportunities in July and August versus the same weeks the previous year
    9 vs 2
    Won deals, value-bidding tests versus control, at roughly 75% lower spend per win
    Industry
    Corporate merchandise & branded swag
    Model
    B2B ecommerce + quote-led sales
    Region
    Europe
    Scale
    Multi-million-euro revenue, two-domain estate (marketing site plus products storefront), sales team working deals in a CRM
    Stack
    GTM web + server · GA4 · Odoo CRM · Google, Meta, Microsoft & OpenAI Ads · CookieFirst
    Engagement
    Audit, remediation, CRM-to-platform value pipeline
    Period
    June to August 2026

    01 · The problem

    The account looked healthy. The business couldn't tell if that was true.

    Monday Merch sells branded merchandise to companies across Europe. Prospects research on the marketing site, move to a separate products storefront to build a quote, and the deal is then worked by a sales team in Odoo. Paid media on four platforms feeds the top of that funnel, and every platform was optimising toward whatever the tracking told it.

    1The numbers were wrong, not missing

    Every major event was being counted twice, from two independent sources. Conversion rates, audience sizes and the reporting the team relied on were all built on a base inflated by an unknown multiple. Wrong numbers are more dangerous than missing ones, because they still look like data.

    2Half the journey was invisible

    Roughly 50% of sessions had no identifiable source. The paid click that brought a buyer in was disconnected from the quote they submitted, so half the evidence behind every channel decision simply wasn't there.

    3Every lead counted the same

    Google Ads saw one generic conversion. A small sample request and a large enterprise order looked identical to the bidding algorithm, so it did what it was told and went looking for the cheapest leads it could find.

    July

    Phase 1 · Fix the foundation

    Audit the full tag estate, remove the defects producing false data, standardise the event model, and give Google Ads a real funnel to optimise toward instead of a single count.

    August

    Phase 2 · Teach the platforms what an opportunity is worth

    Connect the CRM to every ad platform through a first-party server, so each opportunity is reported with its expected value and updated as the deal moves.

    02 · Phase 1, fix the foundation

    Four defects, and the worst of them were producing confident, wrong numbers

    The container had accumulated years of tags across platform migrations, with a server-side layer added later. Nothing was obviously broken. The problems only show up when you compare what the tags send against what the business actually did.

    Critical

    Every event counted twice, and one duplication path was invisible to GTM

    Found. Two parallel tag sets per event, some of them double-triggered. Two competing GA4 configurations. And, entirely outside the container, the Odoo CRM was pushing its own lead events straight to GA4, a second pathway that no amount of container auditing would have surfaced.

    Why it mattered. Every efficiency metric the business used was calculated on an inflated base. 22 duplicate and legacy tags became 13 single-purpose ones, and the CRM-side duplication was closed separately.

    High

    The storefront was missing from the cross-domain configuration

    Found. The Conversion Linker listed only the marketing domain. The products storefront, where quotes actually happen, was not in the linked-domains list.

    Why it mattered. This was the single largest driver of the 50% unattributed traffic. One configuration field, verified by a live click-through test, and the buyer's journey became one session again.

    High

    Lead events arrived under four different names, so none of them counted

    Found. Quote requests, contact forms and calendar bookings each sent a differently-named lead event. None matched GA4's standard, so a lead-led business showed zero leads in the report built for exactly that purpose.

    Why it mattered. Standardised to one event fired from three sources. The downstream growth report, which had been counting the old names, was corrected in the same pass.

    Medium

    Google Ads could see one conversion, not a funnel

    Found. A single generic quote action. No add-to-cart, checkout, booking or lead-form conversions, and no value attached to any of them.

    Why it mattered. We built five dedicated conversion actions, each with its own trigger and label, and attached an estimated euro value to lead submissions derived from the budget range the prospect selects. The first step from counting to valuing.

    Phase 1 outcomeBeforeAfter
    Sessions with no identifiable sourceRoughly 50%13%
    GA4 tags in container22 duplicate and legacy13 single-purpose
    Lead duplication pathways2, running independently0
    Google Ads conversion actions1 generic5, per funnel stage, value-bearing
    Event namingNon-standard and inconsistentGA4 standard taxonomy across the container
    Conversion deliveryBrowser tags, per platformOne server-side stream, routed to every platform

    03 · Phase 2, teach the platforms what an opportunity is worth

    The CRM knows which deals are valuable. The ad platforms didn't.

    Clean website data solves half the problem. The other half is that the most important events in a B2B funnel, an opportunity being qualified, moving stage, or being won, happen inside the CRM, days or weeks after the click, where no pixel can see them. Phase 2 built the pipeline that carries those moments back to every ad platform with a value attached.

    Browser and server events share one event ID, so each platform counts a lead once. CRM events pass the same consent gate before leaving the server.

    One conversion that evolves, not five that disagree

    Google Ads receives a single opportunity conversion carrying an expected value: the opportunity's value multiplied by its probability of closing, looked up by customer type, sales stage and country. When the deal moves stage, the same conversion is restated. If it's lost, the value drops to near zero. If it's deleted or reverts to a lead, it's retracted. The platform learns from what actually happened rather than from a snapshot.

    Meta, Microsoft and OpenAI see the same truth

    Website leads fire in the browser and again through the server, sharing one event ID so Meta and Microsoft count each once. CRM milestones, qualified and won, follow as server-side events with full customer matching. Microsoft rejected the first version over a timestamp format; we caught it by inspecting the API response body rather than trusting the tag's green tick.

    How the offline conversion pipeline works

    • The CRM owns the lifecycle. Odoo emits an event whenever an opportunity is created, changes stage, changes value, is won, is lost, or is removed. Each carries a stable identifier for that opportunity, the current stage, the customer type, the market, and the matching details the platforms need.
    • The server decides what it is worth. A lookup returns the probability that an opportunity at that stage, for that customer type, in that country will close. Multiplied by the opportunity value, that becomes the expected value sent to Google Ads.
    • Three operations, not one. The first eligible event creates the conversion. Later stage or value changes restate it against the same identifier. Removal retracts it. Google Ads therefore holds one evolving conversion per opportunity rather than a pile of snapshots that disagree.
    • Every platform gets the version it can use. Meta and Microsoft receive qualified and won as separate server events with full customer matching. Google receives the single evolving conversion. All of them are built from the same payload, so the platforms are working from one source rather than four.
    • Identity resolved once, on the server. Email, phone, user ID and the click identifiers are read from the event, then from the server cookie if the event does not carry them, then hashed before they leave. Doing it in one place is what stops six tags each solving it slightly differently.
    • Delivery is verified at the API, not the tag. Every platform's outbound request body and its response are inspected before the tag is trusted. A green tick in the tag manager only means the request was sent.

    One place where the rules live

    Consent, identity resolution and platform routing all sit on the server rather than being repeated in each browser tag. One rule set, applied to browser and CRM events alike, so the same logic cannot drift out of sync across six destinations.

    Owned, not rented

    The server container runs on Monday Merch's own first-party domain in their own GTM account, with version history and rollback. No agency lock-in, and every tag is inspectable.

    04 · What happened next

    Better signals, and the first evidence that they work

    Two months on, the tracking foundation is clean and the platforms are being fed opportunity value instead of raw lead counts. The early read comes from two places: a year-on-year comparison, and a set of controlled bidding experiments run inside Google Ads.

    >3×

    New-customer opportunities in July and August versus the same weeks the previous year

    Client CRM reporting. Year on year, not attributed to any single cause.

    9 vs 2

    Won deals across five value-based bidding experiments, treatment versus control

    Early results, with one market driving most of the lift. Directional, not conclusive.

    ~3×

    Won value from the value-bidding treatment versus control, at roughly 75% lower spend per win

    Same experiment set, as measured by Google Ads experiments.

    05 · What's next

    Clean data is the start, not the finish

    Retire the legacy integrations

    Older direct CRM-to-platform connections still run alongside the new pipeline. A deliberate cutover once the new signals are proven, so nothing gets counted twice again.

    Scale the value-bidding tests

    The early experiments are encouraging but concentrated in one market. Next is expanding across countries and campaign types, and moving the Meta and Microsoft budgets onto the new CRM signals.

    Marketing Mix Model

    At this level of spend, platform attribution is no longer enough. A Bayesian MMM will show which channels drive incremental revenue, and put a number on what the tracking work itself was worth.

    How this was verified. Container version history across six releases; live Tag Assistant sessions under both granted and denied consent; GTM Preview with one qualifying and one non-qualifying event before every publish; a live cross-domain click-through test; inspection of outbound API request and response bodies for every platform, not just tag status; and reconciliation of the downstream growth report against the corrected event names. Results reported from the client's own CRM reporting and Google Ads experiments.

    Are your ad platforms learning from the truth?

    Most accounts we audit have at least one of the six defects in this study. Start with what people actually searched before they clicked. The free audit connects to your Google Ads account and shows you in minutes.

    Run a free Google Ads audit

    Book a tracking review →