Dispute id, opened by, reason code, desired outcome, evidence files, SLA due date
Resolution outcome, refund amount, teacher net, reason code, decided by
Message thread id and attachment references
Audit log id for every change
Notes
Page and tabs. Tabs are saved filters over one bookings table plus the dispute and refund-request queues. Access: Support (read, message, refunds up to the limit), Finance (all refunds and releases), Super admin. Moderators have no access.
Filters. Free search across ref, names and emails; status (Requested, Offer sent, Awaiting payment, Confirmed, Awaiting completion, Completed, Cancelled, Disputed, Refunded), funds state (Held, Released, Paid, Frozen, Refunded), category, event date range, value band. Dense rows, 50 per page, column chooser, sticky header.
Bulk actions. Add note, assign dispute owner, export. No bulk refunds or releases. Export respects the role (finance fields hidden for Support). Large exports run in the background and arrive by email.
Dispute case view. Single case per booking. States: Open, Awaiting customer, Awaiting teacher, Under review, Resolved, Escalated. SLA clock: 3 working days from opening, pauses when waiting for a party. Customers must raise issues within 48 hours of completion; teacher responses are due within 48 hours. Funds are frozen automatically on opening so the scheduled release cannot run.
Message log. Read-only extract of the booking thread, with timestamps and attachments, for evidence. Staff can message from the case; messages are labelled "Popdance Support" for both sides. Viewing is logged. Messages that contain off-platform payment requests are highlighted.
Resolution controls. Outcomes: release in full to teacher, partial refund, full refund, goodwill credit. Shows the maths for teacher payout and commission before confirm. Confirmation dialog: "Refund £30.00 to the customer and release £61.20 to the teacher? This cannot be undone." Needs a reason code and message. Writes to the ledger, triggers the payments provider call and both parties' emails. Events: dispute_resolved, refund_issued.
Mobile
Desktop first. On narrow screens the table becomes cards with status and funds chips; the case page stacks evidence, message log and controls with a sticky Resolve bar.
States
Empty disputes tab: "No open disputes." Loading: skeleton table. Provider error on refund: "The payments provider did not accept this refund. Nothing has changed. Try again or contact Finance" and the case remains open. Concurrent edit: "Sam has updated this case. Reload to continue." Closed case: controls disabled, outcome summarised.