Yelp to Google Sheets, clean leads logged for you
Copying Yelp business details into a spreadsheet sounds simple. Then you do it 30 times, hit a weird hours format, miss a phone number, and realize you can’t trust your own list.
This Yelp Sheets automation hits marketing ops teams hardest, but agency owners building lead lists and local service businesses scouting competitors feel it too. You get a clean, consistent row in Google Sheets for every Yelp URL, without the tab-hopping.
Below, you’ll see how the workflow runs in n8n, what it captures, and what kind of time you realistically get back once it’s running.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Yelp to Google Sheets, clean leads logged for you
flowchart LR
subgraph sg0["📥 Form Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>📥 Form Trigger"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>🔍 Create Scrape.do Job"]
n2@{ icon: "mdi:cog", form: "rounded", label: "⏳ Wait 15s", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>📡 Check Job Status"]
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "🔁 Is Job Complete?", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "⏳ Wait 10s Retry", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>📥 Fetch Task Results"]
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>🔧 Parse Yelp HTML"]
n8@{ icon: "mdi:database", form: "rounded", label: "📊 Store to Google Sheet", pos: "b", h: 48 }
n2 --> n3
n0 --> n1
n5 --> n3
n7 --> n8
n3 --> n4
n4 --> n6
n4 --> n5
n6 --> n7
n1 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n4 decision
class n8 database
class n1,n3,n6 api
class n7 code
classDef customIcon fill:none,stroke:none
class n0,n1,n3,n6,n7 customIcon
The Problem: Yelp lead research is messy and slow
Lead lists fall apart at the exact moment you try to scale them. One person copies the “business name” from a header, another grabs it from a sidebar. Hours are formatted differently. Addresses get truncated. Sometimes the website link is missing, so you “come back later” (you won’t). And after all that work, you still don’t know if your list is complete or consistent enough to use for outreach, competitor tracking, or market research. It’s not just time. It’s mental fatigue, plus the quiet cost of basing decisions on bad data.
It adds up fast. Here’s where it usually breaks down.
- Every Yelp page forces you to hunt for the same fields in slightly different places.
- Manual copy-paste creates tiny errors that ruin sorting and filtering later.
- When you’re doing this for 50 businesses, “quick research” turns into a half-day task.
- Your team can’t standardize the dataset, so reporting and outreach become guesswork.
The Solution: Send a Yelp URL, get a clean Sheets row back
This n8n workflow turns one simple input (a Yelp business URL) into a structured record in Google Sheets. It starts with a form submission, then sends the URL to Scrape.do to run a real browser scrape (including JavaScript rendering, so dynamic Yelp pages load fully). After Scrape.do returns the page content, the workflow parses the HTML and pulls out the fields you actually need for lead gen and market research. Finally, it appends a new row to a dedicated Google Sheet, including a timestamp so you know when the data was captured. No extra tabs. No inconsistent formatting. Honestly, it feels like the spreadsheet builds itself.
The workflow begins when someone submits a Yelp link through the n8n form. It creates an asynchronous Scrape.do job, waits briefly, and then polls until the job is complete. Once results are available, it extracts business details and logs them to Google Sheets in a consistent 12-column format.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you’re building a list of 50 local businesses for a new campaign. Manually, you might spend about 5 minutes per Yelp page to capture name, rating, reviews, phone, address, site, and hours, which is roughly 4 hours of focused work (plus mistakes). With this workflow, submitting 50 URLs can take about 10 minutes total, then the scraping runs in the background at roughly 15–45 seconds per business. You end up with 50 clean rows ready to filter and use, without babysitting the process.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Scrape.do for scraping Yelp pages reliably
- Google Sheets to store and share lead rows
- Scrape.do API token (get it from Scrape.do Dashboard → API Token)
Skill level: Intermediate. You’ll connect credentials, paste an API token, and map a few fields to your sheet.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A form submission kicks it off. You (or your team) paste a Yelp business URL into the n8n form, which triggers a new run.
The URL is sent to Scrape.do for rendering. The workflow creates an asynchronous scrape job using a token in the request header, with JavaScript rendering enabled so Yelp content loads like a normal browser session.
Status is checked until the scrape is finished. n8n waits about 15 seconds, polls the job status, and loops with a short retry delay until Scrape.do reports completion.
Business fields are extracted and logged. A code step parses the returned HTML (including JSON-LD when available) and appends a row to Google Sheets with fields like rating, review count, phone, address, categories, hours, and media URLs.
You can easily modify the captured fields to match your prospecting or reporting needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the form that captures the Yelp business URL and starts the workflow.
- Add or open Incoming Form Entry.
- Set Form Title to
Yelp Business URL Scraper. - Set Form Description to
Enter a Yelp business URL to scrape business details. - In Form Fields, add a required field labeled
Yelp Business URLwith placeholderhttps://www.yelp.com/biz/business-name-city.
Step 2: Configure the Scrape Job Requests
These nodes submit a scrape job, then poll the job status and fetch the output.
- Open Initiate Scrape Job and set URL to
https://q.scrape.do/api/v1/jobsand Method toPOST. - Set JSON Body to
={{ JSON.stringify({ "Targets": [$json["Yelp Business URL"]], "Super": true, "GeoCode": "us", "Device": "desktop", "Render": { "BlockResources": false, "WaitUntil": "networkidle2", "CustomWait": 3000 } }) }}. - In Header Parameters, set X-Token to your scrape.do API key (replace
[CONFIGURE_YOUR_API_KEY]) and set Content-Type toapplication/json. - Open Poll Job Status and set URL to
=https://q.scrape.do/api/v1/jobs/{{ $('Initiate Scrape Job').item.json.JobID }}. - In Poll Job Status headers, set X-Token to the same API key.
- Open Retrieve Task Output and set URL to
=https://q.scrape.do/api/v1/jobs/{{ $('Initiate Scrape Job').item.json.JobID }}/{{ $('Initiate Scrape Job').item.json.TaskIDs[0] }}, then add the same X-Token header.
⚠️ Common Pitfall: If the X-Token header is missing or invalid, the API requests will fail. Replace [CONFIGURE_YOUR_API_KEY] in all three HTTP nodes.
Step 3: Set Up the Wait-and-Retry Logic
This loop waits for the scrape job to finish and retries until the status is successful.
- Open Delay 15s and set Amount to
15. - Open Completion Branch and set the condition to check Left Value
={{ $json.Status }}equals Right Valuesuccess. - Open Retry Pause 10s and set Amount to
10. - Verify the flow: Initiate Scrape Job → Delay 15s → Poll Job Status → Completion Branch, where the false branch loops to Retry Pause 10s and back to Poll Job Status.
Tip: If scrape jobs take longer, increase the Amount in Delay 15s and Retry Pause 10s to reduce API calls.
Step 4: Parse and Append Yelp Data
Extract structured details from the scraped HTML and append the results to Google Sheets.
- Open Extract Yelp Details and keep Mode set to
runOnceForEachItem. - Verify the JavaScript in Extract Yelp Details outputs fields like
name,overall_rating,reviews_count,url,phone,address,price_range,categories,website,hours,images_videos_urls, andscraped_at. - Open Append to Sheet and set Operation to
append. - Select the Document with ID
[YOUR_ID]and the Sheet NameSheet1(gid0), or update to your target sheet. - Ensure the sheet columns match the schema in Append to Sheet (e.g.,
name,overall_rating,reviews_count,url,phone,address,price_range,categories,website,hours,images_videos_urls,scraped_at).
Credential Required: Connect your Google Sheets credentials in Append to Sheet before running the workflow.
Step 5: Test and Activate Your Workflow
Validate the workflow end-to-end, then enable it for live use.
- Click Execute Workflow and submit a sample URL using Incoming Form Entry.
- Confirm Initiate Scrape Job returns a
JobIDand Poll Job Status eventually returnsStatus=success. - Verify Retrieve Task Output returns a
Contentpayload and Extract Yelp Details outputs parsed fields. - Check Google Sheets to confirm Append to Sheet added a new row with all fields populated.
- Turn the workflow Active to start accepting production form submissions.
Common Gotchas
- Scrape.do credentials can expire or the token can be pasted in the wrong header. If things break, check the HTTP Request nodes for the X-Token value first, then confirm the token in your Scrape.do dashboard.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- The HTML parsing is built around Yelp’s current page structure, so changes can cause blank fields. If you suddenly see empty phone numbers or hours, inspect a fresh Yelp page and adjust the regex/JSON-LD extraction in the “Extract Yelp Details” code node.
Frequently Asked Questions
About 30 minutes if your Scrape.do token and Google Sheets access are ready.
No, not for the core workflow. You may only touch the parsing code if you want extra fields or Yelp changes their layout.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Scrape.do usage costs based on your scraping volume.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll adjust the input and job creation. The fastest option is to change the Scrape.do job request body so “Targets” accepts a list of Yelp URLs, then loop through results before the “Append to Sheet” step. Common customizations include adding extra columns (like neighborhood or claimed status), changing GeoCode for different countries, and extending the render wait time for heavier pages.
Most of the time it’s an invalid or expired API token in the X-Token header. Update the token anywhere it appears in the HTTP Request nodes, then rerun a single known-good Yelp URL to confirm it works. If the token is fine, check for 401 errors in the n8n execution log, or rate limits on your Scrape.do plan when you send too many jobs too quickly.
It depends mostly on your Scrape.do plan limits and your n8n execution limits. On n8n Cloud, your plan controls monthly executions, while self-hosting has no hard execution cap (your server is the limiter). In practice, each Yelp URL takes about 15–45 seconds to scrape, so batches work best when you let it run in the background instead of waiting on it live.
Often, yes, because the “hard part” here is the scrape-and-parse loop, not a simple two-app sync. n8n handles polling, branching, and retries without making you pay extra for every path. You also have the option to self-host, which matters when you’re running a lot of URLs. Zapier or Make can still work if you keep it basic, but you’ll usually end up duct-taping together webhooks, delays, and extra steps. If you want to sanity-check your setup before you invest time, Talk to an automation expert.
Once it’s live, you stop “building lists” and start using them. The workflow handles the repetitive collection so your Sheets stays clean and usable.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.