Connect NetSuite to Neblex CPQ
Why teams connect NetSuite and Neblex CPQ
A quote gets approved in Neblex CPQ, and then somebody types it into NetSuite: the customer if it is new, the sales order, and for a configured product, the parts list manufacturing needs. Every rekeyed line is a chance to get a part number or quantity wrong, and every hour before order entry is an hour the customer waits. Once the order exists, the quote and the order drift apart, and sales has to ask finance whether it shipped.
Neblex CPQ does not ship a NetSuite connector of its own, and it does not push webhooks. It publishes an ordered event feed that an outside system pulls and acknowledges, and it exposes an API for reading quotes, line items, bills of materials, and customers. Neblex Integration Fabric supplies the other half: a NetSuite connector with 271 operations, a polled trigger for changes in NetSuite, and the flow that maps one side to the other. CPQ stays focused on configuration, pricing, and approvals. Fabric owns the connection, the field map, the retries, and the run history.
The result: an approved quote becomes a NetSuite customer, a sales order, and an assembly item per configured line, on a schedule as short as every minute, with the NetSuite order number and status back on the quote.
How it works
Three parts: the Neblex CPQ API and event feed, the Fabric NetSuite connector, and a flow in between.
On the Neblex CPQ side. You create a service account in your environment, issue it a service token, and enable only the scopes the flow needs: read and update on the QUOTE module, read and update on the CUSTOMER module, and read and update on INTEGRATIONS for the event feed. An event listener on that service account subscribes to the event types the flow needs: QUOTE_STATUS_CHANGED, QUOTE_APPROVED, QUOTE_VERSION_CREATED, CUSTOMER_CREATED, CUSTOMER_UPDATED, CUSTOMER_ADDRESS_CREATED, and CUSTOMER_ADDRESS_UPDATED. The listener's fetch endpoint returns ordered stream events and coalesced pending events, which hold only the latest state of a record edited several times. The flow acknowledges what it processed, and an event is delivered at least once until it is acknowledged.
On the NetSuite side. The Fabric connector talks to NetSuite's REST web services with credentials for an integration role; nothing is deployed into your NetSuite account. The quote-to-order flow uses Upsert a customer, Upsert a sales order, Upsert an assembly item, Create a work order, Get a sales order, and Run a SuiteQL query, out of 271 operations. Changes in NetSuite reach the flow through one polled trigger, Record Created or Changed, which watches a SuiteQL last-modified timestamp on the record types you choose and fires on the schedule you set. The connector's operations do not describe their output fields in advance, so you confirm the field map with Test this step when you build the flow.
The flow in between. A Fabric flow polls the CPQ listener, keeps the events it wants, reads the full quote through the API, resolves the customer, pauses for a person where you ask it to, writes the NetSuite records, writes the order number back to the quote, and acknowledges the events. Matt, the Neblex AI Assistant, can explain which CPQ fields and events to use and propose flow changes for you to apply; it never saves, publishes, or runs a flow.
Worked example: an approved quote for a configured control panel becomes a NetSuite sales order
The product is a configured control panel with a bill of materials produced by CPQ rules.
- The quote is approved. It moves to the stage you treat as approved, and CPQ writes a QUOTE_STATUS_CHANGED event to the listener's queue with quoteId, quoteNumber, fromStatus, toStatus, and updatedAt.
- The flow polls. On the schedule you set, every minute or longer, it fetches the next batch from the listener, reads the stream events in order, and keeps those whose toStatus is your approved stage.
- The flow reads the quote. Get a quote returns the header (quoteNumber, revision, currency, totalPrice, custCustomerId, custBillToId, custShipToId) and the line items. Hydrate customer references returns the linked customer, addresses, and terms. For every line where isConfigured is true, Get the resolved BOM returns the configBom rows.
- The customer is resolved. Upsert a customer runs with the CPQ Customer id as the NetSuite external ID, companyName from name, and an address book entry from each CustomerAddress row. An existing customer is updated; a missing one is created.
- A person checks the big ones. If totalPrice is above your threshold, or the customer is new, a Wait for form step sends an approval task by email link. On reject, it stops and records the reason.
- The bill of materials is built. For each configured line, Upsert an assembly item runs with the line's partNumber as the item ID and one member per configBom row of type Component or Assembly, mapping partNumber and quantity. Rows with a parentLineNumber are written first as their own assembly items, so subassemblies keep their structure. Pricing rows in configBom are skipped; price is carried on the order line.
- The sales order is written. Upsert a sales order runs with the customer as the entity, quoteNumber as the other reference number, the quote currency, and one item line per QuoteLineItem with quantity and netPrice as the rate, so NetSuite does not reprice the quote. The external ID is the quote id plus revision, so a retry updates the same order. Optionally Create a work order runs for each assembly.
- Status comes back. The flow advances the quote to an ordered stage with Advance the quote to a new stage, or, while the quote is still editable, writes the NetSuite order number to a quote custom field with Update a quote; a quote locked at a snapshot status refuses edits. It then acknowledges the events. A second flow uses Record Created or Changed on sales orders and item fulfillments to update the quote as the order moves from pending fulfillment to billed.
Field mapping
The starting map for the quote-to-sales-order step. It is configured in the flow, so every field, including custom fields, can be changed.
| Neblex CPQ field | NetSuite record and field | Notes |
|---|---|---|
| Customer.id | Customer.externalId | Match key. Creates the customer if missing. |
| Customer.name | Customer.companyName | Display name on the NetSuite customer. |
| CustomerAddress.line1, city, state, zip, country | Customer.addressbook.addr1, city, state, zip, country | bill_to becomes the default billing address, ship_to the default shipping address. |
| Quote.id + Quote.revision | SalesOrder.externalId | Idempotency key. A retry updates the existing order. |
| Quote.quoteNumber | SalesOrder.otherRefNum | Shows on the order as the customer reference. |
| Quote.currency | SalesOrder.currency | Must exist in NetSuite; Quote.fxRate is available if you post in base currency. |
| QuoteLineItem.partNumber | SalesOrder.item.item | Resolved to the NetSuite internal ID. customPartNumber wins when set. |
| QuoteLineItem.quantity | SalesOrder.item.quantity | Line level. |
| QuoteLineItem.netPrice | SalesOrder.item.rate | Override, so NetSuite price levels do not restate the quoted price. |
| configBom row partNumber and quantity | AssemblyItem.member.item and member.quantity | One assembly item per configured line; nested rows become subassemblies. |
What syncs, each direction
Neblex CPQ to NetSuite
- Approved quotes become sales orders, one per approved quote revision
- Configured lines become assembly items, with an optional work order per assembly
- New and changed customers, from CUSTOMER_CREATED and CUSTOMER_UPDATED, are upserted
- Address changes, from CUSTOMER_ADDRESS_CREATED and CUSTOMER_ADDRESS_UPDATED, update the address book
NetSuite to Neblex CPQ
- The sales order number and status, written to a custom field on the quote or reflected as a stage change
- Fulfillment and invoice status, from Record Created or Changed on item fulfillments and invoices
- Customer master changes, when NetSuite is the system of record, written with Update a customer
Governance and audit
- Scoped service account. The flow authenticates as a named service account, not a person. Its token starts with every scope off, and you enable only what the flow uses. Disabling the account revokes its tokens in one step.
- Certificate and network checks. Every call presents a client certificate issued from your settings, and you can refuse calls from any source IP not on your approved list.
- Event acknowledgment. Events stay queued until acknowledged, so a crash mid-batch means the events come back on the next fetch, not a lost order. Coalesced events carry a version, and one that changed after it was fetched is counted as stale and delivered again.
- Approvals in the flow. A Wait for form step can hold the flow for a person: orders above a value, or first orders for a new customer.
- Run history. Every run is a step-by-step record with input and output. A failed run stops at the failed step and can be replayed from there.
- Audit log. Service account calls appear in the CPQ audit log under the account's name, and each token shows a last-used timestamp.
Frequently asked questions
Does Neblex CPQ push events to NetSuite?
No. CPQ has no push webhooks. It queues events for a listener, and the Fabric flow fetches them on the schedule you set and acknowledges what it processed.
Do we need to install anything in our NetSuite account?
No. The Fabric connector uses NetSuite's REST web services with credentials for an integration role you create. No script or bundle is deployed into your account.
How are duplicate orders prevented?
The sales order's external ID is the CPQ quote id plus its revision, and the customer's external ID is the CPQ customer id. A retry after a failure updates the record that already exists rather than creating a second one.
What happens when a quote is revised after the order exists?
CPQ writes QUOTE_VERSION_CREATED and QUOTE_STATUS_CHANGED events for the new revision. The flow decides, by the rule you set, whether to update the open order or create a new one; the external ID includes the revision.
Can cost and margin leak into NetSuite?
Only if you allow it. Cost and list price keys on line items and configBom rows are removed from API responses when the service token's field permissions do not include viewing them.
Connectors used
NetSuite
ERP & Enterprise Systems
- Operations
- 271
- Operations with typed output
- 0%
- Change triggers
- 1 (poll)
- Signs in with
- Connection details
Neblex CPQ
ERP & Enterprise Systems
- Operations
- 286
- Operations with typed output
- 100%
- Change triggers
- Poll or inbound webhook
- Signs in with
- API token
NetSuite 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 a NetSuite sandbox account, and we will build the customer, sales order, and assembly item flow with you in one session, with the run history open.