LHDN’s MyInvois system is moving from “interesting tax modernisation” to “things your business has to do or it gets fined.” If you run an F&B outlet, retail shop, or any business that issues invoices at the counter, your POS has to play along. Here’s the no-fluff checklist of what your point-of-sale software actually needs to do — and what the common shortcuts look like when they fail an audit.
What MyInvois actually is
MyInvois is LHDN’s centralised platform for receiving structured electronic invoices in near-real-time. Instead of printing a paper invoice and filing it for the auditor, your POS submits a structured XML/JSON record to LHDN’s API. LHDN validates it, stamps it with a Unique Identifier Number (UIN), and returns it. The customer gets a regular receipt, plus a QR code that links to the validated record.
It is not optional for businesses above the revenue thresholds in the rollout schedule.
The POS checklist
Your POS must:
- Capture full buyer and seller details — name, TIN, SST registration number (where applicable), business registration number, address. Not just “Walk-in customer”.
- Generate a structured invoice payload per LHDN’s UBL 2.1 schema (the JSON variant is fine). Hand-rolling this is error-prone — use a library.
- Sign the payload with your taxpayer digital certificate before submission.
- Submit to the MyInvois API — typically the production endpoint at
api.myinvois.hasil.gov.my. Sandbox is atpreprod-api.myinvois.hasil.gov.my. - Handle the UIN response — you need to store it, embed it in the receipt’s QR code, and surface it on any reprint.
- Queue and retry on failure — the API has outages. Your POS cannot block a sale because LHDN is slow. Submit asynchronously, retry, and reconcile.
- Support consolidation for B2C — small B2C sales can be consolidated into a single daily/monthly invoice rather than one-per-receipt. Your POS needs to know which mode each customer is in.
- Cancel and replace correctly — if you void a sale, you must also issue a credit note via the same API. You can’t just delete it.
- Archive every payload, response and certificate — for the statutory retention period.
The common shortcuts (and why they fail)
- “My POS prints the QR code, that’s all we need.” Wrong. The QR code has to encode the validated UIN that LHDN returned — not just an internal invoice number.
- “We submit at end-of-day in a batch.” This used to be acceptable; it isn’t always now. Real-time submission for B2B is the rule; only narrow B2C scenarios allow consolidation.
- “We use the manual web form.” Fine for a kopitiam doing five invoices a day. Not fine for a busy retailer.
- “We bought a Singapore POS — it’ll work fine here.” It won’t. MyInvois is Malaysia-specific; you need the local module.
- “We disabled it because the API was down.” That’s not a compliance position — that’s a future fine.
What to actually ask your POS vendor
When you’re evaluating any POS — including ours — make them answer these on the record:
- Are you a registered LHDN PEPPOL / Service Provider, or do you bypass them?
- Is real-time submission included in my plan or charged per invoice?
- How do you handle the API being down — do my sales block?
- Show me a sample receipt with the validated UIN QR code printed.
- How do credit notes and cancellations get sent?
- How do you handle consolidated B2C invoices?
- What does my migration / onboarding look like — do you load my taxpayer cert for me?
If they can’t answer any of these confidently, they probably haven’t done a real implementation yet.
How we handle it
Our POS & Retail system submits to MyInvois in real time on every sale, queues offline and retries automatically, and embeds the validated UIN in the receipt QR code. We onboard your taxpayer certificate, configure the schema, and run a parallel period against your existing system before we go live.
If you’re already running our POS — you’re already compliant. If you’re not, and you have to be by your rollout date, talk to us and we’ll tell you honestly whether you should switch or just bolt MyInvois onto what you’ve got.