OMS & E-commerce — Order Management System
Roles covered: OMS Operator · E-commerce Manager · Channel Administrator · Returns Supervisor
Primary modules: OmniSales (Orders · Channels · Discounts · Reports) · Warehouse (Delivery Notes · Packing Lists) · Innoship · Invoices
Who this guide is for
| Role | What they do in CRMConnect |
|---|---|
| OMS Operator | Processes daily orders: confirms, generates delivery notes, tracks deliveries |
| E-commerce Manager | Configures sales channels, approval rules, trade discounts |
| Channel Administrator | Manages WooCommerce/Shopify synchronisation, resolves sync errors |
| Returns Supervisor | Processes return requests, approves stock returns, manages refunds |
OmniSales module map
SALES CHANNELS ORDERS (CART)
────────────── ─────────────
POS (Point of Sale) Draft (0)
B2B Portal (clients) Processing (1)
WooCommerce Pending Payment (2)
Shopify Confirmed (3) ──→ auto invoice
Manual (staff) Shipping (4)
Pre-order Delivered (5) ✓
DISCOUNTS FULFILLMENT
───────── ───────────
Trade Discounts Delivery Note
Voucher Codes Packing List
Per client/group discounts Innoship AWB
Per product/channel discounts Courier tracking
RETURNS REPORTS & AUDIT
─────── ───────────────
Client return request OmniSales reports
Return approval Sync audit (diary_sync)
Stock restitution Revenue per channel
Refund Discount effectiveness
Recommended daily routine
Morning (20–30 min)
1. New unconfirmed orders/admin/omni_sales/order_list → filter status Draft (0) or Processing (1)
Review and confirm orders received overnight (from WooCommerce, B2B portal).
2. Orders awaiting approvalapprove_status = 0 — Orders blocked in the approval flow
Process them or send to the relevant approver.
3. Check WooCommerce sync/admin/omni_sales/diary_sync → Orders tab
Check whether the automatic import ran correctly — identify import errors.
4. Packing lists to complete/admin/warehouse/manage_packing_list — Incomplete parcels
Fill in dimensions and weight to generate the AWB.
5. New returns/admin/omni_sales → Returns tab — new requests from clients
Review and make the approval decision.
During the day
New order (any channel)
↓ Check products + prices + client
↓ Confirm (status 0→3)
↓ Invoice auto-generated (if configured)
↓ Delivery note created (manual or automatic)
↓ Picking + Packing + AWB
↓ Hand to courier → status → Shipping (4)
↓ Courier confirms delivery → status → Delivered (5)
Weekly
- OmniSales reports — revenue per channel, order volume, top products
- Sync audit — imported orders vs. errors in the last 7 days
- Discounts — check if discount rules are expiring soon
- Returns — reconciliation of approved returns vs. re-entered stock
Sales channels
Where: /admin/omni_sales/omni_sales_channel
Available channel types
| Channel | channel |
channel_id |
Who places the order |
|---|---|---|---|
| POS | pos |
1 | Staff at counter/terminal |
| B2B Portal | portal |
2 | Client online in their own portal |
| WooCommerce | woocommerce |
3 | Buyers from the online store |
| Manual | — | 4 | Staff in CRM admin |
| Pre-order | pre_order |
— | Orders with future delivery |
| API | — | — | External systems via REST API |
Configuration per channel
| Setting | Description |
|---|---|
| Auto-confirm | Order automatically moves to status 3 without manual approval |
| Auto-invoice | Invoice auto-generated on confirmation (create_invoice = on) |
| Allowed payment methods | What payment methods the channel accepts |
| Price list | Channel-specific prices (override standard price) |
| Client groups | Who has access to the channel |
| Delivery fee | Default shipping cost per channel |
Operational differences per channel
POS:
- Immediate payment (cash/card at counter)
- Receipt automatically generated (configurable template:
bill_header_pos,bill_footer_pos) - Work shifts with tracking per operator
B2B Portal:
- Client authenticates and browses the catalogue
- Sees prices negotiated with them (per channel or per group)
- Places order → goes to approval if configured
- Receives confirmation email
WooCommerce:
- Orders import automatically via cron (configurable frequency per store)
- Client auto-created in CRM if they don't exist
- Statuses sync bidirectionally (CRM → WooCommerce)
Order statuses — complete guide
| Code | Status | What you do |
|---|---|---|
| 0 | Draft | Order received, unverified. Review data, products, price. |
| 1 | Processing | Stock and availability verification. |
| 2 | Pending Payment | Waiting for upfront payment from client (B2B with advance payment). |
| 3 | Confirmed | Order validated. Invoice (if configured) and delivery note generated. |
| 4 | Shipping | Parcel collected by courier, AWB generated. |
| 5 | Delivered | Delivery confirmed. Complete cycle. |
| 6 | Refund | Refund processed. |
| 7 | Return | Full return approved and processed. |
| 8 | Cancelled | Order cancelled (by client or staff). |
| 9 | On Hold | Temporarily suspended (stock shortage, payment issue). |
| 10 | Failed | Failed (payment rejected, processing error). |
| 11 | Return Pending | Return request awaiting approval. |
| 12 | Partial Return | Partial return — only some products returned. |
| 13 | Partial Refund | Partial refund processed. |
| 14 | Paid | Paid in full. |
| 15 | Ready | Ready for delivery (stock reserved). |
| 16 | Stock Unavailable | Order received but product is out of stock. |
Approval flow (`approve_status`)
| Value | Meaning |
|---|---|
0 |
Pending — awaiting approval |
1 |
Approved — can be confirmed |
-1 |
Rejected — client is notified |
Approval rules are configured per channel and order type in OmniSales settings (
omni_order_approval_rules). Example: all B2B portal orders > 10,000 need sales manager approval.
Order processing step by step
B2B Portal order
1. Client places order → status: Draft (0)
↓
2. Automatic notification → OMS Operator
↓
3. Operator opens order:
- Checks products and quantities
- Checks price and applied discounts
- Checks delivery address
↓
4. Sends to approval (if rule is active)
→ Manager approves → approve_status = 1
↓ (or if no approval required: directly to step 5)
5. Confirm → status: Confirmed (3)
→ Invoice auto-generated (if create_invoice = on)
→ Delivery note auto-created (if auto_create_goods_delivery = on)
↓
6. Warehouse: picking + packing + weighing
↓
7. Generate Innoship AWB → status: Shipping (4)
↓
8. Courier confirms delivery → status: Delivered (5)
WooCommerce order
1. Cron runs at configured interval (e.g. every 15 min)
→ Imports new orders from WooCommerce API
→ Creates cart + cart_detail + client (if new)
→ Status: corresponding to WooCommerce status
↓
2. Operator sees new order in OmniSales list
(Notification if approval rule is active)
↓
3. If WooCommerce status = Processing → CRM status = 1 (Processing)
Operator confirms → status = 3 → invoice + delivery note
↓
4. On status change in CRM → automatic update in WooCommerce
(Bidirectional sync)
Back-order (status 16 — Stock Unavailable)
Order received → stock check → OUT OF STOCK
↓ status: 16 (Stock Unavailable)
What you do:
1. Notify Procurement → create RFQ for the missing product
2. Order stays in status 16 until replenished
3. When stock arrives (receipt note approved):
→ Manually change status to 3 (Confirmed)
→ Create delivery note
→ Continue normal flow
Important: The system does not automatically promote orders from status 16. Monitor the stock-unavailable order list manually.
B2B Portal — client perspective
Portal URL: /omni_sales/omni_sales_client/
What the B2B client can do
| Action | Details |
|---|---|
| Browse catalogue | Filter by categories, subcategories, keyword search |
| See their prices | Prices specific to portal channel or their client group |
| Apply voucher | Specific discount code (if they know the code) |
| Place order | Add to cart, fill in address, select payment method |
| Track order | Real-time order status |
| Request return | If order is delivered and within return window |
| View history | All previous orders |
Product visibility configuration
You can restrict what each B2B client sees:
- Per client group —
customer_groupfield on portal channel - Per specific client —
customerfield with client IDs - Per department — if
omni_show_products_by_department = 1
B2B pricing
Prices are applied in order:
- Client-specific price — from
sales_channel_detail.prices+ discount ruleomni_trade_discount.clients - Client group price — group discount from
omni_trade_discount.group_clients - Channel price — price configured on the Portal channel
- Standard price — price from the item catalogue
Trade Discounts
Where: /admin/omni_sales/trade_discount
Discount structure
| Field | Notes |
|---|---|
name_trade_discount |
Internal name of the rule |
start_time / end_time |
Validity period |
formal |
0 = fixed amount / 1 = percentage |
discount |
Discount value (e.g. 15 for 15%) |
minimum_order_value |
Minimum order value for activation |
voucher |
Voucher code (empty = applied automatically) |
channel |
0 = all channels / specific channel ID |
Applicability
| Dimension | Field | Examples |
|---|---|---|
| Per specific client | clients |
Eligible client IDs |
| Per client group | group_clients |
VIP, Wholesale, Retail |
| Per specific product | items |
Discounted product IDs |
| Per product group | group_items |
Electronics, Textiles, Furniture |
| Per channel | channel |
POS only, Portal only, all |
| Per WooCommerce store | store |
Specific store ID |
Discount types
| Type | formal |
Example |
|---|---|---|
| Percentage | 1 |
10% off all products in the Electronics category |
| Fixed amount | 0 |
50 off orders over 500 |
| Voucher code | any | Client enters code "PROMO2026" → -15% |
| Automatic | any (no voucher) | Applied without code if client meets criteria |
Applied discount log
Each discount applied to an order is automatically recorded in omni_log_discount:
- Client, product, order
- Original price vs. price after discount
- Saved value
- Channel and voucher code (if applicable)
Useful for reporting discount campaign effectiveness.
Returns — complete process
Where: /admin/omni_sales → Returns tab or /admin/warehouse/manage_order_return_receipt
Initiating the return
From client (from B2B portal):
- Client accesses order history
- Selects delivered order (status 5)
- Clicks "Request Return"
- System checks:
omni_return_request_within_x_day(default 30 days from delivery) - Client selects products + quantities + reason
- Request arrives at you in CRM with status
approval = 0
From operator (manually): From the delivered order → Create Return button → fill in items, quantities and reason.
Key fields on the OmniSales return
| Field | Notes |
|---|---|
rel_id |
ID of the original order (cart.id) |
return_type |
manual / partially / fully |
fee_return_order |
Restocking fee (configurable globally or per vendor) |
return_reason |
Return reason (free text) |
approval |
0=pending / 1=approved / 2=rejected |
receipt_delivery_id |
Receipt note created when stock re-enters |
refund_loyaty_point |
Whether loyalty points are refunded |
Return statuses and your actions
approval |
Status | Your action |
|---|---|---|
0 |
Pending | Review the request, check if within return window |
1 |
Approved | Stock is automatically reintegrated; process refund |
2 |
Rejected | Rejection reason communicated to client |
On return approval
Automatically created:
- Return receipt note — goods re-entered into stock (
receipt_delivery_idfilled in) - Stock transaction —
inventory_manage.inventory_number += quantity - Refund record — in
omni_refundswith amount and payment method
Refund
Where: From the approved return → Process Refund
Refund fields (omni_refunds):
amount— Amount to refund (original − return fee)payment_mode— Refund method (same channel as original payment)refunded_on— Refund datenote— Internal notes
Loyalty points: If omni_refund_loyaty_point = 1 → points earned on the original order are automatically reversed.
Return policy configuration
Where: /admin/omni_sales/setting
| Setting | Recommended value |
|---|---|
omni_return_request_within_x_day |
14–30 days (per commercial policy) |
omni_fee_for_return_order |
0–10% of order value |
omni_return_policies_information |
Policy text displayed to client on return |
omni_refund_loyaty_point |
1 — refund points |
WooCommerce synchronisation
Where: /admin/omni_sales/diary_sync
What syncs bidirectionally
| Direction | What syncs | Frequency |
|---|---|---|
| CRM → WooCommerce | Product prices (time3) |
Configurable per store |
| CRM → WooCommerce | Stock (time2) |
Configurable per store |
| CRM → WooCommerce | Product descriptions (time4) |
Configurable per store |
| CRM → WooCommerce | Product images (time5) |
Configurable per store |
| WooCommerce → CRM | New orders (time6) |
Configurable per store |
| WooCommerce → CRM | Existing order statuses | Every time6 sync |
Resolving sync errors
Most common errors in diary_sync:
| Error | Cause | Solution |
|---|---|---|
| Order not duplicated | WooCommerce product SKU doesn't exist in CRM | Create the product in CRM with the same SKU |
| Client not created | Invalid or duplicate client email | Manually check and fix the client record |
| Payment not recognised | WooCommerce payment method not mapped | Add mapping in channel settings |
| API timeout | WooCommerce store inaccessible | Check store availability; manual retry |
| Status not recognised | WooCommerce status without CRM equivalent | Add mapping in get_status_by_index_woo() |
OmniSales Reports
Where: /admin/omni_sales/report
Available reports
| Report | What you analyse |
|---|---|
| Revenue per channel | How much POS vs. Portal vs. WooCommerce generated |
| Order volume per period | Daily/weekly/monthly order trend |
| Trade discounts | What discounts were applied, on which products, for which clients |
| Returns | Return rate per channel, per product, per period |
| Top products | Best-selling products per channel |
| WooCommerce sync audit | Imported orders vs. errors |
Integration with other departments
| Department | Interaction |
|---|---|
| Sales | Confirmed orders feed the sales pipeline; the sales agent is visible on the order (seller) |
| Warehouse | Delivery notes and packing lists are generated from confirmed OmniSales orders |
| Finance | Invoices auto-generated from confirmed orders; payments reconciled with bank statement |
| Procurement | On insufficient stock (status 16), OMS operator notifies procurement for RFQ |
| Marketing | Trade discounts and vouchers are marketing tools coordinated with the marketing team |
| Customer Support | Clients with order problems open tickets — OMS operator involved in resolution |
Workflow Automation for OMS
Configurable in Workflow Automation (/admin/workflow_automation):
| Trigger | Automatic action | Benefit |
|---|---|---|
| New B2B Portal order | Push notification to OMS Operator | Immediate processing |
| Order > 5,000 | Manager approval task | Large order control |
| Order status → Confirmed | Create delivery note + warehouse notification | Automatic fulfillment |
| Order status → Delivered | Review email → client | Feedback collection |
| Status → 16 (Stock unavailable) | Task "Urgent procurement" → Acquisitions | Back-order managed |
| Return approved | Confirmation email → client + task "Process refund" | Fast communication |
| WooCommerce sync error | Channel Administrator notification | Fast intervention |
Recommended permissions
Ask the administrator at /admin/roles:
| Permission | Required for |
|---|---|
| OmniSales → View / Create / Edit | Full order access |
| OmniSales → Approve | Order approval (for managers) |
| Trade Discounts → View / Create | Discount management |
| Warehouse → Delivery Notes | Create delivery notes |
| Innoship → AWB | Generate courier AWB |
| Returns → View / Approve | Return management |
| Reports → OmniSales | Report access |
| Settings → OmniSales | Channel configuration (admin) |
Quick reference
Workflows: OmniSales Fulfillment · Full Commercial Cycle · Warehouse Inbound → Outbound
Modules: Omni Sales Orders · Sales Channels · Trade Discounts · Channel Sync Audit · Omni Sales Reports · Omni Sales Settings · Delivery Notes · Packing Lists · Innoship Couriers · WooCommerce · Shopify
Related departments: Sales Department · Warehouse & Logistics · Finance Department · Acquisitions Department
Channel Sync Audit is the OMS department's health monitor — check it first every morning. Zero errors means all orders are flowing from every connected channel; errors mean customers are waiting for orders they placed without knowing there is a problem.
Marketing Automation handles timed nurture sequences and Marketing Planner handles bulk sends — they serve different purposes. Avoid duplicating the same message in both systems, which sends double communications and inflates unsubscribe rates.