Yes, you could run the report.
It is the first thing anyone says about whitespace, and it is a fair question. Your CRM can tell you which accounts do not own a given product. So we counted what it actually takes to get from that to a ranked list of every gap in your base. For a twelve-product catalogue it is 16 reports, and they still cannot be sorted against each other.
Absence is not the hard part. Your CRM handles it natively.
You may have been told that a CRM only records what happened and cannot show you what is missing. That is not true, and it is worth correcting. Salesforce cross filters express WITHOUT against a related object. “Accounts without Assets where Product = Advanced Threat Monitoring” is a supported, ordinary report, and a competent admin will build it in five minutes.
If your question is about one product, a report is the right tool and you should use it. We are not going to sell you software for something you already own.
Three documented limits, and the third is the one that hurts.
These are Salesforce’s own published constraints on cross filters, not our opinion of them.
| Limit | Value | What it means for whitespace |
|---|---|---|
| Cross filters per report | 3 | A hypothesis spanning more than three related-object conditions cannot be written as one report at all. |
| Sub-filters per cross filter | 5 | Caps how finely each absence condition can be qualified. |
| Filter logic on cross filters | None | Cross filters are ANDed. "Missing Analytics Pro OR Custom Reporting" cannot be expressed, and that is an ordinary commercial question. |
The third limit is the practical killer. Cross filters are joined with AND and take no filter logic, so a question as plain as “mid-market accounts missing Analytics Pro or Custom Reporting” does not decompose into one report. It becomes two, and now you have two lists that overlap and cannot be added up.
A gap has no row, so it has nothing to sort by.
Reports are rows over records that exist. There is no record anywhere in your CRM that says “Oakfield Construction is missing Analytics Pro”. That absence therefore has no value field, no priority, no owner, no status and no history.
Which means you cannot rank it. Ten absence reports give you ten lists that cannot be merged or ordered by what they are worth, and the commercial question was never “who is missing this?” It was “which ten accounts should someone call on Monday, and why?” Raising the cross-filter cap from three to thirty would not change that. The object model still has nothing to rank.
15 accounts, 12 products, 137 gaps.
This is the worked example that ships inside Verdacre: a multi-product B2B base of 15 accounts against a 12-product catalogue. Every square below is one account against one product. Lit means they own it.
Four commercial hypotheses run against that base (enterprise accounts with no security product, mid-market accounts without the analytics upgrade, anyone without priority support, SMB accounts not yet integrated) generate 22 ranked opportunities worth £95,500, each carrying the evidence for why it fired.
12 absence reports, one per product, plus 4 for the segment-qualified hypotheses. Produces 16 separate lists that cannot be ranked against each other, with no value on any row.
One ranked list. 22 opportunities, £95,500 identified, sorted by value, each with the evidence attached and a status you can work.
We publish 16 as a floor, and it flatters the CRM in three ways worth admitting. Three of the four hypotheses name a single product, so they stay cheap; one of them is an OR that cross filters cannot express at all, so its “one report” is a simplification; and all 16 still produce unrankable lists rather than one ordered one.
Scale it and the arithmetic is the point: a 40-product catalogue with six segment-qualified hypotheses is 240 product-by-segment questions. That is multiplication on a realistic catalogue rather than a measurement of anyone’s org, and you can check it in your head. Nobody builds 240 reports. Nobody maintains them either, which is the more expensive half.
Every report above assumed your CRM knows what people own.
It probably does not. The Asset object is standard and largely unused in smaller orgs. Where product ownership is recorded at all, it usually lives on closed-won opportunity line items, which conflate sold once with owns now and say nothing about what has since lapsed. Anything sold before you adopted the CRM, or transacted outside it, is simply not there.
A report inherits that. It cannot tell you about a gap it cannot see, and it will report a customer as missing a product they have been paying for since 2019.
Verdacre reads ownership from your invoices. What a customer actually pays for is a fact in your accounting system: current, complete, and independent of whether anyone updated a record. That is the part a better report cannot fix, because fixing it is a data project larger than the thing you were trying to avoid buying.
It is a development project, and a decent one.
To match this natively you need gaps to become records: a custom object with value, status, owner and evidence; a configuration object so the hypotheses are data rather than hardcoded; scheduled batch jobs to generate the gaps and, just as importantly, to close the ones that have since been filled; percentile banding so priority means something across the base; and a screen to work the list on.
Then the data engineering to populate ownership in the first place.
Estimate: four to eight weeks, £15,000 to £40,000 at UK consulting rates. That is an estimate from having built this kind of thing, not a quote, and your org will move it either way. After which it is yours: bespoke, unversioned, and maintained by whoever is still there next year.
Find out what is in your base before you build anything.
You do not have to decide between a report and a build to know whether the revenue is there. Point Verdacre at your customers, your catalogue and what each account already buys, and you get the ranked list back. If the number is small, you have learned that cheaply and you should stop.
No signup, no upload. Verdacre builds the named list when you are ready for it. Our other research is here, including what UK MSP clients actually buy.
what one run answers
- 137 gaps across 180 account-product combinations.
- None of the 16 lists can be ranked against each other.
- Ownership read from invoices, not from data entry.
How this was done, and where it is weak.
- The worked example is our own sample data, the one that ships inside the product, not a customer’s base. It demonstrates the shape of the arithmetic. It is not a market finding and we are not presenting it as one.
- Platform limits verified 2026-07-25. Three cross filters per report, five sub-filters per cross filter, no filter logic on cross filters. Salesforce’s help page is JavaScript-rendered and could not be read as text, so the figures come from its indexed summary and are independently confirmed by Salesforce Ben, which states both limits verbatim.
- Report counts depend on decomposition. A determined admin could consolidate some sweeps into matrix reports and cut the number. They still could not rank across them, which is why the argument here rests on rankability rather than on the count.
- The 240 figure is arithmetic, not a measurement. Forty products times six segment-qualified hypotheses. No real org was counted to produce it.
- The build estimate is one practitioner’s judgement. No second quote was obtained, and a simpler org would land under it.
- We have not tested every CRM. This is written against Salesforce because it is the most capable of them at this. A less capable CRM does not make the case stronger in any way we would want to rely on.
If you think a figure here is wrong, write to hello@verdacre.co.uk and we will correct it and say that we did.