Connect Salesforce to QuickBooks
Why teams connect Salesforce and QuickBooks
Sales works in Salesforce. Finance works in QuickBooks. Without a link, someone re-types every closed deal into QuickBooks as an invoice, the customer name is spelled three ways, and the AE has to ask finance whether the customer has paid before starting the renewal conversation.
- A closed-won opportunity creates a QuickBooks invoice with the products, quantities, and prices from the opportunity line items
- Customers are matched, not duplicated, on a stored QuickBooks ID, falling back to a normalized name and email
- When QuickBooks records a payment, the opportunity shows paid, partially paid, or overdue, so sales and CS see it without asking
- An approval step can hold any invoice over a threshold, or with a non-standard discount, before it posts
Worked example
The quote-to-cash flow most teams turn on first.
A closed-won Salesforce opportunity becomes a QuickBooks invoice, payment status back
Started by the polled opportunity trigger, safe to repeat on the opportunity ID.
- Trigger: Salesforce
New or updated opportunity, polled on the schedule you set, with a Filter forStageName = Closed Won. A SOQL query then reads the account, the owner, and theOpportunityLineItemrows. - Resolve customer: find the QuickBooks customer by
Account.QuickBooks_Customer_Id__c. If empty, search by normalized name and billing email, and on a match write the ID back to the account. - Idempotency: query QuickBooks for an invoice whose
DocNumberor private note holds the opportunity ID. If one exists, stop. - Map lines: for each line item, resolve the QuickBooks item by product code, carry quantity and unit price, and apply the QuickBooks tax code from a lookup.
- Approval: if the amount is over the threshold or the blended discount exceeds the limit, a Wait for form step sends finance an approval task. Otherwise continue.
- Create invoice: QuickBooks
Create Invoicewith the lines, the customer, the terms from the account, and the opportunity ID in the private note. - Write back: set
Opportunity.Invoice_Number__candInvoice_Status__c = Sent. A second flow polls QuickBooks with the Change Data Capture operation, and a payment for that invoice updates the status to Paid or Partially Paid.
Field mapping
The starting map for the opportunity to QuickBooks Invoice step.
| Salesforce | QuickBooks Online | Notes |
|---|---|---|
Opportunity.Id | Invoice.PrivateNote (contains ID) | Idempotency key. Queried before creating so a repeated trigger does not double-invoice. |
Account.QuickBooks_Customer_Id__c | Invoice.CustomerRef | Match key. Written back on first match if only name and email matched. |
OpportunityLineItem.Quantity | Invoice.Line.SalesItemLineDetail.Qty | One line per product. |
Product2.ProductCode | Invoice.Line.SalesItemLineDetail.ItemRef | Resolved to the QuickBooks item ID. Unmapped codes fall back to a generic "Services" item and send the invoice to a person for review. |
OpportunityLineItem.UnitPrice | Invoice.Line.SalesItemLineDetail.UnitPrice | Override, so QuickBooks price rules do not restate the quoted price. |
Opportunity.CurrencyIsoCode | Invoice.CurrencyRef | Currency gotcha: only on a multi-currency QuickBooks company, and it must match the customer's currency or the create fails. |
Account.Payment_Terms__c | Invoice.SalesTermRef | Mapped through a lookup from Salesforce terms to QuickBooks term records. |
QuickBooks Payment.TotalAmt vs Invoice.Balance | Opportunity.Invoice_Status__c | Return path. Paid when balance is zero, Partially Paid otherwise, Overdue past the due date. |
What syncs, each direction
- Invoices. A closed-won opportunity creates an invoice with mapped items, quantities, prices, terms, and tax. (Salesforce to QuickBooks)
- Customers. A new or changed account creates or updates the QuickBooks customer, matched on a stored ID. (Salesforce to QuickBooks)
- Payment status. Payments and credit memos, picked up by polling, update the opportunity's invoice status and paid date. (QuickBooks to Salesforce)
- AR aging (optional). A nightly roll-up writes total open AR and days overdue onto the account for the CS and collections view. (QuickBooks to Salesforce)
Governance and audit
The same controls apply to this sync as to every other Neblex workload.
- Run history. Every invoice is a run with the opportunity, the resolved customer, the mapped lines, and the QuickBooks response. A failed run can be replayed from the step that failed, and the invoice check stops a second posting.
- Approval steps. Invoices over a threshold, or with a non-standard discount, wait for a named approver, so finance sees anything unusual before it is booked.
- Scoped access. Salesforce uses a connected app limited to Opportunity, Account, and Product objects. QuickBooks uses an OAuth connection to one company file.
- Environments. Build against a Salesforce sandbox and a QuickBooks sandbox company, then promote the same flow to production.
Frequently asked questions
How is this different from Breadwinner, DBSync, or the QuickBooks apps?
Those are capable Salesforce-QuickBooks connectors and plenty of teams are happy on them. Neblex fits when the invoice step is part of a bigger flow, for example the same run also provisions the account and notifies CS, and you want one run history, an approval step you control, and the same governance across every integration.
Does it create the invoice automatically or wait for a person?
Your choice. The default creates it on closed-won. You can add an approval step so a person confirms first, either always or only above a threshold.
How are duplicate customers avoided?
It matches on a QuickBooks customer ID stored on the account. The first time, when only name and email match, it writes the ID back so every later run matches directly.
Can it handle recurring or subscription billing?
For simple renewals, yes, by creating a new invoice per term from the opportunity. True subscription billing usually belongs in a billing system, and Neblex can sit between that and QuickBooks instead.
What if a product is not set up in QuickBooks?
The line falls back to a generic item and a person is asked to review the invoice, rather than failing the whole invoice or guessing at an account.
Does payment status really come back to Salesforce?
Yes. A flow polls QuickBooks for new payments and credit memos, as often as every minute, and updates the opportunity's invoice status, paid date, and balance, so sales and CS never have to ask finance.
Connectors used
Salesforce
CRM & Sales
- Operations
- 1,296
- Operations with typed output
- 57.9%
- Change triggers
- 31 (poll)
- Signs in with
- OAuth 2.0 sign-in
QuickBooks
Finance, Billing & Payments
- Operations
- 50
- Operations with typed output
- 100%
- Change triggers
- Poll or inbound webhook
- Signs in with
- OAuth 2.0 sign-in
Bring one real integration
We will build it with you against your own systems, with the run log open.