Executive Summary
Integrating Microsoft Dynamics 365 Finance with Adobe Commerce creates a unified commerce-to-finance backbone that synchronizes customers, products, pricing, orders, and inventory across both platforms in near real time. D365 Finance exposes its data entities via the Data Management Framework (DMF) Package REST API and OData endpoints, secured through OAuth 2.0 with Microsoft Entra ID (or AD FS for on-premises). Adobe Commerce exposes a comprehensive REST API with token-based authentication supporting both admin and customer token flows, as well as OAuth 1.0a for third-party integrations and server-to-server patterns.
⚡ Accelerate your integration roadmap
Stop wrestling with API rate limits, undocumented endpoints, and unreliable webhooks. Our engineering team designs and deploys resilient, enterprise-grade integration architectures in days. Prefer to build it in-house? Leverage our recommended middleware platform.
The recommended architecture places a middleware integration layer (Azure Integration Services, MuleSoft, or Boomi) between the two platforms to orchestrate data package imports/exports from D365 and REST calls to Adobe Commerce. This decouples schema differences, handles retry logic, and manages the asynchronous nature of D365’s DMF execution model. Key integration surfaces include customer account sync, product catalog push, order ingestion into D365 for financial processing, inventory quantity updates, and invoice/payment status callbacks to Commerce.
Logical Architecture & Data Flow
Architecture Component Breakdown
GetExecutionSummaryStatus.POST /V1/integration/admin/token) and OAuth 1.0a for third-party integrations. Server-to-server flows use integration access tokens.GetAzureWriteUrl before triggering import jobs.Authentication Architecture
Dynamics 365 Finance requires OAuth 2.0 access tokens issued by Microsoft Entra ID. The recommended grant type for server-to-server integration is the Client Credentials flow: register an Azure AD application, grant it the Dynamics ERP API permission, and add the client ID to D365’s Microsoft Entra Applications allowlist under System Administration. For on-premises D365 deployments, AD FS replaces Entra ID and the base URL must append /namespaces/AXSF. Access tokens are short-lived (typically 60 minutes) and must be refreshed by the middleware before expiry.
Adobe Commerce REST API authentication for server-to-server middleware integrations uses Integration Access Tokens generated via the Admin panel under System → Integrations, which produce a persistent OAuth 1.0a-derived bearer token. Alternatively, admin tokens can be requested programmatically via POST /rest/V1/integration/admin/token with admin credentials. For production integrations, the Integration token approach is preferred as it supports granular ACL resource scoping. All API calls must pass the token in the Authorization: Bearer <token> header over HTTPS.
Data Flow Diagram
graph LR A["D365 Finance\nOData / DMF"] -->|"Export Package"| B["Azure Blob\nStaging"] B -->|"Trigger Import"| C["Middleware\niPaaS Layer"] C -->|"REST POST/PATCH"| D["Adobe Commerce\nREST API"] D -.->|"Order Webhook"| C C -.->|"DMF Import"| A
Enterprise Use Cases
Use Case 1: Customer Account Synchronization
Customers V3 data entity), the middleware polls or receives a D365 Business Event notification, extracts the customer payload, and calls POST /rest/V1/customers or PUT /rest/V1/customers/{customerId} on Adobe Commerce to maintain a consistent customer master. Tax-exempt status, credit limits, and company associations from D365 B2B entities are mapped to Commerce customer attributes and company profiles via POST /rest/V1/company for B2B scenarios.Use Case 2: Product Catalog & Pricing Push
Released products V2 and Sales price journal data entities. The middleware transforms the package payload and calls POST /rest/V1/products to create or update SKUs, and POST /rest/V1/products/{sku}/links for related products. Customer-specific pricing from D365 trade agreements is pushed to Commerce tier prices via POST /rest/V1/products/{sku}/tierPrices, enabling ERP-governed pricing to surface on the storefront without manual intervention.Use Case 3: Order Ingestion into D365 Finance
GET /rest/V1/orders (filtered by status=pending) captures the order data. The middleware maps Commerce order fields to the D365 Sales order headers V2 and Sales order lines V2 data entities, assembles a DMF-compatible data package, uploads it to Azure Blob Storage via GetAzureWriteUrl, and triggers import via POST /data/DataManagementDefinitionGroups/Microsoft.Dynamics.DataEntities.ImportFromPackage. The resulting D365 execution ID is stored by the middleware for status polling via GetExecutionSummaryStatus.Use Case 4: Inventory Quantity Sync
Inventory on-hand entries data entity is exported via DMF on a scheduled basis or triggered by inventory movement business events. The middleware transforms quantity data per SKU and warehouse, then calls POST /rest/V1/inventory/source-items to update Adobe Commerce MSI source quantities. For simpler single-source deployments, PUT /rest/V1/products/{sku}/stockItems/{itemId} is used to set the qty field directly, preventing overselling by keeping Commerce stock levels aligned with the authoritative ERP.Use Case 5: Invoice & Payment Status Writeback
Customer invoice journal V2 OData entity and calls POST /rest/V1/order/{orderId}/invoice in Adobe Commerce to generate a corresponding invoice record. This closes the order lifecycle loop, allowing Commerce to display accurate order status to customers. Payment settlements processed in D365 can similarly trigger POST /rest/V1/invoices/{invoiceId}/capture to mark payments as captured in Commerce, maintaining front-to-back financial consistency.Standard API Field Mapping
| Entity | Microsoft Dynamics 365 Finance Field | Method | Adobe Commerce Field | Method | Type |
|---|---|---|---|---|---|
| Customer | CustomerAccount (Customers V3) |
GET | email (/V1/customers) |
POST | String |
| Customer | OrganizationName (Customers V3) |
GET | company (customer address) |
POST | String |
| Product | ItemNumber (Released products V2) |
GET | sku (/V1/products) |
POST | String |
| Product | ProductName (Released products V2) |
GET | name (/V1/products) |
PATCH | String |
| Pricing | Price (Sales price journal entity) |
GET | value (tier_prices array) |
POST | Decimal |
| Sales Order | SalesOrderNumber (Sales order headers V2) |
POST | ext_order_id (/V1/orders) |
GET | String |
| Sales Order | RequestedShippingDate (Sales order headers V2) |
POST | shipping_description / custom attribute |
PATCH | DateTime |
| Inventory | AvailablePhysical (Inventory on-hand V2) |
GET | qty (/V1/inventory/source-items) |
POST | Decimal |
| Invoice | InvoiceNumber (Customer invoice journal V2) |
GET | transaction_id (/V1/order/{id}/invoice) |
POST | String |
| Invoice | InvoiceAmount (Customer invoice journal V2) |
GET | base_grand_total (order object) |
PATCH | Decimal |
| Shipment | TrackingNumber (Transfer order ship/receive) |
GET | track_number (/V1/shipment/track) |
POST | String |
| Order Event | Business Events framework (D365) | WEBHOOK | Commerce Webhooks (/V1/webhooks) |
WEBHOOK | Event |
Limitations & Rate Limits
Microsoft Dynamics 365 Finance Rate Limits
| Constraint | Limit | Detail | Mitigation |
|---|---|---|---|
| DMF Package API concurrent jobs | DATA_UNAVAILABLE | No explicit documented concurrency limit; practical limits observed in customer environments vary by tier. | Implement job queuing in middleware; serialize large batch imports. |
| OData API request throttling | DATA_UNAVAILABLE | D365 Finance applies priority-based throttling; limits depend on service tier and deployment type (cloud vs. on-premises). | Use exponential backoff; subscribe to D365 throttling notifications via service health dashboard. |
| Azure Blob SAS token expiry | Short window (minutes) | SAS tokens returned by GetAzureWriteUrl expire within a short window; uploads must complete before expiry. |
Initiate upload immediately after obtaining SAS URL; do not cache SAS tokens. |
| DMF execution status polling | DATA_UNAVAILABLE | Recommended to implement polling backoff; no documented minimum polling interval for GetExecutionSummaryStatus. |
Use exponential backoff starting at 5-second intervals; cap at 60 seconds. |
Adobe Commerce Rate Limits
| Constraint | Limit | Detail | Mitigation |
|---|---|---|---|
| REST API rate limit (Adobe Commerce Cloud) | DATA_UNAVAILABLE | Adobe Commerce Cloud (PaaS) applies infrastructure-level rate limiting; specific req/sec thresholds are not publicly documented. | Use bulk async endpoints (/async/bulk/V1/) for high-volume writes; contact Adobe TAM for limit disclosure. |
| Bulk endpoint payload size | DATA_UNAVAILABLE | Bulk REST endpoints support batched operations but maximum items per bulk request is not explicitly documented in public docs. | Test with batches of 100–500 records and scale based on observed performance in target environment. |
| Admin token expiry | 4 hours (default) | Admin tokens issued via /V1/integration/admin/token expire after 4 hours by default (configurable in Admin → Stores → Config). |
Use long-lived Integration Access Tokens for server-to-server; implement token refresh logic for admin tokens. |
| Async operation status retention | DATA_UNAVAILABLE | Async bulk operation statuses are stored in the queue but retention duration is not documented. | Poll status endpoints promptly after submission; log responses locally before status expiry. |
Critical Engineering Constraints
GetExecutionSummaryStatus after every ImportFromPackage call and implement robust error handling using GenerateImportTargetErrorKeysFile before marking a job as complete./namespaces/AXSF — failure to account for this in middleware configuration will result in authentication failures across all API calls.Official Documentation
Microsoft Dynamics 365 Finance
Data Management Package REST API
VIEW DOCS →
Microsoft Dynamics 365 Finance
Recurring Integrations API
VIEW DOCS →
Adobe Commerce (Magento)
REST API Overview
VIEW DOCS →
Adobe Commerce (Magento)
REST API Authentication
VIEW DOCS →
Adobe Commerce (Magento)
B2B REST Integration Guide
VIEW DOCS →
Adobe Commerce (Magento)
Bulk & Async REST Endpoints
VIEW DOCS →