Calendar Integration: n8n + Google / 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.
- Click "Select a project" dropdown (top left), then "New Project"
- Name it "n8n-calendar-integration" (or your firm name)
- Click "Create" and wait 10 seconds for provisioning
- In the left sidebar, go to "APIs APIsApplication Programming Interface. The connection point that lets two pieces of software exchange data. How n8n talks to your CRM. & Services" > "Library"
- Search "Google Calendar API"
- Click the result, then click "Enable"
Step 2: Generate OAuth Credentials
Still in Google Cloud Console:
- Go to "APIs & Services" > "Credentials"
- Click "Create Credentials" > "OAuth client ID"
- 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
- 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)
- Click "Create"
- 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:
- Click your profile icon (bottom left) > "Settings" > "Credentials"
- Click "Add Credential"
- Search and select "Google Calendar OAuth2 API"
- Fill in:
- Credential Name: "Google Calendar - [Your Name]"
- Client ID: Paste from Step 2
- Client Secret: Paste from Step 2
- Click "Save"
- Click "Connect my account"
- Authenticate in the popup window
- 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.
- Search "Azure Active Directory" in the top search bar
- Click "App registrations" in left sidebar
- Click "New registration"
- 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
- Click "Register"
- On the app overview page, copy the Application (client) ID and Directory (tenant) ID
Step 2: Create Client Secret
Still in your Azure app:
- Click "Certificates & secrets" in left sidebar
- Click "New client secret"
- Description: "n8n production key"
- Expires: 24 months (maximum allowed)
- Click "Add"
- Immediately copy the Value field (you cannot retrieve this again)
Step 3: Set API Permissions
- Click "API permissions" in left sidebar
- Click "Add a permission"
- Select "Microsoft Graph"
- Select "Delegated permissions"
- Search and check these permissions:
Calendars.ReadWriteCalendars.ReadWrite.Sharedoffline_accessUser.Read
- Click "Add permissions"
- Click "Grant admin consent for [Your Organization]" (requires admin rights)
- Confirm the action
Step 4: Configure n8n Microsoft Outlook Credential
In n8n:
- Go to "Settings" > "Credentials" > "Add Credential"
- Search and select "Microsoft Outlook OAuth2 API"
- 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
- Replace
[TENANT-ID]with your Directory (tenant) ID from Step 1 - Click "Save"
- 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 WebhookA way for one app to send real-time data to another the instant an event happens. Example: DocuSign pings n8n the moment a contract is signed. 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 <= 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.
Related Resources
Bland Voice Agent Setup Guide
Set up Bland AI as your outbound and inbound voice agent - account configuration, voice and script tuning, latency calibration, and n8n webhook integration for lead routing.
How to Build a Custom Chatbot (No Code Guide)
Using Claude Code / GPT Codex to generate a chat widget, then connecting to n8n via webhook.
Lead Qualification Criteria Template
Fill-in template: 5 qualifying signals, 5 disqualifying signals, confidence thresholds.
The full system, end to end.
Looking to build your AI workforce? Get the comprehensive guide for professional services - the 12 plays, the frameworks, and the field-tested playbooks.
Buy on Amazon
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.
Get the Book
Need help turning this guide into reality?
Revenue Institute builds and implements the AI workforce for professional services firms.
Work with Revenue Institute