Back to Play 2 Resources
Play 2: Lead Qualification

Calendar Integration Guide (n8n + Google Calendar / Outlook)

Checking availability, booking meetings, sending calendar invites from n8n.

Calendar Integration Guide (n8n + Google Calendar / Outlook)

Automated calendar management separates firms that close deals from firms that lose them to scheduling friction. This guide shows you how to connect n8n to Google Calendar and Outlook, then build workflows that check availability, book meetings, and send invites without human intervention.

You'll walk away with working OAuth credentials, tested workflow templates, and specific node configurations you can deploy today.

Google Calendar Setup

Step 1: Create Google Cloud Project and Enable API

Navigate to console.cloud.google.com.

  1. Click "Select a project" dropdown (top left), then "New Project"
  2. Name it "n8n-calendar-integration" (or your firm name)
  3. Click "Create" and wait 10 seconds for provisioning
  4. In the left sidebar, go to "APIs
    & Services" > "Library"
  5. Search "Google Calendar API
    "
  6. Click the result, then click "Enable"

Step 2: Generate OAuth Credentials

Still in Google Cloud Console:

  1. Go to "APIs
    & Services" > "Credentials"
  2. Click "Create Credentials" > "OAuth client ID"
  3. If prompted to configure consent screen, click "Configure Consent Screen"
    • Select "Internal" if you're using Google Workspace (recommended)
    • Enter app name: "n8n Calendar Automation"
    • Add your email as support contact
    • Click "Save and Continue" through remaining screens
  4. Back at "Create OAuth client ID":
    • Application type: "Web application"
    • Name: "n8n Production"
    • Authorized redirect URIs: Add https://[YOUR-N8N-DOMAIN]/rest/oauth2-credential/callback
    • Replace [YOUR-N8N-DOMAIN] with your actual n8n URL (e.g., n8n.yourfirm.com)
  5. Click "Create"
  6. Copy the Client ID and Client Secret immediately (you'll need them in 30 seconds)

Step 3: Configure n8n Google Calendar Credential

In your n8n instance:

  1. Click your profile icon (bottom left) > "Settings" > "Credentials"
  2. Click "Add Credential"
  3. Search and select "Google Calendar OAuth2 API
    "
  4. Fill in:
    • Credential Name: "Google Calendar - [Your Name]"
    • Client ID: Paste from Step 2
    • Client Secret: Paste from Step 2
  5. Click "Save"
  6. Click "Connect my account"
  7. Authenticate in the popup window
  8. Verify you see "Connection successful" before closing

Test the credential: Create a new workflow, add a Google Calendar node, select your credential, set Operation to "Get All", and click "Execute Node". You should see your calendars listed.

Outlook Calendar Setup

Outlook requires Azure AD app registration. This takes 8-10 minutes the first time.

Step 1: Register Azure AD Application

Go to portal.azure.com.

  1. Search "Azure Active Directory" in the top search bar
  2. Click "App registrations" in left sidebar
  3. Click "New registration"
  4. Configure:
    • Name: "n8n Calendar Integration"
    • Supported account types: "Accounts in this organizational directory only"
    • Redirect URI: Select "Web" and enter https://[YOUR-N8N-DOMAIN]/rest/oauth2-credential/callback
  5. Click "Register"
  6. On the app overview page, copy the Application (client) ID and Directory (tenant) ID

Step 2: Create Client Secret

Still in your Azure app:

  1. Click "Certificates & secrets" in left sidebar
  2. Click "New client secret"
  3. Description: "n8n production key"
  4. Expires: 24 months (maximum allowed)
  5. Click "Add"
  6. Immediately copy the Value field (you cannot retrieve this again)

Step 3: Set API
Permissions

  1. Click "API
    permissions" in left sidebar
  2. Click "Add a permission"
  3. Select "Microsoft Graph"
  4. Select "Delegated permissions"
  5. Search and check these permissions:
    • Calendars.ReadWrite
    • Calendars.ReadWrite.Shared
    • offline_access
    • User.Read
  6. Click "Add permissions"
  7. Click "Grant admin consent for [Your Organization]" (requires admin rights)
  8. Confirm the action

Step 4: Configure n8n Microsoft Outlook Credential

In n8n:

  1. Go to "Settings" > "Credentials" > "Add Credential"
  2. Search and select "Microsoft Outlook OAuth2 API
    "
  3. Fill in:
    • Credential Name: "Outlook Calendar - Production"
    • Grant Type: "Authorization Code"
    • Authorization URL: https://login.microsoftonline.com/[TENANT-ID]/oauth2/v2.0/authorize
    • Access Token URL: https://login.microsoftonline.com/[TENANT-ID]/oauth2/v2.0/token
    • Client ID: Paste Application ID from Step 1
    • Client Secret: Paste secret value from Step 2
    • Scope: offline_access Calendars.ReadWrite User.Read
  4. Replace [TENANT-ID] with your Directory (tenant) ID from Step 1
  5. Click "Save"
  6. Click "Connect my account" and authenticate

Test the credential: Add a Microsoft Outlook node to a workflow, select Operation "Get All Events", set your credential, and execute. You should see recent calendar events.

Production Workflow: Availability Check and Auto-Booking

This workflow checks your calendar, finds the next available 30-minute slot, creates the meeting, and sends the invite.

Workflow Structure

Trigger: Webhook (when lead fills out "Request Meeting" form)

Node 1: Parse Webhook

Data

  • Extract lead email, name, preferred timezone

Node 2: Get Calendar Events (Google Calendar or Outlook)

  • Operation: "Get All"
  • Calendar: "primary" (or specific calendar ID)
  • Start Date: {{ $now.toISO() }}
  • End Date: {{ $now.plus({ days: 14 }).toISO() }}
  • Time Zone: {{ $json.timezone }}

Node 3: Function - Find Available Slot

// Define business hours
const businessStart = 9; // 9 AM
const businessEnd = 17; // 5 PM
const meetingDuration = 30; // minutes

const events = $input.all();
const busySlots = events.map(event => ({
  start: new Date(event.json.start.dateTime),
  end: new Date(event.json.end.dateTime)
}));

// Generate 30-min slots for next 14 days
const slots = [];
const now = new Date();
for (let day = 0; day < 14; day++) {
  const checkDate = new Date(now);
  checkDate.setDate(now.getDate() + day);
  
  for (let hour = businessStart; hour < businessEnd; hour++) {
    const slotStart = new Date(checkDate);
    slotStart.setHours(hour, 0, 0, 0);
    const slotEnd = new Date(slotStart);
    slotEnd.setMinutes(slotStart.getMinutes() + meetingDuration);
    
    // Check if slot conflicts with existing events
    const isAvailable = !busySlots.some(busy => 
      (slotStart >= busy.start && slotStart < busy.end) ||
      (slotEnd > busy.start && slotEnd &lt;= busy.end)
    );
    
    if (isAvailable) {
      slots.push({ start: slotStart, end: slotEnd });
    }
  }
}

return [{ json: { 
  nextAvailable: slots[0].start.toISOString(),
  meetingEnd: slots[0].end.toISOString()
}}];

Node 4: Create Calendar Event

  • Operation: "Create"
  • Calendar: "primary"
  • Summary: Meeting with {{ $('Webhook').item.json.leadName }}
  • Start: {{ $json.nextAvailable }}
  • End: {{ $json.meetingEnd }}
  • Attendees: {{ $('Webhook').item.json.leadEmail }}
  • Send Notifications: Yes

Node 5: Send Confirmation Email

  • Use your email node (Gmail, Outlook, SendGrid)
  • Subject: "Meeting Confirmed - {{ $('Function').item.json.nextAvailable }}"
  • Body template with meeting details and calendar attachment

Key Configuration Notes

Time Zone Handling: Always pass timezone explicitly. Use America/New_York, Europe/London, etc. Never rely on server defaults.

Conflict Prevention: The Function node checks both start and end times. A 2 PM meeting blocks 2:00-2:30, not just 2:00.

Buffer Time: Add 5-10 minutes between meetings by adjusting meetingDuration to 40 minutes while keeping actual meeting at 30.

Shared Calendars: For Outlook, use Calendars.ReadWrite.Shared permission and specify calendar ID instead of "primary".

Common Issues and Fixes

"Invalid credentials" error: Your OAuth token expired. Click "Reconnect" in the credential settings. Tokens last 1 hour (Google) or 90 days (Outlook) depending on refresh token configuration.

Events not appearing: Check calendar ID. "primary" works for personal calendars. Shared calendars need explicit IDs like user@domain.com or the calendar's unique identifier.

Timezone mismatches: n8n uses ISO 8601 format. Always include timezone offset (2024-01-15T14:00:00-05:00) or specify timezone parameter separately.

Rate limits: Google allows 1,000,000 queries/day. Outlook allows 10,000/10 minutes. Cache availability checks for 5-10 minutes if you're running high-volume workflows.

Attendee invites not sending: Set "Send Notifications" or "Send Invitations" to true in the Create Event operation. This is off by default in both platforms.

Bottom Line

Google Calendar setup takes 5 minutes. Outlook takes 10 minutes due to Azure AD complexity. Both integrations are stable and handle thousands of bookings per month without issues.

The availability-checking workflow above eliminates 90% of scheduling back-and-forth. Deploy it, test with your own calendar first, then roll out to your team's shared calendars.

Revenue Institute

Reviewed by Revenue Institute

This guide is actively maintained and reviewed by the implementation experts at Revenue Institute. As the creators of The AI Workforce Playbook, we test and deploy these exact frameworks for professional services firms scaling without new headcount.

Revenue Institute

Need help turning this guide into reality? Revenue Institute builds and implements the AI workforce for professional services firms.

RevenueInstitute.com