DEV Community

Pirate Prentice
Pirate Prentice

Posted on

n8n iCalendar Node: Read, Parse, and Generate .ics Files in Your Workflows [Free Workflow JSON]

n8n iCalendar Node: Read, Parse, and Generate .ics Files in Your Workflows [Free Workflow JSON]

The n8n iCalendar node lets you work with .ics / iCal files — the open standard used by Google Calendar, Outlook, Apple Calendar, and virtually every other calendar system. You can parse incoming calendar files into structured JSON, or generate .ics files from workflow data and send them as email attachments or webhook responses.


What the iCalendar Node Does

The iCalendar node has two operations:

  • Get All Events — parses a binary .ics file (from a previous node) and outputs one item per VEVENT, with fields like summary, dtstart, dtend, location, description, uid, rrule, and attendees.
  • Create Event File — takes structured data from your workflow and produces a binary .ics file you can attach to an email, return in a webhook response, or write to disk.

Input & Output

Get All Events (parsing)

Input: a binary field containing .ics data (from an HTTP Request node, a Read/Write Files node, or an email attachment).

Output per item:

{
  "summary": "Team Standup",
  "dtstart": "2026-07-07T09:00:00.000Z",
  "dtend": "2026-07-07T09:30:00.000Z",
  "location": "Zoom",
  "description": "Daily sync",
  "uid": "abc123@example.com",
  "rrule": "FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR"
}
Enter fullscreen mode Exit fullscreen mode

Create Event File (generating)

Input: item fields that map to calendar properties.
Output: a binary field containing a valid .ics file ready to attach or serve.


Pattern 1: Parse an Incoming .ics Webhook and Add Events to a Sheet

Use case: A form builder (Typeform, Tally) lets users upload their existing calendar — you want to pull out events and log them to a Google Sheet.

Workflow: Webhook → iCalendar (Get All Events) → Google Sheets (Append)

Key config on the iCalendar node:

  • Input binary field: data (the default field name from the Webhook node)
  • Operation: Get All Events

After parsing, each VEVENT becomes one row in your Sheet: summary, start, end, location, description.

Free workflow JSON: Download below


Pattern 2: Generate a Meeting Invite and Email It

Use case: After a Stripe payment (booking a consultation), automatically send the customer a calendar invite.

Workflow: Stripe Webhook → Set (map fields) → iCalendar (Create Event File) → Send Email (attach .ics)

iCalendar node config (Create Event File):

Summary:     {{ $json.description }}
Start:       {{ $json.meeting_start }}   (ISO 8601)
End:         {{ $json.meeting_end }}
Location:    {{ $json.meeting_url }}
Description: Your consultation with {{ $json.provider_name }}
Organizer:   bookings@yourcompany.com
UID:         {{ $json.charge_id }}@yourcompany.com
Enter fullscreen mode Exit fullscreen mode

The output is a binary .ics file. Wire it to a Send Email node, set Attachments to the binary field name, and the customer's email client will display a "Add to Calendar" prompt automatically.


Pattern 3: Monitor a Public Calendar Feed for New Events

Use case: Subscribe to a public iCal feed (conference schedule, team holiday calendar) and post new events to Slack.

Workflow: Schedule Trigger → HTTP Request (fetch .ics URL) → iCalendar (Get All Events) → Filter (dtstart > now) → Slack

HTTP Request: GET https://calendar.example.com/feed.ics
Response format: File
Enter fullscreen mode Exit fullscreen mode

After parsing, filter for events starting in the next 7 days, then format a Slack message per event:

*{{ $json.summary }}*
📅 {{ DateTime.fromISO($json.dtstart).toFormat('EEE, MMM d @ h:mm a') }}
📍 {{ $json.location || 'No location' }}
Enter fullscreen mode Exit fullscreen mode

Gotchas

1. Recurring events (RRULE) are not expanded
The node outputs the raw rrule string (FREQ=WEEKLY;BYDAY=MO) but does NOT expand it into individual occurrences. If you need every occurrence, parse the rrule in a Code node with a library or use an external calendar API.

2. All-day events have date-only dtstart
All-day events use DTSTART;VALUE=DATE:20260707 (no time component). Your downstream date parsing needs to handle both 2026-07-07 (date string) and 2026-07-07T09:00:00Z (datetime string).

3. Binary field name must match
The "Get All Events" operation reads from the binary field you specify. If the upstream node outputs the file under a different field name (e.g., attachment vs data), the node will fail silently. Check the upstream node's output panel.

4. Timezone handling
iCal datetimes may be in UTC (Z suffix), in a named timezone (TZID=America/Chicago), or floating (no timezone). The n8n node normalizes to ISO 8601 where possible, but check your dtstart values when working across timezones.

5. VCALENDAR vs VEVENT
The .ics file wraps events in a VCALENDAR container. The node correctly strips this and returns one item per VEVENT — you don't need to handle the outer wrapper.


Free Workflow JSON

{
  "name": "iCalendar — Parse .ics and Log to Sheet",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "ical-upload",
        "responseMode": "responseNode",
        "options": {}
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [240, 300]
    },
    {
      "parameters": {
        "operation": "getAllEvents",
        "binaryPropertyName": "data"
      },
      "name": "iCalendar",
      "type": "n8n-nodes-base.iCal",
      "typeVersion": 1,
      "position": [460, 300]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": { "value": "YOUR_SHEET_ID" },
        "sheetName": "Events",
        "columns": {
          "mappingMode": "autoMapInputData"
        }
      },
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.5,
      "position": [680, 300]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "iCalendar", "type": "main", "index": 0 }]] },
    "iCalendar": { "main": [[{ "node": "Google Sheets", "type": "main", "index": 0 }]] }
  }
}
Enter fullscreen mode Exit fullscreen mode

Drop this into n8n (Settings → Import Workflow), replace YOUR_SHEET_ID with a real Google Sheet ID, and POST a .ics file to the webhook URL. Each VEVENT lands as a new row.


When to Use the iCalendar Node vs Alternatives

Need Best tool
Parse a .ics file into events iCalendar node (Get All Events)
Generate a .ics invite to email iCalendar node (Create Event File)
Read/write Google Calendar directly Google Calendar node
Expand recurring events into instances Google Calendar node or Code node + rrule library
Serve a live calendar feed (.ics URL) Code node + HTTP Response node

Working with calendar files in n8n? Drop your use case in the comments — curious what's triggering calendar workflows for people.

Top comments (1)

Collapse
 
pirateprentice profile image
Pirate Prentice

Are you using the iCalendar node to parse incoming .ics webhooks, generate meeting invites, or monitor a public calendar feed? Drop your use case below — curious what people are syncing with n8n.