










Tenancy Kit
Multi-tenant Laravel 12 SaaS starter: organizations and teams, Stripe + Paddle per-tenant billing, custom domains, Filament admin and impersonation.
- #custom domains
- #database per tenant
- #filament 5
- #impersonation
- #laravel 12 boilerplate
- #laravel cashier stripe
- #laravel saas starter
- #laravel starter kit
- #multi-tenant laravel
- #paddle billing
- #saas boilerplate
- #teams and roles
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_idscoping, 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.comsubdomain 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
askendpoint, 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/v1example 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.mdguide 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
Changelog RSS
- 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.