Optimization Guide

Shopify Store Location & LocalBusiness Schema for AI Shopping Agents

AI shopping agents answering "kitchen store open Sunday near downtown Austin" and "where can I try on the X jacket before buying" read LocalBusiness structured data — not your Google My Business profile, not your Shopify admin settings. Without a LocalBusiness JSON-LD block on your Shopify storefront, physical retail locations are invisible to conversational AI.

TL;DR Add a "@type": "LocalBusiness" (or specific subtype: ClothingStore, ElectronicsStore, etc.) JSON-LD block to your Shopify homepage and any location landing pages. Include address (PostalAddress), geo (GeoCoordinates), openingHoursSpecification, and telephone. For click-and-collect, reference the store from your Product Offer's availableAtOrFrom.

Why Shopify Omni-Channel Merchants Need LocalBusiness Schema

Over 40% of Shopify stores with 6+ figures in revenue have at least one physical retail location, pop-up, or showroom. These merchants run Shopify POS alongside their online store. But Shopify generates no location-aware structured data from its POS location settings — there is no automatic LocalBusiness, no hours, no coordinates.

AI shopping agents (ChatGPT, Google AI Mode, Perplexity) increasingly answer "stores near me that carry X brand" and "open until 8pm on Saturday" queries by reading LocalBusiness structured data directly from merchant websites. Google's local knowledge panel also pulls from this structured data. Without it, physical locations of even well-known Shopify merchants can appear offline to AI queries.

LocalBusiness schema subtype selector

Store typeSchema.org subtypeQuery benefit
Fashion / apparelClothingStore"clothing boutiques open now [city]"
Consumer electronicsElectronicsStore"electronics store with in-store demo near me"
Furniture / home décorFurnitureStore, HomeGoodsStore"furniture showrooms open Sunday [city]"
Sporting goodsSportingGoodsStore"bike shop open Saturday near downtown"
JewelryJewelryStore"jewelry stores with ring resizing near me"
PetsPetStore"pet stores that carry X brand food near me"
BooksBookStore"independent bookstores open this weekend"
ToysToyStore"toy stores with in-store pickup near me"
FloristFlorist"florists open today [city]"
General retailStoreGeneric fallback — use specific subtype when available

LocalBusiness JSON-LD for a Shopify Store

Add this block to theme.liquid (within <head> or before </body>) for your primary retail location:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "ClothingStore",
  "@id": "https://yourdomain.com/#store-main",
  "name": "Your Store Name",
  "url": "https://yourdomain.com/",
  "telephone": "+1-555-123-4567",
  "email": "hello@yourdomain.com",
  "priceRange": "$$",
  "image": "https://yourdomain.com/assets/storefront.jpg",
  "logo": "https://yourdomain.com/assets/logo.svg",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main Street, Suite 200",
    "addressLocality": "Austin",
    "addressRegion": "TX",
    "postalCode": "78701",
    "addressCountry": "US"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 30.2672,
    "longitude": -97.7431
  },
  "hasMap": "https://maps.google.com/?q=123+Main+Street+Austin+TX+78701",
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "10:00",
      "closes": "19:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "10:00",
      "closes": "18:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Sunday",
      "opens": "12:00",
      "closes": "17:00"
    }
  ],
  "sameAs": [
    "https://www.instagram.com/yourbrand",
    "https://www.facebook.com/yourbrand"
  ]
}
</script>

Linking products to store locations (click-and-collect)

In product JSON-LD, reference the LocalBusiness as the pickup location using availableAtOrFrom:

{
  "@type": "Offer",
  "price": "59.99",
  "priceCurrency": "USD",
  "availability": "https://schema.org/InStock",
  "availableAtOrFrom": {
    "@type": "ClothingStore",
    "@id": "https://yourdomain.com/#store-main"
  },
  "availabilityStarts": "2026-06-10",
  "deliveryLeadTime": {
    "@type": "QuantitativeValue",
    "value": 0,
    "unitCode": "DAY",
    "description": "Available for same-day in-store pickup"
  }
}

Multi-Location Setup

For Shopify merchants with multiple retail locations, create a location index page (/locations/) and individual location pages (/locations/new-york/, /locations/chicago/). Place a self-contained LocalBusiness block on each location page with that location's unique address, hours, and coordinates.

On the parent brand homepage, reference all locations using the department property:

{
  "@type": "Organization",
  "name": "Your Brand",
  "department": [
    { "@type": "ClothingStore", "@id": "https://yourdomain.com/locations/new-york/#store" },
    { "@type": "ClothingStore", "@id": "https://yourdomain.com/locations/chicago/#store" },
    { "@type": "ClothingStore", "@id": "https://yourdomain.com/locations/los-angeles/#store" }
  ]
}

Schema Properties Checklist

FAQ

Do I still need Google My Business if I add LocalBusiness schema to my Shopify store?

Yes — they serve different systems. Google My Business (now Google Business Profile) controls your Google Maps listing and local pack rankings. LocalBusiness schema on your website signals structured data to Google's indexer, AI agents (ChatGPT, Perplexity, Claude), and Bing. Both are necessary for full local discovery coverage. Schema.org data is also read by AI agents that don't have GMB access, making it the more universal signal for conversational AI shopping queries.

My Shopify store is online-only — should I still add LocalBusiness schema?

No. LocalBusiness requires a physical address that customers can visit. Online-only stores should use Organization or OnlineBusiness schema instead. Adding a fake physical address to LocalBusiness to game local results is a violation of Google's guidelines and can result in penalty. If you have a registered business address but no customer-facing retail space, omit LocalBusiness and use Organization with your registered address in the contactPoint.

How do I handle seasonal or holiday hours in schema.org?

Use the specialOpeningHoursSpecification property with validFrom and validThrough dates to declare temporary hours. For holiday closures, add a special specification with opens and closes set to "00:00" (indicating closed). Remove these after the period ends — stale special hours confuse AI agents about your current operating status.

Check Your Store's Local Schema Coverage

CatalogScan identifies omni-channel Shopify stores missing LocalBusiness structured data. Get your AI readiness score and pinpoint which structured data gaps are costing you local discovery.

Scan your store free