Paid social advertising agency · Marketing & Creative · Build 02
Six disconnected tools, one sales dashboard — and revenue that reconciles itself.
A paid-social agency's sales operation ran across Calendly, Close, Stripe, PandaDoc, ClickUp, and Slack with no reconciliation between them — the founder cross-referenced tools by hand every day, and silent failures (contracts signed but never invoiced, wire payments missing from MRR, deals closed with no charge) surfaced only by luck. I designed and built, from scratch, a production sales-operations dashboard on a snapshot read model: every source pulled hourly in parallel, one dashboard, automation that closes the loops, and reconciliation tools that make the silent failures announce themselves.
6 → 1.
Sales tools reconciled into one dashboard
5,178.
Close leads on one lifecycle view, hourly
3,600+.
Stale lead records cleaned in bulk, not one-at-a-time
231+.
Commits on main — a production system, not a prototype
The brief
Six tools that never talked — and a founder cross-referencing them by hand.
The problem
Contracts signed but never invoiced. Wire payments that never showed in Stripe MRR. Deals closed with no corresponding charge. These silent failures only surfaced when someone happened to notice — because bookings (Calendly), CRM (Close), payments (Stripe), contracts (PandaDoc), roster (ClickUp), and comms (Slack) lived in six tools that never talked. The founder was hand-cross-referencing them daily instead of running the business.
Meanwhile the operational layer was a patchwork of Zapier zaps: onboarding took ~20 minutes of human work per client, Drive folders were created under the wrong Google identity — so the operator couldn't even see the folders his own automation made — and the same broken folders triggered 'no access' emails to the ops lead every 15 minutes. Sales-call recordings and transcripts never reached the client's folder at all.
The solution
A from-scratch sales-operations dashboard on a snapshot read model: Vercel Cron pulls every source in parallel each hour, validates, and writes a snapshot to Supabase; pages read it instantly, and a failed source keeps the last good snapshot and pages Slack rather than showing a hole. On top of it, automation that closes the loops, reconciliation tools that name every silent failure, and audit tables under every write so the numbers are believed.
01 · The read model
Pull everything hourly. Read the snapshot instantly. Never overwrite good data.
Vercel Cron fans out to Calendly, Close, Stripe, PandaDoc, and ClickUp in parallel, validates, and writes a versioned snapshot to Supabase. Pages read the snapshot — instant, and identical for everyone. If any source errors, the previous snapshot stays and Slack alerts fire. Snapshot versioning with graceful fallback means a schema change never breaks a page for someone on a stale build.
- Hourly, parallel, validated
- Failed source → keep last good snapshot + Slack
- Jittered exponential backoff, Retry-After honored, concurrency capped under vendor limits
- ET-timezone helpers so daily windows never drift by a day
dashboard — six sources, one screen
$190.6k
pipeline, live
42
open deals
6
tools unified
Meridian Fitness
Close · Stripe · PandaDoc
Copper & Oak
Calendly · Close
Bluebird Dental
Close
Stripe payment detected → deal auto-won, snapshot archived
02 · The dashboard
One place the founder actually opens.
Everything under a single Sales nav: a lifecycle overview with aging and time-in-stage, 3,000+ leads with URL-backed filters and a six-milestone lifecycle per lead, calls, offers, accounts, cash with a reversible per-charge attribution editor, MRR with reconciliation, a contacts-cleanup engine, and a Diagnostics page that surfaces the silent failure modes. Every surface has its own explanation page at /docs, kept in sync with the code — a behavior change isn't done until the docs and changelog ship with it. Light and dark, responsive — walk through it below.
- Lifecycle overview · Leads · Calls · Offers · Accounts · Cash · MRR · Cleanup · Diagnostics
- Living /docs per surface, updated with every change
- Server actions return { ok } | { ok:false, error } — nothing throws across the mutation boundary
Lifecycle overview
5,178 leads · 3,982 opportunities · 2026-07-19 → 2026-08-18
Calls scheduled
181
in window
Showed up
120
Attended? = Yes
No-show
15
Attended? = No
Awaiting form
46
call happened, form blank
Show rate
88.9%
135 of 181 logged
Pipeline value
$8,793,024
3,128 open opps
Closed (won)
$177,800
50 in window
Lost
$204,400
59 in window
Win rate
45.9%
of resolved opps
Data quality
Needs cleanup
4,806
leads with issues
Form drifts
467
form ≠ lead values
Fixed (30d)
0
cleanup actions
Snapshot age
11m
since last build
Every Close lead bucketed by latest signal. Click a stage to drill into those leads.
4,069
$7,935,824 attached
87
$295,800 attached
44
$16,700 attached
105
$367,400 attached
496
$1,129,536 attached
377
$1,160,300 attached
⚠ Attention needed Leads where the data says something is stuck. Click through to drill in.
Median days leads currently in each stage have been there — whole-stage slowness vs. individual stuck deals.
Active + pending, sorted by value
Summit Sports Co.
Company · 461d in stage
Nia Castellano · nia@castellanoco.example
Agreement Sent · 10d in stage
Theo Marsh · theo@marshoutfitters.example
Intro Call Booked · 31d in stage
Lena Ortiz · lena@ortizdental.example
Agreement Sent · 3d in stage
Ben Kowalski · ben@kowalskimedia.example
Agreement Sent · 4d in stage
Last 14 days · 10 shown
Tessa Rowan · tessa@rowanhome.example
0d old · Potential
Omar Vance · omar@vanceoutdoor.example
0d old · Potential
Priya Lal · priya@lalskincare.example
0d old · Call Booked
Marcus Feld · marcus@feldfitness.example
0d old · Potential
Hana Novak · hana@novakstudio.example
0d old · Potential
I've concealed this client's name and data to protect their privacy. The dashboard appears here under the fictional product name “Orbit Social” and is our own redesign of the product — close to the real layout, fully responsive, light and dark — and every lead, closer, company, email, and figure on these screens is invented.
03 · Integrations & automations
Everything the sales operation runs on, wired together.
The dashboard is the hub: it reads six systems, writes back to three, and runs the automations that used to be the founder's morning. Every write path is audit-logged to a purpose-built Supabase table and surfaced on Diagnostics — any dashboard-initiated change is traceable and reversible.
Integrations
Close CRM API
Leads, opportunities, custom fields, the Post-Intro Call Form — read hourly, written back by Auto-Won and the Stripe-ID linker.
→ The system of record for the funnel.
Stripe API
Customers, charges, subscriptions — matched to leads by the form's Client Email, then phone as fallback.
→ Payment is the truth.
Calendly API
Bookings and attendance for the top of the funnel — 120 days of scheduled events.
→ Booked → showed, per closer.
PandaDoc API
Contracts sent and signed, joined to the lead so 'signed but never invoiced' can't hide.
→ Offers → agreements.
ClickUp API
The customer roster and MRR field — read for reconciliation, written by the hourly MRR sync.
→ Roster ↔ Stripe, both ways.
Slack
Alerts when a source fails, when Auto-Won fires, when a snapshot rebuild is skipped.
→ The failure modes announce themselves.
Supabase (Postgres)
Versioned snapshots plus audit tables: charge_overrides, close_auto_actions, v2_cleanup_fixes.
→ Instant reads · reversible writes.
Vercel Cron
The hourly fan-out, the MRR sync, and the 15-minute Drive engine — with backoff and concurrency caps.
→ Runs on its own; you own it.
Google Drive · Apps Script
~1,400-line script: 60+ members synced as Content Managers, ~180 client folders under the right identity.
→ Replaced three fragile zaps.
Automations built
Auto-Won
Flips a Close opportunity to Won the moment Stripe payment lands — audit-logged, Slack-notified, dry-run-capable, gated by an env var.
Stripe → ClickUp MRR sync
Writes each company's active subscription MRR to its ClickUp task hourly. Idempotent; skips tasks without a Stripe ID so manual entries are never clobbered.
Stripe customer-ID auto-linker
Writes resolved Stripe IDs back to Close leads so future lookups skip fuzzy email/phone matching.
Missing-from-MRR classifier
Every Full Service customer with no active subscription, labelled by reason: no_stripe_link · trialing · past_due · paused · canceled · no_subscription.
Contacts cleanup, in bulk
A heuristic engine flags structural issues and form-vs-lead drift across every lead; one click applies every high-confidence fix in the current filter, with progress and a failure summary.
Bulk opportunity value update
For price changes: preview → apply, per-row audit log, and a Reverse button.
V1 ↔ V2 parity check
Two independent implementations of the funnel math compared on every build; strict rows must match to the dollar.
Snapshot rebuild with fallback
If any source errors, keep the last good snapshot, alert, and try again next hour — never a blank page.
The outcome
The founder's day went from ‘check five tools’ to ‘check one dashboard’ — and the failures now surface themselves.
One source of truth for sales metrics across six tools. The founder's daily flow went from “check five tools” to “check one dashboard,” and Auto-Won retired the daily manual “mark this Won” chore.
Silent revenue-attribution failures now surface on Diagnostics automatically instead of being caught by human review; data-quality tools handle 3,600+ stale lead records in bulk instead of one at a time in the Close UI. In production on Vercel — 231+ commits on main, the last V2 sprint alone 35 commits in five days.
Want a system like this one?
A 30-minute call to map what you have to what you need. Fixed-fee where the scope is known, $100/hr beyond it, and everything documented so your team runs it without me.
I've concealed this client's name and data to protect their privacy. The dashboard appears here under the fictional product name “Orbit Social” and is our own redesign of the product — close to the real layout, fully responsive, light and dark — and every lead, closer, company, email, and figure on these screens is invented.
Next case study — D2C consumer brands (two, one owner)
Creative ops at scale: 800+ briefs, 5 pods, 2 brands, zero touch.
→