Connect QuickBooks Online to Neblex CPQ
A quote is approved in Neblex CPQ and the invoice is waiting in QuickBooks Online, with the customer matched rather than duplicated and every line carried across at the quoted price. When QuickBooks records the payment, the quote shows it. Neblex Integration Fabric runs the flow; CPQ supplies the API and the event feed.
Why teams connect QuickBooks and Neblex CPQ
Sales quotes in Neblex CPQ. Finance books revenue in QuickBooks Online. Without a link between them, somebody re-types every approved quote as an invoice, the customer name is spelled three ways across the two systems, and a rep has to ask finance whether a customer has paid before the next conversation. Small teams absorb this for a while. Growing teams stop trusting the numbers.
Neblex CPQ has no accounting connector of its own, by design. What it has is a documented API and a pull-based event feed that records every meaningful change to a quote, a customer, an address, or payment terms. Neblex Integration Fabric supplies the QuickBooks Online connector and the flow that sits between the two, so the link is assembled from parts you can inspect rather than coded and forgotten. The result is one path from an approved quote to a posted invoice, with a person in the loop where you want one, and the paid status back on the quote so sales sees it without asking.
How it works
On the CPQ side, the API and the event feed. Every operation a rep can perform on a quote or a customer is available as an API call, behind four mandatory access layers: an environment header, a mutual TLS client certificate, a bearer service token, and an optional IP allowance. The flow authenticates as a service account, which is not a user and holds only the scopes you grant it. Changes reach the flow through an event listener: CPQ queues events, the flow fetches a batch on its own schedule, processes it, and acknowledges what it consumed. Delivery is at least once until acknowledged, and CPQ sends no push webhooks, so nothing is lost if the flow is down for an hour.
QUOTE_STATUS_CHANGED starts the invoice. Its payload carries the quote id, the quote number, and the status the quote moved from and to, so the flow acts only when the new status is the stage you treat as approved or won. QUOTE_APPROVED and QUOTE_APPROVAL_REQUESTED are also in the feed. For customers, CUSTOMER_CREATED is an ordered event, while CUSTOMER_UPDATED, CUSTOMER_ADDRESS_UPDATED, and CUSTOMER_TERMS_UPDATED are coalesced: the listener sees only the latest state of each record.
On the Fabric side, the QuickBooks Online connector. The connector authenticates with OAuth2 against one QuickBooks company file and exposes 50 operations, each with a typed output, so the fields available at every step are known before you map them. This flow uses query, getCustomer, createCustomer, updateCustomer, getItem, createInvoice, sendInvoice, getInvoice, getPayment, and changeDataCapture. createCreditMemo and voidInvoice cover the exceptions.
The connector declares no triggers of its own. A change on the QuickBooks side, such as a payment landing against an invoice, is picked up either by a Poll for changes trigger that calls changeDataCapture on the schedule you set, or by QuickBooks's own webhooks calling a Neblex webhook endpoint. Either way the flow runs when the change arrives, not the moment it happens.
In between, the flow. A visual flow maps the fields, resolves the customer and the items, pauses for approval when a rule says so, creates the invoice, and writes the result back to the quote through the CPQ API. Every run is recorded step by step.
Worked example: an approved quote becomes a QuickBooks customer and invoice, with payment status back
Triggered on the status change, idempotent on the quote id.
- A quote reaches the approved stage in CPQ. The feed records
QUOTE_STATUS_CHANGEDwith the quote id and the new status, and the listener fetches it on its next poll. - The flow reads the full quote. Using the id from the event, it calls the CPQ API for the header, line items, customer, billing address, and payment terms.
- The flow resolves the QuickBooks customer. It runs
queryfor a customer whoseDisplayNameequals the CPQ customer name. If none exists,createCustomercreates one with the CPQ billing address and the payment terms resolved through a lookup you maintain in the flow. - Idempotency check. The flow runs
queryfor an invoice whosePrivateNotecontains the CPQ quote id. If one exists, the run stops, so a repeated event or a manual re-run never double-invoices. - Lines are mapped. For each quote line,
queryresolves the QuickBooks item by the CPQ part number, and the flow carries the quantity, the quoted unit selling price, and the description. A part with no QuickBooks item falls back to a generic item and the run is flagged for review. - Approval, if your rule says so. If the quote total is over a threshold, or the footer discount exceeds a limit, the flow pauses for a named approver in finance.
- The invoice is created and sent.
createInvoiceposts the invoice with the customer, lines, currency, terms, and the quote id in the private note;sendInvoiceemails it if you choose. The flow then writes the QuickBooks invoice number into the quote's custom field values through the CPQ API. - Payment comes back. When a Poll for changes trigger or a QuickBooks webhook reports a payment, the flow calls
getPaymentandgetInvoice, reads the balance, and updates the quote's custom field values to paid, partially paid, or overdue.
Field mapping
The starting map for the quote-to-invoice step. Adjust the QuickBooks side to your company file.
| Neblex CPQ field | QuickBooks Online | Notes |
|---|---|---|
Quote.id | Invoice.PrivateNote (contains id) | Idempotency key. Queried before creating so a repeated event does not double-invoice. |
Quote.quoteNumber | Invoice.DocNumber | Optional, if finance wants the quote number on the invoice. |
Customer.name | Customer.DisplayName | Match key. QuickBooks requires display names to be unique, which makes it a safe lookup. |
CustomerAddress.line1, city, state, zip, country (type BILL_TO) | Customer.BillAddr and Invoice.BillAddr | From the quote's bill-to address; line2 and attention when present. |
CustomerTerms.paymentTerms | Invoice.SalesTermRef | Mapped through a lookup from CPQ terms text to QuickBooks term records. |
QuoteLineItem.partNumber | Invoice.Line.SalesItemLineDetail.ItemRef | Resolved to the QuickBooks item. customPartNumber takes precedence when set. |
QuoteLineItem.quantity | Invoice.Line.SalesItemLineDetail.Qty | One invoice line per quote line. |
QuoteLineItem.sellingPrice | Invoice.Line.SalesItemLineDetail.UnitPrice | Per-unit price as quoted; discountPct or discountAmount becomes a discount line. |
Quote.currency | Invoice.CurrencyRef | Only on a multi-currency company file, and it must match the customer's currency or the create fails. |
Invoice.Balance and Payment.TotalAmt | Quote.customFieldValues | Return path. Paid when the balance is zero, partially paid otherwise, overdue past the due date. |
What syncs, each direction
Neblex CPQ to QuickBooks Online
- Customers.
CUSTOMER_CREATEDcreates the QuickBooks customer; a coalescedCUSTOMER_UPDATED,CUSTOMER_ADDRESS_UPDATED, orCUSTOMER_TERMS_UPDATEDupdates it withupdateCustomer. - Invoices. A quote reaching your approved or won stage creates an invoice with mapped items, quantities, prices, currency, and terms.
- Credit memos. A quote restored or re-versioned after invoicing can raise a
createCreditMemostep for finance to confirm, rather than silently editing a posted invoice.
QuickBooks Online to Neblex CPQ
- Payment status. Payments update the quote's custom field values with the invoice number, balance, and paid state.
- Invoice state. A voided invoice clears the invoice reference on the quote and flags the run for review.
Governance and audit
- Scoped service account. The flow's CPQ token starts with every scope disabled. This flow needs read on quotes and customers, update on quotes for the write-back, and nothing else. On the QuickBooks side, the OAuth2 grant is to one company file.
- Event acknowledgment. The listener acknowledges only what it processed. If the flow fails mid-batch, the unacknowledged events come back on the next poll, and the idempotency check keeps a retry from posting twice.
- Approvals in the flow. An invoice over a threshold, or with a non-standard discount, pauses for a named approver before it posts, on top of the quote approval already enforced inside CPQ.
- Run history. Every run records the event it started from, the quote, the resolved customer, the mapped lines, and the QuickBooks response, step by step. A failed run can be replayed from the failed step.
- Audit log. The service account's calls into CPQ appear in the CPQ audit log under its name, and every token records its last use, so a dormant credential is easy to spot and revoke.
Frequently asked questions
Does CPQ push the approved quote to QuickBooks?
No. Neblex CPQ sends no push webhooks. It records the status change in its event feed, and the Fabric flow pulls the batch on its own schedule and acknowledges it. An outage on either side never loses an event; it is still waiting in the feed when the flow comes back.
How does the flow know a quote is approved?
Quote stages are yours to define in CPQ, so the flow keys on the toStatus value in QUOTE_STATUS_CHANGED and acts when it matches the stage you nominate. If you use CPQ's approval workflow, the quote returns to its prior status once approved and the rep moves it to the next stage, which is the change the flow sees.
How are duplicate customers avoided?
The flow looks up the QuickBooks customer by display name, which QuickBooks keeps unique, before it creates anything. If CPQ names differ from finance's naming, add a lookup table in the flow so the match is on your terms.
Can a person confirm before the invoice posts?
Yes. Add an approval step to the flow, either always or only above a threshold or discount. The run pauses for a named approver, and the run history shows who approved it and when.
What if a part is not set up as a QuickBooks item?
The line falls back to a generic item and the run is flagged for review, rather than failing the invoice or guessing at an income account. Matt, the Neblex AI Assistant, can help you draft the lookup between part numbers and item names, but it only advises; the mapping is yours to confirm.
Connectors on this page
QuickBooks
Accounting
- Operations
- 50
- Typed outputs
- 100%
- Change triggers
- Poll or inbound webhook
- Authentication
- OAuth2
Neblex CPQ
Applications
- Operations
- 286
- Typed outputs
- 100%
- Change triggers
- Poll or inbound webhook
- Authentication
- Bearer
Bring one real product
Bring one approved quote and your QuickBooks sandbox company, and we will build this flow with you against real data, with the run history open, in one session.