Back
Building Multi-Tier SaaS Plans: Roles, Permissions, and Billing Logic

Photo by Clément H on Unsplash

Building Multi-Tier SaaS Plans: Roles, Permissions, and Billing Logic

MT
MVPHub Team
4 min read

Building Multi-Tier SaaS Plans: Roles, Permissions, and Billing Logic

Multi-tier plans are the backbone of SaaS pricing. But connecting plan tiers to feature access and user roles requires careful design. Get it wrong and users either get too much access (revenue loss) or too little (support tickets). Here's how to build it right.


Plan Architecture

Define Your Tiers

TierTarget UserPricingKey Differentiators
FreeIndividual exploring$0/moBasic features, limited usage
StarterSolo professional$19/moCore features, standard limits
ProGrowing team$49/moAdvanced features, higher limits, team seats
BusinessScaling company$99/moAll features, priority support, custom limits

Feature Matrix

FeatureFreeStarterProBusiness
Core feature10/mo100/mo1,000/moUnlimited
Export to CSVNoYesYesYes
API accessNoNoYesYes
Team members11525
Custom brandingNoNoNoYes
Priority supportNoNoNoYes

Permission System

Feature Flags Approach

The simplest way to control access is a feature flag system tied to the user's plan:

Plan configuration object:

PLAN_FEATURES = {
  free:     { maxProjects: 3,  maxTeamMembers: 1,  hasApiAccess: false, hasExport: false },
  starter:  { maxProjects: 10, maxTeamMembers: 1,  hasApiAccess: false, hasExport: true  },
  pro:      { maxProjects: 50, maxTeamMembers: 5,  hasApiAccess: true,  hasExport: true  },
  business: { maxProjects: -1, maxTeamMembers: 25, hasApiAccess: true,  hasExport: true  },
}

Checking Permissions

On every request that involves a gated feature:

  1. Get the user's current plan from the database
  2. Look up the plan's permissions in the config
  3. Allow or deny the action

Server-side (critical): Always check plan permissions on the backend. Client-side checks are for UX only (showing/hiding UI elements).

Client-side (UX): Hide or disable features the user can't access. Show an upgrade prompt instead.


Team Roles (Within a Plan)

RolePermissionsUse Case
OwnerEverything + billing + delete accountAccount creator
AdminEverything except billing and account deletionTeam leads
MemberUse features, no settings changesRegular team members
ViewerRead-only accessStakeholders, clients

Implementation

  • User table has a role column
  • TeamMember join table connects users to teams with a role
  • Middleware checks both plan permissions AND user role

Billing Logic

Connecting Plans to Stripe

Your AppStripe
Plan name (free, starter, pro, business)Product ID
Monthly/annualPrice ID
User's active planSubscription status + Price ID

Enforcement Flow

User tries to access a feature
  → Check user's subscription status (active? trialing?)
  → Check user's plan (which price ID?)
  → Map price ID to plan tier
  → Check plan tier's permissions
  → Allow or deny + show upgrade prompt

Upgrade Prompts

When a user hits a plan limit, show a contextual upgrade prompt:

Good: "You've used 10/10 projects on the Free plan. Upgrade to Starter for up to 100 projects." Bad: "Upgrade to unlock more features." (too vague)

Best placement:

  • Inline, at the point of action (user tries to create 11th project)
  • Dashboard widget showing usage (8/10 projects used)
  • Settings/billing page

Setting up billing? Read How to Build SaaS Billing With Stripe.

Need a boilerplate with plans? Browse on MVPHub.


Working products with full source code — live demo, one-time purchase, instant delivery.

Browse the marketplace
GR LIVEecommerce

Groover Multi-Purpose Store

$149

A fully-polished, multi-purpose e-commerce template engineered for brands that need the full feature set on day one — not a minimal starter you outgrow in a month. Groover ships with a live Medusa-backed catalog, category + collection merchandising, search with multi-facet filtering (category, collection, price, sale, stock, sort), product-detail with variant selection + image gallery + stock messaging + related products, Stripe Elements checkout with provider-aware setup panels, account dashboard with guest order lookup and authenticated order history, customer auth with login/register/logout/profile edit, wishlist with guest browser persistence and signed-in customer sync, blog list + detail, store directory, track-order page, branded 404, About/Contact/FAQ/Terms legal shell, GTM-friendly dataLayer wired into PDP/cards/wishlist/cart/checkout/search, locale + RTL foundation with persistent language switcher, PWA installability baseline, theme switching that applies before hydration and persists in both local storage and cookies, header active-route navigation with live mini-cart summary, skip-link / focus accessibility basics, app-level and route-level loading fallbacks, a recoverable error boundary, generated robots.txt and sitemap.xml, shared SEO metadata helpers, and a Playwright / Vitest / Lighthouse test harness. Every copy string lives in a typed content map so rebranding is a find-and-replace pass, not a code rewrite. Deploy it as-is or use it as the most complete starting point you can buy for a serious storefront.

★★★★★0 soldAstro · Medusa
FU LIVEecommerce

Furniture Store

$49

An elegant furniture and home furnishing e-commerce app with a design-forward Next.js storefront for SEO-optimized product pages and server-rendered category browsing. Alternative framework and mobile ports are available on demand. The visual design emphasizes large product imagery, room-based browsing, and material/color variant selection. Built with Radix UI, shadcn/ui, Tailwind CSS, and Framer Motion for a premium feel. Connects to any headless commerce backend — Medusa JS SDK integration is included. Form handling via React Hook Form with Zod validation ensures robust checkout and account flows. Great for furniture brands, interior design shops, or home decor marketplaces.

★★★★★0 soldExpo · Next.js
PE LIVEecommerce

Perfume Store

$49

A luxury-styled perfume and fragrance e-commerce app built for premium brand presentation. The ready-to-buy Next.js storefront features rich product pages with scent profiles, bottle size variants, gift set options, and server-rendered collections. Mobile, backend, and alternative framework ports are available on demand. The design uses shadcn/ui and Tailwind CSS with an elegant, minimalist aesthetic suited for luxury goods. Easy to customize — swap product data, update branding, and deploy. Perfect for perfume brands, fragrance boutiques, or niche scent marketplaces.

★★★★★0 soldMedusa · Expo

Keep reading — popular SaaS guides on MVPHub.

All SaaS articles

Explore other MVP verticals

MVPHub publishes templates and guides for ecommerce, SaaS, marketplaces, AI apps, booking platforms, subscription stores, directory sites, and more. Here are fresh picks from other verticals.