Mapping a Shopify points program onto the v2026-08-25 loyalty extension: fixtures and five questions #863
yangw831
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
We run a loyalty app for Shopify merchants. We ran our production program logic against a synthetic merchant (so the fixtures carry no customer data) and mapped the output onto the loyalty extension merged in PR #340 and released in v2026-08-25, to see what fits and what does not. Everything is published as versioned fixtures that validate against
schemas/common/loyalty.jsonat v2026-08-25:https://www.stabilerewards.com/ucp-loyalty-reference/brief/
ucp-walkthrough-scene2-clip-v2.mp4
What maps cleanly
example.harborpine.rewards), andprovisional.membership_tier_benefitdescriptions under a single "Member" tier (single-status program, as the tiers description allows).rewards[].earning_forecast, integer points with abreakdownwhosebenefit_ids resolve to those benefits. A $72 cart earns 360 base + 150 first-order bonus = 510; a $28 cart under the $35 minimum earns 0 with amembership_benefit_ineligiblewarning.provisional: falseand a maskeddisplay_id.What we kept out, on purpose
Available balance, reward codes, point holds, and settlement. The spec defers redeemable value to a payment instrument or future redemption capability, so we publish our Shopify lifecycle (issue → idempotent retry → settle on order creation → release on expiry) as a separate, explicitly non-UCP fixture in case it is useful input.
What Shopify stores publish today
Following up on the storefront probe in discussion #856: Shopify already serves a platform-hosted profile at
/.well-known/ucpfor each store. On 2026-09-24 we fetched it from four Shopify stores (our own test store plus three large public ones). All four were identical:2026-08-25, nine capabilities (catalog search and lookup, cart, checkout, discount, fulfillment, order, identity linking, plusdev.shopify.catalog), an MCP service, and nodev.ucp.common.loyalty. Because Shopify hosts the profile, a merchant's loyalty app has no way to add the extension or populate theloyaltymap itself.Questions we could not answer from the spec
provisional: true, or is this out of scope for the extension? (This seems adjacent to the offer-discovery half of issue #384.)idwhen nothing is verified.loyalty_membership.idis required, and the guidelines forbid raw stable member identifiers. For a provisional or prospective response we return a constant ("unverified"). Is a non-identifying placeholder the expected approach, or shouldidbe optional whileprovisionalis true?membership_tieris status. Is that the reading the authors intended?membership_benefit_ineligiblefor "cart is under the earning minimum". The code is defined for monetary benefits. Is that an acceptable reuse, or should earn-side conditions be expressed differently?Happy to adjust the fixtures to whatever the maintainers consider correct, and to share the redemption lifecycle in more detail if it helps the future redemption work.
— Yang, StabileRewards
All reactions