Skip to content

Convert

Merge ICS

Merge ICS

Beta

Drop several .ics calendar exports and download one combined .ics for a single import or archive. Every event is kept by default, each time zone is written once, and an optional dedupe keeps the newest copy of an event that appears in more than one file. Nothing is uploaded.

Use via API
  • Free, no sign-up
  • REST + MCP
  • Updated
  • Reviewed by Olgun Ozoktas

Leave it empty to keep the name every file agrees on, or no name when they differ.

Drop .ics files hereor click to choose several calendar exports
Merged calendar

The merged calendar will appear here..

Why Merge ICS Files in the Browser?

Calendar apps export one .ics file per calendar and import one file at a time. Google Calendar's export is a zip with a separate .ics for every calendar you own; Apple Calendar exports the selected calendar; Outlook saves one calendar per file. To archive all of them in one place, or to move them into a new account with one import, you need one file, and the manual route is opening each export in a text editor and copying every VEVENT block into one VCALENDAR without breaking the folded lines. This page does that copy for you, in your browser, in the order you drop the files. Nothing is uploaded, because a calendar export is a record of who you met and when.

An iCalendar file is one VCALENDAR component holding a header, zero or more VTIMEZONE definitions, and the events, to-dos and journal entries themselves. Merging is a matter of reading every file into that tree, keeping the first VTIMEZONE seen for each TZID, and writing every other component back out under one new header. This page does exactly that. Each component is written with every property it arrived with: recurrence rules, exception dates, alarms, attendees, descriptions, locations and vendor X- properties. The long lines are folded again at 75 octets, and a parameter value that holds a comma, colon or semicolon is written back in quotes, as the format requires.

The header of the merged calendar is rebuilt. VERSION is 2.0 and the PRODID names this tool. CALSCALE and METHOD are kept when every file that states them agrees, and set to GREGORIAN and PUBLISH when they do not. The calendar name is the one you type, else the name every file agrees on, else none. The X-WR-TIMEZONE hint is kept when the files agree on it. Up to twenty files can be merged at once.

Duplicates are your call. By default every copy stays, which is what the popular merge tools do too. With the UID dedupe on, the tool keeps one component per UID and RECURRENCE-ID, choosing the newest by LAST-MODIFIED, then DTSTAMP, then SEQUENCE, and leaves it in the place the first copy held so the file order survives. With New UIDs on, every UID becomes a new deterministic identifier of the form [email protected]; a recurrence master and its exceptions keep sharing one. Recurrence rules are never expanded, no calendar URL is fetched, and the files never leave the browser.

How it compares

Importing calendars one by one works when there are two. With a Google export of six or eight calendars it means six or eight import dialogs, and a re-import later means doing them again. A text editor can join the files, but one broken folded line or a duplicated VTIMEZONE block is enough for an importer to refuse the whole file. Online merge sites upload the calendars to do the same job. This page reads the standard format with its folding and escaping rules, writes one valid calendar, and keeps the files in the tab.

Merge Tips

  • File order is output order. Drop the calendar you want first, first; the events inside each file keep their own order.
  • The dedupe key is the UID together with the RECURRENCE-ID, so a modified occurrence of a recurring meeting is never mistaken for a duplicate of the whole series.
  • Every property is copied as read: RRULE, EXDATE, VALARM, ATTENDEE, DESCRIPTION, LOCATION and the X- properties a calendar app adds. Only the calendar header is rebuilt.
  • A time zone definition (VTIMEZONE) is written once per TZID even when every file carries a copy. The times themselves are never converted; each keeps the zone it was stated in.
  • A file that is not a calendar is reported next to its name and skipped. The other files still merge.

Frequently Asked Questions

How do I export the calendars I want to merge?

Google Calendar: open Settings, choose Import & export, and click Export; the zip holds one .ics per calendar. Apple Calendar: select a calendar and choose File > Export > Export, once per calendar. Outlook desktop: File > Save Calendar, with the date range and detail level under More Options. Drop every .ics on this page; the zip itself is not read, so unzip it first.

Does merging change my events?

No. Every event, to-do and journal entry is written with every property it arrived with, in the order it arrived: RRULE, EXDATE, VALARM, ATTENDEE, DESCRIPTION, LOCATION, and the X- properties a calendar app adds. Two things are rewritten: long lines are folded again at 75 octets, and a parameter value holding a comma, colon or semicolon is written back in quotes. Both are required by the format, and a calendar app reads the result as the same event.

What happens to events that appear in more than one file?

By default they all stay, so the merge never drops anything on its own. Turn on Remove duplicates by UID to keep one copy per UID and RECURRENCE-ID. The copy kept is the newest by LAST-MODIFIED, then DTSTAMP, then SEQUENCE; when none of those differ, the first copy seen stays. The line under the output reports how many duplicates were removed.

Why does a modified occurrence of a recurring meeting survive the dedupe?

Because a modified occurrence shares the UID of its series and adds a RECURRENCE-ID naming the occurrence it replaces. The dedupe key is the UID and the RECURRENCE-ID together, so the series master and each modified occurrence are different keys. A tool that deduped on UID alone would keep one of them and lose either the rule or the exception.

What does New UIDs do, and when should I use it?

A calendar app matches an imported event to one it already holds by UID; a match updates the existing event instead of adding one. New UIDs rewrites every UID to a fresh deterministic value, so the import adds the events as new. Use it when an app refuses an import because the events already exist, or when you want a second copy of a calendar. The same input always produces the same new UIDs, and a recurrence master and its exceptions keep sharing one.

Which name and time zone does the merged calendar get?

The name you type is written as X-WR-CALNAME. If you leave it empty, the merged file keeps the name when every input carries the same one, and carries no name when they differ, so a calendar app asks you instead of guessing. The X-WR-TIMEZONE hint follows the same rule. CALSCALE and METHOD are kept when the inputs agree and set to GREGORIAN and PUBLISH when they do not.

How are time zones handled?

A VTIMEZONE definition is written once per TZID. When every file carries its own copy of Europe/Istanbul, the merged file carries the first one seen. The times themselves are never converted: each DTSTART and DTEND keeps the TZID parameter or the trailing Z it was stated with. Converting would need the zone rules of the reader's calendar, and a silent guess is worse than the value the file already states.

Can I merge Google Calendar, Apple Calendar and Outlook exports together?

Yes. All three write the same RFC 5545 format, and the events from each are copied as they are. The PRODID line in the header, which names the app that wrote the file, is replaced by one naming this tool, because the merged file no longer comes from any one of them. Vendor X- properties inside the events stay.

One of my files could not be read. Do the others still merge?

Yes. A file that is empty, is not a calendar, or has no VCALENDAR component is reported next to its name with the reason, and the merge continues with the rest. A calendar with no events, to-dos or journal entries is skipped the same way. Only when no file at all can be read does the page show an error instead of an output.

Is my calendar uploaded anywhere?

No. The files are read and merged in your browser, and no request carries the calendar text. You can confirm that in the browser's network panel while merging. The tool also never fetches a calendar URL: it merges the files you drop, nothing else.

Can I merge calendars from a script?

Yes. The same code runs on the FindUtils API and MCP server as the merge_ics tool. Pass the .ics texts as the inputs array, at most twenty, with the same dedupe_uid, regenerate_uids and calendar_name options, and read the merged calendar from the ics field of the result along with the counts and a per-file report.

Rate This Tool

0/1000

Get Weekly Tools

Suggest a Tool