Home / Odoo Problems / GST & Tax
Odoo GST

Odoo GST Calculation Problems: Causes & Solutions

By Odoobots ERP TeamUpdated September 20268 min readApplies to Odoo 14–19 with Indian localization
TL;DR

Wrong GST in Odoo is almost never the tax engine — it is configuration. The two biggest culprits: a fiscal position not switching CGST+SGST to IGST for inter-state customers (usually because the customer's State/GSTIN is blank), and tax-included prices billed with tax-excluded tax records. Both are fixable in minutes once found.

First, confirm the symptom

  • IGST charged on a local customer — or CGST+SGST on an inter-state one
  • Invoice total is off by exactly the tax amount (or a chunk of it)
  • Totals differ from the GST portal or Tally by a rupee or two, invoice after invoice
  • E-invoice (IRN) uploads getting rejected
  • Some products bill 18% when they should bill 5% or 12%

1. Inter-state sales not switching to IGST

Odoo decides CGST+SGST vs IGST through fiscal positions, comparing your company's state with the customer's state. If the customer record has no State (or no GSTIN, or the fiscal position is not set to auto-apply), Odoo keeps the product's default intra-state taxes — and an Andhra customer gets Tamil Nadu CGST+SGST.

Fix
  1. Open the customer: verify State and GSTIN are filled. No state = no correct tax, ever.
  2. Check Accounting → Configuration → Fiscal Positions — the inter-state position must have Detect Automatically ticked with country India and the tax mappings (CGST+SGST → IGST) complete for every rate: 5, 12, 18, 28.
  3. Verify your own company's State is set in Settings → Companies — a blank company state breaks detection for everyone.
Odoo Fiscal Positions configuration list used to map intra-state taxes to IGST for inter-state customers
Accounting → Configuration → Fiscal Positions: this is where CGST+SGST gets swapped to IGST automatically — every GST rate needs a mapping line here, and "Detect Automatically" must be on.
CarefulFixing the fiscal position corrects future invoices only. Posted invoices with wrong tax need credit notes and re-issue — do not edit posted GST documents.

2. Tax-included prices billed with tax-excluded taxes

Retail-style businesses quote MRP (tax included); B2B quotes are usually tax-excluded. If your product prices are MRP but the GST tax record is not flagged "Included in Price", Odoo adds tax on top — and every invoice is high by the GST amount. The reverse setup under-bills you.

Fix
  1. Open the tax: Accounting → Configuration → Taxes → Advanced Options → check or uncheck Included in Price to match how your prices are set.
  2. Keep it consistent: one convention for the whole pricelist. Mixed conventions need separate taxes (e.g. "GST 18% Incl" for POS, "GST 18%" for B2B).
Odoo Taxes configuration list showing sales and purchase taxes with their computation settings
Accounting → Configuration → Taxes: every rate your business charges should exist here once, correctly scoped (Sales/Purchase) — duplicated ad-hoc taxes are where mismatches breed.

3. Wrong default taxes on products

When products are imported from Tally or Excel, they inherit the company default tax (usually 18%) unless a tax column was mapped. Your 5% and 12% items then quietly bill 18% until a customer complains.

Fix
  1. Export the product list with the Customer Taxes column and audit it against your rate chart, HSN-wise.
  2. Mass-update by import: product ID + correct Customer Taxes / Vendor Taxes columns.
Odoo customer invoice form showing the Taxes chip on each invoice line and the tax totals section
On every invoice line, the Taxes chip tells the truth: here a 0% export tax on the line, and the totals block breaking up tax rate-wise. If a line's chip shows the wrong rate, the product's default tax is the culprit.

4. HSN code missing or invalid

E-invoicing rejects documents whose lines carry missing or malformed HSN codes — and B2B customers reject invoices whose HSN does not match their purchase records. This surfaces as "GST problems" though the tax math is fine.

Fix
  1. Fill HSN/SAC Code on every product (Accounting tab of the product form in the Indian localization).
  2. Respect the digit rules for your turnover slab (4/6/8 digits) — validate before the first e-invoice run, not after.

5. Rounding method mismatches

Odoo can round tax per line or globally. Tally and the GST portal effectively round differently from your setting, so totals drift by a rupee — harmless mathematically, endless pain at reconciliation time.

Fix
  1. Set Accounting → Settings → Rounding Method to Round Globally to match portal behaviour (verify against a few live invoices first).
  2. Add a Cash Rounding method for POS if you round bills to the rupee.

6. Manual edits on invoice lines

Users "correcting" totals by editing tax amounts or adding untaxed adjustment lines create invoices whose GST breakup no longer matches rate × base — which GSTR-1 tools and auditors flag immediately.

Fix
  1. Lock it down: restrict who can edit journal items, and train billing staff to fix the cause (price, tax, discount) — never the computed tax.
  2. Find damage with a query on invoices where tax ≠ computed tax; we run this audit as part of every GST rescue.
Filing deadline coming and the numbers still don't match?

We audit your taxes, fiscal positions, HSN data and invoice history, and hand you a written fix plan — usually within a day. E-invoice and e-way bill setup included. No re-implementation.

Get a GST setup audit or WhatsApp +91 98414 81435

Frequently asked questions

Does Odoo support e-invoice (IRN) and e-way bill for India?

Yes — the Indian localization generates IRN and e-way bills through registered GSPs. Most "it doesn't work" cases are credential setup, HSN data quality, or units of measure mapping — all fixable configuration.

Why do totals differ from Tally by ₹1 on many invoices?

Rounding method (cause #5). Align Odoo's rounding setting with the convention your accountant reconciles against, and the drift stops.

Can you set up GSTR-1 / GSTR-2B reconciliation in Odoo?

Yes. The localization produces GSTR-1 data, and 2B reconciliation is a workflow we configure with matching rules — ask us for a demo on your own data.