The festival cashless system, end-to-end on real NFC hardware — register a band, load cash, let a vendor charge it, hand unspent cash back at the desk, and watch the organizer's report add up. Running against dev (staging); production is untouched.
dev · livePOS build v1.0.0 · cashierCashier desk · in this buildAndroid · NFC
ⓘAndroid phone with NFC turned on (or the ZCS handheld). Allow "unknown sources" if prompted. The build points at dev-api.carrottickets.com.
Who's who at the venue
Five separate roles, each with its own screen. They are deliberately distinct — a reseller is an outside outlet, a cashier is the organizer's own money desk.
O
Organizer — owns the event. Sees every cashless transaction, vendor and cashier from the dashboard.
R
Reseller — an outside outlet (think Shoprite) that sells tickets and helps top up before the event.
C
Cashier — the organizer's in-venue money desk: tops up bands and cashes them out.
V
Vendor — a stall inside the event (the bar, food) that charges bands for what people buy.
G
Gate — binds a band to a ticket and checks people in.
A
Admin — Carrot. Sees everything, across every event.
Desk logins
One app, one login screen — log out and back in to switch desks. The app sends each role to its own screen.
Role
Login code
PIN
What they do
Reseller ticket outlet
597081
482913
Register a band, sell tickets, top up (pre-event)
Cashier money desk
502413
618240
Top up and cash out a band at the venue
Vendor "Test Bar"
640220
551282
Charge bands (tap-to-pay), see takings
Gate entry
380443
739154
Bind band, tap-to-check-in, balance
What you're showing
One physical band is a funded ticket. The balance lives on the server — the tag only carries its UID, and every tap is an atomic move that keeps the books balanced (float = wallets + vendors + fees). After every top-up, purchase or cash-out the app shows the new balance, so the attendee can see exactly what's left.
1
Register a band — a blank tag becomes a ticket + wallet.
2
Top up — load cash onto the band (reseller or cashier).
3
Vendor tap-to-pay — charge debits the attendee, credits the vendor.
4
Cash out — the cashier hands back unspent cash; the balance is debited.
5
Left balance — every action ends on a screen showing what's left.
6
Organizer report — circulated, spent, withdrawn, and left behind.
The demo
Act 1
Register & fund a band
Reseller · 597081 / 482913
Log in, then pick "Cashless NFC Tap Test Fest".
Register band → choose General Admission → (optionally add cash) → tap your tag. It becomes a ticket + wallet + band in one move.
Top up a band → tap the tag → enter R50. The band now holds R50.
This is the money-in half — the wristband is now a funded wallet.
Act 2
A vendor charges the band
Vendor · 640220 / 551282
Log out, log in as the vendor → you land on Test Bar with two tabs: Charge and Takings.
Charge → enter R10 → tap the band → "Charged R10 · New balance R40."
Try to over-charge (more than the balance) → "Declined · Balance R X" — the balance is left untouched.
Takings tab → the charge is listed, and your running total updates.
Test Bar takes 10% commission, so R10 splits: vendor R9, Carrot R1 — debited from the attendee, credited to the vendor, on the ledger.
Act 3
The cashier cashes out
Cashier · 502413 / 618240
At the money desk, the cashier taps a band → sees the balance + full history (top-ups, purchases, cash-outs).
Cash out → enter the amount to hand back → tap the band → "Paid out R20 · New balance R20." The attendee sees exactly what's left.
The cashier's own transactions list shows every top-up and cash-out she did, with status — so a "my money didn't reflect" complaint is answerable on the spot.
Cash back = the full remaining balance — the cashier can return everything on the band. The wallet is debited and the venue's cash float pays down, on the same balanced ledger.
Live in this build — log in as the cashier (502413 / 618240) and tap. The organizer's report + staff setup (Act 4) are live on the dashboard.
Log in with the details above → open "Cashless NFC Tap Test Fest".
Open the Cashless tab: Circulated (loaded on bands), Spent (at vendors), Withdrawn (handed back), Left behind (still on bands, un-withdrawn), plus per-vendor takings, per-cashier activity, and the full transaction log.
Set up staff: the Cashiers and Vendors pages let the organizer add money-desk cashiers and in-event vendors — each gets its own login code + PIN — and open a cashier/vendor to see their transactions.
Every figure comes straight off the ledger + wallets — the same source that always balances — so the organizer sees exactly how much money moved and how much attendees left behind.
Act 5
Gate (optional)
Gate · 380443 / 739154
Log in as gate → pick the event.
Check balance → tap a band → see balance + history.
Bind band → scan a ticket QR → tap a blank band → bound.
Tap to check in → tap a bound band → the ticket checks in.
What's real vs. not
✓ Working now
NFC read on real hardware
Register / sell band, cash top-up, balance + history
It's dev/staging — safe to play with; a separate database from production.
Tags are read-only (we only read the UID); 4-byte tags are accepted.
To charge or cash out a band it needs a balance — always top up first.
Reseller vs cashier — what's the difference?
A reseller is an outside outlet (like Shoprite) that sells tickets and helps top up before the event. A cashier works for the organizer at the venue and handles the money once people are inside — topping up and cashing out. They're separate roles with separate screens on purpose.
"Tag UID unreadable / too short"
Hold the tag steady on the top-back of the phone, and make sure NFC is on.
A charge or cash-out says "Declined"
The band's balance is lower than the amount. Top it up and retry.
Nothing loads / network error
The phone needs internet — the app talks to dev-api.carrottickets.com.
Fresh start
Reinstall the APK and log in with the codes above.