{"workflow":{"id":13324,"name":"Sync Gmail sent email contacts with Odoo mailing lists","views":79,"recentViews":0,"totalViews":79,"createdAt":"2026-02-12T06:52:18.576Z","description":"# Email Contacts Sync from Sent Mailbox to Odoo\nThis workflow automatically extracts recipient email addresses from previously sent emails, validates and cleans the data, and synchronizes only deliverable contacts into the internal Odoo Mailing List. It also monitors replies and bounce signals to support follow-up and engagement tracking.\n## 📌Who is this for?\n- Marketing team (Email campaigns)\n- CRM / Odoo administrators\n- Sales team (follow-up & customer engagement)\n- Operations / Automation engineers (n8n workflows)\n\n## 📌The problem\n- Customer emails are scattered across sent mail history instead of a centralized list.\n- Manually copying recipients into Odoo is slow and error-prone.\n- Sent emails may include invalid or bounced addresses.\n- Duplicate contacts appear frequently.\n- Hard to know which recipients have replied or not for follow-up.\n\n\nThis leads to:\n- messy contact database\n- high bounce rate\n- missed follow-ups\n- inefficient manual work\n\n## 📌How it works\n- The system calculates the target date and queries the Gmail API to retrieve emails sent within the last X days.\n- For each sent email:\n         - Extract recipients from the To/Cc fields\n         - Normalize data (trim, lowercase, remove duplicates)\n         - Check the email thread to detect replies or bounce/system responses\n\n- Each recipient is then classified into one of the following lists:\n         - deliverableEmails\n         - repliedEmails\n         - bounceEmails\n         - autoReplies\n         - noResponse\n\n- Push the list of deliverable emails to the internal Odoo system as Mailing List Contacts.\n- Add emails from the bounce list to Blacklisted Email Addresses in Odoo to prevent future sending.\n- (Optional) Log all processing results into Google Sheets for tracking and auditing.\n\n## 📌Quick setup\nRequired information:\n- N8n Version 2.4.6\n- Gmail OAuth2 API\n- Odoo API-KEY\n\n\nGoogle Sheets will be used to log all notified events.\n\n## 📌Results\n- Automatically build contact list from real sent emails\n- No manual data entry\n- Only valid emails stored in Odoo\n- Reduced bounce rate\n- No duplicates\n- Easy follow-up tracking\n- Better CRM hygiene and campaign performance\n\n## 📌Take it further\n- Auto follow-up if no reply after X days\n- Auto-remove hard bounces\n- Engagement scoring\n- Reply analytics dashboard\n- Sync with Loyalty/CRM systems\n- Scheduled daily sync\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":"UR98jinnwjEocwVT","meta":{"instanceId":"f54ed2f247cfbe1163a5a9b9696947f5b0eada18a928fca1e498ba8aff19a63a","templateCredsSetupCompleted":true},"name":"Email Contacts Sync from Sent Mailbox to Odoo","tags":[{"id":"6ZEKwNveBvfSidIt","name":"Gmail","createdAt":"2025-04-02T07:57:20.398Z","updatedAt":"2025-04-02T07:57:20.398Z"},{"id":"HyLSX6V7QZs5MrZy","name":"Odoo","createdAt":"2025-03-24T01:54:27.030Z","updatedAt":"2025-03-24T01:54:27.030Z"}],"nodes":[{"id":"9ba53878-ef58-4926-b5a7-1f7e6a11db53","name":"End","type":"n8n-nodes-base.noOp","position":[384,1008],"parameters":{},"typeVersion":1},{"id":"69e88df5-3338-46c2-845b-7778a54502a8","name":"Step 1: Schedule Trigger every day at 7 AM","type":"n8n-nodes-base.scheduleTrigger","position":[-768,912],"parameters":{"rule":{"interval":[{"triggerAtHour":"={{ 07 }}","triggerAtMinute":"={{ 0 }}"}]}},"typeVersion":1.3},{"id":"8b34fc77-07b8-4cfc-aa86-94de5d323cd1","name":"Step 2: Set Variables","type":"n8n-nodes-base.set","position":[-544,912],"parameters":{"mode":"raw","options":{},"jsonOutput":"={\n  \"limit\": 100,\n  \"days_ago\": 10,\n  \"mailing_contact_web_search_read\": \"end_point\",\n  \"mailing_contact_web_save\": \"end_point\",\n  \"020_Good_to_send\": 991,\n  \"mail_blacklist_web_search_read\": \"end_point\",\n  \"mail_blacklist_web_save\": \"end_point\"\n}"},"executeOnce":true,"typeVersion":3.4},{"id":"d57d0cc8-75ed-4cba-992d-da9d8e2bd0e1","name":"Step 3: Get date time","type":"n8n-nodes-base.code","position":[-336,912],"parameters":{"jsCode":"const today = new Date();\n\ntoday.setDate(today.getDate() - $input.first().json.days_ago);\n\nconst yyyy = today.getFullYear();\nconst mm = String(today.getMonth() + 1).padStart(2, '0');\nconst dd = String(today.getDate()).padStart(2, '0');\n\nconst after = `${yyyy}/${mm}/${dd}`;\n \nconst next = new Date(today);\nnext.setDate(next.getDate() + 1);\n\nconst afterNext = `${next.getFullYear()}/${String(next.getMonth()+1).padStart(2,'0')}/${String(next.getDate()).padStart(2,'0')}`;\n\nreturn {\n  after,\n  before: afterNext\n};\n"},"typeVersion":2},{"id":"778eef83-d3d9-48aa-bfd3-b5c6a9e8cc38","name":"Step 4:Get the list of emails sent 10 days ago.","type":"n8n-nodes-base.httpRequest","position":[-96,912],"parameters":{"url":"https://gmail.googleapis.com/gmail/v1/users/me/messages","options":{},"sendQuery":true,"authentication":"predefinedCredentialType","queryParameters":{"parameters":[{"name":"=q","value":"=in:sent after:{{$json.after}} before:{{$json.before}}"},{"name":"=maxResults","value":"=1000"}]},"nodeCredentialType":"gmailOAuth2"},"credentials":{"gmailOAuth2":{"id":"90IINGJQCIphPQEb","name":"Gmail account Test template"},"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"typeVersion":4.2,"alwaysOutputData":true},{"id":"129e5bc6-5a4d-47b2-9bc4-4b6af38b2a7e","name":"Step 5: If resultSizeEstimate has a record ==> true","type":"n8n-nodes-base.if","position":[144,912],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"67886917-88be-4839-b1fb-35735310336b","operator":{"type":"number","operation":"notEquals"},"leftValue":"={{ $json.resultSizeEstimate }}","rightValue":"={{ 0 }}"}]}},"typeVersion":2.3},{"id":"a919bc3d-a946-4a1d-b033-cceee803e231","name":"Step 6: Split Out emails sent","type":"n8n-nodes-base.splitOut","position":[384,800],"parameters":{"options":{},"fieldToSplitOut":"messages"},"executeOnce":true,"retryOnFail":true,"typeVersion":1,"alwaysOutputData":true},{"id":"5ada64a1-c4b7-4a14-8a1b-0c38f55c9e8b","name":"Step 7: Loop Over email sent","type":"n8n-nodes-base.splitInBatches","position":[640,800],"parameters":{"options":{}},"typeVersion":3},{"id":"e28369de-1c64-4e49-a7c4-0b1ec469aa9f","name":"Step 8: Get email information about thread_id","type":"n8n-nodes-base.httpRequest","position":[864,960],"parameters":{"url":"=https://gmail.googleapis.com/gmail/v1/users/me/threads/{{ $json.threadId }}","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"gmailOAuth2"},"credentials":{"gmailOAuth2":{"id":"90IINGJQCIphPQEb","name":"Gmail account Test template"},"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":true},{"id":"ba367a78-e5ad-4a35-8ad9-574360e06bc2","name":"Step 9: Handling mail sorting from headers","type":"n8n-nodes-base.code","position":[640,960],"parameters":{"jsCode":"const messages = $node[\"Step 8: Get email information about thread_id\"].json.messages || [];\nconst getHeader = (headers, name) =>\n  headers.find(h => h.name === name)?.value || null;\n\nfunction parseRecipients(value) {\n  if (!value) return [];\n\n  return value\n    .split(',')\n    .map(r => {\n      const trimmed = r.trim();\n      const match = trimmed.match(/^(.*?)\\s*<([^>]+)>$/);\n\n      if (match) {\n        return {\n          name: match[1].replace(/\"/g, '').trim(),\n          email: match[2].toLowerCase().trim()\n        };\n      }\n\n      return {\n        name: trimmed.split('@')[0],\n        email: trimmed.toLowerCase()\n      };\n    })\n    .filter(r => r.email);\n}\n\nconst unique = (arr) =>\n  [...new Map(arr.map(r => [r.email, r])).values()];\n\nlet originalRecipients = [];\n\nfor (const msg of messages) {\n  const headers = msg.payload?.headers || [];\n\n  const inReply = getHeader(headers, \"In-Reply-To\");\n\n  // The first message does NOT have an In-Reply-To\n  if (!inReply) {\n    const toList = parseRecipients(getHeader(headers, \"To\"));\n    originalRecipients.push(...toList);\n  }\n}\n\noriginalRecipients = unique(originalRecipients);\n\nlet replied = [];\nlet bounced = [];\nlet autoReply = [];\n\nfor (const msg of messages) {\n  const headers = msg.payload?.headers || [];\n\n  const from = parseRecipients(getHeader(headers, \"From\"))[0];\n  if (!from) continue;\n\n  const subject = (getHeader(headers, \"Subject\") || \"\").toLowerCase();\n  const inReply = getHeader(headers, \"In-Reply-To\");\n  const autoSub = getHeader(headers, \"Auto-Submitted\");\n\n  const fromEmail = from.email;\n\n  /******** BOUNCE ********/\n  const isBounce =\n    fromEmail.includes(\"mailer-daemon\") ||\n    subject.includes(\"delivery status notification\") ||\n    subject.includes(\"failure notice\");\n\n  if (isBounce) {\n    bounced.push(...originalRecipients);\n    continue;\n  }\n\n  /******** AUTO ********/\n  if (autoSub) {\n    autoReply.push(from);\n    continue;\n  }\n\n  /******** REAL REPLY ********/\n  if (inReply) {\n    replied.push(from);\n  }\n}\n\nreplied = unique(replied);\nbounced = unique(bounced);\nautoReply = unique(autoReply);\n\nconst repliedSet = new Set(replied.map(r => r.email));\nconst bouncedSet = new Set(bounced.map(r => r.email));\n\nconst deliver = originalRecipients.filter(\n  r => !bouncedSet.has(r.email)\n);\n\nconst noResponse = deliver.filter(\n  r => !repliedSet.has(r.email)\n);\n\nreturn {\n  deliverableEmails: deliver,\n  repliedEmails: replied,\n  bounceEmails: bounced,\n  autoReplies: autoReply,\n  noResponse\n};\n"},"typeVersion":2,"alwaysOutputData":true},{"id":"c653a801-7bf6-4142-8c0c-a3aad0737931","name":"Step 10: Merge the categorized mailing lists","type":"n8n-nodes-base.code","position":[864,784],"parameters":{"jsCode":"const items = $input.all().map(i => i.json);\n\nlet deliver = [];\nlet replied = [];\nlet bounce = [];\nlet autoReply = [];\nlet noResponse = [];\n\nfor (const data of items) {\n  deliver.push(...(data.deliverableEmails || []));\n  replied.push(...(data.repliedEmails || []));\n  bounce.push(...(data.bounceEmails || []));\n  autoReply.push(...(data.autoReplies || []));\n  noResponse.push(...(data.noResponse || []));\n}\n\nconst unique = (arr) =>\n  [...new Map(arr.map(x => [x.email, x])).values()];\n\ndeliver = unique(deliver);\nreplied = unique(replied);\nbounce = unique(bounce);\nautoReply = unique(autoReply);\nnoResponse = unique(noResponse);\n\nreturn [\n  {\n    json: {\n      deliverableEmails: deliver,\n      repliedEmails: replied,\n      bounceEmails: bounce,\n      autoReplies: autoReply,\n      noResponse: noResponse\n    }\n  }\n];\n"},"typeVersion":2,"alwaysOutputData":true},{"id":"4283c715-1651-4a49-a563-7b9db0b755d6","name":"Step 14: Search email in Mailing List Contacts","type":"n8n-nodes-base.httpRequest","position":[1584,704],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mailing_contact_web_search_read }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 8,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mailing.contact\",\n    \"method\": \"web_search_read\",\n    \"args\": [],\n    \"kwargs\": {\n      \"specification\": {\n        \"id_contact_hubspot\": {},\n        \"create_date\": {},\n        \"title_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"name\": {},\n        \"company_name\": {},\n        \"email\": {},\n        \"is_blacklisted\": {},\n        \"country_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"position_extra\": {},\n        \"state_name\": {},\n        \"industry_name\": {},\n        \"linkedIn_URL\": {},\n        \"numberofemployees\": {},\n        \"is_fix_list\": {},\n        \"message_bounce\": {},\n        \"opt_out\": {},\n        \"list_ids\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        }\n      },\n      \"offset\": 0,\n      \"order\": \"\",\n      \"limit\": 80,\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Saigon\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"bin_size\": true,\n        \"params\": {\n          \"action\": 763,\n          \"actionStack\": [\n            {\n              \"action\": 763\n            }\n          ]\n        },\n        \"update_mailing_type\": \"manual\",\n        \"current_company_id\": 1\n      },\n      \"count_limit\": 10001,\n      \"domain\": [\n        \"&\",\n        [\n          \"is_blacklisted\",\n          \"=\",\n          false\n        ],\n        \"|\",\n        \"|\",\n        [\n          \"name\",\n          \"ilike\",\n          \"{{ $json.email }}\"\n        ],\n        [\n          \"company_name\",\n          \"ilike\",\n          \"{{ $json.email }}\"\n        ],\n        [\n          \"email_normalized\",\n          \"ilike\",\n          \"{{ $json.email }}\"\n        ]\n      ]\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"ff6a0581-0c15-4615-b100-d0296f9c9ae3","name":"Step 15: If number of records is not 0 = true","type":"n8n-nodes-base.if","position":[1776,704],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cc1372a4-cc7d-4ace-9a73-0055e6920e0c","operator":{"type":"number","operation":"notEquals"},"leftValue":"={{ $json.result.length }}","rightValue":"={{ 0 }}"}]}},"typeVersion":2.2},{"id":"6eb6ef12-0a42-40aa-82e6-983f2d05fee8","name":"Step 16.1\" Check if list_ids contains 020.Good-to-send","type":"n8n-nodes-base.code","position":[1984,608],"parameters":{"jsCode":"const inputData = $input.all();\nconst list_ids = inputData[0]?.json?.result?.records[0]?.list_ids || [];\nconst id = inputData[0]?.json?.result?.records[0]?.id;\nlet islist_ids = false;\n\nif (list_ids.length > 0) {\n    islist_ids = list_ids.some(item => item.id === $node['Step 2: Set Variables'].json.020_Good_to_send);\n}\n\nreturn { islist_ids, id };\n"},"typeVersion":2},{"id":"07637692-9598-4a2c-90e4-7cb47d874e66","name":"Step 16.2: Add new email in Mailing List Contacts","type":"n8n-nodes-base.httpRequest","position":[1984,800],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mailing_contact_web_save }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 18,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mailing.contact\",\n    \"method\": \"web_save\",\n    \"args\": [\n      [],\n      {\n        \"name\": \"\",\n        \"first_name\": \"\",\n        \"last_name\": \"\",\n        \"position_extra\": false,\n        \"email\": \"{{ $('Step 13: Loop Over deliverableEmails').item.json.email }}\",\n        \"title_id\": false,\n        \"company_name\": false,\n        \"country_id\": false,\n        \"state_name\": false,\n        \"industry_name\": false,\n        \"numberofemployees\": false,\n        \"company_related\": false,\n        \"linkedIn_URL\": false,\n        \"tag_ids\": [],\n        \"subscription_ids\": [\n          [\n            0,\n            \"virtual_249\",\n            {\n              \"list_id\": {{ $node['Step 2: Set Variables'].json['020_Good_to_send'] }},\n              \"opt_out\": false,\n              \"opt_out_reason_id\": false\n            }\n          ]\n        ]\n      }\n    ],\n    \"kwargs\": {\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Saigon\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"params\": {\n          \"action\": 763,\n          \"actionStack\": [\n            {\n              \"action\": 763\n            }\n          ]\n        },\n        \"update_mailing_type\": \"manual\"\n      },\n      \"specification\": {\n        \"id\": {},\n        \"name\": {},\n        \"first_name\": {},\n        \"last_name\": {},\n        \"position_extra\": {},\n        \"email\": {},\n        \"is_blacklisted\": {},\n        \"title_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"company_name\": {},\n        \"country_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"state_name\": {},\n        \"create_date\": {},\n        \"message_bounce\": {},\n        \"industry_name\": {},\n        \"numberofemployees\": {},\n        \"company_related\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"linkedIn_URL\": {},\n        \"tag_ids\": {\n          \"fields\": {\n            \"display_name\": {},\n            \"color\": {}\n          }\n        },\n        \"subscription_ids\": {\n          \"fields\": {\n            \"id\": {},\n            \"list_id\": {\n              \"fields\": {\n                \"display_name\": {}\n              }\n            },\n            \"opt_out_datetime\": {},\n            \"opt_out\": {},\n            \"opt_out_reason_id\": {\n              \"fields\": {\n                \"display_name\": {}\n              }\n            },\n            \"create_date\": {}\n          },\n          \"limit\": 100,\n          \"order\": \"\"\n        },\n        \"display_name\": {}\n      }\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"5c23917e-e814-4c11-ac3c-cbc155a7af82","name":"Step 17: If list_ids = true","type":"n8n-nodes-base.if","position":[2192,704],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"5995af10-bfe3-4ea0-ac6a-6e218bfa36da","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.islist_ids }}","rightValue":""}]}},"typeVersion":2.2},{"id":"c0df8b49-2354-4ef0-8985-451d56b733af","name":"Step 18: Update email in Mailing List Contacts","type":"n8n-nodes-base.httpRequest","position":[2400,704],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mailing_contact_web_save }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 11,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mailing.contact\",\n    \"method\": \"web_save\",\n    \"args\": [\n      [\n        {{ $node['Step 17: If list_ids = true'].json.id }}\n      ],\n      {\n        \"subscription_ids\": [\n          [\n            0,\n            \"virtual_7\",\n            {\n              \"list_id\": {{ $node['Step 2: Set Variables'].json['020_Good_to_send'] }},\n              \"opt_out\": false,\n              \"opt_out_reason_id\": false\n            }\n          ]\n        ]\n      }\n    ],\n    \"kwargs\": {\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Saigon\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"params\": {\n          \"resId\": {{ $node['Step 17: If list_ids = true'].json.id }},\n          \"action\": 763,\n          \"actionStack\": [\n            {\n              \"action\": 763\n            },\n            {\n              \"resId\": {{ $node['Step 17: If list_ids = true'].json.id }},\n              \"action\": 763\n            }\n          ]\n        },\n        \"update_mailing_type\": \"manual\"\n      },\n      \"specification\": {\n        \"id\": {},\n        \"name\": {},\n        \"first_name\": {},\n        \"last_name\": {},\n        \"position_extra\": {},\n        \"email\": {},\n        \"is_blacklisted\": {},\n        \"title_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"company_name\": {},\n        \"country_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"state_name\": {},\n        \"create_date\": {},\n        \"message_bounce\": {},\n        \"industry_name\": {},\n        \"numberofemployees\": {},\n        \"company_related\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"linkedIn_URL\": {},\n        \"tag_ids\": {\n          \"fields\": {\n            \"display_name\": {},\n            \"color\": {}\n          }\n        },\n        \"subscription_ids\": {\n          \"fields\": {\n            \"id\": {},\n            \"list_id\": {\n              \"fields\": {\n                \"display_name\": {}\n              }\n            },\n            \"opt_out_datetime\": {},\n            \"opt_out\": {},\n            \"opt_out_reason_id\": {\n              \"fields\": {\n                \"display_name\": {}\n              }\n            },\n            \"create_date\": {}\n          },\n          \"limit\": 100,\n          \"order\": \"\"\n        },\n        \"display_name\": {}\n      }\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"50510a57-bdbb-46de-91cc-ab11833e9fec","name":"Step 19: Return all data from step 10.","type":"n8n-nodes-base.code","position":[2624,496],"parameters":{"jsCode":"const data = $items(\"Step 10: Merge the categorized mailing lists\");\nreturn data"},"executeOnce":true,"typeVersion":2},{"id":"5c7f9750-b12a-46ca-90be-592ed3b606c1","name":"Step 20: Split Out bounceEmails","type":"n8n-nodes-base.splitOut","position":[2816,496],"parameters":{"options":{},"fieldToSplitOut":"bounceEmails"},"retryOnFail":true,"typeVersion":1,"alwaysOutputData":true},{"id":"2819cfa6-6a12-4890-9f5b-57f8865055ca","name":"Step 21: Loop Over bounceEmails","type":"n8n-nodes-base.splitInBatches","position":[3024,496],"parameters":{"options":{}},"typeVersion":3},{"id":"1106af9f-ecd3-4cd8-9c69-2421b61c2258","name":"Step 22: Search email in Blacklisted Email Addresses","type":"n8n-nodes-base.httpRequest","position":[3024,688],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mail_blacklist_web_search_read }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 47,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mail.blacklist\",\n    \"method\": \"web_search_read\",\n    \"args\": [],\n    \"kwargs\": {\n      \"specification\": {\n        \"create_date\": {},\n        \"email\": {},\n        \"reason_type\": {},\n        \"id_contact_hubspot\": {},\n        \"opt_out_reason_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"create_uid\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"write_uid\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        }\n      },\n      \"offset\": 0,\n      \"order\": \"\",\n      \"limit\": 100,\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Bangkok\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"bin_size\": true,\n        \"current_company_id\": 1\n      },\n      \"count_limit\": 10001,\n      \"domain\": [\n        [\n          \"email\",\n          \"ilike\",\n          \"{{ $json.email }}\"\n        ]\n      ]\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"d9b26770-e5a6-49f1-bb74-1f1e399837e3","name":"Step 23: If number of records is not 0 = true","type":"n8n-nodes-base.if","position":[3232,688],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cc1372a4-cc7d-4ace-9a73-0055e6920e0c","operator":{"type":"number","operation":"notEquals"},"leftValue":"={{ $json.result.length }}","rightValue":"={{ 0 }}"}]}},"typeVersion":2.2},{"id":"f57626ff-2ced-42bc-8e16-0b845371fe1b","name":"Step 24.1\" Check if reason_type contains Bounced","type":"n8n-nodes-base.code","position":[3440,592],"parameters":{"jsCode":"const record = $input.all()?.[0]?.json?.result?.records?.[0] ?? {};\n\nreturn {\n  id: record.id,\n  isBounced: (record.reason_type || \"\").toLowerCase() === \"bounced\"\n};\n"},"typeVersion":2},{"id":"391adb70-caf3-4bc2-bb00-db5032c98ec5","name":"Step 24.2: Add new email in Blacklisted Email Addresses","type":"n8n-nodes-base.httpRequest","position":[3440,784],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mail_blacklist_web_save }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 65,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mail.blacklist\",\n    \"method\": \"web_save\",\n    \"args\": [\n      [],\n      {\n        \"email\": \"{{ $('Step 21: Loop Over bounceEmails').item.json.email }}\",\n        \"id_contact_hubspot\": false,\n        \"reason_type\": \"bounced\",\n        \"opt_out_reason_id\": false\n      }\n    ],\n    \"kwargs\": {\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Bangkok\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"params\": {\n          \"actionStack\": [\n            {\n              \"displayName\": \"Blacklisted Email Addresses\",\n              \"action\": 147,\n              \"view_type\": \"list\"\n            }\n          ],\n          \"action\": 147,\n          \"globalState\": {\n            \"searchModel\": \"{\\\"nextGroupId\\\":4,\\\"nextGroupNumber\\\":5,\\\"nextId\\\":4,\\\"query\\\":[],\\\"searchItems\\\":{\\\"1\\\":{\\\"type\\\":\\\"field\\\",\\\"fieldName\\\":\\\"email\\\",\\\"fieldType\\\":\\\"char\\\",\\\"description\\\":\\\"Email Address\\\",\\\"groupId\\\":1,\\\"id\\\":1},\\\"2\\\":{\\\"type\\\":\\\"filter\\\",\\\"domain\\\":\\\"[('active','=',False)]\\\",\\\"groupNumber\\\":2,\\\"name\\\":\\\"inactive\\\",\\\"description\\\":\\\"Archived\\\",\\\"groupId\\\":2,\\\"id\\\":2},\\\"3\\\":{\\\"type\\\":\\\"groupBy\\\",\\\"fieldName\\\":\\\"opt_out_reason_id\\\",\\\"fieldType\\\":\\\"many2one\\\",\\\"groupNumber\\\":4,\\\"name\\\":\\\"group_by_opt_out_reason_id\\\",\\\"description\\\":\\\"Reason\\\",\\\"groupId\\\":3,\\\"id\\\":3}},\\\"searchPanelInfo\\\":{\\\"className\\\":\\\"\\\",\\\"fold\\\":false,\\\"viewTypes\\\":[\\\"kanban\\\",\\\"list\\\"],\\\"loaded\\\":false,\\\"shouldReload\\\":true},\\\"sections\\\":[]}\"\n          }\n        }\n      },\n      \"specification\": {\n        \"email\": {},\n        \"id_contact_hubspot\": {},\n        \"reason_type\": {},\n        \"opt_out_reason_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"active\": {},\n        \"display_name\": {}\n      }\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"154d44eb-f19d-4357-9387-8e7904148f10","name":"Step 25: If list_ids = true","type":"n8n-nodes-base.if","position":[3648,688],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"5995af10-bfe3-4ea0-ac6a-6e218bfa36da","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.isBounced }}","rightValue":""}]}},"typeVersion":2.2},{"id":"a33c682d-5860-47f0-aaf8-3a0c4ca3fe85","name":"Step 26: Update Reason Type of email in Blacklisted Email Addresses","type":"n8n-nodes-base.httpRequest","position":[3856,688],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mail_blacklist_web_save }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 71,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mail.blacklist\",\n    \"method\": \"web_save\",\n    \"args\": [\n      [\n        {{ $node['Step 25: If list_ids = true'].json.id }}\n      ],\n      {\n        \"reason_type\": \"bounced\"\n      }\n    ],\n    \"kwargs\": {\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Bangkok\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"params\": {\n          \"actionStack\": [\n            {\n              \"displayName\": \"Blacklisted Email Addresses\",\n              \"action\": 147,\n              \"view_type\": \"list\"\n            }\n          ],\n          \"action\": 147,\n          \"globalState\": {\n            \"searchModel\": \"{\\\"nextGroupId\\\":4,\\\"nextGroupNumber\\\":5,\\\"nextId\\\":4,\\\"query\\\":[],\\\"searchItems\\\":{\\\"1\\\":{\\\"type\\\":\\\"field\\\",\\\"fieldName\\\":\\\"email\\\",\\\"fieldType\\\":\\\"char\\\",\\\"description\\\":\\\"Email Address\\\",\\\"groupId\\\":1,\\\"id\\\":1},\\\"2\\\":{\\\"type\\\":\\\"filter\\\",\\\"domain\\\":\\\"[('active','=',False)]\\\",\\\"groupNumber\\\":2,\\\"name\\\":\\\"inactive\\\",\\\"description\\\":\\\"Archived\\\",\\\"groupId\\\":2,\\\"id\\\":2},\\\"3\\\":{\\\"type\\\":\\\"groupBy\\\",\\\"fieldName\\\":\\\"opt_out_reason_id\\\",\\\"fieldType\\\":\\\"many2one\\\",\\\"groupNumber\\\":4,\\\"name\\\":\\\"group_by_opt_out_reason_id\\\",\\\"description\\\":\\\"Reason\\\",\\\"groupId\\\":3,\\\"id\\\":3}},\\\"searchPanelInfo\\\":{\\\"className\\\":\\\"\\\",\\\"fold\\\":false,\\\"viewTypes\\\":[\\\"kanban\\\",\\\"list\\\"],\\\"loaded\\\":false,\\\"shouldReload\\\":true},\\\"sections\\\":[]}\"\n          }\n        }\n      },\n      \"specification\": {\n        \"email\": {},\n        \"id_contact_hubspot\": {},\n        \"reason_type\": {},\n        \"opt_out_reason_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"active\": {},\n        \"display_name\": {}\n      }\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"f9675854-47ef-4550-bbe1-67f307212ebf","name":"Step 27: If has record bounceEmails","type":"n8n-nodes-base.if","position":[1328,1280],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"45a079bb-5e20-4741-9b20-0031799fe2b4","operator":{"type":"array","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json.bounceEmails }}","rightValue":""}]}},"typeVersion":2.2},{"id":"423d6ac0-5304-4db4-af1f-df7eaf952e5a","name":"Step 28: Split Out bounceEmails","type":"n8n-nodes-base.splitOut","position":[1552,1184],"parameters":{"options":{},"fieldToSplitOut":"bounceEmails"},"typeVersion":1},{"id":"9290cfbb-47af-4ec4-b9c3-b80c4ad75a52","name":"Step 29: Loop Over bounceEmails","type":"n8n-nodes-base.splitInBatches","position":[1792,1184],"parameters":{"options":{}},"typeVersion":3},{"id":"e6bd0479-de0d-4330-a781-9e7ceec6f2a5","name":"Step 30: Search email in Blacklisted Email Addresses","type":"n8n-nodes-base.httpRequest","position":[1792,1376],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mail_blacklist_web_search_read }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 47,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mail.blacklist\",\n    \"method\": \"web_search_read\",\n    \"args\": [],\n    \"kwargs\": {\n      \"specification\": {\n        \"create_date\": {},\n        \"email\": {},\n        \"reason_type\": {},\n        \"id_contact_hubspot\": {},\n        \"opt_out_reason_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"create_uid\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"write_uid\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        }\n      },\n      \"offset\": 0,\n      \"order\": \"\",\n      \"limit\": 100,\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Bangkok\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"bin_size\": true,\n        \"current_company_id\": 1\n      },\n      \"count_limit\": 10001,\n      \"domain\": [\n        [\n          \"email\",\n          \"ilike\",\n          \"{{ $json.email }}\"\n        ]\n      ]\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"8d452689-58a7-4e27-a513-aed4efa5bd3d","name":"Step 31: If number of records is not 0 = true","type":"n8n-nodes-base.if","position":[2000,1376],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cc1372a4-cc7d-4ace-9a73-0055e6920e0c","operator":{"type":"number","operation":"notEquals"},"leftValue":"={{ $json.result.length }}","rightValue":"={{ 0 }}"}]}},"typeVersion":2.2},{"id":"a5536923-dd58-4dc8-8de2-106b3fc12add","name":"Step 32.1: Check if reason_type contains Bounced","type":"n8n-nodes-base.code","position":[2224,1280],"parameters":{"jsCode":"const record = $input.all()?.[0]?.json?.result?.records?.[0] ?? {};\n\nreturn {\n  id: record.id,\n  isBounced: (record.reason_type || \"\").toLowerCase() === \"bounced\"\n};\n"},"typeVersion":2},{"id":"f7e15ab6-b89c-40fd-a204-9cd262844774","name":"Step 32.2: Add new email in Blacklisted Email Addresses","type":"n8n-nodes-base.httpRequest","position":[2224,1472],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mail_blacklist_web_save }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 65,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mail.blacklist\",\n    \"method\": \"web_save\",\n    \"args\": [\n      [],\n      {\n        \"email\": \"{{ $('Step 29: Loop Over bounceEmails').item.json.email }}\",\n        \"id_contact_hubspot\": false,\n        \"reason_type\": \"bounced\",\n        \"opt_out_reason_id\": false\n      }\n    ],\n    \"kwargs\": {\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Bangkok\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"params\": {\n          \"actionStack\": [\n            {\n              \"displayName\": \"Blacklisted Email Addresses\",\n              \"action\": 147,\n              \"view_type\": \"list\"\n            }\n          ],\n          \"action\": 147,\n          \"globalState\": {\n            \"searchModel\": \"{\\\"nextGroupId\\\":4,\\\"nextGroupNumber\\\":5,\\\"nextId\\\":4,\\\"query\\\":[],\\\"searchItems\\\":{\\\"1\\\":{\\\"type\\\":\\\"field\\\",\\\"fieldName\\\":\\\"email\\\",\\\"fieldType\\\":\\\"char\\\",\\\"description\\\":\\\"Email Address\\\",\\\"groupId\\\":1,\\\"id\\\":1},\\\"2\\\":{\\\"type\\\":\\\"filter\\\",\\\"domain\\\":\\\"[('active','=',False)]\\\",\\\"groupNumber\\\":2,\\\"name\\\":\\\"inactive\\\",\\\"description\\\":\\\"Archived\\\",\\\"groupId\\\":2,\\\"id\\\":2},\\\"3\\\":{\\\"type\\\":\\\"groupBy\\\",\\\"fieldName\\\":\\\"opt_out_reason_id\\\",\\\"fieldType\\\":\\\"many2one\\\",\\\"groupNumber\\\":4,\\\"name\\\":\\\"group_by_opt_out_reason_id\\\",\\\"description\\\":\\\"Reason\\\",\\\"groupId\\\":3,\\\"id\\\":3}},\\\"searchPanelInfo\\\":{\\\"className\\\":\\\"\\\",\\\"fold\\\":false,\\\"viewTypes\\\":[\\\"kanban\\\",\\\"list\\\"],\\\"loaded\\\":false,\\\"shouldReload\\\":true},\\\"sections\\\":[]}\"\n          }\n        }\n      },\n      \"specification\": {\n        \"email\": {},\n        \"id_contact_hubspot\": {},\n        \"reason_type\": {},\n        \"opt_out_reason_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"active\": {},\n        \"display_name\": {}\n      }\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"cd6e113f-9f2b-44d3-966a-b7158eefd37f","name":"Step 33: If list_ids = true","type":"n8n-nodes-base.if","position":[2448,1376],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"5995af10-bfe3-4ea0-ac6a-6e218bfa36da","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ $json.isBounced }}","rightValue":""}]}},"typeVersion":2.2},{"id":"599b271f-a57d-487e-a5f3-2408f0045556","name":"Step 34: Update Reason Type of email in Blacklisted Email Addresses","type":"n8n-nodes-base.httpRequest","position":[2672,1376],"parameters":{"url":"={{ $node['Step 2: Set Variables'].json.mail_blacklist_web_save }}","method":"POST","options":{},"jsonBody":"={\n  \"id\": 71,\n  \"jsonrpc\": \"2.0\",\n  \"method\": \"call\",\n  \"params\": {\n    \"model\": \"mail.blacklist\",\n    \"method\": \"web_save\",\n    \"args\": [\n      [\n        {{ $node['Step 33: If list_ids = true'].json.id }}\n      ],\n      {\n        \"reason_type\": \"bounced\"\n      }\n    ],\n    \"kwargs\": {\n      \"context\": {\n        \"lang\": \"en_US\",\n        \"tz\": \"Asia/Bangkok\",\n        \"allowed_company_ids\": [\n          1\n        ],\n        \"params\": {\n          \"actionStack\": [\n            {\n              \"displayName\": \"Blacklisted Email Addresses\",\n              \"action\": 147,\n              \"view_type\": \"list\"\n            }\n          ],\n          \"action\": 147,\n          \"globalState\": {\n            \"searchModel\": \"{\\\"nextGroupId\\\":4,\\\"nextGroupNumber\\\":5,\\\"nextId\\\":4,\\\"query\\\":[],\\\"searchItems\\\":{\\\"1\\\":{\\\"type\\\":\\\"field\\\",\\\"fieldName\\\":\\\"email\\\",\\\"fieldType\\\":\\\"char\\\",\\\"description\\\":\\\"Email Address\\\",\\\"groupId\\\":1,\\\"id\\\":1},\\\"2\\\":{\\\"type\\\":\\\"filter\\\",\\\"domain\\\":\\\"[('active','=',False)]\\\",\\\"groupNumber\\\":2,\\\"name\\\":\\\"inactive\\\",\\\"description\\\":\\\"Archived\\\",\\\"groupId\\\":2,\\\"id\\\":2},\\\"3\\\":{\\\"type\\\":\\\"groupBy\\\",\\\"fieldName\\\":\\\"opt_out_reason_id\\\",\\\"fieldType\\\":\\\"many2one\\\",\\\"groupNumber\\\":4,\\\"name\\\":\\\"group_by_opt_out_reason_id\\\",\\\"description\\\":\\\"Reason\\\",\\\"groupId\\\":3,\\\"id\\\":3}},\\\"searchPanelInfo\\\":{\\\"className\\\":\\\"\\\",\\\"fold\\\":false,\\\"viewTypes\\\":[\\\"kanban\\\",\\\"list\\\"],\\\"loaded\\\":false,\\\"shouldReload\\\":true},\\\"sections\\\":[]}\"\n          }\n        }\n      },\n      \"specification\": {\n        \"email\": {},\n        \"id_contact_hubspot\": {},\n        \"reason_type\": {},\n        \"opt_out_reason_id\": {\n          \"fields\": {\n            \"display_name\": {}\n          }\n        },\n        \"active\": {},\n        \"display_name\": {}\n      }\n    }\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth"},"credentials":{"httpHeaderAuth":{"id":"iyhC2yjoixE21jDD","name":"API KEY Odoo Test"}},"executeOnce":true,"retryOnFail":true,"typeVersion":4.2,"alwaysOutputData":false},{"id":"88e9774e-2ad8-420e-b9e8-ddea50d6b1f8","name":"End1","type":"n8n-nodes-base.noOp","position":[1552,1408],"parameters":{},"typeVersion":1},{"id":"f5c38d97-58ea-415b-b0cc-8017e90a2fae","name":"End2","type":"n8n-nodes-base.noOp","position":[2000,1184],"parameters":{},"typeVersion":1},{"id":"02dfebf5-61a0-4e98-b294-a6c894d69350","name":"End3","type":"n8n-nodes-base.noOp","position":[3232,496],"parameters":{},"typeVersion":1},{"id":"b3f1daea-35fe-46ce-8f3d-ebd85c94596f","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[560,592],"parameters":{"color":5,"width":688,"height":592,"content":"## 2. Loop Over the list of emails sent 10 days ago.\n- We can customize the number of days in \"Step 2: Set Variables\" using the days_ago field.\n- Each iteration checks if anyone has responded to the sent emails. After obtaining the results, they are categorized into lists: deliverableEmails, repliedEmails, bounceEmails, autoReplies, and noResponse.\n- After each iteration, the data is merged into the lists above."},"typeVersion":1},{"id":"eb3c1e20-dbf9-4eec-9531-e688137724d9","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[-1616,144],"parameters":{"width":720,"height":1744,"content":"# Email Contacts Sync from Sent Mailbox to Odoo\nThis workflow automatically extracts recipient email addresses from previously sent emails, validates and cleans the data, and synchronizes only deliverable contacts into the internal Odoo Mailing List. It also monitors replies and bounce signals to support follow-up and engagement tracking.\n## 📌Who is this for?\n- Marketing team (Email campaigns)\n- CRM / Odoo administrators\n- Sales team (follow-up & customer engagement)\n- Operations / Automation engineers (n8n workflows)\n\n## 📌The problem\n- Customer emails are scattered across sent mail history instead of a centralized list.\n- Manually copying recipients into Odoo is slow and error-prone.\n- Sent emails may include invalid or bounced addresses.\n- Duplicate contacts appear frequently.\n- Hard to know which recipients have replied or not for follow-up.\n\n\nThis leads to:\n- messy contact database\n- high bounce rate\n- missed follow-ups\n- inefficient manual work\n\n## 📌How it works\n- The system calculates the target date and queries the Gmail API to retrieve emails sent within the last X days.\n- For each sent email:\n         - Extract recipients from the To/Cc fields\n         - Normalize data (trim, lowercase, remove duplicates)\n         - Check the email thread to detect replies or bounce/system responses\n\n- Each recipient is then classified into one of the following lists:\n         - deliverableEmails\n         - repliedEmails\n         - bounceEmails\n         - autoReplies\n         - noResponse\n\n- Push the list of deliverable emails to the internal Odoo system as Mailing List Contacts.\n- Add emails from the bounce list to Blacklisted Email Addresses in Odoo to prevent future sending.\n- (Optional) Log all processing results into Google Sheets for tracking and auditing.\n\n## 📌Quick setup\nRequired information:\n- N8n Version 2.4.6\n- Gmail OAuth2 API\n- Odoo API-KEY\n\n\nGoogle Sheets will be used to log all notified events.\n\n## 📌Results\n- Automatically build contact list from real sent emails\n- No manual data entry\n- Only valid emails stored in Odoo\n- Reduced bounce rate\n- No duplicates\n- Easy follow-up tracking\n- Better CRM hygiene and campaign performance\n\n## 📌Take it further\n- Auto follow-up if no reply after X days\n- Auto-remove hard bounces\n- Engagement scoring\n- Reply analytics dashboard\n- Sync with Loyalty/CRM systems\n- Scheduled daily sync\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":"679b5a96-57fa-49b6-96d4-d37111a86b14","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-848,672],"parameters":{"color":5,"width":1392,"height":512,"content":"## 1. Set Variables and Get datetime\n- Set Variables and Get datetime\n- Get the list of emails sent 10 days ago.\n- In Step 6, Split Out is used to split the \"messages\" array into multiple individual items."},"typeVersion":1},{"id":"5a17590c-ead7-4b8c-95af-cf820e2b0b1d","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[1264,352],"parameters":{"color":5,"width":1312,"height":640,"content":"## 3. Push the list of deliverable emails to the internal Odoo system.\n- For each email in the deliverable emails list, we check if it exists in the internal Odoo system.\n- If not, create a new contact and tag it as \"020.Good-to-send\".\n- If yes, ensure it is assigned to \"020.Good-to-send\" and update when needed."},"typeVersion":1},{"id":"a187d542-9aa6-402e-a53c-cdd444cd9ff3","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[2592,352],"parameters":{"color":5,"width":1440,"height":640,"content":"## 4. Add emails from the bounce email list to the \"Blacklisted Email Addresses\" in the internal Odoo system.\n- For each email in the bounce email list, we check if it exists in the internal Odoo system.\n- If not, create a new contact in the \"Blacklisted Email Addresses\" and tag it as \"bounced\".\n- If yes, ensure it is assigned to \"bounced\" and update when needed."},"typeVersion":1},{"id":"9ccf3eee-9ab8-4987-875d-780694dc675c","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1264,1008],"parameters":{"color":5,"width":1584,"height":656,"content":"## 5. Same.....Add emails from the bounce email list to the \"Blacklisted Email Addresses\" in the internal Odoo system.\n- For each email in the bounce email list, we check if it exists in the internal Odoo system.\n- If not, create a new contact in the \"Blacklisted Email Addresses\" and tag it as \"bounced\".\n- If yes, ensure it is assigned to \"bounced\" and update when needed."},"typeVersion":1},{"id":"2a5e0291-4bdb-4d42-b2be-bb90c21e5783","name":"Step 11: If has record deliverableEmails","type":"n8n-nodes-base.if","position":[1072,784],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"45a079bb-5e20-4741-9b20-0031799fe2b4","operator":{"type":"array","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json.deliverableEmails }}","rightValue":""}]}},"typeVersion":2.2},{"id":"aba0d981-46b9-4aa6-ac40-ff7580964570","name":"Step 12: Split Out deliverableEmails list","type":"n8n-nodes-base.splitOut","position":[1328,640],"parameters":{"options":{},"fieldToSplitOut":"deliverableEmails"},"typeVersion":1},{"id":"e75870af-bc4a-4dce-b1f4-e9d41d71c549","name":"Step 13: Loop Over deliverableEmails","type":"n8n-nodes-base.splitInBatches","position":[1584,512],"parameters":{"options":{}},"typeVersion":3}],"active":false,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"ef08c148-3b32-42f5-a7fd-96043e5bc39f","connections":{"Step 2: Set Variables":{"main":[[{"node":"Step 3: Get date time","type":"main","index":0}]]},"Step 3: Get date time":{"main":[[{"node":"Step 4:Get the list of emails sent 10 days ago.","type":"main","index":0}]]},"Step 17: If list_ids = true":{"main":[[{"node":"Step 13: Loop Over deliverableEmails","type":"main","index":0}],[{"node":"Step 18: Update email in Mailing List Contacts","type":"main","index":0}]]},"Step 25: If list_ids = true":{"main":[[{"node":"Step 21: Loop Over bounceEmails","type":"main","index":0}],[{"node":"Step 26: Update Reason Type of email in Blacklisted Email Addresses","type":"main","index":0}]]},"Step 33: If list_ids = true":{"main":[[{"node":"Step 29: Loop Over bounceEmails","type":"main","index":0}],[{"node":"Step 34: Update Reason Type of email in Blacklisted Email Addresses","type":"main","index":0}]]},"Step 7: Loop Over email sent":{"main":[[{"node":"Step 10: Merge the categorized mailing lists","type":"main","index":0}],[{"node":"Step 8: Get email information about thread_id","type":"main","index":0}]]},"Step 6: Split Out emails sent":{"main":[[{"node":"Step 7: Loop Over email sent","type":"main","index":0}]]},"Step 20: Split Out bounceEmails":{"main":[[{"node":"Step 21: Loop Over bounceEmails","type":"main","index":0}]]},"Step 21: Loop Over bounceEmails":{"main":[[{"node":"End3","type":"main","index":0}],[{"node":"Step 22: Search email in Blacklisted Email Addresses","type":"main","index":0}]]},"Step 28: Split Out bounceEmails":{"main":[[{"node":"Step 29: Loop Over bounceEmails","type":"main","index":0}]]},"Step 29: Loop Over bounceEmails":{"main":[[{"node":"End2","type":"main","index":0}],[{"node":"Step 30: Search email in Blacklisted Email Addresses","type":"main","index":0}]]},"Step 27: If has record bounceEmails":{"main":[[{"node":"Step 28: Split Out bounceEmails","type":"main","index":0}],[{"node":"End1","type":"main","index":0}]]},"Step 13: Loop Over deliverableEmails":{"main":[[{"node":"Step 19: Return all data from step 10.","type":"main","index":0}],[{"node":"Step 14: Search email in Mailing List Contacts","type":"main","index":0}]]},"Step 19: Return all data from step 10.":{"main":[[{"node":"Step 20: Split Out bounceEmails","type":"main","index":0}]]},"Step 11: If has record deliverableEmails":{"main":[[{"node":"Step 12: Split Out deliverableEmails list","type":"main","index":0}],[{"node":"Step 27: If has record bounceEmails","type":"main","index":0}]]},"Step 12: Split Out deliverableEmails list":{"main":[[{"node":"Step 13: Loop Over deliverableEmails","type":"main","index":0}]]},"Step 1: Schedule Trigger every day at 7 AM":{"main":[[{"node":"Step 2: Set Variables","type":"main","index":0}]]},"Step 9: Handling mail sorting from headers":{"main":[[{"node":"Step 7: Loop Over email sent","type":"main","index":0}]]},"Step 10: Merge the categorized mailing lists":{"main":[[{"node":"Step 11: If has record deliverableEmails","type":"main","index":0}]]},"Step 15: If number of records is not 0 = true":{"main":[[{"node":"Step 16.1\" Check if list_ids contains 020.Good-to-send","type":"main","index":0}],[{"node":"Step 16.2: Add new email in Mailing List Contacts","type":"main","index":0}]]},"Step 23: If number of records is not 0 = true":{"main":[[{"node":"Step 24.1\" Check if reason_type contains Bounced","type":"main","index":0}],[{"node":"Step 24.2: Add new email in Blacklisted Email Addresses","type":"main","index":0}]]},"Step 31: If number of records is not 0 = true":{"main":[[{"node":"Step 32.1: Check if reason_type contains Bounced","type":"main","index":0}],[{"node":"Step 32.2: Add new email in Blacklisted Email Addresses","type":"main","index":0}]]},"Step 8: Get email information about thread_id":{"main":[[{"node":"Step 9: Handling mail sorting from headers","type":"main","index":0}]]},"Step 14: Search email in Mailing List Contacts":{"main":[[{"node":"Step 15: If number of records is not 0 = true","type":"main","index":0}]]},"Step 18: Update email in Mailing List Contacts":{"main":[[{"node":"Step 13: Loop Over deliverableEmails","type":"main","index":0}]]},"Step 4:Get the list of emails sent 10 days ago.":{"main":[[{"node":"Step 5: If resultSizeEstimate has a record ==> true","type":"main","index":0}]]},"Step 24.1\" Check if reason_type contains Bounced":{"main":[[{"node":"Step 25: If list_ids = true","type":"main","index":0}]]},"Step 32.1: Check if reason_type contains Bounced":{"main":[[{"node":"Step 33: If list_ids = true","type":"main","index":0}]]},"Step 16.2: Add new email in Mailing List Contacts":{"main":[[{"node":"Step 13: Loop Over deliverableEmails","type":"main","index":0}]]},"Step 5: If resultSizeEstimate has a record ==> true":{"main":[[{"node":"Step 6: Split Out emails sent","type":"main","index":0}],[{"node":"End","type":"main","index":0}]]},"Step 22: Search email in Blacklisted Email Addresses":{"main":[[{"node":"Step 23: If number of records is not 0 = true","type":"main","index":0}]]},"Step 30: Search email in Blacklisted Email Addresses":{"main":[[{"node":"Step 31: If number of records is not 0 = true","type":"main","index":0}]]},"Step 16.1\" Check if list_ids contains 020.Good-to-send":{"main":[[{"node":"Step 17: If list_ids = true","type":"main","index":0}]]},"Step 24.2: Add new email in Blacklisted Email Addresses":{"main":[[{"node":"Step 21: Loop Over bounceEmails","type":"main","index":0}]]},"Step 32.2: Add new email in Blacklisted Email Addresses":{"main":[[{"node":"Step 29: Loop Over bounceEmails","type":"main","index":0}]]},"Step 26: Update Reason Type of email in Blacklisted Email Addresses":{"main":[[{"node":"Step 21: Loop Over bounceEmails","type":"main","index":0}]]},"Step 34: Update Reason Type of email in Blacklisted Email Addresses":{"main":[[{"node":"Step 29: Loop Over bounceEmails","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":47,"nodeTypes":{"n8n-nodes-base.if":{"count":9},"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":7},"n8n-nodes-base.noOp":{"count":4},"n8n-nodes-base.splitOut":{"count":4},"n8n-nodes-base.stickyNote":{"count":6},"n8n-nodes-base.httpRequest":{"count":11},"n8n-nodes-base.splitInBatches":{"count":4},"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":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":26,"icon":"fa:arrow-right","name":"n8n-nodes-base.noOp","codex":{"data":{"alias":["nothing"],"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/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/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/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/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.noop/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"organization\"]","defaults":{"name":"No Operation, do nothing","color":"#b0b0b0"},"iconData":{"icon":"arrow-right","type":"icon"},"displayName":"No Operation, do nothing","typeVersion":1,"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":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":1239,"icon":"file:splitOut.svg","name":"n8n-nodes-base.splitOut","codex":{"data":{"alias":["Split","Nested","Transform","Array","List","Item"],"details":"","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitout/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Split Out"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJub25lIj48ZyBmaWxsPSIjOUI2REQ1IiBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTQ4MCAxNDhjMC02LjYyNy01LjM3My0xMi0xMi0xMkgzMjJjLTYuNjI3IDAtMTIgNS4zNzMtMTIgMTJ2MjRjMCA2LjYyNyA1LjM3MyAxMiAxMiAxMmgxNDZjNi42MjcgMCAxMi01LjM3MyAxMi0xMnptMCA5NmMwLTYuNjI3LTUuMzczLTEyLTEyLTEySDMyMmMtNi42MjcgMC0xMiA1LjM3My0xMiAxMnYyNGMwIDYuNjI3IDUuMzczIDEyIDEyIDEyaDE0NmM2LjYyNyAwIDEyLTUuMzczIDEyLTEyem0wIDk2YzAtNi42MjctNS4zNzMtMTItMTItMTJIMzIyYy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjI0YzAgNi42MjcgNS4zNzMgMTIgMTIgMTJoMTQ2YzYuNjI3IDAgMTItNS4zNzMgMTItMTJ6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48cGF0aCBkPSJNNDM4IDc2YzAgNi42MjctNS4zNzMgMTItMTIgMTJIMzA5Ljc4M2MtMTcuNjczIDAtMzIgMTQuMzI3LTMyIDMydjU2YzAgMjYuOTc4LTEwLjI3MiA1MS41NTctMjcuMTE5IDcwLjAzOS01LjA1NSA1LjU0NS01LjA1NSAxNC4zNzcgMCAxOS45MjIgMTYuODQ3IDE4LjQ4MiAyNy4xMTkgNDMuMDYxIDI3LjExOSA3MC4wMzl2NTZjMCAxNy42NzMgMTQuMzI3IDMyIDMyIDMySDQyNmM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJIMzA5Ljc4M2MtNDQuMTgzIDAtODAtMzUuODE3LTgwLTgwdi01NmMwLTMwLjkyOC0yNS4wNzItNTYtNTYtNTZhNS43ODMgNS43ODMgMCAwIDEtNS43ODMtNS43ODN2LTM2LjQzNGE1Ljc4MyA1Ljc4MyAwIDAgMSA1Ljc4My01Ljc4M2MzMC45MjggMCA1Ni0yNS4wNzIgNTYtNTZ2LTU2YzAtNDQuMTgzIDM1LjgxNy04MCA4MC04MEg0MjZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xMzYgMjQ0YzAtNi42MjctNS4zNzMtMTItMTItMTJIMTJjLTYuNjI3IDAtMTIgNS4zNzMtMTIgMTJ2MjRjMCA2LjYyNyA1LjM3MyAxMiAxMiAxMmgxMTJjNi42MjcgMCAxMi01LjM3MyAxMi0xMnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjwvZz48ZGVmcz48Y2xpcFBhdGggaWQ9ImEiPjxwYXRoIGZpbGw9IiNmZmYiIGQ9Ik01MTIgMEgwdjUxMmg1MTJ6Ii8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+"},"displayName":"Split Out","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":39,"name":"CRM"},{"id":49,"name":"AI Summarization"}],"image":[]}}