Submitting to LHDN MyInvois
Your goal: take a draft invoice through to a validated e-Invoice with IRBM proof. This page covers the one-time preconditions, the pre-submit completeness check, what happens while LHDN validates, and how to read the resulting statuses.
For the full end-to-end happy path, see Getting Started: Your First e-Invoice. This page focuses on the submission step and what governs its outcome.
Before your first submission
Two things must be true for the Submit to LHDN button to work, and they are one-time setup:
- The issuing company has a TIN. The company is the seller on every e-Invoice. Its TIN (
companies.tin) is theonbehalfoftaxpayer identifier sent to MyInvois. Set it on the company form — you can save a company without a TIN, but you cannot submit until it is present. See Managing Companies, Customers & Suppliers. - Your company has appointed the platform operator as its MyInvois intermediary. This is done on the LHDN MyInvois portal, not inside Bilvx. There is no appointment screen or table in the app to manage. LHDN enforces the appointment server-side and rejects documents submitted on behalf of a taxpayer that has not appointed the intermediary.
Bilvx signs as an appointed intermediary: the signing certificate is the operator's own and serves all taxpayers, so its identity is independent of your company's TIN. A difference between the certificate's TIN and your company TIN is not a rejection cause in intermediary mode.
If the button isn't there
The Submit to LHDN button renders only when all of these hold:
- Your session role is Company Admin (
CUSTOMER_ADMIN). - The invoice status is DRAFT.
- LHDN submission is configured on the deployment (the signing keystore is present).
- The issuing company has a TIN.
If submission is not configured on this deployment at all, /submit returns 503 "LHDN submission is not configured on this deployment." — that is an operator setup task, covered in Deploying & Operating Bilvx and the Configuration Reference, not something an admin fixes in the portal.
Submitting
- Open the invoice (it must be a DRAFT) and press Submit to LHDN.
- A confirmation page shows exactly what will be sent.
- If anything LHDN requires is missing, the page lists every gap under "Complete these details before submitting to LHDN:" — for example a missing supplier address line, a buyer TIN, or an MSIC code — each with a link to the exact form that fixes it.
- Fix each item, return to the invoice, and submit again.
The completeness check runs against LHDN's requirements, not just Bilvx's own required fields. You do not have to get every LHDN field right when first creating a company or customer — this checklist is where the remaining gaps surface, with links to fix them. Field-level rules (including how local-vs-foreign parties change what LHDN needs) are covered in Managing Companies, Customers & Suppliers.
After submitting: asynchronous validation
Submission is asynchronous. Once accepted, the invoice moves to SUBMITTED and Bilvx polls LHDN until the document resolves. You do not need to refresh manually:
- A poll fires shortly after a successful submit, so LHDN's async result usually lands within seconds rather than on the next full cycle.
- The invoice listing live-refreshes a pending status badge on its own, so the final status appears without reloading the page.
If the submission attempt itself fails — a network error or an LHDN outage — the invoice stays in DRAFT with the error shown. Nothing is half-sent; you can simply submit again once the cause clears.
Statuses and rejections
| Status | Meaning |
|---|---|
| DRAFT | Editable and deletable. Not sent anywhere yet. A failed submission attempt leaves the invoice here with the error shown. |
| SUBMITTING | An in-flight claim state that closes the concurrent duplicate-submit window; you normally see it only briefly. |
| SUBMITTED | Sent to LHDN, awaiting validation. Bilvx polls for you. |
| VALID | LHDN validated the document. The PDF now carries the validation proof. |
| INVALID | LHDN's validation failed. The invoice shows LHDN's reason. Use Re-open for Editing to return it to DRAFT, fix the cause, and submit again. |
| REJECTED | The document was rejected on the LHDN side (a buyer can request rejection through MyInvois). The reason shows on the invoice. |
| CANCELLED | The document was cancelled on the MyInvois side, within LHDN's cancellation window. Cancellation happens on LHDN's portal, not inside Bilvx; Bilvx picks the new status up automatically. |
Only INVALID invoices can be re-opened. VALID, REJECTED and CANCELLED are final records.
The full draft → submitted → valid lifecycle and the validated PDF (with its QR code, IRBM unique ID and validation timestamp) are covered in Creating & Managing Invoices.
Next steps
- Print the validated PDF and verify its IRBM proof — see Creating & Managing Invoices.
- Recurring questions about LHDN behaviour are answered in the FAQ.
- Submission refusals and TIN-mismatch rejections are diagnosed in Troubleshooting.