Tenant id on every query path
Membership and tenant scoping were enforced in data access helpers—not left to individual pages to remember.
Platform
A B2B operations product needed a first public cut: real onboarding, role boundaries, and a shell that could accept billing later without a rewrite.
The team had UI prototypes but no durable tenancy model. Demo accounts shared data accidentally. Content edits required developer deploys. Subscription thinking was postponed until it became a blocker for paid pilots.
Membership and tenant scoping were enforced in data access helpers—not left to individual pages to remember.
Clear boundaries reduced the chance of leaking admin tools into customer sessions.
Customer and plan fields exist. Checkout waits. The schema does not pretend money is handled when it is not.
Next.js + TypeScript. Supabase/Postgres for persistence. Auth.js for sessions. Structured homepage/blog/project content for the marketing surface. Feature flags gate incomplete modules.
Phase one delivered invite-based onboarding, role-aware app shell, core operational workflow, and content editing for public pages. We documented how to add billing and reporting modules against the existing tenant model.
The team ran real onboarding demos on a system with proper boundaries. Later billing and reporting work has a place to land. Operators know which surfaces are customer-facing versus internal.
Stripe checkout, usage reporting, and finer admin roles are natural phase-two items on the existing foundation.
Screenshots
Tell us about the workflow, the tools involved, and what “done” means for the first release.
Plan a SaaS foundation