Passwordless authentication
Email one-time codes with expiry and attempt limits, Google OAuth sign-in, and JWT sessions with automatic refresh.
Production-ready Django + React SaaS starter
SaaS Skeleton is a complete, tested codebase with passwordless authentication, multi-tenant workspaces, roles and permissions, team invitations and per-seat Stripe billing already wired together — so you spend your time on the product only you can build.
Log in to the live application and explore every feature before purchasing the source.
What's included
Every feature below is implemented, tested and running in the demo — not a roadmap item. Log in and verify each one yourself.
Email one-time codes with expiry and attempt limits, Google OAuth sign-in, and JWT sessions with automatic refresh.
Every account gets isolated workspaces with a switcher, settings, ownership rules and safe deletion guards.
Two-layer access control: workspace roles backed by Django groups, plus subscription-plan entitlements that gate features by plan.
Email invites with expiring tokens, a public accept flow, and seat-aware capacity checks before anyone joins.
Subscriptions with explicit seat counts, monthly and yearly prices, plan upgrades and downgrades with proration previews, cancel and resume.
Stripe Elements card management, default payment method, upcoming invoice preview and customer tax handling.
Themed HTML emails for sign-in codes and invitations. Console backend in development, SMTP-ready for production.
Full i18next setup with two languages shipped, plus locale-aware date and currency formatting throughout.
Add one CSS file to styles/themes and it automatically appears in the user's theme picker — light and dark included.
Django REST Framework with JWT auth, per-scope rate limiting, pagination, filtering, consistent error handling and Swagger docs.
make start boots PostgreSQL 16, applies migrations, seeds a superuser and the Stripe catalog, and forwards webhooks locally.
A complete todo CRUD with list views, filters, permissions and tests — a working template for your own features.
Product tour
Auth, tenancy and billing are where SaaS projects stall. Here they are finished — edge cases included.
No passwords to store, reset or leak. Users sign in with a short-lived email code or their Google account, and stay signed in with refresh-token JWT sessions.
Tenancy is not something you can bolt on later. Workspaces, memberships, custom roles and invitations are modeled in the database and enforced at the API layer from day one.
Real Stripe subscriptions with explicit purchased seats — not a placeholder pricing page. Proration previews, plan changes, seat updates, cancellation and webhooks are all implemented and tested.
Developer experience
The entire stack runs in Docker — no local Python or Node required. One command boots the database, applies migrations, seeds Stripe and starts the app.
Step 1
Get the full Django + React codebase with Docker Compose, Makefile and documentation for every subsystem.
Step 2
Copy the .env examples and add your Stripe test keys. Branding, app name and Google OAuth are simple env variables.
Step 3
PostgreSQL, migrations, a dev superuser, Stripe catalog seeding and local webhook forwarding — all from a single command.
Step 4
Replace the demo todo module with your own domain logic. Auth, tenancy, billing and permissions are already there.
$ git clone git@github.com:you/your-saas.git && cd your-saas$ cp server/.env.example server/.env$ cp client/.env.example client/.env# add your Stripe test keys — that is the only required edit$ make start✔ postgres 16 up · migrations applied · superuser created✔ stripe catalog seeded (Basic / Pro / Enterprise)✔ webhook forwarding running · app on http://localhost:5173├── Makefile # start, stop, migrate, stripe-webhooks├── docker-compose.yml # full local stack├── client/ # React 19 + Vite + Tailwind 4│ ├── src/pages/ # landing, auth, billing, workspaces│ └── src/styles/themes/ # drop-in theme CSS files└── server/ # Django 5 + DRF ├── users/ # OTP auth, Google OAuth, profiles ├── workspaces/ # tenancy, roles, invitations ├── billing/ # Stripe seats, webhooks, catalog └── todo/ # demo module — replace with your productTry a theme
Live on this page
/* client/src/styles/themes/twitter.css */:root { --primary: #1e9df1; --background: #ffffff; --radius: 0.8rem; /* …all tokens: colors, fonts, shadows */}.dark { --background: #0b0a12; /* dark variant of every token */}White-label ready
Themes are plain CSS variable files discovered at build time. Drop a new file into styles/themes and it instantly becomes a selectable option in every user's theme picker.
Drop-in themes
Any CSS file added to styles/themes is auto-registered — no code changes, no imports, no configuration.
Design tokens everywhere
Colors, fonts, radii and shadows are all CSS variables. The whole UI — including this landing page — follows the active theme.
Light and dark built in
Each theme ships light and dark variants, and users switch instantly with the built-in theme toggle.
Technology
No exotic frameworks to learn. Mainstream, well-documented technologies your team already knows and can hire for.
Django 5 + DRF
Battle-tested backend with DRF, SimpleJWT and Swagger docs
React 19 + Vite
Modern SPA with fast hot-reload development
Tailwind CSS 4
Utility-first styling with CSS-variable theming
PostgreSQL 16
Runs in Docker with persistent volumes
Stripe
Subscriptions, seats, webhooks and Elements
Docker Compose
Full local stack — no local Python or Node needed
JWT (SimpleJWT)
Access + refresh token sessions
i18next
Two languages shipped, easy to add more
Build vs. buy
Conservative estimates for one experienced full-stack developer implementing and testing each subsystem from scratch.
Explore the full application with a live account — sign in, create a workspace, invite members, run a test subscription. When you're convinced, buy the source and make it yours.
No credit card required to try. Purchasing gives you the complete source code.