Best Practices for Optimized Processing
Upon completion of this module, you will be able to:
While many performance tips result in minuscule gains, saving just a few milliseconds per workflow execution can significantly improve overall performance when thousands or millions of records are processed across many user sessions.
Poorly designed workflows are the most common cause of performance issues.
Don't try to do too much in any one workflow. Break workflows into smaller processing chunks. Consider the nature of processing and modularize as necessary.
Separate workflow processing between client-triggered and server-triggered initiation. This allows for easier troubleshooting by isolating actions by trigger type.
Use parent workflows to initiate child sub-workflows for additional processing. This provides better control over execution order and facilitates troubleshooting.
Ensure workflows only execute when all conditions are met AND the workflow has something to process. It's better to prevent initiation than to initiate and immediately exit.
Use specific contexts (like CSV Import) to prevent workflow processing on non-targeted records. Only initiate workflows during bulk imports when absolutely necessary.
Using "All" as the trigger type can cause workflows to execute inappropriately. Always select the most appropriate specific trigger: Before Record Load, Before Record Submit, or After Record Submit.
Not specifying event type or context fields may initiate workflows unnecessarily, reducing performance during record load or save events.
Referencing "Old Record" in VALUE FIELD conditions causes the database record to be reloaded during condition evaluation, impacting performance.
Saved search criteria can impact performance on individual actions/transitions. Configure saved searches at workflow initiation level when possible—evaluated once instead of multiple times.
Visual Builder conditions are converted to SQL queries. More related record fields = more complex queries = reduced performance.
Create saved search conditions that only return records the workflow will actually process. Prevent initiating workflows on records that don't need updating.
After processing, ensure record data changes so it no longer meets the saved search criteria. Use status fields when possible to exclude processed records.
Don't filter for records created "in the last 30 minutes." If processing isn't complete before the next scheduler cycle, records may be skipped.
Workflows with scheduled actions wake up every 30 minutes, reload ALL records, and check if actions need execution—even if no action is needed.
When processing multiple workflows at After Record Submit, records are reloaded on the server. A second save event occurs only if a workflow made changes using Set Field Value.
Execute Set Field Value actions at Before Record Submit rather than After Record Submit. This sets values while the record is in memory, avoiding a second database commit.
For fields that are set once and never change, add a condition that checks if the value has changed. This prevents unnecessary save events.
For data-heavy records like Sales Orders and Purchase Orders, the second load and save event can have significant performance impact.
When setting Release Status to "Released," uncheck "Enable Logging" to reduce logging overhead. Error logs are still generated but only display server processing errors.
Always use standard SuiteFlow actions when possible. Only use Workflow Action Scripts when required processing isn't supported by built-in actions.
Workflows wait for scripts to complete (synchronous). Long processing loops or resource-intensive operations will be perceived as slow workflow performance.
For complex batch processing, initiate a scheduled script from the workflow. This runs asynchronously on the server, returning focus to the client immediately.
Use the Application Performance Management SuiteApp to identify bottlenecks in server-side script processing.
| Area | Best Practice | Avoid |
|---|---|---|
| Design | Modular, separated client/server | Monolithic, complex workflows |
| Initiation | Specific triggers and contexts | "All" trigger, no context filter |
| Conditions | Simple conditions, SQL formulas | Old Record refs, complex joins |
| Saved Searches | At initiation level, exclude processed | On individual actions, time-based |
| Set Field Value | Before Record Submit with guards | After Record Submit without guards |
| Logging | Disabled in production | Always enabled |
| Scripts | Built-in actions, async for batch | Long loops, resource-intensive |