An ICS validator checks that an iCalendar file follows RFC 5545 before you rely on it. A malformed .ics may import silently wrong, drop events, or be rejected outright by strict apps. This free tool parses the file structure and the required properties of each component, then lists exactly what is missing or malformed — all in your browser.
How it works
The validator unfolds the file (joining continuation lines that begin with a space or tab), then walks it line by line:
- Structure. It maintains a stack of
BEGIN:components and matches eachEND:. Mismatched or unclosed components are errors, and the outermost component must beVCALENDAR. - Calendar properties.
VERSIONandPRODIDare required directly insideVCALENDAR. - Component requirements. A
VEVENTneedsUIDandDTSTAMP; aVTODOneeds the same; aVTIMEZONEneedsTZIDand at least oneSTANDARDorDAYLIGHTsub-component. - Value checks. Date and date-time values are tested against the allowed patterns, and lines without a property name before the colon are flagged.
Each issue is reported with the line number and component so you can jump straight to it. Warnings cover non-fatal style issues like bare-newline line endings.
Required properties by component
Understanding what each component must contain helps you fix errors quickly:
VCALENDAR (the wrapper)
VERSION:2.0— required, must be exactly 2.0 for RFC 5545PRODID— required, identifies the software that created the file (for example-//Google Inc//Google Calendar 70.9054//EN)
VEVENT
UID— required; a globally unique identifier for this event. Missing UID is the most common error and causes calendar apps to duplicate the event on every import.DTSTAMP— required; the UTC timestamp of when this event record was created.DTSTART— required for most event types; the start date or date-time.SUMMARY— not required by RFC 5545 but expected by virtually all calendar apps for display.
VTODO
UID— requiredDTSTAMP— required
VTIMEZONE
TZID— required; the time zone identifier matching anyTZID=references in the file- At least one
STANDARDorDAYLIGHTsub-component defining the UTC offset rules
Common errors and how to fix them
| Error | Cause | Fix |
|---|---|---|
| Missing UID | Exporter omitted it | Add a globally unique string, for example a UUID |
| Unbalanced BEGIN/END | Nested component not closed | Find the mismatched END and add the missing one |
| Invalid DTSTART format | Date uses slashes or spaces | Use YYYYMMDD or YYYYMMDDTHHmmssZ format |
| Missing VERSION | Wrapper has no version | Add VERSION:2.0 inside BEGIN:VCALENDAR |
| Line-ending warning | Exporter used LF not CRLF | Most apps accept it; only fix if the destination is strict |
What the validator does not check
- Whether dates and times describe the event you intended (it only checks the format is valid)
- Recurrence rule correctness —
RRULEis validated as a property but its logic is not simulated - Whether referenced TZIDs have matching VTIMEZONE definitions (a warning may appear but is not a hard error)
Tips
- A file can be structurally valid yet still import incorrectly — validate form here, then verify the event appears as expected after import.
- The missing
UIDerror is the most important to fix; without it, re-importing the file will create duplicate events. - Pair this with the ICS merger to combine and then validate the merged result.
- All processing is local. Calendar content including attendee details and private event notes never leave your browser.