V1 Dashboard Mockup · Final · For Daniyal review

WF × MadSheets — HB DTO Dashboard

Clickable mockup of all 6 tabs in the V1 system. Click between tabs to feel how the dashboard would be used. Numbers are illustrative; structure and field names match the brief exactly.

⇄ Co-architecture posture

This mockup represents Gray's starting position. Push back on any tab structure, any metric, any panel. The brief's reasoning is in the .docx companion — read it before reacting to this.

WF | NetRevenue — Heather Blankenship DTO

Live as of 2026-05-23 21:18 UTC · auto-refresh daily · Source: Supabase direct
Optimizing for: Manual toggle · Gray controlled
Qualified application rate — Benchmark · Target · Current
Amber: above benchmark, below target
Benchmark
1.2%
HB's pre-engagement 90d avg
Target
3.0%
Committed at kickoff
Current (28d trailing)
2.4%
+100% vs benchmark · 80% of target
0% Benchmark (1.2%) Target (3.0%) 4.5%
Funnel steps
StepTotalTodayLast 3dLast 7dLast 28d
Apps started / leads47281447
Total applications deduped 72h2915929
Qualified target1713517
Disqualified1202412
Calls booked deduped appt_id1713617
Unique leads who booked1613616
Calls taken CRM workflow pending
Qualified calls taken CRM workflow pending
App → booking %58.6%100%60.0%66.7%58.6%
App → qualified %58.6%100%60.0%55.6%58.6%
Qualified → booking %94.1%100%100%120%94.1%

After applying the dedup fixes (§6a in the brief): App count dropped from 31 to 29 (2 same-email-within-72h duplicates). Booking count dropped from 20 to 17 (2 double-webhook fires + 1 rebook collapsed). Qualified → booking is now 94% instead of the impossible 111% you've been seeing.

Calls Taken rows are intentionally blank, not zero — the CRM workflow that populates the attended column hasn't been wired yet. The dashboard distinguishes "not implemented" from "zero this week."

Vercel URL split · 50/50
VariantStatusTrafficConversionsConv rateLift vs controlConfidence
LP-A (control)live4124711.4%
LP-B (challenger)live3986115.3%+34.2%Yellow · 13d, 61 conv, 34% lift
LP-C (challenger)live405389.4%−17.5%Yellow · 13d, 38 conv, neg lift

Confidence thresholds (recalibrated for HB volume): 🟢 ≥80 conv/arm + ≥14d + ≥25% lift · 🟡 ≥40 conv/arm + ≥10d + ≥15% lift · 🔴 below either.

Mockup note

These variants don't exist yet. HB is on a single LP today. This is what the dashboard would look like once Daniyal builds the variant routing layer (Vercel cookie-based) and we ship LP-B and LP-C.

Qualification split (the meta-qual vs CRM-qual delta)
VariantAppsMeta-qual rateCRM-qual rateDeltaSignal
LP-A4768%61%7ppHealthy
LP-B6182%52%30ppTighten form, don't kill variant
LP-C3871%64%7ppHealthy

When Meta-qualified rate is materially higher than CRM-qualified rate, the LP is letting "looks-qualified" leads through but the form isn't filtering them. That's a form-tightening signal, not a creative kill signal. LP-B is winning on raw conversion but its qualification quality is the worst — investigate before crowning it.

Meta Ads API · last sync 14m ago
Spend
$8,420
−$120 vs prev 28d
Apps (deduped)
29
+3 vs prev
CAC (per qualified app)
$495
−$24 vs prev
ROAS
2.4×
+0.3× vs prev
WeekSpendAppsQualifiedBookedClosedRevenueROAS
2026-05-18$2,1409561$6,0002.8×
2026-05-11$2,0807551$5,0002.4×
2026-05-04$2,2007430$4,0001.8×
2026-04-27$2,0006331$5,2002.6×
Spend pulled from Meta Ads API (HB only for V1; multi-client rollup is V1.1). CAC = spend ÷ qualified_apps for the selected window. ROAS = revenue ÷ spend, lagged because revenue books on call close (typically 7-14 days after the qualified app). Revenue numbers reflect closed deals, not pipeline.
DateChange typeWhat changedHypothesisResult
05-10formal_testLP-B headline: pain-led → outcome-ledOutcome framing converts higher for warm trafficIn flight · Day 13 · 61 conv
05-08form_logicAdded income-floor question to applicationFilter unqualified before they hit CRMDQ rate ↓ 8pp · Won
05-03single_variant_launchLP-C launched (testimonial-first hero)Social proof at fold lifts CTRIn flight · Day 20 · negative trend
04-28rollbackReverted CTA color (orange → brand)Orange CTA hurt brand congruence−12% CTR confirmed · Rolled back
04-20fixPixel double-firing on /applyInflated app_start countsResolved · counts now accurate
Every change to the funnel logs here. change_type values: formal_test, single_variant_launch, fix, rollback, form_logic. Predicted lift and source observation captured at hypothesis time (full schema in §6/§7 of the brief); compressed here for the mockup.
HypothesisNodePred. liftConfidencePriorityStatus
Hero video → static image w/ outcome calloutLP+18%High9.2approved
Reduce app fields from 11 → 7App+22%Medium8.4proposed
Add call-prep video to TY page (lift show rate)TY+15%Medium7.1proposed
Income qualifier earlier in flowApp+10%High6.8in_flight
Button copy: "Apply now" → "Get my plan"LP+4%Low2.1Too small for HB volume tier

Sorted by predicted_lift × confidence. The last row demonstrates the volume-tier guidance widget: at HB's 2K-10K monthly LP views, a 4% predicted lift won't reach yellow confidence within a reasonable test window. Flagged automatically.

Node IDTypeNameParentVariant ofTest methodActive
hb_dto_lplpDTO landing (control)
hb_dto_lp_blpLP-B outcome headlinehb_dto_lphb_dto_lpVercel split
hb_dto_lp_clpLP-C testimonial-firsthb_dto_lphb_dto_lpVercel split
hb_dto_appapplicationDTO application (single)hb_dto_lp
hb_dto_calcalendarDTO calendar (GHL iframe)hb_dto_app
hb_dto_tytyDTO thank-youhb_dto_cal
20+ placeholder rows reserved for future variants
Activating a variant = setting active = TRUE. No schema changes needed when adding variants — Tabs 1, 2, 3 read from this dynamically. Test method tracked per variant so the dashboard knows how to interpret the data (URL split vs Meta A/B vs duplicate campaign — see §8 of the brief).
What changed vs the original brief mockup

New: Benchmark / Target / Current panel at the top of Tab 1. This is the framing that anchors everything — we're not measuring absolute performance, we're measuring against a contractual baseline. Switches with the "Optimizing for" toggle.

Tab 1 now shows real deduped numbers (29 apps not 31, 17 bookings not 20). Reflects what would happen if you shipped the §6a quick-fix formulas today. Also: "Calls Taken" rows are dashes not zeros, because the CRM workflow isn't wired — distinguishes "not implemented" from "no data this week."

Tab 2 added test_method context — Vercel split vs Meta A/B vs duplicate campaign. The dashboard knows how the data was generated so you know how to interpret it.

Tab 5 includes volume-tier guidance. The last row demonstrates the auto-flag for tests whose predicted lift is too small to ever reach confidence at current volume — prevents wasted test cycles on headline-only tests.

Tab 6 added test_method column. Per-variant tracking of how the test is being run, so when you look back at a result you remember whether it was a clean URL split or a confounded campaign duplicate.

⇄ Three things to react to before sending to Daniyal

(1) The Benchmark/Target/Current panel design — does this framing feel right or is it busy? (2) Tab 2 still doesn't exist for real because you have no variants yet — should the mockup show it as "future state" more explicitly? (3) The dedup fix formulas in §6a of the brief — try them on a copy of the sheet before sending, so we know they actually work before promising Daniyal they will.