CASE_011 / DTC COFFEE / DE / SUBSCRIPTIONFIXED

Meta reported 4.1x ROAS. The P&L said 1.9x.

A subscription coffee brand was scaling spend against a 4.1x ROAS that the finance team could not find anywhere in the ledger. The real number was closer to half that.

META CAPIGA4BIGQUERYLOOKER STUDIO
100%EVENTS DEDUPLICATED
9.3/10META MATCH QUALITY
£31kSPEND REALLOCATED
1REPORT THE TEAM TRUSTS

What was broken

The Meta pixel and the Conversions API were both reporting every purchase, with no shared event ID between them. Meta had no way to recognise the two as the same sale, so every conversion was counted twice.

Subscription renewals were sent as ordinary purchase events. Meta credited itself for recurring revenue it had not acquired, which inflated return on ad spend month over month as the subscriber base grew.

Customer data sent with the events was sparse, which held event match quality down and gave the platform a poor signal to optimise against.

What I changed

Pixel and CAPI now share one event ID per order, so Meta deduplicates reliably — every event in the window resolved to a single sale.

Renewals were split from acquisition into their own event, so new-customer ROAS and total revenue stopped being the same number.

Customer parameters were normalised and hashed correctly before sending, lifting event match quality to 9.3 out of 10.

Ad cost, GA4 events and the order ledger were blended in BigQuery and surfaced in a single Looker Studio page, so the number in the meeting is the number in the accounts.

What it changed commercially

Once the verified figure replaced the claimed one, roughly £31k of monthly spend was moved off campaigns that were being credited for renewals and onto ones that were genuinely acquiring customers.

The team now runs from one report instead of arguing between three.

Every figure above was reconciled against the client’s own order data before sign-off. I’ll run the same reconciliation on yours before either of us calls it fixed.

← ALL CASE FILES