By the end of this guide, you'll have one of your places (or services) set to Accept payments, with a charge type, a deposit amount (if you chose deposit), a booking deadline, and a clear understanding of what the guest sees and what shows up in your admin afterwards.
What you'll need
- A configured payment gateway at the account level — see Payment gateways. Stripe in Test mode is enough to test the flow end-to-end before going live.
- A property under Places or a service under Services that's already saved
- ~5 minutes
- A pricing decision: charge the full amount upfront, or ask for a fixed deposit?
- A working "pay to confirm" flow on the widget
- Bookings that arrive paid (or with a deposit and a deadline for the rest)
- A consolidated Payments table on the booking detail showing everything you've collected, online and offline
Step 1: Open the property → Bookings section
Sidebar → Places → your property (or Services → your service). Scroll to the Bookings section.
The section has two columns side by side:
- Widget behaviour — three options: Availability only, Accept bookings, Accept payments
- Booking type — Instant / Request
By default new properties are on Accept bookings + Instant.
Step 2: Switch behaviour to Accept payments
Click Accept payments in the Widget behaviour switch. Two things happen immediately:
- The Booking type column locks to Instant (the Request option is disabled and faded out). Guests pay to confirm — that is the request-vetting step.
- A new Payments sub-section appears below.
If your account doesn't have a payment gateway configured yet, you'll see a callout "No payment gateways are configured on your account yet." with a Set up payment gateway button. Click it; you'll land on /settings. Set up Stripe (see Payment gateways) and come back.
Step 3: Pick a charge type
The Payments sub-section shows the Payment gateway select first — leave it on Account default unless you want to override per-property.
Below the gateway select is a switch with two options:
Full amount
The guest pays the entire booking total at checkout. The booking arrives paid, dates blocked, money in your Stripe account.
Use it when:
- The total is comfortable for guests to pay upfront (small services, day rentals, tours)
- You don't want any post-booking collection work
- Cancellation policy is generous enough that prepayment isn't risky
Deposit
The guest pays a fixed deposit amount at checkout. The booking arrives with status deposit paid, dates blocked, you collect the remaining balance later via a payment link.
When you pick Deposit, an extra input appears: Deposit amount. Type the amount (in your property's currency). Examples:
- Property total ranges from 3,000 to 8,000 CZK depending on length → set deposit to 2,000 CZK: anyone pays a flat 2k now, balance later
- Tour package at €120 → deposit €30 to lock the slot, balance on arrival
Use it when:
- Totals are large enough that asking for the whole sum upfront would scare off guests
- You want to filter out non-serious bookings without committing the guest to the full amount
- You're flexible on collecting the rest manually (bank transfer, cash, second card payment)
Step 4: Set a booking deadline (optional)
Below the charge type input is Booking deadline, with a number input and an hours trailing addon. Default is 0.
This is the cutoff before which guests must complete their payment. With deadline = 0, slots/dates become unavailable to new bookings the moment the start time passes. With 48, they become unavailable 48 hours before — useful if you need lead time to prepare.
For payments specifically, the deadline runs against the Stripe checkout submission, not the booking. If a guest opens the dialog at the last moment but doesn't finish on Stripe in time, the session expires and the dates open back up.
Step 5: Notifications
Last setting in the section: a Notify me toggle for new-booking emails. When enabled, you get an email every time a booking comes in (paid or deposit). The email includes the amount paid, remaining balance (if deposit), and a link to the booking detail.
Step 6: Save and test
Top of the page → Save. Reload your widget URL. The booking dialog now shows a payment step on the summary screen.
End-to-end test (Stripe Test mode):
- Open the public widget URL (use View public widget on the Widget edit page; same host as admin)
- Pick dates → Make a reservation
- Step 3 (summary) — for Full amount mode you see one big number; for Deposit mode you see total + a short paragraph: "You pay :deposit now. The remaining :remaining will be collected before your stay." with bold values
- Click Pay now — a new tab opens to Stripe Checkout
- Card:
4242 4242 4242 4242, any future expiry, any 3-digit CVC - Submit — Stripe redirects back to a cabintale success page
- Back in admin: the booking is now in your Bookings list with the paid amount visible inline; opening it shows the Payments table with the gateway transaction
What the guest experiences
| Stage | Full amount | Deposit |
|---|---|---|
| Summary screen | Total + price text | Total + paragraph explaining now/later split |
| Pay button label | Pay now | Pay now |
| Stripe Checkout | Booking total | Deposit amount |
| Success screen | "Payment successful — Thanks, your payment has been received." | "Deposit received — Thanks, your deposit has been received. The remaining balance is due later." |
The success screen, the booking dialog, and Stripe Checkout itself all render in the widget's language. If you set up a Czech widget, the entire flow is in Czech (including Stripe's UI). 34 languages supported.
What the admin sees: consolidated Payments table
Open any booking that has online payments. The Payments section now shows everything in a single table:
- Online transactions appear at the top: amount, date, type (Card), description (Deposit / Full amount / Balance), status badge (Succeeded / Pending / Failed / Expired)
- Click the status badge to view the transaction logs (every webhook event, signature verification result, all the audit info)
- Manual payments (bank transfer, cash) appear below — same table, no status column populated
- A summary row at the bottom shows To be paid with the actual remaining (total minus all payments — online and manual combined)
Collecting the balance: payment links
When a guest paid a deposit, you still need to collect the rest. The Payments section has two buttons next to + Add payment:
- Payment link — generates a /pay link for the current remaining (total − online − manual). Auto-recalculates if you add a manual payment afterwards. Send via email/SMS to the guest.
- Pay deposit link — only visible if the property is on Deposit charge type AND there are no payments yet. For when a guest abandoned the dialog and you want to send them a fresh link.
Click either; the link is copied to clipboard automatically (no popups, no email by default — the button just flips to "Payment link copied" with a check icon for 3 seconds). Paste the link into your reply email.
The guest opens the link → sees a payment page in their original widget language → clicks Pay → goes to Stripe → pays. Your booking detail updates within seconds.
Mixing online and manual payments
A common scenario:
- Guest pays 2,000 CZK deposit online via the widget
- They pay 4,000 CZK by bank transfer 2 weeks later — you record this as a manual payment via + Add payment with type Transfer
- Total booking: 6,800 CZK. Remaining: 800 CZK
- You click Payment link — backend computes 6800 − 2000 − 4000 = 800. Link generated for 800 CZK.
- Guest pays the 800 via the link. Booking is fully paid.
The "remaining" calculation is always live: backend counts both online (from Stripe webhooks) and manual (from the Payments table) every time the link is opened or activated.
Removing a pending payment
If you generated a payment link by mistake (wrong amount, wrong guest, etc.), open the booking → Payments table → find the Pending online row → click the Delete icon. Confirms with a small dialog, then removes the transaction (the link stops working immediately).
Succeeded payments cannot be deleted (audit protection). To return money to a guest, use the Refund action on the same row instead — see Refunds and cancellations.
Switching from Accept payments back to Accept bookings
You can do this anytime: open the property, switch Widget behaviour back to Accept bookings, save. Existing payments aren't touched — historical transactions and the Payments table still show. New bookings on the widget go through the non-paying flow.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Accept payments option is greyed out / Save fails | No active payment gateway on your account | Click the inline Set up payment gateway button or go to /settings |
| Guest pays but the booking stays pending in admin | Webhook didn't arrive (URL/signing secret mismatch in Stripe) | Re-check the webhook URL in Stripe matches the one in the cabintale dialog; replace the signing secret if it changed |
| Guest sees Stripe in English on a Czech widget | Stripe locale wasn't passed through | Make sure the widget's language is set to Czech (Widgets → edit → Language); new bookings will pass the locale |
| Payment link page shows the wrong remaining amount | Page was opened before a manual payment was added; refresh the page | Hard-refresh the /pay link in the browser; the amount recomputes live |
| Two guests can both submit a paying booking for the same dates | Pending Stripe sessions don't pre-block dates; whoever pays first wins | This is intentional — Stripe sessions can fail, so we don't want to lock dates speculatively. The losing guest sees an error after payment is attempted |
| I want a request-mode payment flow (vet first, then charge) | Not supported — payments forces Instant | Use Accept bookings + Request mode and collect payment manually after you confirm |
Related guides
- Payment gateways (account-level setup) — Payment gateways
- Stripe setup (Stripe-dashboard side) — Stripe setup
- Refunds and cancellations — Refunds and cancellations
- Instant vs. Request booking — Instant vs. Request booking
- Booking deadline — Booking deadline