spree-taxes

Installation
SKILL.md

Spree Taxes

Tax in Spree 6 is three separate decisions:

  1. What is sold → Spree::TaxCategory on the product/variant (copied to line items).
  2. Where it goes → the purchase's tax address (ship address by default) and its market.
  3. Who computes it → the market's tax provider, falling back to Spree.default_tax_provider (default Spree::TaxProvider::Internal, which reads Spree::TaxRate rows).

Whatever computes it, the output is always the same: Spree::TaxLine rows on the cart/order, folded into included_tax_total / additional_tax_total by Spree::Carts::RecalculateTotals (see spree-order-totals).

Coming from 5.x zones and Spree::Calculator::DefaultTax? Tax zones and tax adjustments are gone — see spree-upgrade-5-to-6.

Tax categories

Spree::TaxCategory — store-scoped; name, is_default (one default per store; items with no category use it), tax_code (the code an external engine knows it by, e.g. an Avalara tax code). Products/variants reference one; line items snapshot tax_category_id. Delivery methods can carry a category for shipping tax; fees without one use the store default.

Tax rates (Internal provider)

Spree::TaxRate (tax_…, store-scoped, soft-deleted) has no zone — it names its jurisdiction by ISO code:

Installs
19
GitHub Stars
10
First Seen
Oct 1, 2026