Multi-tenancy means you run one installation of Slotara and host unlimited businesses on it — each business gets their own isolated workspace, booking page, and data. They can never see each other's information.
Think of it like a shared office building: every tenant has their own locked office (their data), but the building infrastructure (the platform) is shared.
┌─────────────────────────────────────────────────────┐
│ One Slotara Install │
│ │
│ ┌─────────────────┐ ┌─────────────────────┐ │
│ │ Salon A data │ │ Clinic B data │ │
│ │ (isolated) │ │ (isolated) │ │
│ └─────────────────┘ └─────────────────────┘ │
│ │
│ Each business sees only their own data │
└─────────────────────────────────────────────────────┘
{danger.fa-ban} Only Super Admins can see data across all businesses. Never share the
/adminpanel access with business owners — they should only log in at/manage.
Every major resource is fully isolated per tenant:
| Resource | Isolated | Storage |
|---|---|---|
| Services | ✅ Yes | tenant_id scoped |
| Providers | ✅ Yes | tenant_id scoped |
| Staff | ✅ Yes | tenant_id scoped |
| Bookings | ✅ Yes | tenant_id scoped |
| Clients | ✅ Yes | tenant_id scoped |
| Email Templates | ✅ Yes | tenant_id scoped |
| Business Settings | ✅ Yes | tenant_id scoped |
| Uploaded Files | ✅ Yes | Stored under storage/{tenant_id}/ prefix |
| User Accounts | ⚠️ Shared | Users can belong to multiple tenants |
| Subscription Plans | ❌ Global | Managed by Super Admin, shared across all tenants |
{primary.fa-info-circle} User accounts are platform-level. A single user can be a
providerin Tenant A and atenant_ownerin Tenant B — roles are tenant-scoped, user records are not.
Every tenant gets a unique public URL:
https://yourdomain.com/{slug}
The slug is set at tenant creation and must be unique across the entire platform. It cannot be changed after creation without updating the URL in the booking page route.
Slug requirements:
my-salon, john-photography, city-dentist{warning.fa-globe} The booking page is publicly accessible to anyone with the URL. Security-by-obscurity is not a substitute for proper access controls.
While most tenants register through the public sign-up page, super admins can provision a tenant directly:
/{slug})What provisioning does:
Admin clicks Save
↓
Tenant record created
↓
Owner user linked (created if new)
↓
Default business settings initialised
↓
Welcome email sent to owner
↓
Owner can access /manage immediately
Manually provisioned tenants are not billed through Stripe automatically. Manage their billing separately from your Stripe Dashboard if required.
{primary.fa-code} This section is for developers extending or customising Slotara.
How isolation works under the hood
Slotara uses single-database multi-tenancy. Every tenant-aware table has a tenant_id column. A global Eloquent scope (TenantScope) automatically appends WHERE tenant_id = X to every query in the Business Panel — no manual filtering needed in controllers.
// You write:
$services = Service::all();
// What runs:
// SELECT * FROM services WHERE tenant_id = 5
Models NOT scoped (global, shared across all tenants):
User — platform-wide accountsSubscriptionPlan — plan definitionsRole / Permission — permission recordsTenantContext helper
use App\Support\TenantContext;
$tenant = TenantContext::current(); // full Tenant model (or null outside Business Panel)
$tenantId = TenantContext::id(); // int or null
if (TenantContext::current()) {
// Running inside the Business Panel — always non-null here
}