Skip to main content
Per-seat pricing is a common model for B2B SaaS products where customers pay based on the number of users or team members using the product. This guide covers how to implement per-seat pricing with free included seats and paid additional seats.

Example case

We have a B2B collaboration tool with the following pricing:
  • Free tier: 3 seats included for free
  • Pro tier: $20/month base price with 5 seats included, plus $10/seat/month for additional seats
For additional seats, there are two ways to configure pricing in Autumn:
Billing ModelDescription
PrepaidCustomer commits to a fixed number of seats upfront and pays immediately
Usage-basedCustomer pays for actual seats used at the end of each billing cycle

Configure Pricing

1

Create Feature

Create a metered non-consumable feature called “seats”. Non-consumable features are for persistent resources like seats, GB storage, or workspaces.
2

Create Free Plan

Create a free plan with 3 included seats. Set auto-enable so new customers automatically get this plan.
3

Create Pro Plan

Create a Pro plan with a $20/month base price and 5 included seats.For additional seats beyond the included 5, add a priced feature at $10/seat/month. Choose your billing model:
  • Prepaid: Customer selects quantity upfront, charged immediately
  • Pay per use: Customer is billed for actual usage at end of billing cycle
For non-consumable features like seats, you can configure how price changes are handled mid-billing cycle.On Increase (adding seats):
OptionBehavior
prorate_immediatelyCharge prorated amount now (default)
bill_immediatelyCharge full amount now
prorate_next_cycleAdd prorated amount to next invoice
bill_next_cycleAdd full amount to next invoice
On Decrease (removing seats):
OptionBehavior
prorate_immediatelyCredit prorated amount now (default)
prorate_next_cycleCredit on next invoice
no_prorationsNo refund or credit
You can configure these in the “Advanced” section when adding the priced feature to your plan.

Implementation

1

Create an Autumn Customer

When your user signs up, create an Autumn customer. This will automatically assign them the Free plan with 3 included seats.
import { useCustomer } from "autumn-js/react";

const App = () => {
  const { customer } = useCustomer();

  console.log("Autumn customer:", customer);

  return <h1>Welcome, {customer?.name || "user"}!</h1>;
};
2

Check Seat Access

Before adding a new team member, check if the customer has available seats.
import { useCustomer } from "autumn-js/react";

export function AddTeamMember() {
  const { check } = useCustomer();

  const handleAddMember = async () => {
    const { data } = check({ featureId: "seats" });

    if (!data?.allowed) {
      // Prompt upgrade or purchase more seats
      alert("No seats available. Please upgrade your plan.");
      return;
    }

    // Proceed with adding team member
  };
}
3

Track Seat Usage

When team members are added, track seat usage. You can use the track endpoint to increment usage, or the usage endpoint to set the total directly.Remember to track the usage for the initial user as well, after customer creation.
import { Autumn } from "autumn-js";

const autumn = new Autumn({
  secretKey: 'am_sk_42424242',
});

// Increment by 1 when a seat is added
await autumn.track({
  customer_id: "org_123",
  feature_id: "seats",
  value: 1,
});

// Or set the total directly
await autumn.usage({
  customer_id: "org_123",
  feature_id: "seats",
  value: 2, // Total seats now in use
});
Seat usage tracked on the Free tier will carry over when the customer upgrades to Pro. If a customer is using 2 seats on Free and upgrades to Pro, those 2 seats remain in use and count against Pro’s included seats.
4

Upgrade to Pro

When the customer upgrades to Pro, use the checkout endpoint. If they need additional paid seats beyond the 5 included, pass the quantity in options.
The quantity in options represents the additional paid seats only, not total seats. Pro includes 5 seats, so if the customer wants 8 total seats, pass quantity: 3.
import { useCustomer, CheckoutDialog } from "autumn-js/react";

export default function UpgradeButton() {
  const { checkout } = useCustomer();

  return (
    <button
      onClick={async () => {
        // Customer wants 8 total seats (5 included + 3 paid)
        await checkout({
          productId: "pro",
          dialog: CheckoutDialog,
          options: [{
            featureId: "seats",
            quantity: 3, // 3 paid seats beyond the 5 included
          }],
        });
      }}
    >
      Upgrade to Pro
    </button>
  );
}
If the customer only needs the 5 included seats, pass quantity: 0 or omit the options entirely.
5

Update Seat Quantity

How you update seat quantity depends on your billing model:
For prepaid seats, use the attach endpoint with updated options to change the seat quantity. This will handle proration based on your configuration.
import { useCustomer, CheckoutDialog } from "autumn-js/react";

export default function AddSeatsButton() {
  const { checkout } = useCustomer();

  return (
    <button
      onClick={async () => {
        // Increase from 3 paid seats to 5 paid seats
        // (8 total → 10 total)
        await checkout({
          productId: "pro",
          dialog: CheckoutDialog,
          options: [{
            featureId: "seats",
            quantity: 5, // New paid seat count
          }],
        });
      }}
    >
      Add More Seats
    </button>
  );
}
Prepaid quantity math:
  • Pro includes 5 seats
  • Current: quantity: 3 → 8 total seats (5 + 3)
  • Updated: quantity: 5 → 10 total seats (5 + 5)
  • Customer is charged prorated amount for 2 additional seats
6

Decrease Seat Quantity

When team members leave, you’ll want to decrease the seat count.
Update the options with a lower quantity. Depending on your proration configuration, the customer may receive a credit.
import { Autumn } from "autumn-js";

const autumn = new Autumn({
  secretKey: 'am_sk_42424242',
});

// Decrease from 5 paid seats to 2 paid seats (10 total → 7 total)
const { data } = await autumn.attach({
  customer_id: "org_123",
  product_id: "pro",
  options: [{
    feature_id: "seats",
    quantity: 2, // New paid seat count
  }],
});

Summary

Billing ModelAdd SeatsRemove SeatsWhen Billed
Prepaidattach with new quantityattach with lower quantityImmediately (prorated)
Usage-basedtrack or usagetrack (negative) or usageEnd of billing cycle