{"workflow":{"id":13111,"name":"Send customer visit notifications from Google Calendar to Slack and Sheets","views":22,"recentViews":0,"totalViews":22,"createdAt":"2026-01-30T09:46:48.139Z","description":"# Customer Visit Notification\nThis 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 relevant stakeholders. It also posts a company-wide announcement to ensure proper preparation and a professional reception for the customer.\n\n## 📌Who is this for?\n- Reception / Administration team\n- Sales / Account owners in charge of customers\n- Management / Related team leaders\n- Security / IT / Logistics (for meeting room, equipment, and check-in preparation)\n\n## 📌The problem\n- Customer visit information is usually shared manually and can be easily missed.\n- Related staff are not informed in time to prepare.\n- This causes last-minute preparation for reception, meeting rooms, documents, and support.\n- It affects the customer experience and the company’s professional image.\n\n## 📌How it works\n- When a customer meeting is scheduled, the system records the information (time, customer name, company, person in charge).\n- The system automatically sends notifications to related groups based on timeline:\n       - Notify the whole office 1 hour before the visit.\n       - Notify related members 24 hours in advance.\n- Notifications can be sent via Email / Slack / Internal chat.\n\n\n## 📌Quick setup\nRequired information:\n- N8n Version 2.4.6\n- Google Calendar OAuth2 API: Client ID, Client Secret\n- Google Sheets OAuth2 API: Client ID, Client Secret\n- Slack App: Bot User OAuth Token\n\n\nGoogle Sheets will be used to log all notified events.\n\n## 📌Results\n- Everyone is aware of the customer visit schedule.\n- Teams can proactively prepare meeting rooms, documents, and manpower.\n- Reduce mistakes and missed communication.\n- Improve customer experience and company professionalism.\n\n## 📌Take it further\n- Customer check-in using QR code / Visitor form\n- Send reminders to prepare documents\n- Store visit history\n- Monthly/quarterly reports for number of customer visits\n\n## 📌Need help customizing?\nContact me for consulting and support:\n[Linkedin](https://www.linkedin.com/company/bac-ha-software/posts/?feedView=all) / [Website](https://bachasoftware.com/bhsoft-contacts)","workflow":{"id":"deYaFqsqAPYeo2Nc","meta":{"instanceId":"f54ed2f247cfbe1163a5a9b9696947f5b0eada18a928fca1e498ba8aff19a63a","templateCredsSetupCompleted":true},"name":"Customer Visit Notification","tags":[{"id":"eumrxkLAF6iNOufx","name":"Noti","createdAt":"2025-12-26T10:56:32.851Z","updatedAt":"2025-12-26T10:56:32.851Z"},{"id":"P0InItjxOPutjm62","name":"Slack","createdAt":"2025-09-22T07:52:01.502Z","updatedAt":"2025-09-22T07:52:01.502Z"},{"id":"HyLSX6V7QZs5MrZy","name":"Odoo","createdAt":"2025-03-24T01:54:27.030Z","updatedAt":"2025-03-24T01:54:27.030Z"}],"nodes":[{"id":"26d95d9c-8b73-4503-9f0d-c8f54960089c","name":"Step 1: Activation schedule: Every 1 hour, from 6 AM to 6 PM.","type":"n8n-nodes-base.scheduleTrigger","position":[-2720,2016],"parameters":{"rule":{"interval":[{"field":"cronExpression","expression":"=0 6-18/1 * * *"}]}},"typeVersion":1.2},{"id":"cabcc91d-be29-46b1-a802-7e150f2a598b","name":"Step 4: Get the event information from Google Calendar for tomorrow.","type":"n8n-nodes-base.googleCalendar","position":[-2512,2272],"parameters":{"limit":"={{ 100 }}","options":{},"timeMax":"={{ $node['Step 3: Get datetime'].json.tomorrow }} 23:55:00","timeMin":"={{ $node['Step 3: Get datetime'].json.tomorrow }} 00:05:00","calendar":{"__rl":true,"mode":"list","value":""},"operation":"getAll"},"credentials":{"googleCalendarOAuth2Api":{"id":"5ZYfQKnbuK5s9rC3","name":"Google Calendar account test"}},"executeOnce":true,"typeVersion":1.3,"alwaysOutputData":true},{"id":"a6fd4c7e-56ca-4670-9d28-986c279ea5a7","name":"Step 2: Set Variables","type":"n8n-nodes-base.set","position":[-2512,2016],"parameters":{"mode":"raw","options":{},"jsonOutput":"={\n  \"redmine6_Url\": \"\",\n  \"Hour\": {{ $json.Hour }},\n  \"limit\": 100,\n  \"channel_id\": \"\",\n  \"calendar_event_web_search_read\": \"\"\n}"},"typeVersion":3.4},{"id":"aa89d67f-6e98-4bd3-bcfb-0a4928282927","name":"Step 3: Get datetime","type":"n8n-nodes-base.code","position":[-2720,2272],"parameters":{"jsCode":"const toVNTime = (d = new Date()) => {\n  const date = new Date(d.getTime() + 7 * 60 * 60 * 1000); // UTC+7\n  return date;\n};\n\nconst formatDate = (date) => {\n  const y = date.getFullYear();\n  const m = String(date.getMonth() + 1).padStart(2, \"0\");\n  const d = String(date.getDate()).padStart(2, \"0\");\n  return `${y}-${m}-${d}`;\n};\n\nconst formatDayMonth = (date) => {\n  const d = String(date.getDate()).padStart(2, \"0\");\n  const m = String(date.getMonth() + 1).padStart(2, \"0\");\n  return `${d}/${m}`;\n};\n\nconst getDayOfWeek = (date) => {\n  const days = [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"];\n  return days[date.getDay()];\n};\n\nconst titleSheet = (date) => {\n  const y = date.getFullYear();\n  const m = String(date.getMonth() + 1).padStart(2, \"0\");\n  return `${y}-${m}`;\n};\n\nconst now = toVNTime();\n\nconst yesterday = new Date(now);\nyesterday.setDate(yesterday.getDate() - 1);\n\nconst twoDaysAgo = new Date(now);\ntwoDaysAgo.setDate(twoDaysAgo.getDate() - 2);\n\nconst tomorrow = new Date(now);\ntomorrow.setDate(tomorrow.getDate() + 1);\n\n// ===== Last week (Monday → Sunday) =====\nconst today = new Date(now);\nconst dayIndex = (today.getDay() + 6) % 7; // Monday = 0\nconst todayStr = formatDate(now);\nconst [year, month, day] = (todayStr.split(\"-\"));\nconst startOfLastWeek = new Date(today);\nstartOfLastWeek.setDate(today.getDate() - dayIndex - 7);\n\nconst endOfLastWeek = new Date(startOfLastWeek);\nendOfLastWeek.setDate(startOfLastWeek.getDate() + 6);\n\n// ===== Current week (DD/MM) =====\nconst startOfWeek = new Date(today);\nstartOfWeek.setDate(today.getDate() - dayIndex);\n\nconst endOfWeek = new Date(startOfWeek);\nendOfWeek.setDate(startOfWeek.getDate() + 6);\n\n\nreturn [{\n  today: formatDate(now),\n  yesterday: formatDate(yesterday),\n  twoDaysAgo: formatDate(twoDaysAgo),\n  tomorrow: formatDate(tomorrow),\n\n  dayOfWeekYesterday: getDayOfWeek(yesterday),\n  monthYesterday: titleSheet(yesterday),\n\n  startOfLastWeek: formatDate(startOfLastWeek),\n  endOfLastWeek: formatDate(endOfLastWeek),\n\n  startOfLastWeekDM: formatDayMonth(startOfLastWeek),\n  endOfLastWeekDM: formatDayMonth(endOfLastWeek),\n\n  reportYearFolder: `${year}-Report`,\n  reportDateFolder: `${year}${month}${day}-Report`,\n}];\n"},"typeVersion":2},{"id":"a1f2dd0a-687b-4362-9f53-f2cf9541330d","name":"Step 5: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-2288,2272],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $node['Step 4: Get the event information from Google Calendar for tomorrow.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"8f315c0f-4b8f-4755-9ac6-44d52147e3a3","name":"Step 6: Filter out events whose titles match the action of a customer visiting the company.","type":"n8n-nodes-base.filter","maxTries":2,"position":[-2016,1968],"parameters":{"options":{"ignoreCase":true},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"d3f13ec7-2eae-4c41-9714-7ece062e9859","operator":{"type":"string","operation":"regex"},"leftValue":"={{ $json.summary }}","rightValue":"=(to come|to arrive|visit)"}]}},"retryOnFail":true,"typeVersion":2.3},{"id":"cb9a9a37-8d9e-4b44-a53c-e7cd81eea088","name":"Step 7: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-1808,1968],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $node['Step 6: Filter out events whose titles match the action of a customer visiting the company.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"304c1318-2f4a-4367-98a0-7830b3246625","name":"Step 8: Read the Odoo Calendar Event notifications that have been sent.","type":"n8n-nodes-base.googleSheets","maxTries":2,"position":[-2016,2176],"parameters":{"sheetName":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"url","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.7,"alwaysOutputData":true},{"id":"4f430f6b-406f-45cb-9ddb-9988d6000c5c","name":"Step 9: Read Google Sheets member slack","type":"n8n-nodes-base.googleSheets","maxTries":2,"position":[-1808,2176],"parameters":{"sheetName":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"url","value":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.5,"alwaysOutputData":true},{"id":"945af957-40d0-4027-b12f-52a8e5b617db","name":"Step 10: Filter out records that have not been sent.","type":"n8n-nodes-base.code","position":[-1568,1968],"parameters":{"jsCode":"const odoo_Calendar_Event_Sheet = $items(\"Step 8: Read the Odoo Calendar Event notifications that have been sent.\");\nconst records = $items(\"Step 6: Filter out events whose titles match the action of a customer visiting the company.\");\n\nconst sentEventIds = new Set(\n  odoo_Calendar_Event_Sheet\n    .filter(item => item.json[\"The day before\"] === \"Sent\")\n    .map(item => item.json.ID)\n);\n\nfunction formatDateTime(dateTimeStr) {\n  if (!dateTimeStr) return null;\n\n  return dateTimeStr\n    .replace(\"T\", \" \")\n    .replace(/\\+\\d{2}:\\d{2}$/, \"\");\n}\n\nconst result = records\n  .map(item => {\n    const name = item.json.summary.replace(/\\[.*?\\]\\s*/g, '');\n\n    return {\n      odoo_calendar_event_id: item.json.id,\n      odoo_calendar_event_name: name,\n      odoo_calendar_event_start: formatDateTime(item.json.start.dateTime),\n      odoo_calendar_event_stop: formatDateTime(item.json.end.dateTime),\n      attendees: item.json.attendees,\n    };\n  })\n  .filter(item => !sentEventIds.has(item.odoo_calendar_event_id));\n\nreturn result;"},"executeOnce":true,"typeVersion":2,"alwaysOutputData":true},{"id":"b9acac39-d43f-4c1b-89db-3d3991d745dd","name":"Step 11: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-1360,1968],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"empty","singleValue":true},"leftValue":"={{ $node['Step 10: Filter out records that have not been sent.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"432caf07-304c-45be-b072-9d575b9021a6","name":"Step 12: Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-1568,2176],"parameters":{"options":{}},"typeVersion":3},{"id":"115e8306-2e66-40a6-9f52-2280ff466903","name":"Step 13: Extract the email and member ID of the partners.","type":"n8n-nodes-base.code","position":[-1360,2176],"parameters":{"jsCode":"const attendee_ids = $node[\"Step 12: Loop Over Items\"].json.attendees;\nconst mergedResults = $items(\"Step 9: Read Google Sheets member slack\");\nconst odoo_calendar_event_name = $('Step 12: Loop Over Items').first().json.odoo_calendar_event_name;\nconst odoo_calendar_event_start = $('Step 12: Loop Over Items').first().json.odoo_calendar_event_start;\nconst odoo_calendar_event_stop = $('Step 12: Loop Over Items').first().json.odoo_calendar_event_stop;\n\nconst finalResult = [];\n\nfor (const item of attendee_ids) {\n  const inputEmail = String(item.email || \"\").toLowerCase().trim();\n  if (!inputEmail) continue;\n\n  const inputLocal = inputEmail.split(\"@\")[0];\n\n  let bestMatch = null;\n  let bestScore = -1;\n\n  for (const sheetItem of mergedResults) {\n    const data = sheetItem.json || {};\n    if (!data.Email) continue;\n\n    const itemEmail = String(data.Email).toLowerCase().trim();\n    const itemLocal = itemEmail.split(\"@\")[0];\n\n    let score = 0;\n\n    if (itemEmail === inputEmail) score = 100;\n    else if (itemLocal === inputLocal) score = 80;\n    else if (itemEmail.includes(inputLocal)) score = 50;\n\n    if (score > bestScore) {\n      bestScore = score;\n      bestMatch = data;\n    }\n  }\n\n  if (bestMatch && bestScore >= 50) {\n    finalResult.push({\n      email: inputEmail,\n      memberID: bestMatch.memberID,\n      odoo_calendar_event_name,\n      odoo_calendar_event_start,\n      odoo_calendar_event_stop\n    });\n  }\n}\n\nreturn finalResult;\n"},"executeOnce":true,"typeVersion":2,"alwaysOutputData":true},{"id":"8a2d65d5-780a-46ea-9e75-be847210fb12","name":"Step 14: Loop Over Partners.","type":"n8n-nodes-base.splitInBatches","position":[-1136,1968],"parameters":{"options":{}},"typeVersion":3},{"id":"f561fd3d-d1c8-4b8d-a883-125f90071b35","name":"Step 15: Wait 1s","type":"n8n-nodes-base.wait","position":[-928,2176],"webhookId":"0f1ec3ce-a0c2-4125-b8d7-d201685f83e1","parameters":{"amount":1},"executeOnce":true,"typeVersion":1.1},{"id":"0e1b2c15-95eb-4850-ade5-dfd9b1fde2b5","name":"Step 16: Send a message to your Partners","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[-1136,2176],"parameters":{"url":"=https://slack.com/api/chat.postMessage","method":"POST","options":{},"sendBody":true,"authentication":"genericCredentialType","bodyParameters":{"parameters":[{"name":"=channel","value":"={{ $node['Step 14: Loop Over Partners.'].json.memberID}}"},{"name":"=text","value":"=:mega: *Notification regarding a customer's upcoming visit to the company.!*\n\n*Title*: *{{ $node['Step 14: Loop Over Partners.'].json.odoo_calendar_event_name }}*\n*From*: {{ $node['Step 14: Loop Over Partners.'].json.odoo_calendar_event_start }}\n*To*: {{ $node['Step 14: Loop Over Partners.'].json.odoo_calendar_event_stop }}\n\n~~~ Add your content"}]},"genericAuthType":"httpBearerAuth"},"credentials":{"httpQueryAuth":{"id":"qcfUzDEAk3oCwGGk","name":"Query Auth account  BHS Service APP Slack"},"httpBearerAuth":{"id":"40fU2AjYKYOyDMZk","name":"Bearer Auth account Odoo Bot TEST"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"90e61f88-4d5c-4204-8de3-cef379f4dca5","name":"Step 17: Return output of step8","type":"n8n-nodes-base.code","position":[-928,1968],"parameters":{"jsCode":"const all = $items(\"Step 10: Filter out records that have not been sent.\");\nreturn all;\n"},"executeOnce":true,"typeVersion":2},{"id":"a4b1e046-e1ac-4356-9dc0-135747e03451","name":"Step 18: Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-704,1968],"parameters":{"options":{}},"typeVersion":3},{"id":"8713519b-7300-4917-8fe2-f746ef6e8465","name":"Step 19: Fill in the Calendar Event information in the Google Sheet.","type":"n8n-nodes-base.googleSheets","position":[-512,1968],"parameters":{"operation":"append","sheetName":{"__rl":true,"mode":"url","value":""},"documentId":{"__rl":true,"mode":"url","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"typeVersion":4.7},{"id":"e8e9f878-9d87-49c6-9663-4413830534ca","name":"Step 20: Get the event information from Google Calendar for today..","type":"n8n-nodes-base.googleCalendar","position":[-704,2176],"parameters":{"limit":"={{ 100 }}","options":{},"timeMax":"={{ $node['Step 3: Get datetime'].json.today }} 23:55:00","timeMin":"={{ $node['Step 3: Get datetime'].json.today }} 00:05:00","calendar":{"__rl":true,"mode":"list","value":""},"operation":"getAll"},"credentials":{"googleCalendarOAuth2Api":{"id":"5ZYfQKnbuK5s9rC3","name":"Google Calendar account test"}},"executeOnce":true,"typeVersion":1.3,"alwaysOutputData":true},{"id":"af39e469-032b-4b85-b84a-2721fdfe0aab","name":"Step 21: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-512,2176],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $node['Step 20: Get the event information from Google Calendar for today..'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"a8d90c8a-bd26-49da-a966-5b3c369a4352","name":"Step 22: Filter out events whose titles match the action of a customer visiting the company.","type":"n8n-nodes-base.filter","maxTries":2,"position":[-272,1968],"parameters":{"options":{"ignoreCase":true},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"d3f13ec7-2eae-4c41-9714-7ece062e9859","operator":{"type":"string","operation":"regex"},"leftValue":"={{ $json.summary }}","rightValue":"=(to come|to arrive|visit)"}]}},"retryOnFail":true,"typeVersion":2.3},{"id":"37a49308-2c53-4a3c-872f-3ee9c8475e84","name":"Step 23: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-64,1968],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $node['Step 22: Filter out events whose titles match the action of a customer visiting the company.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"dd7deb8d-316a-4506-9aae-147a05935ad4","name":"Step 24: Read the Odoo Calendar Event notifications that have been sent.","type":"n8n-nodes-base.googleSheets","maxTries":2,"position":[-272,2176],"parameters":{"sheetName":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"url","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.7,"alwaysOutputData":true},{"id":"64b6ea77-3634-4eb5-bdaa-ff6921891d06","name":"Step 25: Filter out records that have not been sent.","type":"n8n-nodes-base.code","position":[-64,2176],"parameters":{"jsCode":"const odoo_Calendar_Event_Sheet = $items(\"Step 24: Read the Odoo Calendar Event notifications that have been sent.\");\n\nconst records = $items(\"Step 22: Filter out events whose titles match the action of a customer visiting the company.\");\n\nconst sentEventIds = new Set(\n  odoo_Calendar_Event_Sheet\n    .filter(item => item.json[\"Today\"] === \"Sent\")\n    .map(item => item.json.ID)\n);\n\nfunction formatDateTime(dateTimeStr) {\n  if (!dateTimeStr) return null;\n\n  return dateTimeStr\n    .replace(\"T\", \" \")\n    .replace(/\\+\\d{2}:\\d{2}$/, \"\");\n}\n\nconst result = records\n  .map(item => {\n    const name = item.json.summary.replace(/\\[.*?\\]\\s*/g, '');\n\n    return {\n      odoo_calendar_event_id: item.json.id,\n      odoo_calendar_event_name: name,\n      odoo_calendar_event_start: formatDateTime(item.json.start.dateTime),\n      odoo_calendar_event_stop: formatDateTime(item.json.end.dateTime),\n      attendees: item.json.attendees,\n    };\n  })\n  .filter(item => !sentEventIds.has(item.odoo_calendar_event_id));\n\nreturn result;\n"},"executeOnce":true,"typeVersion":2,"alwaysOutputData":true},{"id":"2f413100-9f8e-4737-bc07-02142f828619","name":"Step 26: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[176,1968],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"empty","singleValue":true},"leftValue":"={{ $node['Step 25: Filter out records that have not been sent.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"99e4392d-9dd5-4c7f-842c-3b5fafc1bb87","name":"Step 27: Check if it is currently >= 8 AM?","type":"n8n-nodes-base.if","position":[384,1968],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"e4908b50-6426-44af-93c3-4fa8906cecd9","operator":{"type":"number","operation":"gte"},"leftValue":"={{ $node['Step 2: Set Variables'].json.Hour }}","rightValue":"={{ 08 }}"}]},"looseTypeValidation":true},"executeOnce":true,"typeVersion":2.3},{"id":"45f88c5c-e407-45cf-9093-abbdfb77635f","name":"Step 28: Convert to text","type":"n8n-nodes-base.code","position":[176,2176],"parameters":{"jsCode":"const data = $items(\"Step 25: Filter out records that have not been sent.\");\n\nconst tagString = data\n  .map(item => {\n    const j = item.json;\n    return `*Event:* *${j.odoo_calendar_event_name}*\\n` +\n           `*From:* ${j.odoo_calendar_event_start}\\n` +\n           `*To:* ${j.odoo_calendar_event_stop}`;\n  })\n  .join('\\n\\n');\n\nconst finalMessage = `<!channel> :mega:\\n${tagString}`;\nconst safeMessage = finalMessage.replace(/\\n/g, '\\\\n');\nreturn [{ json: { message: safeMessage } }];\n\n"},"executeOnce":true,"typeVersion":2,"alwaysOutputData":true},{"id":"f2ff389d-70e9-447a-8f85-74c995390e31","name":"Step 29: Download file image","type":"n8n-nodes-base.googleDrive","position":[384,2176],"parameters":{"fileId":{"__rl":true,"mode":"url","value":"="},"options":{},"operation":"download"},"credentials":{"googleDriveOAuth2Api":{"id":"S68krIocJ1klW4Hq","name":"Google Drive account test"}},"typeVersion":3},{"id":"ad4a82ad-b2dc-4e20-a99c-d16ec55569e9","name":"Step 30: Convert KB → bytes","type":"n8n-nodes-base.code","position":[608,1968],"parameters":{"jsCode":"const item = $input.first();\n\nconst buffer = await this.helpers.getBinaryDataBuffer(0, 'data');\n\nitem.binary.data = {\n  ...item.binary.data,\n  fileSize: buffer.length,\n  fileName: `input_name.png`,\n};\n\nreturn item;"},"executeOnce":true,"typeVersion":2},{"id":"a6fde675-6248-4c33-bcad-c7c8c1a21105","name":"Step 32: Choose branch 2","type":"n8n-nodes-base.merge","position":[608,2176],"parameters":{"mode":"chooseBranch","useDataOfInput":2},"typeVersion":3.2},{"id":"ebae7fb4-abf9-4b69-9f3e-a97780cbcaa7","name":"Step 33: POST upload_url Slack","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[816,2176],"parameters":{"url":"={{ $node[\"Step 31: Call Slack API's getUploadURLExternal API\"].json.upload_url}}","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","jsonHeaders":"={\n  \"Content-Type\": \"application/octet-stream\"\n}","sendHeaders":true,"specifyHeaders":"json","inputDataFieldName":"data"},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"c724f434-ac95-4c13-9170-775b48a77fed","name":"Step 31: Call Slack API's getUploadURLExternal API","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[816,1968],"parameters":{"url":"=https://slack.com/api/files.getUploadURLExternal","method":"POST","options":{},"jsonQuery":"={\n  \"filename\": \"{{$binary.data.fileName}}\",\n  \"length\": {{$binary.data.fileSize}}\n}","sendQuery":true,"specifyQuery":"json","authentication":"genericCredentialType","genericAuthType":"httpBearerAuth"},"credentials":{"httpQueryAuth":{"id":"qcfUzDEAk3oCwGGk","name":"Query Auth account  BHS Service APP Slack"},"httpBearerAuth":{"id":"40fU2AjYKYOyDMZk","name":"Bearer Auth account Odoo Bot TEST"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"67cfa35b-ee8a-4876-b7f3-b80fa5bc8a92","name":"Step 34: Call the completeUploadExternal Slack API to complete the file upload.","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[1040,1968],"parameters":{"url":"=https://slack.com/api/files.completeUploadExternal","method":"POST","options":{},"jsonBody":"={\n  \"files\": [\n    {\n      \"id\": \"{{ $node['Step 31: Call Slack API's getUploadURLExternal API'].json.file_id }}\",\n      \"title\": \"input_title\"\n    }\n  ],\n  \"channel_id\": \"{{ $node['Step 2: Set Variables'].json.channel_id}}\",\n  \"initial_comment\": \"{{ $node['Step 28: Convert to text'].json.message }}\"\n}\n","sendBody":true,"specifyBody":"=json","authentication":"genericCredentialType","bodyParameters":{"parameters":[{}]},"genericAuthType":"httpBearerAuth"},"credentials":{"httpQueryAuth":{"id":"qcfUzDEAk3oCwGGk","name":"Query Auth account  BHS Service APP Slack"},"httpBearerAuth":{"id":"40fU2AjYKYOyDMZk","name":"Bearer Auth account Odoo Bot TEST"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"1d9b1407-3c05-4d84-b3b1-8c6ac90baca6","name":"Step 35: Return output of step 25","type":"n8n-nodes-base.code","position":[1232,1968],"parameters":{"jsCode":"const all = $items(\"Step 43: Filter out records that have not been sent.\");\nreturn all;\n"},"executeOnce":true,"typeVersion":2},{"id":"c9e0405b-3bde-4952-a9f3-9c7928f6e46f","name":"Step 36: Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[1040,2176],"parameters":{"options":{}},"typeVersion":3},{"id":"e408c49d-cfe8-4003-a685-cdca0620e005","name":"Step 37: Fill in the Calendar Event information in the Google Sheet.","type":"n8n-nodes-base.googleSheets","position":[1232,2176],"parameters":{"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"url","value":""},"documentId":{"__rl":true,"mode":"url","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"typeVersion":4.7},{"id":"e7e3ccf3-3c8c-4183-b4e4-230ff019b921","name":"Step 38: Get the event information from Google Calendar for today.","type":"n8n-nodes-base.googleCalendar","position":[-2016,2608],"parameters":{"limit":"={{ 100 }}","options":{},"timeMax":"={{ $node['Step 3: Get datetime'].json.today }} 23:55:00","timeMin":"={{ $node['Step 3: Get datetime'].json.today }} 00:05:00","calendar":{"__rl":true,"mode":"id","value":""},"operation":"getAll"},"credentials":{"googleCalendarOAuth2Api":{"id":"5ZYfQKnbuK5s9rC3","name":"Google Calendar account test"}},"executeOnce":true,"typeVersion":1.3,"alwaysOutputData":true},{"id":"e5d03c50-5dff-4c0f-826f-2c5dd6e7d5ac","name":"Step 39: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-1808,2608],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $node['Step 38: Get the event information from Google Calendar for today.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"1ad802f9-6521-449c-a6a2-dc08c1edce76","name":"Step 40: Filter out events whose titles match the action of a customer visiting the company.","type":"n8n-nodes-base.filter","maxTries":2,"position":[-2016,2816],"parameters":{"options":{"ignoreCase":true},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":false,"typeValidation":"strict"},"combinator":"or","conditions":[{"id":"d3f13ec7-2eae-4c41-9714-7ece062e9859","operator":{"type":"string","operation":"regex"},"leftValue":"={{ $json.summary }}","rightValue":"=(to come|to arrive|visit)"}]}},"retryOnFail":true,"typeVersion":2.3},{"id":"ffb3dd65-22fc-4bcf-8a6e-64e3cc2648f2","name":"Step 41: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-1808,2816],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $node['Step 40: Filter out events whose titles match the action of a customer visiting the company.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"738d36f6-294a-4bca-82c4-9c12f4c5336e","name":"Step 42: Read the Odoo Calendar Event notifications that have been sent.","type":"n8n-nodes-base.googleSheets","maxTries":2,"position":[-1568,2608],"parameters":{"sheetName":{"__rl":true,"mode":"list","value":"","cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"url","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.7,"alwaysOutputData":true},{"id":"f107d42c-08fa-4eaa-9c6e-b5f38ad54cae","name":"Step 43: Filter out records that have not been sent.","type":"n8n-nodes-base.code","position":[-1360,2608],"parameters":{"jsCode":"const odoo_Calendar_Event_Sheet = $items(\"Step 42: Read the Odoo Calendar Event notifications that have been sent.\");\n\nconst records = $items(\"Step 40: Filter out events whose titles match the action of a customer visiting the company.\");\n\nconst sentEventIds = new Set(\n  odoo_Calendar_Event_Sheet\n    .filter(item => item.json[\"Today\"] === \"Sent\")\n    .map(item => item.json.ID)\n);\n\nfunction formatDateTime(dateTimeStr) {\n  if (!dateTimeStr) return null;\n\n  return dateTimeStr\n    .replace(\"T\", \" \")\n    .replace(/\\+\\d{2}:\\d{2}$/, \"\");\n}\n\nconst result = records\n  .map(item => {\n    const name = item.json.summary.replace(/\\[.*?\\]\\s*/g, '');\n\n    return {\n      odoo_calendar_event_id: item.json.id,\n      odoo_calendar_event_name: name,\n      odoo_calendar_event_start: formatDateTime(item.json.start.dateTime),\n      odoo_calendar_event_stop: formatDateTime(item.json.end.dateTime),\n      attendees: item.json.attendees,\n    };\n  })\n  .filter(item => !sentEventIds.has(item.odoo_calendar_event_id));\n\nreturn result;\n"},"executeOnce":true,"typeVersion":2,"alwaysOutputData":true},{"id":"a8824e2a-6a4b-4853-b7a5-8638d5537c18","name":"Step 44: Check if there is a record or not?","type":"n8n-nodes-base.if","position":[-1568,2816],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"f1ab87cc-5385-4e2b-86c6-95a5a9d615ab","operator":{"type":"object","operation":"empty","singleValue":true},"leftValue":"={{ $node['Step 43: Filter out records that have not been sent.'].json }}","rightValue":0}]}},"typeVersion":2.3},{"id":"635658e0-557e-481a-ae07-039c64e365f0","name":"Step 45: Check if it is currently >= 8 AM?","type":"n8n-nodes-base.if","position":[-1360,2816],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"e4908b50-6426-44af-93c3-4fa8906cecd9","operator":{"type":"number","operation":"gte"},"leftValue":"={{ $node['Step 2: Set Variables'].json.Hour }}","rightValue":"={{ 08 }}"}]},"looseTypeValidation":true},"executeOnce":true,"typeVersion":2.3},{"id":"81c2a562-7dc9-41f4-b338-f82abd75b1c7","name":"Step 46: Convert to text","type":"n8n-nodes-base.code","position":[-1136,2608],"parameters":{"jsCode":"const data = $items(\"Step 43: Filter out records that have not been sent.\");\n\nconst tagString = data\n  .map(item => {\n    const j = item.json;\n    return `*Event:* *${j.odoo_calendar_event_name}*\\n` +\n           `*From:* ${j.odoo_calendar_event_start}\\n` +\n           `*To:* ${j.odoo_calendar_event_stop}`;\n  })\n  .join('\\n\\n');\n\nconst finalMessage = `<!channel> :mega:\\n${tagString}`;\nconst safeMessage = finalMessage.replace(/\\n/g, '\\\\n');\nreturn [{ json: { message: safeMessage } }];\n\n"},"executeOnce":true,"typeVersion":2,"alwaysOutputData":true},{"id":"2ac1743e-9efe-43ca-94fe-82d512faa6e4","name":"Step 47: Download file image","type":"n8n-nodes-base.googleDrive","position":[-928,2608],"parameters":{"fileId":{"__rl":true,"mode":"id","value":""},"options":{},"operation":"download"},"credentials":{"googleDriveOAuth2Api":{"id":"S68krIocJ1klW4Hq","name":"Google Drive account test"}},"typeVersion":3},{"id":"03b54ae8-8f49-4cc9-b9ef-8741f9bd5e5f","name":"Step 48: Convert KB → bytes","type":"n8n-nodes-base.code","position":[-704,2608],"parameters":{"jsCode":"const item = $input.first();\n\nconst buffer = await this.helpers.getBinaryDataBuffer(0, 'data');\nitem.binary.data = {\n  ...item.binary.data,\n  fileSize: buffer.length,\n  fileName: `image.png`,\n};\n\nreturn item;"},"executeOnce":true,"typeVersion":2},{"id":"594c0ad9-14f3-4575-8a44-d5bf81efc649","name":"Step 49: Call Slack API's getUploadURLExternal API","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[-1136,2816],"parameters":{"url":"=https://slack.com/api/files.getUploadURLExternal","method":"POST","options":{},"jsonQuery":"={\n  \"filename\": \"{{$binary.data.fileName}}\",\n  \"length\": {{$binary.data.fileSize}}\n}","sendQuery":true,"specifyQuery":"json","authentication":"genericCredentialType","genericAuthType":"httpBearerAuth"},"credentials":{"httpQueryAuth":{"id":"qcfUzDEAk3oCwGGk","name":"Query Auth account  BHS Service APP Slack"},"httpBearerAuth":{"id":"40fU2AjYKYOyDMZk","name":"Bearer Auth account Odoo Bot TEST"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"8663bcf0-78b4-4e4b-8bde-5dbeab4bc5f0","name":"Step 50: Choose branch 2","type":"n8n-nodes-base.merge","position":[-928,2816],"parameters":{"mode":"chooseBranch","useDataOfInput":2},"typeVersion":3.2},{"id":"43ad5a1a-658c-4bdf-9c25-06c913a07b11","name":"Step 51: POST upload_url Slack","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[-704,2816],"parameters":{"url":"={{ $node[\"Step 49: Call Slack API's getUploadURLExternal API\"].json.upload_url}}","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","jsonHeaders":"={\n  \"Content-Type\": \"application/octet-stream\"\n}","sendHeaders":true,"specifyHeaders":"json","inputDataFieldName":"data"},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"ce2afd81-a9eb-48f8-b7dc-836ea163907c","name":"Step 52: Call the completeUploadExternal Slack API to complete the file upload.","type":"n8n-nodes-base.httpRequest","onError":"continueRegularOutput","maxTries":2,"position":[-512,2608],"parameters":{"url":"=https://slack.com/api/files.completeUploadExternal","method":"POST","options":{},"jsonBody":"={\n  \"files\": [\n    {\n      \"id\": \"{{ $node['Step 49: Call Slack API's getUploadURLExternal API'].json.file_id }}\",\n      \"title\": \"input_title\"\n    }\n  ],\n  \"channel_id\": \"{{ $node['Step 2: Set Variables'].json.channel_id}}\",\n  \"initial_comment\": \"{{ $node['Step 46: Convert to text'].json.message }}\"\n}\n","sendBody":true,"specifyBody":"=json","authentication":"genericCredentialType","bodyParameters":{"parameters":[{}]},"genericAuthType":"httpBearerAuth"},"credentials":{"httpQueryAuth":{"id":"qcfUzDEAk3oCwGGk","name":"Query Auth account  BHS Service APP Slack"},"httpBearerAuth":{"id":"40fU2AjYKYOyDMZk","name":"Bearer Auth account Odoo Bot TEST"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"9894b3cd-bd04-4861-b4f5-1b71d583d876","name":"Step 53: Return output of step 43","type":"n8n-nodes-base.code","position":[-288,2608],"parameters":{"jsCode":"const all = $items(\"Step 43: Filter out records that have not been sent.\");\nreturn all;\n"},"executeOnce":true,"typeVersion":2},{"id":"031dd88f-e78a-4e54-9b8c-cc6f0f747099","name":"Step 54: Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-512,2816],"parameters":{"options":{}},"typeVersion":3},{"id":"b31df922-1bb0-4007-9290-5b252faf1b90","name":"Step 55: Fill in the Calendar Event information in the Google Sheet.","type":"n8n-nodes-base.googleSheets","position":[-288,2816],"parameters":{"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"url","value":""},"documentId":{"__rl":true,"mode":"url","value":"="}},"credentials":{"googleSheetsOAuth2Api":{"id":"9s4BHmqh3xSaTNc5","name":"Google Sheets credential test"}},"typeVersion":4.7},{"id":"30270cab-2f81-410a-bc93-85969f166d44","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2112,1776],"parameters":{"color":7,"width":1312,"height":640,"content":"## 2. The system sends a notification to partners one day in advance."},"typeVersion":1},{"id":"7ea32518-a36e-4010-bdc5-bd11cc84fb68","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[-3584,1776],"parameters":{"width":720,"height":1280,"content":"# Customer Visit Notification\nThis 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 relevant stakeholders. It also posts a company-wide announcement to ensure proper preparation and a professional reception for the customer.\n\n## 📌Who is this for?\n- Reception / Administration team\n- Sales / Account owners in charge of customers\n- Management / Related team leaders\n- Security / IT / Logistics (for meeting room, equipment, and check-in preparation)\n\n## 📌The problem\n- Customer visit information is usually shared manually and can be easily missed.\n- Related staff are not informed in time to prepare.\n- This causes last-minute preparation for reception, meeting rooms, documents, and support.\n- It affects the customer experience and the company’s professional image.\n\n## 📌How it works\n- When a customer meeting is scheduled, the system records the information (time, customer name, company, person in charge).\n- The system automatically sends notifications to related groups based on timeline:\n       - Notify the whole office 1 hour before the visit.\n       - Notify related members 24 hours in advance.\n- Notifications can be sent via Email / Slack / Internal chat.\n\n\n## 📌Quick setup\nRequired information:\n- N8n Version 2.4.6\n- Google Calendar OAuth2 API: Client ID, Client Secret\n- Google Sheets OAuth2 API: Client ID, Client Secret\n- Slack App: Bot User OAuth Token\n\n\nGoogle Sheets will be used to log all notified events.\n\n## 📌Results\n- Everyone is aware of the customer visit schedule.\n- Teams can proactively prepare meeting rooms, documents, and manpower.\n- Reduce mistakes and missed communication.\n- Improve customer experience and company professionalism.\n\n## 📌Take it further\n- Customer check-in using QR code / Visitor form\n- Send reminders to prepare documents\n- Store visit history\n- Monthly/quarterly reports for number of customer visits\n\n## 📌Need help customizing?\nContact me for consulting and support:\n[Linkedin](https://www.linkedin.com/company/bac-ha-software/posts/?feedView=all) / [Website](https://bachasoftware.com/bhsoft-contacts)"},"typeVersion":1},{"id":"50bd906f-d87f-44a5-99d7-5042ccb17451","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-2816,1776],"parameters":{"color":7,"width":560,"height":720,"content":"## 1. Set Variables and Get datetime"},"typeVersion":1},{"id":"50e9bb55-b56c-44cb-9e82-cedd827c4c47","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-2112,2480],"parameters":{"color":7,"width":2064,"height":592,"content":"## 5. The system sends a company-wide announcement to a public channel today"},"typeVersion":1},{"id":"5cc130dd-ce52-40e4-8998-a4770a83e7ff","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-768,1776],"parameters":{"color":7,"width":432,"height":640,"content":"## 3. Fill in the Calendar Event information in the Google Sheet."},"typeVersion":1},{"id":"0920be29-95ad-4ad8-b487-dba54b607b9a","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-304,1776],"parameters":{"color":7,"width":1712,"height":640,"content":"## 4. The system sends a company-wide announcement to a public channel today and updates a note in the Google Sheet."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"5450be35-7894-4cb6-acee-f9e35626b6c1","connections":{"Step 15: Wait 1s":{"main":[[{"node":"Step 16: Send a message to your Partners","type":"main","index":0}]]},"Step 3: Get datetime":{"main":[[{"node":"Step 4: Get the event information from Google Calendar for tomorrow.","type":"main","index":0}]]},"Step 2: Set Variables":{"main":[[{"node":"Step 3: Get datetime","type":"main","index":0}]]},"Step 12: Loop Over Items":{"main":[[{"node":"Step 14: Loop Over Partners.","type":"main","index":0}],[{"node":"Step 13: Extract the email and member ID of the partners.","type":"main","index":0}]]},"Step 18: Loop Over Items":{"main":[[{"node":"Step 20: Get the event information from Google Calendar for today..","type":"main","index":0}],[{"node":"Step 19: Fill in the Calendar Event information in the Google Sheet.","type":"main","index":0}]]},"Step 28: Convert to text":{"main":[[{"node":"Step 29: Download file image","type":"main","index":0}]]},"Step 32: Choose branch 2":{"main":[[{"node":"Step 33: POST upload_url Slack","type":"main","index":0}]]},"Step 36: Loop Over Items":{"main":[[],[{"node":"Step 37: Fill in the Calendar Event information in the Google Sheet.","type":"main","index":0}]]},"Step 46: Convert to text":{"main":[[{"node":"Step 47: Download file image","type":"main","index":0}]]},"Step 50: Choose branch 2":{"main":[[{"node":"Step 51: POST upload_url Slack","type":"main","index":0}]]},"Step 54: Loop Over Items":{"main":[[],[{"node":"Step 55: Fill in the Calendar Event information in the Google Sheet.","type":"main","index":0}]]},"Step 14: Loop Over Partners.":{"main":[[{"node":"Step 17: Return output of step8","type":"main","index":0}],[{"node":"Step 15: Wait 1s","type":"main","index":0}]]},"Step 29: Download file image":{"main":[[{"node":"Step 30: Convert KB → bytes","type":"main","index":0}]]},"Step 47: Download file image":{"main":[[{"node":"Step 48: Convert KB → bytes","type":"main","index":0}]]},"Step 30: Convert KB → bytes":{"main":[[{"node":"Step 31: Call Slack API's getUploadURLExternal API","type":"main","index":0},{"node":"Step 32: Choose branch 2","type":"main","index":1}]]},"Step 48: Convert KB → bytes":{"main":[[{"node":"Step 49: Call Slack API's getUploadURLExternal API","type":"main","index":0},{"node":"Step 50: Choose branch 2","type":"main","index":1}]]},"Step 33: POST upload_url Slack":{"main":[[{"node":"Step 34: Call the completeUploadExternal Slack API to complete the file upload.","type":"main","index":0}]]},"Step 51: POST upload_url Slack":{"main":[[{"node":"Step 52: Call the completeUploadExternal Slack API to complete the file upload.","type":"main","index":0}]]},"Step 17: Return output of step8":{"main":[[{"node":"Step 18: Loop Over Items","type":"main","index":0}]]},"Step 35: Return output of step 25":{"main":[[{"node":"Step 36: Loop Over Items","type":"main","index":0}]]},"Step 53: Return output of step 43":{"main":[[{"node":"Step 54: Loop Over Items","type":"main","index":0}]]},"Step 9: Read Google Sheets member slack":{"main":[[{"node":"Step 10: Filter out records that have not been sent.","type":"main","index":0}]]},"Step 16: Send a message to your Partners":{"main":[[{"node":"Step 14: Loop Over Partners.","type":"main","index":0}]]},"Step 27: Check if it is currently >= 8 AM?":{"main":[[{"node":"Step 28: Convert to text","type":"main","index":0}],[]]},"Step 45: Check if it is currently >= 8 AM?":{"main":[[{"node":"Step 46: Convert to text","type":"main","index":0}],[]]},"Step 5: Check if there is a record or not?":{"main":[[{"node":"Step 6: Filter out events whose titles match the action of a customer visiting the company.","type":"main","index":0}],[{"node":"Step 38: Get the event information from Google Calendar for today.","type":"main","index":0}]]},"Step 7: Check if there is a record or not?":{"main":[[{"node":"Step 8: Read the Odoo Calendar Event notifications that have been sent.","type":"main","index":0}],[]]},"Step 11: Check if there is a record or not?":{"main":[[],[{"node":"Step 12: Loop Over Items","type":"main","index":0}]]},"Step 21: Check if there is a record or not?":{"main":[[{"node":"Step 22: Filter out events whose titles match the action of a customer visiting the company.","type":"main","index":0}],[]]},"Step 23: Check if there is a record or not?":{"main":[[{"node":"Step 24: Read the Odoo Calendar Event notifications that have been sent.","type":"main","index":0}],[]]},"Step 26: Check if there is a record or not?":{"main":[[],[{"node":"Step 27: Check if it is currently >= 8 AM?","type":"main","index":0}]]},"Step 39: Check if there is a record or not?":{"main":[[{"node":"Step 40: Filter out events whose titles match the action of a customer visiting the company.","type":"main","index":0}],[]]},"Step 41: Check if there is a record or not?":{"main":[[{"node":"Step 42: Read the Odoo Calendar Event notifications that have been sent.","type":"main","index":0}],[]]},"Step 44: Check if there is a record or not?":{"main":[[],[{"node":"Step 45: Check if it is currently >= 8 AM?","type":"main","index":0}]]},"Step 31: Call Slack API's getUploadURLExternal API":{"main":[[{"node":"Step 32: Choose branch 2","type":"main","index":0}]]},"Step 49: Call Slack API's getUploadURLExternal API":{"main":[[{"node":"Step 50: Choose branch 2","type":"main","index":0}]]},"Step 10: Filter out records that have not been sent.":{"main":[[{"node":"Step 11: Check if there is a record or not?","type":"main","index":0}]]},"Step 25: Filter out records that have not been sent.":{"main":[[{"node":"Step 26: Check if there is a record or not?","type":"main","index":0}]]},"Step 43: Filter out records that have not been sent.":{"main":[[{"node":"Step 44: Check if there is a record or not?","type":"main","index":0}]]},"Step 13: Extract the email and member ID of the partners.":{"main":[[{"node":"Step 12: Loop Over Items","type":"main","index":0}]]},"Step 1: Activation schedule: Every 1 hour, from 6 AM to 6 PM.":{"main":[[{"node":"Step 2: Set Variables","type":"main","index":0}]]},"Step 38: Get the event information from Google Calendar for today.":{"main":[[{"node":"Step 39: Check if there is a record or not?","type":"main","index":0}]]},"Step 20: Get the event information from Google Calendar for today..":{"main":[[{"node":"Step 21: Check if there is a record or not?","type":"main","index":0}]]},"Step 19: Fill in the Calendar Event information in the Google Sheet.":{"main":[[{"node":"Step 18: Loop Over Items","type":"main","index":0}]]},"Step 37: Fill in the Calendar Event information in the Google Sheet.":{"main":[[{"node":"Step 36: Loop Over Items","type":"main","index":0}]]},"Step 4: Get the event information from Google Calendar for tomorrow.":{"main":[[{"node":"Step 5: Check if there is a record or not?","type":"main","index":0}]]},"Step 55: Fill in the Calendar Event information in the Google Sheet.":{"main":[[{"node":"Step 54: Loop Over Items","type":"main","index":0}]]},"Step 8: Read the Odoo Calendar Event notifications that have been sent.":{"main":[[{"node":"Step 9: Read Google Sheets member slack","type":"main","index":0}]]},"Step 24: Read the Odoo Calendar Event notifications that have been sent.":{"main":[[{"node":"Step 25: Filter out records that have not been sent.","type":"main","index":0}]]},"Step 42: Read the Odoo Calendar Event notifications that have been sent.":{"main":[[{"node":"Step 43: Filter out records that have not been sent.","type":"main","index":0}]]},"Step 34: Call the completeUploadExternal Slack API to complete the file upload.":{"main":[[{"node":"Step 35: Return output of step 25","type":"main","index":0}]]},"Step 52: Call the completeUploadExternal Slack API to complete the file upload.":{"main":[[{"node":"Step 53: Return output of step 43","type":"main","index":0}]]},"Step 6: Filter out events whose titles match the action of a customer visiting the company.":{"main":[[{"node":"Step 7: Check if there is a record or not?","type":"main","index":0}]]},"Step 22: Filter out events whose titles match the action of a customer visiting the company.":{"main":[[{"node":"Step 23: Check if there is a record or not?","type":"main","index":0}]]},"Step 40: Filter out events whose titles match the action of a customer visiting the company.":{"main":[[{"node":"Step 41: Check if there is a record or not?","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":61,"nodeTypes":{"n8n-nodes-base.if":{"count":11},"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":12},"n8n-nodes-base.wait":{"count":1},"n8n-nodes-base.merge":{"count":2},"n8n-nodes-base.filter":{"count":3},"n8n-nodes-base.stickyNote":{"count":6},"n8n-nodes-base.googleDrive":{"count":2},"n8n-nodes-base.httpRequest":{"count":7},"n8n-nodes-base.googleSheets":{"count":7},"n8n-nodes-base.googleCalendar":{"count":3},"n8n-nodes-base.splitInBatches":{"count":5},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"BHSoft","username":"bhsoft","bio":"BHSoft is a Vietnam-based software development firm serving a global clientele. We combine top talent with the latest tech stacks to deliver exceptional SaaS, Mobile Apps, and specialized GIS/3D Mapping solutions. Committed to Agile practices and cloud optimization, we strive to be your trusted, long-term partner in digital innovation.","verified":true,"links":["https://bachasoftware.com/"],"avatar":"https://gravatar.com/avatar/b6e71b2ed09b9dacff71dde434864767354eb9dc7193ea36129426f883306073?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":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"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-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"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/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"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/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"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/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"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/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"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.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"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/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"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-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"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/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"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/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"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/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"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-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"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"},{"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.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"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":38,"icon":"fa:pen","name":"n8n-nodes-base.set","codex":{"data":{"alias":["Set","JS","JSON","Filter","Transform","Map"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"url":"https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/","icon":"📡","label":"Database Monitoring and Alerting with n8n"},{"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/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-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"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/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"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/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/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"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/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"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"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"},{"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.set/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"input\"]","defaults":{"name":"Edit Fields"},"iconData":{"icon":"pen","type":"icon"},"displayName":"Edit Fields (Set)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"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":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","codex":{"data":{"resources":{"generic":[{"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/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/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.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":317,"icon":"file:googleCalendar.svg","name":"n8n-nodes-base.googleCalendar","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-host-virtual-coffee-breaks-with-n8n/","icon":"☕️","label":"How to host virtual coffee breaks with 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/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/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automation for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/tracking-time-spent-in-meetings-with-google-calendar-twilio-and-n8n/","icon":"🗓","label":"Tracking Time Spent in Meetings With Google Calendar, Twilio, and n8n"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlecalendar/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Calendar"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgODIiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZD0iTTYxLjA1MiAxOC45NDdIMTguOTQ3djQyLjEwNWg0Mi4xMDV6Ii8+PHBhdGggZmlsbD0iI2VhNDMzNSIgZD0iTTYxLjA1MyA4MCA4MCA2MS4wNTNINjEuMDUzeiIvPjxwYXRoIGZpbGw9IiNmYmJjMDQiIGQ9Ik04MCAxOC45NDdINjEuMDUzdjQyLjEwNUg4MHoiLz48cGF0aCBmaWxsPSIjMzRhODUzIiBkPSJNNjEuMDUyIDYxLjA1M0gxOC45NDdWODBoNDIuMTA1eiIvPjxwYXRoIGZpbGw9IiMxODgwMzgiIGQ9Ik0wIDYxLjA1M3YxMi42MzJBNi4zMTQgNi4zMTQgMCAwIDAgNi4zMTYgODBoMTIuNjMyVjYxLjA1M3oiLz48cGF0aCBmaWxsPSIjMTk2N2QyIiBkPSJNODAgMTguOTQ3VjYuMzE2QTYuMzE0IDYuMzE0IDAgMCAwIDczLjY4NSAwSDYxLjA1M3YxOC45NDd6Ii8+PHBhdGggZmlsbD0iIzQyODVmNCIgZD0iTTYxLjA1MyAwSDYuMzE2QTYuMzE0IDYuMzE0IDAgMCAwIDAgNi4zMTZ2NTQuNzM3aDE4Ljk0N1YxOC45NDdoNDIuMTA1VjB6TTI3LjU4NCA1MS42MTFjLTEuNTc0LTEuMDYzLTIuNjYzLTIuNjE2LTMuMjU4LTQuNjY4bDMuNjUzLTEuNTA1cS40OTggMS44OTQgMS43MzcgMi45MzdjMS4yMzkgMS4wNDMgMS44MjEgMS4wMzcgMi45ODkgMS4wMzdxMS43OTIgMCAzLjA3OS0xLjA4OWMxLjI4Ny0xLjA4OSAxLjI5LTEuNjUzIDEuMjktMi43NzRhMy40NCAzLjQ0IDAgMCAwLTEuMzU4LTIuODExYy0uOTA1LS43MjctMi4wNDItMS4wODktMy40LTEuMDg5aC0yLjExMXYtMy42MTZIMzIuMXExLjc1MiAwIDIuOTUzLS45NDdjMS4yMDEtLjk0NyAxLjItMS40OTUgMS4yLTIuNTk1cTAtMS40NjctMS4wNzQtMi4zNDJjLTEuMDc0LS44NzUtMS42MjEtLjg3OS0yLjcyMS0uODc5cS0xLjYxLS4wMDItMi41NTguODU4Yy0uOTQ4Ljg2LTEuMTA2IDEuMzAxLTEuMzc5IDIuMTExbC0zLjYxNi0xLjUwNWMuNDc5LTEuMzU4IDEuMzU4LTIuNTU4IDIuNjQ3LTMuNTk1czIuOTM3LTEuNTU4IDQuOTM3LTEuNTU4cTIuMjItLjAwMiAzLjk4OS44NThjMS43NjkuODYgMi4xMDUgMS4zNjggMi43NzQgMi4zNzlzMSAyLjE1MyAxIDMuNDE2cTAgMS45MzItLjkzMiAzLjI3NGMtLjkzMiAxLjM0Mi0xLjM4NCAxLjU3OS0yLjI4OSAyLjA1OHYuMjE2YTYuOTUgNi45NSAwIDAgMSAyLjkzNyAyLjI4OXExLjE0NiAxLjUzOCAxLjE0NyAzLjY4NGMuMDAxIDIuMTQ2LS4zNjMgMi43MTEtMS4wODkgMy44MzJzLTEuNzMyIDIuMDA1LTMuMDA1IDIuNjQ3Yy0xLjI3OS42NDItMi43MTYuOTY4LTQuMzExLjk2OC0xLjg0Ny4wMDUtMy41NTMtLjUyNi01LjEyNi0xLjU4OXptMjIuNDM3LTE4LjEyNi00LjAxIDIuOS0yLjAwNS0zLjA0MiA3LjE5NS01LjE4OWgyLjc1OHYyNC40NzloLTMuOTM3VjMzLjQ4NHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Calendar","typeVersion":1,"nodeCategories":[{"id":4,"name":"Productivity"}]},{"id":514,"icon":"fa:pause-circle","name":"n8n-nodes-base.wait","codex":{"data":{"alias":["pause","sleep","delay","timeout"],"resources":{"generic":[{"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/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.wait/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Wait","color":"#804050"},"iconData":{"icon":"pause-circle","type":"icon"},"displayName":"Wait","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"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"}]},{"id":844,"icon":"fa:filter","name":"n8n-nodes-base.filter","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The Filter node can be used to filter items based on a condition. If the condition is met, the item will be passed on to the next node. If the condition is not met, the item will be omitted. Conditions can be combined together by AND(meet all conditions), or OR(meet at least one condition).","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.filter/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Filter","color":"#229eff"},"iconData":{"icon":"filter","type":"icon"},"displayName":"Filter","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":42,"name":"Internal Wiki"}],"image":[]}}