Back to projects
Kao × Laurier Campaign Platform
FMCG / Marketing

Kao × Laurier Campaign Platform

Consumer campaign platform for Kao and Laurier — a public-facing redemption site with OTP login and gallery, plus admin tools for the brand teams to run promotions independently.

Next.jsReactTailwind CSSRadix UInext-intlZustandAWS AmplifyExpressMongoDBMongooseJWT

Overview

Overview

Consumer campaign platform serving two FMCG brands under one umbrella — Kao and Laurier. The system has three moving parts: a public-facing campaign site where consumers register and redeem rewards, plus separate admin tools for each brand team to run their own promotions. One client app, two brands, two admin backends.

What I built

Consumer campaign site

  • Public landing pages, campaign mechanics, and reward redemption flow
  • OTP-based login via input-otp — consumers verify with phone number, no password to remember
  • Photo / receipt gallery using lightgallery for proof-of-purchase uploads
  • Bilingual support (Thai / English) via next-intl, since both brands run regional campaigns
  • Mobile-first UI — most campaign traffic comes from phone, not desktop

Admin tools (per brand)

  • Separate Kao and Laurier admin dashboards so brand teams operate independently without stepping on each other
  • Campaign CRUD: prizes, eligibility rules, redemption windows, banners
  • Submission review and approval queues for receipt uploads
  • Reporting on registrations, redemptions, and inventory

Backend

  • Express + Mongoose API on AWS Lambda
  • JWT auth with role separation between consumer accounts and brand admins
  • S3-backed image storage for uploaded receipts and campaign assets

Tech stack

  • Client app: Next.js 15 App Router, React 19, Tailwind CSS v4
  • UI primitives: Radix UI accordion / dialog / select / tooltip, Headless UI, lightgallery
  • i18n: next-intl for Thai / English
  • Auth: input-otp for phone-based OTP, JWT for sessions
  • State: Zustand
  • Backend: AWS Amplify, Lambda + Express, MongoDB Atlas

My role

Built the consumer-facing client app end-to-end and the admin tools for both brands. Designed the campaign data model so a single backend could serve both Kao and Laurier without leaking data between them. Mobile-first was a constraint I treated as a feature — every flow was prototyped on a phone before desktop.

What I learned

Running two brands inside one platform sounds like an obvious win for engineering — share the code, share the infra. The hard part isn't the code; it's keeping the brand experiences distinct enough that consumers don't feel they're inside the same campaign with two paint jobs. Separate admin dashboards turned out to matter more than I expected, because the brand teams asked for different reports, different approval flows, and different prize rules — and forcing one shared admin UI would have made every feature a negotiation. The OTP login also taught me that auth ergonomics drive conversion in consumer campaigns: every password-reset email is a lost redemption.

Kao × Laurier Campaign Platform — krittimet.dev