The full target-customer definition, checked line by line against what our search actually implements. COVERED PARTIAL NOT COVERED
| Criterion | Requirement | Status |
|---|---|---|
| Ownership | Independent / privately, dentist, or family-owned. Exclude DSOs, corporate groups, hospitals, universities. | PARTIAL |
| Company size | 1โ50 employees preferred, 50โ200 secondary. | NOT COVERED |
| Locations | 1โ3 preferred, up to 10 acceptable. | COVERED |
| Geography | 14 target metros, city by city. | PARTIAL |
| Decision maker | Owner, Managing/Lead Dentist, Practice Administrator, Office Manager. Exclude hygienists, assistants, receptionists, recruiters. | PARTIAL |
| Practice types | General, Family, Cosmetic, Emergency, Implant, Sedation, Orthodontics, Periodontics, Prosthodontics, Endodontics, Oral Surgery, Pediatric, Sleep, Invisalign. | PARTIAL |
| Buyer intent | Outdated website, weak SEO, inactive social โ paired with a strong Google review history (50+ reviews). | NOT COVERED |
| Negative filters | Hospitals, universities, DSOs, corporate, staffing/recruiter listings. | COVERED |
Why the gaps: OpenMart's business search returns company data โ name, phone, website, reviews, location count. It doesn't return employee counts, doesn't identify a decision maker by role, and can't tell us if a website looks outdated. Those three require either a paid enrichment step (decision maker) or a manual audit (buyer intent, size) โ neither has run yet.
Live API calls, not a resold list. Every lead traces back to a specific search.
| Endpoint | OpenMart /api/v1/search, one call per metro |
| Category | tags: ["dentist"] |
| Location | Hard-filtered per metro (city + state) |
| Chain size | max_locations: 10 |
| Website | has_website: true |
| Reputation floor | min_total_reviews: 10 |
| Server-side exclude | 24 terms โ hospitals, universities, staffing/recruiter listings, known DSO brands |
Every lead runs through this decision path, from raw search result to a confirmed decision-maker with a verified email โ or excluded, with a reason, at whichever step disqualifies it.
Confirmed decision-makers (explicit role tag) are enriched first and separately from surname-matched or best-guess contacts โ mixing those tiers is what let a 68%-guesswork batch through on the first enrichment pass.
Location, chain size, review floor, website โ applied at query time, so junk is never even returned.
Confirms the returned business_type is actually dental, and drops associations/societies (channel partners, not prospects, per the ICP blueprint).
Same practice, different name strings (doctor's bio page vs. brand name). Merged on phone, domain, or exact name.
Distinctive brands (Aspen Dental, Heartland Dental) excluded on name alone. Generic-sounding ones (Coast Dental, Dental Depot) only excluded if location count also confirms a real chain โ most turned out to be independents with a similar name.
OpenMart sometimes returns an unrelated company's name on a dental website. Caught by checking the name against the actual domain.
Drops names pulled from another practice's "our referring doctors" page โ not a standalone lead.
Same business, two city searches โ merged so it's counted once, not twice.
Splits contacts into confirmed (explicit Owner/Office Manager role), likely (surname match), and best-guess โ not treated as equally reliable.
Paid lookup, run against a known name at the practice's domain. Generic inboxes (info@/admin@) are never counted as a match.
Volume at each stage โ where leads actually drop off.
The steepest drop is the last one: 914 named contacts โ 115 verified emails. That's a data-coverage limit at OpenMart, not a filtering problem โ most independent practices simply don't have a findable personal email by domain+name lookup.
Scored on what the data can confirm: ownership, location count, reviews. Out of 50.
| Signal | Condition | Points |
|---|---|---|
| Ownership | Independent / family-owned | +20 |
| Ownership | Owner-led signal only (unconfirmed) | +12 |
| Locations | 1โ3 locations | +15 |
| Locations | 4โ10 locations | +5 |
| Reviews | 50โ500 reviews | +15 |
| Reviews | 500+ reviews | +5 |
TIER A โฅ35/50 TIER B 25โ34/50 TIER C <25/50
Website, blog, and social signals aren't in this data โ those need a separate manual check.
| Metro | Qualified | Tier A | Tier B | Tier C |
|---|---|---|---|---|
| Dallas / Fort Worth, TX | 295 | 189 | 81 | 25 |
| San Antonio, TX | 304 | 102 | 116 | 86 |
| Jacksonville, FL | 135 | 39 | 50 | 46 |
| San Diego, CA | 306 | 80 | 130 | 96 |
| Seattle, WA | 214 | 54 | 97 | 63 |
| Combined (post-QA-sweep) | 1,225 | 451 | 464 | 310 |
Real mistakes caught mid-build. Logged here, not quietly fixed โ this is the proof the list isn't garbage.
name: "Role"). Added a placeholder-name filter, fixed with zero new API cost by reprocessing already-saved data.