Today, Control Tower & Lens
Today, Control Tower, and Lens at the top of the sidebar.
Today (/today)
The Today home (/dashboard redirects here) is a customizable widget board. Admins set a default layout per role; each user can add, remove, reorder and resize widgets on top of that, then Reset to default. Layout is saved on the server (same board on every device). Polls published by HR still appear as a prompt at the top of the shell.
Focus bar
At the top of Today you can narrow all widgets by agents, regions, warehouses, customers and customer groups. Save named focuses (e.g. “My team”, “North”), switch with one click, and mark one as your default. Focus always respects warehouse and customer access — you never see another agent’s documents without sales.documents.view_all (or owner).
Widgets
Each widget shows counts and a short preview, with Open full list to the module screen. Initial load is one batched request; single widgets refresh when you change focus or when the tab is visible (and when shell notifications push). Available widgets (hidden if you lack the matching right):
| Widget | What it shows |
|---|---|
| KPI tiles | Revenue, open orders, unpaid, cash, stock / work-order counts |
| New sales orders | Recent open orders |
| Approvals waiting | Inbox approvals |
| Radar alerts | Missed orders, ordering less, expiring lots |
| Cash position | Cash / bank GL balances |
| Overdue customers | Collections overdue slice |
| Pinned Lens reports | Your Lens pins |
| My tasks | Financial close tasks assigned to you |
| Following | Events for records you star |
Follow (⭐)
On customer, product, project and (for managers with sales.documents.view_all) employee modals, star a record to follow it. The Following widget shows their events (orders, invoices, radar, stock below minimum). You can turn on optional notify per follow. Following an agent is only allowed when you can already see that agent’s documents.
Role defaults
Users with settings.today_templates.update can edit the default widget set per role from Today → Role defaults. New users get that template the first time they open Today.
Control Tower (/ops/control-tower)
A live exception board with recommend-and-execute that refreshes every 30 seconds. Exceptions sit in three columns — Sales & supply (incl. quality), Service (helpdesk, field service, fleet, people), and Finance. Severity colours each card (red high, amber medium, grey low); worse items sort to the top of their column. Click a card to open the record. Column chips at the top filter the board; each type lists at most 25 cards.
Orchestration (action queue): tiles that can be acted on (low stock with a preferred supplier, MRP suggested lines) expose a primary button — e.g. Create draft PO or Create production order. The top of the page lists a prioritized action queue of those recommendations. Executing uses the same services as Reorder suggestions / MRP (procurement.purchase_orders.create or inventory.mrp_runs.update); you land on the new draft document.
This is company-internal orchestration (sense → recommend → execute), not multi-partner IBP scenario planning.
You only see an exception type if the company is licensed for the module and your role has the right listed below. The board opens with any one of those rights.
| Area | Exception | Raised when | Severity | Right |
|---|---|---|---|---|
| Sales & supply | Late cargo manifests | Posted manifest past its delivery date and the journey isn't finished | High | sales.cargo_manifests.read |
| Failed stops | Stop failed or refused in the last 30 days | High | sales.cargo_manifests.read | |
| Overdue purchase orders | Confirmed or partly received PO past its expected delivery date | Medium | procurement.purchase_orders.read | |
| Stale goods receipts | Draft goods receipt older than 2 days | Medium | procurement.goods_receipts.read or procurement.purchase_orders.read | |
| Low stock | Product below its reorder point (from reorder suggestions); Create draft PO when a preferred supplier is set | High below minimum or safety stock, otherwise medium | inventory.reorder_suggestions.read or inventory.stock_levels.read | |
| MRP exceptions & suggestions | Latest completed MRP run: planning exceptions plus suggested buy/make lines (create PO or production order from the tile) | High for past due / no source / BOM cycle | inventory.mrp_runs.read | |
| Stuck warehouse flow | Aged open documents in the GR → put-away → pick → pack pipeline | High after 5 days stuck | Flow stage read rights (put-away, pick, pack, GR, reservations) | |
| Promotions awaiting approval | Submitted promotion | Low | sales.promotions.read | |
| Service | Breached ticket SLAs | Open helpdesk ticket past its first-response or resolve deadline | High for high/urgent priority, otherwise medium | helpdesk.tickets.read |
| Tickets at risk | Open ticket whose next SLA deadline is within 2 hours | Medium for high/urgent priority, otherwise low | helpdesk.tickets.read | |
| Overdue work orders | Open work order past its SLA due time, or past its scheduled end when it has no SLA | High when the SLA is breached or priority is urgent, otherwise medium | field_service.work_orders.read | |
| Sales & supply | Failed quality inspections | Inspection completed as fail or quarantine in the last 30 days | High for fail, medium for quarantine | hseq.quality_inspections.read |
| Open non-conformances | NCR that is open or in progress | High when overdue or critical/high, medium, or low (follows the NCR severity) | hseq.non_conformances.read | |
| Expiring supplier certificates | Newest certificate of a type expiring in the next 30 days or expired in the last 30 | High once expired, medium within 7 days, otherwise low | hseq.supplier_certificates.read | |
| Finance | Overdue invoices | Posted sales invoice past its due date with an open balance | High after 30 days, otherwise medium | sales.sales_invoices.read |
| Credit holds | Active partner on credit hold | High | finance.credit_management.read | |
| Pending credit releases | Credit release request awaiting a decision | Medium | finance.credit_management.read | |
| Unreconciled bank lines | Line on a posted bank register older than 7 days that isn't in a completed bank reconciliation | Medium after 30 days, otherwise low | finance.bank_reconciliations.read | |
| Service | Vehicle compliance deadlines | Vehicle registration, inspection or insurance, or a transport document (licence, tachograph card…), expiring in the next 30 days or already expired | High once expired, medium within 7 days, otherwise low | fleet.compliance.read |
| Vehicle services due | Active service schedule due by date or odometer (within its lead time) | Medium when overdue, otherwise low | fleet.service_schedules.read or fleet.compliance.read | |
| Expiring employee certifications | Latest certification of its kind for an employee expiring in the next 30 days or expired in the last 30 (revoked ones are skipped) | High once expired, medium within 7 days, otherwise low | hr.employee_certifications.read |
Each card shows what is affected, who owns it (assignee, driver, employee or supplier) and the due date or age.
Lens (/analytics/reports)
Uktupus Lens is a free-form explorer over live ERP data — the same builder for every allowlisted dataset (sales, POS, procurement, payments, general ledger, stock, leave, work orders). Flow:
- Module — pick Sales, Procurement, Finance, etc. (or All)
- Sentence — Show · by · across · from · for · compared to. Use + field under by to stack dimensions (e.g. agent × product × month). Across pivots a second field as columns (e.g. agents as series across months).
- Optional starters — pack chips preload a useful shape; keep changing any chip after that
- More — extra measures, filters (pick specific agents/products), formula · Drill — click a bucket; last level is documents
Example: Show net by sales agent × product, across sale date (month), then in More filter to two agents.
Sales lines is the sales star: posted invoice lines, POS lines, and returns in company currency. A POS receipt that was later invoiced counts once (the invoice). A return/credit counts once on the return lines. Margin and margin % use only lines that have cost; cost coverage % (shown next to margin in the sales pack templates) is net sales with cost ÷ all net sales. Service products use cost 0. COGS comes from the stock movement linked to the delivery/invoice/POS/return line — not from date matching. Price-only credit notes reduce sales but not COGS; restock returns reverse COGS.
Examples: agent × region × product; margin by month; region × month; purchases by supplier × month; stock by warehouse × product.
Saved reports still accept the older single “group by / break down” shape.
Charts — time fields go on the X axis; other fields become the legend/series; the measure is Y. Multi-field results also show a pivot table. Types include bar, horizontal bar, stacked, 100% stacked, line, area, combo, Pareto (ranked bars + cumulative % with an 80% guide), line race and bar race (animated, with Replay), pie, donut, rose, radar, funnel, scatter, treemap, heatmap, waterfall, and table. In Options: data labels, zoom/brush, smooth lines, and compare (previous period, year-over-year, or a custom window).
Quick chips — This month · Last 3 months · This year · YoY · Top 10. Pack starters go beyond plain bars: margin & net trends, margin %, returns vs net, weekday radar, agent race, region/channel heatmaps, category/brand/customer Pareto concentration, AP outstanding, payment mix, GL concentration, stock movement stacks, leave/work-order funnels, and more. When cost coverage is under 95%, a warning appears next to the result: margin is based only on the share of lines that have cost.
Save a report as personal or shared with the team. Viewing and running reports needs analytics.reports.read; creating, editing and deleting are separate rights.
Export offers three formats:
- PDF — landscape report: period/meta strip, KPI totals, up to three chart panels (your chart plus complementary views), then a compact data table (first 40 rows). Charts are rendered from the on-screen result and embedded as images.
- Excel (.xlsx) — the server runs the report again with the current settings and returns a workbook: one sheet named after the report, a bold header row, date groups as real Excel dates, amounts as numbers with two decimals, counts as whole numbers, a bold total row, sized columns and a frozen header. A report returns at most 500 groups, or the top N you chose.
- CSV — the rows currently on screen.
Pin to dashboard appears once a report is saved and adds it to your Today page. Opening a pinned report from the dashboard loads it in the builder (/analytics/reports?report=<id>). Sales overview What changed deep-links into Lens with dataset, measure, rows, compare, and dates already set (?module=sales&dataset=sales_lines&…).
Day-to-day vs Advanced
Most teams only need Today, Control Tower, and Lens → Reports (pin useful reports to Today). Each of Sales, Inventory, and Finance also has an Overview home with KPIs and interactive charts.
Advanced Lens tools (same allowlisted datasets; the UI never sends SQL) sit under Lens → Advanced so the default path stays clean:
| Advanced | Path | Rights |
|---|---|---|
| KPI boards | /analytics/kpi-boards | analytics.kpi_boards.* |
| Board packs | /analytics/board-packs | analytics.board_packs.* |
| Write-backs | /analytics/writebacks | analytics.writebacks.* |
| Warehouse export | /analytics/warehouse-exports | analytics.warehouse_exports.* |
KPI boards are personal, shared, or role-scoped. Optional accounting ledger and company group fields apply ledger and entity RLS when the board is evaluated.
Board packs schedule a board evaluation (daily / weekly / monthly) and stage an export artifact. Due packs run hourly via Analytics::RunDueBoardPacksJob; you can also Run now.
Write-backs map tile totals, dataset totals, or fixed amounts into a finance planning version line period (Apply requires an editable draft/rejected version).
Warehouse export configures Snowflake or BigQuery destinations, stages JSONL extracts under RLS, and returns provider-specific load SQL for the connector to finish the COPY/LOAD.