• Pillar 1, one API for every ICP attribute: one API covers firmographics, technographics, funding, workforce trends, and 18 buying-signal categories with 80+ signal types, so every ICP clause is testable.
    • Pillar 2, built for scale: bulk enrichment handles up to 1,000 entities per call at 100 QPS with 97.8%+ company match accuracy, so a 100-deal retrospective is 3-4 API calls.
    • Pillar 3, affordable by design: free account, no sales call, and a unified credit pool across every endpoint, cutting enrichment spend 30-60% versus per-endpoint or per-seat pricing.
    • The method: export 50-100 won and lost deals, enrich both, score against your ICP, and rewrite around what separates wins from losses.
    • The threshold: under 60% of wins matching your ICP, or losses matching within 20 points of wins, means the ICP is not discriminating.
    • Get started: create a free Explorium account and enrich your first 100 records free, no subscription required.

    To validate your ICP against closed-won data, run a retrospective test: export your last 50-100 closed-won and closed-lost deals, enrich them with the attributes your ideal customer profile (ICP) is written in, and score both sets against your current criteria. Validating your ICP against closed-won data matters because 68% of B2B companies have not clearly defined their ICP, and most that do wrote it in an offsite and never tested it.

    Outbound, lead scoring, and AI SDR agents all amplify a wrong ICP. And the blocker is rarely the analysis: CRM records lack the fields the ICP is defined in, which is why data enrichment is the prerequisite step every guide skips.

    The pipeline: export, match, enrich, score, diagnose, rewrite.

    What Does Validating an ICP Against Closed-Won Data Actually Prove?

    Retrospective validation replaces the hypothesis “these are our best-fit customers” with a measurable test: do your ICP attributes appear in deals you won and not deals you lost? An ICP that matches wins and losses at the same rate describes your market, not your ideal customer.

    ❌ Why Offsite ICPs Fail RevOps Teams

    • They come from founder intuition and 3-4 memorable logos, not the full closed-won population.
    • They read like “mid-market SaaS in North America,” which fits thousands of accounts you will never close.
    • They use attributes (revenue band, tech stack, hiring velocity) that exist nowhere in the CRM, so nobody can check them.
    • They are never revisited as product and market shift underneath them.
    “We’re all convinced that our ICP definition is the right one. Until the data tells us it isn’t.” Tim Hillison, via LinkedIn

    ✅ What a Retrospective Test Proves

    • Which attributes appear in 60%+ of wins and under 40% of losses: your real qualifying criteria.
    • Which attributes appear equally in both sets: market descriptors to delete from the ICP.
    • Whether your ICP would have predicted your own revenue.
    Six-step pipeline to validate your ICP against closed-won data: export, match, enrich, score, diagnose, rewrite

    What Data Do You Need Before You Can Test an ICP Retrospectively?

    You need three things: a deal export with outcomes, a company identifier per account (name plus domain), and the enriched attributes your ICP is written in. Your CRM has the first two. It almost never has the third, which is where teams stall when comparing B2B data providers.

    📊 The ICP Attribute Matrix

    Attribute classExample fieldsLives in your CRM?Explorium endpoint
    Firmographicsyearly_revenue_range, number_of_employees_range, naics, country_nameRarely, and stale/v1/businesses/firmographics/enrich
    TechnographicsCloud stack, CRM in use, analytics toolingAlmost neverTechnographics enrichment
    Funding and financialsLast round, total raised, acquisitionsNoFunding and acquisitions enrichment
    Workforce trendsHeadcount growth, hiring by departmentNoWorkforce trends enrichment
    Buying signals18 categories, 80+ signal typesNoBusiness events endpoints

    ⚠️ The CRM Gap Nobody Mentions

    A typical closed-won export looks like this:

    account_name,domain,stage,amount,closed_date
    Acme Robotics,acmerobotics.com,closed_won,48000,2026-03-14
    Northline Freight,northline.io,closed_lost,52000,2026-02-02
    Beacon Health,beaconhealth.com,closed_won,61000,2026-04-08

    Nothing here tests a clause like “500-2,000 employees, $50M-$250M revenue, cloud-native stack.” Enrichment is the validation prerequisite.

    How Many Closed-Won and Closed-Lost Deals Make the Analysis Meaningful?

    Pull 50-100 closed-won deals from the last 12-18 months, with 50 as the statistical floor and 90+ as the recommended sample, plus a comparable closed-lost set. Below 50 wins, single outliers distort every percentage.

    🔑 Sample Rules That Keep the Test Honest

    • Window: 12-18 months. Older deals reflect a product and price point you no longer sell.
    • Include every win in the window. Cherry-picking recreates the offsite bias.
    • Segment closed-lost by reason: fit losses form the control group; flag or exclude price and timing losses.
    • Keep win and loss sets similar in size so percentages compare cleanly.

    ⚠️ Survivorship Bias: Why Closed-Lost Is the Control Group

    Analyzing wins alone tells you who you sold to. The closed-lost control group converts a description into a test.

    • Wins-only analysis inflates attributes shared by your entire pipeline.
    • Fit losses reveal which “ideal” accounts consistently reject you.
    • The metric that matters is the win-loss match-rate gap, not either rate alone.

    How Do You Enrich Historical CRM Accounts With Firmographics, Technographics, and Signals?

    The Explorium API is the fastest path because it wins on three pillars: one API covers every attribute class an ICP is written in, bulk endpoints process up to 1,000 entities per call at 100 QPS, and a free account with a unified credit pool keeps the whole retrospective cheap.

    🔑 Pillar 1: One API for Every ICP Attribute

    • 150M+ company profiles and 800M+ people profiles from 50+ data sources.
    • Firmographics enrichment returns the exact fields ICPs are written in: naics, sic_code, yearly_revenue_range, number_of_employees_range, country_name.
    • Technographics, funding_and_acquisitions, and workforce_trends cover what your CRM lacks.
    • 18 buying-signal categories with 80+ signal types test clauses like “hiring in data engineering.”

    🚀 Pillar 2: Built for Scale

    • Bulk enrichment accepts up to 1,000 entities per call, so a 100-deal analysis is 3-4 calls total.
    • 100 QPS sustained throughput and 99.999% uptime keep the run under a minute.
    • 97.8%+ company match accuracy means messy CRM names still resolve to the right company.

    💰 Pillar 3: Affordable by Design

    • Free account, no sales call, first API call in minutes.
    • One unified credit pool across every endpoint: no per-endpoint allocation, no seat tax.
    • Unified pooling cuts enrichment spend 30-60% versus per-endpoint or per-seat alternatives.
    “Instead of connecting to multiple data sources and APIs, we only require one connection, Explorium!” Verified G2 reviewer, Mid-Market, via G2

    ⚡ Step 1: Match CRM Records to a business_id

    POST /v1/businesses/match resolves each name/domain pair to a 32-character business_id, up to 50 businesses per request:

    curl -X POST https://api.explorium.ai/v1/businesses/match \
      -H "API_KEY: $EXPLORIUM_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"businesses_to_match": [
            {"name": "Acme Robotics", "domain": "acmerobotics.com"},
            {"name": "Northline Freight", "domain": "northline.io"}
          ]}'

    🔄 Step 2: Bulk-Enrich Wins and Losses Together

    import requests
    
    ids = wins_ids + losses_ids  # up to 1,000 per call
    resp = requests.post(
        "https://api.explorium.ai/v1/businesses/firmographics/bulk_enrich",
        headers={"API_KEY": API_KEY},
        json={"business_ids": ids},
    )
    rows = resp.json()  # enriched attribute columns

    Repeat for technographics and workforce trends. Choosing a source? Run a side-by-side B2B data provider comparison on your 50-deal sample first.

    Ready to test your own pipeline? Enrich your first 100 records free, no subscription required →

    How Do You Score Each Deal Retrospectively Against ICP Criteria?

    Turn each ICP clause into a boolean check on the enriched fields, score every won and lost account against all clauses, then compare match rates. A deal matches when it passes a set share of clauses, 4 of 5 is a common bar.

    🔄 The Scoring Method

    • Write each clause as a testable rule: number_of_employees_range in 501-1000 or 1001-5000.
    • Score wins and losses with identical rules. Any asymmetry invalidates the comparison.
    • Record per-clause pass rates to see which clause carries the signal.

    📊 The Discrimination Test in pandas

    import pandas as pd
    
    df = pd.DataFrame(rows).merge(crm_export, on="domain")
    df["icp_match"] = (
        df["number_of_employees_range"].isin(["501-1000", "1001-5000"])
        & df["yearly_revenue_range"].isin(["50M-100M", "100M-250M"])
        & df["naics"].str.startswith("5415")
    )
    rates = df.groupby("stage")["icp_match"].mean()
    gap = rates["closed_won"] - rates["closed_lost"]
    print(rates, f"discrimination gap: {gap:.0%}")
    Retrospective ICP scoring: closed-won vs closed-lost match rates per attribute with discrimination gap

    What Match Rate Means Your ICP Is Wrong?

    If fewer than 60% of closed-won accounts match your stated ICP, the ICP is wrong, and if closed-lost accounts match within 20 points of the win rate, it is not discriminating.

    📊 The Diagnostic Grid

    Win match rateLoss match rateVerdictAction
    80%+Under 40%Valid and discriminatingKeep, re-test quarterly
    60-80%40-60%Partially validDrop non-discriminating clauses
    60%+Within 20 pts of winsDescribes the market, not the ideal customerRebuild from per-clause gaps
    Under 60%AnyICP is wrongRewrite from the win set’s attributes

    💡 The Discrimination Gap Is the Real Metric

    A 75% win match rate sounds validating until losses match at 70%. Track win match rate minus loss match rate, overall and per clause. Gaps above 20 points are your ICP; gaps near zero are noise.

    How Do You Rewrite the ICP Around Attributes That Separate Wins From Losses?

    Rebuild from the per-clause gap table: keep every attribute with a 20-point or larger win-loss gap, delete every attribute both sets share, and add high-gap attributes the old ICP missed.

    ✅ What Goes Into the Rewritten ICP

    • Attributes with the largest win-loss gaps, stated in enrichable field terms (yearly_revenue_range, not “mid-market”).
    • Technographic and signal clauses that discriminated, such as a specific cloud stack or hiring velocity.
    • Disqualifiers from fit-loss patterns: attributes that over-index in losses.

    ❌ What Gets Deleted

    • Region and industry clauses that matched wins and losses equally.
    • Aspirational segments with zero closed-won representation.
    • Any clause defined in words no API field can test.

    How Often Should You Refresh a Validated ICP?

    Re-run the retrospective quarterly: teams refreshing their ICP quarterly show a 9.7% higher pipeline creation rate than teams refreshing annually or less.

    🔄 The Quarterly Cadence

    • Append the quarter’s new won and lost deals to the dataset.
    • Re-enrich only new accounts; prior business_ids and attributes persist.
    • Recompute per-clause gaps and adjust clauses that fell below the 20-point bar.

    ⚡ Automate the Re-Run

    The pipeline is one script: CRM export in, gap table out. Scheduled quarterly, the refresh costs an afternoon, and you pay only for the new accounts.

    What Happens When AI Agents Target Off an Unvalidated ICP?

    AI agents amplify whatever ICP they are given: a wrong ICP fed to an AI SDR produces wrong outreach at 100x the volume a human team could. Validation belongs before any agent deployment.

    ❌ The Amplification Problem

    • Agents source, score, and sequence thousands of accounts per week, scaling the targeting error.
    • Reply and conversion metrics degrade quietly, and teams blame the copy instead of the profile.
    • Prompt retraining and tool swaps cannot fix targeting built on an untested hypothesis.

    🛡️ The Guardrail

    • Gate agent rollouts on a validated ICP with a 20-point-plus discrimination gap.
    • Feed agents the same enriched attributes the validation used, via a B2B data enrichment API built for AI agents.
    • Update agent targeting the same week a quarterly re-run shows a clause decaying.

    Getting Started: Validate Your ICP in 5 Steps

    The fastest path is the Explorium API: free account, match and bulk-enrich your last 50-100 won and lost deals, and read the gap table the same afternoon.

    • Step 1: Export 50-100 closed-won and a comparable closed-lost set (12-18 months) with name, domain, stage.
    • Step 2: Create a free Explorium account and match every account to a business_id (97.8%+ accuracy).
    • Step 3: Bulk-enrich both sets with firmographics, technographics, and workforce trends, up to 1,000 entities per call.
    • Step 4: Score both sets against your current ICP clauses and compute per-clause win-loss gaps.
    • Step 5: Rewrite the ICP around 20-point-plus gap attributes and schedule the quarterly re-run.

    🔑 The Decision Framework

    Pick the data layer on three pillars: one API for every attribute class the ICP is written in, scale that treats 100 deals as 3-4 calls at 100 QPS, and a free account with a unified credit pool instead of seat taxes. The Explorium API is the answer on all three, and it is the enrichment step this method runs on.

    Stop targeting off a hypothesis. Start a free trial: 100 credits, no subscription required →

    Related Posts

    FAQs