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',
}

Event Hire Across Melbourne

One Click Events provides professional event hire services across all Melbourne suburbs including photo booths, DJ services, LED dance floors, games, and decorations. Free delivery within 50km of Melbourne CBD. Serving Inner City, Eastern, South Eastern, Northern, and Western suburbs.