This workflow corresponds to n8n.io template #9182 — we link there as the canonical source.
This workflow follows the Google Sheets → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "1562d037-9fa3-488f-a5e5-5aceaba3d3a1",
"name": "When clicking 'Test workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-160,
-160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "873e06bf-4862-4d40-9b77-f08f1cf889c3",
"name": "Read Zillow URLs from Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
64,
-160
],
"parameters": {
"options": {
"returnFirstMatch": false
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1D2cU-NoW4ubx_IQ6piRRO3_d0Fx7jzdpWxKkBqEq7HU/edit#gid=0",
"cachedResultName": "URLs"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1D2cU-NoW4ubx_IQ6piRRO3_d0Fx7jzdpWxKkBqEq7HU",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1D2cU-NoW4ubx_IQ6piRRO3_d0Fx7jzdpWxKkBqEq7HU/edit?usp=drivesdk",
"cachedResultName": "outcome"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "9dc0d92a-e56f-4b83-9dc5-986507a17eaf",
"name": "Scrape Zillow URL via Scrape.do",
"type": "n8n-nodes-base.httpRequest",
"position": [
288,
-160
],
"parameters": {
"url": "={{ \"https://api.scrape.do/?url=\" + encodeURIComponent($json.URLs) + \"&super=true\" }}",
"options": {
"timeout": 120000,
"redirect": {
"redirect": {
"followRedirects": false
}
}
},
"authentication": "genericCredentialType",
"genericAuthType": "httpQueryAuth"
},
"credentials": {
"httpQueryAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "a7cabb4d-1b33-46c4-a9e0-e70fe70e2ec2",
"name": "Parse Zillow Data",
"type": "n8n-nodes-base.code",
"position": [
512,
-160
],
"parameters": {
"jsCode": "// Parse HTML and extract Zillow property data\nconst item = $input.first();\n\n// Get HTML from Scrape.do response\nconst html = item.json.data || item.json.body || item.json;\n\n// Skip if no HTML content\nif (!html || typeof html !== 'string') {\n return [];\n}\n\n// Get the original URL\nconst originalUrl = $('Read Zillow URLs from Google Sheets').first().json.URLs || 'N/A';\n\n// Extract Price - improved regex\nlet price = 'N/A';\n// Try multiple patterns\nconst pricePattern1 = html.match(/data-testid=\"price\"[^>]*>\\s*\\$?([0-9,]+)\\s*</)\nconst pricePattern2 = html.match(/\"price\"[^}]*\"value\"\\s*:\\s*\"?\\$?([0-9,]+)\"?/)\nconst pricePattern3 = html.match(/\\$([0-9]{3},[0-9]{3}(?:,[0-9]{3})?)(?!\\d)/)\n\nif (pricePattern1) {\n price = '$' + pricePattern1[1].trim();\n} else if (pricePattern2) {\n price = '$' + pricePattern2[1].trim();\n} else if (pricePattern3) {\n price = pricePattern3[0].trim();\n}\n\n// Extract Address, City, and State\nlet street = 'N/A';\nlet city = 'N/A';\nlet state = 'N/A';\n\nconst addressMatch = html.match(/(\\d+\\s+[^,]+),\\s*([^,]+),\\s*(\\w{2})\\s+\\d{5}/);\nif (addressMatch) {\n street = addressMatch[1].trim();\n city = addressMatch[2].trim();\n state = addressMatch[3].trim();\n}\n\n// Extract Days on Zillow\nlet daysOnZillow = 'N/A';\nconst daysMatch = html.match(/(\\d+)\\s+days?\\s*on\\s+Zillow/i);\nif (daysMatch) {\n daysOnZillow = daysMatch[1];\n}\n\n// Extract Zestimate\nlet zestimate = 'N/A';\nconst zestimateMatch = html.match(/\\$[\\d,]+(?=\\s*Zestimate)/);\nif (zestimateMatch) {\n zestimate = zestimateMatch[0];\n}\n\n// Return ONLY structured data\nreturn [{\n json: {\n URL: originalUrl,\n Price: price,\n Address: street,\n City: city,\n State: state,\n 'Days on Zillow': daysOnZillow,\n Zestimate: zestimate,\n 'Scraped At': new Date().toISOString()\n }\n}];"
},
"typeVersion": 2
},
{
"id": "436fbea1-b770-4ef3-8995-c79c6adf46a1",
"name": "Write Results to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
720,
-160
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "data",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "data",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 2048497939,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1D2cU-NoW4ubx_IQ6piRRO3_d0Fx7jzdpWxKkBqEq7HU/edit#gid=2048497939",
"cachedResultName": "Outcome"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1D2cU-NoW4ubx_IQ6piRRO3_d0Fx7jzdpWxKkBqEq7HU",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1D2cU-NoW4ubx_IQ6piRRO3_d0Fx7jzdpWxKkBqEq7HU/edit?usp=drivesdk",
"cachedResultName": "outcome"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "00a73a1f-faf5-421e-abc4-a75b2b132c4a",
"name": "Check if Scraping Succeeded",
"type": "n8n-nodes-base.if",
"position": [
288,
32
],
"parameters": {
"options": {},
"conditions": {
"string": [
{
"value1": "={{ $json.statusCode }}",
"value2": "200",
"operation": "equals"
}
]
}
},
"typeVersion": 2
}
],
"connections": {
"Parse Zillow Data": {
"main": [
[
{
"node": "Write Results to Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Check if Scraping Succeeded": {
"main": [
[
{
"node": "Parse Zillow Data",
"type": "main",
"index": 0
}
]
]
},
"When clicking 'Test workflow'": {
"main": [
[
{
"node": "Read Zillow URLs from Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Scrape Zillow URL via Scrape.do": {
"main": [
[
{
"node": "Check if Scraping Succeeded",
"type": "main",
"index": 0
}
]
]
},
"Read Zillow URLs from Google Sheets": {
"main": [
[
{
"node": "Scrape Zillow URL via Scrape.do",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googleSheetsOAuth2ApihttpQueryAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This template requires a self-hosted n8n instance to run.
Source: https://n8n.io/workflows/9182/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
TrackCollect_deeper. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 80 nodes.
This template is ideal for solo store owners, eCommerce marketers, automation beginners, or anyone using Shopify and Gmail who wants to recover lost revenue without coding.
PCN. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 60 nodes.
Product Ad Machine. Uses googleDrive, googleSheets, httpRequest, @ffmpeg-micro/n8n-nodes-ffmpeg-micro. Event-driven trigger; 60 nodes.
Basic AI SEO KW Research n8n DataForSEO Gumroad 030125. Uses googleSheets, googleDrive, httpRequest. Event-driven trigger; 56 nodes.