Automatic meeting prep brief

When a meeting is booked, get a short AI brief about the company you're meeting.

Advanced Saves ~4 hours/month Sales & CRMBy Flowngn team

Works with n8n · Make · Zapier

How it works

Trigger: Google Calendar — event created
  1. Get the external attendee's email domain from the new event.
  2. Fetch the company's homepage.
  3. Ask an AI model to summarise what the company does and suggest 3 questions.
  4. Email the brief to yourself.

Diagram

CMeeting bookedGoogle Calendar Trigger{ }Find company domainCodeFetch homepageHTTP Request</>Extract page textHTMLWrite briefBasic LLM ChainClaude modelAnthropic Chat Mo…GEmail me the briefGmail
Trigger App Logic Code AI

Code

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

Find company domain · Code node
// Finds the first attendee outside your company. Stops the flow for internal meetings.
const MY_DOMAIN = "yourcompany.com";
const event = $input.first().json;

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

if (!external) return [];

return [{
  json: {
    domain: external.split("@")[1],
    meeting: event.summary,
    start: event.start?.dateTime,
  },
}];

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 (225 lines)
{
  "name": "Automatic meeting prep brief (Flowngn)",
  "nodes": [
    {
      "parameters": {
        "content": "## Automatic meeting prep brief\nWhen a meeting is booked, get a short AI brief about the company you're meeting.\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": "eventCreated",
        "options": {}
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Meeting booked",
      "type": "n8n-nodes-base.googleCalendarTrigger",
      "typeVersion": 1,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "jsCode": "// Finds the first attendee outside your company. Stops the flow for internal meetings.\nconst MY_DOMAIN = \"yourcompany.com\";\nconst event = $input.first().json;\n\nconst external = (event.attendees || [])\n  .map((a) => a.email)\n  .find((email) => email && !email.endsWith(`@${MY_DOMAIN}`));\n\nif (!external) return [];\n\nreturn [{\n  json: {\n    domain: external.split(\"@\")[1],\n    meeting: event.summary,\n    start: event.start?.dateTime,\n  },\n}];"
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Find company domain",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        300,
        0
      ]
    },
    {
      "parameters": {
        "url": "=https://{{ $json.domain }}",
        "options": {}
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Fetch homepage",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        600,
        0
      ]
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "text",
              "cssSelector": "body"
            }
          ]
        },
        "options": {
          "trimValues": true,
          "cleanUpText": true
        }
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Extract page text",
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        900,
        0
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=I have a meeting with {{ $('Find company domain').item.json.domain }}. Here is their homepage text:\n\n{{ $json.text.slice(0, 6000) }}\n\nWrite a short brief: what they do (2 sentences), who their customers are, and 3 smart questions to ask."
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Write brief",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.5,
      "position": [
        1200,
        0
      ]
    },
    {
      "parameters": {
        "model": {
          "__rl": true,
          "value": "claude-sonnet-5",
          "mode": "list"
        },
        "options": {}
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Claude model",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "typeVersion": 1.3,
      "position": [
        1200,
        220
      ]
    },
    {
      "parameters": {
        "sendTo": "you@yourcompany.com",
        "subject": "=Brief: {{ $('Find company domain').item.json.meeting }}",
        "emailType": "text",
        "message": "={{ $json.text }}",
        "options": {
          "appendAttribution": false
        }
      },
      "id": "2f782c3a-d667-4b30-a367-e87c52c39ad5",
      "name": "Email me the brief",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1500,
        0
      ]
    }
  ],
  "connections": {
    "Meeting booked": {
      "main": [
        [
          {
            "node": "Find company domain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find company domain": {
      "main": [
        [
          {
            "node": "Fetch homepage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch homepage": {
      "main": [
        [
          {
            "node": "Extract page text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract page text": {
      "main": [
        [
          {
            "node": "Write brief",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write brief": {
      "main": [
        [
          {
            "node": "Email me the brief",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude model": {
      "ai_languageModel": [
        [
          {
            "node": "Write brief",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "tags": []
}

Open in the playground to edit →

Tips

  • Skip events where every attendee is from your own domain.

Related flows