Odoo KRA eTIMS Integration: OSCU vs VSCU, Setup Steps and Error Fixes
Odoo eTIMS Kenya guide: OSCU vs VSCU, supported Odoo versions, KRA registration steps, product codes, stock and credit note rules, and common rejection fixes.
Most eTIMS articles stop at "Odoo is compliant" and leave the hard part to you: the service request, item codes, stock discipline and the errors that appear on the first live invoice. This guide covers all of it, the same steps our Odoo integration services run for Kenyan clients.
It is for finance managers, IT leads and Odoo administrators in Kenya who need KRA-signed invoices without rebuilding their ERP. Still budgeting? Start with our guide to Odoo implementation cost in Kenya and Africa, which prices eTIMS as one budget line.
What is KRA eTIMS and who has to use it?
KRA eTIMS is the electronic Tax Invoice Management System through which every invoice must be validated, signed and transmitted to the Kenya Revenue Authority. It replaced the hardware-based TIMS control units for most taxpayers.
The legal basis is Section 23A of the Tax Procedures Act, introduced by the Finance Act 2023. KRA's guidance says it "requires every person in business to record each sale, issue and transmit invoices". KRA's eTIMS page adds that all persons engaged in business must onboard, VAT-registered or not.
KRA offers several ways to comply. Only the last row matters for an ERP.
| KRA solution | What it is | Who it suits |
|---|---|---|
| eTIMS Lite (web, USSD *222#, app) | Simple invoicing without software | Non-VAT individuals and sole proprietors |
| Online portal (etims.kra.go.ke) | Web invoicing screen | Small firms with few invoices |
| eTIMS Client | Downloadable Windows or Android software, multi-branch, multi-till | Shops and service firms without an ERP |
| Buyer-initiated or reverse invoicing | Buyer raises the invoice for the seller | Buying from informal suppliers |
| System to system (OSCU or VSCU) | Your ERP talks to KRA through a Sales Control Unit | Any business running Odoo |
Two KRA rules shape every ERP decision: each solution keeps its own invoice sequence, and a credit note can only be raised from the solution that issued the original invoice. Re-keying Odoo invoices into the portal creates duplicates and orphaned credit notes.
eTIMS OSCU vs VSCU: which one does Odoo use?

Odoo's native Kenya module is an OSCU, hosted at KRA and designed for systems that are always online; a VSCU is a Java service you host yourself for bulk or intermittent invoicing. Both are "Sales Control Units" that validate, encrypt, sign and store invoices.
KRA's sign-up guide puts it plainly. The OSCU is "Implemented and hosted at KRA" and suits online systems. The VSCU is "Implemented and hosted on the client side" and suits organizations that generate large invoice volumes in a short time or whose invoicing is not always online.
| Factor | OSCU (Online Sales Control Unit) | VSCU (Virtual Sales Control Unit) |
|---|---|---|
| Where it runs | On KRA's servers | On your server, as a Java 16+ JAR on port 8088 by default |
| Internet needed | Every invoice is signed online | Can sign locally and sync later |
| Best for | Cloud ERPs, Odoo Online and Odoo.sh | Bulk billers, remote sites, flaky connectivity |
| Odoo support | Native in Enterprise 17+ (l10n_ke_edi_oscu) | Third-party modules only |
| Setup | Initialize from Odoo settings with a serial number | Install and configure the KRA package, then point Odoo at it |
| Who maintains it | KRA and Odoo | Your IT team or partner |
KRA's technical specification sets a transmission schedule of at most 15 minutes, with status "P" for a processed command and "E" for an error. Odoo's OSCU hides this detail: you click Send and the invoice returns with a KRA invoice number, SCU ID, receipt signature and QR code.
Pick a VSCU only if you bill thousands of lines in short bursts or your sites lose connectivity for hours. For most Kenyan firms on Odoo Enterprise, the native OSCU is the lower-risk choice because Odoo maintains it with each release.
Which Odoo versions and editions support eTIMS?
The eTIMS EDI modules run on Odoo Enterprise 17.0 and later, including Odoo 19 and Odoo 20, while Odoo Community only has the Kenyan chart of accounts, taxes and the legacy Tremol TIMS module. This is the single most common surprise in scoping calls.
| Module | Technical name | Edition | What it does |
|---|---|---|---|
| Kenya - Accounting | l10n_ke | Community and Enterprise | Chart of accounts, 16%, 8%, zero-rated, exempt and withholding taxes, KRA item codes |
| Kenya - Accounting Report | l10n_ke_reports | Enterprise | Kenyan financial and tax reports |
| Kenya eTIMS EDI Integration | l10n_ke_edi_oscu | Enterprise 17+ | The OSCU: initialization, codes, products, invoices, bills, stock |
| Kenya eTIMS EDI Manufacturing | l10n_ke_edi_oscu_mrp | Enterprise 17+ | Sends bills of materials to KRA |
| Kenya - Point of Sale | l10n_ke_edi_oscu_pos | Enterprise 17+, optional | eTIMS signing for POS receipts |
| Kenya Tremol Device EDI | l10n_ke_edi_tremol | Community and Enterprise | Older G03 Tremol control unit for TIMS |
The Odoo Kenya localization documentation lists the first four as installed automatically, and POS and Tremol as optional. The commitment form asks for "the Odoo version you're using (17.0 or onwards)", so Odoo 16 and older must upgrade first.
Community users need a paid connector. One OSCU module on the Odoo Apps Store lists at about US$670 for Odoo 18; a newer Community and Enterprise eTIMS module for Odoo 17 to 19 lists at about US$298 plus US$199 for a VSCU add-on, but not on Odoo Online.
Add upgrades and support for that connector and the gap to Enterprise narrows. Our Odoo Community vs Enterprise comparison weighs those costs against the license.
On Odoo 15 or 16 with a Tremol device, plan the eTIMS move together with the version jump. Our Odoo upgrade services run both in one test cycle.
How do you set up Odoo eTIMS step by step?
Odoo eTIMS setup has four stages: KRA portal registration, OSCU initialization in Test mode, the integration token, and the switch to Production. Budget two to five working days, most of it waiting for approvals.
- Clean the company record. In Settings, click Update Info and enter the Kenyan Tax ID (KRA PIN). Set the country to Kenya. Odoo generates the OSCU serial number from this VAT number with the prefix ODOO.
- Initialize in Test mode. Go to Accounting, Configuration, Settings, Kenya eTIMS Integration. Set eTIMS Server Mode to Test, enter the Serial Number, tick the two check boxes and click Initialize OSCU.
- Sign up on the eTIMS portal. Create the account with your PIN, confirm the OTP sent to the iTax phone number, and upload the owner's or director's ID plus the signed commitment form.
- File the service request. On the eTIMS dashboard choose Service Request, select OSCU as the eTIMS type, enter Odoo KE LTD as the third-party integrator with PIN PO52112956W, and paste your OSCU serial number.
- Request the integration token. Email etims@mail.odoo.com with your eTIMS portal credentials and database name; Odoo's documentation says the token arrives the same day. Enter it in the Integration Token field.
- Fetch the codes. OSCU standard codes refresh every two days and UNSPSC codes daily, but on a new database run the scheduled actions "KE eTIMS: Fetch KRA standard codes" and "Fetch UNSPSC codes from eTIMS" manually.
- Register products and test a full cycle. Sale, delivery, invoice, send to eTIMS, credit note, vendor bill and stock adjustment. Check the KRA invoice number and QR code on the PDF.
- Switch to Production. Change the server mode, send one live invoice, and confirm it appears under Sales by Invoice on the KRA portal.
A third mode, Demo, uses mock data and needs no initialized OSCU. Use it for training, never for the final test. If the device was already initialized through another ERP, enable developer mode and enter the existing Unit ID and CMC Key instead of initializing again.
How does eTIMS product registration work in Odoo?
KRA requires every product to be registered before it appears on an invoice, stock move or bill of materials, and Odoo registers it automatically the first time all mandatory fields are filled. Missing fields show as a yellow banner at the top of the document.
The General Information tab needs a Cost and Sales taxes. The Accounting tab needs Packaging Unit, Packaging Quantity, Origin Country, eTIMS Product Type, Insurance Applicable and a UNSPSC Category. Odoo pulls the UNSPSC list from KRA daily, so the field is a lookup, not free text.
Tax classification matters as much as the product code. KRA labels tax rates A to E, and Odoo's Kenyan taxes carry a KRA Item Code that justifies each rate.
| KRA tax type | Meaning | Odoo tax | When you need an item code |
|---|---|---|---|
| A | Taxable at 16% | Sales VAT (16%) | Default standard rate |
| B | Taxable at 8% | Sales VAT (8%) | Specific petroleum and listed goods |
| C | Zero rated | Sales VAT Zero Rated | Exports and First Schedule zero-rated items |
| D | Special category | Custom tax | Rare, KRA-defined cases |
| E | Exempted | Sales VAT Exempt | Most exemptions, with the Second Schedule code |
The Kenya accounting module ships roughly 340 KRA item codes that justify a zero or exempt rate. Map exempt and zero-rated products to them during setup, not after the first dispute with KRA.
For catalogs with thousands of SKUs we script the registration: a CSV import of packaging unit, origin and UNSPSC category, then a test send per category. Our Odoo customization services add validation rules so no product reaches an invoice with eTIMS fields missing.
How do stock movements, purchases and BOMs report to eTIMS?
eTIMS is not a sales-only system: KRA expects stock movements, vendor bills, customs imports and bills of materials, and Odoo sends each of them from its own module. This is where spreadsheets and sales-only connectors fall short.
- Stock movements: Odoo sends internal transfers and stock adjustments automatically when no contact is set or the contact is your own company or branch. External moves go after the related invoice. The move must be confirmed and every product registered.
- Sales of unstocked items: KRA does not accept a sale if the product is not in stock, so the advised flow is sales order, validate delivery, confirm invoice, then Send to eTIMS.
- Vendor bills: Odoo fetches new bills from eTIMS daily. You set the product, link the bill to confirmed purchase order lines with quantities equal to the received quantity, choose an eTIMS Payment Method and click Send to eTIMS.
- Customs imports: import records arrive daily under Vendors, Customs Imports. Match each to a registered product, a vendor and a purchase order, then click Match and Approve or Match and Reject.
- Bills of materials: with l10n_ke_edi_oscu_mrp installed, open the BOM and click Send to eTIMS. Both the finished product and every component must be registered first.
Stock accuracy now has a tax consequence, so run a full count before go-live. Our guide on Odoo internal controls covers the three-way match that the eTIMS purchase flow enforces.
How do credit notes work with eTIMS in Odoo?
KRA accepts an eTIMS credit note only if it references a signed invoice and does not exceed that invoice's quantities or prices. Odoo enforces this with two extra fields on the credit note.
Open the eTIMS Details tab on the credit note, choose an eTIMS Credit Note Reason, and select the original invoice in the Reversal of field. Then send it like an invoice. Without the reason or the reference, the send fails or KRA rejects it.
The KRA specification adds two constraints. A credit note "contains only negative, credit note amounts", and an original transaction can be cancelled only once. A partial return followed by a second correction therefore needs a credit for the remainder and a new invoice.
The Odoo credit notes documentation covers partial refunds, full refunds and "full refund and new draft invoice", the cleanest way to fix a wrong price under eTIMS.
What are the most common eTIMS invoice rejection errors and how do you fix them?
Most eTIMS rejections in Odoo come from six causes: an unapproved service request, a sequence mismatch, unregistered products, unvalidated stock, a credit note that breaks KRA's rules, or a branch that was never initialized. The table maps the message you see to the fix.
| Error or symptom | Likely cause | Fix |
|---|---|---|
| "Device is already installed" or "The registration failed" at initialization | KRA has not approved the service request or the change-of-solution request | Wait for approval or chase the eTIMS operations desk; for a device initialized elsewhere, enter Unit ID and CMC Key in developer mode |
| "Invoice number already exists." | KRA's counter is ahead of Odoo, usually after invoices from another solution or a restored database | Check the last receipt number on the portal, then set Next Number on the "eTIMS Customer Invoice Number" sequence to that value plus one |
| Yellow banner asking to check missing product elements | Cost, tax, packaging, origin, product type, insurance flag or UNSPSC missing | Complete the Accounting tab fields; the product registers on the next send |
| Sale rejected, product not in stock | Delivery not validated, or a negative stock location | Validate the delivery first; fix adjustments and let them transmit before the invoice |
| Stock move never reaches KRA | Move not confirmed, product unregistered, or external move waiting for its invoice | Confirm the move, register the product, send the invoice |
| Vendor bill cannot be confirmed | No product on the line, no matching PO line, or quantities differ from receipt | Set the product, link the PO line, align quantities, choose a payment method |
| Credit note rejected | Quantity or price above the original, missing reason, or original never sent | Match the original, set eTIMS Credit Note Reason and Reversal of, send the original first |
| Branch invoice fails or uses the wrong sequence | Branch code not fetched or OSCU not initialized for that branch | Populate branches from KRA and initialize each branch separately |
| Empty OSCU or UNSPSC code lists | Scheduled actions never ran on a new or neutralized test database | Run "KE eTIMS: Fetch KRA standard codes" and "Fetch UNSPSC codes" manually |
| Codes 40, 41, 42 or 90 in the KRA response | SCU not activated, already activated, authentication error, or internet error | Re-check initialization, keys and connectivity; these are KRA-side codes from the OSCU specification |
The same pattern shows up outside Odoo. Zoho's eTIMS troubleshooting guide lists "Invoice number already exists" and item-before-transaction errors at the top, confirming these are KRA rules, not Odoo bugs.
Keep the JSON in the chatter. Every bill, customs import and BOM sent to eTIMS stores its request and response file there, and KRA support will ask for it.
How do branches, multi-company and KRA sequences work?
KRA treats every place of supply as a branch with its own ID, its own OSCU initialization and its own invoice sequence, and Odoo models this with branch companies under one parent. Three shops mean three initializations.
The parent company carries eTIMS Branch Code 00. Outlets are created as branches of that parent and receive their IDs from KRA. Once the parent's OSCU is initialized, open the Branches tab and click Populate from KRA.
Sequences change too. Normally a parent and two branches share one series, so the group's third invoice is INV/2024/00003. Under eTIMS each branch restarts at 00001, because KRA needs independent numbering per branch. Tell your auditors before period close.
Contacts carry a branch code on the Accounting tab as well, defaulting to OO. Set it for customers with several KRA branches. For the wider structure, see our guide to Odoo multi-company setup and intercompany rules.
Which Kenyan industries feel eTIMS most in Odoo?
Distributors, retailers and manufacturers carry the heaviest eTIMS load because stock, POS receipts and bills of materials all report to KRA, while service firms mostly deal with invoices and credit notes. The table shows where the effort goes.
| Industry | Pain or cost driver | Odoo approach | How iVentureTeam helps |
|---|---|---|---|
| FMCG and distribution | Thousands of SKUs, daily stock moves, many branches | Product registration, automatic stock reporting, branch sequences | Bulk UNSPSC mapping, branch rollout plan |
| Retail and POS | Every receipt needs a KRA signature at till speed | l10n_ke_edi_oscu_pos signs POS orders | POS session testing, offline risk review |
| Manufacturing | BOMs and component consumption must be declared | l10n_ke_edi_oscu_mrp sends BOMs; stock moves follow | BOM cleanup, registration of components |
| Importers and traders | Customs imports arrive from KRA and need matching | Customs Imports queue with Match and Approve | PO discipline, landed cost alignment |
| Healthcare providers | Insurance details must be filed with eTIMS | Send Insurance Details from eTIMS settings | Insurer code setup, claims reporting |
| Professional services | Credit notes, retainers, multi-currency clients | Standard invoicing flow with eTIMS Details tab | Billing rules, credit note policy |
Retailers should read our Odoo POS implementation guide alongside this one. A till that loses connectivity cannot sign receipts through an OSCU, so the rollout plan needs a documented fallback.
How iVentureTeam helps with Odoo eTIMS integration in Kenya

iVentureTeam configures, registers, tests and supports Odoo eTIMS for Kenyan companies, and builds the custom pieces where the native module stops. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.
- Scoping and version check: confirm your Odoo version, edition and hosting support the native OSCU, or price a third-party or VSCU route honestly. A quick number comes from our Odoo project estimate tool.
- Registration and initialization: we prepare the commitment form, serial numbers and token request, and run Test mode until a full sale, bill, credit note and stock cycle passes.
- Master data: bulk UNSPSC, packaging, origin and tax code mapping across your product catalog, with validation rules so nothing unregistered reaches an invoice.
- Custom work: branch-aware reports, POS fallbacks, insurance filing and integrations with M-Pesa or your bank through our Odoo integration services.
- Run and support: monitoring of the daily KRA fetch jobs, sequence checks at month end and version upgrades under our Odoo ERP support plans.
Odoo in Kenya case study: Kongowea Village
Before eTIMS existed, iVentureTeam was already delivering Odoo Enterprise projects for Kenyan organizations, which is the experience we bring to compliance work today. Kongowea Village is a community initiative in Kenya.
The initiative had no digital presence and no structured way to hear from residents. Investors, partners and advertisers needed a credible place to learn about it, and most of the audience would arrive on mobile phones.
We delivered the whole footprint on Odoo 12 Enterprise in five weeks: seven custom-designed pages, from Homepage to Advertise, plus an integrated survey with a predefined questionnaire, all in one backend.
The site is live at kongoweavillage.co.ke, survey responses arrive structured instead of scattered across email and paper, and the backend is ready for eCommerce, CRM or events. It was a website project, not an eTIMS one, but it shows how we deliver in Kenya.
Read the Kongowea Village Odoo website and survey case study.
The bottom line on Odoo eTIMS in Kenya
If you run Odoo Enterprise 17 or later, use the native OSCU: register, initialize in Test, fix your product master and stock, then switch to Production. Choose a VSCU or a third-party module only when offline bulk invoicing or Odoo Community forces the issue.
The errors that stop Kenyan go-lives are predictable: unregistered products, unvalidated stock, drifting sequences and credit notes that break KRA's rules. Fix them in a test database and the live cutover becomes routine.
Ready to get your Odoo invoices signed by KRA?

Tell us your Odoo version, number of branches and SKU count, and we will map the eTIMS work in one business day. Request an Odoo eTIMS readiness review, call +91-90235-15208, or email business@iventureteam.com.
Frequently Asked Questions
Is Odoo eTIMS compliant in Kenya?
+
Yes. Odoo Enterprise 17 and later includes the Kenya eTIMS EDI Integration module, an OSCU that validates, signs and transmits invoices to KRA. Odoo KE LTD is named as the third-party integrator on the service request.
What is the difference between OSCU and VSCU?
+
An OSCU is hosted at KRA and signs each invoice online, so it suits cloud ERPs. A VSCU is installed on your own server, signs locally and syncs in batches, so it suits bulk billers and sites with poor connectivity.
Does Odoo Community support KRA eTIMS?
+
Not natively. Community includes the Kenyan chart of accounts, taxes and the older Tremol TIMS module, but the OSCU module is Enterprise only. Community users need a third-party connector from the Odoo Apps Store.
Which Odoo versions support eTIMS?
+
Odoo 17.0 and later, including Odoo 18, 19 and 20 Enterprise. The KRA commitment form asks for the Odoo version, 17.0 or onwards, so databases on Odoo 16 or earlier must upgrade before onboarding.
Why does Odoo report that the eTIMS invoice number already exists?
+
KRA's receipt counter is ahead of Odoo, usually because invoices were issued from another eTIMS solution or a database was restored. Check the last receipt number on the portal and set the eTIMS Customer Invoice Number sequence to the next value.
Why was my eTIMS invoice rejected for a product not in stock?
+
KRA does not accept a sale when the product has no stock. Follow Odoo's advised flow: confirm the sales order, validate the delivery, confirm the invoice, then send it to eTIMS. Register the product and fix stock adjustments first.
Do stock movements have to be reported to eTIMS?
+
Yes. Odoo sends internal transfers and stock adjustments automatically, and sends external moves after the related invoice. Every product on the move must be registered and the move must be confirmed.
How do credit notes work with eTIMS in Odoo?
+
Open the eTIMS Details tab, select an eTIMS Credit Note Reason and the original invoice in Reversal of, then send. KRA rejects credit notes with quantities or prices above the original invoice.
How long does Odoo eTIMS setup take?
+
Registration, initialization, token and a test cycle usually take two to five working days of elapsed time, most of it waiting for KRA approval. Product registration for large catalogs adds the most effort.
Do I need a separate OSCU for each branch?
+
Yes. KRA treats each place of supply as a branch with its own ID and invoice sequence, and the OSCU must be initialized separately for each branch in Odoo.
Free integration feasibility review
Connecting your other systems to Odoo?
Tell us what needs to sync between your systems and Odoo. We recommend a connector, API or custom approach and plan how failures are handled.
Free, with no obligation. A senior consultant replies within 12 business hours.
Free Odoo tools
All tools- Odoo Health CheckVersion, modules, findings and upgrade cost
- Odoo App SelectorWhich apps you need, by industry
- Odoo Project EstimateIndicative cost and timeline in minutes
- Odoo Implementation Cost CalculatorImplementation cost and timeline, in minutes
- Odoo Migration Cost CalculatorVersion jump or legacy ERP, priced in minutes
Continue reading
Odoo France E-Invoicing 2026: PA Status, Setup and How to Prepare
Odoo France e-invoicing 2026: Odoo's approved platform status, mandate dates, the l10n_fr_pdp setup, e-reporting, versions and a checklist to prepare.
ZATCA Wave 25 in Odoo: Scope Test, Version Check and Plan to Feb 2027
ZATCA Wave 25 covers VAT revenue above SAR 187,500 with Fatoora integration due 1 Feb 2027. Scope test, Odoo version check, data fixes and a dated plan.
Odoo Saudi Bank Integration: Statement Sync, Reconciliation, SADAD
Odoo Saudi bank integration explained: bank sync coverage, CAMT and Excel statement import, SAR auto-reconciliation, ISO 20022, WPS and SADAD in Odoo 19/20.
