Pricing Plans

How to configure and customize pricing plans for your SaaS application.

Note: This is mock/placeholder content for demonstration purposes.

Configure your pricing structure to match your business model.

Plan Structure

Each pricing plan consists of:

  • ID - Unique identifier
  • Name - Display name
  • Price - Amount in your currency
  • Interval - Billing frequency (month, year)
  • Features - List of included features
  • Limits - Usage constraints

Example Configuration

// config/billing.config.ts
export const billingConfig = {
  provider: 'stripe', // or 'paddle'
  currency: 'usd',
  plans: [
    {
      id: 'free',
      name: 'Free',
      description: 'Perfect for getting started',
      price: 0,
      features: [
        '5 projects',
        'Basic analytics',
        'Community support',
      ],
      limits: {
        projects: 5,
        members: 1,
      },
    },
    {
      id: 'starter',
      name: 'Starter',
      description: 'For small teams',
      price: 19,
      interval: 'month',
      features: [
        '25 projects',
        'Advanced analytics',
        'Email support',
        'API access',
      ],
      limits: {
        projects: 25,
        members: 5,
      },
    },
    {
      id: 'pro',
      name: 'Professional',
      description: 'For growing businesses',
      price: 49,
      interval: 'month',
      popular: true,
      features: [
        'Unlimited projects',
        'Advanced analytics',
        'Priority support',
        'API access',
        'Custom integrations',
      ],
      limits: {
        projects: -1, // unlimited
        members: 20,
      },
    },
  ],
};

Feature Gating

Restrict features based on subscription plan:

import { hasFeature } from '~/lib/billing/features';

async function createProject() {
  const subscription = await getSubscription(accountId);

  if (!hasFeature(subscription, 'api_access')) {
    throw new Error('API access requires Pro plan');
  }

  // Create project
}

Usage Limits

Enforce usage limits per plan:

import { checkLimit } from '~/lib/billing/limits';

async function addTeamMember() {
  const canAdd = await checkLimit(accountId, 'members');

  if (!canAdd) {
    throw new Error('Member limit reached. Upgrade to add more members.');
  }

  // Add member
}

Annual Billing

Offer discounted annual plans:

{
  id: 'pro-annual',
  name: 'Professional Annual',
  price: 470, // ~20% discount
  interval: 'year',
  discount: '20% off',
  features: [ /* same as monthly */ ],
}

Trial Periods

Configure free trial periods:

export const trialConfig = {
  enabled: true,
  duration: 14, // days
  plans: ['starter', 'pro'], // plans eligible for trial
  requirePaymentMethod: true,
};

Customizing the Pricing Page

The pricing page automatically generates from your configuration:

import { billingConfig } from '~/config/billing.config';

export default function PricingPage() {
  return (
    <PricingTable
      plans={billingConfig.plans}
      currency={billingConfig.currency}
    />
  );
}

Adding Custom Features

Extend plan features with custom attributes:

{
  id: 'enterprise',
  name: 'Enterprise',
  price: null, // Contact for pricing
  custom: true,
  features: [
    'Everything in Pro',
    'Dedicated support',
    'Custom SLA',
    'On-premise deployment',
  ],
  ctaText: 'Contact Sales',
  ctaUrl: '/contact',
}