tam-builder
Applies before any contact-level work. Produces one row per company with provenance on every field, plus a statement of what the build missed.
Companies now, contacts later
Keep these stages apart. A TAM build that drifts into finding contacts and verifying emails produces a half-finished universe and a large bill, because enrichment and verification are priced per contact and you're paying for them on companies you haven't qualified yet.
Stage one answers one question: which companies could buy this? Nothing else.
Retrieve, don't infer
Every field comes from a source that actually knows it, and every field carries provenance — where it came from and how confident it is. The temptation is to infer employee count from a website's feel, or geography from a top-level domain. Inferred fields look identical to retrieved ones in a spreadsheet and quietly corrupt every downstream filter.
Deduplicate on the root domain, not the company name. Names vary by legal entity, trading style, and punctuation; domains don't.
Build to saturation, not to a number
The completeness guarantee doesn't come from hitting a target count. It comes from running additional queries and sources until the yield of new domains per query goes to near zero.
Log that curve. If the run was capped — top-N per source, a budget ceiling, a rate limit — say so explicitly in the output. A truncated universe presented as complete is the single most damaging thing this process can produce, because every strategic decision downstream inherits the gap without knowing it exists.