Integration

Connect Salesforce to QuickBooks

Close a deal in Salesforce and have the invoice waiting in QuickBooks Online, with the customer matched and the line items carried from the opportunity. When the invoice is paid, the opportunity shows it. No rekeying, no month-end surprises, and an approval step for anything unusual. Every invoice is a run you can inspect step by step.
Two-way (invoice out, payment back)
Direction
Minutes after close and after payment
Latency
Won opportunity; payments found by polling
Common trigger
Build the flow, then map items and classes
Setup

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.

  1. Trigger: Salesforce New or updated opportunity, polled on the schedule you set, with a Filter for StageName = Closed Won. A SOQL query then reads the account, the owner, and the OpportunityLineItem rows.
  2. 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.
  3. Idempotency: query QuickBooks for an invoice whose DocNumber or private note holds the opportunity ID. If one exists, stop.
  4. 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.
  5. 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.
  6. Create invoice: QuickBooks Create Invoice with the lines, the customer, the terms from the account, and the opportunity ID in the private note.
  7. Write back: set Opportunity.Invoice_Number__c and Invoice_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.

SalesforceQuickBooks OnlineNotes
Opportunity.IdInvoice.PrivateNote (contains ID)Idempotency key. Queried before creating so a repeated trigger does not double-invoice.
Account.QuickBooks_Customer_Id__cInvoice.CustomerRefMatch key. Written back on first match if only name and email matched.
OpportunityLineItem.QuantityInvoice.Line.SalesItemLineDetail.QtyOne line per product.
Product2.ProductCodeInvoice.Line.SalesItemLineDetail.ItemRefResolved to the QuickBooks item ID. Unmapped codes fall back to a generic "Services" item and send the invoice to a person for review.
OpportunityLineItem.UnitPriceInvoice.Line.SalesItemLineDetail.UnitPriceOverride, so QuickBooks price rules do not restate the quoted price.
Opportunity.CurrencyIsoCodeInvoice.CurrencyRefCurrency gotcha: only on a multi-currency QuickBooks company, and it must match the customer's currency or the create fails.
Account.Payment_Terms__cInvoice.SalesTermRefMapped through a lookup from Salesforce terms to QuickBooks term records.
QuickBooks Payment.TotalAmt vs Invoice.BalanceOpportunity.Invoice_Status__cReturn 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
Connector reference

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
Connector reference
See it on your data

Bring one real integration

We will build it with you against your own systems, with the run log open.