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.

/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

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

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.

/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

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.

/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.

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.

/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.

The net agrees to within a krona and 38 of 93 rows do not — reported gross beside net, because a net that nets to nothing is how a divergence hides.
/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-0112302027-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
How it was built

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.

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
Coming soon

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.