{
  "name": "Generate personalized cold email icebreakers with Apify, Baserow and OpenRouter GPT-4.1",
  "nodes": [
    {
      "id": "0d00d803-f827-4933-96ad-804f3ac685a1",
      "name": "Website overview",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        3456,
        464
      ]
    },
    {
      "id": "605eac29-e905-4885-ad8c-5898a473f888",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        3536,
        992
      ]
    },
    {
      "id": "77e31754-d979-4a9e-a8e2-68819e057c99",
      "name": "icebreaker & Subject",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        3456,
        736
      ]
    },
    {
      "id": "739781aa-9a85-4c49-a6f8-c1fd74b7374b",
      "name": "Overview & Name",
      "type": "n8n-nodes-base.set",
      "position": [
        3904,
        464
      ]
    },
    {
      "id": "7493c1e8-c409-4e50-b8aa-564b91fad833",
      "name": "Subject & Icebreaker",
      "type": "n8n-nodes-base.set",
      "position": [
        3904,
        736
      ]
    },
    {
      "id": "d71fd579-d52a-4d07-96b0-70793156a51b",
      "name": "Scrape Website",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -704,
        96
      ]
    },
    {
      "id": "45b74ae7-1a55-481f-ad79-3dc216258f8d",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1184,
        -48
      ]
    },
    {
      "id": "cfbe5faa-bde6-4add-8d30-530d2be21d61",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        -112
      ],
      "parameters": {
        "width": 640,
        "height": 384,
        "content": "## Scrape Main URL and get all the links on the page"
      }
    },
    {
      "id": "61b96265-2c53-42c4-9b53-9f1472f6aee9",
      "name": "Scrape other pages",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2448,
        96
      ]
    },
    {
      "id": "41780620-e8ad-4069-8274-8c95308924c6",
      "name": "Person info",
      "type": "n8n-nodes-base.set",
      "position": [
        -1504,
        -48
      ]
    },
    {
      "id": "2357760e-48cf-4f17-b17b-3d831c0b9959",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1776,
        -176
      ],
      "parameters": {
        "width": 432,
        "height": 528,
        "content": "## Get Leads from Database"
      }
    },
    {
      "id": "c37ec6fc-359e-43d4-b8f2-4c95c661ebe6",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1744,
        800
      ],
      "parameters": {
        "width": 592,
        "height": 576,
        "content": "## Insert Icebreaker & Subject Line & Website Overview into the Database"
      }
    },
    {
      "id": "31238001-491f-41be-bf41-f0e0d6dfda9c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2400,
        -384
      ],
      "parameters": {
        "width": 1904,
        "height": 640,
        "content": "## Scrape provided URL(s) and get their HTML. Using 'Markdown', get rid of the HTML jargon. Then limit the material of the page(s) to 5000 characters. Finally, combine all data into one array. Retries"
      }
    },
    {
      "id": "1dad7cf9-9f99-4d72-bedf-ec8995f17e2d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        64,
        -112
      ],
      "parameters": {
        "width": 720,
        "height": 384,
        "content": "## Convert the half URL(s) into full"
      }
    },
    {
      "id": "8144c92d-c511-4224-a9db-73c8083ed844",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1648,
        -1104
      ],
      "parameters": {
        "width": 480,
        "height": 704,
        "content": "## Detailed: Filters through to find desired pages.   \n- If desired don't exist, then 'fallback' pages are sent forward.\n\n- The total output will always be 5 (if enough links are available).\n\n- If the"
      }
    },
    {
      "id": "835363fd-1602-4d80-b959-18fdc046b389",
      "name": "Icebreaker Update",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1840,
        1200
      ]
    },
    {
      "id": "19d3f301-5b78-4a8e-b12e-b6d2a131c696",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1328,
        -32
      ],
      "parameters": {
        "width": 230,
        "height": 320,
        "content": "## Remove External URLs"
      }
    },
    {
      "id": "a6086278-11d5-4fa0-85ba-685d3f957eed",
      "name": "Apify Scraper",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -704,
        304
      ]
    },
    {
      "id": "5b768149-5234-44fe-bdaa-c677e1bae348",
      "name": "If it says no content",
      "type": "n8n-nodes-base.if",
      "position": [
        4128,
        464
      ]
    },
    {
      "id": "eb22b90c-cc7e-4d3a-88f4-1d3a55cbd65c",
      "name": "Update No content",
      "type": "n8n-nodes-base.airtable",
      "position": [
        2144,
        1200
      ]
    },
    {
      "id": "eb73d7cc-ece6-4138-a5b5-3061c75fbae1",
      "name": "Send icebreaker & subject no content",
      "type": "n8n-nodes-base.set",
      "position": [
        4128,
        736
      ]
    },
    {
      "id": "6d868e97-332b-4f25-820e-0041076c0b05",
      "name": "Apify Scraper1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2688,
        288
      ]
    },
    {
      "id": "199db52e-a844-40ee-bf3d-053cf36f4b2d",
      "name": "OpenRouter ThreeZero",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        3456,
        1248
      ]
    },
    {
      "id": "92626ec9-09b6-4265-b73f-86c21fac8045",
      "name": "When clicking ‘Execute workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2064,
        -48
      ]
    },
    {
      "id": "2e206f79-4cd0-4983-8269-af145ae59587",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        4128,
        96
      ]
    },
    {
      "id": "23ec6b65-067d-45a2-92e5-6ba1537ef708",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2608,
        -288
      ],
      "parameters": {
        "width": 496,
        "height": 544,
        "content": "## Passes Directly if Atleast 1 scrape was successful else uses the Apify scraper\n\n- #### Code node grabs all data items and urls.\n\n--- If 'data' exists (even if only 1), it outputs: 'hasData=true', i"
      }
    },
    {
      "id": "ff3f2a8e-26aa-4d51-8494-943003ad9daa",
      "name": "Check for scrapes",
      "type": "n8n-nodes-base.code",
      "position": [
        2688,
        96
      ]
    },
    {
      "id": "48bd0054-0200-41d8-ab59-008eeb69365d",
      "name": "Scraped from Apify",
      "type": "n8n-nodes-base.set",
      "position": [
        3184,
        288
      ]
    },
    {
      "id": "91437240-4cf1-49bb-b587-faf67bd76ada",
      "name": "Normally Scraped",
      "type": "n8n-nodes-base.set",
      "position": [
        3184,
        96
      ]
    },
    {
      "id": "033c2820-88a1-40d3-bbdc-5b43812003b1",
      "name": "If there is Data",
      "type": "n8n-nodes-base.if",
      "position": [
        2928,
        96
      ]
    },
    {
      "id": "8c53bcc9-a540-4e60-941f-2ae827605910",
      "name": "Remove Duplicates",
      "type": "n8n-nodes-base.code",
      "position": [
        912,
        96
      ]
    },
    {
      "id": "4946fbe6-075d-4caa-bf37-c8f05e28f29e",
      "name": "Update Icebreaker and Subject",
      "type": "n8n-nodes-base.baserow",
      "position": [
        1840,
        960
      ]
    },
    {
      "id": "bba2ec24-4b46-4dbf-98cd-261e61085145",
      "name": "Update NoContent",
      "type": "n8n-nodes-base.baserow",
      "position": [
        2144,
        960
      ]
    },
    {
      "id": "f431ed50-c480-4043-a1f0-046606375de2",
      "name": "Apify Scraper2",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -352,
        544
      ]
    },
    {
      "id": "3b07fa03-6ef5-4c65-8e06-6ac7cb5ea705",
      "name": "data or content both get forwarded",
      "type": "n8n-nodes-base.set",
      "position": [
        -528,
        96
      ]
    },
    {
      "id": "9cf84df0-0ae2-412a-9bd9-edefce4dc386",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2912,
        -256
      ],
      "parameters": {
        "width": 688,
        "height": 800,
        "content": "## Overview\nThis workflow researches each lead’s website and generates a personalized cold outreach subject line and icebreaker using real website content. It replaces manual research with structured "
      }
    },
    {
      "id": "a8f1a90c-1c61-47c1-a734-bb09cdd6fdd3",
      "name": "Get Sheet data",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -1712,
        176
      ]
    },
    {
      "id": "3ec49e3e-53e5-4ff2-8529-2c29742ec19c",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        832,
        -32
      ],
      "parameters": {
        "width": 262,
        "height": 320,
        "content": "## Remove Duplicates"
      }
    },
    {
      "id": "b4ef164d-a286-4422-b05f-4c8ad8f8dd14",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        -400
      ],
      "parameters": {
        "width": 640,
        "height": 272,
        "content": "## To understand how to get the URL with embedded API\n\nOpen the Apify Scraper or Apify Scraper2 node. And in the URLs field, you will see a URL of the actor along with a placeholder API.\nGrab the URL "
      }
    },
    {
      "id": "8586283f-d7ed-4bca-b762-151140526f94",
      "name": "Extract Links",
      "type": "n8n-nodes-base.html",
      "position": [
        -352,
        96
      ]
    },
    {
      "id": "e4645f87-9e04-4e75-a5e7-17b8a32e38a0",
      "name": "Grab the Web URL",
      "type": "n8n-nodes-base.set",
      "position": [
        -704,
        544
      ]
    },
    {
      "id": "f399369f-448a-436f-87c6-cae23e2ea225",
      "name": "Break the Array into Items",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -96,
        96
      ]
    },
    {
      "id": "bacbfafd-cb8b-42a4-82a3-ba632a0af6f5",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        816,
        -176
      ],
      "parameters": {
        "width": 1312,
        "height": 464,
        "content": "## Remove Extras"
      }
    },
    {
      "id": "1ca0ca71-e80e-4569-ab80-79872cce6230",
      "name": "Array into Items",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1168,
        96
      ]
    },
    {
      "id": "363ada1a-65e7-4a55-95c7-0fa4e306b65f",
      "name": "Filter out other URLs",
      "type": "n8n-nodes-base.filter",
      "position": [
        1392,
        96
      ]
    },
    {
      "id": "8009f1d6-d855-4818-ae18-c957d43ea4d9",
      "name": "Check for Half URLs",
      "type": "n8n-nodes-base.if",
      "position": [
        112,
        96
      ]
    },
    {
      "id": "383017d1-ea76-4df6-ad5e-b21a7a29a4b7",
      "name": "Make Half URLs Full",
      "type": "n8n-nodes-base.set",
      "position": [
        384,
        -32
      ]
    },
    {
      "id": "0eb28c7d-53be-4c41-aa3a-e1c5be509713",
      "name": "Combine Full and Empty URLs",
      "type": "n8n-nodes-base.merge",
      "position": [
        640,
        96
      ]
    },
    {
      "id": "6f7e2b41-dd7d-4c54-85f2-7335407e6575",
      "name": "Get Data from Sheet",
      "type": "n8n-nodes-base.baserow",
      "position": [
        -1712,
        -48
      ]
    },
    {
      "id": "6209f1fb-7d43-4264-8b46-abbf0b66731f",
      "name": "Only Grab the Desired Pages",
      "type": "n8n-nodes-base.code",
      "position": [
        1808,
        96
      ]
    },
    {
      "id": "45c08f1f-4d51-43a5-bab5-d541dee74175",
      "name": "Array into Separate Items",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2208,
        96
      ]
    },
    {
      "id": "8d6a7422-97fc-482d-ad6b-28090078d072",
      "name": "Merge All",
      "type": "n8n-nodes-base.merge",
      "position": [
        3456,
        96
      ]
    },
    {
      "id": "889b9e22-f299-4f87-a8d8-fc0c8a50476d",
      "name": "Converts HTML into easily readable format",
      "type": "n8n-nodes-base.markdown",
      "position": [
        3680,
        96
      ]
    },
    {
      "id": "04e360d2-6a55-4b46-96c3-201641734975",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3600,
        -112
      ],
      "parameters": {
        "width": 256,
        "height": 368,
        "content": "## Shorten the HTML\n\n- It removes the extra parts of HTML such as '<div>, <body>, <title>' tags to help save token usage"
      }
    },
    {
      "id": "747a4d93-6288-4576-97b9-5b90ab0ab17a",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1632,
        -112
      ],
      "parameters": {
        "width": 480,
        "height": 416,
        "content": "## Filters through to find desired pages. \n- Desired pages are mentioned in the code as 'keywords'\n- If need to change the kind of pages, then change the words in the 'keywords' constant\n\n- Detailed w"
      }
    },
    {
      "id": "43d31185-89fe-47b3-9d85-f49676a5d298",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3872,
        -112
      ],
      "parameters": {
        "width": 192,
        "height": 368,
        "content": "## Limit the material of the page(s) to 5000 characters"
      }
    },
    {
      "id": "00831533-2d61-4f56-b884-f934c30b2cd2",
      "name": "Limit Characters to 5k each",
      "type": "n8n-nodes-base.set",
      "position": [
        3920,
        96
      ]
    },
    {
      "id": "eda642b0-a731-4ba0-9172-5d3630e1bdca",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4320,
        416
      ],
      "parameters": {
        "width": 592,
        "height": 544,
        "content": "## LLM for generating Website Overview and Personalized Emails\n\n### The Website Overview Node:\n- Takes the website scrape and uses it to create a 3-paragraph overview of said site.\n- Has error handlin"
      }
    }
  ],
  "connections": {
    "Aggregate": {
      "main": [
        [
          {
            "node": "Website overview",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge All": {
      "main": [
        [
          {
            "node": "Converts HTML into easily readable format",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Person info": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Apify Scraper": {
      "main": [
        [
          {
            "node": "Scraped from Apify",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Grab the Web URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Links": {
      "main": [
        [
          {
            "node": "Break the Array into Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Apify Scraper1": {
      "main": [
        [
          {
            "node": "Scraped from Apify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Apify Scraper2": {
      "main": [
        [
          {
            "node": "Scraped from Apify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Website": {
      "main": [
        [
          {
            "node": "data or content both get forwarded",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Apify Scraper",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Scrape Website",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Overview & Name": {
      "main": [
        [
          {
            "node": "If it says no content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Array into Items": {
      "main": [
        [
          {
            "node": "Filter out other URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grab the Web URL": {
      "main": [
        [
          {
            "node": "Apify Scraper2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If there is Data": {
      "main": [
        [
          {
            "node": "Normally Scraped",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Apify Scraper1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normally Scraped": {
      "main": [
        [
          {
            "node": "Merge All",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update NoContent": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Website overview": {
      "main": [
        [
          {
            "node": "Overview & Name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check for scrapes": {
      "main": [
        [
          {
            "node": "If there is Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Icebreaker Update": {
      "main": [
        []
      ]
    },
    "Remove Duplicates": {
      "main": [
        [
          {
            "node": "Array into Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update No content": {
      "main": [
        []
      ]
    },
    "Scrape other pages": {
      "main": [
        [
          {
            "node": "Check for scrapes",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Scraped from Apify": {
      "main": [
        [
          {
            "node": "Merge All",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Check for Half URLs": {
      "main": [
        [
          {
            "node": "Make Half URLs Full",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Combine Full and Empty URLs",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Get Data from Sheet": {
      "main": [
        [
          {
            "node": "Person info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Make Half URLs Full": {
      "main": [
        [
          {
            "node": "Combine Full and Empty URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter ThreeZero": {
      "ai_languageModel": [
        [
          {
            "node": "Website overview",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "icebreaker & Subject",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Subject & Icebreaker": {
      "main": [
        [
          {
            "node": "Update Icebreaker and Subject",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "icebreaker & Subject": {
      "main": [
        [
          {
            "node": "Subject & Icebreaker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter out other URLs": {
      "main": [
        [
          {
            "node": "Only Grab the Desired Pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If it says no content": {
      "main": [
        [
          {
            "node": "icebreaker & Subject",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send icebreaker & subject no content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "icebreaker & Subject",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Array into Separate Items": {
      "main": [
        [
          {
            "node": "Scrape other pages",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Break the Array into Items": {
      "main": [
        [
          {
            "node": "Check for Half URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine Full and Empty URLs": {
      "main": [
        [
          {
            "node": "Remove Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Limit Characters to 5k each": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Only Grab the Desired Pages": {
      "main": [
        [
          {
            "node": "Array into Separate Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Icebreaker and Subject": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "data or content both get forwarded": {
      "main": [
        [
          {
            "node": "Extract Links",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send icebreaker & subject no content": {
      "main": [
        [
          {
            "node": "Update NoContent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Get Data from Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Converts HTML into easily readable format": {
      "main": [
        [
          {
            "node": "Limit Characters to 5k each",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}