top of page

Your Integration isn't broken. It's failing quietly.

Writer: Tracey Wisner
Tracey Wisner
Sep 3
4 min read

Most teams find out an integration is broken because somebody complains. An invoice didn't send. A payment didn't post. A customer called about a statement they never got. The complaint is the alert, and the error log is where you go to confirm what you already suspect.


That works right up until the day the log is empty and the thing is still wrong.


So here's what that looks like, what it isn't, and what I'd do about it.


The clean log that wasn't

A user event script went live in a production account recently when it should have been switched off. It sat there for days. The execution log had nothing in it. No errors, no warnings, nothing at all. By the usual standard that's a healthy script.


It wasn't healthy. It was running on every qualifying record and accomplishing nothing.


The script's first move was to look up a custom field on the customer record. That field hadn't been built yet, because it wasn't part of the bundle and somebody had to create it by hand. The lookup didn't throw. It returned nothing. The code took that as "no state found," fell through to its fallback search, found no rows there either, returned null, and hit an early return on the next line.


Clean exit. Every time. No log entry, because nothing went wrong by the code's own definition.


Why this is worse than a crash

A crash is information. It has a timestamp, a stack, a record id, and a number of occurrences. You can scope the blast radius in about ten minutes.


Silence has none of that. And silence is ambiguous in the worst possible way, because it's produced by two completely different states:


  • The script is off and never ran.

  • The script is on, ran constantly, and did nothing every time.


You cannot tell those apart from the log, and the difference matters enormously. One is a configuration you chose. The other is a script quietly touching production records with logic that isn't finished. If the missing field gets created next week by somebody doing unrelated cleanup, the second one wakes up and starts writing.


The pattern underneath

This isn't really about one script. It's a category, and once you see it you'll find it everywhere in a mid market stack.


A scheduled import that finds an empty folder and logs a successful run. A saved search feeding a workflow that quietly returns zero results after somebody edits a filter. An integration user whose permissions got trimmed, so the query comes back empty instead of denied. A dunning process excluding every invoice because a checkbox on the invoice type is unset.


All of them succeed. All of them do nothing. None of them tell you.


Fail closed is the right default, and that's the problem

None of the code above is badly written. Returning early when there's no state to act on is correct. Not throwing on a missing lookup is defensive. Fail closed beats fail open when you're touching financial records, and I'd write it the same way.


The gap isn't in the code. It's that nobody decided in advance what "no activity" should mean, so there's no test that can fail.


What a control actually requires

A control needs three things, and monitoring on its own gives you one:


An expected state. Written down before go live, not reconstructed after. What should be deployed, at what status, with which dependencies present. This is the part people skip because it feels like paperwork until the first time it saves you a day.


A signal on the null path. If your script exits early, log the fact that it exited early. One line, at audit level. Not an error, just a record that the code got there and chose to stop. Now "off" and "running and finding nothing" look different in the log, which was the whole problem.


A number you expect to see. If the nightly job should touch somewhere between forty and four hundred records, then zero is an exception and so is four thousand. Absence only becomes evidence when you've said in advance what presence looks like.


What to do this week

Pick one scheduled or event driven process that touches money. Just one. Then answer three questions about it.


If it ran last night and did nothing, would you know? If the answer is no, add a single audit log line on the early return path.


What's the normal record count for a healthy run? If nobody knows, pull the last thirty days and find out. That range is your control.


What does it depend on that isn't in your deployment? Roles, accounts, templates, custom fields, list values. Write them down with what breaks if each one goes missing. That list is worth more than the deployment notes.


Then do the next process next week. This isn't a project. It's a habit, and it costs about an hour per process.


The goal isn't to eliminate silent failure. You can't. The goal is to make silence mean something specific, so that when you look at an empty log you know which of the two stories you're looking at.



Cobblestone Group helps mid market finance teams get their NetSuite working the way they thought it already did. If you want a second set of eyes on a process that's been quiet a little too long, reach out at (303)720-3592.

Recent Posts

See All
The Collections Stack You Can Build Inside NetSuite

THE PROJECT This summer another NetSuite firm brought me in to work on their own accounts receivable. The brief was rough guidelines around the functionality they wanted to see; the design was mine. W

 
 
 

Comments


bottom of page