Paddles Up Docs
Core Concepts

Refunds and Cancellations

How staff issue refunds and cancellations, what happens in Stripe, and how the activity feed reflects every action.

Staff can refund and/or cancel any registration they manage from the staff registration detail view. The two actions are independent but can be issued together in one submission.

What staff can do

From the Manage card on the staff registration detail view at https://register.paddlesup.io/listings/<id> (Registrations tab → row), a single submission can:

  • Issue a refund (full or partial via Full / Half quick-amount chips, or a custom amount).
  • Cancel the registration.
  • Both at once. Refund fires first; if the refund fails, cancel is skipped.

Staff-only — backed by requireStaffForRegistration on the server.

Refund behavior

  • Refunds are idempotent. The Stripe idempotency key prevents client retries from double-refunding the same registration.
  • Refund state is webhook-authoritative. The DB doesn't reflect a refund until Stripe's charge.refunded webhook lands (typically 1–5 seconds). The detail view polls for up to 15 seconds after a successful refund so the UI catches up without a manual reload.
  • Refunds initiated from the Stripe Dashboard (outside the app) flow back in via the same webhook. They appear in the activity feed as "by account owner via Stripe Dashboard" with no actor_user_id attribution.
  • A refund does not automatically cancel the registration. Staff can see "refunded but still registered" via the badge and decide whether to also cancel.

Cancellation behavior

  • Cancellations are a soft delete — the row is kept with a cancelled_at timestamp.
  • Cancelled rows are excluded from capacity, dedup, waitlist, and check-in queries.
  • Cancelled rows continue to appear in the registrant's /registrations list and in the staff listings table with a Cancelled badge.
  • Cancelling a registration frees its seat and triggers waitlist promotion if applicable.

Activity feed

The staff detail view renders an Activity feed showing every refund and cancellation chronologically with actor attribution. The feed includes:

  • Staff actions (with the staff member's name).
  • Stripe Dashboard refunds (attributed to "account owner via Stripe Dashboard").

Only succeeded refunds appear in the activity feed; failed refund attempts are not surfaced as activity entries today.

Step-by-step

See Issuing refunds for the exact flow.

On this page