Schema markup for a stockist list: LocalBusiness on your own domain
October 2026
Most guides to LocalBusiness markup are written for a business describing itself. A brand with stockists has a different job: publishing a list of other companies' shops on its own site. This page is about that second case. It shows a real block captured from a live page, says what a validator reported about it, and is plain about what we did not test.
For why a machine-readable stockist list matters at all, see Why your stockist list should be readable by AI assistants. This page stays at the markup level.
What Google's LocalBusiness page asks for
Google's local business structured data page lists two required properties:
name: the name of the business.address: aPostalAddress, "as many properties as possible", with the example usingstreetAddress,addressLocality,addressRegion,postalCodeandaddressCountry.
It lists these as recommended: geo (latitude and longitude, at least five decimal places), telephone, url (the location's own working URL) and openingHoursSpecification. It also recommends checking your markup with the Rich Results Test.
The page is written around a business's own location. We found nothing in it that says whether a brand may mark up other companies' shops, so treat that as unanswered.
What an ItemList of stockists looks like
Nearmio publishes the list as an ItemList, one ListItem per location, each wrapping a LocalBusiness. Below is a block captured from the public stockist page of a live Nearmio store, at /apps/nearmio/stores on the store's own domain. The structure below is exactly as captured, but it is trimmed (the real block has 36 items, and only positions 2 and 3 are shown) and the two shops' names, addresses and coordinates are placeholders, not real retailers.
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "Store locations",
"numberOfItems": 36,
"itemListElement": [
{
"@type": "ListItem",
"position": 2,
"item": {
"@type": "LocalBusiness",
"name": "Example Gifts Co.",
"address": "100 Main Street, Springfield, TX, 75001, USA",
"geo": {
"@type": "GeoCoordinates",
"latitude": 32.1234567,
"longitude": -96.1234567
}
}
},
{
"@type": "ListItem",
"position": 3,
"item": {
"@type": "LocalBusiness",
"name": "Sample Boutique",
"address": "200 Oak Avenue, Shelbyville, TX, 75002, USA",
"geo": {
"@type": "GeoCoordinates",
"latitude": 30.7654321,
"longitude": -97.7654321
}
}
}
]
}
Two things to notice. First, every item in this capture has only a name, an address and coordinates. Nearmio also writes telephone, openingHours, url, sameAs and keywords when a location has them, but none of those appear in this capture. Second, address is a single line of text, not a PostalAddress with separate street, city, region, postcode and country fields. Google's page, as summarised above, shows the structured form.
Validate it
We ran the live page the block was captured from (not the placeholder version above) through validator.schema.org by giving it the URL. For the whole 36-item block, it reported 0 errors and 0 warnings and read it as one ItemList. In its output the text address appeared as a PostalAddress holding only a name.
That is all the validator told us. It checks the markup against schema.org; it is not Google's tool, and it does not say whether Google or any other service will use the markup. We have not run the Rich Results Test on this page, so we make no claim about it.
To check your own: open validator.schema.org, paste the URL of your stockist page, run the test, and read the errors and warnings against the list of properties you meant to publish. If your storefront is behind a password, a URL fetch will not reach the page (when we requested a password-protected store's stockist page, it redirected to the password screen), so use the "Code snippet" tab and paste the block instead.
Check view-source
Where the markup lives decides who can read it. Open the page, choose "View page source" (not "inspect element"), and search for application/ld+json.
- The stockist page at
/apps/nearmio/storesis built on the server, so the block is in the raw HTML. We confirmed this with a plain download of the page, no JavaScript run. - The map on your where-to-buy page also adds the same block, but only after its script loads the locations. On the live page we checked, the block was missing from the raw HTML and present once the page had rendered. A reader that does not run JavaScript will not see it there.
If you only ever look at the rendered page, you cannot tell these apart. The where-to-buy page checklist has the same test for the visible list.
What not to mark up
- Shops a shopper cannot visit. Online-only retailers and warehouses are not places to walk into, so leave them out of the list and out of the markup.
- Reviews and ratings you did not collect. Google's page limits
aggregateRatingandreviewto sites that capture reviews about other local businesses. A stockist list does not. - Hours you cannot keep current. Opening hours are the shop's to maintain. Leave them blank, or link to the shop's own listing.
- Stockists that are not on the visible page. The markup should match what a shopper sees. Nearmio builds both from the same list of active locations.
- Duplicates. The block we captured has the same shop twice, at positions 1 and 7, with the country written "US" once and "USA" once. The validator did not flag it. Clean your list before you publish it.
Limits
Valid markup is not a promise. Passing a validator means the syntax is right; it does not mean a search engine will show your stockists in any special way, or that an assistant will read them. We have tested one validator, on one live page, on one day. Third-party shops described on your site are also not the same as a business describing itself, and nobody has told us how search engines treat them.
Try it on a development store
Nearmio is free for up to 5 locations. To see the markup for yourself, install it on a development store, add a few locations, and open /apps/nearmio/stores on that store's domain. View the source, then check it with the validator: if the storefront password is still on, use the "Code snippet" tab and paste the block, because a URL fetch will not get past the password page. If the output is not what you expected, tell us.