Worked exampleSoftware services · 650 people · Salesforce + HubSpotSample CRM export, 30 September 2026
A $29M pipeline, and the one stage where it stalled
This is a worked example on sample data. We ran a sales pipeline audit on a CRM export built to look like the real thing: a 650-person software-services firm, 156 opportunities and 420 leads over twelve months. The open pipeline said $29 million. At the firm’s own win rate it was worth about $6.6 million, and most of what was stuck sat in a single stage.
Pipeline auditPipeline hygienePresales capacityLead routingSalesforce data model
The setup
The firm builds custom software for US mid-market companies, with nearshore engineering teams. Deals run from $60,000 to $850,000 and take three to five months. Six account executives, three SDRs and two presales architects; Salesforce for the pipeline, HubSpot for marketing, synced across.
Each of those roles described the problem from its own chair. The head of sales said the pipeline was roughly three times the quarter’s target, the team kept missing it anyway, and nobody could say which deals were real. Presales kept getting pulled into deals nobody had qualified, with requirements arriving as a Slack thread. Demo requests sat in a shared SDR queue that some days nobody picked up. Marketing reported MQLs up 40% on the year and heard only that they were junk, and the AEs were writing every call summary twice, once in Salesforce and once in Slack for presales.
All we had was the export: one file of leads and one of opportunities. No account records, no contacts, no stage history. We worked from what was there and wrote down what was missing.
What the audit surfaced
1. $29 million on paper, about $6.6 million in reality
Of the 80 open deals, 32 had an expected close date that had already passed, $9.8 million between them. The median one was 130 days overdue and 21 were more than 90 days past, with nobody moving the date or closing the deal.
We ran four plain checks on every open deal: recent activity, a close date still ahead, a sensible time in its stage, and presales on it once it had left Discovery. Twenty-two deals passed all four, $9.1 million, or 31% of the pipeline. Losing deals stayed open for about 102 days, the same as winning ones, so nothing was being disqualified early either. The forecast added live deals and dead ones together, the pattern behind why a B2B sales forecast is always wrong.
2. One stage was holding everything up
Solutioning, where presales scopes the work and builds the estimate, held 43 deals and $15.9 million, 55% of the open pipeline. Deals sat there for a median of 36 days, against 14 to 17.5 in every other stage. Of the 17 open deals with no activity for 30 days or more, 16 were in Solutioning.
Median days in the current stage, open deals
Discovery19 deals, $6.7M14 daysnone quiet 30+ days
Solutioning43 deals, $15.9M36 days16 quiet 30+ days
Proposal14 deals, $4.8M17.5 days1 quiet 30+ days
Negotiation4 deals, $1.7M16 daysnone quiet 30+ days
Bars show the median days open deals had sat in their current stage; the line under each value counts deals with no logged activity for 30 days or more. Sample CRM export, 80 open deals, 30 September 2026.
Having an architect on the deal did not make it faster: 35.6 days with presales, 36.3 without. Two architects were carrying 56 open deals between them, and the number of new deals flagged for presales went from 20 in the second quarter to 36 in the third. Our read is that AEs hand the deal over and stop logging while the estimate gets built, so the CRM shows a deal going quiet. Without stage history that stays a hypothesis, and it would be the first thing we checked in Gong and the presales request dates.
3. Presales came in before anyone qualified the deal
Thirty-two deals got a presales architect before discovery was complete, and 16 of those were already lost. On each account’s first deal the gap was wide. Where discovery was done and presales stayed out, 11 of 22 closed deals were won; with presales and no discovery, 2 of 17. Those are small numbers, so we treat the gap as a direction.
“No decision” was the biggest loss reason, 24 of 55 lost deals and $9.05 million, and 22 of those 24 had presales time on them. Discovery completed was a yes/no box with nothing behind it, which meant a “yes” proved very little, and the architects spent much of their time scoping work for buyers who never reached a decision.
4. Inbound leaked before anyone called
Demo requests that got a first touch within a day became opportunities 12 times out of 17. Those touched later, or never, converted twice out of 30. Some of that is hotter leads getting called sooner, but the median wait for a first touch was 35 hours, and four demo requests had no owner at all.
Behind them sat 85 open leads that nobody had contacted, a median of 225 days old, 44 with no owner. Most were content downloads and event leads that looked nothing like the leads that converted. Nine were demo or chat requests from a business email address, and twelve sat at companies that already had a deal in the CRM, two of them existing customers.
The MQL flag did not help anyone sort them. MQLs became opportunities 8.0% of the time and non-MQLs 10.1%, and 61 of the 62 leads with a free email address were MQLs. Marketing’s question about which leads were junk had an answer in the data, but no disqualification reason was ever recorded, so nothing carried that answer back.
5. The data model underneath
Only 6 of the 21 won deals traced back to a lead created before them. Fifty-nine per cent of opportunities matched no lead at all, and where they did, the opportunity’s source agreed with the lead’s only 56% of the time. With no account or contact records in the export, industry and headcount were typed again on each opportunity, and on 27 of 53 matched pairs the headcount disagreed with the lead.
In a standard Salesforce setup, converting a lead creates the account, the contact and the opportunity together and links them, with a contact role on the deal. Here most opportunities look to have been opened by hand, which is why attribution, ownership and the AE’s call notes had no consistent place to live, the same gap we keep meeting in CRM audits.
The numbers, side by side
Everything below comes from the two export files, measured to the export date. Win rates rest on 21 won and 55 lost deals, which is a small base for any rate.
Measure
What the CRM showed
What the audit found
Basis
Open pipeline
$29.07M
about $6.6M
historical win rate by value, 22.6%
Open deals with a close date still ahead
80 deals
48 deals
32 past due, median 130 days
Pipeline passing four basic checks
-
$9.1M, 22 deals
activity, close date, time in stage, presales
Where the quiet deals sat
-
16 of 17 in Solutioning
no activity for 30+ days
Open deals per presales architect
2 architects
about 28 each
56 open deals with presales
Late-stage pipeline at risk
$6.49M in Proposal and Negotiation
$2.38M stalled or on watch
overdue, quiet or stuck in stage
Demo requests converted
47 requests
12 of 17 called within a day; 2 of 30 called later or never
lead status
Open leads never contacted
-
85, 44 with no owner
no first touch recorded
Won deals traceable to an earlier lead
21 won
6
company-name match
What we built
A deal-health scorer that runs on the same two files. Every open deal starts at 100 and loses points for each rule it breaks: a past close date, weeks without activity, too long in its stage, a missing mandatory field for that stage, presales brought in before discovery. The rules live in one settings file, so changing a threshold during a pipeline meeting takes seconds and the scores update with it.
On this export it put 48% of the open pipeline in Healthy, 30% in Watch, and $6.4 million across 21 deals At risk. Only 49% of open deals carried the mandatory fields for their stage.
Each AE gets a short private list for the week: two or three fixes, and where they stand against the team on the same checks. The head of sales gets the team view and a log that records every run, so the 30-day check (past-due deals, quiet deals, deals meeting the minimums, days in Solutioning) is set up from the first day.
What we would do first
Make the pipeline honest. A validation rule on close dates, an alert after 21 days without activity, the health score on every opportunity, and a 30-minute review every Monday. About two weeks of work.
Then put a gate in front of presales, which is where most of the money is. Discovery fields that hold an answer instead of a tick, required before a deal can move to Solutioning, and presales added through a request queue with a turnaround target. Three to four weeks. Inbound speed runs alongside it: demo requests routed round-robin to named SDRs with a one-hour alert, free-email leads taken out of the MQL count, and a disqualification reason synced back to HubSpot so marketing learns which leads fail and why.
We would leave the channel mix alone, events included. There was no campaign cost in the data and the source field agreed with the lead only about half the time, so any budget call would have been a guess. Our GTM audit follows the same order on a live CRM.
What the export could not tell us
There was no stage history, so time in the current stage stood in for velocity, and nothing showed whether the Discovery deals opened months ago had moved backwards. No presales request dates either, which left the two-week estimate turnaround as something the team reported rather than something we measured. Nothing came across from HubSpot, so its scoring rules, lifecycle dates and campaign spend were all out of reach. Each of those is one field or one export away, and each would be the first request on a real engagement.