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.
The waitlist opens once we can confirm an address.
Collecting addresses we cannot confirm would give us a list of typos, so the form is off until the sending domain is verified rather than on and silently failing.
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
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
An assistant that refuses
It answers from the same readers that render every surface, and is denied SQL — so it cannot produce a figure the dashboard would contradict.
- Evidence rows under every answer
- Declines when an input is missing
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
Ask in plain language. Get the evidence with it.
It picks a tool by name and our code runs the query. The prose is the model’s; the numbers, their markings and their sources are ours.
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
And when it cannot evidence an answer, it declines.
Lead times are not recorded anywhere, so a reorder date would be invented. It says which input is missing and what that blocks — no model is called at all.
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.
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.
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.
| 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.
One person, AI agents in parallel, weeks rather than quarters.
The agents build and measure; the rulings are a person’s. That is the same distinction the product makes about its own figures.
19
days, first commit to launch
3 114
commits — 2 721 by agents
205
agent sessions
93
commits in the busiest hour
Measured from the repository, 23 August 2026.
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
Built and unmerged, or specified and unbuilt
Stated rather than implied. A short honest list is worth more than a long ambiguous one.
- Home overviewbuilt, unmerged
- Supplier records and lead timesbuilt, unmerged
- B2B café CRM: prospect register and outreachbuilt, unmerged
- Creative evidence briefsbuilt, unmerged
- Decision recordsbuilt, unmerged
- Klaviyo syncbuilt, unmerged
- Amazon integrationbuilt, held
- TikTok ad spendbuilt, never run
- OSS returnbuilt, waiting on a registration date
- Net profit, break-even, runwaywaiting on fixed costs
- Multi-tenant onboardingspecified, unbuilt
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.
The waitlist opens once we can confirm an address.
Collecting addresses we cannot confirm would give us a list of typos, so the form is off until the sending domain is verified rather than on and silently failing.