Guide

Measuring CPL by creative

A working procedure: keep the click alive, get spend per ad_id, join the two, and set a spend threshold before you believe any cell.

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:

CombinationSpendLeadsCPLVerdict at €10 target
Ad A × LP 1€420100€4.20scale
Ad A × LP 2€64050€12.80cut the pair
Ad B × LP 1€30040€7.50keep, watch
Ad B × LP 2€38030€12.67cut 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

SymptomUsual cause
CPL much lower than the platform reportsyou are counting only clicks that reached the page; the platform counts all clicks
CPL much higher than expectedspend attributed to the wrong ad, or leads counted without the identifier
CPL jumps on one dayspend reported before the day closed
One creative has 40 leads, another has 3traffic allocation, not performance — check impressions before concluding
Every cell looks the samethe 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

Last updated: 2026-09-21

FAQ

Can I measure CPL by creative with UTMs alone?+

You can get close, but it is fragile: UTM parameters depend on every ad being set up correctly by hand, and they are lost the moment a redirect or a browser feature interferes. The reliable path is a click identifier captured server-side, tied to the ad that was created.

How do I attribute a lead that arrives days after the click?+

With an explicit attribution window. DropCPL keeps the click identifier for 7 days, so a lead arriving within that window is attributed to the click. Beyond it, the lead is recorded as unattributed rather than guessed.

Ready to find out what
converts, for real?

Free to start.

Start free →