Skip to content
All work

Case study

Club and Resort Operations Platform

In plain English

Club members book courts and pay without calling the front desk. Staff run the club without logging into ERP.

App, staff dashboard, and ERP stay in sync without re-entering data.

Who it is for

  • Club members who should not need to call the front desk or log into ERP to book a court, add a guest, or see an invoice.
  • Club staff and ops (operations, front desk, guest services, communications, revenue) who need a dashboard that is not raw ERP.

Problem

Membership, bookings, invoices, and helpdesk otherwise live in ERP. That is fine for accountants; it is a poor member experience and a slow ops console.

Staff needed one place to run the club. Members needed a modern app for courts, spa, events, and payments, without calling the front desk or logging into ERP.

Solution

We built a Flutter member app, a Next.js staff dashboard, and a NestJS API with two-way Odoo sync. Members book sports, spa, and events, bring guests with QR day passes, share a family wallet, and submit offline payment proof. Staff manage members, calendar, resources, billing, and revenue with role-based access.

The backend covers membership login with device trust and OTP, bookings, guests, family accounts, invoices, push notifications, and realtime updates so the app, dashboard, and ERP stay in sync. Members pay the way the club already collects: One Link plus proof upload, not in-app card checkout.

Outcomes

A production club platform with a modern member experience and ERP as the system of record for memberships and billing.

Operations stay accurate without re-entering data across app, dashboard, and Odoo.

FlutterNestJSNext.jsPostgreSQLRedisPrismaOdooAWSFirebaseSocket.IODocker

How it works

Member app and staff dashboard talking to one club platform, kept in sync with Odoo.
Member app and staff dashboard talking to one club platform, kept in sync with Odoo.

Booking, billing, and guests

Three journeys: booking a court, paying an invoice, and issuing a guest QR pass.
Three journeys: booking a court, paying an invoice, and issuing a guest QR pass.

What we built

Member app

  • Sports, spa, and events

    Live slot matrix, quotes, confirm, and ticketed club events.

  • Guests

    Saved guests, eight-hour day pass, and a shareable entry QR.

  • Family wallet

    Shared wallet, per-dependent budgets, and activity.

  • Billing

    Invoices, subscriptions, One Link ID or QR, and payment-proof upload.

  • Feedback and news

    Tickets with attachments; announcements and booking reminders on the phone.

Staff dashboard

  • Overview and calendar

    KPIs for members, bookings, complaints, and revenue; create, view, and cancel bookings.

  • Resources and members

    Configurable courts, services, and pricing; family wallet top-up with permission checks.

  • RBAC

    Job roles plus permission keys and per-user overrides, not a single admin boolean.

  • Billing and feedback

    Invoices, paid override, payment proof, helpdesk kanban, events, and news.

How it works

Both clients talk only to the NestJS API. PostgreSQL is the app working copy. Odoo stays the system of record, synced inbound and outbound on a timer when enabled.

Redis backs OTP, locks, and Socket.IO. Fine-grained staff permissions gate dashboard modules. Floor roles can authenticate but have no dashboard modules, by design.

Integrations

  • Odoo ERP

    JSON-RPC sync of partners, appointments, calendar, helpdesk, invoices, subscriptions, and One Link fields.

  • Firebase Cloud Messaging

    Booking reminders and news push.

  • AWS S3

    Profile photos, feedback attachments, and event images.

  • Redis and Socket.IO

    Realtime invalidation, OTP, and device trust.

Have a similar challenge?

Start a project