What every option earned, after every cost.

One engine prices the forecast, the realized profit on every ingested order and the calculators on this site, in whole cents. You see each option's first order and renewal apart, forecast against what actually sold.

Measure: know what each option earnedIncludes parts not in production yet

One engine, in whole cents

In production

The 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

FigureAmountWhat it counts
Realized margin$21.47What the ingested order earned after the costs recorded for it.
Forecast before rates$21.47The 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.87The 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 available

The 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

Revenue $58.60 to contribution margin $18.94 (32.3%)
Revenue
$58.60
Cost of goods
−$32.50
3PL base
−$1.18
Extra pick
−$0.40
Shipping label
−$0.10
Insert card
−$0.05
Payment processing
−$1.70
Processing per order
−$0.30
Packaging
−$0.50
Refunds
−$2.93
Contribution margin
$18.94

5 declared kinds cost nothing on this option

OF_DEV_KITS: the engine's forecast for one first order per option, on the dev store's costs at capture.

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

OptionFirst orderFirst-order marginRenewalRenewal 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 production

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

How each figure is booked
RevenueTax-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.
RefundsCount 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.
CancellationsA cancelled order is not a sale: it is left out of every realized figure and counted apart in cancelledOrders.
Paid editsPaid edits are recorded apart in editAdjustmentsCents: shown beside the order, not counted in contribution.
CurrenciesEvery 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 production

Realized 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_economics for every item, get_item_economics for 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}/economics and the MCP tool get_offer_economics, in both cost views: current reprices every order with the cost ledger as it stands, as_recorded keeps 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 production

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

Live v3What-if: Starter Kit at $44.00
Single Bag
Starter Kit
Ritual Set
The simulator runs through the API and MCP. Specimen data.

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.