The dataset behind every page on this site

Every figure on this site comes out of one file, and that file is published. It holds 37 providers and 108 plans, each figure copied from the provider's own published pricing page with the URL it was read from and the date it was read. It is free to reuse under CC BY 4.0.

Two formats hold the same rows: data.json keeps the plans nested inside each provider, and data.csv is flat — one row per plan, 108 rows and 48 columns — so it opens in a spreadsheet.

What is in it

Providers37
Plans108
Providers publishing a price28
Providers asking you to contact sales6
Providers whose price we could not read3
Rows with at least one field the provider does not state37
Recorded changes and corrections128
MarketsUnited States (USD), United Kingdom (GBP)
Last full refresh2026-08-21

The files

data.csvOne row per plan. Provider fields repeat on each of that provider's rows. UTF-8, comma separated.
data.jsonOne object per provider with plans[] nested inside, plus the change history for each row. Served with CORS open, so you can fetch it from your own page.
feed.xmlRSS. One item per provider per day a figure changed.
changesThe same history as a page, by month, with the old value and the new one.

What one row means

In the CSV a row is a plan; the provider columns repeat down that provider's rows. In JSON the same provider fields sit on the object and the plan fields sit in plans[], where they carry the names below without the plan_ prefix.

Provider columns
ColumnTypeWhat it holds
keystringURL-safe identifier. The provider page is /d/<key>.
brandstringProvider name exactly as the provider writes it.
brand_shortstringShort form used in page titles where the official name is too long for a title. Empty when the official name is already short.
page_urlurlThe page on this site that holds this row.
vendor_urlurlThe provider's own home page.
pricing_urlurlThe published pricing page every figure in the row was read from.
marketslistUS, UK, or both. Set by the currency the provider publishes in. We never convert.
categorystringucaas (seat-priced phone system), virtual-number (number and line plans), or pbx-license (self-hosted licence).
parent_companystringParent company, or Independent. Empty where we could not confirm it.
parent_srcurlThe page the parent company was confirmed on.
price_publishedbooleanWhether a per-seat price appears on the provider's own page.
price_visibilitystringWhy a price is missing when it is: published, quote_only, not_readable, other_currency.
fees_disclosurestringamount (the provider publishes the amount or rate of taxes and fees), stated (says they apply, no amount), none (silent).
fees_urlurlThe page the fee wording was read from.
fee_treatmentstringHow the provider treats taxes and fees at the account level: included, all_inclusive, separate_stated, locale_dependent, unstated.
affiliate_brandstringThe brand name in our affiliate ledger, where a programme exists. It has no effect on any ordering.
unconfirmedlistField names the provider does not state publicly. These are left empty rather than guessed.
checkeddateThe day the whole row was last read against the provider's page (_checked in data.json).
Plan columns
ColumnTypeWhat it holds
plan_namestringThe plan name as the provider writes it.
plan_currencystringUSD or GBP. Never converted.
plan_per_seat_annualnumberPer-seat monthly price on annual (or longer) billing.
plan_per_seat_monthlynumberPer-seat monthly price on monthly billing. Empty where the provider does not publish it.
plan_flat_monthlynumberMonthly price for plans that are not priced per seat.
plan_users_includednumberSeats included in a flat plan.
plan_additional_user_pricenumberPrice per seat above users_included, where the provider states one.
plan_tiersjsonVolume bands where the per-seat price changes with seat count, as [{from,to,per_seat}].
plan_min_seatsnumberMinimum seats billed.
plan_max_seatsnumberHighest seat count this price applies to.
plan_contract_monthsnumberMonths of commitment the price requires.
plan_price_is_frombooleanTrue where the provider prints the figure as a “from” price.
plan_setup_feenumberOne-off set-up fee. 0 where the provider states there is none.
plan_hardware_requiredbooleanWhether the plan requires buying hardware.
plan_minutes_includedstringCall allowance in the provider's own words.
plan_usage_basisstringHow calls are charged when they are not in the seat price: call_packages, or empty for per-minute.
plan_free_trial_daysnumberFree trial length in days.
plan_free_monthsnumberMonths free from sign-up, where the provider states a number.
plan_free_then_planstringThe plan the free period rolls into.
plan_fee_uplift_pctnumberTaxes and fees as a percentage, only where the provider publishes the rate.
plan_vat_basisstringFor UK plans: whether the figure is stated ex-VAT or inc-VAT.
plan_pricing_modelstringper_seat, flat_package, usage, add_on or quote.
plan_pstn_includedbooleanWhether calling to the public telephone network is in the price.
plan_prerequisiteslistLicences you must already hold to buy this plan.
plan_prerequisite_costnumberPublished price of the cheapest qualifying prerequisite licence, per user per month.
plan_fee_treatmentstringPlan-level version of fee_treatment, where the provider states it per plan.
plan_statusstringcurrent or legacy. Legacy plans stay on the provider page but are out of every ranking.
plan_source_urlurlThe page this plan's figures were read from, where it differs from pricing_url.
plan_checkeddateThe day this plan was last read.
plan_notesstringThe provider's own wording for any condition attached to the price.

What is deliberately not in it

No computed values. The cost per seat at ten seats, the three-year figure and the monthly-to-annual ratio are worked out at build time from these columns; they are not stored, so nobody has to trust a number whose derivation is invisible. The method page gives the formula.

No converted currencies. USD and GBP rows are never mixed or converted, because a converted figure is one no provider published.

No guesses. Where a provider does not state something, the field is empty and its name appears in unconfirmed. An empty price cell and a provider that will not publish a price are different things, and price_visibility tells them apart.

No ratings. There is no score, star or rank column. Ordering on this site comes from one computed number and nothing else.

4 plans are marked plan_status=legacy: still documented by the provider but out of every ranking.

How often it changes

Figures are re-read against the provider's page and re-dated when they move. Any figure older than 90 days is labelled on the page it appears on. Every change is kept — old value, new value, date and reason — and published in changes and the feed. The URLs above are stable; the file at each one is replaced, never moved.

Licence

The data is published under Creative Commons Attribution 4.0. You may reuse it, including commercially, if you credit Business Phone Costs and link back. The prices themselves are facts published by the providers; the collection, the column definitions and the wording on this site are ours.

Cite this data

If you quote a figure, please cite the dataset rather than an individual page, and give the date you took it — the figures move.

ReferenceBusiness Phone Costs (2026). Business phone system pricing dataset [Data set]. https://costofsoftware.com/business-phone-system/data
In a sentence“According to Business Phone Costs (2026), …” with a link to https://costofsoftware.com/business-phone-system/data
LicenceCC BY 4.0
@misc{business_phone_costs_pricing, title = {Business phone system pricing dataset}, author = {Kaz}, year = {2026}, url = {https://costofsoftware.com/business-phone-system/data}, note = {Business Phone Costs. Licensed CC BY 4.0} }

Journalists and researchers are welcome to the whole file. If you need a cut of it that is not here — a market, a category, a date range — ask and it will be produced.

If a figure is wrong

Tell us through the contact form with the provider page you saw it on. It will be re-read, corrected, re-dated and the correction published in changes with the old value beside the new one.

Related


Written by Kaz (pen name). Figures are copied from providers' published pricing pages on the dates shown. We have not used these products. Corrections: contact form.