What is GMV, and how do you measure it in Metabase?
Gross merchandise value (GMV) is the total value of orders transacted over a period, before any deductions — the topline of a store and theheadline number for marketplaces, where the platform only keeps a take rate of what buyers spend. It's a scale metric, not a health metric, which is exactly why it needs careful definition. Measure it in Metabase from order data synced into a database (Shopify, Medusa, or payment records from Stripe).
How is GMV calculated?
Sum the value of orders placed in the period. The judgment calls are all about what stays in the sum:
- Net of cancellations — orders that were never fulfilled or charged shouldn't count. Most definitions also exclude fraud and test orders.
- Gross of everything else — discounts, shipping, taxes, and platform fees stay in (or out) per your convention; document it once and never vary it between charts.
- GMV vs revenue vs net revenue — on a marketplace, revenue = GMV × take rate, and net revenue further subtracts refunds and incentives. Three numbers, three jobs: scale, monetization, and quality.
What data does GMV need?
- An orders table with
order_total,created_at, and astatusthat distinguishes cancelled orders. - Channel, category, or seller fields for breakdowns — marketplace GMV is only diagnosable per segment.
- One reporting currency, converted at a consistent rate before summing.
- For marketplaces: the fee or commission per order, so take rate can sit next to GMV on the same dashboard.
SQL patterns
Cancelled value split out, with month-over-month growth.
-- Monthly GMV with cancellations netted out, plus month-over-month growth.
WITH monthly AS (
SELECT
date_trunc('month', o.created_at) AS month,
SUM(o.order_total)
FILTER (WHERE o.status <> 'cancelled') AS gmv,
SUM(o.order_total)
FILTER (WHERE o.status = 'cancelled') AS cancelled_value
FROM orders o
GROUP BY date_trunc('month', o.created_at)
)
SELECT
month,
gmv,
cancelled_value,
ROUND(100.0 * (gmv / NULLIF(LAG(gmv) OVER (ORDER BY month), 0) - 1), 1)
AS gmv_growth_pct
FROM monthly
ORDER BY month;Decompose each channel's GMV into order volume and basket size.
-- GMV by channel with orders and AOV alongside, so you can see
-- whether growth came from more orders or bigger baskets.
SELECT
o.channel,
COUNT(*) AS orders,
SUM(o.order_total) AS gmv,
ROUND(SUM(o.order_total) / NULLIF(COUNT(*), 0), 2) AS aov
FROM orders o
WHERE o.status <> 'cancelled'
AND o.created_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY o.channel
ORDER BY gmv DESC;Pitfalls
Where this metric applies
- Shopify + Metabase — order totals, statuses, and sales channels
- Medusa + Metabase — marketplace-style order data in its own Postgres
- Stripe + Metabase — charges and Connect platform volume for take-rate math
- Adyen + Metabase — processed payment volume across regions and methods