Vendor updated
Fires when an existing vendor master record is modified and saved in Dynamics 365 Finance and Operations. This captures the business moment where vendor master data changes, for example a vendor group or default currency update, so downstream systems can keep their vendor records in sync.
| Event class | MGCLatticeVendorUpdatedBusinessEvent |
| Contract class | MGCLatticeVendorUpdatedBusinessEventContract |
| Category | Accounts payable |
| Module | ModuleAxapta::Vendor |
| Label IDs | VendorUpdatedBusinessEventName / VendorUpdatedBusinessEventDescription |
| Trigger | VendTable.update(boolean, boolean) -> after every vendor record update |
Trigger / Hook
- Extension class:
MGCLatticeVendTable_Table_Extension,[ExtensionOf(tableStr(VendTable))] - CoC method signature:
void update(boolean _updateSmmBusRelTable, boolean _updateParty) - Firing condition: after
next update(_updateSmmBusRelTable, _updateParty)completes, the event sends whenever it is enabled. There is noorig()field-change guard or type filter: every successfulVendTableupdate fires the event, from any source (the Vendors page, data entities and integrations, or X++ logic), even when no value in the payload changed. The payload carries the vendor's current values only, not which fields changed; compare with your own copy if you need the delta. - A save that changes Vendor hold also raises Vendor hold status changed. That event is sent from inside
update(), so it arrives first (lowereventSequence) and this event follows. - Updates that bypass the table's
update()method (doUpdate(), or set-based updates with data methods skipped) do not raise it. - Timing: the event is sent inside the vendor update transaction.
send()writes it to the business events commit log in that transaction and it is delivered after commit, so an update that rolls back never delivers the event. - Enablement gate:
BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeVendorUpdatedBusinessEvent))
void update(boolean _updateSmmBusRelTable, boolean _updateParty)
{
next update(_updateSmmBusRelTable, _updateParty);
if (BusinessEventsConfigurationReader::isBusinessEventEnabled(classStr(MGCLatticeVendorUpdatedBusinessEvent)))
{
MGCLatticeVendorUpdatedBusinessEvent::newFromVendTable(this).send();
}
}
Payload Contract
One row per [DataMember], in declaration order (sourced from MGCLatticeVendorUpdatedBusinessEventContract.initialize(VendTable)):
| JSON field | Display label | Type / EDT | Source | Notes |
|---|---|---|---|---|
legalEntity | Legal Entity | DataAreaId | _vendTable.DataAreaId | Company ID of the vendor record, in lower case (for example usmf) |
vendorAccount | Vendor Account | VendAccount | _vendTable.AccountNum | Vendor account number |
vendorName | Vendor Name | str | _vendTable.name() | Display method on VendTable resolving the party name |
vendorGroup | Vendor Group | VendGroupId | _vendTable.VendGroup | Vendor group identifier |
currencyCode | Currency Code | CurrencyCode | _vendTable.Currency | Vendor default currency |
crossReferences | Cross references | List of MGCLatticeCrossReferenceEventContract | MGCLatticeCrossReferenceEventHelper::listFor(VendTable) | Keys external systems hold for the vendor: one { externalSystem, externalKey } object per external system, ordered by external system, historical keys included; [] when it has none. See Cross-reference keys. |
Every Lattice event also carries the Lattice ordering and correlation envelope, inherited from MGCLatticeBusinessEventContractBase: eventSequence (Int64 - increasing across the whole catalog and all companies, allocated when the event is raised; it orders the events of one record, gaps are normal and permanent, see the README), correlationId (String - always Scope:Key; groups emissions that belong to one logical run and defaults to Event: plus a GUID unique to this emission) and schemaVersion (Int - the payload shape version; 1 for this contract). D365 F&O also adds its standard envelope fields to every business event payload: BusinessEventId, BusinessEventLegalEntity, ContextRecordSubject, ControlNumber, EventId, EventTime, EventTimeIso8601, InitiatingUserAADObjectId, MajorVersion, MinorVersion, and ParentContextRecordSubjects. Do not rely on the order of members in the delivered JSON.
This event does not join a run: correlationId is unique to each emission.
Example Payload
{
"BusinessEventId": "MGCLatticeVendorUpdatedBusinessEvent",
"ControlNumber": 587341,
"EventId": "9F3C2A1B-6D44-4F8E-BF17-2A91C0E4D8B2",
"EventTime": "\/Date(1790250483000)\/",
"EventTimeIso8601": "2026-09-24T11:48:03.2252238Z",
"MajorVersion": 0,
"MinorVersion": 0,
"BusinessEventLegalEntity": "USMF",
"ContextRecordSubject": "",
"InitiatingUserAADObjectId": "{1CB156FF-80A3-C7E1-1CF5-33E3BABEB4F0}",
"ParentContextRecordSubjects": [],
"eventSequence": 48403,
"correlationId": "Event:6c1f9e3a-5b27-4d80-a94e-0f3b8d2c7e16",
"schemaVersion": 1,
"legalEntity": "usmf",
"vendorAccount": "US-104",
"vendorName": "Fabrikam Supplier",
"vendorGroup": "10",
"currencyCode": "USD",
"crossReferences": [
{
"externalSystem": "LEGACYERP",
"externalKey": "V-20417"
}
]
}
Activation
In the D365FO client, go to System administration > Setup > Business events > Business events catalog. Find the event by name ("Vendor updated") or by filtering the Category column to Accounts payable. Select it and choose Activate, then bind it to your target endpoint (for example an Azure Service Bus queue, Event Grid topic, or HTTPS webhook).
Related Events
- Vendor created - sibling event fired from the same
MGCLatticeVendTable_Table_ExtensiononVendTable.insert() - Vendor hold status changed