Strategy for entering prices with tax

Created on 6 April 2015, about 10 years ago
Updated 16 February 2025, about 2 months ago

Background

Some tax types (US, Canada) are not display inclusive. That means that prices are usually entered without tax, always shown without tax, and the tax is shown on the cart as a separate item.
Other tax types (any kind of VAT) are display inclusive. Prices can be entered with or without tax, but for B2C need to be shown with tax. In this case the store admin usually wants to enter the price WITH tax, since that's how they perceive prices.

Commerce 1.x allowed you to enter a price without tax, or to select the tax that's included in the entered price, on the pricefield level.
Selecting the entered tax actually skipped the pricing rules. This and other issues resulted in many people simply entering EU prices without tax.
Commerce VAT forced you to select between backwards/forward calculation (an accountant term that's not immediately intuitive).
Forward meant that you entered prices without VAT, with no visual aid (you'd have to calculate them yourself), which isn't intuitive to EU store admins.
Backwards meant that you got the same price for non-EU as well (100eur in Germany, France, but also Serbia and China).

VAT MOSS issues are now causing Spree (the biggest Ruby on Rails ecommerce package) to try and force people to enter VAT prices without tax. Some are already complaining on the GitHub issue that such a thing is not natural to europeans.
Prestashop is actually doing the same thing, they force you to enter a price without tax, but then show a simulated calculated price below, for info purposes.
Magento is close to Commerce 1.x, but they added an additional mode ("Cross border trade") on top, which is backwards calculation basically. It forces the entered price to be the same for any tax rate applied (EU, non-EU). This has also caused some confusion among their users, it feels intuitive to have the same tax-inclusive price for France and Germany, but not Serbia where EU VAT doesn't apply.

Expectations and wishes

  1. As a US store admin, I expect to enter my prices without taxes.
  2. As an EU store admin, I expect to have an option to enter prices without taxes.
  3. As an EU store admin, I primarily expect to enter prices with taxes.
  4. As an EU store admin selling digital products, I want my tax inclusive price to be the same for all B2C customers (regardless of their tax rate)
  5. As an EU store admin I find it nice to be able to force my price to be consistent outside of EU as well (100eur in France. 100eur in China)

#4 is the part which I invented, but I feel it makes a lot of sense . Merchants who don't agree can always simply enter prices without VAT, and have a different price in each EU country. Our marketplace does that.

Note that we aren't special-casing digital products, they're just the primary example of a product having multiple possible tax rates.

Implementation

The tax type has a "Display tax inclusive" checkbox just like on Commerce 1.x.
The store has a "Prices are entered including taxes" checkbox. This can also be overriden by individual price fields (one for 'USD' for example).

The price field takes an amount and a currency, there is no tax selector.
We want the tax rate and amount to be freshly calculated each time. This protects us against percentage changes as well.
The pricing system resolves the tax rate, and based on the store checkbox calculates and adds the tax amount to the price in the expected way (backwards/forwards).

The store also has an additional, off by default, checkbox shown only when the "prices include tax" checkbox is checked: "Keep the price consistent when no tax rate applies." (needs to be reworded). This allows the 100eur price to stay a 100eur when sold to outside of the EU, instead of it being reduced by the standard/reduced rate.

I believe this covers all of our use cases in an intuitive way.

🌱 Plan
Status

Fixed

Version

2.0

Component

Tax

Created by

🇷🇸Serbia bojanz

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

Not all content is available!

It's likely this issue predates Contrib.social: some issue and comment data are missing.

Production build 0.71.5 2024