A Laravel SaaS starter schema with subscriptions, roles, a blog/CMS, and dynamic forms. Billing-vendor-agnostic by design, so subscriptions can sit behind Stripe, Paddle, or anything else with no schema changes.
What this Wave schema covers
User auth, 2FA, and OAuth provider linking
Plan-based subscriptions across multiple billing vendors
Spatie-style roles, permissions, and policy guards
Blog posts, pages, nested categories, and changelogs
Dynamic forms with JSON-defined fields and entries
Themes, theme options, and key/value site settings
Further details:
plans.role_id ties every plan to a role, so granting a subscription is the same as granting role-based feature access.
plans.limits is a JSON column holding per-feature quotas that Wave reads for in-app limit checks.
profile_key_values is a polymorphic EAV table with a composite unique on (keyvalue_id, keyvalue_type, key) for arbitrary per-model attributes.
users has both deletion_scheduled_at and deleted_at, giving a grace period before the soft-delete actually fires.
social_provider_user uses a composite PK of (user_id, provider_slug), so each Socialite provider gets one linked row per user.
forms.fields and form_entries.data are both JSON, so form schemas and submissions stay schemaless by design.
Good fork target if you want a Laravel SaaS shell with multi-vendor billing already abstracted. Heads up: api_keys.key is stored as plaintext varchar, so swap in a hash column before going to production.
Laravel SaaS starter kit from DevDojo for subscription-based apps. — Wave is a Laravel SaaS starter from DevDojo. The schema models a subscription product, with billing abstracted so the same plans work across multiple payment vendors.