...
Table of Contents | ||
---|---|---|
|
Overview
To display valid offers and rewards on the UI, the client needs to retrieve data from two sources: the Loyalty Engine (Through the Loyalty Middleware) and Sanity (RBI’s CMS). The Loyalty Engine will provide incentives for which the user is "eligible," meaning they satisfy all necessary criteria (rules). Meanwhile, Sanity will offer information about active incentives, and reward categories, as well as all visual display content, such as names, images, descriptions, and more.
The client must hit both of the previously mentioned data sources and intersect the data to decide what to present. The sequence in which these queries are executed will depend on the client and its implementation. It is advised to first query Sanity for all "sorted offers" (active system-wide offers), “config offers” (possible personalized offers for any given user), and "reward categories" (active rewards), and then utilize those identifiers to request pertinent information from the Loyalty Engine.
Querying Sanity using GraphQL
Info |
---|
GraphQL URL (Playground Available): https://czqk28jt.apicdn.sanity.io/v1/graphql/dev_bk_us/default |
Replace
dev_bk_us
with the{{stage}}_{{brand}}_{{country}}
that you desire to query.Sanity GraphQL can be hit via a POST request. Please reference the POST URL structure for each of the sample queries below.
Please use this playground to play with the queries below and examine the schema for fields you may wish to request.
Example Offers Query
The
_id
is subject to the dataset you are using. For the most part, it will befeature-loyalty-offers-ui-singleton
, however, some markets have drifted from this conventionSample Query:
Code Block |
---|
query getSanityOffers { LoyaltyOffersUI(id: "feature-loyalty-offers-ui-singleton") { # Available for all users. sortedSystemwideOffers { _id loyaltyEngineId name { enRaw } } # These are "templates", personalized offers get created based on this template. # You should use these only to display content (images, names, etc), and display only the actual offer from the engine. liveConfigOffers { _id loyaltyEngineId name { enRaw } } } } |
Example Rewards Query
The
_id
is subject to the dataset you are using. For the most part it will bereward-list-singleton
, however, some markets have drifted from this conventionSample Query:
...
Expand | ||
---|---|---|
| ||
To get list of ruleSet available, navigate to https://czqk28jt.apicdn.sanity.io/v1/graphql/dev_bk_aq/default, and search for “ruleSet” in the Schema explorer as seen here: |
...
Querying Loyalty Engine
Info |
---|
GraphQL URL (Playground Available): https://euc1-dev-bk-loyalty-middleware.rbictg.com/graphql |
...
Please use this playground to play with the queries below and examine the schema for fields you may wish to request.
Some
where
filters that may be relevant to Kioskids
- a collection of Engine IDs for offers/rewards. This is theloyaltyEngineId
field on every sanity offer/reward document.omitInvalids
- This controls whether invalid incentives will be returned. Only incentives that failed “fixable” rules will be returned if this is set tofalse
. A fixable rule is one that the user can change behavior to make the rule pass, like theminSpend
, the user can add more items to their cart to meet the requirement. An absolute failure likedate-band
will not be returned regardless of what the value of this filter isThis is useful for displaying error / in-line messages in the UI
serviceMode
- some incentives can only be redeemed if the service mode meets the required rulesetstoreId
- some incentives can only be redeemed at certain storessubtotalAmount
= some incentives require a minimum spendcartEntries
- some incentives require certain items to be in the cart, this rule uses the sanity id of each rbi productpaymentMethod
- some incentives require certain payment methods to be used
Example Offers Query
Info |
---|
You should use the
|
Code Block |
---|
query getLoyaltyOffers { loyaltyOffersV2(loyaltyId: "<USER_LOYALTY_ID>", where: { omitInvalids: false }) { id name type sanityId errors { code ruleId } } } |
Example Offers Query Response
Code Block |
---|
{ "data": { "loyaltyOffersV2": [ { "id": "a4c24211-2d36-47be-bad8-8deea437dbfa", "name": "$6 Let's Get This Bacon Meal", "type": "GLOBAL", "sanityId": "AAA-AAA-AAA", "errors": null }, { "id": "fbba4e93-eecd-42b6-a4ed-333856d47bda", "name": "Delivery Offer - $8 The Spicy One Meal", "type": "GLOBAL", "sanityId": "BBB-BBB-BBB", "errors": null }, { "id": "2a7b2f20-1662-4854-9f4b-e9974200f294", "name": "Support 50% Discount Offer", "type": "PERSONALIZED", "sanityId": "CCC-CCC-CCC", "errors": null }, { "id": "6646b80b-dea9-4bf4-81f5-390554926987", "name": "Loyalty Upsize Swap", "errors": [ { "code": "unsatisfied-cart-requirements", "ruleId": "cart-requirement" } ] } ] } } |
Example Rewards Query
Code Block |
---|
query getLoyaltyRewards { loyaltyRewards(loyaltyId: "<USER_LOYALTY_ID>", where: { omitInvalids: false }) { id name errors { code ruleId } } } |
Example Rewards Response
Code Block |
---|
{ "data": { "loyaltyRewardsV2": [ { "id": "3b5bdddc-c7c9-42d8-9332-b0c3f36c8e1c", "name": "Value Powerade Zero", "errors": null }, { "id": "728aaedd-3234-4eae-89af-35cd5672adcb", "name": "Large Dr. Pepper", "errors": null }, { "id": "480122d7-86ff-4db0-965c-7dbb72bb5179", "name": "Value Soft Drinks", "errors": null } ] } } |
...