{
  "id": "HlVn82cNQLDWx73K",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI Newsletter Builder: Crawl Sites with Dumpling AI, Summarize with GPT-4o",
  "tags": [],
  "nodes": [
    {
      "id": "b607052f-8712-4cce-977e-6216da30a144",
      "name": "Start Workflow Manually",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -800,
        -160
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "5bf110b3-a678-4a34-a4c9-3a87ab22774f",
      "name": "Get Website URLs from Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -580,
        -160
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10AQk_0kG8d0fa7gwbm0W8f9CyMZ9syPGksQoMNBkut4/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/10AQk_0kG8d0fa7gwbm0W8f9CyMZ9syPGksQoMNBkut4/edit?usp=drivesdk",
          "cachedResultName": "sites"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "a996f64a-bb61-493d-90ca-dce9d465fd58",
      "name": "Crawl and Extract Site Content with Dumpling AI",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -360,
        -160
      ],
      "parameters": {
        "url": "https://app.dumplingai.com/api/v1/crawl",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"url\": \"{{ $json.websites }}\", \n  \"limit\": \"5\",\n  \"depth\": \"2\", \n  \"format\": \"text\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "01d0b913-cfdc-4144-8556-d5c18221cf7c",
      "name": "Split Extracted Results into Individual Items",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -140,
        -160
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "results"
      },
      "typeVersion": 1
    },
    {
      "id": "9d69abfa-c867-4fbc-83a2-58723f3c4dfb",
      "name": "Map Title, URL, and Page Text",
      "type": "n8n-nodes-base.set",
      "position": [
        80,
        -160
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "51ae9a51-06f4-46b1-979e-578eb5dc361c",
              "name": "metadata.title",
              "type": "string",
              "value": "={{ $json.metadata.title }}"
            },
            {
              "id": "2f16ef6f-cc2f-4a4d-a5e7-3cdde3465398",
              "name": "content",
              "type": "string",
              "value": "={{ $json.content }}"
            },
            {
              "id": "31ac95b7-beeb-4b3b-8e52-ed75027ae379",
              "name": "metadata.original_url",
              "type": "string",
              "value": "={{ $json.metadata.original_url }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "eaaa909d-92df-4837-a474-d533577c5621",
      "name": " Combine Articles into Single Prompt Format",
      "type": "n8n-nodes-base.code",
      "position": [
        300,
        -160
      ],
      "parameters": {
        "jsCode": "let output = '';\nitems.forEach((item, index) => {\n  const title = item.json.metadata?.title || 'No title';\n  const url = item.json.metadata?.original_url || 'No URL';\n  const content = item.json.content || 'No content';\n\n  output += `${index + 1}. ${title}\\n${url}\\n${content}\\n\\n`;\n});\n\nreturn [{ json: { aggregatedArticles: output } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "b2691018-fa64-4a55-a5e9-e68733ab9a7a",
      "name": " Generate HTML Newsletter with Subject Using GPT-4o",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        520,
        -160
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o",
          "cachedResultName": "GPT-4O"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "=You are a newsletter assistant that creates a compelling subject line and summarizes a list of articles in engaging, well-structured HTML format.\n\nInstructions:\n\n1. Read the list of articles. Each article includes a title, content, and original URL.\n2. First, generate a short, catchy subject line for the newsletter based on the overall theme of the articles.\n3. Then, for each article:\n   - Write the title inside an <h3> tag.\n   - Summarize the article in 2 to 3 engaging sentences inside a <p> tag.\n   - Below the summary, write: \u201cTo read more, click the link:\u201d and include the original URL as a clickable link inside another <p> tag.\n   - Add a <br/> to separate entries.\n\nReturn the result in this JSON format:\n\n{\n  \"subject\": \"[Newsletter subject line]\",\n  \"body\": \"[HTML body with all the articles]\"\n}\n\nOnly output the JSON. Do not explain anything else.\n\n\n\nHere is the input:{{ $json.aggregatedArticles }}\n\n"
            }
          ]
        },
        "jsonOutput": true
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.8
    },
    {
      "id": "c1266ac2-e2c0-4258-be9d-08c1ae6f3727",
      "name": "Send Newsletter via Gmail",
      "type": "n8n-nodes-base.gmail",
      "position": [
        896,
        -160
      ],
      "parameters": {
        "sendTo": "",
        "message": "={{ $json.message.content.body }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ $json.message.content.subject }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "25e0a2b5-5c27-4176-b9d8-4e91d15d86cc",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -800,
        -360
      ],
      "parameters": {
        "width": 680,
        "height": 200,
        "content": "### \ud83c\udf10 Get Website Content Using Dumpling AI\n\nThis section starts with a manual trigger, then fetches a list of website URLs from a connected Google Sheet. Each URL is sent to Dumpling AI\u2019s crawl endpoint, which extracts readable content up to a set depth. The response is an array of article-like results. These are then split one by one for individual processing. The `Set` node maps key fields such as the original URL, article title, and cleaned content for each page.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9ca5931f-6637-4371-8830-d73801381276",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        300,
        -360
      ],
      "parameters": {
        "color": 4,
        "width": 660,
        "height": 220,
        "content": "### \ud83e\udde0 Summarize and Email AI-Generated Newsletter\n\nAfter extracting and mapping each article\u2019s data, the `Code` node formats all the articles into a readable string prompt. GPT-4o is used to create a newsletter-style HTML body and catchy subject line based on the content. Finally, the result is sent using the Gmail node, delivering a ready-to-send AI-generated newsletter straight to the recipient\u2019s inbox.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a86325fc-4f26-4052-8883-ec983049f51d",
  "connections": {
    "Start Workflow Manually": {
      "main": [
        [
          {
            "node": "Get Website URLs from Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Map Title, URL, and Page Text": {
      "main": [
        [
          {
            "node": " Combine Articles into Single Prompt Format",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Website URLs from Google Sheet": {
      "main": [
        [
          {
            "node": "Crawl and Extract Site Content with Dumpling AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    " Combine Articles into Single Prompt Format": {
      "main": [
        [
          {
            "node": " Generate HTML Newsletter with Subject Using GPT-4o",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Extracted Results into Individual Items": {
      "main": [
        [
          {
            "node": "Map Title, URL, and Page Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crawl and Extract Site Content with Dumpling AI": {
      "main": [
        [
          {
            "node": "Split Extracted Results into Individual Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    " Generate HTML Newsletter with Subject Using GPT-4o": {
      "main": [
        [
          {
            "node": "Send Newsletter via Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}