# Metrics glossary (/reference/metrics)

Keel HQ calculates financial and operational metrics from Shopify, connected ad platforms, Klaviyo, connected cash accounts, and the costs you enter. Complete the [Quick start](/quick-start), including the first Shopify sync and your costs, before using profit and margin figures.

## Data that affects every metric [#data-that-affects-every-metric]

### Data freshness [#data-freshness]

Each connection syncs on its own schedule, so figures that use different connections can be different ages. The Overview header shows **Updated** with details such as **Orders synced** and **Meta spend pulled**; a figure that combines connections is only as current as its oldest connection.

### Refunds and zero-dollar orders [#refunds-and-zero-dollar-orders]

Refunds use Shopify's exact refund amounts, including partial refunds, and are picked up on the next order sync. Fully refunded and voided orders are excluded from overview, product, customer, and inventory queries; the monthly report also subtracts exact refunds from net revenue.

By default, a whole zero-dollar order is excluded from revenue, orders, units, and costs; a free line item in a paid order is still counted. Change this in **Settings → Goals → Data Quality** with **Exclude zero-dollar orders from analytics**; physical-stock metrics always count units that left stock, including free units.

## Overview [#overview]

The Overview's **Key Metrics** use the selected rolling window and compare it with the equivalent-length prior window.

### Net Revenue [#net-revenue]

Revenue from line items in the selected period.

```
Net Revenue = sum of line-item revenue in the period
```

The Overview splits this into DTC and B2B revenue. Its line-item query excludes fully refunded and voided orders.

### Orders [#orders]

Unique Shopify orders in the selected period.

```
Orders = number of distinct Shopify orders in the period
```

Fully refunded and voided orders are excluded.

### AOV [#aov]

Average order value in the selected period.

```
AOV = Net Revenue / Orders
```

It uses the Overview's net revenue and unique-order count.

### Ad Spend [#ad-spend]

The ad spend recorded for the selected period.

```
Ad Spend = connected platform spend + manual Other ad spend + costs marked Counts as ad spend
```

Connected Google Ads and Meta Ads spend, manual **Other ad spend**, and a variable cost marked **Counts as ad spend** are included in the Overview total. Missing spend is unknown, not $0.

### Blended ROAS [#blended-roas]

Return on ad spend using Keel HQ net revenue and the same total ad spend as the Overview.

```
Blended ROAS = Net Revenue / total ad spend
```

Unknown ad spend displays **—** with its reason. Known $0 spend, $0 revenue, or a $0 denominator also displays **—** rather than 0x, Infinity, or NaN; the value otherwise displays as a two-decimal multiple. See [the FAQ](/faq#are-blended-roas-and-mer-the-same-thing) for how it differs from MER.

### MER [#mer]

Marketing efficiency ratio using the same net revenue as Blended ROAS but all marketing spend.

```
MER = Net Revenue / (ad spend + non-media marketing costs)
```

Today, non-media marketing costs are the selected window's normalized **Agency Fees** from **Settings → Costs**. Costs marked **Counts as ad spend** are included in ad spend for both MER and Blended ROAS; only Agency Fees make the two ratios differ. Unknown ad spend shows **—** with its reason; with known $0 ad spend and Agency Fees entered, MER is net revenue divided by the Agency Fees alone, and it shows **—** only when all marketing spend or revenue is $0.

### CPA [#cpa]

Cost per acquisition in the Overview: spend for every order, including repeat customers.

```
CPA = total ad spend / orders
```

It uses the same total ad spend as Blended ROAS and MER. This is not CAC because it does not limit orders to new customers. If ad spend is missing or incomplete, CPA is **Unknown**, never a partial amount or $0; with no orders it displays **—**, and known $0 spend across orders is a real $0.

### Contribution Margin % [#contribution-margin-pct]

The share of net revenue left after COGS and variable costs.

```
Contribution Margin % = (Net Revenue - COGS - Variable Costs) / Net Revenue * 100
```

The Overview uses current data for the selected period. If COGS coverage is below 90%, this and Net Margin % display **—** with the coverage reason rather than estimating COGS.

### Net Margin % [#net-margin-pct]

The share of net revenue left after variable costs, fixed costs, and ad spend.

```
Net Margin % = (Contribution Margin - Fixed Costs - Ad Spend) / Net Revenue * 100
```

It shares the Contribution Margin % COGS-coverage rule: insufficient COGS coverage displays **—** with a reason.

### Fixed OpEx % [#fixed-opex-pct]

The share of net revenue represented by fixed operating expenses.

```
Fixed OpEx % = Fixed Costs / Net Revenue * 100
```

Fixed costs come from **Settings → Costs** and revenue is computed in real time. Keel HQ alerts when this exceeds its 20% ceiling.

### Period-over-Period Delta [#period-over-period-delta]

The percentage change from the equivalent-length window immediately before the selected one.

```
Period-over-period change = (current - prior) / |prior| * 100
```

For example, a 30-day window compares with the preceding 30 days. A partial Today window compares with yesterday at the same wall-clock time, never with a full day.

## Monthly report P&L [#monthly-report-pl]

The Monthly Report P&L calculates month-over-month and year-over-year changes for its values. Void orders count for nothing, and **Settings → Goals → Data Quality → Exclude zero-dollar orders from analytics** can exclude whole $0 orders.

### Gross Revenue [#gross-revenue]

Discounted line-item revenue plus shipping, before refunds.

```
Gross Revenue = DTC Gross Revenue + B2B Gross Revenue
```

Tax is not deducted: the report's revenue is already tax-exclusive. A paid order's free line retains its list price in gross revenue.

### Net Revenue [#net-revenue-1]

Revenue after refunds across DTC and B2B.

```
Net Revenue = DTC Net Revenue + B2B Net Revenue
```

At the storefront level, net revenue is line-item revenue plus shipping less exact refunds. A later refund changes the order's month when the report is regenerated.

### Order Count [#order-count]

The combined count of DTC and B2B orders.

```
Order Count = DTC Orders + B2B Orders
```

It counts distinct Shopify order IDs with a line item that is not refunded.

### Units Sold [#units-sold]

The combined units sold through DTC and B2B.

```
Units Sold = DTC Units + B2B Units
```

It sums quantities on line items that are not refunded. A free line in a paid order counts; a whole $0 order follows the zero-dollar-order setting.

### AOV [#aov-1]

Average order value for the report month.

```
AOV = Net Revenue / Order Count
```

This version uses the report's net revenue and order count, including shipping and exact refunds.

### Refund Rate [#refund-rate]

The share of gross revenue refunded in the report month.

```
Refund Rate = Refunds / Gross Revenue
```

Refunds are exact dollar amounts from Shopify order totals, including partial refunds.

### COGS [#cogs]

Cost of goods sold for units kept by customers in the report month.

```
COGS = cost of units kept + estimated cost of uncosted kept sales
```

Restocked returned units are removed from COGS; a no-restock refund keeps its cost. At least 90% of kept revenue must have cost data or COGS and every COGS-derived value display **—**; missing cost is never treated as free.

### COGS Coverage [#cogs-coverage]

The share of kept revenue with cost data.

```
Coverage = costed kept revenue / total kept revenue
```

Below 90%, Keel HQ withholds COGS and dependent metrics and shows **—** with the coverage percentage.

### Gross Profit [#gross-profit]

Profit after COGS and before operating costs.

```
Gross Profit = Net Revenue - COGS
```

It is withheld when COGS is withheld.

### Gross Margin % [#gross-margin-]

Gross profit as a share of net revenue.

```
Gross Margin % = Gross Profit / Net Revenue
```

It is withheld when COGS is withheld.

### Variable Costs [#variable-costs]

Costs that vary with sales or operations in the report month.

```
Variable Costs = total variable costs - costs counted as ad spend
```

Keel HQ groups these as shipping, payment processing, fulfillment, returns, customs, agency fees, and other. A cost requiring an unknown figure—for example missing Meta, COGS, ShipStation, or sales data—makes contribution margin and each lower P&L layer unknown rather than charging $0.

### Payment Fees [#payment-fees]

Imported Shopify Payments fees plus estimated fees for other configured gateways.

```
Payment Fees = imported fees + estimated gateway fees
```

Shopify Payments includes qualifying sale, capture, and refund transaction fees, including tax on the fee; a refund normally keeps its original fee unless Shopify reports a returned fee. Manual processing costs apply only to sales not covered by imported or estimated fees, preventing double count.

### Contribution Margin [#contribution-margin]

Profit after COGS and variable costs, before ad spend and fixed costs.

```
Contribution Margin = Gross Profit - Variable Costs
```

It displays **—** when COGS or a required variable cost cannot be calculated.

### Contribution Margin % [#contribution-margin-]

Contribution margin as a share of net revenue.

```
Contribution Margin % = Contribution Margin / Net Revenue
```

It follows the same COGS and variable-cost withholding rules as Contribution Margin.

### CM1 [#cm1]

The first Keel HQ contribution-margin layer.

```
CM1 = Net Revenue - COGS
```

CM1 is Gross Profit. It displays **—** when COGS is unavailable.

### CM2 [#cm2]

The contribution margin after variable costs.

```
CM2 = CM1 - Variable Costs
```

CM2 is Contribution Margin. It displays **—** when COGS or a required variable cost cannot be calculated.

### CM3 [#cm3]

The contribution margin after ad spend.

```
CM3 = CM2 - Ad Spend
```

Ad spend that cannot be read makes CM3 **—**, never CM2 minus $0. Connected platform spend, manual **Other ad spend**, and costs explicitly marked as ad spend belong here rather than in CM2.

### Fixed Costs [#fixed-costs]

Normalized fixed business costs in the report month.

```
Fixed Costs = costs for the portion of the month each cost was active
```

Monthly costs use their amount, quarterly costs one-third, and annual costs one-twelfth; a cost that starts, stops, or changes price mid-month is prorated for its active days. Add these in **Settings → Costs**, as described in the [Quick start](/quick-start).

### Net Profit [#net-profit]

Profit after COGS, variable costs, ad spend, and fixed costs.

```
Net Profit = CM3 - Fixed Costs
```

It displays **—** when an earlier part of the calculation is unavailable, including COGS or ad spend.

### Net Margin % [#net-margin-]

Net profit as a share of net revenue.

```
Net Margin % = Net Profit / Net Revenue
```

It displays **—** whenever Net Profit is unavailable rather than treating an unavailable cost as $0.

## Customers [#customers]

These metrics appear in the Monthly Report's **Customer Metrics** section.

### New Customers [#new-customers]

Customers whose email appears in the report period but not before it.

```
New Customers = Current Emails NOT IN Prior Emails
```

Keel HQ compares unique customer email addresses in the report period with those from earlier orders.

### Returning Customers [#returning-customers]

Customers whose email appears both in the report period and before it.

```
Returning Customers = Current Emails IN Prior Emails
```

Keel HQ compares customer email addresses regardless of capitalization.

### Repeat Purchase Rate [#repeat-purchase-rate]

The share of current-period customers who are returning.

```
Repeat Purchase Rate = Returning Customers / (New Customers + Returning Customers)
```

It uses the Monthly Report's new and returning customer sets.

### LTV (12m) [#ltv-12m]

Simplified lifetime value: average customer revenue over the trailing 12 months, not a cohort-based prediction.

```
LTV (12m) = Trailing 12m Revenue / Unique Customers (12m)
```

The window ends at the report-period end and uses unique customer emails.

### Blended CAC [#blended-cac]

Ad spend required to acquire each new customer in the report period.

```
Blended CAC = Total Ad Spend / New Customers
```

This differs from the Overview CPA, which uses every order rather than only new customers.

### LTV:CAC Ratio [#ltvcac-ratio]

The relationship between simplified LTV and blended CAC.

```
LTV:CAC Ratio = LTV (12m) / Blended CAC
```

It uses the Monthly Report's trailing-12-month LTV and blended CAC.

## Paid ads [#paid-ads]

The Monthly Report's paid-ads metrics use Meta campaign data. Its Blended ROAS is Meta's platform-attributed purchase value divided by Meta spend; it is distinct from the Overview's blended, business-wide ratio.

### Total Ad Spend [#total-ad-spend]

Total spend across Meta campaigns in the report period.

```
Total Ad Spend = total Meta campaign spend
```

This monthly-report metric is Meta Ads only; other ad channels are not synced into the report.

### Total Ad Revenue [#total-ad-revenue]

Meta-attributed purchase value across campaigns.

```
Total Ad Revenue = total Meta-attributed purchase value
```

It is platform-attributed revenue, not Keel HQ net revenue.

### Blended ROAS [#blended-roas-1]

Meta's own attributed return-on-spend figure, which differs from the Overview's net-revenue Blended ROAS.

```
Blended ROAS = Total Ad Revenue / Total Ad Spend
```

It uses Meta-attributed revenue and Meta spend.

### CPA [#cpa-1]

Cost per Meta conversion in the Monthly Report.

```
CPA = Total Ad Spend / Total Conversions
```

It uses Meta campaign conversions, rather than the Overview's Shopify-order count.

### Impressions [#impressions]

Total Meta campaign impressions.

```
Impressions = total Meta campaign impressions
```

It is supplied by Meta campaign data.

### Reach [#reach]

Total Meta campaign reach.

```
Reach = total Meta campaign reach
```

It is supplied by Meta campaign data.

### CPM [#cpm]

Impression-weighted Meta cost per thousand impressions.

```
CPM = impression-weighted campaign cost per thousand impressions
```

It is weighted by each campaign's impressions, not a simple average of campaign CPMs.

### Prospecting Spend % [#prospecting-spend-]

The share of Meta spend on prospecting campaigns.

```
Prospecting Spend % = prospecting campaign spend / Total Ad Spend
```

Campaign classification determines whether spend is prospecting.

### Retargeting Spend % [#retargeting-spend-]

The share of Meta spend on campaigns not marked as prospecting.

```
Retargeting Spend % = retargeting campaign spend / Total Ad Spend
```

Campaign classification determines whether spend is retargeting.

## Email [#email]

The Monthly Report's email metrics use Klaviyo campaign and flow data.

### Total Email Revenue [#total-email-revenue]

Klaviyo-attributed revenue from campaigns and flows.

```
Total Email Revenue = campaign-attributed revenue + flow-attributed revenue
```

It is attribution data from Klaviyo, not Shopify net revenue.

### Email Revenue % of Net [#email-revenue--of-net]

The share of net revenue attributed to email.

```
Email Revenue % of Net = Total Email Revenue / Net Revenue
```

It uses the Monthly Report's total email revenue and net revenue.

### Avg Open Rate [#avg-open-rate]

The average campaign open rate.

```
Avg Open Rate = average open rate across campaigns
```

It is averaged across campaigns.

### Avg Click Rate [#avg-click-rate]

The average campaign click rate.

```
Avg Click Rate = average click rate across campaigns
```

It is averaged across campaigns.

### Avg Unsubscribe Rate [#avg-unsubscribe-rate]

The average unsubscribe rate across email sends.

```
Avg Unsubscribe Rate = average unsubscribe rate across campaigns and flows
```

Campaigns and flows both contribute to this average.

### List Size [#list-size]

The current Klaviyo subscriber count.

```
List Size = current subscriber count from Klaviyo
```

This is a current count rather than a sum over the report month.

### Net List Growth [#net-list-growth]

The change in the Klaviyo subscriber list.

```
Net List Growth = List Size - Prior List Size
```

It compares the current list size with the prior list size.

## Products [#products]

Product metrics are a gross-sales view: fully refunded and voided orders are excluded, while other lines count in full.

### Revenue [#revenue]

Revenue grouped by Shopify product.

```
Revenue = total revenue for the product
```

For a paid order, a free gift contributes its list price to this gross-sales view.

### Units [#units]

Units sold for each product.

```
Units = total product units sold
```

A paid order's free gifts are included. Whole zero-dollar orders follow the zero-dollar-order setting.

### COGS [#cogs-1]

Cost of product units sold.

```
COGS = total cost of the product units sold
```

Keel HQ reports **—** for a product if any sold variant lacks COGS data; it does not report a partial product cost.

### Gross Profit [#gross-profit-1]

Product revenue after product COGS.

```
Gross Profit = Revenue - COGS
```

It displays **—** when the product's COGS is incomplete.

### Gross Margin % [#gross-margin--1]

Product gross profit as a share of product revenue.

```
Gross Margin % = Gross Profit / Revenue
```

It displays **—** when the product's COGS is incomplete.

## Inventory [#inventory]

Inventory uses Shopify available quantities across every stocking location. Physical-stock reads count every unit that left stock, even a free unit; its sales velocity, sell-through, stockout, and days-of-inventory data therefore reflects stock movement rather than only paid revenue.

### Units on Hand [#units-on-hand]

Available inventory summed across all stocking locations.

```
Units on Hand = total Shopify available quantity across locations
```

If Keel HQ cannot read all inventory levels, the store sync fails instead of storing a partial total.

### Sell-Through [#sell-through]

The share of units sold from the units sold plus units remaining.

```
Sell-Through = Units Sold / (Units Sold + Units on Hand)
```

The product catalog uses a rolling 90-day sales window. A Drop's Sell-Through uses units sold since its drop date and its launch quantity; product-level Drop Sell-Through displays **—** when an older multi-product Drop has no per-product launch quantities.

### Avg/Day (90d) [#avgday-90d]

Average daily units sold over the product catalog's rolling sales window.

```
Avg/Day (90d) = Units Sold in trailing 90 days / 90
```

It powers the catalog's sell-through, inventory status, and stockout calculation.

### Blended Sell-Through (90d) [#blended-sell-through-90d]

Inventory-wide sell-through across the current catalog.

```
Blended Sell-Through (90d) = Total Units Sold in 90 days / (Total Units Sold in 90 days + Total Units on Hand)
```

With no sold or on-hand units, Keel HQ displays 0%.

### DOI [#doi]

Days of inventory available at the current average daily unit-sales pace.

```
DOI = Units on Hand / Avg Daily Units Sold
```

The Monthly Report uses DOI to identify stockout risk and overstock.

### Stockout [#stockout]

Estimated calendar date on which inventory runs out at the current sales pace.

```
Stockout = Today + whole days of inventory remaining
```

With no average daily sales, it displays **—** rather than inventing a stockout date.

### Stockout Risk [#stockout-risk]

Products below the configured days-of-inventory minimum.

```
Stockout Risk = DOI is below the configured stockout threshold
```

The threshold comes from the report targets.

### Overstock [#overstock]

Products above the configured days-of-inventory maximum.

```
Overstock = DOI is above the configured overstock threshold
```

The threshold comes from the report targets.

### Inventory Retail Value [#inventory-retail-value]

The retail-value estimate for on-hand stock.

```
Inventory Retail Value = Units on Hand * implied average unit price from sales
```

A product with stock but no sales to price it from is left out of retail totals, never counted as $0.

### Inventory Cost Value [#inventory-cost-value]

The COGS value of on-hand stock.

```
Inventory Cost Value = Units on Hand * unit COGS
```

A product with any in-stock unit lacking COGS is left out of cost totals and counted as uncosted, never summed as $0.

### Dead Stock Flags [#dead-stock-flags]

The count of in-stock products with no units sold in the trailing 90 days, subject to seasonal suppression.

```
Dead Stock Flags = number of in-stock products with 0 units sold in 90 days
```

Out-of-stock products are not flagged. Fall/winter products are not flagged in spring/summer, and spring/summer products are not flagged in fall/winter.

## Cash forecast [#cash-forecast]

The **14-Week Cash Forecast** uses cash timing, not the Monthly Report's accrual-style sales and margins.

### Cash from Sales [#cash-from-sales]

Projected DTC cash collected from sales after processor fees and cash refunds.

```
Cash from Sales = Projected Sales * (1 - fee rate - refund rate)
```

Projected sales use a four-week average for weeks 0–1, a seasonally adjusted four-week average for weeks 2–7, and a seasonally adjusted eight-week average for weeks 8–13. Refunded orders remain in sales because the money came in and their cash refund is deducted separately; refunds at or above sales produce no cash from sales.

### Fee Rate [#fee-rate]

The processor-fee share used by the cash forecast.

```
Fee Rate = fees on scheduled payouts / gross scheduled payouts
```

When no payout has card charges, Keel HQ uses the default 3% processor fee rate.

### Refund Rate [#refund-rate-1]

The cash-refund share of DTC sales over the trailing eight complete weeks.

```
Refund Rate = cash part of DTC refunds / sales
```

It is capped at 100%. Store-credit refund amounts are excluded because they return as gift cards; a mixed refund retains its cash part.

### Opening Cash [#opening-cash]

The cash balances that count toward the forecast, rather than every connected account.

```
Opening Cash = total balances of accounts that count toward the forecast
```

Checking accounts count by default unless their name or purpose indicates tax, profit, or reserve; savings accounts do not. Keel HQ warns when the oldest counted balance is more than 48 hours old or has no as-of date.

### Minimum Cash [#minimum-cash]

The configured cash floor for the forecast.

```
Minimum Cash = the minimum cash balance you set in Cash → Settings → Minimum Cash
```

It defaults to $0. A week is a danger zone when ending cash falls below this amount.

### Incoming (high confidence) [#incoming-high-confidence]

Expected incoming cash that is still due and high confidence.

```
Incoming (high confidence) = total expected high-confidence payments still to come
```

Pending Shopify payouts count while Shopify reports them pending; other expected payments remain counted when overdue. Written-off, received, cancelled, and past Shopify payout rows do not count.

### Incoming [#incoming]

The forecast line for pending Shopify payouts and eligible expected payments.

```
Incoming = pending Shopify payouts + expected non-Shopify payments by week
```

High- and medium-confidence payments count in full. Low-confidence payments are excluded unless **Include low-confidence payments** is enabled; payments without a date or beyond the 14-week forecast are left out.
