Back to Projects
E-Commerce with custom requirements

Vulkaneifel Therme – Online Shop with Live Booking

Custom shop on Laravel 12 with dual checkout flow, custom VRPay integration, and direct TCP connection to the spa's POS system.

Industry Wellness · Tourism
Technology Laravel 12 · Livewire · Filament v4
Status Live
Live View shop ↗
Daniel Nilges Max Hopfinger Tobias Kokesch
Daniel Nilges, Max Hopfinger, Tobias Kokesch
Vulkaneifel Therme

Project info

industry
Wellness · Tourism · Hospitality
service
Shop development, API integration, maintenance
technology
Laravel 12, Livewire 3, Filament v4
status
Live

View live shop

What it was about

Vulkaneifel Therme in Bad Bertrich – Germany's only Glauber's salt spa – sells three very different product types online:

  • Time slot reservations for wellness and sauna sessions
  • Service vouchers, e.g. for massages
  • Value vouchers, redeemable for anything

Standard shop systems can't handle this combination. The slot reservations in particular require a live connection to the internal POS system – including availability checks and an immediate lock to prevent double bookings. A custom VRPay payment integration was also required.

What we built

We built a fully custom shop on Laravel 12 – no Shopify, no WooCommerce, no off-the-shelf module. The combination of three product types, live slot booking, and a proprietary payment provider didn't work cleanly in any existing system.

Customer-facing features

  • Product catalogue with hierarchical categories, SEO slugs, breadcrumbs
  • Cart with coupon engine (percentage-based, expiry dates, product-specific)
  • Dual checkout flow: full registration or guest checkout, with later conversion to full account – without losing order history
  • PDF generation for vouchers including embedded barcodes, three-year validity
  • Newsletter integration with CleverReach including double opt-in

Admin backend with Filament v4

  • Products, categories, orders, coupons, customers, guests
  • Order export, manual product sync to POS system
  • SEO settings and voucher design settings as custom pages

What happens under the hood

VRPay integration via Saloon

Three payment methods: credit card, PayPal, SEPA direct debit, plus prepayment. Custom Saloon integration instead of an off-the-shelf package, because VRPay uses an XML API with three separate entity IDs. Flow: PostCheckoutPrepare → redirect to VRPay hosted page → webhook callback → GetPaymentStatus → PaymentProcessed event.

TCP connection to the spa's POS system

No REST, no SOAP – the POS system speaks XML over raw TCP sockets. We built a custom SocketClient that opens a stream via stream_socket_client, plus five dedicated action classes: SyncProducts, SendOrder, FetchFreeDates, ReserveFreeDate, DeleteReservedDate. All calls run asynchronously via Laravel queue jobs.

Reservation lock to prevent double bookings

When a guest clicks on a free slot, a reservation is immediately made against the POS system – server-side, with a timeout. If the customer abandons the checkout, the reservation is automatically released by a scheduled cleanup job. The slot is never blocked longer than necessary.

Tax and discount logic per German accounting rules

19% VAT, gross prices stored, discounts calculated on net with tax recalculated – covered by dedicated tests, because in practice many shops get this wrong.

Stack

Backend
PHP 8.2, Laravel 12
Frontend
Livewire 3 + Volt, Tailwind CSS v4, Vite v8
Admin
Filament v4
Tests
Pest 3, 51 test files, Larastan 3, Pint
Monitoring
Sentry
Architecture
Action classes, event-driven, UUID keys, 61 migrations

Status

The shop is live at shop.vulkaneifeltherme.de and processes reservations, service vouchers and value vouchers daily. Maintenance and development are ongoing.

Similar project in mind?

If you need a shop with system integrations, custom logic or a proprietary payment provider – or an existing shop that's hitting its limits: