A plant usually knows its output per line to the piece and its cost per job to the nearest guess. Quotes then get priced off last year's figure plus a feeling about materials, and the jobs that lose money are found in the audited accounts eleven months after they ran.
A manufacturing ERP here means a system where the work order is the spine: material, labour and machine time post against a job as it runs, delivery orders come off that job, invoices reconcile to the delivery orders, and every posting keeps who changed it and when.
The floor measures in output. Pieces per shift, per line, per section, scrap rate, downtime. Those numbers are usually good, because someone's job depends on them and they are checked daily. The office measures in ringgit: purchases, payroll, sales, a gross margin at the end of the year. Both books are accurate. Neither can tell you the cost of the job that ran on line two last Thursday, because nothing connects a shift's output to the material issued and the hours worked on it.
That gap shows up first in quoting. A price is built from last year's cost plus a margin plus a feeling about where materials have gone. When a customer pushes back, there is no defensible floor to hold, so the concession is made on instinct. A job that runs at a loss looks exactly like one that does not until the year-end accounts arrive, and by then it has been repeated four times.
The second place it shows is between the delivery order and the invoice. Goods leave on a DO signed at the gate. The invoice is raised later from a sales order, a quotation or someone's notes. Most of the time these agree. When they do not — a partial delivery, a short shipment, a weight variance, a rejected batch returned — the reconciliation is manual, and the customer's accounts payable department will find the discrepancy before you do. A DO the customer signed and an invoice that does not match it is the most common reason a manufacturer's payment sits unpaid past terms.
The third is the audit trail, and it is the one that turns from an inconvenience into a problem the first time a customer audits you. Spreadsheets have no history. A cost that was changed, a batch record that was corrected, a delivery quantity that was amended — none of them leave a trace of who or when. For a plant supplying regulated or certified buyers, an unanswerable question about a historical record costs more than the record was ever worth.
Manufacturing ERPs are usually generic ledgers with a factory vocabulary painted on. The structure below is the other way round: the production hierarchy is real, and the ledger posts into it.
Line by line, with whoever fills in the production sheets. We are looking for the numbers the floor already records accurately, because those become the system's inputs. Asking operators for data they do not currently capture is how a rollout dies in month two.
Plant, line and section, then chart of accounts, tax codes and document numbering. Both before any screen exists, because every module posts into them and retrofitting a hierarchy under a running system is the expensive kind of rework.
Work orders with material, labour and machine time posting against them. This module goes live and gets used before anything else starts, because it is the one that changes what you quote.
DOs raised against jobs, invoices built from delivered DOs, every line carrying the DO number. Partial and short deliveries handled as states rather than as manual corrections.
SST-02 and MyInvois wired to your registration, with item-level classification codes and buyer TINs captured at entry. Credit and debit notes reference the original validated document, because weight and reject variances make them routine here.
Existing job history, customers and item master imported, then checked against the source rather than by row count. Matching counts with different contents is a real failure mode and we test for it specifically.
Separate sessions for the floor, the store and the office, using this month's actual work orders. In the language the team uses on the floor, which is often not the language of the documentation.
Classification codes are the first trap, and they are quietly expensive. LHDN expects a classification on what is being sold, and a manufacturer sells many things — a moulded part, a service charge, a tooling amortisation line, scrap sold back. Systems that set the code once on the customer record produce documents that validate and are wrong, because the code belongs on the item, not on the buyer. Fixing that after a year of submissions is a data cleanup nobody budgets for.
The second is the delivery order relationship. Your buyer's accounts payable reconciles a validated e-invoice against delivery orders it holds signed copies of. If the invoice line does not carry the DO number, the document validates with LHDN and then sits in the buyer's queue while two organisations work out what it covers. This is not a compliance failure; it is a cash-flow one, and it is entirely avoidable at the document design stage.
The third is variance. Manufacturing produces credit and debit notes as a matter of routine — a weight variance on a bulk shipment, a rejected batch, a price adjustment agreed after delivery. Under MyInvois each of those has to reference the original validated document rather than being a fresh invoice with a minus sign, and a system that cannot express that link will produce a set of records LHDN and your customer read differently.
The fourth is what you buy rather than what you sell. A manufacturer importing raw material or paying a foreign consultant is dealing with a supplier who will never issue a Malaysian e-invoice, and LHDN's self-billed mechanism covers defined situations of that kind. Whether your imports and foreign services fall inside them is a question for your tax agent. What we can say is that the system has to be able to issue a self-billed document at all, and most systems bought for the sales side cannot.
Published tiers, seen from a plant. Scoped by module count and by how many roles have to be separated. Hosted on your own Supabase and Vercel accounts, so infrastructure is billed to you at cost rather than marked up per seat.
One domain done properly: work orders, material issue, labour posting and cost per job, with roles, audit trail and import of the history you have now.
Enterprise tier. Operations, delivery orders, invoicing and accounting on one ledger, with SST-02 and MyInvois, data migration and per-role training. The floor, not the ceiling.
Where the accounting package stays. Read what it already holds, add the item classification and buyer fields LHDN requires, submit, and write the validation result back.