The demo cast — three research merchants
Every booking, statement and invoice in the demo flows from three seeded venues, modeled on the research merchants:
- V1 · Beach Club — Pattaya. Day Pass ฿1,500 adult / ฿750 child (+ ฿400 add-on) · Cabana Package ฿7,000 flat · Sunset Cruise Add-on ฿2,200 / ฿1,100, non-refundable.
- V2 · Dinner Cruise — Bangkok. Dinner Cruise — Standard Seat ฿1,200 / ฿600 (+ ฿350 add-on), non-refundable · Window Table Upgrade ฿5,500 flat.
- V3 · Elephant Park — Bangkok. Half-Day Park Visit ฿1,900 / ฿950 · Full-Day Keeper Experience ฿3,500 / ฿1,750 · contracts: Klook 10% / GetYourGuide 9% / agent 15%.
Orientation — roles, venues, saving
The workbench is one file, four jobs. The top bar switches VENUE (left) and ROLE (right). Everything you do saves in the browser instantly and survives reload; Admin → Export moves your session to another machine.
Steps
- Open the workbench — you land on the role's home screen (Operator → Portfolio; Owner → Overview; Manager → Bookings; Gate → Check-in).
- Pick a venue in the top bar. Operator can see ALL venues at once; venue roles are venue-locked.
- Everything is demo data (MOCK) — reset any time in Admin → Reset demo data.
Data touched
Edge cases
For the tech team
The Actions queue — start every shift here
Zero-inbox for operations: everything that needs a human is one list, newest risks first. Clearing the queue = the venue is healthy.
Steps
- Portfolio → 'Actions required' card counts everything open across your venues.
- Each row deep-links to the exact surface: cancel requests → the booking drawer; discrepancies → the statement; approvals → the sign-off screen.
- Resolve top-to-bottom. The count updates live as you clear items.
Data touched
Edge cases
For the tech team
One bookings inbox for every channel (PP1)
Stop living in five extranets. Marketplace, direct web, walk-in and agent bookings land in ONE searchable list with one status vocabulary.
Steps
- Bookings tab → filter by channel kind (Marketplace / Direct / Agent) or status.
- Search by guest name, booking ID or platform ref — the ⌘K box in the top bar jumps here from anywhere.
- Click any row → the booking drawer: full detail, money trace, timeline, actions.
Data touched
Edge cases
For the tech team
Mail-ingest — bookings arrive by themselves (PP1)
Each venue gets a generated ops email registered as a sub-account in every marketplace extranet. Booking emails land there and become cards here — no platform API needed on day one.
Steps
- Ingest inbox → each card shows the raw email and what the parser extracted.
- HIGH CONFIDENCE cards: click Accept → a real booking is created, capacity decremented, ref preserved.
- Low-confidence cards are flagged REVIEW — check the raw text before accepting. Reject logs the item for platform follow-up.
Data touched
Edge cases
For the tech team
Today Manifest — who's coming (PP2)
The gate view: every arrival today, grouped by time slot, with party size, channel and assigned staff. Print it or work it live.
Steps
- Today tab → per-venue manifest grouped by slot.
- Check guests in straight from the row, or open the drawer for detail.
- Print manifest for a paper backup at the gate.
Data touched
Edge cases
For the tech team
Gate check-in — 3 taps, duplicates rejected (PP2)
Phone-first screen for gate staff: type a name or scan, tap CHECK IN, see a huge green or red answer. Gate staff see nothing else — no money, no management.
Steps
- Type any part of the guest name / booking ID (a QR scan types the ref for you).
- Tap CHECK IN on the match.
- Green = welcome in (party size shown). Red = the exact reason: already checked in, wrong day, needs confirmation.
Data touched
Edge cases
For the tech team
Walk-in / phone booking — 4 fields (PP10)
Front desk sells a day pass in under 20 seconds without touching the rate card: product, guests, name, payment. Price is computed, capacity enforced, campaign discounts auto-applied only if owner-approved.
Steps
- Walk-in tab → pick product and party size — the total updates live.
- Type the guest name, pick card or PromptPay.
- Confirm → booking is CONFIRMED, QR issued, capacity decremented, it appears on Today instantly.
Data touched
Edge cases
For the tech team
Staff assignment — arrivals into hands (PP3)
Every booking today should have an owner: host, beach crew, driver. The staff cards count loads; unassigned bookings nag in the Actions queue.
Steps
- Staff tab → see per-staff load for today.
- Assign each booking from the dropdown — saved instantly, shows on the manifest and in the drawer.
- Gate + manifest both display the assigned name, so anyone can route a guest.
Data touched
Edge cases
For the tech team
Message center — the email burden (PP4)
Five templates cover 90% of guest/platform mail: confirmation, pre-arrival info, reschedule offer, cancellation+refund, platform ops reply. Variables fill themselves from the booking.
Steps
- Open a booking → 'Message guest' (or Messages tab for the outbox log).
- Pick a template — {name}, {date}, {refund}% etc. are already filled from the booking and its policy.
- Copy to your mail/LINE client, then 'Mark sent' — the outbox logs who got what, when.
Data touched
Edge cases
For the tech team
Capacity, holds & the week grid (PP6)
One grid answers 'can we sell?': bookable = capacity − booked − held. Click any cell to override a day's capacity; release channel holds the moment they stop earning.
Steps
- Capacity tab → week grid per product. Red = full, orange = low.
- Click a cell → set a capacity override (never below already-booked).
- Holds table below: seats parked for a channel with an expiry — release manually or let them expire.
Data touched
Edge cases
For the tech team
Statement reconciliation — the month-end crown (PP8)
Import the platform's settlement, and the workbench matches every row to the ledger, flags what's wrong, computes the operation fee, and locks the month so nothing can rewrite it.
Steps
- Reconcile tab → pick venue, channel, month. The bar shows: what the platform paid vs what the ledger expected vs the gap.
- Every row is judged: MATCHED · MISMATCH (with the exact ฿ delta and why) · DUPLICATE · ORPHAN (paid but no booking) · plus MISSING bookings the platform never paid.
- Resolve each open item: Accept (with note) · Raise claim · Link/Write off. Notes go to the audit log — that's your claim file.
- When open items = 0, LOCK THE MONTH: the commission % is snapshotted, the invoice basis freezes, and later renegotiations cannot rewrite history.
Data touched
Edge cases
For the tech team
Two-pocket invoices — one number from one report
The month's money in two clean lines: the operation fee on marketplace/agent sales (remit − 80% × rate card), and the 5% system fee on direct-settled money. VAT and WHT computed. Locked months bill from their snapshot, full stop.
Steps
- Invoices tab → pick the month (June = locked statements; July = live MTD).
- LL invoice = marketplace + agent performance. RL line = direct flow + forfeit shares from partial refunds (billed via LL as collection agent until the entity novates).
- Every subtotal traces to the reconciled statement — the note on each invoice says exactly how.
Data touched
Edge cases
For the tech team
Contracts, renegotiation & parity (PP7)
The commission matrix the whole ledger reads. Renegotiate a channel and every FUTURE booking's fee grows; locked months are untouchable. The parity checker catches channels drifting off the rate card.
Steps
- Contracts tab → per-venue contract cards with lifecycle (DRAFT → PROPOSED → ACTIVE → FROZEN). Activating a renewal freezes the old term automatically.
- The renegotiation demo (10% → 8%) shows the fee line grow — that yield is the human product.
- Parity checker: paste channel prices → instant deviation report against the rate card.
Data touched
Edge cases
For the tech team
Approvals — no rogue discounts (PP7)
Discounts move only with the owner's signature. Managers request, owners sign, and only then does the campaign price into new bookings — automatically, inside its window.
Steps
- Manager: Approvals → '+ Request campaign' (title, %, window).
- Owner: Approvals → Approve & sign (note goes to the contract file) or Reject.
- Approved campaigns price into walk-in/web bookings automatically during the window — nothing else can discount.
Data touched
Edge cases
For the tech team
Agents on credit — gated like a bank (PP1)
Concierges and resellers book on credit terms. The gate is hard: past the credit line, the booking is BLOCKED — not flagged, blocked.
Steps
- Agents tab → each agent card: model, credit limit, live usage, available room.
- Book against credit — the remaining credit updates instantly and persists.
- Over the line → BLOCKED with the exact numbers, and an audit entry.
Data touched
Edge cases
For the tech team
Reports — same ledger, no second truth (PP9)
Channel mix, direct-share trend, no-show rates and campaign usage — computed from the identical ledger the invoices bill from. If reports and invoices ever disagree, that's a bug, not a reconciliation project.
Steps
- Reports tab → channel mix by value, direct share by week, no-show by channel.
- Month-at-a-glance per venue: bookings, guests, check-ins, no-shows, GMV.
- Owner sees the same numbers in their own Overview — no separate export.
Data touched
Edge cases
For the tech team
Admin — audit, roles, data
Every mutation in the workbench writes an audit line: who, when, what. That log is the professional-service evidence LL runs on. Export/import moves a whole session; reset returns to the pristine demo.
Steps
- Admin tab → audit log (newest first).
- Export state JSON before experiments; import to restore.
- Reset demo data → pristine seed.
Data touched
Edge cases
For the tech team
Known limits of v0.4 (read before demoing)
One statement month is seeded (June 2026); "today" is frozen at 2026-07-15. Simulated and labeled: statement file import, message sending, hold auto-release, QR camera scan. The role switcher is a demo affordance, not authentication. Timelines derive from current status. Rate-card history exists via lock snapshots, not full versioning. The ✨Assist buttons are reserved P3 slots — no AI runs yet, by design: the data substrate comes first.