C Carrot Tickets · Cashless

Cashless demo runbook

The festival cashless system, end-to-end on real NFC hardware — register a band, load cash, let a vendor charge it, watch the takings. Running against dev (staging); production is untouched.

dev · live build v1.0.0 · c71206f 2026-08-07 Android · NFC
Install the app
Carrot POS — dev build (.apk)
Download APK →
Android phone with NFC turned on (or the ZCS handheld). Allow "unknown sources" if prompted. The build points at dev-api.carrottickets.com.

Three roles, one app

Log out and back in to switch roles — the app sends each one to its own screen.

RoleLogin codePINWhat they do
Reseller band desk597081482913Register a band, top up
Vendor "Test Bar"640220551282Charge bands (tap-to-pay), see takings
Gate entry380443739154Bind 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 debit that keeps the books balanced (float = wallets + vendors + fees).

1

Register a band — a blank tag becomes a ticket + wallet.

2

Top up — load cash onto the band.

3

Vendor tap-to-pay — charge debits the attendee, credits the vendor.

4

Takings — the vendor sees every charge + a running total.

5

Gate — bind a band, tap to check in, check a balance.

The demo · about 8 minutes

Act 1

Register & fund a band

Reseller · 597081 / 482913
  1. Log in, then pick "Cashless NFC Tap Test Fest".
  2. Register band → choose General Admission → (optionally add cash) → tap your tag. It becomes a ticket + wallet + band in one move.
  3. 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
  1. Log out, log in as the vendor → you land on Test Bar with two tabs: Charge and Takings.
  2. Charge → enter R10tap the band"Charged R10 · New balance R40."
  3. Try to over-charge (more than the balance) → "Declined · Balance R X" — the balance is left untouched.
  4. 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

Gate (optional)

Gate · 380443 / 739154
  1. Log in as gate → pick the event.
  2. Check balance → tap a band → see balance + history.
  3. Bind band → scan a ticket QR → tap a blank band → bound.
  4. 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
  • Vendor tap-to-pay (real debit → vendor credit, commission split, decline)
  • Vendor transactions / takings
  • Gate bind, tap-to-check-in, balance

Good to know & troubleshooting

Before you start
  • 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 a band it needs a balance — always top up before charging.
"Tag UID unreadable / too short"
Hold the tag steady on the top-back of the phone, and make sure NFC is on.
A charge says "Declined"
The band's balance is lower than the amount. Top it up (reseller) 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.