The whitespace grid: find every cross-sell gap
Whitespace is the partner-by-offering coverage grid — every account down the side, every active offering across the top, and every empty cell a potential deal. It answers one question fast: which of my customers are missing which service?

Reading the grid
- +Covered — the company already buys this offering.
- +Gap — a customer who doesn't buy it yet. Click to start an expansion deal.
- +Discussed-but-not-sold gap — a yellow gap square carrying a red circle with a number. That number counts the support tickets and synced emails from the last 90 days that were actually about this offering, even though the customer doesn't buy it. Hover the circle for the breakdown ("2 tickets and 6 emails mentioned this in the last 90 days") and click it to see the items behind it and pitch the exact need they keep raising.
- +No data — a prospect, or a customer whose coverage hasn't computed yet.
Filters
Filter the grid by search text, owner (all, mine, unowned, or any specific account manager — every sales role gets the full people list), classification, minimum MRR (only shown where financials are visible to you), and a coverage lens — all, gaps only, or covered only. Filters apply on the server, so the grid, its per-offering penetration numbers, and CSV exports all stay in agreement.
Discussed-but-not-sold signals
Twice a week — with the Monday and Wednesday insights run — Current's AI reads each customer's recent support tickets and synced emails and works out which of your offerings they were really about. When a customer keeps raising an offering they don't buy, its gap square gets a red circle with the combined count. It reads by meaning, not keywords: "can't get my 2FA code", "set up MFA for the new hires", and "the authenticator app is broken" all count toward the same multi-factor offering. To judge context accurately it reads up to the first 2,500 characters of each part of an item — a ticket's title and its description, an email's subject and its body — rather than a short snippet, which keeps the false positives down. The count reflects what the CUSTOMER said, not what we said back: it reads only inbound emails (the ones the customer sent you) and strips the quoted reply thread and signatures first, so a topic one of your engineers raised in a reply is never miscounted as the customer asking for it. Only the last 90 days count, and only offerings the customer doesn't already buy light up — the point is to surface the conversations your engineers are having that an account executive would otherwise never see.
Click the cell to open the signal drawer: the ticket/email split, the matched tickets and emails, the offering's pitch, and a "Start an expansion deal" button. Each ticket or email shows a two-line preview; click "Show more" to expand it to the full message the AI read, so you can see exactly what the customer wrote in their own words before you reach out. The same red-circle count also appears on each company's own Growth & whitespace card, and the loudest of these gaps lead the whitespace section of a customer's Strategic Business Review. Counts appear and refresh on the twice-weekly insights run, so a brand-new customer's signals fill in after the next pass rather than instantly.

Starting an expansion deal from a gap
- 1Click any gap cellCovered cells and no-data cells aren't clickable — only real gaps open the deal dialog.
- 2Review the pre-fillThe deal name, company, and offering are already filled in; the deal is created in your expansion pipeline's first open stage with its lead source set to whitespace.
- 3SaveThe new deal appears on your pipeline immediately, ready to work like any other deal.
Targeting a campaign by offering coverage
The audience builder behind campaigns and sequences can filter directly on offering coverage — "has offering" (any/all/only) and "missing offering." That means you can build a campaign audience of exactly the companies missing one service, without ever opening the grid: for example, everyone who has your managed services agreement but doesn't yet have EDR. A prospect with no coverage data on file never matches a "has offering" filter — the filter only ever targets real gaps on real customers.
Exporting
Export the grid to CSV — either everything matching your current filters (walks every page on the server, with a running progress count) or just the rows currently loaded on screen. Columns are Company, Owner, Classification, Customer, then one column per offering marked Y (covered), gap, or blank (no data).
Managing offerings (leadership)
The columns of the grid are your offerings, and sales leadership can edit them from the Manage offerings panel (the gear on the whitespace page). The panel opens with a short note explaining exactly what your keywords match against, worded for your connected PSA. Each offering owns a short list of match phrases, and Current marks a customer covered for that offering when any of their live PSA service lines matches any of its phrases. A phrase is one of three kinds: contains (the service name includes the phrase anywhere — the usual choice), prefix (the name starts with it), or exact (the whole name matches). Everything is case-insensitive. As you type a phrase the panel shows how many of your real service names it would match, so you can see straight away whether a phrase is too broad, too narrow, or dead.
The important thing to know: phrases are matched against the service name exactly as your PSA writes it, and which field that is depends on your PSA. On Autotask it's the Service name on each active recurring contract (Contracts → Services); on ConnectWise it's the product identifier and description on each active agreement addition (Finance → Agreements → Additions); on HaloPSA it's the item name or line description on each active recurring contract line. Only active services on active recurring contracts count. Those names are usually namespaced — "Backup - Datto BCDR - S5-6…", "Managed - RMM Agent", "Security - Fortinet - FortiGate…" — so a phrase like "datto bcdr" (contains) catches the whole backup appliance family in one line; you rarely need to list individual products. Aim for the shortest phrase that groups a family without reaching into a neighbour — the live match count is there to help you check.
You don't start from a blank page. Every workspace begins with a default catalog of 29 common MSP offerings — backup and BCDR, endpoint and email security, Microsoft 365 seats and add-ons, VoIP, RMM, cloud, and more — each pre-loaded with generic starter keywords (vendor names and common product words). These are deliberately generic, so your first job is to refine them to match how your own PSA names things: rename or deactivate the offerings you don't sell, and tighten the keywords using the live match count until each column reads true. (ITPartners+ keeps its own hand-tuned catalog; only the default catalog is described here.)
- +A phrase can belong to more than one offering on purpose. A single line that delivers two things — say a combined dark-web-and-email product, or a security bundle whose parts are itemised on the contract — correctly ticks every box it covers. Current never stops you using the same phrase in two places.
- +Add or remove a phrase and that one column is rebuilt against your PSA data straight away — the grid behind the panel updates itself within a few seconds, and you'll see a brief "Rebuilding the map…" note while it works. Only the column you touched is recomputed, so editing is fast and safe even on a large book. The full overnight sync still recomputes everything as a backstop.
- +A phrase must be at least two characters and can't be only wildcards — a one-letter phrase would match nearly every service and mark everyone covered, so it's refused. (A % inside a longer phrase still works as a wildcard for anyone who wants it.)
- +Deactivating an offering removes its column from the grid immediately; reactivating it brings the column back and recomputes it. Renaming or reordering an offering doesn't change any coverage — it's just presentation.
The Email seats offering: required, because it defines your seat count
One offering in the panel is special. Current requires an offering that defines what counts as a managed email seat — it's named Email seats out of the box, or, if you already had an offering called M365 Core Seats, Current promoted that one instead, keeping its name and its existing rules. It wears a lock badge — Required · defines email seats — and it can't be deleted: the delete control is disabled, and the database refuses even a direct attempt. Everything else about it stays yours: rename it, deactivate its whitespace column, edit its rules freely.
Its rules feed more than the grid, which is why each rule on this offering is tagged with what it matches. PSA services rules (the tag is named for your provider) work exactly like every other offering's phrases and drive its whitespace column. License pools rules match your ScalePad SaaS license pools instead, and they define what counts as a managed email seat everywhere Current states one — the Strategic Business Review's seat figure, the AI section's per-person at-scale math, and the peer-comparison size bands. A rule either includes or excludes (an excludes tag marks the latter): a license pool counts when at least one include rule matches it and no exclude rule does, and the seat count is the summed licenses of the qualifying pools. License-pool rules never touch grid coverage — the grid reads only the PSA-services rules.
The default rules cover Microsoft's mailbox-bearing base licenses — Microsoft 365 / Office 365 plans, Business Basic, Standard, and Premium, and Exchange Online — with a deliberately broad exclude list (Teams and phone products, Copilot, Defender, Intune, the Power family, storage, and the other add-ons), so an add-on never double-counts a person: someone on E3 plus Teams Phone is one seat. An MSP on Google Workspace just edits the include rules to point at its own license names — no product update needed. And wherever the SBR prints the seat figure, the source label beside it is this offering's name, so a rename follows through everywhere.
