Metric Glossary & Definitions

All metrics used across this dashboard in one place — formulas, source fields, and plain-language definitions. Numbers update from the dashboard's source queries. Where a metric appears on a detail page, that page links back here rather than repeating the definition.


Marketing Efficiency

MER — Marketing Efficiency Ratio

Formula: Total Shopify GMV (closed month) / Total Meta Ad Spend (same month)

The blended efficiency of every dollar spent on Meta Ads, measured against all revenue Shopify recorded — not just what Meta claimed to drive. Because the numerator is total Shopify GMV, MER captures halo and organic lift that Meta's attribution window misses.

Break-even on this dashboard: 2.54x — derived from COGS 45% + variable overhead 12.31% + fixed overhead allocation.

Source: orders.parquet (Shopify bulk) × placement_insights.parquet (Meta API v25.0).

Common MER definitions →


ROAS — Return on Ad Spend

Formula: Meta-attributed Revenue / Meta Ad Spend

Meta's own view of efficiency: only revenue from purchase events Meta claims credit for (within the configured attribution window, typically 7-day click / 1-day view).

Differs from MER because the numerator is Meta-claimed purchases, not all Shopify orders. ROAS will always be ≤ MER when any organic or cross-channel orders exist. A large gap signals attribution leakage.

Current reading: 1.10x ROAS vs 2.36x MER → 27% attribution gap (April 2026, partial month). Both are below the 2.54x break-even.

Source: Meta Marketing API actions field — purchase event value / spend.


CPM — Cost Per Mille

Formula: Ad Spend / Impressions × 1,000

The cost to show your ad to 1,000 unique-counted impressions. Meta reports this directly.

Source: Meta API field cpm in placement_insights.parquet and demographic_insights.parquet.


CTR — Click-Through Rate

Formula: link_clicks / impressions

Share of impressions that resulted in a link click (outbound to the landing page). Distinct from all-click CTR which includes reactions, comments, shares.

Source: Meta API fields link_clicks and impressions.


Frequency

Formula: impressions / reach

Average number of times each unique person in the reached audience saw the ad in the selected window. Frequency > 3–4 typically signals audience saturation and precedes CPM inflation.

Source: Meta API fields impressions and reach.


Conversion Funnel

CVR — Conversion Rate

Formula: purchases / initiate_checkouts

Share of checkout-initiations that converted to a completed purchase, as recorded by the Meta Pixel. Uses a 7-day attribution window.

Source: Meta Pixel events — initiate_checkout and purchase action counts from pixel_events.parquet.


CAC — Customer Acquisition Cost

Formula: Total Ad Spend / New Customers Acquired (same window)

How much it cost in paid media to acquire one net-new customer. "New customer" = Shopify customer with no prior order before the window start date.

Source: placement_insights.parquet (spend) × orders.parquet filtered to first-order customers.


AOV — Average Order Value

Formula: Total Revenue / Order Count

Average KES value per completed order. First-purchase AOV restricts both numerator and denominator to orders from customers placing their first-ever order (different from all-order AOV).

Source: orders.parquettotal_price field, filtered to financial_status = 'paid'.


Pixel Coverage

Formula: Meta-recorded purchase events / Shopify orders (same window)

The fraction of Shopify transactions that the Meta Pixel successfully fired a purchase event for. A ratio below 0.90 (90%) indicates attribution leakage — Meta is missing orders, which suppresses ROAS and may cause the algorithm to under-invest in converting placements.

Source: pixel_events.parquet (purchase event count) vs orders.parquet (order count), matched by date window.


Attribution Ratio

Same concept as Pixel Coverage but tracked on a monthly cadence and expressed as a decimal ratio (e.g., 0.73 = 73% of Shopify orders attributed). A ratio persistently below 1.0 means Meta is under-counting conversions.

Current status: ~0.73 (27% gap). Root cause: CAPI not enabled; browser-side Pixel only.

Source: Same as Pixel Coverage — monthly aggregation.


Catalog Health

OOS % — Out-of-Stock Percentage

Two distinct denominators — always check which one is being cited:

  • Variant-level: variants where inventory_quantity = 0 / total active variants
  • Product-level: products where ALL variants are OOS / total active products

Product-level OOS is the tighter signal for ad waste: Meta continues serving catalog ads for a product even when every variant is unavailable, burning spend on unresolvable impressions.

Caveat: inventory_quantity is not currently present in the bulk pull. Headline figures on the catalog page are upper-bound estimates modeled from order-gap signals, not live inventory counts.

Source: products_bulk/ (Shopify Admin API bulk export) — variants.inventoryItem.inventoryLevels.


Variant Match Rate

Formula: Orders where ≥1 line item maps to a variant with non-null unitCost / Total orders

Used for COGS reconstruction quality. A low match rate means a large share of revenue has no unit cost attached, so gross margin figures are understated (missing COGS treated as 0 → overstated margin, not understated).

Current: 72.8% match rate (27.2% of orders have no COGS data).

Source: line_items.parquet joined to variants.parquet on variant_id, checking inventoryItem.unitCost non-null.


Profitability

Gross Margin %

Formula: (Revenue − COGS) / Revenue

Pre-operating-expense margin. COGS is reconstructed at the SKU level using variants.inventoryItem.unitCost multiplied by line-item quantities. Unmatched SKUs contribute 0 COGS → margin is overstated where unitCost is null.

Source: orders.parquet × line_items.parquet × variants.parquet (unitCost field).


Net Margin %

Formula: (Revenue − COGS − Ad Spend − 8% overhead proxy) / Revenue

Operating-level margin after COGS, paid media, and a blended overhead proxy.

Overhead caveat: The 8% proxy understates true variable overhead by ~4.3 percentage points. Actual variable overhead from Feb 2026 daily_pl.parquet: payment fees 3.0% + courier 8.62% + packaging 0.69% = 12.31%. True net margin is worse than the 8%-proxy figure shown.

Source: Same as Gross Margin, plus placement_insights.parquet (ad spend) and daily_pl.parquet (overhead rates).


CM1 — Contribution Margin 1

Formula: Revenue − COGS

Gross profit before any marketing spend. Pre-media contribution — answers "does the product make money before we pay to acquire customers?"

Source: Same as Gross Margin %.


CM2 — Contribution Margin 2

Formula: Revenue − COGS − Variable Marketing Spend

Post-paid-media contribution. Answers "does the product make money after we pay Meta?" Negative CM2 means the channel destroys value at the product level even before fixed overhead.

Source: Same as CM1, plus placement_insights.parquet (Meta spend allocated by period).


Retention

Lifetime Repeat Share

Formula: Customers with ≥2 lifetime orders / Total unique customers ever

Cumulative, all-time denominator. Measures what fraction of the total customer base has ever come back for a second purchase, regardless of when that repeat happened.

Current: 4.3% — a low lifetime repeat share relative to healthy DTC benchmarks (typically 20–35%).

Source: orders.parquet grouped by customer_id, counting distinct customers with order_count ≥ 2.


Monthly Repeat Order Rate

Formula: Orders from customers who had a prior order / Total orders that month

Monthly denominator. Distinct from Lifetime Repeat Share — this answers "what fraction of this month's orders were from returning customers?" and is sensitive to new-customer acquisition volume (a high-acquisition month dilutes this rate even if retention is stable).

Current: March 2026 = 18.15%.

Source: orders.parquet — for each order, check if customer_id appears in any order with an earlier created_at.


Cohort Retention

Formula: % of acquisition-month cohort that placed ≥1 order in month N+1, N+2, …

Tracks whether customers acquired in a given month return in subsequent months. Displayed as a heatmap on the retention page. Each row = one acquisition cohort; each column = months since first order.

Source: orders.parquet — cohort assigned by customer's earliest created_at month.


Window Conventions

Closed Month

A fully-elapsed calendar month where all orders have settled and no new orders can be added. Example: March 2026 is closed as of 25 April 2026. MER and profitability figures should always be cited on closed months to avoid denominator instability.


Partial Month

The current calendar month that has not yet ended. Revenue and order counts will grow; ratios (ROAS, MER, CVR) may swing significantly as the denominator is incomplete. All partial-month figures on this dashboard are labeled (partial) in chart subtitles.


Trailing 7d / 30d

A rolling window ending at the most-recent extract date (currently 2026-04-23, per data/raw/products_bulk/manifest.json). Unlike calendar months, trailing windows shift daily with each extract. Use for operational monitoring; use closed months for trend comparisons.


Source Data + Lineage

Source Path / Location Contents
Shopify orders bulk data/agent_runs/2026-04-23_2219_human_shopify_orders_bulk/ orders.parquet, line_items.parquet, transactions.parquet
Shopify products bulk data/agent_runs/2026-04-23_2217_human_shopify_products_bulk/ products.parquet, variants.parquet (incl. unitCost), images.parquet
Meta Marketing API v25.0 Workers w1–w10, data/agent_runs/ prefixed by run date placement_insights.parquet, demographic_insights.parquet, audiences.parquet, pixel_events.parquet, catalog_diagnostics.parquet
Owner ops ledger data/processed/xlsx/daily_pl.parquet Daily P&L — Feb 2026, 2 of 28 days populated. Source for overhead rate (12.31%).

All raw parquet files are read directly by Evidence SQL blocks. No intermediate transformation layer — queries run against the files at build time.


Caveats Currently in Effect

27.2% of orders lack COGS match. Variant unitCost is null for 27.2% of order line items. These are treated as 0 COGS in all reconstructions, which overstates gross margin and understates the true loss. Fix requires backfilling unitCost in Shopify for affected SKUs.

April 2026 = partial month. All April figures will change as the month closes. Do not use April for closed-month comparisons until after May 1 extract.

CAPI not enabled → 27% pixel attribution gap. The Meta Pixel fires client-side only. Server-side Conversions API (CAPI) is not active. This causes Meta to miss ~27% of Shopify purchases, suppressing reported ROAS and potentially under-allocating budget to high-performing placements. Fix: enable CAPI via Shopify's Meta channel integration.

inventory_quantity not in current bulk pull. The Shopify bulk export used for this dashboard does not include live inventory levels. OOS % figures on the catalog pages are upper-bound modeled estimates derived from order-gap signals, not actual real-time inventory counts. Fix: add inventoryLevels to the bulk query.

Overhead proxy understates true costs. The 8% overhead proxy used in net margin calculations is ~4.3 pp below the actual 12.31% variable overhead rate observed in Feb 2026 daily_pl. True net margins are worse than shown. The daily_pl itself covers only 2 of 28 days in February, so the 12.31% rate is itself an estimate.