Sales
This page is generated from the in-app guide content — edit
featureToggleGuidesand runpnpm gen:feature-toggle-docs.
Allow partial return of a combo
When on, a customer may return only some components of a combo (a warning is shown). When off, a return must keep the combo proportions — every component in the same ratio.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.bundle_partial_return | On | /sales/settings | Product bundles (combos) (sales.product_bundles) |
How it works
Decides whether a customer return may take back only some components of a combo sold on a sales order.
Conditions for it to take effect
Requires Product bundles to be on.
When ON
Any quantity of each component can be returned; the return form shows a hint that the combo is returned partially.
When OFF
A return created from a sales order or from an invoice linked to one is rejected unless every stock component of each touched combo is returned in the same proportion (optional and service components are not counted).
Screens, documents and reports affected
Customer returns (from sales order or invoice).
Caveats
The proportion check only sees combos that came from a sales order — invoice lines not linked to an order, returns without a source document, RMAs and credit notes are not checked.
Approval threshold (% change)
Changes above this percentage (up or down) wait for approval; 0 = every change. List (MSRP) prices are never gated
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.selling_price_approval_threshold_pct | 10 | /sales/settings | Require approval for large price changes (sales.selling_price_approval_required) |
How it works
The size of change (up or down, in % of the current active selling price) above which a change needs approval.
Conditions for it to take effect
Requires Require approval for large price changes to be on; the number is ignored otherwise.
When ON
A change strictly greater than this percentage waits for approval; exactly the threshold passes. 0 means every non-zero change waits.
When OFF
Not read while approval is off.
Screens, documents and reports affected
Sales → Selling prices (the bulk-update preview flags rows that will need approval), product and stock-item price fields, imports.
Caveats
Default 10. An invalid or negative value is treated as 0 (everything gated). When the current price is 0 or there is none, the change is never gated.
Auto-create shipment when an order is fulfilled
When on, a sales order that becomes fulfilled gets a pending shipment (manual carrier) with its delivery address, linked in the document chain. Van sales are skipped — goods were handed over at the point of sale. Off: shipments are created by hand.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.auto_shipment_on_fulfilled | Off | /sales/settings | — |
How it works
Creates a pending shipment (manual carrier) for a sales order the moment it is marked fulfilled, with the order’s delivery address, linked in the document chain.
Conditions for it to take effect
None.
When ON
Each sales order that becomes fulfilled and has at least one stock line gets one shipment; fulfilling again never creates a second one.
When OFF
No shipment is created automatically; create shipments by hand in Logistics.
Screens, documents and reports affected
Sales order fulfilment, Logistics shipments, document chain.
Caveats
Skipped for van sales (goods handed over at the point of sale) and for orders with services only. Orders fulfilled before you turn this on get no shipment retroactively.
Enforce sales price list
Reject quotation, sales order, AR invoice, POS and service order lines whose price differs from, is discounted below, or is missing from an effective sales price list
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.enforce_price_list | Off | /sales/settings | Sales price lists (sales.price_lists) |
How it works
Makes the price list binding: every line that references a product or stock item must carry the price from an effective price list for that customer, date and currency.
Conditions for it to take effect
Requires Sales price lists to be on, with lists set up for the customers you sell to.
When ON
Saving a quotation, sales order, AR invoice, POS sale or Service Management service order is rejected (policy violation) when a line differs from the list price (tolerance 0.01), gives a deeper discount than the list, or has no list price at all.
When OFF
Typed prices are kept as typed; a line with price 0 is still filled from the list.
Screens, documents and reports affected
Quotation, sales order and AR invoice create/edit, POS checkout, Service Management service orders.
Caveats
A product with no list for that customer cannot be sold at all — set up a default list first. A price that exists only in another currency counts as no list. Free-text lines (no product) and unchanged lines on a saved draft are exempt; lines priced by a service contract are skipped. Duplicating a quotation or invoice and adding or repricing lines in a sales order amendment are checked too. Documents generated from another document (quotation → order, order/delivery → invoice) keep the already-checked upstream prices, and CSV migration import of historical documents is not checked.
Product bundles (combos)
Sell several goods and services as one combo product. Sales orders split a combo into its component lines: each component keeps its own tax rate, stock is deducted per component, and the combo price is allocated by standalone selling price. Turning this off stops creating or editing combos and adding new combo lines; existing orders that contain combos can still be read and printed.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.product_bundles | On | /sales/settings | — |
How it works
Lets you sell several goods and services as one combo product. On a sales order the combo is split into component lines: each keeps its own tax rate, stock is deducted per component and the combo price is allocated by standalone selling price.
When ON
The Bundle type appears on the product form; combos appear in line pickers; sales orders (including those converted from a quotation) and purchase documents explode combos into components.
When OFF
Creating a combo, turning a product into one or editing its components is rejected (feature disabled); combos are hidden from line pickers; adding a combo line to a new quotation, direct AR invoice or POS sale, or a new combo line to a sales order, is rejected. A combo already on a draft order stays editable, and a quotation that already holds a combo can still be converted to a sales order.
Screens, documents and reports affected
Product form, line pickers, sales orders, quotation → sales order conversion, purchase requests/RFQs/POs, customer returns.
Caveats
Only sales orders explode combos — on a quotation, a direct AR invoice or a POS sale the combo stays one line with no component stock movement. The combo preview on the product page keeps working while off. Required by Allow partial return of a combo (turn that off first).
Require approval for large price changes
A selling-price change whose |Δ%| exceeds the threshold is held as pending approval and routed through the Selling price change workflow
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.selling_price_approval_required | Off | /sales/settings | — |
How it works
Holds a selling-price change for approval when its change versus the current active selling price is larger than the threshold.
When ON
A change above the threshold is saved as pending approval (the current price stays in force) and submitted to the Selling price change workflow; it takes effect when approved. A second gated change for the same item is rejected while one is pending.
When OFF
Every change takes effect immediately (or on its scheduled date).
Screens, documents and reports affected
Sales → Selling prices (set price, bulk update, scheduled changes, Pending tab), the price field on product and stock-item forms, product and stock-item import.
Caveats
Set up a Selling price change workflow first; without one the change waits in the Pending tab until a user with the approve-selling-prices permission decides — the person who made the change cannot approve it. List (MSRP) prices and an item’s first price are never gated. Turning the switch off does not release changes already pending: while an item has a pending change, any new selling-price change for it is refused until the pending one is approved, rejected or withdrawn.
Example
Threshold 10%: raising a price from 100,000 to 108,000 applies at once; raising it to 115,000 waits for approval.
Sales categories & category approval
Group quotations, sales orders and delivery orders into sales categories (e.g. Projects, Retail, Export), control who can create or view each category, and route approval to the approver assigned to the category. Off = one general category, no category access rules, approval follows the standard workflow.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.categories | Off | /sales/settings | — |
How it works
Groups quotations, sales orders and delivery orders into sales categories, restricts who can request/view/approve/manage each category, and routes approval to the workflow assigned to the category.
When ON
The category is taken from the products on the lines (lines from different categories are rejected), otherwise the General category; a header choice wins. Users only see and create documents in categories they are granted; quotation and sales order approval uses the category’s workflow, and approving inline needs the approve grant on that category. Delivery orders and invoices inherit the category from their parent.
When OFF
Every new document goes to the General category (a category sent in the request is ignored), no category access rules apply and approval follows the standard workflow. Category and grant settings become read-only.
Screens, documents and reports affected
Quotation, sales order and delivery order lists, detail pages and create forms; quotation and sales order approval; Sales settings → categories and grants.
Caveats
Turning it off asks for confirmation, takes effect within about 30 seconds and immediately lets restricted users see every quotation, sales order and delivery order; categories already stamped on documents stay. Invoices carry the category (a direct invoice gets the category of its products, otherwise General) but are not filtered by it. Users with Sales admin are not restricted.
Sales price lists
Enable customer, segment and promotional price lists. When off, the price-list pages are hidden and documents price from the central selling price
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.price_lists | On | /sales/settings | — |
How it works
Enables sales price lists (by customer, segment, promotion). When a quotation, sales order, AR invoice, POS sale or Service Management service order line is saved with price 0, the price is filled from the effective list for the customer, date and currency.
When ON
The Price lists pages and nav entry appear; price lists can be created, edited and deleted. Document lines are auto-priced from the list, and Enforce sales price list can be turned on.
When OFF
The Price lists pages and nav entry are hidden; creating, editing or deleting a price list is rejected (feature disabled). Document lines are no longer filled or checked against lists — prices come from the central selling price or what the user types.
Screens, documents and reports affected
Sales → Price lists, Selling prices (price-list section), quotation, sales order and AR invoice forms, POS, Service Management service orders.
Caveats
Turning it off deletes nothing: price lists stay in the system and become active again when you turn it back on, and existing documents keep their saved prices; the price-list membership card on product and stock-item pages is hidden while off. Required by Enforce sales price list (turn that off first).
Example
A distributor keeps a “Dealer tier 1” list 8% below retail: a rep adds a product to a dealer’s quotation with price 0 and the line is filled with the dealer price.
Sales team management
Group reps into sales teams. Off: the Sales teams page and its nav entry are hidden.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.team_management | Off | /sales/settings | — |
How it works
Lets you group sales reps into sales teams. A sales record belongs to the team of its owner (the employee’s sales team).
When ON
The Sales teams page and nav entry appear; reps can be placed in teams; leads, deals and the forecast can be filtered by team.
When OFF
Every sales team operation is rejected (feature disabled), the page and nav entry are hidden, saving a rep with teams and filtering leads/deals/forecast by team are rejected.
Screens, documents and reports affected
CRM → Sales teams, sales reps, contact owner block, lead and deal lists, pipeline analytics, forecast.
Caveats
On by default for companies created after this feature; off for older ones unless they already had team data. Required by Teammates’ records visible (turn that off first). Turning it off keeps teams and memberships in the system.
Selling below cost
What happens when a quotation, sales order, invoice, POS or service order line is priced below the item’s cost (net of line discount). Warn shows the line in the form; Block refuses to save it. Lines without a known cost are not checked.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.below_cost_policy | warn | /sales/settings | — |
How it works
Decides what happens when a sales line’s net price (unit price after line discount) is below the item’s cost price (stock item cost × unit conversion).
When ON
Warn: the line is marked below cost in the form, saving is allowed. Block: saving a quotation, sales order, AR invoice, POS sale or Service Management service order with such a line is rejected (policy violation) and the error lists the line numbers.
When OFF
This is a choice with no “off” — the default Warn never blocks.
Screens, documents and reports affected
Line price hint on quotation, sales order and AR invoice forms; quotation, sales order, invoice, POS and service order create/edit; duplicates and sales order amendments.
Caveats
Only lines with a known cost greater than 0 are checked — services and non-stock lines have no cost and always pass. A free line (price 0) on a costed item counts as below cost. Unchanged lines on a saved draft and service-order lines priced by a contract are exempt. POS prices are compared as entered. Documents generated from another document and CSV migration import are not checked.
Teammates’ records visible
Widens the ‘own’ and ‘team’ data scope so members of a sales team also see quotations and sales orders owned by teammates. Only ever adds records.
| Code | Default | Switch at | Turn on first |
|---|---|---|---|
sales.team_data_scope | Off | /sales/settings | Sales team management (sales.team_management) |
How it works
Widens the “own” and “team” data scope: users also see quotations and sales orders owned by people in their sales team. It only adds records, never removes.
Conditions for it to take effect
Requires Sales team management, with reps placed in teams. Only matters for roles on the “own” or “team” scope.
When ON
Quotation and sales order lists, detail pages and the quotation summary cards also show records owned by teammates.
When OFF
Data scope behaves as before — own records and the manager hierarchy only. Users immediately lose sight of teammates’ records.
Screens, documents and reports affected
Quotation list, detail and summary; sales order list and detail.
Caveats
Does not widen leads, deals, customers, delivery orders or invoices. Team membership counts both the employee’s sales team and memberships set on the Sales teams page. On by default for newly created companies. Roles with the “all” scope are unaffected.