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.
- 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& Services" > "Library"APIsClick to read the full definition in our AI & Automation Glossary.
- Search "Google Calendar API"APIClick to read the full definition in our AI & Automation Glossary.
- Click the result, then click "Enable"
Step 2: Generate OAuth Credentials
Still in Google Cloud Console:
- Go to "APIs& Services" > "Credentials"APIsClick to read the full definition in our AI & Automation Glossary.
- 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"APIClick to read the full definition in our AI & Automation Glossary.
- 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 APIClick to read the full definition in our AI & Automation Glossary. Permissions
- Click "APIpermissions" in left sidebarAPIClick to read the full definition in our AI & Automation Glossary.
- 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"APIClick to read the full definition in our AI & Automation Glossary.
- 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
- 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.

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.