<!-- BusyBot node reference — https://busybot.net/tools/icalendar/ -->

> Node: iCalendar (`icalendar`) · Action (binary) · v1
> Category: Core Nodes · Credentials: none
> Updated: 2026-08-16

# 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. |
| — — Email | `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. |
| — — Email | `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:

```json
{
  "title": "Project Kickoff Meeting",
  "start": "2024-01-15T14:00:00Z",
  "end": "2024-01-15T16:00:00Z",
  "allDay": false,
  "fileName": "project_kickoff.ics",
  "fileSize": 486
}
```

- `start` and `end` echo the values you supplied. When **End** was left empty, `end` repeats `start`.
- `fileName` is **File Name**, or `event.ics` when you did not set one.
- `fileSize` is 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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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

1. **Required fields** — always provide **Start**, **End** and **Put Output File in Field**.
2. **Date format** — use ISO 8601 for all dates.
3. **Sub-field structure** — Attendees, Organizer and Geolocation each nest their values under their own group key (`attendeeValues`, `organizerValues`, `geolocationValues`).
4. **Options is a flat object** — the optional properties sit directly inside it, not in an array.
5. **All-day events** — set **All Day** and the time portions of Start and End are ignored.
6. **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.