The Deals in Your Forecast That Are Already Dead
The forecast call is on Thursday. On Tuesday the VP of Sales opens the pipeline report, sorts by close date, and finds eleven deals in Negotiation with a combined value of $840,000, all slated to close this quarter. She asks the obvious question: are these real?
The report cannot tell her. It can tell her that the average age in Negotiation is 34 days, that four of the eleven have slipped their close date at least once, and that two have no next step recorded. Useful, but none of it answers the question. A deal can sit in Negotiation for 34 days because legal is genuinely grinding through redlines, or because the champion left the company in June and nobody noticed. The stage field looks identical in both cases.
So she does what everyone does. She pings each rep in Slack: "Is Northwind still live?" And each rep, who is looking at the same record she is, says something like "yeah, waiting on their security review, should hear back soon." The rep is not lying. The rep genuinely believes it, because the last thing that happened on that deal was a promising call, and nothing has happened since to overwrite that memory. The absence of news feels like waiting. It is not until you look at the actual timeline that you see the last inbound email was 51 days ago, the last calendar event was the call itself, and the two follow-ups the rep sent went unanswered.
That deal is dead. It has been dead for six weeks. It is still in the forecast because deadness is not an event that anybody records.
What CRM reports actually measure
This is worth being precise about, because CRM reporting is genuinely good at a lot of things and it is easy to write an unfair caricature.
Salesforce and HubSpot both track stage history. You can build a report on days in current stage, you can flag deals that have exceeded a threshold, you can chart stage-to-stage conversion and see where deals stall in aggregate. HubSpot has deal inactivity properties. Salesforce has last activity date, and with activity capture switched on it will pull matched email and calendar items in without anyone logging them by hand. Einstein and Breeze both score deals and both will tell you a deal looks unhealthy. None of this is nothing.
Here is the limit. Every one of those measures rolls up to a single date or a single count, and none of them separates the buyer's behaviour from yours. Days in stage measures how long since a human dragged a card. Last activity date advances when a rep sends another email or logs another task, so a deal where the seller is talking into a void looks the same as a deal where the conversation is live. A rep who touches every deal on Friday afternoon to keep the hygiene dashboard green produces a pipeline that looks freshly maintained and is entirely stale.
Meanwhile the actual evidence of deadness lives in places that never make it into a field:
- The buyer replied to your last three emails and then stopped. The replies are in Gmail. The stopping is not a field anywhere.
- The mutual demo that was on the calendar for the 14th was cancelled and never rebooked. The cancellation is in Google Calendar. The never-rebooked part is an absence, and absences are not records.
- Your AE said in the deal channel on Slack, "honestly I think they went with Vendor B, their new VP came from there." That sentence is the single most predictive artifact about the deal and it exists nowhere except a Slack thread.
- The champion's email started bouncing. That is a Gmail delivery failure, not a CRM contact status.
BI tools do not close this gap either, and it is worth saying why exactly. Looker, Metabase, Power BI and the rest are built to sit on top of databases and modelled sources. Looker supports SQL dialects only. Metabase ships nineteen official drivers and every single one of them is a database. They are extremely capable at what they do, and several of them will now take a question in plain English, but a Slack thread is not a table and an unanswered email is not a row. The question "has this buyer gone quiet across every channel" is not a hard query for them. It is a question about material they are not connected to at all.
What the question actually requires joining
Write the question out properly and the shape of the answer becomes obvious. For every open deal above some value, in a stage that implies active engagement, you want to know:
| Signal | Where it lives | Why the CRM misses it |
|---|---|---|
| Last inbound message from anyone at the account | Gmail or Outlook | Activity capture logs matched messages when it is on, but the field it feeds is one date and does not distinguish "they replied" from "we sent again" |
| Last calendar event with an external attendee from that domain | Google Calendar | Meetings get logged as activities, but a meeting that was cancelled and never rebooked leaves nothing behind to log |
| Last substantive rep comment | Slack deal channel, deal notes | Free text, not a field, and the honest assessment is almost never the one typed into the CRM |
| Support or product signals | Zendesk, Intercom | Different system, different object model, often a different account identifier |
| Recorded stage and close date | Salesforce or HubSpot | This part the CRM has, and has well |
Nobody misses this join because it is intellectually hard. They miss it because there is no single place where those five sources sit next to each other, and building that place has historically meant a data engineering project: pull Gmail metadata into a warehouse, resolve email domains to CRM account IDs, get Slack messages somewhere queryable, then model it. That is weeks of work to answer a question the VP of Sales will want answered again next quarter with slightly different thresholds.
How you would actually answer it
If Gmail, Google Calendar, Slack and Salesforce are already connected to Skopx, the question is just a question. You open chat and type something close to how you would say it out loud:
"Show me every open deal over $25,000 with a close date this quarter where nobody at the account has replied on email in 45 days and there is no calendar event booked with them in the future. For each one show the deal, owner, amount, stage, days since last inbound reply, date of the last meeting that actually happened, and the most recent thing the owner said about the deal in Slack."
Skopx runs that across the connected tools rather than against a warehouse table. Gmail gives it the message timeline per domain, including direction, so "no inbound reply" means what it says rather than "no logged activity". Calendar gives it events with external attendees, past and future, so a cancelled meeting that was never rebooked shows up as a gap rather than as silence. Slack gives it the last thing a human wrote in the deal channel, which is frequently the sentence that settles the argument. Salesforce supplies the deal record, the amount, the stage and the owner. Answers come back with citations, so when a number looks wrong you can click through to the actual email thread instead of relitigating whose report is right.
You will iterate. The first pass will include three deals where the buyer is genuinely mid legal review and communicating through a shared Slack Connect channel rather than email, so you add that. You will find the 45 day threshold is too generous for transactional deals and too tight for enterprise, so you split it by amount. That iteration is the point: the question is a sentence, so changing it is editing a sentence.
When the view is right, you say "make this a page" and Skopx builds it into an internal console. It runs the same query against the same connected accounts, measures what comes back, and renders it. If you want to see how that generation step works in practice, the internal apps page walks through it.
What the console shows
The page that comes back is a diagnostic, not a verdict. Roughly:
- Four metric tiles across the top: total forecast value in the current quarter, value flagged as silent, count of flagged deals, and the median days of silence among them. The second number is the one that changes the conversation, because "we have $840,000 in Negotiation" and "$310,000 of that has heard nothing back in seven weeks" are different sentences.
- A table, one row per flagged deal, sorted by silent value descending. Deal, account, owner, amount, stage, days since last inbound, last real meeting, and the last Slack comment from the owner as a text column. That last column is doing most of the work. Reading twelve of those in a row is usually the moment the forecast gets honest.
- A bar chart of silent value grouped by owner, which is uncomfortable and useful. Not because it names bad reps, but because it usually reveals that one rep has an inherited book nobody has worked since a territory change.
- Per row, a button. One button, one action, one click by a person. Ours posts a Slack message to the deal owner with the evidence from that row attached. You could point it at a follow-up email to the buyer instead. Either way the person who clicks sees a confirmation showing exactly what will be sent and to whom before anything leaves. Nothing runs on a timer and nothing fires without that click.
That last point matters more than it sounds. The console does not change any stage in Salesforce. It does not close deals as lost, does not adjust close dates, does not touch the forecast. It reads, it puts the evidence in front of you, and it hands the decision to the person whose judgment should make it. That is the right shape anyway, because the exceptions are exactly the deals that matter: the eight-month enterprise cycle where procurement goes dark for a month, the deal being worked entirely through a partner, the buyer on parental leave who told you they would be back in September. Silence is strong evidence and it is not proof. Present it as evidence.
The honest limits
A few things this view will get wrong, and you should know them before you show it to a sales team.
Domain matching is imperfect. Buyers use personal addresses, large accounts have subsidiaries on different domains, and a deal at a holding company may correspond to four email domains. You will hand-correct some of this.
Channels move. If a deal graduates to a shared Slack Connect channel or a thread on the buyer's side that you were never in, email silence is not deal silence. Connect the channels people actually use, and treat any channel you have not connected as a known blind spot rather than pretending it does not exist.
The console reads, it does not remember. It has no store of its own, no forms, no records it keeps. Every load re-asks the connected tools, which is what keeps the numbers current and also means there is nothing on the page to annotate. If a rep's explanation of why a quiet deal is still live should stick, it has to go into the CRM, typed there by the rep, where the next person to open the record will find it.
And the whole thing depends on having connected the right accounts with the right permissions. Skopx reaches nearly 1,000 tools, but it sees only what a given user is allowed to see in each one. A rep opening this page sees their own deals and their own mailbox. That is correct behavior and it also means the leadership-level view requires leadership-level access.
Close
The forecast is not wrong because anybody lied. It is wrong because the CRM records what people do to it, and going quiet is something a buyer does elsewhere. Stage age tells you when the record was last touched. Silence across email, calendar and the deal channel tells you whether there is still a deal. Those are different questions and only one of them has a field.
Build the second view once, look at it before every forecast call, and the Thursday conversation changes from "is Northwind still live" to "Northwind has heard nothing in 51 days and Priya said in the channel that their new VP came from Vendor B, so what do we want to do." That is a better meeting.
Skopx Team
The Skopx engineering and product team