Skip to content
Back to Insights
Business CentralBusiness CentralAPI Integration

Integrating Business Central Cloud With Third-Party Applications: REST APIs, Logic Apps and Enterprise Integration Patterns

Business Central can exchange data with almost anything. The harder question is how to design the integration so it stays secure, duplicate-safe, traceable and recoverable when something fails. A practical architecture guide for REST APIs, custom AL APIs, Azure Logic Apps and Service Bus.

Econix Infotech 18 min readAugust 20, 2026
Business Central Integration Architecture — Integrating Business Central Cloud With Third-Party Applications: REST APIs, Logic Apps and Enterprise Integration Patterns
Econix InfotechBusiness Central Integration Architecture

Modern ERP rarely operates alone.

A Dynamics 365 Business Central environment may need to exchange data with an e-commerce platform, CRM, warehouse management system, payroll provider, expense solution, banking platform, EDI network, field-service application, product-information system, data platform or a custom industry application.

The technical challenge is usually not whether Business Central can exchange the data. It can, and Microsoft has invested heavily in making that straightforward.

The more important question is different.

How should the integration be designed so that it stays secure, traceable, duplicate-safe, supportable and resilient when something fails?

A point-to-point REST call is fine in a proof of concept. A production integration needs considerably more thought: API selection, authentication, inbound and outbound flows, synchronous versus asynchronous processing, schema validation, mapping and transformation, duplicate detection, sequencing, retries, dead-letter handling, reconciliation, monitoring, throttling, master-data ownership, conflict resolution, environment management and a support model.

This guide covers an enterprise approach to integrating Business Central Cloud with third-party solutions using REST APIs, Azure Logic Apps and the surrounding Azure integration services.


Start With the Architecture, Not the API Call

One of the most common integration mistakes is opening with the question "what endpoint should we call?"

The first question should be "what integration pattern is appropriate for this business process?"

A production architecture often looks like this.

Figure 1 — Reference architecture
Third-party systems
  • E-commerce

    Orders, customers, inventory

  • CRM

    Accounts, contacts, opportunities

  • WMS

    Picks, shipments, exceptions

  • EDI, banking, payroll

    Batch and file-based flows

Azure integration layer
  • API Management

    Auth, policies, rate limits, routing

  • Logic Apps

    Validate, map, orchestrate

  • Service Bus

    Queues, topics, dead-letter

  • Azure Functions

    Complex transformation logic

Business Central
  • Standard REST API v2.0

    Customers, items, sales documents

  • Custom AL API pages

    Purpose-built integration contracts

  • API queries

    Read-only joined datasets

  • Webhook subscriptions

    Change notifications outbound

Cross-cutting services

Microsoft Entra ID

OAuth 2.0 client credentials

Azure Key Vault

Secrets and certificates

Application Insights

Monitoring and correlation

Integration ledger

Durable transaction record

Exception paths

Error queue and dead-letter

Reference architecture for integrating third-party systems with Dynamics 365 Business Central: external platforms reach Business Central through Azure API Management, Azure Logic Apps and — where reliability matters more than an immediate response — Azure Service Bus, with Microsoft Entra ID, Azure Key Vault, Application Insights, an integration ledger and dead-letter handling as cross-cutting services.

The architecture does not need every component for every interface. A low-volume customer synchronization may need nothing more than a Logic App and a standard API. A high-volume EDI or e-commerce interface may justify API Management, Service Bus, Functions, detailed telemetry and a dedicated integration ledger.

The point is to select components deliberately, based on transaction volume, latency requirements, recoverability, security and who will support the interface at 7am on a Monday.

Architecture should follow the business risk

A successful integration is not the one with the fewest Azure components. It is the one that is simple enough for the requirement, but complete enough to survive real operational failures.


How Business Central Exposes and Consumes Data

Business Central offers several integration surfaces. The right one depends on what the interface has to do.

Standard REST APIs (API v2.0)

Use the standard APIs wherever they already meet the requirement. They cover customers, vendors, items, sales and purchase documents, journals, dimensions and a wide set of other business entities, and they are enabled by default for Business Central online.

The common endpoint for an environment follows this shape:

HTTP
https://api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/companies({companyId})/{entitySet}

Microsoft also documents a direct-tenant form that includes the user domain name before the environment name, which some tenants need. Either way, the environment name is part of the URI — one more reason environment configuration must never be hard-coded into integration logic.

Custom AL API pages

Reach for a custom API when the standard set genuinely does not fit:

  • the entity you need is not exposed
  • custom fields have to travel with the record
  • the third party should get a stable, purpose-built contract rather than being coupled to standard Business Central structures
  • the interface needs its own validation behaviour

This last point matters more than it first appears. Microsoft's documentation is explicit that extending the standard APIs with additional fields is not currently possible — if you need extra fields, you copy the AL and publish your own API page. That makes "standard API plus a couple of custom fields" a design that does not exist; it is a custom API.

A custom API page is an AL page with PageType = API and a small set of routing properties.

PropertyPurpose
APIPublisherFirst segment of your custom API route
APIGroupSecond segment, used to group related entities
APIVersionVersion segment, so the contract can evolve safely
EntityName / EntitySetNameSingular and plural names of the exposed entity
ODataKeyFieldsThe OData key — Microsoft recommends a single GUID field, normally SystemId
DelayedInsertEnsures field values are validated before the record is inserted

Those properties produce a route of this form:

HTTP
https://api.businesscentral.dynamics.com/v2.0/{environment}/api/{publisher}/{group}/{version}/companies({companyId})/{entitySet}

Do not skip the SystemId key

Microsoft recommends specifying a single GUID field in ODataKeyFields. Composite or non-GUID keys are supported, but they break some external integrations — including Power Automate and Power Apps — and they also disqualify the API from webhook support.

API queries

An API query object generates a read-only endpoint that can join data across tables. It is a good fit for reporting-style extracts and lookups. It cannot be used to write data, and it is not webhook-enabled, so it is not a substitute for an API page on a read/write interface.

OData and SOAP web services

OData remains available and still has a place, particularly for older integrations. For new system-to-system work, API pages should be the default: Microsoft's own telemetry guidance recommends them over exposing UI pages as OData or SOAP endpoints, because API pages avoid the compute spent on UI elements the integration never uses. SOAP is on a deprecation path and should not be chosen for anything new.

The Business Central connector

The Business Central connector is available to Azure Logic Apps as a standard-class connector, and to Power Automate, Power Apps and Copilot Studio as a premium connector. It provides triggers for when a record is created, modified, deleted or changed, and actions to get, find, create, update and delete records, plus running a Business Central action.

Two published constraints are worth designing around: the connector is throttled at 300 API calls per connection per 60 seconds, and any single record it handles must be under 8 MB.

Azure Functions

Functions are useful for transformations that become unwieldy in a Logic App: complex mapping, reusable integration libraries, specialized validation, cryptographic work or format conversion such as EDI and fixed-width files.

Azure Service Bus

Service Bus matters when reliability is more important than an immediate synchronous answer — e-commerce order ingestion, EDI, warehouse transactions and high-volume journal imports. It gives you durable buffering, controlled consumption, and a dead-letter queue you can actually operate.


Standard API or Custom API?

Before writing AL, confirm the standard API does not already meet the requirement.

Use a standard API whenUse a custom AL API when
The entity is already exposedThe business entity is custom
The exposed fields are sufficientCustom fields must travel with the record
Standard Business Central behaviour is what you wantSpecific validation or defaulting is required
No special integration contract is neededThe third party needs a stable, domain-specific contract
The interface is short-lived or low-riskThe interface must be versioned independently of the base app

Do not build custom AL merely because custom development is possible.

Every custom API becomes something that has to be governed, tested, versioned, documented and maintained across upgrades. That cost is worth paying when the contract genuinely needs to be yours — and pure overhead when it does not.


Inbound Integration: Third Party Into Business Central

Inbound integration means another application sends data into Business Central: Shopify orders, CRM customers, WMS shipment confirmations, payroll journals, employee expenses, banking transactions, EDI orders, product-information updates.

The Logic App should never simply accept a payload and forward it to Business Central.

Figure 2 — Inbound flow
  1. 1

    Receive

    API Management endpoint

  2. 2

    Authenticate

    Microsoft Entra application token

  3. 3

    Validate schema

    Shape, data types, mandatory fields

    On failure → managed error queue
  4. 4

    Validate references

    Customer, item, currency, company

    On failure → managed error queue
  5. 5

    Duplicate check

    Integration key lookup

    On failure → managed error queue
  6. 6

    Transform

    Map to the Business Central contract

    On failure → managed error queue
  7. 7

    Post to Business Central

    Standard REST API or custom AL API

  8. 8

    Log and reconcile

    Integration ledger entry written

Inbound integration flow from a third-party application into Business Central. Every validation stage has an explicit exception path — shown in red — to a managed error queue rather than a silent failure, and the transaction is only treated as complete once the green ledger entry is written.

Before Business Central receives the transaction, validate:

  • mandatory fields and data types
  • currency codes and exchange-rate assumptions
  • customer and vendor identifiers
  • item references and units of measure
  • company mapping, where the tenant has more than one company
  • dates, including timezone handling
  • duplicate transaction identifiers
  • source-specific business rules

Each of those checks needs a defined exception path. "The Logic App failed" is not an exception path; a message on a reviewable error queue, with the payload, the reason and the source record id attached, is.


Outbound Integration: Business Central Into Third Party

Outbound flows push data the other way: customer updates to CRM, item data to e-commerce, shipment confirmation to a marketplace, invoice data to a customer portal, inventory levels to a warehouse.

The webhook-driven pattern

Business Central supports webhook subscriptions on supported entities. A subscriber registers a notificationUrl and a resource path, and completes a validation-token handshake before the subscription becomes active.

HTTP
POST https://{businessCentralPrefix}/api/v2.0/subscriptions
Content-Type: application/json

{
  "notificationUrl": "https://{yourEndpoint}",
  "resource": "/api/v2.0/companies({companyId})/customers",
  "clientState": "opaque-shared-secret"
}

Four documented behaviours shape the design.

Notifications are signals, not payloads. A notification carries the subscription id, the resource path, the change type and a last-modified timestamp — not the record. The integration reads the current version of the record from the resource path it was given. That is a feature: it means you always act on current state rather than a stale snapshot.

Subscriptions expire after three days. Renewal is a PATCH, and it requires the same validation-token handshake as creation. Renewal has to be part of the running solution, monitored like anything else.

High-volume changes collapse into a collection notification. Business Central waits a short delay after the first change to an entity before notifying. If more than 1,000 records change inside that window, a single collection notification is sent with a filter on the resource instead of one notification per record — so the subscriber must be able to handle a filtered set, not just single records.

A badly behaved endpoint loses its subscription. If Business Central cannot reach the subscriber, it retries over the next 36 hours — but only when the subscriber responds with 408, 429 or a 5xx status. Any other response code stops the retries and the subscription is deleted. An endpoint that answers 500 while it is unhealthy keeps its subscription; one that answers 200 and quietly drops the message does not get retries at all.

Figure 3 — Outbound webhook flow

Record changes in Business Central

Customer, item or document is created or updated

Webhook notification is sent

Subscription id, resource path, change type

Logic App receives the signal

The notification is a pointer, not the record itself

Read the current record

GET the resource named in the notification

Transform to the target contract

Map fields, codes and units of measure

Send to the third-party API

With a correlation id and a retry policy

Completeness pass. A scheduled reconciliation query runs alongside the webhook path and picks up anything a missed, delayed or collection-style notification did not deliver.

Failure path. An unreachable subscriber is retried only on 408, 429 and 5xx responses; any other status stops the retries and the subscription is deleted.

Outbound flow driven by a Business Central webhook subscription. The notification signals that something changed and carries the resource path and change type, so the integration reads the current version of the record before transforming and sending it on. Subscriptions expire after three days and must be renewed using the same validation-token handshake that created them.

Scheduled incremental synchronization

The second outbound pattern is a scheduled job that queries changed records and moves them on. It is slower than a webhook and much easier to reason about during recovery, which is why mature architectures usually run both: webhooks for latency, a periodic reconciliation pass for completeness.


Webhooks or Polling?

Neither is universally better.

Webhooks work well when
  • Changes need to move quickly
  • Repeated polling would create pointless traffic
  • The receiving endpoint is genuinely highly available
  • Subscription renewal and recovery are designed, not assumed
  • The entity is webhook-supported
Polling works well when
  • A few minutes of latency is acceptable
  • Operational recovery should stay simple
  • The source exposes a reliable modified timestamp
  • Missed records should be picked up naturally on the next pass
  • The endpoint is an API query or otherwise not webhook-enabled

Webhook support has real boundaries. Business Central does not send notifications for API queries, for pages over temporary or system tables, or for pages with composite keys — and there is a documented ceiling on the number of webhook subscriptions per environment. Check that the entity you are designing around is actually supported before the pattern becomes an assumption.


Synchronous or Asynchronous?

Figure 4 — Synchronous vs asynchronous
Synchronous
Source system
API call
Business Central
Response returned to the source
Dependency risk — the source is only as available as Business Central.
  • The caller waits for the result
  • Suits lookups, validations and small interactive writes
  • Source availability becomes coupled to Business Central
  • Throttling or a slow post surfaces as a user-facing failure
Asynchronous
Source system
Queue accepts and acknowledges
Controlled consumer
Business Central
Resilience — an interruption is absorbed by the queue, not by the caller.
  • The caller is released as soon as the message is accepted
  • Suits orders, EDI, warehouse events and large journals
  • A Business Central interruption is absorbed by the queue
  • Throughput is capped deliberately rather than by failure
Synchronous and asynchronous integration compared. The blue path returns an immediate answer at the cost of coupling; the purple path decouples the source from Business Central availability and lets consumers control the rate at which transactions are applied.

Synchronous integration is the right answer for lookups, validations and small interactive transactions where the user is waiting for an answer. The trade-off is coupling: if Business Central is slow or throttled, the source system is slow or failing too.

Asynchronous integration is usually better for high-volume orders, EDI, warehouse events, large journals and anything non-interactive. The source hands the transaction to a queue, gets an acknowledgement immediately, and downstream processing continues at a controlled rate.


Design a Canonical Data Flow

Third-party applications and Business Central rarely use the same names for the same concepts.

Source fieldBusiness Central target
customerIdCustomer number
orderIdExternal document number
orderDateOrder date
currencyCurrency code
skuItem number
qtyQuantity
priceUnit price

A source payload might arrive looking like this:

JSON
{
  "orderId": "WEB-10382",
  "customerId": "CUST-1001",
  "currency": "CAD",
  "lines": [
    { "sku": "ITEM-100", "qty": 4, "price": 29.95 }
  ]
}

And leave the mapping layer as something Business Central understands:

JSON
{
  "customerNumber": "CUST-1001",
  "externalDocumentNumber": "WEB-10382",
  "currencyCode": "CAD"
}

For every field, the design should state the source, the target, the data type, whether it is required, the transformation, the default, the validation, the source of truth and the failure behaviour.

Make the mapping a formal specification

The field-level mapping document is part of solution design, not a developer's scratch file.

AttributeExample: order identifierExample: province code
Source fieldorderIdprovince
Business Central targetExternal document numberState / province
RequiredYesConditional
TransformationPrefix with the source system where numbers can collideMap the external code to the Business Central code
ValidationMust be unique within the source systemA mapping entry must exist
Duplicate ruleSource system + orderIdNot applicable
Failure behaviourReject the transactionHold for correction

That table becomes the shared contract between business analysts, Business Central consultants, integration developers, source-system owners, testers and — eventually — whoever supports the interface.


Duplicate Detection and Idempotency

Duplicate prevention is not a refinement. It is the difference between an integration you can retry and one you cannot.

Consider an e-commerce platform sending order WEB-100234. Business Central creates the order. The network times out before the source receives the response. The source retries.

Without idempotency, that is now two sales orders for one customer order — and nobody notices until someone ships twice.

The fix is a deterministic integration key, calculated before any work happens:

Data flow
integrationKey = sourceSystem + ":" + sourceRecordId

Shopify:WEB-100234
CRM:a4f19c02-...
WMS:SHP-8842
Figure 5 — Idempotency decision tree
Duplicate detection and idempotency decision treeReceive transaction, calculate integration key, check whether the key was already processed, then either return the existing result or validate and create the record in Business Central and persist the key.Transaction receivedCalculate integration keysource system + source record idKey alreadyprocessed?YESNOReturn the stored resultno second document is createdValidate, then createpost to the Business Central APIPersist key and resultintegration id and BC document no.Retry re-enters the same check

Scroll sideways to see the full diagram

Duplicate-detection decision tree. Every inbound transaction is reduced to a deterministic integration key before any work happens. The green branch returns the stored result, the blue branch creates the record, and the red dashed path shows a retry re-entering the same decision — which is what makes replay safe.

Useful controls include the source transaction id, the external document number, composite keys where a single identifier is not unique, Business Central system ids, payload hashes for change detection, and a dedicated integration ledger that records the outcome.

Use an integration transaction ledger

For enterprise integrations, keep a durable record of every transaction that crossed the boundary.

FieldWhy it matters
Integration idThe idempotency key; the primary lookup
Source system / source record idTraceability back to the originating document
Direction and entityFiltering and reporting by interface
Business Central record idProof of what was created, and where
Received / processed timestampsLatency measurement and SLA evidence
StatusReceived, Validated, Processing, Processed — plus Duplicate, Failed, Retry Pending, Dead Letter, Reprocessed
Retry countDistinguishes a flaky interface from a broken one
HTTP status, error code, error messageFirst-line triage without opening a debugger
Correlation idTies the source, the Logic App, the queue and Business Central together
Payload hashDetects a resend with changed content

That ledger is what lets an operations team answer, without escalating: did order 100234 reach Business Central, was it processed twice, which document was created, why did it fail, how many times did we retry, and did somebody already replay it?


Classify Failures Before You Retry

A production integration should decide what kind of failure it is looking at before it decides what to do.

Failure classTypical examplesCorrect response
ValidationCustomer not found, invalid item, missing currency, malformed payload (HTTP 400)Do not retry. Route for correction, then replay
Authentication and permissionsInvalid application credentials, insufficient Business Central permissions (401, 403)Do not retry. Fix the security configuration
TransientThrottling (429), service unavailable (503), gateway timeout (504), network timeoutsRetry with backoff
Business Central business rulesInvalid dimensions, document state conflicts, posting failuresLog with full context; usually needs a human decision
ConcurrencyThe record changed between read and write (409, 412)Re-read and re-evaluate, or escalate for review

Retrying a validation failure forever is one of the most common causes of a queue that never drains.


Retry, Backoff and Dead-Letter Handling

Repeated immediate retries make an outage worse rather than better, which is why Microsoft's own guidance for handling HTTP 429 from Business Central is explicit that the client must retry with a cool-off period — regular intervals, incremental intervals, exponential backoff or randomization.

Figure 6 — Retry and dead-letter handling

1Classify the failure

Retryable

Throttling (429), service unavailable (503), gateway timeout (504), transient network errors

Not retryable without a change

Malformed payload (400), authentication or permission failure (401, 403), unknown reference, business-rule rejection

2Retry with increasing backoff

Attempt 1

Immediate

Attempt 2

Short backoff

Attempt 3

Longer backoff

Attempt 4

Final backoff

Retry decision. The integration key never changes between attempts, so a retry that succeeds after an ambiguous timeout still resolves to a single Business Central document.

Retry succeeds. The ledger entry is completed and the message is settled — nothing reaches the dead-letter queue.

3Retry exhausted — dead-letter queue

Operations review

Payload, reason, attempt count, last response

Correct or approve

Fix the mapping, reference or source record

Replay

Same integration key, so replay stays duplicate-safe

Retry and dead-letter architecture. Failures are classified first: transient conditions such as HTTP 429, 503 and 504 go through amber backoff, while validation and permission failures go straight to red review because retrying them cannot succeed. When the retry policy is exhausted the message lands in a dead-letter queue where it can be inspected, corrected and replayed under its original integration key.

If you are orchestrating in Logic Apps, much of this is built in. Logic Apps retry policies fire on 408, 429 and 5xx responses, and the default policy is an exponential-interval policy of up to four retries; you can also select fixed-interval, exponential or no retry, and set the count and interval explicitly. Beyond the individual action, runAfter settings and scopes give you a place to catch a whole block of failures and handle them once.

A well-behaved retry model should:

  • distinguish retryable from non-retryable errors
  • respect the platform's throttling signals — Business Central attaches a retry-after header on 502 and 503 responses, and that header should be honoured rather than ignored
  • preserve the same integration key across every attempt
  • cap the number of attempts
  • expose retry status to operations rather than burying it in logs

When retries are exhausted

The transaction must not disappear. Azure Service Bus dead-letters messages automatically when the maximum delivery count is exceeded (the default is 10) or when the message time-to-live expires, and an application can dead-letter a message explicitly with a reason and description. Dead-lettered messages sit in a sub-queue addressed as /$deadletterqueue, they are never cleaned up automatically, and they can be inspected and resubmitted.

Support teams should be able to see the original source record, the payload, the failure reason, the number of attempts, the last response, the integration id and any related Business Central record — without needing developer access.

A failed status does not mean Business Central did nothing

Manual replay is where duplicates are created. Before reprocessing, the system must establish whether the earlier attempt created nothing, created data partially, or succeeded and then failed before acknowledging success. A replayed transaction should retain its original integration id and source record id so the duplicate check resolves it correctly.


Authentication and Security

For unattended system-to-system integration, use Microsoft Entra application authentication with the OAuth 2.0 client credentials flow. Microsoft's guidance is direct about why: delegated flows can be subject to multifactor authentication, which makes them unsuitable for an unattended integration.

The setup has two halves. In Microsoft Entra ID you register an application, create a client secret or certificate, and grant it the Business Central application permission — API.ReadWrite.All for APIs and web services, Automation.ReadWrite.All for the automation APIs. In Business Central you then register that application's client id on the Microsoft Entra Applications page, enable it, and assign permission sets.

HTTP
POST https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials
&client_id={clientId}
&client_secret={clientSecret}
&scope=https://api.businesscentral.dynamics.com/.default

Security design should include:

  • a dedicated Entra application registration per integration, not one shared identity for everything
  • least-privilege Business Central permission sets — note that Business Central will not allow an application to be assigned SUPER, so least privilege is enforced, not merely recommended
  • separate identities where different interfaces need different privileges
  • secrets and certificates held in Azure Key Vault, never in workflow definitions or source control
  • a credential rotation schedule that someone owns
  • environment separation, so a sandbox credential cannot reach production
  • access auditing

Never hard-code client secrets, access tokens or user credentials. That includes "temporarily", in a sandbox, during a proof of concept.


API Management as a Governance Layer

Where several external systems integrate with Business Central, Azure API Management gives you a single controlled entry point that can centralize authentication, rate limiting, API versioning, policy enforcement, IP and network restrictions, logging and backend abstraction.

The abstraction matters as much as the control. With API Management in front, the third party integrates with your contract rather than with a Business Central URL — so the environment name, the API version and even the choice between a standard and a custom API can change without renegotiating with an external partner.


Define the System of Record

Bidirectional integration becomes dangerous the moment two applications both believe they own the same data.

Figure 7 — Master-data ownership
CRMBusiness CentralWMSE-commerce
Prospect and relationship dataCRM
Marketing segmentationCRM
Web catalogue presentationE-commerce
Web order captureE-commerce
Pick, pack and shipment eventsWMS
Item masterBusiness Central
Inventory of recordBusiness Central
Credit limit and payment termsBusiness Central
Invoices and balancesBusiness Central

Field-level ownership on the customer record

Customer name

CRM

Marketing segment

CRM

Credit limit

Business Central

Payment terms

Business Central

Master-data ownership map. Each data domain has exactly one system of record — CRM in purple, e-commerce in teal, WMS in orange, Business Central in blue — and for composite records such as the customer, ownership is settled field by field. Anything left without a named owner is where bidirectional integrations start overwriting each other.

For composite records, ownership has to be defined at field level. A customer is rarely owned by one system: the relationship data belongs to CRM, while credit limits, payment terms, invoices and balances belong in Business Central. Agreeing that boundary is a business decision, not a technical one — but leaving it unmade is a technical disaster.

Prevent integration loops

Once ownership is settled, the next hazard is circular updates:

Data flow
CRM updates the customer
        |
        v
CRM  ->  Business Central
        |
        v
Business Central update fires a webhook
        |
        v
Business Central  ->  CRM
        |
        v
CRM updates again  ...

Without controls, the same change circulates indefinitely. Useful brakes include a source-system marker on the record, a correlation id carried through the whole chain, a dedicated integration user or application identity whose changes are recognized and suppressed, a change-origin field, a payload or change hash so an update that changes nothing is not propagated, and ownership rules that simply refuse to write fields the other system owns.

Sequence dependent transactions

Some transactions depend on others existing first:

Data flow
Customer  ->  Ship-to address  ->  Sales order header  ->  Sales lines  ->  Shipment / payment

What happens when the order arrives before the customer? Answer it during design, not during hypercare. The realistic options are ordered queues (Service Bus sessions), explicit dependency checks with a hold-and-retry status, or controlled creation of the prerequisite record — each with different implications for master-data quality.


Incremental Synchronization and Watermarks

Downloading every record every few minutes is rarely a good long-term strategy. Where an endpoint exposes a reliable modified timestamp, use an incremental pattern.

Figure 8 — Incremental synchronization
Watermark-based incremental synchronization timelineA timeline from the previous watermark to the new watermark, with the query, paging, processing and reconciliation steps in between.Previous watermarkNew watermarkrecords modified inside this windowRead lastwatermarkQuery changesserver-side filterFollow pagesto the last pageProcessand reconcileadvanceAnything that failed holds the watermark back until it is resolved or explicitly quarantined

Scroll sideways to see the full diagram

Watermark-based incremental synchronization. The job reads the last successful watermark (orange), requests only records modified since that point, follows every page of the result, processes and reconciles them, and only then advances the watermark (green). Advancing it earlier is how records get silently skipped — the red note marks that constraint.

Do not advance the watermark until the intended processing is actually complete.

That single rule prevents the most damaging class of silent integration failure — the one where the job reports success every night and quietly skips whatever failed.


Pagination, Filtering and Throttling

Do not assume one API response contains every record. Business Central paginates results and clients are expected to follow the continuation link until there are no pages left. A client that reads the first page and stops will look like it is working for months.

Filtering and shaping the request is not a micro-optimization either — it is how you stay inside the platform's limits. Microsoft's guidance for reducing API calls is to use webhooks instead of aggressive polling, batch operations where appropriate, apply server-side $filter rather than pulling whole datasets, use $expand to fetch related entities in one request, and use deep inserts to create a document and its lines in a single POST.

The published operational limits are worth designing against explicitly:

LimitDocumented behaviour
Rate limitingHTTP 429 when request limits are exceeded; the client is expected to back off
Concurrency and queueingRequests queue when concurrency is exhausted, and time out with 503 if they wait too long
Maximum page size20,000 entities per OData request; exceeding it returns 413
Batch sizeUp to 100 operations in a single $batch request
Operation timeoutLong-running requests are aborted rather than left running

There is also a scaling technique that is easy to miss: Microsoft notes that operational limits apply per user, that service principals are treated the same as any other user, and that throughput can be increased by distributing work across multiple users or service principals rather than funnelling everything through one identity.


Optimistic Concurrency

An integration should have an answer for what happens when a record changes between the read and the update.

Business Central returns an @odata.etag with entities, and update requests carry an If-Match header. Sending the etag you read means the update fails if the record has moved on; sending If-Match: * means you will overwrite whatever is there. The second form is convenient, and it is exactly how a CRM update silently reverts a credit-limit change a controller made ten seconds earlier.

For important master data, decide deliberately whether a conflict should fail, retry after re-reading, merge, or route to a human. HTTP 409 and 412 responses are the signals that this has happened, and they should be classified as concurrency events rather than lumped in with generic errors.


High Volume Needs Backpressure

A source application can produce transactions faster than Business Central should consume them. This is not a sound pattern:

Data flow
10,000 incoming orders
        |
        v
10,000 simultaneous API calls

A queue turns an uncontrolled burst into a controlled rate:

Data flow
Incoming orders
        |
        v
Service Bus queue          (durable buffer)
        |
        v
Controlled consumers       (bounded concurrency)
        |
        v
Business Central API

Design explicitly for concurrency limits, throttling responses, retry behaviour, queue depth alerting, backpressure to the source where it can accept it, and — the one people forget — catch-up behaviour after downtime. A queue that has absorbed four hours of orders will try to drain them, and it needs to do so without triggering the throttling that caused the outage in the first place.


Monitoring, Correlation and Observability

The integration is not complete when the API returns a success code.

Figure 9 — Operations and reconciliation view
Integration operations
Illustrative

Received

18,452

Processed successfully

18,401

Failed

51

Pending

124

Duplicates prevented

37

Average processing time

1.8s

Dead-letter messages

12

Last successful sync

12:42

Daily reconciliation

Orders raised in the source system10,248
Messages accepted by the integration10,248
Sales orders created in Business Central10,242
Failed and dead-lettered6
Replayed after correction6
Final Business Central orders10,248
Unexplained difference0
Illustrative integration operations view — representative figures, not a product screenshot and not client data. Monitoring answers whether the technical process ran; reconciliation answers whether both systems ended up with the same business result, which is why the two panels are read together.

Operations teams should be able to see transactions received, processed, failed and pending; duplicates prevented; retry and dead-letter counts; average processing time; and the timestamp of the last successful transaction and the last successful synchronization for each interface.

Business Central contributes real telemetry to this picture. When an environment is connected to Azure Application Insights, every incoming web service request emits a trace with the endpoint, HTTP method, HTTP status code, category (API, OData or SOAP), the AL object and extension behind the endpoint, the query filter used, time spent queued, server execution time, SQL statements executed and rows read, and — on failures — a failure reason and diagnostics message.

Two request headers make that telemetry far more useful:

  • setting client-request-id on the call also sets the operation id in Application Insights, which is what lets you correlate a Business Central trace with the Logic App run and the source system event
  • setting User-Agent lets you tell which caller is responsible for which traffic, which becomes essential the moment more than one integration shares an environment

Carry one correlation id across the source system, API Management, the Logic App, Service Bus, Business Central and the target system. Without it, investigating a single failed order means correlating five tools by timestamp.


Reconciliation Is Not Monitoring

Monitoring asks whether the technical process executed. Reconciliation asks whether both systems ended up with the intended business result. They are different questions, and an integration can be comprehensively green while the numbers do not agree.

Data flow
Source orders                     10,248
Messages accepted                 10,248
Business Central orders created   10,242
Failed                                 6
Replayed after correction              6
Final Business Central orders     10,248
Unexplained difference                 0

Run that comparison on a schedule, publish it where finance and operations can see it, and define who is accountable for a non-zero difference. For financially significant interfaces, reconciliation output belongs in the month-end process rather than in a monitoring dashboard nobody opens.


Environments, Testing and Cutover

Environment strategy

A workable lifecycle runs development, Business Central sandbox, integration test, UAT and production — with separate configuration at every stage for the environment name, company id, API base URL, credentials, Service Bus namespace, webhook endpoints, monitoring destination and retry rules.

Environment-specific values are configuration. They are never business logic, and they are never literals inside a workflow definition.

Integration testing

A complete test plan covers far more than the happy path:

  • valid transactions and expected variants
  • missing required fields, invalid references, malformed payloads
  • duplicates, and resend after a timeout
  • invalid credentials and insufficient permissions
  • throttling behaviour under load
  • a Business Central outage, and a third-party outage
  • retry exhaustion, dead-letter creation, and replay
  • duplicate-safe replay specifically
  • sequencing problems
  • volume and load
  • reconciliation accuracy
  • security testing and UAT business scenarios

Cutover

Integration cutover deserves its own runbook: freeze the legacy interface, capture the final delta, process remaining in-flight transactions, reconcile, switch endpoints and credentials, enable the new integration, and run hypercare monitoring with agreed metrics.

Before go-live, four questions need written answers. What happens to in-flight messages? What is the rollback process? Who approves the reconciliation result? Who owns failures during hypercare?


Three Worked Patterns

E-commerce orders into Business Central

Orders arrive at API Management, pass through a Logic App that validates the schema, maps the customer and SKU, checks the currency, creates the integration key and performs the duplicate check, then land on a Service Bus queue. A controlled processor drains that queue into the Business Central sales order API and writes the outcome to the integration ledger.

The benefit is specific: if Business Central is unavailable, the e-commerce platform does not have to stop taking orders. The queue absorbs the interruption and consumers resume when the environment is back.

WMS and Business Central

A warehouse interface is usually bidirectional. Business Central sends released orders, items, quantities, ship-to details and requested dates; the WMS returns picked quantity, shipped quantity, tracking number, shipment date and exceptions.

The design has to address partial shipments, unit-of-measure conversion, duplicate shipment events, cancellation after release, sequencing, warehouse rejection and inventory reconciliation — most of which only surface in testing if somebody deliberately tests for them.

CRM and Business Central

A common split gives CRM the prospect and relationship data, contacts and opportunity context, and gives Business Central the financial customer setup, credit control, payment terms, invoices and balances.

The two decisions that matter are exactly when a CRM account becomes a Business Central customer, and which fields flow in which direction after that point.


What a Production-Ready Integration Should Not Do

Avoid designs that:

  • hard-code credentials, or assign excessive permissions
  • poll full tables every few minutes
  • retry forever, or retry failures that cannot succeed
  • create records without idempotency
  • assume a timeout means Business Central did nothing
  • advance watermarks before processing is complete
  • expose Business Central directly to uncontrolled clients
  • rely on a single document number where the source can reuse it
  • let two systems update the same data without ownership rules
  • send every transaction straight through regardless of load
  • omit dead-letter handling, reconciliation or correlation ids
  • hide failed messages in technical logs operations cannot interpret
  • build a custom AL API where a suitable standard API already exists

Business Central Integration Design Checklist

Business. What process is being integrated? What is the source and the destination? Which system owns each data domain? What latency is acceptable? What volume is expected? What happens during an outage?

Data. What is the field mapping? Which keys identify records? How are duplicates detected? What transformations are required? How are code mappings governed over time?

Technical. Standard API or custom API? Synchronous or asynchronous? Logic Apps, Functions or both? Is Service Bus required? Are webhooks appropriate and supported for the entity? Is API Management required? How are pagination and throttling handled?

Security. Which Entra application is used? Which Business Central permission sets are assigned? Where are secrets stored? How are credentials rotated? Is least privilege genuinely enforced?

Operations. How are failures monitored? How are dead-letter messages reviewed and replayed? How is duplicate-safe replay guaranteed? What is the reconciliation process? Who owns support?

Deployment. Which environments exist? How is configuration promoted? What is the cutover plan? What is the rollback plan? What are the hypercare metrics?


Conclusion

Integrating Business Central Cloud with third-party applications is straightforward at the API level. Designing the integration so it stays reliable in production is where the real architecture work begins.

REST APIs provide the contract. Logic Apps orchestrate validation, transformation and routing. Service Bus decouples high-volume or failure-sensitive transactions. API Management adds governance and security. Application Insights and an integration ledger provide the traceability you will want on the first bad day after go-live.

But the decisive questions are business questions:

  • Which system owns the data?
  • What makes a transaction unique?
  • What happens when it arrives twice?
  • What happens when Business Central is unavailable?
  • How is a failed message recovered?
  • How do we prove both systems ultimately agree?

A production-grade Business Central integration is designed for failure, replay, reconciliation and supportability from day one.


Further Reading

Microsoft documentation

On this site

Planning a Business Central integration?

Econix Infotech designs and delivers Dynamics 365 Business Central integrations across e-commerce, CRM, warehouse, finance, EDI, banking, payroll and custom industry platforms — covering integration architecture, REST and custom AL APIs, Azure Logic Apps, Service Bus and API Management, Entra ID security, data mapping, duplicate prevention, retry and exception handling, monitoring and reconciliation, and production cutover and hypercare support.

Talk to Econix about your integration architecture

Business CentralAPI IntegrationREST APIAzure Logic AppsAzure Service BusMicrosoft AzureIntegration ArchitectureWebhooksDynamics 365

Struggling With Your ERP System?

Don't let a broken ERP hold your business back. Our experts will diagnose your system, stabilize critical processes, and build a roadmap to full optimization.

Microsoft Solutions Partner
Senior-Led Delivery
Canada & USA Coverage