Back to Templates

Sync workflow schedules between Google Sheets and Google Calendar

Created by

Created by: Paolo Ronco || paoloronco
Paolo Ronco

Last update

Last update 3 days ago

Categories

Share


Sync n8n Workflow Schedules to Google Calendar

Reads every workflow on your n8n instance every 30 minutes, extracts their schedule triggers, and keeps a matching recurring event on Google Calendar — one event per workflow, forever in sync.

How it works

Schedule Trigger (30 min)
  → GET /api/v1/workflows          — fetch all workflows
  → Code: parsing                  — extract scheduleTrigger / cron nodes
  → Sheets: Lookup                 — read saved state (schedule, On Calendar, EventID)
  → Code: detect changes           — create / update / skip
       ├─ create → build RRULE payload → Create event → write EventID to Sheets
       └─ update → delete old event (parallel) + create new event → write to Sheets

State is stored in a Google Sheets tab (n8n Scheduling). The sheet acts as the single source of truth between runs.

What gets a Calendar event

Schedule type Result
Daily DAILY recurring event
Weekly (with or without specific days) WEEKLY recurring event
Monthly MONTHLY recurring event
Hourly 1 DAILY event at 00:MM (not 24 — avoids GCal rate limit)
Cron / minutely Skipped — not supported by Google Calendar RRULE
This workflow itself Always skipped

Prerequisites

  • n8n instance with API enabled
  • Google Cloud project with:
    • Service Account (for Sheets — never expires)
    • OAuth 2.0 client (for Google Calendar — expires periodically)
  • A Google Sheets spreadsheet shared with the Service Account
  • A Google Calendar to write events to

Credentials

n8n credential type Used for
n8n API Reading the workflow list
Google Calendar OAuth2 API Creating / deleting Calendar events
Google Service Account Reading and writing the Sheets state store

⚠️ The Google Calendar OAuth2 credential expires. Reconnect it from Settings → Credentials when Calendar nodes start failing.

Setup

Full step-by-step setup in documentation.md.

Known limits

  • OAuth token expiry breaks sections D/E silently — set up the error workflow to get notified
  • Hourly schedules map to a single daily event (label includes ogni ora :MM)
  • The disconnected Webhook sub-flow (section F) is a manual maintenance utility — not part of the main pipeline