My .ics File Won’t Import — Quick Checklist for Developers
If your .ics file isn’t importing into Google Calendar, Outlook, or Apple Calendar, run through this quick checklist. In most real-world cases, the problem is one of these.
You can use this page as a debugging flowchart and as a design checklist when you build ICS export features.
✅ 1. Does the ICS file have the required wrapper?
You must have:
BEGIN:VCALENDAR
...
END:VCALENDAR
and at least one event:
BEGIN:VEVENT
...
END:VEVENT
Check:
BEGIN:VCALENDARandEND:VCALENDARpresentBEGIN:VEVENTandEND:VEVENTpresent
✅ 2. Does each VEVENT have DTSTART (and usually DTEND)?
Most clients require a start time, and strongly prefer an end time or duration.
Check every VEVENT for:
DTSTARTpresentDTENDorDURATIONpresent
Example:
DTSTART:20250310T140000Z
DTEND:20250310T150000Z
✅ 3. Are you using valid time zones?
TZID must be a valid IANA time zone:
Valid:
DTSTART;TZID=America/New_York:20250310T090000
Invalid:
DTSTART;TZID=EST:20250310T090000
DTSTART;TZID=GMT-5:20250310T090000
Check:
- No
TZID=EST,TZID=CST,TZID=GMT-5, etc. - All
TZIDvalues useRegion/Cityformat (e.g.,Europe/Berlin)
If you don’t care about local time zones, stick to UTC with Z:
DTSTART:20250310T140000Z
✅ 4. Do you include VERSION and PRODID?
Some clients silently reject files missing these:
VERSION:2.0
PRODID:-//YourApp//EN
Check:
VERSION:2.0exists inside VCALENDARPRODID:exists with some value
✅ 5. Does every event have a UID?
Each VEVENT needs a unique ID:
UID:event-1234@yourapp.com
Check:
- Every
VEVENThas aUID - UIDs are either stable (for the same logical event) or truly unique
✅ 6. Are your RRULEs valid?
Common mistakes:
- Missing
FREQ= - Invalid
UNTILdate - Typo’d BYDAY/BYMONTH rules
Check:
- Every
RRULEhasFREQ=... UNTILdates are real (no Feb 30)- No obviously infinite recurrences without
UNTILorCOUNT(some clients dislike this)
Example:
RRULE:FREQ=WEEKLY;BYDAY=MO,WE,FR
✅ 7. Are line endings and folding correct?
ICS prefers:
- CRLF (
\r\n) line endings - Long lines folded with a leading space on continuation lines
Check:
- Long values (especially
DESCRIPTION) are folded, e.g.:
DESCRIPTION:This is a long description that must be folded
onto the next line to be safe.
If in doubt, run the file through a normalizer.
✅ 8. Are you mixing local times and missing VTIMEZONE?
If you use local times with TZID and need Outlook/Exchange compatibility, consider adding a VTIMEZONE block for each zone you use.
If you don’t want to deal with this: prefer UTC with Z.
✅ 9. Sanity checks in multiple clients
Before shipping your ICS generator:
- Import into Google Calendar (web)
- Import into Outlook Web / Office 365
- Import into Apple Calendar (macOS or iOS)
- If needed, test in Outlook Desktop
If it works in all four, your file is in good shape.
✅ 10. Use an automated validator/autofix in your workflow
Manual inspection doesn’t scale. For recurring imports/exports:
- Add a validation step in CI or your ingestion pipeline
- Consider an autofix step before storing or sending ICS files
Example using CorrectICS:
curl -X POST https://api.correctics.com/v1/validate \
-H "Content-Type: text/calendar" \
--data-binary @event.ics