How to Create an ICS File with a Complete Example

CalendarLint EditorialPublished 4 min read
Applies to: Google Calendar, Apple Calendar, Outlook

Create an ICS file from a complete sample, edit its event details, and check UTC times, all-day dates, and the saved file before importing.

On this page

To create an ICS file, save a complete iCalendar document as a UTF-8 plain-text file with an .ics extension. For one straightforward event, you can edit the example below. If you prefer a form, use an event generator and check its downloaded file against the same details.

Key Takeaways

  • Save plain text as .ics; changing a Word document's extension does not convert it.
  • A time ending in Z is UTC. Convert your intended local time before using that notation.
  • Check the saved file before importing it, and test new events in a separate calendar.

Choose a creation method

  • One event with known times: edit the sample below, then check the start, end, title, and UTC conversion.
  • One event, without editing text: use a calendar event generator, then check the selected time zone and downloaded event details.
  • A table of shifts or classes: use a CSV-to-ICS converter, then check the column mapping and each event's end date.

For a form-based option, Marudot's iCal Event Maker documents New and Export Events controls. Select the time zone, enter the event, save it, and export the selected event. This is a documented alternative; the checked example in this guide is the plain-text file below.

Save a complete ICS file

Open a plain-text editor, copy this entire block, and save it as check-in.ics. Choose UTF-8 and CRLF line endings. In an editor that automatically adds .txt, check that the resulting filename isn't check-in.ics.txt.

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example//Single Event Sample//EN
BEGIN:VEVENT
UID:check-in-20261110@example.test
DTSTAMP:20261105T000000Z
DTSTART:20261110T140000Z
DTEND:20261110T143000Z
SUMMARY:Project check-in
LOCATION:Room 2
DESCRIPTION:Review the draft agenda.
END:VEVENT
END:VCALENDAR

This describes November 10, 2026, from 14:00 to 14:30 UTC, in Room 2. In Shanghai, that is 22:00 to 22:30 on the same day. A calendar may display a different local hour while representing the same instant.

The calendar wrapper and event wrapper must both remain intact. UID identifies the event, and DTSTAMP is a UTC metadata timestamp rather than its meeting time. The sample follows the iCalendar event structure.

Change the event safely

Change SUMMARY, LOCATION, and DESCRIPTION to match your event. For a new, separate event, also replace the sample UID with a new unique value. Retaining a UID does not guarantee that importing another file will update an existing event; import behavior belongs to the receiving app.

For a 45-minute meeting starting at 15:00 UTC, replace both time lines:

DTSTART:20261110T150000Z
DTEND:20261110T154500Z

For an all-day event on November 10, replace them with:

DTSTART;VALUE=DATE:20261110
DTEND;VALUE=DATE:20261111

The end date is exclusive, so the all-day event occupies November 10 only. These date and time conventions are specified in RFC 5545.

Keep hand-edited text short. In text properties, escape commas as \,, semicolons as \;, backslashes as \\, and embedded newlines as \n. Long content lines need folding; use a generator if your edits go beyond a few simple fields.

Check what you actually saved

Open the saved file using the ICS inspection steps. Confirm one event, the intended title, the start and end times, and the time zone. Then preview it or import it into a separate test calendar and compare those details again.

The complete sample, the 45-minute edit, and the all-day edit were parsed with ical.js 2.2.1. They produced one event each with the expected times or dates. That verifies the examples' parsed values; it does not establish import compatibility with every calendar application.

If other people need later changes, decide whether they should import a snapshot or subscribe to a calendar. Sending another static file is not an automatic update service.