If your business is VAT-registered in Tanzania, you know the routine. A sale is recorded in your system, then the same sale is keyed again into an EFD machine to print the TRA receipt. At the end of the day, someone prints the Z report and tries to make it match the invoices.
Most days it almost matches. That "almost" is the problem.
EFD machines are separate devices. They cost money to buy and maintain, they break down, they run out of paper at the worst moment, and they don't talk to your accounting system. Every sale entered twice is a chance for a typo, a missed receipt or a total that drifts. Finance teams then spend hours reconciling invoices, receipts and Z reports by hand, and compliance mistakes with TRA are expensive.
We built TRA VFD for Odoo 19 to remove that double work.
What TRA VFD is
A Virtual Fiscal Device (VFD) issues TRA fiscal receipts online instead of through a physical machine. Our TRA VFD module connects Odoo to a VFD provider, so the receipt is created from the invoice or sale you already recorded in Odoo. TRA issues the receipt number, verification code and QR link, and Odoo stores them on the transaction.
You record each sale once, and the receipt comes from that record.
How it works for invoices
For businesses that invoice customers, the day-to-day flow is simple:
- Confirm the invoice in Odoo as usual.
- Click Post Receipt. The invoice goes to TRA through the VFD, and Odoo receives the TRA receipt number, verification code and QR link.
- The customer receives the receipt. Odoo emails it from the invoice, with the TRA receipt PDF, the verification code and a "Verify on TRA" link. The message stays in the invoice history, so you can always see what was sent and when.
A few options make this faster:
- Bulk posting. Select many invoices, choose Action > Post Receipt, and Odoo gives you a summary of how many succeeded and how many failed.
- Send Invoices Automatically. Turn this on and invoices go to TRA as soon as they're confirmed, with no button to press.
- Send to Customer. Resend the receipt email at any time. A setting controls whether receipts are emailed automatically.
- Multi-currency. Invoices in USD or another currency are converted to TZS before they're sent.
Need paper? Print > TRA Receipt produces the receipt in the TRA receipt layout, sized for 80 mm thermal printers. It includes your taxpayer details (TIN, VRN, serial number, UIN and tax office), the customer's details, items, VAT totals, the verification code, and a QR code the customer can scan to verify.
Your standard invoice PDF also shows the TRA verification code and QR code, and a fully paid invoice is titled "Tax Invoice".
Point of Sale, for shops and counters
If you sell through Odoo Point of Sale, TRA VFD adds POS support automatically. If you only invoice, nothing related to POS is installed.
At the till:
- Every paid order is sent to TRA, and the legal TRA receipt prints instead of the normal ticket.
- Problems are caught before payment. If a product's tax isn't set up for TRA, the POS stops it before the customer pays, not after the sale.
- Sales don't stop when TRA can't be reached. The sale still goes through, the cashier sees the actual reason, and they can post the receipt again with one tap.
- No double fiscalising. If an invoice is created from a POS order, it isn't sent to TRA a second time.
Never miss a receipt
The hardest part of fiscal compliance isn't the receipts that work. It's knowing about the ones that didn't. TRA VFD makes every receipt's state visible:
- Clear statuses on every receipt: In Queue, Submitted, Posted or Error. They also appear as a column on your invoice list, with filters such as "Not Sent to TRA" and "TRA: Failed".
- Real error messages. When TRA or the VFD server rejects something, Odoo shows the actual reason in plain words on the receipt and the invoice, not a generic failure.
- Automatic retries. Receipts that fail for temporary reasons, such as the internet being down or the server being busy, are retried automatically every 30 minutes.
- Duplicate protection. Possible duplicates are flagged for a person to check instead of being retried endlessly.
- Needs Attention. One menu lists every receipt TRA hasn't accepted yet, so nothing slips through.
The module also supports webhooks, so your VFD provider can push confirmations back to Odoo automatically. Every request is signed with a secret and checked before Odoo accepts it.
Z reports on autopilot
Daily Z reports are fetched from the VFD automatically every day, or right away when you click Fetch Now.
Each Z report in Odoo shows:
- daily totals
- VAT and net amounts by tax band
- totals by payment method
- the receipts it includes
Because the receipts came from Odoo in the first place, reconciling the Z report against your sales is a check, not a project.
Setup in four steps
Getting started takes a few minutes once you have your VFD provider's details:
- Enter your credentials from the VFD provider on the guided setup screen.
- Click Connect & Fetch Registration to load your TRA registration details into Odoo.
- Map your taxes. Each sales tax is linked to its TRA tax code: A (Standard 18%), B (Special Rate), C (Zero Rated), D (Special Relief) or E (Exempt).
- Switch from Test to Production once your test receipts look right.
Customer identification is supported on contacts, with format checks: TIN, VRN, NIDA, passport, driving licence or voter's number. All of it is optional, so walk-in customers don't slow you down.
For groups, each company has its own device. On security, VFD credentials and secrets are visible only to accounting managers, and ordinary users can't delete fiscal receipts.
Who it's for
- Retail shops and supermarkets using Odoo Point of Sale
- Wholesalers and distributors issuing many invoices a day
- Logistics and service companies invoicing in TZS and foreign currency
- Finance teams tired of reconciling EFD totals against the books by hand
- Groups with several companies, each with its own device
Frequently asked questions
Do I still need an EFD machine?
No. Receipts are issued online through a Virtual Fiscal Device, from the invoices and sales you record in Odoo. You'll need an account with a VFD provider.
What happens if the internet goes down?
Invoices that can't reach TRA are marked with their status and retried automatically every 30 minutes. At the POS, the sale still goes through and the cashier can post the receipt again with one tap once the connection is back.
Do I need Odoo Point of Sale?
No. The module works with invoices alone. POS support is added only if you already use Odoo Point of Sale.
Can my customers verify their receipts?
Yes. Every receipt carries the TRA verification code and a QR code, and the email includes a "Verify on TRA" link.
Does it work with multiple companies?
Yes. Each company in Odoo has its own device and its own settings.
See it working on your own invoices
TRA VFD is built for Odoo 19. If you'd like to see it on your own invoices, or have it installed and configured for your business, talk to Chesify Labs. We'll take you from VFD credentials to your first live receipt.
Book a demo or request installation, or message us on WhatsApp.