DoVPN Research · Methods

How we record
VPN price history.

A price needs a plan, a date, a source and a quality state. Keeping those together makes the record usable, and makes its limits visible.

Population and unit of observation

Every one of the 29 providers configured in the collector appears in provider coverage. Every extracted plan remains in the sanitized catalog, including free, lifetime, incomplete, ambiguous and carried-forward records. The population follows our tracked providers; it is not a representative sample of the worldwide VPN market.

A row is one plan in one published snapshot. Capture time identifies when the page was observed. Feed generation time identifies the snapshot. They can differ. US hosted-runner observations include USD, EUR and GBP offers; the explorer never converts or blends those currencies. Earlier retained full-catalog history begins August 11, 2026. August is a partial baseline, not a complete monthly report.

Automated and unreviewed means exactly that

The wider catalog contains machine extractions and calculations, with parallel extraction states and review flags. It is separate from the automatically validated website feed and from the manually verified research dataset. The latter currently contains no published observations. Publication of this provisional catalog does not assert that a human checked every price or term.

A plan becomes eligible for a provisional trend only when its price and finite service duration are positive and reconcile, the pricing source captured successfully, its market is known, its extraction states support the numbers, and no blocking conflict flags remain. These checks can catch missing inputs and inconsistencies. They cannot guarantee that a parser interpreted the page correctly. A journalist should verify the cited source before turning a provisional number into a categorical consumer claim.

What fails the trend gate

  • Carried-forward records, unsuccessful pricing captures, or missing source evidence.
  • Unknown total or duration, inconsistent arithmetic, or unsupported extraction states.
  • Pricing/terms conflicts, ambiguous reference-price extraction, uncollected checkout facts or unresolved lifetime definitions.

Excluded rows remain in downloads and coverage. Null is unknown or inapplicable according to its status; it is never converted into zero. Lifetime plans cannot be assigned a finite monthly cost.

Like-for-like comparisons and source breaks

The provider, plan, country, currency, paid months, bonus months, billing type and source URL must match. A change to any of those starts a new series. Changes to upfront-price or duration extraction methods also split the monthly research series. A switch from a standard price page to a partner offer is a change of source, even if the product name is identical.

On September 9, the Proton VPN Plus 24-month source changed from its standard page at $83.76 to a partner page at $71.76. This is explicitly classified as a source switch. Its $12 difference is excluded from price-cut findings. Old snapshots and recorded prices are retained.

Missing days and intraday changes

Charts use the last published extraction for each plan and UTC day, breaking the line on an ineligible or missing day and at series changes. They do not interpolate. Full downloads and event tables keep the intraday captures. A brief intraday movement can therefore appear in the event table without appearing as a daily chart point.

Events compare consecutive eligible captures. When intervening captures are missing or ineligible, the detection date establishes only when the later price was observed. Month-start versus month-end comparisons use the first and last available snapshots, require eligible endpoints, and reject an intervening source or context switch. They do not measure every movement during the month.

Price and renewal calculations

Introductory monthly equivalent = upfront total ÷ all service months.
Normalized renewal monthly = renewal total ÷ renewal billing months.
Renewal increase = (normalized renewal monthly ÷ introductory monthly equivalent − 1) × 100.
Historical change = (later upfront total ÷ earlier comparable upfront total − 1) × 100.

Introductory and renewal billing periods may differ. Included free months reduce the introductory equivalent. Normalizing makes the periods comparable, but it does not make the monthly equivalent a monthly payment option. Renewal figures can be directly extracted, checkout-observed or derived from policy; their extraction states stay visible. They are projections from captured terms, not observations of future invoices.

Taxes can vary by location and checkout. A plan’s tax treatment remains attached to its record. Missing renewal values remain missing; non-recurring billing is distinguished from undisclosed recurring renewal.

Discount percentages are not historical savings

A provider’s advertised discount uses its chosen reference. Some percentages are derived by the parser from a reference total. The field status distinguishes them. Neither proves that the reference was a price paid by customers, or that today’s offer is cheaper than a previous comparable offer. An observed unchanged price can coexist with a large discount label. That does not establish deceptive intent.

Monthly refresh and frozen releases

The private daily exporter sanitizes the full catalog into the public repository, then generates every completed month. A month-end snapshot is required. Releases contain JSON, CSV, summary and SHA-256 checksums, with hashes for every public input snapshot. Regeneration in public CI must match the frozen release. An attempted rewrite fails; corrections require a documented revision and a new identifier.

DoVPN’s scheduled builds verify the public release checksum and regenerate the explorer and dated monthly report pages. Network failures keep the last accepted release and its actual coverage date. This prevents a fresh build date from disguising stale observations. Editorial news articles are evidence-based write-ups and are not automatically invented from the feed.

Citation, corrections and interests

Cite Steve Price, the exact monthly release ID, coverage period, currency and automated unreviewed evidence status. The data is CC BY 4.0; code is MIT. No DOI is assigned to the current price release. Cite the stable release or frozen file path, rather than only the evolving explorer. The release hash allows another reader to identify the file used.

DoVPN earns affiliate revenue through its commercial pages. The research section has no affiliate purchase links. This September analysis was published without requesting provider responses. Corrections are public; submit a source and affected record via the repository or steve@dovpn.com.

Read the September report · DoVPN research policy.