Most deal-scoring tools tell a rep a deal is "high risk." We wanted DealPulse to tell them something more useful: what usually happens to deals like this one, and what to do about it.
This is the story of what we built, the bug that was not actually a bug, and two engineering problems that were more interesting than the feature itself.
The idea
Every Salesforce org that has been running long enough already knows the answer to a question nobody asks out loud: what happens, on average, to a deal that looks like this one?
Same size band. Same deal type. History already has an opinion. We just were not reading it.
So we built a history-learning layer into DealPulse. It reconstructs how every closed deal looked at the moment it closed, avoiding look-ahead bias, aggregates those outcomes into cohorts across the whole org, and surfaces the result right on the open opportunity. A win-rate donut. A won-versus-lost split. Winners' typical time to close. A plain-English "play to win" line. All deterministic. No model to explain, no data leaving the org.
Then we rolled the same intelligence up to a manager view: apply the historical win rates to the current open pipeline, and you get sentences like "history says your open pipeline wins 49% of the time, and $3.6M sits in cohorts that historically win under 30%."
That part was straightforward. The interesting part started when the two systems disagreed with each other.
The contradiction that was not a bug
In testing, a card said "you're in a winning pattern" on a deal that was, at the same time, flagged High Risk in DealPulse's own risk panel.
Read literally, that looks broken. Two systems on the same screen, arguing.
Our first instinct was to hide one of the numbers. A product that contradicts itself does not feel confident, and confidence sells. We had the fix half-written before we stopped and asked what each number was actually counting.
One was a base rate: what usually happens to deals shaped like this one, across the entire company. The other was live health: what is happening to this specific deal, right now, this week. They were never answering the same question. We had just been reading them as if they were.
A deal that usually wins but is currently off track is not a contradiction. It is the single most valuable deal in the pipeline, because history says it should close and the signals say it will not, unless someone intervenes.
So we left both numbers on the screen and added the sentence that was missing. When the two diverge, the headline now flips to "Usually a winner, but this one's off track," with a bridge line underneath: "Deals like this win 100% of the time, yet this one is currently High Risk. That gap is your opportunity."
The harder part was making that work everywhere. Every subscriber names and colors their risk tiers differently, some run three tiers, some run five, all with their own labels. So the reconciliation logic classifies by color family, red, amber, green, never by tier name, and quotes the subscriber's own label back to them. Same code, every org, no configuration required.
The card that was blank for every sales rep
This one was caught in QA, and it was the kind of bug that makes you slightly sick, because it meant the entire feature was invisible to the exact people it was built for.
The historical aggregates are org-wide by design. Every rep should see the same company base rate, not just their own closed deals. But the object holding that data is private-sharing, and the rows are admin-owned. A rep's normal, sharing-respecting query returned nothing. Not an error. Just silence.
The fix could not be "open up sharing," because that would let a rep drill into every other rep's individual deal history, which is exactly what private sharing exists to prevent.
So we built a narrowly-scoped reader that returns only identity-free aggregate counts, no names, no record IDs, org-wide, while every other read in the feature (the deal itself, the brief) stays strictly sharing-scoped. A rep sees the company's base rate. A rep cannot see another rep's raw deals. Two different questions, two different access rules, in the same feature.
Learning from junk is worse than not learning at all
The moment you tell a system to learn from an org's own history, someone reasonably asks: what if the history is garbage?
Real orgs have cloned-then-closed deals. Same-day closes that were really data cleanup, not sales. Records nobody ever touched before marking them lost. Learn from those and every cohort number gets quietly poisoned.
We shipped a qualification gate that rejects same-day and backdated closes, deals with no stage progression, and records that were never meaningfully worked, before they ever reach the learning engine. And because a filter you cannot see is a filter you cannot trust, there is an admin screen that shows exactly which deals were excluded and why. If we are filtering your data, you get to see the filter.
What shipped, and what it changes
For a rep, the card turns a risk score into a story. Am I likely to win this, and what should I actually do next. For a manager, the dashboard turns a stack of individual deal reviews into an evidence-based read on the whole book: where is the real risk, and which deals are the highest-leverage saves, the ones that usually win but need a push right now.
Every number in both views is a traceable count from the org's own closed deals. Nothing is a black-box prediction. If a rep asks "why," the answer is always a real number of real deals, not a model's confidence score.
The pattern underneath
We keep running into the same shape of problem across DealPulse, and this feature is the clearest example yet. Two things that look like they are arguing are usually just answering different questions, and the instinct to make one of them go away is almost always the wrong instinct. The harder, more honest fix is to explain the gap instead of hiding it.
That principle, more than any single feature, is what DealPulse is actually built on.
DealPulse is in beta now, with founding teams getting full access. If deal history in your own org has an opinion nobody is reading yet, we would like to show you what it says.