Mindket

Google Maps leads with emails read from each website

Newversion 1 · updated

Overview

An n8n workflow that turns a Google Maps search into a sheet of local businesses with emails. A form takes a keyword, a place and a number. Apify collects the businesses, gpt-4o-mini reads each website for an email, and Anymail Finder fills the gaps.

Google Maps leads with emails read from each website is an n8n workflow in the Marketing & SEO category, listed by Mindket. It is free. This is version 1, last updated on . Download it on this page or copy its JSON, then import it into an n8n canvas. Nothing runs until you activate it in n8n.

At a glance

Runs in
  • n8n Cloud: import the file into a new workflow there
  • Your own n8n server: the same file and steps
  • Google Sheets: one row for each business, ready to filter and sort
  • A mail tool or a CRM: add a node after the last sheet node to send the leads on

Platform

Connects 5 apps

How it works

Trigger

Leads form

It starts when someone sends the Google Maps Leads form with:

  • A keyword, such as the kind of business
  • A location
  • The most places to collect, in Max results

Actions

  1. Apify’s Google Maps Actor returns the matching businesses, with address, website and phone
  2. Each website is read through Jina, and gpt-4o-mini picks the best contact email on it
  3. The business and its email are saved to Google Sheets, matched on its name
  4. When no email was found, Anymail Finder searches the site’s domain and the row is updated

Result

A sheet of local businesses, each with a contact email wherever the site or Anymail Finder could supply one

Integrations

What you need before you start.

Apify

Business scraping

Runs Google Maps Scraper by Compass from your keyword and place, and returns each business with its address, website and phone.

NeedsApify API token, and credit for the places

Jina AI

Page reading

Returns each business’s website as plain text through its Reader address, for the model to read.

NeedsNo key in the file. A Jina key raises its rate limit

OpenAI

Language model

Runs gpt-4o-mini to pick the best contact email from a site’s text, or to answer Null.

NeedsOpenAI API key

Anymail Finder

Email search

Searches a business’s domain for addresses when its site gave none, and returns them for the sheet.

NeedsAnymail Finder API key, and credit for the lookups

Google Sheets

Lead sheet

Saves each business with its details and email, matched on its title, and updates the email when Anymail Finder finds one.

NeedsA Google account to sign in with, and a sheet with seven headers

Workflow check

Checked by Mindket on 13 Nov 2026

Steps
10 steps, starting on a form
AI
1 step calls an AI model: Message a model
Sign-ins
Signs in to: Google Sheets, Anymailfinder and Apify
API keys
No API key is left in the file; 2 blanks in it for your own key
Step types
Mindket’s checker reads all 7 of its step types

Read from the workflow’s file, not from a run.

About

What it is

This n8n workflow turns a Google Maps search into a sheet of local businesses with a contact email for each. A form takes a keyword, a place and how many results you want. An Apify Actor collects the businesses. The workflow then visits each one’s website through Jina and has gpt-4o-mini pick the best contact email on it. When the page has none, Anymail Finder searches the site’s domain instead. Every business is saved to Google Sheets with its address, phone and link. Ten nodes run in one loop.

Who it suits

Freelancers, agencies and small sales teams that sell to local businesses, such as dentists, restaurants or plumbers, and need an address to write to, not only a phone number. Skip it if a phone number is enough for you. The email steps add most of the cost and the time.

Who uses it, and how
IndustryWho uses itHow they use itExample
Web design and SEOFreelancers and small agenciesSearch one trade in one city and pitch the businesses with a weak siteA designer searches dentists in one city and writes to the ones whose site looks dated.
Home and trade servicesSuppliers and software sellersBuild a list of contractors for each tradeA tool seller lists roofers in three towns and writes to the ones that have an address.
Local marketingAccount managersRun one search for each area a client servesAn account manager runs a search for each neighborhood a client covers.
Recruiting and staffingRecruitersFind employers in a trade and a placeA recruiter lists hotels in a resort town and writes to the address on each hotel’s site.

You need some n8n and four accounts: Apify, OpenAI, Anymail Finder and Google. Its author puts setup at about 16 minutes, which assumes the accounts already exist.

Where to use it

Any n8n that can reach Apify, OpenAI, Jina, Anymail Finder and Google will run it. The sheet is the one place you read the results.

  • n8n Cloud: import the file into a new workflow there
  • Your own n8n server: the same file and steps
  • Google Sheets: one row for each business, ready to filter and sort
  • A mail tool or a CRM: add a node after the last sheet node to send the leads on

Setup

Get it saves a zip with workflow.json and Mindket’s setup notes in your downloads folder. Make the sheet first, since two nodes point at it.

What you need first
NeedDetail
n8nOn n8n Cloud or on a server of your own
ApifyAn account, its API token and credit, for the Google Maps Actor
OpenAIAn API key that can use gpt-4o-mini
Anymail FinderAn account, its API key and credit, for the sites with no email
GoogleAn account that can edit the sheet, for a Google Sheets OAuth2 credential
A sheetA tab named Sheet1 with seven headers in row 1: Title, Street, Neighborhood, Website, Phone, Email and URL
  1. In n8n, create a workflow, open its menu, choose Import from File and pick workflow.json.
  2. Make the sheet, then copy its ID: the long part of its address between /d/ and /edit.
  3. Add a Google Sheets OAuth2 credential. In Append or update row in sheet1 and Update row in sheet, select it and replace YOUR_SHEET_ID with the ID. Both find the tab by the name Sheet1.
  4. Add an OpenAI credential and select it in Message a model.
  5. In HTTP Request1, replace <YOUR_APIFY_TOKEN> in the Authorization header with your token. The brackets go too, so the header reads Bearer, a space and the token.
  6. In Anymail, replace <YOUR_ANYMAILFINDER_KEY> in the Authorization header with your key and nothing else.
  7. Save, open the form’s test address and enter a keyword, a place and a small number such as 10.
  8. Press Publish when the first run looks right.

Anymail Finder’s documentation, read on 2 November 2026, gives the key as the whole header value, with no Bearer before it. The file’s placeholder had one, so it is gone here.

How to use it

Open the form from On form submission1 and fill in Keyword, Location and Max results. None is marked required. Still, an empty Max results breaks the request. The form answers as soon as it is sent. Nothing shows in the sheet until Apify has finished the search. Then the rows arrive one at a time, and a row’s email may be filled in a moment later by the Anymail Finder step.

What to change for a different result
To changeWhere
Kind of business and placeThe form’s Keyword and Location fields. The Actor takes free text for both
Number of placesMax results in the form, which sets maxCrawledPlacesPerSearch
Language of the resultslanguage in the body of HTTP Request1, en in the file
Which email winsThe prompt in Message a model, which asks for the most authoritative address
Columns savedEdit Fields and the mapping in both Google Sheets nodes

Example

You enter this in the form:

Keyword: dentist
Location: Austin, Texas
Max results: 20

Apify returns up to that many dentists. For each one, a row is written like this one:

One row in the sheet
ColumnValue
TitleBright Smile Dental
Street120 Congress Ave
NeighborhoodDowntown
Websitehttps://brightsmile.example
Phone+15125550123
Emailinfo@brightsmile.example
URLThe business’s Google Maps address

When the site holds no email, the model answers Null and the row first says so. Once Anymail replies, Email holds the list it returned, such as ["info@brightsmile.example"].

For newcomers and experts

If you are new. n8n draws a workflow as boxes joined by lines, and each box, a node, does one job. Here Loop Over Items hands one business at a time down the chain and takes it back at the end. Run it with 10 places first. Each node then shows what it received and sent, which is where a wrong key or a blocked website turns up.

For experts. The whole run sits in one loop, and each stage is one or two nodes.

What each stage does
StageNodesWhat to know
SearchHTTP Request1A POST to Apify’s run-sync-get-dataset-items for the Actor compass~crawler-google-places. The body holds searchStringsArray, locationQuery, maxCrawledPlacesPerSearch and language
TidyEdit FieldsKeeps seven fields and takes the domain from the website with extractDomain()
ReadScrape Website, Message a modelJina returns the page as plain text, and gpt-4o-mini answers with one address or the word Null
SaveAppend or update row in sheet1, Update row in sheetBoth match rows on Title
FallbackIf, AnymailAn answer holding Null sends the domain to Anymail Finder, and its list of addresses is written to Email

The check for Null is case-sensitive. Scrape Website and Anymail carry on when a call fails, so a dead site does not stop the loop.

Good to know

Three vendors bill by use, one free service has a cap, and the file calls an older Anymail Finder address.

  • Billing: Apify bills each scraped place, with add-ons billed apart. OpenAI bills one small call for each place. Anymail Finder’s documentation says it charges a credit only when it finds valid emails
  • Time limit: Apify ends a synchronous call after 300 seconds, according to its API reference, so a large search can come back with no places. Start small
  • Jina’s cap: its page, read the same day, allows 20 reads a minute without a key. A failed read leaves the model nothing to read, so that row probably goes to Anymail Finder
  • Same name: both sheet writes match on Title, so two businesses with one name overwrite each other
  • Older address: the file calls v5.0/search/company.json and reads results.emails. The current documentation describes v5.1/find-email/company, with the addresses in emails. The older one still answered when we checked. If it stops, change both
  • Personal data: the list holds phone numbers and sometimes an owner’s email, so check the rules for cold email where you market
  • Keys: the Apify token and the Anymail Finder key sit in headers, so take them out before you share the workflow
  • Credentials: the JSON holds none, and nothing from its author’s sheet

README and files

README

Google Maps leads with emails read from each website

An n8n workflow. A form takes a keyword, a place and a number. An Apify Actor collects the matching businesses from Google
Maps, and the workflow reads each business's website to find a contact email. When the site has none, Anymail Finder
searches the domain. Every business is saved to a Google Sheet.

What is inside

  • workflow.json: the workflow as n8n exports it, ten nodes and no sticky notes. It holds no credential.
  • README.md: these notes.

What we changed from the original copy

  • The Apify and Anymail Finder headers held a placeholder, Bearer <api key>. They now say Bearer <YOUR_APIFY_TOKEN>
    and <YOUR_ANYMAILFINDER_KEY>. Anymail Finder's documentation, read on 2 November 2026, gives the key as the whole
    header value with no Bearer before it, so the second one has none.
  • The author's sheet and its tab id are gone. Both Google Sheets nodes ask for YOUR_SHEET_ID and find the tab by the name
    Sheet1.

Before you start

  • An n8n instance, on n8n Cloud or your own server.
  • An Apify account and its API token, with credit. The Actor, Google Maps Scraper by Compass, is paid per place scraped.
  • An OpenAI API key that can use gpt-4o-mini.
  • An Anymail Finder account and its API key, with credit for the lookups.
  • A Google account, and a Google Sheet for the leads.

Jina's Reader needs no key in this file.

Set it up

  1. In n8n, create a workflow, open its menu and choose Import from File. Pick workflow.json.
  2. Make a Google Sheet with a tab named Sheet1 and these headers in row 1: Title, Street, Neighborhood, Website,
    Phone, Email, URL. Copy the sheet's ID: the long part of its address between /d/ and /edit.
  3. Add a Google Sheets OAuth2 credential. In Append or update row in sheet1 and Update row in sheet, select it and
    replace YOUR_SHEET_ID with the ID.
  4. Add an OpenAI credential and select it in Message a model.
  5. In HTTP Request1, replace <YOUR_APIFY_TOKEN> in the Authorization header with your token. The brackets go too, so
    the header reads Bearer, a space and the token.
  6. In Anymail, replace <YOUR_ANYMAILFINDER_KEY> in the Authorization header with your key, and nothing else.
  7. Save, open the form's test address, fill in the three fields with 10 in Max results, and watch the sheet.
  8. Press Publish at the top of the canvas (or Shift+P) when the first run looks right.

How a run goes

  1. The form asks for Keyword, Location and Max results. None is marked required.
  2. HTTP Request1 posts them to Apify's run-sync-get-dataset-items address for the Actor compass~crawler-google-places
    and waits for the places. The body sets the language to en.
  3. Edit Fields keeps Title, Street, Neighborhood, Website, Phone (from phoneUnformatted) and URL, and adds a
    Domain taken from the website.
  4. Loop Over Items takes one place at a time. Then Scrape Website fetches its site through Jina's Reader at
    https://r.jina.ai/, which returns the page as plain text. Next, Message a model asks gpt-4o-mini for the best
    contact email on it, ideally the owner's, and for the word Null when there is none.
  5. Append or update row in sheet1 saves the place with that answer in Email, matching rows on Title.
  6. If looks for Null in the answer. When it is there, Anymail searches the place's Domain, and Update row in sheet
    writes the list it returns into Email. Otherwise the loop moves to the next place.

Change the search

  • Place and kind: the form's three fields. The Actor takes free text for both.
  • Language of the results: language in the body of HTTP Request1.
  • Which email counts: the prompt in Message a model. It asks for the most authoritative address.
  • What is saved: the mapping in the two Google Sheets nodes, and the fields in Edit Fields.

Good to know

  • Apify bills each scraped place, and its listing for the Actor sets add-on prices apart. OpenAI bills one small call for
    each place, and Anymail Finder's documentation says a credit is charged only when valid emails are found.
  • Apify ends a synchronous call after 300 seconds, according to its API reference read on 2 November 2026, so a large search
    can come back without places. Start with 20.
  • Jina's page, read the same day, allows 20 reads a minute without a key. A search of 100 places makes 100 reads, and a read
    that fails leaves the model nothing to read. Add a Wait node in the loop or put a Jina key in the request's header.
  • Both sheet nodes match on Title, so two businesses with the same name overwrite each other.
  • An empty Max results leaves the Apify request body broken. Fill all three form fields.
  • The file calls Anymail Finder's older v5.0/search/company.json address and reads results.emails. Its current
    documentation describes v5.1/find-email/company, which returns the addresses in emails. The older address still
    answered when we checked. If it stops, change the address and read $json.emails in Update row in sheet.
  • The check for Null is case-sensitive.
  • The list holds business names, phone numbers and sometimes an owner's email. Check the rules for cold email where you
    market before you contact anyone.
  • The Apify token and the Anymail Finder key sit in headers, so take them out before you share the workflow.
Files
README.md  5 KB
workflow.json  16 KB

2 files, 21 KB, downloaded as a zip.

What’s new

  • Version 1 · 2026-11-03

Reviews

No ratings yet

Write a review

No reviews yet.

More from Mindket

See all from Mindket

Huashu Design

alchaincyf · Skill

Turns a one-line request in your AI agent into a finished design: a launch animation, a clickable app prototype, an editable slide deck, an infographic or a se…

New29.4k

Guizang PPT Skill

op7418 · Skill

Skill that makes single-file HTML slide decks, slide illustrations and platform covers in two visual styles, with a presenter mode for rehearsal. For speakers…

New29.8k

Claude Code Skills & Plugins

alirezarezvani · Skill

Adds 411 ready-made skills for Claude Code and other coding agents, grouped by role from engineering and product to marketing, finance and compliance. Installs…

New29.8k

Similar in Marketing & SEO

See all in Marketing & SEO

Pixel Art XL

nerijs · Kit

A pixel art style add-on for Stable Diffusion XL that turns text prompts into pixel-style images, with an optional LCM LoRA for faster runs. For game makers, d…

New

Licon MSR for LTX-2.5

LiconStudio · Kit

Keeps characters, clothing, objects and backgrounds consistent in generated video by feeding the model up to five reference images. A LoRA for LTX-2.5 in Comfy…

New

Flux.2-Klein-9B-MatchingPose

nhathoangfoto · Kit

A LoRA for FLUX.2 Klein 9B that puts a character into the pose shown by a mannequin reference while keeping the character's face and style. For artists and des…

New