Reference · Tools
iCalendar
Generate RFC 5545-compliant iCalendar (.ics) event files from structured input data.
The iCalendar node turns event data into a standards-compliant .ics file, written to a binary field ready to attach or store. It is a pure local transformation — no API calls and no credentials. A typical build is generating a calendar invite for each booking and attaching it to the confirmation email.
- Node type
- Action (binary)
- Parameters
- 8
- Outputs
- Output, Error
- Credentials
- None required
iCalendar
Generate iCalendar (.ics) event files from JSON data
Overview
The iCalendar tool generates .ics calendar event files from structured JSON input. It takes event details (title, start/end dates, attendees, location, organizer, recurrence rules, etc.) and produces a valid RFC 5545 iCalendar file as binary output. The generated file can be attached to emails, uploaded to calendar services, or downloaded by users. No external API calls are made — this is a pure local data transformation.
Category: Core Nodes
Tool Name: icalendar
Version: 1
Appearance: Icon: lucide-CalendarDays | Color: #408000
Node Type
Action (Binary) — handles file/binary data operations
Input / Output
| Direction | Port(s) |
|---|---|
| Input | Input |
| Output | Output, Error |
Credentials
This tool does not require any credentials.
Operations
| Operation | Value | Description |
|---|---|---|
| Create Event File | createEventFile | Generate a .ics calendar event file |
Parameters
This node has a single operation, so every parameter below always applies.
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| Event Title | string | No | — | The title/summary of the calendar event. Supports expressions like {{ $json.subject }}. |
| Start | string | Yes | — | Date and time at which the event begins (ISO 8601 format). For all-day events, the time will be ignored. |
| End | string | Yes | — | Date and time at which the event ends (ISO 8601 format). For all-day events, the time will be ignored. If not set, defaults to the start date. |
| All Day | boolean | No | false | Whether the event lasts all day or not. When true, time portions of start/end are ignored. |
| Put Output File in Field | string | Yes | data | The binary property name that the generated .ics file will be stored under in the output item. Names are case-sensitive — see the upstream node’s Binary Data panel for the exact names to use. |
| Options | collection | No | {} | Optional calendar properties written into the event. |
| — Attendees | fixedCollection | No | {} | People invited to the event. Add one entry per attendee. |
| — — Name | string | Yes | — | Attendee display name. |
string | Yes | — | Attendee email address. | |
| — — RSVP | boolean | No | false | Whether the attendee has to confirm attendance or not. |
| — Busy Status | options | No | — | Used to specify busy status for Microsoft applications, like Outlook (X-MICROSOFT-CDO-BUSYSTATUS). |
Options: BUSY, TENTATIVE | ||||
| — Calendar Name | string | No | — | Specifies the calendar (not event) name. Used by Apple iCal and Microsoft Outlook (X-WR-CALNAME). |
| — Description | string | No | — | Detailed description of the event (DESCRIPTION property). |
| — File Name | string | No | — | The name of the file to be generated. Default is event.ics. |
| — Geolocation | fixedCollection | No | {} | Coordinates for the event location. One entry only. |
| — — Latitude | string | No | — | Latitude coordinate. |
| — — Longitude | string | No | — | Longitude coordinate. |
| — Location | string | No | — | The intended venue/location for the event (LOCATION property). |
| — Recurrence Rule | string | No | — | A rule to define the repeat pattern of the event (RRULE). Use an RRULE generator tool to build the string. |
| — Organizer | fixedCollection | No | {} | Who is hosting the event. One entry only. |
| — — Name | string | Yes | — | Organizer display name. |
string | Yes | — | Organizer email address. | |
| — Sequence | number | No | 0 | Revision sequence number (SEQUENCE property). Increment when sending event updates with the same UID. |
| — Status | options | No | CONFIRMED | Event status (STATUS property). |
Options: CONFIRMED, CANCELLED, TENTATIVE | ||||
| — UID | string | No | — | Universally unique ID for the event (UID property). Auto-generated if not specified. Should be globally unique. |
| — URL | string | No | — | URL associated with the event (URL property). |
| Max Concurrency | number | No | 10 | Maximum number of items to process concurrently. |
Output Data
One output item per input item. The generated .ics file is written as text/calendar binary data on the property named by Put Output File in Field, alongside any binary the item already carried.
The item JSON is replaced with a summary of the event that was written — the input item’s own fields do not pass through, so read anything you still need before this node:
{
"title": "Project Kickoff Meeting",
"start": "2024-01-15T14:00:00Z",
"end": "2024-01-15T16:00:00Z",
"allDay": false,
"fileName": "project_kickoff.ics",
"fileSize": 486
}
startandendecho the values you supplied. When End was left empty,endrepeatsstart.fileNameis File Name, orevent.icswhen you did not set one.fileSizeis the size of the generated file in bytes.
For an all-day event the file’s end date is advanced by one day, because iCalendar treats the all-day end date as exclusive. That is what makes a one-day event show correctly in Google Calendar, Outlook and Apple Calendar; the end value reported in the JSON is still the date you entered.
An event is written even when optional details are missing — only Start must be a parsable ISO 8601 value, and an unparsable Start or End fails the item.
Usage Examples
- Create a calendar event file for a meeting
- Generate .ics file with attendees and location
- Build an all-day event calendar invite
- Create a recurring weekly event .ics file
- Generate calendar file to attach to an email
Example Configuration
A one-hour meeting:
{
"type": "icalendar",
"parameters": {
"operation": "createEventFile",
"title": "Team Meeting",
"start": "2024-01-15T14:00:00Z",
"end": "2024-01-15T15:00:00Z",
"allDay": false,
"binaryPropertyName": "data"
}
}
An all-day event written to a named binary field:
{
"type": "icalendar",
"parameters": {
"operation": "createEventFile",
"title": "Conference Day",
"start": "2024-02-20T00:00:00Z",
"end": "2024-02-20T23:59:59Z",
"allDay": true,
"binaryPropertyName": "calendar_file"
}
}
A full invitation with organizer, attendees and coordinates:
{
"type": "icalendar",
"parameters": {
"operation": "createEventFile",
"title": "Project Kickoff Meeting",
"start": "2024-01-15T14:00:00Z",
"end": "2024-01-15T16:00:00Z",
"allDay": false,
"binaryPropertyName": "data",
"additionalFields": {
"description": "Initial project planning and team introductions",
"location": "Conference Room A, 5th Floor",
"busyStatus": "BUSY",
"status": "CONFIRMED",
"organizerUi": {
"organizerValues": [
{
"name": "John Doe",
"email": "john.doe@company.com"
}
]
},
"attendeesUi": {
"attendeeValues": [
{
"name": "Jane Smith",
"email": "jane.smith@company.com",
"rsvp": true
},
{
"name": "Bob Johnson",
"email": "bob.johnson@company.com",
"rsvp": false
}
]
},
"geolocationUi": {
"geolocationValues": [
{
"lat": "40.7128",
"lon": "-74.0060"
}
]
},
"url": "https://company.com/meeting-details",
"uid": "meeting-2024-001@company.com",
"sequence": 0,
"fileName": "project_kickoff.ics"
}
}
}
A recurring weekly standup:
{
"type": "icalendar",
"parameters": {
"operation": "createEventFile",
"title": "Weekly Standup",
"start": "2024-01-15T09:00:00Z",
"end": "2024-01-15T09:30:00Z",
"allDay": false,
"binaryPropertyName": "data",
"additionalFields": {
"description": "Weekly team standup meeting",
"location": "Virtual - Zoom",
"recurrenceRule": "FREQ=WEEKLY;BYDAY=MO;COUNT=12",
"status": "CONFIRMED",
"busyStatus": "BUSY"
}
}
}
An event built from fields on the incoming item:
{
"type": "icalendar",
"parameters": {
"operation": "createEventFile",
"title": "{{ $json.subject }}",
"start": "{{ $json.startsAt }}",
"end": "{{ $json.endsAt }}",
"binaryPropertyName": "invite",
"additionalFields": {
"description": "{{ $json.agenda }}",
"location": "{{ $json.venue }}",
"status": "CONFIRMED"
}
}
}
Error Handling
| Mode | Behavior |
|---|---|
| stop | Halts workflow on first error |
| continue | Skips failed items, passes successful ones through |
| errorPort | Routes failed items to Error output port |
Tips
Generate .ics iCalendar event files from JSON event data — no external API calls, pure local transformation.
Key Points
- Required fields — always provide Start, End and Put Output File in Field.
- Date format — use ISO 8601 for all dates.
- Sub-field structure — Attendees, Organizer and Geolocation each nest their values under their own group key (
attendeeValues,organizerValues,geolocationValues). - Options is a flat object — the optional properties sit directly inside it, not in an array.
- All-day events — set All Day and the time portions of Start and End are ignored.
- File storage — the generated .ics file is stored on the binary property you name, so an email node can attach it directly.
Notes
- UID and Sequence work together for updates: send the revised event with the same UID and a higher Sequence, and calendar clients replace the original rather than adding a duplicate.
- Recurrence Rule takes a raw RRULE string such as
FREQ=WEEKLY;BYDAY=MO;COUNT=12; it is passed through to the file as written. - Calendar Name names the calendar, not the event — it is what Apple iCal and Outlook show when importing the file.
Frequently asked questions
Which fields are mandatory?
Start, End and Put Output File in Field. Dates use ISO 8601 format throughout.
How do I add attendees or an organizer?
Attendees, Organizer and Geolocation each nest their values under their own group key — `attendeeValues`, `organizerValues` and `geolocationValues` respectively — rather than sitting at the top level.
How do I create an all-day event?
Turn on All Day. The node then emits the event in all-day form rather than as a timed block between the start and end values.
Where do the optional properties go?
Directly inside the flat Options object — they are not wrapped in an array like the attendee and organizer groups.
Build with the iCalendar node
Drop it into a workflow, wire it to an agent, or call it on a schedule.
Open BusyBotLast updated . Spotted something wrong? Tell us.