When a shopper asks ChatGPT or Gemini to compare prices on your flagship product, conversational engines pull the standard retail price because private loyalty discounts remain hidden behind customer logins. Pendium helps ecommerce brands solve this breakdown by mapping membership perks directly into machine-readable JSON-LD. By nesting the Schema.org MemberProgram and PriceSpecification types within your Shopify store data, platforms like Claude and Google AI Overviews can parse and quote your actual member prices during comparison queries.
Where AI shopping engines extract loyalty data
Shopify themes generate standard schema markup out of the box, but that code only reports what an anonymous visitor sees. The default Offer schema emits your public retail price, stock status, and primary currency. If your store runs a customer loyalty program that drops a $120 jacket to $96 for registered members, an AI crawler querying your product page parses the $120 figure every time.
Anonymous Crawler -> Reads Shopify Liquid Output -> Sees Default Offer ($120) -> AI Quotes $120
AI-Ready Crawler -> Reads MemberProgram Schema -> Parses Gold Tier ($96) -> AI Quotes $96
Large language models like Claude, Grok, and ChatGPT do not create customer accounts, log into shopper portals, or click floating loyalty widgets on your storefront. When synthesizing product comparisons, they extract facts from structured data tags embedded in the page header and merchant listings in Google Shopping feeds. If your gated discounts exist only inside JavaScript app widgets or dynamic cart scripts, AI agents treat your store as more expensive than competitors who surface their perks clearly. You can monitor which brands win these head-to-head recommendations across major language models using the Agent Experience Engine.
Fixing this gap requires connecting your catalog to two structured data vocabularies recognized by major search crawlers:
- The membership program declaration (
MemberProgram) attached to your brand identity. - The conditional price declaration (
UnitPriceSpecification) attached to each product variant offer.
Just as stores resolve naming confusion by learning how to map Shopify product synonyms to alternateName schema for AI search, you must make your loyalty tiers machine-readable if you want conversational commerce tools to quote your real customer prices.
Structuring the base MemberProgram container in Shopify
Before you can tag individual product prices with tier discounts, you must define the loyalty program itself at the organizational level. Search crawlers expect the program definition to live under your primary store entity so they can understand who administers the rewards.
According to the official Google Search Central documentation on MemberProgram structured data, this data type belongs directly within your Organization or OnlineStore JSON-LD block. In Shopify, this block typically lives inside theme.liquid or a dedicated snippet such as snippets/social-meta-tags.liquid.
{
"@context": "https://schema.org",
"@type": "OnlineStore",
"@id": "https://example.com/#store",
"name": "North Peak Outfitters",
"url": "https://example.com",
"hasMemberProgram": {
"@type": "MemberProgram",
"@id": "https://example.com/#loyalty-program",
"name": "Peak Rewards",
"description": "Earn points on every outdoor gear purchase and unlock tiered member discounts.",
"url": "https://example.com/pages/rewards",
"hostingOrganization": {
"@id": "https://example.com/#store"
}
}
}
Defining the hostingOrganization
The hostingOrganization property establishes the legal or commercial entity that runs the loyalty program. When setting this up in Shopify, always use a persistent URI fragment identifier (like https://example.com/#store) for the parent organization.
Referencing this @id inside hostingOrganization establishes a clean entity graph. It informs AI crawlers that the brand selling the product is the same entity fulfilling the member points, rather than a third-party cashback affiliate or credit card network.
Setting up the program name and description
Write the name and description properties using direct language that describes the concrete incentives. Avoid vague slogans. State clearly whether the program offers instant percentage discounts, points accumulation, or free shipping perks. AI retrieval systems scan the description string to categorize whether your program belongs in price-conscious comparison queries.
Defining specific loyalty tiers with MemberProgramTier
Once the parent container is established, define each level of your program by adding the hasTiers property. This property takes an array of MemberProgramTier objects that break down what shoppers must do to enter a tier and what they receive in return.
| Schema Property | Expected Type | Practical Role for AI Parsing |
|---|---|---|
@id | URL / Fragment | Distinct URI string used to link product-level price specifications to this tier |
name | Text | The public title of the tier (e.g., Bronze, Silver, VIP) |
hasTierRequirement | MonetaryAmount / Text | Spend threshold, fee, or actions required to qualify |
hasTierBenefit | TierBenefitEnumeration | Specific perks granted, such as discounts or loyalty points |
membershipPointsEarned | QuantitativeValue | Base rate of points accrued per dollar or transaction |
Mapping tier requirements
Tiers generally fall into two categories: instantly accessible tiers and gated tiers. Instantly accessible tiers require nothing more than a free account registration. Gated tiers require an annual fee, a minimum rolling spend, or accumulated loyalty points.
For an open tier where anyone qualifies by signing up, set hasTierRequirement to a basic textual or zero-dollar condition. For a spend-gated tier (such as spending $300 in a calendar year), construct an embedded MonetaryAmount object:
"hasTierRequirement": {
"@type": "MonetaryAmount",
"currency": "USD",
"value": 300
}
This distinction tells search engines and AI assistants whether they can present the discounted price to first-time shoppers or reserve it for queries specifying existing loyalty status.
{
"@type": "MemberProgramTier",
"@id": "https://example.com/#tier-insider",
"name": "Peak Insider",
"url": "https://example.com/pages/rewards#insider",
"hasTierBenefit": [
"https://schema.org/TierBenefitLoyaltyPoints",
"https://schema.org/TierBenefitExclusivePrice"
],
"membershipPointsEarned": {
"@type": "QuantitativeValue",
"value": 1,
"unitText": "point per dollar"
}
}
Enumerating tier benefits
Each tier needs explicit enumeration of what members receive. Schema.org defines standard URLs for the hasTierBenefit property, including https://schema.org/TierBenefitExclusivePrice for member-only pricing and https://schema.org/TierBenefitLoyaltyPoints for point accrual.
When conversational models ingest these URLs, they translate the values directly into comparative advantages. If a user asks Claude, "Where can I buy technical hiking boots with reward perks?", the model checks for these exact benefit definitions.

Attaching member discounts to PriceSpecification
Defining your program at the store level tells AI engines that a loyalty system exists. But to make an agent quote $96 instead of $120 on a specific product page, you must bind that discount to the individual product Offer using a unit price definition.
The Schema.org definition for PriceSpecification permits merchants to describe conditional pricing rules. Rather than declaring a single flat number for price, you nest multiple UnitPriceSpecification nodes inside your product markup.
Offer (Base Product: $120)
│
├── UnitPriceSpecification (Standard Price: $120)
│ └── priceType: https://schema.org/ListPrice
│
└── UnitPriceSpecification (Member Price: $96)
├── priceType: https://schema.org/SalePrice
└── validForMemberTier: https://example.com/#tier-vip
Updating your product liquid template
Most modern Shopify stores pull product metadata using Shopify Liquid variables within snippets/product-json-ld.liquid or sections/main-product.liquid. You can pull your member discount rules from Shopify metafields or product tags to populate the markup dynamically.
Here is a practical Liquid pattern that generates standard pricing alongside an exclusive tier discount:
{%- assign standard_price = product.selected_or_first_available_variant.price | money_without_currency | remove: ',' -%}
{%- assign member_discount_percent = product.metafields.loyalty.member_discount_percent | default: 10 -%}
{%- assign discount_multiplier = 100 | minus: member_discount_percent | divided_by: 100.0 -%}
{%- assign member_price = standard_price | times: discount_multiplier | round: 2 -%}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.title | json }},
"description": {{ product.description | strip_html | truncatewords: 40 | json }},
"sku": {{ product.selected_or_first_available_variant.sku | json }},
"offers": {
"@type": "Offer",
"priceCurrency": {{ cart.currency.iso_code | json }},
"price": "{{ standard_price }}",
"availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
"url": "{{ shop.url }}{{ product.url }}",
"priceSpecification": [
{
"@type": "UnitPriceSpecification",
"priceCurrency": {{ cart.currency.iso_code | json }},
"price": "{{ standard_price }}",
"priceType": "https://schema.org/ListPrice"
},
{
"@type": "UnitPriceSpecification",
"priceCurrency": {{ cart.currency.iso_code | json }},
"price": "{{ member_price }}",
"priceType": "https://schema.org/SalePrice",
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "{{ shop.url }}/#tier-vip"
}
}
]
}
}
</script>
Handling multiple tier price points
If your store supports progressive discounts across multiple tiers, you can loop through variant metafields to output a distinct UnitPriceSpecification block for each active tier.
- The base tier (free account) receives a modest percentage discount.
- Mid-tier shoppers receive elevated discounts paired with higher point multipliers.
- Top-tier VIPs receive your lowest available rate.
When writing multiple price specifications, always supply the matching @id in validForMemberTier. This keeps the data relational and prevents crawlers from conflating an open promotional price with a gated tier rate.
{
"@type": "UnitPriceSpecification",
"priceCurrency": "USD",
"price": "85.00",
"priceType": "https://schema.org/SalePrice",
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "https://example.com/#tier-gold"
}
}
Validating your implementation for search and AI ingestion
Adding code to your Shopify templates is only half the battle. You must confirm that search bots can read the markup cleanly without syntax errors that could invalidate your primary merchant data.
Search platforms enforce strict parsing boundaries on conditional pricing. According to Google Merchant Center Help guidelines on member pricing, pricing for instantly accessible tiers can be displayed to all users in shopping listings. However, prices restricted to private or high-spend tiers display only to verified audiences or within conversational AI environments capable of parsing tier eligibility.
Follow this sequential checklist to test your updated code:
- Copy your generated JSON-LD from a live product page using your browser's source viewer.
- Paste the snippet directly into the Google Rich Results Test to verify that both
ProductandMemberProgramnodes parse with zero critical syntax errors. - Test your live URL in Google Search Console using the URL Inspection tool to confirm the code renders on mobile bots without getting blocked by third-party scripts.
- Check your Google Merchant Center product feed diagnostics to confirm your standard retail price matches the default
priceattribute, avoiding mismatch suspensions. - Query an AI engine with structured browsing enabled to confirm it reads both your public price and your tier-specific perk.
Structured loyalty data is actively supported for rich search results across the United States, Canada, the United Kingdom, Australia, France, Germany, Brazil, and Mexico. Implementing clean markup positions your catalog ahead of the curve as conversational engines take on a larger share of daily shopping discovery.
To see whether AI shopping engines are currently quoting your member prices or defaulting to your public list rates, run a free scan using the Pendium AI Visibility Scan. You will get an instant breakdown of how major platforms present your catalog to prospective buyers.