What Is ICS (iCalendar)?
The ICS format (file extension .ics) is the standard file format for storing and exchanging calendar data. Based on the iCalendar specification (RFC 5545), it is a plain-text format readable by every major calendar application — Google Calendar, Microsoft Outlook, Apple Calendar, Mozilla Thunderbird, and hundreds of scheduling tools.
History of the iCalendar Standard
The iCalendar standard was developed by the Internet Engineering Task Force (IETF) and first published as RFC 2445 in November 1998. It was designed to standardize calendar data interchange across different applications and platforms, replacing the earlier vCalendar 1.0 standard created by the Versit Consortium (the same group behind vCard).
In 2009, RFC 2445 was superseded by RFC 5545, which clarified ambiguities, corrected inconsistencies, and added improved timezone handling. A companion specification, RFC 5546, defines the iTIP (iCalendar Transport-Independent Interoperability Protocol) — the mechanism used for sending meeting invitations via email.
Today iCalendar is universally supported: Google Calendar, Microsoft Outlook, Apple Calendar, Thunderbird, Fastmail, Proton Calendar, Calendly, Cal.com, and virtually every scheduling application reads and writes .ics files.
Technical Structure of an ICS File
ICS files are plain text, encoded in UTF-8, using a line-by-line PROPERTY:VALUE format. Every file begins with BEGIN:VCALENDAR and ends with END:VCALENDAR.
Top-Level Properties
VERSION:2.0— iCalendar version (always 2.0 for RFC 5545)PRODID— identifier of the software that created the fileCALSCALE:GREGORIAN— calendar system (Gregorian is the default)METHOD— used in email invitations (PUBLISH, REQUEST, REPLY, CANCEL)
Components
| Component | Description |
|---|---|
VEVENT |
A calendar event (meeting, appointment, holiday) |
VTODO |
A task or to-do item with optional due date |
VJOURNAL |
A journal entry associated with a date |
VFREEBUSY |
Free/busy time information for scheduling |
VTIMEZONE |
Timezone definition referenced by events |
Key VEVENT Properties
| Property | Description |
|---|---|
UID |
Unique identifier for the event |
DTSTART |
Start date and time |
DTEND |
End date and time |
SUMMARY |
Event title |
DESCRIPTION |
Detailed description |
LOCATION |
Physical or virtual location |
ORGANIZER |
Event organizer (email address) |
ATTENDEE |
Invited attendee with RSVP status |
RRULE |
Recurrence rule (for repeating events) |
VALARM |
Reminder/alarm component |
Complete Example VEVENT
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//KaijuConverter//Calendar//EN
BEGIN:VEVENT
UID:meeting-2025-04-25@kaijuconverter.com
DTSTART:20250425T140000Z
DTEND:20250425T150000Z
SUMMARY:Team Meeting
DESCRIPTION:Weekly sync with the team
LOCATION:Conference Room A
ORGANIZER:mailto:organizer@example.com
ATTENDEE;RSVP=TRUE:mailto:colleague@example.com
BEGIN:VALARM
TRIGGER:-PT15M
ACTION:DISPLAY
DESCRIPTION:Meeting starts in 15 minutes
END:VALARM
END:VEVENT
END:VCALENDAR
Recurrence Rules (RRULE)
One of the most powerful features of iCalendar is the RRULE property, which defines repeating events using a compact syntax.
# Every Monday, Wednesday, Friday until end of 2025
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20251231T000000Z
# Monthly on the last Friday
RRULE:FREQ=MONTHLY;BYDAY=-1FR
# Every 2 weeks on Tuesday
RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=TU
# Annually (yearly anniversary)
RRULE:FREQ=YEARLY
RRULE parameters:
FREQ— DAILY, WEEKLY, MONTHLY, YEARLYINTERVAL— repeat every N periods (default 1)BYDAY— specific days of the week (MO, TU, WE, TH, FR, SA, SU)UNTIL— end date for the recurrenceCOUNT— maximum number of occurrences
Timezones in ICS: The Tricky Part
Timezone handling is the most common source of ICS import bugs. ICS supports three approaches:
1. UTC time (recommended for unambiguous events):
DTSTART:20250425T140000Z
The Z suffix means UTC. This is unambiguous — every calendar app will show the correct local time.
2. Named timezone (for events that should follow local time):
DTSTART;TZID=Europe/Madrid:20250425T160000
Requires a matching VTIMEZONE block in the file, or the app must recognize the timezone name.
3. Floating time (no timezone — dangerous):
DTSTART:20250425T160000
No Z, no TZID. Each calendar app interprets this as the user's local time, which causes events to appear at the wrong time for attendees in different timezones.
Best practice: Always use UTC (Z) for events shared across timezones. An event at 14:00 UTC is 10:00 AM New York, 15:00 London, 16:00 Madrid — calendar apps automatically convert for each user.
What ICS Files Can Contain
- Single events — a one-time meeting or appointment
- Full calendar exports — all events from an entire calendar
- Recurring events — meetings that repeat daily, weekly, monthly, or yearly
- All-day events — use
DATEtype instead ofDATETIME(DTSTART;VALUE=DATE:20250425) - Events with URLs — link to an online meeting or document
- Attendee lists — with RSVP status (ACCEPTED, DECLINED, TENTATIVE)
- Alarms/reminders —
VALARMcomponent triggers at a specified time before the event - Tasks —
VTODOcomponent with optional due dates and completion status
Subscribing vs. Importing ICS
These are two fundamentally different operations:
| Import (file) | Subscribe (URL) | |
|---|---|---|
| How | Open a .ics file |
Add a webcal:// or https:// URL |
| Updates | One-time snapshot | Live-synced, auto-refreshes |
| Use case | Conference agenda, one-time events | Sports schedules, public holidays, colleague calendars |
| Changes | Never propagate | Automatically reflected |
When to use subscribing: public sports schedules, TV show release dates, colleagues' shared calendars, public holiday calendars.
When to use importing: conference schedules, one-time events received from a contact, archived calendar data.
Where ICS Files Are Used
- Email meeting invitations — every "Add to Calendar" button in Gmail/Outlook generates and attaches an
.icsfile - Google Calendar export — Settings → Import & Export → Export creates a
.icsfor each calendar - Outlook calendar sharing — File → Save Calendar generates an
.icsfile - Public calendar subscriptions — sports team schedules, bank holidays, conference programs
- Scheduling apps — Calendly, Cal.com, and Acuity Scheduling send
.icsconfirmation files to both organizer and attendee - Airline/hotel bookings — many booking confirmation emails include an
.icsattachment for the trip dates - Project management tools — Jira, Asana, Linear can export sprint deadlines as ICS calendars
How to Import ICS Files
Google Calendar
- Go to calendar.google.com on desktop (import is not available in the mobile app)
- Click the gear icon → Settings
- Navigate to Import & Export → Import
- Select your
.icsfile and choose which calendar to import into - Click Import
Tip: If you received an .ics via Gmail as an attachment, Gmail shows an "Add to Calendar" button directly — no manual import needed.
Microsoft Outlook
- File → Open & Export → Import/Export
- Select Import an iCalendar (.ics) or vCalendar file
- Browse to your
.icsfile and click OK - Choose to open as a new calendar or import into an existing one
Apple Calendar
- File → Import
- Select your
.icsfile - Choose which calendar to add the events to
Universal shortcut: Most calendar apps on desktop also support simply double-clicking an .ics file — the operating system opens it in the default calendar app and prompts for import.
Creating ICS Files Programmatically
Minimal ICS Template (text editor)
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//KaijuConverter//Calendar//EN
BEGIN:VEVENT
UID:unique-id@yourdomain.com
DTSTART:20250425T140000Z
DTEND:20250425T150000Z
SUMMARY:Team Meeting
DESCRIPTION:Weekly sync with the team
LOCATION:Conference Room A
END:VEVENT
END:VCALENDAR
Save with .ics extension and recipients can open it in any calendar app.
Python (icalendar library)
pip install icalendar
from icalendar import Calendar, Event
from datetime import datetime, timezone
cal = Calendar()
cal.add('prodid', '-//KaijuConverter//Calendar//EN')
cal.add('version', '2.0')
event = Event()
event.add('summary', 'Team Meeting')
event.add('dtstart', datetime(2025, 4, 25, 14, 0, 0, tzinfo=timezone.utc))
event.add('dtend', datetime(2025, 4, 25, 15, 0, 0, tzinfo=timezone.utc))
event.add('description', 'Weekly sync with the team')
event['uid'] = 'meeting-2025-04-25@kaijuconverter.com'
cal.add_component(event)
with open('meeting.ics', 'wb') as f:
f.write(cal.to_ical())
Converting ICS Files
- ICS to CSV — extract event data (title, start, end, location) into spreadsheet rows for analysis
- ICS to PDF — create a printable calendar or event agenda
- ICS to JSON — for web application consumption
- Multiple ICS files to one — merge several calendar exports into a single file
Use KaijuConverter to convert .ics files to CSV, JSON, or other formats instantly.
Related conversions
Frequent conversions across the catalogue: