n8n Webhook Automation: Trigger a Workflow the Moment a Meeting Ends

n8n doesn't have a native "meeting ended" trigger, and neither does Zapier or Make — because none of them can see inside a Google Meet or Zoom call. The closest most people get is a calendar-based Cron or Trigger node keyed to the scheduled end time, which is wrong the moment a call runs long, ends early, or gets cancelled. Auto Join Meetings' outbound webhooks give n8n a real signal instead: an HTTP POST fired when a meeting you actually joined has actually ended.

The event you want: meeting.completed

Auto Join Meetings detects, in the browser, when you're really in a Google Meet or Zoom call — the same detection that confirms auto-join worked. When the meeting tab closes after that confirmed join, it fires a meeting.completed event to every webhook endpoint subscribed to it. The payload is intentionally small:

{
  "event_id": "b97431e8-dac2-41c1-8e14-e6086a48453f",
  "event_type": "meeting.completed",
  "timestamp": "2026-09-10T21:14:03.392Z",
  "provider": "google_meet",
  "meeting_id": "b0d1c8b2-..."
}

No meeting title, no participant list, no transcript — just enough to trigger and route your workflow.

Step 1: create the n8n Webhook trigger

Add a Webhook node as your workflow's trigger, set the method to POST, and copy the production URL n8n generates. That URL is what you'll register with Auto Join Meetings.

Step 2: register the endpoint

In the extension, open the Dashboard and click "Manage Webhooks." Paste your n8n Webhook URL, subscribe to meeting.completed, and save — the response includes a secret shown exactly once. Copy it into an n8n credential or environment variable now; you can't retrieve it again later. Click "Send test event" to confirm the Webhook node actually receives a request.

Step 3: verify the signature (recommended, not required)

Every delivery carries an X-AutoJoin-Signature header formatted as sha256=<hex digest> — an HMAC-SHA256 of the raw request body, keyed with the secret from Step 2. Add a Code node right after the Webhook node to check it before anything else runs:

const crypto = require('crypto');
const secret = $env.AUTOJOIN_WEBHOOK_SECRET;
const rawBody = JSON.stringify($input.item.json);
const expected = 'sha256=' + crypto
  .createHmac('sha256', secret)
  .update(rawBody)
  .digest('hex');

const received = $input.item.headers['x-autojoin-signature'];
if (expected !== received) {
  throw new Error('Signature mismatch — discarding delivery');
}
return $input.item;

This is what actually proves a request came from Auto Join Meetings and not from someone who guessed or intercepted your webhook URL. It's optional — the URL itself is already unguessable and shown to no one but you — but worth the ten extra lines if the workflow does anything sensitive downstream.

Step 4: branch on event_type and act

Add an IF node checking event_type === "meeting.completed", then wire in whatever comes next: an HTTP Request node to your CRM's API, a Slack node, a database insert, or a call to another n8n workflow entirely. Because the trigger only fires on a real, confirmed meeting end, whatever you build downstream only runs for calls that actually happened — not every scheduled one.

What n8n gives you that a pre-built integration doesn't

Auto Join Meetings' Complete plan already includes one-click integrations for Slack, HubSpot, Salesforce, Microsoft To Do, Asana, and ClickUp if you just want a Task created without building anything. The webhook + n8n path is for everything past that: custom branching logic, multiple downstream systems from one event, or a self-hosted stack where you'd rather not depend on our servers holding your integration credentials at all.

Give your n8n workflow a real trigger to work with.

Install Auto Join Meetings — Free

Related: Why calendar automation misses reality · Log client calls to your CRM with Zapier · Send follow-ups to ClickUp · Integrations help article