Skip to content
Back to Resources
Guide

Which emailed commitments never made it into an opportunity

Skopx Team
August 5, 2026
11 min read

It is the second Tuesday of the quarter and the pipeline review is at four. The VP of Sales has two windows open. On the left, Salesforce: the Opportunities list view, filtered to this quarter, close date ascending, forty-one records, total $2.1M weighted. On the right, a shared inbox view in Gmail, because the CRO forwarded a thread that morning with three words at the top: "was this logged?"

The thread is from a customer's procurement lead. Halfway down, past two rounds of scheduling, there is a sentence: "We can commit to the 60-seat expansion once the security review closes, target end of month." The rep replied, thanked them, said he would send updated pricing. That was eleven days ago.

There is no opportunity for a 60-seat expansion on that account. There is a renewal opportunity at the existing seat count, close date the last day of the quarter, stage Negotiation, amount unchanged since it was created in March.

So the VP asks the question that sends someone into a spreadsheet for the rest of the afternoon: how many more of these are there? Not "how is pipeline tracking." Specifically: which commitments did a customer put in writing to one of my reps in the last ninety days that never turned into a record in Salesforce?

What Gmail shows on its own

Gmail is a very good search engine over a very large pile of text. Someone with delegated access, or a Google Workspace admin running a search across mailboxes, can narrow hard: from:*@customerdomain.com after:2026/05/01 "commit". Advanced search will scope by sender, recipient, date range, attachment, label, and thread. Workspace admins get more: the Investigation Tool in Security Center can search across every user's mail by content and export the results.

That gets you a list of messages. What it does not get you is any of the following, and the reason is the same each time.

Gmail does not know which of those messages relates to a customer that has an open opportunity, because Gmail has no concept of an opportunity. It does not know the account owner, only the mailbox the message sat in, which is often a different person, and often several people on a thread. It does not know whether "commit to the 60-seat expansion" is a commitment or a hypothetical, because that is a reading, not a field.

Most of all: Gmail cannot tell you what is missing somewhere else. Absence is not a property of an inbox. The whole question is about a thing that does not exist in a system Gmail cannot see.

The Gmail add-on for Salesforce, and Einstein Activity Capture, do close part of this. They log emails against contacts and accounts, so the message shows up on the record's activity timeline. That is real and useful. But it is a filing operation. It attaches the email to the account. It does not read the email and ask whether its contents are represented in the pipeline.

What Salesforce shows on its own

Salesforce is exact about what it holds. A report on Opportunities with a filter on Created Date, Stage, Amount, and Close Date will tell you precisely what pipeline exists, who owns it, and how it changed. Field history tracking will tell you the amount moved from $84,000 to $84,000 zero times. Reports on Opportunities with Activities will show which opportunities have had no logged activity in thirty days. Einstein Conversation Insights will surface keywords across calls, and Einstein Opportunity Scoring will flag records that look unlikely to close.

Every one of those starts from a record that exists.

Point Salesforce at the 60-seat expansion and it has nothing to say, because there is no 60-seat expansion in Salesforce. You cannot report on the absence of a row. A stale-pipeline report finds opportunities that stopped moving. It cannot find opportunities that were never created, because the input to every report is the object table, and the thing you are looking for is not in it.

Even with Activity Capture running and the email sitting on the account timeline, the report sees an Activity record with a subject line and a related account. The sentence about 60 seats is body text in a field nobody filters on and no formula can interpret.

Why the gap is structural

Lay the two halves side by side and the shape of the problem is not subtle.

Salesforce sideGmail side
Evidence isa record with typed fieldsa sentence somebody wrote
Created bya rep filling in a forma customer, in their own words
Queryable byfilter, group, rollupkeyword match
Answerswhat we decided to trackwhat was actually said
Missing thing shows up asnothing at alla message with no consequence

The commitment lives on the right. The pipeline lives on the left. To find commitments with no pipeline you have to hold both at once, and the join is not a key match. It is a judgement about whether one paragraph of prose is represented by one row of structured data.

This is worth being precise about, because it is tempting to file it as a missing feature. It is not. Salesforce reporting operates over the object model, and the object model is the set of things somebody chose to record. Gmail search operates over message text, and message text has no schema. Neither product is failing at its job. The question sits in the space between two correctly designed systems, and that space belongs to no product by default.

It is also why the usual suspects do not close it. An automation platform like Zapier or Make is trigger based: an email arrives, a rule fires, a task gets created. That is genuinely useful going forward, and if you want commitments captured from today onward, build that. But a trigger cannot answer a question about the last ninety days, because the last ninety days already happened and nothing fired. A BI tool, Power BI with Copilot or Looker with Conversational Analytics, connects to your Salesforce data and answers questions about it in plain language, well. Its input is modelled data. The sentence in the thread is not in the model and was never going to be. It is not that the query is too hard. The evidence is outside the boundary of what the tool can see.

What the join actually requires

Two things, and only one of them is mechanical.

The key. Email domain to Account. Every customer message carries a sender domain, and every Account carries a website or a set of contact email addresses. That mapping gets you from a thread to an account, and from the account to its opportunities, their stages, amounts, and close dates. Contact email match is more precise where it exists; domain match catches the procurement lead who was never added as a contact. Neither is perfect. Gmail and consultancies and anyone on a shared domain will need handling.

The judgement. This is the part that has never been automatable by matching, and it is the actual work. Given the thread and the account's current opportunities, is the thing described in the email represented? A message saying "we would need to see pricing for more seats eventually" is not a commitment. A message saying "we can commit to the 60-seat expansion once security closes" is. A message saying "yes, approved, send the paperwork" against an opportunity already at Negotiation for that exact amount is represented, and should not be flagged.

That is reading. It requires understanding what the sentence means, what the opportunity record covers, and whether one is the other. No amount of keyword matching gets there, because the words that signal a commitment are different in every thread, and "commit" appears constantly in messages that commit to nothing.

How you would answer it with Skopx

Skopx connects to nearly 1,000 tools, Gmail and Salesforce among them, and it reads across them in one pass. The question goes in chat as a question:

Look at customer emails from the last 90 days across the sales team's mailboxes. For each thread where the customer states a commitment, an expansion, a renewal, a specific quantity or a timeline, find the matching Salesforce account by email domain and check whether there is an open opportunity that covers it. Show me the ones with no matching opportunity, with the sentence from the email and the account owner.

What comes back is a list with citations: the account, the rep, the exact sentence, the link to the Gmail thread, and the opportunities that do exist on that account so you can see for yourself why none of them covers it. The citation matters more than usual here, because every row is a claim that somebody missed something, and the person named will want to read the email themselves.

Once you have run that a few times and trust the shape of the answer, you can ask for it as a standing view. Typing "make me a console for uncovered commitments" in chat produces an internal app: the flagged threads grouped by account owner, sorted by the age of the email, each row expandable to the quoted sentence and the current opportunities on that account. It reads from both systems live, so it is current when you open it before the pipeline review rather than current as of a spreadsheet somebody exported on Friday.

The console can also act. A row can carry a button that creates the opportunity in Salesforce, prefilled from what the email said, which the rep clicks after reading and confirming. One click, one confirmation, one record. That is the only write in the whole thing.

Honest limits

This does not watch your inbox. It runs when you ask it to, or when you open the console. There is no trigger firing on message arrival, no alert at 8am, no scheduled digest. If you want commitments caught at the moment they arrive, that is a different tool and you should use one.

It does not store anything. There is no table of flagged commitments accumulating over time, no status field, no way to mark one as reviewed and have that stick. Each run is a fresh read of what Gmail and Salesforce currently hold. If you need to track what you did about each flag, that belongs in Salesforce, which is exactly where the button puts it.

It will be wrong sometimes, in both directions. It will flag a thread where the commitment is covered by an opportunity whose name does not make that obvious, and it will miss a commitment phrased so obliquely that a person reading it would also have to ask. Treat the output as a reading list, not a verdict. Every row links to the source email so you can disagree in ten seconds.

It depends on your mail actually being reachable. Answering this across a team means Skopx needs access to those mailboxes, through the connected accounts of the people whose mail is in scope. Commitments made in Slack DMs, on calls, or in a text message are not in Gmail and will not appear.

And it will not fix the underlying habit. Reps skip logging things because logging is friction, and a report that surfaces the misses is a symptom check, not a cure. What it does buy you is the ninety days of already-missed commitments that no report in either system was ever going to find, and the answer arrives before four o'clock instead of after.

Share this article

Skopx Team

The Skopx engineering and product team

Related Articles

Stay Updated

Get the latest insights on AI-powered code intelligence delivered to your inbox.