ICS Diff
BetaCompare two .ics exports of the same calendar and see which events were added, removed or changed, matched by UID, with the before and after value of every changed field. Download the report and the added or removed events as calendars of their own. On this page, both files are read in your browser and nothing is uploaded.
- Free, no sign-up
- REST + MCP
- Updated
- Reviewed by Olgun Ozoktas
Matched by UID + RECURRENCE-ID
Before (A)
After (B)
Differences
How to Compare Two ICS Files
-
Export the calendar twice
before and after the change, or from the two apps you want to compare. In Google Calendar, Settings > Import & export > Export; Apple Calendar: File > Export; Outlook: File > Save Calendar. -
Drop the older export on Before (A) and the newer one on After (B)
-
Read the counts and the table
Each changed event lists the fields that differ, with the old value and the new one. -
Download the JSON report for a record, and added.ics or removed.ics to import or restore just those events
Common Use Cases
Migrations
Sync problems
Shared calendars
Restores
Generated calendars
Why Compare Two Calendar Exports?
The comparison reads both files into their components and matches entries by UID together with RECURRENCE-ID, the same identity a calendar app uses when it imports a file and the same key Merge ICS dedupes on. An entry only in After is added, an entry only in Before is removed, and an entry in both is compared field by field. Entries without a UID are listed apart and never matched; when one UID appears more than once in a file, the copies are paired in file order and a note says so.
A field is a property name such as SUMMARY, DTSTART, LOCATION or ATTENDEE, or a sub-component such as VALARM. A field counts as changed when the set of its values differs, so property order, line folding and the order of parameters are not changes. For a repeated field such as ATTENDEE or CATEGORIES, only the values that differ are shown: one new attendee shows as that one attendee, not the whole list. Values are shown with their parameters and with text escapes removed. DTSTAMP, LAST-MODIFIED and SEQUENCE are left out by default because calendar apps rewrite them on every export.
Times are compared as written and never converted between zones, and recurrence rules are compared as text, not expanded: a changed RRULE shows as a change to the RRULE field. The added and removed entries can be downloaded as calendars of their own, with the header of their source file and the VTIMEZONE blocks they use. The JSON report holds every difference with its fields.
How it compares
A line-by-line text diff of two .ics files reports every refolded line, every reordered property and every new DTSTAMP, and buries the one meeting that moved. Comparing two calendar apps by eye works for a week of events, not a year. This page compares the files the way a calendar app reads them, event by event and field by field, and leaves out the stamps that change on every export.
Comparison Tips
- Put the older file on Before (A). Added means only in After, removed means only in Before.
- A modified occurrence of a recurring meeting has the series UID plus a RECURRENCE-ID, so it is compared as its own entry, never against the series.
- An event without a UID cannot be matched safely, so it is listed apart instead of being guessed.
- Turn off the DTSTAMP, LAST-MODIFIED and SEQUENCE option to see every stamp a calendar app rewrote.
- Times are compared as written: the same meeting stated in UTC in one file and in Europe/Istanbul in the other shows as a DTSTART change.