Skip to content

Metrics glossary

This page defines every metric Kreel computes and shows where the number you see in the API differs from what the dashboard displays. Every ratio metric is computed by exactly one formula in Kreel’s backend, reused by the dashboard, the REST API, MCP tools, and the query DSL, so the same metric name means the same math everywhere. The differences documented below are about representation, a 0-1 fraction versus a percentage, gross versus net revenue, not different formulas.

For the full rules behind revenue and refunds, see Revenue accounting. For how date ranges and period comparisons work, see Dates and comparisons.

Net revenue divided by order count, both taken from the same refund-correct basis. Because the order count is not mixed with a differently-filtered count from a cached table, AOV always reconciles with the headline revenue number for the same period.

Each ad platform’s (Meta, Google) or Klaviyo’s own last-click conversion-value report, tagged revenue_kind: "attributed_last_click" on MCP responses. Attributed revenue overlaps across channels, the same sale can be attributed by more than one platform, so it is never additive. Do not add Meta’s attributed revenue, Google’s attributed revenue, and store revenue together to get a “total” - see Revenue below.

The share of a campaign’s sends that bounced, computed over recipients. Klaviyo’s flow-series reporting does not measure bounces, so Kreel reports bounce rate for email campaigns only, never for flows.

Unique clicks divided by emails delivered, not raw click events (which count every click, including repeats from the same person) and not divided by recipients. The dashboard shows this as a percentage. The API (Klaviyo REST v2, the compact REST API, MCP get_performance, and the query DSL) returns a 0-1 fraction to 4 decimal places, for example 0.0821 for 8.21%. One exception: the get_entities tool’s metrics_7d rollup and the legacy email-summary avg_* fields still use 0-100 percentages.

Conversions divided by clicks, for ad-platform entities such as campaigns, ad sets, and ads. Returned as a ratio to 4 decimal places, and omitted (not shown as 0) when clicks is 0.

Meta and Klaviyo report conversions as whole numbers. Google reports conversions as fractional numbers, because its data-driven attribution can assign part of a conversion, for example 0.63, to one ad and the rest to another. Kreel never floors these to integers - a low-volume Google campaign showing “2.4 conversions” is correct, not a bug; flooring it to 2 would overstate cost per acquisition.

Spend divided by count, where count is orders at the account level and platform conversions or purchases at the campaign, ad set, or ad level. Because the denominator changes by level, CPA is not directly comparable between an account-level number and a campaign-level number. Currency value, 2 decimal places.

Spend divided by clicks. Currency value, 2 decimal places.

Spend divided by impressions, times 1,000 - the cost to reach a thousand impressions. Currency value, 2 decimal places; guarded on impressions being present, not on spend.

Clicks divided by impressions. Ratio, 4 decimal places.

The share of a campaign’s sends that were actually delivered, computed over recipients. Kreel does not compute this for flows.

Kreel’s blended efficiency metric: store revenue (net) divided by total paid ad spend across Meta and Google combined. It is the same ROAS formula, value divided by spend, applied to a blended numerator and denominator instead of a single platform’s own numbers. Email and organic carry no spend, so they are excluded from the denominator. Surfaced as a summary block when the MCP get_performance tool is called with platform="all" and entity_type="account", and on the per-brand rows of get_portfolio - both show the numerator and denominator alongside the ratio so it is checkable, not a black box.

Unique opens divided by emails delivered, not raw open events and not divided by recipients. The dashboard shows this as a percentage. The API returns a 0-1 fraction to 4 decimal places. The legacy avg_open_rate field predates this definition: it is a percentage (not a 0-1 fraction) blended across every campaign and flow in the selected period, rather than reported per entity - keep that difference in mind if the two numbers do not match for a single campaign.

Order count follows two different, deliberate rules depending on the table. Headline order counts (the dashboard, revenue endpoints, MCP get_performance) include voided and cancelled orders, matching Shopify’s own Total Sales report - they add roughly nothing to revenue, but must still appear in the count. The pre-computed trend and cohort tables exclude voided and cancelled orders, since a never-charged order is just noise in an AOV or retention average.

The fraction of an acquisition cohort, customers who first ordered in a given month, that ordered again in a later snapshot month. It is a stored fraction per cohort/snapshot-month pair - never sum it across snapshots; average it if you need to aggregate. Related customer-segmentation fields, RFM recency, frequency, and monetary scores and segment labels such as champion or at_risk, are available through the query DSL’s customers_rfm table for agents building retention or win-back analyses.

Store revenue is what Kreel means by “revenue” on the dashboard headline and in the MCP get_performance tool: the refund-correct net total, real money the store took in for the window. It already subtracts refunds that landed inside the window for orders created before it (a cross-period refund). get_performance also returns gross_revenue (before that subtraction) and refund_adjustment (the amount subtracted), so an agent can see exactly what changed. The pre-computed tables behind trend charts and cohorts, and daily_channel_summary.revenue in the query DSL, store gross Shopify revenue only, not the refund-correct figure - a small gap between a headline number and a trend-chart number for the same period is expected, not a bug. Selecting that column through the query DSL returns a notices entry pointing back to get_performance for the net figure. See Revenue accounting for the full rules, including cross-period refunds and the Revenue Basis (tax and shipping) setting.

Revenue divided by recipients, available for email campaigns, flows, and individual flow messages. The query DSL exposes it at message grain, on the email_flow_messages table. Ratio, 4 decimal places.

Value divided by spend. Ratio, 2 decimal places, for example 3.45. At the account level with platform="all" this becomes MER, described above; at the campaign or ad level it is the platform’s own attributed conversion value over spend.

The share of a campaign’s delivered emails marked as spam, computed over delivered sends. Like bounce rate, this is reported for email campaigns only - Klaviyo’s flow-series reporting does not measure spam complaints for flows.

Ad spend from Meta and Google, in the brand’s single base currency. Kreel does not convert currencies - a brand connected to ad accounts in a different currency than its Shopify store is not automatically reconciled.

The share of a campaign or flow’s delivered emails that triggered an unsubscribe, computed over delivered sends.

  • Revenue accounting - the full net-vs-gross, cross-period refund, and Revenue Basis rules.
  • Dates and comparisons - how date ranges, windows, and Compare To periods are resolved.
  • MCP data tools - the tools that return these metrics (get_performance, get_entities, compare, get_portfolio).
  • Query DSL - exact column types and precision for every metric, table by table.

Email support@kreel.ai if a number doesn’t match what you expect.