Skip to content

@type: Hotel · LodgingBusiness

Hotel schema generator

Independent hotels fight OTAs for every direct booking. Hotel schema with precise location, amenities in the description and direct booking links helps search engines connect travellers to your own website.

Free · no account needed · validated against Google's LocalBusiness guidelines

Example · Trattoria Fiore
<script type="application/ld+json">{  "@context": "https://schema.org",  "@type": "Hotel",  "@id": "https://trattoriafiore.example/#localbusiness",  "name": "Trattoria Fiore",  "description": "Neighbourhood Italian trattoria on the Jordaan canals: handmade pasta, wood-fired secondi and a natural wine list.",  "url": "https://trattoriafiore.example",  "logo": "https://trattoriafiore.example/logo.png",  "image": [    "https://trattoriafiore.example/img/dining-room-16x9.jpg",    "https://trattoriafiore.example/img/pasta-4x3.jpg",    "https://trattoriafiore.example/img/terrace-1x1.jpg"  ],  "telephone": "+31 20 555 8820",  "email": "ciao@trattoriafiore.example",  "priceRange": "€€€",  "currenciesAccepted": "EUR",  "paymentAccepted": "Debit Card, Credit Card, Apple Pay",  "address": {    "@type": "PostalAddress",    "streetAddress": "Prinsengracht 191",    "addressLocality": "Amsterdam",    "addressRegion": "Noord-Holland",    "postalCode": "1015 DS",    "addressCountry": "NL"  },  "geo": {    "@type": "GeoCoordinates",    "latitude": 52.376542,    "longitude": 4.884321  },  "openingHoursSpecification": [    {      "@type": "OpeningHoursSpecification",      "dayOfWeek": [        "Tuesday",        "Wednesday",        "Thursday"      ],      "opens": "17:30",      "closes": "23:00"    },    {      "@type": "OpeningHoursSpecification",      "dayOfWeek": [        "Thursday",        "Friday"      ],      "opens": "12:00",      "closes": "14:30"    },    {      "@type": "OpeningHoursSpecification",      "dayOfWeek": [        "Friday",        "Saturday"      ],      "opens": "17:30",      "closes": "00:30"    },    {      "@type": "OpeningHoursSpecification",      "dayOfWeek": "Saturday",      "opens": "12:00",      "closes": "15:00"    },    {      "@type": "OpeningHoursSpecification",      "dayOfWeek": "Sunday",      "opens": "12:00",      "closes": "21:30"    }  ],  "specialOpeningHoursSpecification": [    {      "@type": "OpeningHoursSpecification",      "name": "Christmas Day",      "validFrom": "2026-12-25",      "validThrough": "2026-12-25",      "opens": "17:00",      "closes": "22:00"    },    {      "@type": "OpeningHoursSpecification",      "name": "New Year's Day",      "validFrom": "2027-01-01",      "validThrough": "2027-01-01",      "opens": "00:00",      "closes": "00:00"    },    {      "@type": "OpeningHoursSpecification",      "name": "Annual closure",      "validFrom": "2027-01-11",      "validThrough": "2027-01-24",      "opens": "00:00",      "closes": "00:00"    }  ],  "hasOfferCatalog": {    "@type": "OfferCatalog",    "name": "Menu highlights",    "itemListElement": [      {        "@type": "Offer",        "itemOffered": {          "@type": "Service",          "name": "Tasting menu",          "description": "Six courses with seasonal antipasti and dessert."        },        "price": "68.00",        "priceCurrency": "EUR",        "priceSpecification": {          "@type": "UnitPriceSpecification",          "price": "68.00",          "priceCurrency": "EUR",          "unitText": "per person"        }      },      {        "@type": "Offer",        "itemOffered": {          "@type": "Service",          "name": "Wine pairing",          "description": "Natural Italian wines matched to the tasting menu."        },        "price": "45.00",        "priceCurrency": "EUR",        "priceSpecification": {          "@type": "UnitPriceSpecification",          "price": "45.00",          "priceCurrency": "EUR",          "unitText": "per person"        }      },      {        "@type": "Offer",        "itemOffered": {          "@type": "Service",          "name": "Private dining room",          "description": "Exclusive use for groups of 12–24."        },        "priceSpecification": {          "@type": "PriceSpecification",          "minPrice": "900.00",          "priceCurrency": "EUR"        }      }    ]  },  "aggregateRating": {    "@type": "AggregateRating",    "ratingValue": "4.7",    "reviewCount": "864",    "bestRating": "5",    "worstRating": "1"  },  "review": [    {      "@type": "Review",      "author": {        "@type": "Person",        "name": "Lotte Bakker"      },      "reviewRating": {        "@type": "Rating",        "ratingValue": "5",        "bestRating": "5"      },      "reviewBody": "Best cacio e pepe outside Rome. Book the canal-side table!",      "datePublished": "2026-09-28"    }  ],  "sameAs": [    "https://maps.app.goo.gl/trattoriafiore-example",    "https://www.instagram.com/trattoriafiore.ams",    "https://www.tripadvisor.com/Restaurant_Review-trattoria-fiore-amsterdam",    "https://www.facebook.com/trattoriafioreamsterdam"  ]}</script>
Validator score 94/100 · 0 errors

Generate your hotel schema

Fill in your details — the JSON-LD, validator and search preview update as you type. Free, no account.

Full builder

Step 1 of 7

Business

Business type

Pick the most specific schema.org subtype. It's the strongest relevance signal you can send.

Identity

Use the name exactly as it appears on your storefront and Google Business Profile.

Missing business name

0/750

Website & media

Missing website URL

Square, at least 112×112px, on a plain background.

No images

Free schema checker

Validate existing hotel markup

Already have hotel markup? Paste it to see its score, rich result eligibility and exactly what to fix.

Properties that matter for hotels

@type: HotelLodgingBusiness subtype.
geoExact coordinates matter for map-based travel search.
priceRangeNightly rate range.
imageRooms, lobby and views.
name + addressRequired by Google for every LocalBusiness — and must match your Business Profile exactly.

Best practices

  • Use 24-hour reception hours if staffed around the clock.
  • Link Tripadvisor and Instagram in sameAs.
  • Keep check-in/out times in the description.

FAQ

What the validator checks

  • Required name and full postal address
  • Phone format and international prefix
  • Overlapping or invalid split hours
  • Coordinates with 5+ decimal precision
  • Expired holiday exceptions
  • Keyword-stuffed business names
  • Self-serving review markup
  • Most specific schema.org subtype

For agencies

Managing several hotels?

Host the schema for up to 25 client locations and update hours across every site from one dashboard.

See Pro