Tax calculation regression: symptoms, cause, and the test that catches it

Tax or VAT is computed with the wrong rate or jurisdiction after a rules or data update.

Tax calculation regression is documented by 2 accepted public reports from 2 organisations, 2 of them published in the last 5 years.

  • Likelihood: low (2 public reports in 5 years)
  • Impact: high (2 of 2 reports: money and compliance)

2 public reports · verified 2026-10-21

Symptoms

User-visible

  • Reservation items with price overrides received an incorrect VAT or tax rate after a rate management feature shipped.[1]
  • Some bookings were created with incorrect tax data.[1]
  • A small percentage of invoices were generated with invalid tax information.[1]
  • The Estonian tax report computed the tax amount at 20% on a line that held the taxable amount at 22%.[2]

Monitoring-visible

  • Invalid tax codes sat in the database for reservation items whose tax dropdown had been disabled.[1]
  • The wrong Estonian report formula reached the maintainers through a support ticket.[2]

Root causes

  1. stage: code A frontend update sent an empty array when the tax dropdown was disabled, and invalid tax codes were stored in the database.[1]
  2. stage: code The Estonian default tax moved to 22% and the report line was updated, but the formula for the tax amount still multiplied by 0.2.[2]

Public examples

  1. [1]Mews, 2025-09-17. Mews reported that a recently introduced Rate Management feature caused incorrect VAT or tax rates to be applied to reservation items with price overrides, and its postmortem traced this to a frontend update that stored invalid tax codes. primary Issue with Mews Reservation with wrong VAT
  2. [2]Odoo, 2024-03-25. An Odoo maintainer fix states that after the Estonian standard VAT rate changed from 20% to 22% at the start of 2024 and the Estonian tax report lines were updated, the report formula still computed tax at 0.2 of the taxable amount. primary [FIX] l10n_ee: tax report computes according to updated taxes

Test classes that catch it

Test classStageLimitationBasis
Unit testspre-mergeA unit test whose expected Estonian tax amount was written at the old 20% rate keeps passing after the rate change, so the stale 0.2 multiplier survives unless the expected value comes from the current rate table.by design analysis
Integration testspre-deployAn integration test catches the empty array only if it saves a reservation item with a price override while the tax dropdown is disabled.by design analysis

Risk

  • Likelihood: low (2 public reports in 5 years)
  • Impact: high (2 of 2 reports: money and compliance)
Counts behind the grades
Accepted public reports2
Published in the last 5 years2
Impact stated: money1
Impact stated: compliance1

How the grades are computed

Pre-release checklist

  • PR-01
  • PR-02
  • PR-03
  • PR-04
  • PR-05
  • PR-06

First 30 minutes

  • FM-01
  • FM-02
  • FM-03
  • FM-04
  • FM-05
  • FM-06

Download the checklist

What catches this: catalogue entries

Listed because their own documentation or site names unit tests, integration tests on the verification date. Alphabetical. Not a recommendation.

Tools whose documentation names these test classes

Providers whose site names these test classes

Only on this page

Tax calculation regression in report [2] came from a legal rate change outside the codebase. The Estonian VAT rate rose from 20% to 22% at the start of 2024. The report line moved to the 22% taxable amount, and the formula still multiplied by 0.2. The defect reached the maintainers through a support ticket.

Unit tests are the class that targets wrong calculations, yet a unit test asserts the number its author wrote down. When the expected value and the formula both carry the old rate, the test passes. A unit test for tax calculation regression needs its expected rate read from the rate table in force after the effective date.

Questions

What causes tax calculation regression?

Both accepted reports name a code-stage cause. One frontend update sent an empty array when a dropdown was disabled, which stored invalid tax codes [1]. One report formula kept a 0.2 multiplier after the Estonian rate rose to 22% [2].

What are the symptoms of tax calculation regression?

Bookings and invoices carry incorrect VAT or invalid tax information [1]. A tax report computes the tax amount at an old rate on a line that holds the taxable amount at the new rate [2].

Why did tests not catch tax calculation regression?

Neither report describes the tests that ran. A unit test whose expected value uses the old 20% rate would keep passing, so the unit entry carries the by-design label.

Which public reports document tax calculation regression?

Two primary reports are accepted, published in March 2024 and September 2025. One covers incorrect VAT on reservation items with price overrides [1]. The other covers an Estonian tax report formula left at 0.2 [2].

How long did it take to detect tax calculation regression in the public reports?

Neither report publishes a time to detect in minutes. The Estonian formula defect was raised through a support ticket [2].

What should be checked before a release to prevent tax calculation regression?

PR-01 asks for a unit test that computes each report line's tax from the current rate table entry. PR-04 asks for an integration test that saves an overridden-price item with the tax dropdown disabled and reads the stored tax code back.

Release Incident Playbook (2026). Tax calculation regression: symptoms, cause, and the test that catches it, content version 1.0.0. https://releasefailures.com/incidents/tax-calculation-regression/. Accessed 2026-10-21.