Seven columns, sticky weekday headers, a colour per class type and a booking link on every session. Filter by studio, level or class type. The front desk edits it in Excel.
INCLUDED IN EVERY WP DIRECTORIES LICENCE · FROM $99/YEAR
Most gym timetables online are a PDF, an image, or a table that gives up on a phone. This is a real weekly calendar, filterable, bookable, and editable by whoever is on the desk.
The default view is the weekly grid: weekday headings that stay put as you scroll, times down the side and a colour per class type. On a narrow screen it scrolls sideways rather than collapsing, because comparing Tuesday with Thursday is the whole job.
A chronological day list for people who read down, and paginated class cards for a richer layout with instructor photos. Set the default in settings, override it per page with an attribute. The old timeline name still works as an alias.
Independent and combinable, plus search by class name or instructor. Class types render as compact scrollable checkboxes in the filter header, or as a dropdown that floats over the timetable instead of pushing it down the page when it opens.
Studio and Level filter live where the site lets them. Caching layers and page builders sometimes stop that working, so every timetable also has an explicit Apply filters button as a fallback. Each instance initialises once, so a builder cannot attach the handlers twice.
Each class carries a booking URL, an instructor, a studio, a level and a capacity. This is not a booking engine and does not pretend to be one: it sends the member to whatever you already run, which beats a second-rate payments flow bolted onto a timetable.
An import used to be able to report success when WordPress had not stored it. Now the plugin reads the data back first, keeps the previous timetable and shows an explicit write error when storage fails, and lists the active class types and studios on the settings page so you can confirm an import without leaving it.
id, name, description, instructor, instructor_image, day, start_time, end_time, category, studio, level, capacity, booking_url, colour. Only name is required, and an invalid day, time, colour or booking URL names its exact spreadsheet row. Aliases such as trainer, room, type and class_name import without renaming anything.
The timetable is the page members visit most. Make it filterable and bookable rather than a PDF nobody opens on a phone.
Several studios, several levels, one grid. Filter by studio so each room can have its own page.
Instructor photos and a colour per class type, so the weekly grid reads at a glance instead of needing a key.
Whoever runs the hall edits a spreadsheet. No WordPress training, no support call when the Tuesday class moves.
No, and it does not pretend to be. Every class carries a booking URL that sends the member to whatever system you already use. Building a payments and capacity engine is a different product, and bolting a bad one on would be worse than linking to a good one.
Scrolls sideways, with the weekday headers staying put. Collapsing seven days into a stack destroys the thing a timetable is for, which is comparing Tuesday against Thursday at a glance. If you would rather have a vertical read on mobile, publish the list view on that page instead.
That is the intended workflow. Export the timetable as CSV, edit it in Excel, save as CSV UTF-8, import. The importer reports the exact spreadsheet row when a name, day, time, colour or booking URL is wrong, so a typo is a named line rather than a silent gap.
Name is required. Then description, instructor, instructor image, day, start time, end time, class type, studio, level, capacity, booking URL and colour. Times are 24-hour HH:MM. Empty optional fields render nothing.
Because caching and page builders interfere with live filtering on some sites, and a timetable that silently fails to filter is worse than one that needs a click. Studio and Level filter live where they can, and the explicit button is there as a fallback that always works.
Yes. Each instance initialises separately with its own protection against duplicate handlers, which was added after page builders attached filter listeners twice. Calendar, list and cards can all appear on one page without fighting.
An import could report success while WordPress had not actually persisted it. Now the plugin reads the data back before reporting success, keeps the previous timetable and shows an explicit database-write error when storage fails, and new imports go to a versioned option that takes precedence over a stuck legacy snapshot. The old option is retained as a non-destructive fallback.