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.
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:
- Dietary supplements with novel ingredients may be banned in the EU (Novel Food Regulation) while legal in the US
- CBD and hemp products have varying legal status by country and state
- Firearms and accessories are subject to strict import rules in most countries
- Electronics without CE marking cannot be marketed in the EU
- Lithium batteries above certain capacity have shipping restrictions by air carrier
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.