← All insights
17SMB Dashboards · 8 min read

Anatomy of an SMB client dashboard: what Kumar Textiles sees every Monday

A walkthrough of a real Growth-bundle dashboard — the transformation hero, the money strip, the narrative Autopilot log, the owner-approval queue. Built so a 48-year-old retail owner can read it in 90 seconds.

01

The four blocks that decide if the dashboard gets read

  • Transformation hero — before/after band with 76-day numbers (104 → 342 leads/week, CPL ₹380 → ₹184, 4hrs/day → 28min/day)
  • Money strip — rupees, not ratios: ad spend → attributed revenue → margin. ROAS shown with industry benchmark underneath
  • Narrative Autopilot log — each event is Signal → Action → Outcome, not one-line status codes
  • Owner-approval queue — visually separated cards, distinct colour from Autopilot-auto cards so control is loud
02

Why we stopped writing 'Paused campaign X'

  • One-line activity logs don't earn trust — owner can't see why a ₹8K/day ad set got paused
  • Signal row: 'CPL on Cold-IG-Carousel hit ₹640 over 3 days — 2.9× target'
  • Action row: 'Paused Cold-IG · shifted ₹8K/day to LAL-1%-Bridal · added UTM guard to prevent re-enable'
  • Outcome row: 'Saved ~₹9,600/day in dead spend. LAL CPL dropped ₹214 → ₹199 with added budget'
  • Result: 2-minute Monday skim replaces the Tuesday-afternoon 'what did you do this week' email thread
03

Nine modules, one dashboard

  • Overview — 5 KPIs, blended weekly trend, channel mix
  • Outreach — drafts queued and an outbound log where every touch is click-to-advance (draft → queued → sent → replied → booked)
  • Leads — CSV-like view of every inbound, temperature, next action
  • Ads · Organic · Social · WhatsApp · Reviews — channel-specific deep tabs
  • Pipeline — React Flow funnel view with conversion-% between stages
  • Ops — unified activity ledger; Sources — connector status table
04

Live-data overlay, baseline fallback

  • GA4 property + Vercel Analytics pulled server-side via /api/live/<slug>, merged over the baseline
  • One shared service-account key in Vercel env; each client declares their propertyId + projectId in their slug file
  • Dashboard shows a live-status pill: live (numbers from API) / fetching / fallback (if connector errors)
  • Never breaks when a connector goes down — baseline hand-curated numbers stay visible
05

Private by default, public by invitation

  • Tenant dashboards at /client/<slug> — public demos (kumar-textiles) vs private real-client (cookie-gated via Next proxy)
  • Operator-wide cockpit at /dashboard — all tenants on one screen with cross-tenant MRR, urgent queue, unified Autopilot feed
  • Cookie session (JWT HS256, HttpOnly/Secure/SameSite Lax, 14-day TTL) + Basic Auth fallback for CLI and bookmarks
  • Tenants added by copying app/client/data/_template.ts → fill meta + sections → register in CLIENT_REGISTRY. ~3 minutes onboarding
06

What we tell clients on the install call

  • The dashboard is the product — not a weekly PDF, not a deck, not a Notion share
  • If you open it once a week, Monday 9am, we're doing our job
  • If you open it three times a day, something is broken — tell us and we'll fix the rhythm
  • Numbers are audit-ready — every Autopilot action has a signal/action/outcome row and a timestamp

Apply it

See the live Kumar Textiles dashboard. Then tell us what you'd want yours to show.