# Calendar subscription URLs for external calendar apps

**URL:** https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902
**Category:** Announcements
**Tags:** events, bookmarks
**Created:** [March 20, 2026, 5:15pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902 "2026-03-20T17:15:06Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [March 20, 2026, 5:15pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/1 "2026-03-20T17:15:06Z")

</div>

We’ve added a new **Calendar** tab to user preferences that lets you subscribe to Discourse feeds in external calendar apps like Google Calendar, Apple Calendar, and Microsoft Outlook.

 ![image](https://global.discourse-cdn.com/meta/original/4X/d/3/b/d3b31c5bc021f24d6ea14cd2083d8b377f7f85aa.png)

⬇

 ![image](https://global.discourse-cdn.com/meta/original/4X/2/a/4/2a4e2213b47565970d2366564beb9f8b324d703b.png)

## How it works

Navigate to your **Preferences → Calendar** tab and click **Generate Subscription URLs**. You’ll get one-click subscribe buttons for:

- **Google Calendar** — opens Google Calendar with the feed pre-filled
- **Microsoft Outlook** — opens Outlook’s web subscription dialog
- **Apple Calendar** — triggers the native Calendar app via `webcal://`
- **Copy URL** — for any other calendar app that supports ICS feeds

## Available feeds

**Always available:**

- **Bookmarked Reminders** — your bookmarks that have reminder dates

**With the [discourse-calendar](https://meta.discourse.org/t/discourse-calendar/97376) plugin enabled:**

- **All Events** — all forum events
- **My Events** — events you’re going to or interested in

## For plugin developers

Plugins can register additional ICS feeds using the new `register_calendar_subscription_feed` API. Feeds registered this way automatically appear in the Calendar preferences tab when the plugin is enabled.

## Security

Subscription URLs use scoped user API keys restricted to read-only ICS format access. Keys are rate-limited, and URLs are displayed only once at generation time — users can regenerate at any time, which revokes the old URLs.

---

<div class="post-metadata">

### Author: ![hellekin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hellekin/32/51636_2.png) [@hellekin](https://meta.discourse.org/u/hellekin)
#### Post date: [March 21, 2026, 6:28pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/2 "2026-03-21T18:28:43Z")

</div>

Thank you @Falco, but how do you remove the corporate options? I find it offensive for my community to have to see advertising for proprietary services.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [March 21, 2026, 6:36pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/3 "2026-03-21T18:36:20Z")

</div>

You can hide it with CSS.

---

<div class="post-metadata">

### Author: ![Thomas\_Rother](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thomas_rother/32/423597_2.png) [@Thomas\_Rother](https://meta.discourse.org/u/Thomas_Rother)
#### Post date: [March 21, 2026, 8:55pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/4 "2026-03-21T20:55:07Z")

</div>

Thanks a lot for this implementation - this will increase the usability of the calendar/events plugin for many communities!

I have the same objection as @hellekin: within Discourse, we are in an Open Source environment. In our community, nobody use either Google Calendar or Microsoft. If users need a link for these proprietary services, they should decide by themselves, not the application. Thus I would prefer to select the kind of external Calendar service upon the creation step of the subscription URLs (e.g. with some check boxes), not later.

---

<div class="post-metadata">

### Author: ![Thomas\_Rother](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thomas_rother/32/423597_2.png) [@Thomas\_Rother](https://meta.discourse.org/u/Thomas_Rother)
#### Post date: [March 21, 2026, 9:28pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/5 "2026-03-21T21:28:13Z")

</div>

# “filter”enhancement

We have multiple communities on our discourse instance. They are separated by group permissions and some users are member of more than one community. It would be convenient to filter the “Discourse Calendar - All Events” URL so that it only displays a particular communities calendar entries. Sample URL

```plaintext
https://discourse.example.com/discourse-post-event/events.ics?user_api_key=c2aa22d800dd473b62d199d796742382&group=[groupname]

```

With this enhancement it would be possible to share the Discourse events of a particular (!) community on their own website, eg. with the WordPress plugin “ICS calendar”

---

<div class="post-metadata">

### Author: ![Thomas\_Rother](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thomas_rother/32/423597_2.png) [@Thomas\_Rother](https://meta.discourse.org/u/Thomas_Rother)
#### Post date: [March 22, 2026, 7:44am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/6 "2026-03-22T07:44:54Z")

</div>

Another small proposed enhancement: if you want to subscribe the Discourse events on two different clients (e.g. Thunderbird on two devices), you need to copy the url two times. But currently the URL is only displayed once. If you add a second client you have to regenerate the URLs and the you loose the first ones.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [March 22, 2026, 12:45pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/7 "2026-03-22T12:45:12Z")

</div>

> [@Thomas\_Rother](#):
>
> It would be convenient to filter the “Discourse Calendar - All Events” URL so that it only displays a particular communities calendar entries. Sample URL
> 
> ```plaintext
> https://discourse.example.com/discourse-post-event/events.ics?user_api_key=c2aa22d800dd473b62d199d796742382&group=[groupname]
> 
> ```

Doesn’t a feed generated by a user in one of those groups already works that way? Did you test it?

> [@Thomas\_Rother](#):
>
> if you want to subscribe the Discourse events on two different clients (e.g. Thunderbird on two devices), you need to copy the url two times.

You need to copy only once, then paste in the two clients you need.

And if you forget a client, you can regenerate with one click.

---

<div class="post-metadata">

### Author: ![Heliosurge](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/heliosurge/32/571810_2.png) [@Heliosurge](https://meta.discourse.org/u/Heliosurge)
#### Post date: [March 22, 2026, 12:55pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/8 "2026-03-22T12:55:43Z")

</div>

This is pretty cool. A feed idea might also be the Saved Searches plugin

---

<div class="post-metadata">

### Author: ![Thomas\_Rother](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thomas_rother/32/423597_2.png) [@Thomas\_Rother](https://meta.discourse.org/u/Thomas_Rother)
#### Post date: [March 22, 2026, 6:20pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/9 "2026-03-22T18:20:52Z")

</div>

> [@Falco](#):
>
> You need to copy only once, then paste in the two clients you need.
> 
> And if you forget a client, you can regenerate with one click.

I understand, but my point is the required regeneration after the URLs are shown first.

If I use the calendar link on two different devices, they are probably not available for configuration at the same time. I would access my Discourse profile from the first device and later again from the second device. It would be better to show the old URL again and only invalidate it by explicit request

---

<div class="post-metadata">

### Author: ![Thomas\_Rother](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thomas_rother/32/423597_2.png) [@Thomas\_Rother](https://meta.discourse.org/u/Thomas_Rother)
#### Post date: [March 22, 2026, 6:28pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/10 "2026-03-22T18:28:37Z")

</div>

> [@Falco](#):
>
> Doesn’t a feed generated by a user in one of those groups already works that way? Did you test it?

If I am a member of two different communities (and their permission groups), the “[https://discourse.example.com/discourse-post-event/events.ics“](https://discourse.example.com/discourse-post-event/events.ics%E2%80%9C) shows the events of **both** communities. Thats correct so far. But both communities may have their own website. If I want to share the events from Discourse on their websites, I would only want to see the events of “community A” but not “community B”. And vice versa.

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [March 31, 2026, 12:42am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/11 "2026-03-31T00:42:45Z")

</div>

I’ve been using this with Google Calendar - and it really is great!

Changes to events don’t seem to be pulling through to this though - whether edits or deletions.

Any idea why these don’t appear to be syncing with Google?

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [March 31, 2026, 12:59am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/12 "2026-03-31T00:59:21Z")

</div>

Google Calendar fetches updates twice a day on average, so changes take some hours to reflect.

---

<div class="post-metadata">

### Author: ![nathank](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nathank/32/290039_2.png) [@nathank](https://meta.discourse.org/u/nathank)
#### Post date: [March 31, 2026, 8:51am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/13 "2026-03-31T08:51:23Z")

</div>

Ah yes, they have sync’d now.

That is very good to know. Don’t expect last minute changes to be pushed out / communicated automatically!

Is it similar for other services?

---

<div class="post-metadata">

### Author: ![gilles](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gilles/32/549022_2.png) [@gilles](https://meta.discourse.org/u/gilles)
#### Post date: [March 31, 2026, 9:03am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/14 "2026-03-31T09:03:43Z")

</div>

If you’re talking about calendar services from other providers, the principle is the same: 1 to 2 times per day. Back then, I didn’t find a way to increase the number of synchronizations. Later, I realized it’s actually quite normal, given the sheer number of calendars being synchronized worldwide 🤣 I think they limit it to avoid overloading their servers!

Maybe I’m wrong though.

---

<div class="post-metadata">

### Author: ![Thomas\_Rother](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/thomas_rother/32/423597_2.png) [@Thomas\_Rother](https://meta.discourse.org/u/Thomas_Rother)
#### Post date: [April 1, 2026, 6:40am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/15 "2026-04-01T06:40:56Z")

</div>

Feedback after some real live testing:

Background: our Discourse instance is shared between multiple user groups/communities which have their separate permission groups. We have a main category for each of these groups. This categorty is publicly visible and the content is federated into Fediverse (Discourse ActivityPub). It also displays a public calendar. Example ([https://forum.netzwissen.de/c/meshcore-str/84](https://forum.netzwissen.de/c/meshcore-str/84)):

 ![Pasted image 20260401075142](https://global.discourse-cdn.com/meta/original/4X/e/a/3/ea36bdd60e00a31e3928e28ce57a607f4bdcc887.png)

Pasted image 20260401075142.png

The calendar displays events from posts in the main category and also from sub-categories. Event posts in the sub-categories (which are only visible **“logged in”** with the communities permission group) are not shown on the main calendar for anonymous users (not logged in). Perfect - this is the expected functionality!

I see two requirements which would make the ics calendar link “feature complete”. We use the new ics calendar link to share Events created in Discourse on the public websites of the communities (CMS: WordPress).

1. events shown in the ics file should be “filterable” by community/permission group. Proposed syntax:

```plaintext
[ics_calendar url="https://discourse.example.com/discourse-post-event/events.ics?user_api_key=[xxxx];group=[discourse_group_id]"]

```

1. the ics file should only display events with status “public”. Event status “private” or “standalone” should generally not be published in the ics file. Note: I haven’t tested yet if this is already implemented …

---

<div class="post-metadata">

### Author: ![raucao](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/raucao/32/549164_2.png) [@raucao](https://meta.discourse.org/u/raucao)
#### Post date: [April 1, 2026, 9:50am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/16 "2026-04-01T09:50:41Z")

</div>

This is a great addition! 👏

Unfortunately, even though the Calendar plugin is enabled (and we’ve been using it regularly), only the Bookmarks subscription is being created when I generate the URLs for my user. Any ideas for why this might be the case?

I also agree with @Thomas_Rother that subscription URLs should be shown until revoked/regenerated. Devices and apps change over time, and having to re-subscribe on all devices, just because you want to add one more, is tedious and seems unnecessary. Maybe it could be a plugin config option, depending on the sensitivity of event data.

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [April 1, 2026, 4:52pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/17 "2026-04-01T16:52:02Z")

</div>

> [@raucao](#):
>
> Unfortunately, even though the Calendar plugin is enabled (and we’ve been using it regularly), only the Bookmarks subscription is being created when I generate the URLs for my user. Any ideas for why this might be the case?

You need to have the setting `Discourse post event enabled` enabled for it to show.

---

<div class="post-metadata">

### Author: ![raucao](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/raucao/32/549164_2.png) [@raucao](https://meta.discourse.org/u/raucao)
#### Post date: [April 2, 2026, 9:23am UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/18 "2026-04-02T09:23:12Z")

</div>

We have been using post events for years:

 ![image](https://global.discourse-cdn.com/meta/original/4X/f/4/c/f4ca2ec4c112581feead49e70d434bc96bf797c6.png)

Could it be a problem with installations that were using the separate plugin before? I also tried de- and reactivating the plugin, but it didn’t solve the problem.

**Edit:** Just confirmed, it’s not showing the events in posts anymore. So it’s an issue with the plugin migration, not the subscription feature. Will find out what happened.

---

<div class="post-metadata">

### Author: ![tobiaseigen](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tobiaseigen/32/539204_2.png) [@tobiaseigen](https://meta.discourse.org/u/tobiaseigen)
#### Post date: [April 9, 2026, 9:25pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/19 "2026-04-09T21:25:32Z")

</div>

I came here looking for just this feature so am so glad it has been implemented!

I share the feedback of @hellekin and @Thomas_Rother about the corporate links. If these could be made optional, that would be great. Many people use Discourse because they believe in digital sovereignty so having these logos appear is not appropriate.

More important is discoverability of the feature. It’s buried in the user preferences but would be so welcome directly on the calendar UI navigation. Click “Upcoming events” and then see a link to subscribe would be gold. 🥇

---

<div class="post-metadata">

### Author: ![gilles](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gilles/32/549022_2.png) [@gilles](https://meta.discourse.org/u/gilles)
#### Post date: [April 9, 2026, 11:01pm UTC](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902/20 "2026-04-09T23:01:10Z")

</div>

You have the solution here

> [@Single click activation of the Create Event modal](https://meta.discourse.org/t/single-click-activation-of-the-create-event-modal/400169?u=gilles):
>
> I’ve been using the Calendar and Events functionality extensively over the past 3 years, across multiple self-hosted Discourse instances. It has been wonderful to see it develop into the impressive suite that it is now. However, one significant issue continues to stand out for my users. They struggle to work out how to actually post an event. This has been consistent the whole time, and across user groups. It remains a problem despite the improvements to the process and modal recently. The k…

[Next page](https://meta.discourse.org/t/calendar-subscription-urls-for-external-calendar-apps/398902.md?page=2)
