Owner view · reports

What every report tells you.

Fifteen reports across five groups — daily operations, sales & customers, inventory, financial, and strategic. Each refreshes live from the same data the counter sees, and every metric below shows the exact formula behind it.

Where to find them

Sidebar → Reports lands on the index, which is just a grid of cards. The pages live under /reports/<name>. Most are role-gated — org owner, regional manager, and accountant see everything; branch manager sees their branch only; auditor reads everything but can't click anything that changes state.

Every report has a CSV export button — pulls the same data you see on screen plus a few extra audit columns, ready to send to your CA.

How to read the formulas

We'd rather show the math than ask you to trust a black box. A few conventions hold across every report below:

  • Money is exact. Every amount is stored in paise (whole numbers — no floating-point drift) and shown in ₹.
  • Quotes never count as sales. Revenue reports exclude estimates (is_quote = false) and anything soft-deleted or cancelled.
  • Dates have a defined basis. Sales are counted on their confirmed date; cash on the payment date; expenses on the date incurred (the DSR additionally shows a cash-date view).
  • COGS is locked at sale time. Cost of goods uses the weighted-average cost captured the moment each item is sold — never a later re-price — so historical margins don't move under you.
  • GST is shown, not buried. “Revenue” means net of discount and excludes GST; tax is always a separate line.

Daily operations

DSR — Daily Sales Report

/reports/dsr. The single most-used report. Pick a date (defaults to today). For that day at the picked branch: every sale, every payment by method (cash / UPI / card / bank / cheque), every expense, day-end cash count, net-of-day. It carries two parallel axes — an accrual view (what was sold) and a cash view (what actually hit the drawer).

Formula

Sales total = Σ total_paise (subtotal − discount + GST)
Accrual net = sales total − expenses incurred that day
Cash collected= Σ payments where method = cash, by payment date
Expected drawer = opening float + cash collected − cash expenses
Variance = counted cash − expected drawer (red if ≠ 0)

Cash discrepancies surface in red at the top — “System says ₹12,450 cash collected, you entered ₹12,200 in the drawer”. Investigate before closing.

Reorder list

/reports/reorder. Inventory rows that fell below their reorder threshold, plus lost-revenue-at-risk and a 30-day sales velocity per SKU. Sort by “most-urgent” or “capital-locked”.

Formula

velocity/day = units sold in last 30 days ÷ 30
days of stock = quantity on hand ÷ velocity/day
reorder when : days of stock ≤ lead time (7) + safety (3) = 10
: OR on-hand ≤ the SKU's reorder threshold
lost units = max(0, ⌈velocity × 7⌉ − on hand) (over lead time)
revenue at risk = lost units × current selling price

Reorder thresholds are per-SKU-per-branch and can be set in bulk on /inventory/search (filter to a branch, edit the thresholds column).

Sales & customers

Sales

/reports/sales. Revenue rollup for the picked date window (defaults last 30 days), counted on each order's confirmed date. Three views:

  • By branch — orders, net revenue, GST, average order value
  • By day — daily totals as a sparkline + table
  • Gross profit — revenue minus COGS, per branch. Visible to owner / accountant only (cost-protected).

Formula

revenue = Σ (subtotal − discount) (= Σ total_paise, ex-GST)
AOV = revenue ÷ order count
COGS = Σ (cost_unit × qty) (weighted-avg cost at sale)
gross profit = revenue − COGS
margin % = gross profit ÷ revenue × 100

Customers

/reports/customers. For the picked window: customers served (new vs returning split), repeat rate, average order value, and the top 25 customers by lifetime value across all history. Pairs with /customers/insights for cohort segmentation and AI message drafts.

Formula

new = customers with no order before the window start
returning = customers who had an order before the window
repeat rate %= returning ÷ total transacting × 100
AOV = period spend ÷ orders in period
lifetime val = Σ total_paise per customer, all history (top 25)

Staff efficiency

/reports/staff-efficiency. How fast the counter moves. Built from anonymised sale-session timings (start → customer → prescription → first item → estimate → submit), over the last 30 days. Three views: median sale time per salesperson, the slowest stage org-wide, and abandonment rate per branch.

Formula

sale duration = submitted_at − started_at (outliers <0 or >3h dropped)
per-staff KPI = median sale duration of their submitted sessions
stage time = median of each step (e.g. customer→Rx, Rx→first item)
abandonment % = abandoned sessions ÷ total sessions × 100 (per branch)

Inventory

Inventory snapshot

/reports/inventory. Live snapshot — total units, total catalog SKUs, low-stock lines, plus a per-branch table. Reads current stock; no time-travel.

Formula

units on hand = Σ quantity_on_hand
reserved = Σ quantity_reserved (held for pending orders)
value at MRP = Σ (selling price × quantity on hand)
low stock = lines where on-hand ≤ reorder threshold

Turnover

/reports/turnover. Two ratios that nobody on a retail floor knows off-hand but every investor asks for. Shown org-wide and per-branch, 30-day default window.

Formula

avg inventory = (opening + closing stock at cost) ÷ 2
ITR (inventory turnover) = COGS ÷ avg inventory
days inventory = 365 ÷ ITR
avg assets = avg inventory + avg fixed assets (straight-line deprec.)
ATR (asset turnover) = revenue ÷ avg assets

Optical typically lands around 2–4× ITR. In the alpha the opening snapshot is approximated by the closing one where a sealed month-start figure isn't yet available — noted on the page so you know when it's an estimate.

Transfers

/reports/transfers. Suggested rebalancing moves — SKUs sitting dead at branch A while branch B has been stocked out for 7+ days.

Formula

source surplus = on-hand − (target days × velocity) (> 0)
dest need = (target days × velocity) − on-hand (> 0)
suggested qty = min(source surplus, dest need)
capital freed = qty × cost price (unlocked at source)
revenue protected = prevented-stockout units × selling price

Single-branch chains see “Inventory is balanced” — no action needed.

Financial

P&L

/reports/pnl. The owner's end-of-month view, per-branch and org-total. Operating expenses are split into a donut by category. Cost-protected — branch staff don't see this page at all.

Formula

revenue = Σ (subtotal − discount) (ex-GST)
COGS = Σ (cost_unit × qty)
gross profit = revenue − COGS
operating exp = Σ expenses NOT marked below-EBITDA (by incurred date)
EBITDA = gross profit − operating expenses
EBITDA % = EBITDA ÷ revenue × 100
net profit = EBITDA − below-EBITDA exp (interest, tax, deprec., amort.)

Expenses

/reports/expenses. Three breakdowns for the picked window: by branch, by category, by month. Categories are configurable in /settings/expenses. Click any total to drill into the underlying rows.

Formula

total = Σ amount_paise (incurred in window, not cancelled)
fixed = Σ where category.is_fixed = true (rent, salary…)
variable = Σ where category.is_fixed = false (courier, daily…)
grouped by branch · category · month

Finance (royalty + inter-org)

/reports/finance. Brand view (royalties owed to you by franchisees) and investor view (returns owed to capital providers). Lists every active inter-org agreement in the window with computed amounts. Empty until you onboard your first franchisee or co-investor.

Formula

royalty accrual = Σ inter-org rows, kind = royalty_accrual
(per agreement: rate % × royalty base)
management fee = Σ rows, kind = management_fee (COFO operator)
capital return = Σ rows, kind = capital_return (FICO investor)
window : posted in range, status ≠ reversed

Royalty

/reports/royalty. Redirects to /reports/finance — royalty is one of several inter-org flows and lives there.

Strategic

Trends

/reports/trends. Sealed monthly snapshots, captured by cron on the 1st of each month plus at every branch add/remove. Never rewritten — even if you fix bad data later, last month's snapshot stays as-recorded for trend integrity.

Formula

each month seals: revenue, gross profit, operating expenses,
EBITDA, EBITDA %, net, ATR, ITR, days inventory,
branch count — same formulas as P&L + Turnover
MoM = latest vs prior month · YoY = latest vs 12 months back

New orgs see an empty state with a one-click Run backfill → button that walks from your earliest sale forward, sealing one snapshot per month.

Analytics

/analytics. The owner's 30-second snapshot — network branches, catalog SKUs, total stock, low-stock lines, sales velocity, top branches. Live counts and sums over current data (no period window); the same definitions as Inventory and Sales above.

AI Insights

/reports/ai-insights. Once a day (and once a week with a deeper read), Claude reads the last 24h / 7d of operations data and writes a 2-3 paragraph plain- English summary of what changed and why it matters. This is the one report with no fixed formula — it's a generated narrative over the live numbers, not a computed metric. Examples:

  • “Sales at Tri Nagar are up 18% week-on-week. The biggest mover is the new Vincent Chase reading collection — 14 units sold versus 4 the week prior.”
  • “Three SKUs hit their reorder threshold today. Bausch & Lomb SofLens Monthly is the most urgent: zero on hand at Tri Nagar with 5 units sold this week.”
  • “Anjali Mehta (₹12,846 last visit) is due for her annual recall in 11 days. Worth a personal call before sending the automated message.”

Empty until you click Regenerate for the first time. After that the cron runs daily + weekly automatically.

Who sees which report

ReportOwnerReg. MgrBranch MgrAcc.StaffLabAud.
DSR✓ all✓ cluster✓ own✓ all✓ all
Sales✓ all✓ cluster✓ own✓ all✓ all
Customers✓ all✓ cluster✓ own✓ all✓ all
Staff efficiency✓ all✓ cluster✓ all✓ all
Inventory✓ all✓ cluster✓ own✓ all✓ all
Reorder✓ all✓ cluster✓ own✓ all
Turnover✓ all✓ cluster✓ all✓ all
P&L✓ all✓ cluster✓ all✓ all
Expenses✓ all✓ cluster✓ own✓ all✓ all
Finance✓ all✓ all✓ all
Trends✓ all✓ all✓ all
AI Insights✓ all✓ cluster✓ own
“Cluster” means the regional manager's assigned cluster (multi-branch but not org-wide). Defaults to all branches until cluster scoping is configured.

Next up

AI features

A summary of every place Claude touches the product, with the safety boundaries that come with it.