Workflow: B2B Portal — Self-Service Client Order
Modules involved: Client Portal · Price Lists · Sales Orders · Clients & Client Groups · Invoices · Warehouse · Proposals · Workflow Automation · Sales Agent
Who uses it: B2B Customers (Resellers, Distributors, Corporate), Sales Agent, Warehouse, Finance
Typical duration: Hours – days (from portal order placement to delivery and invoicing)
Overview
The B2B Portal allows resellers, distributors and corporate customers to place orders directly in CRMConnect without involving the sales agent for every transaction. The customer authenticates in their own portal (/clientarea), sees the catalogue with their negotiated prices (from the Price List assigned to the customer or their customer group), adds products to the cart and places the order — which automatically becomes a Sales Order in the CRM.
The ideal scenario: recurring reorder orders, distributors with consistent volume who no longer need price negotiation for every order. The sales agent is automatically notified and can review/approve the order before processing.
Link to other workflows: Once the order is approved and reaches the warehouse, the picking → packing → AWB flow follows the same path as OmniSales Fulfillment. This document specifically covers the B2B aspects: the client portal, custom pricing and internal approval.
Flow Diagram (ASCII)
B2B CLIENT (Reseller / Distributor / Corporate)
│ authenticated in portal: /clientarea
│ (credentials created by agent or sent automatically on signup)
│
↓
[CATALOGUE WITH CUSTOM PRICES]
│ Price List assigned to client (or group they belong to)
│ negotiated prices, not public prices
│ stock visible (if permission enabled in portal settings)
│ category filtering, product code search, minimum quantity
│
↓
[ORDER PLACED FROM PORTAL]
│ client selects products + quantities → cart → checkout
│ → Sales Order created in CRM with status "Draft" or "Sent"
│ → automatic notification to responsible agent (Workflow Automation)
│ → client confirmation email (if configured)
│
↓
[INTERNAL REVIEW (optional, configurable)]
│ agent checks: stock, credit limit, special prices, additional discount
│ ├── Approved → Sales Order confirmed → status "Accepted"
│ ├── Modified → agent adjusts lines → client notified in portal
│ └── Rejected → client notified with reason → can place new order
│
↓
[WAREHOUSE PROCESSING]
│ Delivery Note generated from confirmed Sales Order
│ Packing List → Picking → AWB generated (Innoship / Couriers)
│ status visible in client portal (if view permission enabled)
│
↓
[INVOICING]
│ invoice generated from Sales Order or on shipping
│ visible in portal → Invoices tab
│ client can download PDF
│ online payment via gateway (if configured)
│
↓
[HISTORY IN PORTAL]
│ client sees all orders + statuses + invoices + delivery notes
│ can reorder a previous order (if feature is active)
│
[ORDER COMPLETE ✓]
Step by Step
1. Configuring B2B client portal access
Where: /admin/clients → client record → Portal tab
Before a customer can use the B2B portal, the agent configures:
Portal credentials:
| Field | Where | Notes |
|---|---|---|
| Portal email | Client record → Primary contact | Authentication email |
| Password | Sent via automatic email or set manually | Client changes it on first login |
| Portal permissions | Per-client settings: stock view, document download, order placement | Granularly configurable |
Client group:
If multiple customers share the same commercial terms, group them:
/admin/clients→ Client Groups → Create group (e.g. "Tier 1 Distributors", "South Resellers")- Assign client to group
- Assign Price List to group (price applies automatically to all clients in the group)
Access check: Client authenticates at /clientarea with the configured email and password.
2. The custom price catalogue
Where: Client portal /clientarea → Orders / Catalogue section
The customer sees only their prices, not the public prices. The mechanism:
Price hierarchy applied in the portal:
| Priority | Price source | Condition |
|---|---|---|
| 1 (most specific) | Price List assigned directly to the client | partner_client = id_client |
| 2 | Price List assigned to the client's group | partner_group = id_group |
| 3 | Active promotional Price List | ispromotion = 1 + within date window |
| 4 | Default Price List | is_default = 1 |
| 5 | Standard product price | Fallback — if product is not in any price list |
Configuring Price List per client:
/admin/sales/price_lists→ Add or Edit existing price list- Partner Client field → select the client
- Or Partner Group field → select the client group
- Fill in prices for each catalogue product
Practical tip: Use the Clone function on an existing Price List to quickly create variants for similar clients. Adjust only the products with different prices.
Stock visible in catalogue:
- Configurable in portal settings per client or globally
- Client can see
qty_available— the quantity available for reservation - Useful to prevent orders on 0 stock; disable if you don't want to reveal actual stock
3. Placing the order from the portal
Where: Portal /clientarea → New order / Cart
Order placement flow:
- Client browses the catalogue or searches by product code / name
- Adds desired products with quantities (respecting minimum quantity if set)
- Reviews cart: products, quantities, unit prices, total
- Selects delivery address (from saved addresses or enters a new one)
- Optional: adds notes / own order reference (e.g. client's internal PO number)
- Completes order → Order placed
What gets created in the CRM when an order is placed:
| Document | Initial status | Note |
|---|---|---|
| Sales Order | Draft (1) or Sent (2) | Configurable — sent directly or in draft for review |
| Agent notification | — | Automatic email/task via Workflow Automation |
| Client confirmation | — | Optional automatic email |
Key fields on the Sales Order created from portal:
| Field | Value | Notes |
|---|---|---|
clientid |
ID of authenticated client | Link to client record |
sale_agent |
ID of responsible agent | Agent associated with client |
price_list_id |
Applied Price List ID | Client's prices |
| Product lines | From client's cart | Quantities + prices from Price List |
| Client notes | Notes field from portal | Internal PO reference, delivery instructions |
Sales Order statuses:
| Code | Status | Description |
|---|---|---|
| 1 | Draft | Created, unreviewed by agent |
| 2 | Sent | Visible to client in portal as sent |
| 3 | Declined | Rejected internally (client notified) |
| 4 | Accepted | Confirmed → can generate invoice/delivery note |
| 5 | Expired | Expiry date passed |
4. Automatic notification and internal review (optional)
Where: /admin/estimates · /admin/workflow_automation
4.1 Automatic agent notification
When an order is placed from the portal, Workflow Automation automatically triggers the notification:
Workflow Automation configuration:
- Trigger: Sales Order → Created (or Status Changed to Draft)
- Condition (optional):
sale_agent = Agent X→ notify only the responsible agent - Actions:
- Send Email → responsible agent: "New order from [Client] — [amount]"
- Create Task → review task assigned to agent (if mandatory approval)
- Webhook → external integration (Slack, Teams) if used
4.2 Agent review
The agent opens the Sales Order from the notification or from /admin/estimates:
What the agent checks:
| Check | Where | Action if issue |
|---|---|---|
| Available stock | Product record → Inventory | Contact warehouse; propose alternative delivery date |
| Client credit limit | Client record → Balance | If exceeded: Hold until regularised |
| Correct prices | Sales Order lines | Compare with Price List; correct if error |
| Additional discount | Negotiated by phone | Add discount on line or globally on Sales Order |
| Delivery address | Delivery tab | Verify new address is correct |
Review scenarios:
Order OK → Sales Order: status Accepted (4) → continues to warehouse
Order needs modification →
Agent edits lines
Client notified via portal / email
Client confirms modifications (or places new order)
Order rejected (e.g. client blocked on payment) →
Sales Order: status Declined (3)
Automatic email to client with reason
Approval without review: If the customer is trusted and prices are standardised, you can configure automatic approval — Sales Order moves directly to Accepted without human intervention (Workflow Automation → Update Field: status = 4).
5. If the client requests a quote before ordering — Proposals
Where: /admin/proposals
Some B2B customers request a formal quote before placing an order (tenders, internal budget approval).
Flow with Proposal:
Client requests quote (phone/email) → Agent creates Proposal in CRM
│ Proposal sent → portal link or email
│ Client reviews in portal
│
├── Accepted → Convert Proposal → Sales Order (order)
│ → rest of normal flow
│
└── Negotiations → agent updates Proposal (versions)
→ sends again
Proposal statuses:
| Code | Status |
|---|---|
| 6 | Draft |
| 4 | Sent — sent to client |
| 1 | Open/Viewed — client opened the link |
| 3 | Accepted |
| 2 | Declined |
| 5 | Revised — new version sent |
6. Warehouse processing
Where: /admin/warehouse/manage_delivery · /admin/warehouse/manage_packing_list
Once the Sales Order is confirmed (Accepted status), the flow enters the warehouse:
Creating the Delivery Note:
- Automatic from confirmed Sales Order → if
auto_create_goods_delivery = 1 - Or manual: from Sales Order → Generate Delivery Note button
Picking → Packing → AWB: Same flow as in OmniSales Fulfillment, sections 2-4:
- Delivery Note (
ready_for_packing) - Packing List with parcel dimensions
- AWB generated via Innoship or direct Couriers
- Status updated → visible in client portal
Status visibility in portal:
| What client sees | Condition |
|---|---|
| Sales Order status: Draft / Accepted / Declined | Always |
| Delivery status: Preparing / Shipped / Delivered | If status view permission is enabled |
| AWB number + courier tracking link | If sent in email or displayed in portal |
7. Invoicing and payment
Where: /admin/invoices · Client portal /clientarea → Invoices tab
Invoice generation:
| Mode | Trigger | Configuration |
|---|---|---|
| Automatic on Sales Order Accepted | Sales Order confirmed | estimate_auto_convert_to_invoice_on_client_accept = 1 |
| Automatic on shipping | AWB generated / Shipping status | Channel settings or Workflow Automation |
| Manual | Operator from Sales Order → Convert to Invoice | Default |
Invoice in the client portal:
Once generated, the invoice appears in the client portal:
- Invoices tab → invoice list with status (Draft / Sent / Paid / Overdue)
- Download PDF — client downloads the invoice for their own accounting
- Online payment — if payment gateway configured (Stripe, PayU, etc.) → "Pay now" button
- Total balance — summary of amounts owed per client
B2B payment terms: The payment term (30, 60, 90 days) is set on the client record and automatically carried over to the invoice. The invoice appears with Overdue (4) status if the term is exceeded — automatically triggers reminder emails via Workflow Automation.
eInvoice B2B: If the customer is a legal entity with a VAT number → eInvoice automatically sent to ANAF on invoice issue (same mechanism as in E-commerce Fulfillment).
8. Order history in the portal
Where: Portal /clientarea → Orders / Invoices section
The B2B customer has full visibility of the commercial relationship history:
| Portal section | Contents | Available actions |
|---|---|---|
| Orders | All Sales Orders (statuses, dates, amounts) | View detail, place similar order |
| Invoices | All invoices with payment status | PDF download, online payment |
| Delivery Notes | Issued delivery notes | PDF download |
| Proposals | Quotes sent by agent | Accept / Decline |
| Profile | Company data, addresses, contacts | Self-service editing |
Practical tip — recurring orders: If the client places the same order monthly (e.g. standard reorder), the agent can create a Sales Order Template or enable recurring invoicing to automate periodic orders.
What gets created automatically
| Trigger event | Automatically created document | Condition |
|---|---|---|
| Client places order from portal | Sales Order with order lines | Portal active, client authenticated |
| Sales Order created | Agent notification (email + task) | Workflow Automation configured |
| Sales Order created | Confirmation email to client | Email template configured for event |
| Sales Order Accepted | Delivery Note | auto_create_goods_delivery = 1 |
| Delivery Note approved | Stock decremented from warehouse | Automatic on approval |
| Packing List + AWB generated | wh_omni_shipments, tracking number |
Innoship API configured |
| Sales Order Accepted | Invoice (if auto-convert enabled) | estimate_auto_convert_to_invoice_on_client_accept = 1 |
| Invoice issued, B2B client with VAT number | eInvoice XML sent to ANAF | eInvoice module active |
| Invoice Overdue | Payment reminder email to client | Workflow Automation configured |
Where the flow can stall
| Problem | Probable cause | Solution |
|---|---|---|
| Client cannot authenticate in portal | Incorrect credentials or deactivated account | Password reset from client record → /admin/clients |
| Client doesn't see negotiated prices | Price List not assigned to client or group | Check in /admin/sales/price_lists that client is set as Partner Client |
| Client sees public prices, not negotiated ones | Default Price List active and has wrong priority | Check hierarchy: Price List per client > per group > default |
| 0 stock visible in catalogue but physically exists | CRM inventory not updated | Check pending receipt notes; manually update stock if needed |
Placed order not appearing in /admin/estimates |
Portal workflow not triggered, application error | Check application logs; if persistent, contact technical support |
| Agent not receiving the notification | Workflow Automation inactive or wrong condition | Check /admin/workflow_automation → Sales Order Created workflow |
| Sales Order stuck in Draft — nobody approves | Responsible agent absent or unclear process | Automatic delegation: Workflow Automation → if Draft > 24h → manager task |
| Delivery note blocked (insufficient stock) | Stock consumed between order placement and processing | Contact client; propose alternative delivery date or partial delivery |
| Invoice not appearing in client portal | Invoice status in Draft, not Sent | Change invoice status to Sent (status = 1) |
| Credit limit exceeded, order blocked | Balance owed exceeds set credit limit | Regularise client balance or temporarily increase credit limit |
| Client cannot download invoice PDF | Download permission disabled on portal account | Enable from portal settings per client |
Relevant reports
| Report | URL | What to monitor |
|---|---|---|
| B2B orders (Sales Orders) per client | /admin/estimates filter by client |
Order volume per client, frequency |
| Unconfirmed Sales Orders | /admin/estimates?status=1 (Draft) |
Orders awaiting review — approval SLA |
| Uncollected B2B invoices | /admin/invoices?status=1 |
Cash flow, client receivables |
| Overdue invoices | /admin/invoices?status=4 |
Receivables collection, escalation |
| Clients per group / Price List | /admin/clients group filter |
Portfolio segmentation |
| Sales agent report | /admin/sales/sales_agent |
Orders attributed per agent |
| Client portal activity | Portal logs | Access frequency, last login |
| Current stock vs minimum | /admin/warehouse/warehouse_history + Commodities |
Anticipate stockouts for recurring B2B orders |
Modules involved — detailed documentation
Portal & Clients: Client Portal · Clients & Client Groups
Prices & Orders: Price Lists · Sales Orders · Proposals
Warehouse: Delivery Notes · Packing Lists · Inventory History
Automation: Workflow Automation
Sales team: Sales Agent
Related workflows: Lead → Cash · OmniSales Fulfillment · E-commerce Fulfillment · Full Commercial Cycle
Assign the correct Price List to each client before granting portal access — the B2B portal catalog displays personalised prices from the assigned list, so without the right list a client sees incorrect pricing from the first login.
B2B portal permissions are granular per contact, not per company. A single company can have multiple contacts with different access levels — configure permissions per contact rather than assuming all contacts from the same company see the same data.