How can an offer identify a price available to loyalty members?

The Citead team, updated

In short. Use validForMemberTier in a price specification with a MemberProgramTier identifier for each eligible loyalty tier.

Definition: A member price is a product price offered to a member of a particular loyalty program. In an offer's PriceSpecification, use validForMemberTier with a MemberProgramTier value and identify that tier with @id.

Key facts

  • Google's merchant listing documentation defines a member price as the price offered to a member of a particular loyalty program.
  • Google places member prices in price specifications under the Offer object and marks them with validForMemberTier.
  • A member price specification cannot use priceType; Google says a specification containing both priceType and validForMemberTier is ignored.
  • Schema.org defines validForMemberTier as the membership program tier or tiers for which an Offer or PriceSpecification is valid.
  • Schema.org defines MemberProgramTier as a tier under a loyalty program and gives “gold” as an example.

How does the offer carry the member price?

Put the member amount and currency in a UnitPriceSpecification nested under the offer's priceSpecification. Google's merchant listing documentation shows the active price at the offer level and the member price in a second specification. The @type of the tier value is MemberProgramTier, and the example identifies the tier with an @id URL.

"offers": {
  "@type": "Offer",
  "url": "https://www.example.com/trinket_offer",
  "price": 10.00,
  "priceCurrency": "GBP",
  "priceSpecification": {
    "@type": "UnitPriceSpecification",
    "price": 8.00,
    "priceCurrency": "GBP",
    "validForMemberTier": {
      "@type": "MemberProgramTier",
      "@id": "https://www.example.com/com/members#tier_gold"
    }
  }
}

The same Google documentation also shows the active price and member price as two items in a priceSpecification array. An active price has neither priceType nor validForMemberTier, while a member price has validForMemberTier and no priceType.

What should the tier identifier point to?

The identifier in Google's member price example is the @id of a MemberProgramTier object, such as https://www.example.com/com/members#tier_gold. Schema.org's MemberProgramTier definition describes the type as specifying a tier under a loyalty program, with “gold” as its example. Its example program uses separate @id values and names for silver, gold and platinum tiers, such as membership-plus#tier_gold and membership-plus-gold for the gold tier's url.

The @id value distinguishes the tier reference used by the price specification. A displayed label such as “Gold” can be represented separately with the tier's name; Schema.org's example includes both fields on the tier object.

Can one price apply to several tiers?

Yes. Google's merchant listing documentation shows validForMemberTier as an array when one price applies to more than one tier. Its example assigns a price of 7.00 in GBP to the tier_gold and tier_platinum identifiers in one UnitPriceSpecification.

"validForMemberTier": [
  {
    "@type": "MemberProgramTier",
    "@id": "https://www.example.com/com/members#tier_gold"
  },
  {
    "@type": "MemberProgramTier",
    "@id": "https://www.example.com/com/members#tier_platinum"
  }
]

Google also gives a member price specification that carries membershipPointsEarned instead of a member price, while retaining validForMemberTier. That example uses 20 points and the tier_gold identifier.

What must stay separate from the member price?

priceType describes a strikethrough price in Google's pricing model. Google's pricing documentation says a member price specification uses validForMemberTier, and the two properties must not appear together. For an offer with an active price, the active amount can be declared on Offer or in a separate price specification, while the tier-specific amount belongs to the specification carrying the tier reference.

FAQ

Can validForMemberTier be placed directly on Offer?

Schema.org's property definition lists Offer and PriceSpecification among the types on which validForMemberTier can be used. The Google merchant listing examples for member prices place it inside priceSpecification.

Can the active price and member price use separate specifications?

Yes. Google's merchant listing documentation shows an array of UnitPriceSpecification objects: one for the active price and another carrying validForMemberTier for the member price.

How should several loyalty tiers share one member price?

Use one UnitPriceSpecification and give validForMemberTier an array of MemberProgramTier objects. Each object has its own @id, as in Google's gold and platinum example.

Sources

  1. Google Search Central, "Merchant listing structured data", 8 September 2026
  2. Schema.org, "validForMemberTier", 16 September 2026
  3. Schema.org, "MemberProgramTier", 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