All nodes/Integrations/Calendar
Put Calendar Event
PUT iCalendar resource (create without etag, update with If-Match).
Type in the graph: calendar_put_event
Exec
An error branch can be enabled (expose_error_output) to handle failures on their own path.
Ports can be split into separate execution and data handles.
Try it
Minimal working workflow
- Execute
- Data
- Execute + Data
Pick your own connection or knowledge base first — the graph carries REPLACE_ME.
When to use it
Creates a calendar resource, or replaces one outright. To change a field or two on an existing event, use Patch Calendar Event: the write here overwrites the object completely, and anything absent from the body disappears from the event.
How it works
The body is composed from the fields — “Title” and “Starts at” are required — or taken ready-made from “iCalendar body”. A non-empty raw body always wins, whatever the “Event body” switch says: clear it to go back to the builder.
The builder supplies UID and DTSTAMP when they are missing; without those properties servers
reject the event. A time with no offset is treated as UTC, while a filled-in time zone keeps it
local and sends it with a TZID. “All-day event” writes dates instead of times. The recurrence
rule is given without the property name (FREQ=WEEKLY;BYDAY=MO;COUNT=10); a rule without FREQ
is refused before the request.
“Event href” is the resource path. For a new event pick a free path inside the collection, ending
in .ics.
A blank ETag means “create, or overwrite unconditionally”. A non-blank one becomes a condition: if
the event changed since the token was issued the server answers 412 and the node stops with
error_code PRECONDITION_FAILED. The output carries href and etag — the new one, as
assigned by the server; when the server sends none, the node re-reads the resource. A create →
update chain uses {{ nodes.<put>.output.etag }}.
Common mistakes
- Writing to an existing address erases fields. Attendees, description, recurrence — anything missing from the body you sent is gone. Targeted edits are what the patch node is for.
- A blank UID means a new event. Even at the same address: to update an existing one, supply its UID from Get Calendar Event.
- Attendees in the body are not invitations. The ATTENDEE property notifies nobody; delivery is the job of Calendar Schedule, through the outbox.
- A body invented by a model. Generated iCalendar usually lacks UID and DTSTAMP, and the server refuses it. Let the model fill separate fields and let the node build the body.
- An empty
etagin the output. A rare server returns no token, neither in the response nor on a re-read; the next update then has to go without a conflict check.
Inputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Calendar storecalendar_store | Datadata | — | required |
Outputs
| Port | Wire | Payload | Notes |
|---|---|---|---|
Successoutput | Execute + Dataexecute_data | object | |
Erroron_error | Execute + Dataexecute_data | — | shown when expose_error_output = true |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
CalDAV connectionconnection_id | string | "" | Saved workspace CalDAV connection, so a simple calendar graph does not need a separate CalDAV Config node. A node wired to the 'calendar_store' port wins over this field. connection: caldavoverridden by port: calendar_store |
Event hrefhref | string | "" | Path or absolute URL of the calendar object, exactly as returned by Calendar Query or Calendar Multiget ({{ nodes.<query>.output.events[0].href }}). A relative path is resolved against the connection's base URL. Example: /remote.php/dav/calendars/user/personal/9f1c-1234.ics For a new event pick a fresh path inside the calendar collection, ending in .ics supports templates |
Event bodybody_mode | string | fields | How the iCalendar body is produced: from the fields below, or from a raw iCalendar document. A non-empty raw body is used regardless of this setting. Options: |
Titlesummary | string | "" | Event title (SUMMARY). Required when building from fields. supports templates shown when body_mode = fields |
Starts atdtstart | string | "" | Start, ISO 8601 (2026-07-01T10:00:00Z), or a plain date (2026-07-01) for an all-day event. Required when building from fields. supports templates shown when body_mode = fields |
Ends atdtend | string | "" | End, ISO 8601. Empty means the server decides the duration. supports templates shown when body_mode = fields |
All-day eventall_day | boolean | false | Write DTSTART/DTEND as dates (VALUE=DATE) instead of times. shown when body_mode = fields |
Locationlocation | string | "" | Free-form place (LOCATION), e.g. a room name or a meeting link. supports templates shown when body_mode = fields |
Descriptiondescription | string | "" | Event body text (DESCRIPTION). supports templates shown when body_mode = fields |
iCalendar bodyics | string | "" | Raw iCalendar document (VCALENDAR with one VEVENT). Takes precedence over the fields above whenever it is non-empty, so clear it to go back to the builder. Must carry UID and DTSTAMP — servers reject events without them. supports templates |
| Advanced | |||
ETagetag | string | "" | Optimistic-concurrency token from a previous Get/Query/Put on the same resource. Empty = create the resource (or overwrite it unconditionally). If the resource changed since the token was issued the server answers 412 and the node fails with error_code=PRECONDITION_FAILED. The Put/Patch nodes return the NEW etag, so a create → update chain uses {{ nodes.<put>.output.etag }}. supports templates |
Time zonetimezone_id | string | "" | IANA time zone for times given without an offset, e.g. Europe/Moscow. Empty = treat such times as UTC. supports templates shown when body_mode = fields |
Recurrence rulerrule | string | "" | RFC 5545 RRULE without the property name, e.g. FREQ=WEEKLY;BYDAY=MO;COUNT=10. Empty = a single occurrence. supports templates shown when body_mode = fields |
Attendeesattendees | string | "" | Email addresses, comma- or newline-separated. Written as ATTENDEE properties. supports templates shown when body_mode = fields |
Organizerorganizer | string | "" | Organizer email address (ORGANIZER). Required by most servers for invitations. supports templates shown when body_mode = fields |
Event UIDevent_uid | string | "" | Stable identifier of the event. Empty = generate one. Reuse the UID of an existing event to update or cancel it. supports templates shown when body_mode = fields |
Statusevent_status | string | none | Event STATUS. 'Not set' leaves the property out of the event. Options: shown when body_mode = fields |
Shared fields
Every node has these three — the platform adds them, not the node author.
expose_error_output— When enabled, show an execution output to connect nodes that run if this step fails.split_ports_in— Show separate execution and data input handles instead of one combined port.split_ports_out— Show separate execution and data output handles instead of one combined port.