Metrics
The general structure of how Kleio organizes your data — not a full list of every available metric.
Kleio matches Shopify’s Total Sales to the cent, but defines a few rows differently on purpose. Here’s why.
The P&L Waterfall
| Metric | Definition | |
|---|---|---|
| Gross Sales | Product + shipping revenue before discounts are subtracted. | |
| − | Discounts | Total discounts applied to products and shipping lines. |
| = | Sales | Gross Sales − Discounts. The initial order value before returns. |
| − | Returns | Refunded amount for products and shipping. |
| + | Return Fees | Fees charged to customers for returns. |
| = | Revenue | Sales − Returns + Return Fees. What’s left in your bank account after returns. Matches Shopify’s Total Sales incl. tax. |
| − | Tax | Net tax collected (sale tax − refunded tax) on products and shipping. |
| − | COGS | Cost of Goods Sold. |
| = | Contribution Margin 1 | Revenue (excl. tax) − COGS. Your product margin. |
| − | Variable Costs | Costs that vary with sales volume (shipping, payment processing, etc.). |
| = | Contribution Margin 2 | CM1 − Variable Costs. Your margin after COGS and all variable costs. |
| − | Ad Spend | Total advertising and marketing spend. |
| = | Contribution Margin 3 | CM2 − Ad Spend. Your margin after all COGS, variable costs, and ad spend. |
| − | Fixed Costs | Costs that don’t vary with sales volume (rent, salaries, etc.). |
| = | Net Profit | CM3 − Fixed Costs. Your bottom line profit. |
Variable Costs Breakdown
Variable costs can be broken down into:
| Category | Definition |
|---|---|
| Shipping Costs | Shipping and fulfillment costs including delivery, packaging, and logistics. |
| Returns Costs | Costs related to processing returns and refunds. |
| Payment Costs | Payment processing fees from Stripe, PayPal, Shopify Payments, etc. |
| Customs Costs | Customs duties, import taxes, and international shipping fees. |
| Fulfillment Costs | Fulfillment costs including pick, pack, and warehouse handling fees. |
| Other Variable | Other variable costs not categorized above. |
| Agency Fees | Marketing agency fees calculated as a percentage of ad spend. |
Ad Spend Breakdown
Ad spend can be broken down by platform:
| Platform | Definition |
|---|---|
| Google Ads | Ad spend from Google Ads. |
| Meta Ads | Ad spend from Meta (Facebook/Instagram) Ads. |
| Snapchat Ads | Ad spend from Snapchat Ads. |
| TikTok Ads | Ad spend from TikTok Ads. |
| AppLovin | Ad spend from AppLovin. |
| GoAffPro | Ad spend from GoAffPro affiliate program. |
| Other Marketing | Fixed marketing costs (agency fees, banner ads, etc.) allocated to ad spend. |
Tax Toggle
You can switch between viewing metrics with or without tax using the tax toggle in the filter settings. This affects all metrics from Gross Sales through Revenue.
Metrics below Revenue (COGS, contribution margins, variable costs, ad spend, fixed costs, net profit) always exclude tax regardless of the toggle.
Order Date vs Accounting Date
By default, Kleio dates every cost and refund on the day it happened. If you process a refund today, Kleio subtracts it from today. This is the accounting date (or event date) view: it shows what hit your bank account on a given day.
Order-date metrics work differently. They move an order’s costs and refunds back to the day of the original order, so they sit with the sale that created them. You’ll see these as the (O) metrics in the Edit Metrics dialog, for example CM3 (O).
Why it helps with acquisition
Suppose you handle refunds once a week, in a batch. On the accounting date view, all of those refunds land on the single day you process them. That one day looks very bad, and the other six look good. To judge your acquisition, you now have to work out by hand whether that one bad day wipes out the profit from the other six. You can’t just look at the numbers and know.
Order date fixes this. It moves each refund back to the day of the order it came from, so the refund sits with the sale that caused it. Every day then shows its own real result, and you can read your acquisition straight off the numbers. That is why Kleio’s Acquisition page uses order-date metrics by default.
Seeing it on a timeline
An order comes in on day 1. You refund it on day 8, your weekly batch day.
day 1 day 8
Accounting +$100 −$30
Order date +$100 −$30
Accounting date leaves the refund on day 8, the day you processed it. Order date moves it back to day 1, onto the order it came from.
The forecast: E(CM3) (O)
Beside each (O) card you’ll find an E(…) twin — E(CM3) (O), E(NC CM3) (O), E(CM3 per NC) (O) and so on. It’s the same metric, with the returns that haven’t happened yet already modelled in, using your own return rate for each product.
It exists because order date alone can’t fix a very recent day. An order placed this morning has had no time to be returned, so its refund isn’t just on the wrong day — it doesn’t exist anywhere yet. The booked (O) number for today therefore counts revenue that some customers will send back. The forecast is the number to judge today’s acquisition on.
On the same timeline, with a product that’s returned 30% of the time:
day 1 day 8
Accounting +$100 −$30
Order date +$100 −$30
E(...) +$100 −$30 (modelled on day 1, before it happens)
The two often show exactly the same number, and that’s correct. Kleio only estimates orders from the last 14 days that have no return yet. Anything older has had its full chance to come back, so its returns are already booked — nothing is left to estimate, and the forecast matches the booked value to the cent. If you’re looking at last quarter, seeing CM3 (O) and E(CM3) (O) agree means your returns are settled, not that the forecast is broken.
A brand-new store can also see the two match for a while: Kleio needs to calculate your return rates before it can model anything, and that runs in the background the first time.
It is an estimate. It’s built from how often each product has actually been returned in the past, so it’s only as good as that history — a product whose return rate is currently shifting (a new size run, a changed photo) will be forecast from the old rate until enough returns land to move it.
Comparing with Shopify
Most users compare Kleio’s numbers to Shopify’s Finance Summary overview. Here, Kleio’s Revenue equals Shopify’s Total sales down to the cent (remember that Shopify shows Total sales incl. tax and you can toggle tax on/off in Kleio).
The rows above (Gross sales, Discounts, Returns, Shipping) won’t always line up one-to-one with Shopify because Shopify excludes tax and anything shipping-related in those rows.
| Shopify Finance Summary row | Why Kleio’s number is different |
|---|---|
| Gross sales | Shopify only counts product sales. Kleio counts product sales and shipping revenue. |
| Discounts | Shopify only counts product discounts. Kleio also counts shipping discounts. |
| Returns | Shopify only counts product refunds. Kleio also counts shipping refunds. |
| Shipping charges | Shopify gives shipping its own row, combining shipping revenue and shipping refunds into one line. Kleio counts shipping inside the rows above instead. |
| Total sales | Matches Kleio’s Revenue when the tax toggle is set to incl. tax. Kleio defaults to your Shopify tax-display setting, so if your store displays prices excl. tax, switch the toggle to “incl. tax” to see the match. |
If you’ve enabled Skip orders with 0 in sales under Settings → Filters, your numbers might also differ from Shopify because free/100%-discount orders are excluded entirely in Kleio while Shopify still counts them.
Why Kleio includes shipping in the top rows
The final Revenue number comes out the same either way. We just think it’s more correct to include shipping in everything — shipping is money hitting your bank account just like product revenue, and for many stores it’s a meaningful revenue lever, so we want to be able to analyze it too.