Why generic ICP filters fail
Your ICP doc says "Series B SaaS, 100-500 employees." So does everyone else's. There is no differentiation in the signals you score on.
The question that matters: what is actually different between your closed-won accounts and your closed-lost accounts? Not what you think. What the data shows.
How to discover your niche signals
Step 1: Export two lists
Pull from Salesforce or HubSpot:
closed-won.csv(50 accounts that closed)closed-lost.csv(50 accounts that did not)
Step 2: Run the niche signal discovery skill
The skill enriches both cohorts with firmographics, technographics, hiring data, and funding, then compares the sets to surface the attributes that predict wins vs losses:
deepline enrich --input closed-won.csv --output won-enriched.csv \
--with 'company=crustdata_companydb_autocomplete:{"field":"company_name","query":"{{Company}}"}' \
--with 'tech=builtwith_domain_lookup:{"domain":"{{Domain}}"}' \
--with 'jobs=crustdata_job_listings:{"company_name":"{{Company}}"}'
deepline enrich --input closed-lost.csv --output lost-enriched.csv \
--with 'company=crustdata_companydb_autocomplete:{"field":"company_name","query":"{{Company}}"}' \
--with 'tech=builtwith_domain_lookup:{"domain":"{{Domain}}"}' \
--with 'jobs=crustdata_job_listings:{"company_name":"{{Company}}"}'
Step 3: Review the signals
Claude analyzes both cohorts and surfaces the 3-5 attributes that statistically separate winners from losers.
Step 4: Deploy as a scoring model
The discovered signals become a scoring function:
deepline workflows apply --payload '{"name":"icp-scoring","trigger":{"type":"webhook"},"steps":[/* enrich + score */]}'
# Configure the trigger and any approval gates via the dashboard at /workflows
Sample analysis: Cybersecurity ICP
A sample / illustrative fraud prevention company ran niche signal discovery on 84 closed-won and 85 closed-lost accounts. Here's what the data showed.
Positive-fit signals (predict closed-won)
| Signal | Lift | Why it matters |
|---|---|---|
| Account creation flow on website | 11.1x | Company has consumer onboarding - needs identity verification |
| Adyen in tech stack | 5.1x | Enterprise payment infrastructure - high-volume, sophisticated |
| Braze in tech stack | 3.7x | Lifecycle messaging - large user base to verify |
| CIP language on website | 3.0x | BSA-mandated identity verification at onboarding |
| Developer sandbox in docs | 2.5x | API-first buyer - faster integration |
| Fraud leadership hiring | 1.8x | Active fraud budget - decision maker exists |
Anti-fit signals (predict closed-lost)
| Signal | Lift | Why it predicts a loss |
|---|---|---|
| Kubernetes + Terraform + Docker (all 3) | 0.06x | Heavy DevOps - internal build culture, won't buy |
| Adverse media screening | 0.08x | Advanced AML stack - existing IDV solution |
| SOC 2 Type II (prominently marketed) | 0.14x | Strict vendor certification - slow procurement |
| Snowflake (prominent) | 0.20x | Data warehouse focus - internal ML/analytics culture |
| Azure as only cloud | 0.22x | Microsoft ecosystem lock-in - prefer Microsoft tools |
| IPO in progress | 0.40x | Procurement frozen during lock-up period |
The scoring model
Signals get weighted into a lead score:
| Score | Tier | Action |
|---|---|---|
| 60-100 | Tier 1 | Immediate outreach - personalized sequence referencing their fraud/compliance signals |
| 35-59 | Tier 2 | Compliance-led messaging - sequence on triggering event |
| <35 | Tier 3 | Nurture or skip - likely not a fit today |
From signals to outreach
Once you have the signals, Deepline finds the companies and contacts that match.
Step 1: Find companies with positive signals
deepline enrich --input tam-companies.csv --output scored.csv \
--with 'cip_check=exa_search:{"query":"site:{{domain}} customer identification program"}' \
--with 'sandbox=exa_search:{"query":"site:{{domain}} sandbox OR developer.{{domain}}"}' \
--with 'tech=builtwith_domain_lookup:{"domain":"{{domain}}"}' \
--with 'jobs=crustdata_job_listings:{"company_name":"{{company}}"}'
Step 2: Score and filter
deepline enrich --input scored.csv --output tier1.csv \
--with 'score=run_javascript:calculateScore(cip_check, sandbox, tech, jobs)' \
--with '{"alias":"keep","tool":"run_javascript","payload":{"code":"return Number(row.score) >= 60 ? row : null"}}'
Step 3: Find the buyers
deepline enrich --input tier1.csv --output contacts.csv \
--with 'contacts=crustdata_people_search:{"company_domain":"{{domain}}","title_patterns":["Head of Fraud","VP Risk","BSA Officer","CCO","Head of KYC"]}'
Step 4: Enrich emails and reach out
deepline enrich --input contacts.csv --output outreach-ready.csv \
--with 'email=bettercontact_enrich:{"first_name":"{{first_name}}","last_name":"{{last_name}}","company_domain":"{{domain}}"}'
deepline enrich --input outreach-ready.csv --output sent.csv \
--with 'outreach=lemlist_add_to_campaign:{"campaign_id":"tier1-fraud-signals","email":"{{email}}","first_name":"{{first_name}}","company":"{{company}}","signal":"{{top_signal}}"}'
What gets enriched
| Data type | Sources |
|---|---|
| Firmographics | Crustdata, People Data Labs |
| Technographics | BuiltWith, TheirStack |
| Hiring signals | Crustdata job postings |
| Funding | Crunchbase via Crustdata |
| Web research | Exa semantic search |
| Emails | BetterContact, Fullenrich waterfalls |
| Outreach | Lemlist, Smartlead, Instantly |
Cost breakdown
| Stage | Credits | Cost |
|---|---|---|
| Signal discovery (100 won + 100 lost) | 80-120 | ~$8-12 |
| Score TAM list (500 companies) | 100-150 | ~$10-15 |
| Find contacts at Tier 1 (50 companies) | 25-40 | ~$2.50-4 |
| Email enrichment (150 contacts) | 30-60 | ~$3-6 |
| Full pipeline | 235-370 | ~$24-37 |
From raw CRM export to scored outreach list for under $40.
Who uses this
- Founders who want to stop guessing which accounts to prioritize
- RevOps leads building scoring models that predict revenue
- AEs who want to know which accounts are worth their time
Deploy ongoing scoring
Once you have the signals, deploy them as an always-on workflow:
deepline workflows apply --payload '{"name":"icp-scoring","trigger":{"type":"cron","schedule":"0 8 * * *"},"steps":[/* enrich + score + writeback */]}'
# Wire HubSpot as the source, Tier 1 routing (BetterContact + Lemlist push),
# and approval gates via the dashboard at /workflows.
New leads get scored, enriched, and sequenced automatically. Signals stay tied to real outcomes, not assumptions.
Common questions
Frequently Asked Questions
1How many accounts do I need?+
50 of each is enough to find patterns. 100+ gives stronger signal.
2What if my won/lost sets are imbalanced?+
Deepline normalizes for sample size. 30 won and 70 lost still works.
3Can I re-run this quarterly?+
Yes. Your ICP evolves as you close more deals. Re-running keeps signals fresh.
Find the signals hiding in your data
Export your won and lost accounts. Deepline does the rest.