By the end of this guide, you'll know how to issue a refund (full or partial) on any successful Stripe payment, what the booking looks like afterwards, what the guest gets, and how cancellation differs from refund.
What you'll need
- A booking with a successful Stripe payment (deposit, full, or balance)
- Access to the email address on your cabintale account — the confirmation code lands there
- ~2 minutes per refund
- Money returned to the guest's original card via Stripe (typically lands in 5–10 business days)
- A separate refund row in the Payments table with a Refunded badge
- The booking's "to be paid" automatically recalculated — fully refunded bookings drop back to Confirmed and unblock for a fresh payment link if you want one
What you can refund
| Payment status | Refund possible? |
|---|---|
| Succeeded (online via Stripe) | Yes — full or partial |
| Pending / Failed / Expired (online) | No refund — the guest never paid. Use the Delete icon to remove the row instead |
| Manual payments (cash, transfer) | Not handled in cabintale — settle with the guest directly and update the manual payment row |
Refunds work per-transaction, not per-booking. A booking with multiple successful payments (e.g. deposit + balance, or two retries) shows a refund icon on each successful row independently.
Step 1: Open the booking and find the payment
Sidebar → Bookings → click the booking → scroll to the Payments section.
Find the row you want to refund — it's an Online row with a green Succeeded badge. On the right of that row is a small hand-coins icon. Click it.
If you don't see the icon: the row isn't Succeeded, or it's already been fully refunded. Pending/failed rows show a Delete icon instead.
Step 2: Enter the amount
A modal opens titled Refund payment with the Amount field prefilled to the maximum refundable.
- Full refund — leave the prefilled amount, click Refund now.
- Partial refund — type a smaller number. Stripe accepts down to 0.01 of your currency. The remaining amount stays refundable; you can issue another partial refund later from the same row.
The amount is always validated server-side: even if you change it via DevTools, the server rejects anything above what's actually refundable.
Click Refund now. The button doesn't refund yet — it triggers the next step.
Step 3: Enter the confirmation code
The modal switches to a code-input view: "We sent a 6-digit confirmation code to j\\\@yourdomain.com*. Enter it below to authorise the refund."
Open the email inbox for the address shown (the one you log into cabintale with). The email subject is "Confirm refund" with sender Cabintale. Inside, a big monospaced 6-digit number — copy it.
Back in the modal, type the 6 digits. Click Confirm refund.
The code is valid for 10 minutes. After 5 wrong tries the code is invalidated and you have to start over (click Back, then Refund now again). This is intentional — it's the security layer that protects you if your admin session is compromised.
If the email never arrives:
- Check spam (some inbox providers tag the first transactional email)
- Make sure you're logged in with the right email address (the code is always sent to your cabintale account email, not the guest's)
- Wait up to 30 seconds — Postmark delivery is usually instant but can occasionally lag
Step 4: What happens after
Stripe processes the refund. Within a couple seconds, the booking detail re-renders:
- A new row appears in the Payments table — Refund type, negative amount (
-2900 CZK), Refunded status badge - The original payment row keeps its Succeeded badge — the original transaction still happened. Refunds are tracked separately for clean audit history
- The summary row at the bottom (To be paid) recalculates: total minus net paid (gross paid minus succeeded refunds)
- If the refund covers everything paid online, the booking's overall status drops from Paid back to Confirmed and the Payment link button reappears
Stripe also sends the guest its own refund-issued email automatically (with the receipt). Cabintale doesn't send a separate refund email — Stripe's wording is more accurate to what the guest's bank actually shows.
Multiple partial refunds
You can refund a transaction multiple times until the original amount is exhausted:
| Action | Original | Refunded so far | Refundable now |
|---|---|---|---|
| Stripe paid 5800 CZK | 5800 | 0 | 5800 |
| Refund 2000 | 5800 | 2000 | 3800 |
| Refund 1000 | 5800 | 3000 | 2800 |
| Refund 2800 | 5800 | 5800 | 0 |
Each refund triggers its own confirmation-code email and creates its own row in the Payments table.
When the row is fully refunded the icon disappears.
Refunds initiated from the Stripe Dashboard
If you issue a refund directly from dashboard.stripe.com (or Stripe support does it for you), cabintale picks it up via webhook within seconds and adds the row to the Payments table — same as if you'd done it in cabintale. No email confirmation in that direction (Stripe's own dashboard auth gates it).
Cancelling a booking vs. refunding a payment
Refund and cancellation are separate actions in cabintale, on purpose.
| Refund | Cancel booking | |
|---|---|---|
| What it does | Sends money back through Stripe | Marks the booking as cancelled in cabintale, frees the dates |
| Affects guest's bank | Yes (immediate) | No |
| Affects calendar availability | No (still blocking until you cancel) | Yes (dates become bookable again) |
| Auto-emails the guest | Stripe sends refund receipt | No automatic email — write your own |
Common workflow:
- Guest emails: "I have to cancel."
- You refund the payment (this guide)
- You then cancel the booking (Sidebar → Bookings → row dropdown → Delete) so the dates reopen
Doing them in this order means the guest sees the money come back first, then the booking disappears. If you cancel without refunding, the dates open up but the money stays in your Stripe — fix it with a refund afterwards.
Heads up. A "Cancel booking" UI with optional refund-on-cancel is on the roadmap. Until then, the two actions are manual and independent.
What the guest sees
- From Stripe — an automatic refund-issued email with the original receipt and the new refund line. Sent in the same language the guest used at checkout.
- From cabintale — nothing automatic. If you want to add context ("we'll see you next year", "here's what happened"), reply to the booking-confirmation email thread or write to the guest directly.
The refunded amount typically appears on the guest's card statement within 5–10 business days. Stripe shows it as a negative line item; some banks render it as a separate credit transaction. If a guest asks where the money is, point them to their card statement first; only then check the Refunds tab in your Stripe Dashboard.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Hand-coins icon not visible on a paid row | Row isn't Succeeded yet, or it's already fully refunded | Wait for Succeeded; or check if a refund row beneath it covers the full amount |
| "Refund could not be processed" | Stripe rejected the call (e.g. no funds in your Stripe balance for the refund, currency mismatch, or PaymentIntent doesn't exist) | Check the booking's transaction logs (click the green badge); also check the Refunds tab in your Stripe Dashboard |
| Email confirmation code never arrives | Spam, wrong email, or Postmark delay | Check spam; verify your cabintale account email; wait 60s; if still nothing, click Back in the modal then Refund now to re-send |
| "Code expired" | The 10-minute window passed | Click Back, then Refund now — a new code will be sent |
| "Too many incorrect attempts" | 5 wrong codes in a row invalidate the token | Click Back, then Refund now — a new code will be sent |
| "Refundable amount changed" | A webhook landed between your code-send and confirm — e.g. a Stripe Dashboard refund happened in parallel | Close the modal, refresh the page, re-check the refundable amount |
| Refund doesn't show on the guest's card immediately | Normal — banks take 5–10 business days | Wait. If still missing after 10 working days, check Stripe Dashboard → Refunds for the refund's status (issued / failed / pending) |
Related guides
- Accept payments on a property — Accept payments on a property
- Payment gateways (account-level setup) — Payment gateways
- Stripe setup — Stripe setup