Now in open beta — close the books in 2 days, not 2 weeks.Read the case study →
E-commerce · March 17, 2026 · 8 min read

Shopify discount codes: the pre-tax / post-tax trap

A discount code looks like a customer-facing promo. Behind the scenes, whether the discount applies before or after tax determines how much output tax you owe and how much revenue you can recognize. The distinction is small in user-facing UI and large on the books.

Pre-tax vs post-tax discount.

A pre-tax discount reduces the taxable base. On a £100 item with 20% UK VAT and a £10 pre-tax discount, the customer pays £90 plus 20% VAT of £18, total £108. Output VAT owed is £18. Revenue recognized is £90.

A post-tax discount reduces the gross. On the same item, post-tax means VAT is computed on the full £100 (£20), then the £10 discount applies after, customer pays £110. Output VAT owed is £20. Revenue recognized is £90. The difference: £2 more output VAT owed for the same customer outcome and same revenue. Multiplied across thousands of orders, this is real money.

Pre-tax discount (trade)£100 - £10 = £90 taxableVAT £18 (20% × £90)Customer pays £108Output VAT owed: £18Standard UK / EU / AU treatmentPost-tax discount (cash)VAT £20 on full £100 firstThen -£10 discountCustomer pays £110Output VAT owed: £20Rare; only true settlement discounts
Same £10 promo, £2 more output VAT per order on the wrong side. Across 5,000 orders that is £10k of misfiled tax.

Which is correct under most VAT regimes?

Under UK VAT (HMRC), EU VAT directives, and Australian GST rules, output tax is computed on the value of supply, which is the consideration received from the customer net of trade discounts. Trade discounts (ones disclosed at point of sale, available to all customers, contemporaneous with the sale) are pre-tax. Cash discounts (settlement discounts after the sale) are typically not.

Practically, most Shopify discount codes are trade discounts (promo codes, percentage off, BOGO) and qualify for pre-tax treatment. Cash discounts (early-payment incentives, post-invoice rebates) do not. Configuring Shopify to compute tax on the discounted amount aligns with standard VAT practice. Configuring it to compute on the gross does not.

Configuring Shopify correctly.

Shopify Markets has a setting "All taxes are included in my prices" and a separate "Charge tax on this product" toggle. The interaction with discounts depends on whether the discount is type "Percentage" or "Fixed amount" and whether it applies to the order, line item, or shipping. The tax engine then applies the configured rules.

For a UK store with 20% VAT, configure prices as tax-inclusive (the UK retail norm), discounts as pre-tax (Shopify’s default for most discount types), tax computed on the discounted line. Verify by testing a sample order: £100 item, 10% discount, 20% VAT should show £90 net + £18 VAT = £108. If your test shows different, your configuration is wrong.

  • Tax-inclusive pricing for B2C in UK/EU; tax-exclusive for US B2B
  • Pre-tax discounts for trade discounts (most promos)
  • Post-tax discounts for cash/settlement discounts (rare)
  • Test orders to verify configuration before launch

Booking the discount.

On a £100 sale with £10 pre-tax discount and £18 VAT, the journal is debit Shopify clearing £108, credit Sales £90, credit VAT payable £18. The discount itself is not booked as an expense; it is a contra-revenue adjustment baked into the Sales line.

Some merchants like to track gross revenue and discounts separately. In that case: debit Shopify clearing £108, credit Gross sales £100, debit Discounts £10, credit VAT payable £18. Net revenue is £90 either way. The split lets you see discount load as a percentage of gross sales over time.

Discounts on bundles and configurable products.

A discount on a bundle is normally pre-tax against the bundle price. The components decrement at full WAC; the discount reduces the revenue recognized. Margin per bundle reflects the discounted revenue. A 10% discount on a €45 bundle with €24 component COGS yields €40.50 revenue, €16.50 margin, 41% (down from 47% pre-discount).

On a configurable product (T-shirt variants), the discount applies to the chosen variant. WAC and COGS use the variant’s own data. The discount is variant-aware in a well-modeled system; in a poorly-modeled one, the discount is sometimes flat across variants leading to over-discounting on cheap variants and under-discounting on expensive ones.

Free shipping codes.

A "free shipping" code zeros the shipping line on the order. The journal entry skips Shipping income for that order, but the actual courier cost still hits Shipping expense. Net effect: shipping is a marketing expense, not income. If your unit economics assumed positive shipping margin, free shipping codes make them look worse than they are.

For tax purposes, free shipping is generally not taxable separately because there is no shipping consideration. Some jurisdictions treat it differently. In the EU, shipping is often part of the taxable supply even when free if there is no separate charge; in the US, taxability of shipping varies by state. Verify the local rule for cross-border orders.

Discount-driven cohort margin.

Tracking discounts as a separate line item enables cohort margin analysis. Customers acquired with a discount code may have systematically lower lifetime margin than full-price customers. Knowing this changes acquisition decisions: a 20% off promo that brings in customers who never repurchase at full price is not the same as a 5% off promo that does.

Nonari surfaces discount load by code, by cohort, by product over time. Merchants can see whether their FIRST10 code is genuinely acquiring customers or just shifting full-price purchases to discounted. The accounting setup that separates discounts from net revenue is the prerequisite; without it, the analysis is impossible.

Where Nonari fits.

Nonari ingests Shopify orders with discount details preserved. Pre-tax vs post-tax handling is automatic based on the storefront tax configuration; verification runs at month-end so misconfiguration surfaces before a tax filing. Discount lines are tracked separately so gross revenue, discounts, and net revenue are all visible without extra reporting setup.

For merchants who run frequent promos and need to defend VAT or sales tax filings to tax authorities, the audit trail is built in: every order shows the gross, the discount, the tax base, the tax owed, and the source code. No spreadsheet reconciliation, no end-of-quarter scramble. The accounting layer aligns with what Shopify shows the customer and what the tax authority expects in the filing.

Frequently asked

Common questions.

Are Shopify discounts pre-tax or post-tax?

Most are pre-tax under UK VAT, EU VAT, and Australian GST rules: trade discounts disclosed at point of sale reduce the taxable base. Cash/settlement discounts after the sale are typically not pre-tax.

How do I verify my Shopify tax configuration?

Place a test order with a known discount and tax rate. The line items should show tax computed on the discounted amount. If not, the configuration needs adjustment.

Should I track discounts as a separate account?

Yes. Tracking discount load as contra-revenue lets you analyze cohort margin and discount efficacy. Net revenue is the same; visibility is much higher.

How is free shipping handled in tax?

Free shipping is generally not separately taxable. For cross-border, verify destination rules; some treat shipping as part of the taxable supply.

Does Nonari verify tax configuration?

Yes. Month-end checks compare actual tax collected against the computed expected tax based on order data. Mismatches surface as exceptions before filing.

Try nonari

Put your books on autopilot.

Free to start. No credit card. Bring your books, kick the tires, export everything if you decide to leave.