US B2B sales-intelligence company
Contact-data engine
live · used daily by the client’s team
A sales-intelligence company was sitting on hundreds of thousands of contacts spread across 20 export files in two incompatible formats. Nobody could answer a simple question like “how many VPs of Marketing do we have in Texas?” Now anyone on the team can, in plain English.
The starting point
- Twenty large CSVs, ~777k raw rows, two different schemas, overlapping and conflicting records.
- No way to search, segment, or export without a data person doing manual spreadsheet surgery.
- Data quality unknown: duplicates, stale emails, inconsistent industry labels.
- 20 CSV exports~777k raw rows, 2 schemas
- Enrichment feedsZIP geodata · email validation
- Normalize24 canonical fields
- Deduplicateemail PK + fuzzy name/company
- QA gates8/8 checks before load
- Postgres · 863,484 rowsRPC search + count
- Custom GPTplain-English queries via OpenAPI
- Exports & bulk updatesedge functions, 10k-row CSV
What got built
Normalization & dedup pipeline
Every source normalized to 24 canonical fields, deduplicated on email primary key with fuzzy name/company fallback, industries collapsed into a normalized 35-industry taxonomy. Final state: 863,484 contacts, zero duplicates, 1.2M+ previously-empty fields enriched, 8/8 QA checks passing.
Natural-language search
Supabase RPC functions exposed via OpenAPI to a custom GPT: search and count by title, industry, location (including ZIP-radius search), company size, and revenue, with pagination, CSV export up to 10k rows, and bulk updates via edge functions.
Stack
- Supabase (Postgres + RPCs + edge functions)
- Custom GPT via OpenAPI actions
- Python data pipeline
- ZIP-radius geosearch
Got a system like this waiting to exist?
Start with the free teardown: I’ll map your three biggest automation leaks and what they cost you monthly. In your inbox within 72 hours.
Get your free systems teardown