How SMART talks to Business Central
SMART doesn’t write directly to Business Central. Outbound work is queued in TransmissionMaster plus one of 14 child Transmission* tables. The BC Integration Worker drains those queues every 5 minutes.
This is the gold-standard pattern for outbound integration: decouple → queue → retry.
At a glance
- 15
TransmissionMaster.TransTypecodes and 14 child payload tables are handled today (see list below). - Queue state lives on
TransmissionMaster.Status(FK toTransmissionStatus.TransmissionStatusID):NNew →CCompleted (orEError). - The BC Integration Worker (.NET 9) polls every 5 minutes, processes
TransmissionMasterrows withStatus = 'N', and updates the master row when done. - When something is missing from BC, first place to look is
TransmissionMaster(join to the child table for thatTransType) withStatus IN ('N','E'). - A historical-sync cutoff
BCLedgerSyncStartDate(2025-12-31) keeps pre-migration data out of the local ledger.
The pieces
Section titled “The pieces”┌────────────┐ ┌──────────────────────────────┐ ┌────────────────────┐│ SMART │──►│ TransmissionMaster + 14 │──►│ BC Worker (.NET 9) │──► Microsoft Business Central│ (the apps) │ │ child Transmission* tables │ │ every 5 minutes │└────────────┘ │ TransmissionMaster.Status = N │ └────────────────────┘ └──────────────────────────────┘ ▲ │ │ status updates / errors │ └──────────────────────────────┘The transmission status code
Section titled “The transmission status code”Every outbound message has a TransmissionMaster row; its Status column uses the same codes as the TransmissionStatus lookup table (TransmissionStatusID). The two you’ll see most often are N (waiting) and C (completed). Child tables (TransmissionPOApprove, TransmissionLot, etc.) hang off TransmissionMasterSysID and do not carry their own status column.
All 7 transmission status codes
| Code | Name | Meaning |
|---|---|---|
| N | New | Just created — waiting for the BC worker to pick it up. |
| C | Completed | Successfully posted to BC. Done. |
| H | Hold | Manually held by an admin (rare). |
| E | Error | Posting failed. See TransmissionError / TransmissionMasterErrorLog. |
| X | Error is Acceptable | Reviewed and waved through. |
| R | Resent New Transmission | Replaced by a newer transmission row. |
| q | BC – Not Needed | Old/legacy. The BC environment doesn’t require this transmission type. |
Transmission queues in use
Section titled “Transmission queues in use”These are the only Transmission* tables the BC Integration Worker reads or writes today (Worker.cs on main). Other Transmission* tables may still exist in SmithDouglasCommunities from legacy flows; they are not in scope for this integration unless added to the worker.
See BC Integration Worker for send/receive mapping, BC API endpoints, and column-level detail.
| Child table | TransType | Direction |
|---|---|---|
TransmissionCommunity | comm | SMART → BC |
TransmissionLot | lot | SMART → BC |
TransmissionDivision | divi | SMART → BC |
TransmissionVendor | vend | SMART → BC |
TransmissionVendorType | vetp | SMART → BC |
TransmissionVendorAddress | vadr | SMART → BC |
TransmissionTerm | term | SMART → BC |
TransmissionPOApprove | poap, soap | SMART → BC |
TransmissionContractPostClosing | cpcl | SMART → BC |
TransmissionInvoiceSubmission | inv1 | SMART → BC |
TransmissionEstimate | esti | SMART → BC |
TransmissionLotActivityGroup | acgr | SMART → BC |
TransmissionLotStatus | lsts | SMART → BC |
TransmissionPaymentStatus | pays | BC → SMART |
Every row also has a TransmissionMaster parent (queue control: Status, TransType, Mode, ReturnMessage, …).
TransType codes handled by the worker
| ID | Name |
|---|---|
acgr | Lot - Activity Groups |
comm | Community |
cpcl | Contract Post Closing |
divi | Division |
esti | Process Estimate |
inv1 | Invoice Approval |
lot | Lot |
lsts | Lot Status |
pays | Payment Status |
poap | PO Approved |
soap | Service Order Complete |
term | Terms |
vadr | Vendor Address |
vend | Vendor |
vetp | Vendor Type |
The historical-sync cutoff
Section titled “The historical-sync cutoff”The BC worker has a configuration flag BCLedgerSyncStartDate (currently 2025‑12‑31). Anything dated on or before that date is treated as historical and not pulled into the local ledger tables — this prevents flooding from the migration era.
Where this lives
Section titled “Where this lives”- Worker code:
BCIntegration/BCIntegration.Worker/Worker.cs. - Queue tables:
TransmissionMasterplus the 14 child tables listed above inSmithDouglasCommunities. - Configuration:
BCIntegration.Worker/appsettings.json— connection string, BC tenant/company GUIDs,Sync:BCLedgersOnlyandSync:RunOnceswitches. - Operator controls: pause/resume via the worker console (
Ctrl+Shift+Pto pause, space to resume).