DEV Community

Cover image for I Scanned 140 Stores Before Sending 1 Cold Email. Signed a $450/Month Client From It.
Phil Rentier Digital
Phil Rentier Digital

Posted on • Originally published at rentierdigital.xyz

I Scanned 140 Stores Before Sending 1 Cold Email. Signed a $450/Month Client From It.

Today I'm showing you how to build a small business that can turn a profit fast, even if you're not super technical. Cold outreach has a problem nobody fixes: you pick 100 businesses off a Google Maps scrape, you write 1 template, you send it, and 96 of them had nothing to fix in the first place. Your reply rate says "outreach doesn't work" when the real issue was your list.

So here's the question that actually matters. Can a system that verifies 1 concrete fact before you send a message turn a decent reply rate into an actual paying client, or does it just make the rejection cheaper to produce. I'm showing you the full setup, the exact filter, the message that comes out of it, and the numbers at 6 days. Good and bad.

The Math Problem Nobody Says Out Loud

Most people who try cold outreach for the first time build their list the same way. They scrape a category on Google Maps or Yelp, pull 100 to 200 business names, and fire off a generic message about "helping grow their online presence." I did that too, back when I was learning the ropes.

The reply rate on that kind of list sits around 2% to 4%. The natural conclusion is "cold outreach is dead, nobody reads emails anymore." Except that's not what's happening. What's happening is you contacted 100 businesses that were doing fine, and told them they had a problem. Most people can smell that from the subject line.

Here's the reframe. The failure isn't in your message. It's in the fact that you decided who to contact using a feeling instead of a fact. "This store looks like it could use help" is not information, it's a guess dressed up as market research. And a guess, sent 100 times, produces noise, not clients.

The fix isn't a better subject line. It's building the list differently in the first place, and that changes literally everything downstream, including how you write the message itself.

The Mechanism: Let the System Decide

The core idea, once you strip away the tooling, is simple. The decision of who's worth contacting should never rest on a human eyeballing websites. It should rest on a system that can check 1 specific, verifiable fact, at scale, faster than a human ever could.

Ad platforms figured this out years ago. Programmatic targeting doesn't guess who might want a product, it checks behavioral signals and bids on the ones that match. Fraud detection works the same way: nobody manually reviews every transaction, a system flags the ones that break a known pattern. Applied to prospecting, the question stops being "does this business maybe need help" and becomes "does this business have a gap I can name in 1 sentence, yes or no."

That distinction sounds small. It isn't. A guess produces a list where 5% of targets have a real problem and 95% don't. A verified fact produces a list that's inverted, and I mean genuinely inverted, not "a bit better." This isn't Minority Report, nobody's arresting a store before it commits a crime. It's just checking whether the crime already happened, and only knocking on doors where it did.

I think the honest caveat here is that this only works for problems you can verify programmatically. If the pain point is something fuzzy, like "their branding feels dated," no API call is going to confirm that for you. The mechanism only applies to facts, not vibes, and figuring out which category your niche falls into is step zero, before any of the tooling below matters.

Guessing doesn't scale. A verified fact does, all the way down to a €10 VPS.

The Stack: 3 Tools, 1 Cheap VPS

This runs on 3 tools and a small server, and none of it requires a dev team.

DataForSEO handles the diagnostic layer. 1 API call pulls a store's keyword rankings, its backlink profile, and its on-page technical health (page speed, missing meta tags, broken schema) in a single JSON response. That's the raw material the filter runs on.

BrightData comes in second, only after a gap is confirmed. It enriches the qualified list with contact details, owner name, email pattern, sometimes a direct phone number, so I'm not manually hunting for a "Contact Us" form that goes into a black hole. I only pay for enrichment on stores that already passed the filter, which keeps the bill sane.

Claude does the last-mile job nobody wants to automate by hand: turning a wall of raw JSON into 2 readable sentences a human can act on in 10 seconds. "This store lost 12 keyword rankings in the last 90 days and their top 3 competitor gained all of them" reads a lot faster than the API response that produced it.

All 3 get orchestrated through n8n, and the whole thing runs on a €10/month Contabo VPS. Not a dedicated server, not a cluster, 1 small box that sits there and scans stores while I do other things. If you want the exact agency-level version of this kind of build, I documented the full agency blueprint I built this on, with the acquisition side included, not just the tooling.

(Random detail nobody asked for: that VPS is still named "test-server-3" in Contabo's dashboard, a leftover from some other project 8 months ago. I've renamed every workflow, every credential, every cron job on that box. Never touched the hostname. No idea why. It's not on my list of problems.)

140 Stores, 61 Worth Contacting

The filter I run checks for at least 1 of 3 conditions, and it's binary, no scoring, no weighting. Either the store has 1 of these or it doesn't.

  • A named competitor outranks them on a category page they used to rank for
  • 0 new backlinks in the last 6 months while competitors kept gaining
  • The store doesn't show up at all when you ask ChatGPT or Claude for a recommendation in their niche

1 of those 3, confirmed, and the store enters the qualified list. None of them, it gets skipped, no matter how "promising" it looks to a human scrolling the site. Most of this runs on DataForSEO, but for niches it doesn't cover well I cross-check with my custom SEO scanner instead of $200 subscriptions, same logic, different data source.

Out of 140 stores scanned, 61 qualified. That's 44%. I expected something closer to 15% or 20%, based on how these filters usually perform on other niches I've tested. Getting 44% either means the niche I picked is unusually starved for basic SEO hygiene, or my filter is a bit generous and I'll need to tighten it after a few weeks of results. Could be I'm reading this early number wrong, honestly not sure yet, but even the conservative read beats a hand-built list that would've mixed in 100 stores doing perfectly fine.

That number held through the whole scan. Then I had to write a message that didn't sound like every other cold email these store owners have already learned to ignore.

The Message That Gets Replies

The first message is under 200 characters. No link, no attachment, no mention of AI, audit, or "quick call." Here's roughly the shape of it:

"Noticed [competitor] is now outranking you for '[keyword]', which they weren't 3 months ago. Happy to show you exactly what changed if useful."

That's it. No pitch, no CTA stacked on top. The fact does the work a pitch usually has to do. I'm not asking the owner to trust my expertise, I'm handing them something they can verify themselves in about 10 seconds by opening a new tab and checking.

The ones who don't reply just get skipped. No hard feelings, no "YOU DIED" screen, just back into next month's queue with a different fact attached.

(And yeah, half of them probably do check before replying. Good. That's the point.)

The message also doesn't explain the method behind it. Nobody needs to know there's a VPS and 3 APIs running in the background to arrive at that 1 sentence. They just need the sentence.

The Numbers, Honestly (Day 6 Update)

Here's where I planned to write "day 6, no client signed, 17% reply rate, we'll see." That was the honest state of things through most of the week: 52 messages sent out of the 61 qualified stores, 9 replies, 2 calls booked, 0 invoices.

A 17% reply rate on cold, no warm intro, no referral, is genuinely good. For context, the industry average for cold email sits closer to 1% to 5%. The data did the sorting the feeling never could.

But 1 of those 2 calls turned into a signed client before I finished writing this. $450 a month, in the middle of the summer slowdown, which is supposed to be the worst possible window to prospect because half of Europe is on the beach and not checking email 🏖️. It signed almost without friction, because the first message wasn't a pitch, it was a fact the owner already half-suspected and just hadn't had time to confirm.

I won't pretend 1 client validates a whole business model. But it does answer the question I opened with. Data-driven targeting didn't just improve a reply rate on a spreadsheet, it produced a paying client, in the slowest month of the year, off a list built by a filter instead of a feeling.

What I'd Flag Before Anyone Copies This

2 things, and I'd rather say them now than let you find out the hard way.

First, this only works because the gap is explainable in 1 sentence the owner can verify in 10 seconds. "You lost rankings to a named competitor" is concrete. "Your brand feels weak" is not, and no filter built on APIs will ever qualify that kind of soft problem. If your niche's pain points aren't the kind you can check with a JSON response, this whole mechanism doesn't transfer.

Second, this doesn't scale past a few hundred prospects a week before the API cost eats the margin. DataForSEO and BrightData both charge per lookup, and once you're running thousands of stores through the diagnostic layer, the unit economics stop looking like a €10/month VPS and start looking like an agency line item. Nobody signed up to run Skynet's accounts payable department 😅. This is a solo-operator play. It's not a template for building a 50-person outbound team.

10 days after the scan, the filter earned its keep. 1 store, 1 gap it couldn't see coming, $450 a month, signed.

Sources

  • DataForSEO, SEO diagnostic API used for the ranking and backlink checks
  • BrightData, contact enrichment layer, only run on pre-qualified stores
  • The full SEO agency blueprint, the acquisition and delivery side of the same mechanism, at agency scale

This post may contain affiliate links. If you click them, I might earn a small commission, costs you nothing, and helps me keep shipping quality articles every day for your reading pleasure.

Top comments (0)