How should an offer link to a separately defined loyalty program tier?

The Citead team, updated

In short. Reference the separately defined MemberProgramTier with its @id in validForMemberTier and provide the offer's regular price.

Definition: validForMemberTier on a product offer's UnitPriceSpecification identifies the MemberProgramTier that receives the member price. When the program and tier are defined on a separate business information page, the offer uses a MemberProgramTier reference with the tier definition's unique @id.

Key facts

  • Google's loyalty program documentation, last updated 8 September 2026, places MemberProgram under Organization and puts individual product benefits in UnitPriceSpecification under Offer.
  • A program's hasTiers property contains MemberProgramTier objects, and Google says a loyalty program must have at least one tier.
  • Google defines a member price as the price offered to a member of a particular loyalty program. A member price is marked with validForMemberTier.
  • For a tier defined under MemberProgram on a separate page, Google's merchant listing documentation identifies the tier with @id and requires the Offer to provide a current regular price as well.

Where is the loyalty program defined?

Google's loyalty program documentation places the MemberProgram markup under Organization on the page that contains the business's administrative details and policies. Its hasTiers property contains one or more MemberProgramTier objects. Google states that a loyalty program must have at least one tier.

The merchant listing guidance describes the same arrangement as a separate page for the organization's administrative details and policies. Schema.org defines MemberProgram as a program that provides member benefits and can have multiple tiers. The program page can expose the tier identity like this:

{
  "hasTiers": [
    {
      "@type": "MemberProgramTier",
      "@id": "https://www.example.com/com/member-plus#tier_silver",
      "name": "silver"
    }
  ]
}

The @id is the stable identifier that the product page reuses. The example identifier and tier name follow Google's separate-page example.

How does the Offer reference the tier?

Google's merchant listing documentation puts member prices in price specifications under the Offer. It says that validForMemberTier accepts MemberProgramTier, and its separate-page example uses the unique resource identifier of the tier definition. A matching member price specification is:

{
  "@type": "UnitPriceSpecification",
  "price": 8.00,
  "priceCurrency": "GBP",
  "validForMemberTier": {
    "@type": "MemberProgramTier",
    "@id": "https://www.example.com/com/member-plus#tier_silver"
  }
}

The product page therefore repeats the tier's @id inside validForMemberTier. Schema.org's validForMemberTier property defines the value as the membership program tier for which an Offer or PriceSpecification is valid.

What price fields accompany the reference?

Google requires a current regular price on the Offer when validForMemberTier designates a member price. The regular price can use price or priceSpecification. If the same price applies to several tiers, Google allows multiple member tiers in the property. Separate price specifications can carry different member prices for different tiers.

The same documentation distinguishes member prices from strikethrough prices. A member price uses validForMemberTier and cannot also use priceType. If both properties appear in one price specification, Google says that price specification is ignored.

How can you check the implementation?

Google's implementation guidance directs you to validate the markup with the Rich Results Test and fix critical errors. After deployment, its URL Inspection guidance checks how Google sees the page, including whether robots.txt, noindex or login requirements prevent access. Google currently labels validForMemberTier as beta and says off-page MemberProgramTier markup might not show in Search right away.

FAQ

Should the Offer repeat the whole MemberProgram?

The documented separate-page pattern keeps the program and its tiers under Organization and uses a MemberProgramTier object with the tier definition's @id inside validForMemberTier on the offer.

Can one member price apply to several tiers?

Yes. Google's merchant listing guidance allows multiple member tiers when the price is the same for them. Use separate price specifications when the tiers have different member prices.

Does a member price replace the regular price?

No. Google requires the Offer to provide a current regular price with price or priceSpecification when validForMemberTier designates a member price.

Sources

  1. Google Search Central, "Loyalty program (MemberProgram) structured data", 8 September 2026
  2. Google Search Central, "Merchant listing (Product, Offer) structured data", 8 September 2026
  3. Schema.org, "validForMemberTier", 16 September 2026

Check how a page reads to answer engines. Open the GEO score analyzer

Test a page and see what to fix first

The analysis usually takes less than 10 seconds and needs no account.

400,000+ pages scored in the public benchmark