← Back to Home

POS Swimming Pool

Ticketing & Point-of-Sale for Recreation Venues

A full-stack, multi-tenant point-of-sale and ticketing platform for swimming pools and recreation venues: sell and print entry tickets, manage members, take payment by cash, dynamic QRIS, or RFID/membership, and track revenue and visits through operator dashboards — all on one shared, multi-business deployment. (Freelance project.)

#Full-Stack#Point of Sale (POS)#Ticketing#Multi-Tenant#Next.js#Prisma#PostgreSQL#Dynamic QRIS Payments#RFID / Membership#Ticket Printing#Object Storage (MinIO)#Dashboards

// Overview

What it does. The platform runs the front desk of a swimming pool / recreation venue. Cashiers sell entry tickets through a web POS, take payment by cash, dynamic QRIS QR, or RFID/membership, and print a ticket/receipt with a redeemable code. Members are managed with balances/units; visits and revenue roll up into operator dashboards. The system is multi-tenant — several venues (usaha) run on one deployment, each with its own pricing, members, and users.

Background

Running a busy pool's front desk on paper and spreadsheets didn't hold up:

  • Manual ticketing is slow and leaky. Hand-written tickets and cash drawers make reconciliation and anti-fraud hard.
  • Mixed payment methods. Walk-ups pay cash or QR; regulars want membership — all needed in one cashier flow.
  • Single-use tickets must be enforced. A ticket has to be redeemable exactly once, with a record of when it was used.
  • Owners want numbers. Daily revenue, visit counts, and trends had no easy reporting.
  • Multiple venues. One operator running several venues needed isolated pricing, members, and reports on one system.

Solution

  1. Web POS. A Next.js cashier interface issues entry tickets, handles members, and records every sale against the right venue.
  2. Single-use ticketing. Each ticket is a coded record (tiket / karcis) flagged used on redemption, so entry is validated once and auditable.
  3. Multi-method payments. Cash, dynamic QRIS QR codes, and membership deduction in one flow; memberships track balances/units.
  4. Member management. Members with balances/units, scoped per venue, reusable across the chain.
  5. Receipt/ticket printing. Printed ticket/receipt with the redeemable code at the point of sale.
  6. Dashboards. Chart.js dashboards report revenue, visit counts, and trends per venue.
  7. Multi-tenancy. A usaha (venue) scopes pricing, tickets, members, users, and reporting so many venues share one deployment.
  8. Ops. MinIO object storage for artifacts/exports; containerized behind nginx with Docker Compose and CI/CD.

Impact

  • Faster, cleaner front desk. Digital ticketing + POS replaces paper and manual cash tracking.
  • One flow for every payment type. Cash, QRIS, and membership handled together.
  • Fraud-resistant entry. Single-use coded tickets with a used/unused state.
  • Owner visibility. Revenue and visit dashboards per venue.
  • Scales across venues. Multi-tenant design runs many venues on one deployment with isolated data.

// Tech Stack

LayerTechnologies
Web app / APINext.js (React, TypeScript), Prisma ORM, API routes
DatabasePostgreSQL
PaymentsDynamic QRIS QR payments, RFID / membership, cash
TicketingCoded single-use tickets (issue + redeem), receipt/ticket printing
StorageMinIO object storage (artifacts, exports)
DashboardsChart.js (revenue · visits · trends)
InfraDocker / docker-compose, nginx, GitHub Actions CI/CD

// Architecture & Diagrams

1 / 4System Architecture — Simple (high level)
rendering…

Disclaimer: sample visuals may contain anonymized, simulated, or non-production values for presentation purposes.

// Demo

No demo configured yet.
POS Swimming Pool — Choiril Kurniawan