Skip to main content
GullySystem
A practical guide

How to Set Up a SaaS Pricing Plan Table That Billing Can Run

Ganesh HSStrategy and Technology, GullySystem
Practical advice · 5 min read

In this guide 6 sections
The short answer

Build the plan table in five steps. List plans with fixed fees, define seat and usage rules, add the add-ons as separate items, set trial behaviour and write one proration rule. Every row gets an ID. Invoices then come from the table.

Step one: give every plan a row and an ID

Start with a table that has one row per plan per billing period, so a Team plan billed monthly and the same plan billed yearly are two rows. Each row gets a plan ID that never changes, even when marketing renames the Business plan to Scale and every integration still holds the old label. Names break reports and coupons.

Fill these columns: plan ID, display name, currency, fixed fee, billing interval, included seats, included usage and status, and nothing else until those eight are agreed. Mark retired plans as closed to new sign-ups rather than deleting them, because existing customers still sit on them and their invoices must keep resolving to a row.

Every subscription, invoice and revenue report points back to this ID, which is why it must never be reused for another plan.

  • Plan ID that never changes
  • Currency and billing interval
  • Fixed fee and included seats
  • Status: open, grandfathered or retired

Step two: describe seats and usage as rules

A seat is more than a number. State whether seats are named or concurrent, the minimum count, the step size and whether removed seats are credited, because each choice changes the invoice. A concurrent licence for fifty users and a named licence for fifty users look identical on the pricing page and very different on the invoice.

For usage, record the unit, the included amount, the overage rate and the tier boundaries, and add a column naming the meter that supplies the reading each month. Say whether tiers are graduated, where each band is priced separately, or volume based, where the whole quantity takes one price, and the totals differ.

Write one worked example per rule. Use real numbers from a sample customer, such as eleven seats on a plan that includes ten, so that the expected invoice total is not in dispute. If finance and product compute different totals from the same example, you have found a bug before a customer has, and the fix costs one edit to the table.

Step three: treat add-ons as their own items

Add-ons such as single sign-on, extra storage, a sandbox environment or premium support should be catalogue items with their own IDs, not a note on the plan. Customers can add one without switching plans.

Define which plans each add-on may attach to, because some are free on top-tier plans and chargeable below, and the table should hold that rule. Reps stop improvising quotes. When the rule lives only in a rep’s head, two customers on the same plan end up with different add-on prices, and the discrepancy surfaces at renewal.

Keep one-time fees, such as onboarding or data migration, in the same catalogue with a flag marking them as non-recurring, so renewals never repeat them.

  • Add-on ID and eligible plans
  • Recurring or one-time flag
  • Quantity rules
  • Price per plan when it differs

Step four: settle trials and conversion

Record the trial length, whether a card is taken up front and what happens when the last trial day passes, because the engine needs one answer for each case. Convert, downgrade or lock?

Decide what the first invoice says. If the customer picked seats during the trial, bill from conversion day rather than sign-up, and send a reminder email before conversion and log when it went out. Without that log, a chargeback dispute from a customer who says they never knew the trial had ended is hard to answer.

Extensions given by a rep belong in the system as a dated override with the rep’s name and the new end date, not as a note in the CRM.

Step five: write the proration rule once

Upgrades, downgrades, added seats and mid-cycle cancellations each need a rule that answers whether to prorate by day or by second, charge an upgrade at once or at renewal. Credit or refund a downgrade?

Pick one rule per event. Hold it in the table. Test sample customers against a hand-calculated invoice. Include a leap day, a customer in a different time zone and a downgrade made as the cycle closes, since those cases break most proration code.

Finish by loading the table into a test environment, generating invoices for ten sample accounts, and comparing each total with the hand-calculated figure from the worked examples. Fix every mismatch first.

SaaS plan table template

A spreadsheet with three tabs. The Plans tab holds plan ID, name, interval, currency, fixed fee, seats and status, and the Add-ons tab holds item ID, eligible plans, recurring flag and price. The Rules tab covers four topics. Each rule carries a worked example and the expected invoice total, so a developer can test the billing engine against it without asking anyone.

Open a blank worksheet to print

Questions owners ask

Should monthly and yearly plans share one ID?

No. Give each interval its own row and ID so the fee, renewal date and revenue report stay clean, then link both rows under one product family for reporting.

What should happen to customers on a retired plan?

Keep the plan in the table as closed to new sign-ups, so existing subscribers continue on it until you migrate them with notice that follows your terms.

How do I test proration before launch?

Calculate five or six scenarios by hand, such as a seat added on day nine, then compare them with the engine’s output. Differences show where the rule is unclear.

Do add-ons need their own invoice lines?

Yes. Separate lines let the customer see what each item costs, let finance report revenue by add-on, and let support explain a bill without opening the billing engine.

Browse all guidesBack to top ↑
Next step

Have a specific situation to work through?

This article covers the general case. Tell us what you’re actually dealing with and we’ll respond directly.

Share Your Requirements