AI cold email drafts from each prospect's website

Add a prospect to a sheet; AI reads their website and drafts a short, personal email in Gmail for you to check.

Medium Saves ~8 hours/month Sales & CRMBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Google Sheets — new row in Prospects
  1. Add a prospect (name, role, company, website, email).
  2. Fetch their website and pull out the text.
  3. AI writes a 70–100 word email with one true, specific observation.
  4. Save it as a Gmail draft, ready for you to edit and send.

Diagram

GNew prospectGoogle Sheets TriggerFetch their websiteHTTP Request</>Extract page textHTMLWrite the emailBasic LLM ChainClaude modelAnthropic Chat Mo…GSave as Gmail draftGmail
Trigger App Logic AI

Build it

Pick your tool — same automation, step by step.

Copy and paste straight into an n8n canvas (Ctrl+V), or download and use Import from File. Then connect your own credentials and replace every YOUR_… placeholder. AI steps use a Claude model node — swap it for OpenAI, Gemini or Ollama if you prefer.

Workflow JSON
Show code (209 lines)
{
  "name": "AI cold email drafts from each prospect's website (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## AI cold email drafts from each prospect's website\nAdd a prospect to a sheet; AI reads their website and drafts a short, personal email in Gmail for you to check.\n\n**Setup**\n1. Open each node and connect your own credentials.\n2. Replace every YOUR_… placeholder.\n3. Test once, then activate.\n\nFree template from Flowngn",
        "height": 260,
        "width": 340
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "documentId": {
          "__rl": true,
          "value": "YOUR_SPREADSHEET_ID",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "Prospects",
          "mode": "name"
        },
        "event": "rowAdded",
        "options": {}
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "New prospect",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.website }}",
        "options": {
          "timeout": 15000
        }
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "Fetch their website",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        300,
        0
      ],
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "text",
              "cssSelector": "body"
            }
          ]
        },
        "options": {
          "trimValues": true,
          "cleanUpText": true
        }
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "Extract page text",
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=You write short cold emails for YOUR_COMPANY. We offer: YOUR_OFFER.\nProspect: {{ $('New prospect').item.json.name }}, {{ $('New prospect').item.json.role }} at {{ $('New prospect').item.json.company }}.\nTheir website says:\n{{ ($json.text || '').slice(0, 4000) }}\n\nWrite a 70-100 word email: one specific, true observation about their business, how we could help, and a soft question as the call to action. No flattery, no made-up facts, no links. Write in the language their website uses. Reply with the email body only."
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "Write the email",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        900,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        900,
        220
      ]
    },
    {
      "parameters": {
        "resource": "draft",
        "operation": "create",
        "subject": "=Quick idea for {{ $('New prospect').item.json.company }}",
        "message": "={{ $json.text }}",
        "options": {
          "sendTo": "={{ $('New prospect').item.json.email }}"
        }
      },
      "id": "292cf932-28a7-45bc-ae4f-0228a58340af",
      "name": "Save as Gmail draft",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1200,
        0
      ]
    }
  ],
  "connections": {
    "New prospect": {
      "main": [
        [
          {
            "node": "Fetch their website",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch their website": {
      "main": [
        [
          {
            "node": "Extract page text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract page text": {
      "main": [
        [
          {
            "node": "Write the email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write the email": {
      "main": [
        [
          {
            "node": "Save as Gmail draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Write the email",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Only email people where you have a lawful reason to, and always include an easy way to opt out.

Related flows