Hi all,
We run a booking marketplace with HivePress + Bookings + Marketplace (WooCommerce checkout). We traced a payment-integrity issue from server access logs and can describe the exact mechanism. It is reliably reproducible.
Environment: HivePress core 1.7.23, Bookings 1.5.5, Marketplace, WooCommerce 11.x. Before reporting we’d like to ask: has anything in this area changed in core 1.7.24-1.7.31 or recent Bookings/Marketplace releases?
The mechanism:
-
Customer opens listing A, completes the booking form (date/time/details). A booking post (draft) is created and they land on WooCommerce checkout. Cart contains listing A’s product, and the order will be linked to booking A on completion. So far correct.
-
Customer does not pay yet. In another tab (or via Back navigation) they keep browsing and press “Book now” on listing B. This fires
POST /wp-json/hivepress/v1/listings/{B}/buy/, which immediately replaces the cart product with listing B’s product. -
The buy response should redirect the customer into the make-booking flow for B, where the booking post would be created at the details step. On mobile, a tab switch can prevent that redirect from executing, so no booking post for B is ever created. (We observed this on Android Chrome; we’ve also seen mobile Safari kill post-AJAX redirects in other flows.)
-
Customer returns to the still-open checkout tab from step 1 and submits payment.
wc-ajax=checkoutprocesses the current cart contents: listing B’s product, with no booking reference on the cart/order item.
Result: a paid, processing WooCommerce order for listing B with vendor context resolved, but no hp_booking item meta and no booking post at all. The vendor never sees a booking, the customer’s account bookings page is empty despite successful payment, and no availability is blocked. The booking draft for listing A remains orphaned as a draft.
Repro steps (staging):
-
Listing A: fill booking form → reach checkout, do not pay
-
New tab: listing B → press Book now → do not proceed further (close tab / navigate away before the redirect completes)
-
Return to the original checkout tab → pay
-
Inspect the order: item is listing B’s product, no booking meta; no hp_booking post exists for listing B
The two design questions this raises:
-
The buy endpoint mutates the cart immediately, while the booking post is only created later at the details step - the two are not transactionally linked, so any interruption in between leaves a “armed” cart without booking context
-
Checkout does not validate that a bookable product in the cart carries a booking reference, so such a cart is happily charged
Suggested direction (either would close it): create the booking draft at the buy step so cart and booking always travel together, or add a checkout validation that blocks payment for bookable products with no booking reference.
We currently mitigate with a custom checkout guard, but this seems worth fixing upstream. Happy to provide sanitized log excerpts of the sequence if useful.
Thanks!
Ivan