ml-connector
QuickBooks DesktopMicrosoft Dynamics 365 Sales

QuickBooks Desktop and Microsoft Dynamics 365 Sales integration

QuickBooks Desktop runs accounting and vendor management. Dynamics 365 Sales runs the sales pipeline and customer relationship management. Connecting the two keeps your customer and vendor master data in agreement and aligns invoiced orders across both systems. When a new customer is added in QuickBooks Desktop, they appear as an account in Dynamics 365 Sales. When a sales order is created in Dynamics, the invoice that backs it flows into QuickBooks Desktop without re-entry. ml-connector handles the very different transport layers on each side and orchestrates the sync on a schedule you control.

How QuickBooks Desktop works

QuickBooks Desktop exposes customers, vendors, items, invoices, bills, purchase orders, accounts, employees, and journal entries through SOAP and QBXML over HTTPS. Authentication uses a session-token handshake: the customer-hosted QBWC polling agent provides credentials via the SOAP authenticate() method, and your service returns a session ticket for all subsequent calls in that session. QuickBooks Desktop has no webhooks or public event system, so all data is read by polling through the customer's QBWC agent on a configurable interval (minimum 1 minute, typical 5 to 15 minutes). Queries use ModifiedDateRangeFilter to detect changes, and deleted records are found with TxnDeletedQueryRq.

How Microsoft Dynamics 365 Sales works

Microsoft Dynamics 365 Sales exposes accounts, contacts, leads, opportunities, quotes, sales orders, invoices, and products through REST and OData v4.0. Authentication uses OAuth 2.0 via Microsoft Entra ID with a Client Credentials flow for server-to-server integration. Dynamics 365 Sales supports both webhooks via the Dataverse Event Framework (for Create, Update, Delete, and custom actions with a 60-second timeout) and polling. Webhooks do not include HMAC signatures but instead use a shared secret that can be passed as a query string or header. Note that Dynamics 365 Sales does not include general ledger accounts, vendor records, or accounts payable ledger entries; those require Dynamics 365 Finance or Business Central.

What moves between them

The main flow is bidirectional. QuickBooks Desktop customers and vendors sync to Dynamics 365 Sales accounts and contacts so the CRM reflects your current customer and vendor roster. Dynamics sales orders flow into QuickBooks Desktop as invoices and update their status as orders are fulfilled and invoiced. Products and items are aligned in both directions so sales line items reference the correct inventory or service item in both systems. References such as account classifications and customer types are kept in sync. Because QuickBooks Desktop is pull-only (no webhooks), ml-connector polls the QBWC agent on a regular interval, typically aligned with your sales cycle (hourly or daily).

How ml-connector handles it

ml-connector stores the QuickBooks Desktop QBWC credentials and Dynamics 365 OAuth client credentials encrypted, and initiates a SOAP session on each poll by calling the authenticate() method with the stored credentials. For each entity (Customer, Vendor, Item, SalesOrder), it queries QuickBooks Desktop with ModifiedDateRangeFilter to find records changed since the last poll, fetches the current EditSequence (version counter) before any modifications to prevent concurrent edit conflicts, and transforms the QBXML payloads into Dynamics OData JSON. On the Dynamics side, it exchanges the OAuth client credentials for a fresh bearer token (tokens expire in roughly 60 minutes) and posts or updates records via the REST API. When Dynamics 365 webhooks are enabled, ml-connector can listen for sales order changes and propagate them back to QuickBooks immediately rather than waiting for the next poll cycle. All records carry a full audit trail, and any failed downstream write to Dynamics is logged so the record can be replayed once the issue is resolved.

A real-world example

A mid-market sales organization runs QuickBooks Desktop for accounting and bookkeeping across three regional offices, and Dynamics 365 Sales to manage leads, opportunities, and the sales pipeline. Before the integration, the accounting team maintained a separate customer list in QuickBooks and the sales team maintained a different one in Dynamics, creating confusion about billing addresses, payment terms, and whether a prospect was already a customer. When an order closed in Dynamics, the sales team emailed the details to accounting, who re-entered the invoice details into QuickBooks by hand, creating duplicate entry errors and invoice reconciliation delays. With QuickBooks Desktop and Dynamics 365 Sales connected, customers created in either system appear in both within the next poll cycle (typically one hour), and closed sales orders flow automatically into QuickBooks as invoices, pre-populated with the correct customer, items, and amounts. The accounting team now starts month-end close with orders and invoices already in agreement.

What you can do

  • Sync QuickBooks Desktop customers and vendors to Dynamics 365 Sales accounts and contacts, keeping master data aligned across both systems.
  • Move sales orders created in Dynamics 365 Sales into QuickBooks Desktop as invoices with correct customer, items, and amounts.
  • Authenticate QuickBooks Desktop via SOAP session-token handshake and Dynamics 365 Sales via OAuth 2.0 Client Credentials flow.
  • Poll QuickBooks Desktop through the customer-hosted QBWC agent on a regular interval, with change detection via ModifiedDateRangeFilter and EditSequence management.
  • Provide a complete audit trail on every customer, vendor, order, and invoice moved between the systems, with the ability to replay failed records.

Questions

Which direction does data flow between QuickBooks Desktop and Dynamics 365 Sales?
The flow is bidirectional. Customers and vendors in QuickBooks Desktop sync to accounts and contacts in Dynamics 365 Sales so the sales team sees the current customer roster. Sales orders created in Dynamics 365 Sales flow into QuickBooks Desktop as invoices so accounting can bill and reconcile them. Items and products are aligned in both directions so line items reference the correct inventory in both systems.
Does ml-connector support Dynamics 365 webhooks, or does it only poll?
ml-connector supports both. Because QuickBooks Desktop has no webhooks, it polls the customer-hosted QBWC agent on a regular interval you set. When Dynamics 365 Sales webhooks are enabled in your Dataverse environment, ml-connector can listen for sales order and opportunity changes and push them back to QuickBooks immediately rather than waiting for the next poll cycle, accelerating the sync on the Dynamics side.
What happens if QuickBooks Desktop or Dynamics 365 are unavailable during a sync?
ml-connector logs every failed record with full context and retries on the next scheduled poll or webhook trigger. If a customer is created in Dynamics but the write to QuickBooks fails (for example, because the QB instance is temporarily offline or the item does not exist in QB yet), the record is marked for replay in the audit log so it can be synced once the issue is resolved without creating a duplicate.

Related integrations

Connect QuickBooks Desktop and Microsoft Dynamics 365 Sales

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started