This workflow corresponds to n8n.io template #5878 — we link there as the canonical source.
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 →
{
"id": "EgeVsV76EKfXbkcW",
"name": "Automated Real Estate Listing Extractor",
"tags": [],
"nodes": [
{
"id": "337aabda-3017-4057-8383-6855837d5e9a",
"name": "Weekly Market Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
60,
780
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "2be97af8-6121-4cbc-9239-1901d947d8e2",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"color": 6,
"width": 620,
"height": 1160,
"content": "## \ud83d\udd39 **SECTION 1: \ud83d\udd01 Schedule Trigger \u2014 Automate Workflow**\n\n### \ud83e\udde9 1. \ud83d\udcc5 Schedule Trigger\n\n**Node Name:** `Schedule Trigger` \n**What it does:** \nAutomatically triggers the workflow every 6 hours, no manual intervention needed. Keeps your data fresh and updated regularly.\n\n\ud83e\udde0 **Beginner Benefit:** \n\n> Set it once and forget it \u2014 your workflow runs automatically on schedule without any extra effort.\n\n---\n\n## \ud83d\udd39 **SECTION 2: \ud83c\udf10 Scrapeless Crawler \u2014 Fetch Webpage Data**\n\n### \ud83e\udde9 2. \ud83d\udd77\ufe0f Scrapeless Crawler\n\n**Node Name:** `Scrapeless Crawler` \n**What it does:** \nSends a request to Scrapeless API to crawl the target real estate webpage. Returns the page content in Markdown format for easy parsing later.\n\n**Example URL:** \nhttps://www.loopnet.com/search/commercial-real-estate/los-angeles-ca/for-lease/\n\n\ud83e\udde0 **Beginner Benefit:** \n\n> Leverage powerful scraping as a service \u2014 no need to write complicated crawler code yourself.\n\n---\n"
},
"typeVersion": 1
},
{
"id": "ce4de51e-920e-4e72-9aee-13f2180952fc",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
-380
],
"parameters": {
"color": 5,
"width": 700,
"height": 1540,
"content": "\n\n## \ud83d\udd39 **SECTION 4: \ud83d\udd75\ufe0f Parse Listings \u2014 Extract Property Data**\n\n### \ud83e\udde9 3. \ud83d\udd0d Parse Listings (Code Node)\n\n\n**Node Name:** `Parse Listings`\n**What it does:**\nHandles the entire extraction and cleaning process in a single code node to simplify the workflow and improve performance.\n\n\n### \u2705 **Step 1: Extract Markdown Text**\n\n* Extracts the core Markdown-formatted text from the complex HTML response returned by Scrapeless.\n* Automatically removes unwanted HTML tags, scripts, and ads, keeping only the meaningful page content.\n\n---\n\n### \u2705 **Step 2: Parse Key Information**\n\n* Uses regex and string manipulation to extract critical fields from the Markdown text, including:\n\n * \ud83c\udfe2 **Property Title**\n * \ud83d\udd17 **Link**\n * \ud83d\udcd0 **Size**\n * \ud83c\udfd7\ufe0f **Year Built**\n\n* Outputs clean, structured **JSON objects** that are easy to pass to downstream nodes.\n\n---\n\n### \u2705 **Step 3: Clean & Format Data**\n\n* Filters out unnecessary fields, keeping only the relevant ones:\n\n * `title`\n * `link`\n * `size`\n * `yearBuilt`\n\n* Formats the output to be clean and ready for export to Google Sheets, Notion, Slack, databases, or other platforms.\n\n---\n\n### \ud83e\udde0 **Beginner Benefit:**\n\n> Extracts text, parses listings, and cleans data in one step, saving time and reducing node complexity. Produces structured, ready-to-use data for your business needs.\n\n"
},
"typeVersion": 1
},
{
"id": "3cb24f03-3bc2-4ca9-9234-9dc2ab9c36a2",
"name": "Crawl",
"type": "n8n-nodes-scrapeless.scrapeless",
"position": [
360,
780
],
"parameters": {
"url": "https://www.loopnet.com/search/commercial-real-estate/los-angeles-ca/for-lease/",
"resource": "crawler",
"operation": "crawl",
"limitCrawlPages": 2
},
"credentials": {
"scrapelessApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "64cbc99c-e071-4c0d-8758-a0e5167f4c88",
"name": "Append or update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1580,
780
],
"parameters": {
"columns": {
"value": {
"Link": "={{ $json.link }}",
"Size": "={{ $json.size }}",
"Image": "={{ $json.image }}",
"Title": "={{ $json.title }}",
"YearBuilt": "={{ $json.yearBuilt }}"
},
"schema": [
{
"id": "Title",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Link",
"type": "string",
"display": true,
"required": false,
"displayName": "Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Size",
"type": "string",
"display": true,
"required": false,
"displayName": "Size",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "YearBuilt",
"type": "string",
"display": true,
"required": false,
"displayName": "YearBuilt",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image",
"type": "string",
"display": true,
"required": false,
"displayName": "Image",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Title"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1of_YOUR_AWS_SECRET_KEY_HERE/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1of_YOUR_AWS_SECRET_KEY_HERE",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1of_YOUR_AWS_SECRET_KEY_HERE/edit?usp=drivesdk",
"cachedResultName": "Real Estate Market Report"
}
},
"typeVersion": 4.6
},
{
"id": "0458cbbb-e60b-461d-aed0-562d5067946e",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1420,
-60
],
"parameters": {
"width": 580,
"height": 1220,
"content": "\n\n## \ud83d\udd39 **SECTION 6: \ud83d\udcca Append to Google Sheets \u2014 Save Data**\n\n### \ud83e\udde9 6. \ud83d\udcc8 Append to Google Sheets\n\n**Node Name:** `Google Sheets Append` \n**What it does:** \nAppends the parsed and cleaned property data into a Google Sheets spreadsheet for easy review and analysis.\n\n\ud83e\udde0 **Beginner Benefit:** \n\n> Automatically keeps your spreadsheet up-to-date with fresh listings \u2014 no copy/paste required.\n\n"
},
"typeVersion": 1
},
{
"id": "f0d425e4-af8d-4c6f-bced-625ba3b094f0",
"name": "Parse Listings",
"type": "n8n-nodes-base.code",
"position": [
860,
780
],
"parameters": {
"jsCode": "const markdownData = [];\n$input.all().forEach((item) => {\n\titem.json.forEach((c) => {\n\t\tmarkdownData.push(c.markdown);\n\t});\n});\n\nconst results = [];\n\nfunction dataExtact(md) {\n\tconst re = /\\[More details for ([^\\]]+)\\]\\((https:\\/\\/www\\.loopnet\\.com\\/Listing\\/[^\\)]+)\\)/g;\n\n\tlet match;\n\n\twhile ((match = re.exec(md))) {\n\t\tconst title = match[1].trim();\n\t\tconst link = match[2].trim()?.split(' ')[0];\n\n\t\t// Extract a snippet of context around the match\n\t\tconst context = md.slice(match.index, match.index + 500);\n\n\t\t// Extract size range, e.g. \"10,000 - 20,000 SF\"\n\t\tconst sizeMatch = context.match(/([\\d,]+)\\s*-\\s*([\\d,]+)\\s*SF/);\n\t\tconst sizeRange = sizeMatch ? `${sizeMatch[1]} - ${sizeMatch[2]} SF` : null;\n\n\t\t// Extract year built, e.g. \"Built in 1988\"\n\t\tconst yearMatch = context.match(/Built in\\s*(\\d{4})/i);\n\t\tconst yearBuilt = yearMatch ? yearMatch[1] : null;\n\n\t\t// Extract image URL\n\t\tconst imageMatch = context.match(/!\\[[^\\]]*\\]\\((https:\\/\\/images1\\.loopnet\\.com[^\\)]+)\\)/);\n\t\tconst image = imageMatch ? imageMatch[1] : null;\n\n\t\tresults.push({\n\t\t\tjson: {\n\t\t\t\ttitle,\n\t\t\t\tlink,\n\t\t\t\tsize: sizeRange,\n\t\t\t\tyearBuilt,\n\t\t\t\timage,\n\t\t\t},\n\t\t});\n\t}\n\n\t// Return original markdown if no matches found (for debugging)\n\tif (results.length === 0) {\n\t\treturn [\n\t\t\t{\n\t\t\t\tjson: {\n\t\t\t\t\terror: 'No listings matched',\n\t\t\t\t\traw: md,\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t}\n}\n\nmarkdownData.forEach((item) => {\n\tdataExtact(item);\n});\n\nreturn results;\n"
},
"typeVersion": 2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "3bbe4fe1-455d-4486-af39-d0980957100e",
"connections": {
"Crawl": {
"main": [
[
{
"node": "Parse Listings",
"type": "main",
"index": 0
}
]
]
},
"Parse Listings": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Weekly Market Trigger": {
"main": [
[
{
"node": "Crawl",
"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.
scrapelessApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This automation template helps you track the latest real estate listings from the LoopNet platform. By using Scrapeless to scrape property listings, n8n to orchestrate the workflow, and Google Sheets to store the results, you can build a real estate data pipeline that runs…
Source: https://n8n.io/workflows/5878/ — 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.
This workflow automates video distribution to 9 social platforms simultaneously using Blotato's API. It includes both a scheduled publisher (checks Google Sheets for videos marked "Ready") and a subwo
YogiAI. Uses googleSheets, googleSheetsTool, httpRequest, stopAndError. Scheduled trigger; 61 nodes.
This workflow monitors Google Calendar for events indicating that a customer will visit the company today or the next day, retrieves the required details, and sends reminder notifications to the relev
Useful if a team is working within a single instance and you want to be notified of what workflows have changed since you last visited them. Another use-case might be monitoring your managed instances
ofn hook v0.24.0 beta. Uses start, httpRequest, functionItem, itemLists. Scheduled trigger; 42 nodes.