ml-connector
QuickBooks DesktopSalesforce

QuickBooks Desktop and Salesforce integration

QuickBooks Desktop runs your financial data on premises. Salesforce runs your customer and sales data in the cloud. Connecting the two keeps your vendor records, customer master, and billing history aligned across both systems. Vendors you set up in QuickBooks appear in Salesforce as Accounts, invoice records sync to Opportunities with line item detail, and your accounting chart of accounts is visible to sales and support staff in Salesforce. ml-connector manages the polling and authentication on both sides so the two systems stay in sync on a schedule you choose.

How QuickBooks Desktop works

QuickBooks Desktop is a locally-installed Windows accounting application from Intuit. Integration is driven by QBWC, a customer-hosted agent installed on the same machine as QuickBooks, which polls a remote SOAP endpoint you specify on a configurable interval (minimum 1 minute, typical 5-15 minutes). The agent uses a session-token handshake with your service and sends QBXML queries to retrieve vendors, bills, invoices, accounts, customers, and journal entries. QuickBooks must be running and logged into the company file for QBWC to process requests. Changes are detected by querying with ModifiedDateRangeFilter and deleted transactions with TxnDeletedQueryRq. QuickBooks Desktop offers no webhooks and no OAuth; integration requires the on-premises QBWC polling architecture.

How Salesforce works

Salesforce is a cloud CRM that exposes Accounts, Contacts, Opportunities, Orders, and custom objects through OAuth2 REST APIs. Every call requires OAuth2 Client Credentials Flow authentication with a Consumer Key and Consumer Secret, and session tokens expire after 2 hours. Salesforce also offers Change Data Capture via its Pub/Sub API for real-time streaming of CREATE, UPDATE, DELETE, and UNDELETE events on key objects with 3-day retention, or polling via datetime range queries. Rate limits are enforced per org and per license type. The REST API endpoint and OAuth token endpoint are scoped to the customer's My Domain URL, not a shared base address.

What moves between them

The main flow runs from QuickBooks Desktop into Salesforce. As vendors and customers are created or modified in QuickBooks, ml-connector polls them via QBWC and syncs them to Salesforce Accounts with fully qualified account names and vendor classification. When QuickBooks invoices are marked as sent or received, they flow to Salesforce as Opportunities with Account lookups, invoice amounts, and line-item detail mapped to OrderItems. Reference data such as account lists and item codes are aligned so Salesforce sales staff can see the books at a glance. Updates flow on your chosen schedule (typical 5-15 minutes); deletions in QuickBooks mark the corresponding Salesforce records as inactive rather than deleting them.

How ml-connector handles it

ml-connector acts as the SOAP endpoint that QBWC calls. It responds to the QBWC authenticate() handshake with a session token, receives QBXML requests on the polling interval you set, and translates the XML responses into Salesforce API payloads. On the Salesforce side, it uses OAuth2 Client Credentials to obtain a session token, refreshes the token before expiry, and posts Accounts and Opportunities via the REST API. QuickBooks Desktop requires an EditSequence (version counter) on every modification, so ml-connector caches the current EditSequence for each vendor and customer and updates it on every sync. Salesforce rate limits trigger HTTP 429 responses; ml-connector backs off and retries using exponential backoff. QBXML queries have a 60-second timeout, so large vendor or customer lists are paginated. Every vendor and customer sync carries a full audit trail and can be replayed if a downstream Salesforce API call fails.

A real-world example

A mid-market professional services firm runs QuickBooks Desktop on a partner's machine to manage vendor bills, customer invoicing, and the general ledger. The firm also uses Salesforce to track sales pipeline, customer projects, and support tickets. Before the integration, the accounts team exported new vendors from QuickBooks monthly and manually created them as Accounts in Salesforce, and the sales team had no visibility into what customers owed or had paid. With QuickBooks Desktop and Salesforce connected, new vendors appear in Salesforce within minutes of creation, and the sales team can see open invoices, paid invoices, and aging on every Account without leaving Salesforce. Duplicate account creation is prevented, and the billing team no longer re-keys vendor addresses and payment terms.

What you can do

  • Sync vendors and customers from QuickBooks Desktop to Salesforce Accounts on your chosen polling interval.
  • Map QuickBooks invoices and bills to Salesforce Opportunities with full line-item detail and Account lookups.
  • Maintain EditSequence and handle concurrent edits safely by re-querying before each modification.
  • Handle QBWC session tokens, OAuth2 token refresh, and Salesforce rate-limit retries automatically.
  • Preserve every sync in an audit trail so failed records can be replayed when the connection is restored.

Questions

How does ml-connector act as the QBWC polling endpoint?
ml-connector exposes a SOAP endpoint that QBWC is configured to call. When QBWC connects, ml-connector responds to the authenticate() handshake with a session token, then receives QBXML requests on your configured interval. ml-connector translates the QBXML responses into Salesforce API calls and syncs the data to Salesforce Accounts and Opportunities.
What happens when a vendor or customer is edited in QuickBooks while Salesforce already has a copy?
QuickBooks requires an EditSequence (version counter) on every modification. ml-connector caches the current EditSequence for each vendor and customer and updates it whenever the record syncs. If another application modifies a record in QuickBooks between syncs, ml-connector re-queries to get the latest EditSequence before attempting the update, preventing lost edits.
How does ml-connector handle rate limits and token expiry?
Salesforce rate limits return HTTP 429; ml-connector backs off exponentially and retries. OAuth2 session tokens expire after 2 hours; ml-connector refreshes the token before expiry so no in-flight request is blocked by token expiration. Every failed sync is logged and can be replayed once the connection is restored.

Related integrations

Connect QuickBooks Desktop and Salesforce

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

Get started