Scenario: React to Lattice business events
Goal. Have an external system told when something happens in Finance and Operations (a journal posted, a sales order confirmed, a production order ended, a requisition approved) instead of polling for it. You find the Lattice event that matches the business moment, activate it against an endpoint your system listens to, and process the JSON payload it receives.
When to use. Any downstream system that must react to a change: a data warehouse refresh, a customer notification, a CRM sync, a reconciliation. Lattice publishes 81 events across 16 categories. They are standard Finance and Operations business events, so they route to any supported endpoint (Azure Service Bus, Event Grid, an HTTPS webhook, Power Automate and the other types your environment offers) and behave like Microsoft's own events. To pull the current state on demand instead, see Track documents and read data.
Prerequisites
-
Security.
- Creating endpoints and activating events happens in the standard Business events workspace and needs standard Finance and Operations security, not a Lattice role.
- The Lattice Business event catalog page is granted by
MGCLatticeBusinessEventCatalogViewinMGCLatticeIntegrationServiceMonitoringDuty(all three Lattice roles). - The resend actions and the Batch job event filters page need the integration administrator role
(
MGCLatticeBatchMaintenanceDuty,MGCLatticeSetupDuty).
See Security model.
-
An endpoint target your system reads (a Service Bus queue or topic, an Event Grid topic, an HTTPS webhook, ...) and the connection details the endpoint type asks for.
-
A current catalog. After a deployment that adds or changes events, run Refresh catalog on the Lattice Business event catalog page (or schedule it at System administration > Periodic tasks > Lattice business events > Refresh catalog).
-
Background processes for the few events that need one. Workflow stalled or failed comes from the Lattice workflow stalled or failed alerts background process (hourly), Sales price agreement effective and Sales price agreement expired from Lattice sales price effectivity events (daily), and Integration item parked for retryable failures only once Lattice dead-letter retry has used up its attempts. They run by themselves (System administration > Setup > Process automations, Background processes). The sales price process covers every legal entity where the events are active, with its own position in each, so there is nothing to schedule per legal entity and no event is sent twice. Every other event needs nothing but activation.
-
No license check. Business events are never blocked by the Lattice license.
Steps
-
Find the event and its payload. Go to System administration > Inquiries > Lattice business events > Business event catalog, type part of the name in the quick filter and select the row. The Payload fields tab lists every JSON field the subscriber receives; Download sample payload (in the Payload group) saves
<event>_sample.jsonwith a representative value for each field. The same information, with the trigger and an example, is on the event's page in the business event reference. For this walkthrough: General journal posted (MGCLatticeGeneralJournalPostedBusinessEvent). -
Create the endpoint. Go to System administration > Setup > Business events > Business events catalog (the standard workspace), open Endpoints, click New, choose the endpoint type, enter its connection details and save.
-
Activate the event for each legal entity. On the Business event catalog tab of the same workspace, find the event by name or category (General ledger), select it, click Activate, and choose the endpoint and the legal entity, for example USMF. Activation is per legal entity: an event raised in a legal entity where it is not active is not sent. Download schema on the same tab exports the payload schema for the consuming team.
-
Make the business moment happen. An event fires from the Finance and Operations process itself, whether a user, a batch job or a Lattice service call drives it. For this event, post a general (Daily) journal, for example with
postGeneralJournaland a newRequestId(Post a journal exactly-once). The event is sent after the posting commits, once per posted journal. A preview posts nothing and a repeatedRequestIdreplays without posting, so neither raises an event. -
Process the payload. Each delivery carries the platform envelope, the Lattice envelope and the event's own fields:
{"BusinessEventId": "MGCLatticeGeneralJournalPostedBusinessEvent","BusinessEventLegalEntity": "USMF","EventId": "8D2918AA-B434-46AA-B329-64F297E41D82","EventTime": "\/Date(1790248837000)\/","EventTimeIso8601": "2026-09-24T11:20:37.7928745Z","eventSequence": 48251,"correlationId": "Event:a83e8ab7-2b2c-47cc-afad-f50fae94246a","schemaVersion": 1,"legalEntity": "usmf","journalId": "25746","journalName": "GenJrn","description": "Monthly accruals - September 2026","postedDate": "\/Date(1790208000000)\/","crossReferences": [ { "externalSystem": "LEGACYERP", "externalKey": "GJ-2026-0918" } ]}Build the consumer to these rules (business event reference):
- Company fields in the Lattice part are lower case (
usmf);BusinessEventLegalEntitycan be upper case. - Dates are
\/Date(milliseconds)\/; enums come as an integer member plus a...Namemember with the symbol; flags aretrueorfalse; amounts without a currency member are in the accounting currency. - Use
eventSequenceto order the events of one record (one journal, one order), not to re-sequence the whole stream: values are allocated when the event is raised, gaps are normal, and two transactions can commit out of order. correlationIdgroups the events of one run (BatchTask:<id>for one batch task,Event:<guid>for a single event).- Ignore members you do not know; a changed shape gets a higher
schemaVersion. crossReferenceslists the keys external systems hold for the record, so your system can find its own record without a lookup (Use external keys). It is[]when there are none.
- Company fields in the Lattice part are lower case (
-
Seed a new subscriber (optional). Three resend actions under System administration > Periodic tasks > Lattice business events (publish all customer, item and external item business events) send the Customer created, Released product created and External item changed events again for every existing record in the current legal entity. Run the one you need in each legal entity after you activate the event; it sends nothing where the event is not active.
-
Quiet the noisy ones (optional). Batch job status changed fires for every batch job whose status is changed through the job record. Exclude jobs on System administration > Setup > Lattice business events > Batch job event filters: a job that matches an enabled row raises no event.
How to verify
- Your endpoint receives the payload, and its
BusinessEventId,legalEntityand business fields match the document (for the example,journalIdis theDocumentIdthe posting returned). - The standard workspace's Active business events tab lists the event with its endpoint and legal entity.
- The call that caused it is in the service call log (
LatticeServiceCallLogs) withSuccessYes. - For the Retail assortment published event, which records every publish, the Business event log (System administration > Inquiries > Lattice business events) shows each send.
When it goes wrong
| What you see | Cause and fix |
|---|---|
| Nothing arrives | The event is not active in the legal entity where the document was posted (activate it there); the endpoint is misconfigured (check it in the standard workspace); or nothing was posted (a preview, a replayed RequestId, a failed call). |
| Nothing arrives for some paths only | Some events cover specific paths: Batch job status changed skips the batch server's own start and finish transitions and filtered jobs, MRP run completed skips Planning Optimization, DMF execution completed mostly misses imports run without batch, the bank reconciliation events cover the classic and the advanced reconciliation separately. Each event's page states its trigger and limits, and the business event reference lists the trigger of every event. |
| A Lattice event is missing from the standard catalog after a deployment | Rebuild the standard catalog (Manage > Rebuild business event catalog in the standard workspace), then run Refresh catalog on the Lattice page. |
| Two events for one action | By design for some pairs: invoicing a return order raises Sales order invoice posted and Return credit note posted; closing picking work raises Warehouse work completed and Warehouse picking completed. Subscribe to one, or de-duplicate on the business key (for example the invoice number). |
| The same event twice | Make the consumer idempotent. A re-published event carries a new EventId, so de-duplicate on the business key and eventSequence, not on EventId. |
| Events arrive out of order | Order the events of one record by eventSequence. |
| Retail assortment published failed to send | The failed publish is an Error row in the Business event log. The Lattice business event reconciliation background process re-publishes it at its next hourly run once the row is 15 minutes old, with the original payload, eventSequence and correlationId; Business event reconciliation sweep (System administration > Periodic tasks > Lattice business events) runs the same sweep now. |
| A very high volume | Inventory on-hand changed, Item back in stock and Workflow lifecycle action can fire many times a minute; size the endpoint and consumer for it, or leave them inactive. |
Reference
- Business event reference: every event, the process hook that raises it, its payload and an example.
- Business events: the catalog, activation, batch job event filters, coverage and the reconciliation sweep.
- Cross-reference keys: the
crossReferencesmember and the events that carry it. - Security model: the Lattice business event privileges.
- Trial and day-one guide: activating a first event in a trial.