← 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
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%
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*
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
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
Clicks89.5KCTR 7.4% · bench 6.9% ✓
LP views (our LPs)61.2Kclick→view 68% · bench 81% ⚠ tracking loss?
LP CTA clicks19.7K32% · bench 30% ✓
Installs (AF) + web starts9.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 wk | D7 | D30 | proj D90 | payback | refund% |
| Jun 22 | 0.71 | 1.08 | 1.41 | D26 | 2.1% |
| Jul 6 | 0.74 | ◌ 1.12 | ◌ 1.46 | ◌ D24 | 1.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.4→3d 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.1→after: 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.