← Back to Blog
Paid MediaPaidMediaMarketingAnalyticsQuantitativeMarketing

Meta's Cost Per Result Is Not One Unit

Meta's "Cost per result" box measures a different thing depending on the campaign objective, and it never says which. Six panels from one ad account, reconciled by hand, showing a 1,000x unit trap.

SPSantosh Paudel· September 7, 2026· 12 min read
Table of contents

Meta's "Cost per result" box does not report one unit. It reports whatever unit the campaign objective implies, and it does not say which. I reconciled six Performance overview panels from a single ad account by dividing spend by the objective metric. On the three reach campaigns the figure is cost per 1,000 people reached. On the three Instagram profile visit campaigns it is cost per single visit. Same box, same label, same dollar sign, units 1,000x apart.

That rule is an inference from these six panels, not a quote from Meta: Meta's help pages render client-side and I could not pull text out of them. What follows is arithmetic done by hand, laid out so you can check it.

The data: I worked as a creative strategist at a marketing and production agency in Nepal, running paid social for large domestic FMCG, retail and consumer brands. These panels are screenshots from that account. No panel identifies a brand and I am not naming one.

The reconciliation: six panels, two units

Each row shows what Ads Manager displayed, then both candidate readings. Only one reproduces the display.

PanelObjective metricValueSpendShownSpend / metricSpend / (metric/1,000)
AReach5,684,111$1,043.54$0.18$0.000184$0.1836
BReach569,875$30.00$0.05$0.000053$0.0526
CIG profile visits111,577$2,157.09$0.02$0.0193$19.33
DIG profile visits11,041$127.87$0.01$0.0116$11.58
EIG profile visits13,880$213.82$0.02$0.0154$15.40
FReach1,659,478$114.60$0.07$0.000069$0.0691

All six reconcile in one direction only. On the reach panels the per-person reading rounds to $0.00 on screen, so per-thousand is the only reading consistent with what Meta printed. On the profile visit panels the per-thousand reading gives $11 to $19, nowhere near the display.

The per-thousand formula is the standard one. JetMetrics states it as "The amount spent / Reach * 1,000", with a worked example of $500 across 50,000 accounts giving $10, and DashThis gives the same shape. Meta's own page for the metric is here, though it renders client-side.

The 1,000x error, and why it is the easy one to make

Look at panels E and F. E shows $0.02, F shows $0.07. The obvious reading is that F costs three and a half times more.

It does not. E is two cents per person who tapped through to an Instagram profile. F is seven cents per thousand people who saw the ad. Per single person reached, F costs $0.000069. The two are 1,000x apart in units before you compare a single digit.

In my six screenshots both figures sit in identically formatted boxes with the same label, and the objective that defines the unit is not in the same eyeline as the cost. That describes my panels, not every build.

I fed these same screenshots to Google NotebookLM and it produced a well-designed 12-slide deck whose thesis was that one campaign delivered traffic "at a 71% discount." That 71% is one minus 0.02 divided by 0.07 — a ratio between figures whose units are 1,000x apart, dressed as a like-for-like saving. A unit error with clean typography and no hedging. That deck deserves its own post.

The rule: reproduce the figure before you compare it

Three steps, no tooling.

  1. Write down the amount spent and the objective metric value from the same panel.
  2. Divide spend by the metric. If it matches the displayed cost per result, the unit is per single event.
  3. If step 2 rounds to $0.00, divide spend by the metric over 1,000. If that matches, the unit is per thousand.

The interesting case is when neither matches. That did not happen here — each of the six reconciled one way or the other — so this part is reasoning rather than observation: if neither division reproduces the display, the metric on screen is not what the cost figure is denominated in, and whichever number does reproduce it is the one worth hunting for.

Then one constraint on top: only compare cost per result across campaigns that share an objective. Matching units is necessary, not sufficient. A different objective means the campaign was bid toward a different outcome in a different auction, so the people behind the two numbers are not the same people. That is reasoning about the auction, not something I can source to a Meta document, but it points the conservative way: treat a cross-objective gap as confounded rather than as evidence about the creative.

This is what makes dashboards untrustworthy in general: a number without the definition that makes it mean anything. When I wrote up the five search metrics I actually track, the argument was that most of what SEO dashboards display is tool-vendor invention and only a handful of metrics tell you whether organic search is working. A cost per result you cannot denominate is not one of the handful.

Panel F, and the comparison I got wrong

Each panel is quotable standalone; the reconciled column above is the whole of it. The comparisons are where it goes wrong.

Panel F is where I got this wrong on my first pass, so I will be explicit. F is not the worst-looking panel under the naive comparison: of the six displayed values ($0.18, $0.07, $0.05, $0.02, $0.02, $0.01), panel A's is highest. Nor is F the standout on its own objective. Ranked on cost per thousand reached, the reach panels go B at $0.0526, F at $0.0691, A at $0.1836. F is the middle one, costing 31% more per thousand reached than B.

There is one figure where F does lead: $114.60 bought 2,478,119 video plays, or $0.046 per thousand plays, against E's $0.213 — a gap of about 4.6x. But video plays are not F's objective metric, and E was not running for reach, so that comparison breaks the rule I just wrote down. Confounded across two objectives and two auctions, it supports one narrow statement: F was a cheap source of plays that nobody was buying plays for.

One more constraint: do not add these panels together. C at $2,157.09 is an order of magnitude above D ($127.87) and E ($213.82) on the same objective in the same account, which is the shape an account-level aggregate takes — it almost certainly already contains them. Likely the same for A against B and F. Summing the set would count the same people twice. That containment is my inference from the magnitudes and the shared objective; nothing on the panels states it.

The hook and hold numbers have a units problem too

Three panels report video metrics.

PanelHook rateHold rateHold / hookAvg playVideo playsSpend$ / 1,000 plays
D23%1.12%4.87%00:07545,602$127.87$0.234
E28%2.97%10.61%00:101,001,830$213.82$0.213
F24%1.62%6.75%00:052,478,119$114.60$0.046

Hook rate is measured against impressions, and so is hold rate under the reading I settle on below. That matters: hold rate already contains the hook stage. The raw spread on hold rate is 2.97 over 1.12, or 2.65x — and 2.65 is not a second-stage number. It is 1.22 (the hook spread, 28 over 23) times 2.18 (the spread in retention given a hook, 10.61% over 4.87%), and at full precision 1.2174 × 2.1783 = 2.6518. Calling 2.65x "the hold stage moving" double counts the hook.

The honest stage-by-stage comparison is 1.22x at the first stage against 2.18x at the second. The second stage still separates these creatives about 1.8x more sharply than the first, so the conclusion survives — it has to be argued with 2.18, not 2.65.

The first stage is not flat either. 28% against 23% is 21.7% apart, more than a fifth. Vaizle publishes roughly 20 to 25 percent as the hook rate to aim for, with top performers above 30 percent, and all three sit inside or just above that band. It is a target Vaizle recommends, not a distribution it measured — the page gives no dataset behind it — so it orients rather than grades.

The counterexample sits in the same table. Panel D has a longer average play time than F, seven seconds against five, and a lower hold rate, 1.12% against 1.62%. The two do not move together here, and with three data points no relationship can be established either way.

Which denominator?

Hook rate and hold rate are practitioner metrics, and the two sources I checked do not define them the same way. Vaizle gives hook rate as 3-second video plays divided by impressions, and hold rate as ThruPlays divided by 3-second video plays. Affect Group publishes no hold-rate formula at all; it points at "the ratio of ThruPlays to Impressions" as the completion measure. That is not two formulas contradicting each other. It is one source publishing a formula and another naming a different ratio for a neighbouring idea — the label travelling without its definition.

ThruPlay is the input both lean on. UpStack's Meta metric reference defines it as counted when "a viewer watches your entire video or at least 15 continuous seconds, whichever comes first," and adds that "for videos shorter than 15 seconds, the user must complete the full video." I quote UpStack and not Meta because Meta's page renders client-side and I could not read it.

The panels report neither impressions nor ThruPlays, so I cannot verify which denominator produced these numbers. What I can say is that 1.12% to 2.97% comes in thirteen to forty-five times below the 40 to 50 percent Vaizle tells readers to aim for under the ThruPlays-over-3-second-plays reading. A band you are told to target is not a band anyone measured, so falling short of it is weaker evidence than sitting outside an observed range would be — but a gap of that size still points at impressions here. Dividing hold by hook then converts them into retention given a hook: 4.87%, 10.61% and 6.75%.

Two metrics with the same name and different denominators are two different metrics. Pick one definition, write it down, use it consistently. That is a measurement problem, not a craft one — the craft side, which short-form formats and what cadence, is a separate argument and not decidable from these panels.

What this dataset cannot tell you

  • No revenue, sales, ROAS, conversions or leads exist in these panels. Only reach, profile visits, video plays and cost. Cheap attention is not proven demand, and connecting spend to outcome needs a model — which is what mix modelling is for, even on small budgets.
  • No retention curve exists. Average play time is one number, not a curve. Nothing here locates a drop-off at any particular second, and any chart that draws one has invented it.
  • No campaign start or end date is printed, so nothing here is a rate over time.
  • No impressions and no ThruPlays are reported, which is why the denominator question stays open.
  • No brand is attached to any figure, and the panels may overlap, so they cannot be summed.

FAQ

Why does Meta show cost per result in different units without labelling them?

Because the "result" is whatever the campaign objective counts, and in the six panels I have the objective is not printed inside the cost box. That is the only explanation consistent with all six: the reach campaigns reconcile per thousand, the profile-visit campaigns per visit, and the widget looks identical either way. Internally consistent, and misleading in a side-by-side screenshot, which is how I was reading them.

How do I know which unit my cost per result is in?

Divide the amount spent by the objective metric. If that reproduces the displayed number, it is per single event. If it rounds to $0.00, divide by the metric over 1,000. In these six panels one of the two always matched and the other never came close.

Is $0.02 per Instagram profile visit good?

Two of the three profile-visit panels display $0.02, and they are not the same number underneath: C is $0.0193 and E is $0.0154, with D at $0.0116. A displayed $0.02 covers both the most expensive of the three and the middle one — the rounding hides the ranking. Outside that objective the question is unanswerable: different unit, different auction. And a visit is not a customer. There is no revenue in this data.

Can I add reach across campaigns in one ad account?

Not from panels like these. Two campaigns can reach the same person, and a broader panel can already contain a narrower one — A at 5,684,111 people is large enough to hold both B (569,875) and F (1,659,478) rather than sit alongside them. I cannot prove that overlap from what is displayed, and that is the point: nothing on the panel tells you whether a sum would double count, so the sum is not defensible.


Got a dashboard full of numbers nobody has reconciled? I check the arithmetic before building a story on top of it, and I will tell you which figures do not survive. Get in touch.

Free resource

Get the AI Marketing Prompt Pack

30+ tested prompts for images, captions, video scripts, keywords, and full content systems, delivered instantly.

No spam. Unsubscribe anytime.

Browse all free guides →

Want to implement this with guidance?

Santosh helps founders turn insights like this into real systems.

AI Content Systems

External Resources

Further Reading & Tools

Related Posts

01
12 min
PaidMediaContentStrategy
TodayPaid Media

Hook Rate vs Hold Rate: What Actually Moves

Across three video creatives in one Meta ad account, hook rate spanned 1.22x. Hold rate spanned 2.65x as reported, and 2.18x once the hook stage is divided back out. The funnel arithmetic, the counterexample, and a diagnostic table.

Read article
02
12 min
AIMarketingMarketingAnalytics
TodayAI & Marketing

NotebookLM Invented a Chart From Ad Panel Data

I fed six Meta Ads Manager screenshots from an agency account to Google NotebookLM. It returned a twelve-slide deck whose headline claim is a unit error and whose most persuasive chart was drawn from data I never supplied. Here is the audit, and the checklist that came out of it.

Read article
03
13 min
ContentStrategyContentMarketing
TodayContent Strategy

Content hit rate: how many posts before it means anything

Half of a client's reels found distribution and half died. I turned that into a planning model, with runnable Python, that answers how many posts a month you need before the number stops being noise.

Read article