ServicesAI Audit
← Back to Blog

How to Use hasMap and geo Schema to Win Local AI Search

Schema MarkupLocal SEOAI VisibilityJSON-LDgeo SchemahasMap SchemaLLM SEOLocal AI Search
Close-up of a hand pointing on a map, surrounded by travel essentials.

Why AI Search Engines Struggle with Location Data

When someone asks ChatGPT or Perplexity "which coffee shops are near Victoria station?" or "find me a plumber in Leeds", those AI engines are not pulling from a live map. They are drawing on structured data they have already indexed or been trained on. If your location data is vague, buried in unstructured text, or missing entirely, you are invisible to that response.

This is where two often-overlooked schema properties come in: hasMap and geo. Both sit inside the LocalBusiness schema type (and its many subtypes), and together they give AI systems precise, machine-readable signals about where your business actually is. Google has supported them for years, but their value for AI readability is only now becoming widely understood.

Most businesses either skip them entirely or implement them incorrectly. Getting them right is straightforward if you know what you are doing.

What hasMap Actually Does

The hasMap property accepts a URL, specifically the URL of a map showing the location of the business. In practice, this is almost always a Google Maps link or an Apple Maps link pointing directly to your business listing.

It sounds simple, and it is. But the reason it matters for AI search is that it creates an explicit, structured connection between your schema markup and a verified, third-party map source. AI models that process structured data can treat a hasMap URL as a corroborating signal. You are not just claiming to be at an address, you are pointing to an authoritative, publicly verifiable source that confirms it.

Think of it like a reference on a CV. You could state your previous employer, but a direct link to their LinkedIn page removes any ambiguity.

How to Get the Right Google Maps URL

There are a few ways to get this wrong. The most common mistake is using the short redirect URL from Google Maps (the ones that start with maps.app.goo.gl). These are fine for sharing, but they are not ideal for schema markup because they are not stable or transparent. Use the full, permanent URL instead.

The cleanest approach:

  1. Go to Google Maps and search for your verified business listing.
  2. Click the "Share" button and copy the link. This gives you a URL like https://maps.google.com/?cid=1234567890 or a longer place URL.
  3. Alternatively, use the CID-based URL, which is the most stable format: https://www.google.com/maps?cid=YOUR_CID_NUMBER.

Your CID (Customer ID) is the unique identifier Google assigns to your Business Profile. You can find it by using a tool like PlePer's Google Maps CID Finder, or by looking at the URL when your listing is open in the old Google Maps view.

What geo Does and Why It Is More Precise

The geo property accepts a GeoCoordinates object, which holds your latitude and longitude. This is the most direct, unambiguous location signal you can give any machine, including an AI model.

An address can be interpreted in multiple ways. Streets get renamed. Postcodes cover large areas. Geocoding is not always accurate, particularly for newer developments, rural locations, or businesses inside large complexes. Providing exact coordinates removes that ambiguity entirely.

For AI systems, this is valuable in a specific way. When a language model is synthesising information about local businesses, coordinate data helps it understand proximity relationships, cluster nearby businesses together, and answer questions about specific areas with greater accuracy. Your schema is feeding the model's understanding of geography.

Finding Your Exact Coordinates

Getting precise coordinates is easy. Open Google Maps, find your exact business location (not just the postcode, but the actual building or entrance), right-click on the pin, and the coordinates will appear at the top of the context menu. Click them to copy.

You want at least 5 decimal places of precision. Something like 51.50740 is far more useful than 51.5. The more precise you are, the more useful the data is for any system reading it.

If your business is inside a shopping centre, airport terminal, or large campus, point the coordinates at your actual unit or entrance, not the centre of the building. That level of specificity matters more than most people realise.

Putting It All Together: The JSON-LD Implementation

Here is a working example for a fictional bakery in Manchester. This is the kind of clean, well-structured markup that gives AI models exactly what they need:

{
  "@context": "https://schema.org",
  "@type": "Bakery",
  "name": "Northern Crumb Bakery",
  "url": "https://www.northerncrumb.co.uk",
  "telephone": "+441612345678",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "14 Deansgate",
    "addressLocality": "Manchester",
    "addressRegion": "Greater Manchester",
    "postalCode": "M3 4LY",
    "addressCountry": "GB"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 53.47939,
    "longitude": -2.24879
  },
  "hasMap": "https://www.google.com/maps?cid=7654321098765432",
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "07:00",
      "closes": "17:00"
    }
  ]
}

Notice how geo and hasMap sit alongside the postal address. They are not replacements for the address, they are additional layers of precision. All three together create a rich, triangulated location signal.

If you want to validate this markup, paste it into Google's Rich Results Test or Schema.org's validator. Both will confirm there are no structural errors.

Where to Place This Markup on Your Site

For most businesses, this schema belongs on your homepage, your contact page, and any location-specific landing pages you have. If you run multiple branches, each branch should have its own page with its own distinct schema block containing its own coordinates and map URL.

Do not make the common mistake of placing the same schema on every page of the site. That creates noise and can confuse crawlers. Put it where it is contextually appropriate: pages that are about or associated with that physical location.

On Shopify, you will typically add this via a custom liquid snippet in your theme, either injected into the <head> of the relevant template or appended to the body. On WordPress, you can use a plugin like Rank Math or Yoast with some manual configuration, or add it directly via a function in your theme's functions.php file. For more advanced implementations across large catalogues or multi-location businesses, custom automation is usually the most reliable path. That is something FlinnSchema's automations service handles regularly.

Common Mistakes That Undermine hasMap and geo

Even when businesses do implement these properties, they often do it in ways that reduce their effectiveness. Here are the patterns that come up most frequently:

Using a Redirect or Short URL for hasMap

As mentioned above, goo.gl or maps.app.goo.gl links are not ideal. Use the full Google Maps URL. Stability and transparency matter when you are trying to give AI systems a reliable signal.

Rounding Coordinates

Entering 51.5 as your latitude is essentially useless. That covers a large swath of London. Five decimal places minimum, six is better.

Using a Generic Map Link Instead of Your Listing

Some implementations use a Google Maps search URL like https://maps.google.com/?q=My+Business+Name. This is a search query, not a direct link to a verified listing. It is far weaker. Use the CID-based URL or the direct place URL tied to your verified Business Profile.

Mismatched NAP Data

Your Name, Address, and Phone number in schema must match what is on your Google Business Profile exactly. If your schema says "14 Deansgate" but your GBP listing says "14a Deansgate", that inconsistency creates doubt. AI systems that cross-reference multiple sources will notice the discrepancy.

How This Feeds AI Recommendations Specifically

AI search engines like Perplexity and ChatGPT with browsing enabled will often cite businesses from a combination of sources: structured data on your website, your Google Business Profile, third-party directories, and review platforms. The more consistent and machine-readable your data is across all of these, the more confident an AI model can be when recommending you.

The hasMap property specifically creates a link between your on-site schema and an external authoritative source. That kind of cross-referencing is exactly how AI systems build confidence in a claim. It is not just about being indexed, it is about being trusted enough to be cited.

If you want to understand how AI visibility actually works for local businesses, our free AI visibility audit will show you where your current structured data is helping you and where it is falling short.

Combining hasMap and geo with Other Local Schema

These two properties work best as part of a broader local schema strategy. On their own, they add precision. Combined with openingHoursSpecification, aggregateRating, contactPoint, and areaServed, they become part of a genuinely rich data profile that AI systems can use to accurately represent your business.

For example, if you also implement areaServed to define the geographic regions you serve, AI models can answer questions like "which electricians cover the Oxford area?" with far more confidence if your schema explicitly tells them where you operate.

You can read more about how individual schema types fit together in our guide on OpeningHoursSpecification schema and how ContactPoint schema helps AI route enquiries. Getting these working in combination is where the real gains come from.

The principle throughout is the same: give machines unambiguous, specific, verifiable data. The more you do that, the more likely AI search engines are to include you in their responses with confidence.

Frequently Asked Questions

Does hasMap schema help with Google Maps rankings?

Not directly. hasMap is a schema property that links to a map, it does not function as a local SEO ranking signal in the traditional sense. Its primary benefit is giving AI systems and structured data consumers a verified, machine-readable link to your location. It complements your Google Business Profile rather than replacing any of the factors that influence Maps rankings.

What if I do not have a Google Business Profile?

You can still use hasMap with an Apple Maps URL or even an OpenStreetMap link. However, a verified Google Business Profile is strongly recommended for any local business. Without one, AI systems have far less corroborating data to draw on, and your local AI visibility will suffer regardless of how well your on-site schema is implemented.

How do I find my Google Maps CID number?

The easiest method is to search for your business on Google Maps in a desktop browser, click on your listing, and look at the URL. If it contains a cid= parameter, that is your number. Alternatively, tools like PlePer's Google Maps CID Finder let you look it up by business name and location without needing to dig through URLs manually.

Can I use geo schema for a service-area business with no physical address?

Yes, with some care. If your business operates from a home address you do not want to publish, you can use the centre point of your service area as your geo coordinates and omit the full postal address. However, you should then use areaServed explicitly to define your coverage area. Be consistent: whatever approach you take in your schema should match what you have set on your Google Business Profile.

Want to check your AI visibility?

Run a free audit on your website and see how visible you are to ChatGPT, Perplexity, and other AI search engines.

Run Free Audit