Top revenue customers with NO contact record in HubSpot, sales-team blind spot. Should be #1 import-list target.
At a glance
The list of high-revenue commerce customers who have NO matching contact record in HubSpot. Each row is a customer the merchant has billed, often repeatedly, but the sales and marketing team has never logged, never emailed, and cannot segment. The #1 import-list target. Computed as commerce.customers WHERE customer.lifetime_value >= $1k AND customer.email NOT IN hubspot.contacts.email.
| What it counts | Distinct commerce-platform customers (Shopify Customer, BigCommerce Customer, Adobe Commerce customer_entity, Stripe Customer) whose lifetime revenue exceeds the threshold and whose email does not match any HubSpot contact. Sorted descending by LTV; default top 50 surfaced, full export available. |
| Numerator (commerce) | SUM(order.total) per customer over the trailing 365 days, joined to a distinct customer-id, with email extracted. Subscription-revenue from Stripe is included where the same email appears. |
| HubSpot side check | GET /crm/v3/objects/contacts/search with email-property filter, batched. A contact is considered to exist if there is any HubSpot contact record with that email, regardless of lifecyclestage, owner, or list-membership. |
| Email-match scope | Exact-match. Gmail + aliases, mixed-case domains, and firstname.lastname variants are normalised (lower-cased) before comparison. Forwarded-inbox aliases (accounts@, purchasing@) are flagged separately because they often map to multiple humans. |
| Lifecycle-stage scope | The check is contact-existence, not lifecyclestage. A contact at subscriber stage with the matching email DOES count as “in HubSpot”, so this card surfaces only fully-missing records. The companion card hs_xc_lifecycle_first_purchase_conversion covers the in-HubSpot-but-wrong-stage pattern. |
| Currency | LTV reported in portal home currency. Multi-currency commerce platforms are normalised at order-creation FX. |
| Refunds | Subtracted from LTV. A customer who spent 3k shows $2k LTV. Customers who fall below threshold after refund are excluded. |
| Multi-portal aggregation | One card per portal. A customer in the commerce platform but missing from portal A while present in portal B counts as missing for portal A. Cross-portal contact-search is not performed because portals have independent contact namespaces. |
| Time window | 365D rolling LTV window, refreshed daily. Anchored on order creation date in the commerce platform’s timezone. |
| Alert trigger | any customer LTV >$1k missing. The threshold is configurable per portal; agencies running enterprise B2B push it to 250. |
| Roles | owner, sales, marketing. Owner sees the dollar exposure, sales gets the import list, marketing assesses the email-list growth opportunity. |
Calculation
Calculated automatically from your HubSpot data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A hybrid B2C agency client running HubSpot Sales Hub plus Shopify Plus. Reading on 14 Apr 26 over the trailing 365 days (15 Apr 25 to 14 Apr 26). Top of the missing-contacts list, top 8 of 47 surfaced:| Customer email | 365D LTV | First order | Last order | Order count |
|---|---|---|---|---|
| billing@northwindltd.com | $48,420 | 22 May 25 | 09 Apr 26 | 31 |
| accounts@harborholdings.com | $31,180 | 18 Jun 25 | 02 Apr 26 | 18 |
| purchasing@apexparts.io | $24,760 | 04 Jul 25 | 28 Mar 26 | 12 |
| j.kowalski@centrale.fr | $19,420 | 11 Aug 25 | 15 Mar 26 | 9 |
| ops@meridianstore.co.uk | $17,800 | 02 Sep 25 | 22 Mar 26 | 14 |
| info@summitgear.au | $14,230 | 19 Sep 25 | 30 Mar 26 | 11 |
| founder@tinyrocket.com | $12,940 | 05 Oct 25 | 10 Apr 26 | 7 |
| accounts.payable@blueoak.de | $11,610 | 28 Oct 25 | 05 Apr 26 | 6 |
| Bucket | Count | Aggregate LTV |
|---|---|---|
| Customers above $10k LTV missing in HubSpot | 12 | $214,800 |
| Customers 10k LTV missing in HubSpot | 35 | $128,400 |
| Total exposure (this card) | 47 | $343,200 |
- The top 4 emails are role-inboxes, not human contacts.
billing@,accounts@,purchasing@,ops@map to teams not people. The sales team can still create a HubSpot company-record and a “primary purchasing contact” placeholder, but personalised outreach needs a human-name lookup. The card flags role-inbox patterns automatically (HS09 audit). Six of twelve $10k+ entries are role-inboxes; the rest are real humans. - **51,480/year. The dollar number is the executive conversation.
- Kowalski (centrale.fr) and Blueoak (blueoak.de) signal an EU cohort. The merchant likely never enabled HubSpot’s GDPR-consent workflow on the Shopify checkout, so EU customer emails were never captured into the CRM. Audit HS10 calls this out: enable the consent-checkbox on commerce checkout and the missing-contacts trickle resolves over the next 60 days.
- The lifecycle-stage backfill lag does not affect this card. The check is “exists in HubSpot at all”, not “at the right stage”. Even mid-backfill these contacts are absent; they were never created in the first place. Compare against
hs_xc_lifecycle_first_purchase_conversionwhich IS lag-sensitive. - 10k threshold the merchant uses; alert fires. The standard alert trigger is “any customer LTV >10k. With 12 customers over the threshold, the card pages the sales lead. First action: bulk-import these 12 into HubSpot, assign each to an account-executive, run a “we have noticed your business with us” reactivation email.
Sibling cards merchants should reference together
This is the missing-contact-list card. Pair with these to size the opportunity and close the gap:| Card | Why pair it with Top Customers Without HubSpot Contact |
|---|---|
| Total Contacts | The denominator-side stock. Big missing-list relative to total contacts means the CRM has not been synced with commerce since launch; small list means a few fall-through cases. |
| Lifecycle Stage Distribution | Once the missing customers are imported, they should land at customer stage. The card tells you the post-import shape. |
| Lifecycle Stage → First Purchase Conversion | The inverse: contacts in HubSpot at customer-stage who never bought. Together both cards define the data-quality envelope of the CRM. |
| Pipeline-vs-Realised Revenue Gap | A widening missing-customers list is one cause of unrealised pipeline. Closed-won deals against contacts that exist; missing customers represent revenue that never had a deal. |
| Email-Attributed Commerce Revenue | Each missing customer is email-attribution potential not realised. Importing them and adding to a nurture flow grows email-attributed revenue. |
| Shopify Total Revenue | The commerce denominator. The missing-LTV total as % of Shopify Total Revenue is the “CRM blind-spot share”. |
| Klaviyo List Growth Rate | If a merchant runs Klaviyo for marketing-email and HubSpot for sales-CRM, the missing customers may be in Klaviyo but not HubSpot. Triangulate before importing. |
| GA4 Returning Users | The site-traffic stock. Returning-user count well above HubSpot contacts confirms the CRM is missing buyers, not that traffic is low. |
Reconciling against the vendor’s own dashboard
Where to look in HubSpot: HubSpot does not natively expose a “customers missing in HubSpot” view; it only knows what it knows. Closest individual views the merchant can compare against:
HubSpot → Contacts → Lists → Static (any custom list of lifecyclestage = customer)
HubSpot → Reports → Analytics tools → Contacts (total customer-stage count)
Shopify Admin → Customers, BigCommerce → Customers, or Stripe Dashboard → Customers (the commerce-side ground truth)
The merchant traditionally exports both lists to CSV and runs a vlookup; this card automates that nightly.
Why our number may legitimately differ from the merchant’s expectation:
| Reason | Direction | Why |
|---|---|---|
| Timezone | Boundary day off | LTV is computed in commerce-platform timezone; HubSpot portal timezone may differ. Effect is small over a 365D window. |
| List-membership refresh lag | Missing-list temporarily larger | If the merchant just bulk-imported customers via a workflow, the contacts may exist but list-refresh has not completed; the card may double-count for up to 60 minutes. |
| HubSpot lifecycle-stage backfill | No effect | This card uses contact-existence, not lifecyclestage. Backfill jobs do not change which contacts exist. |
| Email normalisation | Missing-list smaller after fix | If Lisa.Smith@example.com exists in HubSpot and lisa.smith@example.com exists in commerce, default exact-match flags as missing. Enabling lower-case-normalisation closes this fallback within the next sync. |
| Multi-portal aggregation | Missing-list larger per-portal | A customer present in portal B but missing from portal A is reported as missing for portal A. If the merchant reconciles across both portals, the consolidated number is smaller. |
| Stripe-only customers | Missing-list larger | Customers who paid via Stripe but never placed a Shopify order do appear here when Stripe is the connected commerce backend. Subscription-only buyers can look like missing customers when the merchant expects only-Shopify customers to surface. |
| Card | Expected relationship | What causes legitimate divergence |
|---|---|---|
| Shopify Total Revenue | The aggregate missing-LTV must be ≤ Shopify Total Revenue (subset relationship) | If the missing-LTV exceeds 30% of Shopify Total Revenue, the CRM is essentially disconnected from commerce; reset the contact-sync workflow. |
| Klaviyo Email-Attributed Revenue | Customers missing from HubSpot may exist in Klaviyo (marketing list); the union is the addressable email-list opportunity | HubSpot last-touch attribution and Klaviyo 5-day-click + 1-day-view attribution disagree on credit; the card here is identity-based, not attribution-based, so the missing-set is a clean union. |
| GA4 Returning Users | Returning-user count establishes there is repeat behaviour to capture | GA4 measures sessions, not buyers; treat as a directional signal that there are humans behind the missing emails. |
Known limitations / merchant FAQs
Why does Shopify show 12,400 customers but HubSpot only shows 8,200 contacts? The 4,200 gap is the broad shape of this card, but only the high-LTV slice surfaces here (default LTV >$1k). Most-common cause: a Shopify checkout that does not push contacts into HubSpot. Either the marketing-consent checkbox was never wired, or the HubSpot-Shopify sync was paused, or the contact-create webhook fails silently for non-EU consent-required orders. Audit HS09 enumerates the dollar exposure; HS10 traces the sync-failure cause. My missing-list has 12 customers above $10k, what is the priority action? Two-step playbook. Step 1: bulk-import all 12 emails into HubSpot via CSV with a “missing-customer-import” source tag. Step 2: assign each to an account-executive with a “we have noticed your business with us” outreach script. Track conversion inPipeline-vs-Realised Revenue Gap over the next 60 days; well-run reactivation outreach lifts repeat-customer LTV by 8-15%.
Vendor discrepancy with the commerce platform, who is right?
The commerce platform is right about which customers exist and what they spent. HubSpot is right about which contacts have a CRM relationship. This card is the set-difference between the two, and both sides of the difference are legitimate facts. The action is to grow HubSpot to match commerce, not to dispute the count.
List-segment lag, does it affect this card?
Yes, briefly. If the merchant just imported 200 contacts via a workflow, list-membership recalculation can take 15-60 minutes for active lists, longer for static lists. During that window the card may show contacts as missing that are actually now in HubSpot. The 24-hour refresh cadence absorbs this; intra-day spikes are normal post-import.
Lifecycle-stage definitions, what stage do imported contacts land at?
Best-practice on import: set lifecyclestage = customer with a recovered_from_missing_list source-tag. Do not start them at subscriber, the contact has already bought. Do not start them at lead, the deal is already won. Customer-stage with proper source attribution preserves the funnel-conversion math in hs_xc_lifecycle_first_purchase_conversion rather than artificially inflating top-of-funnel cohorts.
Multi-portal aggregation, does a customer in portal B count as missing in portal A?
Yes. Portal-scoped contact namespaces mean a customer recorded in portal B is irrelevant to portal A. If the merchant deliberately runs separate portals per region or per sub-brand, this is correct behaviour. If the merchant intends one consolidated CRM, treat the multi-portal architecture as a separate problem to solve and pin the parent-portal as the canonical source.
Workflow-trigger vs send-time, does this card use either?
Neither. The check is contact-existence, evaluated by crm/v3/objects/contacts/search with email filter. No workflow, no email send, no list. The simplest and least-laggy of the cross-channel HubSpot cards.
Today-volatility, why does this swing?
LTV is a 365D rolling sum, so today-volatility is low. The biggest day-to-day swings come from new customers crossing the LTV threshold (a customer at 50 today crosses $1k and joins the missing-list) or from refunds dropping a customer back below threshold. Daily swings of 5-10 customers are normal for an active commerce store with 100+ orders/day.
Action playbook on alert (any customer LTV >$1k missing):
- Open the missing-list, sort by LTV descending.
- For the top 10, check whether the email is a role-inbox (HS09 flags this) or a human; for role-inboxes, look up a human via the company website.
- Bulk-import the top 10 with full company-record context: industry, website, owner-of-record.
- Assign each to an AE for a personal reactivation outreach.
- Re-baseline the alert threshold if the merchant’s LTV distribution is much higher or lower than $1k.