SEO for Gyms: What Google Actually Lets You Do

Most gym SEO advice fails a check that takes ten minutes: reading the Google documentation that governs the tactic being recommended. Mark up your class schedule as Events. Ask members for reviews at the front desk. Build a page for every neighbourhood you draw from. Each of those is standard advice in this vertical, and each one collides with a written Google policy that says, in plain language, not to do it.
This is not a style disagreement. Google's own guidance on hiring help says, verbatim, "No one can guarantee a #1 ranking on Google," and on the same page it says something more useful to a gym owner: "If you run a small local business, you can probably do much of the work yourself."
So this article does the work. Every claim below is checked against the source that owns it, and every quote is pulled from the live page on the day of publication. Where the vertical's standard advice contradicts the source, the source wins and the contradiction is named.
What a gym search result actually looks like
The first thing worth buying is the search result your customer sees, not the one your marketing sees. Those are different queries with different pages, and only one of them ends in a membership.
We pulled both from Ahrefs on 2026-08-31, US. The query gym owners research is seo for gyms (940 monthly searches, difficulty 0). The query their customers type is gym near me (698,916 monthly searches, difficulty 34). Ahrefs resolves near me to a specific city, in our case Wichita, Kansas, so read the result as one real market rather than a national average.
The customer-facing result is the interesting one:
| Position | Site | Domain Rating | Page backlinks |
|---|---|---|---|
| 1 (local pack) | Three independent Wichita gyms | n/a | n/a |
| 2 | yelp.com | 94 | 1 |
| 4 | wichita.gov (city fitness centre directory) | 71 | 1 |
| 5 | forgefitnesswichita.com | 4 | 857 |
| 6 | anytimefitness.com location page | 77 | 335 |
| 7 | planetfitness.com location page | 78 | 2 |
| 8 | ymcawichita.org | 44 | 54 |
| 9 | compelled-fitness.com | 16 | 778 |
| 10 | ictfitness.com | 0 | 249 |
Read positions 5, 9 and 10 again. Three single-location independent gyms hold organic slots, at Domain Rating 4, 16 and 0, and one of them sits above both national franchises on the page. The local pack above them is three more independents.
That is not a universal result, and it matters that we say so. When we ran the same measurement on the real estate vertical, the organic result for the customer query was portals and franchises with zero independent sites in the top ten. Same method, opposite answer. A vertical is winnable or it is not, and you find out by buying the data rather than by assuming.
The second signal in that table is the one most owners misread. Forge Fitness ranks at Domain Rating 4 with 857 links pointing at that one page. Compelled Fitness ranks at DR 16 with 778. The independents here are not winning on domain authority, because they have none. They are winning on links to a specific page, which is a completely different job from the "build your DR" advice the vertical sells. Read the pair, never the domain number alone.
One more line deserves attention: wichita.gov at position 4, a municipal directory of local fitness centres, with more search traffic than any gym on the page. A city government page listing gyms is a citation and a link that most gym SEO guides never mention, and it is usually free to be listed on.
Your class schedule is not eligible for Event rich results
This is the most-repeated tactic in the vertical and Google's Event documentation rules it out three separate ways. The idea sounds excellent: a gym publishes dozens of classes a week, classes are events, event markup produces rich results, therefore mark up the schedule. Every step of that reasoning except the first is wrong.
From Google's Event structured data page (last updated 2025-12-10), verbatim:
Events must be bookable to the general public. Events that require a membership, or invitation prior to purchasing the ticket or attending the event are ineligible for the event experience.
A members-only spin class is, definitionally, an event that requires a membership. That single sentence disqualifies most of what a gym puts on its schedule.
The second disqualification is structural. The same page states that "Each event MUST have a unique URL (a leaf page) and markup on that URL," and that "The event experience on Google only supports pages that focus on a single event." It then recommends "adding markup to your event posting pages instead of pages that list schedules or multiple events." A weekly class grid is exactly the page type named there.
The third is a content rule that catches the fallback most people reach for: "Don't mark business hours as events, such as: 'Adventure park open 8 AM to 5PM.'" Marking up your staffed hours or open-gym windows as Events is specifically listed as a thing not to do.
What survives is narrow and real. A ticketed weekend workshop open to non-members, a charity competition anyone can enter, an open house with public registration: those are bookable to the general public, they can each own a URL, and they qualify. Mark up those, on their own pages, and leave the recurring member schedule as ordinary HTML.
There is no penalty for having a class schedule page. There is simply no rich result waiting at the end of marking it up, and the hours spent generating that markup buy nothing. The same reasoning applies whenever a vertical's "obvious" structured data type turns out to be gated, which is the pattern we found in SEO for restaurants and again in SEO for dentists.
The schema type for a gym, and the trap in the name
Google's LocalBusiness documentation tells you to "Use the most specific LocalBusiness sub-type possible" and then names three examples: "Restaurant, DaySpa, HealthClub, and so on." A gym vertical is one of only three sub-types Google chose to name, which is unusually direct guidance.
The trap is that HealthClub and ExerciseGym are not interchangeable, and no documentation page says so clearly. The definitive answer lives in the schema.org vocabulary file itself:
curl -s https://schema.org/version/latest/schemaorg-current-https.jsonld \
| python3 -c "
import json,sys
g = json.load(sys.stdin)['@graph']
for node in g:
if node['@id'] in ('schema:ExerciseGym', 'schema:HealthClub'):
parents = node.get('rdfs:subClassOf')
parents = parents if isinstance(parents, list) else [parents]
print(node['@id'], '->', [p['@id'] for p in parents])
"
That returns two different shapes:
schema:ExerciseGym -> ['schema:SportsActivityLocation']schema:HealthClub -> ['schema:HealthAndBeautyBusiness', 'schema:SportsActivityLocation']
ExerciseGym sits under SportsActivityLocation, which sits under LocalBusiness. HealthClub sits under two parents at once, because a health club is both a sports location and a health and beauty business. Schema.org allows that multiple inheritance and this is one of the few places it uses it.
The practical rule is simple. A gym that sells training, equipment access and classes is an ExerciseGym. A club that also sells sauna, spa, massage or wellness services is a HealthClub, and choosing it is what tells Google the second half of the business exists. Picking the more specific type is not a ranking trick, it is a description that happens to be accurate.
Here is a complete, valid block. Only name and address are required by Google, and everything else earns its place:
{
"@context": "https://schema.org",
"@type": "ExerciseGym",
"name": "Forge Strength Wichita",
"address": {
"@type": "PostalAddress",
"streetAddress": "1420 N Rock Rd",
"addressLocality": "Wichita",
"addressRegion": "KS",
"postalCode": "67206",
"addressCountry": "US"
},
"telephone": "+13165550143",
"url": "https://example-gym.com/",
"geo": {
"@type": "GeoCoordinates",
"latitude": 37.70163,
"longitude": -97.23029
},
"openingHoursSpecification": [
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "05:00",
"closes": "22:00"
},
{
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Saturday", "Sunday"],
"opens": "07:00",
"closes": "19:00"
}
]
}
One property to leave out, and it is the one gyms most want to add. Google's LocalBusiness page says aggregateRating "is only recommended for sites that capture reviews about other local businesses." Your own star average, marked up on your own site, is a self-review and is not eligible for a star in results. That rule catches every vertical we have looked at, including SEO for therapists and SEO for accountants.
A note on 24-hour access, since it is common in this vertical. If the building is genuinely open around the clock, model it as one OpeningHoursSpecification with "opens": "00:00" and "closes": "23:59", and keep your Business Profile consistent with it. If staffed hours differ from access hours, the honest answer is to publish both and label them, because a member locked out at 6am does not care which field you filled in.
The Business Profile rules that decide the local pack
The local pack on gym near me was three independents. Getting into that surface is governed by written guidelines, and three of them do most of the work.
Choose fewer categories, not more. The guidelines say to "Choose the fewest number of categories it takes to describe your overall core business." The vertical's instinct is to select gym, fitness centre, personal trainer, boxing gym, yoga studio and physical fitness programme all at once. That dilutes rather than broadens, and it describes a business that does not exist.
One profile per location, and no keywords in the name. The guidelines are explicit that including "unnecessary information in your business name isn't permitted, and could result in the suspension of your Business Profile," and separately that you must "not create more than one page for each location of your business, either in a single account or multiple accounts." Renaming your profile to "Forge Strength Wichita | Best Gym Near Me | Personal Training" risks the profile itself.
Your trainers are a harder question than the vertical admits. Google defines an individual practitioner as "a public-facing professional, typically with their own customer base," and names the qualifying professions: "Doctors, dentists, lawyers, financial planners, and insurance or real estate agents are all individual practitioners." Personal trainers are not on that list.
That absence does not settle it, so apply the general criteria instead. A trainer who runs their own book of clients, can be "contacted directly at the verified location during stated hours," and operates in a public-facing role fits the definition. A trainer on the front desk rota does not, and the guidelines add that "Support staff should not create their own Business Profiles."
When a trainer does qualify and works alongside others, the structure is specified: "The organization should create a Business Profile for this location, separate from that of the practitioner," and the practitioner's profile "should include only the name of the practitioner, and shouldn't include the name of the organization." One more clause closes the obvious loophole: "A practitioner shouldn't have multiple Business Profiles to cover all of their specializations."
We hit the mirror image of this in SEO for real estate agents, where Google names the profession outright, and in SEO for coaches, where it does not. When your job is not on the list, the criteria still apply. Read them rather than guessing.
Three review tactics this vertical runs that break policy
Gyms solicit reviews harder than almost any local business, and the standard playbook conflicts with Google's Maps user contributed content policy on three separate clauses. All three are quoted verbatim below.
Incentives. The policy does not allow merchants to "Offer incentives such as payment, discounts, free goods and/or services in exchange for posting any review or revision or removal of a negative review." A free month, a free shake, a raffle entry or a discount code for a review is the named example, in a vertical where all four are routine.
Front-desk asks. The policy states that "merchants should not require or pressure users to leave ratings or write reviews while on the premises, nor should they request that specific content be included." The tablet at the check-in desk is the exact scenario.
Naming your trainer. The same clause spells out two sub-cases: "Merchants requesting that staff solicit a certain number of reviews" and "reviews that include specific content, including content that identifies a staff member." Asking members to mention their trainer by name is universal advice in this vertical and is specifically disallowed.
A fourth clause catches something gyms do without thinking. Content "based on a conflict of interest" is removable, and the policy defines that to include "current or former employment." Reviews from your own coaching staff qualify.
What remains permitted is worth stating, because the section reads as a wall of prohibitions otherwise. Merchants may solicit reviews. The line is drawn at incentivising them, pressuring them on the premises, steering them positive, or scripting their content. Ask everyone, ask off-site, ask once, and accept the answer.
Location pages, and where they become doorway abuse
Every gym with more than one site, and many with only one, gets told to build a page per neighbourhood. There is a real version of this and a version that Google's spam policies name directly.
The policy defines doorway abuse as "when sites or pages are created to rank for specific, similar search queries," and lists among its examples "Having multiple domain names or pages targeted at specific regions or cities that funnel users to one page." A set of near-identical suburb pages that all push to the same enquiry form is that example, restated.
The distinction that survives the policy is whether the page describes something that actually differs. A real location has its own address, its own hours, its own equipment list, its own class timetable, its own coaches and its own parking situation. Those pages are not doorways because they are not substantially similar, and each one is the true destination rather than a funnel to one.
A catchment page for a neighbourhood you do not have a site in has none of that. If the only thing that changes between two pages is the place name, you have generated the pattern the policy describes, and the related scaled content abuse clause is close behind: "Scaled content abuse is when many pages are generated for the primary purpose of manipulating search rankings and not helping users."
The cheap test is to open two of your own location pages side by side and read them. If you cannot tell within a paragraph which gym you are looking at, neither can anyone else. We applied the same test in SEO for contractors, where the city-page play is sold even harder.
What to publish when the schedule is not the answer
Once class markup is off the table, the question becomes what a gym site should actually contain. Sort candidates by how close they sit to a membership decision rather than by how easy they are to write.
| Page type | Distance from a decision | Why it earns its place |
|---|---|---|
| Location page, one per real site | Closest | Answers hours, parking, access, price band |
| Pricing and what is included | Very close | The single most searched thing a prospect wants and the most commonly hidden |
| Trial, day pass, drop-in policy | Close | Captures the visitor who is ready but not committed |
| Coach profiles with real credentials | Close | The choice is often a person, not a facility |
| Equipment and floor plan | Medium | Decides it for anyone with a specific programme |
| Beginner guides for your specific format | Further | Answers the question that precedes the search for a gym |
| Generic fitness advice | Furthest | Competes with publishers who will always outrank you |
The last row is where most gym blogs live, and it is the least defensible. A gym publishing "10 best exercises for abs" is competing with national fitness publishers on their home ground, for a reader who may live three thousand miles away. Publishing your actual pricing, which the industry hides as a matter of habit, competes with nobody and answers the query the prospect really has.
The pricing point deserves its own line because it is counterintuitive to owners. Two of the four People Also Ask questions on the customer query in our measurement were "What's the cheapest gym membership you can get?" and "Is $25 a month a lot for a gym?" The search result was full of pages that will not tell them. A page that answers plainly is differentiated by default.
Measuring it, without buying anything
The measurement layer for a gym is small enough to run yourself, which is the point of Google's own line about small local businesses doing much of the work.
Start with Search Console, and specifically with the gap between what you assume and what you rank for. Query the API for your own site rather than reading the interface, because the interface hides the comparison you want:
# queries.sh, run against your verified property
ACCESS_TOKEN="$(gcloud auth print-access-token)"
SITE="https://example-gym.com/"
curl -s -X POST \
"https://searchconsole.googleapis.com/webmasters/v3/sites/$(printf %s "$SITE" | jq -sRr @uri)/searchAnalytics/query" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"startDate": "2026-06-01",
"endDate": "2026-08-31",
"dimensions": ["query", "page"],
"rowLimit": 5000
}' | jq -r '.rows[] | [.keys[0], .keys[1], .clicks, .impressions, (.position|floor)] | @tsv'
Read the output for one thing first: how many of your impressions come from queries containing your own gym's name. Branded queries are people who already knew about you, and counting them as SEO results is the most common way a gym overstates what its site is doing. Subtract them, and what is left is the number that matters.
On speed, use the thresholds rather than a score out of 100. Core Web Vitals, per web.dev, are Largest Contentful Paint within 2.5 seconds, Interaction to Next Paint at 200 milliseconds or less, and Cumulative Layout Shift of 0.1 or less, all "measured at the 75th percentile of page loads, segmented across mobile and desktop devices."
That last detail is worth a sentence. A gym site is loaded in the car park on a phone with two bars, not on the office desktop where you tested it. The 75th percentile is what decides the assessment, and your own experience of the site is not a sample of it.
One correction to material still circulating in this vertical. The fourth-ranking guide on seo for gyms names "Largest Contentful Paint (LCP), First Input Delay (FID), and Cumulative Layout Shift (CLS)" as the Core Web Vitals. INP replaced FID in 2024. Any guide still listing FID is measuring a metric Google retired, which is a cheap way to date the advice you are reading.
What AI assistants change here, and what they do not
The pitch that a local business needs a new file or a new markup layer for AI search is now contradicted by Google's own documentation, twice.
The AI features page states that beyond the ordinary requirements "There are no additional technical requirements," and that "You don't need to create new machine readable files, AI text files, or markup to appear in these features. There's also no special schema.org structured data that you need to add."
Google's AI optimization guide (last updated 2026-07-10) is blunter about the file specifically, saying such files "will neither harm nor help your site's visibility or rankings in Google Search, as Google Search itself doesn't use them." It also disposes of the chunking advice: "There's no requirement to break your content into tiny pieces for AI to better understand it."
The same guide contains the line worth keeping when a vendor calls: "Be wary of third-party tools that promise ranking success or claim to use 'internal' Google metrics. No third-party tool has access to our internal ranking or AI systems."
What does change for a gym is which surface answers the question. "Best gym near me for powerlifting" is increasingly answered by an assistant summarising pages, and the inputs to that summary are the same pages, the same Business Profile and the same reviews. We covered the mechanics of that in LLM SEO and the measurement side in LLM brand visibility. The short version for a gym owner is that nothing on this page changes, and no separate AI project is required.
If you are deciding between doing this yourself and paying someone, the honest framing is in DIY SEO for small business, and the arithmetic against paid acquisition is in SEO vs Google Ads. Nobody, including us, can promise you a position or a date.
FAQ
Can I do my own SEO for my gym?
Google's own guidance says so directly: "If you run a small local business, you can probably do much of the work yourself." For a gym the work is a correct Business Profile, one honest page per real location, published pricing, a valid ExerciseGym or HealthClub block, and a review process that follows policy. None of that requires a specialist, and all of it is verifiable by you. What takes real time is publishing consistently afterwards.
How do I promote a gym website in search?
Start with the two surfaces that decide the customer query: the local pack, which runs on your Business Profile, proximity and reviews, and the organic result, where our measurement found independents at Domain Rating 0 to 16 holding positions on page one. Then work on links to specific pages rather than on your domain score, because that is what the ranking independents actually had. Getting listed on genuine local directories, including municipal ones, is the cheapest version of that.
Should I mark up my class schedule with Event structured data?
No, in almost all cases. Google states that "Events must be bookable to the general public" and that events "that require a membership, or invitation prior to purchasing the ticket or attending the event are ineligible." A members-only class fails that test, and a schedule grid separately fails the requirement that each event have "a unique URL (a leaf page)." Reserve Event markup for public workshops, competitions and open houses that each get their own page.
ExerciseGym or HealthClub, which schema type should I use?
ExerciseGym if you sell training, classes and equipment access. HealthClub if you also sell spa, sauna, massage or wellness services, since schema.org places HealthClub under both HealthAndBeautyBusiness and SportsActivityLocation, and Google names it as an example of a specific sub-type to prefer. Either way, include name and address at minimum, and leave aggregateRating off your own site.
Can I offer a free month for a Google review?
No. The Maps content policy does not allow merchants to "Offer incentives such as payment, discounts, free goods and/or services in exchange for posting any review." It also rules out pressuring members to review "while on the premises" and requesting "that specific content be included," which covers asking them to name their trainer. You can ask for reviews. You cannot pay for them, script them, or filter them toward the positive.
How long before SEO works for a gym?
Nobody can tell you, and anyone who gives you a date is guessing. Google's own page on hiring help states that "No one can guarantee a #1 ranking on Google," and warns to "Beware of SEOs that claim to guarantee rankings." What you can control is whether the work is correct: a Business Profile that follows the guidelines, structured data that validates, pages that describe real differences, and reviews collected within policy. Those are checkable today, which is the only honest form of progress reporting.
Get cited by ChatGPT. Rank on Google.
You found this article through search. That is the whole product.
- One researched article a day
- Published on your own domain
- Keywords checked against live results
Get cited by ChatGPT. Rank on Google.
You found this article through search. That is the whole product.
- One researched article a day
- Published on your own domain
- Keywords checked against live results
