100% synthetic — no real prior-employer or client data anywhere in this repo.
Salesforce Lightning-styled: global header, app tab bar, list views with filters/search/pagination, a Kanban pipeline board, record detail pages with a Path stepper and activity timeline. Read-only, seeded with the same 2,080-lead dataset as everything below.
Live demo → · source: crm_app.py · run it yourself: streamlit run crm_app.py
I don't have a real book of business to show — the closest thing I ever ran was a prior role's pipeline, and that data isn't mine to publish post-termination. What I can show honestly is the actual competency underneath "CRM experience" on a job description: a normalized relational schema, a lead lifecycle with real stage gates and SLAs enforced as code (not just documented), routing logic that's tested to actually balance load, multi-touch attribution across four models, a forecast that's honest about its own uncertainty, and — because reporting alone isn't a CRM — an operational surface a rep would actually work in day to day. A synthetic dataset, built and disclosed as such, is the honest way to demonstrate all of it.
Computed by src/analytics/funnel.py reading data/revenue_engine.db, 2,080 leads across 1,906 accounts.
| transition | from | to | conversion | vs. benchmark |
|---|---|---|---|---|
| Lead → MQL | 2,080 | 995 | 47.8% | within (35–55%) |
| MQL → SQL | 995 | 241 | 24.2% | within (20–25%) |
| SQL → Opportunity | 241 | 104 | 43.2% | within (30–50%) |
| Opportunity → Closed Won | 104 | 21 | 20.2% | below (25–35%) |
Three of four transitions land inside the published 2025–2026 SMB benchmark range; Opportunity→Won runs below it (20.2% vs. a 25–35% range). That's flagged, not smoothed over — it's exactly the kind of signal the Home tab's "Needs Attention" panel and the AI Copilot's "which stage is underperforming" question are built to surface, and the forecast's win-rate bounds are widened to 15–35% specifically because this stage's real performance sits below the naive benchmark midpoint.
Design: crm-system-design.md. Enforcement: src/crm/lifecycle.py and src/crm/routing.py — this is executable code, not just a design doc.
| stage | exit criteria (raises if missing) | SLA |
|---|---|---|
| Lead | Signal score ≥ 3.0 | Scored within 1 hour (automated) |
| MQL | Rep confirms budget/authority/need/timing | Actioned within 6 business hours |
| SQL | Discovery call completed, deal shape documented | Call booked within 3 business days |
| Opportunity | deal_value_monthly_usd required | Follow-up every 5 business days |
| Closed Won/Lost | Handoff to CS / lost_reason required | Handoff within 24 hours |
Lead routing is a weighted round-robin with a signal-score fast lane: leads scoring ≥8.0 skip the queue and route to whoever has the lowest open-SQL load. This isn't just asserted — tests/test_analytics.py checks it directly: rep-level lead counts land within 1.7% of an even three-way split across all 2,080 leads (683 / 692 / 705).
Accounts score 0–100 on category + firmographic + signal fit (src/segmentation/icp.py), bucketing into Beachhead / Core ICP / Adjacent / Poor Fit. Beachhead accounts convert at 4.3× Core ICP's Lead→Won rate (1.62% vs. 0.38%, on 1,109 vs. 799 leads) — the segmentation actually moves the funnel numbers, it isn't just a label on a report.
Full file: src/analytics/attribution.py — first-touch, last-touch, linear, and U-shaped (40/20/40) over ~8,400 timestamped multi-touch activities.
First-touch and linear both credit Outbound LinkedIn as the top channel ($14,050 / $11,498 attributed MRR), but last-touch credits Signal-scored inbound instead ($9,950) — which channel "wins" depends on which attribution model a RevOps team chooses to trust, a real strategy decision this demo makes visible instead of picking one model and hiding the disagreement.
Full file: src/analytics/forecasting.py. Close probabilities come from this dataset's own SQL→Opportunity→Won history, not a generic industry assumption.
| scenario | win rate | new MRR |
|---|---|---|
| Worst | 15% | $21,570 |
| Expected | 20.2% (measured) | $29,048 |
| Best | 35% | $50,330 |
Win-rate bounds are the published SMB high-velocity range (15–35%) — widened rather than centered on the benchmark midpoint, because this dataset's own measured Opportunity→Won rate (20.2%) already runs below the naive 25–35% benchmark range, per the funnel table above.
| month | proj. leads | proj. opp | new MRR (worst/expected/best) |
|---|---|---|---|
| 2026-08 | 467 | 23 | $5.0K / $8.3K / $13.3K |
| 2026-09 | 496 | 25 | $6.7K / $8.3K / $15.0K |
| 2026-10 | 527 | 26 | $6.7K / $8.3K / $15.0K |
The Einstein Copilot tab answers four canonical RevOps questions ("why is pipeline down," "which stage is underperforming," "where should sales focus," "which segment converts best") by reading the exact JSON payload above — a real Claude API call if a key is supplied in the sidebar (never persisted), or an honestly-labeled deterministic analyst engine if not. Same output schema either way; the "why is pipeline down" handler explicitly checks whether pipeline is actually declining before answering, so a low-volume partial month can't fool it into reporting a false decline. Full file: src/copilot/revops_copilot.py.
Two: an interactive Streamlit analytics dashboard (7 tabs — overview, funnel, forecast, attribution, ICP/segments, rep pipeline, AI copilot) and a self-contained static HTML fallback for no-install viewing. Both read the same computed JSON as the CRM UI, so nothing can ever disagree on a number.
crm-system-design.md but deliberately not activated — not enough per-rep, per-category sample size yet to trust the win-rate difference isn't noise.lifecycle.advance().Funnel, pipeline-coverage, and forecasting benchmarks, 2025–2026:
2025 B2B SaaS Funnel Benchmarks — Digital Bloom
MQL→SQL Conversion Rates by Industry (2026) — Data-Mania
Lead Conversion Rate Benchmarks 2026 — Prospeo
B2B Sales Funnel Stages: 2026 Guide — Prospeo
Pipeline Coverage Ratio — Landbase
Healthy Pipeline Coverage — Salesmotion
Pipeline Coverage Ratio — Clari
Sales Pipeline Coverage: Formula, Ratios & Forecast Impact — Forecastio
Every other demo in this portfolio (signal-engine-demo, account-brief-demo, gtm-warehouse-demo) proves out one piece of a GTM system — scoring, briefing, warehousing. This is the piece that was missing: what happens after a signal becomes a lead, all the way through to the screen a rep actually works in every day. A CRM lifecycle it can move through, funnel math that tells you where it's dying, attribution that's honest about model disagreement, a forecast that's honest about its own uncertainty, and an operational UI on top of all of it.
Or write directly: ai.adityachouhan@gmail.com