Monthly Ordinal Weekday
Monthly Ordinal Weekday
Recurring schedules can be defined by which weekday of the month (1st, 2nd, 3rd, 4th, or last), not only by day-of-month numbers. This is useful for meetings like “every first Wednesday” or “every last Monday.”
API
Use fluent methods on the schedule builder. Ordinals: firstXOfMonth(), secondXOfMonth(), thirdXOfMonth(), fourthXOfMonth(), lastXOfMonth(). Replace X with any weekday: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, or Saturday.
That gives 35 method names (5 ordinals × 7 days). Examples: firstWednesdayOfMonth(), secondFridayOfMonth(), lastMondayOfMonth().
Examples
// Every 1st Wednesday of the month
Zap::for($resource)->firstWednesdayOfMonth()->forYear(2025)->addPeriod('09:00', '10:00')->save();
// Every 2nd Friday of the month
Zap::for($resource)->secondFridayOfMonth()->forYear(2025)->addPeriod('14:00', '15:00')->save();
// Every last Monday of the month
Zap::for($resource)->lastMondayOfMonth()->forYear(2025)->addPeriod('16:00', '17:00')->save();
With a full chain (e.g. availability or appointment):
// Monthly standup — 1st Wednesday
Zap::for($room)
->named('Monthly Standup')
->appointment()
->firstWednesdayOfMonth()
->forYear(2025)
->addPeriod('09:00', '10:00')
->save();
// Month-end retro — last Monday
Zap::for($room)
->named('Month-End Retro')
->appointment()
->lastMondayOfMonth()
->forYear(2025)
->addPeriod('16:00', '17:00')
->save();
// Bi-weekly-style meeting — 2nd Friday
Zap::for($resource)
->named('Bi-Monthly Review')
->appointment()
->secondFridayOfMonth()
->forYear(2025)
->addPeriod('14:00', '15:00')
->save();
Use cases
| Use case | Example |
|---|---|
| Monthly standup | 1st Wednesday of the month |
| Month-end review / retro | Last Monday or last Friday |
| Recurring review (bi-monthly style) | 2nd Friday of the month |
| Board meeting | 3rd Tuesday of the month |
| Weekly-style but once per month | 4th Thursday of the month |
Technical detail (reference)
- Stored as frequency
monthly_ordinal_weekdaywith config:ordinal(1–5, 5 = last) andday_of_week(0–6). - Works with conflict detection, bookable slots, and schedule queries like other recurring patterns.
For monthly by day-of-month (e.g. 1st and 15th), see Monthly, Bimonthly & Quarterly. For every N months, see Dynamic monthly.
