{
  "id": "sI9h2lIhe4P8Fzc9",
  "name": "Renovation Cold Email",
  "tags": [],
  "nodes": [
    {
      "id": "1f19f199-7cb7-41f6-a6ae-d63925f3de7d",
      "name": "\ud83d\udcec Renovation Cold Email \u2014 Main",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -440,
        -260
      ],
      "parameters": {
        "color": 4,
        "width": 620,
        "height": 820,
        "content": "## \ud83d\udcec Renovation Cold Email \u2014 3 Variants\n\n**Goal:** Send personalised cold outreach to renovation company decision-makers at a deliverability-safe pace, log every send, and skip anyone already contacted.\n\n### How it works\n1. **Schedule Trigger** fires Mon\u2013Fri at 9:00 AM (or run manually to test).\n2. **Get Contacts** reads prospects from `Sheet1`; **Get Log Sends** reads the dedup list.\n3. **Dedup** filters out anyone already emailed \u2014 no duplicates, ever.\n4. **Assign Variants** distributes the three angles evenly using `index % 3`.\n5. **Loop** processes one contact at a time, generates a unique tracking ID, and routes to one of three email variants.\n6. **Send \u2192 Format Log \u2192 Wait (60\u2013120s) \u2192 Log to Sheet** completes one cycle.\n\n### The three variants\n- **Variant 0 (Pain-led):** \"The 2 hours your admin loses every day to invoice photos\"\n- **Variant 1 (Efficiency-led):** \"Your admin is manually typing data a machine reads in seconds\"\n- **Variant 2 (Curiosity-led):** \"What happens to your delivery notes after the photo is taken?\"\n\n### Setup steps\n- [ ] Connect Gmail credential (`Voxen_Gmail` or your own)\n- [ ] Connect Google Sheets credential\n- [ ] Point **Get Contacts** to your prospect sheet (cols: `email`, `firstName`, `companyName`)\n- [ ] Confirm `Log Sends` tab exists with matching column headers\n- [ ] Update sender sign-off in all 3 **Send Variant** nodes\n- [ ] Replace tracking pixel URL with your own webhook endpoint\n- [ ] Test by manually triggering the Schedule node before activating\n\n### Customisation\n- **Change the angles:** edit the `subject` and `message` fields in each Send Variant node \u2014 the routing logic doesn't need to change.\n- **Change the cadence:** edit the cron in Schedule Trigger (`0 9 * * 1-5` \u2192 Mon\u2013Fri 9 AM).\n- **Change the throttle:** edit the Wait node's `amount` expression (currently 60\u2013120s random).\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f0ae831e-d36e-4bab-be9a-1b1804f20c1c",
      "name": "\u26a0\ufe0f Critical Setup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        -260
      ],
      "parameters": {
        "color": 2,
        "width": 620,
        "height": 380,
        "content": "## \u26a0\ufe0f Critical \u2014 Do before activation\n\n**Deliverability and tracking will break if you skip these:**\n\n- \ud83d\udd11 **Gmail credential** must be authenticated on a warmed-up inbox (not a brand-new Google account).\n- \ud83d\udcca **Google Sheets credential** needs access to both tabs: `Sheet1` (prospects) and `Log Sends`.\n- \ud83c\udfaf **Tracking pixel URL** in every Send Variant currently points to a Voxen webhook. Replace `https://kkks38v7.rpcl.app/webhook/track-open?id=...` with your own endpoint or open-rate data will route to someone else's dashboard.\n- \u270d\ufe0f **Sender sign-off** \u2014 all 3 Send Variants are signed *\"Afeez O \u2014 Automation Specialist.\"* Update to your name and title before activating.\n- \ud83d\udeab **Do not raise batch size above 1** on the Loop node \u2014 that bypasses the throttle and risks Gmail bulk flags."
      },
      "typeVersion": 1
    },
    {
      "id": "10662ea5-2e64-4094-b596-a9eb1033d791",
      "name": "Section \u2014 Contact Qualification & Dedup",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        380,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 720,
        "height": 440,
        "content": "### \ud83c\udfaf Contact Qualification & Dedup\n\nLoads today's prospects from Google Sheets, anti-joins them against the `Log Sends` history to drop anyone already emailed, then evenly distributes the survivors across the three message variants."
      },
      "typeVersion": 1
    },
    {
      "id": "9a6a51d3-67a9-4d8e-932e-30526300ed23",
      "name": "Section \u2014 Variant Routing & Personalization",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 1080,
        "height": 440,
        "content": "### \ud83d\udd00 Variant Routing & Personalization\n\nProcesses one contact at a time, extracts the merge fields (`firstName`, `email`, `companyName`), generates a unique base64 tracking ID, and routes the contact to the correct email variant via two cascading IF nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "401332de-eac1-47a1-bc76-f59cd2d95465",
      "name": "Section \u2014 Email Delivery & Logging",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2200,
        60
      ],
      "parameters": {
        "color": 7,
        "width": 900,
        "height": 620,
        "content": "### \ud83d\udce4 Email Delivery & Logging\n\nSends the personalised email via Gmail with an embedded 1\u00d71 tracking pixel, formats a send record, waits a random 60\u2013120 seconds to protect deliverability, then appends the record to the `Log Sends` tab so the next run's dedup step will skip this contact."
      },
      "typeVersion": 1
    },
    {
      "id": "1a782691-4d91-41d8-938e-292c03876116",
      "name": "Loop",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1136,
        448
      ],
      "parameters": {
        "options": {},
        "batchSize": 1
      },
      "typeVersion": 1
    },
    {
      "id": "1a315d08-0b1d-4d44-b8ff-0bbe56516a04",
      "name": "Set Variant",
      "type": "n8n-nodes-base.set",
      "position": [
        1328,
        352
      ],
      "parameters": {
        "values": {
          "number": [
            {
              "name": "variant",
              "value": "={{ $json.variant }}"
            }
          ],
          "string": [
            {
              "name": "firstName",
              "value": "={{ $json.firstName }}"
            },
            {
              "name": "email",
              "value": "={{ $json.email }}"
            },
            {
              "name": "companyName",
              "value": "={{ $json.companyName || '' }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "e3b9d974-e327-4a9e-8056-eb1c33bcd680",
      "name": "Route: Variant 0?",
      "type": "n8n-nodes-base.if",
      "position": [
        1808,
        368
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json[\"variant\"] }}",
              "operation": "equal"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "396fba77-4321-4584-a590-3555aafd342e",
      "name": "Route: Variant 1?",
      "type": "n8n-nodes-base.if",
      "position": [
        2032,
        464
      ],
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json[\"variant\"] }}",
              "value2": 1,
              "operation": "equal"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "00b5aa2c-9b02-49f2-922b-0bb8c8fd396f",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        2704,
        368
      ],
      "parameters": {
        "unit": "seconds",
        "amount": "={{ Math.floor(Math.random() * 61) + 60 }}"
      },
      "typeVersion": 1
    },
    {
      "id": "dbf58970-0b56-4663-8cbd-d0e0d5e665b3",
      "name": "Format Log",
      "type": "n8n-nodes-base.set",
      "position": [
        2480,
        368
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "firstName",
              "value": "={{ $json[\"firstName\"] }}"
            },
            {
              "name": "email",
              "value": "={{ $json[\"email\"] }}"
            },
            {
              "name": "variant",
              "value": "={{ $json[\"variant\"] }}"
            },
            {
              "name": "timestamp",
              "value": "={{ $now.toISO() }}"
            },
            {
              "name": "status",
              "value": "sent"
            },
            {
              "name": "trackingId",
              "value": "={{ $json[\"trackingId\"] }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "f9d3d2ba-649d-4f46-aea2-ce0f02801bda",
      "name": "Get Contacts",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        464,
        352
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": []
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M/edit?usp=drivesdk",
          "cachedResultName": "GMAIL Sends"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "61151321-1f98-48bb-90fb-44fcc103a582",
      "name": "Log to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2928,
        544
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "threadId",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "threadId",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "labelIds",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "labelIds",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "timestamp",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "trackingId",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "trackingId",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "openedAt",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "openedAt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "firstName",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "firstName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "variant",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "variant",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1794299578,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M/edit#gid=1794299578",
          "cachedResultName": "Log Sends"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M/edit?usp=drivesdk",
          "cachedResultName": "GMAIL Sends"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5ee4c366-b87b-4eb1-aaf1-fc9d1dd99127",
      "name": "Send Variant 1",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2256,
        368
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=Hey,<br><br>There's a task happening in most renovation businesses every single day that nobody talks about because it's so normal it's become invisible.<br><br>A supplier delivers materials on site. The driver hands over a delivery note. Someone photographs it and sends it on Telegram. Back at the office, an admin opens that photo and manually types the supplier name, the line items, the quantities, the prices, and the total into a spreadsheet. Then the next photo arrives.<br><br>It's not anyone's fault. It's just how it's always been done. But at 8 minutes per invoice with 10 to 20 arriving daily, you're paying a skilled admin to do work that an AI can do in under 60 seconds \u2014 with the same accuracy, zero fatigue, and no backlog.<br><br>This is where I come in.<br><br>I build automation systems specifically for renovation companies. The one I want to show you takes an invoice photo sent on Telegram, reads every field using AI vision, and logs the structured data directly into Google Sheets \u2014 supplier, invoice number, date, line items, total \u2014 automatically, with a confirmation sent back to the sender. Your admin goes from data entry to review only.<br><br>I have a 90-second screen recording showing this running live \u2014 real invoice photo, real data extracted, real Google Sheet updated.<br><br>Is that worth 90 seconds of your time?<br><br>Best,<br>Afeez O<br>Automation Specialist<br><img src=\"https://kkks38v7.rpcl.app/webhook/track-open?id={{$json.trackingId}}\" width=\"1\" height=\"1\" alt=\"\" style=\"display:none;\">",
        "options": {},
        "subject": "Your admin is manually typing data that a machine can read in seconds"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b024c13a-cc31-45a9-83ac-3b12318515c4",
      "name": "Send Variant 2",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2256,
        560
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=Hey,<br><br>Quick question \u2014 after a site manager photographs a delivery note and sends it on Telegram, what actually happens to it?<br><br>In most renovation businesses the answer is: it sits there until someone on the admin side gets to it, opens the photo, reads it, and manually enters the details into a spreadsheet or accounting system. Sometimes that day. Sometimes three days later. Occasionally it gets missed entirely.<br><br>It's a small problem that adds up to something significant. 10 to 20 invoice photos a day at 8 minutes each is over 2 hours of manual data entry \u2014 every day \u2014 that could be handled automatically.<br><br>This is where I come in.<br><br>I build a simple automation for renovation companies that sits between the Telegram photo and the Google Sheet. The moment an invoice photo is sent, AI reads it, extracts the supplier name, invoice number, date, line items, and total, and logs it into a structured Google Sheet automatically. A confirmation goes back on Telegram in under 60 seconds. No manual entry. No backlog. No missed invoices.<br><br>I've built a working version and have a 90-second demo ready to send.<br><br>Want to see it?<br><br>Best,<br>Afeez O<br>Automation Specialist<br><img src=\"https://kkks38v7.rpcl.app/webhook/track-open?id={{$json.trackingId}}\" width=\"1\" height=\"1\" alt=\"\" style=\"display:none;\">",
        "options": {},
        "subject": "What happens to your delivery notes after the photo is taken?"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "7136425c-3524-4902-a4fc-906f8de77e34",
      "name": "Send Variant 0",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2256,
        176
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=Hey,<br><br>Renovation and Remodelling contractors run two businesses simultaneously \u2014 the one on site and the one in the office. Most owners are exceptional at the first one.<br>The second one runs on phone calls, Whatsapp/Telegram messages, photos of delivery notes, and an admin team doing their best with tools that were never designed for how renovation actually works.<br><br>The result is predictable. Supplier invoices arrive as photos on Whatsapp/Telegram and sit there until someone gets to them. That someone opens the photo, reads the details, and manually types them into a spreadsheet or accounting system \u2014 one by one, every day.<br><br>At 8 minutes per invoice, with 10 to 20 arriving daily, that's up to 2.5 hours of pure data entry that produces zero revenue.<br><br>This is where I come in.<br><br>I build automation systems for renovation companies that eliminate that manual step entirely.<br><br>A site manager photographs a delivery note or supplier invoice and sends it on Telegram. Within 60 seconds, the supplier name, invoice number, date, line items, and total are automatically extracted by AI and logged into a Google Sheet \u2014 clean, structured, and ready to action.<br><br>A confirmation comes back on Telegram so the sender knows it worked. Nobody types anything. I've built a working version of this and recorded a 90-second demo showing exactly how it runs \u2014 photo in, structured data out, confirmation back, all automatic. Worth sending it over?<br><br>Best,<br>Afeez O<br>Automation Specialist<br><img src=\"https://kkks38v7.rpcl.app/webhook/track-open?id={{$json.trackingId}}\" width=\"1\" height=\"1\" alt=\"\" style=\"display:none;\">",
        "options": {
          "appendAttribution": false
        },
        "subject": "The 2 hours your admin loses every day to invoice photos"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f15903dc-3f14-4d84-b5f2-83b83b15da7b",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        240,
        448
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * 1-5"
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "500e9b11-e8b3-4162-941d-b909435eda12",
      "name": "Get Log Sends",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        464,
        544
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": []
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1794299578,
          "cachedResultName": "Log Sends"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1PMyfESis3oqbDv6wpVbMS7Nf4hG7aq10fw-NZ_D0F4M",
          "cachedResultName": "GMAIL Sends"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3c4d8e2d-b5d7-479d-945c-429c5a2c2695",
      "name": "Dedup: Skip Already Sent",
      "type": "n8n-nodes-base.merge",
      "position": [
        688,
        448
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "joinMode": "keepNonMatches",
        "outputDataFrom": "input1",
        "fieldsToMatchString": "email"
      },
      "typeVersion": 3
    },
    {
      "id": "d3ad9e6a-4946-4d09-b296-a45ef6c9effc",
      "name": "Assign Variants",
      "type": "n8n-nodes-base.code",
      "position": [
        912,
        448
      ],
      "parameters": {
        "jsCode": "return items.map((item, index) => ({\n  json: {\n    ...item.json,\n    variant: index % 3\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "e577c884-1145-4354-a009-dacb4767737b",
      "name": "Add Tracking ID",
      "type": "n8n-nodes-base.code",
      "position": [
        1584,
        368
      ],
      "parameters": {
        "jsCode": "return items\n  .filter(item => item.json.email)\n  .map(item => ({\n  json: {\n    ...item.json,\n    trackingId: Buffer.from(`${item.json.email}|${Date.now()}`).toString('base64').replace(/[+/=]/g, '')\n  }\n}));"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "6e164eb0-1437-4d20-9029-6e6bcacbb3eb",
  "connections": {
    "Loop": {
      "main": [
        [
          {
            "node": "Set Variant",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Log to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Log": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Variant": {
      "main": [
        [
          {
            "node": "Add Tracking ID",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Contacts": {
      "main": [
        [
          {
            "node": "Dedup: Skip Already Sent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Sheet": {
      "main": [
        [
          {
            "node": "Loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Log Sends": {
      "main": [
        [
          {
            "node": "Dedup: Skip Already Sent",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Send Variant 0": {
      "main": [
        [
          {
            "node": "Format Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Variant 1": {
      "main": [
        [
          {
            "node": "Format Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Variant 2": {
      "main": [
        [
          {
            "node": "Format Log",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Tracking ID": {
      "main": [
        [
          {
            "node": "Route: Variant 0?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Assign Variants": {
      "main": [
        [
          {
            "node": "Loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Contacts",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Log Sends",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route: Variant 0?": {
      "main": [
        [
          {
            "node": "Send Variant 0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Route: Variant 1?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route: Variant 1?": {
      "main": [
        [
          {
            "node": "Send Variant 1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Variant 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedup: Skip Already Sent": {
      "main": [
        [
          {
            "node": "Assign Variants",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}