No-Website Outreach Pipeline
A CLI that finds businesses without a website and drafts outreach that is legal to send.
A wrong send is a legal event, so the send stage is dry-run by default and every message must pass compliance checks before it can leave.
Facts
- Four stages — discover, draft, send, pipeline — each runnable on its own
- Uses a minimal X-Goog-FieldMask against the Google Places API (New) to find businesses with no websiteUri
- Drafts personalised outreach with the Claude API (claude-haiku-4-5)
- The send stage is DRY RUN by default and holds a suppression list
- Enforces a CAN-SPAM footer with a postal address and an unsubscribe path, and blocks deceptive subject lines
- Carries explicit GDPR and ePrivacy warnings that require legal sign-off before a real send
- Tests run fully offline against mocked APIs; ruff and black clean
Stack
- Python
- Google Places API (New)
- Claude API
- SMTP
Cold outreach tooling is easy to build and easy to build irresponsibly. The constraint that shaped this one is that the default path does not send: it prints what it would have sent, and turning that off is an explicit act.
The compliance checks are not a footer template. A message that lacks a postal address or an unsubscribe route fails before the transport is reached, and a subject line that misrepresents the body is rejected rather than repaired.