Suite Utils
Back to Blog
NetSuite TipsAug 14, 2026 • 6 min read

Restrict User Role from Changing Prices in Sales Orders

Any role with edit access to a sales order can override the price on the line. Here is how to lock the rate field down without blocking the sale.

Ethan James MarshalEthan James MarshalSenior SuiteScript Architect & Lead NetSuite Engineer
Restrict User Role from Changing Prices in Sales Orders
On this page

Sales reps shouldn't always have the final say on pricing. Yet by default, any role with "Edit" access to sales orders can override the item price right on the transaction line. That's how a standard $500 quote becomes a $425 deal without your finance team ever seeing it.

The fix isn't a custom script. NetSuite gives you two native approaches: custom forms with restricted price fields and permission-level adjustments on the role itself. I'll walk through both, plus the edge cases that will bite you if you only do one.

Why the Price Field Is Hard to Lock Down

The price on a sales order line comes from the item record's price level (e.g., "Base Price" or "Preferred Customer"). When a user edits the Rate column on the transaction, they're overriding that price level for that one line. NetSuite's native permission system doesn't have a single "Can't Edit Price" checkbox on a role. As the NetSuite Permissions Overview confirms, permissions govern record types, tasks, and pages, not individual fields on a transaction.

What you do have:

  • Custom transaction forms where you can hide or disable the Rate field
  • Roles that control which forms a user can access
  • Workflows that can revert or validate price changes after submit

The cleanest solution combines the first two. Here's the step-by-step.

Step 1: Create a Custom Sales Order Form Without the Price Column

Go to Customization > Forms > Transaction Forms and click New. Set Module to Sales, Record Type to Sales Order, and give it a name like "Sales Order – No Pricing."

On the Screen Fields subtab, find the Rate field (field ID rate). Uncheck the Show box so it disappears from the line items. Do the same for Amount (amount) if you don't want reps seeing the extended total either.

Here's the gotcha: hiding the field doesn't stop the value from being submitted. If someone edits the underlying record via a different form or a CSV import, the price still changes. The form only controls the interface, not the data integrity.

Step 2: Make the Form "Preferred" and "Restricted" for the Role

Now go to Setup > Users/Roles > Manage Roles and edit the sales rep role. Under Forms > Transaction, find your new custom form. Check Preferred so it loads by default, then check Restricted.

Per NetSuite's Setting Default and Restricted Forms documentation, checking Restricted limits the role to only the forms you mark as preferred. Without that box, a savvy rep can hit the form dropdown and switch back to the standard form that shows the Rate column.

This is the exact pattern NetSuite's own docs describe: the Preferred + Restricted combination forces the user onto the form you control.

Step 3: Handle the Price Level Column

If your account uses price levels (Setup > Accounting > Accounting Preferences > Items/Transactions), the rep might still see a Price Level column on the line items. Even with Rate hidden, they could change the price level dropdown, which recalculates the rate.

Two options:

  1. Hide the Price Level column on the same custom form (uncheck Show for the pricelevel field on the Screen Fields subtab).
  2. If you want them to pick from pre-existing price levels but not type a custom rate, keep the column visible but make it read-only. On the custom form's Screen Fields subtab, uncheck Allow Override for the pricelevel field.

Option 2 is a reasonable middle ground if your business has tiered pricing. Let them choose from approved price levels, but never type a free-form number.

Step 4: Verify the Role Can't Bypass via Item Records

Hiding the field on the transaction form doesn't stop a rep from opening the item record and changing the base price there. If your reps have Edit permission on items, they can still modify pricing globally.

Check the role's permissions under Transactions > Items. If reps shouldn't touch item-level pricing, set Item to View or Create (not Edit). For most sales teams, they should be creating sales orders, not editing the item master.

What About Workflows for Price Validation?

If you need a hard stop on price changes even when someone uses a different form or an integration, a workflow is the reliable path. Create a workflow on the Sales Order record with a beforeSubmit action.

Here's the logic:

  • Trigger: Before Record Submit
  • Condition: The rate field changed from its original value
  • Action: Set the rate back to the original, or throw a validation error

The validation error approach is cleaner because it tells the user why their save failed. Use a Set Field Value action with the error condition, or a Send Custom Event if you want to notify finance.

For the condition, you'll compare rate against the original value. In the workflow's Formula field, something like:

{rate} <> {!rate}

This fires whenever the rate field differs from its pre-edit value. NetSuite retrieves original values before the first Before Submit event executes, so you can reference them directly in your condition. If you want to allow changes under a certain threshold, add that to the formula:

{rate} <> {!rate} AND {rate} > {!rate} * 1.05

That allows a 5% discount but blocks anything deeper.

The Real Fix: Combine Form Restrictions With Role Permissions

Here's the thing: no single setting covers every case. The form hides the field, the Restricted box locks the form, and the role's item permissions prevent backdoor edits. You need all three.

A common mistake is doing only Step 1 and calling it done. Then someone discovers the rep can switch forms, or the rep edits the item record directly, and the price changes anyway. The Preferred + Restricted combination is what actually enforces the form choice, and the item permission check is what stops the backdoor.

Test With a Real Role Before You Roll It Out

Create a test user assigned to the modified role. Log in as that user, create a sales order, and confirm:

  1. The Rate column doesn't appear on line items
  2. The form dropdown is grayed out or missing
  3. Opening an item record shows read-only pricing fields
  4. Submitting the order doesn't trigger any workflow errors

If you have a sandbox account, test there first. If not, do this during off-hours and have an admin ready to revert the role if something breaks.

One more edge case: CSV imports and SuiteScript bypass form restrictions entirely. If you have an integration that updates sales orders, a workflow with the rate-change condition is your only guard. The form is a user-interface control; the workflow is the enforcement layer.

Set up the form restriction for your reps, lock the role to that form, and add the workflow if you need a hard guarantee. That combination covers the interface, the role, and the data layer. Ship it.

About the author

Put these ideas to work.

Suite Utils builds small NetSuite tools that fix the specific thing breaking your day. Each one runs as a native SuiteScript SuiteApp inside your account. No sales call, no onboarding.

Browse the Tools

Enjoyed this one?

Get NetSuite tips like this in your inbox. No spam. Practical guides only.

Keep reading