Recurring patterns & RRULE β
Most things you put on the calendar happen more than once. A weekly youth meeting, a monthly leaders' lunch, an annual baptism Sunday β GCM handles them all through one picker on the event form, backed by the iCalendar RRULE standard (RFC 5545).
The recurrence picker appears when you flip the Frequency dropdown off None.

What gets stored β
When you save a recurring event, GCM writes three columns on the events row:
rrule_stringβ the authoritative recurrence string, likeFREQ=WEEKLY;BYDAY=MO,WE,FR;UNTIL=20261231T235959Z.recurrence_ruleβ a legacy short code (weekly,monthly,yearly) kept for backward compatibility with older queries.recurrence_end_dateβ a redundantdatecolumn that mirrors theUNTILvalue, used for fast SQL filtering.
The browser parses rrule_string and expands occurrences directly in the calendar view β there's no server cron filling a table of dates. That keeps the database small (one row per series, not one row per Sunday) and means edits to the rule propagate instantly to every future date.
Frequency choices β
The picker offers five options:
Daily β
FREQ=DAILY. Use sparingly β daily events clutter the calendar quickly. The common case is a short-term campaign: Daily morning prayer during Lent. Pair it with an end date so it stops on Easter.
Weekly β
FREQ=WEEKLY plus an optional BYDAY list. The day checkboxes let you pick multiple weekdays at once: a Monday/Wednesday/Friday prayer group is one event with BYDAY=MO,WE,FR, not three separate events.
If you leave the day checkboxes empty, GCM repeats on the same weekday as the start date. So an event starting on a Tuesday with no BYDAY selected becomes "every Tuesday."
Biweekly β
FREQ=WEEKLY;INTERVAL=2. Same picker as weekly, but the event skips every other week. Common for cell groups that meet on alternating Sundays, or for staff meetings on a fortnightly rhythm.
Monthly β
FREQ=MONTHLY with a choice of two modes:
- Day of month (
BYMONTHDAY=15) β the 15th of every month, regardless of weekday. Picks up the day number from your start date. - Nth weekday (
BYDAY=3SU) β the 3rd Sunday of every month. Useful for leaders' meetings or anointing services that follow a Sunday pattern rather than a calendar date.
The picker shows both options as radio buttons. Pick day of month for financial-style events ("the 1st of every month"); pick nth weekday for service-style events ("first Sunday of the month").
Yearly β
FREQ=YEARLY. The same calendar date once a year β anniversaries, founding-day services, annual conferences. GCM derives the month and day from the event's start date, so you don't have to type them again.
End conditions β
Every recurrence picks one of three end modes:
- Never β no
UNTIL, noCOUNT. The event repeats indefinitely. Good for ongoing weekly services. - After N occurrences β
COUNT=10. Useful for time-bounded campaigns ("ten-week discipleship class"). - On a specific date β
UNTIL=20261231T235959Z. Common for ministry seasons that end at year-end.
If you pick never, the calendar still expands occurrences out to the end of the currently visible month β there's no infinite loop because the expansion is bounded by the view window.
Choosing the right pattern β
A few real-world examples and the picker settings that match:
| Event | Frequency | Extra settings |
|---|---|---|
| Sunday Service | Weekly | BYDAY=SU, end never |
| Wednesday + Friday prayer | Weekly | BYDAY=WE,FR, end never |
| First-Sunday communion | Monthly | Nth weekday (1st Sunday), end never |
| 15th-of-month leaders' offering | Monthly | Day of month (15), end never |
| Six-week Easter series | Weekly | BYDAY=SU, end after 6 occurrences |
| Annual founders' day | Yearly | end never |
| Daily Advent devotional | Daily | end on date (Dec 25) |
For attendance-tracked services like Sunday morning, you don't need a recurring calendar event at all β see Meetings & scope levels for the right pattern. Calendar events with recurrence are for things people need a visual reminder of; meetings are for things you record a roster against.
Backward compatibility β
GCM still understands the older recurrence_rule column (weekly / monthly / yearly) for events created before the RRULE picker shipped. When you edit one of those legacy events, the picker maps the short code to its closest RRULE equivalent and writes both fields back. New events always write both; the RRULE is authoritative when both are present.
If RRULE parsing ever fails β a corrupted string from a manual edit, for example β the calendar falls back to the legacy recurrence_rule interpretation. You won't lose dates, but you may lose the nuance (a daily-with-end-date legacy event becomes a daily-forever fallback).
What to do when one date is different β
Recurrence picks the pattern. When one specific occurrence needs to be cancelled or moved β Christmas Eve service replacing the usual Sunday morning slot, for instance β don't rewrite the RRULE. Use event exceptions instead. They override a single date without disturbing the rest of the series.