The full path of one booking — from picking an open slot to confirmed payment — exactly as implemented in the controllers and webhook.
Sees a list of the business's active bookable services.
BookingController@indexSlots are generated for business hours (9am–5pm) and already-booked ones are removed — computed on the fly, never cached.
BookingController@create — availableSlots()On submit, the server runs a real SQL check for whether the slot is already taken — prevents double-booking even from two simultaneous attempts.
Booking::scopeOverlapping()Saved to the database with a pending status, and a Stripe Checkout session is created for payment.
StripeCheckoutService::createSessionForBooking()The customer is redirected to Stripe's own secure payment page.
Stripe notifies the server directly (not through the customer's browser) — the request's signature is verified before the booking is marked paid.
StripeWebhookController@handleA page with the booking's details — service, time, status.
BookingController@confirmationA staff-only view (behind login + admin check) lists all bookings and allows changing status — e.g. to "completed" after the appointment.
Admin\DashboardControllerWHERE starts_at < ? AND ends_at > ?), not only in the frontend.Stripe-Signature header.