Back to projects

Project Details

Multi-Tenant Hotel Management SaaS (Backend Lead)

A Laravel 12 multi-tenant hospitality SaaS where one deployment serves every client brand on its own domain, with payments abstracted behind a four-driver gateway layer.

ongoingLast updated Aug 4, 2026

What It Does

  • Runs hotel operations for many tenants from one codebase, scoped by property and gated by plan entitlements.
  • Accepts payments through four interchangeable gateways without leaking gateway specifics into business logic.
  • Serves each client's own branded domain from a single deployment.

Architecture Highlights

  • The gateway contract and registry mean adding a fifth payment provider is a new driver, not a change to checkout logic.
  • Payments and subscription billing are deliberately separate concerns, so a gateway change cannot disturb billing.
  • Tenant resolution happens at the edge, before the application, keeping per-request tenancy cheap.
  • A Docker and Caddy deployment stack with per-environment Compose files and wildcard TLS is reused across three products.

Key Features

Tenancy & Access Control

  • Four-tier platform, owner, staff, and guest access model
  • Per-property RBAC scoping applied across the endpoint surface
  • Plan-and-feature entitlement middleware gating features per subscription

Payments Abstraction

  • One gateway contract and registry fronting Stripe, Checkout.com, SSLCommerz, and manual drivers
  • Per-gateway client factories and webhook signature verifiers
  • Money and payment-session value objects instead of raw amounts passed around
  • Idempotent webhook-event recording, kept architecturally separate from subscription billing

White-Label Custom Domains

  • Domain-verification records carrying token, status, and timestamps, with a conflict detector on the API
  • Next.js 16 edge middleware that resolves the Host header to a tenant and injects scoped headers
  • One deployment serves every client brand's own domain

Test Coverage

  • 149 test files and 1,030 tests run against MySQL on every pull request
  • 35 of those files dedicated to the payments layer alone

Tech Stack

Backend

  • Laravel 12
  • PHP 8.4
  • MySQL

Payments

  • Stripe
  • Checkout.com
  • SSLCommerz

Edge & Frontend

  • Next.js 16
  • Edge middleware

Delivery

  • Docker
  • Caddy
  • CI test suite

Performance & Product Notes

  • 1,030 tests run against a real MySQL instance on every pull request rather than against mocks.
  • Idempotent webhook recording keeps duplicate gateway callbacks from double-charging or double-crediting.
  • A documented staging-to-production promotion flow makes releases repeatable across tenants.

© 2026 Md Sajjadur Rahaman

Built with