Membership Club — Training Manual

The complete manual in one document: every persona, then every workflow by area. Filtered to one area. Generated 2026-08-31T04:03:52Z · content revision 2026-08-30T21:54:00Z.

Back to training

Contents

Part 1 — By persona

Part 2 — By area

Appendices

Customer (Guest)

Anyone on the public site who has not logged in yet.

You are the public. You have no account, no groups and no session — and a surprising amount of the platform is deliberately open to you: the event catalogue, an event's tier and price breakdown, the resale exchange window, the host application form, a comp-invite claim link and a contract signing link.

That is a design decision, not an oversight. Every gate in this platform is enforced at the moment of the action, never by hiding the page. A customer must be able to see what is on sale, and a prospective promoter must be able to apply, before either of them has an account.

The moment you need to own something — a ticket, house credit, a listing — you become a Member. Registering is the boundary.

Core workflows (4)

Takes part in (2)

What this persona cannot do

Without a session you cannot:

  • hold a reservation, check out or pay — the cart and checkout pages require the member group;
  • see anyone's tickets, orders, credit balance or wallet passes;
  • open any /admin/* surface or the door scanner.

Anonymous requests that need a session get an HTML redirect to /login?next=…, or a 401 envelope for JSON.

Member

A registered customer: buys, holds tickets, house credit and resale listings.

You are the platform's centre of gravity. Registering grants the member group automatically, and with it every customer-owned surface: the cart and checkout, your orders and tickets, your wallet passes, your house credit balance and statement, and the resale exchange as both a seller and a buyer.

Your hub is /my. Everything you own hangs off it — /my/tickets, /my/orders, /my/credit, /account/passes. Note the shape of those URLs: the member portal lives under /my/* and /account/*, and every one of those routes scopes its query to your user id. A member cannot read another member's order even by guessing the id — the lookup 404s rather than 403s, so ids cannot be probed.

Core workflows (13)

Takes part in (18)

  • Browse events as a guest — owned by Customer (Guest), your step 9. Shows the same pages with a session, so the difference is visible rather than described.
  • Create your member account — owned by Customer (Guest), your steps 3–6. The account you just made — everything after the redirect is theirs, including the verification the first purchase waits on.
  • Create and launch an event — owned by Host / Promoter, your step 15. The reason the whole thing exists — they are who finally sees it on sale.
  • Buy a ticket — owned by Customer (Guest), your steps 6–13. Everything from the cart onwards needs a session — the buying half is theirs.
  • Understand your event's tiers, prices and releases — owned by Host / Promoter, your step 11. The buyer the whole release schedule is designed for.
  • Refund a ticket or an order — owned by Admin, your steps 1–8. It is their money and their ticket — and where it lands depends on the policy, not on what they ask for.
  • Read the scanner screen — owned by Door Staff, your steps 9–10. Presents the credential — and can show you what the rotating QR looks like from their side.
  • Diagnose a red scan — owned by Door Staff, your step 9. Is the guest at the window, and usually holds the fix on their own phone.
  • Use your membership card at the bar (VIP) — owned by VIP Member, your steps 1–2. Holds the same card without Zone B — the contrast is the lesson.
  • Open or close the resale exchange — owned by Admin, your step 5. They are the seller and the buyer: the bounds you set are the prices they are allowed to type.
  • Process a payout run — owned by Admin, your steps 1–3. It is their money leaving the platform: they request it and they are the one the identity gate applies to.
  • Post a house credit adjustment — owned by Admin, your step 5. It is their balance that moves, and the correction lands on their statement in full view.
  • Claim your comp invite and name your plus-ones — owned by Customer (Guest), your steps 5–7. The same invite addressed to an account is claimed from the member portal instead of a token link.
  • Build a trigger rule — owned by Venue Manager, your step 9. Is the person whose purchase crosses the threshold that fires the rule.
  • Build a role from capabilities, and tune a membership tier — owned by Admin, your steps 18–19. Is the person a tier is for — and the only one who can confirm the benefit actually landed.
  • Grant and revoke roles — owned by Admin, your step 4. It is their account: the grant is what changes what they can buy and where they can walk.
  • Deactivate a user — owned by Admin, your step 3. It is their account: they are the one who suddenly cannot log in, and they are told nothing.
  • Run the feedback backlog as a build list — owned by Venue Manager, your step 1. Supplies the backlog, and is the only person besides an admin who may edit their own words.

What this persona cannot do

You cannot:

  • reach any /admin/* page, the door scanner, or the debug console;
  • refund your own order at will — self-cancellation is only offered when the event's refund policy sets a cancellation deadline;
  • see or edit another member's data, in any module;
  • issue yourself a comp, a door override or a role.

VIP Member

A member with a house tab and Zone B access. Implies everything a member can do.

You are a member with two extra things: a VIP tab (a credit limit you can spend against and settle later) and a wider door credential — your membership card opens Zone B, not just the general zone.

The group logic matters here. vip_member implies member: the platform's group check expands vip_member to include member, so you are never granted both and never lose member surfaces. Everything on the Member page is yours too — this page only covers the difference.

The tab is deliberately not a wallet. It is an obligation recorded on the double-entry ledger: spending against it raises what you owe, and a scheduled monthly settlement sweeps your prepaid balance first and then charges your card for the remainder. Nothing about it is a discount.

Core workflows (2)

Takes part in (7)

What this persona cannot do

VIP status does not grant staff powers. You cannot:

  • set or raise your own tab limit — only an admin can, and revoking VIP freezes the tab while the balance stays owed;
  • skip the door — a VIP card is scanned like every other credential;
  • reach any admin, scanner or ledger surface.

Host / Promoter

An outside promoter running an event at the venue. Scoped to that one event.

You are an outside party who wants to put on a night at the venue. You are not staff, and the platform is emphatic about that: your grant is a scoped one. A host grant carries an event_id, and the permission check only passes for that event. Two promoters with host grants cannot see each other's events at all.

Your journey starts before you have an account: the application form is public. Approval is what creates your user and your scoped grant — in that order, and never by hand.

Inside your event you are effectively read-only. You can see your event and its sales, you sign the contract, you invite guests against the comp buckets allocated to you. You do not price it, transition it, refund it or touch its money. That separation is the whole point of the contract: it is the record of what the venue agreed to do on your behalf.

Core workflows (11)

Takes part in (11)

What this persona cannot do

Even on your own event you cannot:

  • create the event yourself — it is converted from your approved application by staff;
  • change tiers, prices, capacity or the event's status;
  • issue refunds, read the ledger, or take a payout outside the contracted royalty;
  • see any other promoter's event, or any venue-wide report.

Door Staff

Works the door: scans credentials, searches the guest list, checks people in.

You are the last mile. Your job is two screens — the scanner and the guest list — and a single question per person: green or red.

The design intent is that you never have to decide. The scan endpoint returns a verdict and a reason, and the screen is deliberately loud and colour-coded so it reads at arm's length in the dark. A red scan is not an accusation; it is a reason code (already used, wrong event, outside the door window, listed for resale, revoked) and each one has a different answer.

You are one of the three employee groups. That is a pseudo-group — a gate meaning "door staff or venue manager or admin" — and it is what opens the scanner. It is not a grantable group: nobody is ever given "employee", they are given door_staff, venue_manager or admin.

Core workflows (5)

Takes part in (14)

  • Find your way around as staff — owned by Venue Manager, your steps 8–9. Learns the two screens their role actually opens, and what a 403 there means.
  • Monitor live sales on the night — owned by Venue Manager, your step 9. Supplies the other half of the picture — how many of the sold tickets actually walked in.
  • Get through the door — owned by Member, your steps 5–6. Scans the credential and reads the verdict out loud.
  • Use your membership card at the bar (VIP) — owned by VIP Member, your step 5. Scans the card at the bar and reads the credit summary off the verdict.
  • Run the door offline — owned by Venue Manager, your steps 5–7. Actually works the queue in offline mode and presses Sync now when the network returns.
  • Resell a ticket you can't use — owned by Member, your step 6. Shows the consequence of listing: the seller's own credential now scans red.
  • Buy a ticket on the resale exchange — owned by Member, your step 9. Confirms the new pass works and the seller's old one does not.
  • Allocate comps to a promoter — owned by Venue Manager, your step 9. Turns the names in the bucket into people in the room, and lives with your plus-one decisions.
  • Claim your comp invite and name your plus-ones — owned by Customer (Guest), your steps 8–9. Finds the guest by name on the night and checks them in with their plus-ones.
  • Invite a guest and track plus-ones — owned by Host / Promoter, your steps 11–12. Finds the name on the night and counts the plus-ones in.
  • Revoke a comp — owned by Venue Manager, your step 6. Meets the consequence at the door if the revocation lands after the guest arrives.
  • Grant and revoke roles — owned by Admin, your step 8. A door_staff grant is the thing that opens the scanner at all.
  • Map groups to door zones — owned by Admin, your steps 4–7. The map decides which reader turns green for them and for the guests they scan.
  • Deactivate a user — owned by Admin, your step 4. The revoked credential fails at their reader and they must not mistake it for a broken scanner.

What this persona cannot do

Your access is narrow on purpose. You cannot:

  • open any admin dashboard, ledger, payout or tax surface;
  • download the offline sync bundle or the push feed from a browser — those carry every pass secret, so they need a venue manager session or a provisioned reader's device token;
  • create or revoke passes, refund anything, or change a role;
  • allocate comps — you check in the guests a manager or promoter listed.

Venue Manager

Runs the floor and the calendar: intake review, live sales, the door, marketing.

You run the venue day to day. venue_manager implies door_staff, so everything on the Door Staff page is yours as well — plus the surfaces a shift lead actually needs: the host application queue, the live sales dashboards, the guest list allocations, the door overrides, the access-control readers view and the marketing tools.

What you will notice is where the platform stops you, and it is worth understanding why rather than filing a ticket about it. You are trusted with operations; you are not trusted with money and identity. Payouts, refunds, the ledger, the tax office, role management and the universal data suite are all admin-only. That boundary means a manager can be hired, trained and given the floor on day one without ever being able to move a cent or grant themselves a group.

Core workflows (17)

Takes part in (24)

What this persona cannot do

You are a 403 on all of these, by design:

  • the ledger, trial balance and adjustments;
  • refunds and the payout queue;
  • the tax office;
  • role grants and revocations;
  • the universal admin data suite and its audit log;
  • transitioning an event's status and editing tiers or prices.

You can read most of the dashboards those things feed — the boundary is on writing, and on the surfaces where money is decided.

Admin

Owns money, identity and configuration. Implies every other group.

Admin is not "manager plus a bit". The permission check special-cases it: admin implies everything, including every event-scoped host grant. There is no surface in this platform you cannot open.

What is genuinely yours alone is the set of decisions that are hard to reverse: money out (refunds, payouts, ledger adjustments), identity (who is in which group), the contract counter-signature that binds the venue, the tax filings that go to an agency in the post, and the universal data suite that can edit any row in the database.

Two habits the design assumes of you. First, the ledger is append-only — enforced by database triggers, not convention — so you correct a mistake by posting a compensating entry, never by editing history. Second, everything you do through the data suite and the debug console is audited with a full before/after row snapshot. Both exist so that "the admin fixed it by hand" is always a readable event rather than a mystery.

Core workflows (24)

Takes part in (43)

What this persona cannot do

There is no group above you, so the limits are structural rather than permission-based:

  • you cannot UPDATE or DELETE an append-only table — the ledger, the audit logs and the sealed contract documents refuse the write at the database level, even from the data suite;
  • you cannot un-send a mailed tax filing or un-seal a signed contract;
  • you cannot grant the pseudo-group employee — it is a gate, not a grantable group.

Getting Started & Accounts

Find your way around, get an account, and learn what your role can reach.

Browse events as a guest

See the whole storefront with no account, and learn exactly where the wall is.

Owned by Customer (Guest) · 9 steps · about 10 minutes

Why this exists

The public half of this platform is deliberately generous. A stranger can read the event catalogue, an event's full tier and price breakdown, live availability, the host application form and a comp-invite claim link — all with no session, no cookie banner and no "sign up to see prices" wall.

That is a design position, not laziness. Every gate in this platform is enforced at the moment of the action, never by hiding the page. Hiding pages produces two bad outcomes: customers who cannot evaluate what you are selling, and developers who start to believe that an invisible link is a security control. So the catalogue is open and the write is guarded.

The wall is therefore not where people expect it. It is not at "see the price" — it is at "hold inventory". Pressing Reserve without a session gets a 401 from the reservation API, and the page bounces you to /login with a next parameter so you come straight back. One surface that looks public but is not: the resale exchange. Reading other members' listings requires a session, because a listing is another member's activity, not the venue's storefront.

Before you start

  • No account and no session. Use a private window, or log out first.
  • A seeded database, so the demo events are on sale.

Practise with

PersonaEmailPasswordNote
membermember@club.test member123only for the last two steps, where a session changes what renders

Steps 1–8 — Customer (Guest)

their manual →
  1. 1
    Open the home page logged out. Read the upcoming-events feed and any site announcement.
    / frontend
    Expected result Events and the announcements whose audience is the public.
    Watch out for Announcements are audience-targeted. A banner aimed at members simply is not rendered for you — if a colleague says 'the notice is on the home page' and you cannot see it, you are not looking at the same page they are.
  2. 2
    Open the catalogue.
    /events events
    Expected result Only events that are announced, on sale, sold out or in progress. Drafts and cancelled events are not listed.
    Watch out for Opening this page quietly runs the scheduler tick, so tiers that were due to open have already opened by the time the list renders. That is why the catalogue is never stale even though nothing runs in the background.
  3. 3
    Open an event. Read the tier table row by row: name, price, the door zones it opens, and its state.
    /events/{event_id} events
    Expected result Per tier, one of: a green count left, an amber countdown to its on-sale time, Locked (with the tier it is waiting on), Sold Out, Paused or Closed.
    Watch out for Locked is not sold out and sold out is not closed. A locked tier is waiting for its trigger; a sold-out tier can come back if a hold expires or a ticket is refunded; a closed tier is past its sale end and never reopens. There is a third way in on a sold-out tier and it does NOT bring the tier back: members put seats on the exchange, and since plan 604 the sold-out row links straight to that event's exchange ('Sign in to see resale seats'). The tier still reads Sold Out — the seats are somebody else's, at a price inside the band the venue set — so a customer told 'sold out means wait' has been told two thirds of it.
  4. 4
    Look at the JSON the page is built from. It is public too.
    /api/events/{event_id}/availability events
    Expected result Server time plus a per-tier availability figure.
    Watch out for The available number is exact for a tier on sale and null for a locked one — locked inventory is deliberately not disclosed. Availability counts holds as taken, so the number can drop and recover without a single sale.
  5. 5
    Press Buy on a tier while still logged out. There is no Reserve button and no sign-in wall in front of it.
    /events/{event_id}/buy payments
    Expected result The whole transaction: line, tax, total, and a payment method picker — all with no account. Pressing Pay is what asks who you are.
    Watch out for Corrected 2026-08-24 (end2end): this step used to say Reserve returns 401 and bounces you to /login. Plan 42 moved the wall — buy first, sign in last. The Pay press parks your payment choice, hops to /login with this buy URL as the next parameter, and on the way back the page reserves and pays for you. The boundary is still 'hold inventory'; what changed is that you no longer meet it before you have seen the price.
  6. 6
    Sign in — or press Create an account, which is the same journey with three more fields.
    /login payments
    Expected result You land back on the buy URL with your tier and quantity intact, a hold is taken, and the payment you already chose goes through without asking a second time.
    Watch out for The tier and quantity ride in the next parameter and the payment choice rides in sessionStorage, so the two halves can disagree. If the total has moved while you were signing up — a tier cascaded, a price changed — the page falls back to asking you to pay again, currently without saying why.
  7. 7
    Open the host application form, still with no account, to see the other public entry point.
    /host/apply intake
    Expected result A working application form. Submitting it is what creates a promoter account later.
    Watch out for Applying is a separate workflow. Do not fill this in as practice on a shared demo database — it lands in a real review queue.
  8. 8
    Try the resale exchange logged out.
    /exchange resale
    Expected result A redirect to the login page. The exchange is not public.
    Watch out for This is the one storefront-looking surface that needs a session. It is member-to-member trade, not venue inventory, so it is gated one step earlier than the catalogue.

Steps 9 — Member

their manual →

Shows the same pages with a session, so the difference is visible rather than described.

  1. 9
    Log in as the demo member and open the exchange again.
    /exchange resale
    Expected result The index of events with an open exchange, and from there the listings for each.
    Watch out for Seller identity is never shown to a buyer, at any level of the exchange. If you are looking for who listed something you need the admin surface.

Create your member account

Register, get the member group automatically, and see where that grant is recorded.

Owned by Customer (Guest) · 8 steps · about 10 minutes

Why this exists

Submitting the form creates the user, opens a session and grants the member group with the reason "self_registration" — and writes that grant to the append-only RBAC audit log with a null actor, meaning the system did it. Three grants in the platform are made that way, with no human deciding, and a null actor is how you recognise all of them: member on registration, vip_member when a VIP membership is purchased, and the Lama Family group that comes with its bundle. Everything else names the admin who decided.

What matters is that membership is the automatic one, and that is why the rest of the permission model can be strict. Because everyone who registers is a member, no other group needs a self-service path: VIP and Lama Family arrive with a purchase, host comes from an approved application, and staff groups are granted by an admin with a written reason. There is no "request access" button anywhere, on purpose.

One thing the account does not get on submit is a proven address. A verify link goes out with the redirect, and until it is clicked the account is in a soft gate (plan 39): everything works except the two actions that commit you to something — buying a ticket and applying to host. A banner on every page names the address and offers to resend. Nothing is blocked silently; the refusal says which link and where it went.

Two built details worth knowing. Registration is deliberately CSRF-exempt (there is no session to protect yet, and the form must work from a cold browser). And email uniqueness is case-insensitive and includes deactivated accounts, so a banned account's address cannot be recycled into a fresh one.

Before you start

  • A logged-out browser.
  • A password of at least 8 characters — shorter ones are rejected by the server, not just the form.
  • An admin session for the last two steps.

Practise with

PersonaEmailPasswordNote
memberfreya@demo.club freya-pass-123a seeded self-registered member — the end state of this workflow; register a fresh address of your own to practise
adminadmin@club.test admin123to look the new account up and read its audit trail

Steps 1–2 — Customer (Guest)

their manual →
  1. 1
    Open the registration form. Use an address nobody has used on this database.
    /register rbac
    Expected result Email, password, confirm and display name.
    Watch out for If you are already logged in this page redirects you to your account instead. Log out first or you will think it is broken.
  2. 2
    Submit the form.
    /auth/register POST rbac
    Expected result A user, a signed session cookie, the member group, and a redirect to your account page.
    Watch out for The failures are all server-side and all specific: a password under 8 characters is refused, a mismatched confirmation is refused, and an address already in use is refused even if that account is deactivated. The form re-renders with the message rather than losing what you typed.

Steps 3 — Member

their manual →

The account you just made — everything after the redirect is theirs, including the verification the first purchase waits on.

  1. 3
    Before opening your inbox, go to any event on sale and press Buy.
    /events/{event_id} identity
    Expected result The purchase is refused on the page you pressed it from, in a sentence naming what to do: confirm your email — the link is in your inbox, and the banner above will resend it. Nothing else about the account is restricted.
    Watch out for The gate applies only to accounts that were ASKED to verify — an unconsumed verify_email link. Seeded and legacy accounts predate verification and are deliberately untouched, so testing this needs an address you registered yourself. Walked by e2e/scenarios/test_wf_create_your_member_account.py.

Steps 4 — Customer (Guest)

their manual →
  1. 4
    Understand the returning path too: log out and log back in from the login form.
    /login core
    Expected result The same session cookie, and a redirect to wherever the next parameter pointed.
    Watch out for A wrong password gives one uniform message. The platform never tells you whether the address exists — that is deliberate, and it is why a 'no such account' message is a bug report, not a feature request.

Steps 5–6 — Member

their manual →

The account you just made — everything after the redirect is theirs, including the verification the first purchase waits on.

  1. 5
    Read your own account page: your groups, the door zones those groups give you, and your active sessions.
    /account rbac
    Expected result One grant — member — and the general zone.
    Watch out for Zones are computed from your live grants every time. They are not a field on your user row, which is why a group change moves your door access immediately.
  2. 6
    Open the member hub, which is where the platform expects you to live from now on.
    /my frontend
    Expected result Your next ticket, your orders, your credit and any announcement aimed at members.
    Watch out for The member portal is /my and /account. There is no /portal — if a document tells you otherwise, that document predates the build.

Steps 7–8 — Admin

their manual →

Confirms the automatic grant from the user record and the audit log.

  1. 7
    As an admin, open the new user and read their grant list.
    /admin/users/{user_id} rbac
    Expected result The member grant with the reason 'self_registration' and no granting actor.
    Watch out for A null actor means the system granted it. Every human-made grant on this page carries a required reason and the name of who typed it.
  2. 8
    Find the same event in the RBAC audit log.
    Expected result One grant row for the registration.
    Watch out for This table is append-only at the database level — the triggers abort an UPDATE or DELETE even from the admin data suite. Nobody can quietly rewrite who was given what.

Get your host account and event access

What approval actually creates: a draft event, your user account, and a grant scoped to one event id.

Owned by Host / Promoter · 9 steps · about 15 minutes

Why this exists

This is the moment you stop being an applicant and become a host, and it is worth knowing exactly what the platform does — because it does three things in a single transaction and none of them are done by hand.

Conversion takes your approved application and creates a draft event from it: the name, description and slot times are copied, and the ticket tiers are built from your tier estimates in order (the first opens as soon as the event goes on sale, later ones cascade behind it, with door zones inferred from the tier names). Then it creates-or-reuses your user account. Then it grants you the host role.

Nothing secret is ever put in your inbox. If you had no account, the one made for you is passwordless — it is created with a random hash nobody holds and password_set off — and you receive a magic sign-in link, the same identity machinery the rest of the platform uses. An older build mailed a plaintext temporary password; that was retired on 2026-08-19 after an audit, and the reason is worth carrying: a credential in an email is a credential in a mailbox, a mail server and this platform's own outbound log. Set a password once you are in, from your account page.

This branch is also nearly unreachable, which is why it is easy to be wrong about. Since the application form began requiring an account, every normally-filed application already has a user behind it and conversion simply reuses it. Only staff-entered edge paths land here.

That grant is the thing to understand. It is scoped: it carries an event_id, and every permission check asks "is this person a host of this event". You are not "a host" in general. Two promoters with host grants cannot see each other's events at all — not the dashboard, not the sales, not the guest list, not even the draft page.

And your account carries only that grant. Conversion does not make you a member, so member-only surfaces are not yours by default. Inside your own event you are effectively read-only: you can see it, see its sales, sign its contract and invite guests against the comp buckets allocated to you. You do not price it, transition it, refund it, or touch its money. That separation is what the contract is for — it is the record of what the venue agreed to do on your behalf.

Before you start

  • An approved application (approval and conversion are two separate staff actions).
  • Access to the email address on the application — the magic sign-in link goes there.

Practise with

PersonaEmailPasswordNote
host_promoterhost@club.test host123already holds a scoped host grant on demo-event-0001
venue_managermanager@club.test manager123runs the conversion
adminadmin@club.test admin123grants and revokes roles, and can read the audit trail behind them

Steps 1 — Venue Manager

their manual →

Runs the conversion that creates the event, your account and your scoped grant.

  1. 1
    From the approved application, press the convert button: create the draft event and grant the host role.
    /api/intake/applications/{app_id}/convert POST intake
    Expected result 201 with the new event id. In one transaction: a draft event with tiers built from the tier estimates, the host user (created if new), and a host grant carrying that event id. The application is stamped with the event and host user ids.
    Watch out for 409 application_not_approved if you skipped approval, and 409 already_converted with the existing event id inside the error message if someone beat you to it. It is all-or-nothing: there is no state where an event exists but the host cannot log in.

Steps 2–7 — Host / Promoter

their manual →
  1. 2
    Open the sign-in link from your email, or the login page if you already had an account.
    /login core
    Expected result The standard login form — there is no separate host portal. A brand-new host account has NO password: conversion creates it passwordless and sends a one-time sign-in link instead.
    Watch out for Nothing secret is ever mailed. The account is created with a random hash nobody holds and password_set off, and the link is the same identity machinery the rest of the platform uses — corrected here 2026-08-29, having still described the plaintext temporary password this workflow's own intent says was retired on 2026-08-19. If you already had an account under that email, no new one was created and no link was sent: you log in with the password you already had.
  2. 3
    Log in.
    /auth/login POST core
    Expected result A session. Your account carries exactly one grant: host, scoped to your event.
    Watch out for Set a password from your account page once you are in — a converted account starts without one. The link that got you here is single-use: a replayed one renders 'This link has already been used' rather than signing you in.
  3. 4
    Open your event dashboard by its direct URL. This is your home base for the whole run.
    /admin/events/{event_id} events
    Expected result The event details, its tiers, a live sales panel, the status log and recent platform events — with a banner reading 'Read-only view — management actions require the admin role.'
    Watch out for The events list at /admin/events is admin and venue manager only: you get a 403 there even though your own event's page opens fine. Bookmark the direct URL. Another promoter's event id is a 403, not a 404 — the platform does not pretend their event does not exist, it tells you it is not yours.
  4. 5
    Open the public page for your event to see what the world sees.
    /events/{event_id} events
    Expected result While the event is still draft, only you and staff can load this page.
    Watch out for Everyone else gets a plain 404 on a draft event — not a 403. Drafts are invisible, not forbidden. Once the contract is counter-signed the event is announced and the page is public.
  5. 6
    Check your other scoped surface: the guest list dashboard for your event.
    /admin/guestlist/{event_id} guestlist
    Expected result Your comp buckets and their entries — and only the buckets whose owner is you.
    Watch out for It is normal for this to be empty at first. Allocating a bucket to you is a venue decision and it happens separately.
  6. 7
    Learn the boundary before you hit it. Even on your own event you cannot create or change tiers, prices, capacity or the event status; you cannot refund an order, read the ledger, or take money outside the contracted royalty; and you cannot see any other event or any venue-wide report.
    Expected result 403 forbidden on every one of those, with a message naming the role required.
    Watch out for The one admin-shaped thing you can do is read your own event's sales figures. That is deliberate, and it is the subject of its own workflow.

Steps 8–9 — Admin

their manual →

Owns role grants and revocations — the only person who can fix a grant pointed at the wrong event.

  1. 8
    As an admin, open the host's user record and confirm the grant.
    /admin/users/{user_id} rbac
    Expected result The host group shown as a scoped chip carrying the event id, plus the audit rows behind the grant.
    Watch out for The grant's audit reason records which application approved it, so a grant can always be traced back to paperwork.
  2. 9
    Grant or re-grant a scoped host role by hand when a conversion went to the wrong account.
    /api/rbac/users/{user_id}/groups POST rbac
    Expected result 201 with the new grant, and an audit row naming you as the actor.
    Watch out for A host grant without an event id is meaningless and is rejected. Revoke the wrong grant rather than deleting the user — the revocation is part of the record.

Leave feedback on any part of the app

Turn on feedback mode, click the ✎ on the thing that is wrong, and watch it land in the review backlog.

Owned by Member · 9 steps · about 6 minutes

Why this exists

Feedback on this platform is not collected in a form on a contact page. It is attached to the thing you are complaining about: a note carries the page path, the element it was left on, a text snippet of what that element said, and the viewport width you were using. So "this is confusing" arrives already answering "what is, and where".

Why it is a mode and not an always-on click target. Every page is full of real links, buttons and forms. If clicking an element left a note, the app would be unusable. So you switch on feedback mode, and while it is on each block you hover grows a dashed outline and a ✎ button pinned to its corner. The ✎ lives in an overlay layer, never inside the block, which is why links and forms keep working normally while the mode is on. You click the pencil, never the element.

Why other people's notes are visible to you. The point is a shared review list. A per-person silo would produce five copies of "this heading is wrong" and no discussion, so on any page you can already open you see every note left on it, and you can reply. Two carve-outs keep that safe: notes on staff-only path prefixes (/admin, /debug, /scanner) are readable by employees only, because a captured snippet from an admin grid can contain other members' data; and a single setting narrows every non-staff surface to "your own notes" if this instance ever holds real user data.

Anchors are allowed to go stale, on purpose. A note points at an element with a generated CSS selector. Redesign the page and the element may be gone — the note is then flagged unanchored and kept, never deleted, because "the thing I complained about no longer exists" is usually the signal that it was fixed. The same applies to notes pinned to a moment in a workflow clip: re-record the clip and the note re-anchors to the same numbered step, or is flagged as an orphan if the step is gone.

Before you start

  • A signed-in session — any role. The overlay is not rendered for anonymous visitors.
  • Nothing else. Feedback mode is available on every page of the app.

Practise with

PersonaEmailPasswordNote
membermember@club.test member123can leave feedback and see their own backlog
venue_managermanager@club.test manager123can triage and export the whole backlog

Steps 1–6 — Member

their manual →
  1. 1
    Open any page of the app. Find the ✎ Feedback pill at the bottom-right of the window — it is on every page while you are signed in. The number on it, when there is one, is how many notes already exist on this page.
    /events annotations
    Expected result A labelled pill in the bottom-right corner, plus a menu entry under Feedback in the site menu.
    Watch out for It steps above a page that owns the bottom of the window (the contract signing bar, for example) rather than covering it.
  2. 2
    Click the pill, then choose Start leaving feedback. The keyboard shortcut Shift+A does the same thing from anywhere. The pill turns solid and reads Feedback: ON.
    /api/annotations/mode POST annotations
    Expected result A one-time hint explains the gesture, and the mode sticks: it is stored per user, so it is still on when you open the next page.
    Watch out for It is a per-user preference, not a per-page one. Turn it off when you are done or every page keeps outlining blocks as you hover.
  3. 3
    Hover the thing you want to talk about — a heading, a card, a table, a form. It gets a dashed outline. Click the that appears in its top-right corner: the pencil, not the element.
    Expected result A small compose popover opens next to that block.
    Watch out for Clicking the block itself does what it always did — follows the link, submits the form. That is deliberate.
  4. 4
    Write what is wrong, missing or confusing. Pick a category (bug / copy / layout / feature / question) and a priority, then save. Ctrl or Cmd + Enter saves; Esc cancels.
    /api/annotations POST annotations
    Expected result A numbered marker appears on that block. The numbers are assigned server-side, so everyone reviewing the page sees the same ones.
    Watch out for Notes are shared, and on this demo deployment the admin login is published in the banner — do not put anything sensitive in a note.
  5. 5
    Watching a recorded workflow clip instead of using a page? Press n while it plays. The video pauses, the current frame is captured, and the note is pinned to that workflow step and millisecond.
    /clips/{workflow_slug} clips
    Expected result The backlog item carries the workflow, step label, timestamp and a thumbnail, and links back into the player at that moment.
  6. 6
    Review what you have said: open Feedback in the site menu. That page is your own slice — notes you wrote, notes assigned to you, and notes you replied to — filterable by status.
    /my/annotations annotations
    Expected result Your notes, newest activity first, with their status and replies.
    Watch out for This is not the whole backlog. Staff triage the shared queue elsewhere; you only ever see what you are involved in here.

Steps 7–9 — Venue Manager

their manual →

Triages what comes in: sets priority, category and assignee, and exports the build list.

  1. 7
    Open the shared review queue from Feedback Review in the site menu. Filter by page, status, priority, category, anchor health, author or free text; the page-counts table shows where the complaints cluster.
    /admin/annotations annotations
    Expected result Every non-deleted note in the app, in one triageable list.
    Watch out for A note whose page column is shown as plain text rather than a link is a clip note: that value is the route pattern the step was on, not a page you can open.
  2. 8
    Open one note. Change its status through the pipeline, set priority and category, assign it to somebody, and reply in the thread.
    /admin/annotations/{annotation_id} POST annotations
    Expected result Every change is written to an append-only audit trail shown on the same page.
    Watch out for You may triage someone's note but never rewrite its body — only the author or an admin can edit the words. Deleting across authors, and restoring, are admin-only.
  3. 9
    Export the current filter set as a Markdown checklist, CSV or JSON. The Markdown one is a build list you can paste straight into a tracker.
    Expected result A downloaded file covering exactly the rows your filters selected, and an export entry in the audit trail.
    Watch out for Exports are attachments with nosniff, and CSV cells that begin with = + - or @ are prefixed with an apostrophe — spreadsheet formula injection is a real risk with user-written text.

Manage your account, password and sessions

Change your password, see every device you are signed in on, and sign the others out.

Owned by Member · 6 steps · about 10 minutes

Why this exists

Account self-service on this platform is built around one rule: a member may see and end their own sessions, and nothing else. There is no self-service delete, no self-service group request, and no way to look at anyone else's anything.

The password change is the interesting part. Changing your password revokes every other session immediately and keeps only the one you are using. That is the built behaviour of "my account is compromised": one action, all other devices out, no waiting for a token to expire. Sessions are re-read on every request, so a revocation is effective on the very next click rather than at the next login.

The step that surprises people is deactivation, which only an admin can do. Deactivating an account does not just block login — it revokes every live door pass the user holds, blacklists the serials and pushes a void to their wallet. A pass never authenticates a session, so without that step a banned member's phone would keep opening doors for months.

Before you start

  • A member session (any registered account).
  • An admin session for the participant steps.

Practise with

PersonaEmailPasswordNote
membermember@club.test member123if you change this password, change it back — other workflows use it
adminadmin@club.test admin123grants, revokes and deactivations

Steps 1–4 — Member

their manual →
  1. 1
    Open your account page and read the three blocks: profile, grants and zones, active sessions.
    /account rbac
    Expected result One row per live session with where and when it was created, and your current one marked.
  2. 2
    Look at the same facts as JSON — it is the cleanest way to see what the server thinks you are.
    /auth/me rbac
    Expected result Your user, your groups with any event scope, your zones both global and per event, and your session expiry.
    Watch out for A scoped grant (a host on one event) contributes zones only for that event. Globally it contributes nothing, which is why a promoter's card does not open the building on someone else's night.
  3. 3
    Change your password. You need the current one.
    /auth/password POST rbac
    Expected result Success, and every other session of yours is signed out on the spot.
    Watch out for A wrong current password is a 401 and nothing changes. And be deliberate on a shared demo database: the seeded logins are documented in this manual, so changing one breaks the next trainee.
  4. 4
    Sign out one specific session — the laptop you left at a friend's flat.
    /auth/sessions/{session_id}/revoke POST rbac
    Expected result That session dies immediately; the list refreshes without it.
    Watch out for You can only revoke your own sessions; someone else's id is a 404, not a 403, so ids cannot be probed. Revoking the session you are currently using logs you out and drops you at the home page.

Steps 5–6 — Admin

their manual →

Owns everything a member cannot do to their own account: groups, deactivation, forced sign-out.

  1. 5
    As an admin, open a member and look at what only you can do: grant or revoke a group with a written reason, force every session out, deactivate.
    /admin/users/{user_id} rbac
    Expected result The grant timeline, the session list and the deactivate control.
    Watch out for A reason is required on every grant and revoke. This is enforced by the service, not the form — the API refuses a blank reason too.
  2. 6
    Deactivate a throwaway account and then look at the access dashboard.
    /admin/access access
    Expected result The user's passes appear in the revocation list with a wallet void recorded against them.
    Watch out for Pass revocation is terminal. Reactivating the account re-mints a membership card but does NOT bring event-ticket passes back — those tickets need re-issuing. Never deactivate an account as a way of 'pausing' someone.

Find your way around as staff

The five screens an employee actually uses, and the long list of things employees do not do.

Owned by Venue Manager · 11 steps · about 12 minutes

Why this exists

There are two employee roles on this platform and one idea behind both of them: operations are separated from money and identity. An employee can run a night — admit people, chase a guest list, watch the sales board, post to social — without ever being able to move a cent, grant themselves a role, or bind the venue to a contract. That separation is what lets you hire a manager on Monday and put them on the floor on Tuesday.

The role model has three moving parts worth learning once. First, venue_manager implies door_staff: a manager silently has every door permission as well, so you never have to hold two logins. Second, employee is a pseudo-group — it is not a role anybody is granted, it is a gate that means door_staff or venue_manager or admin, and it is what opens the scanner. Third, admin is a superuser: an admin passes every group check, which is why so many of the surfaces below say admin-only rather than listing exceptions.

The most common new-starter mistake is assuming that because a page is under the admin URL prefix, a manager can open it. Some can, some cannot, and the split is not cosmetic. /admin itself — the platform hub card page — is admin-only. So are the ledger, the tax office, payouts, refunds, the universal data suite, role management, and every write that changes an event's status, tiers or prices. Learn the boundary now and you will stop filing tickets about 403s that are working as intended.

The one thing no employee ever does is author an event. Events come from host applications and from admins; a manager reviews, converts and then monitors. If you came here looking for how an event is built, you want the Host / Promoter manual instead.

Before you start

  • A seeded database (run the seed once so the demo readers, event and applications exist).
  • A door staff or venue manager login.

Practise with

PersonaEmailPasswordNote
venue_managermanager@club.test manager123shift lead: implies door_staff, plus intake, sales, guest list, marketing
door_staffdoor@club.test door123door shift account: scanner + guest list, nothing else
adminadmin@club.test admin123the only account that can touch money, identity and contracts

Steps 1–7 — Venue Manager

their manual →
  1. 1
    Sign in as the manager and open the scanner. This is the surface every employee shares — it is gated to the employee pseudo-group, so door staff, managers and admins all land here.
    /scanner access
    Expected result The Door Scanner page with a reader picker, a scan box and a Recent scans table.
    Watch out for If you get a 403 here, you are signed in as a member or a host, not as staff. Employee is not a group you can be granted — check which of door_staff / venue_manager / admin you actually hold.
  2. 2
    Follow the Guest list search link at the bottom of the scanner. Pick an event from the dropdown so the page has something to search.
    /scanner/guestlist guestlist
    Expected result The Guest List — Door page with a search box and an override counter reading overrides used / cap.
    Watch out for The event dropdown only lists events in announced, on_sale, sold_out or in_progress. A draft event never appears here, and that is deliberate — you cannot check people into a night that has not been announced.
  3. 3
    Open the host application queue. This is the first surface that is yours and not the door's.
    /admin/intake intake
    Expected result A six-column pipeline board with viability scores and status filters.
    Watch out for Door staff get a 403 here. Deciding what goes on the calendar is not a door decision.
  4. 4
    Open the events list — your live sales board.
    /admin/events events
    Expected result Every event with its status and sales figures.
    Watch out for You can read this and every event dashboard behind it, but the edit controls are hidden: the page computes an edit flag that is true only for admins. Creating an event, changing its status, and editing tiers or prices are all admin-only writes.
  5. 5
    Open the marketing dashboard, the last of your five core screens.
    /admin/marketing marketing
    Expected result Channels, recent posts and scheduled posts.
    Watch out for You can compose, schedule, publish, cancel and retry posts. You cannot enable or disable a channel or change its handle, and you cannot delete a post — those are admin writes.
  6. 6
    Understand what is NOT yours: you do not author events. Read the Host / Promoter manual to see where events actually come from — an application, a viability review, an approval, a signed contract, then a draft event.
    Expected result The host manual, with the event-creation workflows listed under their own owner.
    Watch out for A promoter asking you to 'just add a date' is asking for something no employee role can do. The answer is an application, or an admin.
  7. 7
    Memorise the 403 list rather than discovering it at 1am. As a manager you are refused on: the platform admin hub, the ledger and trial balance, the tax office, payouts and refunds, role grants and revocations, the universal data suite and its audit log, event status transitions, tier and price edits, contract section and rider edits, contract lock and countersign, reader provisioning and signing-key rotation, guest-list door-override settings, marketing channel settings, and the intake settings page.
    Expected result A clear mental line: you run the night, an admin runs the money and the identities.
    Watch out for Being refused is not a bug report. If you genuinely need one of these, the answer is to get an admin, not to get your role changed.

Steps 8–9 — Door Staff

their manual →

Learns the two screens their role actually opens, and what a 403 there means.

  1. 8
    As door staff, sign in and confirm your world is two screens: this one and the guest list. Everything else you will try is a 403.
    /scanner access
    Expected result The scanner, with the offline bundle control replaced by a badge reading bundle: manager only.
    Watch out for You cannot download the offline bundle or watch the push feed from a browser. Both ship every pass secret for the venue, so they need a manager session or a provisioned reader's own device token.
  2. 9
    Try the guest-list admin index once so you know what the refusal looks like.
    /admin/guestlist guestlist
    Expected result A 403. Allocating comps is a manager or admin job; checking them in is yours.
    Watch out for Door staff DO have read access to a specific event's guest-list dashboard when they open it directly, but not to this index. Work from /scanner/guestlist during a shift — it is the screen built for your job.

Steps 10–11 — Admin

their manual →

Owns everything on the money-and-identity side of the boundary this workflow teaches.

  1. 10
    As an admin, open the platform hub to see the other side of the boundary — every card here is a surface no employee reaches.
    /admin adminsuite
    Expected result The admin dashboard with module cards, including Training Manual.
    Watch out for This page is admin-only. If you are writing a runbook for managers, never send them here; send them to the specific screen their role can open.
  2. 11
    Look at the group list and the zones each group maps to, so you can answer the question 'why did the door say wrong zone'.
    Expected result Groups with their zone mappings.
    Watch out for venue_manager implies door_staff and vip_member implies member. Granting venue_manager therefore hands over the whole door as well — that is intended, but it means there is no such thing as a manager who cannot scan.

Appendix A — Persona ↔ RBAC group

PersonaRBAC groupAuthenticatedScoped OwnsTakes part in
Customer (Guest) no no 4 2
Member member yes no 13 18
VIP Member vip_member yes no 2 7
Host / Promoter host yes yes 11 11
Door Staff door_staff yes no 5 14
Venue Manager venue_manager yes no 17 24
Admin admin yes no 24 43

Appendix B — Route index

Every application route this manual references, and the workflows that use it. A test asserts each of these resolves against the mounted router, so the manual cannot silently rot when a route moves.

RouteUsed by
DELETE /api/admin/resale/events/{event_id}/lock open-or-close-the-exchange
DELETE /api/guestlist/buckets/{bucket_id} allocate-comps-to-a-promoter
DELETE /api/reservations/{reservation_id} hold-a-checkout-reservation
DELETE /debug/mock-behaviors/{behavior_id} script-a-mock-failure
GET / browse-events-as-a-guest, buy-a-ticket
GET /account convert-an-application-into-an-event, grant-and-revoke-roles, build-a-role-from-capabilities, create-your-member-account, manage-your-account-and-sessions
GET /account/passes read-the-scanner-screen, diagnose-a-red-scan, map-groups-to-door-zones, self-cancel-a-ticket, add-your-ticket-to-your-wallet, use-your-membership-card-at-the-bar, resell-a-ticket-you-cant-use, buy-a-resale-ticket, claim-your-comp-invite, get-through-the-door
GET /admin find-your-way-around-as-staff, edit-any-row-with-admin-crud, find-anything-in-admin
GET /admin/access read-the-scanner-screen, diagnose-a-red-scan, run-the-door-offline, map-groups-to-door-zones, manage-your-account-and-sessions, add-your-ticket-to-your-wallet, get-through-the-door, scan-guests-at-the-door, find-anything-in-admin
GET /admin/annotations leave-feedback-on-the-app, run-the-feedback-backlog, preview-the-site-as-a-guest
GET /admin/annotations/export leave-feedback-on-the-app, run-the-feedback-backlog
GET /admin/annotations/{annotation_id} run-the-feedback-backlog, preview-the-site-as-a-guest
GET /admin/announcements get-into-a-member-only-drop
GET /admin/audit grant-and-revoke-roles, deactivate-a-user, create-your-member-account
GET /admin/capabilities build-a-role-from-capabilities
GET /admin/contract-riders author-a-rider-so-a-host-can-ask-for-it
GET /admin/contract-riders/new author-a-rider-so-a-host-can-ask-for-it
GET /admin/contract-riders/recent author-a-rider-so-a-host-can-ask-for-it
GET /admin/contract-riders/{rider_key} author-a-rider-so-a-host-can-ask-for-it
GET /admin/contracts review-the-riders-approval-created, sign-and-countersign-a-contract, approve-a-host-application
GET /admin/contracts/{contract_id} review-the-riders-approval-created, sign-and-countersign-a-contract, create-and-launch-an-event, approve-a-host-application
GET /admin/credit/users/{user_id} post-a-house-credit-adjustment, pay-with-house-credit
GET /admin/data edit-any-row-with-admin-crud
GET /admin/data/audit edit-any-row-with-admin-crud, delete-rows-safely
GET /admin/data/ledger_entries edit-any-row-with-admin-crud, read-the-trial-balance
GET /admin/data/qa_invariant_violations run-the-qa-invariant-sweep
GET /admin/data/sandbox_parents edit-any-row-with-admin-crud
GET /admin/data/{table}/new edit-any-row-with-admin-crud
GET /admin/data/{table}/{pk} edit-any-row-with-admin-crud, delete-rows-safely
GET /admin/events find-your-way-around-as-staff, monitor-live-sales-on-the-night, understand-your-events-tiers-and-releases
GET /admin/events/backload understand-your-events-tiers-and-releases
GET /admin/events/{event_id} monitor-live-sales-on-the-night, convert-an-application-into-an-event, grant-and-revoke-roles, get-into-a-member-only-drop, get-your-host-account-and-event-access, understand-your-events-tiers-and-releases, watch-your-event-sell-live, create-and-launch-an-event
GET /admin/events/{event_id}/record keep-the-permanent-event-record
GET /admin/events/{event_id}/record/documents/{doc_id} keep-the-permanent-event-record
GET /admin/events/{event_id}/refund-policy refund-a-ticket-or-order, self-cancel-a-ticket
GET /admin/groups find-your-way-around-as-staff, map-groups-to-door-zones, build-a-role-from-capabilities
GET /admin/groups/new build-a-role-from-capabilities
GET /admin/groups/{slug} build-a-role-from-capabilities
GET /admin/guestlist find-your-way-around-as-staff, allocate-comps-to-a-promoter
GET /admin/guestlist/{event_id} check-in-a-guest-from-the-list, issue-a-vip-walk-in-override, allocate-comps-to-a-promoter, revoke-a-comp, get-your-host-account-and-event-access, invite-a-guest-and-track-plus-ones
GET /admin/intake find-your-way-around-as-staff, convert-an-application-into-an-event, apply-to-host-an-event, build-your-run-of-show-backwards, create-and-launch-an-event, approve-a-host-application, run-the-staff-channel-on-live-telegram
GET /admin/intake/rider-requests author-a-rider-so-a-host-can-ask-for-it
GET /admin/intake/{app_id} fast-track-from-telegram, review-the-riders-approval-created, convert-an-application-into-an-event, apply-to-host-an-event, re-apply-with-autofill, respond-to-a-request-for-more-information, author-a-rider-so-a-host-can-ask-for-it, build-your-run-of-show-backwards, create-and-launch-an-event, approve-a-host-application, run-the-staff-channel-on-live-telegram
GET /admin/ledger read-the-trial-balance, reconcile-tax-accruals, top-up-your-house-credit, read-your-credit-statement, run-the-quarterly-tax-filing
GET /admin/ledger/transactions refund-a-ticket-or-order, read-the-trial-balance, process-a-payout-run, run-the-vip-tab-settlement, reconcile-tax-accruals, pay-with-house-credit, use-and-settle-your-vip-tab
GET /admin/ledger/transactions/{txn_id} post-a-house-credit-adjustment, read-the-trial-balance, top-up-your-house-credit
GET /admin/marketing find-your-way-around-as-staff, compose-and-publish-a-social-post, configure-marketing-channels-and-rules
GET /admin/marketing/events/{event_id} compose-and-publish-a-social-post, build-a-trigger-rule, configure-marketing-channels-and-rules
GET /admin/marketing/events/{event_id}/rules/new build-a-trigger-rule, configure-marketing-channels-and-rules
GET /admin/marketing/posts/new compose-and-publish-a-social-post
GET /admin/marketing/posts/{post_id} compose-and-publish-a-social-post, build-a-trigger-rule
GET /admin/marketing/reports trace-a-click-to-revenue, report-marketing-attribution
GET /admin/marketing/rules/{rule_id}/edit build-a-trigger-rule
GET /admin/orders monitor-live-sales-on-the-night, refund-a-ticket-or-order, watch-your-event-sell-live
GET /admin/orders/{order_id} diagnose-a-red-scan, monitor-live-sales-on-the-night, trace-a-click-to-revenue, refund-a-ticket-or-order, self-cancel-a-ticket, buy-a-ticket
GET /admin/payouts process-a-payout-run, get-paid-your-host-royalty
GET /admin/qa run-the-qa-invariant-sweep
GET /admin/records keep-the-permanent-event-record
GET /admin/records/devices keep-the-permanent-event-record
GET /admin/records/metrics keep-the-permanent-event-record
GET /admin/resale open-or-close-the-exchange
GET /admin/resale/{event_id} open-or-close-the-exchange, resell-a-ticket-you-cant-use, get-paid-your-host-royalty, buy-a-resale-ticket, understand-your-credit-and-the-exchange
GET /admin/tab-settlements script-a-mock-failure, run-the-vip-tab-settlement, use-and-settle-your-vip-tab
GET /admin/tax approve-a-filing-from-telegram, reconcile-tax-accruals, run-the-quarterly-tax-filing
GET /admin/tax/periods/{period_id} approve-a-filing-from-telegram, run-the-quarterly-tax-filing
GET /admin/tax/rates maintain-the-tax-rate-matrix
GET /admin/tax/settings approve-a-filing-from-telegram
GET /admin/telegram run-the-staff-channel-on-live-telegram
GET /admin/users grant-and-revoke-roles
GET /admin/users/{user_id} convert-an-application-into-an-event, grant-and-revoke-roles, deactivate-a-user, build-a-role-from-capabilities, create-your-member-account, manage-your-account-and-sessions, use-your-membership-card-at-the-bar, get-your-host-account-and-event-access
GET /admin/venues set-up-a-venue-and-its-door-zones
GET /admin/venues/new set-up-a-venue-and-its-door-zones
GET /admin/venues/{slug} set-up-a-venue-and-its-door-zones
GET /admin/venues/{venue_id}/layout draw-a-venue-map
GET /api/access/passes/mine add-your-ticket-to-your-wallet
GET /api/access/passes/{pass_id}/gpass add-your-ticket-to-your-wallet
GET /api/access/passes/{pass_id}/pkpass add-your-ticket-to-your-wallet, get-through-the-door
GET /api/access/passes/{pass_id}/qr read-the-scanner-screen, add-your-ticket-to-your-wallet, use-your-membership-card-at-the-bar, get-through-the-door
GET /api/access/scan-logs read-the-scanner-screen, diagnose-a-red-scan, run-the-door-offline, monitor-live-sales-on-the-night, get-through-the-door, scan-guests-at-the-door
GET /api/access/sync/bundle run-the-door-offline, scan-guests-at-the-door
GET /api/access/sync/push run-the-door-offline
GET /api/access/tickets/{ticket_id}/secret add-your-ticket-to-your-wallet
GET /api/admin/data/{table}/rows/{pk}/dependencies delete-rows-safely
GET /api/admin/events/{event_id}/reservations monitor-live-sales-on-the-night, hold-a-checkout-reservation, watch-your-event-sell-live
GET /api/admin/events/{event_id}/sales monitor-live-sales-on-the-night, watch-your-event-sell-live
GET /api/admin/ledger/accounts read-the-trial-balance
GET /api/admin/ledger/transactions read-the-trial-balance
GET /api/admin/ledger/trial-balance read-the-trial-balance
GET /api/admin/ledger/users/{user_id} post-a-house-credit-adjustment
GET /api/admin/refunds refund-a-ticket-or-order
GET /api/admin/resale/settlements get-paid-your-host-royalty
GET /api/annotations/list run-the-feedback-backlog
GET /api/annotations/pages run-the-feedback-backlog
GET /api/contracts/riders/selectable author-a-rider-so-a-host-can-ask-for-it
GET /api/credit/balance pay-with-house-credit, top-up-your-house-credit, read-your-credit-statement, get-paid-your-host-royalty, use-and-settle-your-vip-tab
GET /api/credit/statement read-your-credit-statement
GET /api/events/{event_id}/availability browse-events-as-a-guest, get-into-a-member-only-drop, understand-your-events-tiers-and-releases
GET /api/events/{event_id}/refund-policy self-cancel-a-ticket
GET /api/events/{event_id}/zones set-up-a-venue-and-its-door-zones
GET /api/guestlist/door/{event_id}/search check-in-a-guest-from-the-list, allocate-comps-to-a-promoter, claim-your-comp-invite
GET /api/guestlist/events/{event_id}/buckets allocate-comps-to-a-promoter, revoke-a-comp, invite-a-guest-and-track-plus-ones
GET /api/guestlist/events/{event_id}/entries invite-a-guest-and-track-plus-ones
GET /api/guestlist/events/{event_id}/overrides issue-a-vip-walk-in-override
GET /api/guestlist/events/{event_id}/settings issue-a-vip-walk-in-override
GET /api/intake/public/applications/{app_id}/edit respond-to-a-request-for-more-information
GET /api/marketing/channels configure-marketing-channels-and-rules
GET /api/marketing/links trace-a-click-to-revenue, report-marketing-attribution
GET /api/marketing/reports/channels trace-a-click-to-revenue, report-marketing-attribution
GET /api/marketing/reports/events/{event_id} trace-a-click-to-revenue, report-marketing-attribution
GET /api/marketing/rules/{rule_id}/firings build-a-trigger-rule, configure-marketing-channels-and-rules
GET /api/rbac/groups grant-and-revoke-roles
GET /api/rbac/matrix build-a-role-from-capabilities
GET /api/rbac/users/{user_id}/capabilities build-a-role-from-capabilities
GET /api/records/compare keep-the-permanent-event-record
GET /api/records/{event_id}/seal-check keep-the-permanent-event-record
GET /api/records/{event_id}/verify keep-the-permanent-event-record
GET /api/resale/events/{event_id} buy-a-resale-ticket
GET /api/resale/my/purchases buy-a-resale-ticket
GET /api/reservations/{reservation_id} hold-a-checkout-reservation
GET /api/tax/agencies maintain-the-tax-rate-matrix
GET /api/tax/documents/{doc_id} approve-a-filing-from-telegram
GET /api/tax/liability reconcile-tax-accruals, run-the-quarterly-tax-filing
GET /api/tax/periods reconcile-tax-accruals
GET /api/tax/quote maintain-the-tax-rate-matrix
GET /api/tax/rates maintain-the-tax-rate-matrix
GET /api/venues/{venue_id}/zones set-up-a-venue-and-its-door-zones
GET /apply/edit/{token} fast-track-from-telegram, respond-to-a-request-for-more-information, author-a-rider-so-a-host-can-ask-for-it, build-your-run-of-show-backwards, approve-a-host-application
GET /apply/thanks/{app_id} apply-to-host-an-event, re-apply-with-autofill, build-your-run-of-show-backwards, create-and-launch-an-event
GET /auth/me manage-your-account-and-sessions
GET /cart hold-a-checkout-reservation
GET /checkout/{order_id} hold-a-checkout-reservation, pay-with-house-credit, get-into-a-member-only-drop, buy-a-ticket, use-and-settle-your-vip-tab
GET /clips/{workflow_slug} leave-feedback-on-the-app
GET /contracts/{contract_id}/preview review-the-riders-approval-created
GET /contracts/{contract_id}/redlines review-the-riders-approval-created, sign-and-countersign-a-contract
GET /contracts/{contract_id}/sealed sign-and-countersign-a-contract
GET /debug use-the-debug-console
GET /debug/access/totp/{ticket_id} diagnose-a-red-scan
GET /debug/adminsuite/dependencies delete-rows-safely
GET /debug/adminsuite/policies edit-any-row-with-admin-crud
GET /debug/annotations/audit run-the-feedback-backlog
GET /debug/annotations/orphans run-the-feedback-backlog
GET /debug/audit use-the-debug-console, script-a-mock-failure
GET /debug/events/reservations/sweep-preview hold-a-checkout-reservation
GET /debug/events/{event_id}/state watch-your-event-sell-live
GET /debug/frontend/preview preview-the-site-as-a-guest
GET /debug/frontend/preview/gate preview-the-site-as-a-guest
GET /debug/guestlist/audit/{event_id} check-in-a-guest-from-the-list
GET /debug/intake/deeplinks run-the-staff-channel-on-live-telegram
GET /debug/intake/rate-limits re-apply-with-autofill
GET /debug/intake/timeline build-your-run-of-show-backwards
GET /debug/intake/timeline-render/{app_id} build-your-run-of-show-backwards
GET /debug/intake/tz build-your-run-of-show-backwards
GET /debug/ledger/integrity post-a-house-credit-adjustment, read-the-trial-balance
GET /debug/marketing/links/{short_code} trace-a-click-to-revenue, report-marketing-attribution
GET /debug/marketing/outbound configure-marketing-channels-and-rules
GET /debug/mock-behaviors script-a-mock-failure
GET /debug/outbound-calls fast-track-from-telegram, use-the-debug-console, script-a-mock-failure, approve-a-filing-from-telegram, apply-to-host-an-event, run-the-staff-channel-on-live-telegram
GET /debug/qa/health run-the-qa-invariant-sweep
GET /debug/qa/invariants run-the-qa-invariant-sweep
GET /debug/qa/invariants/runs run-the-qa-invariant-sweep
GET /debug/qa/journeys run-the-qa-invariant-sweep
GET /debug/rbac/graph build-a-role-from-capabilities
GET /debug/rbac/pass-refresh-queue build-a-role-from-capabilities
GET /debug/rbac/state grant-and-revoke-roles, deactivate-a-user
GET /debug/rbac/zones map-groups-to-door-zones
GET /debug/record/verify-all keep-the-permanent-event-record
GET /debug/record/{event_id} keep-the-permanent-event-record
GET /debug/resale/integrity/{event_id} open-or-close-the-exchange
GET /debug/resale/split-preview open-or-close-the-exchange, resell-a-ticket-you-cant-use
GET /debug/scheduler/runs use-the-debug-console
GET /debug/settings use-the-debug-console
GET /debug/state use-the-debug-console
GET /debug/tax/rate-resolution maintain-the-tax-rate-matrix
GET /debug/tax/reconcile reconcile-tax-accruals
GET /debug/telegram/webhook-info run-the-staff-channel-on-live-telegram
GET /debug/venues/zone-map set-up-a-venue-and-its-door-zones
GET /events build-a-role-from-capabilities, browse-events-as-a-guest, leave-feedback-on-the-app, preview-the-site-as-a-guest, buy-a-ticket
GET /events/{event_id} monitor-live-sales-on-the-night, build-a-trigger-rule, browse-events-as-a-guest, create-your-member-account, get-into-a-member-only-drop, sign-and-countersign-a-contract, get-your-host-account-and-event-access, understand-your-events-tiers-and-releases, watch-your-event-sell-live, preview-the-site-as-a-guest, create-and-launch-an-event, buy-a-ticket, understand-your-credit-and-the-exchange
GET /events/{event_id}/buy browse-events-as-a-guest
GET /events/{event_id}/checkout hold-a-checkout-reservation, get-into-a-member-only-drop, buy-a-ticket
GET /events/{event_id}/exchange open-or-close-the-exchange, buy-a-resale-ticket, get-paid-your-host-royalty, understand-your-credit-and-the-exchange
GET /exchange browse-events-as-a-guest, buy-a-resale-ticket
GET /guestlist/claim/{token} claim-your-comp-invite, invite-a-guest-and-track-plus-ones
GET /host/apply browse-events-as-a-guest, apply-to-host-an-event, re-apply-with-autofill, author-a-rider-so-a-host-can-ask-for-it, build-your-run-of-show-backwards, create-and-launch-an-event
GET /l/{short_code} trace-a-click-to-revenue, report-marketing-attribution
GET /login deactivate-a-user, browse-events-as-a-guest, create-your-member-account, get-your-host-account-and-event-access
GET /me/comps claim-your-comp-invite
GET /my create-your-member-account, get-into-a-member-only-drop, preview-the-site-as-a-guest
GET /my/annotations leave-feedback-on-the-app, run-the-feedback-backlog
GET /my/credit refund-a-ticket-or-order, run-the-vip-tab-settlement, open-or-close-the-exchange, pay-with-house-credit, self-cancel-a-ticket, use-your-membership-card-at-the-bar, resell-a-ticket-you-cant-use, top-up-your-house-credit, read-your-credit-statement, get-paid-your-host-royalty, buy-a-ticket, use-and-settle-your-vip-tab, understand-your-credit-and-the-exchange
GET /my/credit/payouts process-a-payout-run, get-paid-your-host-royalty, understand-your-credit-and-the-exchange
GET /my/credit/statement post-a-house-credit-adjustment, pay-with-house-credit, top-up-your-house-credit, read-your-credit-statement, get-paid-your-host-royalty, use-and-settle-your-vip-tab
GET /my/orders self-cancel-a-ticket
GET /my/orders/{order_id} refund-a-ticket-or-order, self-cancel-a-ticket
GET /my/tickets add-your-ticket-to-your-wallet, resell-a-ticket-you-cant-use, buy-a-ticket, get-through-the-door, understand-your-credit-and-the-exchange
GET /register create-your-member-account, buy-a-ticket
GET /resale/my/listings resell-a-ticket-you-cant-use, understand-your-credit-and-the-exchange
GET /resale/sell/{ticket_id} open-or-close-the-exchange, resell-a-ticket-you-cant-use, understand-your-credit-and-the-exchange
GET /scanner find-your-way-around-as-staff, read-the-scanner-screen, diagnose-a-red-scan, run-the-door-offline, revoke-a-comp, grant-and-revoke-roles, map-groups-to-door-zones, deactivate-a-user, get-through-the-door, scan-guests-at-the-door
GET /scanner/guestlist find-your-way-around-as-staff, diagnose-a-red-scan, check-in-a-guest-from-the-list, issue-a-vip-walk-in-override, invite-a-guest-and-track-plus-ones, scan-guests-at-the-door
GET /sign/{token} sign-and-countersign-a-contract, create-and-launch-an-event
GET /sign/{token}/status sign-and-countersign-a-contract
GET /training/role/host_promoter find-your-way-around-as-staff
GET /ui/preview preview-the-site-as-a-guest
GET /venues/{venue_id}/map draw-a-venue-map
PATCH /api/admin/data/{table}/rows/{pk} edit-any-row-with-admin-crud
PATCH /api/contracts/riders/{rider_key} author-a-rider-so-a-host-can-ask-for-it
PATCH /api/guestlist/buckets/{bucket_id} allocate-comps-to-a-promoter
PATCH /api/marketing/channels/{platform} compose-and-publish-a-social-post, configure-marketing-channels-and-rules
PATCH /api/marketing/posts/{post_id} compose-and-publish-a-social-post
PATCH /api/tax/rates/{rate_id} maintain-the-tax-rate-matrix
PATCH /api/tiers/{tier_id} understand-your-events-tiers-and-releases
PATCH /api/venues/{venue_id}/zones/{zone_id} set-up-a-venue-and-its-door-zones
PATCH /contracts/{contract_id}/sections/{section_id} review-the-riders-approval-created
PATCH /contracts/{contract_id}/variables review-the-riders-approval-created
POST /admin/annotations/{annotation_id} leave-feedback-on-the-app, run-the-feedback-backlog
POST /admin/annotations/{annotation_id}/delete run-the-feedback-backlog
POST /admin/annotations/{annotation_id}/reply run-the-feedback-backlog
POST /admin/annotations/{annotation_id}/restore run-the-feedback-backlog
POST /admin/announcements get-into-a-member-only-drop
POST /admin/venues/new set-up-a-venue-and-its-door-zones
POST /api/access/membership-card use-your-membership-card-at-the-bar
POST /api/access/readers run-the-door-offline, scan-guests-at-the-door
POST /api/access/readers/{reader_id}/rotate-token run-the-door-offline
POST /api/access/scan read-the-scanner-screen, use-your-membership-card-at-the-bar, resell-a-ticket-you-cant-use, buy-a-resale-ticket, get-through-the-door, scan-guests-at-the-door
POST /api/access/scan/batch run-the-door-offline
POST /api/admin/credit/users/{user_id}/kyc/revoke process-a-payout-run
POST /api/admin/data/{table}/delete delete-rows-safely
POST /api/admin/data/{table}/rows/{pk}/restore delete-rows-safely
POST /api/admin/events/{event_id}/refund-all refund-a-ticket-or-order
POST /api/admin/ledger/adjustments post-a-house-credit-adjustment, read-your-credit-statement
POST /api/admin/orders/{order_id}/refunds refund-a-ticket-or-order
POST /api/admin/payouts/{payout_id}/process process-a-payout-run, get-paid-your-host-royalty
POST /api/admin/resale/events/{event_id}/lock open-or-close-the-exchange
POST /api/admin/tab-settlements/run run-the-vip-tab-settlement, use-and-settle-your-vip-tab
POST /api/admin/tab-settlements/{settlement_id}/retry run-the-vip-tab-settlement
POST /api/admin/tab-settlements/{settlement_id}/waive run-the-vip-tab-settlement
POST /api/annotations leave-feedback-on-the-app, run-the-feedback-backlog, preview-the-site-as-a-guest
POST /api/annotations/mode leave-feedback-on-the-app
POST /api/cart/items hold-a-checkout-reservation, buy-a-ticket
POST /api/checkout hold-a-checkout-reservation, buy-a-ticket
POST /api/contracts/rider-versions/{template_id}/approve author-a-rider-so-a-host-can-ask-for-it
POST /api/contracts/rider-versions/{template_id}/reject author-a-rider-so-a-host-can-ask-for-it
POST /api/contracts/rider-versions/{template_id}/submit author-a-rider-so-a-host-can-ask-for-it
POST /api/contracts/riders/{rider_key}/promote author-a-rider-so-a-host-can-ask-for-it
POST /api/credit/kyc process-a-payout-run, get-paid-your-host-royalty
POST /api/credit/payouts process-a-payout-run, get-paid-your-host-royalty
POST /api/credit/topup top-up-your-house-credit, understand-your-credit-and-the-exchange
POST /api/events/{event_id}/capacity-override set-up-a-venue-and-its-door-zones
POST /api/events/{event_id}/reservations hold-a-checkout-reservation
POST /api/events/{event_id}/tiers get-into-a-member-only-drop, understand-your-events-tiers-and-releases
POST /api/events/{event_id}/transition monitor-live-sales-on-the-night, understand-your-events-tiers-and-releases, create-and-launch-an-event
POST /api/events/{event_id}/zones set-up-a-venue-and-its-door-zones
POST /api/events/{event_id}/zones/{zone_ref}/activate set-up-a-venue-and-its-door-zones
POST /api/events/{event_id}/zones/{zone_ref}/retire set-up-a-venue-and-its-door-zones
POST /api/guestlist/buckets/{bucket_id}/entries allocate-comps-to-a-promoter, invite-a-guest-and-track-plus-ones
POST /api/guestlist/claim/{token} claim-your-comp-invite, invite-a-guest-and-track-plus-ones
POST /api/guestlist/claim/{token}/plus-ones claim-your-comp-invite
POST /api/guestlist/door/{event_id}/entries/{entry_id}/checkin check-in-a-guest-from-the-list, claim-your-comp-invite, invite-a-guest-and-track-plus-ones, scan-guests-at-the-door
POST /api/guestlist/door/{event_id}/entries/{entry_id}/issue-and-checkin check-in-a-guest-from-the-list
POST /api/guestlist/door/{event_id}/override issue-a-vip-walk-in-override
POST /api/guestlist/entries/{entry_id}/resend revoke-a-comp, invite-a-guest-and-track-plus-ones
POST /api/guestlist/entries/{entry_id}/revoke revoke-a-comp, invite-a-guest-and-track-plus-ones
POST /api/guestlist/events/{event_id}/buckets allocate-comps-to-a-promoter, invite-a-guest-and-track-plus-ones
POST /api/guestlist/my/entries/{entry_id}/claim claim-your-comp-invite
POST /api/intake/applications/{app_id}/approve fast-track-from-telegram, respond-to-a-request-for-more-information, create-and-launch-an-event, approve-a-host-application
POST /api/intake/applications/{app_id}/author-rider author-a-rider-so-a-host-can-ask-for-it
POST /api/intake/applications/{app_id}/convert convert-an-application-into-an-event, get-your-host-account-and-event-access, create-and-launch-an-event
POST /api/intake/applications/{app_id}/decline fast-track-from-telegram
POST /api/intake/applications/{app_id}/notes fast-track-from-telegram
POST /api/intake/applications/{app_id}/recompute-viability fast-track-from-telegram
POST /api/intake/applications/{app_id}/request-info respond-to-a-request-for-more-information, approve-a-host-application
POST /api/intake/public/applications apply-to-host-an-event, re-apply-with-autofill, author-a-rider-so-a-host-can-ask-for-it, build-your-run-of-show-backwards, create-and-launch-an-event, run-the-staff-channel-on-live-telegram
POST /api/intake/public/prefill/start re-apply-with-autofill
POST /api/intake/public/prefill/verify re-apply-with-autofill
POST /api/intake/public/rider-requests author-a-rider-so-a-host-can-ask-for-it
POST /api/intake/public/timeline/preview build-your-run-of-show-backwards
POST /api/intake/rider-requests/{request_id}/author author-a-rider-so-a-host-can-ask-for-it
POST /api/intake/rider-requests/{request_id}/decline author-a-rider-so-a-host-can-ask-for-it
POST /api/intake/rider-requests/{request_id}/triage author-a-rider-so-a-host-can-ask-for-it
POST /api/marketing/events/{event_id}/rules build-a-trigger-rule, configure-marketing-channels-and-rules
POST /api/marketing/posts compose-and-publish-a-social-post
POST /api/marketing/posts/{post_id}/cancel compose-and-publish-a-social-post
POST /api/marketing/posts/{post_id}/retry compose-and-publish-a-social-post
POST /api/orders/{order_id}/cancel hold-a-checkout-reservation, self-cancel-a-ticket
POST /api/orders/{order_id}/pay hold-a-checkout-reservation, pay-with-house-credit, buy-a-ticket
POST /api/rbac/groups build-a-role-from-capabilities
POST /api/rbac/tiers/reorder build-a-role-from-capabilities
POST /api/rbac/users/{user_id}/deactivate deactivate-a-user
POST /api/rbac/users/{user_id}/groups grant-and-revoke-roles, build-a-role-from-capabilities, get-your-host-account-and-event-access
POST /api/rbac/users/{user_id}/groups/{grant_id}/revoke grant-and-revoke-roles
POST /api/rbac/users/{user_id}/reactivate deactivate-a-user
POST /api/rbac/users/{user_id}/sessions/revoke-all deactivate-a-user
POST /api/record/devices keep-the-permanent-event-record
POST /api/record/devices/{device_id}/rotate-token keep-the-permanent-event-record
POST /api/record/ingest keep-the-permanent-event-record
POST /api/record/metrics keep-the-permanent-event-record
POST /api/records/{event_id}/amendments keep-the-permanent-event-record
POST /api/records/{event_id}/measurements keep-the-permanent-event-record
POST /api/records/{event_id}/measurements/import keep-the-permanent-event-record
POST /api/records/{event_id}/open keep-the-permanent-event-record
POST /api/records/{event_id}/seal keep-the-permanent-event-record
POST /api/resale/listings resell-a-ticket-you-cant-use
POST /api/resale/listings/{listing_id}/purchase buy-a-resale-ticket
POST /api/tax/packages/{package_id}/approve run-the-quarterly-tax-filing
POST /api/tax/packages/{package_id}/retry-mail approve-a-filing-from-telegram
POST /api/tax/packages/{package_id}/send-approval approve-a-filing-from-telegram, run-the-quarterly-tax-filing
POST /api/tax/periods/{period_id}/regenerate reconcile-tax-accruals
POST /api/tax/rates maintain-the-tax-rate-matrix
POST /api/telegram/test-send run-the-staff-channel-on-live-telegram
POST /api/telegram/webhook/delete run-the-staff-channel-on-live-telegram
POST /api/telegram/webhook/register run-the-staff-channel-on-live-telegram
POST /api/venues/{venue_id}/archive set-up-a-venue-and-its-door-zones
POST /api/venues/{venue_id}/default set-up-a-venue-and-its-door-zones
POST /api/venues/{venue_id}/layout draw-a-venue-map
POST /api/venues/{venue_id}/shapes draw-a-venue-map
POST /api/venues/{venue_id}/zones set-up-a-venue-and-its-door-zones
POST /api/venues/{venue_id}/zones/{zone_id}/attach set-up-a-venue-and-its-door-zones
POST /auth/login get-your-host-account-and-event-access
POST /auth/password manage-your-account-and-sessions
POST /auth/register create-your-member-account, buy-a-ticket
POST /auth/sessions/{session_id}/revoke manage-your-account-and-sessions
POST /contracts/{contract_id}/countersign sign-and-countersign-a-contract, create-and-launch-an-event
POST /contracts/{contract_id}/lock review-the-riders-approval-created, sign-and-countersign-a-contract, create-and-launch-an-event
POST /contracts/{contract_id}/resync-riders review-the-riders-approval-created
POST /debug/access/simulate-scan diagnose-a-red-scan
POST /debug/adminsuite/sandbox/seed delete-rows-safely
POST /debug/adminsuite/sql edit-any-row-with-admin-crud
POST /debug/clock use-the-debug-console
POST /debug/db/reset use-the-debug-console
POST /debug/events/tiers/{tier_id}/force-cascade get-into-a-member-only-drop, understand-your-events-tiers-and-releases
POST /debug/guestlist/reset-override-cap/{event_id} issue-a-vip-walk-in-override
POST /debug/intake/press-button fast-track-from-telegram
POST /debug/intake/resend-telegram fast-track-from-telegram
POST /debug/ledger/attempt-mutation post-a-house-credit-adjustment
POST /debug/ledger/promote-payouts process-a-payout-run
POST /debug/ledger/run-tab-settlement script-a-mock-failure, run-the-vip-tab-settlement
POST /debug/ledger/simulate-ach process-a-payout-run
POST /debug/marketing/posts/{post_id}/force-publish compose-and-publish-a-social-post
POST /debug/marketing/rules/{rule_id}/force-fire build-a-trigger-rule, configure-marketing-channels-and-rules
POST /debug/marketing/rules/{rule_id}/reset build-a-trigger-rule, configure-marketing-channels-and-rules
POST /debug/marketing/simulate-click trace-a-click-to-revenue, report-marketing-attribution
POST /debug/marketing/simulate-conversion trace-a-click-to-revenue, report-marketing-attribution
POST /debug/marketing/tick build-a-trigger-rule, configure-marketing-channels-and-rules
POST /debug/mock-behaviors script-a-mock-failure
POST /debug/payments/expire-holds hold-a-checkout-reservation
POST /debug/qa/invariants/run run-the-qa-invariant-sweep, process-a-payout-run, reconcile-tax-accruals
POST /debug/rbac/simulate build-a-role-from-capabilities
POST /debug/scheduler/tick use-the-debug-console
POST /debug/tax/replay-telegram-callback approve-a-filing-from-telegram
POST /debug/tax/run-scheduler run-the-quarterly-tax-filing
POST /debug/tax/seed-accruals reconcile-tax-accruals
POST /debug/webhooks/simulate script-a-mock-failure
POST /debug/webhooks/{webhook_id}/replay script-a-mock-failure
POST /preview/enter preview-the-site-as-a-guest
POST /preview/exit preview-the-site-as-a-guest
POST /resale/listings/{listing_id}/delist resell-a-ticket-you-cant-use
POST /resale/sell/{ticket_id} resell-a-ticket-you-cant-use
POST /sign/{token} sign-and-countersign-a-contract, create-and-launch-an-event
POST /webhooks/telegram run-the-staff-channel-on-live-telegram
POST /webhooks/telegram/tax approve-a-filing-from-telegram
PUT /api/admin/credit/users/{user_id}/tab post-a-house-credit-adjustment, run-the-vip-tab-settlement, use-your-membership-card-at-the-bar, use-and-settle-your-vip-tab
PUT /api/admin/events/{event_id}/refund-policy refund-a-ticket-or-order, self-cancel-a-ticket
PUT /api/admin/resale/events/{event_id}/config open-or-close-the-exchange, resell-a-ticket-you-cant-use, get-paid-your-host-royalty
PUT /api/admin/resale/tiers/{tier_id}/mode open-or-close-the-exchange
PUT /api/intake/public/applications/{app_id} respond-to-a-request-for-more-information, build-your-run-of-show-backwards, approve-a-host-application
PUT /api/intake/settings apply-to-host-an-event
PUT /api/rbac/groups/{group_name}/zones map-groups-to-door-zones, build-a-role-from-capabilities
PUT /api/rbac/groups/{slug}/capabilities build-a-role-from-capabilities
PUT /api/rbac/groups/{slug}/implications build-a-role-from-capabilities
PUT /api/rbac/tiers/{slug}/benefits build-a-role-from-capabilities
PUT /api/tax/packages/{package_id}/allocations approve-a-filing-from-telegram, run-the-quarterly-tax-filing
PUT /api/tiers/{tier_id}/zones understand-your-events-tiers-and-releases
PUT /debug/settings/{key} use-the-debug-console

Appendix C — Demo accounts

Practice logins on the demo/test data set only. These render only outside production and only while training.show_demo_accounts is on.

PersonaEmailPasswordNote
Membermember@club.testmember123 A registered customer: buys, holds tickets, house credit and resale listings.
VIP Membervip@club.testvip123 A member with a house tab and Zone B access. Implies everything a member can do.
Host / Promoterhost@club.testhost123 An outside promoter running an event at the venue. Scoped to that one event.
Door Staffdoor@club.testdoor123 Works the door: scans credentials, searches the guest list, checks people in.
Venue Managermanager@club.testmanager123 Runs the floor and the calendar: intake review, live sales, the door, marketing.
Adminadmin@club.testadmin123 Owns money, identity and configuration. Implies every other group.