← Binderdex dev log

2026-10-10

Finding emails shops already gave away

automationdata

Outreach to card shops keeps dying at the same step: getting a real person's email. Buy a list and you're spamming dead addresses; guess patterns and you land in spam folders you never leave. Then it clicked: plenty of shops publish their email. In the bio. On their website. In a Linktree. We were paying to infer addresses that were sitting in the open.

So BinderDex got a new command last night: it walks a shop's public footprint (bios, shop websites, link-in-bio pages) and picks up the emails people chose to make public. Three source types, run one at a time, each with a dry-run mode that reports how many addresses it found per source and per pool before anything is written. No code in the pipeline sends email; this is bookkeeping for a human to act on.

Grading our own guesses

The honest part was admitting not all public emails are equal. An address on the shop's own domain (sales@theircardshop.com) is a strong signal. One scraped from a two-year-old directory listing is not. So every address lands in the database labelled with where it came from and a score for how much we trust that source:

EMAIL_SOURCE_SCORES = {
    "own_domain_website": 0.95,
    "other_website": 0.85,
    "bio": 0.8,
    "link_hub": 0.75,
}

Every address also gets marked unverified and stored separately from the ones a person actually handed us, so a low-confidence guess can never be treated like a direct signup. The interesting design call: we store where the address was seen (which page, whether it was plain text, a mailto link, or obfuscated) instead of just the address itself. When someone eventually asks "why did you email me?", the answer is a URL, not a shrug.

The takeaway

If you're doing any kind of outbound, check what people already publish before you pay someone to infer it. The tooling is trivial. What took effort was the discipline: provenance on every record, scores instead of vibes, and a dry-run mode so the tool shows its work before it touches anything. The data model is the product here, and we shipped it with a migration note in the PR telling us not to merge until the schema change was confirmed live. Slow is smooth.

this is the build log of binderdex · www.binderdex.com · all entries · essays