Stripe payments setup
Ticket money goes straight to your venue's own Stripe account. Platypus initiates the payment with your keys and never holds your funds. Until Stripe is connected here, paid ticket types can't be bought; an event with free ticket types still shows its Buy tickets button, offering the free types only.
You'll need a Stripe account with its business details activated (a free account in test mode is enough to rehearse). Open Payments in the admin sidebar; the page walks you through three steps — about five minutes.
While you're setting up payments, the page also nudges you to fill in your ticket terms & refund policy and ABN under Settings. Buyers see the policy at checkout and the ABN on receipts (see Business identity). Selling works either way; the nudge tells you what buyers aren't seeing yet.
1. Create a restricted key in Stripe
In your Stripe dashboard: Developers → API keys → Create restricted key. A restricted key can only do what ticket sales need, which makes it much safer than a full secret key. Grant exactly:
| Permission | Level | Why |
|---|---|---|
| Payment Intents | Write | takes payments |
| Account | Read | confirms the connection and shows your account name |
| Webhook Endpoints | Write | lets Platypus set up payment confirmation for you |
Leave everything else on None. (A full secret key sk_live_... works too, but restricted is recommended — it limits what could go wrong if the key ever leaked.)
2. Paste your keys
- Publishable key —
pk_live_...(orpk_test_...while testing). Safe to share; it only identifies your account. - Secret key — the restricted key you just created (
rk_live_...). Stored encrypted, never shown again.
Platypus verifies the secret key against Stripe when you save: a rejected key is never stored, and a successful save shows your Stripe account name on the page. Both keys must be from the same mode (both live, or both test).
3. Set up payment confirmation (webhook)
When a payment goes through, Stripe tells Platypus so the tickets are issued and emailed. That link is a webhook:
- Automatic (recommended): click Set up automatically. Platypus creates the endpoint on your Stripe account and stores its signing secret. Done.
- Manual (if your key lacks Webhook Endpoints permission): in Stripe, Developers → Webhooks → Add endpoint; paste the endpoint URL shown on the Payments page, select exactly the events
payment_intent.succeeded,payment_intent.canceled, andpayment_intent.payment_failed, then copy the endpoint's signing secret (whsec_...) back into the Payments page.
A missing webhook warns but doesn't block sales — payments still verify at the end of checkout. Set it up anyway: it's the safety net that issues tickets if a buyer's connection drops at the wrong moment.
4. Verify
The status card shows the connected account, a LIVE/TEST MODE badge, and the webhook state. Test connection re-checks at any time without re-entering keys.
Test keys vs live keys
Rehearse with your Stripe test keys (rk_test_/pk_test_) — checkout then accepts only Stripe's test cards such as 4242 4242 4242 4242. Buy a ticket yourself and confirm the order completes and the ticket PDF arrives by email.
Switching between test and live keys clears the stored webhook (Stripe webhooks are per-mode). Re-run Set up automatically after the switch.
Go-live checklist
- [ ] Live restricted key (
rk_live_) and live publishable key (pk_live_) saved - [ ] Webhook state shows Automatic ✓ (or Manual ✓) — re-done after the test→live switch
- [ ] Test connection shows your account name with a LIVE badge
- [ ] Buy tickets button visible on a public event page
When a payment needs attention
Very occasionally Stripe captures a buyer's money but Platypus can't (or shouldn't) issue the tickets. When that happens, you're emailed straight away, a red banner appears at the top of the Payments page with the affected orders listed underneath, and the Payments item in the sidebar carries a warning triangle until everything is dealt with. Payment exceptions covers what each flag means, how to refund from your Stripe dashboard, and when to mark a row resolved.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| No Buy tickets button on the event page | Keys missing and no free capacity, or the event has no purchasable capacity | Complete steps 1–2; check the event's ticket types are published with capacity (free types sell without keys) |
| Save rejected with a Stripe error naming a permission | Restricted key missing that permission | Edit the key in Stripe (Developers → API keys), add it, then Test connection |
| Set up automatically fails with a permission message | Key lacks Webhook Endpoints: Write | Add the permission, or use the manual path in step 3 |
| Real card declined at checkout | Test keys still configured | Save your live keys, re-run webhook setup |
| Payment succeeded but tickets not confirmed / webhook errors in Stripe | Wrong or stale signing secret, wrong endpoint URL, or wrong events | Re-run Set up automatically; if manual, confirm the URL and the three exact events, re-paste the whsec_ |
| Test connection fails after previously working | Key rolled or deleted in Stripe | Create a new key and save it on the Payments page |
| "Stored key unreadable — re-enter your keys" | Platform-side key rotation | Paste your keys again |
| Webhook auto-setup reports an endpoint limit | Stripe's 16-endpoints-per-account cap | Delete unused endpoints in Stripe (Developers → Webhooks) and retry |
A failure the table doesn't explain is worth reporting — email support@platypus.tickets with what the status card shows and the time it happened.