RtK

Campaigns live in the same habit loop as the menu

Dedicated promotions surface with campaign modals, coupon tab, and wallet-friendly tickets guests apply while ordering.

Open a campaign

Orange campaign card with discount CTA and gift / Official Account actions.

1 / 6

Implementation narrative

Problem

Chinese QSR customers expect promotions as part of ordering, not an afterthought buried outside checkout.

Solution

Campaign landings and full-screen modals interrupt browse when needed. Inline carousels keep deals next to the menu. The coupons tab gates wallet-style tickets behind a permission step, then lists active offers.

Campaign tiles and coupon entry sit on the same surface as the menu. WeChat supplies the carousel component (`swiper`); campaign data, eligibility, click destinations, and wallet coupon logic stay application-owned. Representative pattern from the official docs (not recovered Dodo source):

<swiper
  indicator-dots
  autoplay
  circular
  interval="5000"
  bindchange="onPromotionChange"
>
  <swiper-item wx:for="{{promotions}}" wx:key="id">
    <image
      src="{{item.image}}"
      mode="aspectFill"
      data-id="{{item.id}}"
      bindtap="openPromotion"
    />
  </swiper-item>
</swiper>
Page({
  data: { promotions: [] },
  openPromotion({ currentTarget }) {
    wx.navigateTo({
      url: `/pages/promotions/detail?id=${currentTarget.dataset.id}`,
    })
  },
})
Outcome
  • Open a campaign: Orange campaign card with discount CTA and gift / Official Account actions.
  • Full-screen campaign modal: Seasonal modal overlays the menu with a claim CTA above the cart bar.
  • Inline promo carousel: Menu home keeps combo slides and a store row above category browse.
  • Coupons permission gate: Coupons tab asks for permission before listing weekly deals.
  • Wallet-style tickets: Active coupon tickets and promo tiles on the coupons surface.
  • Launch promotions page: Real promotions capture with mini-program code and coupon list.

User flow