Business Rules, Warehousing, and Logistics
Beyond the accounting cascades, the platform ships a set of business rule engines — pricing, inventory correction, freight calculation.
Configure them once and they apply automatically at every entry point: whether an order comes from a Custom App, the API, or the AI assistant, the same rules apply. Your application never implements discount logic itself.
1. Pricing rules
Three layers of pricing, from most specific to most general.
Customer tier discounts
Configure: Data Center → CRM → Customer Levels
Set a base discount rate per customer tier (a VIP rate of 0.85 means 15% off). Unit prices are recalculated at order entry using that rate.
Tag-based negotiated prices
Configure: Data Center → CRM → Customer Tags
More specific than a rate — a fixed price for a specific product attached to a tag.
For example, under a "long-term contract partner" tag, product A is always 1,000 regardless of list price. At order entry, a customer carrying the tag gets the negotiated price automatically.
Tags support batch binding, so many customers can be tagged at once.
Volume tier pricing
Configure: Data Center → Sales → Products, then the tier pricing tab on a product
Price brackets by quantity:
| Quantity | Unit price |
|---|---|
| 1 – 9 | 500 |
| 10 – 99 | 450 |
| 100+ | 400 |
When an order is created, the quantity selects the bracket automatically, handling wholesale and retail pricing without manual lookup.
2. Inventory correction
The two places warehouse operations most often diverge from the books both have automatic correction.
Physical counts
Configure: Data Center → Inventory → Physical Counts
- Creating a count batch pulls the system quantity for the specified locations
- Staff enter the actual counted quantity; the system computes the variance
- Once a supervisor confirms the batch, an inventory adjustment triggers automatically — the variance is written to stock, correcting it immediately
No manual arithmetic, no separate adjustment document.
Packaging conversions
Configure: Data Center → Inventory → Packaging Conversions
Handles unit-of-packaging changes — one case split into twelve retail packs, or loose units consolidated into a case.
After a conversion record is created and confirmed by a supervisor, the system deducts the source packaging from stock and increases the target packaging proportionally. Both happen together; there is no intermediate state.
3. Logistics and freight
Delivery batches
Configure: Data Center → Inventory → Delivery Batches
Consolidate several pending deliveries into one batch so warehouse staff can print picking lists and packing labels in one pass, improving picking and dispatch throughput.
Freight groups
Configure: Data Center → Inventory → Freight Groups
Three billing modes, combinable:
| Mode | Notes |
|---|---|
| Flat rate | Fixed amount per order |
| Free over threshold | Automatically free above a configured order value |
| Tiered brackets | Rate varies by order value bracket |
Example: under 1,000 costs 150; 1,000–3,000 costs 80; above 3,000 ships free.
At order confirmation the qualifying freight is posted to accounts receivable automatically, unifying finance and logistics.
4. Other pre-built configuration
| Setting | Location | Effect |
|---|---|---|
| Reordering rules | Inventory → Reordering Rules | Triggers replenishment suggestions below the safety level |
| Payment terms | Customer / supplier master | Automatic due date calculation |
| Numbering rules | System & Operations → Core Dictionaries | Automatic document numbering |
| Landed costs | Inventory → Landed Costs | Allocates freight and duty into product cost |
| Period locking | Accounting → Period Locking | Locks closed periods against retroactive edits |
5. From an application's point of view
The value of these rules is that your application doesn't have to know they exist.
def execute(ctx):
# Only send who, what, and how many
ctx.db.insert('sale_orders', {
'customer_id': ctx.params['customer_id'],
'order_line': [
{'product_id': ctx.params['product_id'],
'product_uom_qty': ctx.params['qty']}
],
})
# Tier discount, negotiated price, volume brackets, freight — all applied by the engines
The application submits business intent; pricing is computed by the engine. The benefit: when pricing policy changes you edit a setting in the Dashboard, not code scattered across several applications.
6. Who should maintain these
Most of these settings require write permission on the corresponding module (crm.write, sale.write, stock.write, and so on); some require system.admin.
They are best maintained by people who understand the business policy rather than developers — which is precisely the point of keeping rules in configuration instead of code.