Payment exceptions
A payment exception is money captured without the tickets to match. It happens in the rare gap between a buyer paying and Platypus issuing tickets — the checkout hold expired, or the event was cancelled while the payment was in flight. Platypus quarantines the order, records exactly what happened, and emails you. Nothing here fixes itself: the refund is yours to make, in your own Stripe dashboard, because the payment sits in your venue's Stripe account.
Open records appear on the Payments page — a banner, a table with one row per exception, and a warning marker in the sidebar until they're dealt with.
What each exception means
The table names each record with one of five labels:
| Label on the Payments page | What happened | Were tickets issued? |
|---|---|---|
| Payment on an expired hold | The buyer paid after their checkout hold had already expired and the seats had been released | No |
| Payment on a cancelled event | The payment landed for an event that was cancelled in the meantime | No |
| Payment on a cancelled date | Same, for one cancelled date of a multi-date event | No |
| Payment less than the priced amount | Stripe captured less than the order's price — Platypus refuses to issue underpaid tickets | No |
| Payment exceeds the priced amount | Stripe captured more than the order's price | Yes — tickets went out normally |
The first four are quarantines: the buyer paid and got nothing, and is owed the full amount back. The last one is the opposite — the tickets are fine, and the buyer is owed the difference.
Refunding the buyer
Each row shows the Stripe PaymentIntent id (it looks like pi_…). That id is the bridge between Platypus and your Stripe dashboard:
- In Stripe, open Payments and paste the PaymentIntent id into the search box. The matching payment opens with the buyer's card and amount.
- Choose Refund. For the four quarantine kinds, refund the full amount. For Payment exceeds the priced amount, refund only the difference — the row shows both the captured and priced amounts, so the gap is arithmetic, not judgement.
- Stripe returns the money to the buyer's card on its usual refund timeline — days, not minutes, so tell the buyer not to watch their banking app.
Refunds made in test mode against test cards behave the same way, so you can rehearse this whole procedure before it ever matters.
What to tell the buyer
The buyer already knows something is off — for a quarantined order, checkout ended in an error (or went silent) after their card was charged. A short email closes it out:
- Quarantine kinds — tell them the payment has been refunded in full, why the order couldn't be completed (their hold expired; the event or date was cancelled), and, if the show is still on sale, that they're welcome to buy again. The rebuy is a fresh order; Platypus can't revive the quarantined one.
- Overpayment — tell them their tickets stand and the difference has been refunded. Nothing else changes for them.
Mark it resolved
Once the refund is done (or you've reviewed the record and decided none is owed), use Mark resolved on the row. The record moves out of the open list, the sidebar warning clears, and the resolution is stamped with who did it. Resolving is one-way: there's no reopen, so resolve after the money has actually moved, not before.
Two sharp edges
- Refunding never cancels tickets. A refund in Stripe doesn't reach back into Platypus: if you refund an ordinary fulfilled order (not a quarantine — those have no tickets), the PDF still scans at the door. If you refund a ticket holder, cross the name off the door sheet.
- Exceptions don't expire. An ignored record stays open, and stays on the Payments page, indefinitely. The buyer's bank may eventually force the issue as a dispute — dealing with it on your terms first is cheaper.
Something on the Payments page that doesn't match this description, or a payment you can't trace? Email support@platypus.tickets with the PaymentIntent id and your venue address — tracing captured-but-unfulfilled payments is one of the things support is for.