calendr.events

Recurrence · 10 minute guide

RRULE, RDATE, EXDATE and RECURRENCE-ID Explained

A repeating calendar event is usually not stored as hundreds of copies. It starts with one master VEVENT and a set of rules and exceptions. Understanding the relationship between DTSTART, RRULE, RDATE, EXDATE and RECURRENCE-ID is the key to editing, splitting or repairing a recurring series without losing dates.

Published and reviewed by Whitle · September 26, 2026

Quick answer

What matters most.

  • DTSTART anchors the series; RRULE generates dates from that starting point.
  • EXDATE removes an occurrence, while RDATE adds one outside the main pattern.
  • RECURRENCE-ID identifies one occurrence that has been changed or cancelled separately from the master series.

01

The five pieces of a recurring event

PropertyPlain-language roleExample
DTSTARTThe first event and recurrence anchor20261005T090000
RRULEThe pattern that generates more datesFREQ=WEEKLY;BYDAY=MO;COUNT=5
RDATEOne or more additional included dates20261110T090000
EXDATEOne or more dates removed from the set20261012T090000
RECURRENCE-IDThe original identity of a changed instance20261019T090000

02

A weekly series with one skipped date

The rule asks for five Mondays beginning October 5. EXDATE removes the October 12 occurrence from the final recurrence set. COUNT belongs to the rule generation step; removing one generated occurrence does not automatically increase COUNT to replace it.

BEGIN:VEVENT
UID:weekly-team@example.test
DTSTAMP:20260926T140000Z
DTSTART;TZID=America/Toronto:20261005T090000
DTEND;TZID=America/Toronto:20261005T093000
RRULE:FREQ=WEEKLY;BYDAY=MO;COUNT=5
EXDATE;TZID=America/Toronto:20261012T090000
SUMMARY:Weekly team meeting
END:VEVENT

03

How a moved occurrence is stored

Suppose the October 19 meeting moves from 09:00 to 11:00. Calendar software can store a second VEVENT with the same UID and a RECURRENCE-ID equal to the original scheduled occurrence. DTSTART on that exception contains its new time.

BEGIN:VEVENT
UID:weekly-team@example.test
RECURRENCE-ID;TZID=America/Toronto:20261019T090000
DTSTAMP:20260926T150000Z
DTSTART;TZID=America/Toronto:20261019T110000
DTEND;TZID=America/Toronto:20261019T113000
SUMMARY:Weekly team meeting — moved
END:VEVENT
Important:Do not change RECURRENCE-ID to the new start time. It points back to the occurrence's original position in the series.

04

COUNT versus UNTIL

Always preview a finite window before distributing a new rule. Monthly patterns such as day 31 may skip months that do not contain that date rather than moving to the last day of the month.

  • COUNT limits the number of occurrences generated by the rule, including the DTSTART occurrence when it matches the rule.
  • UNTIL sets the last possible recurrence boundary and must use a value compatible with the DTSTART form.
  • An RRULE should not contain both COUNT and UNTIL.
  • An endless rule has neither; use it only when an open-ended series is genuinely intended.

05

Common rule parts

PartMeaningExample
FREQBase frequencyDAILY, WEEKLY, MONTHLY or YEARLY
INTERVALRepeat every N frequenciesINTERVAL=2 means every two weeks for a weekly rule
BYDAYLimit to weekdaysBYDAY=MO,WE,FR
BYMONTHDAYLimit to days of the monthBYMONTHDAY=1,15
BYMONTHLimit to monthsBYMONTH=3,9
BYSETPOSChoose positions after other filtersBYDAY=FR;BYSETPOS=-1 for the last Friday

06

Safely edit or move a series

  • Keep the master event and all components sharing its UID together.
  • Match EXDATE and RECURRENCE-ID value types and timezone meaning to the recurrence they identify.
  • Do not deduplicate a recurring exception merely because it shares the master's UID.
  • Preview dates across month boundaries and daylight-saving changes.
  • When splitting a calendar, keep the recurrence family intact unless you intentionally rewrite it.

Common questions

A few direct answers.

What does RRULE mean in an ICS file?

RRULE is the recurrence rule that generates repeating dates from an event's DTSTART, using parts such as FREQ, INTERVAL, BYDAY, COUNT and UNTIL.

What is the difference between EXDATE and RECURRENCE-ID?

EXDATE removes a generated occurrence. RECURRENCE-ID appears on a separate event component that represents a changed or cancelled occurrence and identifies its original place in the series.

Can an RRULE contain COUNT and UNTIL?

No. RFC 5545 says UNTIL and COUNT must not occur together in the same recurrence rule.

Primary sources.

Provider interfaces and limits can change. We review official documentation when this guide is materially updated.