Skip to content
Tenancy Kit

Tenancy Kit

Multi-tenant Laravel 12 SaaS starter: organizations and teams, Stripe + Paddle per-tenant billing, custom domains, Filament admin and impersonation.

Aucip Tenancy Kit is a Laravel 12 + Filament 5 starter for building multi-tenant SaaS products. Tenancy, teams, per-tenant billing, custom domains and a super-admin panel are built and connected: the tenant panel, billing webhooks and domain checks all share one tenant context. It runs on plain cPanel shared hosting (PHP 8.2+, MySQL, one cron line; no Docker, Redis or root needed) as well as on a VPS or Forge/Ploi.

Features

  • Two tenancy modes: single database with tenant_id scoping, or one database per tenant (MySQL/MariaDB/PostgreSQL).
  • Tenant-aware everything: queued jobs, cache, file storage, scheduler (tenants:run) and migrations (tenants:migrate).
  • Tenant identification: verified custom domain, {slug}.yourapp.com subdomain or /t/{slug} path, with configurable fallback.
  • Isolation tests: a Pest suite (--group=isolation) covering queries, cache, jobs, files, API tokens and roles across tenants.
  • Organizations & teams: org switcher, expiring email invitations, Owner/Admin/Member and custom roles (spatie/laravel-permission teams), ownership transfer.
  • Per-tenant billing: Laravel Cashier for Stripe and for Paddle Billing; plans, trials, per-seat quantity, a metered API-calls example, swap/cancel/resume, billing portal, idempotent webhooks, dunning emails.
  • Plans, features and limits: managed in the admin; gate routes with feature: / limit: middleware. Marketing and pricing pages read the plans table.
  • Custom domains: DNS TXT verification, hourly re-check, plan gating, Caddy on-demand TLS ask endpoint, Cloudflare for SaaS guide.
  • Super-admin panel (Filament 5): tenants, users, plans, MRR / active subscriptions / churn dashboard, audit log, user impersonation with a visible banner.
  • Tenant panel (Filament 5): members, billing, custom domains, API tokens, organization settings, example Projects resource.
  • Auth: email/password, email verification, password reset, TOTP two-factor with recovery codes, Google and GitHub login.
  • API: Sanctum tokens bound to an organization; versioned /api/v1 example endpoints.
  • Installers: php artisan kit:install (interactive or non-interactive) and a one-page web installer at /install; demo seeder.
  • Developer tooling: Laravel Sail, Pest, Larastan, Pint, GitHub Actions CI, and an AGENTS.md guide for AI coding agents.
  • Outbound calls: only to your billing gateway (Stripe/Paddle) and to aucip.com for licence and update checks (activation in the installer, then a daily re-verify).

Requirements

  • PHP 8.2+ with bcmath, intl, sodium, zip, pdo
  • MySQL 8.0+, MariaDB 10.6+ or PostgreSQL 15+ (SQLite for local use and tests)
  • One cron line; Redis + Horizon optional (VPS)
  • Stripe and/or Paddle account for billing; wildcard DNS for tenant subdomains

Compatibility (1.0.0)

Platform Version Status
PHP 8.2 Tested in CI (Pest, both tenancy modes; also Larastan and the browser job)
PHP 8.3 Tested in CI (Pest, both tenancy modes)
PHP 8.4 Tested in CI (Pest, both tenancy modes)
SQLite 3 (bundled with PHP, pdo_sqlite) Tested in CI (all tests run on in-memory SQLite); for local use and tests, not production
MySQL 8.0+ Supported per docs (not in CI)
MariaDB 10.6+ Supported per docs (not in CI)
PostgreSQL 15+ Supported per docs (not in CI)

CI: .github/workflows/ci.yml (PHP from composer.json: ^8.2). Database versions are from docs/install.md. CI runs no MySQL, MariaDB or PostgreSQL job.

What's included

  • Full Laravel 12 source code (tenancy-kit-1.0.0.zip) with prebuilt assets
  • Filament admin and tenant panels, migrations, seeders and demo data
  • Caddyfile for on-demand TLS, Sail compose.yaml
  • Pest test suite with the tenant-isolation suite, Larastan and Pint config, GitHub Actions CI (PHP 8.2–8.4, both tenancy modes)
  • HTML documentation: install (Sail, CLI, cPanel), Forge/Ploi deploy, configuration, usage, testing, AI-agent guide, upgrading, FAQ with comparisons, changelog
  • Free updates via aucip.com (with an activated licence key)
  • 6 months support, renewable

License prices

License Price Terms
Regular $179 Regular licence: use in one end product that end users are not charged for. Free updates while licensed and 6 months of support (renewable).
Extended $499 Extended licence: use in one end product that end users are charged for (for example a paid SaaS or paid membership). Free updates while licensed and 6 months of support (renewable).

One licence = one end product. Free local installs (localhost/.test) plus up to 3 staging installs on staging subdomains per licence; staging doesn't count against your production domain. Each additional end product needs another licence. Cannot be resold as a starter kit. Installation service: paid add-on, sold separately.

Launch offer: use coupon SAASLAUNCH25 for 25% off, valid for 7 days after launch, which brings the price to $134.25 Regular / $374.25 Extended (from $179/$499).

Support & updates

  • Free updates
  • 6 months support, renewable

Licence behaviour: the key is activated in the installer and re-verified once a day by cron. If verification fails, a 14-day grace period starts; after it, admin settings (Plans) and Updates lock until the licence verifies again. Tenants, users, billing and customer data never lock.

Live demo

Try the live demo.

Changelog RSS

v1.0.0 Oct 13, 2026 · stable
  • addedLicence install types: local installs (localhost, 127.0.0.0/8, ::1, [::1], 0.0.0.0, *.test, *.local) are free and never contact aucip.com; up to 3 staging installs on staging subdomains per licence (decided by the host only, no `.env` override), never using the production domain; activation sends `environment` (staging|production) + domain; the aucip.com server enforces the staging cap (signed 409 `staging_limit_reached`, shown as a clear message). Licence and update answers are verified over the exact signed bytes (`signed_payload`, Ed25519, pinned key) and only signed values are used; stale answers (>24 h) are refused. Every request sends a random nonce; signed answers whose domain, product, key_hash or nonce don't match the request are refused (`replay_mismatch`). Licence state is HMAC'd with APP_KEY and the guard record (last signed OK, signed first-seen, deactivated/invalid/tampered markers) is kept in both `storage/app/aucip/grace.json` and the `aucip_licence_state` table, merged most-restrictively; a tampered copy locks until the next signed valid answer. A public install without signed state is locked (admin settings/updates only) until aucip.com answers; the only first-use grace is 14 days from the server-signed `first_seen_at` (read from every signed activate/verify answer and refusal; keyless installs fetch it from `/updates/check?domain=…`, at most hourly; null = locked). Staging/dev/tunnel hosts fetch it too and are locked like production until a signed date exists (no pending window); besides cron, the lookup runs after admin-panel responses (hourly, 3 s timeout), so it works without cron; the plain update check sends the domain; dates up to a day ahead are clamped to now. Replay binding is strict: nonce, domain, product (and key_hash for keyed requests) must be present and match. The product slug `tenancy-kit` is pinned in code. Local and staging hosts are exempt; a deactivated install stays locked until a signed valid answer, whichever copy holds the marker. The grace clock is derived from the stored raw signed answers (re-verified with the pinned key on every read; HMAC'd markers only for deactivated/invalid/tampered/throttle). `*.sharedwithexpose.com` is a tunnel; `::1`/`[::1]` normalise to `::1` like the SDK. The Licence page shows production, staging and local activation counts as aucip.com reports them. Unparseable or future-dated stamps in licence state never crash and never block the first-seen lookup for more than an hour.
  • addedZip layout: everything in one top-level `aucip-tenancy-kit/` folder; production-only `vendor/` (run `composer install` before the tests). LICENSE file with Regular/Extended terms. New guides: plans and feature gates, Forge/Ploi deploy, testing, working with AI coding agents; FAQ "How it compares".
  • addedHost allow-list (`TRUSTED_HOSTS`); the release zip now ships the Pest suite, CI, Larastan/Pint config and an optional Sail setup.
  • addedSecurity: DEMO=true is default-deny for data (any Eloquent write in a web request is refused, all mail dropped); the demo super-admin exists only in the demo package; release demo users get a random password shown once.
  • addedSecurity: forwarded headers trusted only from `TRUSTED_PROXIES` (default none); billing webhooks return 403 until their signing secret is set and on bad signatures.
  • addedUpdater saves a code backup to `storage/app/updates` and restores it automatically if an update fails.
  • addedHarbor brand: Spruce/Stone/Brass/Clay + Moss success colour, self-hosted Onest, Bricolage Grotesque and JetBrains Mono, custom Filament theme, bento features, 4-column footer, mobile menu.
  • addedBilling page: trial badge and end date, cancel/portal on trials, downgrade to Free.
  • addedThin in-house tenancy layer: single-DB (default) and DB-per-tenant; tenant-aware queue, cache, storage, scheduler (`tenants:run`), migrations (`tenants:migrate`).
  • addedTenant identification by custom domain, subdomain and `/t/{slug}` path, with configurable fallback.
  • addedTeams: organizations, org switcher, expiring email invites, Owner/Admin/Member + custom roles (spatie/laravel-permission teams), ownership transfer.
  • addedPer-tenant billing with Cashier Stripe (primary) and Cashier Paddle: plans, trials, per-seat quantity, metered API-calls example, swap/cancel/resume, billing portal, idempotent webhooks, dunning emails.
  • addedCustom domains with DNS TXT verification, hourly re-check, plan gating, Caddy on-demand TLS ask endpoint.
  • addedFilament 5 super-admin panel (tenants, users, plans, MRR/churn, audit log, impersonation with banner) and tenant panel (native tenancy).
  • addedAuth: email/password, verification, TOTP 2FA with recovery codes, Google/GitHub login, tenant-scoped Sanctum tokens.
  • added`kit:install` wizard + web installer (licence activation, first-run `.env`/`APP_KEY`), demo seeder, Pest, Larastan, Pint, CI (PHP 8.2–8.4).
  • addedRuns on cPanel shared hosting: PHP 8.2+, MySQL, database queue drained by the `schedule:run` cron, root `.htaccess`/`index.php` forwarders. Horizon and Caddy optional.
  • addedStrict licensing: activation in the installer, daily re-verification, 14-day grace, then admin settings and updates lock (never customer data or the tenant app). Filament Licence and Updates screens. Free updates while the licence is valid; 6 months support (renewable).
  • added`DEMO=true` demo/screenshot mode: no licence banner, read-only admin records, writes blocked, hourly reset.

Reviews

No reviews yet.

Questions & answers

No questions yet.

Log in to ask a question.

You might also like