
Your Booking Button Works, but Customers Still Cannot Complete a Booking
The booking button opens. The calendar loads. A customer chooses a time, enters their details and may even see a payment screen—yet the appointment never reaches the business calendar. From the owner’s side, this often gets reported as “the booking button is broken.” The button is usually the only part that worked.
An online booking is a chain of separate decisions: load the scheduler, calculate availability, preserve the selected slot, validate customer details, authorize payment, create or confirm the booking, and send confirmation. A failure at any handoff can look like the same vague complaint. The practical fix is to identify the last stage that succeeded.
Start with the last successful step
Reproduce the issue with a test service and record the exact device, browser, network, time zone, service, staff member, date and payment method. Do not begin by changing plugins or redesigning the page. First classify the failure:
The booking button does nothing: investigate the link, overlay, JavaScript error, consent blocker or inaccessible control.
The scheduler opens but shows no times: investigate service hours, staff and resource availability, lead time, buffers, capacity and time-zone conversion.
A time appears but cannot be selected: investigate stale availability, slot contention or a front-end script conflict.
The customer cannot continue after entering details: investigate required fields, validation, CAPTCHA, consent and mobile keyboard behavior.
Payment fails or returns to the wrong page: investigate gateway configuration, currency, authentication, redirects and session continuity.
The customer sees success but no booking exists: investigate confirmation status, webhook or order processing, duplicate protection and notification logic.
This symptom map prevents a full-site guessing exercise. It also gives support staff a useful question: “What is the last screen you could complete?”
Build one controlled test booking
Create a short test service with a low price or offline payment option and a clearly assigned staff member.
Expose a known slot at least a day ahead so minimum-notice rules do not hide it.
Test while signed out in a private window, then repeat on a real phone over cellular data.
Capture the browser Console and Network activity from button click through confirmation.
Check the booking dashboard, payment dashboard and email or SMS log separately.
Cancel or refund the test only after recording booking, order and transaction IDs.
A controlled test separates configuration from customer-specific data. If the test service succeeds but the real service fails, compare their schedules, resources, pricing, form fields and policies rather than changing the global site.
Failure 1: availability exists in the business calendar but not online
A free-looking calendar is not the same as a bookable slot. Booking platforms combine service duration, staff working hours, linked calendar conflicts, location hours, required rooms or equipment, participant capacity, lead time, booking window and cleanup buffers. One unavailable dependency can remove the slot.
Wix’s documented booking flow first queries the service and then requests bookable time slots with an explicit IANA time zone. Appointments also depend on a schedule and an available resource before a booking can be created.Wix’s end-to-end booking flow
Check availability in this order:
Confirm the service is visible and accepts online bookings.
Confirm at least one staff member or required resource is assigned to that service.
Compare the service schedule with staff hours, business hours and external calendar conflicts.
Temporarily reduce buffers, minimum notice and maximum advance-booking restrictions.
Check class capacity and participant quantity, not only the event time.
Verify the displayed time zone and test from a different customer time zone.
Look for an old recurring schedule or daylight-saving transition affecting only particular dates.
If only one staff member, location or date range fails, the button and page are probably healthy. The faulty rule is inside availability calculation.
Failure 2: the selected slot expires before submission
Availability is dynamic. Another customer may take the slot, a hold may expire, or the scheduler may continue showing cached availability after the server has rejected it. The interface should explain that the time is no longer available and return the customer to the nearest valid choices.
Inspect the final availability or booking-create request in the Network panel. A conflict or validation response should not be converted into a silent spinner. Refresh availability after long idle periods, prevent double submission, and preserve the customer’s entered details when asking them to choose another time.
Failure 3: the form blocks progress without explaining why
Booking forms often fail on a required phone format, address, consent box, custom intake question, CAPTCHA, upload or date field. Desktop testing can miss mobile autofill, an obscured error below the fold, or a keyboard covering the Continue button.
W3C’s error-identification guidance requires input errors to be identified and described in text. A red border alone is not enough for many users and can leave everyone guessing.W3C error-identification guidance
Show the error beside the field and in a summary at the top when several fields fail.
Move focus to the error summary or first invalid field after submission.
State the expected format with an example before the customer types.
Accept international phone numbers if the business serves customers worldwide.
Preserve completed fields after an error instead of clearing the form.
Test keyboard-only navigation, screen zoom, autofill and a narrow mobile viewport.
For a privacy-safe field-by-field measurement plan, use Webcurry’s form-abandonment diagnostic.
Failure 4: an embedded scheduler loses its session
Third-party booking widgets often run inside an iframe on another domain. The embedded flow may depend on cookies or storage to retain the chosen service, user session or checkout state. Privacy settings, consent tools, content blockers and browser restrictions can make the embed behave differently from a top-level booking page.
MDN documents that the SameSite cookie attribute controls whether cookies are sent with cross-site requests; iframe navigation is excluded from the normal Lax top-level-navigation allowance. Cross-site cookies using SameSite=None must also be Secure.MDN’s Set-Cookie reference
Test the scheduler both embedded and on its vendor-hosted URL. If the hosted page works, inspect iframe permissions, cookie attributes, consent-category timing, Content Security Policy, domain allowlists and redirect URLs. Offer a visible “Open secure booking page” fallback rather than leaving customers trapped in a broken embed.
Browser-specific behavior can be isolated with the Chrome-versus-Safari troubleshooting guide.
Failure 5: payment succeeds but the booking is not confirmed
Treat payment and booking confirmation as separate states. A card authorization, completed payment page or bank notification does not prove that the booking platform recorded a confirmed appointment. The server must reconcile the transaction with the booking and handle delayed or repeated callbacks safely.
Stripe recommends using webhooks for asynchronous payment events and verifying webhook signatures before acting on an event. Production systems should also tolerate duplicate delivery and process events idempotently.Stripe’s webhook documentation
Log the booking ID, order ID, payment intent or transaction ID and final status together.
Do not confirm a booking only from a browser redirect; the customer may close the page.
Verify webhook signatures and use a server-side success event.
Make confirmation idempotent so a retry cannot create two appointments.
Define what happens when payment succeeds but the slot expired.
Give staff a reconciliation queue for paid-but-unconfirmed cases.
In Wix’s documented flow, a newly created booking begins in CREATED status and must be confirmed for free or offline payment, while online payment confirmation follows the checkout flow. That distinction is important when a custom integration reports success too early.
Failure 6: the confirmation exists, but nobody receives it
Before calling this a failed booking, check the booking dashboard. If the appointment exists, the failure is notification delivery, not booking creation. Inspect automation status, recipient fields, email suppression, spam filtering, SMS country codes and calendar-invite generation.
Use a confirmation page that shows the service, date, time zone, location, reference number and next step. Do not rely solely on email. For missing notifications, the same delivery checks in the contact-form email guide apply to sender authentication, automation rules and suppression.
Platform-specific checks
Wix Bookings
Confirm that the service is visible, bookable online and assigned to the correct staff or resource. Compare service hours, staff schedules, linked calendars, buffers and booking policies. Test free or pay-in-person confirmation separately from online checkout. If a custom booking flow is used, verify that it progresses from service to availability to created booking and then to confirmation or payment; a CREATED record is not yet a completed booking.
WordPress booking plugins
Update the booking plugin, payment extension and theme in a staging copy first. Disable optimization or caching for booking, cart, checkout and callback endpoints. Check REST API or admin-ajax requests, nonce expiry, cron processing, email jobs and gateway webhooks. Temporarily switch to a default theme and disable nonessential plugins to identify conflicts, then restore components one at a time.
Shopify booking apps
Test the app block in a clean duplicate theme and confirm that the product or service variant remains available. Check whether the app uses cart properties, line-item attributes, an external scheduler or a post-purchase confirmation. Review theme scripts, app embeds, consent tools and accelerated checkout behavior. Follow the app vendor’s required cart and checkout configuration rather than treating every booking app as identical.
Measure the funnel without collecting sensitive form data
Track stage completion, not the customer’s answers. Useful events include booking_view, service_select, slot_select, booking_form_start, booking_form_error, payment_start and booking_confirmed. Attach non-sensitive parameters such as service category, platform, device group and normalized error code.
Only mark booking_confirmed after the server or platform confirms the appointment. Google Analytics recommends standard events such as generate_lead and purchase where they match the outcome; custom diagnostic events can fill the stages between them.Google Analytics recommended events
Webcurry’s lead-attribution guide explains how to connect the confirmed outcome back to the traffic source without treating a button click as a conversion.
A release checklist for booking repairs
Test each service type, staff member, location and payment option that customers can actually choose.
Test in the business time zone and at least one customer time zone.
Test signed out, on a real phone, over cellular data and in Safari as well as Chrome.
Confirm visible field errors, preserved form values and keyboard operation.
Verify booking, payment and notification records independently.
Prevent duplicate submissions and duplicate webhook processing.
Exclude booking and checkout routes from unsafe caching or script deferral.
Confirm analytics fires only after a real server-confirmed booking.
Keep a fallback phone, email or hosted booking link visible when the embedded flow fails.
If the problem appears only on mobile data, continue with Webcurry’s network-specific website diagnostic. If the payment or widget throws a security warning, check the SSL and mixed-content guide.
Fix the handoff, not just the button
A booking button can be perfectly clickable while the business still loses appointments. The durable repair is to identify the final successful state, inspect the next server request, and reconcile availability, form, session, payment and confirmation records.
If customers report different failures and you need an independent test across devices and stages, ask Webcurry for a focused booking-flow review. Bring the service name, approximate failure time, device, browser, network, time zone and any booking or payment reference; those details turn a vague complaint into a reproducible defect.



Comments