Self-service forfeit of a free ticket (release the seat) #28

Open
opened 2026-06-20 06:57:38 +00:00 by padreug · 0 comments
Owner

Follow-up from the free-ticket work.

Free tickets have no payment barrier, so holders are much more likely to "flake". Give a holder a way to forfeit a ticket they know they won't use so the seat returns to inventory.

Shape

  • New holder-authenticated endpoint (e.g. POST /tickets/{ticket_id}/forfeit), authorized by user_id match (the buyer).
  • A release_ticket service = the inverse of set_ticket_paid: under the per-event lock, decrement event.sold, increment event.amount_tickets, mark the ticket extra.canceled/forfeited, and republish the NIP-52 event so connected clients see the freed capacity.
  • Critical: the door-scan / register paths MUST reject a forfeited ticket — both api_event_register_ticket and the events_ticket_register Nostr RPC. Otherwise a released seat could still be scanned in.

Notes

  • This is the free-ticket analogue of refunds. Refund of a paid ticket already exists (refund_tickets via LNURL refund_address + sats_paid, event-level/admin-driven); self-service buyer refunds of paid tickets are a separate policy question, out of scope here.
  • Depends on the free-ticket issuance landing first.
Follow-up from the free-ticket work. Free tickets have no payment barrier, so holders are much more likely to "flake". Give a holder a way to forfeit a ticket they know they won't use so the seat returns to inventory. ## Shape - New holder-authenticated endpoint (e.g. `POST /tickets/{ticket_id}/forfeit`), authorized by `user_id` match (the buyer). - A `release_ticket` service = the inverse of `set_ticket_paid`: under the per-event lock, decrement `event.sold`, increment `event.amount_tickets`, mark the ticket `extra.canceled`/`forfeited`, and republish the NIP-52 event so connected clients see the freed capacity. - **Critical:** the door-scan / register paths MUST reject a forfeited ticket — both `api_event_register_ticket` and the `events_ticket_register` Nostr RPC. Otherwise a released seat could still be scanned in. ## Notes - This is the free-ticket analogue of refunds. Refund of a *paid* ticket already exists (`refund_tickets` via LNURL `refund_address` + `sats_paid`, event-level/admin-driven); self-service buyer refunds of paid tickets are a separate policy question, out of scope here. - Depends on the free-ticket issuance landing first.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
aiolabs/events#28
No description provided.