Loyalty - Offers Grid & Rewards Carousel

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.

image-20250703-131314.png
image-20250703-131351.png

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.

image-20250703-131552.png
Signed-in unlocked rewards
image-20250703-131820.png
Locked Rewards
image-20250703-131721.png
Signed out
image-20250703-131927.png
View More Rewards button

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.

image-20250703-132448.png

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

Flag Name

Purpose

enable-white-background

Pre-requisite UI version (required for all new visual elements)

enable-offers-grid-view-with-filters

Enables grid layout and multi-tab offer filters

enable-reward-carousel-in-offers-page

Displays rewards carousel at the top of Offers page

enable-show-prices-in-offers-in-app

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.

image-20250703-135731.png
  • 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

  1. Filter Click Tracking

    • Event: Button Click

    • Property: Name = filter label (e.g., “Favorites”, “For You”, etc.)

  2. Reward Unlock CTA

    • Event: Button Click

    • Triggered on “Order More to Unlock this Reward”

    • Redirects to /menu

  3. View More Rewards

    • Event: Button Click

    • Triggered from last card in reward carousel

  4. 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.