Malaysia’s e-invoicing mandate isn’t optional. The government’s MyInvois system requires businesses to submit structured electronic invoices for every transaction, and the enforcement timeline has been tightening steadily. For businesses running Odoo’s Point of Sale in the Malaysian market, the question wasn’t whether e-invoicing would be necessary — it was how painful the integration would be.
A new module answers that question. The Malaysia – E-invoicing (POS)module plugs directly into Odoo’s Point of Sale application and handles three distinct workflows: individual e-invoices issued during a POS session, consolidated e-invoices that batch multiple transactions into a single report, and refund notes for returned or cancelled orders. Each workflow connects to the MyInvois platform, and the invoices are validated against government requirements before submission.
Individual E-Invoices: Right at the Register
The simplest workflow handles the case where a customer needs an e-invoice for a specific POS transaction immediately. During the session, the cashier can issue an individual e-invoice tied to that order. The catch is that the customer’s details need to be on file before this works — specifically, a Tax Identification Number (TIN) and an Identification Number. Without these, the MyInvois system will reject the submission.
This requirement changes the POS workflow slightly. For walk-in customers who want an e-invoice, the cashier needs to either look up the customer in Odoo’s contact database or create a new contact record with the required tax identifiers before completing the transaction. It adds a step, but it’s the step the government requires — MyInvois doesn’t accept anonymous invoices for individual submissions.
Consolidated E-Invoices: Batching the Rest
Not every POS transaction needs an individual e-invoice. Most retail customers don’t ask for one, and processing individual e-invoices for every coffee or convenience store purchase would grind the checkout line to a halt. That’s where consolidated e-invoicing comes in.
At the end of a period — daily, weekly, or whatever cadence makes sense for the business — a manager navigates to Point of Sale → Orders → Consolidated Invoice. They set a date range, and the system aggregates all POS orders that weren’t individually invoiced during that period into a single consolidated invoice. This consolidated invoice is issued to a pre-configured “General Public” contact, since the individual buyers don’t have tax identifiers on file.
One detail matters: open POS sessions are excluded from consolidated invoices. If a cashier is still ringing up sales, those transactions won’t appear in the batch until the session is closed. This prevents partial-day reporting and ensures the consolidated invoice represents a complete set of transactions for the specified period. Multiple consolidated invoices can be submitted in a single batch, which simplifies end-of-month reporting.
Refunds and the Invoice-First Requirement
Refunds in an e-invoicing environment are more complicated than pressing a “Return” button. When a customer returns a product that was part of an e-invoiced transaction, the refund needs to be processed as an e-invoiced Refund Note — a separate document type in the MyInvois system that references the original invoice.
The prerequisite is important: an invoice must be created for the original transaction before a return can be processed. You can’t refund what was never invoiced. For individually invoiced transactions, the refund note references the individual invoice. For transactions that were part of a consolidated invoice, the refund workflow is different — the refund note references the consolidated batch rather than a specific line item. Both scenarios are handled within the POS interface, but the underlying data structure differs.
QR Code Validation and Asynchronous Processing
MyInvois validates invoices asynchronously. When an e-invoice is submitted, the system doesn’t return a validated QR code instantly. The validation happens on MyInvois’s side, and the updated invoice — complete with the government-issued QR code — becomes available later. Users can reopen the invoice after submission to retrieve the validated version with the QR code.
This asynchronous model means the POS session isn’t blocked waiting for validation. The cashier submits the e-invoice, continues serving customers, and the validated version with the QR code propagates when MyInvois finishes processing. For high-volume retail environments, this non-blocking approach is essential — waiting for government server round-trips at the register would be untenable.
The Compliance Timeline This Addresses
Malaysia has been rolling out e-invoicing in phases, with larger businesses required to comply first and smaller businesses following on a staggered schedule. The module’s arrival in Odoo means that businesses in the current compliance wave don’t need to bolt on a third-party e-invoicing solution alongside their POS. The integration lives inside the same application where transactions are recorded, which means the data doesn’t need to be exported, transformed, or synchronized with an external platform.
For multi-location retailers running several POS terminals on a single Odoo instance, the module scales naturally. Each terminal can issue individual e-invoices during sessions, and consolidated invoices can be generated per location or across the entire operation. The “General Public” contact used for consolidated invoices is shared across all locations, so the configuration is set once and works everywhere.
A Quiet but Necessary Feature
Government e-invoicing mandates rarely make headlines in the software world. They’re not exciting. They don’t add revenue or unlock new workflows. But failing to comply means fines, and complying through manual processes means hours of data entry that could have been automated. The Malaysia POS e-invoicing module is exactly the kind of feature that doesn’t get applause on release day but prevents real pain on audit day. For any business running Odoo POS in Malaysia, it’s now just a module install away.