Ads Manager · mockup
Deep-dive v2 (rethought)

← all mockups

Deep-dive v2 — provider-neutral, and every tab answers a ritual

Synthesis of the media-buyer critique + multi-provider audit. New: Funnel tab, Rules tab, event pins on charts, impact cards in History, asset-level creative analytics, cohort maturity honesty. And proof the skeleton isn't Meta-shaped: the same page rendered for a Google Search campaign.

A · One skeleton, capability-driven — Meta vs Google Search

torix-fb-T2-…-ROAS45

MetaSALES · CBO $250/d · MIN_ROAS 45%
PerformanceFunnelAd setsAdsBreakdownsCreativesAttributionHistoryRules
Platform ROAS
2.31
via Meta Pixel
Hook rate
31%
3s video views
Frequency
2.4
capabilities: video_quartiles ✓ · reach_frequency ✓ · learning: phase_L2 · breakdowns: country, age×gender, placement · changelog: provider_api

torix-gg-US-brand-search

Google · SearchtROAS 320% · shared budget pool B
PerformanceFunnelAd groupsAdsKeywordsBreakdownsAttributionHistoryRules
Platform ROAS
2.9
via imported conversions
Impression share
64%
lost to budget 21%
Ad strength
Good
capabilities: video_quartiles ✗ · impression_share ✓ · learning: bid_strategy · aux_entities: keywords, search_terms · changelog: provider_api (change_event stream — needs wiring)

Level labels ("Ad sets" vs "Ad groups"), KPI tiles, tab list, breakdown dims — all come from a per-provider capability declaration, never if provider === meta. TikTok/Snap ship theirs with their connectors. "History" shows a banner for providers with no changelog API (TikTok/Snap): "only changes made through this tool are visible".

B · Performance v2 — change pins, fatigue trio, diagnose

Spend 7d
$1,689
▲9% vs prior 7d
Int. ROAS
1.94
acct median 1.18*
Platform ROAS
2.31
CPI (AF)
$2.84
Cost / web purchase
$14.9
Spend since last purchase
$38
stop-loss stat
Spend — daily · pins = changes (from History) · click pin → the change + its impact card
$
Fatigue / auction decomposition — 14d trends
Frequency → 2.4 ▲ rising
CPM → $14.2 flat
CTR → 7.4% ▼ decaying
Diagnose — ΔROAS −0.21 this week, decomposed: CPM +2% · CTR −14% · LP CVR +1% · purchase rate −3% · AOV +4% → creative fatigue is the driver (freq ▲ + CTR ▼ + CPM flat). Suggested: refresh creatives / duplicate with new hooks.
CPM +2%CTR −14%LP CVR +1%Purch −3%AOV +4%
Also on this tab: spend-concentration line ("3 of 14 ads = 88% of spend · 40% of spend in learning"). *Benchmark = account median excluding this campaign. Data is as-of the last sync — the freshness strip says so explicitly; no intraday pacing until hourly insights exist (flagged as future).

C · Funnel tab — NEW, the chain only we can show

Impressions
1.21M
Clicks
89.5KCTR 7.4% · bench 6.9% ✓
LP views (our LPs)
61.2Kclick→view 68% · bench 81% ⚠ tracking loss?
LP CTA clicks
19.7K32% · bench 30% ✓
Installs (AF) + web starts
9.8K50% ✓
Purchases (RC)
960.98% · bench 1.1%
Platform clicks → our landing-page views (marketing.landing_page_views, joined by utm/campaign id) → CTA → installs (AF) → purchases (RevenueCat). Per-stage conversion vs account benchmark, red where it degrades, period-over-period deltas on hover. Multi-LP campaigns get a per-LP split; an unmatched-UTM bucket surfaces revenue whose utm_campaign matched nothing — the data-hygiene canary. Web + app branches shown split when both exist.

D · Creatives v2 — assets, not ads; fatigue as a trajectory

SCALING
nerd_escort_hook3_v2
age 6d · 2 ads$744
hook 31% / hold 42%CP-purch $15.2
acct median: 24% / 35%int 2.41
FATIGUING
nerd_escort_hook1
age 19d · 3 ads$1,910 life
CTR −38% from peak · freq 3.1int 1.52
DEAD
nerd_escort_hook2_cut
age 21d · 1 ad$201 life
hook 17% · CP-purch —int 0.3
$83 since last purchase
Deduped by video/image asset (same video in 6 ads = one card, metrics rolled up). Lifecycle tag from spend + trend slope: scaling / plateau / fatiguing / dead. Gallery ⇄ table toggle. Card click → the ads running it. Provider variants per capability: Google Search shows RSA assets + Best/Good/Low labels here instead.

E · Attribution v2 (honest cohorts) + History v2 (impact cards)

Cohort ROAS maturation · hatched = immature (projected shown ◌)
Cohort wkD7D30proj D90paybackrefund%
Jun 220.711.081.41D262.1%
Jul 60.74◌ 1.12◌ 1.46◌ D241.4%
Projections curve-fitted from mature cohorts. Net ROAS uses RevenueCat refunds — refund-heavy geos stop hiding. Lens-divergence sentinel: platform/internal ratio trending ▲ = platform over-claiming. Attribution grain floors at campaign for internal lens (first-touch is campaign-grain — never faked below it).
History — every material change carries its consequence
Greg budget $200 → $250 · Jul 11
3d before: ROAS 2.10 · CPA $16.43d after: 1.64 · $21.0
rule* scale-winners budget $180 → $200 · Jul 8 · trigger: ROAS 2.3 > 2.0 for 3d · cooldown 72h
before: 2.28 · $15.1after: 2.31 · $14.8
Dan note: "testing new LP variant on this campaign" · Jul 7 · 📝 notes are timeline entries
Impact card = 3d pre vs 3d post (cohort-aware). Filters: actor (human/platform/rule) · change type. Providers without a changelog API (TikTok/Snap) show internal-only changes + a banner.

F · Rules tab — ships in P3, designed now

stop-loss-v1 watching this campaign's 6 ad sets
Pause ad set if spend(today) > $100 AND purchases(today) = 0
Closest to trigger: UK-lookalike — $87 / $100, 0 purchases
scale-winners-v2 last fired Jul 8 (+$20) · cooldown ends in 41h
+15% budget if Int. ROAS(3d) > 2.0 AND spend > 80% of budget · cap $500/d · max 1×/72h
Per-entity: attached rules, proximity-to-trigger meters, last actions (→ History), per-entity exclusion switch, and a backtest: "this rule would have fired 3× in the last 14d" — the trust-builder before enabling full-auto. Rule pins also appear on the Performance chart.
A

Deep-dive v2 locked

Tab set: Performance · Funnel · L2 · L3 · [Keywords] · Breakdowns · Creatives · Attribution · History · Rules(P3). All surfaces done → write the spec.

B

Adjust

Tell me in the terminal.