Measurement and attribution
Conversion tracking, attribution windows, and what platform reports cannot see.
Attribution is a set of rules for deciding which ad gets credit for a sale — not the truth itself. Different rules look at the same account and produce different answers. Getting measurement right is not about picking the correct rule; it is about knowing where the rule is wrong.
How signal flows
| Layer | Function | Typical loss |
|---|---|---|
| Browser pixel | Captures on-site events | Ad blockers, cookie restrictions, ITP |
| Server-side API | Sends the event from your server | Missing parameters, late delivery |
| Matching | Ties the event to a user | Weak customer data (no email, no phone) |
| Reporting | Credits the event to an ad | Attribution window and model differences |
The browser pixel alone has not been sufficient for years. Server-side delivery (Conversions API on Meta, enhanced conversions on Google) both recovers lost events and improves match quality. If match quality is poor, server-side integration will not save you — send hashed email, phone, name and location fields as completely as you can.
Attribution window
The window answers: "how many days after seeing the ad should I still credit the sale to it?" Widening the window does not improve performance; it just assigns more sales to the channel.
| Window | When it fits |
|---|---|
| 1-day click | Short consideration, impulse purchases |
| 7-day click | The default for most ecommerce |
| 7-day click + 1-day view | Video-heavy accounts with upper-funnel investment |
| 28 days or more | Long sales cycles, high-ticket products |
Changing the window breaks comparison with prior periods. Pick one, keep it fixed across the account, and state which one your reports use.
UTM discipline
The platform report is the channel's own claim; your analytics is your record. To compare the two you need a consistent UTM taxonomy.
utm_source = platform (meta, google, tiktok)
utm_medium = traffic type (paid_social, cpc)
utm_campaign = campaign name (winter-sale-2026)
utm_content = creative identity (ugc-hook-a-9x16)
The rule is simple: lowercase, no spaces, one fixed abbreviation standard. If you
do not break utm_content down to the creative level, your analytics will never
tell you which asset actually sold.
The structural problem with platform reports
Each platform sees only its own impressions and claims credit on its own window. That has three direct consequences:
- Overlap. The same sale can appear in both the Meta and Google reports.
- Harvesting. A retargeting ad shown to someone who was already going to buy claims a sale it did not create.
- Invisibility. The upper-funnel video that triggered a branded search loses the credit to the search campaign.
This is why allocating channel budgets purely on platform ROAS systematically overfeeds the bottom of the funnel and starves the top.
Incrementality: measuring causation
The only real question is: if I stopped this spend, would these sales still happen? Attribution cannot answer it. Experiments can.
| Method | How it works | When it fits |
|---|---|---|
| Geo test | Ads run in some regions, are held back in others; the gap is measured | Brands spending at national scale |
| Audience holdout | A percentage of the audience is never shown ads | When the platform has a built-in lift tool |
| Blackout test | A channel or campaign is fully paused for a set period | Small budgets — the most practical option |
The cheapest starting point is a blackout test: pause the campaign you suspect for two weeks and watch total revenue. If total revenue does not fall, that spend was not producing sales.
Never run a blackout test across a peak season, a promotion, or an inventory change. You will not be able to read the result.
Practical setup order
- Set up server-side conversion delivery and check match quality
- Choose one attribution window and lock it
- Push the UTM taxonomy down to the creative level
- Start weekly MER tracking
- Run an incrementality test on your largest line item once a quarter