The operating system for a D2C brand
Every figure tells you how much to trust it.
Orders, margin, stock, marketing, cash, VAT and the books — with every number carrying what it does not know.
Net revenue
1 284 900,00
24,4 %
Orders +28,4 % and average order value −3,1 % — the two compound to the figure above.
Contribution margin
≤741 940,00
at most this — no fulfilment or shipping cost is recorded
Orders
1 940
28,4 %
Gross margin
≤57,7 %
at most this — 7 of 1 940 orders costed not measured
The AI runs the tool. It does not summarise it.
It reads the same figures the pages render, carries the same markings, and declines when the data does not reach. Ask in plain language; get the number with its evidence and its caveats.
It answers from the same readers that render every surface
It picks a tool by name and our code runs the query. The prose is the model’s; the figures, their markings and their sources are ours — so it cannot state a number the dashboard would contradict.
Denied SQL, by construction
It cannot compose a query, so it cannot produce a figure nobody reviewed.
Never handed provenance
It is not given a figure’s source, so it cannot invent one either.
You asked
How many orders did we have in July 2026?
D2C and B2B together, July 2026: you had 1 940 orders.
4 of the 11 figures beside this are bounds rather than measurements. Which ones, and which way each can move, is on the cards.
anthropic/claude-sonnet-4.5
Evidence returned by get_pnl
Gross revenue (incl. VAT), D2C and B2B, 1 Jul 2026 → 31 Jul 2026
1 452 337,00 SEK
see it in the view · SQL
VAT collected
167 437,00 SEK
see it in the view · SQL
Discounts
94 210,00 SEK
see it in the view · SQL
Net revenue
1 284 900,00 SEK
see it in the view · SQL
Orders
1 940
see it in the view · SQL
Refunds
12 480,00 SEK
see it in the view · SQL
Cost of goods
≥468 100,00 SEK
at least this — 7 of 1 940 orders costed not measured
see it in the view · SQL
Shipping cost
≥41 220,00 SEK
at least this — 903 of 1 940 orders with a shipping cost not measured
see it in the view · SQL
Payment fees
≥33 640,00 SEK
at least this — 31 of 1 940 orders resolve no fee
see it in the view · SQL
Gross profit
≤741 940,00 SEK
at most this — no fulfilment or shipping cost is recorded
see it in the view · SQL
Gross margin
≤57,7 %
at most this — modelled; 7 of 1 940 orders costed not measured
see it in the view · SQL
It reads a supplier invoice and proposes the treatment
Every field comes back with a confidence and the line it was read from, so when something is wrong the useful question — misread, or read off the wrong line — has an answer. Nothing books itself.
A person confirms, always.
A decision taken once keeps applying
Classify a line and every line described the same way is classified with it — including the ones that arrive next month. It only ever fills blanks, so re-running it cannot move a figure somebody already decided.
Recorded, audited, reversible.
Reporting mirrors: net revenue (d2c), vat collected, b2b revenue, b2b invoice headers against their own lines, b2b invoices against Bokio’s journal, and b2b invoice lines against Bokio’s revenue each agree with their second derivation, over every completed day of the history. Today is excluded deliberately — a rollup rebuilt every ten minutes is mid-flight most of the day, and that lag is not a disagreement.
B2B invoice headers against their own lines agrees on the net and its members do not: 38 of 93 rows disagree by 10,73 gross, largest 0,50, netting to 0,93. Within the per-row bound of 0,50 (per-invoice öresavrundning), which is what the bound is for — the net alone could not tell you.
B2B invoice lines against Bokio’s revenue agrees on the net and its members do not: 40 of 95 rows disagree by 11,47 gross, largest 0,50, netting to −1,07.
It derives the figure twice and tells you when the two disagree
Six figures are computed a second time by routes that share no query, and checked against the books. A disagreement is reported rather than smoothed — and the gross is reported beside the net, because a net that nets to nothing is how a divergence hides.
And when it cannot evidence an answer, it refuses.
Lead times are recorded nowhere, so a reorder date would be invented. It names the missing input and what that blocks — and no model is called at all, so there is nothing there to guess.
I can’t answer that yet — one input this depends on is missing.
Missing input — lead times, reorder timing, minimum order quantities and who supplies what
1 supplier recorded and 1 purchase order, and none of the suppliers carry a lead time — the column exists and is empty. No record says which producer supplies which grade. A reorder date, an MOQ or a “how long does it take” would be invented.
There is no field for this yet — it is a known gap rather than an oversight.
Most dashboards give you a number
This one gives you the number, the population behind it, and the reason it might be wrong.
Figures that state their certainty
A margin resting on incomplete costs renders as a ceiling with the cause inline. An absence is an em-dash, never a zero.
- Bounds carry their direction
- Counts name their population
Costs resolved from actuals
A payment fee is what the gateway charged, not a percentage. Shipping is the real cost where there is one, a rate card where there is not, and unavailable where there is neither.
- A recorded zero beats a rule
- Never a silent zero
Reconciliation that disagrees
Six figures are derived a second time by routes sharing no SQL, and the disagreement is reported rather than smoothed.
- Gross reported beside net
- Compared against the books nightly
How the product actually renders
These are its own screens, markings and vocabulary. The amounts are illustrative — the real revenue and margin are commercially sensitive — and they reconcile with one another exactly as the product’s do.
| SKU | On hand | Sold 30d | Cover (28d) | Best-before | At risk |
|---|---|---|---|---|---|
| M-001 | 871 | 175 | 151 d | 2026-12-31 | 0 |
| M-002 | 1 030 | 375 | 86 d | 2026-12-31 | 0 |
| M-009 | 169 | 298 | 17 d < lead | 2026-11-30 | 0 |
| M-006 | 775 | 62 | 362 d | 2026-11-30 | 430 |
| M-012 | 223 | 653 | 10 d < lead | 2026-12-31 | 0 |
| MB-011 | 23 | 0 | — | 2027-07-31 | 23 |
| S-002 | 652 | 76 | 265 d | — | — |
Blocked on one input
the tool is built; the date is not entered
The date OSS registration took effect is not recorded. Without it the app cannot say which return a sale belongs in — before registration an EU B2C sale is Swedish VAT, after it is the destination’s, and the same order classifies differently either side.
Which VAT return each sale belongs in — the OSS buckets by destination and rate, Swedish domestic separately, and exports and reverse charge named rather than folded in. 812 non-Swedish D2C orders carrying 94 180,00 SEK of VAT are waiting on it. Counted across all history; it grows with trading, so two readings taken hours apart differ without either being wrong.
Enter the OSS registration date
Nothing needs building after that. The return is computed on this page the moment the date exists.
Cover is an upper bound. 214 of 4 106 units that left the warehouse between 2026-06-25 and 2026-07-25 — 5,2 % — had no Shopify order behind them, so stock falls faster than velocity predicts and any reorder point derived from it fires late. 18 SKUs shipped units and sold none, so their velocity is zero for a reason the figure does not state.
Connected to what the business already runs on
Live integrations only. Anything built and not yet running is on the list below.
Every line opens in production today
Money in
- P&L by day, country and order
- Net revenue, gross profit, CM2
- Margin bounded when cost data is incomplete
- Order list, live filters, D2C and B2B kept apart
- Order value distribution
- Per-SKU sales, margin and price realization
- Bought-together co-occurrence
- Goals and discounts
Money out
- COGS from dated cost versions
- Payment fees from gateway actuals
- Shipping cost from actuals or rate card
- Fixed costs and expenses
- Supplier invoices read from the PDF
- Claims against carriers, warehouse and suppliers
- Blended MER and new-customer CAC — Meta, Google
- Per-campaign contribution and creative performance
- Owned media kept separate from paid
Stock
- Cover at 28-day velocity against lead time
- Expiry by lot, on two ageing bases
- Units at risk
- Reorder proposals counting stock on the water
- Purchase orders and the lots they become
- Warehouse reconciliation and adjustments
Customers
- Cohorts — realized value only, never projected
- Repeat rate and reorder timing by first product
- Win-back list
- Receivables ranked by amount × days overdue
- Per-customer order history
Compliance and the books
- VAT at tax-line level, not per order
- Multi-currency: presentment, Shopify and ECB
- B2B invoices with VAT treatment and reverse charge
- Settlement entries proposed from payouts
- Six reconciliation mirrors against Bokio
- Cash balances per source, never summed
- Every sync, its last run and what it could not do
The assistant
- Plain-language questions, evidence rows beneath
- Refusals where an input is missing
- Stated facts a person has entered
- Question history, re-asked against current figures
Not yet, and here is the list
Stated rather than implied. A short honest list is worth more than a long ambiguous one.
- Home overviewIn testing
- Supplier records and lead timesIn testing
- B2B pipeline — prospect register and outreachIn testing
- Klaviyo syncIn testing
- Amazon marketplaceIn testing
- TikTok ad spendIn testing
- OSS VAT returnIn testing
- Net profit, break-even and runwayIn development
- Multi-brand onboardingIn development
Ask for access
It runs one business today. The next few are the ones we build it with — so there is no trial and no self-serve signup yet.