On this page
A business system is records, actions, states and ownership
Five things describe almost any business system. Actors are the people and services that do something. Applications create and hold records. Records are what the business actually argues about: a customer, an order, a stock movement, an invoice. States show where a record has reached, such as quoted, confirmed, dispatched or paid. Ownership names the one place a fact is authoritative when two systems disagree. Integrations are the wiring that carries information between applications, and evidence is what proves any of it happened.
That is a planning model, not a description of how any particular product behaves. It earns its keep by making the expensive questions visible early: which record is the master, which state change is allowed to whom, and what will actually be inspected when two systems disagree next quarter. The four questions below follow from it, and deeper implementation topics sit beneath each one rather than inside this page.
What every business system is made of
Editorial framework. Software choices get easier once the records, their states and their owners are written down.
Basis: IBM: What is ERP?. Reviewed .
Read the graphic as text
A record
- Actions. What people are allowed to do to it
- States. Where it is in its lifecycle
- Owner. Who is accountable for it being right
- Evidence. What proves a change actually happened
Map applications, records, states and evidence before choosing software
Before comparing products, write the workflow out with the same fields every time. For each step, record the actor, the application, the record created or changed, the identifier that record carries, the state it moves into, the owner of that record, the trigger that starts the step, the destination the information travels to, and the evidence that would prove the step ran.
The identifier matters more than it looks. One business event often creates or updates records in several applications at once, and a shared reference carried on every copy is the only reliable way to follow it afterwards. Evidence means identifiers, state history, timestamps, exception notes and reconciliation observations: things somebody can go and look at, rather than an assurance that the integration is fine. Note that the cross-application flow you sketch is a proposal about how your business should work, not a behaviour every product provides.
Two related jobs stay outside this exercise. Detailed entity modelling, where every field and relationship is designed, is separate work. So is the organisation-specific decision about who owns which record, which needs the people who will live with the answer in the room.
The e-Invoice mandate is already fully live
Published statistic. Every phase has passed. If a system issues invoices, e-Invoice is not an upcoming project, it is a current obligation with a turnover threshold attached.
Source: Inland Revenue Board of Malaysia: e-Invoice implementation timeline. Reviewed .
Read the graphic as text
- Above RM100 million. Mandatory since 1 August 2024
- RM25 million to RM100 million. Mandatory since 1 January 2025
- RM5 million to RM25 million. Mandatory since 1 July 2025
- Up to RM5 million. Mandatory since 1 January 2026
- Under RM3 million. Exempt, unless the company belongs to a larger group
How do CRM, ERP and accounting systems differ?
Separate the categories by the work they coordinate and the records they own, not by the vendor's name for them. IBM describes enterprise resource planning as "a business management software system that is designed to manage and streamline an organization's functions, processes and workflows with automation and integration", built from modules that "are all connected and share one common database", and places accounting as "just one module in a long list of other features that ERP technology can provide". Odoo's CRM documentation describes CRM work as organising sales activity: tracking leads, closing opportunities, keeping a pipeline and producing forecasts, alongside tasks such as merging similar leads and opportunities.
| Category | Work it coordinates | Records it usually owns | The ownership question it raises |
|---|---|---|---|
| CRM | Winning work: contacts, conversations, pipeline and forecast | Lead, opportunity, activity, contact | When the same customer exists twice, which record is authoritative? |
| ERP | Running work across functions on a shared database of modules | Order, stock movement, purchase, production, often finance too | Which module may change the order once it is confirmed? |
| Accounting | Recording money: invoices, payments, ledgers and reporting | Invoice, payment, journal entry, tax record | Is the invoice raised here, or raised elsewhere and only recorded here? |
In practice the boundary is drawn by your own process. A business that quotes, reserves stock and invoices in one place has a different map from one where three teams each work in their own tool, and both are legitimate. The useful next decision is not which product is best in general, but whether one system should cover the whole flow or whether a specific gap needs building around what already works.
Who the Malaysian economy actually is
Published statistic. Nearly half the country works in a small business. Software priced and shaped for a multinational is not software for this market.
Source: Department of Statistics Malaysia: MSME Performance 2025. Reviewed .
Also: DOSM: Economic Census 2023, profile of MSMEs.
Read the graphic as text
- Of national GDP: 39.7%. RM689.8 billion of value added by micro, small and medium enterprises in 2025, growing faster than the economy as a whole
- Of all employment: 48.7%. 8.09 million people work in one
- Establishments: 1.07m. Counted in the 2023 Economic Census, three quarters of them micro-sized
What an API does, and how a webhook differs
IBM describes an API as "a set of rules or protocols that enables software applications to communicate with each other to exchange data, features and functionality", working as a request and a response: one system asks, the other answers, according to a specification that fixes the data types, commands and syntax both sides agree on. That is a pull, and somebody has to decide when to ask.
A webhook is the push, and the provider-specific detail is where the real design lives. Stripe documents registering an HTTPS endpoint so that it "pushes real-time data to it when events happen", sending each event as a JSON payload. Its guidance is worth reading closely because the same concerns recur with any provider: every event is signed, so the receiver verifies the signature before acting on it; endpoints "might occasionally receive the same event more than once", so the advice is to log the event identifiers already processed and skip repeats; delivery order is not guaranteed, so a handler must not assume events arrive in the order they were created; failed deliveries are retried with an exponential backoff; and the endpoint "must quickly return a successful status code (2xx) before any complex logic that could cause a timeout", doing the real work on an asynchronous queue.
File transfer behaves differently again. Odoo documents importing a spreadsheet in which an External ID decides whether a row updates an existing record or creates a new one, which is what makes it possible to "import the same file several times without creating duplicates", and it warns that imports "are permanent and cannot be undone". That is one product's import, not a definition of every scheduled transfer. Before choosing between the three mechanisms, settle five things: what triggers the exchange, which direction it runs, how fresh the data has to be, what happens when it fails, and who reconciles the two sides afterwards.
Asking versus being told
Primary-source guidance. A webhook that is never acknowledged is a missed event, so delivery has to be confirmed rather than assumed.
Source: Stripe: Webhooks. Reviewed .
Read the graphic as text
- API call. Your system asks, and waits for the answer
- Webhook. The other system tells you when something happened
- Why both. Polling is predictable, events are timely, most builds use each where it fits
How permissions and workflow states interact
Identity, permission and state answer three different questions, and a system that merges them either blocks the wrong people or lets the wrong change through. Authentication asks who this is. Authorisation asks what this role may do. State asks whether the record has reached a stage where that action still makes sense. Somebody can be correctly signed in, hold the right role, and still be wrong to amend an order that has already shipped.
Odoo's documentation shows one product's way of splitting this, and the shape is common. Access rights control broad create, read, write and delete permissions at the model level, while record rules act as an additional layer restricting access to specific records by condition, and user types run from administrator through internal user to portal and public. The same documentation carries a blunt caution that changing access rights "can have a detrimental impact on the database", including leaving nobody able to change them back. State-gated behaviour appears elsewhere in the same product: reservation methods decide when stock is committed to a delivery, whether at confirmation, manually, or a set number of days before the scheduled date.
The handoff to a deeper permission design is short. For each role, write the resources it may touch, the state transitions it may perform, and the path by which its access is removed when somebody leaves. Those three lines are what a detailed access model is built from, and writing them costs an afternoon.
Diagnosing duplicate records and integration failures
The wholesale business below is invented for teaching. A salesperson agrees an order, a warehouse clerk reserves and dispatches it, and a finance operator records the payment. Every role, policy and system response is an assumption, and the final column lists evidence to collect, never a result already obtained.
| Workflow step | Assumed actor | Proposed system response | Exception | Acceptance evidence to collect |
|---|---|---|---|---|
| Agree an order | Salesperson | Record the customer and the approved order in the system chosen as authoritative | Conflicting customer records need a deduplication decision | Record identifiers on both sides, plus the note stating which system is authoritative and how the two are mapped |
| Reserve and dispatch | Warehouse clerk | Record the reservation and the shipment separately against the order | A physical stock disagreement needs a count and a decision | Stock movement and shipment references, and the reconciliation observation against the counted figure |
| Record payment | Finance operator | Match the payment to the correct invoice and order | A partial or unmatched payment needs review | Ledger identifiers, the matched invoice reference, and the note resolving the exception |
When something goes wrong, a proposed sequence beats intuition. Establish the business event and its date. Collect the identifier that event carries in each application. Identify which system owns each record. Compare the states and the timestamps side by side. Inspect the delivery or transformation evidence, which for an event-based integration means the event identifier and its delivery status, and for a file-based one means the imported file and its identifier column. Classify the exception: a duplicate, a missed delivery, a rejected payload, a transformation error or a human entry mistake. Then define the reconciliation test that will prove the fix, and run it.
Duplicates deserve their own note, because the same symptom has several causes with different fixes. Odoo documents merging similar leads and opportunities as a normal CRM task, which addresses duplicates people created by hand. A repeated webhook delivery is a different problem, solved by recording event identifiers rather than by merging anything. A re-run import without a stable identifier is a third. Treating all three as one deduplication job is why the same duplicates come back next month.
The cheque is finishing
Published statistic. Under one cheque per person per year, and falling by a fifth annually. Any process that still assumes a cheque in the post is quietly adding a week to getting paid.
Source: Bank Negara Malaysia: Annual Report 2025 and Payment Statistics T1. Reviewed .
Read the graphic as text
- 2020: 1.84.
- 2021: 1.48.
- 2022: 1.41.
- 2023: 1.22.
- 2024: 1.17.
- 2025: 0.92. 31.4m total
Chart scale: Cheques issued per Malaysian, per year.
What to do next
- Take one business event that crosses more than one application and write it out step by step, with the actor, record, identifier, state, owner and evidence at each step.
- Mark the single authoritative system for each record in that flow. Where two systems both claim one, that disagreement is the work.
- For each connection, state the trigger, the direction, how quickly the data has to arrive, what happens on failure, and who reconciles the two sides.
- Write the acceptance evidence before any product shortlist exists, so demonstrations are judged against your workflow rather than the vendor's.
Where to go next
- Custom software development →
Where building a system around a mapped workflow is covered as a piece of work.
- CRM and integrations →
The connection layer between a CRM and the applications around it.
- Admin dashboards →
The staff-side view where records, states and permissions meet in one screen.
Sources and further reading
- IBM: What is enterprise resource planning (ERP)? — read 19 September 2026
- IBM: What is an API? — read 19 September 2026
- Stripe documentation: Receive Stripe events in your webhook endpoint — read 19 September 2026
- Odoo 19 documentation: CRM — read 19 September 2026
- Odoo 19 documentation: Export and import data — read 19 September 2026
- Odoo 19 documentation: Access rights — read 19 September 2026
- Odoo 19 documentation: Reservation methods — read 19 September 2026

