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:
- Putting a single
aggregateRatingof 4.8 on your homepage with no actual reviews visible. - Hard-coding a rating number that no human can verify by reading the page.
- Marking up “reviews” that you wrote, paraphrased, or cherry-picked.
And here is what is fine:
- Genuine first-party guest reviews, collected by you, actually displayed on the page, with the markup describing exactly what a visitor can see.
- A review widget where the individual reviews and the aggregate both render on the page.
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:
- Open your page source and find the JSON-LD block.
- Check whether
aggregateRatingexists. - If it does, confirm there are real, visible reviews on that same page backing the number.
- If there are no visible reviews, either add genuine first-party reviews to the page, or strip the
aggregateRatingout 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 source | Put it in your own schema? | Where it actually shows |
|---|---|---|
| Your own collected guest reviews, visible on page | Yes | Your rich result, if Google chooses |
| Booking.com or Expedia score | No | Google’s lodging panel, sourced by Google |
| TripAdvisor average | No | Google or TripAdvisor surfaces, not yours |
| An average you calculated across platforms | Never | Nowhere, 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:
- A theme defaults the whole site to
Organizationand bolts anaggregateRatingonto it. Organization-level review stars are restricted, so the stars never show. - Review markup is attached to a
WebPageorArticletype because a plugin guessed wrong. Same outcome, no stars.
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:
- Read the manual action notice in Search Console carefully, it names the issue type.
- Audit every page for self-serving or unsupported review markup.
- Remove the offending markup, OTA-sourced ratings, fake aggregates, reviews not visible on the page.
- Keep only honest, visible, first-party review markup.
- 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:
- Is the entity a
Hotel(or properLodgingBusinesssubtype), notOrganizationorWebPage? - Does every
aggregateRatinghave real, visible reviews on the same page backing it? - Does the
reviewCountmatch the reviews a human can actually count? - Are all marked-up reviews genuinely first-party, collected by us, and rendered in the HTML?
- Have we stripped out every OTA or third-party score from our own markup?
- Did we test in Search Console’s URL inspection, not just a syntax validator?
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.