One engine, in whole cents
In productionThe forecast, the realized profit on every ingested order and the calculators on this site run the same margin engine. It counts in integer cents, rounds a sub-cent cost once per line, and charges each cost kind per unit, per parcel, per order or as a percent of revenue or unit cost.
So a forecast and the orders it predicted can be compared per order, to the cent. On the first real order, the realized margin matched the forecast to the cent before rates.
The first real order on the dev store, 16 September 2026
| Figure | Amount | What it counts |
|---|---|---|
| Realized margin | $21.47 | What the ingested order earned after the costs recorded for it. |
| Forecast before rates | $21.47 | The engine's forecast for the same order with its estimated refund and payment-processing rates left out (then, processing was a forecast rate; it is now a cost in both forecast and realized): equal to the cent. |
| Full forecast | $17.87 | The forecast with those rates included, as every option is forecast before it sells. |
Realized profit nets refunds when they happen and carries no refund estimate, so it is compared with the forecast before rates. The estimate stays in the forecast, where it belongs before anything has sold.
Per option and version
Partly availableThe dashboard shows the current cost view only.
Every option of every version gets its own forecast and its own realized figures, first orders and renewals apart. A subscription option that loses money on the first order and earns it back on renewals reads as exactly that.
Margin waterfall · Ritual Set
One first order, dev store costs at capture
5 declared kinds cost nothing on this option
| Step | Grain | Amount |
|---|---|---|
| Revenue | – | $58.60 |
| Cost of goods | per unit | −$32.50 |
| 3PL base | per order | −$1.18 |
| Extra pick | per unit | −$0.40 |
| Shipping label | per order | −$0.10 |
| Insert card | per order | −$0.05 |
| Payment processing | percent | −$1.70 |
| Processing per order | per order | −$0.30 |
| Packaging | per unit | −$0.50 |
| Refunds | percent | −$2.93 |
| Contribution margin | – | $18.94 |
| 5 kinds costing nothing | – | $0.00 |
Forecast: the first-order and renewal margin with the full waterfall by cost kind, shipping charged counted in revenue. It lists the required costs no line has an amount for yet, because the margin is overstated until they are entered, and it can be read at a future cost date to preview a scheduled cost.
OF_DEV_KITS · first order and renewal per option, forecast on the dev store's costs · matches the dev API's economics, captured 2 October 2026
| Option | First order | First-order margin | Renewal | Renewal margin |
|---|---|---|---|---|
| Single BagSubscribe | $32.00 | $15.84 49.5% | $40.00 | $23.26 58.1% |
| Starter KitSubscribe | $48.00 | $20.38 42.5% | $60.00 | $36.18 60.3% |
| Ritual SetSubscribe | $58.60 | $18.94 32.3% | $80.00 | $49.60 62.0% |
Realized: orders, gross and net revenue, refunds, cost and contribution per option and version, first orders and renewals apart, kept separate per currency, with forecast against actual for the version.
A renewal is any order Shopify's subscription billing creates. It is costed as a renewal, so cost kinds charged only on a first order are skipped, and it counts toward the option that won the subscriber, even after a product swap.
Money read the way Shopify charged it
In productionEvery Shopify money field Offer Suite reads is documented against Shopify's 2026-07 reference and checked on real dev-store orders: tax added at checkout and tax included in prices, free-shipping discounts, discount codes, refunds with and without lines, order edits, post-purchase lines and subscription renewals. Regression tests run on those orders' redacted payloads.
| Revenue | Tax-exclusive, line by line from what each line was charged after discounts, and frozen at the sale as placed, so a later edit cannot inflate it. |
|---|---|
| Refunds | Count only against revenue the offer counted; units or lines it never counted are reported apart in refundedExcludedCents. Refunded shipping is included, and a refund is allocated across the order's lines by revenue share. |
| Cancellations | A cancelled order is not a sale: it is left out of every realized figure and counted apart in cancelledOrders. |
| Paid edits | Paid edits are recorded apart in editAdjustmentsCents: shown beside the order, not counted in contribution. |
| Currencies | Every order line keeps its shop currency. Nothing is converted or summed across currencies, and forecast against actual uses only the orders in the offer's market currency. |
Profit per item, store-wide
In productionRealized product profit per item over any window, for every costed order whether an offer claimed it or not: revenue, refunds, cost by kind, product profit (shipping excluded) and margin, split by offer. In each currency the items sum to the cent to the store's total. One item can also be read as a daily, weekly or monthly series.
Orders no offer claims are costed with your default cost profile once one is set, and past orders come in through an order import.
- In the API and MCP:
list_item_economicsfor every item,get_item_economicsfor one, with its series. - In Shopify Sidekick: one named SKU, variant or product at a time, without a series, for a workspace with one store.
- Not in the dashboard.
Where you read it
GET /offers/{id}/economicsand the MCP toolget_offer_economics, in both cost views:currentreprices every order with the cost ledger as it stands,as_recordedkeeps the cost rates each order was booked with.- The dashboard's economics page: forecast and realized per option, current view only.
- Shopify Sidekick: the offers with the most realized profit over a period, one offer by option, and one item, in either cost view and once per currency, for a workspace with one store.
Price a draft before it ships
In productionBefore you publish, the simulator costs a draft document or a stored version against the live version on the same costs: the cost ledger at a date you choose, plus any what-if cost rows.
What-if against live
Profit per visitor and per order, live v3 against the draft
Profit per visitor · Live v3
$1.30
What-if: Starter Kit at $44.00
$1.18
−$0.12 per visitor
Needs 10.1% more conversion to break even. Conversion from 18,420 visitors over 30 days, assumed unchanged.
| Option | Live v3 | What-if | Per order | Conversion | Change |
|---|---|---|---|---|---|
| Single Bag | $15.84 | $15.84 | $0.00 | 2.2% | – |
| Starter Kit | $20.38 | $16.70 | −$3.68 | 3.2% | $48.00 → $44.00 |
| Ritual Set | $18.94 | $18.94 | $0.00 | 1.5% | – |
POST /offers/{id}/simulate and simulate_offer return, per option:
- profit per first order, and the delta against live
- the live version's realized profit per order
- profit per visitor at the conversion observed over a window of 1 to 365 days
- the conversion lift the draft needs to break even
Optionally, it recosts up to 5,000 of the offer's real attributed orders from a past period under the what-if costs. Nothing is written.
Conversion is assumed unchanged for the draft, and a recost changes only costs: prices and revenue stay as the orders recorded them.
On the dev API, not in production yet
These run on the dev API today. The production API does not serve them yet.
- Saved simulator scenarios: name a simulator request and re-run it later at that day's costs. On the dev API, not in production yet
- CAC as an assumed simulator input, for the whole offer or per option, echoed back as assumed, not measured. On the dev API, not in production yet
- Subscription LTV: profit per customer after CAC month by month, the payback month, LTV:CAC, a seeded uncertainty band, the peak cash a spend schedule needs, and goal seek for maximum CAC, renewal lift, first-order price, take mix and ad budget. On the dev API, not in production yet
- An LTV page in the Shopify admin, a simpler version of the same projection. On the dev API, not in production yet
- An ad-spend ledger your agent posts per offer and day, with realized CAC per offer: spend over first orders, with cancellations and renewals left out. On the dev API, not in production yet
- A paid line that a post-purchase upsell or an order edit adds, stored and costed as a line of the order and counted in its option's contribution. On the dev API, not in production yet
Every LTV input is a scenario: renewals are not yet linked back to their first order, so you supply the renewal curves and the CAC, and there is no ad-platform connector.
What it does not do yet
- Freight and shipping boxes forecast as $0: carrier tables and packaging lookups are not modelled yet.
- Refund and processing figures in the forecast are profile-rate estimates.
- The dashboard shows the current cost view only, does not list missing costs, and has no item economics.
- Renewals are verified with Shopify's own subscription contracts; orders from Recharge, Skio and other subscription apps are unconfirmed.
Questions
Why does last month's profit change when I fix a cost?
Because the current view reprices every order with the cost ledger as it stands now, at the order's date, so a backdated correction moves the orders it covers. The as-recorded view keeps the cost rates each order was booked with, so a cost correction never moves it; refunds, the actual payment fee and actual costs you record still update both views. The API and MCP serve both views; the dashboard shows the current one.
Does one refunded line hit the whole order?
No. A refund counts only against revenue the offer counted; lines the offer never counted are reported apart. Within the order it is spread across the lines by revenue share, so a refund per item is an allocation rather than the exact line refunded.
What about two currencies?
Each order keeps its shop currency and nothing is converted or added across currencies. Offer economics return realized figures per currency, items give one total per currency, and Sidekick answers once per currency. Forecast against actual uses only the orders in the offer's market currency.