Margin Exceptions for NetSuite
Every ticket in NetSuite written below the margin floor, every price override and every quote a cost change flipped, listed nightly by rep with the reason asked. Your sales manager decides what stands.
Sales & estimatingUpdated Oct 202620 ERPs
See it work on NetSuite.
Click through the steps. Fictional data, in NetSuite’s terms; the real thing runs on NetSuite.
| Rep | Ticket | Customer | Line | Margin | Reason |
|---|---|---|---|---|---|
| Mike Brennan | INV204317 | Westfield Masonry | Type S mortar · 60 bags | 8.2% | Override · asked |
| Mike Brennan | 204401 | Bayview Decks | Composite decking · 1,120 lf | 14.0% | Below floor · asked |
| Counter · Route 9 | 204388 | Cash sale | 2x4x8 #2 SPF · 248SPF · 80 ea | -3.1% | Below cost · asked |
| Mike Brennan | Quote 5102 | Harbor Point Builders | 2x6x12 #2 SPF · 480 ea | 15.1% | Cost change Oct 9 |
Below the floor, overrides, below cost, and a quote a cost change flipped. The reason asked on each.
The problem, as it happens in NetSuite.
The margin report in NetSuite runs at month end, by category, and the damage is already invoiced. A counter override on a Saturday, a job quote at last month’s cost, a rep rounding a ticket down for a good customer: each one is a line in a report nobody reads until the controller asks why gross profit dropped.
The reason is never recorded. The rep remembers it was a price match, or a damaged unit, or a favor, and by the time anyone asks it’s a guess. The same override happens next month because nothing was decided.
How it works.
- 1
Every ticket checked overnight
Each line invoiced that day against the floor for its category and the price level on the account. Overrides are taken from NetSuite’s ticket audit where it keeps one, otherwise from the gap between the account’s price and the sold price. The manager sees the list by 7 am.
- 2
Quotes a cost change flipped
When cost on the item record moves, every open quote carrying that item is re-read. A quote that was at margin yesterday and under it today is on the list, with the rep who wrote it, before it is honored.
- 3
One note per rep, with the reason asked
Each rep gets their own exceptions, ticket by ticket: the line, the margin, the account. Each one asks for the reason in a sentence. The reply is logged against the ticket where the manager can see it.
- 4
The manager decides what stands
Every exception with its reason: approve it, reject it for a credit, or change the floor. Lunica reverses nothing and re-invoices nothing; a credit the manager decides on is keyed by your team.
How it connects to NetSuite.
Lunica reads invoiced tickets, the item record and the customer record through SuiteQL and the REST API, under a role that can only read: sold price and cost per line, the price level and any contract pricing on the account, the floors by category you set, and NetSuite’s price-override audit where it keeps one. Open quotes are re-read after each cost change.
Nothing lands in NetSuite without a person and nothing is sent on its own. The nightly note to each rep is a draft until the sales manager sends it, or goes out on a morning schedule the manager set. A floor change is a rule your admins edit. A credit for a ticket the manager rejects goes back as a NetSuite API call or CSV import where one exists, or keyed by your team from what Lunica prepared.
What a week looks like.
- Last night’s exceptions by rep, on the manager’s desk by 7 am.
- A reason recorded for every override, in the rep’s own words.
- Quotes that a cost change put under the floor, caught before they are honored.
- Floors by category that the manager changed on purpose, not by accident.
Questions
Does it write to NetSuite?
No. It reads tickets, cost and price levels. A credit or a price change the manager decides on is keyed by your team.
Where do the floors come from?
A spec your sales manager edits in plain English: by category, by account, by branch, with exceptions for house accounts and clearance. History and revert.
Does it email the reps on its own?
Each rep’s note is a draft until the manager sends it, or the manager sets a morning schedule for it. Nothing goes to a customer, ever.
What counts as an override?
NetSuite’s override flag where it keeps one. Otherwise a sold price that differs from the price level the account carries, with the gap shown.
Can it see commodity swings?
Yes. Lumber and panel lines are checked against the cost on the day they were sold, so a ticket written at Tuesday’s number is judged on Tuesday’s cost, not Friday’s.
What does the model see?
The ticket lines on the list and the reason the rep typed. The arithmetic is done from NetSuite, not by a model.
Does it need a server?
Lunica runs on one server inside your network that connects out to your NetSuite account, set up and maintained by Lunica. It reads NetSuite through SuiteQL and the REST API, under a role that can only read. There is no inbound connection from outside your network.
What does Lunica read in NetSuite?
The customer record, open items and terms, purchase orders and receipts, the item record, quotes and order history, as each workflow needs them. Read-only, and only the rows a task is about.
Can it post to NetSuite?
Nothing lands in NetSuite without a person. What belongs in NetSuite goes back as a NetSuite API call or CSV import where one exists, or keyed by your team from what Lunica prepared.
What about our documents?
Invoice copies and scans keep living in the File Cabinet. Lunica reads them when a workflow needs one and never writes to them.
The same workflow, on another ERP.
Margin Exceptions is written for every system on the list. You’re reading the NetSuite version.
See it on your NetSuite data.
Thirty minutes. We walk the workflow on NetSuite data, then map it to yours.