Workflow: OmniSales Order Fulfillment
Modules involved: OmniSales · Warehouse (Delivery Notes, Packing Lists) · Innoship · Couriers (Cargus / FanCourier) · Invoices
Who uses it: Order operator, Warehouse, Logistics, Finance
Typical duration: Hours – days (from order to delivery)
Overview
The complete order processing workflow for orders received from any sales channel (WooCommerce, Shopify, client portal, POS, manual): from a new order through AWB generation and automatic invoicing. Managed primarily by the warehouse and logistics teams.
Flow diagram
[OMNI ORDER] ← WooCommerce / Shopify / Portal / Manual / POS
│ status: Draft (0) → Processing (1) → Confirm (3)
│ ↓ Order confirmation (manual or automatic)
│
[DELIVERY NOTE (Goods Delivery Note)]
│ status: ready_for_packing → packed
│ created automatically from confirmed order
│ ↓ Picking in warehouse — physically select products
│
[PACKING LIST]
│ status: wh_ready_to_deliver → wh_in_transit → wh_delivered
│ created from the delivery note (full or partial)
│ includes parcel dimensions: length, width, height, weight
│ ↓ Packing list approval
│
[AWB INNOSHIP]
│ generated via Innoship API from approved packing list
│ AWB printed and affixed to parcel
│ tracking number returned automatically
│ ↓ Hand over to courier
│
[INVOICE]
│ generated automatically or manually from order / delivery note
│ status: Draft → Sent → Paid
│
[DELIVERY COMPLETED]
│ order status → Delivered (5)
│ packing list status → wh_delivered
Step by step
1. OmniSales Order — Receiving the order
Where: /admin/omni_sales/order_list
Order sources:
| Source | How it enters the CRM |
|---|---|
| WooCommerce | Automatic sync (cron) or manual — WooCommerce module |
| Shopify | Automatic sync — Shopify module |
| Client portal | Client places the order from their own portal |
| POS | Operator enters the order at the counter |
| Manual | Staff enters the order directly from /admin/omni_sales |
Order statuses:
| Code | Status | Description |
|---|---|---|
| 0 | Draft | New order, unconfirmed |
| 1 | Processing | In processing — reviewing stock and availability |
| 2 | Pending Payment | Awaiting advance payment |
| 3 | Confirmed | Confirmed — delivery note can be generated |
| 4 | Shipping | Picked up by courier |
| 5 | Delivered | Delivered and completed |
| 8 | Cancelled | Cancelled |
| 9 | On Hold | Temporarily suspended |
| 14 | Paid | Paid |
| 15 | Ready | Ready for delivery |
Order approval:
Orders may require approval before confirmation — approve_status: 0 (pending) → 1 (approved) → -1 (rejected). Configurable per sales channel.
Key fields on the order:
- Client (
id_contact) — link to the client record - Channel (
channel_id) — order source - Products + quantities + prices
- Delivery address
- Payment method
2. Delivery Note (Goods Delivery Note) — Preparing the order
Where: /admin/warehouse/manage_delivery
Creation:
- Automatic: when the order reaches Confirmed (3) or Shipping (4) status, the system automatically creates the delivery note via
omnisales_auto_create_goods_delivery_with_invoice() - Manual: from the confirmed order, Generate Delivery Note button
What the delivery note contains:
- All product lines from the order (code, name, quantity, price)
- Source warehouse
- Client address (copied from the order)
- Unique number (configurable prefix + auto-increment)
Delivery note statuses:
| Status | Description |
|---|---|
ready_for_packing |
Created, awaiting picking |
packed |
Products have been packed; packing list created |
Picking (collecting products):
The warehouse operator takes the delivery note (physically or on screen) and collects the listed products. Stock is not definitively deducted until delivery is completed or the invoice is generated.
3. Packing List — Packing and preparing the parcel
Where: /admin/warehouse/manage_packing_list
Creation:
- From the approved delivery note — Create Packing List button
- Supports partial packing (
type_of_packing_list = 'partial'): if not all products are in stock, you can deliver partially and generate a second packing list later
Required data for the packing list:
| Field | Notes |
|---|---|
| Products + quantities | Copied from delivery note; adjustable for partial delivery |
| Weight (kg) | Required for AWB generation |
| Length / Width / Height (cm) | Parcel dimensions — required by the courier |
| Delivery address | Copied from order; editable |
| Courier service | Select from Innoship list (standard, express, etc.) |
Packing list statuses:
| Status | Description |
|---|---|
wh_ready_to_deliver |
Created, awaiting AWB |
wh_in_transit |
AWB generated, parcel picked up by courier |
wh_delivered |
Confirmed delivered |
Packing list approval:
If the approval workflow is active, the manager approves the packing list (approval = 1) before AWB generation.
4. AWB Innoship — Generating the shipping document
Where: Generate AWB button from the approved packing list
or directly from /admin/innoship/awb
Prerequisites:
- Innoship credentials configured:
innoship_api_key,innoship_external_id(at/admin/innoship/settings) - Courier and service selected in the packing list
- Dimensions and weight filled in
- Valid delivery address in the Innoship database
What happens on generation:
- CRM sends a request to the Innoship API with the parcel data
- Innoship returns: AWB number + tracking code
- CRM creates a record in
wh_omni_shipmentswith the returned data - Packing list status →
wh_in_transit - Order status →
Shipping (4) - AWB available for printing (A4 or thermal PDF)
- Log created in
innoship_audit_log
Couriers supported through Innoship:
Fan Courier, DPD, Cargus, Sameday, GLS, DHL, and others (depends on active Innoship contracts).
Direct alternative — Couriers module:
If you have direct contracts with Cargus or FanCourier (without an aggregator), you can generate AWBs through the Couriers module (/admin/couriers) — configure API keys directly with each courier, without an intermediary.
| Solution | Supported couriers | When to use it |
|---|---|---|
| Innoship | Fan Courier, DPD, Cargus, Sameday, GLS, DHL, + others | You have a contract with Innoship as aggregator |
| Direct Couriers | Cargus, FanCourier | You have a direct contract; want integration without an aggregator |
Tracking:
From the AWB list (/admin/innoship/awb or /admin/couriers/awb), the delivery status is updated automatically via periodic synchronization.
5. Invoice — The payment request
Where: /admin/invoices
Generation:
| Mode | When |
|---|---|
| Automatic at confirmation | If the create_invoice = on option is enabled on the channel — the invoice is generated when the order reaches Shipping status (4) |
| Automatic at delivery | If generation is configured at Delivered status (5) |
| Manual | From the confirmed order, Create Invoice button; or from the delivery note |
Links created:
cart.number_invoice→invoices.idgoods_delivery.invoice_id→invoices.id
Invoice content:
Lines are taken from the order: products, quantities, prices, taxes. The billing address comes from the client profile or from the order.
6. Completed delivery and returns
Delivery confirmation:
When Innoship confirms delivery (product_delivered):
- Packing list status →
wh_delivered - Order status →
Delivered (5) - Stock is definitively deducted from the warehouse
Returns (if applicable):
| Field | Notes |
|---|---|
| Return window | Configurable (default 30 days) |
| Return type | manual, partially, fully |
| Table | wh_order_returns — linked to original_order_id |
| Refund | If the return is approved, a refund is generated in omni_refunds |
Client return → Return Receipt Note (/admin/warehouse/manage_order_return_receipt)
What is created automatically
| Event | Created automatically |
|---|---|
| Order synced from WooCommerce/Shopify | OmniSales order with client and products |
| Order → Confirmed status | Delivery Note with order lines |
| Packing list approved + AWB generated | wh_omni_shipments, Innoship log, status → In Transit |
Order → Shipping status (if create_invoice = on) |
Invoice with order lines |
| Delivery confirmed by Innoship | Order status → Delivered, stock deducted |
Points where the workflow may stall
| Problem | Likely cause | Solution |
|---|---|---|
| Order does not appear from WooCommerce | Sync cron not running or incorrect credentials | Check /admin/woocommerce/stores and cron |
| Delivery note not generated automatically | Auto-create option disabled on channel | Enable from the sales channel settings |
| Error generating AWB | Client address not found in Innoship database | Check the locality spelling; contact Innoship |
| Dimensions/weight missing | Fields were not filled in on the packing list | Fill in all 4 physical fields (mandatory) |
| Stock is 0 but order is confirmed | Insufficient stock in warehouse | Check pending receipt notes or make a stock adjustment |
| Invoice not generated automatically | create_invoice disabled on channel |
Enable from /admin/omni_sales/omni_sales_channel → Edit channel |
Audit and reports
- Sync Audit —
/admin/omni_sales/diary_sync— WooCommerce/Shopify sync log - Innoship Audit Log —
/admin/innoship/audit— all AWB operations - OmniSales Reports —
/admin/omni_sales/report— orders by channel, status, period - Inventory History —
/admin/warehouse/warehouse_history— stock movements
Modules involved — detailed documentation
- Omni Sales Orders · Sales Channels
- Delivery Notes
- Packing Lists
- Innoship Couriers
- Invoices
- WooCommerce · Shopify
- Warehouse Reports
Configure auto-invoice in WooCommerce and Shopify settings to generate a draft CRM invoice automatically when an order reaches a specific status — this eliminates manual invoice creation for every online order.
Check the Channel Sync Audit daily for errors. A single overnight sync failure means customer orders are not in the system — the fulfilment team processes other work while those orders wait without anyone knowing.