{"workflow":{"id":15008,"name":"Track Idealista market stats weekly and email Google Sheets reports with Idealista Scraper","views":0,"recentViews":0,"totalViews":0,"createdAt":"2026-04-13T08:07:11.649Z","description":"![Screenshot 20260413 at 15.59.08.png](fileId:5459)\n## Who is this for\n\nReal estate investors comparing markets across cities, agencies generating market reports for clients, property consultants doing due diligence, or analysts tracking price trends in Southern European property markets.\n\n## What this workflow does\n\nEvery Monday at 8am, this workflow scrapes property listings from multiple Idealista markets, calculates key statistics, builds an HTML comparison report, emails it to you, and logs data to Google Sheets for long-term trend tracking.\n\n1. The Schedule Trigger fires every Monday at 8am\n2. Two Idealista Scraper nodes fetch Madrid and Barcelona listings in parallel via API-based extraction (never breaks)\n3. Code nodes calculate per-market statistics: average/median price, price range, price per m², average size, average rooms\n4. The Merge node combines both market analyses into one dataset\n5. A Code node builds a professionally formatted HTML comparison table\n6. The report is emailed via Gmail and weekly stats are logged to Google Sheets\n\nIdealista has no official API and no built-in market analytics. This workflow turns raw listing data into actionable market intelligence, automatically, every week.\n\n## Setup\n\n1. Install **n8n-nodes-idealista-scraper** via Settings &gt; Community Nodes (self-hosted n8n only)\n2. Add your **Apify API** credential ([get token](https://console.apify.com/account/integrations))\n3. Add your **Gmail** credential (OAuth2)\n4. Create a Google Sheet with a tab named \"MarketHistory\"\n5. Update the email recipient in the Gmail node\n6. Activate the workflow\n\n## Requirements\n\n- Self-hosted n8n instance (community node not available on n8n Cloud)\n- Apify account with API token\n- Gmail account with OAuth2 credential configured in n8n\n- Google Sheets account with OAuth2 credential configured in n8n\n\n## How to customize this workflow\n\n- Add more cities by duplicating a Scraper + Analysis pair (Valencia, Rome, Lisbon, Milan)\n- Switch `operation` from `sale` to `rent` to analyze rental markets\n- Add price filters to focus on specific segments (luxury above 1M EUR, budget below 200K EUR)\n- Calculate rental yield by scraping both sale and rent for the same area\n- Add an IF node after analysis to send alerts when average price drops below a threshold\n- Cost: ~$0.50/week (2 markets x 3 pages x ~40 properties each)\n","workflow":{"meta":{"instanceId":"7e0a3b7c2415a1132fa33bac0ecd3d320f10add004bf887322e9e819ea0351c7"},"nodes":[{"id":"c1b2c3d4-0003-4000-8000-000000000001","name":"Every Monday 8am","type":"n8n-nodes-base.scheduleTrigger","position":[112,560],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"0 8 * * 1"}]}},"typeVersion":1.2},{"id":"c1b2c3d4-0003-4000-8000-000000000002","name":"Scrape Madrid","type":"n8n-nodes-idealista-scraper.idealistaScraper","position":[368,464],"parameters":{"numPages":3,"operation":"sale","sizeFilters":{},"priceFilters":{},"rentalFilters":{},"featureFilters":{},"advancedFilters":{},"conditionFilters":{},"floorTimeFilters":{},"propertyTypeFilters":{},"bedroomBathroomFilters":{}},"typeVersion":1},{"id":"c1b2c3d4-0003-4000-8000-000000000003","name":"Scrape Barcelona","type":"n8n-nodes-idealista-scraper.idealistaScraper","position":[368,688],"parameters":{"numPages":3,"operation":"sale","locationId":"0-EU-ES-08-19-001-013","sizeFilters":{},"locationName":"Barcelona","priceFilters":{},"rentalFilters":{},"featureFilters":{},"advancedFilters":{},"conditionFilters":{},"floorTimeFilters":{},"propertyTypeFilters":{},"bedroomBathroomFilters":{}},"typeVersion":1},{"id":"c1b2c3d4-0003-4000-8000-000000000004","name":"Analyze Madrid","type":"n8n-nodes-base.code","position":[624,464],"parameters":{"jsCode":"const items = $input.all();\nconst prices = items.map(i => i.json.price).filter(p => typeof p === 'number' && p > 0);\nconst sizes = items.map(i => i.json.size).filter(s => typeof s === 'number' && s > 0);\nconst pricesPerM2 = items.map(i => i.json.priceByArea || i.json.unitPrice).filter(p => typeof p === 'number' && p > 0);\nconst rooms = items.map(i => i.json.rooms).filter(r => typeof r === 'number' && r > 0);\n\nconst avg = arr => arr.length ? Math.round(arr.reduce((a, b) => a + b, 0) / arr.length) : 0;\nconst median = arr => {\n  if (!arr.length) return 0;\n  const sorted = [...arr].sort((a, b) => a - b);\n  const mid = Math.floor(sorted.length / 2);\n  return sorted.length % 2 ? sorted[mid] : Math.round((sorted[mid - 1] + sorted[mid]) / 2);\n};\n\nreturn [{\n  json: {\n    market: 'Madrid',\n    totalListings: items.length,\n    avgPrice: avg(prices),\n    medianPrice: median(prices),\n    minPrice: prices.length ? Math.min(...prices) : 0,\n    maxPrice: prices.length ? Math.max(...prices) : 0,\n    avgSize: avg(sizes),\n    medianSize: median(sizes),\n    avgPricePerM2: avg(pricesPerM2),\n    medianPricePerM2: median(pricesPerM2),\n    avgRooms: (rooms.length ? (rooms.reduce((a, b) => a + b, 0) / rooms.length).toFixed(1) : '0'),\n    reportDate: new Date().toISOString().split('T')[0]\n  }\n}];"},"typeVersion":2},{"id":"c1b2c3d4-0003-4000-8000-000000000005","name":"Analyze Barcelona","type":"n8n-nodes-base.code","position":[624,688],"parameters":{"jsCode":"const items = $input.all();\nconst prices = items.map(i => i.json.price).filter(p => typeof p === 'number' && p > 0);\nconst sizes = items.map(i => i.json.size).filter(s => typeof s === 'number' && s > 0);\nconst pricesPerM2 = items.map(i => i.json.priceByArea || i.json.unitPrice).filter(p => typeof p === 'number' && p > 0);\nconst rooms = items.map(i => i.json.rooms).filter(r => typeof r === 'number' && r > 0);\n\nconst avg = arr => arr.length ? Math.round(arr.reduce((a, b) => a + b, 0) / arr.length) : 0;\nconst median = arr => {\n  if (!arr.length) return 0;\n  const sorted = [...arr].sort((a, b) => a - b);\n  const mid = Math.floor(sorted.length / 2);\n  return sorted.length % 2 ? sorted[mid] : Math.round((sorted[mid - 1] + sorted[mid]) / 2);\n};\n\nreturn [{\n  json: {\n    market: 'Barcelona',\n    totalListings: items.length,\n    avgPrice: avg(prices),\n    medianPrice: median(prices),\n    minPrice: prices.length ? Math.min(...prices) : 0,\n    maxPrice: prices.length ? Math.max(...prices) : 0,\n    avgSize: avg(sizes),\n    medianSize: median(sizes),\n    avgPricePerM2: avg(pricesPerM2),\n    medianPricePerM2: median(pricesPerM2),\n    avgRooms: (rooms.length ? (rooms.reduce((a, b) => a + b, 0) / rooms.length).toFixed(1) : '0'),\n    reportDate: new Date().toISOString().split('T')[0]\n  }\n}];"},"typeVersion":2},{"id":"c1b2c3d4-0003-4000-8000-000000000006","name":"Merge Market Data","type":"n8n-nodes-base.merge","position":[880,560],"parameters":{},"typeVersion":3.1},{"id":"c1b2c3d4-0003-4000-8000-000000000007","name":"Build HTML Report","type":"n8n-nodes-base.code","position":[1152,560],"parameters":{"jsCode":"const markets = $input.all().map(i => i.json);\nconst date = new Date().toLocaleDateString('en-US', {\n  weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'\n});\n\nconst fmt = n => typeof n === 'number' ? n.toLocaleString('en-US') : n;\n\nconst rows = markets.map(m => `\n  <tr>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;font-weight:600;color:#1a202c\">${m.market}</td>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;text-align:right\">${m.totalListings}</td>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;text-align:right\">${fmt(m.avgPrice)} EUR</td>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;text-align:right\">${fmt(m.medianPrice)} EUR</td>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;text-align:right\">${fmt(m.minPrice)} - ${fmt(m.maxPrice)} EUR</td>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;text-align:right\">${m.avgSize} m\\u00b2</td>\n    <td style=\"padding:12px 16px;border-bottom:1px solid #e2e8f0;text-align:right\">${fmt(m.avgPricePerM2)} EUR/m\\u00b2</td>\n  </tr>\n`).join('');\n\nconst html = `\n<div style=\"font-family:'Segoe UI',Arial,sans-serif;max-width:900px;margin:0 auto;padding:20px\">\n  <div style=\"background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);padding:30px;border-radius:12px 12px 0 0\">\n    <h1 style=\"color:white;margin:0;font-size:24px\">Weekly Real Estate Market Report</h1>\n    <p style=\"color:rgba(255,255,255,0.85);margin:8px 0 0 0;font-size:14px\">${date} | Source: Idealista.com</p>\n  </div>\n  <div style=\"background:white;padding:24px;border:1px solid #e2e8f0;border-top:none;border-radius:0 0 12px 12px\">\n    <h2 style=\"color:#2d3748;font-size:18px;margin-top:0\">Market Comparison: ${markets.map(m => m.market).join(' vs ')}</h2>\n    <table style=\"width:100%;border-collapse:collapse;margin:16px 0\">\n      <thead>\n        <tr style=\"background:#f7fafc\">\n          <th style=\"padding:12px 16px;text-align:left;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">Market</th>\n          <th style=\"padding:12px 16px;text-align:right;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">Listings</th>\n          <th style=\"padding:12px 16px;text-align:right;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">Avg Price</th>\n          <th style=\"padding:12px 16px;text-align:right;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">Median</th>\n          <th style=\"padding:12px 16px;text-align:right;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">Range</th>\n          <th style=\"padding:12px 16px;text-align:right;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">Avg Size</th>\n          <th style=\"padding:12px 16px;text-align:right;font-size:13px;color:#718096;text-transform:uppercase;letter-spacing:0.5px\">EUR/m\\u00b2</th>\n        </tr>\n      </thead>\n      <tbody>${rows}</tbody>\n    </table>\n    <hr style=\"border:none;border-top:1px solid #e2e8f0;margin:20px 0\">\n    <p style=\"color:#a0aec0;font-size:12px;margin:0\">Generated automatically by n8n using the Idealista Scraper community node. API-based extraction with 64+ filters across Spain, Italy, and Portugal.</p>\n  </div>\n</div>`;\n\nconst subject = `Weekly Market Report: ${markets.map(m => m.market).join(' vs ')} - ${markets[0]?.reportDate || ''}`;\n\nreturn [{ json: { subject, htmlBody: html } }];"},"typeVersion":2},{"id":"c1b2c3d4-0003-4000-8000-000000000008","name":"Email Report","type":"n8n-nodes-base.gmail","position":[1408,480],"webhookId":"5595593c-a83d-4241-a5a8-a09b8b90d585","parameters":{"sendTo":"user@example.com","message":"={{ $json.htmlBody }}","options":{},"subject":"={{ $json.subject }}"},"typeVersion":2.2},{"id":"c1b2c3d4-0003-4000-8000-000000000009","name":"Log to Market History","type":"n8n-nodes-base.googleSheets","position":[1408,672],"parameters":{"operation":"append","sheetName":{"__rl":true,"mode":"list","value":""},"documentId":{"__rl":true,"mode":"list","value":""}},"typeVersion":4.5},{"id":"c1b2c3d4-0003-4000-8000-000000000020","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[144,-128],"parameters":{"color":4,"width":1380,"height":520,"content":"## Analyze Idealista Real Estate Market Trends and Email Weekly Reports\n\nEvery Monday at 8am, this workflow scrapes property listings from multiple Idealista markets, calculates key statistics, builds an HTML comparison report, emails it to you, and logs data to Google Sheets for trend tracking. Idealista has no official API -- this workflow bridges that gap.\n\n**This workflow uses the `n8n-nodes-idealista-scraper` community node and requires a self-hosted n8n instance.**\n\n### How it works\n1. The Schedule Trigger fires every Monday at 8am\n2. Two Idealista Scraper nodes fetch Madrid and Barcelona listings in parallel via API-based extraction (never breaks)\n3. Code nodes calculate per-market statistics: avg/median price, price range, price per m², avg size, avg rooms\n4. The Merge node combines both market analyses into one dataset\n5. A Code node builds a professionally formatted HTML comparison table\n6. The report is emailed via Gmail and weekly stats are logged to Google Sheets\n\n### Setup\n1. Install **n8n-nodes-idealista-scraper** via Settings > Community Nodes\n2. Add your **Apify API** credential ([get token](https://console.apify.com/account/integrations))\n3. Add your **Gmail** credential (OAuth2)\n4. Create a Google Sheet with a tab named \"MarketHistory\"\n5. Update the email recipient in the Gmail node\n6. **Activate the workflow!**\n\n### Customization\n- Add more cities by duplicating a Scraper + Analysis pair (Valencia, Rome, Lisbon, Milan)\n- Switch `operation` from `sale` to `rent` to analyze rental markets\n- Add price filters to focus on specific segments (luxury >1M EUR, budget <200K EUR)\n- Calculate rental yield by scraping both sale and rent for the same area\n- Cost: ~$0.50/week (2 markets x 3 pages x ~40 properties each)"},"typeVersion":1},{"id":"c1b2c3d4-0003-4000-8000-000000000022","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[224,880],"parameters":{"width":260,"height":140,"content":"## 1. Scrape Markets\nFetches listings from Madrid and Barcelona in parallel. 3 pages each (~120 properties per city)."},"typeVersion":1},{"id":"c1b2c3d4-0003-4000-8000-000000000023","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[544,880],"parameters":{"width":260,"height":140,"content":"## 2. Analyze\nCalculates per-market statistics: avg/median price, price per m², inventory count, avg size."},"typeVersion":1},{"id":"c1b2c3d4-0003-4000-8000-000000000024","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[864,880],"parameters":{"width":340,"height":140,"content":"## 3. Merge & Report\nCombines market data, builds formatted HTML comparison table, emails report via Gmail."},"typeVersion":1},{"id":"c1b2c3d4-0003-4000-8000-000000000025","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[1264,880],"parameters":{"width":260,"height":140,"content":"## 4. Deliver\nEmails the HTML report and logs weekly stats to Google Sheets for trend tracking."},"typeVersion":1}],"pinData":{},"connections":{"Scrape Madrid":{"main":[[{"node":"Analyze Madrid","type":"main","index":0}]]},"Analyze Madrid":{"main":[[{"node":"Merge Market Data","type":"main","index":0}]]},"Every Monday 8am":{"main":[[{"node":"Scrape Madrid","type":"main","index":0},{"node":"Scrape Barcelona","type":"main","index":0}]]},"Scrape Barcelona":{"main":[[{"node":"Analyze Barcelona","type":"main","index":0}]]},"Analyze Barcelona":{"main":[[{"node":"Merge Market Data","type":"main","index":1}]]},"Build HTML Report":{"main":[[{"node":"Email Report","type":"main","index":0}]]},"Merge Market Data":{"main":[[{"node":"Build HTML Report","type":"main","index":0},{"node":"Log to Market History","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":14,"nodeTypes":{"n8n-nodes-base.code":{"count":3},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.googleSheets":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1},"n8n-nodes-idealista-scraper.idealistaScraper":{"count":2}}},"status":"published","readyToDemo":null,"user":{"name":"SIÁN Agency","username":"rapha","bio":"","verified":false,"links":["https://www.sian-agency.online"],"avatar":"https://gravatar.com/avatar/607d0df0179ceb61c070a64ea99a764eb5ec4749c072521dcc724f7847c65759?r=pg&d=retro&size=200"},"nodes":[{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":356,"icon":"file:gmail.svg","name":"n8n-nodes-base.gmail","codex":{"data":{"alias":["email","human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/","icon":"💪","label":"Using Automation to Boost Productivity in the Workplace"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"transform\"]","defaults":{"name":"Gmail"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"},"displayName":"Gmail","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":32,"name":"Market Research"}],"image":[{"id":5459,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Screenshot_2026_04_13_at_15_59_08_150f6b6624.png"}]}}