DEV Community

Robby D
Robby D

Posted on AI-assisted

26 of 45 shops had no way to reach them. Here's the script I added

A few days ago I published a small tool that pulls independent cafes, juice bars, health-food shops and delis out of OpenStreetMap. In the sample run for Asheville, NC it found 45 shops. A reader pointed out that the phone column probably matters most for indie shops, and later that someone still has to look up the actual buyer before a scraped list is any use to anyone. Both fair points, so I counted.

Of the 45 shops:

  • 2 list an email
  • 12 list a website but no email
  • 5 list only a phone number
  • 26 list nothing at all

That is 19 you can reach somehow and 26 you can't, from this data alone. So I added a second script to the repo, contact_routes.py, that does the sorting for you:

python door_finder.py --city "Asheville, NC" --radius-mi 10 --out doors.csv
python contact_routes.py doors.csv --out doors-routes.csv
Enter fullscreen mode Exit fullscreen mode

It adds a contact_route column (email, website, phone-only, none) and, for the shops with an email, an email_domain_mx column. That one asks Cloudflare's public DNS-over-HTTPS endpoint whether the domain accepts mail at all. One lookup per distinct domain, no API key, standard library only.

The MX check is deliberately small. It catches dead domains and typos. It says nothing about whether the mailbox exists or whether a human reads it, so I still run a proper verifier before sending anything. A domain that accepts mail can still bounce every address you throw at it.

What we do with each bucket

This is the manual part, and it's the part no script does for you. It's what we do for our own beverage brand's outreach:

  • Email or website listed: open the site. The About page, the shop's Instagram or a local news write-up usually names the owner. Thirty seconds of looking beats writing to info@.
  • Phone-only: call or walk in. At a small shop the person who picks up may well be the owner.
  • Nothing listed: search the shop's name plus the town. If that turns up nothing either, skip it and move on. It is not worth an hour.

The point of the sorting is to spend your limited outreach time on the shops you can actually reach. It also stops you from sending a message to an address you never verified.

Limits

  • OpenStreetMap is volunteer-entered, so the 26 "nothing listed" shops may have a phone and a website that nobody added yet. The numbers describe the map data, not the shops.
  • This is one city. I wouldn't read the ratios as typical anywhere else. Run it on yours.
  • It finds shops and sorts contact routes. It does not find buyers.

Repo (MIT, no dependencies): https://github.com/robbydslilgreens-bit/indie-door-finder

If you want the rest of the method we use (finding the buyer, what to say, following up after a sample), there's a free tracker and guides or a $19 written playbook. The scripts work fine without either.

Disclosure: I run this brand's marketing through an AI agent that researches, writes, and (within set guardrails) publishes on my behalf. This post was drafted by that process and checked against our own numbers before publishing.

Top comments (0)