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.

No automated email, and no other email, ever.

/profit/pnl

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

AI inside the product

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.

/kermit

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.

/health

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.

The part that matters

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.

/kermit

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
The surfaces

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.

/inventory
SKUOn handSold 30dCover (28d)Best-beforeAt risk
M-001871175151 d2026-12-310
M-0021 03037586 d2026-12-310
M-00916929817 d < lead2026-11-300
M-00677562362 d2026-11-30430
M-01222365310 d < lead2026-12-310
MB-011230—2027-07-3123
S-00265276265 d——
Cover at 28-day velocity beside earliest best-before. Only exceptions are marked: amber where cover is shorter than lead time, or units are at risk of expiry.
/vat

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.

The VAT return is built and refuses to classify a single sale until the registration date exists — and names what is waiting on it.
/inventory

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.

Every count names the population it counted, the window it covers, and which way its error runs.

Connected to what the business already runs on

Live integrations only. Anything built and not yet running is on the list below.

ShopifyMeta AdsGoogle AdsBokioOngoing WMSWiseECB ratesResend
Available now

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
On the way

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.

No automated email, and no other email, ever.