Skip to content
+

Scheduler - Recurring Events

Define recurring events.

You can use the rrule property on your event model to define its repeating pattern:

const event = {
  // ...other event properties
  rrule: { freq: 'WEEKLY', interval: 2, byDay: ['TH'] },
};

The Event Calendar and the Timeline expand recurring events only for the visible range, keeps the original duration and handles all-day and multi-day spans.

All day

7 days every 4 weeks

First Saturday of the Month

Every 2 Days

MO to TH

MO, WE and FR

Every 3 Days

MO to TH

Every 3 Weeks on TU

Every 2 Days

MO to TH

MO, WE and FR

MO to TH

Biweekly TH

Every 3 Days

Every 2 Days

MO, WE and FR

SA and SU

Frequency and interval

The repeating pattern of an event is defined using an object which expects the following properties:

export interface RecurringEventRecurrenceRule {
  /**
   * Base frequency of the rule.
   * Corresponds to the FREQ property of the string-based RRULE.
   */
  freq: 'DAILY' | 'WEEKLY' | 'MONTHLY' | 'YEARLY';
  /**
   * Positive integer representing at which intervals the recurrence rule repeats.
   * For example, within a DAILY rule, a value of "8" means every eight days.
   * Corresponds to the INTERVAL property of the string-based RRULE.
   * @default 1
   */
  interval?: number;
  // ... other properties like `byDay` or `byMonthDay` that depends on the frequency
  // see the example below or the full RecurringEventRecurrenceRule definition for more details
}

Daily frequency

No extra field is required:

// Every day
rrule={{ freq: 'DAILY' }}

// Every two days
rrule={{ freq: 'DAILY', interval: 2 }}

Weekly frequency

Use the byDay property with plain weekday codes (no ordinal) to define the day(s) of the week on which the event should be applied:

// Every week on Monday
rrule={{ freq: 'WEEKLY' }}

// Every two weeks on Monday, Wednesday and Friday
rrule={{ freq: 'WEEKLY', interval: 2, byDay: ['MO', 'WE', 'FR'] }}

Monthly frequency

Use either the byMonthDay or the byDay property (both can't be defined together):

  • Use the byMonthDay property with a single day number to define the day of the month on which the event should be applied:

    // Every month on the 15th
    rrule: { freq: 'MONTHLY', byMonthDay: [15] }
    
    // Every two months on the 15th
    rrule: { freq: 'MONTHLY', interval: 2, byMonthDay: [15] }
    
  • Use the byDay property with a single ordinal entry (2TU represents 2nd Tuesday, -1FR represents last Friday, etc):

    // Second Tuesday of every month
    rrule: { freq: 'MONTHLY', interval: 1, byDay: ['2TU'] }
    
    // Last Friday of every month
    rrule: { freq: 'MONTHLY', interval: 1, byDay: ['-1FR'] }
    
    // First Monday of every two month
    rrule: { freq: 'MONTHLY', interval: 2, byDay: ['1MO'] }
    

Yearly frequency

No extra field is required:

  // Every year on the event's start date (same month and day)
  rrule: { freq: 'YEARLY', interval: 1 }

  // Every two years on the event's start date (same month and day)
  rrule: { freq: 'YEARLY', interval: 2 }

End boundary

By default, the event keeps occurrence without ever ending. Use either the count or the until property if you want to put an end boundary to your event (both can't be defined together):

  • Use the count property if you want your event to stop after a given amount of occurrences:

    // Stop after 5 occurrences
    rrule: { freq: 'DAILY', count: 5 }
    
  • Use the until property if you want your event to stop at a given date:

    // Until a date (inclusive)
    rrule: { freq: 'WEEKLY', byDay: ['TU'], until: DateTime.fromISO('2025-12-31T23:59:59Z') }