Skip to content
HotelSEO Lab
← The Lab
Review Platforms

Hotel Review Schema Edge Cases That Quietly Break My Rich Results

The messy review structured-data scenarios for independent hotels, self-serving review policy, aggregateRating with no reviews, OTA-sourced ratings, and how to avoid a manual action.

HotelSEO LabAugust 23, 2025 9 min read

I have a confession that will make every hotelier reading this feel slightly better about their own setup, my first big review-schema mistake cost a client three weeks of rich-result stars and I did not even notice until a guest mentioned the listing “looked plain.” I had done everything the tutorials said. The markup validated green. And it still quietly broke.

Review structured data is one of those things that looks like a copy-paste job and is actually a minefield. For independent and boutique hotels it is worse than for most businesses, because your ratings are scattered across Google, TripAdvisor, Booking, Expedia, and your own site, and the temptation to consolidate all that glory into one shiny aggregateRating is enormous. That temptation is exactly the trap.

So let me walk you through the edge cases that actually break hotel review rich results, the ones nobody warns you about until your stars vanish.

Why review stars matter enough to bother

Quick gut check before we go deep. Review stars in the search snippet are one of the few things that visibly separate your listing from the wall of OTA results below your own name. They are a click-through magnet. When someone searches your hotel and your result has stars and the Booking.com result does not, you win attention back, and attention is the front of the funnel for direct bookings.

This is the same reason your hotel ranking below the OTAs for your own name is so infuriating, the stars are part of how you claw that real estate back. If you have not read why your hotel ranks below OTAs for your name, that is the companion piece to this one.

But here is the thing. Google does not owe you stars. They are a discretionary feature, and Google yanks them the moment your markup smells self-serving. So getting this right is not about being clever, it is about not getting flagged.

Edge case 1, the self-serving review trap

This is the big one, and it is where most hotels get burned.

Google has an explicit rule, you cannot mark up reviews of your own business that you collected and displayed on a page you control if the only purpose is to show off your own rating. The technical term in their guidelines is “self-serving” review content, and the policy specifically calls out that review markup should not be used for ratings about the entity that owns the page in certain configurations.

In plain English for hoteliers, here is what crosses the line:

And here is what is fine:

The rule of thumb I give every client, if a Google reviewer loaded your page with JavaScript turned off and could not find the reviews your markup claims exist, your markup is lying. Lying markup is how you earn a manual action.

The fix is boring and it works, only mark up what is genuinely on the page, and make sure the individual reviews render in the HTML, not just behind a lazy-loaded third-party script that a crawler might never trigger.

Edge case 2, aggregateRating with no reviews

Closely related, but worth its own section because so many hotel themes ship this way by default.

A lot of hotel WordPress themes and booking plugins inject an aggregateRating object into your schema automatically. Sounds great. Except they often inject a ratingValue and a reviewCount with no corresponding review items and, worse, no visible reviews anywhere on the page. So your schema says “4.9 stars from 212 reviews” and the page itself shows nothing.

That is a textbook invalid configuration. An aggregateRating is supposed to summarize a body of reviews. With no reviews to summarize, it is a number floating in space, and Google treats floating numbers as fabricated.

If your theme auto-generates an aggregateRating, the first thing I check is whether the reviewCount in your schema matches the number of reviews a human can actually count on the page. When they do not match, that mismatch is one of the most common silent reasons hotel review stars stop appearing.

What to do about it:

  1. Open your page source and find the JSON-LD block.
  2. Check whether aggregateRating exists.
  3. If it does, confirm there are real, visible reviews on that same page backing the number.
  4. If there are no visible reviews, either add genuine first-party reviews to the page, or strip the aggregateRating out entirely.

An honest page with no review markup beats a dishonest page with fake-looking review markup, every single time. The first one just does not get stars. The second one can get your whole structured-data treatment suppressed.

Edge case 3, OTA-sourced and third-party ratings

Here is the one that feels so reasonable and is so wrong.

You have a 9.1 on Booking, an 8.8 on Expedia, and 4.5 stars on TripAdvisor. You think, brilliant, I will average those, put them in my schema, and show the world how loved I am. Do not do this.

You do not own those reviews. They live on platforms you do not control, and Google’s policy is clear that review markup on your page should reflect reviews you genuinely collected, not ratings scraped or aggregated from other sites. Pulling an OTA score into your own aggregateRating is self-serving markup with extra steps.

There is a deeper irony here too. The OTAs already dominate your branded search results, and feeding their ratings into your own schema does nothing to reduce that, it just hands Google a reason to distrust your markup. If you want a healthier balance between OTA and direct, the move is to strengthen your own first-party review collection, not to borrow theirs. That is part of the broader content and reputation work that actually moves the needle, and it connects directly to the book-direct math, since OTA commissions of roughly 15 to 25 percent are exactly what you are trying to chip away at.

Let Google do the aggregation. Google already pulls in third-party ratings for hotels through its own lodging panels and review sources. You do not need to, and should not, duplicate that inside your own markup.

Here is a quick reference for what belongs where:

Rating sourcePut it in your own schema?Where it actually shows
Your own collected guest reviews, visible on pageYesYour rich result, if Google chooses
Booking.com or Expedia scoreNoGoogle’s lodging panel, sourced by Google
TripAdvisor averageNoGoogle or TripAdvisor surfaces, not yours
An average you calculated across platformsNeverNowhere, and it risks a penalty

Edge case 4, wrong entity type for lodging

This one breaks rich results in a quieter way, your markup is technically valid but attached to the wrong thing.

Hotels should generally use the Hotel type, which is a subtype of LodgingBusiness, rather than a generic LocalBusiness or, worse, an Organization. The reason is that Google handles lodging entities differently, and review and rating behavior in the snippet is tied to whether Google recognizes the entity as a hotel.

I see two common failures:

Get the entity right first. A correct Hotel entity with honest review data is the foundation. Everything else is decoration on top of that. This is the kind of plumbing we sort out as part of hotel SEO before we ever obsess over the stars themselves, and it is covered in the 2026 starter guide if you want the broader context.

Edge case 5, the manual action you never saw coming

Let me close with the scariest one, because it is the reason all of this matters.

When Google decides your review markup is spammy or self-serving across your site, they can issue a structured-data manual action. It shows up in Search Console under Manual Actions, and it suppresses your rich results, sometimes site-wide, not just on the offending page. Your stars do not just disappear from one page, they can vanish everywhere.

The maddening part is that nothing on your page looks broken. Validation tools still pass, because validation checks syntax, not policy. The markup is well-formed. It just violates the spirit of the rules, and a human reviewer caught it.

If this happens to you:

  1. Read the manual action notice in Search Console carefully, it names the issue type.
  2. Audit every page for self-serving or unsupported review markup.
  3. Remove the offending markup, OTA-sourced ratings, fake aggregates, reviews not visible on the page.
  4. Keep only honest, visible, first-party review markup.
  5. File a reconsideration request describing exactly what you fixed.

Reconsideration is not instant and there are no guarantees on timing, but a clean, honest fix is what gives you the best odds of getting your rich results restored. I want to be straight with you here, nobody can promise Google will hand your stars back on a schedule, what we can do is maximize the odds by making your markup genuinely compliant.

My honest checklist before I ship hotel review schema

Here is the short version I run through on every hotel site:

Six questions. Most broken hotel review snippets I audit fail at least two of them, usually the OTA-import one and the invisible-reviews one.

Review schema done right is a quiet, durable advantage. It is one of the cleaner ways to win back snippet real estate from the OTAs without ever pretending you can fire them, you cannot, the goal is a healthier mix where more of your branded clicks land on your own booking engine instead of someone else’s. Pair clean markup with solid Google Business Profile work and a real book-direct conversion path and the stars start doing actual work for you.

If your hotel’s review markup is throwing validation green but your stars have quietly gone missing, that is exactly the kind of thing I dig into. Book a call and I will audit your structured data, find the self-serving or invisible-review traps, and map out the honest fixes that give you the best shot at getting your rich results back.

FAQ

Quick answers

Can I put my Google or TripAdvisor star rating into my own hotel schema?

No. Google's policy says review markup on your own page must come from your own first-party collection, not aggregated from third-party platforms you do not own. Pulling a TripAdvisor or OTA average into your aggregateRating is exactly the kind of self-serving markup that gets flagged. Let Google source those ratings itself.

Is aggregateRating with no individual reviews allowed?

It is risky. An aggregateRating needs a real, visible body of reviews on the same page that supports the number. A rating value floating on a page with zero visible reviews reads as fabricated to a reviewer and is a common reason rich results silently stop showing.

Why did my review stars disappear from search even though my markup validates?

Valid markup is necessary but not sufficient. Stars vanish when Google decides the markup is self-serving, the reviews are not visible on the page, the entity type is unsupported for that snippet, or a manual action quietly suppressed them. Validation tools check syntax, not policy.

Should a hotel use LocalBusiness or Hotel schema for reviews?

Use the Hotel type where it fits, since it is the specific type Google understands for lodging. Review and rating snippets behave differently for lodging than for a generic LocalBusiness, so picking the right entity matters before you ever worry about the stars.

Keep reading

More from the Lab

Free intro call

Let's go find out why the OTAs are outranking you for your own name.

20 free minutes. We'll look at your hotel live, show you where you're invisible — on Google and in the AI answers — and tell you straight whether we can help.

No lock-in · No 12-month handcuffs · You talk to the strategist