I Cloned a $99 per month Cold Emailing Tool with Claude and a €3 VPS in an Afternoon

I built my own link outreach tool in a day
I run a few small directory sites. The one I care most about is FanGamesDB, a hand-checked list of fan remakes, ports and decompilation projects where every link points to the official project page. Building pages is the fun part. Getting other sites to link to them is the part I keep putting off.
This weekend I gave Claude Code a loose brief: study how commercial backlink outreach tools work, build my own version, host it on my own server, and tell me honestly whether a cold email strategy I’d been watching on YouTube fits alongside it. By evening, the app was running on my VPS.
The idea
Find pages that already link to a competitor of yours. Their owners have shown they link out in your niche. Email each one personally, point at the exact spot where your link would fit, and ask them to add it. Follow up politely. Most won’t reply; a few will say yes. The real work is everything around that, and that’s what the tool automates.
What we built
The app finds web pages that already link to a competitor of your site, writes a personal email to each page’s owner asking them to link to you too, sends those emails slowly from your own mailbox, sorts the replies, and tells you when your link goes live.
It’s deliberately boring: one Python process, a SQLite database, a background sending thread and four libraries, shipped as a single Docker container. The pipeline:
- Find. Linking pages come from DataForSEO (about six cents per thousand) or from a CSV; an Ahrefs export works as is. Forums, link farms, pages in other languages and pages nobody reads are dropped on arrival.
- Qualify. The app opens each page and finds the competitor’s link and the sentence around it. It hunts for a contact email, including on contact and about pages, and checks that the domain can receive mail. Then it grades the page from A to F.
- Review. I check the screenshot and approve or dismiss.
- Draft. Claude writes a first email plus three follow-ups, using my project notes and the page itself. A quality check rejects words like “SEO” and “backlink”, stray links, and any mention of money. If a draft fails, a plain template is used instead.
- Send. Plain text from my own mailbox, on weekdays from 9 to 5 in the recipient’s time zone, about six minutes apart. A new mailbox is capped at five emails a day in its first week.
- Replies. The inbox is checked every five minutes, and each reply is tagged: agreed, question, negotiating, referred, declined, or “stop emailing me”. Out-of-office replies are ignored.
- Links. Pages that agreed are checked daily until the link is live, then watched in case it disappears.
Three rules are built in, and they matter more to me than any feature:
- Nothing is sent until I approve it.
- A real reply stops all follow-ups to that person at once.
- Anyone who asks me to stop, or whose address bounces, is blocked for good.
What to expect: roughly one live link for every 100 emails, going by published benchmarks from an existing tool. My niche will differ.
Does the cold email playbook fit?
The video came from a founder whose agency books sales meetings for B2B companies through cold email. He’d just had a $229k month, but on about 20% net margins, with a sizeable team and years of grinding behind it. His lessons were solid. Find the one constraint holding you back; for small businesses it’s usually that too few people know you exist. And stop chasing shiny new channels.
For my sites, the honest verdict was “partly”:
- Yes to cold email as a steady, low-volume habit for getting links to my own directories, for maybe $20 to $60 a month.
- Not now to an agency or a SaaS. Plenty already exist, and by his own rule I should prove it works on my own sites first.
- No paid links on FanGamesDB. Fan communities dislike anything commercial, and paying for links that pass search ranking breaks Google’s spam policies.
- Lead with safety. My link checker already spots fan-game pages that died or now redirect to gambling sites. “Your link is broken; here’s the official page” helps the blogger first.
- Respect the law. German and Austrian rules treat unsolicited email advertising as unlawful even between businesses, so .de, .at and .ch addresses are blocked from day one.
Shipping it
Deployment followed my usual path: a private GitHub repo, then Coolify on my VPS building the Dockerfile. Three details mattered. The database lives on a persistent volume, so redeploys don’t wipe it. The health check stays off, because the whole app sits behind a password. And I started with only two settings: a password and dry-run mode.
Dry-run mode became my favourite feature. One button loads a fake project with eleven leads on .test addresses, which can’t receive mail. Queued emails land within a minute on a Test mailbox page, shown exactly as a recipient would see them. A “Simulate reply” button lets me play the blogger: saying yes, asking for $50, or telling me to go away. Everything downstream runs for real.
Then I asked for a cleaner look and got a light, social-app style with a sidebar, pill-shaped buttons and replies shown like posts.
What broke
Testing caught real bugs. My name was signed twice at the bottom of each email, and Windows was missing time zone data. The third was sneaky: the cheapest Claude model rejects a setting the app sent with every request. Switching to it would have silently turned every AI draft into a template.
That cheap model matters. Drafting costs about a dollar per thousand emails on Claude Haiku 5.5, against roughly $45 on Opus. The AI is the cheapest line in the budget; a single Google Workspace mailbox costs more each month.
What’s next
The slow part isn’t code. A new sending mailbox needs about two weeks of warm-up before it sends anything real. So the plan is:
- a mailbox on a subdomain of each site, with SPF, DKIM and DMARC records set up
- two weeks of gentle sending
- about 100 free link requests for FanGamesDB
After 30 days I’ll check two numbers: live links per 100 emails, and whether those links bring traffic. If I get fewer than one link per 150 emails after 300 sent, I’ll stop and put the time back into writing.
I’ll report back either way.