<aside> 📌
Workflow ID: pStGJY9nBWvTz-cVsJXha · instance: n8n.prhomelab.com · trigger: every 30 minutes · tag: DEV
</aside>
Every 30 minutes, reads all workflows from the n8n instance via REST API, extracts scheduleTrigger and cron nodes, compares the live state against a Google Sheets state store, and syncs Google Calendar with recurring events representing each workflow's schedule.
State (Calendar EventID, schedule string, On Calendar flag) is persisted in a Google Sheets tab.
flowchart LR
A["Schedule Trigger\nevery 30 min"] --> B["Get many workflows\nn8n REST API"]
B --> C["Code: parsing\nextracts scheduleTrigger/cron"]
C --> D["Code: save current values\nsnapshots live fields"]
D --> E["Sheets: Lookup\nreads saved state"]
E --> F["Code: manual merge\njoins live + Sheets"]
F --> G["Code: detect changes\ncreate / update / skip"]
G -->|create| H["Remove Duplicates"]
G -->|update| H
G -->|update| I["Code: split eventIds\nfor old event deletion"]
H --> J["Code: RRULE\nbuild GCal payload"]
J --> K["Create an event\nGoogle Calendar"]
K --> L["Code: post-create\naggregates event IDs"]
L --> M["Sheets: OnCalendar=YES\nupdates state store"]
I --> N["Delete old event\nGoogle Calendar"]
| Resource | Purpose | Notes |
|---|---|---|
| n8n instance with API enabled | Read workflow list | Self-hosted or cloud |
| Google Cloud Project | Service Account + OAuth2 | Same GCP project for both |
| Google Sheets | State store | Sheet ID hardcoded in workflow |
| Google Calendar | Event destination | Account [email protected] |
| Error workflow | Error notifications | ID: 0Ye3A2hKHqZJlJ0d |