Quoter Quote import for NetSuite

Developer guide

How to launch Quoter from NetSuite, and what to do with the JSON it produces.

1 · Launching Quoter

Quoter is opened from a customer record in NetSuite with the rep and customer identity passed in the query string. All four parameters are required — without them the import screen disables extraction.

https://quoter.paragonmicro.com/?customer_id=4482917 &customer_name=Acme%20Manufacturing%2C%20Inc. &netsuite_user=Joel%20Santos &netsuite_user_id=70312
ParameterTypeMeaning
customer_idintNetSuite internal id of the customer. Must be numeric — extraction rejects anything else with a 400. Becomes customer in the output.
customer_namestringDisplay name shown to the rep for confirmation. Not used for resolution.
netsuite_userstringRep's display name. Logged with every extraction and feedback entry.
netsuite_user_idstringRep's NetSuite internal id. Logged alongside the name.

URL-encode the values (%20 for spaces, %2C for commas). Quoter stores nothing between visits — every launch is a fresh, stateless session.

2 · The output JSON

After the rep reviews and edits the extraction, the result is one JSON object shaped for NetSuite estimate creation. Sample (values invented):

{ "quoteName": "Q-30589412 Network Refresh", "poNum": null, "internalNotes": "Previous PO: P5202256", "dropShip": null, "shipMethod": "133311", "customer": 4482917, "netsuiteUserId": 70312, "formId": null, "customerContact": null, "externalNotes": null, "startDate": null, "endDate": null, "autoRenew": null, "billFrequency": null, "subProvider": null, "subTerms": null, "config": null, "items": [ { "vpn": "7567705", "mpn": "PSY29U-09J00F", "manufacturer": "Dynabook", "description": "C50-K I7-150U/15FD 16/512GB W11P 1YR", "qty": 4, "cost": 591.76, "price": 929.99, "vendor": 113682, "vendorQuote": "96392303", "item": null } ] }

Header fields

FieldTypeNotes
customerintNetSuite customer internal id, straight from the launch URL.
netsuiteUserIdint·str·nullNetSuite user (employee) internal id from the launch URL, passed straight back so the RESTlet can stamp the creator/rep.
formIdnullAlways null — the receiving RESTlet selects the custom form itself.
shipMethodstring·nullNetSuite ship-method internal id (e.g. "133311"). Pre-selected per vendor; rep can change or clear it.
quoteName / poNum / internalNotesstring·nullExtracted from the document; rep-editable. Empty means null, never "".
dropShipbool·nullTri-state. null means the document didn't say — do not coerce to false.
customerContact, externalNotes, startDate, endDate, autoRenew, billFrequency, subProvider, subTerms, configReserved; always null today. Accept and ignore.

Line items (items[])

FieldTypeNotes
vpn / mpnstring·nullVendor part number / manufacturer part number, transcribed verbatim from the quote document.
manufacturerstring·nullAs printed on the quote (occasionally best-effort inferred; the rep reviews before export).
descriptionstring·nullVerbatim product description; can be several hundred characters.
qtynumber·nullBlank quantities on the source default to 1 at extraction.
cost / pricenumber·nullPer-unit, 2dp. cost = what the vendor charges us; price = list/MSRP. Negative values are legitimate (credits/promos). Never extended totals.
vendorintNetSuite vendor internal id, injected from Quoter's vendor config. Per-line — a multi-vendor import can put different vendor ids on different lines of one estimate, so resolve it per line, not once per quote.
vendorQuotestring·nullThe vendor's quote number, repeated on each line.
itemnullNetSuite item internal id — always null from Quoter. Resolve it on your side (vpn/mpn lookup) during import.

3 · Processing for NetSuite

The Create Quote in NetSuite button POSTs this exact payload to the configured NetSuite RESTlet (OAuth2 bearer auth). If the RESTlet response includes tranId / id and a url, the rep's success banner shows the estimate reference and an open-in-NetSuite link — returning them is recommended but optional.

Recommended import checklist:

  • Validate customer exists and is active before creating the estimate.
  • Resolve each line's item from vpn/mpn; route unresolved lines to a review queue rather than dropping them.
  • Treat null as "not supplied" everywhere — especially dropShip (tri-state) and price (some vendors publish no list price).
  • Money is per-unit: extended totals are qty × cost on your side. Expect legitimate negative lines.
  • shipMethod and formId are already NetSuite internal ids — no mapping needed.

Questions or a field you need added? Talk to the Quoter admin — the schema is versioned and the footer of every page shows the running version.