OpenSalesTax connector for Odoo 16 — destination-based US sales tax via the OpenSalesTax engine
Project description
opensalestax-odoo
Destination-based US sales tax for Odoo Community. Replaces static tax-rate configuration with live calculation against an OpenSalesTax engine — your own self-hosted instance, no per-transaction fees, no SaaS lock-in.
The free, self-hostable answer to Avalara on Odoo Community Edition. Available on all four current Odoo major versions — 16.0, 17.0, 18.0, and 19.0 — same module, branch-per-version per the OCA convention.
Branch matrix
Pick the branch matching your Odoo install. Releases are independent per branch.
| Odoo version | Branch | PyPI artifact | Status |
|---|---|---|---|
| 16.0 | 16.0 |
odoo-addon-account-ostax==16.0.* |
shipping |
| 17.0 | 17.0 |
odoo-addon-account-ostax==17.0.* |
shipping |
| 18.0 | 18.0 |
odoo-addon-account-ostax==18.0.* |
shipping (default) |
| 19.0 | 19.0 |
odoo-addon-account-ostax==19.0.* |
shipping (Odoo 19 GA confirmed) |
What you get
- Sales orders, customer invoices, credit notes/refunds, vendor bills, POS, purchase orders — all with destination-based per-jurisdiction US tax
- Per-jurisdiction breakdown stored on every move (state / county / city / district), rendered on the form view for full audit trail
- Customer exemption certificates on
res.partner - Multi-company support — settings scoped per company
- Fiscal-position interop — non-US partners route through Odoo's standard "Export" mapping; the connector only engages for US shipping addresses
- Settings page with engine connection test, cache TTL, fail-soft toggle
- Optional admin debug log of recent calculations
Install
# Match the branch to your Odoo major:
pip install opensalestax # the Python SDK
pip install odoo-addon-account-ostax==18.0.0.1.0 # this connector for Odoo 18
# Or install from source:
git clone -b 18.0 https://github.com/ejosterberg/opensalestax-odoo.git
cd opensalestax-odoo
# Symlink or copy account_ostax/ into your Odoo addons-path
Then in Odoo: Apps → search "OpenSalesTax" → Install, then Settings → Accounting → OpenSalesTax to configure the engine URL.
How it works
The connector overrides account.tax.compute_all. When a US partner with a
valid 5-digit ZIP is on a sale order / invoice / POS order / vendor bill,
compute_all calls the OpenSalesTax engine via the Python
SDK and replaces the static
catalog rate with the engine's per-jurisdiction breakdown. Non-US partners
fall through to Odoo's standard fiscal-position handling.
Calculation only
Tax calculations are provided as-is for convenience. The merchant is solely responsible for tax-collection accuracy and remittance to the appropriate jurisdictions. Verify against your state Department of Revenue before remitting.
This module does NOT file returns, remit collected tax, validate addresses, or provide legal/tax advice.
License
LGPL-3 (or-later) per the project's per-platform license carve-out.
Apache-2.0 SDK consumed. DCO sign-off required on every commit; no AI
co-author trailers. See CONTRIBUTING.md.
Status
Production-grade across all four Odoo majors. v0.1.5+ is shipping
on PyPI as odoo-addon-account-ostax==<branch>.0.1.5 for 16.0,
17.0, 18.0, and 19.0.
What works on every branch:
- Real destination-based per-jurisdiction US sales tax on every customer invoice, sale order, credit note (state / county / city / district splits in the totals area)
- Engine audit JSON captured on
_post()(engine version, calc timestamp, full per-jurisdiction detail) - Customer exemption certificate handling
- Multi-company isolation
- Settings page + Test Connection action
- Optional admin debug log
- Optional 90-day archive cron for jurisdictions you've stopped shipping to
How it's wired:
- Odoo 18 + 19 override
account.tax._add_tax_details_in_base_linesusing the officialmanual_tax_amountsinjection mechanism — same hook the proprietary Avalara module uses, no internal-API fragility. - Odoo 16 + 17 override the legacy
compute_allmethod (the new batch engine arrived in 18.0). - Per-version settings xpath: 16 uses
//div[@data-key='account']; 17/18/19 use//app[@name='account'].
Verified end-to-end on real Odoo + Postgres in Docker against the
live engine, including Odoo's official US chart of accounts
(l10n_us): $100 invoice to MSP (ZIP 55401) produces
amount_tax=9.03 with 6 per-jurisdiction lines. 32 unit tests pass
on each branch.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file odoo_addon_account_ostax-16.0.0.1.7.tar.gz.
File metadata
- Download URL: odoo_addon_account_ostax-16.0.0.1.7.tar.gz
- Upload date:
- Size: 30.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ca2bd5feb531248d244f6db4ef8f37583f7cf75d3f43dc2c87ec10867ae6fa6
|
|
| MD5 |
8c2a2439b8b8fc9d2f2b9ec7bb42b353
|
|
| BLAKE2b-256 |
223d4abc5e4bbfafed3ffc2b7df3119bd21b1a8d16341e2498c230d43c28030f
|
Provenance
The following attestation bundles were made for odoo_addon_account_ostax-16.0.0.1.7.tar.gz:
Publisher:
publish.yml on ejosterberg/opensalestax-odoo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
odoo_addon_account_ostax-16.0.0.1.7.tar.gz -
Subject digest:
6ca2bd5feb531248d244f6db4ef8f37583f7cf75d3f43dc2c87ec10867ae6fa6 - Sigstore transparency entry: 1457741159
- Sigstore integration time:
-
Permalink:
ejosterberg/opensalestax-odoo@9984b3204081cf61e8893257aeca4ada19d348d8 -
Branch / Tag:
refs/tags/16.0-v0.1.7 - Owner: https://github.com/ejosterberg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9984b3204081cf61e8893257aeca4ada19d348d8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file odoo_addon_account_ostax-16.0.0.1.7-py3-none-any.whl.
File metadata
- Download URL: odoo_addon_account_ostax-16.0.0.1.7-py3-none-any.whl
- Upload date:
- Size: 32.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17f1389f21581a2a730f0c3fae1d984e9b5bcf28334bae4edd6e7414489f849f
|
|
| MD5 |
dca8eb6667452c69a0cf029cf6fffcf9
|
|
| BLAKE2b-256 |
e29277413fb8ea75e5b6060938062679e605bb68ff5cd328b3c378d91fdeb958
|
Provenance
The following attestation bundles were made for odoo_addon_account_ostax-16.0.0.1.7-py3-none-any.whl:
Publisher:
publish.yml on ejosterberg/opensalestax-odoo
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
odoo_addon_account_ostax-16.0.0.1.7-py3-none-any.whl -
Subject digest:
17f1389f21581a2a730f0c3fae1d984e9b5bcf28334bae4edd6e7414489f849f - Sigstore transparency entry: 1457741244
- Sigstore integration time:
-
Permalink:
ejosterberg/opensalestax-odoo@9984b3204081cf61e8893257aeca4ada19d348d8 -
Branch / Tag:
refs/tags/16.0-v0.1.7 - Owner: https://github.com/ejosterberg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9984b3204081cf61e8893257aeca4ada19d348d8 -
Trigger Event:
push
-
Statement type: