n8n Workflow
Advanced

Sync Discord Scheduled Events to Google Calendar

Automate the syncing of your Discord server's scheduled events directly to your Google Calendar. This workflow ensures your calendar is always up-to-date with your community's plans.

Overview

Automatically syncs Discord scheduled events with Google Calendar to keep community members and organizers aligned across platforms without manual entry.

🧠 Description & Use Case

This workflow automatically synchronizes scheduled events from a Discord server to a Google Calendar, ensuring that your calendar always reflects the latest event details without manual intervention. It's perfect for community managers, team leaders, or anyone who organizes events on Discord.

🔄 How It Works:

  1. Scheduled Trigger: The workflow runs automatically at a set interval (e.g., every hour) to check for new or updated events.
  2. Fetch Discord Events: It sends an HTTP request to the Discord API to retrieve a list of all scheduled events for a specified server (guild_id).
  3. Check for Existing Events: For each event fetched from Discord, the workflow attempts to find a corresponding event in Google Calendar using the unique Discord event ID.
  4. Conditional Logic (Create or Update):
    • If an event with the same ID exists in Google Calendar, the workflow proceeds to the Update event details node.
    • If no event is found, it proceeds to the Create event node.
  5. Sync to Google Calendar:
    • Update: Modifies the existing Google Calendar event with any new details from Discord, such as name, description, start/end times, or location.
    • Create: Creates a new event in Google Calendar, using the Discord event ID as the Google Calendar event ID to enable future updates.

✅ Real-World Use Cases:

  • Community Management: Keep a public-facing Google Calendar automatically updated with all community events, AMAs, and game nights scheduled on Discord.
  • Team Coordination: Ensure all team members have project meetings and deadlines scheduled on Discord automatically synced to their work calendars.
  • Gaming Guilds: Plan raids, tournaments, and social events in Discord and have them instantly appear in every member's personal calendar.
  • Personal Organization: Never miss a community event you're interested in by syncing a server's event schedule directly to your own Google Calendar.

Instructions

Basic steps

  1. Download workflow JSON
  2. Import into n8n
  3. Configure node parameters as needed
  4. Test and enable the workflow

💡 Tips

After importing, verify all connectors and credentials match your environment.

Preview

Workflow Visualization

9 nodes
100%
List scheduled events from DiscordhttpRequestOn schedulescheduleTriggerUpdate event detailsgoogleCalendarCreate eventgoogleCalendarGet eventsgoogleCalendarCreate or update?ifConfiguresetSticky Note1stickyNoteSticky NotestickyNote

Nodes

1

List scheduled events from Discord

httpRequest

v4.1
2

On schedule

scheduleTrigger

v1.1
3

Update event details

googleCalendar

v1
4

Create event

googleCalendar

v1
5

Get events

googleCalendar

v1
6

Create or update?

if

v1
7

Configure

set

v2
8

Sticky Note1

stickyNote

v1
9

Sticky Note

stickyNote

v1

Statistics

Total nodes:9
Disabled nodes:0
Node types:6
Connections:5
View full JSON structure
{
  "nodes": [
    {
      "id": "78d5f452-5ba1-4d59-9d52-8f32512d2c25",
      "name": "List scheduled events from Discord",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1940,
        1000
      ],
      "parameters": {
        "url": "=https://discord.com/api/guilds/{{ $('Configure').first().json.guild_id }}/scheduled-events",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "with_user_count",
              "value": "true"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "fxbcosIH3MYkufX8",
          "name": "FILL ME"
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "af149917-0d46-4a40-b377-69c088a4a7b9",
      "name": "On schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        1420,
        1000
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "619c149f-f954-4f5d-a160-01a8b85f3eb7",
      "name": "Update event details",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        2600,
        900
      ],
      "parameters": {
        "eventId": "={{ $json.id }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "[UPDATE ME]",
          "cachedResultName": "Events"
        },
        "operation": "update",
        "updateFields": {
          "end": "={{ $('List scheduled events from Discord').item.json.scheduled_end_time }}",
          "start": "={{ $('List scheduled events from Discord').item.json.scheduled_start_time }}",
          "summary": "={{ $('List scheduled events from Discord').item.json.name }}",
          "location": "={{ $('List scheduled events from Discord').item.json.entity_metadata.location }}",
          "description": "={{ $('List scheduled events from Discord').item.json.description }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "dRGPTy0BjDpAYjYl",
          "name": "FILL ME"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "56e60042-d345-46f2-b1c6-4e21825cb5c9",
      "name": "Create event",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        2600,
        1100
      ],
      "parameters": {
        "end": "={{ $('List scheduled events from Discord').item.json.scheduled_end_time }}",
        "start": "={{ $('List scheduled events from Discord').item.json.scheduled_start_time }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "[UPDATE ME]",
          "cachedResultName": "Events"
        },
        "additionalFields": {
          "id": "={{ $('List scheduled events from Discord').item.json.id }}",
          "summary": "={{ $('List scheduled events from Discord').item.json.name }}",
          "location": "={{ $('List scheduled events from Discord').item.json.entity_metadata.location }}",
          "description": "={{ $('List scheduled events from Discord').item.json.description }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "dRGPTy0BjDpAYjYl",
          "name": "FILL ME"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "afb05bee-eb5f-453f-8e95-277296ce94b8",
      "name": "Get events",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        2160,
        1000
      ],
      "parameters": {
        "eventId": "={{ $json.id }}",
        "options": {},
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "[UPDATE ME]",
          "cachedResultName": "Events"
        },
        "operation": "get"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "dRGPTy0BjDpAYjYl",
          "name": "FILL ME"
        }
      },
      "typeVersion": 1,
      "continueOnFail": true,
      "alwaysOutputData": false
    },
    {
      "id": "56b731bd-4676-4b77-bafa-7120a51bf75d",
      "name": "Create or update?",
      "type": "n8n-nodes-base.if",
      "position": [
        2380,
        1000
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.id }}",
              "operation": "isNotEmpty"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "12e40b0e-3740-47db-8647-eff8c0c959df",
      "name": "Configure",
      "type": "n8n-nodes-base.set",
      "position": [
        1680,
        1000
      ],
      "parameters": {
        "values": {
          "string": [
            {
              "name": "guild_id",
              "value": "447359847986495498"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "4160a727-6a50-40ce-a7f2-0abbd5a6b1bc",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1600,
        940
      ],
      "parameters": {
        "width": 254.7946768060834,
        "height": 296.7300380228139,
        "content": "### Configuration\n\n\n\n\n\n\n\n\n\n\n\n\n\n__`guild_id`__: the server ID in Discord. See how to get that [from this Wikipedia tutorial](https://en.wikipedia.org/wiki/Template:Discord_server#:~:text=Getting%20Guild%20ID,to%20get%20the%20guild%20ID.)."
      },
      "typeVersion": 1
    },
    {
      "id": "ac717afe-1d30-4994-a134-0d535d04b932",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        920,
        760
      ],
      "parameters": {
        "width": 420.4528092560485,
        "height": 639.1273068962362,
        "content": "## Sync Discord scheduled events to Google Calendar\nThis workflow syncs Discord scheduled events to Google Calendar. On a specified schedule, a request to Discord's API is made to get the scheduled events on a particular server. Only the events that have not been created or have recently been updated will be sent to Google Calendar.\n\n### Setup\nYou will need to create a Discord bot. See how to do that [here](https://github.com/reactiflux/discord-irc/wiki/Creating-a-discord-bot-&-getting-a-token). Once you have created your bot, create **Header Auth** in `List scheduled events from Discord` node. Your header auth fields should be:\n\nName: Authorization\nValue: Bot _<your token>_ \n(i.e. Bot MTEzMTgw...uQdg)\n\n### How it works\n1. Triggers off on the `On schedule` node.\n2. Gets the scheduled events from Discord.\n3. The IDs of the Discord scheduled events are used to get the events from Google Calendar, since the IDs are the same on creation of the Google Calendar event.\n4. We can now determine which events are new or have been updated.\n5. The new or updated events are created or updated in Google Calendar."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Configure": {
      "main": [
        [
          {
            "node": "List scheduled events from Discord",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get events": {
      "main": [
        [
          {
            "node": "Create or update?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On schedule": {
      "main": [
        [
          {
            "node": "Configure",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create or update?": {
      "main": [
        [
          {
            "node": "Update event details",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create event",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List scheduled events from Discord": {
      "main": [
        [
          {
            "node": "Get events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Actions

Share
Categories:
Tags:
ifsethttprequeststickynotescheduletriggergooglecalendar

Technical Specs

Complexity:
Advanced
Node Count:
9 nodes
Published:11 months ago
Updated:11 days ago

Compatibility

Platform:
N8N Cloud & Self-hosted
Min Version:
N8N v1.0.0+
Supports cloud and self-hosted deployment

License

This workflow template follows MIT license, you can freely use, modify and distribute.

Please comply with relevant third-party service terms when using.

Related Workflows