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:

QuantityUnit price
1 – 9500
10 – 99450
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

  1. Creating a count batch pulls the system quantity for the specified locations
  2. Staff enter the actual counted quantity; the system computes the variance
  3. 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:

ModeNotes
Flat rateFixed amount per order
Free over thresholdAutomatically free above a configured order value
Tiered bracketsRate 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

SettingLocationEffect
Reordering rulesInventory → Reordering RulesTriggers replenishment suggestions below the safety level
Payment termsCustomer / supplier masterAutomatic due date calculation
Numbering rulesSystem & Operations → Core DictionariesAutomatic document numbering
Landed costsInventory → Landed CostsAllocates freight and duty into product cost
Period lockingAccounting → Period LockingLocks 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.