Complete Visual Blueprints for Building Advanced Workflows
Automatically sends reminder emails when a record has been waiting for approval too long, then auto-rejects if no action is taken within the SLA window.
| Setting | Value | Why |
|---|---|---|
| Delay (Reminder 1) | 2 Days | First nudge after 48 hours |
| Delay (Final Warning) | 4 Days | Escalation before auto-reject |
| Delay (Auto-Reject) | 5 Days | SLA deadline enforcement |
| Recurrence | 0 | One-time execution per action |
Scheduled transitions use the Scheduled trigger type, NOT a server trigger + delay. The workflow scheduler (runs every 30 min) evaluates and executes these automatically.
A Customer workflow creates a Task record and then waits. When the Task is marked complete, the Customer workflow automatically transitions to the next state.
| Component | Configuration |
|---|---|
| Custom Field | custentity_created_task (Integer) on Customer record |
| Create Record | Store Result In β custentity_created_task |
| Subscribe to Record | Monitor: Create Record Result |
| Transition Condition | Joined field: Task.Status = Completed |
The TRANSITION ON field must be blank when using Subscribe to Record. The transition fires when the subscription condition evaluates true, not on a trigger event.
Use SQL formulas for calculations, concatenations, and conditional logic in workflow actions and conditions on server triggers.
{custrecord_salary} * 1.05
Multiplies current salary by 1.05
{city} || ', ' || {state} || ' ' || {zipcode}
Result: "Austin, TX 78701"
SUBSTR({email}, INSTR({email}, '@') + 1)
Extracts "company.com" from email
NVL({discount}, 0)
Returns 0 if discount is null
| Function | Purpose | Example |
|---|---|---|
| || | Concatenate strings | {first} || ' ' || {last} |
| SUBSTR() | Extract substring | SUBSTR({phone}, 1, 3) |
| INSTR() | Find position | INSTR({email}, '@') |
| NVL() | Handle nulls | NVL({discount}, 0) |
| UPPER() / LOWER() | Change case | UPPER({name}) |
| LENGTH() | String length | LENGTH({phone}) > 10 |
| TO_CHAR() | Format number/date | TO_CHAR({amount}, '999,999') |
| CASE WHEN | Conditional logic | CASE WHEN {x}='A' THEN 'Yes' END |
SQL formulas only work on server triggers (Before/After Record Submit, Before Record Load). For client triggers, use SuiteScript 1.0 formulas with nlapiGetFieldValue() instead. Mismatched formula/trigger types show "ERROR: Invalid expression" in logs.
Extend SuiteFlow with custom SuiteScript logic when built-in actions don't meet requirements. Returns a value the workflow can use for subsequent decisions.
File Cabinet β SuiteScripts
Script Type: Workflow Action
Status: Released
Custom Action β Select
| Context Property | Description |
|---|---|
| scriptContext.newRecord | The record being processed |
| scriptContext.oldRecord | Previous record version (on edit) |
| scriptContext.workflowId | Internal ID of the workflow |
| scriptContext.type | Event type (create, edit, etc.) |
| return value | Passed back to workflow for conditions |
Workflows wait synchronously for scripts to complete. For long-running operations, initiate a Scheduled Script instead to process asynchronously and return control to the user immediately.
Execute a workflow ONLY when records are imported via CSV, not when created through the UI. Useful for tagging imported records or applying import-specific processing.
β Uncheck "Run Server SuiteScript and Trigger Workflows"
β Check "Run Server SuiteScript and Trigger Workflows"
Workflow runs only for this import
| Setting | Location | Value |
|---|---|---|
| Global Preference | Setup β Import/Export β CSV Import Preferences | Disabled |
| Per-Import Override | Import Assistant β Advanced Options | Enabled |
| Workflow Context | Workflow Definition β Contexts | CSV Import |
The Context field acts as a filter. Even with "All" trigger type, the workflow only fires when the record is created in the specified context. Records created via UI will NOT trigger this workflow.
A secondary workflow triggers when ANOTHER workflow sets a field value. Creates a task for the supervisor and notifies the employee when their review is rejected.
Set Field: Status = Rejected
Triggers on UES Context
Notify supervisor & employee
| Requirement | Setting |
|---|---|
| Execute As Admin | β Must be enabled for UES context |
| Release Status | Released (required for UES context) |
| Initiation Condition | Approval Status = Rejected |
| Context | User Event Script |
The "User Event Script" context means the workflow triggers when ANOTHER script or workflow modifies the recordβnot from user UI actions. This enables workflow chaining where one workflow's Set Field Value action triggers another workflow.
Build custom NetSuite pages that interact with workflows programmatically. Process bulk approvals or initiate workflows on-demand without opening individual records.
Starts a NEW workflow instance on a record (like Initiate Workflow action)
Use case: Apply 5% bonus to eligible records
Wakes up an EXISTING workflow and simulates a button click
Use case: Bulk approve records waiting in State 1
Action dropdown + Multi-selects
Eligible for Bonus / Outstanding Approvals
workflow.initiate() - 5% Bonus
workflow.trigger() - Approve
| Component | Configuration |
|---|---|
| Suitelet Script | @NScriptType Suitelet, onRequest function |
| Script Parameters | Record Type, Workflow ID, Button ID (configurable) |
| Deployment Link | Setup β Custom β [Menu Name] |
| Saved Search 1 | Performance Reviews with Rating Code = A |
| Saved Search 2 | Reviews in State 1 with Approve Button visible |
workflow.initiate() = Start fresh workflow. workflow.trigger() = Wake up existing workflow + click button. In the execution log, you'll see "Workflow triggered to process transition by click on button [name]".
Process multiple records with running workflow instances simultaneously. Initiate, process, cancel, or force-transition workflows in bulk based on saved search criteria.
Start workflow on multiple records without opening each one
Use case: After CSV import, initiate approval workflow on all imported records
Re-evaluate transitions or simulate button click
Use case: Bulk approve all records waiting in "Pending Approval" state
Cancel running workflow instances
Use case: Cancel obsolete workflows after process change
Force transition to ANY state (bypass normal path)
Use case: Move accidentally rejected records back to approval state
Lists β Mass Update β Mass Updates β Workflows β [Record Type] β [Workflow Name]
Same as saved search
Creates saved mass update
Run during off-peak hours
Process matching records
| Update Type | When to Use | Permission |
|---|---|---|
| Initiate | Start workflow on records without opening each one | Standard |
| Process | Simulate button click or re-evaluate transitions | Standard |
| Cancel | Stop workflows that are stuck or no longer needed | Admin Only |
| Transition | Fix records in wrong state or stuck workflows | Standard |
Process vs Transition: Process follows the normal workflow path (next state). Transition can jump to ANY state, even backwards. Use Transition for error recovery; use Process for bulk automation.