hasPOS
hasPOS · Optional
Appears in
What is it?
hasPOS declares the physical points-of-sale operated by an organization or person. Each value is a Place object describing a retail location, pop-up, kiosk, or any other physical venue where customers can purchase from or interact directly with the organization. The property originated in the GoodRelations e-commerce vocabulary, which schema.org absorbed.
Why this matters for AEO
AI answer engines increasingly respond to local commercial queries: "where can I buy [product] in [city]?" or "does [brand] have a store near me?" A structured hasPOS on an Organization schema gives these systems machine-readable location data tied to the organization's entity record, rather than relying on scraping unstructured store locator pages. For brands with physical retail, this field bridges the gap between the organizational entity and its ground-level commercial presence. When a user's query implies local intent, AI systems that can resolve an organization to specific geo-located points-of-sale deliver more relevant answers.
What the specs say
Schema.org:hasPOS expects a Place object. Points-of-Sales operated by the organization or person. The range includes Organization and Person. This property originates from the GoodRelations vocabulary for e-commerce. [Source: https://schema.org/hasPOS]
Google: Not mentioned in Google's structured data documentation for Organization. Google's local business documentation covers LocalBusiness as a type rather than hasPOS on Organization. [Source: https://developers.google.com/search/docs/appearance/structured-data/organization]
How to find your value
For each physical location, gather:
- Store name (if distinct from the organization name)
- Street address, city, region, postal code, country
- Telephone number (optional but useful)
- Opening hours (optional, use
openingHoursSpecification) - Geographic coordinates (optional:
latitude,longitude)
For organizations with many locations, include the most important or flagship locations in the schema. A full store directory does not need to be embedded in a single JSON-LD block.
Format and code
Single point-of-sale:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Patagonia",
"url": "https://patagonia.com",
"hasPOS": {
"@type": "Place",
"name": "Patagonia San Francisco",
"address": {
"@type": "PostalAddress",
"streetAddress": "770 North Point St",
"addressLocality": "San Francisco",
"addressRegion": "CA",
"postalCode": "94109",
"addressCountry": "US"
},
"telephone": "+1-415-771-2050",
"url": "https://www.patagonia.com/stores/san-francisco/"
}
}
Multiple locations as an array:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Warby Parker",
"url": "https://warbyparker.com",
"hasPOS": [
{
"@type": "Place",
"name": "Warby Parker SoHo",
"address": {
"@type": "PostalAddress",
"streetAddress": "121 Greene St",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10012",
"addressCountry": "US"
}
},
{
"@type": "Place",
"name": "Warby Parker Chicago",
"address": {
"@type": "PostalAddress",
"streetAddress": "1154 N Dearborn St",
"addressLocality": "Chicago",
"addressRegion": "IL",
"postalCode": "60610",
"addressCountry": "US"
}
}
]
}
With geographic coordinates and opening hours:
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Allbirds",
"url": "https://allbirds.com",
"hasPOS": {
"@type": "Place",
"name": "Allbirds Santa Monica",
"address": {
"@type": "PostalAddress",
"streetAddress": "3rd Street Promenade",
"addressLocality": "Santa Monica",
"addressRegion": "CA",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 34.0124,
"longitude": -118.4966
}
}
}
Webflow implementation
Static pages
Add the JSON-LD in Page Settings > Custom Code on your homepage or locations page. For a small number of flagship stores, hardcoding is straightforward. Update when locations open or close.
CMS template pages
For organizations with a CMS-managed store directory, each CMS item represents one location. Output individual LocalBusiness or Place JSON-LD per page. On the organization's main page, reference key locations via hasPOS in an embed component with CMS field bindings.
In Schema HQ
The hasPOS field configures haspos as a nested place object within the organization schema editor. for multiple locations, add array entries with address data for each. is supported
Real examples
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Glossier",
"url": "https://glossier.com",
"hasPOS": [
{
"@type": "Place",
"name": "Glossier New York",
"address": {
"@type": "PostalAddress",
"streetAddress": "123 Lafayette St",
"addressLocality": "New York",
"addressRegion": "NY",
"postalCode": "10013",
"addressCountry": "US"
}
},
{
"@type": "Place",
"name": "Glossier Los Angeles",
"address": {
"@type": "PostalAddress",
"streetAddress": "8407 Melrose Ave",
"addressLocality": "Los Angeles",
"addressRegion": "CA",
"postalCode": "90069",
"addressCountry": "US"
}
}
]
}
Related fields
FAQ
What is the difference between hasPOS and location?
location describes the primary location of the organization itself (its headquarters or main operating location). hasPOS describes retail or sales points operated by the organization, which may be separate from its headquarters. A company can have a headquarters in New York but hasPOS entries across 50 cities.
Should I list all stores or just a few?
There is no technical limit, but embedding hundreds of locations in a single JSON-LD block is impractical. Include flagship or representative locations in the Organization schema. For a complete location directory, implement LocalBusiness schema on individual store pages and link them via sameAs or a sitemap.
Does hasPOS work for digital-only points of sale?
The property is designed for physical places. For digital sales channels (app, website, marketplace listings), use hasOfferCatalog or link to your products via makesOffer.