gaash.ai

Content & Answer Pages · 9 min read · September 25, 2026 · , gaash.ai

Class timetable, prices and equipment: a gym's pages, written as text

Put the timetable, the prices and the equipment on the gym's own pages as text: the timetable as an HTML table of day, time, class, length, level and coach; every membership, pass and class pack with its price and what it includes; the equipment named by area, with counts. The booking app takes the booking. The pages state the facts.

Why the booking widget cannot be the timetable

A booking widget is drawn by a script, which may be loaded from the booking platform's own servers, so the HTML your server sends holds a frame and little else. A fetcher that runs no scripts receives the frame. Google renders scripts, but its JavaScript documentation describes rendering as a separate, deferred step, and the assistants' crawler documentation promises no rendering at all. An AI crawler that asks for your timetable page usually gets the page without the classes.

Our audit of 9,483 small business websites (40 trades, 90 metros, late August to early September 2026) found 3.0% rendering their content only in JavaScript and 2.1% keeping real content, such as the price list or the service menu, in a PDF. Both figures cover the whole sample; the audit counted no timetables and publishes nothing for gyms alone. A photo of the printed timetable is a third route to the same place: an image holds no text to parse, and alt text is a description of a picture, not a table of forty classes.

Keep the widget for booking, and above it publish the standing week as a table in the page itself, with a link to book beside each class. The PDF trap covers files in general; how ChatGPT reaches a gym's pages looks at the widget from the crawler's side; the rest of what a gym's site states is on the gyms and fitness studios overview.

A weekly timetable as a table of text

Use a real table. The HTML standard's table markup gives each column a heading cell and the table a caption, so every time sits under Start and every class under Class for anyone reading the markup. A grid of cards laid out to look like a table carries none of that. One row per class per day:

A template, not a timetable. Replace every bracket with your own class, time, coach and room, and add a row for each class on each day it runs.
DayStartClassLengthLevelCoachRoom and notes
Monday[06:00][Spin][45 min][All levels][Coach name][Studio 2]; bikes booked in the app
Monday[12:15][Strength circuit][30 min][Beginners][Coach name][Main floor]
Tuesday[18:30][Vinyasa yoga][60 min][Intermediate][Coach name][Studio 1]; mats provided
Wednesday[07:00][Reformer pilates][50 min][All levels][Coach name][Reformer room]; [n] places
Saturday[09:00][Strength, women only][60 min][All levels][Coach name][Studio 2]; during women-only hours
Sunday[10:00][Yoga for first-timers][60 min][Beginners][Coach name][Studio 1]

Above the table, one line: "Timetable from [date]. Changes are posted here first." Write each class under the name people type (spin, vinyasa yoga, reformer pilates, strength circuit), with your own name for it beside that if you have one. Say in words what each level means at your gym, whether non-members can book a class and at what price, and how far ahead booking opens. Write times one way across the whole site, 24-hour or with a.m. and p.m., never both.

Membership and class prices, with what each one includes

A prices table keeps each price beside what it buys and the terms that come with it, which makes the prices page an answer page for the questions a front desk hears about money. Every figure below is a placeholder, and the last column is for your contract's own words.

A template for a gym's prices page. Each price and term in brackets is the gym's own; delete any row you do not sell.
OptionCommitmentPriceIncludesTerms, in your contract's words
MonthlyMonth to month[price] per month[Gym floor and all classes at one location][Notice to cancel]; [joining fee, or none]
Term membership[n] months[price] per month[Gym floor, all classes, all locations][What happens when the term ends]; [freeze: price and limit]
Off-peakMonth to month[price] per month[Entry between hh:mm and hh:mm][Classes included or not]
Class pack[n] classes[price][Which classes][Valid for n months]; [late-cancel rule]
Drop-in classOne class[price][The class; mat or towel if provided][Book ahead, or walk in]
Day passOne day[price][Gym floor; classes if places are left][Photo ID]; [minimum age]
Trial[One class, or n days][price, or free][What the trial covers][Once per person]; [booking needed or not]
Personal training[One session, or a pack of n][price][Session length; which coaches][Notice to move a session]

Write the currency beside every price and say whether prices include sales tax or VAT where you operate. Put the date the prices apply from above the table. Say what a price leaves out, such as a locker, towels or classes on a basic plan, so that nobody learns it for the first time at the desk.

State each term as your own: "Memberships run month to month; cancel with [n] days' notice by [method]." Contract, cancellation and consumer rules differ from one country, state and province to the next, so this page states no rule, and your counsel checks the wording before it goes up. A promotion goes in as a dated line beside the regular price, with the day it ends, and comes down on that day.

The equipment list, area by area

Name equipment the way members ask for it, and give counts where people wait. A count is a fact someone can check at the door; an adjective is not.

  • Free weights: dumbbells from [x] to [y], in kg or lb as your racks are marked; the number of squat racks, lifting platforms and benches; whether chalk is allowed.
  • Machines: named by what they are, such as leg press, cable stations or hack squat, and not only by a manufacturer's model names.
  • Cardio: treadmills, bikes, rowers, stair climbers and ski machines, with a count for each.
  • Studios: what each room holds (spin bikes, reformers, mats, heavy bags) and how many places a class has.
  • Water and heat: a pool, a sauna or a steam room, with their own hours if they differ, or a plain line saying there are none.
  • Access: accessible equipment and changing rooms, described as they are, and which areas have step-free entry.
  • The rest: lockers, showers and towels, and whether each is included, rented or bring-your-own.

Coaches get a page of their own on the same site: each name, what they teach, and each credential written the way the certifying body writes it. Where one brand runs several locations, each location gets its own equipment list, because a person choosing a gym is choosing one door.

Summer timetables, holiday hours and a class that ends

Every change to the timetable or the prices is a moment when the site, the listings and the booking app can fall out of step. Make the change in the same order each time:

  1. Publish the new timetable with the date it starts, beside the current one, before the change, so someone planning next month sees both.
  2. Post holiday hours on the hours page ahead of the dates, with the first and last day they apply.
  3. On the day, take down the old timetable and any class that has ended wherever it appears: the page, the booking app, the listings, and any flyer image still on the site.
  4. Change the markup the same day as the page.
  5. Change the date line above the timetable, so a reader can tell this season's version from the last.

The same order works for a price rise. The date line is the smallest part and does the most: it is the freshness a reader can see, and it lets anyone reading the page, or an answer that quotes it, tell which version they have.

Offer, Event and Schedule markup, and what each describes

Once the pages state the facts, structured data can repeat them in JSON-LD. The gym is an ExerciseGym, which schema.org files under SportsActivityLocation and LocalBusiness. Each membership, pass and pack is an Offer with a price and a priceCurrency, attached to the gym through makesOffer, its name and terms copied from the prices table.

Classes need more care. schema.org's Event type, the Event schema, has an eventSchedule property whose value is a Schedule, which schema.org defines as a repeating time period for an event that happens regularly: the day, the start and end time, how often it repeats and the timezone. A weekly class can be written that way. A dated occasion, such as a workshop or an open day with its own start date and price, is an Event with a startDate and an Offer. Opening hours are neither; they belong in OpeningHoursSpecification.

Google keeps its own documentation for Event markup; read it before expecting a class to show up as anything in Search. And mark up only what the page shows: Google's introduction to structured data asks for no markup of information a visitor cannot see on the page, however accurate it is. A template, with every bracket matching one on the page:

{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "ExerciseGym",
      "@id": "https://www.example.com/#gym",
      "name": "[Gym name]",
      "url": "https://www.example.com/",
      "telephone": "+1-555-0100",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "[Street and number]",
        "addressLocality": "[Town]",
        "addressRegion": "[State or province]",
        "postalCode": "[Postal code]",
        "addressCountry": "[Country code]"
      },
      "openingHoursSpecification": [
        {
          "@type": "OpeningHoursSpecification",
          "dayOfWeek": [
            "Monday",
            "Tuesday",
            "Wednesday",
            "Thursday",
            "Friday"
          ],
          "opens": "[05:00]",
          "closes": "[23:00]"
        }
      ],
      "makesOffer": [
        {
          "@type": "Offer",
          "name": "[Membership name], month to month",
          "price": "[price]",
          "priceCurrency": "[currency code]",
          "description": "[What it includes; notice to cancel, as the prices page states it]"
        },
        {
          "@type": "Offer",
          "name": "Day pass",
          "price": "[price]",
          "priceCurrency": "[currency code]"
        }
      ]
    },
    {
      "@type": "Event",
      "name": "[Spin], [45] minutes, [all levels]",
      "location": {
        "@id": "https://www.example.com/#gym"
      },
      "organizer": {
        "@id": "https://www.example.com/#gym"
      },
      "eventSchedule": {
        "@type": "Schedule",
        "byDay": "https://schema.org/Monday",
        "startTime": "[06:00]",
        "endTime": "[06:45]",
        "repeatFrequency": "P1W",
        "scheduleTimezone": "[IANA time zone, such as America/Toronto]"
      }
    }
  ]
}

A class that leaves the timetable leaves the markup on the same day. Which types describe the business itself, and which only describe the website, is set out in structured data for AI.

Common questions

Our timetable changes most weeks. What goes on the page?

The standing week, with the date it applies from, and above it a short dated list of this week's changes: a class moved, a coach covering, a room closed. Same-day cancellations can stay in the app, as long as the page says where to check them. The usual week plus its exceptions is what someone planning their training around work needs to see.

Is a picture of the timetable enough if it has alt text?

No. Alt text is a short description of an image for someone who cannot see it, which is the job the HTML standard gives it, and it is no place for forty classes. Keep the designed picture as a printable extra if members like it, and put the same timetable in a table on the page.

Should we name the brands of our equipment?

Where people ask for equipment by brand and that brand is on your floor, yes: name it, with the count. Otherwise the kind and the count are what a person compares, such as [n] squat racks and dumbbells up to [y] kg. Take a brand off the page the day the equipment goes, or the page promises something the floor no longer has.

Do we publish personal training prices?

Yes: the price per session and per pack, the session length, which coaches it covers and how much notice moves a session. If prices differ by coach, say what sets the difference, such as experience or specialty, and give a from-price for each level. A page without them sends someone comparing coaching to the phone, or to another gym's page.

Sources

The two audit figures are this site's own and cover all 40 trades; the audit counted no timetables. What each markup type describes was checked on schema.org; the tables and the JSON-LD are templates, with every figure bracketed.

Sources: our audit of 9,483 small-business sites, with its method · Google, JavaScript SEO basics · HTML Standard, tables · HTML Standard, images · schema.org, Offer · schema.org, Event · schema.org, OpeningHoursSpecification · Google, event structured data · Google, introduction to structured data

All articles