{"workflow":{"id":12750,"name":"Warm up Gmail inboxes with OpenAI GPT-4o-mini and Data Tables","views":239,"recentViews":0,"totalViews":239,"createdAt":"2026-01-16T07:07:06.461Z","description":"![Screenshot 20260122 185537.png](fileId:4073)\n\nAutomatically warm up multiple Gmail inboxes with human-like email conversations, smart scheduling, and auto read/reply, powered by n8n Data Tables.\n\nCold emails going to spam?\nThat’s usually an inbox reputation problem, not your copy.\n\nThis n8n workflow is a complete Email Warmup Engine that helps you warm up Gmail inboxes automatically by sending natural, human-like conversations between your inboxes, spacing them out across the day, and marking messages as read to simulate real inbox activity.\n\nIt includes:\n-  AI-generated natural conversations (2–3 messages)\n- Multi-inbox warmup (sender ↔ receiver rotation)\n- Smart daily volume ramp-up (safe warmup growth)\n- Random send scheduling inside a time window\n- Sends + replies like a real human thread\n- Marks warmup emails as read automatically\n- Powered entirely by n8n Data Tables (no external DB)\n\nPerfect for founders, agencies, SDRs, and anyone running outbound.\n\n**What This Workflow Does (Bullets)**\n\n- Generates warmup conversations using OpenAI\n- Stores conversations in a Data Table\n- Creates a warmup queue for each inbox daily\n- Assigns random scheduled timestamps (natural behavior)\n- Sends and replies via Gmail\n- Updates queue status as messages are sent\n- Marks warmup emails as read automatically\n\nUse Cases\n\n1. Warm up new inboxes before cold outreach\n2. Maintain inbox health for outbound operations\n3. Rotate and warm multiple sender accounts\n4. Avoid paying per-inbox warmup SaaS fees\n\n**Requirements**\n\n- n8n (Cloud or Self-hosted)\n- Gmail accounts (2+ recommended)\n- Gmail OAuth2 credentials (one per inbox)\n- OpenAI API key\n- n8n Data Tables enabled\n- Data Tables Used\n\nThis template uses 3 n8n Data Tables:\n\n1. **cold_email_accounts**\nStores warmup inboxes + credential IDs\n\n2. **warmup_conversations**\nStores AI-generated conversations\n\n3. **warmup_queue**\nStores scheduled warmup messages + status\n\n**Setup Instructions (Step-by-step)**\n\n1. Import the Workflow\n\nImport the template JSON into n8n\n\n2. Create Data Tables\n\nCreate these Data Tables:\n- cold_email_accounts\n- warmup_conversations\n- warmup_queue\n\n3. Add Inbox Accounts\n\nAdd at least 2 inboxes into cold_email_accounts with:\n\nemail\ncred_id (Gmail OAuth credential ID)\nwarmup_daily_limit (ex: 5)\n\n4. Connect Credentials\n\nCreate Gmail OAuth2 credentials in n8n for each inbox\nConnect OpenAI credentials to the “Message a model” node\n\n5. Enable Schedule Triggers\n\nEnable all Schedule Trigger nodes so it runs automatically:\n\nconversation generation\nqueue generation\nsender engine\nmarking read engine\nCustomization\n\nYou can tweak:\n\n**Daily warmup growth**\n\nwarmup_daily_limit in cold_email_accounts table per inbox\n\n**Time window**\n\nschedule messages between fixed hours (natural sending)\n\n**Conversation style**\n\nedit the OpenAI system prompt to match your preferred tone\n\n**Notes / Best Practices**\n\n- Keep warmup volume safe (20–40/day max per inbox)\n- Use 2+ inboxes to avoid self-sending\n- Don’t mix cold outreach + warmup in the same workflow\n\n```\n","workflow":{"meta":{"instanceId":"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69"},"nodes":[{"id":"ea803d08-d03d-4bae-b1a1-00845dedc9d0","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-880,-496],"parameters":{"color":7,"width":2224,"height":400,"content":"## 1) Generate warmup conversations (daily)\nCreates friendly conversation JSON and saves it to `warmup_conversations`.\n"},"typeVersion":1},{"id":"1eb066c2-6f60-478a-864c-e4fe3562c150","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-896,-16],"parameters":{"color":7,"width":2240,"height":672,"content":"## 2) Build warmup queue (daily)\nPairs inboxes + assigns messages into `warmup_queue`.\n"},"typeVersion":1},{"id":"7e835764-6937-44aa-ade3-56aceed17c8e","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-928,720],"parameters":{"color":7,"width":3168,"height":736,"content":"## 3) Send warmup messages (hourly)\nAssigns random send times and sends/replies via Gmail.\n"},"typeVersion":1},{"id":"a5067261-6354-434f-b42b-341502ed37fc","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[1376,-496],"parameters":{"color":7,"width":1072,"height":1152,"content":"## 4) Mark warmup emails as read (hourly)\nRemoves UNREAD and updates `marked_read` in queue.\n"},"typeVersion":1},{"id":"4e97ce7d-6c01-41b0-9717-62aff4240536","name":"generate warmup conversations","type":"n8n-nodes-base.scheduleTrigger","position":[-688,-320],"parameters":{"rule":{"interval":[{"triggerAtHour":6}]}},"typeVersion":1.2},{"id":"a36062d6-2e20-4d39-b92c-fdcd7f731de8","name":"Get warmup accounts (cold_email_accounts)","type":"n8n-nodes-base.dataTable","position":[-400,-320],"parameters":{"operation":"get","returnAll":true,"dataTableId":{"__rl":true,"mode":"list","value":"mqNBBTqxgRm7R9v0","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/mqNBBTqxgRm7R9v0","cachedResultName":"cold_email_accounts"}},"typeVersion":1.1},{"id":"8e24409c-2c25-42f8-af46-993b196f30de","name":"Build conversation generation loop","type":"n8n-nodes-base.code","position":[-144,-320],"parameters":{"jsCode":"let daily_limit = $input.first().json.warmup_daily_limit\n\nlet simArray = []\nfor (let i = 0; i < daily_limit; i++) {\n  simArray.push({\n    index: i+1\n  })\n}\n\nreturn simArray"},"typeVersion":2},{"id":"52c5312c-215c-4e20-8b83-3323f44187d4","name":"Loop: generate conversations","type":"n8n-nodes-base.splitInBatches","position":[176,-320],"parameters":{"options":{}},"typeVersion":3},{"id":"3ce03cdc-2f71-4aa3-a5bf-b098f5934c71","name":"Generate conversations (OpenAI)","type":"@n8n/n8n-nodes-langchain.openAi","position":[400,-400],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o-mini","cachedResultName":"GPT-4O-MINI"},"options":{"textFormat":{"textOptions":{"type":"json_object"}}},"responses":{"values":[{"role":"system","content":"Generate a natural, friendly email conversation between two people.\n\nRequirements:\n- Include 2 to 3 messages total always.\n- Alternate between Person A and Person B.\n- Each message MUST be self-contained as a standalone email.\n- Do NOT reference previous messages.\n- No signatures, no links, no phone numbers.\n- Tone: casual, friendly, human.\n- Add light variety like greetings, emojis, small talk, scheduling questions, etc.\n- No sales content.\n- Keep it neutral.\n- Do NOT include spammy words (“free”, “buy”, “discount”, etc.)\n- Output ONLY as JSON formatlike:\n\n{\nconversations: [\n  { \"sender\": \"A\", \"subject\": \"Hello!\", \"body\": \"Message text...\" },\n  { \"sender\": \"B\", \"subject\": \"Re: Hello!\", \"body\": \"Message text...\" },\n  ...\n]\n}\n"},{"role":"system","content":"[\n  {\n    \"sender\": \"A\",\n    \"subject\": \"Quick check-in\",\n    \"body\": \"Hi! Just wanted to say hello and see how things are going on your side.\"\n  },\n  {\n    \"sender\": \"B\",\n    \"subject\": \"Re: Quick check-in\",\n    \"body\": \"Hey! Things are pretty smooth so far. Just juggling some small tasks today.\"\n  }\n]\n"},{"role":"system","content":"[\n  {\n    \"sender\": \"A\",\n    \"subject\": \"Hello!\",\n    \"body\": \"Hey! Just touching base hope you're doing well today.\"\n  },\n  {\n    \"sender\": \"B\",\n    \"subject\": \"Re: Hello!\",\n    \"body\": \"Hi! Doing alright. Was just organizing my week. How about you?\"\n  }\n]\n"},{"role":"system","content":"[\n  {\n    \"sender\": \"A\",\n    \"subject\": \"Hey\",\n    \"body\": \"Morning! Random thought do you drink coffee or tea? I'm trying to switch 🤣\"\n  },\n  {\n    \"sender\": \"B\",\n    \"subject\": \"Re: Hey\",\n    \"body\": \"Hahaha I’m team coffee all the way But I’ve been trying tea lately too.\"\n  }\n]\n"},{"role":"system","content":"[\n  {\n    \"sender\": \"A\",\n    \"subject\": \"Checking in\",\n    \"body\": \"Hi there, hope your day is going well so far.\"\n  },\n  {\n    \"sender\": \"B\",\n    \"subject\": \"Re: Checking in\",\n    \"body\": \"Hello! Everything is going okay here, just catching up on tasks. How about yourself?\"\n  },\n  {\n    \"sender\": \"A\",\n    \"subject\": \"Re: Checking in\",\n    \"body\": \"Pretty similar doing some small cleanups and planning out the rest of the week.\"\n  }\n]\n"}]},"builtInTools":{}},"credentials":{"openAiApi":{"id":"dvxXAgtqtujFdYkH","name":"OpenAi account"}},"typeVersion":2},{"id":"c5874af0-4e83-4919-a40a-eb251c429647","name":"Format conversations for Data Table","type":"n8n-nodes-base.code","position":[752,-400],"parameters":{"jsCode":"// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  let conversation = item.json.output[0].content[0].text.conversations\n  item.json.conversation_string = JSON.stringify(conversation);\n}\n\nreturn $input.all();"},"typeVersion":2},{"id":"03282eb8-d2bc-4845-b714-0ba005401d51","name":"Save conversations (warmup_conversations)","type":"n8n-nodes-base.dataTable","position":[976,-320],"parameters":{"columns":{"value":{"messages":"={{ $json.conversation_string }}"},"schema":[{"id":"messages","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"messages","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":["messages"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"dataTableId":{"__rl":true,"mode":"list","value":"zFEHqfRDGsYVDTxX","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/zFEHqfRDGsYVDTxX","cachedResultName":"warmup_conversations"}},"typeVersion":1},{"id":"7420f840-f366-42e3-b154-23af9c1f289d","name":"Daily trigger: build warmup queue","type":"n8n-nodes-base.scheduleTrigger","position":[-832,336],"parameters":{"rule":{"interval":[{"triggerAtHour":6,"triggerAtMinute":25}]}},"typeVersion":1.2},{"id":"cfb4dc7d-4428-4076-b4e1-6621bab61b91","name":"Get warmup accounts for queue","type":"n8n-nodes-base.dataTable","position":[-608,336],"parameters":{"limit":{},"operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"mqNBBTqxgRm7R9v0","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/mqNBBTqxgRm7R9v0","cachedResultName":"cold_email_accounts"}},"typeVersion":1},{"id":"a9001fc2-6e13-4349-8ad1-c34476eef65a","name":"Loop: build queue per inbox","type":"n8n-nodes-base.splitInBatches","position":[-384,336],"parameters":{"options":{}},"typeVersion":3},{"id":"4044866f-0468-440b-b9fd-ee22ab4afc0a","name":"Calculate daily warmup target","type":"n8n-nodes-base.code","position":[-160,336],"parameters":{"jsCode":"const base = 5;          // starting point\nconst max = 40;          // max warm-up per inbox\nconst growth = 2;        // +2 per day\n\nconst todayCount = Math.min(\n  $json.warmup_sent_today + growth,\n  max\n);\n\nreturn [{\n  json: {\n    ...$json,\n    warmup_target_today: todayCount\n  }\n}]\n"},"typeVersion":2},{"id":"28899f7f-ff7a-4f82-aba6-72047d5007c8","name":"Get recipient inboxes (excluding sender)","type":"n8n-nodes-base.dataTable","position":[64,432],"parameters":{"limit":{},"filters":{"conditions":[{"keyName":"email","keyValue":"={{ $json.email }}","condition":"neq"}]},"operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"mqNBBTqxgRm7R9v0","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/mqNBBTqxgRm7R9v0","cachedResultName":"cold_email_accounts"}},"typeVersion":1},{"id":"2f27a0a9-f33b-4538-bc4e-8fe89bae4118","name":"Pick random recipient inboxes","type":"n8n-nodes-base.code","position":[288,432],"parameters":{"jsCode":"const sender = $(\"Calculate daily warmup target\").all()[0].json.email;\nconst target = $(\"Calculate daily warmup target\").all()[0].json.warmup_target_today;\n\n// Incoming items from Data Tables (other inboxes)\nconst recipients = $(\"Get recipient inboxes (excluding sender)\").all().map(i => i.json);\n\n// Shuffle array\nfor (let i = recipients.length - 1; i > 0; i--) {\n  const j = Math.floor(Math.random() * (i + 1));\n  [recipients[i], recipients[j]] = [recipients[j], recipients[i]];\n}\n\n// Pick target count, or all if fewer\nconst selected = recipients.slice(0, target);\n\nreturn selected.map(r => ({\n  json: {\n    inboxA: sender,\n    inboxB: r.email,\n    target\n  }\n}));\n\n"},"typeVersion":2},{"id":"3e94e231-670d-49ea-98c7-1af579b2054b","name":"Get conversations from table","type":"n8n-nodes-base.dataTable","position":[64,240],"parameters":{"limit":"={{ $json.warmup_daily_limit }}","operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"zFEHqfRDGsYVDTxX","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/zFEHqfRDGsYVDTxX","cachedResultName":"warmup_conversations"}},"typeVersion":1},{"id":"41b5e014-f181-4547-9acb-74383662de41","name":"Parse conversation JSON","type":"n8n-nodes-base.code","position":[288,240],"parameters":{"jsCode":"let items = $input.all()\nlet allmessages = []\nfor (let i = 0; i < items.length; i++) {\n  const messages = JSON.parse(items[i].json.messages || \"[]\");\n  allmessages.push({\n    conversation_id: items[i].json.id,\n    message: messages\n  })\n}\n// return messages.map(m => ({ json: m }));\nreturn allmessages"},"typeVersion":2},{"id":"a8604c91-31d1-403f-bf05-2df5c1100ad1","name":"Merge recipients + conversations","type":"n8n-nodes-base.merge","position":[512,336],"parameters":{"mode":"combine","options":{},"combineBy":"combineByPosition"},"typeVersion":3.2},{"id":"574c087d-c6bf-4659-9b50-8961c8522512","name":"Loop: match conversations to recipients","type":"n8n-nodes-base.splitInBatches","position":[736,336],"parameters":{"options":{"reset":true},"batchSize":"={{ $json.target }}"},"typeVersion":3},{"id":"c1afc47c-18ea-48ca-a530-a9cd7542c739","name":"Split conversation into scheduled messages","type":"n8n-nodes-base.code","position":[960,416],"parameters":{"mode":"runOnceForEachItem","jsCode":"const message = $input.item.json.message;\nlet conversation_id = $input.item.json.conversation_id\nlet inboxA = $input.item.json.inboxA;\nlet inboxB = $input.item.json.inboxB;\n\nlet conversations = [];\nconst now = new Date();\n\nfor (let i = 0; i < message.length; i++) {\n\n  // sender / receiver\n  const isA = message[i].sender === \"A\";\n  const sender_inbox = isA ? inboxA : inboxB;\n  const receiver_inbox = isA ? inboxB : inboxA;\n\n  // Calculate scheduled_date = today + i days\n  const scheduledDateObj = new Date(now);\n  scheduledDateObj.setDate(now.getDate() + i);\n\n  const scheduledDate = scheduledDateObj.toISOString().split(\"T\")[0];\n\n  conversations.push({\n    sender_inbox,\n    receiver_inbox,\n    subject: message[i].subject,\n    body: message[i].body,\n    scheduled_date: scheduledDate,  // ONLY DATE, no time\n    scheduled_at: null,             // sender engine assigns actual time later\n    sent: false,\n    conversation_id,\n    conversation_index: i\n  });\n}\n\nreturn { conversation: conversations };\n"},"typeVersion":2},{"id":"24442941-657d-4dd2-ba0d-d2bc3489deb6","name":"Flatten message list","type":"n8n-nodes-base.code","position":[-160,48],"parameters":{"jsCode":"let conversationsArray = $input.all()\nlet conversations = []\n\nfor (let i = 0; i < conversationsArray.length; i++) {\n  for (let j = 0; j < conversationsArray[i].json.conversation.length; j++) {\n  conversations.push(conversationsArray[i].json.conversation[j])\n  }\n}\n\nreturn conversations;"},"typeVersion":2},{"id":"2ccfc8d7-35a1-45c9-9bad-1b5493460a66","name":"Insert messages into warmup_queue","type":"n8n-nodes-base.dataTable","position":[64,48],"parameters":{"columns":{"value":{"body":"={{ $json.body }}","sent":"={{ $json.sent }}","subject":"={{ $json.subject }}","marked_read":false,"sender_inbox":"={{ $json.sender_inbox }}","receiver_inbox":"={{ $json.receiver_inbox }}","scheduled_date":"={{ $json.scheduled_date }}","conversation_id":"={{ $json.conversation_id }}","conversation_index":"={{ $json.conversation_index }}"},"schema":[{"id":"sender_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sender_inbox","defaultMatch":false},{"id":"receiver_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_inbox","defaultMatch":false},{"id":"subject","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"subject","defaultMatch":false},{"id":"body","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"body","defaultMatch":false},{"id":"scheduled_date","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_date","defaultMatch":false},{"id":"scheduled_at","type":"dateTime","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_at","defaultMatch":false},{"id":"sent","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sent","defaultMatch":false},{"id":"message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"message_id","defaultMatch":false},{"id":"thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"thread_id","defaultMatch":false},{"id":"receiver_message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_message_id","defaultMatch":false},{"id":"receiver_thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_thread_id","defaultMatch":false},{"id":"marked_read","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"marked_read","defaultMatch":false},{"id":"conversation_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_id","defaultMatch":false},{"id":"conversation_index","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_index","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1},{"id":"c833ce57-1ea1-4f95-b215-f346a42f0eb4","name":"Hourly trigger: send scheduled warmup emails","type":"n8n-nodes-base.scheduleTrigger","position":[-768,1024],"parameters":{"rule":{"interval":[{"field":"hours"}]}},"typeVersion":1.2},{"id":"808504b6-3b21-40e4-9fe3-a3c540680738","name":"Get today unsent warmups","type":"n8n-nodes-base.dataTable","position":[-560,1024],"parameters":{"limit":{},"filters":{"conditions":[{"keyName":"scheduled_date","keyValue":"={{ $now.format('yyyy-MM-dd') }}"},{"keyName":"sent","condition":"isFalse"}]},"matchType":"allConditions","operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1},{"id":"5c1d8c50-4b08-4d68-9119-2743836a747e","name":"Assign random send time (IST window)","type":"n8n-nodes-base.code","position":[-160,912],"parameters":{"jsCode":"const startHour = 8;   // daily window start\nconst endHour = 22;    // daily window end\n\nfunction createISTDate(hour, minute = 0) {\n  const now = new Date();\n  \n  // Convert today's date to IST\n  const ist = new Date(\n    now.getFullYear(),\n    now.getMonth(),\n    now.getDate(),\n    hour,\n    minute,\n    0,\n    0\n  );\n\n  // IST → UTC\n  const utc = new Date(ist.getTime() - (5.5 * 60 * 60 * 1000));\n  return utc;\n}\n\nfunction randomTimeInWindow(startHour, endHour) {\n  const now = new Date();\n  \n  const start = createISTDate(startHour);\n  const end = createISTDate(endHour);\n  \n  // Random time between start and end\n  const randomMs = start.getTime() + Math.random() * (end.getTime() - start.getTime());\n\n  return new Date(randomMs);\n}\n\n\n// These come from DB fetch via n8n\nlet warmups = $input.all();  \n\nlet updatedRows = [];\n\nfor (let item of warmups) {\n  let row = item.json;\n\n  // Assign a random timestamp ONLY if it's scheduled for today and not assigned yet\n  if (!row.scheduled_at) {\n    row.scheduled_at = randomTimeInWindow(startHour, endHour).toISOString();\n  }\n\n  updatedRows.push(row);\n}\n\nreturn updatedRows;\n"},"typeVersion":2},{"id":"5ec0eb3e-9a32-4330-99d4-72caddd3d9aa","name":"Update scheduled_at in queue","type":"n8n-nodes-base.dataTable","position":[32,912],"parameters":{"columns":{"value":{"sent":false,"marked_read":false,"scheduled_at":"={{ $json.scheduled_at }}"},"schema":[{"id":"sender_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sender_inbox","defaultMatch":false},{"id":"receiver_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_inbox","defaultMatch":false},{"id":"subject","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"subject","defaultMatch":false},{"id":"body","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"body","defaultMatch":false},{"id":"scheduled_date","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_date","defaultMatch":false},{"id":"scheduled_at","type":"dateTime","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_at","defaultMatch":false},{"id":"sent","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sent","defaultMatch":false},{"id":"message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"message_id","defaultMatch":false},{"id":"thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"thread_id","defaultMatch":false},{"id":"receiver_message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_message_id","defaultMatch":false},{"id":"receiver_thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_thread_id","defaultMatch":false},{"id":"marked_read","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"marked_read","defaultMatch":false},{"id":"conversation_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_id","defaultMatch":false},{"id":"conversation_index","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_index","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"filters":{"conditions":[{"keyValue":"={{ $json.id }}"}]},"options":{},"operation":"update","dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1},{"id":"d89a6fff-dd14-4dfc-939c-f327fb3021f2","name":"If scheduled_at is empty","type":"n8n-nodes-base.if","position":[-368,1024],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"4801ab32-3dde-4236-8c5e-16b8c574ae58","operator":{"type":"dateTime","operation":"empty","singleValue":true},"leftValue":"={{ $json.scheduled_at }}","rightValue":""}]}},"typeVersion":2.2},{"id":"80391bba-e8c0-438c-80b3-133959eda31e","name":"Filter messages due now","type":"n8n-nodes-base.code","position":[208,1056],"parameters":{"jsCode":"const now = new Date();\nlet due = [];\n\nfor (let item of $input.all()) {\n  const row = item.json;\n  if (row.scheduled_at && new Date(row.scheduled_at) <= now) {\n    due.push(row);\n  }\n}\n\nreturn due;\n"},"typeVersion":2},{"id":"be7d31d6-2ab9-47d0-be06-833715ea2a54","name":"Get accounts (for credentials)","type":"n8n-nodes-base.dataTable","position":[208,1216],"parameters":{"operation":"get","returnAll":true,"dataTableId":{"__rl":true,"mode":"list","value":"mqNBBTqxgRm7R9v0","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/mqNBBTqxgRm7R9v0","cachedResultName":"cold_email_accounts"}},"typeVersion":1},{"id":"b2d8d6b1-9568-482a-9875-9596f9ffdac1","name":"Merge queue with account credentials","type":"n8n-nodes-base.merge","position":[400,1072],"parameters":{"mode":"combine","options":{"clashHandling":{"values":{"resolveClash":"preferInput1"}}},"advanced":true,"mergeByFields":{"values":[{"field1":"sender_inbox","field2":"email"}]}},"typeVersion":3.2},{"id":"d133bd11-328d-49f7-a3da-d8ef3f599e90","name":"Loop: send warmup message","type":"n8n-nodes-base.splitInBatches","position":[592,1072],"parameters":{"options":{}},"typeVersion":3},{"id":"4ed85c55-ae2e-4c74-aecd-88be839f8b8d","name":"If first message in thread","type":"n8n-nodes-base.if","position":[832,1088],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"11280a4c-bb8c-424b-8531-1bc3435d52a2","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"={{ $json.conversation_index }}","rightValue":"0"}]}},"typeVersion":2.2},{"id":"2d0f3169-f438-4c23-b19e-eb423e62671a","name":"Send Gmail message (new thread)","type":"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX","position":[1136,992],"parameters":{"nodeJson":"={\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"sendTo\": \"={{ $json.receiver_inbox }}\",\n        \"subject\": \"={{ $json.subject }}\",\n        \"emailType\": \"text\",\n        \"message\": \"={{ $json.body }}\",\n        \"options\": {\n          \"appendAttribution\": false\n        }\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        1920,\n        2544\n      ],\n      \"id\": \"90be2479-0140-4ca1-b1fa-55d4339f48a8\",\n      \"name\": \"Send a message\",\n      \"webhookId\": \"98b6ca9f-c412-4aae-a114-9938a3ba94e5\",\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"mhyVQDjPrVLEOGCr\",\n          \"name\": \"jatin.k@get\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"Send a message\": {\n      \"main\": [\n        []\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69\"\n  }\n}","credentialsId":"={{ $json.cred_id }}"},"typeVersion":1},{"id":"610d87c3-dd31-4051-9f34-44c4cc81b483","name":"Get previous message (thread context)","type":"n8n-nodes-base.dataTable","position":[1040,1152],"parameters":{"filters":{"conditions":[{"keyValue":"={{ $json.id - 1 }}"}]},"matchType":"allConditions","operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1},{"id":"e8bb9300-ad97-40fe-9661-339f0bca742e","name":"Reply in existing Gmail thread","type":"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX","position":[1232,1152],"parameters":{"nodeJson":"={\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"resource\": \"thread\",\n        \"operation\": \"reply\",\n        \"threadId\": \"={{ $json.receiver_thread_id }}\",\n        \"messageId\": \"={{ $json.receiver_thread_id }}\",\n        \"message\": \"={{ $('If first message in thread').item.json.body }}\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        1920,\n        2736\n      ],\n      \"id\": \"d09a475e-785d-4311-b877-9fd665fbfa76\",\n      \"name\": \"Reply to a message\",\n      \"webhookId\": \"aeface07-8c1d-471c-84cb-c7b796a734f6\",\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"mhyVQDjPrVLEOGCr\",\n          \"name\": \"jatin.k@get\"\n        }\n      },\n      \"onError\": \"continueErrorOutput\"\n    }\n  ],\n  \"connections\": {\n    \"Reply to a message\": {\n      \"main\": [\n        [],\n        []\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69\"\n  }\n}","credentialsId":"={{ $('If first message in thread').item.json.cred_id }}"},"typeVersion":1},{"id":"193aaa95-df1f-4446-bae1-cdaf3fca7db9","name":"Label sent warmup email","type":"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX","position":[1472,1072],"parameters":{"nodeJson":"={\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"operation\": \"addLabels\",\n        \"messageId\": \"={{ $json.id }}\",\n        \"labelIds\": [\n          \"IMPORTANT\",\n          \"Label_1\"\n        ]\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        2144,\n        2640\n      ],\n      \"id\": \"8b7b1177-9588-41c5-bf26-90f969722730\",\n      \"name\": \"Add label to message2\",\n      \"webhookId\": \"892a0e29-d34a-4aba-a61b-f58f3c6cbeef\",\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"mhyVQDjPrVLEOGCr\",\n          \"name\": \"jatin.k@get\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"Add label to message2\": {\n      \"main\": [\n        []\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69\"\n  }\n}","credentialsId":"={{ $('If first message in thread').item.json.cred_id }}"},"typeVersion":1},{"id":"893a4bcf-2ffd-4e22-8b00-2e83af877181","name":"Update queue: sent + message/thread IDs","type":"n8n-nodes-base.dataTable","position":[1760,1072],"parameters":{"columns":{"value":{"sent":true,"thread_id":"={{ $json.threadId }}","message_id":"={{ $json.id }}","marked_read":false},"schema":[{"id":"sender_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sender_inbox","defaultMatch":false},{"id":"receiver_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_inbox","defaultMatch":false},{"id":"subject","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"subject","defaultMatch":false},{"id":"body","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"body","defaultMatch":false},{"id":"scheduled_date","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_date","defaultMatch":false},{"id":"scheduled_at","type":"dateTime","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_at","defaultMatch":false},{"id":"sent","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sent","defaultMatch":false},{"id":"message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"message_id","defaultMatch":false},{"id":"thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"thread_id","defaultMatch":false},{"id":"receiver_message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_message_id","defaultMatch":false},{"id":"receiver_thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_thread_id","defaultMatch":false},{"id":"marked_read","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"marked_read","defaultMatch":false},{"id":"conversation_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_id","defaultMatch":false},{"id":"conversation_index","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_index","defaultMatch":false},{"id":"status","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"status","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"filters":{"conditions":[{"keyValue":"={{ $('Loop: send warmup message').item.json.id }}"}]},"options":{},"operation":"update","dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1},{"id":"82e1e8cd-49b9-45ee-bd97-be8dc5bf7a76","name":"Hourly trigger: mark warmups as read","type":"n8n-nodes-base.scheduleTrigger","position":[1408,-320],"parameters":{"rule":{"interval":[{"field":"hours","triggerAtMinute":25}]}},"typeVersion":1.2},{"id":"1f6525ab-531c-417b-9a19-fec4e87234ce","name":"Get sent warmups to mark read","type":"n8n-nodes-base.dataTable","position":[1760,-416],"parameters":{"limit":{},"filters":{"conditions":[{"keyName":"sent","condition":"isTrue"},{"keyName":"marked_read","condition":"isFalse"},{"keyName":"scheduled_at","keyValue":"={{ DateTime.now().setZone('Asia/Kolkata').toISO() }}","condition":"lt"}]},"matchType":"allConditions","operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1,"alwaysOutputData":true},{"id":"d5bff093-3664-41c9-bd36-f61de7f601cf","name":"Loop: mark warmups read","type":"n8n-nodes-base.splitInBatches","position":[1488,16],"parameters":{"options":{}},"typeVersion":3},{"id":"bf1eee80-b7a4-40f8-840f-ff3cd5970257","name":"If warmup row exists","type":"n8n-nodes-base.if","position":[1872,32],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"3b61da83-92fd-42fa-a1b2-8fc743061594","operator":{"type":"object","operation":"notEmpty","singleValue":true},"leftValue":"={{ $json }}","rightValue":""}]}},"typeVersion":2.2},{"id":"5f6a72fe-ccd2-41b2-ba3a-bb297f5a9230","name":"Fetch unread messages from sender","type":"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX","position":[1696,32],"parameters":{"nodeJson":"={\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"operation\": \"getAll\",\n        \"filters\": {\n          \"readStatus\": \"unread\",\n          \"sender\": \"={{ $json.sender_inbox }}\"\n        }\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        -1024,\n        672\n      ],\n      \"id\": \"f3019944-af88-44b1-a81e-da273831ec8e\",\n      \"name\": \"Get many messages9\",\n      \"webhookId\": \"f70a494c-722f-4e93-adb3-a77f52ef946a\",\n      \"alwaysOutputData\": true,\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"mhyVQDjPrVLEOGCr\",\n          \"name\": \"jatin.k@get\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"Get many messages9\": {\n      \"main\": [\n        []\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69\"\n  }\n}","credentialsId":"={{ $json.cred_id }}"},"typeVersion":1},{"id":"9d08d6e0-f602-4982-bda4-d16d418c7661","name":"Get accounts (for receiver creds)","type":"n8n-nodes-base.dataTable","position":[1760,-240],"parameters":{"limit":{},"operation":"get","dataTableId":{"__rl":true,"mode":"list","value":"mqNBBTqxgRm7R9v0","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/mqNBBTqxgRm7R9v0","cachedResultName":"cold_email_accounts"}},"typeVersion":1},{"id":"e48b6981-84c8-4771-b717-78a128c782ac","name":"Merge receiver inbox credentials","type":"n8n-nodes-base.merge","position":[2144,-336],"parameters":{"mode":"combine","options":{},"advanced":true,"mergeByFields":{"values":[{"field1":"receiver_inbox","field2":"email"}]}},"typeVersion":3.2},{"id":"4834504f-ca2c-43d5-9854-5aa405e5a16e","name":"Label warmup message (receiver)","type":"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX","position":[2064,-64],"parameters":{"nodeJson":"={\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"operation\": \"addLabels\",\n        \"messageId\": \"={{ $json.id }}\",\n        \"labelIds\": [\n          \"IMPORTANT\",\n          \"Label_1\"\n        ]\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        -432,\n        688\n      ],\n      \"id\": \"3a58c9b3-9f7d-476d-afb6-6d7439569396\",\n      \"name\": \"Add label to message9\",\n      \"webhookId\": \"70ea19d6-af1d-48f9-9e41-ce508fd5a069\",\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"mhyVQDjPrVLEOGCr\",\n          \"name\": \"jatin.k@get\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"Add label to message9\": {\n      \"main\": [\n        []\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69\"\n  }\n}","credentialsId":"={{ $('Loop Over Items5').item.json.cred_id }}"},"typeVersion":1},{"id":"589ae7f2-936a-47da-b11a-37d3e1b39cf0","name":"Remove UNREAD label (mark read)","type":"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX","position":[2240,-64],"parameters":{"nodeJson":"={\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"operation\": \"removeLabels\",\n        \"messageId\": \"={{ $json.id }}\",\n        \"labelIds\": [\n          \"UNREAD\"\n        ]\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        -208,\n        688\n      ],\n      \"id\": \"ea9d7630-707e-413b-bfd3-9d4aed0d696a\",\n      \"name\": \"Remove label from message9\",\n      \"webhookId\": \"d7b034cd-dfb1-48cb-897b-b4f8a3def8f9\",\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"mhyVQDjPrVLEOGCr\",\n          \"name\": \"jatin.k@get\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"Remove label from message9\": {\n      \"main\": [\n        []\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"f5d0c13b222abccfa4b21baa9b6cd543e62d86b4c7c9b6917990da9dc767ae69\"\n  }\n}","credentialsId":"={{ $('Loop Over Items5').item.json.cred_id }}"},"typeVersion":1},{"id":"58afed9d-4db3-4a4f-b8a4-027d28d7a13c","name":"Update queue: marked_read = true","type":"n8n-nodes-base.dataTable","position":[2240,368],"parameters":{"columns":{"value":{"sent":true,"marked_read":true,"receiver_thread_id":"={{ $json.threadId }}","receiver_message_id":"={{ $json.id }}"},"schema":[{"id":"sender_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sender_inbox","defaultMatch":false},{"id":"receiver_inbox","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_inbox","defaultMatch":false},{"id":"subject","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"subject","defaultMatch":false},{"id":"body","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"body","defaultMatch":false},{"id":"scheduled_at","type":"dateTime","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"scheduled_at","defaultMatch":false},{"id":"sent","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"sent","defaultMatch":false},{"id":"message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"message_id","defaultMatch":false},{"id":"thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"thread_id","defaultMatch":false},{"id":"receiver_message_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_message_id","defaultMatch":false},{"id":"receiver_thread_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"receiver_thread_id","defaultMatch":false},{"id":"marked_read","type":"boolean","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"marked_read","defaultMatch":false},{"id":"conversation_id","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_id","defaultMatch":false},{"id":"conversation_index","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"conversation_index","defaultMatch":false}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"filters":{"conditions":[{"keyValue":"={{ $('Loop: mark warmups read').item.json.id }}"}]},"options":{},"operation":"update","dataTableId":{"__rl":true,"mode":"list","value":"JOPX8e7E4d6cjAWa","cachedResultUrl":"/projects/gWyT6ct8nsEBW0XK/datatables/JOPX8e7E4d6cjAWa","cachedResultName":"warmup_queue"}},"typeVersion":1},{"id":"afa63fe5-da49-46c1-b446-6b4fdf71c904","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-1696,-496],"parameters":{"width":720,"height":448,"content":"## How it works\nThis workflow warms up Gmail inboxes by sending natural, non-sales email conversations between your own inboxes. It generates friendly multi-message conversations using OpenAI, stores them in `warmup_conversations`, builds a daily send plan in `warmup_queue`, and assigns randomized send times within a safe daily window. Messages are sent using the correct Gmail OAuth credential for each inbox, replies happen in the same thread, and warmup emails are automatically marked as read to mimic human inbox activity.\n\n## Setup steps\n1) Create 3 Data Tables: `cold_email_accounts`, `warmup_conversations`, `warmup_queue`\n2) Add at least 2 inboxes to `cold_email_accounts` with `email`, `cred_id`, and `warmup_daily_limit`\n3) Create one Gmail OAuth2 credential per inbox and paste the credential ID into `cred_id`\n4) Add your OpenAI API credential to the OpenAI node\n5) Enable schedule triggers and execute once to test\n"},"typeVersion":1}],"pinData":{},"connections":{"Flatten message list":{"main":[[{"node":"Insert messages into warmup_queue","type":"main","index":0}]]},"If warmup row exists":{"main":[[{"node":"Label warmup message (receiver)","type":"main","index":0}],[{"node":"Loop: mark warmups read","type":"main","index":0}]]},"Filter messages due now":{"main":[[{"node":"Merge queue with account credentials","type":"main","index":0}]]},"Label sent warmup email":{"main":[[{"node":"Update queue: sent + message/thread IDs","type":"main","index":0}]]},"Loop: mark warmups read":{"main":[[],[{"node":"Fetch unread messages from sender","type":"main","index":0}]]},"Parse conversation JSON":{"main":[[{"node":"Merge recipients + conversations","type":"main","index":0}]]},"Get today unsent warmups":{"main":[[{"node":"If scheduled_at is empty","type":"main","index":0}]]},"If scheduled_at is empty":{"main":[[{"node":"Assign random send time (IST window)","type":"main","index":0}],[{"node":"Filter messages due now","type":"main","index":0}]]},"Loop: send warmup message":{"main":[[],[{"node":"If first message in thread","type":"main","index":0}]]},"If first message in thread":{"main":[[{"node":"Send Gmail message (new thread)","type":"main","index":0}],[{"node":"Get previous message (thread context)","type":"main","index":0}]]},"Loop: build queue per inbox":{"main":[[{"node":"Flatten message list","type":"main","index":0}],[{"node":"Calculate daily warmup target","type":"main","index":0}]]},"Get conversations from table":{"main":[[{"node":"Parse conversation JSON","type":"main","index":0}]]},"Loop: generate conversations":{"main":[[],[{"node":"Generate conversations (OpenAI)","type":"main","index":0}]]},"Update scheduled_at in queue":{"main":[[{"node":"Filter messages due now","type":"main","index":0}]]},"Calculate daily warmup target":{"main":[[{"node":"Get recipient inboxes (excluding sender)","type":"main","index":0},{"node":"Get conversations from table","type":"main","index":0}]]},"Get sent warmups to mark read":{"main":[[{"node":"Merge receiver inbox credentials","type":"main","index":0}]]},"Get warmup accounts for queue":{"main":[[{"node":"Loop: build queue per inbox","type":"main","index":0}]]},"Pick random recipient inboxes":{"main":[[{"node":"Merge recipients + conversations","type":"main","index":1}]]},"generate warmup conversations":{"main":[[{"node":"Get warmup accounts (cold_email_accounts)","type":"main","index":0}]]},"Get accounts (for credentials)":{"main":[[{"node":"Merge queue with account credentials","type":"main","index":1}]]},"Reply in existing Gmail thread":{"main":[[{"node":"Label sent warmup email","type":"main","index":0}]]},"Generate conversations (OpenAI)":{"main":[[{"node":"Format conversations for Data Table","type":"main","index":0}]]},"Label warmup message (receiver)":{"main":[[{"node":"Remove UNREAD label (mark read)","type":"main","index":0}]]},"Remove UNREAD label (mark read)":{"main":[[{"node":"Update queue: marked_read = true","type":"main","index":0}]]},"Send Gmail message (new thread)":{"main":[[{"node":"Label sent warmup email","type":"main","index":0}]]},"Merge receiver inbox credentials":{"main":[[{"node":"Loop: mark warmups read","type":"main","index":0}]]},"Merge recipients + conversations":{"main":[[{"node":"Loop: match conversations to recipients","type":"main","index":0}]]},"Update queue: marked_read = true":{"main":[[{"node":"Loop: mark warmups read","type":"main","index":0}]]},"Daily trigger: build warmup queue":{"main":[[{"node":"Get warmup accounts for queue","type":"main","index":0}]]},"Fetch unread messages from sender":{"main":[[{"node":"If warmup row exists","type":"main","index":0}]]},"Get accounts (for receiver creds)":{"main":[[{"node":"Merge receiver inbox credentials","type":"main","index":1}]]},"Insert messages into warmup_queue":{"main":[[]]},"Build conversation generation loop":{"main":[[{"node":"Loop: generate conversations","type":"main","index":0}]]},"Format conversations for Data Table":{"main":[[{"node":"Save conversations (warmup_conversations)","type":"main","index":0}]]},"Assign random send time (IST window)":{"main":[[{"node":"Update scheduled_at in queue","type":"main","index":0}]]},"Hourly trigger: mark warmups as read":{"main":[[{"node":"Get sent warmups to mark read","type":"main","index":0},{"node":"Get accounts (for receiver creds)","type":"main","index":0}]]},"Merge queue with account credentials":{"main":[[{"node":"Loop: send warmup message","type":"main","index":0}]]},"Get previous message (thread context)":{"main":[[{"node":"Reply in existing Gmail thread","type":"main","index":0}]]},"Loop: match conversations to recipients":{"main":[[],[{"node":"Split conversation into scheduled messages","type":"main","index":0}]]},"Update queue: sent + message/thread IDs":{"main":[[{"node":"Loop: send warmup message","type":"main","index":0}]]},"Get recipient inboxes (excluding sender)":{"main":[[{"node":"Pick random recipient inboxes","type":"main","index":0}]]},"Get warmup accounts (cold_email_accounts)":{"main":[[{"node":"Build conversation generation loop","type":"main","index":0}]]},"Save conversations (warmup_conversations)":{"main":[[{"node":"Loop: generate conversations","type":"main","index":0}]]},"Split conversation into scheduled messages":{"main":[[{"node":"Loop: build queue per inbox","type":"main","index":0}]]},"Hourly trigger: send scheduled warmup emails":{"main":[[{"node":"Get today unsent warmups","type":"main","index":0},{"node":"Get accounts (for credentials)","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":50,"nodeTypes":{"n8n-nodes-base.if":{"count":3},"n8n-nodes-base.code":{"count":9},"n8n-nodes-base.merge":{"count":3},"n8n-nodes-base.dataTable":{"count":14},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.splitInBatches":{"count":5},"n8n-nodes-base.scheduleTrigger":{"count":4},"@n8n/n8n-nodes-langchain.openAi":{"count":1},"n8n-nodes-run-node-with-credentials-x.runNodeWithCredentialsX":{"count":6}}},"status":"published","readyToDemo":null,"user":{"name":"Jatin Khatri","username":"jatinkhatri","bio":"Building high-end agents and systems for businesses around the world.","verified":false,"links":["https://www.instagram.com/khatriautomationsai/"],"avatar":"https://gravatar.com/avatar/07d711e3ef27726805c1f07499a284182f67a44bfda358c3396d6784158a68ce?r=pg&d=retro&size=200"},"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":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":1250,"icon":"file:openAi.svg","name":"@n8n/n8n-nodes-langchain.openAi","codex":{"data":{"alias":["LangChain","ChatGPT","Sora","DallE","whisper","audio","transcribe","tts","assistant"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.openai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Miscellaneous","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenAI"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg1IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NiAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MSA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K"},"displayName":"OpenAI","typeVersion":2,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1315,"icon":"fa:table","name":"n8n-nodes-base.dataTable","codex":{"data":{"alias":["data","table","knowledge","data table","table","sheet","database","data base","mysql","postgres","postgresql","airtable","supabase","noco","notion"],"details":"Data table","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.datatable/"}]},"categories":["Core Nodes","Development"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\",\"transform\"]","defaults":{"name":"Data table"},"iconData":{"icon":"table","type":"icon"},"displayName":"Data table","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":45,"name":"Miscellaneous"},{"id":51,"name":"Multimodal AI"}],"image":[{"id":4073,"url":"https://n8niostorageaccount.blob.core.windows.net/n8nio-strapi-blobs-prod/assets/Screenshot_2026_01_22_185537_f8a05a512c.png"}]}}