Sales Pipeline Audit · System 01 · what the CRM actually recorded
The CRM Shows What Changed, Not What Happened
A stage moves in a CRM for one of two reasons: the buyer genuinely advanced, or somebody edited the record. A rep drags a deal forward to keep it off a stalled-deal report. A backlog of updates gets entered on a Friday afternoon, dated for whenever felt right. A deal skips straight from discovery to proposal because typing three intermediate stages felt like paperwork nobody was going to read. Every one of those looks identical to real progress in a stage-by-stage report.
The idea in one line: build a deal-by-deal ledger from what the system actually captured, flag the parts a rep’s habits could have produced instead of the buyer, and treat anything you can’t corroborate as a question rather than a fact.
What your CRM already has
All three of the common small-business CRMs can produce a usable deal-transition dataset. None of them hand it to you clean.
LastStageChangeDate is native. A usable dataset still needs configuration: required close and loss fields, a consistent stage list, and report design.Whichever one you run on, the underlying fact doesn’t change. A timestamp on a stage tells you when the CRM record changed. It does not, on its own, tell you when the buyer moved — and the gap between those two things is where most pipeline reporting goes wrong before the analysis even starts.
Six ways the record misleads you
None of these are malicious. Every one of them is a rep doing their job under time pressure, in a system that was never going to notice.
Build the deal ledger
One row per deal, at the transition grain, is the dataset the rest of this audit runs on. Export or reconstruct these fields.
Reconstructing this by hand, deal by deal, is slow and exactly the kind of pattern-matching an AI assistant is fast at — as long as you keep it extracting rather than concluding:
Export whatever stage-history or activity report your CRM will give you, and send it in one chat with these two messages in order. The second is where most of the value is: it asks the assistant to flag what the export can’t support, rather than filling the gap with a guess.
- “Here’s a stage-history export from my CRM. Turn it into one row per deal: current stage, every transition with its timestamp, re-entry count, last and next activity dates, and loss reason if closed lost. Don’t interpret it yet.”
- “For each deal, flag anything the data can’t confirm: a stage skipped on the way to where it is now, a transition that happened right after a long gap with no logged activity, or a loss reason that’s blank or generic. List those separately from the deals where the record looks clean.”
Set a stall threshold that isn’t one number for everything
“Stalled” only means something relative to how this kind of deal usually moves.
A two-week silence is nothing on a quarterly enterprise procurement cycle and a genuine warning sign on a self-serve SMB deal that usually closes in ten days. Set the threshold per segment, not once for the whole pipeline: open, no future task, no qualifying customer activity inside the segment’s normal gap, and stage age above that segment’s typical time-in-stage. HubSpot’s native stalled flag uses a comparable idea — time in stage running meaningfully longer than that owner’s own closed-won average for the same stage — which is a reasonable default if you don’t want to build the segments yourself yet.
A worked example
A 14-person B2B services firm runs its pipeline in HubSpot and believes its close rate has been slipping. The property-history export covers the last two quarters and 61 deals.
Reconstructed at the transition grain, three things show up that the summary funnel report never surfaced:
What the ledger found
- 9 of 61 deals skip “Needs Analysis” entirely, jumping from Discovery straight to Proposal — all 9 belong to the same rep.
- 14 deals sit in “Proposal Sent” with no future task and no customer activity in over three weeks, well past this segment’s 9-day median.
- 22 of the 31 deals marked Closed Lost this period have “Other” as the loss reason, with no free-text note.
What that changes
- The skip pattern isn’t a broken funnel stage — it’s one rep’s habit, worth a five-minute conversation rather than a process redesign.
- 14 stalled Proposal-stage deals is the actual finding worth sizing: real pipeline value sitting with nobody assigned to move it.
- A loss-reason field that’s 70% “Other” means the “why are we losing” question this audit was supposed to answer can’t be answered yet — so fixing that field becomes the first item on the list.
None of that was visible in the close-rate trend line the firm started with. The trend line said “something is worse.” The ledger said where, and separated a coaching conversation from a genuine backlog from a data-quality problem — three different things that a single percentage had been flattening into one.
Once you have a ledger you trust and a stalled flag that fits the segment, you have a list of deals worth a second look and a question mark next to the ones you can’t yet trust. What you don’t have yet is a reason for each one. System 02 covers the recurring shapes a stalled deal takes, and how to tell a coaching conversation from a genuine process problem.
