activa × 24 BLVD Group

Round 2 plan: from Alba's ops handoff to a cashier-anchored launch

Alba's site visit (week of 14 Sep) gives us ground truth on how BLVD 24 and Upper House actually move orders, payments and guest data. This plan maps every point in her handoff, and the second feedback batch from the client meeting on 29 Sep, to what is built today, what is missing, and the work to close it by a mid-October launch.

Sources Alba · Ops Handoff 28 Sep · client feedback 29 Sep Version v2 · 29 Sep 2026 · Paquito Status proposal, needs Nestor's sign-off Backend demo project vkfgpzbfqzjibzcthist (free to change)
The call

Yes to the cashier as the anchor role. Two amendments.

Alba is right: floor staff run paper-to-POS loops between tables and four kitchens, and an app in their hands slows service. The cashier is stationary, already at the POS, and every payment passes through them (1 at BLVD 24, 3 at Upper House). Building the transaction features for that role gives us real per-member, per-venue spend data with zero POS integration.

● Amendment 1. The door (hostess) and the till (cashier) are two modes of one scanner surface, not two apps. Both scan the same thing: a member's identity QR. One identity token, one resolver, two role-gated screens.

● Amendment 2. Log first, design rules later. The ledger Alba asks for (member, venue, timestamp, amount, method, benefit redeemed) ships in R2 as an append-only table with the loyalty accrual hook present but switched off. Points rules get designed from the data, not guessed.

● v2 addition. Beam Checkout is the client's payment rail and the first adapter we build. Money and perks become data with a venue on every row, so accounting can close each venue against its own bank. Credits stay out of the launch cut until Thai counsel answers.

v2 · what changed

Feedback round 2 (29 Sep): thirteen items, verified against the code

Each item was checked against the member app, the standalone design app, the admin and the schema by a nine-agent verification pass, then challenged by an accounting/legal lens and a venue-ops lens. Decisions below are the survivors.

One finding shapes everything: most of what Alba describes (white gradient, "This week" list, share sheet, checkout with PromptPay chips) lives in the standalone design app, which is compile-time constants and cannot receive an admin edit. The real member app on the Activa backend has none of it: no images, no share, no checkout, and a decorative QR glyph rather than a scannable code. Decision 1 (port the approved design into the multi-tenant app) is therefore no longer optional. It is the Week 1 gate for items 1, 2, 4, 5 and 12.
#Alba's itemVerified todayWhat we doWhen
1Swipe images on eventsReal app renders no event images and never selects events.media. Design app: one bundled thumb per event.Carousel from events.media[] (PageView, dots, fixed 4:5 crop) on the home card and the event sheet. Images come from a storage bucket, never from the seeded Instagram CDN links, which expire in days.W2 · WS-C
2Share links to invite to the app and on InstagramDesign app shares only the event's Instagram post URL, so recipients land on Instagram, not the app. No deep links, no install page anywhere.W2 ships the simple version: a share sheet with two targets, "Invite to the app" (activahq.com/get/24blvd, a static install page with TestFlight and Play links, ?ref accepted) and "Share on Instagram" (the event's post). Same canonical link goes in the client's IG bio and Stories sticker. Universal Links, URL scheme and referral rewards move to R2.1: they need frozen bundle IDs and Apple's CDN, not three weeks of slack.W2 · WS-C
3Beam set up for payments (client side)No gateway code exists. Docs recommend Opn/Omise and treat Beam as a lever. Three spellings in the repo (Beam, Boomie, Beem).Beam Checkout becomes the first PaymentProvider adapter; Opn drops to fallback behind the same interface. Launch stays cashier-sold (option B). R2.1 wires the Beam webhook to a confirm_payment RPC that mints the pass or ticket. Client action by end of Week 1: Beam onboarding per legal entity with a payout account per venue. A single group merchant would defeat the per-venue settlement ask for in-app money.W1 client · R2.1 build
4Remove the white gradient, several images, upload in Activa, live in app?Gradient is the design app's cream hero fade. Admin event form has no image field and no bucket exists. Admin edits hit the DB directly; the real app fetches on every open with no cache, so an edit shows on next open today.Admin drawer gets media upload to an event-media bucket: client-side resize to JPEG (max 1600 px, ~300 KB), HEIC converted, bucket limited to jpeg/png and 2 MB, reorder and remove. Event UUID generated client-side so a new event can carry images on first save. Gradient dropped in the port. Pull-to-refresh and refetch on app resume added. A one-off script uploads the 26 existing thumbs before TestFlight so the client's first look isn't broken images.W2 · WS-D, WS-C
5Home page: upcoming vs signed-up events unclearDesign app: "This week" is literally the first three entries of a constant list under the personal pass card. Real app: bare feed, no ownership marker, and past events linger (no lower bound on date).Home becomes: pass or identity QR card → "Your night" (the member's tickets and bookings via a new my_upcoming RPC, hidden when empty) → "Coming up" with a "You're going" badge on owned events. Feed filters on coalesce(ends_at, starts_at + 6h) ≥ now and shows "Happening now" instead of hiding an event at 23:30 while the queue is still outside. In the Day 2 prototype sign-off.W1 proto · W2 build
6QR payment: skip Beam fee? QR pop up? Different banksNo PromptPay payment QR is generated anywhere. The design app's QRs encode door keys; the real app draws a glyph.At launch the printed venue standee stays the default (already at every till, faster than a phone screen in a dark room) and the cashier logs method=promptpay. An on-screen QR with the amount embedded is a second tap from the method chip, built on venue_settlement_accounts and a tested EMVCo payload helper. That QR is the venue's own bank, so zero fee and it honours different banks per venue. On the fee: Activa never surcharges; card fees cannot be passed to the cardholder; Beam's PromptPay rate is a commercial term the client negotiates, and whatever Beam charges is recorded per transaction from the webhook so the settlement report shows gross, fee and net. Per venue we need the company PromptPay (13-digit juristic ID), not a phone number: a personal PromptPay puts venue revenue outside the entity's books.W2 · WS-A, WS-B
7Roles access for the admin portalAccess is per module via a platform matrix; no UI to change it; role has no constraint (a typo silently loses all access); venue scope is displayed as "Scope" but enforced by nothing.Fixed matrix with cashier and hostess added, a read-only "Who can do what" table on Team, a CHECK constraint on roles with a guard query, and venue-scoped RLS enforced only for cashier and hostess (every other role stays org-wide, so no demo user loses reads). The 9×9×4 matrix editor moves to R2.1 with an audit log and "reset to default": one mis-click at 23:00 that stops the till is not a launch feature. The settlement report is venue-filtered for managers.W2 · WS-A, WS-D
8Adding new venues, seeing each venue's profileVenues can be added from a card buried in Settings; the form exposes 6 of 19 columns; no profile page; no bank fields; the org switcher is not a venue switcher.A venues route: list with "Add venue", edit drawer (the six fields plus cover image and a Settlement account card), linked from Settings. Raw columns nobody consumes (lat/long, hours JSON, sort order) stay hidden. Per-venue stats tiles ship with Member 360 in R2.1. The cashier's QR option hides itself when a venue has no settlement account.W2 · WS-D
9Different bank per venue: weekly/monthly report per venue; credits must trace to the depositpayments has no venue, fee, provider or VAT split; venues have no bank fields; the POS CSV exports three columns; credits tables have zero write paths.Per-venue money model in the Week 2 round (details in WS-A). A Settlement report in two sections that are never summed: "Collected through Activa" (payments, reconcilable to bank and Beam payouts) and "Logged at the till, not collected by Activa" (the cashier's shadow ledger). Refund and void documents, which do not exist today, are added so the report can tie to a statement. Credits are cut from the launch round: only two nullable columns land now so the later migration is additive; the deposit-lot ledger (spend → deposit, FIFO, inter-venue settlement) is designed in R2.1 once Thai counsel answers the BoT e-money question (Payment Systems Act B.E. 2560).W2 schema · R2.1 credits
10No real discount logic: no venue, no food vs drinksPerks are prose strings with venue names and "10% off" embedded. plans.discount_percentage is never read by any RPC.The WS-A benefits catalogue gains category (food / drinks / entry / merch / other) next to venue, kind and value; plan_benefits and event_benefits join tables; the three seeded perks written by hand as rows, prose kept as display fallback. Admin membership form replaces the "one per line" textarea with a benefit picker and inline create. The ledger records bill, discount and paid amounts, and each redemption snapshots the perk's cost and granting venue so promotions and cross-venue perks are bookable.W1 · WS-A, WS-D
11Happy hour 18:00–20:00: QR must not work after 20:00Nothing redeems perks today, so no cut-off can be enforced anywhere.Validity windows on the benefit row (valid_days, valid_from, valid_until) evaluated server-side on the org timezone with a business-day offset (06:00), so a 22:00–02:00 window and a Friday promo at 01:30 both work. Eligibility is computed when the card is resolved, so an expired perk renders greyed before any tap; tapping anyway returns a structured "outside window" verdict and still logs the sale, no rollback, no re-scan. The member app renders the chip from the server's valid_now, never the phone clock. To the client: the identity QR still scans after 20:00 for entry and spend logging; it is the perk that stops.W1 · WS-A, WS-B
12Perks changeable; does it apply right away?Yes at the DB. The real app fetches on every open (no cache). The design app cannot change at all (constants).Yes: an admin save is live at the next scan, since the redeem reads the benefit row at call time. The cashier card carries the perk's version, so an edit between scan and tap returns "perk changed, re-scan" instead of applying something the cashier didn't see. Admin shows "affects N active grants" before saving. Each redemption keeps a snapshot for audit.W1 · WS-A
13TrainingThe rehearsal shift trained one cashier by accident.A Week 3 deliverable sequenced after the UI freezes: BLVD 24 rehearsal (W2 Thu/Fri) → freeze cashier and door UI → record the three flows on the sim over the weekend → Upper House dry run on W3 day 2 with all three cashiers hitting the same test grant (that doubles as the real-venue concurrency test) → pilot. Two 45-minute sessions per venue, a laminated cashier card in Thai and English, 3-minute recordings per flow for new hires, a refresher after the first ledger review. Alba delivers on site.W3 · WS-F
01

Gap map: Alba's handoff against what exists today

Verified against the migration set, the three app trees and the live admin on 29 Sep.

Alba's pointBuilt todayGapWork
Cashier scans the member's QR R1Staff scanner reads a ticket code and calls check_in_ticket. The Activa member app has no identity QR; the approved 24 BLVD design (standalone app) has a 30 s rotating QR wallet.Member identity token + rotating QR, and a resolver RPC for cashier/hostess.A · C
See membership + eligible benefitentitlement_for and active_membership exist. Plan benefits are free-text perks in JSON ("Free first drink at…").Machine-readable benefits catalogue and per-member grants.A
Apply / redeem, single-use and atomic across 3 cashiersNothing. No redemptions table.Redemptions with a DB-enforced one-per-grant constraint, same conditional-update pattern that made check-in concurrency-safe.A
Log amount + method per transactionpayments holds member, amount, method, but no venue, no staff attribution, no benefit link.New member_transactions ledger keyed exactly as Alba specified, with a loyalty hook.A
Under 15 seconds per transactionStaff app has a menu→cart POS terminal. Fine for LULU F&B, wrong shape for a cashier logging a bill.Scanner-first cashier screen: scan → card → keypad → method chip → verdict.B
Hostess entry check-in at Upper HouseDoor scanner exists for tickets. No hostess role, no booking view on scan.Door mode: scan → member + tonight's booking → check in; hostess role.A · B
Upper House runs on table bookings R1resources (type table) and bookings exist as empty scaffold. No tables product, no floor inventory.Table inventory per venue (3 big VIP, 12 VIP, 3 semi-VIP, 1 private, 38 standing), table booking flow, Tonight view.A · C · D
Tickets THB 500 + 1 free drinkevents.entry_mode='ticket' and price exist; rsvp_event is free-entry only. In-app payment not wired (claim_free_pass refuses priced plans by design).Paid ticket purchase that grants the free-drink benefit. Beam is the dependency (see risks).A · C dep
Only the booker is identified today R1Tickets carry quantity but one code per row. No per-guest identity.Guest passes: one QR per guest on a booking; check-in converts guest → member.A · C
Membership doesn't override door policy R1No copy anywhere.Copy on pass, ticket, checkout, confirmation, T&C. Client confirms before launch.C
LINE fragmentation R1Nothing.Bookings + check-ins live in Activa; staff app Tonight board replaces door / model check-in groups.B · D · E
Who gets Activa accessRoles: owner, admin, manager, staff, operator_admin, provider, member. Venue-scoped roles stored but not enforced.Add cashier and hostess roles with a tight module matrix and enforced venue scope.A · D
Free-drink redemption point openn/aModelled as a benefit attribute (redemption_point: bar / any). Default bar-only until the client says otherwise.A · F
Paper-to-POS ordering, photo SOPs, daily inventory laterNothing, by design.Parking lot. Framed AI-native (agent does the work, not a checklist UI), per the Setpoint Ops rule.R3+
02

Workstreams

Six streams, run in parallel where the arrows allow. A is the spine; B, C and D hang off it. Prototype-first for every new screen: Nestor signs off the prototype, then we build. Items marked v2 come from the 29 Sep feedback.

WS-A Backend rounds: identity, benefits, redemptions, transactions, money

Two ordered migration rounds on the demo backend, TDD on local reset, assertions extended. Round 1 (Week 1) is the spine; round 2 (Week 2) is the money model.

Round 1 · Week 1

  • Member identity token. Rotating 30 s codes signed server-side; resolve_member_code(p_org, p_code) returns the member card (name, tier, active pass + expiry, benefits each with valid_now and a reason, tonight's booking) for cashier and hostess roles only. Tolerates one clock window of drift.
  • Benefits catalogue. benefits (org, venue or all, v2 category food / drinks / entry / merch / other, kind: free_item / percent_off / fixed_off / access, value, redemption_point, per-grant limit, v2 validity window valid_days / valid_from / valid_until evaluated on the org timezone with a 06:00 business-day offset, wrap past midnight supported). plan_benefits and event_benefits join tables; the three seeded perks written as rows by hand; prose stays as fallback; the dead discount_percentage is left alone this month.
  • Grants. benefit_grants created when a pass is issued (hook in issue_pass / claim_free_pass) or a ticket is bought. Source and expiry travel with the grant.
  • Redemptions. redemptions with a unique index on grant_id and v2 a benefit_snapshot (name, kind, value, window, cost value, granting venue). Three cashiers hitting the same grant at once yields exactly one success. An out-of-window or version-mismatched redeem returns a structured verdict and never rolls back the sale.
  • Transactions ledger. member_transactions: org, venue, member, staff user, occurred_at, v2 bill / discount / paid amounts, currency, method from one shared enum (cash / card / promptpay / transfer / credits / comp / external), v2 bank_ref and payer name (mandatory for promptpay and transfer, rows without them are flagged unverified), redemption_id, source. One atomic RPC cashier_log_transaction does resolve → optional redeem → log → (off by default) award_points.
  • Guest passes. guest_passes per booking or ticket: guest name/phone, own code, member_id once claimed, checked_in_at. check_in_guest RPC; claiming runs ensure_member.
  • Tables. Seed Upper House inventory as resources rows (tier + capacity); table bookings on the existing bookings table with party size and booker; Tonight query per venue.
  • Roles. cashier (redeem + log + memberships read, venue-scoped) and hostess (events + bookings read, check-in only). v2 CHECK constraint on the nine roles with a guard query; venue predicates on member_transactions, redemptions, pos_orders and payments apply only when role is cashier or hostess. my_upcoming(p_org) for the member's own night.

Round 2 · Week 2 · money model v2

  • payments.venue_id (backfilled from pos_orders, issue_pass gains a venue), provider / provider_ref (beam / opn / bank_static / terminal / none), fee, fee VAT and net, sales_amount ex-VAT, tax_amount, service charge, tip, business_date and tax_point_at. One CHECK-constrained method enum shared with the ledger.
  • venue_settlement_accounts (label, bank, account name, last 4, PromptPay ID with its type: juristic tax ID / biller / phone / national ID, account-holder type, Beam payout reference, default flag). Phone or personal IDs are refused for a VAT-registered venue unless an owner overrides, and the override is logged. Readable by owner/admin/manager and by a cashier for their own venue only; never in any public view.
  • legal_entities (Thai and English name, tax ID, registered address, VAT status) with venues.legal_entity_id, branch_no and per-venue tax config (VAT mode, service charge). pos_checkout and issue_pass read the config instead of the hard-coded 7%.
  • payment_reversals (original payment, venue, amount, reason, method, provider ref, credit-note number from a per-venue sequence) with refund_payment and void_pos_order RPCs for manager and owner. Today status='refunded' and 'voided' exist with no path that sets them.
  • report_settlement(p_org, p_from, p_to, p_basis) with basis business / calendar / payout, rows per venue × source × method with count, gross, VAT, fee, net and settlement account, in two sections that are never totalled together. Venue-filtered for managers. CSV carries venue, method, transaction id and source system on every row.
  • Credits: two nullable columns only (credit_transactions.venue_id, deposit_id). The deposit-lot ledger, credits as a first-class tender in pos_checkout and the cashier flow, Beam payout batches and inter-venue settlement documents are R2.1, after counsel. The columns make that migration additive.
  • storage bucket event-media: public read, jpeg/png only, 2 MB limit, write for roles with events write/manage under their org prefix. Used by events.media and venues.cover_image_url. members.referred_by_member_id for the ?ref on the install link.
Done when: clean local reset green with assertions for single-use redemption under 3 concurrent callers, redeem at 20:01 venue time rejected while 19:59 yields one success of three, a 22:00–02:00 window valid at 01:30, cashier cannot read another venue's ledger, hostess cannot redeem, a venue-scoped manager gets one venue's settlement rows, refund flips status and writes a credit note; applied to the demo backend via the connector.

WS-B Staff App: cashier mode + door mode + Tonight

  • Role-aware home. Cashier lands on Cashier; hostess lands on Door; manager sees both plus Tonight. POS terminal stays for LULU-style F&B.
  • Cashier flow (target < 15 s). Scan or type code → member card with benefit chips (ineligible ones greyed with the reason, e.g. "after 20:00") → tap Redeem → amount keypad → method chips (cash / card / PromptPay / transfer) → confirm → full-screen verdict, auto-reset. Every step one tap; no menus. v2 PromptPay and transfer ask for the slip reference and payer name.
  • On-screen PromptPay QR v2 as a second tap from the PromptPay chip: the venue's own company PromptPay with the amount embedded (EMVCo payload helper with fixture tests, qr_flutter). Hidden when the venue has no settlement account. The printed standee stays the default at launch.
  • Door flow. Scan → member + booking or ticket for tonight → Check in. Guest pass scan → check in guest, offer "join as member".
  • Tonight board. Bookings by table, arrivals, check-ins, redemptions count, live, with "Happening now" for events past their start. This is what replaces the LINE door groups.
  • Store-and-forward. Cashier logs queue locally and retry when Upper House's crowd kills the signal; redemption still confirms server-side before the drink is poured.
Done when: a sim recording of the cashier flow completes under 15 s from scan to verdict; double redemption rejected on screen; an out-of-window perk shows greyed before any tap; Nestor has signed off the prototype before Flutter work started.

WS-C Member App: port, identity QR, home, media, share, tables, guests

  • Chassis: port first. The approved v2 design (QR wallet, evening mode, checkout sheet) is ported into apps/member on the Activa backend in Week 1. The standalone app is retired; it cannot receive admin edits and carries none of the backend.
  • Identity QR wallet. 30 s rotating code from server tokens, countdown ring as designed; status pills read the live pass.
  • Home v2: pass or identity card → "Your night" (own tickets and bookings, hidden when empty or signed out) → "Coming up" with "You're going" badges and "Happening now" for live events. No "This week" label, no hero gradient. In the Day 2 prototype.
  • Event media v2: swipeable carousel with dots, fixed 4:5 crop, from events.media; pull-to-refresh and refetch on resume so an open screen catches up with admin edits.
  • Share v2: two targets, "Invite to the app" (activahq.com/get/24blvd) and "Share on Instagram" (the event's post). Deep links and referral rewards in R2.1.
  • Perk chips v2 render from the server's valid_now and next window, never the phone clock.
  • Upper House tables. Pick tier → date → party size → confirm. Ticket nights: THB 500 ticket shows "includes 1 free drink" and the grant appears in Activity.
  • Invite your table. Booker shares a link; each guest gets their own QR without an account; they become a member at the door.
  • Door-policy copy. "A pass or ticket does not guarantee entry. Door policy applies." on pass, ticket, checkout, confirmation, and in terms. Client confirms wording.
  • Paying in-app. Launch sells passes and tickets at the cashier with "pay at venue" in-app. Beam checkout (hosted QR → webhook → confirm_payment) is R2.1.
Done when: QR resolves at the staff scanner within one rotation; a 10-person booking produces 10 scannable guest passes; carousel renders the migrated media for all 26 seeded events; copy present on all five surfaces; verified on iOS sim by Nestor.

WS-D Admin: benefits, media, venues, settlement, roles, member 360

  • Loyalty → Benefits. Define a benefit with venue, category, kind, value, redemption point, validity window; attach to plans and ticketed events. v2 "Affects N active grants" before save; the membership form's textarea becomes a benefit picker with inline create.
  • Events → media v2: multi-image upload with client-side resize and HEIC conversion, thumbnails with reorder and remove, orphan objects deleted on removal.
  • Venues v2: list with "Add venue", edit drawer (six fields, cover image, Settlement account card with entity and branch), linked from Settings.
  • Reports → Settlement v2: week or month picker, basis toggle, two sections (collected through Activa / logged at the till), refunds and voids listed, unverified PromptPay and transfer rows listed, CSV per row.
  • Transactions & Redemptions. Filter by venue, member, cashier, method, date; export for Alba's loyalty design.
  • Tables & Tonight. Inventory per venue, tonight's floor list rebuilt from bookings.
  • Team. Cashier and hostess roles, venue-scoped; v2 a read-only "Who can do what" table. Matrix editor with audit log in R2.1.
  • Member 360. Spend per venue, redemptions, check-ins, bookings on one timeline.
Done when: the new routes render real demo data with zero console errors under the Playwright pass; staged via scripts/stage-admin.sh, not deployed until Nestor says go.

WS-E LINE consolidation

  • Booking confirmations and reminders as push in the member app; door and model check-ins on the staff Tonight board.
  • LINE Messaging API for booking confirmations as a follow-on, since the client's guests already live there. Not in the launch cut.
  • Recommendation to the client: run LINE and the app in parallel for two weeks, then move bookings.

WS-F Client alignment: defaults we build against, and what we need back

Alba's original eight questions, each with the default we build so nothing blocks, then the round-2 questions the new feedback raised.

QuestionDefault we build
BLVD 24 · cashier owns redemption + logging?Yes. The flow is designed for under 15 s so it fits the payments-only role.
BLVD 24 · which POS, manual % discounts?Ask. We log the discount; the POS applies it. Future integration depends on the answer.
BLVD 24 · benefits on Grab / hotel / Fairway delivery?Dine-in only.
Upper House · free drink at bar only or tables too?Bar only (redemption_point='bar'). One flag flips it.
Upper House · does a ticket guarantee entry?No. Copy says so. Refund only when the venue refuses entry for capacity, not conduct or dress.
Upper House · LINE → app at launch or parallel?Parallel for two weeks.
Upper House · what is the "75" headcount?Information only, no build impact.
Both · who gets Activa access?Manager = admin · LINE admin = manager · hostesses = hostess · cashiers = cashier, all venue-scoped.

Round 2 questions v2 (first two needed by end of Week 1)

QuestionWhy it matters
Beam: one merchant per legal entity with a payout account per venue, or one group merchant? Which venues first, who is the Beam contact?A single group merchant defeats per-venue settlement for in-app money. Confirm with Beam that multiple payout accounts under one merchant are supported.
Per venue: the company PromptPay (juristic 13-digit ID) and bank behind the account the cashier shows today. Is each venue its own legal entity?Drives the settlement accounts, the on-screen QR, and whether credits are inter-entity money.
Credits: who holds the deposit, the venue where it was paid or the group? Do credits expire, are they refundable?Determines inter-venue settlement direction and the BoT e-money question. Our default: no expiry, refundable on request, off until counsel answers.
Perks: confirm the categories, whether happy hour is per venue or group-wide, and what a scan should do at 20:01 (we build: deny the perk only, entry and logging continue).Encoded on the benefit row; the 20:01 behaviour is client-visible on the first night.
Event media: who supplies images (their team via admin upload, or reposts from Instagram), preferred aspect ratio, video at launch?We fix 4:5 and images only unless told otherwise. Someone must upload real media before the first TestFlight.
Share: in-app share to Instagram, or one link for their IG bio and Stories? Does bringing a friend earn anything?The bio link is the launch cut; rewards and deep links are R2.1.
Access: the named list of people with role and venue.We provision them at launch; no self-serve invites yet.
Settlement report: weekly or monthly, who receives it, CSV or PDF, Thai tax-invoice fields needed?Shapes the export and the basis default.
Training: attendees per venue, dates in the week of 13 Oct, Thai or English.Sessions and the cashier card are prepared in that language.
03

Sequence to a mid-October launch

Three weeks from today. BLVD 24 pilots first (one cashier, simpler), Upper House second (three cashiers, the concurrency case). The cashier flow is the critical path; Week 2 is dense, and the named slip candidates are the venues route and the Settlement report's payout basis.

Week 1

29 Sep → 5 Oct · Spine + prototypes + port

  • Day 1–2: clickable prototypes of Cashier, Door, Tonight and Home (HTML). Nestor sign-off.
  • WS-A round 1 authored, asserted, applied to demo.
  • Member app port into apps/member; identity QR wallet.
  • Staff app cashier + door modes built against the new RPCs.
  • Client: Beam merchant structure and per-venue company PromptPay answered.
Week 2

6 → 12 Oct · Money, media, tables, admin

  • WS-A round 2 (money model) applied; media bucket; 26 event thumbs migrated.
  • Upper House table inventory + booking flow; per-guest passes; home IA; carousel; share sheet.
  • Admin: Benefits, media upload, Venues, Settlement, Team table, Member 360.
  • Store-and-forward and the on-screen PromptPay QR.
  • Internal TestFlight; Thu/Fri rehearsal shift at BLVD 24 with the real cashier; UI freeze after.
Week 3

13 → 19 Oct · Train, pilot, launch

  • Flow recordings and cashier card (Thai + English) from the frozen UI.
  • Day 2: Upper House dry run, three cashiers on one test grant.
  • Training sessions per venue; client answers folded.
  • Pilot BLVD 24 → Upper House. Launch.
  • First ledger review with Alba for loyalty rule design (R2.1).
04

Risks and dependencies

dep Beam and in-app payments

Launch is not blocked: passes and tickets are sold at the cashier. R2.1 in-app payments depend on the client's Beam onboarding and its merchant structure. Beam is a young rail, so the adapter interface keeps Opn as a drop-in fallback. Beam settles in payout batches net of fees, so payout records are needed before bank lines reconcile; that lands with the adapter.

dep The port is the gate

Five of the thirteen new items only have a home once the approved design is ported into the multi-tenant app. If the port slips past Week 1, the carousel, share, home IA and instant perk updates slip with it.

legal Credits across venues

A stored balance deposited at one venue and spent at another with separate bank accounts, possibly separate entities, may fall under the Payment Systems Act B.E. 2560. Credits stay off until Thai counsel clears it; the two nullable columns keep the later ledger additive. Expiry implies breakage income and stays unused.

risk Static QR has no bank reference

A statement line shows payer, amount and time only, and fake slips are routine. The slip reference and payer name are mandatory in the cashier log and unverified rows are listed for accounting. Slip verification through a bank API is R2.1.

risk Peak-hour connectivity

Upper House at 1 am on a DJ night is the hardest network on the estate. Store-and-forward for logs mitigates; redemption itself stays online-only so single-use holds.

risk Habit at the till

The cashier already handles transfer, cash, card and QR with photo proof in a group chat. Our flow must be faster than a photo. The rehearsal shift is where we find out; if it isn't, we cut steps before the freeze.

risk Timezone and business day

Happy-hour windows and the settlement report are gated by the org timezone and a 06:00 business-day start on the server. A wrong timezone silently opens or closes a window; the phone clock is never consulted.

risk Media content has an owner now

Every seeded event carries expiring Instagram links. The migration script fills the bucket before TestFlight; new events need someone on the client side uploading real images.

05

Decisions I need from Nestor

1

Member app chassis

Port the approved v2 design into apps/member in Week 1 (recommended, and now the gate for half of round 2), or keep the standalone app and wire it to Activa.

2

Launch payments

Cashier-sold passes and tickets with "pay at venue" for mid-October, Beam as the first adapter in R2.1 with Opn as fallback (recommended), or hold launch for in-app payments.

3

Cashier and hostess as roles

Named roles with enforced venue scope, fixed matrix at launch, editor in R2.1 (recommended), versus permissions on the generic staff role.

4

Prototype sign-off slot

Thirty minutes on Day 2 to walk the Cashier, Door, Tonight and Home prototypes before any Flutter or schema work lands.

5

Credits v2

Cut the deposit-lot ledger from the launch rounds and design it in R2.1 after BoT counsel (recommended), or author it dormant now on the critical path.

6

Share links v2

One canonical install link for the share sheet and the client's Instagram bio at launch (recommended), or the full deep-link and referral stack in Week 2.

06

Verification, and the parking lot

How each claim closes

  • Backend: assertions on clean reset; 3 concurrent redeems → 1 success; window and after-midnight cases; RLS tests per role and venue; refund and void write documents.
  • Staff app: timed sim recording of scan → verdict; double-redeem and out-of-window rejected on screen; offline queue replays; PromptPay payload fixtures.
  • Member app: QR rotates and resolves at the scanner; 10 guest passes from one booking; carousel on migrated media; copy on five surfaces.
  • Admin: Playwright pass on new routes, zero console errors; an uploaded HEIC arrives as a 4:5 JPEG under 2 MB.
  • Venue: BLVD 24 rehearsal shift and the Upper House three-cashier dry run before pilot. Nothing deploys without Nestor's go for that change.

Parking lot R2.1 and later

  • R2.1: Beam adapter and webhook; credits deposit-lot ledger and inter-venue settlement after counsel; deep links, referral rewards; access-matrix editor with audit; venue stats tiles; slip verification; LINE Messaging API.
  • Ordering from a staff device or in-app, once the cashier flow is proven.
  • SOPs and shift reports. Staff already photograph completed areas daily. An agent ingests the photos and writes the shift report; no checklist UI.
  • Inventory. Counted from zero three times daily. An agent reconciles counts against POS sales and flags variance.
  • All of it follows the Setpoint Ops rule: abstract across venues, prototype first, AI-native by default.