A whole park,run from one system.
A multi-tenant ERP for amusement and water parks: tickets and NFC wristbands at the gate, cashless cards charged by arcade machines, lockers, food counters, crowd analytics, CRM and payroll — online, or installed fully offline.
A park runs a dozen businesses at once — gates, games, food, lockers, rides, staff — usually on a dozen disconnected tools. The brief was one system where every counter, machine and team works from the same data.
Some venues also need it to run with no internet at all, on their own hardware. That turned licensing, installation and tamper-resistance into first-class engineering problems, not afterthoughts.
Operations app
Gate ticketing, NFC wristbands, game cards, lockers, rooms, outlets, kitchen tickets and reports.
Workforce & CRM
Attendance, shifts, leave, payroll and recruitment, plus campaigns and bulk messaging.
Machines & devices
IoT endpoints for arcade machines and ride cameras, POS card terminals and thermal printers.
License console
A control plane for tenants, modules and licences — and an offline installer for on-site venues.
How it fitstogether.
What made ithard — and how.
Licensing that survives being offline
An on-premise install can be copied to another machine, or have its clock wound back to stretch a licence.
Licences are RSA-signed and bound to a hashed hardware identity and the tenant, checked by a global hook on every request with a short cache. Signed time tokens detect clock rollback, and the licensing code is obfuscated at build time.
Two databases, one application
Payroll and master data are deeply relational; gate and machine activity is high-volume and document-shaped.
Relational HR and custom-field data lives in MySQL, operational events in MongoDB — inside one API, with tenant and branch scoping enforced by shared hooks on both.
A cashless economy run by machines
Arcade machines charge players' cards directly, with no cashier in the loop.
Each machine call is authenticated, the card balance is checked against that machine's price per session, and every play is written to a machine log — with counter recharges feeding the same wallet.
Card terminals that reconcile themselves
Physical POS payments resolve asynchronously, and some bills are split across several payment modes.
A scheduled job polls pending terminal transactions with signed requests every minute and settles them to success, failure or expiry; bookings accept a validated breakdown across payment modes.
Printing at the speed of a queue
Wristbands and receipts have to print instantly at busy counters, on thermal hardware.
The browser drives thermal printers directly with printer-native commands for barcodes and QR codes, and room assignment runs inside a database transaction so two counters can't hand out the same room.
Everythingit does.
Backend
Node.js · TypeScript · FeathersJS · MongoDB · MySQL · Cron
Web
Next.js · React · MUI · FullCalendar · Charts
Hardware
NFC · IoT machines · POS terminals · Thermal printers
Platform
Razorpay · Stripe · SaaS + offline installer · CI/CD