[ Back to all articles ](https://addcal.co/blog.md)

ics files icalendar webcal calendar formats explainers guides

What Is an ICS File? ICS vs iCal vs webcal Explained
====================================================

By Tom •July 22, 2026

Three terms get used interchangeably in calendar documentation, support articles and vendor UIs: ICS, iCal, and webcal. They are not the same thing, and not even the same *kind* of thing. One is a file format, one is a defunct product name that stuck, and one is a URL scheme.

Vendors have been loose with the terminology for twenty years, which is where most of the confusion comes from. Here is what each one means and which to use when.

ICS vs iCal vs webcal: the short version
----------------------------------------

| Term | What it really is | Example |
| --- | --- | --- |
| iCalendar | The data format specification, defined by RFC 5545 | The rules that say an event is a `VEVENT` |
| .ics | The file extension for a document in that format | `invite.ics` |
| iCal | Apple's old calendar app name, now just "Calendar". Colloquially used to mean iCalendar. | "Send me the iCal feed" |
| webcal:// | A URL scheme signalling "subscribe to this", not a format | `webcal://example.com/feed.ics` |
| text/calendar | The MIME type servers use to label iCalendar data | An HTTP response header |

Every one of those rows describes iCalendar data. They differ only in whether they are talking about the specification, the file, the app, the transport hint, or the content type label.

iCalendar is the specification
------------------------------

iCalendar is a data interchange format standardised by the IETF. It first appeared as RFC 2445 in 1998 and was superseded by **RFC 5545** in 2009, which is what everything implements today.

The spec describes a plain-text structure of nested components and properties. A calendar is a `VCALENDAR`. Inside it sit `VEVENT` components for events, `VTODO` for tasks, `VJOURNAL` for notes, `VFREEBUSY` for availability, and `VTIMEZONE` for timezone definitions. Properties such as `DTSTART`, `SUMMARY`, `UID` and `RRULE` carry the actual data.

Related RFCs extend it: 5546 defines iTIP, the scheduling protocol behind invitations and replies; 6047 defines iMIP, which is iTIP delivered over email; 7986 adds properties like `COLOR` and `REFRESH-INTERVAL`. Strictly speaking, iCalendar is the correct name for the format, and almost nobody says it. The anatomy section below walks through the lines that matter.

.ics is the file extension
--------------------------

`.ics` is simply the conventional filename extension for a document written in iCalendar format. It stands for iCalendar Stream or iCalendar Sync depending which source you believe, and it does not matter.

What matters is that `.ics` is what an operating system uses to decide which application opens a file. Double-click `schedule.ics` and Windows hands it to Outlook, macOS to Calendar. Rename it `schedule.txt` and it opens in a text editor, with identical contents.

### The other extensions

You will occasionally run into variants:

- **`.ical`** and **`.icalendar`** are alternative extensions listed in the IANA registration for `text/calendar`. They are valid, contain exactly the same format, and are supported inconsistently. Use `.ics`.
- **`.ifb`** is used for free/busy data, meaning a file whose payload is a `VFREEBUSY` component rather than events. Same format, different content.
- **`.vcs`** is genuinely different. It is vCalendar 1.0, the pre-standard predecessor from 1996. Superficially similar, but the escaping rules, the timezone handling and several property names differ. Some old phone and PDA exports still produce it. Modern clients often accept it, but do not assume a `.vcs` file will parse cleanly as ICS.

If you have a file and are not sure what it actually contains, the [free ICS viewer](https://addcal.co/tools/ics-viewer.md) parses it and shows you the components, regardless of what the extension claims.

What is inside an ICS file
--------------------------

An ICS file is plain text. Open one in a text editor and you see readable key and value pairs, which is the most useful thing to know about it: when an event imports at the wrong time, the answer is almost always visible in the raw file. Here is a small but complete one.

```
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//AddCal//EN
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:Europe/London
BEGIN:STANDARD
DTSTART:19701025T020000
TZOFFSETFROM:+0100
TZOFFSETTO:+0000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19700329T010000
TZOFFSETFROM:+0000
TZOFFSETTO:+0100
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
UID:9f2c1a70-team-standup@addcal.co
DTSTAMP:20260114T093000Z
DTSTART;TZID=Europe/London:20260119T093000
DTEND;TZID=Europe/London:20260119T094500
SUMMARY:Weekly product standup
LOCATION:Meeting Room 2\, Level 4
RRULE:FREQ=WEEKLY;BYDAY=MO;COUNT=12
END:VEVENT
END:VCALENDAR
```

### The lines that matter

- **`VERSION:2.0` and `PRODID`** are required. The second names the software that wrote the file, which is the first thing to check when debugging someone else's export.
- **`UID`** is the event's identity and must stay stable across updates. Re-send a file with the same `UID` and a compliant client updates the event in place; generators that mint a fresh `UID` every time are why re-imports create duplicates.
- **`DTSTAMP`** is when this version of the event was written, always in UTC. With `SEQUENCE` it tells a client which of two copies is newer.
- **`DTSTART` and `DTEND`** come in three forms: UTC with a trailing `Z`, local time with a `TZID` that must be defined by a `VTIMEZONE` in the same file, or floating time with neither, which means "this wall-clock time wherever the reader is" and is rarely what you want. Recurring events should use the `TZID` form so "every Monday at 09:30" survives the clocks changing.
- **All-day events** use `DTSTART;VALUE=DATE:20260119`, and `DTEND` is exclusive: a one-day event on the 19th ends on the 20th. Files that get this wrong show up a day short or a day long.
- **`SUMMARY`, `LOCATION`, `DESCRIPTION`** are plain text. Commas, semicolons and backslashes are escaped with a backslash and newlines are written as `\n`, which is why the example has `Meeting Room 2\, Level 4`.
- **`RRULE`** defines recurrence: `FREQ` plus modifiers such as `BYDAY` and `INTERVAL`, ended by `COUNT` or `UNTIL`. Skip an instance with `EXDATE`, or override one with a second `VEVENT` carrying the same `UID` and a `RECURRENCE-ID`.
- **`METHOD`** changes how the whole file is treated. `PUBLISH` means "here is an event, add it". `REQUEST` means a meeting invitation that expects a reply, so clients draw Accept and Decline buttons and email the organiser; new Outlook refuses a `REQUEST` file opened from disk. Use `PUBLISH`, or no `METHOD` line, for anything you share broadly.
- **Line folding.** No line may exceed 75 octets. Longer lines are broken and continued on the next line after a single space, and the limit is in bytes, so a fold must not split a multi-byte character. Lines end with CRLF. A naive line-by-line parser breaks on both, which is what the [ICS viewer](https://addcal.co/tools/ics-viewer.md) handles for you.

### Where the format falls down

An attached file is a snapshot. Once someone has imported it you cannot change their copy except by re-sending with the same `UID` and a higher `SEQUENCE`, which needs their address and a client that honours updates. Mobile clients handle attachments badly, Google Calendar's app has no import at all and caps web imports at 1MB, `DESCRIPTION` is plain text so formatting is flattened, and complex recurrence rules expand differently across clients. For anything that might change, a hosted [add to calendar link](https://addcal.co/solutions/add-to-calendar-links.md) resolves live and sidesteps all four.

iCal was an Apple app
---------------------

Here is where the muddle comes from. Apple shipped a calendar app called **iCal** in 2002 with Mac OS X Jaguar. It was one of the earliest consumer apps to implement the iCalendar standard properly, and popular enough that "iCal" became shorthand for calendar data generally.

Apple renamed the app to **Calendar** in OS X Mountain Lion in 2012. Nobody updated their vocabulary. Product managers still write "iCal feed" in their UIs, support docs still say "download the iCal file", and every developer knows exactly what is meant.

So when someone asks for "the iCal link", they mean one of two things and you need to work out which:

- **A file**, that is a downloadable `.ics` document containing a snapshot of the events.
- **A feed**, that is a URL that serves iCalendar data on request and can be subscribed to.

In practice, "iCal feed" or "iCal URL" almost always means the second. "iCal file" means the first. If the distinction matters, ask, because getting it wrong means either sending a static file that never updates or sending a subscription URL to someone who wanted a one-off event.

webcal:// is a URL scheme, not a format
---------------------------------------

`webcal://` is the term that confuses people most, because it looks like a protocol and it is not one.

There is no webcal protocol. Nothing implements a network transport called webcal. When a client encounters `webcal://example.com/feed.ics`, it rewrites the scheme to `http://` or `https://` and makes an ordinary HTTP request. The bytes that come back are ordinary iCalendar data with a `text/calendar` content type.

What the scheme does is signal *intent*. A browser given an `https://` link to an ICS file will download it, because that is what browsers do with files. Given a `webcal://` link, the browser does not handle it at all: it passes the URL to the OS, which hands it to the registered calendar app, which interprets it as "subscribe to this feed and keep polling it".

Same data, same server, same file. Different scheme, completely different user experience. One gives you a static copy in your Downloads folder, the other gives you a calendar that stays current.

`webcal://` was never standardised. It originated with Apple and was picked up by everyone else because it solved a real problem, working across Apple Calendar, Outlook and most third-party clients. Google Calendar is the exception: it handles a `webcal://` link clicked in Chrome, but its "Add calendar from URL" field only accepts `http` and `https`. The [deep dive on webcal URLs](https://addcal.co/blog/what-is-webcal-subscription-calendar-urls.md) covers refresh intervals, security and how to build one.

text/calendar is the MIME type
------------------------------

The last piece. When a server sends iCalendar data over HTTP, or an email client attaches it to a message, the content is labelled with the MIME type `text/calendar`, registered in RFC 5545.

It takes optional parameters that carry meaning:

```
Content-Type: text/calendar; charset=utf-8; method=REQUEST; component=VEVENT
```

The `method` parameter mirrors the `METHOD` property inside the file and tells the receiving client whether this is a scheduling request needing an RSVP, or a published event to simply add. Mail clients use it to decide whether to render Accept and Decline buttons.

This header is also why the same file can behave completely differently depending on how it is served. A correctly labelled feed opens in a calendar app. The same bytes served as `application/octet-stream` get downloaded as an anonymous file that iOS may refuse to open at all, which is a common cause of the "nothing happens when I tap it" complaints in the [iPhone and Apple Calendar guide](https://addcal.co/blog/how-to-add-an-ics-file-to-iphone-apple-calendar.md).

ICS or iCal or webcal: which should you use?
--------------------------------------------

Decide based on what you are trying to achieve, not what the other party called it.

### Use a downloadable .ics file when

You have a single event that will not change and you want it to work with no infrastructure. The recipient gets a copy they own and can edit. You get no ability to update it and no visibility into who added it. Build one with the [free ICS file generator](https://addcal.co/tools/ics-generator.md).

### Use a webcal:// or https:// feed when

You have an ongoing set of events that changes: a fixture list, a term calendar, a rota, a release schedule. Subscribers get updates automatically, and removing an event from the feed removes it from their calendar. This is the model described on the [subscription calendars](https://addcal.co/solutions/subscription-calendars.md) page.

The trade-off is refresh lag, which is worst on Google at roughly 24 hours, and the fact that subscribed events are read-only for the recipient.

### Use an add to calendar link when

You are sending one event to many people across unknown platforms. A file forces everyone through a download step, and mobile clients handle that badly, particularly the [Google Calendar mobile app](https://addcal.co/blog/how-to-add-an-ics-file-to-google-calendar.md), which has no import function at all. A subscription is overkill for a single event and few people will subscribe to a feed for one webinar.

A hosted link detects the platform and routes each recipient to the right destination: a Google Calendar deep link, an Outlook web link, or the native handler on iOS. That is what [add to calendar links](https://addcal.co/solutions/add-to-calendar-links.md) do, and it removes the whole class of "it did not work on my phone" problems.

Getting the terminology right in your own docs
----------------------------------------------

A few habits save your users a lot of confusion:

- Say "ICS file" for a download and "calendar subscription URL" for a feed. Both are unambiguous.
- Avoid "iCal" unless your audience already uses it, in which case match their vocabulary.
- Never call webcal a format or a protocol. It is a link type.
- If you offer both, label them separately. "Download a copy" versus "keep this calendar up to date" tells people everything they need.

None of this changes what the bytes look like. Every option above ships the same RFC 5545 payload. What differs is whether the recipient gets a snapshot or a living calendar, and whether you can fix a mistake after you have hit send.

ICS file FAQs
-------------

### What does ICS stand for?

ICS is short for iCalendar, the specification the file implements, defined by RFC 5545. The same format is called iCal colloquially and `text/calendar` in MIME terms. All three describe the same thing.

### Are ICS and iCal the same thing?

Effectively yes. ICS is the file extension, iCalendar is the format, and iCal was the name of Apple's calendar app until it became Calendar in 2012. People use iCal to mean any of the three. Webcal is the one that is genuinely different: it is a URL scheme for subscribing to a feed, not a file format.

### How do I open an ICS file?

Double-click it. Windows hands it to Outlook or the Calendar app, macOS to Apple Calendar, and you confirm before it is saved. To read it rather than import it, open it in any text editor, since it is plain text. The import paths differ by platform, so see the walkthroughs for [Google Calendar](https://addcal.co/blog/how-to-add-an-ics-file-to-google-calendar.md), [iPhone and Apple Calendar](https://addcal.co/blog/how-to-add-an-ics-file-to-iphone-apple-calendar.md) and [Outlook](https://addcal.co/blog/how-to-add-an-ics-file-to-outlook.md).

### How do I create an ICS file?

Every calendar app exports one. Google Calendar exports from the web only, under Settings, then Import and export; Apple Calendar on a Mac exports a whole calendar from File, then Export; classic Outlook saves one from File, then Save Calendar, while Outlook on the web publishes an ICS link instead of a file. Writing one by hand is fine too: the minimum is a `VCALENDAR` wrapper around one `VEVENT` with `UID`, `DTSTAMP`, `DTSTART` and `SUMMARY`, and the example above is a complete valid file. The [free ICS generator](https://addcal.co/tools/ics-generator.md) builds one from a form with the timezone handled.

### Can an ICS file contain more than one event?

Yes. One `VCALENDAR` can hold any number of `VEVENT` components, which is how a whole calendar export fits in one file. Google Calendar caps imports at 1MB, so large exports sometimes need splitting.

### Why did my event import at the wrong time?

Almost always a timezone problem. Either `DTSTART` was written as floating local time with no zone, or it names a `TZID` whose `VTIMEZONE` is missing from the file, or the zone name is a Windows one Google does not recognise. Open the file and check whether `DTSTART` ends in `Z`, carries a `TZID`, or has neither; [ICS timezone wrong in Google Calendar](https://addcal.co/blog/ics-timezone-wrong-in-google-calendar.md) walks through each case.

### Why do I get duplicate events when I reimport a file?

Because the `UID` changed. A compliant client matches on `UID` and updates the existing event when it recognises one. Generators that emit a fresh random `UID` on every export defeat that, so each import creates another copy.

### Is it safe to open an ICS file?

The format is inert plain text with no scripting, so opening one carries little risk in itself. Ordinary caution applies to the contents: a `DESCRIPTION` or `URL` can link anywhere, and calendar invitations from unknown senders are a known phishing route. Read it in a text editor first if you are unsure.

To see what you are actually dealing with, try the [ICS viewer](https://addcal.co/tools/ics-viewer.md), or pull the events into a spreadsheet with the [ICS to CSV converter](https://addcal.co/tools/ics-to-csv.md). Both are free and need no account.

 Last updated on October 30, 2026

![Tom](https://cdn.addcal.co/static/authors/atymic.jpg)### Tom

Founder

Built Calndr.link in 2020 because an event link broke in Outlook and it annoyed him enough to fix it properly. Six years later he can tell you exactly how each calendar app mangles a timezone, which is a worse party trick than it sounds. Otherwise found hanging off a rock somewhere in Australia.

[GitHub](https://github.com/atymic)[X](https://x.com/atymic)

###  Related articles 

[What Is webcal? Subscription Calendar URLs Explained The webcal scheme tells a device to subscribe to a calendar rather than download it. It is not a protocol and it was never standardised, but it is universally supported. How it works, refresh intervals per client, how to build a feed, and why the URL is the credential.](https://addcal.co/blog/what-is-webcal-subscription-calendar-urls.md)[How to Add an ICS File to Outlook Outlook is four different products, and each handles ICS files differently. Classic Outlook alone offers three import options with three different outcomes. Here is what each one does and how to fix the usual timezone and recurrence problems.](https://addcal.co/blog/how-to-add-an-ics-file-to-outlook.md)[How to Add an ICS File to iPhone and Apple Calendar Opening an ICS file on an iPhone is easy. Working out which calendar it landed in, or why it shows on the wrong day, is the hard part. A full guide to iOS, macOS, iCloud sync and subscribed calendars.](https://addcal.co/blog/how-to-add-an-ics-file-to-iphone-apple-calendar.md)

[ Browse all articles ](https://addcal.co/blog.md)
