Guides and Examples
...
Quotes
Standalone Products
29 min
standalone products standalone products are individual, non bundled products that can be added directly to a quote use this guide when you need to create quotes with simple products that do not have child components or add on options for bundle products with nested components, see the docid\ fri8qggg2m1jvpi qlnvi guide all examples below use the preview endpoint ( post /cpq/quotes\ preview ) to persist the quote, replace the url with https //api nue io/cpq/quotes the request body is identical for both modes authentication const myheaders = new headers(); myheaders append("nue api key", "your api key here"); myheaders append("content type", "application/json"); example products the examples in this guide reference the following products from the nue test catalog product sku uom list price revenue model nue platform nue platform user/month $15 00 recurring nue on salesforce nue on salesforce user/month $29 90 recurring implementation service implementation service hour $250 00 one time unlimited online training unlimited online training account $1,500 00 one time usb security key usb security key each $45 00 one time key behaviors behavior details uom matching the uom field must match a published price book entry for the product if no match is found, the api returns an error pricing formula (recurring) listprice x quantity x term = listtotal pricing formula (one time) listprice x quantity = listtotal date inheritance if a product does not specify startdate or enddate , it inherits the quote level subscriptionstartdate and subscriptionenddate product resolution products are resolved by sku (preferred) or name the uom determines which price book entry is used discount propagation a header level discount applies to all lines that do not have their own explicit discount duplicate skus the same sku can appear multiple times in the products array each creates a separate line item use case 1 single product the simplest quote contains one recurring product identified by sku and uom this example creates a quote for 10 users of nue platform at a 12 month term request body { "opportunityid" "006xx000001abc123", "name" "single product quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue platform", "uom" "user/month", "quantity" 10 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "single product quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue platform", "uom" "user/month", "quantity" 10 } ] }' javascript fetch const myheaders = new headers(); myheaders append("nue api key", "your api key here"); myheaders append("content type", "application/json"); const quotedata = { opportunityid "006xx000001abc123", name "single product quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productsku "nue platform", uom "user/month", quantity 10 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { console log(`total amount $${result data quote totalamount}`); console log(`line items ${result data quotelineitems length}`); // 1 }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "single product quote", "totalamount" 1800 00, "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01" }, "quotelineitems" \[ { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 10, "listprice" 15 00, "listtotalprice" 1800 00, "totalprice" 1800 00, "startdate" "2026 01 01", "enddate" "2027 01 01", "childrenlineitems" \[] } ] }, "warnings" \[] } pricing $15 00 x 10 users x 12 months = $1,800 00 use case 2 multiple products add multiple products to the products array to include them on the same quote each product resolves independently against the price book request body { "opportunityid" "006xx000001abc123", "name" "multi product quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue on salesforce", "uom" "user/month", "quantity" 10 }, { "productsku" "nue platform", "uom" "user/month", "quantity" 5 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "multi product quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue on salesforce", "uom" "user/month", "quantity" 10 }, { "productsku" "nue platform", "uom" "user/month", "quantity" 5 } ] }' javascript fetch const quotedata = { opportunityid "006xx000001abc123", name "multi product quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productsku "nue on salesforce", uom "user/month", quantity 10 }, { productsku "nue platform", uom "user/month", quantity 5 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { console log(`total amount $${result data quote totalamount}`); console log(`line items ${result data quotelineitems length}`); // 2 result data quotelineitems foreach(item => { console log(` ${item product sku} $${item totalprice}`); }); }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "multi product quote", "totalamount" 4488 00 }, "quotelineitems" \[ { "product" { "sku" "nue on salesforce", "name" "nue on salesforce" }, "quantity" 10, "listprice" 29 90, "listtotalprice" 3588 00, "totalprice" 3588 00, "childrenlineitems" \[] }, { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 5, "listprice" 15 00, "listtotalprice" 900 00, "totalprice" 900 00, "childrenlineitems" \[] } ] }, "warnings" \[] } the quote totalamount is the sum of all line item totals $3,588 00 + $900 00 = $4,488 00 use case 3 product by name if you do not have the product sku, you can identify a product by its display name using the productname field instead of productsku the uom is still required for price book entry resolution request body { "opportunityid" "006xx000001abc123", "name" "name based quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productname" "nue platform", "uom" "user/month", "quantity" 10 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "name based quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productname" "nue platform", "uom" "user/month", "quantity" 10 } ] }' javascript fetch const quotedata = { opportunityid "006xx000001abc123", name "name based quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productname "nue platform", uom "user/month", quantity 10 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { const line = result data quotelineitems\[0]; console log(`resolved sku ${line product sku}`); // nue platform console log(`product name ${line product name}`); // nue platform console log(`total price $${line totalprice}`); }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "name based quote", "totalamount" 1800 00 }, "quotelineitems" \[ { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 10, "listprice" 15 00, "listtotalprice" 1800 00, "totalprice" 1800 00, "childrenlineitems" \[] } ] }, "warnings" \[] } when both productsku and productname are provided, the sku takes precedence for product resolution use case 4 product by sku this is the recommended default approach identify the product by its unique sku and provide the uom to resolve the correct price book entry request body { "opportunityid" "006xx000001abc123", "name" "sku based quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue on salesforce", "uom" "user/month", "quantity" 10 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "sku based quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue on salesforce", "uom" "user/month", "quantity" 10 } ] }' javascript fetch const quotedata = { opportunityid "006xx000001abc123", name "sku based quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productsku "nue on salesforce", uom "user/month", quantity 10 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { const line = result data quotelineitems\[0]; console log(`sku ${line product sku}`); console log(`total price $${line totalprice}`); }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "sku based quote", "totalamount" 3588 00 }, "quotelineitems" \[ { "product" { "sku" "nue on salesforce", "name" "nue on salesforce" }, "quantity" 10, "listprice" 29 90, "listtotalprice" 3588 00, "totalprice" 3588 00, "childrenlineitems" \[] } ] }, "warnings" \[] } sku based identification is preferred because skus are unique and stable, whereas product names may change use case 5 mixed revenue models a single quote can contain products with different revenue models recurring products are priced over the subscription term ( listprice x qty x term ), while one time products are priced as a flat fee ( listprice x qty ) regardless of term request body { "opportunityid" "006xx000001abc123", "name" "mixed revenue quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue platform", "uom" "user/month", "quantity" 10 }, { "productsku" "implementation service", "uom" "hour", "quantity" 20 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "mixed revenue quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue platform", "uom" "user/month", "quantity" 10 }, { "productsku" "implementation service", "uom" "hour", "quantity" 20 } ] }' javascript fetch const quotedata = { opportunityid "006xx000001abc123", name "mixed revenue quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productsku "nue platform", uom "user/month", quantity 10 }, { productsku "implementation service", uom "hour", quantity 20 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { console log(`total amount $${result data quote totalamount}`); result data quotelineitems foreach(item => { console log(` ${item product sku} $${item totalprice}`); }); // nue platform $15 00 x 10 x 12 = $1,800 00 (recurring) // implementation service $250 00 x 20 = $5,000 00 (one time) }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "mixed revenue quote", "totalamount" 6800 00 }, "quotelineitems" \[ { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 10, "listprice" 15 00, "listtotalprice" 1800 00, "totalprice" 1800 00, "revenuemodel" "recurring", "childrenlineitems" \[] }, { "product" { "sku" "implementation service", "name" "implementation service" }, "quantity" 20, "listprice" 250 00, "listtotalprice" 5000 00, "totalprice" 5000 00, "revenuemodel" "one time", "childrenlineitems" \[] } ] }, "warnings" \[] } the recurring product is priced at $15 00 x 10 x 12 = $1,800 00 the one time product is priced at $250 00 x 20 = $5,000 00 (term is not applied) use case 6 one time products only a quote can contain only one time products the subscription term fields are still required on the quote header but do not affect one time pricing request body { "opportunityid" "006xx000001abc123", "name" "professional services quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "implementation service", "uom" "hour", "quantity" 40 }, { "productsku" "unlimited online training", "uom" "account", "quantity" 1 }, { "productsku" "usb security key", "uom" "each", "quantity" 25 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "professional services quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "implementation service", "uom" "hour", "quantity" 40 }, { "productsku" "unlimited online training", "uom" "account", "quantity" 1 }, { "productsku" "usb security key", "uom" "each", "quantity" 25 } ] }' javascript fetch const quotedata = { opportunityid "006xx000001abc123", name "professional services quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productsku "implementation service", uom "hour", quantity 40 }, { productsku "unlimited online training", uom "account", quantity 1 }, { productsku "usb security key", uom "each", quantity 25 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { console log(`total amount $${result data quote totalamount}`); result data quotelineitems foreach(item => { console log(` ${item product sku} (${item quantity}x) $${item totalprice}`); }); }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "professional services quote", "totalamount" 12625 00 }, "quotelineitems" \[ { "product" { "sku" "implementation service", "name" "implementation service" }, "quantity" 40, "listprice" 250 00, "listtotalprice" 10000 00, "totalprice" 10000 00, "revenuemodel" "one time", "childrenlineitems" \[] }, { "product" { "sku" "unlimited online training", "name" "unlimited online training" }, "quantity" 1, "listprice" 1500 00, "listtotalprice" 1500 00, "totalprice" 1500 00, "revenuemodel" "one time", "childrenlineitems" \[] }, { "product" { "sku" "usb security key", "name" "usb security key" }, "quantity" 25, "listprice" 45 00, "listtotalprice" 1125 00, "totalprice" 1125 00, "revenuemodel" "one time", "childrenlineitems" \[] } ] }, "warnings" \[] } all three products are one time $250 x 40 = $10,000 + $1,500 x 1 = $1,500 + $45 x 25 = $1,125 = $12,625 00 total use case 7 duplicate products you can include the same sku multiple times in the products array each entry creates a separate line item on the quote this is useful when you need different quantities, discounts, or configurations for the same product request body { "opportunityid" "006xx000001abc123", "name" "duplicate product quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue platform", "uom" "user/month", "quantity" 10 }, { "productsku" "nue platform", "uom" "user/month", "quantity" 25 } ] } curl curl x post 'https //api nue io/cpq/quotes\ preview' \\ h 'nue api key your api key here' \\ h 'content type application/json' \\ d '{ "opportunityid" "006xx000001abc123", "name" "duplicate product quote", "subscriptionstartdate" "2026 01 01", "subscriptionenddate" "2027 01 01", "subscriptiontermdimension" "month", "subscriptionterm" 12, "products" \[ { "productsku" "nue platform", "uom" "user/month", "quantity" 10 }, { "productsku" "nue platform", "uom" "user/month", "quantity" 25 } ] }' javascript fetch const quotedata = { opportunityid "006xx000001abc123", name "duplicate product quote", subscriptionstartdate "2026 01 01", subscriptionenddate "2027 01 01", subscriptiontermdimension "month", subscriptionterm 12, products \[ { productsku "nue platform", uom "user/month", quantity 10 }, { productsku "nue platform", uom "user/month", quantity 25 } ] }; fetch('https //api nue io/cpq/quotes\ preview', { method 'post', headers myheaders, body json stringify(quotedata) }) then(response => response json()) then(result => { console log(`line items ${result data quotelineitems length}`); // 2 result data quotelineitems foreach((item, i) => { console log(` line ${i + 1} ${item product sku}, qty=${item quantity}, $${item totalprice}`); }); }) catch(error => console log('error ', error)); expected response { "status" "succeed", "data" { "quote" { "id" null, "name" "duplicate product quote", "totalamount" 6300 00 }, "quotelineitems" \[ { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 10, "listprice" 15 00, "listtotalprice" 1800 00, "totalprice" 1800 00, "childrenlineitems" \[] }, { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 25, "listprice" 15 00, "listtotalprice" 4500 00, "totalprice" 4500 00, "childrenlineitems" \[] } ] }, "warnings" \[] } the result contains two separate line items, each independently priced line 1 $15 x 10 x 12 = $1,800 line 2 $15 x 25 x 12 = $4,500 total $6,300 00 response structure each standalone product appears as a top level entry in the data quotelineitems array { "status" "succeed", "data" { "quote" { "id" null, "name" "single product quote", "totalamount" 1800 00 }, "quotelineitems" \[ { "product" { "sku" "nue platform", "name" "nue platform" }, "quantity" 10, "listprice" 15 00, "listtotalprice" 1800 00, "totalprice" 1800 00, "childrenlineitems" \[] } ] }, "warnings" \[] } standalone products have an empty childrenlineitems array bundle products, covered in the docid\ fri8qggg2m1jvpi qlnvi guide, populate this array with their bundled and optional components summary use case products key concept 1 single product nue platform x 10 basic sku + uom identification 2 multiple products nue on salesforce + nue platform multiple products in one quote 3 product by name productname "nue platform" name based identification 4 product by sku productsku "nue on salesforce" preferred identification method 5 mixed revenue recurring + one time different pricing formulas 6 one time only three one time products term does not affect pricing 7 duplicate products same sku, different quantities separate line items per entry