Franchise businesses have a structural advantage that most brands would envy: multiple physical locations, each serving a local audience, all operating under a single trusted brand. But that advantage only pays off in AI search if the underlying structured data actually tells that story clearly.
ChatGPT, Perplexity, and Gemini do not browse your website the way a human does. They infer meaning from signals, and one of the clearest signals you can send is well-structured schema markup. For franchise brands specifically, getting this right means the difference between being recommended for "best [service] near me" queries in five cities or being invisible in all of them.
This post covers exactly how to implement Franchise schema, how it connects to the broader LocalBusiness and Organisation graph, and what common mistakes quietly kill your AI visibility across locations.
Why Multi-Location Brands Confuse AI Search Engines
AI search engines build a model of your brand from everything they can find: your website, third-party mentions, structured data, and cached versions of pages. When a franchise has 20 or 50 locations, each with slightly different NAP data (name, address, phone number), inconsistent opening hours, and no clear relationship expressed between the parent brand and the individual outlets, the AI gets confused.
Confused AI does not recommend you. It hedges, or it picks a competitor with cleaner signals.
The specific problem is one of entity disambiguation. The AI needs to understand that "FlinnBurger Manchester" and "FlinnBurger Leeds" are not two separate businesses competing with each other. They are branches of a single brand, each with its own local identity. Without schema markup that expresses this relationship explicitly, the AI has to guess. And it often guesses wrong.
This is where the Franchise type and the branchOf property in Schema.org become genuinely useful, not just academically interesting.
The Schema Types You Actually Need
There is no single "Franchise schema" block you drop into a page and call it done. What you are building is a relationship graph across several schema types. Here is how they fit together.
Organisation (the parent brand)
Your corporate or franchisor entity should be marked up as an Organisation (or a more specific subtype like Corporation). This is the root of your entity graph. It needs:
@type:Organizationname: your brand name, consistently spelled everywhereurl: your canonical homepage URLlogo: anImageObjectwith the full URL to your logosameAs: links to your Wikipedia page, Wikidata entry, LinkedIn company page, Google Business Profile, and any major directory listingsnumberOfEmployeesorfoundingDate: optional but helpful for grounding the entity in verifiable facts
The sameAs array is particularly important. AI models heavily use coreferencing: matching mentions of your brand name across the web to a single entity. Giving them explicit pointers to authoritative references makes that matching far more reliable.
LocalBusiness (each franchise location)
Each physical location should be marked up as a LocalBusiness, or a more specific subtype like Restaurant, AutoRepair, Dentist, or whichever type applies. The key property that most franchise sites miss is branchOf.
The branchOf property takes an Organisation object as its value. This is how you tell the AI: "This location is part of this parent brand." Done correctly, it looks like this in JSON-LD:
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "FlinnBurger Manchester",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Deansgate",
"addressLocality": "Manchester",
"postalCode": "M3 4LX",
"addressCountry": "GB"
},
"telephone": "+44161XXXXXXX",
"openingHoursSpecification": [...],
"branchOf": {
"@type": "Organization",
"name": "FlinnBurger",
"url": "https://flinnburger.com"
}
}
You can also use @id references here if your parent Organisation block is defined elsewhere on the same site, which is cleaner and avoids duplication.
The Franchise Type Itself
Schema.org does include a Franchise type, but it is rarely the right primary type to use. It is intended to describe the franchise agreement or opportunity, not the business entity. Use it if you have a dedicated "franchise opportunity" page, but do not replace LocalBusiness or Organisation with it. The combination of LocalBusiness plus branchOf plus a clean parent Organisation block is what actually builds the entity graph AI engines need.
Building the Parent Entity Page
Every franchise brand should have a single canonical page that acts as the authoritative source for the parent entity. This is usually the homepage, but it could be an "About" page or a dedicated brand hub.
On this page, your Organisation JSON-LD should be as rich as possible. Include:
hasOfferCatalog: list your core products or servicesareaServed: list the regions or countries you operate incontactPoint: your main customer service or enquiries contactsubOrganization: an array pointing to eachLocalBusinessentity, using@idreferences
The subOrganization property is the inverse of branchOf. You do not need both on every page, but having the parent-to-child relationship expressed somewhere makes the graph fully bidirectional, which AI models find easier to traverse.
One practical point: keep your brand name identical across every schema block. Not "FlinnBurger Ltd" on one page and "Flinn Burger" on another. The AI uses string matching and entity resolution, and small inconsistencies create separate entities in its model rather than a single, authoritative one.
Location Pages: What AI Search Actually Reads
Each franchise location should have its own page on your website, not just a Google Business Profile. AI search engines do visit and index web pages. A well-structured location page gives the AI a place to anchor its understanding of that branch.
Every location page should include:
- The
LocalBusinessJSON-LD block described above - Unique, locally relevant content (not boilerplate copy pasted across all 50 pages)
- The correct
geocoordinates usingGeoCoordinates - Accurate
openingHoursSpecificationusing the structured format, not a plain text string - An
aggregateRatingblock if you have reviews, pulling from a genuine review source
The uniqueness point is worth dwelling on. If your Manchester and Leeds pages have identical body copy aside from the city name swapped in, AI models will treat them as low-quality duplicates. Local AI queries ("best X in Manchester") pull from locally-specific signals. Give each location page something genuine: mention a nearby landmark, a specific team member, a local promotion, or a community event.
Opening Hours and Service Area: Getting the Details Right
Two fields that franchise sites consistently get wrong are opening hours and service area. Both matter more than most people realise for local AI recommendations.
Opening hours
Use openingHoursSpecification with individual day-by-day entries rather than a single openingHours string. The structured format allows AI engines to answer "is FlinnBurger Manchester open on Sunday evenings?" with confidence. If your locations have seasonal or holiday hours, use the validFrom and validThrough properties inside each specification block.
Service area
If your locations deliver or serve customers beyond their physical postcode, use areaServed with either a GeoCircle, a list of Place objects naming the areas, or administrative regions. This directly affects whether a location gets surfaced for "near me" queries in surrounding areas, which is where AI search is increasingly competitive.
Connecting Reviews to the Right Entity
One underappreciated problem for franchise brands is review attribution. If a user asks ChatGPT "is FlinnBurger in Leeds good?", the AI needs to connect reviews specifically to the Leeds branch, not aggregate them at the brand level or pull from the wrong location.
This means each location's LocalBusiness block should have its own aggregateRating, not shared with or overridden by the parent entity's rating. Use sameAs on each location block to link to that specific location's Google Business Profile URL and Yelp or Trustpilot page where available.
If you want to understand how reviews more broadly influence AI recommendations, this post on how customer reviews influence whether AI recommends your business is worth reading alongside this one.
Common Mistakes That Break the Entity Graph
Here are the most frequent errors we see when auditing franchise sites at FlinnSchema:
- No
branchOfproperty: The single most common omission. Without it, each location looks like an independent business to the AI. - Inconsistent brand names: Using "Ltd", "Inc", abbreviations, or alternative spellings breaks entity resolution across locations.
- Missing
@idon the parent entity: Without a stable@idURL, you cannot reference the parent entity from location pages without duplicating the whole block. - Copying schema from templates without updating addresses: We have seen sites where the schema says "London" but the page is for a Birmingham branch. This actively misleads AI search engines.
- No location-specific pages: Putting all locations on a single "Find a Store" map with no individual URLs means there is nothing for the AI to anchor a location-specific entity to.
If you want a full picture of what is hurting your AI visibility right now, our free AI visibility audit will surface these issues across your site.
Testing Your Implementation
Once you have deployed your schema across the parent and location pages, validation is straightforward but should be done systematically.
Use Google's Rich Results Test for each location page individually. Check that the LocalBusiness type is detected, that branchOf is present in the parsed output, and that there are no critical errors on opening hours or address fields.
Then manually test in AI search. Ask ChatGPT or Perplexity questions like "What are the opening hours of [Brand] in [City]?" and "Where is the nearest [Brand] to [Location]?". If your schema is working, these should return accurate, sourced answers within a few weeks of implementation. If the AI is still giving generic or incorrect responses, check for entity disambiguation issues first: inconsistent naming and missing sameAs links are usually the culprit.
For a deeper look at how to test whether your structured data is actually being read by AI engines, see our guide on how to test if your FAQ schema is being read by AI search engines, which covers the same testing principles applied across schema types.
Franchise schema done well is not a one-time task. As locations open, close, or change hours, the schema needs to stay current. Stale data in a LocalBusiness block is worse than no schema at all, because it trains the AI to give confidently wrong answers about your brand. Build schema updates into your operations workflow from the start.
Frequently Asked Questions
Do I need a separate page for each franchise location?
Yes, ideally. Each location should have its own URL with unique content and a LocalBusiness schema block. A shared "store finder" page without individual location URLs gives AI engines nothing to anchor location-specific entity data to, which limits your visibility for local queries significantly.
What is the difference between branchOf and subOrganization?
branchOf is used on the child (location) entity to point up to the parent. subOrganization is used on the parent entity to point down to each child. They are inverses of each other. You do not need both on every page, but having one expressed bidirectionally somewhere in your schema graph makes entity resolution more reliable for AI models.
How long does it take for franchise schema changes to affect AI search results?
It varies. Google typically reindexes within days to a couple of weeks. AI search engines like ChatGPT and Perplexity update their knowledge at different intervals. A reasonable expectation is to see changes reflected within four to eight weeks of a correct, validated implementation. Testing manually in AI chat tools is the most direct way to track progress.
Can I use the same aggregateRating across all locations?
No. Each location should have its own aggregateRating that reflects that specific branch's reviews. Using a shared brand-level rating on every location page is technically inaccurate and can mislead AI engines into giving incorrect quality signals for individual branches. Link each location's schema to that branch's own review sources using sameAs.

