Most paid social reporting answers the wrong question. It tells you what a campaign cost. You need to know what an ad cost, on a specific page.
The problem with campaign-level CPL
A campaign is a container. Inside it there are creatives, and behind every creative there is a destination. When you read a single CPL for the campaign, you are reading an average of very different things.
Consider a campaign with two creatives and two landing pages. Four combinations, one reported number:
| Combination | Spend | Leads | CPL |
|---|---|---|---|
| Ad A × LP 1 | €420 | 100 | €4.20 |
| Ad A × LP 2 | €640 | 50 | €12.80 |
| Ad B × LP 1 | €300 | 40 | €7.50 |
| Ad B × LP 2 | €380 | 30 | €12.67 |
| Campaign total | €1,740 | 220 | €7.91 |
The campaign CPL is €7.91. Nothing in that number is wrong, and nothing in it is useful: the best combination costs €4.20 and the worst €12.80. Same creative, different page, three times the cost per lead.
How DropCPL measures it
DropCPL keeps the combination separate from click to lead.
- The click lands on the tracking domain. The ad URL carries the
ad_id. DropCPL logs the click, sets a first-partyHttpOnlycookie server-side, and renders the landing page in the same response — no redirect between tracking and page. - The form submits. The lead is recorded and linked to the click that produced it, which carries the
ad_idand the landing page it was served on. - Spend is pulled per ad. The daily worker reads spend from the Meta Ads API per
ad_id. - The matrix is computed. CPL = spend ÷ leads, per creative × landing page.
Because DropCPL creates the ads on Meta itself, the mapping between a creative and its ad_id is written when the ad is created — it does not depend on a human filling in UTM parameters correctly.
What you see
The attribution matrix is the primary view: creatives on one axis, landing pages on the other, real CPL in every cell. The leaderboard ranks combinations by CPL, conversion rate and win probability, so you can cut a losing pair without cutting the creative that works elsewhere.
A creative is rarely good or bad on its own. It is good or bad somewhere. The matrix is what makes the difference visible.
Why the number is first-party
Meta reports conversions through its own model, after iOS restrictions and modelling. That number is useful for Meta’s optimizer, and DropCPL feeds it through the Conversions API. But it is not what DropCPL displays as your CPL.
The number on the matrix is deterministic: it comes from a click we logged and a form submission we received. When the two disagree — and they always disagree — the first-party count is the one treated as ground truth.
Related
- First-party tracking — why the cookie has to be set server-side
- Meta Ads integration — how spend is synced per ad
- The AI agent — asking for the matrix in plain language, and acting on it