Product pages · Commerce schema

Shopify Offer structured data: price, currency and availability evidence

Offer markup becomes useful when its commerce facts agree with the product users can actually buy. Presence alone is not enough; price, currency, availability and Product-to-Offer relationships need coherent evidence.

Reviewed by Fixitify: September 21, 2026 · Guidance is written around observable storefront evidence, not a generic pass/fail checklist.

Quick diagnosis

Check these four things before changing the storefront.

A focused first pass helps you decide whether the finding is isolated, repeated or intentional before anyone creates unnecessary implementation work.

Check 1

Confirm Offer data belongs to the Product entity on the page and is not an orphaned or duplicated object.

Check 2

Compare structured price, price currency and availability with the visible state for the same market and selected variant.

Check 3

Check whether variant selection changes visible commerce facts without updating the machine-readable representation that search systems can observe.

Check 4

Look for stale promotional prices or availability values that remain in JSON-LD after the storefront state changes.

01
The problem

Start with what the storefront is actually publishing.

Product JSON-LD can exist while Offer information is absent, incomplete or disconnected from the Product entity.

Variant logic, localization and app injection can make commerce facts differ between server HTML and rendered storefront state.

02
Why it matters

Use impact without inventing certainty.

Offer data describes commercial facts such as price, currency and availability in machine-readable form.

Those facts should reflect the storefront rather than being optimized independently; stale or contradictory commerce markup is less trustworthy than no extra field at all.

Root causes

Look for the generator before fixing the symptoms.

Shopify storefront problems often repeat because a theme, app, import or content workflow produces the same output across a page type.

01

Possible root cause

Custom schema code does not account for variants.

02

Possible root cause

Currency/market logic changes visible prices without updating JSON-LD.

03

Possible root cause

A theme publishes Product while an app separately publishes Offer markup.

04

Possible root cause

Availability mapping uses an invalid or stale value.

Shopify-specific context

Translate the SEO signal into the system that can actually produce it.

Shopify provides useful defaults, but the public result still depends on the active theme, apps, catalog data, markets and the workflows that create or update content.

01

Implementation note

Offer data is commerce data, not decorative SEO text. It should stay tied to the product a customer can actually buy and the market context being served.

02

Implementation note

Multi-currency and market-aware stores need special care because the visible price can change by context while custom schema code continues to emit a default currency.

03

Implementation note

Google merchant listing experiences can use Product and Offer properties such as price and availability, but meeting structured-data requirements only establishes eligibility; it does not guarantee a particular search appearance.

04

Implementation note

Do not create multiple Offer objects merely to satisfy a validator unless they correspond to real, understandable offers or variants represented by the page.

Recommended action

Fix the smallest real root cause.

  1. 01

    Compare structured commerce facts with the visible product and selected market.

  2. 02

    Trace whether the theme or app owns the Offer output.

  3. 03

    Fix the shared generator and variant/market mapping rather than patching sample URLs.

  4. 04

    Avoid duplicating Offer objects merely to make a validator green.

Verification

Prove the storefront changed.

  1. 01

    Render affected product pages in the relevant storefront context.

  2. 02

    Confirm Offer is attached to the intended Product and core commerce facts are present and coherent.

  3. 03

    Re-run the representative product sample after template/app changes.

Worked example

Example: EUR storefront publishes USD Offer data

Use this as a reasoning pattern, not as a rule that every store must match.

Scenario

A shopper in the EU sees €79 and In stock, but the product JSON-LD still publishes priceCurrency USD and a $89 price from the default market.

Diagnosis

The structured commerce facts contradict the visible offer in the served storefront context, most likely because custom schema logic is not market-aware.

Fix

Make the schema source use the same product, variant and market data that drives the visible price and availability, or simplify the implementation to a single reliable source.

Verify

Render representative products in the affected market and confirm visible price, currency and availability agree with the Product/Offer data that is actually published.

Common questions

Commerce schema FAQ

What is Offer structured data on a Shopify product page?

Offer is the structured representation of commerce facts such as price, currency and availability associated with a Product. It should describe the actual offer shown to shoppers.

Does every Product need Offer markup?

For normal merchant product pages where the item can be purchased, Offer information is highly relevant to merchant listing structured data. Unusual catalog or non-purchasable pages can require different treatment.

Does valid Offer markup guarantee Google Shopping visibility?

No. It can improve eligibility and machine understanding, but search and shopping appearances depend on additional requirements and systems.

Authoritative references

Primary documentation used for this guidance

Search behavior and Shopify implementations change over time. These official references are useful when you need the underlying platform or search-engine requirements.

Start with evidence

Turn the guide into evidence from your own Shopify store.

Run a representative storefront audit, review the affected URLs and fix the highest-confidence root cause first.

Run your free store audit