Docs · Editor panels · Service calendars

Service calendars

Service calendars describe which days your service actually runs. The Calendars panel writes calendar.txt (weekly patterns within a date range) and calendar_dates.txt (holiday exceptions and one-off changes). Most agencies need two or three patterns — Weekday, Saturday, Sunday — plus a list of holidays that get the Sunday schedule.

GTFS·X editor with the Calendars panel selected, showing weekly service patterns.
The Calendars panel. Each service pattern has its day-of-week toggles, date range, and a list of exception dates.

Weekly patterns

Each row in calendar.txt is a service pattern with a service_id, a date range, and seven day-of-week toggles. In the editor, click Add Service, give it a service_id (use a stable name like WKDY, SAT, SUN — these get embedded in trip records and rider URLs), set the start and end dates, and toggle which days the service runs.

Typical patterns:

Date ranges should bracket the live period of your schedule. A feed with stale end_dates gets flagged by validators and rejected by some catalogs. Re-publish with refreshed dates when the schedule pickup happens.

Holiday exceptions

Click into a service pattern and open its Exceptions subpanel. An exception is a single calendar date that overrides the weekly pattern. GTFS distinguishes two kinds, both shown in the exception list with a badge:

If a weekday pattern has no exceptions at all, GTFS·X shows a gentle nudge in this subpanel — "Consider adding holiday exceptions — transit typically doesn't run on major holidays" — because a feed that runs full weekday service straight through Christmas is almost always a mistake.

Two ways to add them:

To remove an exception, click the × next to it in the list, or click its highlighted day in the month preview and confirm. To clear the whole list at once, use Delete all in the Exceptions header — it asks for a second confirmation ("Delete all N? Yes / Cancel") before removing every calendar_dates exception for that service. If your policy is "run Sunday service on the holiday" instead of closing, add the holiday as a No-Service exception on the Weekday pattern and leave the Sunday pattern running that date.

Exception-only services

For one-off events (a parade route, a holiday shuttle, an emergency replacement schedule) that don't follow a weekly pattern, create a service with all seven day toggles off. Then add explicit "service added" exception dates for the dates the service runs. The pattern is fully driven by calendar_dates.txt — no weekly rule at all. Valid GTFS, supported by most consumers.

When to split a calendar

A common modeling question: when does a service variation deserve its own service pattern vs. being squeezed into an existing one with exceptions?

Edge cases and gotchas

See also