This article is relevant for NetSuite administrators seeking to produce control saved searches that are clear and actionable. It demonstrates a way to mimic fall-through logic in NetSuite saved search case formulas and also highlights general principles in building NetSuite-based controls.
TL;DR Summary
Controls are important, often overlooked, and not developed to be intelligent. NetSuite saved searches offer a convenient way to build detective controls. Although saved search formula CASE statements do not support fall-through (i.e. matching multiple true branches/conditions), this article demonstrates how to mimic fall-through by concatenating case statements, exposing only the relevant issues in search results where multiple problems could have triggered an alert. The result is more actionable saved search-driven control alerts.
Background
Controls are fundamental to sound system design, yet they are frequently overlooked in NetSuite implementations and ongoing maintenance strategies. The oversight often stems from viewing NetSuite only as an accounting system instead of the central database driving the business. Many organizations focus on transactions, reports, and workflows while assuming that controls will naturally fall into place. In practice, controls require deliberate modeling. Without them, small data quality issues accumulate and undermine confidence in financial reporting and operational processes. By neglecting controls, teams miss the opportunity to prevent errors early, detect problems quickly, and ensure accountability across the organization.
We are strong proponents of using NetSuite as the single source of truth to drive business operations, organize coordinated actions, and streamline other processes related to our client delivery practices. A key part of this strategy is the management of our license-free accelerator templates offered to our clients at no cost and with no recurring fees. These accelerator templates embody the rich intellectual property we have developed over the years as we have repeatedly identified NetSuite platform gaps, solved for them, and packaged our innovations into reusable components. Accelerator templates serve as building blocks for solving new problems without “reinventing the wheel” thereby reducing delivery timelines and costs. Our team and clients love them. However, it takes effort and care to constitute them, manage their distribution, and announce them in a coherent manner via our public-facing websites.
We leverage a custom record in NetSuite called the PRI Application record to capture all relevant information regarding each accelerator template such as the name, what it does, why it matters, version history, links to solution documents and related blog posts or videos. Selected information from these records feeds directly to our public-facing websites through API connections. To maintain trust and credibility, this exposed information must be accurate, complete, and up to date. This is precisely where well-designed controls are essential.
Challenge
In a recent review of our accelerator template publication process with our marketing team, we observed that even though the process is quite streamlined, applications may still get published without all the requisite information for the website.
For example, an accelerator may be missing information about the number of hours it takes to implement, or an end-user-friendly description of what it does (which is deliberately distinguished from the more technical internal description typically aimed at our team members who are versed in NetSuite and our way of working).
The fundamental challenge here concerns data integrity and controls, key components in our work with NetSuite customers.
There are two basic ways we can address the identified data integrity gap:
- Preventive controls: Do not allow incomplete data from being persisted in the database. NetSuite offers several means to implement preventive controls, the simplest being making certain fields mandatory. If the logic is more nuanced, workflows and scripts can be produced to realize the desired outcome. While preventive controls have their place, they can be too restrictive. In the use case we describe below, it was more important to get the application records into the database and incrementally refine them than to prevent persisting records until all the information was available.
- Detective controls: As the name suggests, a detective control allows us to get potentially incomplete data into the system and subsequently raise control alerts that users can act on to refine and enrich the data. Saved searches are a common means for building detective controls in NetSuite, often incorporating the scheduled email alerts feature to deliver periodic alerts to target users. In this configuration, users don’t have to poll the system to see if anything is wrong. Instead, they can rely on receiving emails only when there are issues.
Solution: A Saved-Search-Based Detective Alert
We created a detective control saved search that would alert us and the marketing practice if any of the published accelerator templates was missing a key piece of information required for proper website presentation. Since the website presentation is driven completely by the data in NetSuite, it was sufficient to base the control on the source (NetSuite) as opposed to the presentation channels (website, blog, etc.). This highlights the power of a centrally-managed data architecture.
The control saved search fired a few times, and the marketing team reported that alerts continued even after they made changes to the records. It was not clear to them what needed to be fixed. This is an example of a detective control that is not quite actionable because it was producing confusion instead of results.
To address this new challenge, we decided to add an “Issues” column in the search results that would clearly indicate what needs to be fixed for each entry. As there could be multiple issues per row, we wanted the column to expose all the issues without being too verbose.
CASE Statements in NetSuite Search Formulas Do Not Support Fall-through
The CASE statement in NetSuite saved search formulas offers a convenient way to produce a series of if-else statements. The syntax is simple (note that there is an alternative syntax with the same outcome):
CASE
WHEN <condition1> THEN <outcome1>
WHEN <condition2> THEN <outcome2>
WHEN <condition3> THEN <outcome3>
ELSE <fallback>
END
In my initial pass, I produced this case statement:
'<li>Hours to Implement: '
||
CASE
WHEN {custrecordpri_application_hrs_implement} IS NULL OR {custrecordpri_application_hrs_implement} < 0 THEN 'NEGATIVE OR EMPTY (NOK)'
ELSE 'POPULATED (OK)'
END
||
'</li><li>Why it Matters: '
||
CASE
WHEN {custrecordpri_application_why_matter_l} IS NULL THEN 'EMPTY (NOK)'
ELSE 'POPULATED (OK)'
END
||
'</li><li>Description Promotion: '
||
CASE
WHEN {custrecord_pri_application_description_c} IS NULL THEN 'EMPTY (NOK)'
ELSE 'POPULATED (OK)'
END
||
'</li><li>What it Does: '
||
CASE
WHEN {custrecordpri_application_what_it_does_l} IS NULL THEN 'EMPTY (NOK)'
ELSE 'POPULATED (OK)'
END
||
'</li>'
I applied this formula to a Formula (HTML) field in my control search results.
Effectively, I produced a bullet list by concatenating a series of case statements using the string concatenation operator (||).
Here’s the outcome:
While this approach works and makes it easier to identify what is wrong, it is still verbose. Ideally, what I want is to expose only the highlighted bullets as they represent the actual issues.
Mimicking Fall-through in NetSuite Search Formula CASE Statements
The equivalent of a CASE statement in a language like JavaScript is the SWITCH statement. JavaScript switch statements support a concept known as fall-through. By omitting the break statement, we can cause multiple conditions/cases in a switch statement to be evaluated.
switch (<expression>) {
case <value1>
<output1>
break; // Without this break, subsequent cases will be evaluated as well, resulting in a fallthrough behavior.
case <value2>
<output2>
break;
END
This is exactly what I needed but it turns out that CASE statements in NetSuite saved search formulas do not support fall-through.
When a CASE statement encounters a WHEN clause whose condition is met (or whose WHEN operand matches the CASE operand in a simple CASE statement), the corresponding THEN block is executed, and the entire CASE statement terminates immediately.
Subsequent WHEN clauses are not evaluated or executed.
Despite this limitation, there is a simple workaround to mimic fall-through behavior by combining multiple case statements with the “||” operator and ensuring that only the issues produce a bullet in our output HTML column. Here’s the refined formula:
NVL(
CASE WHEN {custrecordpri_application_hrs_implement} IS NULL OR {custrecordpri_application_hrs_implement} < 0 THEN '<li>Hours to Implement: NEGATIVE OR EMPTY (NOK)</li>' ELSE '' END
||
CASE
WHEN {custrecordpri_application_why_matter_l} IS NULL THEN '<li>Why it Matters: EMPTY</li>'
ELSE ''
END
||
CASE
WHEN {custrecord_pri_application_description_c} IS NULL THEN '<li>Description Promo: EMPTY</li>'
ELSE ''
END
||
CASE
WHEN {custrecordpri_application_what_it_does_l} IS NULL THEN '<li>What it Does: EMPTY (NOK)</li>'
ELSE ''
END,
'Unclear what the issue is; please review the search criteria and update this logic accordingly')
I concatenated independent case blocks as before but moved the HTML output into the case statements. Each case block either produces a bullet if there is an issue or an empty string if no issue. Since empty strings have no effect on the output, we end up with a bullet list that only exposes the real issues, as illustrated below. Finally, I wrapped the entire formula in an NVL() so if new conditions are added in the future, we will gracefully fail with a clear message indicating how to recover.
Key Takeaways
This article highlights a technique to mimic fall-through logic in saved search CASE statements, but the lessons are broader. Controls are not just about clever formulas. They ensure clarity, accountability, and confidence in your system. Effective controls reinforce trust in both data and process. They allow executives to rely on NetSuite as more than an accounting system; they turn it into a platform for managing business integrity. Our approach emphasizes competence and transparency, offering clients proven algorithms and intellectual property without license fees or recurring costs. Here are some key principles to takeaway:
-
- An architecture that positions NetSuite as the single source of truth creates stronger control and reporting structures.
-
- Actionable controls matter. Alerts should tell users exactly what needs attention, not leave them guessing.
-
- Choosing between preventive and detective controls is a strategic decision. Both have value, but which one you use depends on the business scenario.
-
- When standard features impose limits, rethink the problem. Often, a creative approach results in a workable solution.
-
- End users must always be considered. A control that confuses or frustrates will not achieve its purpose.
If you found this article relevant, feel free to sign up for notifications to new articles as we post them. If you are ready to use NetSuite saved search formulas to produce actionable controls that prevent errors and ensure accountability across your organization, let’s have a conversation.






Great article Chidi – look forward to seeing more from you!
Thank you Chidi, this is fantastic.
Question on the NVL() wrap. If all checks are coming back as okay, and we have nothing to write our in the bulletpoints, woundn’t that cause the NVL to ultimately give us the ‘Unclear’ error?
I may have missed a bit on this, could you clear it up for me please? Thanks.
Hi Csaba, I’m glad you’ve found this approach helpful. To your question, recall that the aim here is to produce clarity *when* we know that there’s an issue. Thus, the search criteria should be such that rows that have no issues do not show up in the first place. Thus, if you hit the fallback message, it would indicate something wrong with the search criteria or new exceptions that are not covered in the case statement. Does that make sense?