Aug 7, 2025

Aug 7, 2025

The Complete Guide to Supabase Pricing Models and Cost Optimization

The Complete Guide to Supabase Pricing Models and Cost Optimization

Aug 7, 2025

Aug 7, 2025

• 9 min read

• 9 min read

Koshima Satija

Koshima Satija

Co-founder, Flexprice

Co-founder, Flexprice

Supabase is a leading open-source backend platform built on PostgreSQL, offering developers a complete toolkit to build, scale, and manage modern web and mobile applications. From real-time databases and authentication to edge functions and storage, it provides the infrastructure teams need, without the complexity of managing it themselves.

Its pricing model is built to match that flexibility, scaling smoothly from hobby projects to enterprise deployments without forcing you to re-architect or renegotiate. In this guide, we’ll break down how Supabase pricing works: plan tiers, usage-based overages, compute and storage add-ons, and how to choose the right setup based on your needs (or apply the same logic to your own SaaS).

What is Supabase?


supabase-homepage


Supabase is an open-source backend-as-a-service that gives developers everything they need to build, ship, and scale modern applications, without managing infrastructure. It’s built on PostgreSQL and offers a full set of tools out of the box: database, authentication, file storage, edge functions, and real-time APIs.

It’s often called the “open-source Firebase alternative,” but Supabase is designed with SQL-first devs in mind. You get a familiar relational database, unrestricted data access, and the ability to self-host or deploy instantly in the cloud. Whether you’re building an internal tool, an AI or agentic product, or a mobile app, Supabase handles the backend so you can focus on your app logic.

Key Features:

  • PostgreSQL database with instant REST & GraphQL APIs

  • Authentication & user management with email, OAuth, magic links, and more

  • Supabase Storage for file uploads, access control, and CDN delivery

  • Edge Functions (based on Deno) for server-side logic and scheduled jobs

  • Real-time subscriptions for syncing data via websockets

  • Row-level security and policies for fine-grained access control

  • Built-in dashboard for managing usage, projects, roles, and logs

  • Self-hosting support for full ownership and compliance

How Supabase’s pricing model works today

Supabase uses what’s called a hybrid pricing model: base fee with usage-based charges. That means you pay a fixed monthly fee for a base plan, then pay extra if you cross certain usage limits.

This model isn’t unique to Supabase. You’ll see it in most AI and agentic platforms, because it aligns pricing with actual resource usage. But what makes Supabase more transparent than most is that it clearly separates fixed and variable costs, and gives developers control over spend through usage dashboards and a default spend cap.

How Supabase plans scale with you

Supabase offers four main pricing tiers: Free, Pro, Team, and Enterprise. On paper, they look like standard SaaS plans, but in practice, each tier is structured to match a very specific stage of growth.

  • Free is meant for side projects and experiments. You get generous limits.

    • 50k MAUs

    • 500 MB database

    • 5 GB egress

    • But only two projects and limited backups.

Inactivity also leads to auto-pausing, which keeps infrastructure costs in check.

  • Pro ($25/month) is the default choice for solo devs, indie projects, or early-stage startups. It bumps up your limits

    • 100k MAUs

    • 8 GB DB per project

    • 250 GB egress

    • 100 GB file storage

    • Up to 100 projects

Importantly, the Pro tier includes $10 of compute credit and turns on spend caps by default, so your bill stays predictable.

  • Team ($599/month) is where compliance kicks in. You get SSO, SOC 2 reports, longer backup retention, and log storage for 28 days. You’re not paying for more compute, you’re paying for enterprise grade security.

  • Enterprise (custom pricing) adds SLAs, 24/7 support, a private Slack channel, and the ability to deploy in your own cloud (BYO cloud). This tier isn’t usage-driven; it’s risk-driven. If your company needs legal reviews and uptime guarantees, this is what you choose.

What’s notable here is the steep jump from Pro → Team. It’s intentional. Supabase doesn’t blur the lines between indie use and enterprise use. If you’re asking for SSO and audit logs, you’re likely a B2B company, and Supabase prices accordingly.

We'll get into the actual resource allocations in the next section. But for now, the key takeaway: these tiers aren’t just about features, they’re about stage of usage.

What you get with each Supabase plan

Pricing pages usually show numbers, MAUs, GBs, API calls. But what do those limits actually mean when you’re building a real product?

Let’s break it down:

  • 100k MAUs on Pro is more than enough for most SaaS or mobile apps in early stages. MAU here means a user who makes a request during the month. So if your app has 20k users, but only 10k use it monthly, you’re using 10k MAUs.

  • 250 GB egress sounds like a lot, but it depends on what you’re serving. For a chat app or text-based API, you’ll barely touch it. But if you’re serving media, it adds up fast. For example, 5,000 users downloading a 50 MB audio file = 250 GB egress, your entire monthly quota.

  • 8 GB of database per project is generous for most early apps. If you serve heavy files, large reports, image-heavy dashboards, or exports, you’ll need to monitor usage more closely

  • Edge functions: Pro gives you 2 million invocations/month. This easily covers authentication, webhooks, and lightweight processing. If you're running cron jobs or heavy AI workflows, this will be the first thing that hits a limit.

  • Storage (100 GB) covers basic file uploads like profile pictures, PDFs, and small media. But you’ll want to monitor this if you're working with audio, video, or user-generated content.

Most devs won’t hit these limits for months—but once you do, overages kick in. And that’s where understanding usage upfront matters. Supabase gives you headroom to build, but if you’re not tracking usage, things can add up quickly.

When and why overages kick in

Every Supabase paid plan includes generous monthly limits—but once you cross those, overages start. These aren’t hidden fees; they’re usage-based charges tied directly to infrastructure costs.

Here’s how it works:

Metric

Pro Plan Limit

Overage Rate

MAUs

100,000

$0.00325 per extra user

Egress (bandwidth)

250 GB

$0.09 per extra GB

File Storage

100 GB

$0.021 per extra GB

Edge Function Calls

2 million/month

$2 per million calls

Let’s say your app grows to 150k MAUs, that’s 50k over the limit. You’ll pay 50,000 × $0.00325 = $162.50 extra that month.

This is standard for infrastructure pricing. You get a base quota, and then pay linearly beyond that. Think of it like a phone plan, your monthly charge covers normal use, and you’re billed extra for anything beyond.

What’s helpful is that Supabase gives you usage dashboards and lets you set a spend cap. So if you don’t want to ever go above $25/month, you can lock it there. But if you’re okay with variable cost based on growth, the system scales with you.

Get started with your billing today.

Get started with your billing today.

How Supabase handles compute, storage, and performance upsells

Supabase lets you scale specific parts of your infrastructure; compute power, disk type, and disk size, without jumping to a higher pricing tier.

This is especially useful if most of your projects are small, but one of them needs more power or performance.

Compute instances

Each Pro project starts with a “Micro” instance (1 vCPU, 1 GB RAM). You can upgrade to more powerful configurations—from Small (2 GB RAM) up to 64-core, 256 GB instances.

Pricing scales linearly. Example:

  • Micro: included

  • Small: ~$7/month

  • Large: ~$48/month

So if one of your apps is CPU-bound or handling heavier queries, you can scale just that instance without changing your Supabase plan.

Disks and storage performance

By default, Supabase uses General Purpose disks. If your app needs faster read/write speed, you can switch to High Performance disks for an added cost.

  • General Purpose: $0.125 per GB (after the first 8 GB)

  • High Performance: $0.195 per GB

You also pay based on disk size and the IOPS (Input/Output Operations per Second) and throughput you select.

This modular approach gives you control. You’re not forced into paying $599/month just because one database needs better performance. You upgrade what matters, leave the rest alone.

How Supabase reduces bill anxiety for developers

Supabase is one of the few platforms that bakes billing safeguards into the product.

  • Spend Cap Enabled by Default

    On the Pro plan, projects won’t exceed the $25/month base unless you manually turn off the cap. That means no surprise overages.

  • Real-Time Usage Tracking

    You can monitor MAUs, egress, storage, and function calls directly from the dashboard, with alerts when you approach limits.

  • Free Projects Auto-Pause

    Inactive free projects are paused after 7 days, so you’re not unintentionally racking up usage if you upgrade later.

These features give developers control over cost without needing to set up external monitoring or worry about billing blowups.

Why Supabase doesn’t offer annual plans

Supabase only offers monthly billing. No discounts for paying yearly, no lock-in contracts. That’s by design.

Most developers don’t want to commit to a full year when the product, team, or usage might change in three months. Monthly billing gives them room to experiment, pivot, or shut things down, without chasing refunds or getting stuck with credits they won’t use.

It also matches the way most infrastructure scales: gradually. You start small, track usage, and decide when to grow. Supabase supports that pace by keeping costs flexible and commitment low.

If you're running long-term production workloads, it’s still easy to set up autopay and let things run. But the monthly cycle keeps decision-making in the developer’s hands, not tied to finance timelines or annual renewals.

How to choose the right Supabase plan for your project

If you’re unsure which Supabase plan fits your needs, start by mapping your current workload, not just your budget.

Choose free if:

  • You’re building a prototype, hackathon project, or MVP.

  • You don’t need backups or team access.

  • You’re okay with the project being paused after 7 days of inactivity.

Choose Pro ($25/month) if:

  • You’ve shipped something to real users.

  • You want usage caps, backups, custom domains, and more storage.

  • You need cost controls but also room to grow.

Choose Team ($599/month) if:

  • You need SSO, SOC 2 compliance, or longer backup/log retention.

  • You’re working in a regulated environment or selling to enterprises.

  • You want shared project access and audit history.

Choose Enterprise (Custom) if:

  • You need uptime SLAs, 24/7 support, or a BYO cloud setup.

  • Your organization requires legal reviews and vendor agreements.

If you’re still unsure, start with Pro. The spend cap keeps things safe, and you can monitor usage before upgrading anything.

How can you replicate Supabase’s pricing with Flexprice

This guide demonstrates how to replicate Supabase's comprehensive multi-tier pricing structure using flexprice.io. Perfect for Backend-as-a-Service (BaaS) and AI companies with complex usage-based billing requirements.

Supabase uses a sophisticated multi-tier pricing model with usage-based scaling:

Plan

Base Price

Key Features

Free

$0/month

500MB DB, 50K MAUs, 5GB bandwidth, 1GB storage

Pro

$25/month

8GB DB, 100K MAUs, 250GB bandwidth, 100GB storage

Team

$599/month

Pro features + SOC2, HIPAA, SSO, priority support

Enterprise

Custom pricing

Unlimited resources + dedicated support

Prerequisites

  • flexprice.io account

  • API key ready

  • Understanding of usage-based billing

  • Knowledge of PostgreSQL and backend services

Step 1: Get Your API Key

  1. Log in to your flexprice.io dashboard

  2. Navigate to Settings → API Keys

  3. Copy your API key

Step 2: Create Core Usage Features

Create metered features for all Supabase usage metrics:

Database size feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\
  -X POST \\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\
  --header 'Content-Type: application/json' \\
  --data '{
    "name": "Database Size",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "PostgreSQL database storage usage",
    "meter": {
      "aggregation": {
        "type": "MAX",
        "field": "size_gb",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Database Size",
      "filters": [],
      "event_name": "database.size"
    }

Monthly active users feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\
  -X POST \\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\
  --header 'Content-Type: application/json' \\
  --data '{
    "name": "Monthly Active Users",
    "type": "metered",
    "unit_singular": "user",
    "unit_plural": "users",
    "description": "Authenticated monthly active users",
    "meter": {
      "aggregation": {
        "type": "UNIQUE_COUNT",
        "field": "user_id",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Monthly Active Users",
      "filters": [],
      "event_name": "auth.user_activity"
    }

Bandwidth feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\\\
  -X POST \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --header 'Content-Type: application/json' \\\\
  --data '{
    "name": "Bandwidth",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "Data egress and transfer",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "bytes_transferred",
        "multiplier": 0.000000001
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Bandwidth",
      "filters": [],
      "event_name": "bandwidth.transfer"
    }

File Storage Feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\\\
  -X POST \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --header 'Content-Type: application/json' \\\\
  --data '{
    "name": "File Storage",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "File and object storage usage",
    "meter": {
      "aggregation": {
        "type": "MAX",
        "field": "storage_gb",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "File Storage",
      "filters": [],
      "event_name": "storage.usage"
    }

Edge Functions Feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\\\
  -X POST \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --header 'Content-Type: application/json' \\\\
  --data '{
    "name": "Edge Functions",
    "type": "metered",
    "unit_singular": "invocation",
    "unit_plural": "invocations",
    "description": "Serverless function executions",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "invocations",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Edge Functions",
      "filters": [],
      "event_name": "functions.invoke"
    }

Realtime Connections Feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\\\
  -X POST \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --header 'Content-Type: application/json' \\\\
  --data '{
    "name": "Realtime Connections",
    "type": "metered",
    "unit_singular": "connection",
    "unit_plural": "connections",
    "description": "Peak concurrent realtime connections",
    "meter": {
      "aggregation": {
        "type": "MAX",
        "field": "peak_connections",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Realtime Connections",
      "filters": [],
      "event_name": "realtime.connections"
    }

Realtime messages feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\\\
  -X POST \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --header 'Content-Type: application/json' \\\\
  --data '{
    "name": "Realtime Messages",
    "type": "metered",
    "unit_singular": "message",
    "unit_plural": "messages",
    "description": "Realtime messages sent per month",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "messages_sent",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Realtime Messages",
      "filters": [],
      "event_name": "realtime.messages"
    }

Step 3: Create Free Tier Plan

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Supabase Free Plan",
    "description": "Perfect for hobby projects and getting started",
    "lookup_key": "supabase_free",
    "prices": [],
    "entitlements": [
      {
        "feature_id": "feat_database_size_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 0.5,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_mau_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 50000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_bandwidth_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 5,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_storage_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 1,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 500000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_connections_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 200,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_messages_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 2000000,
        "usage_reset_period": "MONTHLY"
      }
    ]

Step 4: Create Pro Plan

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Supabase Pro Plan",
    "description": "Production-ready with usage-based scaling",
    "lookup_key": "supabase_pro",
    "prices": [
      {
        "amount": "2500",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Pro Plan Base Fee",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      },
      {
        "amount": "12500",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Database storage overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "12500",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "database_size"
        }
      },
      {
        "amount": "325",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Monthly Active Users overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "325",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "mau"
        }
      },
      {
        "amount": "9000",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Bandwidth overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "9000",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "bandwidth"
        }
      },
      {
        "amount": "2100",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "File storage overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "2100",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "file_storage"
        }
      },
      {
        "amount": "200000",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Edge Functions overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "200000",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "edge_functions"
        }
      },
      {
        "amount": "1000000",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Realtime connections overage (per 1000)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "1000000",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "realtime_connections"
        }
      },
      {
        "amount": "250000",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Realtime messages overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "250000",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "realtime_messages"
        }
      }
    ],
    "entitlements": [
      {
        "feature_id": "feat_database_size_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 8,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_mau_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_bandwidth_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 250,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_storage_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 2000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_connections_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 500,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_messages_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 5000000,
        "usage_reset_period": "MONTHLY"
      }
    ]
  }'

Step 5: Create Team Plan

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Supabase Team Plan",
    "description": "For professional teams with advanced features",
    "lookup_key": "supabase_team",
    "prices": [
      {
        "amount": "59900",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Team Plan Base Fee",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      },
      {
        "amount": "12500",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Database storage overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "12500",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "database_size"
        }
      },
      {
        "amount": "325",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Monthly Active Users overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "325",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "mau"
        }
      },
      {
        "amount": "9000",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Bandwidth overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "9000",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "bandwidth"
        }
      },
      {
        "amount": "2100",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "File storage overage",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "2100",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "file_storage"
        }
      }
    ],
    "entitlements": [
      {
        "feature_id": "feat_database_size_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 8,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_mau_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_bandwidth_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 250,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_storage_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100,
        "usage_reset_period": "MONTHLY"
      }
    ]

Step 6: Create Compute Credits Feature

curl --location '<https://api.cloud.flexprice.io/v1/features>' \\\\
  -X POST \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --header 'Content-Type: application/json' \\\\
  --data '{
    "name": "Compute Credits",
    "type": "metered",
    "unit_singular": "credit",
    "unit_plural": "credits",
    "description": "Monthly compute credits for database instances",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "compute_cost",
        "multiplier": 100
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Compute Credits",
      "filters": [],
      "event_name": "compute.usage"
    }
  }'

Step 7: Add Compute Pricing Plans

Micro Compute

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Compute - Micro",
    "description": "1GB RAM, 2-core ARM CPU",
    "lookup_key": "compute_micro",
    "prices": [
      {
        "amount": "1000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Micro Compute Instance",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ]

Small Compute

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Compute - Small",
    "description": "2GB RAM, 2-core ARM CPU",
    "lookup_key": "compute_small",
    "prices": [
      {
        "amount": "1500",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Small Compute Instance",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ]
  }'

Step 8: Create Add-on Plans

Point-in-Time Recovery

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Point-in-Time Recovery",
    "description": "Roll back to any specific point in time",
    "lookup_key": "pitr_addon",
    "prices": [
      {
        "amount": "10000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Point-in-Time Recovery (7-day retention)",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ]

Custom Domain

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Custom Domain",
    "description": "Use your own domain for branded experience",
    "lookup_key": "custom_domain_addon",
    "prices": [
      {
        "amount": "1000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Custom Domain per project",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ]
  }'

Advanced Multi-Factor Authentication

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Advanced MFA",
    "description": "Phone-based multi-factor authentication",
    "lookup_key": "advanced_mfa_addon",
    "prices": [
      {
        "amount": "7500",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Advanced MFA for first project",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ]
  }'

Step 9: Create Customer

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/customers>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "TechCorp Inc",
    "email": "admin@techcorp.com",
    "external_id": "cust_techcorp_123",
    "metadata": {
      "company": "TechCorp Inc",
      "industry": "Technology",
      "plan_tier": "pro"
    }
  }'

Step 10: Create Subscription

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/subscriptions>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "customer_id": "cust_123456789",
    "plan_id": "plan_supabase_pro_123",
    "billing_period": "MONTHLY",
    "billing_period_count": 1,
    "currency": "USD",
    "start_date": "2025-01-15",
    "phases": [
      {
        "start_date": "2025-01-15",
        "line_items": [
          {
            "price_id": "price_pro_base_123",
            "quantity": 1,
            "display_name": "Pro Plan Base"
          },
          {
            "price_id": "price_compute_micro_123",
            "quantity": 1,
            "display_name": "Micro Compute Instance"
          }
        ]
      }
    ]
  }'

Step 11: Track Usage Events

Database Size Usage

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_database_size_123",
    "quantity": 12.5,
    "metadata": {
      "project_id": "proj_abc123",
      "measurement_time": "2025-01-15T10:30:00Z"
    }
  }'

Monthly Active Users

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_mau_123",
    "quantity": 125000,
    "metadata": {
      "project_id": "proj_abc123",
      "measurement_period": "2025-01"
    }
  }'

Bandwidth Usage

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_bandwidth_123",
    "quantity": 300,
    "metadata": {
      "project_id": "proj_abc123",
      "transfer_type": "egress"
    }
  }'

File Storage Usage

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_storage_123",
    "quantity": 150,
    "metadata": {
      "project_id": "proj_abc123",
      "storage_type": "object"
    }
  }'

Edge Functions Usage

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_functions_123",
    "quantity": 2500000,
    "metadata": {
      "project_id": "proj_abc123",
      "function_region": "us-east-1"
    }
  }'

Step 12: Monitor Usage

Check current usage across all features:

curl --location '<https://api.cloud.flexprice.io/v1/subscriptions/sub_123456789/usage>' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE'

Pricing Calculation Example

For a Pro Plan customer with overage usage:

Base Charges

  • Pro Plan Base: $25.00

  • Micro Compute: $10.00 (covered by $10 compute credits)

Usage Overages

  • Database Storage: 12.5GB (4.5GB over limit) × $0.125 = $0.56

  • MAU: 125,000 users (25,000 over limit) × $0.00325 = $81.25

  • Bandwidth: 300GB (50GB over limit) × $0.09 = $4.50

  • File Storage: 150GB (50GB over limit) × $0.021 = $1.05

  • Edge Functions: 2.5M invocations (0.5M over limit) ÷ 1M × $2.00 = $1.00

Total Monthly Bill

$25.00 + $0.56 + $81.25 + $4.50 + $1.05 + $1.00 = $113.36

Advanced Features

1. Tiered Volume Discounts

Create volume-based pricing tiers for high-usage customers:

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "name": "Volume Tier - MAU",
    "description": "Volume discounts for high MAU usage",
    "lookup_key": "volume_mau",
    "prices": [
      {
        "amount": "325",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "MAU Volume Pricing",
        "type": "USAGE",
        "tier_mode": "GRADUATED",
        "tiers": [
          {
            "unit_amount": "325",
            "up_to": 500000
          },
          {
            "unit_amount": "250",
            "up_to": 1000000
          },
          {
            "unit_amount": "200",
            "up_to": null
          }
        ]
      }
    ]
  }'

2. Regional Pricing Variations

Implement different pricing for different regions:

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_functions_123",
    "quantity": 1000000,
    "metadata": {
      "region": "eu-west-1",
      "pricing_multiplier": 1.2
    }
  }'

3. Usage Alerts and Notifications

Set up automated usage alerts:

curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/alerts>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_mau_123",
    "threshold_percentage": 80,
    "alert_type": "usage_warning",
    "notification_channels": ["email", "webhook"]
  }'

Best Practices

1. Accurate Usage Tracking

  • Implement real-time usage reporting

  • Use proper aggregation methods for different metrics

  • Include relevant metadata for filtering and analysis

2. Progressive Disclosure

  • Start customers on free tier

  • Automatic upgrades when limits are exceeded

  • Clear communication about pricing changes

3. Cost Predictability

  • Provide usage dashboards

  • Send proactive billing alerts

  • Offer spending limits and caps

4. Feature Gating

  • Hard limits on free tier

  • Soft limits with overage billing on paid tiers

  • Premium features only on higher tiers

5. Billing Transparency

  • Itemized invoices with clear descriptions

  • Real-time usage monitoring

  • Historical usage trends

Testing Your Setup

Verify Plan Configuration

# Check all plans
curl --location '<https://api.cloud.flexprice.io/v1/plans>' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE'

# Check specific plan details
curl --location '<https://api.cloud.flexprice.io/v1/plans/plan_supabase_pro_123>' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE'

Test Usage Reporting

# Simulate various usage patterns
curl --request POST \\\\
  --url '<https://api.cloud.flexprice.io/v1/usage/batch>' \\\\
  --header 'Content-Type: application/json' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE' \\\\
  --data '{
    "usage_events": [
      {
        "subscription_id": "sub_123456789",
        "feature_id": "feat_database_size_123",
        "quantity": 10.5,
        "timestamp": "2025-01-15T10:00:00Z"
      },
      {
        "subscription_id": "sub_123456789",
        "feature_id": "feat_mau_123",
        "quantity": 95000,
        "timestamp": "2025-01-15T10:00:00Z"
      }
    ]
  }'

Validate Billing Calculations

Generate preview invoice

curl --location '<https://api.cloud.flexprice.io/v1/subscriptions/sub_123456789/preview-invoice>' \\\\
  --header 'x-api-key: YOUR_API_KEY_HERE'

Wrapping up

Supabase's pricing model is built for how developers actually work: start small, track usage, scale when you need to. The Free tier covers prototyping and MVPs. Pro at $25/month gives you room to grow with spend caps that keep bills predictable. And when you need compliance or enterprise features, the jump to Team makes sense.

What matters most? You're not paying for complexity you don't need, and you won't hit walls when you're ready to grow. Start with Free, monitor your usage, upgrade to Pro when you ship to real users. The pricing scales with your project, not against it.

If you're ready to build your own Supabase pricing, then either you can sign up for the tool or use our open source to create it. If you're tired of solving billing from scratch, you don’t have to keep doing it alone.


More insights on billing

Insights on
billing and beyond

Explore expert tips, industry trends, and best practices for billing, pricing, and scaling revenue.

Get started with your billing today.