Sales Order Management for Manufacturers: From Order to Shipment
A sales order is a promise. A customer wants specific products, at specific quantities, delivered by a specific date. In retail, fulfilling that promise means picking items off a shelf. In manufacturing, it might mean reserving raw materials, scheduling production runs, tracking ingredient availability across multiple manufacturing orders, packing partial shipments, and coordinating delivery — all while managing a queue of other orders competing for the same inventory.
Sales order management for manufacturers bridges the gap between what your customer ordered and what your shop floor produces. It's one of the core modules in a modern MRP system. It's not a document — it's a live tracker that connects sales, inventory, production, and shipping into a single flow where every status change in one area updates visibility across the others.
This guide covers the complete sales order lifecycle, how inventory reservation works, the make-to-order production link, fulfillment workflows, and the practices that keep orders moving without surprises.
Why Manufacturing Sales Orders Are Different
Retail and wholesale businesses deal with finished goods. When a customer orders 50 units, you either have them or you don't. Manufacturing adds layers that fundamentally change how orders work:
You might need to produce what was ordered. Some items are buy-type (purchased and resold), others are make-type (manufactured from raw materials via a recipe). A single sales order can contain both. The system needs to handle each type differently — reserving stock for buy items, triggering production for make items.
Stock exists in multiple states. On-hand inventory might already be committed to higher-priority orders. Expected inventory is coming from purchase orders but hasn't arrived yet. Demand represents make-type items that need production. A simple "in stock" check isn't enough — you need priority-aware allocation.
Delivery timelines depend on production. You can't promise a delivery date without knowing whether ingredients are available, whether production is scheduled, and whether the manufacturing order will finish on time. Delivery estimation requires looking across the entire supply chain.
Partial fulfillment is the norm. Unlike e-commerce where you ship complete orders, manufacturing often delivers in batches — some items are ready now, others are still in production or waiting for materials.
The Sales Order Lifecycle
A well-designed sales order system follows a clear lifecycle where each state determines what actions are available and what happens to inventory.
Order Entry
Creating a sales order captures everything needed to fulfil the customer's request:
- Customer — Who's ordering, with their billing and shipping addresses auto-populated from their profile
- Line items — Each product with quantity, unit price, discount (fixed amount or percentage), and optional per-line tax rate
- Location — The ship-from warehouse or production facility
- Dates — Order date, customer's requested delivery date, and your promised delivery date
- Financial details — Currency, tax rate (order-level default cascading to lines), tax-inclusive or tax-exclusive mode, price list
SO-20260225-0003
Customer: Apex Manufacturing Ltd
Location: Main Warehouse
Line Items:
┌─────────────────────────┬─────┬──────────┬──────────┬──────────┐
│ Item │ Qty │ Price │ Discount │ Total │
├─────────────────────────┼─────┼──────────┼──────────┼──────────┤
│ Steel Bracket Assembly │ 200│ $45.00 │ 5% │ $8,550 │
│ Copper Busbar 30mm │ 500│ $12.80 │ — │ $6,400 │
│ Control Panel Type B │ 10│ $320.00 │ $15/unit │ $3,050 │
└─────────────────────────┴─────┴──────────┴──────────┴──────────┘
Subtotal: $18,000.00
Discount Tot: $ 600.00
Tax (10%): $ 1,740.00
Total: $19,140.00
Requested Delivery: 2026-03-10
Priority: 2
What happens at creation:
The moment a sales order is saved, the system doesn't just store a document — it takes inventory action:
-
Buy-type items get their quantities committed (reserved) at the ship-from location. This means the stock is still physically there, but it's earmarked for this order. Other orders see reduced available inventory.
-
Make-type items register demand at the location. This signals that production is needed but doesn't automatically create manufacturing orders — that's a deliberate decision the production planner makes.
-
Status fields are computed: product availability, ingredient status (for make items), production status, and delivery status are all calculated based on current inventory and existing orders.
Priority-Aware Stock Reservation
Not all orders are equal. A rush order for your biggest customer should get first claim on available stock. FlexMRP uses a priority-based allocation system where lower priority numbers mean higher importance.
When you have 300 units on hand and three orders each wanting 200:
| Order | Priority | Requested | Allocated | Status |
|---|---|---|---|---|
| SO-0001 | 1 (highest) | 200 | 200 | In Stock |
| SO-0002 | 5 | 200 | 100 | Partially Available |
| SO-0003 | 10 | 200 | 0 | Not Available |
The system processes orders from highest priority (lowest number) to lowest, claiming available stock at each step. When inventory changes — a purchase order arrives, a manufacturing order completes, or an order is cancelled — all affected orders recalculate their statuses.
Drag-and-drop reordering on the sales order list directly changes these priorities. Move an order to the top, and the system reassigns priority values (10, 20, 30...) and recalculates stock allocation across all affected orders. This gives production planners a live tool for managing order queues, not just a static list.
Granular Status Tracking
A single "status" field can't capture the complexity of a manufacturing sales order. FlexMRP tracks five independent status dimensions:
Order Status — The high-level lifecycle:
Open— Active, being processedDone— Fully shippedCancelled— Cancelled with inventory released
Products Status — Availability of the ordered items:
In Stock— All quantities available and reservedExpected— Not all in stock, but incoming (from POs or production)Partially Available— Some items available, others notNot Available— None of the ordered quantities available
Ingredients Status — For make-type items, are the raw materials available?
In Stock— All ingredients for all make items are availableExpected— Ingredients incoming from purchase ordersNot Available— Missing ingredients with no expected supply
Production Status — Aggregated from linked manufacturing orders:
Not Applicable— No make-type itemsNot Started— MOs exist but haven't begunIn Progress— At least one MO is being worked onBlocked— Production blocked (usually by missing materials)Done— All MOs completed
Delivery Status — Shipping progress:
Not Shipped— Nothing sent yetPartially Packed— Some items packed but not shippedPacked— All items packed, ready to shipPartially Shipped— Some items delivered, others pendingShipped— Everything delivered
These statuses are cached on the sales order record and recalculated whenever relevant events occur — inventory changes, manufacturing order updates, shipment creation, or priority reordering. The sales order list page shows all of them, giving you an at-a-glance view of where every order stands.
Make-to-Order: Connecting Sales to Production
The make-to-order (MTO) workflow is what separates manufacturing sales order management from simple order fulfillment. When a sales order contains items that need to be produced, the system creates a link between the sales promise and the production plan.
How It Works
-
Order contains make-type items. When you add a line item for a product with type "make" and an associated recipe, the system recognises it needs production, not just stock picking.
-
System suggests manufacturing orders. The
/suggest-manufacturing-orders/endpoint analyses make-type line items and checks which ones don't have linked MOs yet. It returns a list of suggested MOs with quantities matching the sales order line. -
Planner creates MOs. Manufacturing orders aren't auto-created — the planner reviews suggestions and triggers creation. This is deliberate: the planner might want to batch multiple sales orders into one production run, adjust quantities, or schedule production based on machine availability.
-
MO links back to the SO. The created manufacturing order carries a
sales_orderforeign key, creating a traceable link. The SO's production status updates automatically as the MO progresses. -
Completed MO produces finished goods. When the manufacturing order completes, finished products are added to inventory at the production location. The SO's products status recalculates — what was "Expected" or "Not Available" becomes "In Stock".
Sales Order SO-20260225-0003
├── Line: Steel Bracket Assembly × 200 (make)
│ └── MO-20260226-0001 (In Progress)
│ ├── Steel Sheet 2mm × 400 (ingredient, in stock)
│ ├── Rivets M6 × 800 (ingredient, in stock)
│ └── Zinc Coating × 200ml (ingredient, expected from PO)
├── Line: Copper Busbar 30mm × 500 (buy, in stock ✓)
└── Line: Control Panel Type B × 10 (make)
└── No MO created yet (remaining_make_count: 1)
Delivery Deadline Estimation
One of the most valuable features for the sales team: automated delivery deadline estimation. The system looks at the entire supply chain to suggest when you can realistically promise delivery:
For buy items: Checks current stock at the location. If insufficient, looks at confirmed purchase orders and their expected delivery dates.
For make items: Checks if a recipe exists, whether ingredients are available (or when they'll arrive via POs), adds the recipe's estimated production lead time, and factors in the requested delivery date.
The estimation works for both saved orders (GET /estimate-delivery-deadline/) and draft orders being created (POST /estimate-delivery-deadline/), so you can give your customer an answer before the order even exists.
Fulfillment: Pack, Then Deliver
Manufacturing shipments often involve staging — items are picked and packed first, then shipped when the carrier arrives or when enough items are ready. FlexMRP uses a two-stage fulfillment model:
Stage 1: Packing
Packing records which items have been picked from shelves and boxed, without any inventory impact:
- Select items and quantities to pack from the sales order
- A
Fulfillmentrecord is created with statuspacked - The sales order's
quantity_packedfields update per line item - Delivery status transitions to
Partially PackedorPacked - No stock changes occur — items are still on the shelf in the system until delivery
This is important for warehouses where packing and shipping are separate operations, possibly handled by different people or at different times.
Stage 2: Delivery
When packed items are shipped (or items are delivered directly without prior packing):
- A
Shipmentrecord is created with tracking number, carrier, shipping cost, and ship date - For each delivered item:
- Committed stock is released (the reservation is removed)
- On-hand stock is deducted (the items physically leave)
ShipmentLineItemrecords link each delivered quantity to the SO line
- The fulfillment transitions from
packedtodelivered - The SO's
quantity_shippedupdates per line, and delivery status recalculates
Fulfillment #1 — SO-20260225-0003
Status: Delivered → Shipment SH-20260310-0001
Shipped:
Copper Busbar 30mm: 500 of 500 ✓ Fully shipped
Steel Bracket Assembly: 200 of 200 ✓ Fully shipped
Control Panel Type B: 0 of 10 ⧖ Awaiting production
Shipment SH-20260310-0001:
Carrier: FastFreight Logistics
Tracking: FF-2026-8847291
Ship Date: 2026-03-10
Shipping Cost: $285.00
SO Delivery Status: Partially Shipped
Handling Partial Shipments
Partial shipments are first-class citizens. Each sales order can have multiple fulfillments and shipments:
- Fulfillment #1: Ship 500 busbars and 200 brackets (items in stock)
- Fulfillment #2: Ship 10 control panels (after production completes)
Each shipment independently tracks quantities, creates its own inventory events, and has its own tracking number. The sales order's delivery status automatically progresses: Not Shipped → Partially Shipped → Shipped.
The quantity guard ensures you can't ship more than was ordered — attempting to deliver 510 busbars when the order says 500 will be rejected. This prevents over-shipment that would break invoicing reconciliation.
Reverting a Fulfillment
Mistakes happen. If items were marked as delivered but need to come back — wrong items shipped, customer refused delivery, or a data entry error — the revert function processes a compensating transaction:
- A
ReturnOrderis created documenting what's coming back - Inventory adjustments restore the stock at the location
- The fulfillment moves to
revertedstatus - The SO's shipped quantities and delivery status recalculate
This maintains an audit trail. The original shipment record stays, the return is documented, and inventory corrections are atomic.
Customer Defaults and Pricing
Customer Profiles
Each customer carries defaults that auto-populate new sales orders:
- Default currency — If a customer trades in EUR, new orders start in EUR
- Default tax rate — Their standard tax rate applies to the order level
- Default discount — A percentage discount (
default_discount_percent) automatically applies to line items without explicit discounts. A 5% default means every line item gets 5% off unless overridden - Default price list — The customer's negotiated prices auto-fill unit prices per item
- Default payment terms — E.g., "Net 30", "Net 60"
- Credit limit — Maximum outstanding order value
Price Lists
Price lists bind prices to items for specific currencies and validity periods. When a price list is selected on a sales order:
- Line item unit prices auto-populate from the price list
- Currency validation ensures consistency (order currency must match price list currency)
- Price list is captured on the SO for historical reference — even if prices change later, the order retains the original pricing
Discount Calculation
Line-level discounts support two modes:
Percentage discount: A 5% discount on a $1,000 line gives $50 off. Capped at 100%.
Fixed discount: A $15/unit discount on 10 units at $320/unit means $150 total discount. Capped at the line subtotal (discount can't exceed the line value).
Tax is calculated on the post-discount amount. For a $1,000 line with 5% discount and 10% tax:
- Subtotal: $1,000
- Discount: $50
- Taxable amount: $950
- Tax: $95
- Line total: $1,045
Inventory Impact in Detail
Every stage of a sales order's life has specific, traceable effects on inventory. Understanding these flows is critical for maintaining accurate stock counts.
On Order Creation
Buy item (500 units at Main Warehouse):
Committed: +500 (reserved for this order)
Available: −500 (other orders see less stock)
On-hand: unchanged (still physically there)
Make item (200 units at Main Warehouse):
Demand: +200 (signals production needed)
Committed: unchanged (nothing to reserve yet)
On Shipment
Shipping 500 buy items:
Committed: −500 (reservation released)
On-hand: −500 (stock physically leaves)
Inventory event recorded:
Type: SO_SHIPMENT
Delta: −500
Reference: SO-20260225-0003, Line #2
Idempotency key: so-ship-{so_id}-{line_id}-{shipment_id}
On Cancellation
Cancelling with 200 of 500 already shipped:
Committed: −300 (release remaining 300 unshipped)
On-hand: unchanged (200 already shipped stay gone)
Demand: reversed for any make items
On Deletion
Same as cancellation — all unshipped reservations and demand are released within a single atomic transaction before the record is removed.
Idempotency Protection
Every inventory operation uses an idempotency key — a unique string tied to the specific action (e.g., so-reserve-{so_id}-{line_id}). If the same operation is triggered twice (network retry, page refresh, duplicate webhook), the system recognises the duplicate and returns the existing result instead of processing it again.
This is critical for financial accuracy. Without idempotency, a network timeout during shipment processing could cause double stock deduction — the stock leaves the system twice but only left the warehouse once.
Concurrency Protection
When multiple warehouse workers process shipments simultaneously, advisory locks at the location level serialize operations that affect the same warehouse. Two shipments from different locations process in parallel; two shipments from the same location queue sequentially. This prevents race conditions where two operations read the same stock count and both assume the inventory is available.
Quote-to-Order Conversion
Sales orders can originate from quotes. When a quote is accepted:
- The quote data (customer, line items, prices, discounts) is copied into a new sales order
- The quote's ID is stored on the SO for traceability (
quoteFK) - All the standard creation logic fires — stock reservation, demand registration
Going the other direction is also possible: revert to quote. If an order needs to go back to the proposal stage:
- The SO is cancelled (releasing all inventory reservations)
- A new quote is created with the SO's data
- The link between the original quote and the SO is preserved
This requires no linked manufacturing orders — if MOs exist, they must be handled first. The system blocks the revert and explains why.
Bulk Operations
When managing dozens of active orders, one-at-a-time actions don't scale. FlexMRP supports:
Bulk cancel — Cancel multiple not-shipped orders at once. Each cancellation independently processes inventory releases. Orders with in-progress MOs are skipped with individual error messages.
Bulk update — Update promised_delivery_date and notes across multiple orders. Useful when a production delay affects several orders' timelines.
Bulk MO creation — Review all make-type items across selected orders and create manufacturing orders for items that don't have one yet.
Drag-and-drop reordering — The open orders list supports drag-and-drop priority reordering. Moving an order changes its priority and triggers stock reallocation across all affected orders. The UI uses optimistic updates — the order moves immediately in the browser, and if the server rejects the change, it rolls back.
Real-Time Updates
Sales orders don't live in isolation. When a purchase order arrives and stock increases, or a manufacturing order completes, or another user cancels a competing order — all of these events affect status calculations for open sales orders.
FlexMRP uses Server-Sent Events (SSE) to push updates to the browser in real time. The sales order list page subscribes to outbox events and automatically refreshes when relevant changes occur. No manual refresh needed — if someone in the warehouse ships an order, the sales team sees the delivery status update within seconds.
Common Scenarios
Scenario 1: Mixed Buy and Make Order
A customer orders 500 copper busbars (buy) and 200 steel bracket assemblies (make).
- Order created: Busbars reserved from stock (committed +500). Bracket demand registered (+200).
- Products status: Busbars "In Stock", brackets "Not Available" (no MO yet).
- Planner creates MO: MO-0001 for 200 brackets linked to the SO. Production status → "Not Started".
- Busbars ship first: Fulfillment #1 ships 500 busbars. Delivery status → "Partially Shipped".
- MO completes: 200 brackets produced and added to stock. Products status → "In Stock".
- Brackets ship: Fulfillment #2 ships 200 brackets. Delivery status → "Shipped". Order status → "Done".
Scenario 2: Priority Conflict
Two orders for the same item, limited stock:
- SO-0001 (Priority 1): 300 units of Widget A
- SO-0002 (Priority 5): 200 units of Widget A
- Available stock: 400 units
SO-0001 gets 300 (full allocation). SO-0002 gets 100 (partial). SO-0002 shows "Partially Available".
When a purchase order for 200 units of Widget A is received, the status service recalculates: SO-0002 now has 100 from original stock + 100 from new stock = 200, fully allocated. Products status → "In Stock".
Scenario 3: Customer Cancels After Partial Shipment
SO-0003 ordered 1,000 units, 400 already shipped. Customer cancels the remaining 600.
- Cancel the order → status changes to "Cancelled"
- Committed stock released: −600 (the unshipped remainder)
- The 400 already shipped remain — they're physically with the customer
- Inventory events record the release
- Other orders that were waiting for stock may now see improved availability (status service recalculates)
Scenario 4: Production Delay
MO for control panels is blocked — missing a critical ingredient. The SO shows:
- Production Status: "Blocked"
- Ingredients Status: "Not Available"
The buyer creates a purchase order for the missing ingredient — a step that purchase planning can automate by identifying shortages before they block production. Once the PO is confirmed, the SO's ingredients status updates to "Expected" with the expected delivery date visible. When the PO is received and the ingredient arrives, the MO can proceed, and production status moves to "In Progress".
Scenario 5: Delivery Deadline Estimation
Sales rep is on a call with a customer who wants 100 units of a make item. Before creating the order, the rep uses the draft deadline estimation:
- Posts draft order data to
/estimate-delivery-deadline/ - System checks: no stock on hand, recipe requires 3 ingredients
- Ingredient A: 500 in stock ✓
- Ingredient B: 200 needed, 150 in stock, 50 arriving via PO-0012 on March 5
- Ingredient C: 100 in stock ✓
- Production lead time from recipe: 5 business days
- Estimated delivery: March 12 (materials ready March 5 + 5 days production)
The rep can promise March 15 to give buffer, then set that as the promised delivery date when creating the order.
Financial Controls
Line-Level Precision
Every line item maintains independent financial calculations:
- Line subtotal: Quantity × unit price
- Line discount: Fixed or percentage, capped at subtotal
- Line tax: Calculated on post-discount amount, using cascading tax rates (line-level → order-level → zero)
- Line total: Subtotal − discount + tax (exclusive mode) or extracted from gross (inclusive mode)
Order totals aggregate from lines — they're never manually entered. This ensures consistency and eliminates rounding discrepancies between line items and the order summary.
Tax Handling
Manufacturing sales involve tax complexity:
Tax-exclusive (default, typical for B2B): Prices are net. Tax is added on top. A $100 item with 10% tax has a line total of $110.
Tax-inclusive (typical for B2C or retail): Prices include tax. A $110 item with 10% tax has a net value of $100 and tax of $10. The formula extracts tax: net = gross / (1 + rate).
Cascading rates: Each line item can have its own tax rate. Lines without a specific rate inherit the order-level rate. Lines with neither use zero. This handles scenarios like:
- Domestic products at standard rate
- Exported goods at zero rate
- Services at reduced rate
- All on the same order
Audit Trail
Every inventory event created by sales order operations is immutable and traceable:
- What changed: Item, location, quantity delta
- Why it changed: Reference to SO, line item, shipment
- When: Timestamp
- Who: User who performed the action
- Idempotency key: Prevents duplicate processing
This supports three-way matching (order → shipment → invoice) and provides a complete history for any stock discrepancy investigation.
Best Practices
1. Set Realistic Promised Dates
Use the delivery deadline estimation before committing to a date. The system considers ingredient availability, purchase order timelines, and production lead times. Adding a buffer of 10-20% to the estimated date accounts for the unexpected.
Don't confuse the customer's requested date with your promised date. The requested date is what they want. The promised date is what you can actually deliver. Track both — the gap between them measures your responsiveness.
2. Use Priority Ordering Actively
Don't let priorities stagnate. Review the open orders list weekly and reorder based on:
- Customer importance and relationship
- Delivery date urgency
- Order value and margin
- Production readiness (are ingredients available?)
Drag-and-drop reordering takes seconds and immediately recalculates stock allocation. This is more effective than manually managing reservation overrides.
3. Create MOs Early
Don't wait until the delivery deadline approaches to create manufacturing orders for make-type items. Create MOs as soon as the order is confirmed:
- Ingredient reservations are made earlier
- Production can be scheduled alongside other MOs
- Problems (missing materials, capacity conflicts) surface while there's still time to fix them
The remaining_make_count field on each SO tells you how many make-type lines still need MOs. Filter for orders with remaining_make_count > 0 to find unplanned production.
4. Ship as Items Become Ready
Don't hold finished items waiting for the rest of the order. Partial shipments keep the customer's production line running and reduce your warehouse holding costs. Ship buy items immediately when in stock, and ship make items as each manufacturing order completes.
Each shipment gets its own tracking number and carrier information. The customer sees progress even though the order isn't fully complete.
5. Review Partially Shipped Orders Weekly
An order stuck in "Partially Shipped" for weeks indicates a problem:
- A manufacturing order might be blocked
- A required ingredient might be out of stock with no PO
- Someone shipped part of the order but forgot to fulfil the rest
Filter by delivery status "Partially Shipped" and follow up on anything older than your typical fulfilment cycle.
6. Use Quotes for Complex Orders
For orders that need customer approval on pricing or lead times, use the Quote → Sales Order flow. This lets you:
- Lock in pricing and validate availability before committing
- Present the customer with a formal proposal including delivery timeline
- Convert to SO with one action when approved
- Revert to quote if terms need renegotiation after order creation
Key Metrics
1. Order-to-Ship Cycle Time
Metric: Average days from order creation to full shipment.
Break it down: how much time is spent in each stage (awaiting materials, in production, packed and waiting for pickup)? The bottleneck stage tells you where to focus improvement.
2. On-Time Delivery Rate
Metric: (Orders shipped by promised date ÷ Total shipped orders) × 100
Target: 95%+. Below 90% means your promised dates aren't reliable, which erodes customer trust. Root causes are usually inaccurate lead time estimates or priority conflicts.
3. Order Fill Rate
Metric: (Line items shipped in full on first delivery ÷ Total line items) × 100
Measures how often you fulfil orders completely on the first shipment. Low fill rates mean frequent partial shipments, which increase shipping costs and customer frustration.
4. Average Lines Per Order
Metric: Total line items ÷ Total orders
Indicates order complexity. Higher averages may require more sophisticated picking and packing workflows. Track trends — rising complexity might justify investment in warehouse automation.
5. Cancellation Rate
Metric: (Cancelled orders ÷ Total orders created) × 100
A high rate suggests problems upstream — inaccurate quotes, customer miscommunication, or pricing issues. Investigate whether cancellations happen before or after partial shipment for different root causes.
FAQ
What is a sales order in manufacturing?
A sales order in manufacturing is a formal commitment to deliver specific products to a customer. Unlike retail, manufacturing sales orders often contain items that need to be produced (make-to-order), not just picked from shelves. The order tracks line items with quantities and pricing, manages inventory reservation for buy items and production demand for make items, coordinates one or more manufacturing orders, and handles partial fulfillment through multiple shipments — all while maintaining priority-based stock allocation across competing orders.
How does make-to-order work with sales orders?
When a sales order contains a make-type item — a product with a production recipe — the system registers demand rather than reserving existing stock. A production planner reviews suggestions and creates a manufacturing order (MO) linked to the sales order. The MO triggers ingredient reservation, schedules production operations, and produces finished goods. As the MO progresses, the sales order's production status updates in real time. When completed, produced items are available for shipment, and the sales order's product status recalculates from "Expected" or "Not Available" to "In Stock".
What is priority-based stock allocation?
Priority-based allocation means that when multiple sales orders compete for limited inventory, higher-priority orders get first claim. Each order has a priority number (lower = higher importance). The system processes orders from highest to lowest priority, allocating available stock at each step. When inventory changes (new PO received, MO completed, order cancelled), all affected orders recalculate their availability status. Planners can change priorities via drag-and-drop reordering, which immediately triggers reallocation.
Can you partially ship a sales order?
Yes. Partial shipments are fully supported. Each sales order can have multiple fulfillments (pack events) and shipments. You can ship available items immediately and send remaining items later as they become ready — from production completion or material arrivals. Each shipment independently tracks quantities, creates inventory deduction events, and has its own tracking number. The order's delivery status automatically progresses: Not Shipped → Partially Shipped → Shipped. Over-shipment is blocked: you cannot ship more than the ordered quantity per line.
How do sales orders affect inventory?
Sales orders affect inventory at three points. On creation, buy-type items increase committed stock (reserved but not physically removed) and make-type items register demand. On shipment, committed stock is released and on-hand stock is deducted — items physically leave your warehouse. On cancellation, remaining unshipped commitments and demand are released. Every change creates an immutable inventory event with idempotency protection against duplicate processing. Concurrency is handled through advisory locks to prevent race conditions during simultaneous shipments.
Conclusion
Sales order management for manufacturers is the control centre where customer promises meet operational reality. It's not just about recording what was ordered — it's about maintaining live visibility across inventory, production, and shipping so that every stakeholder knows exactly where things stand.
Key principles:
- Reserve on creation — Stock commitment happens the instant an order is saved, ensuring inventory accuracy across competing orders
- Track five status dimensions — Products, ingredients, production, delivery, and overall status give complete visibility without drilling into details
- Link sales to production — Make-to-order items connect directly to manufacturing orders, with status flowing back to the sales order
- Support partial fulfillment — Pack and ship items as they become ready, with full tracking per shipment
- Use priority for allocation — Drag-and-drop ordering directly controls which customers get stock first
- Estimate before promising — Delivery deadline estimation considers the entire supply chain before you commit to a date
- Maintain audit trails — Every inventory event is immutable, idempotent, and traceable to its source
Stop managing orders in spreadsheets. Start treating every sales order as a live connection between your customer and your shop floor.