← Back to blogGoogle & Local SEO

Schema markup for gyms: the invisible tags that explain your business to Google

Schema markup for gyms: the invisible tags that explain your business to Google

Schema markup is invisible code on your website that tells Google, without any ambiguity, "this is a gym, it's at this exact address, it opens at 7:00, membership starts from €29/month, and here's the phone number". Your visitors never see it. The machines that decide when and how to show you do. You set it up once, in an afternoon, and it works forever.

Fair warning upfront: this is not a rocket. Adding schema won't bump you three positions next week. What it does is something different, equally valuable but less flashy: it removes ambiguity about who you are and makes you eligible for rich results. And in 2026 there's a new reason to take it seriously that didn't exist three years ago: AI-powered search engines.

What it is, plainly

When Google crawls your website, it reads text. And text is ambiguous for a machine. "Open 7 to 10" could be a schedule or a film title. "From €29" might be your monthly fee, the price of some trainers you recommended in a blog post, or a typo.

Schema markup (structured data, per the schema.org standard) resolves that ambiguity with tags: instead of forcing Google to guess, you declare it outright. "openingHours": "Mo-Fr 07:00-22:00" leaves no room for interpretation. The modern format is JSON-LD: a block of code you drop into the <head> of your page that has zero effect on design or what users see.

The least-bad analogy: your website is the shopfront for people, and schema is the technical spec sheet for machines. Both say the same thing, each in its reader's language.

The classic argument for schema was rich result eligibility: star ratings, expandable FAQs, events with dates shown directly in search results. That still stands.

The new argument is that generative engines (Google's AI Overviews, ChatGPT with search, Perplexity) build their answers from sources they can interpret with confidence. Structured data is exactly that: information the machine doesn't have to guess at. When someone asks an assistant "gyms with CrossFit classes that open before 7am near Chamberí", the engine has to resolve hours, location, and service. If your website declares all three in JSON-LD, you can be cited with near-zero interpretation cost. If all three are buried in a PDF timetable or inside an image, you don't exist for that answer.

This connects to the classic proximity search: the near me query was already the battleground of local SEO, and AI is making it conversational. Structured data is how you walk into that exam with the answers already written down.

One thing schema doesn't do: it doesn't replace your Google Business Profile. For the local map pack, the listing still runs the show. Schema works on your website, reinforces consistency between the two, and covers what the profile can't reach.

Which types apply to a gym

Out of the hundreds of schema.org types, a gym cares about five. In priority order:

LocalBusiness / HealthClub: the mandatory foundation

HealthClub is the specific subtype for gyms (it sits under ExerciseGym, which sits under SportsActivityLocation, which sits under LocalBusiness, use the most specific one). This is what declares the fundamentals: name, address, coordinates, phone, hours, website, price range. If you only implement one type, make it this. The address and phone must match character-for-character what's on your Google listing and the rest of your online presence; the consistency of that data is a pillar of local SEO, and schema is one more place where it can break.

FAQPage: the 5 questions everyone asks

Every gym gets the same questions: how much does it cost, is there a contract, can I try for free, is there parking, what do I need for my first class. If your website has an FAQ section (and it should), mark it up with FAQPage. Google has scaled back how often it shows this format in results, so don't expect the expandable dropdowns you used to see on every search, but marked-up FAQ content is prime material for AI engines, which love the question-and-answer format.

Offer: your entry deal

A free enrollment promo or a trial month can be declared as an Offer with price, currency, and validity date. Keep it in sync: an expired offer in your schema is worse than no offer at all.

Event: open days and challenges

If you run open days, masterclasses, or 6-week challenges, the Event type makes them eligible to appear with date and location in search results. Most useful when you publish events on their own stable-URL page.

Review / AggregateRating: by Google's rules

You can mark up aggregate ratings (AggregateRating) to go for stars in search results. But by Google's rules, which are strict here: only reviews collected on your own site, about your own business. Marking up reviews copied from Google or third parties is banned, and self-serving markup about reviews that can't be verified on your page is banned too. If you get caught, the typical penalty is losing all rich results across the entire site. If you don't collect your own reviews on your website, skip this type without regret, your reviews strategy on Google carries on fine on its own.

The code: complete JSON-LD for a gym

Example using a fictional gym. Copy it, swap the values, done. It goes inside a <script type="application/ld+json"> tag in the <head> of your homepage.

{
  "@context": "https://schema.org",
  "@type": "HealthClub",
  "name": "Forja Fitness Club",
  "image": "https://www.forjafitness.es/img/sala-principal.jpg",
  "url": "https://www.forjafitness.es",
  "telephone": "+34 912 345 678",
  "priceRange": "€29-€59/month",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Calle de la Forja, 12",
    "addressLocality": "Madrid",
    "postalCode": "28012",
    "addressCountry": "ES"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 40.4123,
    "longitude": -3.7038
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "07:00",
      "closes": "22:30"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Saturday", "Sunday"],
      "opens": "09:00",
      "closes": "14:00"
    }
  ],
  "sameAs": [
    "https://www.instagram.com/forjafitness",
    "https://www.facebook.com/forjafitness"
  ],
  "makesOffer": {
    "@type": "Offer",
    "name": "Free enrollment",
    "description": "Free enrollment for new sign-ups during October",
    "price": "0",
    "priceCurrency": "EUR",
    "validThrough": "2026-10-31"
  }
}

Get exact coordinates from Google Maps: right-click your location and copy the two numbers. The sameAs field links your social profiles and helps machines unify your identity. priceRange accepts free text, be specific, "€€" tells nobody anything.

For the FAQ page, a separate block:

{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "How much is the monthly membership?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The standard membership is €39/month with no contract. The unlimited classes plan is €59/month."
      }
    },
    {
      "@type": "Question",
      "name": "Can I try before I sign up?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Yes, the first session is free and no commitment required. Book via WhatsApp or on the website."
      }
    }
  ]
}

Golden rule for both: schema can only declare what the page visibly shows. Marking up content users can't see is a direct violation of Google's guidelines.

How to add it depending on your website

WordPress. The easy route. Plugins like Rank Math or Yoast generate the basic LocalBusiness block from a form, no code required. To fine-tune the subtype to HealthClub or add an Offer, most of them let you paste custom JSON-LD. Ten minutes.

Custom-built site. Ask your developer to drop the block into the <head> of the homepage (and the FAQPage block on the FAQ page). It's literally copy and paste; if they quote you more than half an hour for this, ask why.

Page builders (Wix, Squarespace, Webflow). All have a "custom code" option in the header, either per page or globally. Wix also auto-generates some schema, check you're not duplicating types, because two conflicting LocalBusiness blocks on the same page cause more confusion than they fix.

Validation. Before calling it done: run your URL through Google's Rich Results Test (search.google.com/test/rich-results). It tells you which types it detects and what errors exist. Red errors: fix them. Amber warnings: optional, usually recommended fields you haven't filled in. Re-run the test after any website redesign, that's when schema silently breaks.

What impact to expect, honestly

Honestly: small, free, and permanent. That's the combination.

Schema is not a confirmed direct ranking factor. What it gives you is eligibility for rich results (which improve click-through rate when they appear), better understanding of your business by Google, and citability by AI engines. Transparent trade-off: if your website has serious problems, slow, thin on content, weak foundational SEO, schema won't paper over them; fix the house first, then add the labels. But as an afternoon task with indefinite payoff, the effort-to-return ratio is one of the best in local SEO.

There's a side benefit almost nobody mentions: writing the schema forces you to audit your own data. More than one gym owner has discovered, while filling in the JSON, that their website lists one set of hours, their Google listing says another, and their Instagram says a third. That inconsistency is costing you positions right now, and the rest of your local technical presence depends on sorting it out.

The concrete plan: this week, generate your HealthClub block using the example above, paste it in, validate it. Next week, the FAQPage. And mark your calendar to review the schema every time you change prices, hours, or a promotion. At Pilotium we see it daily with gyms acquiring members through campaigns: the ad brings the traffic, but what that traffic finds when they research you, a consistent listing, a website machines can understand, decides how many actually fill in the form. Schema is the part of that work you do once and never touch again.

Stay Ahead of the Game

Weekly AI marketing insights. No spam. Unsubscribe anytime.