AutomationFlowsAI & RAG › Create AI Newsletters with Gpt-4o, Human Approval Workflow, and Sendgrid

Create AI Newsletters with Gpt-4o, Human Approval Workflow, and Sendgrid

By小林幸一 @korin on n8n.io

Streamline your email marketing process with this AI-powered "Human-in-the-Loop" workflow. It allows you to generate high-quality, targeted newsletters from a simple form input, review them via email, and automatically distribute them to your subscribers upon approval.

Event trigger★★★★☆ complexityAI-powered17 nodesForm TriggerGoogle SheetsAgentOpenAI ChatOutput Parser StructuredGmailSendGrid
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11032 — we link there as the canonical source.

This workflow follows the Agent → Form Trigger recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "TqDdMHto43GjNPRc",
  "name": "AI-Powered Personalized Newsletter Generation and Approval System",
  "tags": [],
  "nodes": [
    {
      "id": "e4c14d3b-7600-4e2d-b75e-6a7aee3664fa",
      "name": "Newsletter Input Form",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -48,
        0
      ],
      "parameters": {
        "options": {
          "appendAttribution": false
        },
        "formTitle": "\u30e1\u30eb\u30de\u30ac\u751f\u6210\u30d5\u30a9\u30fc\u30e0",
        "formFields": {
          "values": [
            {
              "fieldLabel": "\u4eca\u9031\u306e\u30c8\u30d4\u30c3\u30af",
              "requiredField": true
            },
            {
              "fieldLabel": "\u30bf\u30fc\u30b2\u30c3\u30c8\u8aad\u8005\u5c64",
              "requiredField": true
            },
            {
              "fieldLabel": "\u9001\u4fe1\u8005\u540d",
              "requiredField": true
            },
            {
              "fieldType": "email",
              "fieldLabel": "\u627f\u8a8d\u7528\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9",
              "requiredField": true
            }
          ]
        },
        "formDescription": "\u30c8\u30d4\u30c3\u30af\u3068\u30bf\u30fc\u30b2\u30c3\u30c8\u8aad\u8005\u5c64\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002AI\u304c\u81ea\u52d5\u7684\u306b\u30e1\u30eb\u30de\u30ac\u3092\u751f\u6210\u3057\u307e\u3059\u3002"
      },
      "typeVersion": 2.3
    },
    {
      "id": "371c7a6b-b0e9-4716-a458-9a1d3297b7cc",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        176,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "subscriber_list",
              "type": "string",
              "value": "<__PLACEHOLDER_VALUE__Comma-separated email addresses of newsletter subscribers__>"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "711255f2-fdc7-4954-a013-139509d7abc1",
      "name": "Store Form Responses",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        448,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "topic": "topic",
            "sender": "sender",
            "target": "target",
            "admin_email": "admin_email"
          },
          "mappingMode": "autoMapInputData"
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "<__PLACEHOLDER_VALUE__Sheet name (e.g., Form Responses)__>"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "<__PLACEHOLDER_VALUE__Google Sheets document ID__>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5d16f728-f115-41ca-8dc2-df5bae55fe95",
      "name": "Generate Newsletter Content",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        672,
        0
      ],
      "parameters": {
        "text": "=\u30c8\u30d4\u30c3\u30af: {{ $json.topic }}\n\u30bf\u30fc\u30b2\u30c3\u30c8\u8aad\u8005\u5c64: {{ $json.target }}\n\u9001\u4fe1\u8005\u540d: {{ $json.sender }}",
        "options": {
          "systemMessage": "\u3042\u306a\u305f\u306f\u30d7\u30ed\u306e\u30e1\u30fc\u30eb\u30de\u30fc\u30b1\u30bf\u30fc\u3067\u3059\u3002\u5165\u529b\u3055\u308c\u305f\u30c8\u30d4\u30c3\u30af\u3068\u30bf\u30fc\u30b2\u30c3\u30c8\u8aad\u8005\u5c64\u306b\u57fa\u3065\u3044\u3066\u3001\u9b45\u529b\u7684\u306a\u30e1\u30eb\u30de\u30ac\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n\u30bf\u30b9\u30af:\n1. \u30bf\u30fc\u30b2\u30c3\u30c8\u8aad\u8005\u5c64\u306b\u97ff\u304f\u4ef6\u540d\u3092\u4f5c\u6210\u3059\u308b\n2. \u30c8\u30d4\u30c3\u30af\u306b\u57fa\u3065\u3044\u305f\u672c\u6587\u3092Markdown\u5f62\u5f0f\u3067\u4f5c\u6210\u3059\u308b\n3. HTML\u30bf\u30b0\u306f\u4f7f\u7528\u305b\u305a\u3001Markdown\u306e\u307f\u3092\u4f7f\u7528\u3059\u308b\n4. \u672c\u6587\u306f\u8aad\u307f\u3084\u3059\u304f\u3001\u4fa1\u5024\u306e\u3042\u308b\u60c5\u5831\u3092\u63d0\u4f9b\u3059\u308b\u5185\u5bb9\u306b\u3059\u308b\n5. JSON\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3067\u51fa\u529b\u3059\u308b\uff08subject \u3068 body_markdown \u306e\u307f\uff09\n\n\u6ce8\u610f\u4e8b\u9805:\n- \u4f59\u8a08\u306a\u4f1a\u8a71\u3084\u8aac\u660e\u306f\u542b\u3081\u306a\u3044\n- JSON\u306e\u307f\u3092\u51fa\u529b\u3059\u308b\n- Markdown\u306f\u898b\u51fa\u3057\u3001\u30ea\u30b9\u30c8\u3001\u5f37\u8abf\u306a\u3069\u3092\u9069\u5207\u306b\u4f7f\u7528\u3059\u308b"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "f7470b29-3426-47e0-a26f-0d0b2934dc4c",
      "name": "OpenAI GPT-4o Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        672,
        224
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "gpt-4o"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "703029ef-3e5c-4c60-8395-2b820a359938",
      "name": "JSON Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        816,
        224
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"subject\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\": \"Email subject line that captures attention\"\n\t\t},\n\t\t\"body_markdown\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\": \"Newsletter body content in Markdown format\"\n\t\t}\n\t}\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "a9066ad6-b92d-4bdd-948d-3db69c3a715d",
      "name": "Convert Markdown to HTML",
      "type": "n8n-nodes-base.markdown",
      "position": [
        1024,
        0
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {},
        "markdown": "={{ $json.body_markdown }}"
      },
      "typeVersion": 1
    },
    {
      "id": "a710300f-2599-40a6-b9e3-c4ed54c98d99",
      "name": "Send Approval Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1248,
        0
      ],
      "parameters": {
        "sendTo": "={{ $('Workflow Configuration').first().json.admin_email }}",
        "message": "=<h2>\u30e1\u30eb\u30de\u30ac\u627f\u8a8d\u4f9d\u983c</h2>\n<p>\u4ee5\u4e0b\u306e\u5185\u5bb9\u3067\u627f\u8a8d\u3092\u304a\u9858\u3044\u3057\u307e\u3059\u3002</p>\n\n<h3>\u4ef6\u540d\u30d7\u30ec\u30d3\u30e5\u30fc:</h3>\n<p><strong>{{ $json.subject }}</strong></p>\n\n<h3>\u672c\u6587\u30d7\u30ec\u30d3\u30e5\u30fc:</h3>\n<div style=\"border: 1px solid #ccc; padding: 15px; margin: 10px 0;\">\n{{ $json.data }}\n</div>\n\n<h3>\u9001\u4fe1\u8005\u60c5\u5831:</h3>\n<p>\u9001\u4fe1\u8005\u540d: {{ $('Workflow Configuration').first().json.sender }}</p>\n<p>\u30bf\u30fc\u30b2\u30c3\u30c8: {{ $('Workflow Configuration').first().json.target }}</p>\n\n<hr>\n<p><a href=\"{{ $execution.resumeUrl }}\" style=\"background-color: #4CAF50; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px; display: inline-block;\">\u2705 \u627f\u8a8d\u3057\u3066\u914d\u4fe1\u3059\u308b</a></p>\n<p><small>\u203b\u3053\u306e\u30ea\u30f3\u30af\u306f24\u6642\u9593\u6709\u52b9\u3067\u3059\u3002\u30af\u30ea\u30c3\u30af\u3059\u308b\u3068\u5373\u5ea7\u306b\u914d\u4fe1\u304c\u958b\u59cb\u3055\u308c\u307e\u3059\u3002</small></p>",
        "options": {},
        "subject": "=\u3010\u627f\u8a8d\u4f9d\u983c\u3011\u30e1\u30eb\u30de\u30ac\u4e0b\u66f8\u304d: {{ $json.subject }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "9d590f19-10f3-45fb-86b4-ca914281a4d6",
      "name": "Wait for Approval",
      "type": "n8n-nodes-base.wait",
      "position": [
        1472,
        0
      ],
      "parameters": {
        "resume": "webhook",
        "options": {},
        "resumeAmount": 24,
        "limitWaitTime": true
      },
      "typeVersion": 1.1
    },
    {
      "id": "f9051562-acb1-4bb3-bc72-26bd6e70a585",
      "name": "Send Newsletter to Subscribers",
      "type": "n8n-nodes-base.sendGrid",
      "position": [
        1760,
        0
      ],
      "parameters": {
        "subject": "={{ $('Convert Markdown to HTML').first().json.subject }}",
        "toEmail": "={{ $('Workflow Configuration').first().json.subscriber_list }}",
        "fromName": "={{ $('Workflow Configuration').first().json.sender }}",
        "resource": "mail",
        "fromEmail": "<__PLACEHOLDER_VALUE__Verified sender email address in SendGrid__>",
        "contentType": "text/html",
        "contentValue": "={{ $('Convert Markdown to HTML').first().json.data }}",
        "additionalFields": {}
      },
      "typeVersion": 1
    },
    {
      "id": "80d61370-fbad-40e4-ba8d-20e5a7f7c894",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1216,
        -448
      ],
      "parameters": {
        "width": 1120,
        "height": 944,
        "content": "\n\n# Generate AI newsletters from form inputs and send via SendGrid\n\nStreamline your email marketing process with this AI-powered \"Human-in-the-Loop\" workflow. It allows you to generate high-quality, targeted newsletters from a simple form input, review them via email, and automatically distribute them to your subscribers upon approval.\n\n## ## Who is this for?\nDigital marketers, content creators, community managers, and small business owners who want to maintain consistent communication with their audience but need to reduce the time spent on drafting and formatting emails.\n\n## ## What does this workflow do?\n1. **Input Collection:** Starts with a user-friendly n8n Form where you input the newsletter topic, target audience, and sender details.\n2. **Data Logging:** Automatically saves the form responses to a Google Sheet for your records.\n3. **AI Generation:** Uses OpenAI (GPT-4o) to draft a catchy subject line and valuable body content formatted in Markdown based on your inputs.\n4. **Approval Process:** Sends a \"Review Request\" email to your inbox (via Gmail). This email contains a preview of the newsletter and a special link to approve it.\n5. **Execution Wait:** The workflow pauses and waits for you to click the approval link.\n6. **Distribution:** Once approved, it converts the Markdown to HTML and sends the final newsletter to your subscriber list using SendGrid.\n\n## ## Requirements\n- **OpenAI API Key:** To utilize GPT-4o for content generation.\n- **Google Cloud Account:** Required for the Google Sheets (logging) and Gmail (approval notifications) nodes.\n- **SendGrid Account:** Required for sending the final newsletter to your subscribers.\n- **n8n version:** Ensure you are using a version that supports the LangChain nodes.\n\n## ## How to set up\n1. **Configure Credentials:** Set up your credentials for OpenAI, Google (Sheets & Gmail), and SendGrid within n8n.\n2. **Subscriber List:** Open the **Workflow Configuration** node (Set node). Replace the placeholder with your comma-separated list of subscriber emails.\n3. **Google Sheets:** Create a Google Sheet with columns for `topic`, `target`, `sender`, and `admin_email`. Update the **Store Form Responses** node with your Document ID and Sheet Name.\n4. **Sender Verification:** In the **SendGrid** node, ensure the \"From Email\" matches a verified sender identity in your SendGrid account.\n5. **Test:** Click \"Test Workflow,\" fill out the Form Trigger URL, and check your email for the approval draft. Click the link in the email to finish the process.\n\n## ## How to customize\n- **Change the AI Model:** You can swap the OpenAI model node for Anthropic (Claude) or a local LLM if preferred.\n- **Adjust the Prompt:** Edit the system message in the **Generate Newsletter Content** agent node to change the tone or structure of the newsletter.\n- **Swap Email Providers:** If you don't use SendGrid or Gmail, simply replace these nodes with the email service of your choice (e.g., Mailchimp, Outlook, AWS SES)."
      },
      "typeVersion": 1
    },
    {
      "id": "832d6730-2bbd-4306-973d-2ae9d75ee8b5",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        128,
        -128
      ],
      "parameters": {
        "color": 6,
        "width": 224,
        "height": 336,
        "content": "1. **Input Collection:** Starts with a user-friendly n8n Form where you input the newsletter topic, target audience, and sender details."
      },
      "typeVersion": 1
    },
    {
      "id": "71e16864-54aa-41e5-b463-f98a2544a053",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -128
      ],
      "parameters": {
        "color": 5,
        "width": 192,
        "height": 336,
        "content": "2. **Data Logging:** Automatically saves the form responses to a Google Sheet for your records."
      },
      "typeVersion": 1
    },
    {
      "id": "d0d1b724-ff37-48f7-a1ae-74ba2094ac2c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -128
      ],
      "parameters": {
        "color": 4,
        "width": 288,
        "height": 496,
        "content": "3. **AI Generation:** Uses OpenAI (GPT-4o) to draft a catchy subject line and valuable body content formatted in Markdown based on your inputs."
      },
      "typeVersion": 1
    },
    {
      "id": "86e15543-ed45-4e28-97f0-6bbc1d6b1dcc",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        -128
      ],
      "parameters": {
        "color": 3,
        "width": 416,
        "height": 336,
        "content": "4. **Approval Process:** Sends a \"Review Request\" email to your inbox (via Gmail). This email contains a preview of the newsletter and a special link to approve it."
      },
      "typeVersion": 1
    },
    {
      "id": "0b102e74-f612-44c2-836c-cd198355689e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        -128
      ],
      "parameters": {
        "color": 2,
        "width": 192,
        "height": 336,
        "content": "5. **Execution Wait:** The workflow pauses and waits for you to click the approval link."
      },
      "typeVersion": 1
    },
    {
      "id": "6a3b5711-44be-4a22-9e2e-d7be4fb7fd21",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        -128
      ],
      "parameters": {
        "width": 246,
        "height": 336,
        "content": "6. **Distribution:** Once approved, it converts the Markdown to HTML and sends the final newsletter to your subscriber list using SendGrid."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "44f58a5a-f4eb-4397-bf8b-49dfeb779d98",
  "connections": {
    "Wait for Approval": {
      "main": [
        [
          {
            "node": "Send Newsletter to Subscribers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "JSON Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Generate Newsletter Content",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI GPT-4o Model": {
      "ai_languageModel": [
        [
          {
            "node": "Generate Newsletter Content",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Send Approval Email": {
      "main": [
        [
          {
            "node": "Wait for Approval",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store Form Responses": {
      "main": [
        [
          {
            "node": "Generate Newsletter Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Newsletter Input Form": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Store Form Responses",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert Markdown to HTML": {
      "main": [
        [
          {
            "node": "Send Approval Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Newsletter Content": {
      "main": [
        [
          {
            "node": "Convert Markdown to HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Streamline your email marketing process with this AI-powered "Human-in-the-Loop" workflow. It allows you to generate high-quality, targeted newsletters from a simple form input, review them via email, and automatically distribute them to your subscribers upon approval.

Source: https://n8n.io/workflows/11032/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This n8n workflow template automates your lead generation and follow-up process using AI. It captures leads through a form, enriches them with company data, classifies them into different categories,

Gmail, Output Parser Structured, Form Trigger +5
AI & RAG

The workflow runs every hour with a randomized delay of 5–20 minutes to help distribute load. It records the exact date and time a lead is emailed so you can track outreach. Follow-ups are automatical

Google Sheets, Agent, OpenAI Chat +5
AI & RAG

Transform your manual hiring process into an intelligent evaluation system that saves 15-20 minutes per candidate! This workflow automates the entire candidate assessment pipeline - from CSV/XLSX uplo

Form Trigger, Google Sheets, Google Drive +8
AI & RAG

This n8n workflow is designed for e-commerce businesses, digital marketers, and content creators who want to automatically generate professional 3D product videos from product images. It's perfect for

Form Trigger, Google Drive, HTTP Request +9
AI & RAG

[](https://www.youtube.com/watch?v=MD1krFvVKdU) Automatically extract, evaluate, and shortlist multiple resumes against a selected job description using GPT-4. This smart, scalable n8n workflow helps

Form Trigger, Output Parser Structured, OpenAI Chat +6