How-toOracle NetSuiteApproval Routing / Workflows

How to Set Up Approval Routing in NetSuite

Question
how to set up approval routing in NetSuite

Also searched as

  • NetSuite purchase order approval workflow setup
  • NetSuite expense report approval routing
  • NetSuite multi-level approval limits configuration
  • NetSuite vendor bill approval routing how to

Short answer

NetSuite offers two approval routing paths: native transaction approval (Enable Features > Transaction approvals, then per-employee Approval Limit and Purchase Approval Limit fields) for simple single-approver chains, and SuiteFlow (Customization > Workflow > Workflows) for multi-step, condition-based, or parallel approval routing with escalation and notification logic.

Applies to: NetSuite native approval routing (Purchase Order, Expense Report, Vendor Bill) and SuiteFlow custom workflows, all editions with the relevant approval feature enabled

How to configure approval routing

  1. 1For native routing, enable Setup > Company > Enable Features > Employees tab, check Purchase Approvals or Expense Report Approvals as needed.
  2. 2Set each employee's approval authority on their employee record's Human Resources or Approval subtab: Purchase Approval Limit for POs, Approval Limit for expense reports.
  3. 3Assign each employee a Supervisor on the employee record, since native routing sends transactions up the supervisor hierarchy until an approver with sufficient limit is found.
  4. 4For anything beyond a straight hierarchy (parallel approvals, department-based routing, amount tiers spanning multiple approvers, conditional routing by subsidiary or class), build a SuiteFlow workflow instead under Customization > Workflow > Workflows > New.
  5. 5In SuiteFlow, set the workflow's record type (Purchase Order, Vendor Bill, Expense Report, or any record), trigger (Before Record Submit or After Record Submit), and add states representing Pending Approval, Approved, Rejected.
  6. 6Add Action items per state: Set Field Value to change the approval status field, Send Email for notifications, and transitions with conditions (e.g. total > 10000) that route to different next states or approver fields.
  7. 7Use a Workflow Action Script (custom SuiteScript) inside the workflow when routing logic needs data not available to no-code conditions, such as looking up a department's approver from a custom setup record.
  8. 8Test with Release Status set to Testing first, running transactions through every branch (approve, reject, escalate) before setting Release Status to Released.

Native approval vs SuiteFlow

Native transaction approvals are fast to configure and sufficient when approval is a simple amount-based hierarchy: an employee's manager approves up to their limit, and it escalates up the supervisor chain until someone's limit covers the transaction total. It has no support for parallel approvers, department-specific routing, or custom notification logic beyond NetSuite's built-in approval emails.

SuiteFlow is the right tool once approval needs branch by criteria other than a simple amount and supervisor chain: routing purchase orders by department to a department head regardless of reporting line, requiring two parallel sign-offs above a threshold, or adding a finance review step only for certain subsidiaries.

Building a SuiteFlow approval workflow

A typical approval workflow has states for Pending Approval, Approved, and Rejected, with the transaction's approval status field (native Approval Status list field, or a custom field) transitioning between them via button actions the approver clicks (Approve, Reject) exposed on the transaction form.

Button actions on a workflow state are added as a Button custom action; the approver sees an Approve/Reject button directly on the transaction record when it is in the Pending Approval state and they have permission, avoiding the need for a separate approval queue UI.

// Workflow condition example: route to CFO above threshold
Condition: {custbody_total_amount} > 25000
Action: Set Field Value -> nextapprover = CFO employee record
Action: Send Email -> template: PO Escalation Notice

Dynamic approver lookup

When approvers depend on department, subsidiary, or a project's assigned manager rather than a fixed supervisor chain, a Workflow Action Script (SuiteScript executed as a workflow action) can query a custom setup record mapping department to approver and set the next approver field dynamically, something no-code workflow conditions cannot do on their own.

Keep this lookup logic in one reusable script deployed to multiple workflows rather than duplicating condition trees across the PO, vendor bill, and expense report workflows separately, so a change to the approval matrix only needs a data update, not a workflow redesign.

Notifications and escalation

Send Email actions on state entry cover most notification needs; pair them with a Set Field Value that stamps a Sent Date so a scheduled script can find transactions pending more than N days and escalate or resend a reminder, since SuiteFlow itself has no native time-based escalation trigger beyond a Scheduled workflow trigger on the record.

A Scheduled (not Record-triggered) workflow can run daily against a saved search of overdue pending approvals and force-transition or notify, which is the standard pattern for building escalation into NetSuite approval routing.

Common pitfalls

  • !Relying on native approval limits when routing actually needs department- or subsidiary-based logic, then discovering the supervisor hierarchy does not match the real approval matrix.
  • !Forgetting to set Purchase Approval Limit or Approval Limit on every employee in the chain, which silently blocks escalation at whichever level has no limit set.
  • !Building a SuiteFlow approval workflow without a Rejected state and a clear way to return the record to the requester, leaving rejected transactions in limbo.
  • !Not testing parallel or multi-branch approval paths before release, so an edge case (e.g. a $0 PO, or a PO with no assigned department) falls through with no valid transition.
  • !Hardcoding an approver's internal ID in a workflow condition instead of looking it up dynamically, breaking routing the moment that employee record is deactivated or replaced.
  • !Mixing native approval fields and a custom SuiteFlow approval status field on the same record type, causing two approval mechanisms to conflict.

How an ERP-grounded AI assistant handles this

ERPray, grounded on your NetSuite approval workflow definitions and employee approval limits, can trace why a specific transaction is stuck pending, identify the exact state and missing condition blocking it, and answer questions like which approvers currently have authority over a given department's purchase orders, without you opening the SuiteFlow editor and manually walking the state diagram.

Frequently asked questions

Can native approval and SuiteFlow approval routing run on the same record type together?

It is possible but not recommended; having both native transaction approval and a custom SuiteFlow workflow acting on the same approval status field creates conflicting logic. Most implementations pick one mechanism per transaction type.

How do I let an approver delegate approvals while out of office?

NetSuite has no native delegate-approval feature; the common pattern is a workflow condition or script that checks an Out of Office custom field on the employee record and routes to a backup approver, or simply granting the backup approver equivalent permissions temporarily.

Why is my PO stuck in Pending Approval with no approve button visible?

Usually a permissions gap: the logged-in user does not have the role permission for the workflow's button action, or the workflow condition that should show the Approve button (e.g. matching them as the current approver) is not evaluating true for that record.

Can approval routing differ by subsidiary in a OneWorld account?

Yes, by adding a subsidiary condition to the SuiteFlow workflow's transitions or by deploying separate workflows scoped to specific subsidiaries under the workflow's Subsidiaries restriction on the Workflow record.

Related

How-to

How to build a workflow in NetSuite with SuiteFlow

Go to Customization > Workflow > Workflows > New, pick the record type and select Server, Client, or both as the trigger context, then build states and transitions on the workflow diagram, attaching actions (Set Field Value, Send Email, Create Record, Custom Action Script) to each state or transition. Release the workflow (top right dropdown, Testing to Released) once validated, since a workflow left in Testing only fires for the workflow owner.

How-to

How to Set Up Revenue Recognition With NetSuite ARM

NetSuite Advanced Revenue Management (ARM) recognizes revenue on a schedule independent of invoicing by generating a Revenue Element from each transaction line, applying a Revenue Recognition Rule to determine timing, and optionally allocating revenue across performance obligations using Standalone Selling Price (SSP). Setup requires enabling the ARM feature, defining recognition rules, and mapping item revenue categories before transactions start generating revenue plans.

How-to

How to Build NetSuite Dashboards and KPI Scorecards

NetSuite dashboards are assembled from portlets (KPI, KPI Scorecard, List, Trend Graph, Report Snapshot) added via Personalize Dashboard, where KPI portlets show a single metric with a comparison period and KPI Scorecards show a table of multiple KPIs across time periods and can be published to a role for standardized reporting.

How-to

How to run intercompany transactions in NetSuite (OneWorld)

Enable the Intercompany Framework and Automated Intercompany Management features (Setup > Company > Enable Features > Company), then create an Intercompany Sales Order or Purchase Order between two subsidiaries in the same NetSuite account; NetSuite auto-generates the matching intercompany transaction on the counterparty subsidiary and posts the elimination journal entries during period close if Advanced Intercompany Journal Entries is also enabled.

Error fix

Fix NetSuite SSS_USAGE_LIMIT_EXCEEDED Error

SSS_USAGE_LIMIT_EXCEEDED fires when a SuiteScript execution consumes all the governance units (usage points) allotted to its script type before it finishes. Fix it by checking runtime.getCurrentScript().getRemainingUsage() before expensive calls, yielding or rescheduling in Scheduled scripts, and moving heavy record-count work into Map/Reduce, which yields automatically across stages.

Error fix

Fix NetSuite INVALID_FLD_VALUE Error

INVALID_FLD_VALUE means NetSuite rejected a value you tried to set on a field because it does not match the field's expected type, list option, or reference record. Fix it by confirming the internal ID or text value actually exists on that field's source list and matches the field's value type (text versus list versus record reference) before setting it.

AI for ERP

AI for NetSuite, Beyond the Built-In Text Tools

NetSuite's built-in AI covers text generation, not grounded answers on your own data. See how a private LLM over SuiteQL adds real Q&A and controls.

AI for ERP

AI agents for NetSuite manufacturing operations

AI agents for NetSuite manufacturing: WIP tracking, routing exceptions, and work order status grounded in SuiteQL, with human approval on anything that writes back.

Stuck on Oracle NetSuite?

Talk to engineers who work inside Oracle NetSuite every week, and who build private AI that answers these questions from your own ERP data.