Measuring cost per lead for a single creative is not complicated. It is fiddly, and each fiddly step has a standard way of going wrong.
The five steps
1. Make the ad identifiable
Every ad needs a stable identifier you can join on. In practice that is the platform’s ad_id, because it is the same key the ad platform uses when it reports spend.
The failure mode here is the manual mapping. If ads are created by hand, the link between “this creative file” and “this ad_id” lives in a spreadsheet, and it drifts. Creating the ad through the tool that measures it removes the step entirely.
2. Keep the click alive until the form
The ad URL must carry the identifier, and the identifier must survive to the form submission. In a browser-restricted world this means a server-side, first-party cookie set on the same domain that renders the page — see tracking after iOS.
The failure mode: a redirect between the tracking service and the landing page. Every hop loses a share of identifiers, and the loss is not random — it correlates with the browsers that block most aggressively, which is to say with iOS users.
3. Get spend per ad, from the platform
Spend must come from the ad platform, per ad_id, not per campaign. Two cautions:
- Currency and timezone. Platform spend is reported in the account currency and attributed to the platform’s day boundary, which may not be yours. Pick a convention and apply it consistently.
- Timing lag. Spend for the last hours is not final. Numbers read at 9am for the current day will move.
4. Join them, on the same window
CPL = spend per ad ÷ leads attributed to that ad
Both sides must cover the same period. The classic error is comparing spend for a full month against leads counted by click date, when the leads arrived after the month closed.
5. Set a threshold before reading the result
This is the step people skip, and it is the one that produces bad decisions:
Judgement threshold ≈ target CPL × 3
Below that spend, a cell’s CPL is mostly noise. Two leads and €60 of spend can show a €30 CPL that means nothing.
A worked example
Campaign with two creatives and two pages, one week:
| Combination | Spend | Leads | CPL | Verdict at €10 target |
|---|---|---|---|---|
| Ad A × LP 1 | €420 | 100 | €4.20 | scale |
| Ad A × LP 2 | €640 | 50 | €12.80 | cut the pair |
| Ad B × LP 1 | €300 | 40 | €7.50 | keep, watch |
| Ad B × LP 2 | €380 | 30 | €12.67 | cut the pair |
Every cell is above the €30 threshold, so all four verdicts are actionable. Now the row and column check:
- Column LP 2 is bad in both rows (€12.80 and €12.67). The page is the problem, not the creative.
- Row Ad A is the best and the worst cell. The creative is fine; it depends on where it points.
Action: stop sending traffic to LP 2, rewrite it, and let the automatic A/B test compare the rewrite against the original while Ad A keeps running to LP 1.
Common ways the number lies
| Symptom | Usual cause |
|---|---|
| CPL much lower than the platform reports | you are counting only clicks that reached the page; the platform counts all clicks |
| CPL much higher than expected | spend attributed to the wrong ad, or leads counted without the identifier |
| CPL jumps on one day | spend reported before the day closed |
| One creative has 40 leads, another has 3 | traffic allocation, not performance — check impressions before concluding |
| Every cell looks the same | the identifier is not being captured at all, and everything is falling back to a campaign default |
The checklist
- Every ad has a stable
ad_id, written by the system that created it - The click identifier is set server-side, first-party,
HttpOnly - The landing page is served from the same domain that logged the click
- Spend is pulled per
ad_id, in one currency, on one day convention - Spend and leads cover the same window
- A judgement threshold is set before reading any cell
- Row and column are checked before cutting a creative or a page
Related
- What is creative attribution — why this level matters
- How to read the attribution matrix — acting on the output
- Real CPL vs platform CPL — reconciling the two counts
- CPL vs CPQL calculator — run the two numbers on your own campaigns