Skip to content

fix(leads): filter by shape, not by naming an industry's websites - #139

Merged
ralyodio merged 1 commit into
masterfrom
fix/no-niche-blacklist
Jul 28, 2026
Merged

ralyodio merged 1 commit into
masterfrom
fix/no-niche-blacklist

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The filter I added in #138 was a list of 3D-art hostnames — Blender forums, CG trade press, art schools, ArtStation, Sketchfab. It worked for exactly one campaign.

The community hubs for dentists or accountants have nothing in common with those, so the list was both endless and stale the moment anyone pointed a campaign at a niche nobody anticipated. It's gone.

Decided from shape instead

  • .edu, .ac.* — decisive, not a guess about any industry
  • structural subdomains that mean the same thing everywhere: forum, community, wiki, jobs, support, docs, blog, news

A forum is a forum whether the subject is character modelling or root canals. A company's blog. is the same business as its apex, so treating it as a separate prospect would pitch one business twice.

Freelance marketplaces and link-in-bio hosts stay named, because those are cross-niche by nature. The giants (LinkedIn, Instagram, Reddit, X) were already covered by THIRD_PARTY_HOSTS in lib/leadCampaign.ts.

Mining works the same way — a community page gets opened for its links without anyone having listed it first.

The other half: give up

A prospect whose site published no address, and which the SERP fallback couldn't find either, was left at "new" — so every tick researched it again, forever, and the funnel filled with businesses that could never be contacted.

Those are now skipped, with the reason recorded.

Guard

A test asserting none of those hostnames appears in discover.ts, and that the patterns contain no industry vocabulary (academy, portfolio, artist, 3d, gaming).

It exists because the pull toward naming the site in front of you is strong, and the cost only shows up later, in someone else's niche.

Checks

  • tsc --noEmit clean
  • 811/811 tests pass
  • production build compiles

🤖 Generated with Claude Code

The filter added in #138 was a list of 3D-art hostnames — Blender
forums, CG trade press, art schools, ArtStation. It worked for exactly
one campaign. The community hubs for dentists or accountants have
nothing in common with those, so the list was both endless and stale the
moment anyone pointed a campaign at a niche nobody anticipated. It is
gone.

What is left decides from the shape of a hostname rather than from
knowing an industry: .edu and .ac.*, and the structural subdomains that
mean the same thing everywhere — forum, community, wiki, jobs, support,
docs, blog, news. A forum is a forum whether the subject is character
modelling or root canals. Freelance marketplaces and link-in-bio hosts
stay, because those are cross-niche by nature, and the giants were
already covered by lib/leadCampaign.

Mining works the same way now, so a community page is opened for the
links it carries without anyone having listed it first.

The other half is simply giving up. A prospect whose site published no
address, and which the search fallback could not find either, was left
at "new" — so every tick researched it again, forever, and the funnel
filled with businesses that could never be contacted. Those are skipped
now, with the reason recorded.

The guard is a test asserting none of those hostnames appears in
discover.ts, and that the patterns contain no industry vocabulary. It
exists because the pull toward naming the site in front of you is strong
and the cost only shows up in someone else's niche.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

vu1nz Security Review

0 finding(s) in PR #?

No security issues found.

@ralyodio
ralyodio merged commit 86dc2b8 into master Jul 28, 2026
8 checks passed
@ralyodio
ralyodio deleted the fix/no-niche-blacklist branch July 28, 2026 03:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant