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.

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:
- Hide the Price Level column on the same custom form (uncheck Show for the
pricelevelfield on the Screen Fields subtab). - 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
pricelevelfield.
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
ratefield 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.05That 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:
- The Rate column doesn't appear on line items
- The form dropdown is grayed out or missing
- Opening an item record shows read-only pricing fields
- 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.


