Detect unsafe contexts, queries in loops, hardcoded IDs, and more to optimize Salesforce Flows
Table of contentsUsageLightning Flow Scanner VSX is plug-and-play. Open any project with flows and use our side bar or the Command Palette and type
Privacy: Zero user data collected. All processing is client-side. → See our Security Policy.
Default Rules📌Tip: To link directly to a specific rule, use the full GitHub anchor link format. Example: https://flow-scanner.github.io/lightning-flow-scanner/#unsafe-running-context
ProblemsThese rules detect anti-patterns and unsafe practices in your Flows that could break functionality, compromise security, or cause deployment failures. DML Statement In A LoopExecuting DML operations (insert, update, delete) inside a loop is a high-risk anti-pattern that frequently causes governor limit exceptions. All database operations should be collected and executed once, outside the loop. Rule ID: Hardcoded IdAvoid hard-coding record IDs, as they are unique to a specific org and will not work in other environments. Instead, store IDs in variables—such as merge-field URL parameters or a Get Records element—to make the Flow portable, maintainable, and flexible. Rule ID: Hardcoded Secret
Avoid hardcoding secrets, API keys, tokens, or credentials in Flows. These should be stored securely in Named Credentials, Custom Settings, Custom Metadata, or external secret management systems. Rule ID: Hardcoded UrlAvoid hard-coding URLs, as they may change between environments or over time. Instead, store URLs in variables or custom settings to make the Flow adaptable, maintainable, and environment-independent. Rule ID: Process BuilderProcess Builder is retired. Continuing to use it increases maintenance overhead and risks future compatibility issues. Migrating automation to Flow reduces risk and improves maintainability. Rule ID: SOQL Query In A LoopRunning SOQL queries inside a loop can rapidly exceed query limits and severely degrade performance. Queries should be executed once, with results reused throughout the loop. Rule ID: Unsafe Running ContextFlows configured to run in System Mode without Sharing grant access to all data, bypassing user permissions. Avoid this setting to prevent security risks and protect sensitive data. Rule ID: Duplicate DML OperationWhen a Flow performs database operations across multiple screens, users navigating backward can cause the same actions to run multiple times. To prevent unintended changes, either restrict backward navigation or redesign the Flow so database operations execute in a single, forward-moving step. Rule ID: Missing Fault PathElements that can fail should include a Fault Path to handle errors gracefully. Without it, failures show generic errors to users. Fault Paths improve reliability and user experience. Rule ID: Missing Null HandlerGet Records operations return null when no data is found. Without handling these null values, Flows can fail or produce unintended results. Adding a null check improves reliability and ensures the Flow behaves as expected. Rule ID: Recursive After UpdateAfter-save Flows that update the same record can trigger recursion, causing unintended behavior or performance issues. Avoid updating the triggering record in after-save Flows; use before-save Flows instead to prevent recursion. Rule ID: SuggestionsThese rules highlight areas where Flows can be improved. Following them increases reliability and long-term maintainability. Action Call In A LoopRepeatedly invoking Apex actions inside a loop can exhaust governor limits and lead to performance issues. Where possible, bulkify your logic by moving the action call outside the loop and passing a collection variable instead. Rule ID: Get Record All FieldsAvoid using Get Records to retrieve all fields unless necessary. This improves performance, reduces processing time, and limits exposure of unnecessary data. Rule ID: Inactive FlowInactive Flows should be deleted or archived to reduce risk. Even when inactive, they can cause unintended record changes during testing or be activated as subflows. Keeping only active, relevant Flows improves safety and maintainability. Rule ID: Invalid API Version
Flows running on outdated API versions may behave inconsistently when newer platform features or components are used. From API version 50.0 onward, the API Version attribute explicitly controls Flow runtime behavior. Keeping Flows aligned with a supported API version helps prevent compatibility issues and ensures predictable execution. Rule ID:
Missing Filter Record Trigger
Record-triggered Flows without filters on changed fields or entry conditions execute on every record change. Adding filters ensures the Flow runs only when needed, improving performance. Rule ID: Same Record Field UpdatesBefore-save Flows can safely update the triggering record directly via $Record, applying changes efficiently without extra DML operations. Using before-save updates improves performance Rule ID: Cognitive Complexity
Flows with deeply nested loops and decisions are hard to understand. Unlike cyclomatic complexity which counts paths, cognitive complexity penalizes nesting depth. Consider extracting nested logic into subflows. Rule ID:
Excessive Cyclomatic ComplexityHigh numbers of loops and decision elements increase a Flow's cyclomatic complexity. To maintain simplicity and readability, consider using subflows or splitting a Flow into smaller, ordered Flows. Rule ID:
Missing Trigger OrderRecord-triggered Flows without a specified Trigger Order may execute in an unpredictable sequence. Setting a Trigger Order ensures your Flows run in the intended order. Rule ID: Record ID as String
Flows that use a String variable for a record ID instead of receiving the full record introduce unnecessary complexity and additional Get Records queries. Using the complete record simplifies the Flow and improves performance. Rule ID: Transform Instead of Loop
Loop elements that perform direct Assignments on each item can slow down Flows. Using Transform elements allows bulk operations on collections, improving performance and reducing complexity. Rule ID: LayoutFocused on naming, documentation, and organization, these rules ensure Flows remain clear, easy to understand, and maintainable as automations grow. Flow Naming ConventionUsing clear and consistent Flow names improves readability, discoverability, and maintainability. A good naming convention helps team members quickly understand a Flow's purpose—for example, including a domain and brief description like Service_OrderFulfillment. Adopt a naming pattern that aligns with your organization's standards. Rule ID:
Missing Flow DescriptionFlow descriptions are essential for documentation and maintainability. Include a description for each Flow, explaining its purpose and where it's used. Rule ID: Missing Metadata Description
Elements and metadata without a description reduce clarity and maintainability. Adding descriptions improves readability and makes your automation easier to understand. Rule ID: Unclear API NameElements with unclear or duplicated API names, like Copy_X_Of_Element, reduce Flow readability. Make sure to update the API name when copying elements to keep your Flow organized. Rule ID: Unreachable Element
Unconnected elements never execute and add unnecessary clutter. Remove or connect unused Flow elements to keep Flows clean and efficient. Rule ID: Unused Variable
Unused variables are never referenced and add unnecessary clutter. Remove them to keep Flows efficient and easy to maintain. Rule ID: Missing Auto Layout
Auto-Layout automatically arranges and aligns Flow elements, keeping the canvas organized and easier to maintain. Enabling it saves time and improves readability. Rule ID: System (subcategory)System rules are a subset of Layout rules that detect structural issues normally prevented by the Flow Builder UI. See System Rules Documentation for the full list. ConfigurationIt is recommend to configure and define:
Most distributions automatically load configuration from:
Configure RulesBy default, all default rules are executed. You can customize individual rules and override the rules to be executed without having to specify every rule. Below is a breakdown of the available attributes of rule configuration:
Configure SeverityAvailable values for severity are
Customize RulesSome rules are configurable and allow overriding their default expressions, or setting a threshold as shown in the examples below.
Customize Rule MessagesIf not provided,
Disable RulesTo disable a rule, set
Define ExceptionsDefining exceptions allows you to exclude specific scenarios from rule enforcement. Exceptions can be specified at the flow, rule, or result level to provide fine-grained control. Below is a breakdown of the available attributes of exception configuration:
Example
Exclude FlowsExclude by File Path (Node.js only)Use glob patterns to exclude flows based on their file system location. This is useful for excluding entire directories or specific name patterns:
Environment compatibility: requires Node.js(file system access) and is not available when using the Core Library in browser/web environments. Exclude by Flow API Name (Browser-compatible)Exclude specific flows by their unique API names, regardless of their location. This is particularly useful for:
Environment compatibility: works in all environments including Node.js and browser/web distributions, as it operates on parsed flow data rather than file system paths. Scan OptionsSeverity ThresholdOnly report on violations at or above a chosen severity level:
Filter by categoryRestrict the scan to specific categories of rules:
Beta ModeNew rules are introduced in Beta mode before being added to the default ruleset. To include current Beta rules, enable the optional betamode parameter in your configuration:
Rule ModeBy default, Lightning Flow Scanner runs all default rules and merges any custom configurations you provide. If instead, you want to run only the rules you explicitly specify, use:
Installation
To install via CLI (VS Code)
Development
|