Structured Data Guide

Shopify Geo-Restricted Product Schema: eligibleRegion & ineligibleRegion for AI Agents

Some products can only be sold to shoppers in specific countries — regulatory restrictions, export controls, or simple shipping policies. AI shopping agents have no way to know this unless your structured data tells them. eligibleRegion and ineligibleRegion on Offer let you declare geographic boundaries directly in your JSON-LD.

TL;DR Add eligibleRegion (where you can sell) or ineligibleRegion (where you cannot sell) to your Offer JSON-LD block. Use DefinedRegion with containsPlace: [{"@type":"Country","identifier":"US"}] for country-level restrictions. Shopify's default JSON-LD has no geo-restriction signals — you must add them manually in product.liquid.

Why Geo-Restriction Signals Matter for AI Agents

AI shopping agents answer "find me a supplement for immune support" or "where can I buy this knife online?" from shoppers in any country. Without geographic restriction signals in your structured data, the agent may recommend your US-only product to a shopper in the UK, Germany, or Australia — where it can't legally ship. The shopper clicks through, goes to checkout, and hits a hard stop. That's wasted intent and a damaged brand experience.

More critically, some product categories have regulatory consequences for wrong-region sales:

Structured data geo-restrictions let AI agents, comparison engines, and Google Shopping surfaces filter your product out before recommending it to ineligible shoppers — reducing incorrect recommendations and supporting compliance.

eligibleRegion vs. ineligibleRegion: When to Use Each

Property Meaning Best for
eligibleRegion Product IS available in these regions Products sold to a small list of countries (e.g. US-only, US + CA + AU)
ineligibleRegion Product is NOT available in these regions Products available worldwide except a few restricted countries (e.g. EU-banned supplement)

Use eligibleRegion when you ship to a small number of countries — listing 3 allowed countries is simpler than listing 190 ineligible ones. Use ineligibleRegion when you ship globally but have a small exclusion list. Do not use both simultaneously on the same Offer — pick the more concise approach.

DefinedRegion: Building Geographic Boundaries

DefinedRegion is the recommended schema.org type for geo-restriction values. It can express regions at country, state/province, or postal code level.

Country-level restriction (most common)

"eligibleRegion": [
  {"@type": "DefinedRegion", "containsPlace": [{"@type": "Country", "identifier": "US"}]},
  {"@type": "DefinedRegion", "containsPlace": [{"@type": "Country", "identifier": "CA"}]},
  {"@type": "DefinedRegion", "containsPlace": [{"@type": "Country", "identifier": "AU"}]}
]

Simplified: addressCountry shorthand

"eligibleRegion": [
  {"@type": "DefinedRegion", "addressCountry": "US"},
  {"@type": "DefinedRegion", "addressCountry": "CA"},
  {"@type": "DefinedRegion", "addressCountry": "AU"}
]

State/province level restriction (US states only)

"eligibleRegion": {
  "@type": "DefinedRegion",
  "addressCountry": "US",
  "addressRegion": ["CA", "OR", "WA", "CO", "NV"]
}

ineligibleRegion example: EU-excluded supplement

"ineligibleRegion": [
  {"@type": "DefinedRegion", "addressCountry": "DE"},
  {"@type": "DefinedRegion", "addressCountry": "FR"},
  {"@type": "DefinedRegion", "addressCountry": "IT"},
  {"@type": "DefinedRegion", "addressCountry": "ES"},
  {"@type": "DefinedRegion", "addressCountry": "NL"},
  {"@type": "DefinedRegion", "addressCountry": "SE"},
  {"@type": "DefinedRegion", "addressCountry": "GB"}
]

Complete Geo-Restricted Offer Example

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "ProImmune Defense Complex — 60 Capsules",
  "description": "High-potency immune support supplement with elderberry, zinc, and vitamin D3. Ships to US, Canada, and Australia only.",
  "offers": {
    "@type": "Offer",
    "priceCurrency": "USD",
    "price": "39.99",
    "availability": "https://schema.org/InStock",
    "url": "https://nutristore.myshopify.com/products/proimmune-defense",
    "eligibleRegion": [
      {"@type": "DefinedRegion", "addressCountry": "US"},
      {"@type": "DefinedRegion", "addressCountry": "CA"},
      {"@type": "DefinedRegion", "addressCountry": "AU"}
    ]
  }
}

Shopify Liquid Implementation

Store eligible/ineligible country lists in Shopify metafields as JSON arrays. The product.liquid template reads these and outputs the geo-restriction block only when the metafield is populated — so non-restricted products get no eligibleRegion, meaning "available everywhere."

{% comment %} product.liquid — geo-restriction schema from metafields {% endcomment %}
{% assign eligible_regions = product.metafields.seo.eligible_regions.value %}
{% assign ineligible_regions = product.metafields.seo.ineligible_regions.value %}

Metafield setup in Shopify admin

Metafield key Type Example value
seo.eligible_regions JSON (list of strings) ["US","CA","AU"]
seo.ineligible_regions JSON (list of strings) ["DE","FR","IT","GB"]

Set only one of these metafields per product — not both. If neither is set, no geo-restriction block is output, which means the product is treated as globally available by AI agents.

Geo-Restriction by Product Category

Product Category Typical Restriction Approach Key Countries to Restrict
Dietary supplements with novel ingredients eligibleRegion: US + CA + AU (permissive markets) EU countries enforce Novel Food Regulation strictly
CBD / hemp products eligibleRegion: US-state-level where legal Most EU countries, UK (prescription-only), JP, KR, SG
Firearms accessories (magazines, suppressors) eligibleRegion: US only Virtually all non-US countries restrict imports
Alcohol / spirits eligibleRegion: US + select licensed markets Dry countries: SA, AE, IR, PK; import licensing varies widely
Electronics without CE marking ineligibleRegion: EU + UK + NO + CH European Economic Area requires CE; UK UKCA post-Brexit
High-capacity lithium batteries ineligibleRegion: countries banning air shipping Varies by carrier; AU/NZ restrict large packs by air
Laser devices (Class IIIb+) ineligibleRegion: EU + AU EU restricts high-power consumer lasers; AU customs strict

Common Geo-Restriction Schema Mistakes

Mistake Effect Fix
Using both eligibleRegion and ineligibleRegion on the same Offer Ambiguous; structured data parsers may ignore both Choose the shorter list: eligible (allow-list) or ineligible (deny-list)
Using Country @type without identifier property Country not machine-readable; agents can't resolve it Always include identifier: "US" (ISO 3166-1 alpha-2)
Spelling out country names instead of ISO codes "United States" is ambiguous; "US" is the standardized machine-readable form Use ISO 3166-1 alpha-2 codes: US, GB, DE, FR, JP, AU
No geo-restriction on genuinely restricted products AI agents recommend product to ineligible shoppers; wasted clicks and bad experience Add seo.eligible_regions or seo.ineligible_regions metafield to restricted SKUs
Restricting product that ships globally (over-restriction) Eligible shoppers excluded from AI recommendations Only add geo-restrictions where a real regulatory or shipping restriction exists

CatalogScan Geo-Restriction Checks

CatalogScan's AI Readiness scan checks for product categories commonly subject to geo-restrictions (supplements, CBD, firearms, alcohol, certain electronics) and flags their Offer blocks if eligibleRegion or ineligibleRegion is absent. The scan also validates that DefinedRegion entries use ISO 3166-1 alpha-2 country codes in the addressCountry or identifier field and that the same product does not output both eligibleRegion and ineligibleRegion simultaneously.

Related guides: Multi-currency price schema · Hazmat shipping restrictions schema · International SEO hreflang · Shopify schema markup overview

FAQ

What are eligibleRegion and ineligibleRegion in schema.org?

They are properties on schema.org Offer that declare which geographic regions a product is available (eligibleRegion) or unavailable (ineligibleRegion) in. AI shopping agents read these to avoid recommending products to shoppers in regions where the product cannot legally ship. Without these properties, agents have no visibility into your shipping restrictions.

What types of Shopify products need geo-restriction schema?

Products with regulatory, legal, or shipping restrictions: dietary supplements (Novel Food in EU), CBD/hemp (country-specific legality), firearms accessories (import restrictions), alcohol (import licensing), electronics without CE/UKCA marking, high-capacity batteries (air shipping bans), and anything subject to trade sanctions or export control.

Should I use eligibleRegion or ineligibleRegion?

Use eligibleRegion when you ship to a small list of countries (e.g. US, CA, AU only). Use ineligibleRegion when you ship globally but exclude a small list (e.g. EU-banned supplement). Choose whichever produces the shorter list. Never use both on the same Offer block.

Does Shopify output geo-restriction signals by default?

No. Shopify's shipping zones and market restrictions only affect checkout — they are not surfaced in JSON-LD structured data. You must manually add eligibleRegion or ineligibleRegion to your Offer blocks in product.liquid, driven by per-product metafields storing the ISO 3166-1 alpha-2 country code lists.

How do I restrict to specific US states for cannabis-adjacent products?

Use a DefinedRegion with addressCountry: "US" and addressRegion: ["CA","OR","CO","NV","WA"] (the array of legal state abbreviations). This tells AI agents the product is available in the US but only in specific states. Keep this list updated as state laws change.