Back to blog
Jul 6, 2026Custom Software

Building ActivityHub: A White-Label Booking Platform for Hotels and Local Experiences

Beta Edition — ActivityHub is live as a public beta. The […]

building-activityhub-a-white-label-booking-platform-for-hotels-and-local-experiences

Beta Edition — ActivityHub is live as a public beta. The core is production-grade; new features are shipping continuously.

Spend a summer on an island like Corfu and you notice something odd. There are hundreds of people running brilliant local experiences — sailing skippers, horse-riding stables, cooking hosts, hiking guides, spa therapists, photographers — and there are hundreds of hotels, villas and apartments full of guests who would happily pay for exactly those things. Yet the two sides barely connect. That disconnect is the problem I set out to solve with ActivityHub.

This is the story of what I found broken in the market, how I built the platform, who it’s for, and the stack that powers it.


The problem I spotted

On a destination like Corfu the supply of activities is huge but completely fragmented, and the accommodations that could sell them have no proper tool to bridge the gap. Concretely, a hotel, villa or apartment has no way to:

  • Discover the providers. There are dozens of independent operators running everything from yacht charters to olive-grove trails — but no single place to find them, compare them, and see what they offer.
  • Curate a selection. Even once you know a few, there’s no tool to hand-pick the providers you trust, decide which experiences fit your guests, and assemble them into a coherent catalogue.
  • Present them to guests under your own brand. The alternative today is a stack of leaflets at reception, a WhatsApp group, and a receptionist phoning around to check availability — with no tracking, no commission accounting, and no data.
  • Blend in their own in-house experiences. Many properties already organize their own activities (a wine night, a yoga session, a boat day). There was no way to mix those seamlessly alongside curated third-party providers in one branded storefront.

And the generic global marketplaces don’t fill this gap either: they’re built for the traveler, not the property. The hotel gets no branding, no control over the selection, and no real cut of the revenue.

So the market had two extremes — a fragmented, invisible supply of local providers on one side, and impersonal global OTAs on the other — and nothing that let a property discover, curate and resell local experiences (plus its own) as a professional, revenue-generating channel under its own brand.

That gap is ActivityHub.


How I built it

I designed ActivityHub as a multi-tenant SaaS platform where every property gets its own white-label storefront, its own admin panel, and access to a shared, curatable network of local providers — all on one codebase.

Here are the pieces that make it work:

1. A shared provider network + per-property curation

Providers publish their experiences once into a shared catalogue. Each property then curates: it browses available providers, picks the ones it trusts, and adds them to its own storefront — right alongside any in-house activities it organizes itself. One provider can be featured by many properties; each property controls its own selection and its own pricing/commission.

2. White-label storefronts

Each property gets a branded storefront (logo, colors, fonts, hero imagery, welcome copy) served from a single Next.js app. A guest browsing ?hotel=grand-hotel-santorini sees the property’s brand — not mine. It looks like a bespoke activities platform; in reality it’s one shared, multi-tenant system.

3. Two booking models: direct and on-request

Some activities can be booked instantly. Others — a private chef, a limited-capacity excursion — need the property (or provider) to approve first. I built an on-request approval workflow: the booking is held as pending_approval, capacity is reserved but not consumed, and staff approve or reject from their dashboard. Only approved bookings count against a slot’s capacity, so there’s no overbooking.

To keep guests from staring at a dead-end “pending” screen, each property configures an expected response time (“we usually reply within 24 hours”), which is shown right on the confirmation page.

4. Capacity that can’t be oversold

Booking systems live and die on concurrency. Two guests hitting “book” on the last two seats at the same instant is the classic race condition. I handle it with database-level row locking inside a transaction (lockForUpdate), so a slot can never be sold beyond its capacity — even under simultaneous requests.

5. Policy enforcement that protects revenue

The platform enforces the boring-but-critical rules automatically:

  • Cancellation cutoffs — cancel past the deadline and you can’t, per the activity’s policy.
  • No-show handling — a scheduled job reconciles past bookings: guests who checked in are marked completed, guests who didn’t show become no_show and forfeit payment, while the provider still gets paid at settlement. No-shows stop being free.
  • Refund rules — partial or full refunds are computed from each activity’s policy, with Stripe refunds issued automatically and cash-at-desk refunds flagged for staff.

6. Commission and settlements

The platform is a business, not a favor. Every booking carries a commission split — platform fee, optional intermediary cut, provider payout — and a settlement service batches paid bookings into periodic payouts with proper accounting. Properties enter their IBAN once; the system does the rest.

7. Check-in with QR codes

Every confirmed booking generates a QR voucher. A dedicated, PIN-protected check-in app lets staff scan guests on arrival — which is also what feeds the no-show logic upstream.

8. Purpose-built admin panels

  • Property panel — a bookings calendar, pending approvals, attendance and no-show metrics, provider curation, branding, banking, and per-property SMTP so guest emails come from the property’s own domain.
  • Provider panel — operators manage their experiences and see bookings across every property that offers them.

Who it’s for

ActivityHub is built for three audiences that all win at once:

  • Accommodations — hotels, villas and apartments — that want to turn their concierge desk into a branded, trackable revenue channel by curating local providers and their own experiences, without hiring a dev team or surrendering their guests to an OTA.
  • Activity providers who want one clean dashboard and distribution across many properties, instead of a graveyard of spreadsheets and phone calls.
  • Guests, who get a fast, trustworthy, on-brand booking experience instead of a handwritten note and a “we’ll call you back.”

Sweet spot: leisure destinations with a dense, fragmented supply of independent operators — think the Greek islands like Corfu — where activities are a genuine part of the stay, and where the current alternative is literally a rack of leaflets and pen and paper.


The stack

I built ActivityHub as a decoupled system: a Laravel API + admin core, and a Next.js storefront, deployed across a hybrid infrastructure.

Backend

  • Laravel 12 (PHP 8.2+) — REST API, domain logic, queued jobs, and scheduler
  • Filament 3 — the admin panels (Property, Provider), with custom widgets for the bookings calendar and analytics
  • Laravel Sanctum — API authentication
  • Stripe PHP — payments and automated refunds
  • L5-Swagger (OpenAPI) — self-documenting API
  • MySQL in production, SQLite for local development
  • Queued jobs for email, voucher/QR generation, no-show reconciliation, and pending-booking cleanup

Frontend

  • Next.js 16 with React 19 and TypeScript
  • Tailwind CSS 4 for the white-label theming layer
  • Stripe.js / React Stripe.js for the checkout
  • lucide-react for iconography

Infrastructure

  • Cloudflare — DNS, SSL (Full strict), CDN
  • Laravel on shared hosting serving the API + the Filament panels from the root domain
  • Next.js storefront and the check-in app on Render.com
  • A clean subdomain split: activityhub.gr (API + admin), app.activityhub.gr (storefront), checkin.activityhub.gr (check-in)

The interesting engineering isn’t any single framework — it’s the multi-tenancy running through every query, the concurrency-safe capacity model, and the money-handling logic (commissions, settlements, refunds, no-shows) that has to be correct every single time.


Try the live demo

Want to poke around? Here are working demo accounts for the beta.

Guest storefronts (white-label, one per property) — open these to browse and book as a guest:

Property Storefront URL
Grand Hotel Santorini app.activityhub.gr/?hotel=grand-hotel-santorini
Blue Palace Resort app.activityhub.gr/?hotel=blue-palace-resort

Property Admin Panel — activityhub.gr/hotel/login — sign in to curate providers, manage bookings, approve on-request requests, and watch the analytics:

Property Storefront Email Password
Grand Hotel Santorini Open storefront ↗ [email protected] password
Blue Palace Resort Open storefront ↗ [email protected] password

These are demo environments seeded with sample data — feel free to create bookings, approve on-request requests, and watch the dashboards update.


Built by Armenis Nick. Have a project that needs multi-tenant architecture, a booking engine, or a payments-heavy backend? Let’s talk.