Free tool
RRULE generator
Recurrence rules without the syntax headaches. Point and click your pattern, watch the next occurrences update live, and copy a spec-correct RRULE for any calendar app or API.
Your recurrence pattern
Your rule
RRULE
As it appears in an .ics file
Next occurrences
No occurrences match this rule — check the weekday/day-of-month combination.
Preview shows up to 8 upcoming dates, computed from the first-occurrence date.
Recurring events are where calendar syncs break
Time zones, exceptions, moved occurrences — recurring events are the hardest thing to keep consistent across calendars. SyncThemCalendars handles all of it automatically between Google, Outlook and Apple iCloud.
Start syncing freeFrequently asked questions
What is an RRULE?
RRULE is the iCalendar (RFC 5545) property that describes how an event repeats — "every 2nd Tuesday", "weekdays until June", "the last Friday of each month". It's the recurrence language used by Google Calendar, Outlook, Apple Calendar, and the calendar APIs behind them.
Where do I use the generated rule?
Paste it into an .ics file on the line after DTSTART, or pass it to a calendar API — Google Calendar's events.insert takes it in the recurrence array, and CalDAV servers accept it inside the event's iCalendar data. Microsoft Graph is the exception: it uses a structured recurrence object (pattern + range) instead of RRULE strings, so the rule has to be translated. In .ics it must sit inside a VEVENT alongside a DTSTART.
What's the difference between UNTIL and COUNT?
COUNT stops after a fixed number of occurrences; UNTIL stops at a date. Two classic gotchas: UNTIL is inclusive (an occurrence exactly on the UNTIL instant still happens), and for timed events the spec wants UNTIL in UTC — mismatched forms are a common source of off-by-one bugs.
Why do calendar apps sometimes disagree about the same rule?
Implementations differ at the edges: which weekday starts the week (WKST matters for bi-weekly rules), how a missing 31st is handled in short months, and support for exotic parts like BYSETPOS. Sticking to the common patterns this generator produces keeps you in territory every major app handles identically.