Metric · E-commerce

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).

TL;DR — GMV = sum of order value transacted, net of cancellations, gross of costs. It flatters growth by design, so never show it alone: pair it with AOV to decompose growth, and with take rate or gross margin to see what you actually keep.

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 a status that 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

Monthly GMV net of cancellationsPostgreSQL

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;
GMV by channel with AOVPostgreSQL

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

Reporting GMV gross of cancellations.→ Cancelled and fraudulent orders inflate the topline with transactions that never happened. Net them out, and show cancelled value as its own line so the netting is visible.
Letting GMV stand in for revenue.→ On a marketplace the gap is the entire business model. Report GMV, take rate, and revenue together, or someone will multiply your GMV by the wrong number.
Celebrating GMV growth without decomposition.→ GMV = orders × AOV. Growth driven by deep discounting shows up as rising GMV with falling AOV and margin — visible only if AOV and contribution sit on the same card.
Summing raw amounts across currencies.→ Multi-region stores must convert to one reporting currency at a consistent rate before aggregating, or FX swings masquerade as growth.

Where this metric applies

Analytics

Metrics

FAQ

What's the difference between GMV and revenue?
GMV is the total value of orders transacted on your platform; revenue is what you keep. For a first-party store they're close — revenue is GMV minus discounts, returns, and taxes. For a marketplace they're very different: if buyers spend $10M and your take rate is 12%, GMV is $10M but revenue is $1.2M. Reporting GMV as revenue is the classic marketplace inflation trick, so always label which one a card shows and track refund rate next to it.
Should GMV include cancelled orders and refunds?
Net out cancellations — an order that never shipped and never charged isn't merchandise value by any honest definition. Refunds are more debatable: many teams report GMV gross of refunds (the transaction happened) and show refunded value as its own line. Whichever you choose, write the rule into the model and keep it identical across every chart, because a definition that shifts between decks is worse than either convention.
Why does GMV flatter growth?
Because it counts the biggest possible number and none of the costs. GMV can grow while take rate compresses, discounts deepen, and every incremental order loses money. Pair it with average order value to decompose growth into orders × basket size, with take rate if you're a marketplace, and with gross margin to check the growth is worth having.
Is GMV the same as GTV or TPV?
They're siblings with different scopes. GMV counts merchandise sold; GTV (gross transaction value) and TPV (total payment volume) count money processed, which payment platforms report and which includes non-merchandise flows like tips, fees, or top-ups. If your GMV model is built on payment data synced from Stripe or Adyen, filter to merchandise transactions or you'll quietly report TPV under a GMV label.
How do you track GMV in Metabase?
Sync orders into a SQL database — from Shopify via Airbyte or Fivetran, straight from Medusa's own Postgres, or from payment exports — with order totals, statuses, and channels. Chart monthly GMV net of cancellations with a growth column, break it down by channel and category with AOV alongside, and pin both to your e-commerce sales dashboard.