You cannot see a competitor's customer acquisition cost. It lives inside their ad account, next to their CTR, their CPM, and their ROAS — none of which the Meta Ad Library exposes. So when a tool shows you a rival's CAC as a single confident number, it invented it. Full stop.
But "you can't see it" doesn't mean "you can't model it." You can build a defensible range for a competitor's CAC from public signals — derived spend, funnel inference, and category benchmarks — as long as you state every assumption out loud and treat the output as a band, not a fact. This post shows the work: the inputs, the math, the assumptions you must label, and an illustrative worked range. It's the CAC modeling layer that sits on top of spend estimation — if you haven't read how to derive a competitor's spend range yet, start there, then come back.
What the Meta Ad Library actually gives you
Before modeling anything, be honest about your raw materials. From the Ad Library and daily snapshots, you get:
| Signal | Source | Reliability |
|---|---|---|
| Spend range (EU/political only) | Meta API | Wide range, when disclosed |
| Impression range | Meta API | Wide range |
| Days-running per ad | Daily snapshots over time | High — it's the product |
| Active ad count | Meta API | High |
| Creative iteration rate | First-seen dates | High |
| Engagement (likes/comments/shares) | Apify scrape | Medium |
| CTR, CPC, CPM, conversions, revenue, CAC | — | Not available, ever |
Everything below the line is invisible. CAC is downstream of all of it. So we don't read CAC — we triangulate it from the signals above plus outside-the-library benchmarks, and we carry the uncertainty all the way through.
The model, one layer at a time
CAC is just spend divided by customers acquired:
CAC = ad spend / new customers
We can't see either term directly, so we estimate both as ranges and divide the ranges. Here's the chain.
Layer 1 — Spend range (the input you already derived)
Start with a monthly spend range for the competitor's Meta activity. For EU/political advertisers you may have a disclosed range. For everyone else, you derive it: Meta's wide spend band narrowed by days-running, active ad count, engagement-verified reach, and creative iteration rate, with each input cited. The output is a band — say $80k–$140k/month — never a point.
Assumption A: The Meta library reflects most of this brand's Meta spend. If they run heavily on TikTok, Google, or via affiliates, your CAC model only describes the Meta slice — label it as such.
Layer 2 — Impressions to clicks (CTR assumption)
Spend buys impressions; a fraction of impressions become clicks. You don't know their CTR, so you borrow a category CTR band from public benchmarks (industry reports, your own account history in the same vertical).
Assumption B: Competitor CTR ≈ category median CTR. State the band you're using (e.g., 0.9%–1.8% for DTC). This is the single biggest lever in the model — be loud about it.
Clicks = impressions × CTR-band. If you only have a spend range, convert via a category CPM band first (spend ÷ CPM × 1,000 = impressions), then apply CTR. Two assumptions stacked — widen the range accordingly.
Layer 3 — Clicks to customers (conversion-rate assumption)
Not every click buys. Apply a category landing-page conversion rate to get customers.
Assumption C: Conversion rate ≈ category benchmark for this offer type. A $40 supplement subscription and a $1,200 mattress convert at very different rates — match the benchmark to the price point and funnel, not just the industry.
Customers = clicks × conversion-rate-band.
Layer 4 — Divide, and widen for compounding uncertainty
CAC = monthly spend range / monthly customers range
Because each layer is a range built on a stated assumption, the divisions multiply the spread. A tight-looking 2x spend band can become a 4x–5x CAC band by the time you've stacked CTR and conversion assumptions. That width is the honest answer. Narrowing it artificially is exactly what fabricating tools do.
A worked, illustrative range
Numbers below are illustrative — placeholders to show the mechanic, not claims about any real brand.
- Spend (derived): $80k–$140k/month
- CPM band (category): $12–$22 → impressions ≈ 3.6M–11.7M
- CTR band (category): 1.0%–1.8% → clicks ≈ 36k–210k
- Conversion rate (category, mid-ticket DTC): 1.5%–3.0% → customers ≈ 540–6,300/month
- CAC = spend ÷ customers ≈ $13–$260
That $13–$260 band looks uselessly wide — until you anchor it. Two moves tighten it honestly:
- Cross-check against days-running. If this brand has multiple ads live 100+ days, their unit economics work at some CAC inside that band; brands kill ads that lose money. Longevity doesn't give you the number, but it tells you the true CAC sits where the offer is still profitable — letting you lean toward the lower-to-middle of the band.
- Cross-check against price point. A subscription with a $45 first order can't sustain a $260 CAC for long. The product's economics cap the plausible CAC, trimming the top of the range.
After anchoring, you might responsibly report "$40–$90, leaning low given 6 ads running 120+ days on a ~$60 AOV offer." Still a range. Still every assumption attached. That's a defensible estimate — something a CFO or a strategist can actually pressure-test.
The assumptions you must always state
Bury one of these and your range becomes a lie dressed as data. Surface all of them:
- Coverage — is the Meta library most of their spend, or one channel?
- CTR band — which category, which source, what width?
- CPM band — only needed if you went spend → impressions.
- Conversion-rate band — matched to price point and funnel, not just industry.
- AOV / offer economics — used to sanity-cap the top of the range.
- Time window — a launch-month spend spike inflates apparent volume; use a trailing average from snapshots.
If a stakeholder disagrees with your CAC, they should be able to point at exactly which assumption they'd change. That's the whole value of showing your work.
Why a single confident CAC is a red flag
Some tools will hand you "Competitor X: CAC $52." There is no public input that produces that precision — the account-level data simply isn't there. They either (a) reverse-engineered it from the same benchmarks you just used and hid the assumptions, or (b) made it up. Either way, you can't pressure-test a number whose inputs are invisible, which means you can't trust it in a board deck.
A cited range beats a fabricated point every time. The honesty isn't a limitation of this method — it is the method. The same principle runs through everything AdWhispr surfaces: spend comes as a triangulated band with inputs shown, reach is an impression range multiplied by scraped engagement, and CAC, if you model it, is a labeled band. No competitor CTR, CPC, or ROAS is ever invented, because those live only inside the advertiser's account.
Letting the data do the heavy lifting
You can run this model by hand in a spreadsheet. The tedious parts — pulling the days-running distribution, the active-ad count, the iteration rate, and the engagement-verified reach that feed Layers 1 and 4 — are what AdWhispr automates. You paste a competitor's Facebook URL; it ingests their full Meta ad library, snapshots it daily so you actually have run-time history (Meta's API returns none), and lets you interrogate it by chat or inside Claude via its MCP server. Ask it for the spend triangulation and the longevity curve, then layer your stated CTR and conversion assumptions on top to land the CAC band. The tool gives you defensible inputs; you own the assumptions — which is the only honest way to estimate CAC from the Meta Ad Library at all.
Model the range, label the assumptions, never trust a single confident number — start triangulating with AdWhispr.