Any tool that prints a competitor's exact monthly Meta ad spend down to the dollar is lying to you. The number isn't in the data. Meta's Ad Library exposes spend only as wide ranges on a sliver of ads — and only for political and social-issue ads in most regions. For a DTC brand running 80 commercial creatives, you get nothing close to a clean figure. So when a dashboard says "$184,320/mo," someone built a regression on thin air and rounded it to look precise.
The honest move is different: build a defensible estimate from inputs you can actually verify, show your work, and report it as a range. That's what this tutorial teaches. You'll learn to triangulate three signals — active-creative count, days-running, and engagement-verified reach — into a spend band you can defend in a pitch deck. Let's get into the method.
What Meta actually gives you (and what it doesn't)
Before estimating, know your raw material. Here's the honest inventory:
| Signal | Available? | Form |
|---|---|---|
| Exact spend | No | Never, for commercial ads |
| Spend range | Rarely | Only political/issue ads, in coarse buckets |
| Impressions range | Rarely | Same — political/issue only, wide buckets |
| Active vs. inactive | Yes | ad_delivery_stop_time === null means live |
| First-seen / last-seen dates | Yes | But the API returns no history — you must snapshot |
| Creative content | Yes | Image, video, copy, landing URL |
| CTR / CPC / CPM / ROAS | No | Lives only inside the advertiser's account |
That last row matters. Nobody outside the advertiser's Ads Manager can see their cost-per-click or return on ad spend. If you remember one thing: never let an estimate depend on a number Meta doesn't publish. Estimate from what's observable, label the rest as assumption.
The three inputs that drive a spend estimate
Spend is a function of how much creative is live, how long it stays live, and how widely it reaches. Each maps to an observable signal.
Input 1 — Active-creative count
Count the ads currently live (ad_delivery_stop_time === null). More simultaneous creatives generally means a bigger budget — you don't run 60 distinct variations on $2k/month. But raw count lies in two directions: a brand may run twenty near-identical color swaps of one ad (low real spend, inflated count), or three workhorse videos eating six figures (high spend, tiny count). So count creatives, then weight them by how long each survives.
Input 2 — Days-running (the performance proxy)
This is the keystone. Brands don't keep paying to serve losing ads. An ad live 100+ days is a proven winner getting real budget; an ad that died at day 6 was a test that got cut. So instead of treating all creatives equally, read the distribution of run-times:
- A few long-runners (100+ days) = concentrated, confident spend behind winners.
- A wide spread of short-lived tests = an aggressive testing budget, churning creatives weekly.
- Everything under 14 days = either a brand-new push or a low-commitment trickle.
The catch: Meta's API returns no run-time history. Ask it today and it tells you what's live today — nothing about yesterday. The only way to know an ad has run 112 days is to have snapshotted it daily since it appeared. The history is something you build, not something you query. (This is exactly why AdWhispr snapshots every tracked brand's library daily — the longevity curve is the product, not a side effect.)
Input 3 — Engagement-verified reach
Reach scales spend more than creative count does. When Meta's impression range is available, anchor to it. When it isn't, proxy reach from public engagement — likes, comments, and shares scraped off the live creative. Engagement isn't reach, but it's a verifiable floor: an ad with 40,000 reactions was served to vastly more people than one with 40. Cross-referencing scraped engagement against the impression range (where it exists) tightens a 10x-wide Meta bucket into something far narrower. Call this engagement-verified reach — a real number anchoring an otherwise hand-wavy one.
The triangulation method, step by step
Here's the full procedure. Each step cites its input so the final number is auditable.
- Pull the live set. List every active creative for the brand. Record first-seen and last-seen dates per ad. (Days-running needs prior snapshots — if you're starting cold, you have a count today and a real estimate in a few weeks.)
- Bucket by longevity. Split creatives into long-runners (60+ days), mid (15–59), and tests (under 15). The long-runner bucket carries most of the real spend.
- Estimate a daily rate per bucket. Long-runners sustain meaningful daily budget — they wouldn't survive otherwise. Tests get small allocations. Anchor your per-bucket daily figures to whatever spend/impression ranges Meta does expose for this brand or category; absent that, use a conservative published industry daily-budget band and state it as an assumption.
- Weight by engagement-verified reach. Scale each bucket's rate by relative engagement. A long-runner with heavy scraped engagement gets the top of the band; a quiet one gets the bottom.
- Sum to a monthly range, not a point. Multiply daily rates by ~30 and add buckets. Report low and high ends. The width of your range honestly reflects your uncertainty — that's a feature.
- Cite every input. Note creative count, longevity distribution, engagement figures, and which assumptions you injected. A defensible estimate is one a skeptic can re-derive.
A worked illustrative example
Numbers below are invented to show the mechanics — not a claim about any real brand.
Say a competitor has 48 active creatives. Snapshots over the last quarter show the longevity distribution:
| Bucket | Count | Assumed daily / ad | Engagement weight | Daily subtotal |
|---|---|---|---|---|
| Long-runners (60+ days) | 9 | $350–$650 | High (top of band) | $4,500–$5,850 |
| Mid (15–59 days) | 17 | $120–$300 | Medium | $2,040–$5,100 |
| Tests (under 15 days) | 22 | $30–$90 | Low (bottom) | $660–$1,980 |
Daily total: $7,200–$12,930. Times ~30 days: roughly $216k–$388k/month.
Now the honest part. That's a ~1.8x-wide range, and it rests on three cited inputs (48 live creatives, a 9/17/22 longevity split, engagement weighting per bucket) plus one labeled assumption (the per-bucket daily bands, anchored to category norms). If a snapshot tomorrow shows three long-runners died, you'd revise down — with a reason. Compare that to a tool printing "$284,160/mo": you can't audit it, can't revise it, and can't defend it when a client asks where it came from. A cited range beats a fake point every time.
Why a range is the professional answer
Clients and bosses think a single number is more credible. It's the opposite. A point estimate hides its own error bars; a range exposes them, which is exactly what makes it trustworthy. When you say "$216k–$388k, driven by 9 long-running winners and a heavy testing cadence," you've told a story someone can act on — and pressure-test. When the spread is wide, that's information too: it means the brand's mix is volatile or your snapshot history is still thin. Narrow it by tracking longer, not by rounding harder.
Doing it without a 40-tab spreadsheet
You can run this by hand: scrape the library, log dates daily, maintain a snapshot sheet, re-scrape engagement weekly. It works, and it's miserable to keep current across more than one or two brands.
AdWhispr automates the inputs this method needs. It ingests a brand's entire Meta ad library from a single Facebook URL, snapshots it daily so the days-running distribution is real history rather than a guess, and pairs Meta's impression ranges with scraped engagement to anchor reach. Then you just ask — by chat or inside Claude via the MCP server — "what's the spend picture for this brand, and what's it based on?" The answer comes back as a range with its inputs cited: creative count, longevity curve, engagement-verified reach. Connect at https://adwhispr.com/api/mcp or run npx adwhispr-mcp-server config. It's read-only on competitor data — it never touches anyone's live ad account.
The discipline is the same whether you do it manually or with a tool: estimate from what's observable, cite your inputs, report a range. That's how you talk about competitor spend without making things up. For more on reading days-running, engagement-verified reach, and the rest of the derived-intelligence toolkit, browse the rest of the AdWhispr blog.
Stop guessing at exact numbers — start citing your inputs: estimate competitor spend the honest way with AdWhispr.