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.
| Parameter | Type | Meaning |
|---|---|---|
| customer_id | int | NetSuite internal id of the customer. Must be numeric — extraction rejects anything else with a 400. Becomes customer in the output. |
| customer_name | string | Display name shown to the rep for confirmation. Not used for resolution. |
| netsuite_user | string | Rep's display name. Logged with every extraction and feedback entry. |
| netsuite_user_id | string | Rep'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):
Header fields
| Field | Type | Notes |
|---|---|---|
| customer | int | NetSuite customer internal id, straight from the launch URL. |
| formId | int | NetSuite custom form internal id. Per-vendor config; defaults to 168. |
| shipMethod | string·null | NetSuite ship-method internal id (e.g. "133311"). Pre-selected per vendor; rep can change or clear it. |
| quoteName / poNum / internalNotes | string·null | Extracted from the document; rep-editable. Empty means null, never "". |
| dropShip | bool·null | Tri-state. null means the document didn't say — do not coerce to false. |
| customerContact, externalNotes, startDate, endDate, autoRenew, billFrequency, subProvider, subTerms, config | Reserved; always null today. Accept and ignore. | |
Line items (items[])
| Field | Type | Notes |
|---|---|---|
| vpn / mpn | string·null | Vendor part number / manufacturer part number, transcribed verbatim from the quote document. |
| manufacturer | string·null | As printed on the quote (occasionally best-effort inferred; the rep reviews before export). |
| description | string·null | Verbatim product description; can be several hundred characters. |
| qty | number·null | Blank quantities on the source default to 1 at extraction. |
| cost / price | number·null | Per-unit, 2dp. cost = what the vendor charges us; price = list/MSRP. Negative values are legitimate (credits/promos). Never extended totals. |
| vendor | int | NetSuite vendor internal id, injected from Quoter's vendor config — same on every line. |
| vendorQuote | string·null | The vendor's quote number, repeated on each line. |
| item | null | NetSuite item internal id — always null from Quoter. Resolve it on your side (vpn/mpn lookup) during import. |
3 · Processing for NetSuite
Today reps hand the JSON to your import script via the raw-JSON inspector. The upcoming Create Quote in NetSuite button will POST this exact payload to an endpoint you provide — build your processor against the shape above and nothing changes when the button goes live.
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.