Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Badges & Booking Anniversary

Description / Background

Loyalty 2.0 badge system that recognizes member tenure and review contribution. The goal is to create a visible retention mechanic that rewards members on their booking anniversary and when they become Top Reviewers, while making badge status visible across Profile and BiteList.

Current State:

  • Waiting to ship
  • Available on web and mobile web/hybrid

Objectives

  • Award permanent Bronze badge at Y1 (1 year anniversary)
  • Issue yearly promo codes for Y2+
  • Award permanent Top Reviewer badge when approved review count reaches 10
  • Display earned badges on Profile and BiteList
  • Support single-use anniversary promo codes during anniversary month

Scope

In Scope

  • Booking anniversary engine (month-level job on 1st of each month)
  • Bronze badge award at Y1
  • Recurring annual promo code issuance (Y2-Y5+++)
  • Top Reviewer badge (10+ approved reviews)
  • Badge display on Profile and BiteList
  • Reward redemption with promo codes
  • Push, email, and in-app notifications

Out of Scope

  • Gold/Platinum/VIF badge tiers (Phase 1)
  • Vietnam reward values (TBD)
  • Public/social badge display
  • World Eater, Traveler, Cuisine Lover badges

Badge Types

Bronze Badge (Anniversary)

  • Issued at Y1 (first year anniversary)
  • Permanent, never expires
  • Based on earliest completed/dined booking as anchor

Top Reviewer Badge

  • Awarded when member has 10+ approved reviews
  • Permanent badge
  • One-time reward: 100 THB (or local equivalent)

Promo Code Rewards by Year

YearTHBSGDMYRVND
Y1Badge onlyBadge onlyBadge onlyTBD
Y2100 THB10 SGD15 RMTBD
Y3150 THB15 SGD20 RMTBD
Y4200 THB20 SGD25 RMTBD
Y5+300 THB25 SGD30 RMTBD

Note: The 100 THB Top Reviewer reward (line 48) is a one-time award independent of the anniversary cadence.

Note: Y6+ stays flat at Y5+ values. Vietnam values TBD, excluded from Phase 1.


User Stories

Flow 1: Booking Anniversary Trigger & Bronze Badge Award (Y1)

  • Run job on 1st of each local-market month
  • Find each member’s earliest completed/dined booking
  • Issue permanent Bronze badge at Y1

Flow 2: Recurring Annual Promo Code Issuance (Y2-Y5+++)

  • Issue promo codes yearly starting Y2
  • Promo code valid only for anniversary calendar month
  • Single-use, non-transferable

Flow 3: Top Reviewer Badge Award

  • Award when approved review count reaches 10
  • Backfill members who qualify at launch
  • One-time reward: 100 THB or equivalent

Flow 4: Badge Display on Profile & BiteList

  • Show earned badges on Profile and BiteList
  • Shared badge detail view
  • Non-blocking empty/loading/error states

Flow 5: Anniversary Promo Code Redemption

  • Support single-use promo codes during anniversary month
  • Handle cancellation, failed payment, expiry safely

Location

Web / Hybrid

  • Profile page: /profile/badges
  • BiteList: Badges section

How to Find Badges

  • Entry point hidden when both ff_badges_booking_anniversary_v1 and ff_badges_top_reviewer_v1 are disabled
  • Deep links with source=anniversary_notif trigger the AnniversaryModal automatically
  • Mobile web/hybrid users access same /profile/badges route as desktop

Backend Implementation

Feature Flags

  • ff_badges_booking_anniversary_v1 - gates anniversary badge functionality
  • ff_badges_top_reviewer_v1 - gates Top Reviewer badge

Note: Separate flags allow independent toggle/rollback.

Business Logic

  • Attribution: “First completed booking” = earliest booking with fulfilled/dined status
  • Anti-fraud: One qualifying anchor month per verified account
  • Validity window: Promo code valid only for calendar month of anniversary

PR: TBD (still in progress)


Hybrid Implementation

Components

  • ProfileDesktop.vue — Add desktop My Badges navigation card
  • ProfileMobile.vue — Add mobile My Badges navigation tile
  • AnniversaryModal.vue — Create URL-triggered badge reward modal
  • MyBadgesPage.vue — Build responsive badge collection page
  • Layout.astro — Mount badge notification modal globally
  • index.astro — Add localized badges page entrypoint

Routing

  • New profile badges route registered in router.ts
app.hungryhub.com/profile/badges?source=anniversary_notif&utm_source=crm&utm_medium=push&utm_campaign=anniversary_y{n}
web.hungryhub.com/profile/badges?source=anniversary_notif&utm_source=crm&utm_medium=push&utm_campaign=anniversary_y{n}

PR: TBD (verify against hh-pegasus#3143 — pending backend confirmation)


PRD & Task


Design

  • Design link not provided in the PRD

API Blueprint

MethodPathDescription
GET/api/v5/badgesList user badges
GET/api/v5/badges/anniversaryGet anniversary details

Note: API endpoints and payloads TBD — backend PR in progress.


DB Schema / Database Migration

TBD (backend PR in progress)


Improvement:

Feature NameDateWhat ChangedDescription
Badges & Booking Anniversary2026-09Initial ReleaseWaiting to ship - Loyalty 2.0 badge system with anniversary and Top Reviewer badges

Constraints / Non-Goals

  • Phase 1 keeps single permanent Bronze anniversary badge only
  • No Gold/Platinum/VIF badge tiers yet
  • Vietnam reward values TBD, excluded from Phase 1
  • Badges are private to the member in this phase
  • Badge loading must not block Profile or BiteList