WordPress and gym

A gym on WordPress, where the timetable is a container and the terms are a file

The two documents this trade lives on are a class schedule and a membership agreement, and on a WordPress gym site neither of them is text on a page. The schedule is a block from your membership system that fills itself once the page is open, and the agreement is a PDF linked from a join button. Everything else about the install is ordinary.

Why this pairing is its own job

The WordPress install guide covers the tag, and the gym guide covers what the assistant has to know. What follows is the part that belongs to neither.

  • The class timetable is nearly always a shortcode or block from whoever runs your memberships, and it draws its contents after the page arrives. Something reading the page gets the container and the heading above it, and no classes at all. This is the page most prospects land on and the one the assistant is least able to help with.
  • The material the trade page calls highest value, the minimum term and the notice period, usually exists only inside a membership agreement PDF, or on a page inside the member area behind a login.
  • wp_footer covers the member area too, so a signed in member gets a launcher on a dashboard full of questions about an account it cannot see: whether their payment went through, whether their freeze was applied, whether they are booked into Thursday.
  • Joining almost always leaves the site part way through and finishes on the membership provider's own address, so the widget is present for the whole of the decision and absent for the whole of the commitment.

What changes about the install here

<script src="https://cdn.askably.xyz/w.js" data-key="pk_live_YOUR_KEY" defer></script>

The tag is the same one on the WordPress guide. Everything below is about where it goes on a gym site specifically.

Write the timetable out in words underneath the block

You do not need to replace the block. Leave it where it is for the visitor and put a short text version under it: the class name, the days, the times, and the studio. That text is part of the page, so it is read, and it answers what time are the spin classes without anybody opening anything.

Add the two sentences the block never carries: when booking opens, and how long before a class you can cancel without a penalty. Those are asked as often as the times themselves and they are policy rather than schedule, so they do not go stale weekly.

Keep the text version and the block on the same page. Splitting them into a timetable page and a schedule information page means the two drift apart and nobody notices which one the assistant is reading.

Turn the launcher off inside the member area

One condition in the snippet keeps it off the signed in pages. It is worth doing even though nothing breaks if you skip it, because a member looking at their own dashboard reasonably assumes a chat box on that screen can see the account the screen is showing.

Everything they would ask there is an escalation: payments, bookings, freezes, cancellation status. Being absent is a better answer than a refusal repeated four times.

Get the agreement out of the PDF and onto a page

A membership agreement PDF linked from a join button is reachable if the link is on a public page, so it can be indexed. The problem is that it is written as a contract, in numbered clauses, with the notice period expressed as a cross reference to another clause. Answers pulled out of it read as legal text and are frequently wrong about which clause applies.

Publish a plain language terms page beside it: minimum term, how notice is given, when the last payment falls, what freezing costs and whether it extends the term. Keep the PDF as the thing people sign. The page is what gets read back to members, and it is the version you would rather they were quoted.

Where the answerable material lives

Source material on a WordPress gym site
A written timetable beside the blockClass names, days, times and rooms as page text, plus when booking opens and the cancellation window. The block itself contributes nothing readable, however good it looks.
Membership terms in plain languageMinimum term, notice period, method of giving notice, the date of the final payment, and what happens when a payment fails. A page, not a clause reference inside a signed PDF.
The freeze policy in fullDuration, cost while frozen, how many times a year, what evidence you ask for, and whether the minimum term extends by the frozen period. Members assume all five answers and are wrong about most of them.
Induction and first visit requirementsWhether an induction is compulsory before the gym floor, how it is booked, how long it takes and what has to be completed first. Entirely procedural, asked by every joiner.

The first thing to get right

Do this first
Add a text version of the class times directly beneath the timetable block, and recrawl.

It is the single page where this platform and this trade collide. The block is unreadable to anything that reads pages, the timetable is the most requested thing on a gym site, and thirty lines of text turns the worst answered question on the site into the best answered one.

The failure that belongs to this combination

The text you added and the block on the same screen stop agreeing

The block always shows the truth, because it draws from the system where the schedule actually lives. The text underneath it shows whatever somebody last typed. Cover, a holiday timetable, a class moved to a different studio: none of those reach the text.

The failure is not that the answer is stale. It is that the visitor is looking at the correct timetable on screen while the assistant, anchored on the same page, tells them something different. That is the version of wrong that gets screenshotted.

Give the text version an owner and a day. Whoever updates the schedule updates the paragraph, in the same sitting, and the crawl picks it up on its next pass. If nobody will own it, publish only the parts that do not move: the booking window, the cancellation window, and which days each class type runs.

Before you go live

  • The origin the page is served from has to be on the allowlist for that assistant, or nothing renders and the browser console says which origin was refused. An apex domain and its www are two different origins to a browser, so list both, along with any staging or preview host you want it to work on.
  • Open the site as a visitor would, on the pages a gym visitor actually lands on, and ask it something only your own material could answer. A widget that renders is not the same as a widget that has read anything.

Questions

Why can it not just read the timetable that is clearly there on the page?
Because it is not there when the page is read. The block arrives as an empty container and fills itself afterwards from your membership system, and the assistant reads pages rather than connecting to that system. Whatever you want answered about class times has to exist as text somebody wrote.
Should it answer cancellation questions at all?
Yes, and precisely. It can state the notice period and the method, which is most of the traffic. What it must not do is confirm that a particular membership has been cancelled or that a payment will not be taken, because it has no view of the account. Those become an enquiry with a name attached.
Do we need it on the member area?
Almost never. Everything asked there is about an account, and a launcher on a dashboard implies it can see that dashboard. One condition in the snippet keeps it off, and the pages where it earns its keep are the public ones a prospect is reading at eleven at night.

Keep reading

Try it on your own material

Upload a document or point it at your site, paste one line of HTML, then ask it something only your business could answer.