AutomationFlowsEmail & Gmail › Create & Send Client Session Summaries From Zoom Meetings via Gmail and Airtable

Create & Send Client Session Summaries From Zoom Meetings via Gmail and Airtable

ByLuisBetancourt.co @luisbetancourtco on n8n.io

Whenever a Zoom “Meeting assets” email arrives in your Gmail inbox, this workflow will:

Event trigger★★★★☆ complexity8 nodesGmail TriggerHTTP RequestGmail
Email & Gmail Trigger: Event Nodes: 8 Complexity: ★★★★☆ Added:

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

This workflow follows the Gmail → Gmail 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
{
  "name": "Meeting Assets: Summary, Next Steps & Recording",
  "nodes": [
    {
      "name": "Note: Gmail Creds",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        100
      ],
      "parameters": {
        "notesInFlow": "\ud83d\udcd2 Configure your Gmail OAuth2 credentials in n8n before activating this workflow."
      },
      "typeVersion": 1
    },
    {
      "name": "Gmail Trigger",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        200,
        250
      ],
      "parameters": {
        "filters": {
          "string": [
            {
              "value1": "Meeting assets",
              "operation": "contains"
            }
          ]
        },
        "triggerTimes": {
          "item": [
            {
              "unit": "minutes",
              "every": 1
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Extract Fields",
      "type": "n8n-nodes-base.function",
      "position": [
        400,
        250
      ],
      "parameters": {
        "functionCode": "// Extract fields from email\nconst html = item.json.text || '';\nconst match = (re) => { const m = html.match(re); return m ? m[1].trim() : '' };\nitem.json.clientName      = match(/Meeting assets for [\\s\\S]*?\\(([^)]+)\\)\\s+with/);\nitem.json.sessionType     = match(/\\b(\\d+\\s*hora(?:s)?|exploratory call)\\b/i);\nconst dt = html.match(/GMT(\\d{4})(\\d{2})(\\d{2})-(\\d{2})(\\d{2})(\\d{2})/);\nif (dt) {\n  item.json.dateTimeUTC = `${dt[1]}-${dt[2]}-${dt[3]}T${dt[4]}:${dt[5]}:${dt[6]}Z`;\n}\nitem.json.duration        = match(/Duration:\\s*([0-9]{1,2}:[0-9]{2}:[0-9]{2})/i);\nitem.json.recordingLink   = match(/(https:\\/\\/us02web\\.zoom\\.us\\/recording\\/detail\\?[^)\\s]+)/);\nitem.json.quickSummary    = match(/RESUMEN R\u00c1PIDO[\\s\\S]*?\\n([\\s\\S]*?)\\nPR\u00d3XIMOS PASOS/);\nitem.json.nextSteps       = match(/PR\u00d3XIMOS PASOS[\\s\\S]*?\\n([\\s\\S]*?)\\nRESUMEN/);\nitem.json.detailedSummary = match(/RESUMEN(?!\\s*R\u00c1PIDO)\\s*([\\s\\S]*?)(?=\\s*(?:PR\u00d3XIMOS PASOS|AI can make mistakes))/i);\nreturn item;"
      },
      "typeVersion": 1
    },
    {
      "name": "If Exploratory",
      "type": "n8n-nodes-base.if",
      "position": [
        600,
        250
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.sessionType }}",
              "value2": "exploratory call",
              "operation": "notContains"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Airtable: Search People",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        800,
        200
      ],
      "parameters": {
        "qs": {
          "filterByFormula": "={Full Name} = '{{ $json.clientName }}'"
        },
        "url": "https://api.airtable.com/v0/{{$env.AIRTABLE_BASE_ID}}/People",
        "headerAuth": {
          "name": "Authorization",
          "value": "Bearer {{$credentials.airtableApi.token}}"
        },
        "requestMethod": "GET",
        "authentication": "headerAuth"
      },
      "typeVersion": 1
    },
    {
      "name": "Send Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1000,
        200
      ],
      "parameters": {
        "html": "<p>Hi {{$json.clientName}},</p>\n<p>Here\u2019s your session details:</p>\n<ul>\n  <li>Type: {{$json.sessionType}}</li>\n  <li>Date & Time: {{$json.dateTimeUTC}}</li>\n  <li>Duration: {{$json.duration}}</li>\n  <li><a href=\"{{$json.recordingLink}}\">Watch Recording</a></li>\n</ul>\n<h3>Quick Summary</h3>\n<p>{{$json.quickSummary}}</p>\n<h3>Next Steps</h3>\n<p>{{$json.nextSteps}}</p>\n<h3>Detailed Summary</h3>\n<p>{{$json.detailedSummary}}</p>",
        "subject": "Your Session Summary & Recording",
        "toEmail": "={{ $node[\"Airtable: Search People\"].json.records[0].fields.Email }}"
      },
      "typeVersion": 1
    },
    {
      "name": "Airtable: Create Session",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1200,
        200
      ],
      "parameters": {
        "url": "https://api.airtable.com/v0/{{$env.AIRTABLE_BASE_ID}}/Sessions",
        "requestMethod": "POST",
        "jsonParameters": true,
        "bodyParametersJson": "{\n  \"fields\": {\n    \"Date & Time\": \"{{$json.dateTimeUTC}}\",\n    \"Duration\": \"{{$json.duration}}\",\n    \"Quick Summary\": \"{{$json.quickSummary}}\",\n    \"Detailed Summary\": \"{{$json.detailedSummary}}\",\n    \"Next Steps\": \"{{$json.nextSteps}}\",\n    \"Client\": [\"{{$node[\"Airtable: Search People\"].json.records[0].id}}\"]\n  }\n}",
        "headerParametersJson": "{\"Authorization\":\"Bearer {{$credentials.airtableApi.token}}\",\"Content-Type\":\"application/json\"}"
      },
      "typeVersion": 1
    },
    {
      "name": "Note: Airtable Creds",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1000,
        350
      ],
      "parameters": {
        "notesInFlow": "\ud83d\udd10 Store your Airtable API token securely in n8n Credentials (airtableApi.token)."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "connections": {
    "Gmail Trigger": {
      "main": [
        [
          {
            "node": "Extract Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Fields": {
      "main": [
        [
          {
            "node": "If Exploratory",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Exploratory": {
      "main": [
        [
          {
            "node": "Airtable: Search People",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Airtable: Search People": {
      "main": [
        [
          {
            "node": "Send Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Airtable: Create Session",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "description": "## Description\n\nWhenever a Zoom **Meeting assets** email arrives in your Gmail inbox, this workflow:\n\n1. **Triggers** on new Gmail messages filtered by \u201cMeeting assets.\u201d\n2. **Extracts** from the email:\n   - Session type (e.g.\u00a0\u201c1 hour\u201d, \u201c2 hours\u201d, \u201cexploratory call\u201d).\n   - Client\u2019s full name.\n   - Session date\u00a0&\u00a0time (from the `GMT\u2026` timestamp).\n   - Duration (`HH:MM:SS`).\n   - Recording link.\n   - Quick summary, detailed summary & next steps.\n3. **Looks up** the client in Airtable \u201cPeople\u201d by full name via HTTP Request.\n4. **Sends** a personalized Gmail to the client.\n5. **Creates** a new record in Airtable \u201cSessions\u201d linking back to that client.\n\n> \ud83d\udcd2 Sticky notes guide credential setup.\n> \ud83d\udd10 No API keys are hard\u2011coded\u2014use n8n credentials."
}
Pro

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

About this workflow

Whenever a Zoom “Meeting assets” email arrives in your Gmail inbox, this workflow will:

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

AICARE Email Blast System. Uses googleDrive, httpRequest, googleSheets, gmail. Event-driven trigger; 39 nodes.

Google Drive, HTTP Request, Google Sheets +2
Email & Gmail

Client Form → Draft → Approve → Sign → Deliver, fully automated

Jot Form Trigger, Gmail, Google Drive +4
Email & Gmail

ResultAnalyser. Uses gmailTrigger, executeCommand, httpRequest, gmail. Event-driven trigger; 23 nodes.

Gmail Trigger, Execute Command, HTTP Request +1
Email & Gmail

An automated n8n workflow that monitors your Gmail inbox, classifies job application emails using a local AI (Ollama), and logs every application — with company, role, and status — to a Google Sheet i

Gmail, Gmail Trigger, HTTP Request +1
Email & Gmail

Automatically transform resume submissions into comprehensive candidate profiles with AI-powered parsing, GitHub analysis, and instant team notifications. Monitors Gmail for incoming resume attachment

Gmail, Gmail Trigger, @Vlm Run/N8N Nodes Vlmrun +3