Skip to content

SaaS Module Overview

LMS Hub SaaS is a premium add-on module for EduLab LMS that transforms your single-tenant LMS installation into a full multi-tenant SaaS platform. Instead of running one LMS for your own students, you can sell LMS instances to other schools, businesses, and trainers — each getting their own fully isolated LMS.


What It Does

When the SaaS module is installed and active, your EduLab application gains:

  • A public landing site with a pricing page and marketing sections
  • A self-service registration form where customers pick a plan and create their own subdomain
  • Automated tenant provisioning — a new, fully isolated LMS instance is created in the background
  • Subscription billing — plans, invoices, and payment processing for each tenant
  • A SaaS admin panel for managing all tenants, subscriptions, and platform settings
  • A tenant owner billing portal where customers manage their own subscription
  • Two database modes — separate databases per tenant or a single shared database
  • Module manager — install, enable/disable, and uninstall LMS modules across the platform
  • System tools — cache management, storage link, license management

Key Concepts

TermMeaning
TenantA customer's LMS instance. Each tenant has its own database (or shared with tenant_id isolation) and subdomain (e.g. acme.yourdomain.com)
Tenant OwnerThe person who registered and pays for the tenant account (a User with the TenantOwner role)
PlanA subscription tier with defined limits (max users, max courses, storage) and a price
BillingA subscription record — which plan a tenant is on, when it renews, and its status
InvoiceA billing document generated each billing cycle
PaymentA record of a payment transaction against an invoice
TrialA period where a tenant uses a paid plan for free before their card is charged
Central DomainYour main domain (e.g. yourdomain.com) where the SaaS admin panel and landing pages live
Tenant DomainA subdomain (e.g. acme.yourdomain.com) or custom domain assigned to a tenant

Architecture

Central Domain (yourdomain.com)

├── Landing + Pricing          ← LandingController
├── /tenant/register           ← TenantProvisioningController
├── /tenant/login              ← Auth\LoginController (web + admin guard)
├── /billing                   ← Redirects to first owned tenant billing
├── /billing/{tenantId}/*      ← Tenant owner billing portal
└── /saas/admin/*              ← SaaS admin panel (admin guard)

Tenant Subdomains (*.yourdomain.com)
└── Full EduLab LMS per tenant (isolated DB or tenant_id scoping)

Feature List

Tenancy

  • Multi-tenant architecture using Stancl Tenancy v3
  • Separate database mode (one MySQL DB per tenant) — default
  • Single database mode (shared DB with automatic tenant_id scoping)
  • Automatic tenant column synchronization when switching modes
  • Session isolation per tenant domain via SessionTenancyBootstrapper

Billing & Subscriptions

  • Subscription plans with monthly / annual billing cycles
  • Free plan + paid plans with trial support
  • Payment-first provisioning for paid signups (tenant is created only after verified payment)
  • Optional trial-with-card verification flow before provisioning
  • 7 payment gateways: Stripe, PayPal, Razorpay, Paystack, PayU, Xendit, Offline/Bank Transfer
  • Automated invoice generation and PDF download
  • Auto-renewal with configurable retry and reminder scheduling

Admin Management

  • Admin: suspend, reactivate, cancel, renew any subscription
  • Tenant owner: upgrade, downgrade, cancel, toggle auto-renew
  • SaaS admin dashboard with stats (total tenants, revenue, recent activity)
  • Module manager with license activation
  • System tools: cache clear/optimize, storage link

Landing & Marketing

  • Landing pages: Home, Pricing, About, Contact, Blog, Plan Detail
  • Pricing toggle (monthly / annual) with savings badge

Security

  • Central admin vs tenant admin authentication isolation
  • Session fixation protection on all login paths
  • Audit logging for billing settings changes
  • Payment data encryption at rest

Requirements

  • EduLab LMS v2.0+ fully installed and working
  • PHP 8.2+
  • MySQL 8.0+
  • Laravel Scheduler running (php artisan schedule:run every minute via cron) or Laravel Queue Work running (php artisan queue:work)
  • DNS wildcard record *.yourdomain.com pointing to your server (for subdomains)
  • Separate DB mode only: MySQL user with CREATE DATABASE / DROP DATABASE privileges

Note: The SaaS module is a separate purchase from the base EduLab LMS. You need a working EduLab installation before installing this module.


Module Documentation

PageDescription
Quick StartStep-by-step setup guide
Database ModesSeparate vs single database configuration
SaaS SettingsPlatform settings (database mode, routes, module controls)
Billing SettingsCurrency, trials, auto-renewal, gateways, security
AuthenticationLogin guards, session isolation, tenant vs central auth
Admin DashboardSaaS admin panel overview
TenantsTenant management (create, view, custom domains)
BillingSubscription lifecycle, trials, renewal, suspension
InvoicesInvoice generation, viewing, and PDF export
Provisioning ConsoleReal-time tenant setup console
Tenant PortalSelf-service registration and billing portal
Landing SiteLanding page layout and customisation
System ToolsCache, storage, license management
Module ManagerInstalling and managing LMS modules
Module CompatibilityModule-tenant compatibility rules
Plans & SubscriptionsCreating and managing subscription plans
Payment GatewaysGateway configuration and API keys
ENV ReferenceAll environment variables with defaults
Route Context RulesMiddleware and route scoping rules

Important Behaviour Notes

  • Disabling Trial Enabled affects new signups only; existing trial tenants are not deleted or auto-moved to free.
  • When a trial expires, subscription status is moved to inactive and tenant access is locked until renewal/upgrade.
  • Enterprise-style plans are typically configured as custom pricing (price = 0 + CTA link), and handled by sales/contact flow.
  • In single database mode, all tenant data is scoped by tenant_id — no cross-tenant leakage is possible as long as queries go through Eloquent models.