What it gets you

Somebody who comes to your venue every month subscribes once. From then on your programme is in their phone's calendar, alongside their dentist appointment and their children's school events. New dates appear automatically. Changed times update. Cancellations vanish.

Compare that with hoping they check your website. A subscription is a standing invitation that renews itself, and it costs you nothing per subscriber.

It also serves other systems: a local listings site, a partner venue, a tourist board aggregator can all consume your feed rather than asking you to email them a spreadsheet each month.

What a correct feed must contain

Stable UIDs. Each event needs an identifier that does not change between requests. If it changes, every subscriber's calendar deletes and recreates the entire programme on every refresh — sometimes with notifications, which is how you get unsubscribed.

Real timezone information. Either a TZID naming the zone, with the corresponding definition included, or times in UTC. A feed of floating times will be read differently by every subscriber.

Recurrence as rules. Publish the rule, not fifty-two expanded copies. The subscriber's calendar expands it, the file stays small, and a change to the series is one edit rather than fifty-two.

Exceptions. If you cancel one date, the feed must say so with EXDATE. Otherwise subscribers turn up to a cancelled class — which is worse than them never having subscribed.

What to serve it as

Content type text/calendar. Answer conditional requests so a client that polls frequently gets a cheap “nothing has changed” rather than the whole document. Do not require authentication if the calendar is public — a feed behind a login cannot be subscribed to by anything.

Scope it deliberately

Publish the future and perhaps a little of the past. A feed containing every event since 2018 is a large file that subscribers refetch regularly, and nobody wants five years of history in their personal calendar. A rolling window is right.

Consider one feed per category as well as one for everything — “live music only” is a subscription somebody will actually keep, where “everything at the venue” might be too noisy for them.

The test worth doing

Subscribe to your own feed from Google Calendar, then look at the times, the repeating events and any date you have cancelled. If all three are right in Google, your date model is sound.

This is the most demanding test of a calendar plugin there is, because another calendar has no sympathy for how you stored things internally. A plugin that passes it is handling timezones and recurrence properly; one that fails it has a bug you would otherwise not find for months.