Chinese QSR customers expect promotions as part of ordering, not an afterthought buried outside checkout.
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.
Implementation narrative
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}`,
})
},
})- 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.

