Customers upload resale and exemption certificates, you approve them for chosen countries or states and dates, and Magento stops charging them tax until the certificate expires.
Tested on Magento 2.4.8Updated Nov 13, 2026Version 1.0.0Compatible with Magento Open Source 2.4.8 (tested on 2.4.8-p5, PHP 8.3) No core file edits
Built forMagento
Tax free, by certificate: approved customers are not charged tax where the certificate applies.1 of 7
What it does
Customers upload resale and exemption certificates, you approve them for chosen countries or states and dates, and Magento stops charging them tax until the certificate expires.
Your resellers and exempt customers should not pay tax, and you need the paperwork. Magento can exempt a whole customer group, but it has no certificate, no expiry and no way to limit the exemption to the states a certificate covers. Tax Exemption Certificates collects the certificate from each customer, lets you approve it for the right countries or states, and removes tax only for that customer, only where the certificate applies and only while it is valid.
Features
Collected in My Account
Certificate type, number, name, countries or states covered, expiry date and the file (PDF or image)
A notice in the cart: certificate applied, waiting for review, or a link to submit one
Pending, approved, rejected and expiring states visible to the customer
Reviewed in one queue
Customers > Tax Exemption Certificates: tabs for pending, approved, expiring, expired, rejected and revoked, with counts and search
Approve for chosen countries or states (DE, US-CA) with valid-from and valid-until dates, reject with a reason, revoke, change terms
Documents, the orders that used the certificate and the full audit history in one view
Tax-free the Magento way
Approved customers are calculated with a customer tax class that has no tax rule: catalog prices, cart, shipping, checkout and admin orders follow, nothing is written to the customer
Ends by itself on the expiry date, on revoke, or when the address is outside the approved places
The certificate is stored with the order, in the admin and in My Account, and stays after it expires
Safe with documents
Documents in protected storage outside the public folder, type and content checked, downloads only for the owner and permitted staff
Deleted with the customer account, optional retention for ended certificates
No e-mail is sent: events and admin inbox notices for your own observers or ERP; ACL permissions and a REST API
Made for Magento 2
Magento Open Source 2.4.8 (tested on 2.4.8-p5), PHP 8.3
Declarative schema, one thin plugin on Magento's tax rate request, no core overrides
Runs in your store; only the licence check contacts our server
What you get
Download & installThe module .zip for Magento Open Source 2.4.8, extracted into app/code/KavioLabs (it is also a Composer package). Download it from My licenses right after payment.
12 months of updates & supportNew versions and help for 12 months (24 or 36 months at checkout). After that the module keeps working; renew anytime at 50%.
License for your storeOne production domain with all its subdomains; staging and local development hosts are free. How licensing works
30-day refundFull refund within 30 days of your first purchase, no reason needed. Refund policy
Tested buildsMagento Open Source 2.4.8 (tested on 2.4.8-p5, PHP 8.3). Tested on Magento 2.4.8.
Documentation & supportFull guide (Installation, Configuration, Using it, FAQ) on this page. Tickets from your account, same-day reply on weekdays (Mon-Fri 09:00-18:00 UTC+3).
Compatibility
Tax Exemption Certificates for Magento works with Magento Open Source 2.4.8 (tested on 2.4.8-p5, PHP 8.3).
We list the builds we install and test on. “Tested” means the test plan ran on that build; “Supported” means the build is inside the supported range.
Compatibility
Version
Range
Runs on
Status
Magento 2.4.8
Open Source 2.4.8-p5
PHP 8.3
Tested on 2.4.8-p5
Editions
Magento Open Source
app/code (zip) or Composer
Self-hosted
1.0.0
Nov 13, 2026
Latest
First release: certificate upload in My Account, review queue (approve, reject, revoke, change terms), scope by country or state, dates, audit log, documents in protected storage, tax removed through a customer tax class without tax rules, order record, cart notice, customer group restriction, REST API, daily expiry notice and retention.
Tested on Magento Open Source 2.4.8-p5, PHP 8.3.
Audit fixes before release: block cache keys (price box, products list widget) vary by exemption state; one shared choice of the tax address (shipping origin, default destination, store of the order) for the order record, the multi-address checkout record and the cart notice; tax charged stored with the order record; admin warnings (tax rule on the exempt class, Cross Border Trade); caps on pending certificates and REST uploads; customer delete removes files only after a successful delete; daily removal of orphan document folders; composer constraints ~103.0.8 and PHP ~8.3.0.
How do I install the module?
Install the module. Unzip into app/code/KavioLabs (the zip is also a Composer package).
Enable and upgrade. bin/magento: module:enable, then setup:upgrade (and di:compile in production mode).
Enter the license key. Stores > Configuration > Kavio Labs: paste the key from My licenses. Staging and local stores are included.
Magento Open Source 2.4.8 (tested on 2.4.8-p5, PHP 8.3). Tested on Magento 2.4.8. The Compatibility tab lists every version range.
Can I buy a Magento module today?
Yes. Every Magento module on this site is on sale: one-time price per production store, staging and development domains included, 12 months of updates and support.
Do the modules work with Hyva?
Each product page says what was tested. Admin-only modules do not depend on the storefront theme; modules that change the storefront name the tested theme (Luma) on their Compatibility tab.
How does licensing work?
One license per production store domain, with staging and development domains included. 12 months of updates and support; after that the module keeps working.
Do you already sell modules for other platforms?
Yes. Kavio Labs sells add-ons and plugins for CS-Cart, OpenCart, WooCommerce, PrestaShop and Shopware, with the same license portal and support desk.
What does the license cover?
One production store domain with every subdomain (www, shop., staging.), plus local development hosts such as localhost, *.local and *.test. A store on another domain needs its own license; a second-store license is 40% off. You have 14 days after installing to enter the key. 12 months of updates and support are included; after that the module keeps working and renewals are 50% off. How licensing works
Can I get a refund?
Yes. Ask for a full refund within 30 days of your first purchase, no reason needed: open a ticket or write to [email protected] with your order number. The money goes back to the card or bank account you paid with within 5 business days of approval. Refund policy
How do I get help?
Open a ticket from your account, so your license details are attached. We answer with a same-day reply on weekdays (Mon-Fri 09:00-18:00 UTC+3). Support policy. Not a customer yet? Ask a pre-sales question.
Customers upload a resale or exemption certificate, you approve it for the countries or states and the dates you choose, and Magento stops charging tax to that customer where the certificate applies. The exemption ends by itself on the expiry date, and every order keeps the certificate it was placed under.
Tested on Magento Open Source 2.4.8-p5 with PHP 8.3, self-hosted. Not for SaaS editions that cannot run PHP modules.
Review queue
What it does
Customers submit a certificate in My Account (type, number, name, countries or states covered, expiry date, PDF or image). A notice in the cart shows the state: applied, waiting for review, or a link to submit one.
You review the queue in Customers > Tax Exemption Certificates: approve for chosen jurisdictions and dates, reject with a reason, revoke, change terms, open the documents.
Tax is removed by Magento's own tax engine: a customer under a valid certificate is calculated with a customer tax class that has no tax rule (the module creates "Tax exempt (certificate)"). Catalog prices, cart, checkout, shipping and admin order creation all follow, and nothing is written to the customer record.
Every order keeps the reference (number, type, scope, destination) on the order page in the admin and in the customer's account, and the audit log of the certificate lists the orders.
Records: audit log of every step, documents in protected storage, documents and rows deleted with the customer, optional retention, an REST API for ERP and accounting systems.
Approved certificate
What it does not do
It is a record keeping and workflow tool, not tax advice: you decide which certificates are valid.
It removes all taxes of the order for a covered destination (Magento tax classes cannot exempt one tax only).
Guests cannot be exempt: a certificate belongs to a customer account.
It sends no e-mail. It raises Magento events and admin inbox notices; see the FAQ.
Installation
Download the zip from your Kavio Labs account (My licences > Downloads).
Extract it into app/code/KavioLabs/TaxExemptCertificates/ (the folder then contains registration.php and etc/).
in production mode also bin/magento setup:di:compile and bin/magento setup:static-content:deploy
Open Stores > Configuration > Kavio Labs > Tax Exemption Certificates and enter your licence key.
The zip is also a Composer package (kaviolabs/module-tax-exempt-certificates, composer.json at the root), so a Composer artifact repository can install it as well.
setup:upgrade creates four tables (kv_tax_exempt_certificates_*) and the customer tax class "Tax exempt (certificate)", and selects it in the settings. Documents are stored in var/kv_tax_exempt_certificates/, outside the public pub/ folder.
Check the tax rules once
The exempt class works because no tax rule names it. Open Stores > Tax Rules and make sure no rule lists "Tax exempt (certificate)" under Customer Tax Class. Rules you create later must not select it either.
If your catalog prices include tax, leave Stores > Configuration > Sales > Tax > Calculation Settings > Enable Cross Border Trade on No (the default). With it on, Magento keeps the gross price for customers whose rate differs from the store rate, so an exempt customer would still pay the gross price.
Update
Replace the folder with the new version and run bin/magento setup:upgrade (plus setup:di:compile and setup:static-content:deploy in production mode). Certificates, documents and settings stay.
Uninstall
Keep the data: bin/magento module:disable KavioLabs_TaxExemptCertificates, delete the folder and run bin/magento setup:upgrade. Certificates, documents and settings stay for a later reinstall.
Remove everything (the four tables, the documents in var/kv_tax_exempt_certificates/, the settings, the licence state, and the tax class if the module created it and nothing uses it): bin/magento module:uninstall KavioLabs_TaxExemptCertificates --non-composer first, then module:disable, delete the folder and run setup:upgrade. For a Composer install use bin/magento module:uninstall KavioLabs_TaxExemptCertificates --remove-data.
Export what you need through the REST API before removing the data: orders keep their tax figures, but the certificates themselves are gone.
Licence key and status. The module works for a 14-day start period without a key. Without an active licence no tax is removed (certificates, the queue and the settings stay available).
General
Setting
What it does
Enabled
Off: no certificate removes tax. Existing data stays.
Customer tax class for exempt customers
The class a customer under a valid certificate is calculated with. It must have no tax rule. The module created "Tax exempt (certificate)"; you can select another customer tax class that has no rule. Empty: no tax is removed.
Customer groups that may hold a certificate
Customers of other groups cannot submit and are never exempt. Empty = every group. Use it to limit the feature to a wholesale group.
Show a notice in the cart
"Tax exempt: certificate X applied", "waiting for review" or a link to submit one.
Certificates
Setting
What it does
Certificate types
One per line. Customers choose one.
Require a document
Customers must attach a PDF or image.
Allowed file types
pdf, jpg, jpeg, png, webp, tif, tiff. Script and web file types are never accepted.
Largest file / Files per certificate
1 to 20 MB and 1 to 10 files. PHP's upload_max_filesize and post_max_size apply as well.
Default validity (days)
Used when neither the customer nor you give an expiry date. 0 = such a certificate does not expire.
Expiring soon (days)
A certificate ending inside this window shows as "Expiring soon" and creates one notice in the admin inbox. 0 = never.
Delete documents of ended certificates after (days)
Documents of rejected, revoked and expired certificates are deleted after this many days; the record and the log stay. 0 = keep.
Permissions
Stores > Settings > Permissions > User Roles: Customers > Tax Exemption Certificates lets a role read the queue, documents and the REST list; Approve, reject, revoke and delete certificates lets it decide. The settings have their own resource under Stores > Settings > Configuration.
Which address decides
The jurisdiction of a certificate is compared with the place Magento calculates the tax for: Stores > Configuration > Sales > Tax > Tax Calculation Based On (shipping address by default; with "Shipping Origin" the store origin decides). The order record and the cart notice use the same choice, so they always agree with the tax that was charged.
Warnings
The queue and certificate pages warn when a tax rule names the exempt customer tax class, or when Cross Border Trade is on while prices include tax. Both stop the exemption from working. A customer can have at most 5 certificates pending review.
Dates
An approval "valid until" a day ends at midnight of the store's time zone (Stores > Configuration > General > Locale Options), not of the server. A date that cannot be read, lies in the past or ends before it starts is refused, never saved as "no expiry".
Using it
Customers
My Account > Tax exemption certificates lists the customer's certificates with their status and documents, and has the form: type, number, name on the certificate, countries or states covered (DE, US-CA, US-NY), expiry date, file, note. A pending or rejected certificate can be withdrawn; an approved one can only be ended by the store.
In the cart a notice shows whether the certificate applies to the address the tax is calculated for.
My AccountCart notice
Reviewing
Customers > Tax Exemption Certificates shows tabs with counts (Pending, Approved, Expiring soon, Expired, Rejected, Revoked, All) and a search over number, name, customer name and e-mail.
Open a certificate to see the customer, the documents (downloads are attachments, never served by the web server), the orders that used it and the full history. Then:
Approve: confirm the jurisdictions (US-CA, DE, or * for everywhere) and the dates. The customer's requested scope and expiry are filled in.
Reject: a reason is required and shown to the customer.
Change terms of an approved certificate: scope and dates.
Revoke: the exemption ends with the next tax calculation.
Delete documents keeps the record; Delete certificate removes it and its files but keeps its audit log with a "deleted" entry.
Certificate
What happens to tax
While an approved certificate is valid today and covers the address Magento calculates the tax for, the customer is calculated with the exempt class: product prices, the cart, shipping and the order have no tax. Outside the places, before the start date, after the end date, after a revoke, with the module off or without an active licence, tax is charged again at the next calculation. Orders already placed are never changed.
Orders
The order page in the admin shows "Tax exempt (certificate)" with number, type, scope and destination and a link to the certificate; the customer sees it on the order page in My Account. The reference is stored with the order, so it stays after the certificate is revoked, expired or deleted.
Order
REST API
Admin or integration token; ACL as above. Base /rest/V1/kv-tax-exempt/certificates:
GET ?status=pending&customerId=5&search=&page=1&limit=50, GET /:id
POST (customerId, type, number, scope, holderName, expiresAt, note, documentNames[], documentsBase64[])
Unreadable, past or inconsistent dates answer 400 and change nothing.
FAQ
How is tax removed?
Magento builds a tax "rate request" (destination and customer tax class) for every calculation. For a customer with a valid certificate covering the destination, the module swaps the customer tax class for a class that no tax rule names, so Magento finds no rate. It is the same effect as any customer class without a rule, and it works for catalog prices, cart, checkout, shipping and admin orders. Nothing is written to the customer.
Does it work when catalog prices include tax?
Yes, with Cross Border Trade off (the default): the exempt customer is charged the net price. With Cross Border Trade on, Magento keeps the gross price for customers whose rate differs, which defeats an exemption. See Installation.
Is the full page cache a problem?
Pages and price blocks shown to a customer under a certificate are cached separately from those of the other customers of the group: a fingerprint of the valid certificates (and whether one covers the customer's default tax address) is added to the HTTP context, to the price box cache key and to the CMS products list widget key, like Magento's own tax rates. Customers without a certificate keep the normal cache keys.
Which address decides?
The place Magento itself calculates the tax for (Tax Calculation Based On: the shipping address by default, the billing address, the store's shipping origin, or the default tax destination). A tax configured on the billing address is also removed when the shipping address is covered and shipping is the basis. With a multi-address checkout each order is decided, and recorded, for its own address.
What about fixed product tax (FPT / Weee)?
Fixed product tax amounts are location based, not a tax rate, so they stay; the tax on a taxable FPT amount is removed like any other tax.
Can a guest be exempt?
No. The customer signs in, submits a certificate, and is exempt once it is approved.
Does it send e-mails?
No. It never sends e-mail. It dispatches Magento events (kv_tax_exempt_certificates_certificate_submitted, _approved, _rejected, _revoked, _expiring) that your own observers or an ERP can use, and it adds notices to the admin inbox for new submissions and for certificates entering the "expiring soon" window.
Where are the files?
In var/kv_tax_exempt_certificates/, outside the public folder, under random names without extension. They are served only through the module's controllers: a customer gets their own documents, an admin needs the permission. Downloads are attachments with nosniff and a sandboxing content security policy. Uploads are checked for type, size, real file content and embedded code.
What happens when I delete a customer?
The customer's certificates, documents (files) and log rows are deleted. Orders keep the certificate number.
What if the licence lapses?
Tax is charged again, because the module no longer removes it. The queue, the documents and the settings stay available.
Does it work with multiple websites?
Certificates belong to the customer account and apply on every website that shares the customer; the settings are in the default scope.
Is this tax or legal advice?
No. It keeps records and applies the rules you approve; you decide which certificates are valid.
XRechnung (UBL and CII) and Peppol BIS Billing 3.0 from Magento invoices and credit memos: Leitweg-ID, buyer VAT ID, EU VAT categories, validated before you send.
Sell by the metre, square metre, kilogram or litre: customers enter 2.35 m, the line total is rounded once and the unit shows in cart, orders and e-mails.