Optimization Guide
E-commerce Seller Organization Schema — Offer.seller, VAT ID & Business Trust Signals for AI Agents
Most Shopify stores output product offers with no machine-readable seller identity — just a price and an availability status. For B2B buyers, EU shoppers needing VAT invoices, and AI agents verifying merchant legitimacy, an anonymous offer carries far less weight than an offer from a verifiable registered business. Adding Offer.seller as an Organization with your VAT number or tax ID is the merchant identity layer most stores skip.
seller to your Offer JSON-LD with an Organization containing name, url, legalName, address, and vatID (EU/UK) or taxID (US/AU/CA). Also add a standalone Organization JSON-LD block to your site's <head> for global merchant identity. These signals unlock B2B eligibility filtering, VAT-inclusive pricing signals, and AI agent merchant trust scoring.
The Merchant Identity Gap in Shopify Schema
Shopify's default product JSON-LD outputs an Offer with price, currency, and availability. It does not output a seller. From an AI agent's perspective, an offer without a seller is an anonymous transaction — it carries no merchant identity, no business registration signal, no VAT eligibility, and no address verification.
This becomes material in three specific scenarios:
- B2B purchasing: Business buyers ask AI agents to find "UK VAT-registered supplier for industrial components" or "EU distributor with VAT invoice for office supplies." The
vatIDfield inselleris the machine-readable signal that makes your store visible to these queries. - EU consumer trust: The EU Digital Services Act and EU Consumer Rights Directive require marketplace sellers to display their business identity. AI agents trained on compliant EU data use seller identity signals to distinguish registered merchants from private sellers.
- Multi-source deduplication: When AI agents index the same product from multiple sources (your store, Google Shopping, price comparison sites), the
sellerOrganization is used to attribute the canonical offer to the correct merchant and avoid double-counting.
Seller identity query types requiring structured data
| Query type | Example | Required schema | Without schema |
|---|---|---|---|
| VAT-registered supplier | "UK VAT registered wholesale supplier" | seller.vatID: "GB123456789" |
Store not distinguished from non-VAT private seller |
| B2B invoice availability | "EU distributor with VAT invoice" | seller.vatID + seller.legalName |
B2B eligibility signal absent |
| US business seller | "US-based business seller EIN verified" | seller.taxID: "12-3456789" |
Cannot distinguish from private individual seller |
| Registered business in country | "German registered company selling tools" | seller.address.addressCountry: "DE" + vatID |
Country registration unverifiable |
| Brand authorization | "authorized reseller Nike shoes" | seller Organization + hasCertification for authorized reseller status |
Authorization status invisible to AI |
Offer.seller: Complete Property Reference
The seller property on Offer takes an Organization (or Person for individual sellers). For registered businesses, always use Organization. The following properties are available:
| Property | Type | Description | Example |
|---|---|---|---|
@type |
Text | Always Organization for registered businesses |
"Organization" |
name |
Text | Trading name / brand name | "Acme Supply Co." |
legalName |
Text | Full registered legal entity name | "Acme Supply Company Ltd." |
url |
URL | Homepage URL of the seller | "https://acmesupply.com" |
vatID |
Text | EU/UK VAT registration number (full format including country prefix) | "GB123456789", "DE123456789" |
taxID |
Text | Tax identification number (US EIN, AU ABN, CA BN) | "12-3456789" (US EIN) |
leiCode |
Text | Legal Entity Identifier — 20-char GLEIF code (financial/public companies) | "213800WSGIIZCXF1P572" |
address |
PostalAddress | Registered business address | See PostalAddress example below |
telephone |
Text | Business phone number with country code | "+44 20 7946 0000" |
email |
Text | Business contact email | "sales@acmesupply.com" |
sameAs |
URL | Third-party profile URLs (Companies House, BBB, Trustpilot) | See sameAs examples below |
VAT ID Formats by Country
| Country | Prefix | Format | Example |
|---|---|---|---|
| United Kingdom | GB | GB + 9 digits | GB123456789 |
| Germany | DE | DE + 9 digits | DE123456789 |
| France | FR | FR + 2 chars + 9 digits | FR12345678901 |
| Netherlands | NL | NL + 9 digits + B + 2 digits | NL123456789B01 |
| Sweden | SE | SE + 10 digits + 01 | SE123456789001 |
| Italy | IT | IT + 11 digits | IT12345678901 |
| Spain | ES | ES + 9 chars | ESA12345678 |
| Ireland | IE | IE + 8-9 chars | IE1234567A |
| US (EIN, use taxID) | — | 2 digits + hyphen + 7 digits | 12-3456789 |
| Australia (ABN, use taxID) | — | 11 digits | 12 345 678 901 |
Complete JSON-LD Examples
EU seller (UK, VAT-registered)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Industrial Cable Tray — 600mm Wide — 3m Length",
"offers": {
"@type": "Offer",
"price": "89.99",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "89.99",
"priceCurrency": "GBP",
"valueAddedTaxIncluded": false,
"unitText": "ex. VAT"
},
"seller": {
"@type": "Organization",
"name": "BritTrading Ltd.",
"legalName": "BritTrading Limited",
"url": "https://brittrading.co.uk",
"vatID": "GB123456789",
"address": {
"@type": "PostalAddress",
"streetAddress": "12 Industrial Park Road",
"addressLocality": "Birmingham",
"postalCode": "B1 1AA",
"addressCountry": "GB"
},
"telephone": "+44 121 234 5678",
"email": "sales@brittrading.co.uk",
"sameAs": [
"https://find-and-update.company-information.service.gov.uk/company/12345678",
"https://www.trustpilot.com/review/brittrading.co.uk"
]
}
}
}
</script>
US seller (EIN in taxID)
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Premium Stainless Steel Water Bottle — 32oz",
"offers": {
"@type": "Offer",
"price": "34.99",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "HydroGear USA",
"legalName": "HydroGear USA Inc.",
"url": "https://hydrogearusa.com",
"taxID": "47-1234567",
"address": {
"@type": "PostalAddress",
"streetAddress": "2100 Commerce Drive",
"addressLocality": "Austin",
"addressRegion": "TX",
"postalCode": "78701",
"addressCountry": "US"
},
"telephone": "+1 512 555 0100",
"sameAs": [
"https://www.bbb.org/us/tx/austin/profile/hydrogearusa",
"https://www.trustpilot.com/review/hydrogearusa.com"
]
}
}
}
</script>
Global Organization schema (site-level, index.html)
<!-- Add to <head> of every page (or layout.liquid) for site-level merchant identity -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "https://example.com/#organization",
"name": "Example Store",
"legalName": "Example Store Ltd.",
"url": "https://example.com",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/assets/logo.svg",
"width": 200,
"height": 50
},
"vatID": "GB123456789",
"address": {
"@type": "PostalAddress",
"streetAddress": "1 Commerce Street",
"addressLocality": "London",
"postalCode": "EC1A 1AA",
"addressCountry": "GB"
},
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+44 20 1234 5678",
"contactType": "customer service",
"availableLanguage": ["English"],
"areaServed": "GB"
},
"sameAs": [
"https://find-and-update.company-information.service.gov.uk/company/12345678",
"https://www.trustpilot.com/review/example.com",
"https://twitter.com/examplestore"
]
}
</script>
sameAs: Third-Party Verification URLs
The sameAs property on Organization links your business entity to third-party profiles that AI agents can cross-reference for identity verification. These are the highest-trust verification URLs by jurisdiction:
| Jurisdiction | Registry / Platform | URL pattern | Trust signal |
|---|---|---|---|
| United Kingdom | Companies House | find-and-update.company-information.service.gov.uk/company/{number} |
Official government company registration |
| Germany | Handelsregister | www.handelsregister.de (search URL) |
Official commercial register |
| France | Infogreffe | www.infogreffe.fr/entreprise/{siret} |
French commercial court registry |
| US | Better Business Bureau | www.bbb.org/us/{state}/{city}/profile/{name} |
US business trust bureau |
| Australia | ABN Lookup | www.abr.business.gov.au/AbnLookup/{abn} |
Australian Business Register |
| Global | Trustpilot | www.trustpilot.com/review/{domain} |
Independent review platform identity |
| Global | LinkedIn company page | www.linkedin.com/company/{slug} |
Professional business identity |
| Global | Wikidata | www.wikidata.org/entity/{Q-number} |
Structured knowledge graph entity |
Shopify Liquid Implementation
Since VAT ID, legal name, and address are static data (they don't change per product), the most efficient implementation is a single Organization block in your theme.liquid layout head, plus a seller reference injected into every Offer block using the @id reference pattern.
{% comment %}
In theme.liquid <head> — global Organization identity block.
Store VAT ID and legal name in theme settings or a global snippet.
{% endcomment %}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"@id": "{{ shop.url }}/#organization",
"name": {{ shop.name | json }},
"legalName": {{ settings.legal_name | default: shop.name | json }},
"url": {{ shop.url | json }},
{% if settings.vat_id != blank %}
"vatID": {{ settings.vat_id | json }},
{% endif %}
{% if settings.tax_id != blank %}
"taxID": {{ settings.tax_id | json }},
{% endif %}
"address": {
"@type": "PostalAddress",
"streetAddress": {{ settings.address_street | json }},
"addressLocality": {{ settings.address_city | json }},
{% if settings.address_region != blank %}
"addressRegion": {{ settings.address_region | json }},
{% endif %}
"postalCode": {{ settings.address_postal | json }},
"addressCountry": {{ settings.address_country | json }}
}
}
</script>
{% comment %}
In product.liquid — reference the Organization as seller using @id
{% endcomment %}
"offers": {
"@type": "Offer",
"price": {{ product.selected_or_first_available_variant.price | money_without_currency | json }},
"priceCurrency": {{ cart.currency.iso_code | json }},
"availability": {% if product.available %}"https://schema.org/InStock"{% else %}"https://schema.org/OutOfStock"{% endif %},
"seller": {
"@id": "{{ shop.url }}/#organization"
}
}
Using the @id reference pattern avoids repeating the full Organization block on every product page — the JSON-LD processor resolves the reference to the full organization defined in the global block. This keeps product JSON-LD lightweight while maintaining complete merchant identity data.
Common Seller Schema Mistakes
| # | Mistake | Impact | Fix |
|---|---|---|---|
| 1 | No seller on Offer — anonymous product offers |
B2B buyers cannot identify VAT-registered sellers; AI agents cannot verify merchant identity for trust scoring | Add seller Organization with at minimum name, url, and address to every product Offer |
| 2 | VAT ID without country prefix (e.g., "123456789" instead of "GB123456789") | AI agents and VAT validation services cannot identify the issuing country; VAT number is unverifiable | Always include the 2-letter country prefix per EU VIES format standards |
| 3 | Using vatID for US EIN or AU ABN |
vatID is specifically for EU/UK VAT numbers; using it for non-VAT tax IDs confuses parsers | Use taxID for US EIN, Australian ABN, and Canadian Business Number |
| 4 | Only adding seller to the homepage Organization — not to product Offer objects | AI agents indexing individual product pages find offers without seller attribution | Add seller to every product Offer, referencing the global Organization via @id |
| 5 | No sameAs links to third-party verification profiles |
AI agents cannot cross-reference business identity; Organization appears as an uncorroborated claim | Add Companies House / BBB / ABN Lookup / Trustpilot URLs to sameAs array |
Frequently Asked Questions
What is Offer.seller and why should I add it to my product schema?
The seller property on Offer takes an Organization object identifying who is selling the product. Most Shopify stores omit it entirely, leaving offers as anonymous listings. Adding seller with your vatID or taxID, legal name, and address provides AI agents with merchant trust signals — verifiable business identity, B2B invoice eligibility, and VAT compliance data. It also enables AI agents to correctly deduplicate your listing from marketplace copies and attribute the canonical purchase URL to your store.
What is vatID in schema.org and who should use it?
vatID is a schema.org property on Organization containing the EU/UK VAT registration number in full VIES format (country prefix + digits). Any Shopify store selling to EU/UK customers who is VAT-registered should include their vatID. It makes your store visible to B2B queries filtering for VAT-registered suppliers ("UK VAT registered wholesale supplier," "EU B2B invoice available"). Stores below the VAT threshold should omit vatID. Use taxID instead for US EIN, Australian ABN, or Canadian BN.
What is the difference between vatID, taxID, and leiCode?
vatID: EU/UK VAT number (e.g., GB123456789) — for EU/UK B2B invoice eligibility signals. taxID: Tax ID in any jurisdiction (US EIN: "12-3456789", AU ABN: "12 345 678 901", CA BN: "123456789 RT0001") — for non-EU business identity signals. leiCode: 20-character Legal Entity Identifier from GLEIF — primarily for financial services and publicly listed companies; most Shopify merchants will not have one and should omit it.
How does seller Organization schema help B2B Shopify stores?
B2B buyers using AI agents to find suppliers filter for verifiable registered businesses that can issue tax invoices. vatID or taxID in seller is the machine-readable signal that separates your registered business from a private seller listing. Common B2B AI queries include "wholesale supplier UK VAT registered", "EU distributor with VAT invoice," and "US B2B supplier with EIN." Without these identifiers, your store cannot be distinguished from a private individual reselling goods.
Should I put seller on every product's Offer, or just on the main Organization schema?
Both — for different reasons. The site-level Organization JSON-LD block in your layout establishes your global merchant identity. The seller on each product Offer attributes individual offers to your registered business entity. Use the @id reference pattern on product pages (pointing to shop.url + "/#organization") to avoid repeating the full Organization block on every page. This keeps product JSON-LD lightweight while maintaining full merchant identity resolution.
Related Resources
- Shopify Brand Entity Structured Data — Organization JSON-LD for AI Knowledge Graphs
- Shopify B2B Catalog for AI Agents — Wholesale Structured Data Guide
- Shopify Multi-Currency Markets Schema — PriceSpecification with VAT
- Shopify Schema Markup Guide — Complete JSON-LD Reference
- E-commerce AI Readiness Checklist
- CatalogScan Blog — AI Shopping Agent Optimization