Tips, fixes & use cases
Real NetSuite problems — what the logs showed, the theory that turned out to be wrong, and what actually fixed it. Scroll for everything; each one opens in full.
-
The freight you quoted versus the freight you paid
Across thirty thousand SKUs item dimensions are never perfect, and the gap becomes shipping margin you lose one order at a time. Detecting it is the easy half; feeding the dimension errors back is what actually fixes it.
-
An ISO 20022 pain.001 file the bank accepts first time
Double-escaped entities, SWIFT character stripping, 35/140 truncation, BIC fallback — and the currency trap that overpays vendors by the FX rate without ever throwing an error.
-
ACH addenda: telling the vendor what you just paid them for
Adding a 705 addenda record is one line. Keeping the file from being rejected afterwards is the work — and the bigger prize is that paying and recording stop being two separate steps.
-
Stopping the work order cascade
A special-order item generated work orders all the way down the BOM — for subassemblies already on the shelf. The fix is one field. The three traps in getting it to stick are the interesting part.
-
MISSING_PDF_PARAMETERS when the template was never set
The error names your parameters. The parameters are fine — setTemplateByScriptId failed silently on a case mismatch four lines earlier, and a fallback path hid it for weeks.
-
Is the error you’re chasing the cause, or just a symptom?
An integration failure that looked like a payment script bug. Undeploying the script changed nothing — and that five-minute test reframed the whole investigation.
-
Reading a NetSuite stack trace
UNEXPECTED_ERROR is NetSuite saying it doesn’t know either. How to work backwards to the line that actually broke — and why the page came back full of zeroes instead of failing.
-
Fixing “(intermediate value).warn is not a function” in SuiteScript
It looks like a logging problem. It’s a mismatch between your define() array and your callback parameters — and the reason it appeared out of nowhere is worth knowing.
-
MAP_REDUCE_ALREADY_RUNNING is not an error — it’s a queue
Surfacing it to the user as a failure is the bug. The records are already stored; summarize() picks them up.
-
Sourced line fields print blank in a rendered PDF
A sourced column doesn’t recompute when the record is a render data source. Resolve it yourself and inject it.