{"workflow":{"id":13800,"name":"Extract product details from search result URLs with MrScraper and Google Sheets","views":15,"recentViews":0,"totalViews":15,"createdAt":"2026-03-02T09:05:38.103Z","description":"## Description\n\nThis n8n template automates the extraction of structured product data from search results pages — using a pre-built list of search/listing URLs stored in Google Sheets as the starting point. Instead of crawling a domain from scratch, this workflow picks up exactly where your research left off: you bring the URLs, it brings the data.\n\nPerfect for price monitoring, product research, competitor analysis, or building any kind of structured product database from e-commerce or directory sites.\n\n---\n\n## How It Works\n\n* **Phase 1 – Load Search Page URLs:** The workflow reads your pre-prepared list of search or listing page URLs directly from a Google Sheets tab. This gives you full control over which pages get scraped without any crawling step.\n* **Phase 2 – Scrape Listing Pages:** Each URL is looped through the Listing Agent, which navigates the search results page and extracts all individual product/detail page URLs. Duplicates are automatically removed.\n* **Phase 3 – Scrape Detail Pages:** Every detail URL is then processed by the General Agent, which extracts structured fields such as title, price, description, attributes, and more. Nested JSON is automatically flattened into clean, spreadsheet-ready rows.\n* **Phase 4 – Export & Notify:** All scraped records are appended or upserted into a Google Sheets output tab. A Gmail notification is sent on completion with a run summary.\n\n---\n\n## How to Set Up\n\n1. **Create 2 scrapers in your MrScraper account:**\n   * Listing Agent Scraper (for extracting detail URLs from search/listing pages)\n   * General Agent Scraper (for extracting structured data from each detail page)\n   * Copy the `scraperId` for each — you'll need these in n8n.\n\n2. **Enable AI Scraper API access** in your MrScraper account settings.\n\n3. **Prepare your Google Sheet with search URLs:**\n   * Create a sheet with a column containing the listing/search page URLs you want to scrape\n   * This is your input — add as many URLs as needed\n\n4. **Add your credentials in n8n:**\n   * MrScraper API token\n   * Google Sheets OAuth2 (for both input and output sheets)\n   * Gmail OAuth2\n\n5. **Configure the \"Get List Search Page\" node:**\n   * Connect to the spreadsheet and sheet tab containing your input URLs\n\n6. **Configure the Listing Agent node:**\n   * Enter your Listing `scraperId`\n   * Adjust `maxPages` based on how many result pages to scrape per URL\n\n7. **Configure the General Agent node:**\n   * Enter your General `scraperId`\n\n8. **Configure the output Google Sheets node:**\n   * Enter your output spreadsheet and sheet tab URL\n   * Set a unique match key (recommended: `url`) for upsert to avoid duplicates on re-runs\n\n9. **Configure Gmail:**\n   * Set recipient email, subject line, and message body for your run notification\n\n---\n\n## Requirements\n\n* **MrScraper** account with API access enabled\n* **Google Sheets** (OAuth2 connected) — one sheet for input URLs, one for output data\n* **Gmail** (OAuth2 connected)\n\n---\n\n## Good to Know\n\n* Unlike a full crawl workflow, this template is **input-driven** — you control exactly which pages are scraped by managing your Google Sheets input list.\n* You can run this on a schedule and simply add new URLs to the input sheet whenever you want fresh data scraped.\n* The `Flatten Object` node handles deeply nested JSON automatically, so most sites won't require any manual field mapping.\n* Use upsert mode with a unique key in the output sheet to safely re-run the workflow without creating duplicate rows.\n\n---\n\n## Customising This Workflow\n\n* **Scheduled monitoring:** Replace the manual trigger with a Schedule Trigger and keep your input sheet updated to run automated price or availability checks.\n* **Multi-category tracking:** Organise your input sheet by category or source site and add a Filter node to process specific subsets on each run.\n* **Add data enrichment:** Insert an AI node after Phase 3 to summarise descriptions, classify products, or translate content before saving to Sheets.\n* **Slack or webhook alerts:** Swap the Gmail node for a Slack or webhook notification if you prefer real-time alerts in a different channel.","workflow":{"id":"cXh2nQGvFd24V3nD","meta":{"instanceId":"ff80ff7708e50014ab81fa837934b47761ca37bb76e027238bca430a67bf5090","templateCredsSetupCompleted":true},"name":"Search Results to Product Details Extractor","tags":[],"nodes":[{"id":"2c20b891-738d-4f97-b047-3ec77c92393d","name":"Extract All Url ","type":"n8n-nodes-base.code","position":[512,464],"parameters":{"language":"python","pythonCode":"items = []\nurls = set()\n\n# Loop through ALL input items, not just one\nfor input_item in _input.all():\n    payload = input_item.json\n    \n    # Extract URLs from response data\n    response = payload.get(\"data\", {}).get(\"response\") or []\n    for page in response:\n        listings = page.get(\"data\", {}).get(\"data\") or []\n        for listing in listings:\n            url = listing.get(\"url\")\n            if isinstance(url, str) and url.strip():\n                urls.add(url)\n    \n    # Extract the search link\n    search_link = payload.get(\"data\", {}).get(\"link\")\n    if isinstance(search_link, str) and search_link.strip():\n        urls.add(search_link)\n\n# Convert set to list of items\nfor url in urls:\n    items.append({\n        \"json\": {\n            \"url\": url\n        }\n    })\n\nreturn items"},"typeVersion":2},{"id":"1236a0af-6596-46ed-a79b-fae29e2acea7","name":"When clicking ‘Execute workflow’","type":"n8n-nodes-base.manualTrigger","position":[-288,480],"parameters":{},"typeVersion":1},{"id":"f15d8061-1638-4aad-ab5d-c0be2c86fcaf","name":"Flatten Object","type":"n8n-nodes-base.code","position":[1168,464],"parameters":{"jsCode":"// Recursive function to flatten nested objects\nfunction flattenObject(obj, prefix = '', result = {}) {\n  for (const key in obj) {\n    if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n    const newKey = prefix ? `${prefix}_${key}` : key;\n    const value = obj[key];\n\n    if (value === null || value === undefined) {\n      result[newKey] = null;\n    } else if (Array.isArray(value)) {\n      // Join array values\n      result[newKey] = value.length ? value.join(', ') : null;\n    } else if (typeof value === 'object' && !(value instanceof Date)) {\n      flattenObject(value, newKey, result);\n    } else {\n      result[newKey] = value;\n    }\n  }\n  return result;\n}\n\n// 1. Get ALL input items (important)\nconst items = $input.all();\n\n// 2. Flatten EACH item\nconst output = items.map(item => {\n  const flattened = flattenObject(item.json);\n  return { json: flattened };\n});\n\nreturn output;\n"},"executeOnce":false,"typeVersion":2},{"id":"a8477940-b5ed-4627-8468-0ff25bd641b9","name":"Looping Listing Page url","type":"n8n-nodes-base.splitInBatches","position":[320,480],"parameters":{"options":{"reset":false}},"typeVersion":3},{"id":"61437fa8-a7dd-481a-bef7-fdd2bac81e42","name":"Looping Detail Page url","type":"n8n-nodes-base.splitInBatches","position":[976,496],"parameters":{"options":{"reset":false}},"retryOnFail":false,"typeVersion":3},{"id":"e66f7c5e-2a09-4907-97d8-a47b8b9a2668","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1136,416],"parameters":{"width":720,"height":672,"content":"## Phase 0: Setup and Configuration\n### Goal\nPrepare the MrScraper agents, Google Sheets, and n8n credentials so the workflow can run reliably. Also, make sure to create a scraper in MrScraper beforehand so you have a scraperId that can be used in this workflow for reruns.\n\n\n### What you need before running\n1. **Create the scrapers in your MrScraper account first** (one per agent):\n\n   * **Listing Agent Scraper** → for scraping listing/search pages\n   * **General Agent Scraper** → for scraping detail pages\n\n   Each scraper will have its own **`scraperId`**. You’ll use these IDs in n8n to **Rerun** each agent and fetch results.\n2. **Enable AI Scraper API access** in your MrScraper account (so n8n can run scrapers via API).\n3. **Create credentials for MrScraper, Gmail, and Google.**\n\n### What To Do\n1. Add your **Google Sheets API token** into your n8n credentials / \"input sheets\" node.\n2. Choose Document and Sheets that contain List Search page that you want to scrape.\n3. Add your **MrScraper API token** into your n8n credentials / “Input re-run API” node.\n4. Fill in all two **scraper IDs** to each node rerun:\n   * `LISTING_SCRAPER_ID`\n   * `GENERAL_SCRAPER_ID`\n5. Connect **Google Sheets** (spreadsheet + sheet tab, append/upsert strategy).\n6. Connect **Gmail** (recipient, subject format, send rules: always / only new rows / only errors).\n\n\n"},"typeVersion":1},{"id":"29395412-7f02-4cc7-b40f-36dbbf287cf3","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[-400,656],"parameters":{"color":2,"width":624,"height":352,"content":"### Goal\nRetrieve all target search/listing page URLs stored in Google Sheets for use in the n8n workflow.\n\n### What To Do\n1. Use the **Google Sheets** node and select the **Read Rows** operation.\n2. Connect to the correct spreadsheet and choose the sheet that contains your search/listing page URLs.\n3. Retrieve all rows from the sheet and extract the column that stores the target URLs.\n4. Clean the data by removing empty rows, duplicates, and optionally limit the total number of URLs if needed.\n\n### Output\nA structured list of search/listing page URLs fetched directly from Google Sheets, ready to be processed in the next step of the workflow."},"typeVersion":1},{"id":"0be7617a-9a3a-40d2-ad91-05cfa9e3078a","name":"Run listing agent scraper","type":"n8n-nodes-mrscraper.mrscraper","position":[688,512],"parameters":{"url":"=// Input Your url (required)","timeout":720,"maxPages":2,"operation":"listingAgent","scraperId":"=// Input Your scraperId from mrscraper (required)","requestOptions":{}},"credentials":{"mrscraperApi":{"id":"9dYvWOEWBGjzZdW8","name":"riandra"}},"typeVersion":1},{"id":"4cc501d6-9527-4258-89b5-0d8cd9db9a16","name":"Run general agent scraper","type":"n8n-nodes-mrscraper.mrscraper","position":[1312,496],"parameters":{"url":"={{ $json.url }}","operation":"generalAgent","scraperId":"={{ $('Configuration re-run API').item.json.generalScraperId }}","requestOptions":{}},"credentials":{"mrscraperApi":{"id":"9dYvWOEWBGjzZdW8","name":"riandra"}},"typeVersion":1},{"id":"f2b62ecb-76ca-4d28-b143-405d56293ff1","name":"Send a message","type":"n8n-nodes-base.gmail","position":[1936,480],"webhookId":"0016e09a-4302-4635-a8a1-a2f6aedc1f60","parameters":{"sendTo":"// Input where you want to send","message":"// Input The message","options":{},"subject":"// Input The subject of the message","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"ZCn7giWqNBeFwnWX","name":"Gmail account"}},"typeVersion":2.2},{"id":"87bd29a3-f121-44da-a34d-27b25e47a0bf","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-400,416],"parameters":{"color":2,"width":624,"height":224,"content":"## Phase 1: Load List search Page Url"},"typeVersion":1},{"id":"05a40a40-ec5c-45e0-8f8f-8250f8473c1b","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[240,416],"parameters":{"color":5,"width":624,"height":304,"content":"## Phase 2: Scrape Listing Page\n"},"typeVersion":1},{"id":"15f52a25-622a-4749-a7d8-f2ed139c76f5","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[240,736],"parameters":{"color":5,"width":624,"height":288,"content":"### Goal\nFrom each listing/search page, extract **detail page URLs**.\n\n### What To Do\n1. Loop through each listing page URL from Phase 1.\n2. For each URL, call the **Listing Agent (Rerun)** using the scraperId from the mrscraper platform that was previously created.\n3. Extract all detail URLs from the Listing results.\n4. Normalize URLs (convert to absolute), then deduplicate them.\n\n### Output\nA deduped list of detail page URLs."},"typeVersion":1},{"id":"6c65be49-d48c-4c40-b03c-9a8389399ed1","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[880,416],"parameters":{"color":6,"width":624,"height":304,"content":"## Phase 3: Scrape Detail Data\n"},"typeVersion":1},{"id":"fb6302dd-4925-46e6-a7e3-ffb2cf4a86f8","name":"Sticky Note13","type":"n8n-nodes-base.stickyNote","position":[880,736],"parameters":{"color":6,"width":624,"height":400,"content":"### Goal\nExtract structured fields from each detail page.\n\n### What To Do\n1. Loop through each detail URL from Phase 2.\n2. For each URL, call the **General Agent (Rerun)** using the scraperId from the mrscraper platform that was previously created.\n3. Select the fields you want to keep (examples: title, price, location, attributes, description).\n4. Normalize the output:\n   * flatten nested JSON\n   * format arrays into readable text\n   * add metadata (source URL, scrape timestamp)\n\n### Output\nOne structured record per detail page (ready to export)."},"typeVersion":1},{"id":"6acb60f0-6dba-42de-bd4f-becc916c4b95","name":"Sticky Note14","type":"n8n-nodes-base.stickyNote","position":[1520,656],"parameters":{"color":3,"width":592,"height":432,"content":"### Goal\nSave results into Google Sheets and send a Gmail summary/alert.\n\n### What To Do\n1. Write rows into **Google Sheets**:\n   * Append new rows, or upsert using a unique key (recommended: `source_url`).\n2. Build a run summary:\n   * total listing pages processed\n   * total detail pages scraped\n   * total rows inserted/updated\n   * errors (if any)\n3. Send a Gmail notification:\n   * success digest (optional)\n   * or alert only for new items / errors / threshold triggers\n\n### Output\nUpdated spreadsheet + email notification."},"typeVersion":1},{"id":"81c0127b-ae9d-4728-9ba0-daaca7f756ba","name":"Sticky Note15","type":"n8n-nodes-base.stickyNote","position":[1520,416],"parameters":{"color":3,"width":592,"height":224,"content":"## Phase 4: Export to Spreadsheet + Notify via Gmail"},"typeVersion":1},{"id":"179d0db2-b7a0-43c8-b417-a0af14cc7044","name":"Get List Search Page","type":"n8n-nodes-base.googleSheets","position":[0,480],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":1823271814,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1fmW05fj0Pu8AXxeLt500l2kE1SvR8bKo4BCRNXsKzPQ/edit#gid=1823271814","cachedResultName":"auxipress_time_diff_analysys"},"documentId":{"__rl":true,"mode":"list","value":"1fmW05fj0Pu8AXxeLt500l2kE1SvR8bKo4BCRNXsKzPQ","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1fmW05fj0Pu8AXxeLt500l2kE1SvR8bKo4BCRNXsKzPQ/edit?usp=drivesdk","cachedResultName":"clean auxipress_time_diff_analysys"}},"credentials":{"googleSheetsOAuth2Api":{"id":"HofjgH0Hk3EpOn57","name":"Google Sheets account - Riandra"}},"typeVersion":4.7},{"id":"2fbb77f0-813d-432e-a127-8e2bd911950c","name":"Append or update row in sheet","type":"n8n-nodes-base.googleSheets","position":[1648,480],"parameters":{"columns":{"value":{},"schema":[],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"url","value":"// Input Your sheets Url (required)"},"documentId":{"__rl":true,"mode":"url","value":"// Input Your Document Url (required)"}},"credentials":{"googleSheetsOAuth2Api":{"id":"X520LqyN5WppJ7Ht","name":"Google Sheets Maul"}},"typeVersion":4.7}],"active":false,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"11e4d92a-5def-42a1-893a-7b4928c53791","connections":{"Flatten Object":{"main":[[{"node":"Append or update row in sheet","type":"main","index":0}]]},"Extract All Url ":{"main":[[{"node":"Looping Detail Page url","type":"main","index":0}]]},"Get List Search Page":{"main":[[{"node":"Looping Listing Page url","type":"main","index":0}]]},"Looping Detail Page url":{"main":[[{"node":"Flatten Object","type":"main","index":0}],[{"node":"Run general agent scraper","type":"main","index":0}]]},"Looping Listing Page url":{"main":[[{"node":"Extract All Url ","type":"main","index":0}],[{"node":"Run listing agent scraper","type":"main","index":0}]]},"Run general agent scraper":{"main":[[{"node":"Looping Detail Page url","type":"main","index":0}]]},"Run listing agent scraper":{"main":[[{"node":"Looping Listing Page url","type":"main","index":0}]]},"Append or update row in sheet":{"main":[[{"node":"Send a message","type":"main","index":0}]]},"When clicking ‘Execute workflow’":{"main":[[{"node":"Get List Search Page","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":19,"nodeTypes":{"n8n-nodes-base.code":{"count":2},"n8n-nodes-base.gmail":{"count":1},"n8n-nodes-base.stickyNote":{"count":9},"n8n-nodes-base.googleSheets":{"count":2},"n8n-nodes-base.manualTrigger":{"count":1},"n8n-nodes-base.splitInBatches":{"count":2},"n8n-nodes-mrscraper.mrscraper":{"count":2}}},"status":"published","readyToDemo":null,"user":{"name":"riandra","username":"riandradiva","bio":"","verified":true,"links":[""],"avatar":"https://gravatar.com/avatar/c085ff3e99cfe2328699b49cb9802f5762a12c94cb8f21692548a0dc0cc6e2e4?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":39,"icon":"fa:sync","name":"n8n-nodes-base.splitInBatches","codex":{"data":{"alias":["Loop","Concatenate","Batch","Split","Split In Batches"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Loop Over Items","color":"#007755"},"iconData":{"icon":"sync","type":"icon"},"displayName":"Loop Over Items (Split in Batches)","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":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":32,"name":"Market Research"}],"image":[]}}