Admin Refund Workflow
Promoters can now issue full or partial refunds from the Tickets tab.
New features: - Per-ticket Refund button on valid, non-comp tickets — opens a refund modal with full/partial toggle, custom dollar amounts, and reason field - Per-event refund policy: configurable deadline (hours before event) and max refund percentage in Event Policies - Refund History panel on the Tickets tab — full audit trail of all refunds with buyer, type, amount, status, and date - Over-refund protection — tracks cumulative refunds per order, prevents exceeding the order total - Buyer email notifications for both full and partial refunds via Resend - Public event pages show a blue "Refunds: Up to Xh before event" badge when a deadline is configured
Technical: - New refunds table (migration 020) with Stripe refund ID tracking - Stripe partial refund support via Connect (stripe.refunds.create with amount parameter)