New: the $2,500 CRM System
← All case studies

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
Live simulation · dashboard

dashboard — six sources, one screen

$190.6k

pipeline, live

42

open deals

6

tools unified

Meridian Fitness

Close · Stripe · PandaDoc

Won ✓

Copper & Oak

Calendly · Close

Proposal

Bluebird Dental

Close

Open

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
Live via Close · Stripe · ClickUp APIs
orbit — sales / overview
OOrbit
⟳ Get latest data

Lifecycle overview

5,178 leads · 3,982 opportunities · 2026-07-19 → 2026-08-18

Last 7dLast 30dLast 90d

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

Lifecycle stage distribution

Every Close lead bucketed by latest signal. Click a stage to drill into those leads.

New

4,069

$7,935,824 attached

Booked

87

$295,800 attached

Attended

44

$16,700 attached

Offer sent

105

$367,400 attached

Won

496

$1,129,536 attached

Lost / declined

377

$1,160,300 attached

⚠ Attention needed Leads where the data says something is stuck. Click through to drill in.

244 Stuck in “Offer Sent” > 7 days$296,500 in pipe attached ↗
1 Attended call > 3 days ago · no offer sentForm blank or contract not yet decided — chase or close out ↗
Time in stage

Median days leads currently in each stage have been there — whole-stage slowness vs. individual stuck deals.

New 4069
155d
Booked 87
18d
Attended 44
266d
Offer sent 105
25d
Top open opportunities

Active + pending, sorted by value

Summit Sports Co.

Company · 461d in stage

$6,000

Nia Castellano · nia@castellanoco.example

Agreement Sent · 10d in stage

$4,500

Theo Marsh · theo@marshoutfitters.example

Intro Call Booked · 31d in stage

$4,400

Lena Ortiz · lena@ortizdental.example

Agreement Sent · 3d in stage

$4,200

Ben Kowalski · ben@kowalskimedia.example

Agreement Sent · 4d in stage

$3,900
Recently created leads

Last 14 days · 10 shown

Tessa Rowan · tessa@rowanhome.example

0d old · Potential

New

Omar Vance · omar@vanceoutdoor.example

0d old · Potential

New

Priya Lal · priya@lalskincare.example

0d old · Call Booked

Booked

Marcus Feld · marcus@feldfitness.example

0d old · Potential

New

Hana Novak · hana@novakstudio.example

0d old · Potential

New

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.

Next.js 16TypeScriptTailwind v4SupabaseVercel + CronClickUp API (v2 + v3)ZapierGoogle Apps ScriptGoogle Drive + Docs APIFathomStripeClose CRMPandaDocCalendlySlackClaude API
01

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.

02

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.