Background
Before the portal existed, the mall group ran promotions the old way: design a poster, print a few dozen copies, drive them out to each location, and hope somebody remembered to take them down when the deal ended. Expired offers stayed on walls for days. A flash sale could be over before its poster went up. The group wanted screens in place of paper, and one desk from which to run all of them.
Challenges
- Expiry had to be exact. A “50% off until 6 pm” banner still glowing at 7 pm is a customer-service problem, not a technical detail.
- Mall networks are hostile. Kiosks sit on shared Wi-Fi that drops for minutes at a time, and a screen that goes blank with the network was unacceptable.
- The people running campaigns are marketers, not IT staff. Scheduling two weeks of content across three malls had to feel like using a calendar, not deploying software.
Solution
We built the portal in two halves. The admin side, React and Next.js over a Node.js/TypeScript API with PostgreSQL, is where campaigns live: a calendar of slots per screen and per mall, with start and end times, previews, and an audit trail of who changed what. The display side is deliberately simple: each kiosk runs a full-screen web client that subscribes to its own channel in Firebase and plays whatever its schedule says.
Firebase handles the real-time push, publish a campaign and every affected screen switches within seconds. For the network problem, each kiosk caches its full playlist and assets locally: when the Wi-Fi drops, the screen keeps playing from cache and reconciles the moment it reconnects. Expiry times are enforced on the kiosk itself, so a dead network can never keep a dead deal alive.
Key features
- Calendar-based scheduler with per-screen, per-mall targeting
- Real-time publish, content reaches every kiosk in seconds
- Offline-first kiosks that keep playing through network drops
- Expiry enforced on the kiosk itself, so offers never outlive themselves
- Roles and a full audit trail for marketing teams
Outcome
Campaign turnaround went from a week of printing to same-morning.