Skip to main content
SlapMyWeb
Structured Data

Coupon Schema

Structured data describing a discount offer so search engines can surface its terms and expiry.

Coupon schema is structured data describing a discount — the code, what it applies to, the discount amount and when it expires — using schema.org vocabulary. It lets search engines read an offer's terms rather than guess them from the page text, and it is what stops an expired promotion being presented as current.

Definition

Coupon markup builds on schema.org's Offer and Discount vocabulary, describing the code itself, the products or categories it applies to, the value of the discount and the validity window.

The critical field is the expiry. A coupon marked up without validThrough has no way to signal that it has ended, and stale offers surfacing in search are a common complaint that traces back to missing markup rather than a caching problem.

Why It Matters

Coupon and deal sites live or die on freshness. Markup that states validity lets a search engine drop an expired offer instead of showing it, which protects both the user and the site's credibility.

Example

{
  "@type": "Offer",
  "name": "20% off everything",
  "priceCurrency": "USD",
  "validThrough": "2026-12-31"
}

What actually goes in the markup

There is no Coupon type in schema.org. What people mean by coupon schema is an Offer — usually nested inside a Product — carrying the discount's terms.

The fields that matter are the price and its currency, the availability, and above all the validity window. validFrom and validThrough are what let a search engine know an offer has ended; without them, an expired promotion has no way of signalling that it is expired, and it will keep being presented as current until the page is recrawled and the text happens to change.

{
  "@context": "https://schema.org",
  "@type": "Offer",
  "name": "20% off everything",
  "price": "39.99",
  "priceCurrency": "USD",
  "availability": "https://schema.org/InStock",
  "validFrom": "2026-09-01",
  "validThrough": "2026-09-30"
}

The rule that gets sites penalised

Every value in the markup must match what a visitor sees on the page. This sounds obvious and is broken constantly, usually by accident: a caching layer serves stale markup while the visible price updates, a currency-conversion app rewrites the displayed price but not the structured data, or a discount is described in marketing copy in one way and marked up in another.

Google treats a mismatch between marked-up and visible values as a structured-data policy violation, not a bug. The consequence is not a lower ranking for that page — it is losing rich-result eligibility across the site, and in repeated cases a manual action. When in doubt, mark up less and make sure what you do mark up is exactly what renders.

Why expiry is the whole game for deal pages

Coupon and deal sites live on freshness. Their entire value to a searcher is that the code works, and their entire credibility problem is that most published codes do not.

Marking up validThrough does two things. It gives search engines a machine-readable reason to stop surfacing an offer that has ended, which protects the searcher. And it gives you a field to drive your own expiry logic from, so the page can hide or label an expired code rather than leaving it to look current.

The pages that hold rankings in this category are the ones where expired offers are visibly marked expired. A page full of dead codes presented as live is one bad experience away from losing the position it took months to earn.

Where the offer belongs in the graph

An Offer floating on its own says little. It becomes useful when it is attached to the thing being discounted — nested under a Product, or referenced from one by @id.

For a store-wide promotion there is no single product to attach it to, and the honest answer is that schema.org has no good type for "20% off everything". Marking it against an arbitrary product to force a rich result is the kind of mismatch that costs eligibility site-wide.

The better use of the markup in that case is on the individual product pages the promotion actually applies to, where the discounted price is genuinely the price shown — which is also the page a searcher wants to land on.

How SlapMyWeb checks this

The audit parses every JSON-LD block on the page and validates it against the schema.org types it declares, so an Offer missing priceCurrency or validThrough is reported with the field named. It also cross-checks the marked-up values against what the page renders — a discount stated as 20% in markup and 15% in the visible text is flagged, because that mismatch is a policy violation rather than a cosmetic error. Validate a block yourself with the schema markup validator.

Know the term.
Check your own site.

A free audit tells you whether this is currently costing you score points — and exactly what to change.

Run a free audit
Free foreverNo signupResults in 30s