Lead enrichment that tells you what a prospect actually runs
Most enrichment vendors answer the same question in slightly different ways: who is this person, and how big is their company? Those are useful answers. They are also the answers your competitors have, and they say nothing about whether the lead has ever bought something like what you sell.
Vendor data answers a different question — what does this company actually run? — and it changes routing decisions in a way headcount never does. A 60-person company already paying for three tools in your category is a better lead than a 600-person company that has never bought one. This is a RevOps guide to putting that signal into your inbound flow.
The flow
Form submit
└─> normalize email → extract domain
└─> free-mail filter (drop gmail/outlook/…)
└─> GET /v1/check?url=DOMAIN
├─ found: true → map fields → score → CRM
└─ found: false → CRM status "unknown" → nurtureFour steps, one API call. The complexity is all in what you do with the response.
Step 1 — get to a domain
The domain is the join key for everything downstream, so spend a minute getting it right. Take the email, lowercase it, split on @. Strip www. if a form field gave you a URL. Then drop the free-mail addresses — gmail.com, outlook.com, hotmail.com, yahoo.com, icloud.com, proton.me, and whatever else shows up in your own data.
This filter is not optional. In most B2B inbound funnels somewhere between a third and a half of submissions are personal addresses. They'll never resolve to a company stack, and filtering them before the enrichment call keeps both your bill and your unknown-rate honest.
Step 2 — the enrichment call
curl "https://api.vendorstacks.com/v1/check?url=northwind-labs.com" \
-H "Authorization: Bearer $VENDORSTACKS_KEY"
{
"domain": "northwind-labs.com",
"found": true,
"vendor_stack": {
"sms_messaging": ["twilio"],
"email": ["sendgrid"],
"payments": ["stripe"],
"crm_sales": ["salesforce"],
"analytics_data": ["segment", "snowflake"],
"cloud_infra": ["aws"]
},
"subprocessor_urls": ["https://northwind-labs.com/trust/subprocessors"],
"vendor_confidence": "high",
"scanned_at": "2026-07-09T14:22:03Z",
"credits_used": 1,
"credit_balance": 5431
}One decision to make here. /v1/check answers from the index in under a second when the domain is known, and triggers a live scan of the company's public web presence when it isn't — that scan takes 15 to 90 seconds. If you're calling this inline from a form handler, either set a 120-second timeout and enrich asynchronously, or use /v1/company/DOMAIN, which reads the index only and never scans. The pragmatic setup: return 200 to the form immediately, enqueue the enrichment, score when it lands. A lead that gets routed 40 seconds late is fine. A form that hangs is not.
Step 3 — what to write back to the CRM
Resist the urge to dump the JSON into a notes field. Create real fields; they're what makes views, reports, and routing rules possible later. A mapping that has held up well:
- Stack — SMS / Email / Payments / … (text or multi-select, one per category you care about) ←
vendor_stack.<category>. There are 24 categories available; pick the four or five that matter to your product rather than creating all thirteen. - Stack — vendor count (number) ← the flattened length of
vendor_stack. A crude but surprisingly useful proxy for technical maturity. - Stack — competitor present (checkbox) ← computed from your own competitor list.
- Stack — evidence URL (URL) ←
subprocessor_urls[0]. This is the page on the company's own site where those vendors are named. - Stack — confidence ←
vendor_confidence. - Stack — last scanned (date) ←
scanned_at. You need this the first time someone asks "is this current?" - Stack — status ←
enriched,unknown, orskipped_freemail.
That last field is the one RevOps teams forget and then wish they had. Without it you cannot tell the difference between "we looked and found nothing", "we never looked", and "this was a personal email" — and those three populations need completely different treatment.
The evidence URL is worth a specific argument. A CRM field that says "uses Twilio" invites a rep to open with "our data shows you use Twilio", which is a claim a prospect can dispute. A field that carries the prospect's own published page turns the same fact into something they can't argue with. Store the source, not just the conclusion.
Step 4 — the found: false population
Some domains will return found: false. This means no public evidence of vendors was located for that domain. It does not mean the company runs nothing — smaller companies, non-SaaS businesses, and companies that simply don't publish a trust or compliance page will land here regularly.
Route them to unknown, not to disqualified. If your scoring model treats a missing stack as a zero, you will systematically deprioritize every company that happens not to publish — which correlates with nothing about their fit. Treat the stack score as a bonus applied when present, not a penalty applied when absent.
There's a billing consequence in your favour: found: false costs zero credits. So does a failed scan. You only pay for lookups that return data.
The cost math at 5,000 leads a month
Start with 5,000 form submissions. Free-mail filtering typically removes 40–50%; call it 2,700 real company domains. Of those, some share of lookups return no public vendor evidence and cost nothing — in a B2B SaaS-heavy funnel, expect a solid majority to hit.
- 2,700 lookups attempted, ~1,900 successful → ~1,900 credits
- At the $50 / 6,000-credit pack, that's roughly $16 a month
- Even at the worst case — all 2,700 return data — you're at about $22
Deduplicate by domain before you enrich and it drops further: multiple leads from the same company share one stack. Cache the result on the account record, apply it to every contact, and re-enrich on a schedule rather than per-submission. At that point a 5,000-lead month costs less than a few hundred credits.
What changes downstream
Once the fields exist, the routing rules write themselves. Leads with a competitor in the target category skip the nurture queue. Leads with a mature complementary stack route to the team that handles technical buyers. Leads with an unknown stack go to a lower-touch sequence rather than into a hole. And every rep working a routed lead has an opening line that references something the prospect published themselves.
For the code-level version of this pipeline — including scoring and Slack routing — see the Meta Ads to lead-scoring walkthrough. For the full field reference, the API docs.
Get a key — 25 free credits, no card — and run your last 25 inbound domains through it. If the stacks that come back match what your reps already know about those accounts, you have your answer about whether to wire it in properly.