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.

TL;DR Add 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:

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