Skip to content

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.TransType codes and 14 child payload tables are handled today (see list below).
  • Queue state lives on TransmissionMaster.Status (FK to TransmissionStatus.TransmissionStatusID): N New → C Completed (or E Error).
  • The BC Integration Worker (.NET 9) polls every 5 minutes, processes TransmissionMaster rows with Status = '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 that TransType) with Status IN ('N','E').
  • A historical-sync cutoff BCLedgerSyncStartDate (2025-12-31) keeps pre-migration data out of the local ledger.
┌────────────┐ ┌──────────────────────────────┐ ┌────────────────────┐
│ SMART │──►│ TransmissionMaster + 14 │──►│ BC Worker (.NET 9) │──► Microsoft Business Central
│ (the apps) │ │ child Transmission* tables │ │ every 5 minutes │
└────────────┘ │ TransmissionMaster.Status = N │ └────────────────────┘
└──────────────────────────────┘
▲ │
│ status updates / errors │
└──────────────────────────────┘

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
CodeNameMeaning
NNewJust created — waiting for the BC worker to pick it up.
CCompletedSuccessfully posted to BC. Done.
HHoldManually held by an admin (rare).
EErrorPosting failed. See TransmissionError / TransmissionMasterErrorLog.
XError is AcceptableReviewed and waved through.
RResent New TransmissionReplaced by a newer transmission row.
qBC – Not NeededOld/legacy. The BC environment doesn’t require this transmission type.

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 tableTransTypeDirection
TransmissionCommunitycommSMART → BC
TransmissionLotlotSMART → BC
TransmissionDivisiondiviSMART → BC
TransmissionVendorvendSMART → BC
TransmissionVendorTypevetpSMART → BC
TransmissionVendorAddressvadrSMART → BC
TransmissionTermtermSMART → BC
TransmissionPOApprovepoap, soapSMART → BC
TransmissionContractPostClosingcpclSMART → BC
TransmissionInvoiceSubmissioninv1SMART → BC
TransmissionEstimateestiSMART → BC
TransmissionLotActivityGroupacgrSMART → BC
TransmissionLotStatuslstsSMART → BC
TransmissionPaymentStatuspaysBC → SMART

Every row also has a TransmissionMaster parent (queue control: Status, TransType, Mode, ReturnMessage, …).

TransType codes handled by the worker
IDName
acgrLot - Activity Groups
commCommunity
cpclContract Post Closing
diviDivision
estiProcess Estimate
inv1Invoice Approval
lotLot
lstsLot Status
paysPayment Status
poapPO Approved
soapService Order Complete
termTerms
vadrVendor Address
vendVendor
vetpVendor Type

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.

  • Worker code: BCIntegration/BCIntegration.Worker/Worker.cs.
  • Queue tables: TransmissionMaster plus the 14 child tables listed above in SmithDouglasCommunities.
  • Configuration: BCIntegration.Worker/appsettings.json — connection string, BC tenant/company GUIDs, Sync:BCLedgersOnly and Sync:RunOnce switches.
  • Operator controls: pause/resume via the worker console (Ctrl+Shift+P to pause, space to resume).