Docs
← cabintale.com EN · CZ Email support
Payments · Tutorial

Accept payments on a property

Turn a property into a paid one — guests pay through the widget at booking time, with full amount or a fixed deposit.

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.

Before you start

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?
What you'll achieve
  • 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 typeInstant / 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:

  1. 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.
  2. 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):

  1. Open the public widget URL (use View public widget on the Widget edit page; same host as admin)
  2. Pick dates → Make a reservation
  3. 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
  4. Click Pay now — a new tab opens to Stripe Checkout
  5. Card: 4242 4242 4242 4242, any future expiry, any 3-digit CVC
  6. Submit — Stripe redirects back to a cabintale success page
  7. 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

StageFull amountDeposit
Summary screenTotal + price textTotal + paragraph explaining now/later split
Pay button labelPay nowPay now
Stripe CheckoutBooking totalDeposit 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:

  1. Guest pays 2,000 CZK deposit online via the widget
  2. They pay 4,000 CZK by bank transfer 2 weeks later — you record this as a manual payment via + Add payment with type Transfer
  3. Total booking: 6,800 CZK. Remaining: 800 CZK
  4. You click Payment link — backend computes 6800 − 2000 − 4000 = 800. Link generated for 800 CZK.
  5. 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

SymptomCauseFix
Accept payments option is greyed out / Save failsNo active payment gateway on your accountClick the inline Set up payment gateway button or go to /settings
Guest pays but the booking stays pending in adminWebhook 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 widgetStripe locale wasn't passed throughMake 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 amountPage was opened before a manual payment was added; refresh the pageHard-refresh the /pay link in the browser; the amount recomputes live
Two guests can both submit a paying booking for the same datesPending Stripe sessions don't pre-block dates; whoever pays first winsThis 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 InstantUse Accept bookings + Request mode and collect payment manually after you confirm

Related guides

Still stuck?

We reply to every email within one business day.

Email support →