Build a Pricing Table Readers Can Compare and Verify
Prepare a pricing table with clear billing periods, currencies and limits, then publish a spreadsheet readers can filter and share.

A useful pricing table lets readers answer three questions: What will I pay, when will I pay it, and what does that price include? Start with one row per purchasable plan and billing option—not a grid of promotional labels—and publish the cleaned spreadsheet as a public comparison page.
This approach works for your own public price list or a sourced comparison of several providers. It produces a reference table, not a checkout or subscription-management system.
Start with one row per billing option
Here is a fictional sample dataset, not TablePage pricing or a comparison of real vendors. Both plans charge a flat fee; included users are an allowance, not a per-user charge.
| plan | currency | billing_period | price_per_period | months_per_period | monthly_equivalent | included_users |
|---|---|---|---|---|---|---|
| Basic | USD | Monthly | 12 | 1 | 12 | 1 |
| Basic | USD | Annual | 120 | 12 | 10 | 1 |
| Team | USD | Monthly | 30 | 1 | 30 | 5 |
| Team | USD | Annual | 300 | 12 | 25 | 5 |
Put these headers in the first spreadsheet row, with no merged cells, blank separator rows or totals mixed into the records. Keep the amount numeric and the currency in its own column rather than storing text such as USD 12/month.
For this sample, document the assumptions beside the published table: prices exclude tax, annual plans are paid upfront, and there are no introductory discounts or setup fees.
The expected result is a table readers can filter by billing period and compare without mistaking an annual plan’s monthly equivalent for a monthly payment.
Separate the price from the pricing model
A number alone is not enough. A flat subscription fee, a per-seat rate and a usage charge represent different obligations. Stripe’s pricing-model documentation distinguishes flat-rate, per-seat, tiered and usage-based models.
For a mixed-provider comparison, add fields that explain the basis of each price:
pricing_model: flat rate, per seat, usage based or tiered.charge_unit: account, user, request or another explicitly defined unit.minimum_quantity: a minimum seat count or other purchase requirement, where applicable.included_usageandoverage_rate: the allowance and additional charge, with units.price_status: published price, quote required or unavailable.
Leave an unknown numeric price blank and explain its status. Do not enter 0 for “contact sales”; zero should mean the stated price is actually zero. Likewise, distinguish “unlimited,” “not included” and “not disclosed” when recording feature limits.
If pricing changes across quantity bands, record the bands and explain the calculation rather than reducing the whole schedule to a misleading “from” price.
Calculate comparable values without hiding the bill
For fixed subscriptions in the sample:
Monthly equivalent = price per billing period ÷ months per billing period
With the columns shown above, enter =D2/E2 in cell F2 and fill down. Basic’s annual option is therefore 120 ÷ 12 = 10 USD per month equivalent, while the amount billed upfront remains 120 USD.
Keep both columns visible. Compare monthly equivalents only within the same currency and charge basis; a per-user rate is not directly comparable with an account-wide fee. Check included users and usage limits before treating two prices as equivalent offers. For usage-based plans, define a usage scenario before calculating an estimated total.
Add provenance before publishing
For real prices, add provider, source_url and checked_on. Record the currency, market, tax treatment and eligibility conditions that affect the offer. Separate regular prices from time-limited promotions, and label the page as a dated snapshot rather than implying live updates.
A short dataset reference sheet can explain column meanings, blank values and calculation assumptions without crowding every row.
Publish and check the public result
As of October 11, 2026, TablePage lists support for CSV, TSV, XLSX and XLS uploads and generates a public dataset page with a shareable link and filterable table.
Export only the intended public data. Do not upload private customer quotes, negotiated contracts, billing records or personal information.
After publishing, check that:
- Numeric amounts remain numeric and display at the intended precision.
- Monthly and annual options remain separate records.
- Currency, charge units and included limits are visible.
- Blank prices are explained, not presented as free offers.
- Source references and the checked date are readable.
Give the page a descriptive title and a short note identifying its scope and billing assumptions. A useful table caption and summary tells readers what the rows represent and how to interpret the price columns.