Dockolo
DashboardNEWSales ordersFulfilmentsDispatchesReturnsInvoicesCustomersPrice listsCampaignsAvailabilitySetup ▾

Wholesale dashboard

Module 180 · new landing page (today the module root redirects to Branding)

Storage: All ▾ SEK
Proposal, 12 Oct 2026. These are 22 candidate widgets on the existing v3 widget engine (provideModuleDashboard, Mise widget host and shell). Each widget is backed by a field module 180 already has. Use MVP / Phase 2 / Drop under each card to make your picks, then answer the questions at the bottom and copy your decisions.
EXISTS endpoint already in API SUMMARY one new wholesale/dashboard/summary call NEW own new report endpoint

Act now

Operations: the current state, not affected by the period
WholesaleOrders to fulfil today
23orders5 past due
Delivery date ≤ today, not yet dispatched · 312 lines
codeIndex
400 · count · small · urgent
Rule
SalesOrder.status = SUBMITTED, deliveryDate ≤ today, no fulfilment ≥ DISPATCHED
Source
SUMMARY
Drill
Fulfilments ?due=today
WholesaleFulfilment pipeline
Reserved14
Picking9
Picked6
Packed11
Dispatched today31
codeIndex
401 · breakdown · medium
Rule
Fulfilment.status counts RESERVED→PACKED (open), plus DISPATCHED where Dispatch.collectedAt is today
Source
SUMMARY
Drill
each part → Fulfilments ?status=…
View all fulfilments →Main warehouse + 1 storage
WholesaleOrders on credit hold
  • Restaurang Lyktan ABSO-10482 · held 2 h
    18 420 kr
  • Café SmultronSO-10477 · held 1 d
    4 960 kr
  • Hotell NorrskenSO-10469 · held 2 d
    32 115 kr
codeIndex
402 · item-list · small · urgent
Rule
creditHeldAt set, creditReleasedAt null
Source
EXISTS GET wholesale-sales-orders/credit-held
Drill
row → sales order (release action lives there)
WholesaleStale orders
  • Bistro AnkaretSO-10401 · delivery 3 Oct
    9 d over
  • Skolköket VästSO-10388 · delivery 6 Oct
    6 d over
  • Pizzeria MonteSO-10412 · delivery 8 Oct
    auto-cancel in 2 d
codeIndex
403 · item-list · small
Rule
past grace days; shows the auto-cancel countdown when the action is AUTO_CANCEL
Source
EXISTS GET wholesale-sales-orders/stale
Drill
row → sales order
WholesaleCustomers waiting for stock
  • Burrata 125 gOut of stock
    7 waiting
  • Pecorino Romano 1 kgOut of stock
    4 waiting
  • Guanciale ca 1,2 kgLow stock
    2 waiting
codeIndex
404 · item-list · small
Rule
StockNotificationRequest: notifiedAt null, not cancelled, grouped by product, ordered by count
Source
NEW grouped read
Drill
row → Availability ?product=
Why
lost sales you can still recover with a purchase order
WholesaleReturns awaiting a decision
6returns
4 without restock/waste decision · 2 not yet credited
codeIndex
405 · count · small
Rule
Return.disposition = UNSPECIFIED, or creditApplied = false
Source
SUMMARY
Drill
Returns ?open=true

Money

Receivables and invoicing: the current state
WholesaleOpen receivables
1 284 600kr
142 unpaid invoices · 212 380 kr overdue
codeIndex
406 · count (currency) · small
Rule
Invoice.status ISSUED/SENT, paidAt null; credit notes net off
Source
SUMMARY
Drill
Invoices ?unpaid=true
WholesaleOverdue ageing
060k120k 118 4001–30 d 64 12031–60 d 22 86061–90 d 7 00090+ d
codeIndex
407 · chart (bar) · medium
Rule
unpaid invoices by days past dueDate
Source
SUMMARY
Drill
bar → Invoices ?overdue=31-60
Overdue invoices →38 invoices · 21 customers
WholesaleDispatched, not invoiced
9fulfilments
46 210 kr not billed yet · oldest 3 days
codeIndex
409 · count · small · urgent
Rule
Fulfilment.status = DISPATCHED (not INVOICED) for more than 24 h
Source
SUMMARY
Drill
Fulfilments ?status=dispatched
Why
revenue leak: the goods have left and no invoice exists
WholesaleCredit limit exposure
Hotell Norrsken112 % Restaurang Lyktan AB94 % Café Smultron88 % Sushi Kaze71 %
codeIndex
408 · chart (bar-h) · medium
Rule
customers with credit control on, exposure / creditLimit ≥ 70 %
Source
NEW company-wide list (per-customer customers/:id/credit-exposure exists)
Drill
bar → customer, credit tab
WholesaleInvoice delivery failures
2invoices
Email bounced (1) · Peppol rejected (1)
codeIndex
410 · count · small
Rule
InvoiceDelivery.status = FAILED, latest attempt per invoice
Source
SUMMARY
Drill
Invoices ?delivery=failed

Sales

Follows the period switch · net of VAT · compared with the previous period
WholesaleNet sales
2 418 900kr▲ 8,4 %
vs previous 30 days · + 3 orders in EUR not included
codeIndex
411 · count (currency) + delta · small
Rule
SUBMITTED orders by submittedAt, sum netAmount, cancelled excluded
Source
SUMMARY
Drill
Sales orders ?from&to
WholesaleOrders
614orders▲ 4,1 %
from 87 customers
codeIndex
412 · count + delta · small
Source
SUMMARY
Drill
Sales orders
WholesaleAverage order value
3 940kr▲ 4,2 %
Min. order value 1 500 kr · 12 orders below free freight
codeIndex
413 · count (currency) + delta · small
Source
SUMMARY
Note
the "below free freight" line uses the storefront thresholds; drop it if it is too much
WholesaleSales trend
400k550k700k v31v34v37v40v42
━ this year┅ same weeks last year
codeIndex
414 · chart (line) · medium · uses the header actions slot (#9908)
Source
NEW time series endpoint
Drill
point → Sales orders for that week
WholesaleTop customers
Hotell Norrsken214k Restaurang Lyktan167k Skolköket Väst131k Sushi Kaze94k Bistro Ankaret83k
codeIndex
415 · chart (bar-h) · small
Source
NEW top-N endpoint
Drill
bar → customer
WholesaleTop products
Mozzarella fior di latte96k San Marzano 2,5 kg69k Olivolja EV 5 l61k Burrata 125 g48k
codeIndex
416 · chart (bar-h) · small
Rule
SalesOrderDetail net by product
Source
NEW top-N endpoint (same endpoint as 415, different grouping)
Drill
bar → catalogue product
WholesaleWhere orders come from
Webshop58 %
Entered by staff27 %
From KitchenFlow buyers15 %
codeIndex
417 · chart (donut) · small
Rule
customerUserId set → webshop; sourceOrderId set → handed over from a linked buyer's ordering module; otherwise → staff
Source
SUMMARY
Why
shows how many customers have moved onto self-service
WholesaleCustomers gone quiet
  • Trattoria Soleusually weekly · last 26 Sep
    16 d
  • Kafé Linnéusually 2×/week · last 1 Oct
    11 d
  • Grill 27usually weekly · last 15 Sep
    27 d
codeIndex
418 · item-list · small
Rule
customer's gap since the last order > 2× their median gap over 90 days
Source
NEW
Drill
row → customer
WholesaleCampaigns ending soon
  • Höstpasta −15 %ends 15 Oct · 214 lines sold
    3 d
  • Köp 10 få 1 – Burrataends 19 Oct
    7 d
codeIndex
419 · item-list · small
Rule
published + active, validTo within 7 days
Source
campaigns list + filter (lines sold = NEW)

Catalogue & compliance

Setup problems that cost money or break the webshop
WholesaleProducts with no price
17products
across 2 price lists · hidden from the webshop
codeIndex
420 · count · small
Source
EXISTS per list: wholesale-price-lists/:id/price-coverage/summary; one company-wide roll-up wanted
Drill
Price lists
WholesaleVAT risks
  • Reverse charge, VAT no. not verifiedEU business customers
    4 orders
  • Cross-border consumer salesOSS threshold watch
    1 customer
codeIndex
421 · breakdown · small
Source
EXISTS wholesale-vat-risks/unverified-reverse-charge + /cross-border-consumer-sales
Drill
the two VAT-risk reports (#8699)

Open questions

1 · Module landing. Should the Wholesale root open the dashboard instead of Branding?

Recommended: yes. Branding is set up once, but the dashboard is checked every day.

2 · Several currencies. Orders and invoices carry their own currency, and the model has no FX rates. How should money widgets show totals?

Recommended: company currency plus a footnote ("+ 3 orders in EUR not included"), as drawn above.

3 · What counts as a sale?

Recommended: submitted orders, because they show demand immediately. Invoiced money is already covered by the Money group.

4 · Amounts net or with VAT?

Recommended: net amounts for sales. Receivables are amounts owed, so they show totals including VAT.

5 · Who sees what? Widget visibility per role goes through the existing dashboard-widget-roles.

Recommended: split by role. Warehouse staff should not see receivables.

Summary & build split

codeIndexWidgetGroupBodySourceYour pick

API.v2: one bazaro-report wholesale controller (dashboard/summary with all the counts, plus a time series and top-N) and a migration that seeds Application.DashboardWidgets rows (codeIndex 400–421, module 180). The schema is code-first, so there is no DB repo story.
WEB.v3: features/wholesale/pages/dashboard, a wholesale-widget-registry.ts and provideModuleDashboard({ moduleCodeIndex: 180 }), and the root redirect pointed at the dashboard.
DS: MiseModule has no wholesale accent yet (it has invoice, kitchen, supplier, esign and support), so Mise needs a release before v3 can use one.
The codeIndex range 400–421 is free in v3 today; it is only a proposal.

Prototype · Dockolo Dashboard Proposal · 2026-10-19 All prototypes