Skip to content
ScrapeField

Blog · Guides ·

Google Maps leads for a city, into n8n

A workflow that searches Google Maps for a kind of business in a city, follows every page, drops the duplicates and appends each place to a Google Sheet. Built from n8n’s own nodes: nothing to install, and no template to buy.

ScrapeField

A list of every dentist, café or roofer in a city is the start of most local outreach. This guide builds it in n8n: one search, every page of it, one row per business in a Google Sheet, with the phone, the website and the rating. It uses n8n’s built-in nodes, so there is nothing to install.

The shape of it

Five nodes, in a line:

  1. Manual Trigger, or a Schedule Trigger to refresh the list each month.
  2. HTTP Request, which searches Google Maps through us and follows every page.
  3. Split Out, which turns each page into one item per place.
  4. Remove Duplicates, on place_id.
  5. Google Sheets, Append Row.

The HTTP Request node

The HTTP Request node’s settings
SettingValue
MethodGET
URLhttps://api.scrapefield.com/v1/google-maps/places
AuthenticationGeneric Credential Type → Header Auth, with name Authorization and value Bearer sf_live_…
Send Query Parametersquery = dentists in Austin, TX

Each place is the full listing: name, formatted_address, formatted_phone_number, website, rating, user_ratings_total, business_status and its Google Maps url, named as in Google’s Places API. The search reference has every field.

Following every page

A search answers up to 20 places a page, with a cursor for the next in meta.next_cursor and null on the last. Under the node’s Options → Pagination:

The settings that follow every page
SettingValue
Pagination ModeUpdate a Parameter in Each Request
ParametersType Query, name cursor, value {{ $response.body.meta.next_cursor }}
Pagination Complete WhenOther
Complete Expression{{ $response.body.meta.next_cursor === null }}
Limit Pages FetchedOn, with a Max Pages you are comfortable paying for

Each page costs 3 credits, so 10 pages, about 200 places, are 30 credits: between $0.01 and $0.02 depending on your pack. A page that fails costs nothing.

One row per place

Add a Split Out node with data as the field to split out, then a Remove Duplicates node comparing place_id: a business that shows up on two pages, or in two searches, becomes one row. Keep place_id as a column too. It is Google’s own id, and it is what the next run dedupes against.

Into the sheet

The Google Sheets node, Append Row, maps the fields to columns. For outreach, a Filter before it can keep the places that matter: business_status is OPERATIONAL, so closed ones stay out, or website is empty, for businesses that have none. Google Maps lists no emails; the website is where to look for one.

For a whole metro area rather than one search, split it into neighbourhoods or a grid of points, as Google Maps leads for a whole city does, and feed each query to the same node. The workflow is the same for LinkedIn jobs; only the URL and the parameters change.

More articles