Validation
Every number on the dashboard, traced to source.
Pulled directly from ShopifyQL FROM sales (Shopify Admin's reportable convention) and Supermetrics data_query. Every figure here can be cross-checked against the equivalent Shopify Analytics or platform report.
If a number on the leadership dashboard looks off, this page is the first place to look.
Definitions
How each metric is calculated. Differs slightly from Shopify's native displays in places — intentional, per the spec.
- Net sales
- Throughout this dashboard:
ShopifyQL net_sales + shipping_charges= gross sales − discounts − returns + shipping. Excludes taxes. Differs from Shopify's nativenet_sales(which excludes shipping). - Gross profit
- ShopifyQL
gross_profit. COGS is derived as(ShopifyQL net_sales) − gross_profit— uses ShopifyQL's net_sales (no shipping) since shipping isn't a product cost. - AOV
net sales (incl shipping) ÷ orders. Shopify's nativeaverage_order_valueusesnet_sales ÷ ordersonly (no shipping), so our number is ~£1 higher per order on average.- Orders
- ShopifyQL
orders— includes all sales channels (Online Store, Skio Subscriptions, Shop, TikTok Shop, etc.). Does not include Draft Orders or cancelled orders. - New customer
customers − returning_customersfor the week. A "new" customer's first-ever order falls in that week.- New vs existing order
- For the AOV breakout: an order is "new" if it's the customer's first-ever lifetime order (determined from a bulk Admin GraphQL pull of
customer.numberOfOrders). All later orders from the same customer are "existing" — including any subsequent orders within the same window. ShopifyQL aggregates don't expose this split. - Rolling 6mo LTV
- Net sales ÷ distinct customers in trailing 26 weeks. Sampled every 4 weeks; 27 sample points across the past 2 years.
- COGS (cost of goods sold)
- Derived as
ShopifyQL net_sales − gross_profitper day/week. Shopify computesgross_profitper order line item using each variant'sunitCostfield, so this aggregate is the sum of every product's per-unit COGS × quantity sold — i.e. exactly the product-level COGS rolled up. The "COGS" column in the daily breakdown below should match the sum of the per-product COGS table further down (within rounding). - CM1 / CM2 / CM3
- CM1 = net sales (incl ship) − COGS. CM2 = CM1 − fulfilment (UK £4 / US £8 / EU £8 / RoW £12 per order) − Shopify Payments fee (2.27% of net sales incl ship). CM3 = CM2 − blended Google + Meta + TikTok ad spend.
- Region
- From
billing_country. UK = United Kingdom + GB. US = United States + US. EU = EU27 + EEA + Switzerland. RoW = everything else (computed as Global − UK − US − EU).
Last 14 Days — Daily Breakdown (Global)
Direct ShopifyQL pull:
FROM sales SHOW orders, gross_sales, discounts, returns, net_sales, shipping_charges, taxes, total_sales, gross_profit, average_order_value, customers, returning_customers TIMESERIES day SINCE 2026-04-23 UNTIL 2026-05-06. The "Net sales (incl ship)" column matches what's used on the dashboard; "ShopifyQL net" is shown for reference.| Day | Orders | Gross sales | Discounts | Returns | ShopifyQL net | Shipping | Net sales (incl ship) | Taxes | Gross profit | COGS (net−GP) | Margin % | Shopify AOV | Our AOV | Customers | Existing | New |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 14-day total | ||||||||||||||||
By Sales Channel (Last 14 Days)
Skio Subscriptions are recurring auto-replenishment orders — lower AOV than Online Store. This is why blended AOV looks lower than you might expect from Shopify's "Online Store" view alone.
| Channel | Orders | Net sales | AOV | % of net |
|---|
By Product Type (Last 14 Days)
Top product types by net sales. Useful for sanity-checking the AOV mix.
| Product type | Orders | Net sales | AOV |
|---|
AOV by Customer Type
From a Shopify Admin GraphQL bulk operation. Order classified as new if it's the customer's first-ever lifetime order (lifetime count == orders in window AND earliest in-window). Everything else is existing. Region from
shippingAddress.countryCodeV2. ShopifyQL aggregates don't expose this split.| Cohort | Orders | Net (incl ship) | AOV (incl ship) | Share of orders |
|---|
Daily breakdown
| Day | New orders | New revenue | New AOV | Existing orders | Existing revenue | Existing AOV | New share % |
|---|---|---|---|---|---|---|---|
| Window total |
Caveat: a customer who placed multiple orders in our window where one of them is their first-ever lifetime order — we count the first as "new" and the subsequent ones as "existing" for this customer. This is the right behaviour: from the second order onwards in their lifetime, they are an existing customer.
COGS Validation by Product (Last 14 Days)
Top 20 products by net sales. COGS is derived as
ShopifyQL net_sales − gross_profit per product, summed across orders. Units sold come from FROM inventory SHOW inventory_units_sold; full-size SKU names are matched to sales rows. Use the "COGS / unit" column to sense-check against the actual cost you pay per unit. Outliers (margin < 70% or COGS/unit looking off) are worth investigating.| Product | Orders | Units sold | Net sales (excl ship) | Gross profit | COGS | Gross margin % | COGS / unit |
|---|---|---|---|---|---|---|---|
| Top-20 total |
Gross margin % here = gross_profit ÷ ShopifyQL net_sales (i.e. net excl shipping). This isolates product-level economics from shipping mix. Skincare blended gross margin typically sits 80–88% — anything materially below suggests a costing or returns issue worth digging into.
Reconciliation: Daily → Weekly
Sum the daily ShopifyQL results for week-of-2026-04-27 (Mon–Sun) and confirm they match the weekly TIMESERIES pull used on the dashboard. Identical = the dashboard math is sound.
| Metric | Daily sum (Mon–Sun) | Weekly TIMESERIES | Δ | Status |
|---|
Region Split Sanity (Week of 2026-04-27)
UK + US + EU + RoW must sum exactly to Global. If these don't reconcile, the regional dashboard charts are wrong.
| Metric | UK | US | EU | RoW | Sum (UK+US+EU+RoW) | Global (TIMESERIES) | Status |
|---|
Q1 LTV by Region — Cross-Check
Two independent ShopifyQL queries:
SINCE 2024-10-01 UNTIL 2025-03-31 and SINCE 2025-10-01 UNTIL 2026-03-31. UK and US are pulled directly; EU is summed across EU27 + EEA + CH; RoW is computed as Global − UK − US − EU.| Region | Q1 2025 customers | Q1 2025 net sales | Q1 2025 LTV | Q1 2026 customers | Q1 2026 net sales | Q1 2026 LTV | Δ% |
|---|
Ad Spend Totals (30 Months)
Direct from Supermetrics. Cross-check against each platform's billing or campaign manager.
| Platform | Accounts | Total spend |
|---|---|---|
| Google Ads | Dr Sam's UK (7873961588) + US (6022136092) | |
| Meta Ads | Dr Sam's GBP (act_4107038206239334) + US (act_624212431972703) | |
| TikTok Ads | UK (7070060217039355905) + US (7210028590547746818) + AU (7286512101391384578) | |
| Total blended marketing |
Open Questions / Things to Verify
If any of these resolve differently than assumed, the dashboard numbers will need to shift.
- AOV expectation: blended AOV is £44.90 (last 14 days). Online Store alone is £49.31. Skio Subscriptions averages £39.88 and contributes 28% of net. If your reference benchmark is Online Store only, this dashboard's blended AOV will look low; if it's Shopify's native AOV (no shipping), our AOV will look ~£1 high per order.
- B2B / wholesale orders: ShopifyQL
FROM salesincludes all order types except Draft Orders. If you want to exclude wholesale, we'd need a B2B-flag filter in v2. - Returns: ShopifyQL net_sales already nets returns. Refunds processed after the order's original date are reflected in the original day's net sales (so historical numbers may shift slightly as returns settle).
- Marketing scope: only Google + Meta + TikTok. If you also run Klaviyo, influencer, affiliate, or other paid channels we should add them to CM3.