Get Started

Find local businesses that just told the internet they need you

A job ad for a part-time marketer, a Google listing pointing at a dead website, a 5-star review that says "hard to find your number". Learn to spot the public signs that a business needs help this month, and build a list of 20 worth pitching with one spreadsheet and no paid tools.

48 minBeginnerTools: Free (optional OpenSEO lookups cost cents)Free mission
Eight buying signals that show a business needs help right now, and where to find each one
A list of 20 local businesses with a clear reason each one needs help
A ready-made script that speed-tests all 20 websites in one go, plus a sample sheet to start from
  • For each one: whether you're allowed to email, or should call or visit
Before you start
  • A browser and a free Google Sheets or Excel file
  • Optional: OpenSEO set up to check search numbers
  • For the speed test (step 4): Python 3 and a free Google Cloud API key
01/05Pick a niche where clicks are worth money0 done
STEP 01 of 05~8 min

Pick a niche where clicks are worth money

A business that pays a lot per click has more to gain from you, and can afford you.

  1. Start with businesses where one new customer is worth hundreds of pounds or more. Good starting ideas: trades (roofers, plumbers, electricians), storage and removals, dentists and clinics, solicitors and accountants, driving schools, wedding venues.

  2. If you have OpenSEO, check the numbers: run Keyword Research on "[service] near me" for your country. Note the monthly searches and the CPC (what advertisers pay per click). You want real demand (hundreds of searches a month or more) and a CPC of a few pounds or more. Emergency trades, storage, legal and dental searches usually clear that easily.

    TipPick one niche and one area to start. Pitching "plumbers in Leeds" all week makes you an expert fast, and your audits get quicker each time.
✓
CheckpointYou've written down one niche and one town or city.
Stuck? Ask the community
STEP 03 of 05~10 min

Build your target list

A simple sheet turns random browsing into a pipeline.

  1. Make a sheet with these columns and fill one row per business:

    Sheet columns
    Business | Website | Phone | Google reviews | On page 1? | Running ads? | Biggest problem you spotted | Company type (Ltd / sole trader) | Contact by | Status
  2. Score them quickly: a business with good reviews but invisible on Google is the best prospect. It's clearly good at the work and just needs to be found. Put those at the top.

    TipUse public business information only: the business name, website, business phone and business email shown on their site or Google listing. Don't dig up owners' personal details.
✓
CheckpointYour sheet has 20 rows with the biggest problem filled in for each.
Stuck? Ask the community
STEP 04 of 05~18 min

Unfair advantages: buying signals most people never look for

Everyone else pitches whoever is on the map. You pitch the businesses that have just shown you, in public, that they need help now.

  1. A list of 20 is a start. A list of 20 where each one has a reason to say yes this month is a different game. These tactics take longer per lead, which is the point: most people won't bother, so the businesses you find this way rarely hear from anyone else.

  2. 1. Read the job ads, not the directorySearch Indeed and LinkedIn Jobs for marketing assistant, social media or marketing executive plus your niche and town, posted in the last 14 days. A dental practice advertising for a part-time marketer has admitted the problem and set aside a budget. You're cheaper than a salary and can start next week. The line: pitch the business through its allowed route (Ltd by email, otherwise phone or visit). Never apply to the job as a fake candidate to get a meeting.

  3. 2. Catch them in their first 90 daysNew businesses need everything at once. Two free, public sources: Companies House advanced search ↗ lets you filter by incorporation date, location and SIC code (for example 86230 dental practices or 43220 plumbing and heating). For anything selling food, the food hygiene ratings site ↗ lists places marked Awaiting inspection, which usually means newly opened. New company leads goes deeper. The line: Companies House shows directors' names and sometimes home addresses. Contact the business, never the person at home.

  4. 3. Let their own customers write your openerOn Google Maps, open a prospect's reviews and use the search reviews box for website, find, phone and prices. A 5-star review that says "great job, but hard to find your number" is the best first line you'll ever get, because the owner has already heard it from a customer. The line: quote it accurately and leave the reviewer's name out of anything you send.

  5. 4. Spot the dead website linkGoogle shut down its free Business Profile websites (the business.site addresses) in 2024. Some businesses never updated their profile, so the Website button on Maps still points to a dead page. Tap every Website button in your list. A dead link, a link to a Facebook page, or a free wixsite.com address all mean the same thing: nobody is looking after this.

  6. 5. Find the orphaned clientsSmall web agencies close and leave their clients with nobody to call. Note the "website by" credit in each prospect's footer, then look the agency up on Companies House. Dissolved or in liquidation means every site carrying that credit has lost its support. Google "website by [agency name]" to find the rest of them.

  7. 6. Check ads without costing them moneyThe Google Ads Transparency Center ↗ shows which businesses run ads and what the ads say, with no clicking. A business paying for ads that land on a slow or broken page is spending money right now, and you can show them where it leaks. The line: never click a prospect's or competitor's ads to check them. Repeated clicks drain their budget and count as click fraud.

  8. 7. Run 20 speed tests while you make a teaThis short Python script runs Google's own PageSpeed test on every site in your sheet, one at a time, and writes the mobile scores to speed.csv. Download speed_check.py and the sample targets.csv (same columns as step 3), or export your own sheet as targets.csv. It needs the Business and Website columns.

  9. Get a free key firstWithout one, Google refuses almost straight away. Here's what a keyless run of the sample file returns:

    Output
    Example Domain (test row)  |  error  |  HTTP Error 429: Too Many Requests
    GOV.UK (test row)  |  error  |  HTTP Error 429: Too Many Requests
  10. Open the PageSpeed Insights API get-started page ↗, click Get a Key, and pick or create a Google Cloud project. Copy the key, then set it in the same terminal you'll run the script from:

    Windows (PowerShell)
    $env:PSI_KEY="paste-your-key"
    Mac or Linux
    export PSI_KEY=paste-your-key
  11. Then run python speed_check.py targets.csv in the folder with both files. Here's the script, if you'd rather paste it:

    speed_check.py (run: python speed_check.py targets.csv)
    import csv, json, os, sys, time, urllib.parse, urllib.request
    
    API = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
    with open(sys.argv[1], newline="", encoding="utf-8") as f, \
         open("speed.csv", "w", newline="", encoding="utf-8") as out:
        w = csv.writer(out)
        w.writerow(["Business", "Website", "Mobile score", "Largest paint"])
        for row in csv.DictReader(f):
            url = row["Website"].strip()
            if not url:
                continue
            q = {"url": url, "strategy": "mobile"}
            if os.environ.get("PSI_KEY"):
                q["key"] = os.environ["PSI_KEY"]
            try:
                data = json.load(urllib.request.urlopen(API + "?" + urllib.parse.urlencode(q), timeout=120))
                lh = data["lighthouseResult"]
                score = round(lh["categories"]["performance"]["score"] * 100)
                lcp = lh["audits"]["largest-contentful-paint"]["displayValue"]
            except Exception as e:
                score, lcp = "error", str(e)[:60]
            w.writerow([row["Business"], url, score, lcp])
            print(row["Business"], score, lcp, sep="  |  ")
            time.sleep(5)
  12. Then paste speed.csv and your "biggest problem" column into Claude or ChatGPT and ask for one plain-English opening line per business, using only the numbers given. Twenty tailored openers in five minutes instead of an evening.

  13. 8. Time it to their busy seasonPitch the month before demand jumps, when owners are already thinking about it: heating engineers in late summer before the boiler rush, roofers and gutter cleaners before the autumn storms, wedding venues before the January booking season. Avoid accountants in January.

  14. What a perfect lead looks likeHere's an example row, with every column drawn from one of the signals above:

    Example lead row
    Business: Example Dental Care (Ltd)
    Website: Maps button points to a dead business.site page
    Google reviews: 4.9 from 212
    On page 1?: No (page 3 for "dentist [town]")
    Running ads?: No
    Biggest problem: Advertising for a part-time marketing assistant (Indeed, 6 days ago). Review: "Brilliant dentist, shame the website never loads". Mobile speed score 23 on the old site
    Contact by: Email
    Status: Pitch this week
  15. Three signals, one row. That's a business that has already admitted the problem, set aside money for it, and heard about it from a customer.

    CarefulTrap to skip: buying a "local business email list". It's stuffed with sole traders you can't legally email, the ICO says the soft opt-in never covers bought-in lists, and strangers on a list reply worse than the 20 you picked by hand.
✓
CheckpointAt least 5 of your 20 rows now have a buying signal in the "Biggest problem" column: a job ad, a new opening, a dead link, an orphaned site, a review quote or a speed score.
If it breaksThe speed script says 'HTTP Error 429' + 2 more
The speed script says 'HTTP Error 429'
The key isn't set in this terminal. Set PSI_KEY again (it only lasts for the window you set it in) and rerun. Keep the key out of the CSV and out of any chat.
A row says 'error' with a timeout or 'HTTP Error 400'
Check the address in the Website column starts with https:// and opens in your browser. A site that's down is itself a signal: note it in Biggest problem.
Companies House advanced search shows thousands of results
Narrow it: one SIC code, one town or postcode area, incorporated in the last 90 days, status Active. Then check each one actually trades in your area before it goes on the list.
Still stuck? Ask the community
STEP 05 of 05~5 min

Mark how you're allowed to contact each one

UK rules decide whether you can email or need to call or visit.

Search each business on Companies House ↗ (free, no account needed). Under UK marketing rules (ICO guidance ↗):

  • Shows as an active Ltd or LLP: you can send a marketing email without asking first. Put Email in your sheet.
  • Not found: treat it as a sole trader or partnership. They count as individuals for email, so put Call or visit.
CarefulWhatever the type, every message must say who you are and give an easy way to opt out. If anyone says no, mark them Do not contact and stick to it.
✓
CheckpointEvery row says Email or Call or visit.
Stuck? Ask the community

Your first wins

It works. Now do something with it.

Let AI sort your list

Paste your sheet (business names and the problems you noted, no personal details) into Claude or ChatGPT:

Prompt
Here's my list of local [niche] businesses in [town], with what I noticed about each one's Google presence. Rank them from best to worst prospect for a local SEO and Google Ads service, and give a one-line reason for each. Best prospects: good reputation but poor visibility.

[paste your rows]

Next: audit your top 3

Take the top three from your list into the next lesson and run a full OpenSEO audit on each.

Undo it cleanly

How to remove everything this mission installed.

Nothing to uninstall. Keep the sheet: it becomes your record of who you've contacted and what they said.

Next mission · Make money with AISee any business's Google traffic, keywords and rivals for about 7 cents
→