Stop Cold Pitching: Find Local Businesses With a Problem You Can Actually Fix — Under $4
Cold outreach fails because it is generic. Here is the exact flow — build a prospect universe, diagnose the real problem from their own reviews, qualify who can pay, find the human, and pitch with evidence — run entirely from Claude via MCP. No code.
The actor referenced in this article. Pay only for results delivered.
You know the email. You have sent it, and you have received a hundred of them.
“Hi — I’m a freelance web designer with 8 years of experience. I noticed your business and thought I’d reach out. Do you need any web design work?”
It gets deleted in under a second, and it deserves to. Not because the sender is bad at web design. Because the note proves the sender knows nothing about the recipient. It could have been addressed to any of ten thousand businesses, and the recipient can tell.
Now here is the email that gets answered:
“Your Trustpilot rating has fallen to 2.1 across your last 40 reviews. I read all of them. Thirty-one are about the same thing — people cannot find your returns policy and end up phoning to ask. That is a page and a link in your footer. Here is what I would do about it.”
Same sender. Same skill. Completely different reception. The second one is not better writing — it is better research. Every claim in it is checkable, and the recipient knows something the sender said is true because they have been living it.
So the real question is not “how do I write a better cold email.” It is: how do I find, at scale, the businesses that have a visible problem I am specifically good at fixing?
That is a data problem. So let’s treat it like one.
You are not looking for businesses. You are looking for businesses with a diagnosable problem in your speciality. That is not a vibe. That is a filter. And a filter can be run.
This post is the complete flow. Five tools, one Claude conversation, about three dollars and forty-four cents. No code.
The setup (two minutes, once)
The Mine Works MCP server puts our scrapers inside Claude as native tools. Claude calls them itself and reasons over the results in the same conversation — you never copy-paste a CSV.
Open ~/.claude.json (or Claude Desktop → Settings → Developer → Edit Config) and add:
{
"mcpServers": {
"themineworks": {
"url": "https://the-mine-works-mcp.hatchable.site/api/mcp",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}
Grab your token from Apify → Account → Integrations. Restart Claude. Runs bill to your own Apify account at pay-per-result rates — there is no subscription on our end.
Now the flow.
Step 1: Build the raw universe — and let it do your first filter for free
The manual version of this step is a browser with forty tabs open. You type “dentists in Leeds” into Google Maps, you scroll, you click each one, you squint at the rating, you check if the website looks like 2011, you paste the phone number into a spreadsheet, and after ninety minutes you have thirty rows and no energy left for the part that matters.
The thing is, you were not reading those listings for pleasure. You were running a filter in your head — bad rating? no site? site from 2011? — one business at a time, by hand.
Google Maps Search Scraper runs the search and hands back the listings as data: name, overall rating, review count, website, phone, address.
Prompt: Use search_google_maps for “dentists” in Leeds, UK, maxResults 200. Then give me two lists. List A: everyone with a rating under 3.5 who has more than 20 reviews — I want businesses with a real reputation problem, not one angry customer. List B: everyone with no website field at all.
Read what those two lists actually are. They are not leads. They are symptoms, sorted by which of your services they point at.
- Rating under 3.5 with real review volume → a reputation problem. Something is going wrong repeatedly and in public.
- No website → a web problem, and a completely different pitch.
- Rating fine, review count in single digits after years of trading → nobody is asking for reviews. That is a process problem.
Note the review-count floor. A 2.0 rating from three reviews is noise. A 2.9 from 140 is a business quietly bleeding, and they know it.
Note: the Maps search is a browser-based scrape and takes longer than a single request can wait. The tool hands back a
run_idand Claude collects it withget_run_resultsa few seconds later. You will see it do this automatically — that is expected, not an error.
One precise thing, because it shapes the whole rest of this flow: this returns the listing, including the overall rating and the review count. It does not return the text of individual reviews. So it tells you a business has a problem. It cannot tell you what the problem is.
That is the next step, and it is why this is cheap.
Cost: $0.0015 per place. 200 businesses is thirty cents.
Step 2: Diagnose the problem — do not guess it
Here is where almost everyone ruins it. They see a 2.1 rating and write: “I noticed you have some negative reviews and I can help improve your online reputation.”
That is still a generic email. It just has a number in it. The recipient already knows their rating is 2.1 — they look at it every morning and it ruins their day. You have told them nothing. Worse, you have told them you looked for exactly four seconds.
The manual version of doing this properly: open Trustpilot, read forty reviews, keep a tally in a notebook, notice around review twenty-five that the same complaint keeps coming back, and try to name it. That is genuinely useful work. It is also forty minutes per business, which is why nobody does it for more than two prospects, which is why almost every pitch a business owner receives is generic.
Forty minutes each is exactly the kind of thing you stop doing by hand.
Trustpilot Reviews pulls the actual review text. Point it at the weak-rated companies from List A — it takes a bare domain.
Prompt: For each of the 20 companies in List A, use scrape_trustpilot on their domain, maxResults 30. Then read every review you pulled. For each company separately: cluster the negative reviews into themes, tell me how many reviews fall into each theme, and name the single biggest recurring complaint in one specific sentence. Do not generalise across companies — I want each one’s actual problem, in their customers’ own words. If a company’s complaints are all over the place with no pattern, say so and drop it.
That last instruction is doing real work. Some businesses have a bad rating for no coherent reason, and there is no pitch there. You want Claude to tell you that instead of manufacturing a theme to please you.
What comes back is not “they have bad reviews.” It is a named, countable, quoted problem, per business — and crucially, one you can immediately sort by whether it is yours. Delivery complaints are not a web designer’s problem. “Nobody can find X on the site” absolutely is. Half of List A will not be for you. Drop them without regret; the filter working is the filter earning its keep.
This is the step where the pitch gets written, even though you have not written it yet.
Cost: $0.005 per review. 20 companies at ~30 reviews each is 600 reviews — three dollars. This is the expensive step, which is exactly why it runs on 20 businesses and not 200.
Step 3: Qualify — can they actually pay you?
A problem you can fix is only half a lead. A three-person operation with a real reputation problem and no budget is not a client; it is a long, polite conversation that ends in nothing.
Prompt: Use get_linkedin_company on the companies that survived Step 2 — you can pass their plain names. Give me employee count and industry for each. Flag anything under 10 employees separately.
LinkedIn Company Details takes LinkedIn company URLs or plain names and returns firmographics — headcount, industry, the basics.
Headcount is a crude proxy for budget, but it is an honest one, and it is the difference between a project and a favour. Where you draw the line is your business, not mine. Draw it before you get emotionally attached to a prospect.
Cost: $0.004 per company. Twenty companies is eight cents.
Step 4: Find the human
The manual version: click through to the website, hunt for a Contact page, find info@, sigh, try the About page, try the team page, check the footer, give up, use info@.
Prompt: Use find_website_contacts on the 20 qualified domains. Pull back every email, phone and social profile you find.
Website Contact Finder crawls the homepage, contact, about and team pages and returns what is publicly posted there. Sometimes that is a named person with a real address. Sometimes it is only info@.
Both outcomes are useful, and the next step tells you which is which.
Cost: $0.001 per domain. Twenty domains is two cents.
Step 5: Only pay to contact real people
Sending to a dead address is worse than not sending. It costs you a bounce, it dents your sending reputation, and you sit there for a week thinking they are considering it.
Prompt: Run verify_emails on every address find_website_contacts returned, with checkSmtp on. Show me the status and reasons for each. Separate out anything flagged as role-based, catch-all, or disposable.
Email Verifier checks MX records and SMTP and hands back a status plus the reasoning — including flags for isDisposable, isCatchAll, and mxFound.
Pay attention to one specific verdict. An address like info@ or contact@ comes back as risky, with the reason “Role-based address (not a person)”. That is not a bug and it does not mean the address is dead. It means your carefully researched, genuinely useful note is going into a shared queue, where it will be triaged next to invoice PDFs and supplier spam by whoever is on inbox duty.
Which is a strategic fact, not a technical one. A role-based address is not a reason to give up — it is a reason to change the plan. Some of the best-diagnosed leads on your list will only have info@, and for those, the phone number the Maps scrape already handed you in Step 1 is very often the better move. You are calling a business to tell them something true and useful about their own operation. That is a call worth making.
Cost: $0.001 per email. Forty emails is four cents.
Step 6: Write the pitch that could only be about them
Claude now has, for each surviving business: their rating, their review volume, the actual text of thirty reviews, the named recurring complaint and how many people said it, their headcount and industry, and a verified way to reach a human.
That is not a “personalised” email. Personalisation is Hi {{FirstName}}. This is a specific email, and the difference is not cosmetic.
Prompt: Write a short outreach note to [company]. Open with the specific recurring complaint you found in their reviews and how many reviewers raised it — plainly, not gleefully. Then one paragraph on what I would actually do about it, given I do [your speciality]. Under 130 words. No flattery, no “I came across your website,” no “hope this finds you well.” Do not overclaim a result I cannot promise. End with a question, not a pitch.
Read every one before it goes out. All five tools together cost less than a sandwich; your name on a note that misreads someone’s business costs considerably more.
The reason this works is not that an AI wrote it. It is that every claim in it is grounded in something real that you pulled ninety seconds ago. It is specific because it can be specific — and it is credible because the recipient can check it, and knows it is true before they finish the first line.
Step 7: Make it standing
The whole thing is a prompt, which means it can be a recurring one.
Prompt: Re-run the Leeds dentists Maps search. Show me only businesses whose rating has dropped below 3.5 since the last run.
A rating that just fell is a problem someone is actively worrying about this week. That is a very different conversation from one they have been numb to for two years.
What it actually costs
Real per-result prices, for a full pass over one city:
| Step | Tool | Rate | Volume | Cost |
|---|---|---|---|---|
| Build the universe | search_google_maps | $0.0015/place | 200 places | $0.30 |
| Diagnose the problem | scrape_trustpilot | $0.005/review | 600 reviews | $3.00 |
| Qualify | get_linkedin_company | $0.004/company | 20 | $0.08 |
| Find contacts | find_website_contacts | $0.001/domain | 20 | $0.02 |
| Verify | verify_emails | $0.001/email | 40 | $0.04 |
| Total | $3.44 |
Three dollars and forty-four cents. Say a dozen of those twenty survive Step 2 with a problem that is genuinely in your lane and a body count on the complaint — that is about 29 cents per qualified lead, where “qualified” means you know the business’s name, their actual problem, how many of their customers have complained about it in public, whether they are big enough to pay, and how to reach them.
Compare that to a bought lead list, which costs more per row and is colder — because every row on it is a company, not a company with a diagnosed problem you can fix. You are not paying for contact details here. Contact details are the cheapest line in the table. You are paying for the diagnosis, and the diagnosis is the pitch.
You pay per result delivered. A search that returns nothing costs nothing.
The honest part
This does not make people want to hear from you.
That is the limit, and it is worth being straight about it. Being right about someone’s problem does not entitle you to their attention. Some of these businesses know exactly what is wrong, cannot afford to fix it, and do not need a stranger pointing at it. Some will find the whole thing intrusive no matter how accurate you are. A well-researched note from someone unwanted is still unwanted — it is just harder to dismiss, which is not automatically a kindness. Send fewer. Take the no.
It also will not do the work. If you cannot actually fix the problem you diagnosed, this flow just helps you get caught faster and more specifically.
And it does not replace judgment. Claude will name a complaint cluster; whether that cluster is your problem to solve, whether that business is one you want, and whether the honest answer is “you don’t need me, you need a different courier” — that is you. The right move is regularly to not send the email. This flow makes that decision cheap enough to make properly, which is most of its value.
What it removes is the part that was never the real work: not knowing which two hundred businesses to care about, and having nothing true to say to the twenty you do. Those are lookup problems. They have always been lookup problems. Until recently there was just no reasonable way to do the lookups, so everyone sent the generic email instead — not because it worked, but because the alternative cost forty minutes a prospect.
Now it costs 29 cents.
Tools used: Google Maps Search Scraper · Trustpilot Reviews · LinkedIn Company Details · Website Contact Finder · Email Verifier
All of them are available as one MCP endpoint.
Explore the scraper referenced in this article — see inputs, outputs, and pricing, then run it on Apify.
Frequently asked questions
Do I need to write any code for this? +
No. Everything runs from Claude Desktop through the MCP server. You add one block to a config file, paste your Apify token, and then talk to Claude in plain English. The only 'code' in this post is the JSON config block and the prompts themselves.
What does a full run actually cost? +
Pulling 200 businesses in one city, diagnosing the 20 weakest from their own reviews, qualifying them, finding contacts and verifying the addresses costs about $3.44 at current per-result rates. You pay per result delivered, and nothing for a search that returns nothing.
Isn't this just spam with extra steps? +
It is the opposite of spam if you do it honestly. Spam is sending the same message to 5,000 people and hoping. This is finding roughly a dozen businesses with a real, visible, specific problem in your speciality and telling them the truth about it. The volume is low on purpose. If you use the same research to send 5,000 mail-merged notes, you have rebuilt spam and it will perform like spam.
Why Trustpilot and not Google reviews? +
The Google Maps search returns a business's listing — name, overall rating, review count, website, phone. It does not return the text of individual reviews, so it can tell you a business has a reputation problem but not what the problem is. Trustpilot is where you read the actual complaints. That two-stage split is the whole method: Maps finds the symptom cheaply, Trustpilot diagnoses the cause on the few that matter.
What if a prospect has no Trustpilot presence at all? +
Then you have not found a diagnosable problem, and you should drop them from the list rather than guess. The point of this flow is to only pitch where you have evidence. A business with no review footprint might still be a great client, but you have nothing specific to say to them yet, so they belong in a different pile.
I Automated My AI Job Hunt: 8 Tools, One Claude Agent, Under $1
Most job hunting is spent on the wrong problem. Here is the exact end-to-end flow — find who is actually hiring, rank by real fit, research the company, find the human, and write an application grounded in facts — run entirely from Claude via MCP.
Ask an AI for a Company's SEC CIK and It Will Lie to You. Here Is the Fix.
An AI that remembers is not an AI that verifies. This is the exact diligence flow — legal identity from GLEIF, filings from EDGAR, funding, engineering activity and hiring — run from Claude via MCP, grounded in real registries, for about fifteen cents a company.
The Deal-Screening Agent: Read an Entire Metro Every Morning for 82 Cents
You are refreshing Zillow by hand and doing real comp work on maybe three houses a week. Here is the exact flow — screen every listing in a metro, pull what similar homes actually sold for, read every price cut, and surface only the few worth a second look — run from Claude via MCP. No code.