Automatic payment confirmation
Updated on 2026-04-26
As soon as a guest pays their deposit or full amount via Stripe or Bancontact, the entire flow is kicked off automatically. You can see everything coming in in real-time on the Payments page.

What happens when a payment comes in?
- A webhook (from Stripe or Bancontact) arrives at
/webhooks/stripe-paymentor/webhooks/bancontact - BedFlow updates the invoice:
financial.paid+= amountfinancial.balance= total - paidfinancial_statebecomes'partial'(deposit) or'paid'(in full)- An individual payment record is added to
payments[]
- The booking moves from
pendingtoconfirmed+deposit_paid = true - An email is sent to the guest — which email depends on the situation:
- First payment (deposit or full in one go) → "Payment received" (template
booking-confirmed) - Remainder after an earlier deposit → "Fully paid" (template
booking-fully-paid)
- First payment (deposit or full in one go) → "Payment received" (template
- A Telegram notification is sent to your phone:
- 💳 "Payment received" (on deposit) or ✅ "Fully paid"
- With guest name, amount, remaining balance, arrival date, reference
- WhatsApp to the guest (only on the first payment — for the final payment the email is enough)
- The guest portal URL is generated and stored on the booking — the guest can open their portal from the email
Example flow: Jan Jansen books 3 nights
| Moment | What Jan sees | What you see | |---|---|---| | Books via widget | "Thanks — check your inbox for the payment link" | Telegram 🎫 "New booking" | | Opens email, clicks Stripe | Stripe checkout, pays €96 deposit | — | | Stripe webhook | "Payment received — €231 remaining on arrival" | Telegram 💳 "€96 received from Jan" | | 2 days later pays the rest | "Fully paid! See you soon." | Telegram ✅ "Fully paid by Jan" |
Where is this built?
app/Http/Controllers/PaymentController.php::handleBookingPaymentConfirmed()is the heartapp/Services/EmailAutomationService::processEvent()picks the right templateapp/Services/TelegramNotificationService::info('payment_received', ...)sends the admin push