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
| Year | THB | SGD | MYR | VND |
|---|---|---|---|---|
| Y1 | Badge only | Badge only | Badge only | TBD |
| Y2 | 100 THB | 10 SGD | 15 RM | TBD |
| Y3 | 150 THB | 15 SGD | 20 RM | TBD |
| Y4 | 200 THB | 20 SGD | 25 RM | TBD |
| Y5+ | 300 THB | 25 SGD | 30 RM | TBD |
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_v1andff_badges_top_reviewer_v1are disabled - Deep links with
source=anniversary_notiftrigger the AnniversaryModal automatically - Mobile web/hybrid users access same
/profile/badgesroute as desktop
Backend Implementation
Feature Flags
ff_badges_booking_anniversary_v1- gates anniversary badge functionalityff_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
Deep Link Structure
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
| Method | Path | Description |
|---|---|---|
| GET | /api/v5/badges | List user badges |
| GET | /api/v5/badges/anniversary | Get anniversary details |
Note: API endpoints and payloads TBD — backend PR in progress.
DB Schema / Database Migration
TBD (backend PR in progress)
Improvement:
| Feature Name | Date | What Changed | Description |
|---|---|---|---|
| Badges & Booking Anniversary | 2026-09 | Initial Release | Waiting 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