Most hotels are invisible to AI search. This guide shows you why, and how to fix it, whether you have 1 property or 1,000.
JSON-LD schema markup, structured data, and location enrichment to make hotels visible in ChatGPT, Perplexity, and Google AI Overviews.
Without geo data
What AI sees: nothing matchable. Zero proximity queries answered.
With GeoEnrich
What AI sees: matchable for 40+ query types including "near Centraal Station", "walkable to restaurants", "easy metro access".
GeoEnrich generates the right column automatically from an address. One API call.
Add this JSON-LD to your hotel's website and you're immediately discoverable by AI search engines:
{
"@context": "https://schema.org",
"@type": "Hotel",
"name": "Hotel Amsterdam Central",
"url": "https://www.example-hotel.com",
"telephone": "+31 20 123 4567",
"email": "reservations@example-hotel.com",
"address": {
"@type": "PostalAddress",
"streetAddress": "Prins Hendrikkade 33",
"addressLocality": "Amsterdam",
"addressRegion": "North Holland",
"postalCode": "1012 TM",
"addressCountry": "NL"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 52.3787,
"longitude": 4.9010
},
"description": "Luxury 4-star hotel overlooking Amsterdam Central Station with spa, rooftop bar, and canal views.",
"priceRange": "EUR150-350",
"starRating": {
"@type": "Rating",
"ratingValue": 4.5,
"bestRating": 5
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.5,
"reviewCount": 823,
"bestRating": 5,
"worstRating": 1
},
"checkinTime": "15:00",
"checkoutTime": "11:00",
"amenityFeature": [
{"@type": "Text", "name": "Free WiFi"},
{"@type": "Text", "name": "Swimming Pool"},
{"@type": "Text", "name": "Spa"},
{"@type": "Text", "name": "Restaurant"},
{"@type": "Text", "name": "Gym"},
{"@type": "Text", "name": "Parking"}
],
"petsAllowed": true,
"offers": {
"@type": "Offer",
"url": "https://www.example-hotel.com/book",
"priceCurrency": "EUR",
"price": "200"
}
}
Want the full version with location scores, POIs, nearby attractions, and room types? See the complete hotel schema in the examples below.
Users are asking AI engines increasingly specific questions that require both location and property data. Here are real query patterns your hotel needs to answer:
Amenity + Location Searches:
Logistics Searches:
Experience Searches:
Your data must support these queries. That means:
Your Hotel schema is the foundation. AI systems read this first to understand what you are, where you are, what you offer, and how good you are.
Hotel Type: LodgingBusiness vs Hotel
Use "@type": "Hotel" for traditional hotels. Use LodgingBusiness only for unusual accommodations (hostels, cabins, houseboats). Most properties are Hotels.
Required Fields
name: Property identity (e.g., "The Pulitzer Amsterdam")address (full PostalAddress): Location matching, distance calculationgeo (latitude, longitude): Precise positioning for queries like "hotels within 1km"description: AI uses this text to match queries, rank relevance, and cite in responsesaggregateRating: Trust signal, AI ranks higher-rated hotels higheroffers (price range): Filtering for budget-conscious searchesamenityFeature: Specific capabilities AI can cite (swimming pool, spa, restaurant, WiFi)image: Visual confirmation for users after AI recommendationWriting Descriptions AI Will Actually Cite
Your description field is crucial. AI systems extract details from this text to answer user queries.
Bad description (generic, vague):
"Beautiful hotel in Amsterdam. Nice rooms. Friendly staff. Great location."
Good description (specific, location-aware, amenity-rich):
"Luxury 5-star hotel occupying a restored 17th century palace on Amsterdam's Prinsengracht canal. 80 rooms with floor-to-floor windows overlooking Amsterdam's oldest waterway. Amenities include Michelin-starred restaurant, spa with sauna and steam room, rooftop terrace with canal views, 24-hour gym, and free WiFi. Located 150 meters from Westermarkt church and 300 meters from Anne Frank House. Walking distance to Jordaan neighborhood galleries and shops. Direct tram access to Central Station (5 minutes) and airport (20 minutes)."
When users ask "family-friendly hotels with spacious rooms and interconnecting doors", or "double rooms with city views under 200 euros", they need room-level data.
Use HotelRoom nested within your Hotel schema via containsPlace.
{
"@type": "HotelRoom",
"name": "Deluxe Double Room with Canal View",
"description": "45 sqm room with king-size bed, floor-to-ceiling windows overlooking Prinsengracht canal.",
"bed": [
{
"@type": "BedDetails",
"name": "King Size",
"numberOfBeds": 1
}
],
"occupancy": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 2
},
"amenityFeature": [
{"@type": "Text", "name": "Private balcony"},
{"@type": "Text", "name": "Air conditioning"},
{"@type": "Text", "name": "Rainfall shower"},
{"@type": "Text", "name": "Minibar"},
{"@type": "Text", "name": "Safe"},
{"@type": "Text", "name": "Free WiFi"}
],
"floorSize": {
"@type": "QuantitativeValue",
"value": 45,
"unitCode": "MTK"
},
"offers": {
"@type": "Offer",
"priceCurrency": "EUR",
"price": "280"
}
}
Create separate HotelRoom entries for each major room category:
AI systems heavily weight reviews and ratings. A 4.8-star hotel with 2,000 reviews ranks much higher in recommendations than a 5-star hotel with 3 reviews.
Always include aggregateRating at the hotel level:
{
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.6,
"reviewCount": 1847,
"bestRating": 5,
"worstRating": 1
}
}
Why this matters:
ratingValue: Raw score (out of 5). AI uses this for ranking.reviewCount: Number of reviews. Higher counts = more trusted by AI.Use review array for individual reviews. Include at least your best 10-20 reviews. AI engines pull these snippets when answering "what do people say about this hotel?"
How AI uses ratings:
This is where GEO truly powers AI recommendations. Location enrichment makes your hotel answerable to logistical queries.
Nearby Points of Interest (POIs)
Create additionalProperty entries for nearby attractions. When a user asks "hotels within walking distance of the Louvre", AI needs this data:
{
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Nearest Museum",
"value": "Anne Frank House, 300 meters walking distance (5 minutes)"
},
{
"@type": "PropertyValue",
"name": "Nearest Public Transport",
"value": "Westermarkt Tram Stop (lines 13, 14), 150 meters (2 minutes)"
},
{
"@type": "PropertyValue",
"name": "Nearest Airport",
"value": "Amsterdam Airport Schiphol, 9 km (express train 20 minutes, bus 45 minutes)"
}
]
}
Location Scores
Structured scores help AI understand your property's neighborhood characteristics:
{
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Walkability Score",
"value": "92/100 - Walker's Paradise. Most errands can be accomplished on foot."
},
{
"@type": "PropertyValue",
"name": "Transit Score",
"value": "94/100 - Excellent Public Transportation. Convenient for most trips."
},
{
"@type": "PropertyValue",
"name": "Nightlife Score",
"value": "85/100 - Very High. Lots of nearby bars, clubs, restaurants, music venues."
}
]
}
Automating Location Enrichment with GeoEnrich API
Instead of manually entering all this data, use the MapAtlas GeoEnrich API. It automatically pulls nearby attractions, transport links, and location scores based on your coordinates.
JSON-LD is essential, but your website's HTML content structure matters too. AI crawls both.
Your landing page should have H2 headers that match how users search:
FAQ Section (Critical for AI)
Create FAQ section targeting specific AI query patterns:
Link between your hotel, room, and location content to help AI understand relationships and improve contextual ranking.
Understanding how AI cites hotels helps you optimize your data.
When ChatGPT, Perplexity, or Claude answers "best romantic hotels in Amsterdam with canal views under 250 euros", here's what influences their recommendation:
Data Signals:
AI systems cite hotels like this:
"The Pulitzer Amsterdam is an excellent choice. This 5-star luxury hotel occupies 25 interconnected 17th-century palaces on the Prinsengracht canal. Rooms feature floor-to-ceiling windows with canal views, high ceilings, and antique furnishings. The hotel has a spa, rooftop bar, and Michelin-recommended restaurant. Guests give it 4.6 stars. Rates start at EUR 280 per night."
That citation comes directly from your schema: description, reviews, amenities, offers/price.
Avoid these to ensure AI can discover and rank your hotel correctly.
1. Missing or Incorrect Coordinates
Coordinates like "52, 4" point to the ocean between Amsterdam and the UK. Use 4+ decimal places: "latitude": 52.3787, "longitude": 4.9010. Incorrect coordinates break distance calculations entirely.
2. No Room-Level Schema
AI can't answer "rooms with balconies" or "family rooms with interconnecting doors" without room-level HotelRoom schema nested via containsPlace.
3. Stock Descriptions
"Beautiful hotel in Amsterdam. Great location. Excellent service." could apply to any hotel. AI can't extract details or match user queries. Be specific: "Luxury 4-star hotel in Amsterdam's Jordaan neighborhood, 300 meters from Anne Frank House."
4. No Nearby Attraction Data
If you don't mention nearby attractions in additionalProperty or description, you miss queries like "hotels within walking distance of museums."
5. Stale Availability and Pricing
Update pricing monthly at minimum. AI thinks you're closed or untrustworthy if pricing is old.
6. No Review Markup
A high starRating without reviewCount is untrustworthy. Always use aggregateRating with both ratingValue and reviewCount.
7. Incomplete Address
Always include postalCode and addressCountry in PostalAddress. Missing fields prevent verification.
Before launching your GEO optimization, validate your schema works.
Tool 1: Google Rich Results Test
Go to search.google.com/test/rich-results, paste your page URL, and look for "Hotel" in valid tags. Check for errors or warnings and review the rich results preview.
Tool 2: AEO Checker
Go to /aeo-checker and enter your hotel URL. You'll receive a detailed report on schema completeness, coordinate accuracy, nearby attraction coverage, location enrichment gaps, and suggestions for improvement. Aim for 85%+ schema completeness with 20+ nearby attractions defined.
Tool 3: Test on Actual AI Systems
Ask ChatGPT, Perplexity, and Claude: "best 4-star hotels in Amsterdam with spa under 250 euros." See if your hotel appears and how it's described. If your hotel isn't appearing, you likely have a schema issue: incomplete data, incorrect coordinates, low review count, or missing amenity data that matches the query.
JSON-LD Validation
Use a JSON linter at jsonlint.com. Common errors include missing commas between properties, quotes around numbers (coordinates must be numbers, not strings), and unclosed brackets or braces.
This guide includes three complete, production-ready schema examples:
All files include real coordinate examples (Amsterdam hotels), complete additionalProperty enrichment, nearby attraction examples, location scores, multiple room types, review markup, and pricing/offers. Copy these files, update details to match your property, and deploy to your website.
Automate this at scale
The MapAtlas GeoEnrich API adds coordinates, nearby POIs, transit access, neighborhood context, and schema-ready geo data to every listing automatically, one API call per listing, at any scale.