Follow-up email draft after meetings

When a meeting ends, a follow-up email draft is waiting for you.

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

Works with n8n · Make · Zapier

How it works

Trigger: Google Calendar — event ended
  1. Detect when a meeting ends.
  2. Collect the guests' email addresses.
  3. Create a Gmail draft thanking them, ready for you to add notes and send.

Diagram

CMeeting endedGoogle Calendar Trigger{ }External guestsCodeGCreate follow-up dr…Gmail
Trigger App Code

Code

JavaScript used in the Code step — already included in the template below.

External guests · Code node
// Collects external guests from the meeting that just ended.
// Stops for internal meetings or events without guests.
const MY_DOMAIN = "yourcompany.com";
const event = $input.first().json;

const guests = (event.attendees || [])
  .map((a) => a.email)
  .filter((email) => email && !email.endsWith(`@${MY_DOMAIN}`));

if (!guests.length) return [];

return [{ json: { to: guests.join(","), meeting: event.summary } }];

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.

Workflow JSON
Show code (110 lines)
{
  "name": "Follow-up email draft after meetings (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Follow-up email draft after meetings\nWhen a meeting ends, a follow-up email draft is waiting for you.\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": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Setup notes",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -420,
        -60
      ]
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "calendarId": {
          "__rl": true,
          "value": "primary",
          "mode": "id"
        },
        "triggerOn": "eventEnded",
        "options": {}
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Meeting ended",
      "type": "n8n-nodes-base.googleCalendarTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Collects external guests from the meeting that just ended.\n// Stops for internal meetings or events without guests.\nconst MY_DOMAIN = \"yourcompany.com\";\nconst event = $input.first().json;\n\nconst guests = (event.attendees || [])\n  .map((a) => a.email)\n  .filter((email) => email && !email.endsWith(`@${MY_DOMAIN}`));\n\nif (!guests.length) return [];\n\nreturn [{ json: { to: guests.join(\",\"), meeting: event.summary } }];"
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "External guests",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "resource": "draft",
        "operation": "create",
        "subject": "=Thanks for today — {{ $json.meeting }}",
        "message": "=Hi,\n\nThanks for your time today! As promised, here's a quick summary:\n\n- [key point]\n- [next step + owner]\n\nLet me know if I missed anything.\n\nBest,\nYOUR_NAME",
        "options": {
          "sendTo": "={{ $json.to }}"
        }
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Create follow-up draft",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        600,
        0
      ]
    }
  ],
  "connections": {
    "Meeting ended": {
      "main": [
        [
          {
            "node": "External guests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "External guests": {
      "main": [
        [
          {
            "node": "Create follow-up draft",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Add an AI step that writes the draft from notes in the event description.

Related flows