Pipeline CRM
A focused B2B CRM with AI lead scoring and deal forecasting.
- Client
- B2B services firm (NDA)
- Role
- Full-stack engineer and product designer
- Year
- 2025
- Industry
- B2B services
Problem
Every rep had their own version of the pipeline
Deals lived in personal spreadsheets, notes lived in inboxes, and the weekly pipeline meeting was spent reconciling versions. Managers couldn't trust the forecast, and follow-ups slipped whenever a deal changed hands.
- Pipeline Q3 (final) (2).xlsxSales team, via spreadsheet
- Can everyone update the forecast sheet before Friday?Sales manager, via chat
- Re: Proposal — did anyone follow up?Account executive, via email
- My deals (please don't edit).xlsxAccount executive, via spreadsheet
Research
Designing around how the team actually sells
Before choosing between an off-the-shelf CRM and a custom build, I sat in on pipeline reviews and mapped the sales motion stage by stage. The heavy CRMs the team had trialled failed on setup and adoption, not on features.
What we learned
- Reps would only keep a CRM up to date if it took fewer clicks than their spreadsheet.
- Managers cared less about a score than about why a deal was hot or stalled.
- Most deal context already existed in email and calendars; it just wasn't linked to the account.
- Stages needed exit criteria, or the pipeline would drift back into opinion.
User journey
A rep's day, before and after
A composite persona built from rep interviews, following one working day.
BeforeWith the product
- 1
Plan the day
Before: Scanned the inbox and a spreadsheet to decide who to call first.
Now: Opens a Today view ranked by lead score, with the reason behind each score.
- 2
Log a call
Before: Wrote notes in a doc nobody else could find.
Now: Adds notes to the account timeline, where the email thread already sits.
- 3
Move a deal forward
Before: Updated a cell, then told the manager in chat.
Now: Drags the deal to the next stage; stage rules ask only for what that stage needs.
- 4
Follow up
Before: Relied on memory to chase deals that had gone quiet.
Now: Gets a nudge when a proposal goes unanswered or a deal stops moving.
- 5
Forecast review
Before: Spent the meeting reconciling spreadsheet versions.
Now: Walks through one shared pipeline the manager has already reviewed.
Solution
A CRM shaped around one sales motion
Contacts, companies, deals and activities in one fast interface. The pipeline enforces lightweight stage rules, every account has a single timeline, and lead scoring shows the signals behind each score instead of a bare number.
How the work flows
Switch between the old process and the one the product runs.
- 1
Lead captured with context
Forms and webhooks create the lead with its company attached.
AutomatedOwner: Zapier webhook - 2
Activity attaches itself
Gmail and Calendar sync onto the account timeline.
AutomatedOwner: Sync worker - 3
Move the deal
Drag to the next stage; stage rules prompt for required fields.
Person, in productOwner: Rep - 4
Score updates with reasons
Scoring re-runs on new activity and explains what changed.
AutomatedOwner: Scoring service - 5
Alerts where the team works
Slack alerts for stalled and won deals.
AutomatedOwner: Sync worker - 6
Review one forecast
Managers review the shared pipeline in the product.
Person, in productOwner: Manager
Architecture
One typed path from database to pixel
A React front end calls a tRPC API with types generated from the Prisma schema, so a renamed field breaks the build rather than production. Scoring runs in a separate Python service, and integration workers handle everything that talks to the outside world.
- Interface
- Service
- AI
- Data and queues
- External system
Interface
API
Data and jobs
External
Sync workers
Background workers that sync Gmail and Calendar, receive webhooks and post alerts to Slack.
Why it's built this way
All third-party traffic lives here, so an outage elsewhere never slows the app down.
Connections
UI
Faster than the spreadsheet it replaced
Adoption was the whole game. Every screen was measured against one question: is this quicker than updating a cell? Inline editing, keyboard shortcuts and saved views made the answer yes.
Development
Shipped weekly, behind flags
The team used the CRM while it was being built. Features shipped behind flags, were demoed to the sales team each week, and were switched on once the reps agreed they were faster than the old way.
Stack
- Frontend
- ReactTypeScriptTailwind CSS
- API
- tRPC
- Data
- PostgreSQLPrisma
- Scoring
- Python
- Integrations
- GmailGoogle CalendarSlackStripeZapier
AI
Lead scoring that shows its work
The scoring service turns account activity into features (how recently a prospect replied, meetings held, stakeholders involved, fit with the ideal customer profile) and produces a score with its strongest signals. Reps see the reasons next to the score, so they can act on it or push back.
Deal moves, score explains itself
- 1
Collect signals
Email replies, meetings, stage history and firmographics are turned into features per deal.
- 2
Score with an interpretable model
Trained on the team's own won and lost deals, and chosen so that each feature's contribution can be read.
- 3
Explain the score
The largest contributions become plain-language reasons, like a reply within a day or a confirmed budget.
- 4
Learn from outcomes
Closed deals feed periodic retraining, and reps can flag a score that looks wrong.
Guardrails
- Scores suggest priority. They never move deals or change ownership on their own.
- Every score is shown with its reasons, so nobody acts on an unexplained number.
- Free-text personal notes are excluded from the features the model sees.
Integration
Context flows in, alerts flow out
The CRM is only as good as the context attached to each account. Integrations bring that context in automatically and push the important changes to where the team already works.
Google Workspace
Gmail and Calendar APIs
Emails and meetings attach to the right account by domain; meetings booked from the CRM land on the rep's calendar.
Two-waySlack
Slack API
Stalled and won deal alerts in team channels, with a link back to the deal.
OutboundStripe
Webhooks
Subscription and invoice events update the customer record for expansion and renewal deals.
InboundZapier
Webhooks
Web forms and marketing tools create leads through one documented, de-duplicating endpoint.
Inbound
Performance
Instant on the surface, incremental underneath
A CRM that feels slow doesn't get updated. The interface responds immediately, and everything expensive happens incrementally in the background.
Outcome
One pipeline the whole team trusts
The spreadsheets were retired. Reps update deals as part of their work rather than as a separate chore, managers review the forecast inside the product, and every account carries its own history, so a handover no longer loses context.
What's next
Next: forecast categories and a weekly digest that summarises pipeline changes for managers.
What changed
- One shared pipeline replaced personal spreadsheets
- Managers review the forecast from the product instead of chasing updates
- Every account has a single timeline of what happened and what's next
Outcomes are described qualitatively. Client figures stay with the client.
Have a similar project?
Whether it's a workflow that still runs on email and spreadsheets or a system you need to integrate with, tell me what you're building. I reply within one business day with questions and a suggested first step.