spoils.ai · internal proposal · 2026-08-21
Markets V2
A decision-first Markets page: which funded market do I scale next, and which unfunded market deserves budget? Max-only, read-only insights — never writes to Meta.
The problem today
- The table doesn't decide. Signals are buried in a 12-column table with two contradictory threshold systems (Scale = ROAS ≥3 in the table, ≥1.5 in the detail page).
- Revenue includes tax — every market figure is inflated ~8–12%, so ROAS reads high (audit Bug #2).
- Timeline selector silently breaks — a stale custom range hijacks named periods and poisons the cache for 15 min (audit Bug #1).
- Budgets are hardcoded at $250/day — the page can't see what Meta is actually spending.
- No discovery. Organic markets (DE, FR…) that already out-convert a funded market are invisible.
The solution — two jobs, one page
1
Scale decisions for funded markets (AU / CA / UK).
Verdict cards on top. Each verdict = rolling 14–28d blended ROAS vs the 1.76× breakeven, plus a spend-saturation check. When a market clears with headroom, the card suggests a budget step (+20–30%). Real daily budgets pulled live from Meta — the hardcoded $250 dies.
2
Discovery of unfunded markets.
Rank organic markets by revenue, sessions, and CVR vs site average. Flag a "candidate" when its organics beat a funded market's organics — the signal that budget would likely work there.
- Decision-first layout: verdict cards first (CA · Scale ↑ · 4.6× MTD), evidence table below.
- MTD default · 30d sparklines (revenue + ROAS) per market.
- Detail view: top-3 products per market with an "over-indexes vs US" flag — an ad-creative signal, not full product analytics.
- Breakeven-aware coloring: ocean blue above 1.76×, red below. No green, ever.
ASSUMED (needs your confirm): the daily exec email gets a compact Markets block — one verdict line per market + link to this page. You implied it "plays nicely with the daily email" but didn't explicitly confirm.
Explicitly not doing
- Cohort LTV per market
- Shipping-adjusted contribution margin (parked for V2.1)
- Multi-user / Clay-facing features
- Automated budget changes — the page reads Meta, it never writes
Roadmap
| Phase | Work | Verification |
| 1 · Data fixes | Subtract tax in nightly sync + backfill · clear stale customRange · remove dead Triple Whale fetch | Sample 10 markets vs Shopify admin net sales; period switch verified in browser |
| 2 · Verdict engine | Rolling 14–28d ROAS vs 1.76× + saturation check + budget-step suggestion · Meta budget reader (CBO + ABO) | Hand-computed verdicts for 3 markets match engine; budgets match Ads Manager |
| 3 · Page UI | Verdict cards · evidence table · sparklines · detail view with top-3 products + over-index flag · MTD default | Staging deploy, desktop + 375px screenshots, console clean |
| 4 · Email block assumed | One verdict line per market in the daily exec email + link | previewMode render + test send to Max |
Open questions
- Confirm the daily-email Markets block (currently assumed).
- Saturation signal: spend flat while ROAS falls, or Meta frequency/CPM thresholds?
- AE (paused-test market): show as funded or as an organic candidate?
- Budget step: fixed +20–30%, or scaled by headroom above breakeven?
Open the interactive mockup →