Paid campaigns rarely fail at the creative. They fail two weeks earlier, in a tracking setup nobody checked, and the failure is invisible until you’ve spent enough to care.
The pattern is consistent. Campaigns launch, numbers come in, the numbers look plausible, and decisions get made on them for months before anyone realises the platform has been optimising toward the wrong thing the whole time. By then you haven’t just wasted the spend — you’ve trained an algorithm on it.
Here’s the checklist to run first. It takes a few days. Every item is cheaper to fix now than after a quarter of data is sitting on top of it.
What your data is actually telling you
- Get your own team out of the analytics.
Your developers, your agency, your marketing team, whoever has been testing the site for the past six months — if their traffic isn’t excluded, it’s in every report you have. It inflates engagement, distorts geography, and invents referral sources. On a low-traffic site it can be the majority of your sessions.
You cannot set a baseline against contaminated data, and without a baseline you have no way to tell whether a campaign moved anything. Do this first. Everything downstream inherits it.
- Publish the events, then test them live.
Building a conversion event in your tag manager is not the same as it being live. There’s a publish step, and it is skipped constantly — the tag exists, everyone assumes it’s working, and nothing has ever fired.
Trigger each one yourself in the live environment and confirm it arrives. Not in preview mode. In production, as a real user would.
- Confirm your purchase event fires on payment — not intent.
This is the expensive one.
A “purchase” event that fires on a booking click, a form submission, or a checkout page view is measuring intent to buy, which correlates with buying much less than you’d like. Feed that to an ad platform as your optimisation target and it will do exactly what you asked: find more people who perform that action. You will get a beautiful cost-per-conversion and a flat bank balance, because the platform has become expert at finding people who click and don’t pay.
Check the trigger condition on every revenue event. It should fire after money has moved, and only then.
What counts as a sale
- Standardise your UTMs before anything publishes a link.
One taxonomy, one naming convention, applied across every channel — paid, organic social, email, the link in your Instagram bio. Decide the format, write it down, and make it the only way links get built.
Retrofitting this is miserable. Channel comparison depends on it entirely: if LinkedIn is tagged one way and Meta another, you can’t put them next to each other, and choosing where to scale becomes a matter of opinion.
- Agree one source of truth for revenue.
Your website will report a number. Your CRM will report a different one. Your payment processor will report a third. All three are correct according to their own definitions, and none of them agree.
Pick one as the commercial record — usually the payment or CRM record — and use the platforms for attribution only. Also agree the identifier that links a website session to a CRM record to a transaction, because without a persistent identifier the chain breaks at the first handoff and attribution becomes guesswork with a dashboard around it.
This is a decision, not a build. It takes an hour and it prevents a year of arguments.
What the platforms are receiving
- Set up server-side tracking and purchase values.
Browser-based pixels lose a meaningful share of conversions to ad blockers, privacy settings and cross-device journeys. Server-side conversion sending recovers a good portion of that, and it’s what lets the platform learn from complete data rather than a partial sample.
Send the value with the event, not just the count. Optimising on volume when your deal sizes differ pushes budget toward whatever is cheapest, which is rarely what’s most profitable. And configure deduplication properly, or you’ll count the same conversion twice and get a cost-per-acquisition figure that’s flattering and wrong.
- Install the tracking tag before you launch, not after.
Obvious, routinely missed — particularly on the second platform. LinkedIn is the usual casualty: campaigns go live, the Insight Tag goes in a fortnight later, and the first two weeks of learning data are gone permanently.
Install it, confirm it fires, define the conversion actions. Then launch.
- Confirm consent is passing through to analytics and ads.
Set your consent banner up incorrectly and you get one of two failures. Either consent never reaches your tags, and you collect anonymous fragments with no session continuity — data that looks like data but can’t be joined to anything. Or it isn’t gating properly, and you have a compliance problem instead of a measurement one.
Test both paths. Accept, and confirm the events fire and persist. Reject, and confirm the right things stop.
The rule that protects the rest
If you take one thing from this list: do not scale spend until your purchase event is firing reliably, and optimise on purchase rather than on intent.
Spending faster on a funnel you can’t measure doesn’t produce learning. It produces noise, at volume, that you then have to unpick.
The corollary is worth stating too. When results go wrong, pause on a defined trigger — a cost per acquisition above your threshold for two consecutive weeks, or the revenue event stopping entirely — and don’t restart until you’ve documented the cause and changed something specific. Restarting a campaign unchanged and hoping is not a test.
If you failed several of these
Most companies do, and it isn’t a sign that anything is broken. It’s a sign that tracking was built incrementally, by different people, at different times, without a single specification governing it.
That’s a fixable problem, and it’s a structural one rather than a technical one — which is why fixing the tags in isolation tends not to hold. The setup that stays clean is the one where somebody decided in advance what each event means, what counts as revenue, and which record is the truth.
[The System Sprint →] builds this layer: connected tracking, server-side conversions, and the CRM underneath it. [The Growth Sprint →] is what runs on top once these eight are clear.