Which schema type fits a massage therapist? A business node and a practitioner node linked together, from The Grand Schema's Pillar Talk.

Which Schema Type Should a Massage Therapist, Esthetician, or Acupuncturist Use?

The short answer

Schema.org has no type for massage therapist, acupuncturist, Reiki practitioner, or sound healer. Most wellness practices should use HealthAndBeautyBusiness, or DaySpa or BeautySalon if one of those genuinely describes the whole business. Clinical practices that bill and diagnose can use a MedicalBusiness subtype. Then add a second node for the practitioner, with credentials attached, because that’s the part a solo practice actually has that a chain doesn’t.

Schema markup is the least glamorous thing on a wellness website and the easiest to get wrong in a way nobody notices for a year. A plugin picks a type for you, the type is wrong, and your site quietly tells Google you’re a beauty salon when you’re a licensed clinical practice, or a medical provider when you’re an energy worker.

I hand-write the graph for my own site rather than letting a plugin guess, because no plugin has a field for a license number, the board that issued it, or the page where anyone can verify it. This guide covers how to pick your type, what to put in the graph, and what to leave out.

What schema does, and what it doesn’t

Start with the honest part, because it changes how much time this deserves. Schema markup is not a ranking lever for Maps. In Whitespark’s 2026 survey of 47 local search experts, website content marked up in schema landed near the bottom of 187 Maps factors. Google’s own documentation on AI features says sites don’t need special structured data to appear in AI Overviews or AI Mode.

What it does do is remove ambiguity. Your name, address, hours, services, and credentials stop being prose a machine has to interpret and become facts it can read. That matters most when several sources describe you at once: your profile, your site, a directory listing, and a booking platform. When they agree, Google has one version of you. When they disagree, it picks.

It also decides eligibility. Rich results only appear for content Google can parse, and the type you choose controls which ones you can qualify for at all.

Pick your type

Google’s local business documentation gives one instruction: use the most specific LocalBusiness subtype that fits. The catch for this industry is that the specific subtype often doesn’t exist.

The last column says whether schema.org has a type that matches your work. Shaded rows have none, so you fall back to the parent type and carry the detail in your services. Check any type at schema.org before you publish it, since the vocabulary changes.
Your practiceType to useSits underIn the vocabulary
Day spa with several servicesDaySpaHealthAndBeautyBusinessExact type
Esthetics studio, facials, waxingBeautySalonHealthAndBeautyBusinessExact type
Yoga or movement studio with a scheduleHealthClubHealthAndBeautyBusiness and SportsActivityLocationExact type
Physical therapy clinicPhysiotherapyMedicalBusinessExact type
Massage therapy practiceHealthAndBeautyBusinessLocalBusiness. No massage type exists.No exact type
Lymphatic drainage, holistic estheticsHealthAndBeautyBusinessLocalBusiness, with the modality in your servicesNo exact type
Reiki, sound healing, breathworkHealthAndBeautyBusinessLocalBusiness. Nothing closer exists.No exact type
Acupuncture and Chinese medicine clinicMedicalClinic or MedicalBusinessLocalBusiness. No acupuncture type exists.No exact type

Two rules keep you out of trouble here. First, a type is a claim, the same way a Google category is. MedicalBusiness and its subtypes describe clinical providers. If you don’t diagnose, treat conditions, or bill as a healthcare provider, don’t sit there because it sounds more credible. Second, when nothing fits, go up rather than sideways. HealthAndBeautyBusiness with accurate services beats a specific type that describes someone else.

You can also use more than one type. Google says to specify multiple types as an array, and notes that additionalType isn’t supported for local business markup, so the array is the route.

Two nodes, not one

Here’s the part most plugins skip. A solo practice is two things at once: a business with an address, and a practitioner with training. Marking up only the business throws away the thing that separates you from the franchise down the road.

Schema.org has a property built for this. hasCredential holds a credential awarded to a person or organization, and EducationalOccupationalCredential carries the name, the category, an identifier, and the body that recognized it. That’s your license number and your state board, in a field made for them.

The shape of a practitioner graph

Two nodes joined by @id. Replace every bracketed value, and delete any line you can’t back up.

Show the example graph (JSON-LD, 58 lines)
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "HealthAndBeautyBusiness",
      "@id": "https://example.com/#business",
      "name": "[Practice name]",
      "url": "https://example.com/",
      "telephone": "+1-816-555-0142",
      "priceRange": "$95-$180",
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "[Street]",
        "addressLocality": "Overland Park",
        "addressRegion": "KS",
        "postalCode": "[ZIP]",
        "addressCountry": "US"
      },
      "openingHoursSpecification": [{
        "@type": "OpeningHoursSpecification",
        "dayOfWeek": ["Tuesday", "Thursday"],
        "opens": "10:00",
        "closes": "18:00"
      }],
      "sameAs": ["[Google Maps profile URL]", "[association directory URL]"],
      "founder": { "@id": "https://example.com/about/#practitioner" },
      "hasOfferCatalog": {
        "@type": "OfferCatalog",
        "name": "Services",
        "itemListElement": [{
          "@type": "Offer",
          "itemOffered": {
            "@type": "Service",
            "name": "Manual lymphatic drainage, 60 minutes"
          }
        }]
      }
    },
    {
      "@type": "Person",
      "@id": "https://example.com/about/#practitioner",
      "name": "[Your name]",
      "jobTitle": "[Licensed title]",
      "worksFor": { "@id": "https://example.com/#business" },
      "hasCredential": [{
        "@type": "EducationalOccupationalCredential",
        "name": "[Credential name]",
        "credentialCategory": "license",
        "identifier": "[License number]",
        "recognizedBy": {
          "@type": "GovernmentOrganization",
          "name": "[State board]"
        },
        "url": "[Board's public verification page]"
      }]
    }
  ]
}
Properties from schema.org/LocalBusiness. The two nodes reference each other by @id, so Google reads one business and one person rather than two strangers.

Keep both @id values stable forever. They’re the addresses other pages point at, and changing one silently orphans every reference to it.

The properties that earn their keep

  1. Name, address, and phone, copied from your Google profileCharacter for character. A mismatch here is worse than no markup, because you’ve now published the contradiction in a format machines read first.
  2. Hours, as openingHoursSpecificationOnly the hours you can actually be reached and booked. If you work purely by appointment with no set schedule, leave hours out of both your profile and your markup.
  3. sameAs, pointing at profiles you controlYour Google profile, your association directory listing, the platforms where your practice actually appears. This is how a machine confirms that four listings describe one business.
  4. Services, as hasOfferCatalogThe place where “sound bath” and “manual lymphatic drainage” become machine-readable, even when no category or type exists for them.
  5. areaServed, if you travel to clientsThe towns you actually serve, matching the service area on your profile rather than a wish list.
  6. The practitioner node, with credentialsName, job title, and every credential with its issuing body. This is the one part of your markup a chain can’t copy.

What to leave out

Include

  • Facts a visitor can see on the same page
  • Credentials you can verify with a link
  • Services you actually offer this season
  • One graph per page, in one script tag

Leave out

  • Star ratings from your own testimonials
  • A medical type you don’t practice under
  • Hours, prices, or awards that aren’t on the page
  • A second copy of the same business from a plugin

That first exclusion surprises people every time. Google announced in 2019 that it no longer shows review rich results for the LocalBusiness and Organization types when the entity being reviewed controls the reviews, which includes testimonials on your own site and embedded review widgets. You won’t be penalized for leaving the markup in place. You just won’t get stars for it, so don’t buy a plugin that promises them.

Which pages get which markup

One graph does not go on every page. Google recommends putting your organization details on your home page or a single page that describes the business, not repeated sitewide.

  • Home, about, and any location page: the business node and the practitioner node, identical on each.
  • Service pages: a Service node naming that one service, with provider pointing back at your business @id.
  • Blog posts: a BlogPosting node with the author pointing at your practitioner @id, so your articles and your credentials belong to the same person.
  • Booking and policy pages: usually nothing. Markup with nothing to say is maintenance you’ll forget.

How to check what you’ve got

  1. Run the page through the validatorPaste the URL into validator.schema.org and read the whole output, not just the error count.
  2. Count your business nodesView the page source and search for the type name. If your SEO plugin and your hand-written graph both describe the business, you’ve published two businesses at one address.
  3. Check the @id values resolveEvery reference like { "@id": "…#practitioner" } needs a node with that exact id on the same page. Google doesn’t follow ids across pages.
  4. Compare it to your Google profileSide by side, field by field. Name, address, phone, hours, services.
  5. Recheck after theme and plugin updatesMarkup breaks quietly. Put it on the same calendar as your other quarterly checks.

For context on how common this markup is at all: schema.org’s own usage figures put LocalBusiness on between one and ten million domains, based on Google’s web index. It’s ordinary infrastructure, not an advanced tactic. Most practices simply have it filled in badly.

thegrandschema.com · two nodes, one graph✓ 0 errors · 0 warnings

Business node

ProfessionalService

@id
/#business
name
The Grand Schema
address
Overland Park, KS (service area, no street)
areaServed
12 cities + the Kansas City metro
hasOfferCatalog
5 offers, from free to $1,500/mo
founder
→ /about/#joann-schermerhorn

Practitioner node

Person

@id
/about/#joann-schermerhorn
jobTitle
Founder, SEO and UX Consultant
worksFor
→ /#business
sameAs
LinkedIn, Yoga Alliance, IxDF, ISTA
hasCredential
21 credentials, each with its issuer
e.g.
Licensed Esthetician · license 200-85498 · Kansas State Board of Cosmetology · verify link
My own site’s graph, simplified from the Schema Markup Validator results on October 8, 2026. Two nodes, joined by @id: the business names its founder, and the founder names where she works.

Frequently asked questions

Is there a schema type for massage therapists?

No. Schema.org has no massage therapist type. Use HealthAndBeautyBusiness, or DaySpa if you genuinely run a spa, and put massage and your specific modalities in your services rather than in the type.

Should I use MedicalBusiness to look more credible?

Only if it’s true. MedicalBusiness and its subtypes describe clinical providers who diagnose and treat. Credibility comes from your credentials node, not from claiming a clinical type you don’t practice under.

Can my markup use two types at once?

Yes. Google’s local business documentation says to list multiple types as an array, and notes that additionalType isn’t supported for this markup. Keep the list short and true.

Will schema markup help me rank in the map pack?

Barely. Whitespark’s 2026 expert survey put schema-marked-up content near the bottom of 187 Maps factors. Its value is clarity and rich result eligibility, not ranking. Your category and your profile do the ranking work.

Can I show star ratings from my testimonials page?

No. Since 2019, Google hasn’t shown review rich results for LocalBusiness or Organization markup when the business controls the reviews, which covers testimonials on your own site and embedded review widgets.

Doesn’t my SEO plugin already handle this?

Partly, and that’s the risk. Most plugins output a generic business type with no practitioner node and no credentials. If you add your own graph as well, turn the plugin’s version off first, or you’ll publish two businesses at the same address.

Keep reading

Sources

  1. Google Search Central, Local business (LocalBusiness) structured data
  2. Google Search Central, Top ways to ensure your content performs well in Google’s AI experiences
  3. Google Search Central Blog, Making review rich results more helpful (2019)
  4. Schema.org, LocalBusiness and HealthAndBeautyBusiness
  5. Schema.org, Schema Markup Validator
  6. Whitespark, 2026 Local Search Ranking Factors

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *