DEV Community

AgoraIntelligence
AgoraIntelligence

Posted on

Stop Copying Meeting Details from Email to Calendar — Automate It with n8n and GPT-4o-mini

Stop Copying Meeting Details from Email to Calendar — Automate It with n8n and GPT-4o-mini

You receive a Calendly confirmation. Or a Zoom invite. Or an email that says "let's meet Tuesday at 3pm."

Every time, you open your calendar, create an event, copy the link, paste the details. Then you spend 5 minutes skimming the email thread trying to remember what the meeting is actually about before it starts.

This workflow eliminates both steps: it reads your Gmail every 15 minutes, detects meeting-related emails, creates the calendar event automatically, and sends you an AI-generated prep brief to Slack before you even open your inbox.

What It Detects

The workflow uses GPT-4o-mini to classify incoming emails. It catches:

  • Zoom / Google Meet / Teams confirmations — the standard automated confirmations from each platform
  • Calendly booking confirmations — "Your meeting with X has been confirmed"
  • Informal meeting requests — "Let's catch up Wednesday at 2pm" in a regular email
  • Flight and hotel reservations — date + time + location = calendar event
  • Restaurant reservations — same pattern
  • Calendar invitations forwarded via email

It ignores newsletters, marketing emails, no-reply senders, and promotional content. You configure the filter list once in the CONFIG node.

The Output

For each detected meeting, the workflow:

  1. Creates a Google Calendar event with title, date, time, duration, location, and video link pre-filled
  2. Generates a meeting brief via AI — context summary, 3-4 talking points, 2-3 questions to prepare
  3. Sends the brief to Slack with a direct link to the calendar event
  4. Logs the entry to Google Sheets — date, email subject, event created, AI brief status

The Slack message looks like this:

📅 Meeting Created: Discovery Call with Acme Corp
📍 Tuesday 29 Jul, 15:00 — 16:00 (Google Meet)
🔗 meet.google.com/abc-defg-hij

📋 Context: Acme Corp is exploring automation solutions for their sales team. 
They mentioned a current Zapier setup they want to move off of.

💡 Talking points:
• Their current Zapier spend and what's breaking
• Which workflows they need first
• Their technical setup (CRM, email tool, data sources)

❓ Questions to prepare:
• Who makes the final decision on tools?
• What's the timeline for implementation?
Enter fullscreen mode Exit fullscreen mode

Workflow Architecture

Schedule (every 15 min)
  → Gmail: Read unread emails (last 30 min)
  → Filter: Remove newsletters/no-reply
  → OpenAI: Classify — is this a meeting? (YES/NO + extracted details)
  → IF YES:
      → Google Calendar: Create event
      → OpenAI: Generate prep brief
      → Slack: Send brief + calendar link
      → Gmail: Mark as read + label "calendar-added"
      → Sheets: Log entry
  → IF NO: Skip
Enter fullscreen mode Exit fullscreen mode

The AI Extraction Prompt

This is the most important node — the quality of the calendar event depends on how well you extract from the email:

You are a scheduling assistant. Extract meeting details from this email.

Email subject: {{subject}}
Email body: {{body}}
Sender: {{from}}
Today's date: {{today}}

Return a JSON object with:
{
  "is_meeting": true/false,
  "title": "Meeting title (descriptive, not the email subject)",
  "date": "YYYY-MM-DD",
  "time": "HH:MM",
  "duration_minutes": 60,
  "timezone": "Europe/Madrid",
  "video_link": "https://... or null",
  "location": "physical address or null",
  "attendees": ["email1", "email2"],
  "context": "2-3 sentence summary of what this meeting is about",
  "confidence": 0.0-1.0
}

If is_meeting is false, return only {"is_meeting": false}.
Only return the JSON object, no other text.
Enter fullscreen mode Exit fullscreen mode

Set a confidence threshold (e.g. 0.7) — below that, skip the event creation and log it for manual review instead.

Gmail Deduplication

The biggest practical problem with email-to-calendar workflows: you don't want the same meeting created twice if you receive multiple confirmation emails (original invite + reminder + updated time).

Two solutions:

Option A — Label-based: After processing an email, add a Gmail label calendar-added. The next run filters out emails with this label.

Option B — Sheets-based: Log the email Message-ID to a Sheets column and check for duplicates before creating the event.

Label-based is simpler and more reliable. Add a Gmail node at the end of the success branch:

Gmail → Modify Message → Add Label: calendar-added
Enter fullscreen mode Exit fullscreen mode

On the read step, filter: is:unread -label:calendar-added newer_than:1h

Handling Timezone Ambiguity

"Meet Tuesday at 3pm" — 3pm where?

The prep brief prompt includes your configured timezone. If the email doesn't specify, the workflow defaults to your timezone. Add a note to the Slack message when timezone was assumed rather than explicit:

const timezoneNote = detectedTimezone 
  ? `🌍 Timezone: ${detectedTimezone}` 
  : `⚠️ Timezone assumed: ${CONFIG.default_timezone}`;
Enter fullscreen mode Exit fullscreen mode

Cost

At 50 emails/day processed through GPT-4o-mini:

  • Classification call: ~200 tokens per email → $0.003/day
  • Brief generation (meetings only, ~20% of emails): ~500 tokens → $0.0015/day
  • Total: ~$0.0045/day → ~$1.35/month

For a professional who books 5-10 meetings per week, the time saved (5+ minutes per meeting) pays back the cost in the first hour of the first day.

The CONFIG Node

One node controls everything:

const CONFIG = {
  gmail_credential: "your-gmail-oauth-credential-id",
  calendar_id: "primary",  // or specific calendar ID
  slack_webhook: "https://hooks.slack.com/services/...",
  sheets_id: "your-spreadsheet-id",
  openai_credential: "your-openai-credential-id",

  // Your profile (personalizes the brief)
  your_name: "Igor",
  your_role: "Automation consultant",
  your_company: "Agora Intelligence",

  // Filter: emails from these domains are always skipped
  skip_domains: ["mailchimp.com", "klaviyo.com", "newsletter"],
  skip_senders: ["noreply", "no-reply", "donotreply"],

  // Minimum confidence to create a calendar event (0-1)
  confidence_threshold: 0.7,

  // Default timezone when not specified in email
  default_timezone: "Europe/Madrid"
};
Enter fullscreen mode Exit fullscreen mode

Get the Complete Workflow

The full 18-node workflow — with Gmail deduplication, confidence thresholds, timezone handling, Slack formatting, and Sheets logging — is available at n8nmarkets.com. Search "Email to Calendar AI Meeting Prep".

Includes the workflow JSON, Google Sheets template, and setup guide for Gmail OAuth (the most common friction point).


What meeting-related emails do you receive most often? The workflow handles standard confirmations well, but I'm curious what edge cases people run into — forwarded invites, multi-timezone teams, recurring meetings with agenda updates.

Top comments (0)