πŸ“…CSVβ†’ICS

How to Create an ICS File

An ICS file is just structured text β€” you can write one in any text editor. Here's a working minimal template, the rules that actually matter, and the point at which you should stop hand-writing and use a converter instead.

πŸ“…
Written by Casey Marlin Β· Last updated July 24, 2026
This update: template and RRULE examples re-validated by importing into Google Calendar, Outlook.com and Apple Calendar

A minimal, working ICS file

Copy this, change the values, save it as events.ics β€” it imports into every major calendar app:

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//your-name//your-app//EN
BEGIN:VEVENT
UID:20260728-standup-1@example.com
DTSTAMP:20260724T120000Z
DTSTART;TZID=America/New_York:20260728T090000
DTEND;TZID=America/New_York:20260728T091500
SUMMARY:Team standup
LOCATION:Zoom
DESCRIPTION:Daily sync\nBring updates
END:VEVENT
END:VCALENDAR

To hold more events, repeat the whole BEGIN:VEVENT … END:VEVENT block β€” one per event, each with its own unique UID β€” all inside the single VCALENDAR envelope.

The fields, line by line

LineRequiredWhat it does
VERSION:2.0YesDeclares the iCalendar spec version. Always exactly 2.0.
PRODIDYesIdentifies the software that made the file. Any -//org//app//EN string.
UIDYesGlobally unique event ID. Calendars use it to match updates to existing events β€” duplicated UIDs make events overwrite each other.
DTSTAMPYesWhen this file was generated, always UTC (trailing Z).
DTSTART / DTENDDTSTART yesStart and end. With TZID=… for local times, trailing Z for UTC, or VALUE=DATE for all-day. No DTEND means zero duration (most apps render ~1 hour).
SUMMARYNoThe event title.
LOCATION / DESCRIPTIONNoWhere, and free-form notes. Escape , ; \ and use \n for line breaks.
RRULENoRecurrence rule β€” see the examples below.
Ad space

Recurring events: RRULE recipes

Add one RRULE line inside the VEVENT. The pattern expands from DTSTART:

Every weekdayRRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
Mon/Wed/Fri for 10 weeksRRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR;COUNT=30
Monthly on the 1stRRULE:FREQ=MONTHLY;BYMONTHDAY=1
Second Tuesday monthlyRRULE:FREQ=MONTHLY;BYDAY=2TU
Yearly until end of 2028RRULE:FREQ=YEARLY;UNTIL=20281231T235959Z

This is the one thing spreadsheets can't express β€” CSV has no recurrence column β€” so the usual workflow is: generate single events from CSV with the converter, then paste an RRULE into the few events that repeat.

The rules that break hand-written files

  • Escaping: inside text values, write commas as \, semicolons as \; backslashes as \\ and newlines as \n.
  • Line endings: the spec requires CRLF (\r\n). Most apps tolerate LF, but strict parsers exist β€” generated files should use CRLF.
  • Line folding: lines longer than 75 bytes should wrap onto a next line that starts with a single space. Editors don't do this for you; it's the main reason long descriptions break hand-made files.
  • Exclusive DTEND: all-day events end the day after the last day. Off-by-one imports are almost always this.
  • Timezones: a bare TZID reference technically wants a matching VTIMEZONE block defining the zone's DST rules. Big apps substitute their own definitions, but embedding it (as our converter does) is what the spec asks for.

Sanity-check any hand-written file by dropping it into the ICS viewer β€” its tolerant parser lists warnings that point at broken lines β€” or round-trip it through the ICS to CSV converter to see every field as a table.

Creating ICS files β€” FAQ

What is an ICS file exactly?

A plain-text file in the iCalendar format (RFC 5545) β€” the universal interchange format for calendar data. It wraps one or more VEVENT blocks inside a VCALENDAR envelope, each holding properties like SUMMARY, DTSTART and LOCATION. Google Calendar, Outlook and Apple Calendar all read and write it.

Can I create an ICS file in Notepad or TextEdit?

Yes β€” it's just text. Copy the minimal template on this page, edit the values, and save with an .ics extension (in TextEdit, use Format β†’ Make Plain Text first). The spec formally requires CRLF line endings; most calendar apps forgive plain LF, but files from this site's converter use proper CRLF so they work everywhere.

Which fields are required in a VEVENT?

Three: UID (a globally unique ID β€” any unique string plus an @domain suffix works), DTSTAMP (when the file was created, in UTC), and DTSTART (when the event begins). Everything else β€” SUMMARY, DTEND, LOCATION, DESCRIPTION, RRULE β€” is technically optional, though an event without a SUMMARY shows up untitled.

How do I make an all-day event in ICS?

Use DATE values instead of date-times: DTSTART;VALUE=DATE:20260803 with DTEND;VALUE=DATE:20260804. Watch the trap β€” DTEND is exclusive, so a one-day event on Aug 3 ends on Aug 4, and a conference running Aug 10-12 needs DTEND of Aug 13.

How do I make a recurring event in ICS?

Add an RRULE line to the VEVENT. Examples: RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR for Mon/Wed/Fri; RRULE:FREQ=MONTHLY;BYMONTHDAY=1 for the 1st of each month; append COUNT=10 or UNTIL=20261231T000000Z to stop it. The recurrence expands from your DTSTART, so make sure the first occurrence matches the rule.

Why won't my hand-written ICS file import?

The usual suspects, in order: a missing or duplicated UID, special characters not escaped (commas, semicolons and backslashes must be written \, \; and \\, newlines as \n), a DTEND earlier than DTSTART, mismatched BEGIN/END pairs, or the file saved with rich-text formatting. Drop the file into our ICS viewer β€” it reads tolerantly and its warnings usually point straight at the broken line.

Is there a faster way than writing ICS by hand?

For more than a couple of events, yes: put them in a spreadsheet with Subject / Start Date / Start Time columns and run it through our CSV to ICS converter. It generates the UIDs, escaping, folding, CRLF endings and timezone definitions automatically, with a preview before download β€” and it all runs in your browser.

Keep reading