This workflow corresponds to n8n.io template #5981 — 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 →
{
"nodes": [
{
"id": "d20ec65c-efb5-46fc-b6b9-82450f3818c8",
"name": "Format Data",
"type": "n8n-nodes-base.code",
"position": [
1820,
80
],
"parameters": {
"jsCode": "return items.map(item => {\n const raw = item.json?.result?.content?.[0]?.text;\n\n if (!raw) {\n return { json: { error: \"No raw content\", original: item.json } };\n }\n\n let data;\n try {\n data = typeof raw === \"string\" ? JSON.parse(raw) : raw;\n } catch (e) {\n return { json: { error: \"Invalid JSON\", original: raw } };\n }\n\n if (!data || typeof data !== 'object') {\n return { json: { error: \"Parsed data invalid\", original: raw } };\n }\n\n const listingUrl = data.listingUrl || \"\";\n const idMatch = listingUrl.match(/\\/rooms\\/(\\d+)/);\n const id = idMatch ? idMatch[1] : null;\n\n const sections = Array.isArray(data.details) ? data.details : [];\n\n let lat = null;\n let lng = null;\n let houseRules = null;\n let highlights = null;\n let description = null;\n let amenities = null;\n\n sections.forEach(section => {\n switch (section.id) {\n case \"LOCATION_DEFAULT\":\n lat = section.lat || null;\n lng = section.lng || null;\n break;\n case \"POLICIES_DEFAULT\":\n houseRules = section.houseRulesSections || null;\n break;\n case \"HIGHLIGHTS_DEFAULT\":\n highlights = section.highlights || null;\n break;\n case \"DESCRIPTION_DEFAULT\":\n description = section.htmlDescription?.htmlText || null;\n break;\n case \"AMENITIES_DEFAULT\":\n amenities = section.seeAllAmenitiesGroups || null;\n break;\n }\n });\n\n return {\n json: {\n id: id || \"\",\n listingUrl,\n location: {\n lat,\n lng\n },\n houseRules,\n highlights,\n description,\n amenities\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "93bffd11-f607-4cc6-90e7-e3ea29caf00b",
"name": "Clear Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
2020,
80
],
"parameters": {
"columns": {
"value": {
"id": "={{ $json.id }}",
"amenities": "={{ $json.amenities }}",
"highlights": "={{ $json.highlights }}",
"houseRules": "={{ $json.houseRules }}",
"description": "={{ $json.description }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "price_per_night",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "price_per_night",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "total_price",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "total_price",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "price_details",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "price_details",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "beds_rooms",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "beds_rooms",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "rating",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "rating",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "reviews",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "reviews",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "badge",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "badge",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "location",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "location",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "houseRules",
"type": "string",
"display": true,
"required": false,
"displayName": "houseRules",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "highlights",
"type": "string",
"display": true,
"required": false,
"displayName": "highlights",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "description",
"type": "string",
"display": true,
"required": false,
"displayName": "description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "amenities",
"type": "string",
"display": true,
"required": false,
"displayName": "amenities",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA/edit#gid=0",
"cachedResultName": "1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA/edit?usp=drivesdk",
"cachedResultName": "airbnb"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "a28bf4de-f7e9-446d-9c9e-2abcff994f64",
"name": "Update Google Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1360,
20
],
"parameters": {
"columns": {
"value": {
"id": "={{ $json.id }}",
"url": "={{ $json.url }}",
"name": "={{ $json.name }}",
"badge": "={{ $json.badge }}",
"rating": "={{ $json.rating }}",
"reviews": "={{ $json.reviews }}",
"location": "={{ $json.location }}",
"beds_rooms": "={{ $json.beds_rooms }}",
"total_price": "={{ $json.total_price }}",
"price_details": "={{ $json.price_details }}",
"price_per_night": "={{ $json.price_per_night }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "url",
"type": "string",
"display": true,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "price_per_night",
"type": "string",
"display": true,
"required": false,
"displayName": "price_per_night",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "total_price",
"type": "string",
"display": true,
"required": false,
"displayName": "total_price",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "price_details",
"type": "string",
"display": true,
"required": false,
"displayName": "price_details",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "beds_rooms",
"type": "string",
"display": true,
"required": false,
"displayName": "beds_rooms",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "rating",
"type": "string",
"display": true,
"required": false,
"displayName": "rating",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "reviews",
"type": "string",
"display": true,
"required": false,
"displayName": "reviews",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "badge",
"type": "string",
"display": true,
"required": false,
"displayName": "badge",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "location",
"type": "string",
"display": true,
"required": false,
"displayName": "location",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "houseRules",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "houseRules",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "highlights",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "highlights",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "description",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "amenities",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "amenities",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA/edit#gid=0",
"cachedResultName": "1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA/edit?usp=drivesdk",
"cachedResultName": "airbnb"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "754e76da-7f01-4340-a0f1-a37ee76fa99c",
"name": "Get Airbnb Listing Details",
"type": "n8n-nodes-mcp.mcpClient",
"position": [
1780,
280
],
"parameters": {
"toolName": "airbnb_listing_details",
"operation": "executeTool",
"toolParameters": "={\n \"id\": \"{{$json.id}}\"\n}"
},
"credentials": {
"mcpClientApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "53ade6ca-9334-4aff-8d31-9585d7f033f8",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"position": [
1360,
220
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "91c16694-0fae-470d-84e2-26f778a81b47",
"name": "id",
"type": "string",
"value": "={{ $json.id }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "f91c2319-b797-4477-826f-e2c50e3f4eaf",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1580,
220
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "c43b9dd6-cccd-42d5-af16-a3a8af5ccedf",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-100,
80
],
"parameters": {},
"typeVersion": 1
},
{
"id": "9ff06c0b-7e64-41bf-91ff-33ea611ceed8",
"name": "Final Results",
"type": "n8n-nodes-base.code",
"position": [
980,
220
],
"parameters": {
"jsCode": "// \ud83d\udc49 Final Results - ch\u1ec9 tr\u1ea3 v\u1ec1 k\u1ebft qu\u1ea3 t\u1ed5ng h\u1ee3p\nconst finalData = $input.first().json;\n\nreturn [{\n json: {\n total_listings: finalData.all_listings.length,\n pages_processed: finalData.loopCount,\n listings: finalData.all_listings,\n summary: {\n total_properties: finalData.all_listings.length,\n pages_fetched: finalData.loopCount,\n search_completed: true,\n location: \"Da Nang\",\n checkin: \"2025-07-14\",\n checkout: \"2025-08-17\",\n adults: 2,\n children: 1\n }\n }\n}];\n"
},
"typeVersion": 2
},
{
"id": "f376519c-53e2-49f7-ae36-a36a5362da76",
"name": "Parse Listing Data2",
"type": "n8n-nodes-base.code",
"position": [
540,
80
],
"parameters": {
"jsCode": "const items = $input.all();\n\n// \ud83d\udc49 T\u00ecm item ch\u1ee9a k\u1ebft qu\u1ea3 t\u00ecm ki\u1ebfm\nconst searchItem = items.find(i => i.json?.result?.content?.[0]?.text || i.json?.content?.[0]?.text);\nconst rawText = searchItem?.json?.result?.content?.[0]?.text || searchItem?.json?.content?.[0]?.text;\nconst parsed = JSON.parse(rawText || \"{}\");\n\nconst listings = parsed.searchResults || [];\nconst nextCursor = parsed.paginationInfo?.nextPageCursor || null;\n\n// \ud83d\udc49 L\u1ea5y loopCount hi\u1ec7n t\u1ea1i v\u00e0 all_listings t\u1eeb context\nconst loopItem = items.find(i => typeof i.json?.loopCount !== \"undefined\");\nconst currentLoop = loopItem?.json?.loopCount || 0;\nconst nextLoop = currentLoop + 1;\nconst allListings = loopItem?.json?.all_listings || [];\n\nconst processedListings = listings.map((item) => {\n const name = item.demandStayListing?.description?.name?.YOUR_AWS_SECRET_KEY_HERE || null;\n const primaryLine = item.structuredContent?.primaryLine || \"\";\n const totalPrice = item.structuredDisplayPrice?.secondaryLine?.accessibilityLabel || null;\n const pricePerNight = item.structuredDisplayPrice?.primaryLine?.accessibilityLabel || null;\n const priceDetails = item.structuredDisplayPrice?.explanationData?.priceDetails || null;\n const ratingText = item.avgRatingA11yLabel || \"\";\n\n const ratingMatch = ratingText.match(/([\\d.]+)\\s+out\\s+of\\s+5/);\n const reviewsMatch = ratingText.match(/(\\d+)\\s*reviews?/);\n\n const badge = item.badges || null;\n const coordinate = item.demandStayListing?.location?.coordinate || {};\n const checkin = item.listingParamOverrides?.checkin || null;\n const checkout = item.listingParamOverrides?.checkout || null;\n const url = item.url || \"\";\n\n const extractBedsRooms = () => {\n if (primaryLine.toLowerCase().includes(\"bed\")) return primaryLine;\n const nameMatchBR = name?.match(/(\\d+)\\s*BR/i);\n if (nameMatchBR) return `${nameMatchBR[1]} bedroom`;\n if (name && /studio/i.test(name)) return \"Studio\";\n if (primaryLine && /studio/i.test(primaryLine)) return \"Studio\";\n return null;\n };\n\n const idMatch = url.match(/\\/rooms\\/(\\d+)/);\n const id = idMatch ? idMatch[1] : null;\n\n return {\n id,\n name,\n beds_rooms: extractBedsRooms(),\n price_per_night: pricePerNight,\n total_price: totalPrice,\n price_details: priceDetails,\n rating: ratingMatch ? parseFloat(ratingMatch[1]) : null,\n reviews: reviewsMatch ? parseInt(reviewsMatch[1]) : null,\n location: {\n lat: coordinate.latitude || null,\n lng: coordinate.longitude || null\n },\n badge,\n checkin,\n checkout,\n url,\n page: nextLoop,\n isMeta: false\n };\n});\n\n// \ud83d\udc49 G\u1ed9p listings m\u1edbi v\u00e0o m\u1ea3ng t\u1ed5ng\nconst updatedAllListings = [...allListings, ...processedListings];\n\n// \ud83d\udc49 T\u1ea1o 1 item metadata duy nh\u1ea5t v\u1edbi all_listings\nconst meta = {\n loopCount: nextLoop,\n cursor: nextCursor,\n all_listings: updatedAllListings,\n current_page_count: processedListings.length,\n total_count: updatedAllListings.length,\n isMeta: true\n};\n\n// \ud83d\udc49 Ch\u1ec9 tr\u1ea3 v\u1ec1 metadata\nreturn [{ json: meta }];\n"
},
"typeVersion": 2
},
{
"id": "ea1afd06-a60b-4fde-a0c2-c51ba0a37541",
"name": "If1",
"type": "n8n-nodes-base.if",
"position": [
760,
160
],
"parameters": {
"options": {
"ignoreCase": false
},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "eb75b423-43fb-422e-8fa4-1a3936e85e01",
"operator": {
"type": "number",
"operation": "lt"
},
"leftValue": "={{$json.loopCount}}",
"rightValue": 2
},
{
"id": "2c50f2f8-b604-4c0d-bc19-aedf57ce4f7e",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.cursor }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "37240da6-ff3b-4c5e-8a7c-883b757db638",
"name": "Initial Set1",
"type": "n8n-nodes-base.set",
"position": [
120,
180
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "d500ae4c-eeb1-49e6-84d3-90d854a7c5a2",
"name": "loopCount",
"type": "number",
"value": "={{$json.loopCount || 0}}"
},
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"name": "cursor",
"type": "string",
"value": "={{$json.cursor || ''}}"
},
{
"id": "b2c3d4e5-f6g7-8901-bcde-f23456789012",
"name": "all_listings",
"type": "array",
"value": "={{$json.all_listings || []}}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ec20bda7-eaa1-4a34-bde5-dd46f0f21a41",
"name": "Merge5",
"type": "n8n-nodes-base.merge",
"position": [
320,
80
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "c169b045-d48f-4ef1-a755-cd2a7b984143",
"name": "Code2",
"type": "n8n-nodes-base.code",
"position": [
1160,
220
],
"parameters": {
"jsCode": "const items = $input.all();\nconst allData = items[0]?.json || {};\n\n// Tr\u01b0\u1eddng h\u1ee3p data l\u00e0 m\u1ea3ng n\u1eb1m trong 1 key n\u00e0o \u0111\u00f3, v\u00ed d\u1ee5 \"results\"\nconst listings = allData.results || allData.listings || []; // t\u00f9y thu\u1ed9c v\u00e0o c\u1ea5u tr\u00fac c\u1ee5 th\u1ec3\n\nreturn listings.map(item => {\n const {\n id,\n name,\n beds_rooms,\n price_per_night,\n total_price,\n price_details,\n rating,\n reviews,\n location,\n badge,\n checkin,\n checkout,\n url\n } = item;\n\n return {\n json: {\n id,\n name,\n beds_rooms,\n price_per_night,\n total_price,\n price_details,\n rating,\n reviews,\n location,\n badge,\n checkin,\n checkout,\n url\n }\n };\n});\n"
},
"typeVersion": 2
},
{
"id": "46f64ae5-980c-4905-98e8-79c3cfcce9d2",
"name": "Airbnb Search",
"type": "n8n-nodes-mcp.mcpClient",
"position": [
120,
-20
],
"parameters": {
"toolName": "airbnb_search",
"operation": "executeTool",
"toolParameters": "={\n \"location\": \"London\",\n \"adults\": 7,\n \"children\": 1,\n \"checkin\": \"2025-08-14\",\n \"checkout\": \"2025-08-17\",\n \"cursor\": \"{{ $json.cursor || '' }}\"\n}"
},
"credentials": {
"mcpClientApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "69be2f2d-0af2-477e-a8d5-3d22bd8eade2",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
20,
-220
],
"parameters": {
"color": 5,
"width": 1080,
"height": 740,
"content": "## Airbnb Search Flow - Description & Notes\n## Overview\nThis n8n workflow implements a paginated **Airbnb search system** that automatically fetches multiple pages of listings and aggregates them into a single comprehensive dataset. The flow uses a loop mechanism to handle pagination and collects all results efficiently."
},
"typeVersion": 1
},
{
"id": "a9ff2075-c4f4-43af-92b8-bd92f055a4dd",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
-220
],
"parameters": {
"width": 1080,
"height": 740,
"content": "This n8n workflow processes Airbnb listing data in a loop structure. Here's how it flows:\n\n## Flow Overview\nThe workflow creates a processing loop that fetches and formats Airbnb listing details for multiple properties."
},
"typeVersion": 1
},
{
"id": "79825fe8-9af2-4fba-8fb4-8ba761140fbd",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-820,
-220
],
"parameters": {
"color": 4,
"width": 680,
"height": 740,
"content": "# Setup Steps\n## Prerequisites\nn8n instance with MCP (Model Context Protocol) support\nGoogle Sheets API credentials configured\nAirbnb MCP client properly set up\n\n## Configuration Steps\n- Configure MCP Client\nSet up the Airbnb MCP client with credential ID:\nEnsure the client has access to airbnb_search and airbnb_listing_details tools\n- Google Sheets Setup\nCreate a Google Sheet with ID: 15IOJquaQ8CBtFilmFTuW8UFijux10NwSVzStyNJ1MsA\nConfigure Google Sheets OAuth2 credentials (ID: 6YhBlgb8cXMN3Ra2)\n-- Ensure the sheet has these column headers:\n\"id, name, url, price_per_night, total_price, price_details\nbeds_rooms, rating, reviews, badge, location\nhouseRules, highlights, description, amenities\"\n\n\n- Search Parameters\nLocation: \"London\" (can be modified in the \"Airbnb Search\" node)\nAdults: 7\nChildren: 1\nCheck-in: \"2025-08-14\"\nCheck-out: \"2025-08-17\"\nPage limit: 2 (can be adjusted in the \"If1\" condition node)\n\n\n- Execution\nUse the manual trigger \"When clicking 'Execute workflow'\" to start the process\nMonitor the workflow execution through the n8n interface\nCheck the Google Sheet for populated data after completion"
},
"typeVersion": 1
},
{
"id": "9e6487df-aeb5-47ca-beca-f2c8d0be6255",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-820,
-600
],
"parameters": {
"color": 3,
"width": 3020,
"height": 360,
"content": "# Description\n### This n8n workflow automatically **scrapes Airbnb listings** from a specified location and **saves the data to a Google Sheet**. It performs pagination to collect listings across multiple pages, extracts detailed information for each property, and organizes the data in a structured format for easy analysis.\n\n# How it Works\nThe workflow operates through these high-level steps:\n\n- Search Initialization: Starts with an Airbnb search for a specific location (London) with defined check-in/check-out dates and guest count\n- Pagination Loop: Automatically processes multiple pages of search results using cursor-based pagination\n- Data Extraction: Parses listing information including names, prices, ratings, reviews, and URLs\n- Detail Enhancement: Fetches additional details for each listing (house rules, highlights, descriptions, amenities)\n- Data Storage: Saves all collected data to a Google Sheet with proper formatting\n- Loop Control: Continues until reaching the page limit (2 pages) or no more results are available"
},
"typeVersion": 1
}
],
"connections": {
"If1": {
"main": [
[
{
"node": "Initial Set1",
"type": "main",
"index": 0
},
{
"node": "Airbnb Search",
"type": "main",
"index": 0
}
],
[
{
"node": "Final Results",
"type": "main",
"index": 0
}
]
]
},
"Code2": {
"main": [
[
{
"node": "Update Google Sheet",
"type": "main",
"index": 0
},
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Merge5": {
"main": [
[
{
"node": "Parse Listing Data2",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Format Data": {
"main": [
[
{
"node": "Clear Google Sheet",
"type": "main",
"index": 0
}
]
]
},
"Initial Set1": {
"main": [
[
{
"node": "Merge5",
"type": "main",
"index": 1
}
]
]
},
"Airbnb Search": {
"main": [
[
{
"node": "Merge5",
"type": "main",
"index": 0
}
]
]
},
"Final Results": {
"main": [
[
{
"node": "Code2",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Format Data",
"type": "main",
"index": 0
}
],
[
{
"node": "Get Airbnb Listing Details",
"type": "main",
"index": 0
}
]
]
},
"Parse Listing Data2": {
"main": [
[
{
"node": "If1",
"type": "main",
"index": 0
}
]
]
},
"Get Airbnb Listing Details": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Airbnb Search",
"type": "main",
"index": 0
},
{
"node": "Initial Set1",
"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.
googleSheetsOAuth2ApimcpClientApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Source: https://n8n.io/workflows/5981/ — 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 contains community nodes that are only compatible with the self-hosted version of n8n.
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.
The workflow automates the process of gathering extensive keyword data for a "Main Keyword." It starts by reading initial parameters from a Google Sheets template, creates a new dedicated Google Sheet
🔥 March Sale – n8n Community Members Get ideoGener8r for Just $27! (Reg. $47) Use Coupon Code: (Valid until 3/31/2025 for n8n community members)