Connect Xero to Neblex CPQ
Why teams connect Xero and Neblex CPQ
Sales quotes in Neblex CPQ. Finance keeps the books in Xero. Without a link between them, somebody re-keys every approved quote as a sales invoice, the same customer ends up as two or three contacts with slightly different names, and a rep has to ask finance whether the invoice was paid before calling about the renewal. It works until quote volume grows, and then the two systems stop agreeing.
Neblex CPQ has no accounting connector of its own, by design. It has 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 Xero connector and the flow between the two, so the link is assembled from parts you can see and change rather than coded once and forgotten. The result is one path from an approved quote to an approved invoice in Xero, 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 Xero connector. The connector authenticates with a bearer token against one Xero organization and exposes 233 operations covering contacts, items, invoices, credit notes, payments, and reports. The operations ship without typed output schemas, so the fields you read from each response are configured in the flow as you build it rather than pre-verified by the connector: run the operation once against your organization, look at the response, and pick the fields. This flow uses Get contact by contact number, Update or create contacts, Get items, Get invoices, Create invoices, Email invoice, Get invoice, and Get payments. Create credit notes covers the exception path.
The connector declares no triggers of its own. A change on the Xero side, such as a payment applied to an invoice, is picked up either by a Poll for changes trigger that calls Get invoices or Get payments for records modified since the last run, on the schedule you set, or by Xero's own webhooks calling a Neblex webhook endpoint. The flow runs when the change arrives, not the moment it happens.
In between, the flow. A visual flow maps the fields, resolves the contact and the items, waits 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 Xero contact and sales invoice, with payment status back
Triggered on the status change, idempotent on the quote number.
- 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 Xero contact. It calls Get contact by contact number with the CPQ customer number. If none comes back, Update or create contacts creates one with that number as the contact number, plus the billing address, default currency, and sales payment terms from CPQ.
- Idempotency check. The flow calls Get invoices filtered on the CPQ quote number as the reference. If one exists, the run stops, so a repeated event or a re-run never double-invoices.
- Lines are mapped. For each quote line, Get items resolves the Xero item by the CPQ part number as the item code, and the flow carries the quantity, unit selling price, line discount, and description. A part with no Xero item is sent as a description-only line against a default sales account, 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, a Wait for form step holds the flow for a named approver in finance.
- The invoice is created and sent. Create invoices posts an accounts receivable invoice with the contact, lines, currency, a due date derived from the terms, and the quote number as the reference, as a draft or approved, your choice. Email invoice sends it if you want Xero to do the emailing. The flow then writes the Xero invoice number to a quote custom field through the CPQ API. Custom fields must be placed in the quote layout to be kept.
- Payment comes back. When a Poll for changes trigger or a Xero webhook reports a payment, the flow calls Get invoice, reads the amount due and amount paid, and updates the quote's payment status to paid, partially paid, or overdue. A quote locked at a snapshot status, such as Closed-Won, refuses edits, so keep the payment status on a stage that is still editable, or in a Neblex data table keyed on the quote.
Field mapping
The starting map for the quote-to-invoice step. Because the Xero operations carry no typed outputs, the Xero column is the standard Xero accounting object shape, confirmed in the flow against your organization.
| Neblex CPQ field | Xero | Notes |
|---|---|---|
Quote.quoteNumber | Invoice.Reference | Idempotency key. Checked with Get invoices before creating so a repeated event does not double-invoice. |
Customer.customerNumber | Contact.ContactNumber | Match key, looked up with Get contact by contact number, so the match is on your number, not spelling. |
Customer.name | Contact.Name | Written on create and kept current from coalesced customer updates. |
CustomerAddress.line1, city, state, zip, country (type bill_to) | Contact.Addresses (billing address type) | From the quote's bill-to address; line2 and attention when present. |
CustomerTerms.paymentTerms | Contact.PaymentTerms.Sales | Lookup from CPQ terms text to a Xero day count and term type; drives the due date. |
CustomerTerms.defaultCurrency | Contact.DefaultCurrency | Set on create when your Xero organization uses multiple currencies. |
QuoteLineItem.partNumber | Invoice.LineItems.ItemCode | Resolved through Get items. customPartNumber takes precedence when set. |
QuoteLineItem.quantity | Invoice.LineItems.Quantity | One invoice line per quote line. |
QuoteLineItem.sellingPrice and discountPct | Invoice.LineItems.UnitAmount and DiscountRate | Per-unit price as quoted; the line discount is carried as a rate so Xero shows the same net. |
Invoice.AmountDue and AmountPaid | quote custom fields, or a data table keyed on the quote | Return path. Paid when the amount due is zero, partially paid otherwise, overdue past the due date. |
What syncs, each direction
Neblex CPQ to Xero
- Contacts.
CUSTOMER_CREATEDcreates the Xero contact; a coalescedCUSTOMER_UPDATED,CUSTOMER_ADDRESS_UPDATED, orCUSTOMER_TERMS_UPDATEDupdates it with Update or create contacts, matched on the contact number. - Sales invoices. A quote reaching your approved or won stage creates an accounts receivable invoice with mapped items, quantities, prices, discounts, currency, and due date.
- Credit notes. A quote restored or re-versioned after invoicing can raise a Create credit notes step for finance to confirm, rather than silently editing an approved invoice.
Xero to Neblex CPQ
- Payment status. Payments update the quote's custom fields, or a data table keyed on the quote, with the invoice number, amount due, and paid state.
- Invoice state. A voided or deleted invoice clears the invoice reference on the quote and sends it to a person 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, read and update on integrations for the event feed, and update on quotes for the write-back. On the Xero side, the connection is to one organization with the accounting scopes the flow uses.
- 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, waits for a named approver before it is posted, on top of the quote approval already enforced inside CPQ.
- Run history. Every run records the event it started from, the quote, the resolved contact, the mapped lines, and the Xero 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 Xero?
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.
What does "no typed outputs" mean for us?
The connector exposes every operation but does not ship a pre-verified description of each response. When you build the flow, you run an operation against your organization, see the real response, and pick the fields you map. It adds a few minutes per step at design time and nothing once the flow is live.
How are duplicate contacts avoided?
The flow looks up the contact by the CPQ customer number stored as the Xero contact number before it creates anything. Contacts that predate the integration are given a contact number once, after which every run matches directly.
Can the invoice be created as a draft for finance to check?
Yes. Choose draft as the invoice status in the create step and finance approves it in Xero, or create it approved and add an approval step in the flow so a named person confirms first. Either way the run history shows who decided.
What if a part is not set up as a Xero item?
The line is sent as a description-only line against a default sales account and the invoice is sent to a person for review, rather than failing the invoice. Matt, the Neblex AI Assistant, can draft the lookup between part numbers and item codes; you review it and apply it.
Connectors used
Xero
Finance, Billing & Payments
- Operations
- 233
- Operations with typed output
- 0%
- Change triggers
- Poll or inbound webhook
- Signs in with
- API token
Neblex CPQ
ERP & Enterprise Systems
- Operations
- 286
- Operations with typed output
- 100%
- Change triggers
- Poll or inbound webhook
- Signs in with
- API token
Xero does not describe its output fields in advance, so check the field mapping with Test this step when you build the flow.
Bring one real product
Bring one approved quote and your Xero demo organization, and we will build this flow with you against real data, with the run history open, in one session.