Integration

Connect Xero to Neblex CPQ

A quote is approved in Neblex CPQ and the sales invoice is waiting in Xero, with the contact matched on your customer number and every line carried across at the quoted price. When Xero records the payment, the quote shows it. Neblex Integration Fabric runs the flow; CPQ supplies the API and the event feed.

Two-way
Contact and invoice out, payment status back to the quote
233
Xero operations in the Fabric connector, mapped in the flow
QUOTE_STATUS_CHANGED
The CPQ event the flow starts from, pulled and acknowledged
Poll or webhook
How a Xero payment reaches the flow, on the schedule you set

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 getContactByContactNumber, updateOrCreateContacts, getItems, getInvoices, createInvoices, emailInvoice, getInvoice, and getPayments. createCreditNotes 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 getInvoices or getPayments 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, 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 Xero contact and sales invoice, with payment status back

Triggered on the status change, idempotent on the quote number.

  1. 1A quote reaches the approved stage in CPQ. The feed records QUOTE_STATUS_CHANGED with the quote id and the new status, and the listener fetches it on its next poll.
  2. 2The 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.
  3. 3The flow resolves the Xero contact. It calls getContactByContactNumber with the CPQ customer number. If none comes back, updateOrCreateContacts creates one with that number as the contact number, plus the billing address, default currency, and sales payment terms from CPQ.
  4. 4Idempotency check. The flow calls getInvoices 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.
  5. 5Lines are mapped. For each quote line, getItems 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.
  6. 6Approval, 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.
  7. 7The invoice is created and sent. createInvoices 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. emailInvoice sends it if you want Xero to do the emailing. The flow then writes the Xero invoice number into the quote's custom field values through the CPQ API.
  8. 8Payment comes back. When a Poll for changes trigger or a Xero webhook reports a payment, the flow calls getInvoice, reads the amount due and amount paid, 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. 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 fieldXeroNotes
Quote.quoteNumberInvoice.ReferenceIdempotency key. Checked with getInvoices before creating so a repeated event does not double-invoice.
Customer.customerNumberContact.ContactNumberMatch key, looked up with getContactByContactNumber, so the match is on your number, not spelling.
Customer.nameContact.NameWritten 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.paymentTermsContact.PaymentTerms.SalesLookup from CPQ terms text to a Xero day count and term type; drives the due date.
CustomerTerms.defaultCurrencyContact.DefaultCurrencySet on create when your Xero organization uses multiple currencies.
QuoteLineItem.partNumberInvoice.LineItems.ItemCodeResolved through getItems. customPartNumber takes precedence when set.
QuoteLineItem.quantityInvoice.LineItems.QuantityOne invoice line per quote line.
QuoteLineItem.sellingPrice and discountPctInvoice.LineItems.UnitAmount and DiscountRatePer-unit price as quoted; the line discount is carried as a rate so Xero shows the same net.
Invoice.AmountDue and AmountPaidQuote.customFieldValuesReturn 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_CREATED creates the Xero contact; a coalesced CUSTOMER_UPDATED, CUSTOMER_ADDRESS_UPDATED, or CUSTOMER_TERMS_UPDATED updates it with updateOrCreateContacts, 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 createCreditNotes step for finance to confirm, rather than silently editing an approved invoice.

Xero to Neblex CPQ

  • Payment status. Payments update the quote's custom field values with the invoice number, amount due, and paid state.
  • Invoice state. A voided or deleted 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 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, pauses 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 run is flagged for review, rather than failing the invoice. Matt, the Neblex AI Assistant, can help you draft the lookup between part numbers and item codes, but it only advises; the mapping is yours to confirm.

Connectors on this page

Xero

Applications

Operations
233
Typed outputs
0%
Change triggers
Poll or inbound webhook
Authentication
Bearer

Neblex CPQ

Applications

Operations
286
Typed outputs
100%
Change triggers
Poll or inbound webhook
Authentication
Bearer

Xero does not publish typed output schemas yet, so the field mapping on this page is configured in the flow rather than pre-verified.

See it on your data

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.