Loyalty - Offers Grid & Rewards Carousel
Contents
Overview
Most major QSR apps now surface both rewards and offers within a unified experience to help users better understand available value. Previously, our app segmented these into different tabs, increasing navigation friction and reducing reward discoverability.
Why it matters: When a guest redeems at least one reward, we see an uplift of 6–16% in digital sales, depending on the market. The Offers page is our most visited screen, and surfacing rewards there helps reinforce the value of the loyalty program and drive conversion.
How Does It Work?
Offers Grid View
Offers are displayed in a two-column grid layout.
Filters appear at the top of the page and vary based on market configuration:
Options may include: All Offers, Favorites, For You, Delivery, Pickup, and External Offers.
Note: Filter visibility can be configured in Sanity.
Selecting a filter dynamically updates the content shown.
Reward Carousel
Shown at the top of the Offers page when the guest is logged in.
Unlocked if the guest has enough points to redeem rewards.
Locked if points are insufficient, with a call-to-action: “Order More to Unlock this Reward”.
Hidden entirely if the guest is logged out.
The last card in the carousel includes a link to view the full rewards list.
Pricing Logic
If a restaurant is selected and price data is available:
Prices are displayed under each offer card.
If no restaurant is selected, prices are not shown.
If an offer includes both the original price and a discounted price:
The original price is shown as strikethrough, and the discounted price appears in green.
If an offer only includes a discounted price (e.g., % off or fixed price offer):
Only the discounted price is shown in green.
How Is It Configured?
1. Lokalise Strings
The following Lokalise keys power the merged UI:
{
// Grid view w/ Filters (enable-offers-grid-view-with-filters)
"offerDetail": "Offer Detail",
"allOffers": "All Offers",
"forYou": "For You",
"offersNotAvailableTitle": "Sorry, no offers are available at the moment",
"offersNotAvailableDescription": "But good food is always on the menu! Browse our dishes and pick what you're craving.",
"forYouOffersEmptyTitle": "No personalized offers right now",
"forYouOffersEmptyDescription": "We'll let you know when something tasty comes your way. Stay tuned, deals can drop anytime.",
"favoriteOffersEmptyTitle": "Your favorites list is empty",
"favoriteOffersEmptyDescription": "Start saving the offers you love, just tap the heart icon to add them here.",
"deliveryOffersEmptyTitle" : "No delivery offers right now",
"deliveryOffersEmptyDescription" : "The deals are out for delivery. Check back soon, something good’s on the way.",
"pickUpOffersEmptyTitle" : "No pickup offers at the moment",
"pickUpOffersEmptyDescription" : "Our deals took a quick break. Check back soon to grab something delicious.",
"externalOffersEmptyTitle": "Partner deals coming soon!",
"externalOffersEmptyDescription": "We're working on bringing you more great discounts from our partners. Keep an eye out! For now, checkout other offers",
"offersSignInTitle": "Sign in for the full flavor",
"offersSignInDescription": "Log in to unlock your favorite offers and deals made just for you.",
"offersSignInCta": "Sign In To My Account",
"browseMenu": "Browse Menu",
"seeAllOffers": "See All Offers",
"lockedOfferLabel": "Locked",
// Rewards Carousel (enable-reward-carousel-in-offers-page)
"rewardDetail": "Reward Detail",
"orderMoreToUnlockReward": "Order More to Unlock this Reward",
"rewardsWaiting": "Your rewards are waiting",
"rewardsLogin": "Log in or join now to track points and redeem delicious deals.",
//Display Offer Prices (enable-show-prices-in-offers-in-app)
"off": "OFF"
}
2. LaunchDarkly Flags
The merged view rollout is controlled through the following LaunchDarkly flags:
Flag Name | Purpose |
---|---|
| Pre-requisite UI version (required for all new visual elements) |
| Enables grid layout and multi-tab offer filters |
| Displays rewards carousel at the top of Offers page |
| Allows offer pricing display in UI, if restaurant selection is present |
These flags are version-controlled and market-scoped, enabling safe rollout and experimentation. Please reach out to your CSM to enable them.
3. Sanity Configuration
Sanity plays a key role in customizing the offer filters:
Live Offers > Settings:
Default filters are pre-set per market.
Operators can untick filters such as “Delivery”, “Pickup”, “External Offers” or “For You” if they are not needed.
Filters like All Offers and Favorites are mandatory and cannot be removed.
Default Filter Logic:
Filter visibility is dynamic and controlled by market configuration.
“External Offers” will not show unless the Live External Offers document is published.
Events
The following analytics events are implemented to monitor feature engagement and behavioral impact:
Existing Events (continued use): https://rbictg.atlassian.net/wiki/spaces/COG/pages/4041605275
New Events Introduced
Filter Click Tracking
Event:
Button Click
Property:
Name
= filter label (e.g., “Favorites”, “For You”, etc.)
Reward Unlock CTA
Event:
Button Click
Triggered on “Order More to Unlock this Reward”
Redirects to
/menu
View More Rewards
Event:
Button Click
Triggered from last card in reward carousel
Share Coupon
Event:
Button Click
Name:
Share Coupon
Includes offer ID and path as properties
All events are tracked through mParticle and Amplitude. These will feed into conversion dashboards.