What goes in a repeat purchase dashboard in Metabase?
A repeat purchase dashboard measures whether customers come back — the difference between a store that has to keep buying growth and one that compounds. It tracks repeat purchase rate, time between orders, and lifetime value. Build it from store data synced into a database — see Shopify, WooCommerce, or Klaviyo for the connection.
orders keyed to a stable customer, deduped by email.Which cards belong on a repeat purchase dashboard?
Headline KPIs
- Repeat purchase rate
- New vs. returning customer revenue
- Customer lifetime value
- Median days between orders
Cohort & behavior
- Repeat rate by acquisition cohort
- Orders-per-customer distribution
- Time-to-second-order curve
- Retention by first product or category (table)
What data does a repeat purchase dashboard need?
- An
orderstable with a stablecustomer_idand dates. - A financial status so unpaid/cancelled orders don't count.
- Email or identity dedupe so guest checkouts aren't counted as new people.
- First product/category for retention-by-entry analysis.
How do you build a repeat purchase dashboard?
- Sync your store into a database (Shopify, WooCommerce, or Klaviyo).
- Assign each customer a cohort from their first paid order; dedupe by email.
- Compute repeat rate by cohort and time between orders.
- Add filters for cohort range, first product, and channel.
Example card SQL
-- Repeat purchase rate by first-order month (acquisition cohort).
WITH first_order AS (
SELECT customer_id, MIN(created_at) AS first_at
FROM orders WHERE financial_status = 'paid'
GROUP BY customer_id
),
orders_per_customer AS (
SELECT customer_id, COUNT(*) AS orders
FROM orders WHERE financial_status = 'paid'
GROUP BY customer_id
)
SELECT
date_trunc('month', f.first_at) AS cohort_month,
COUNT(*) AS customers,
ROUND(100.0 * COUNT(*) FILTER (WHERE o.orders > 1)
/ NULLIF(COUNT(*), 0), 1) AS repeat_rate_pct
FROM first_order f
JOIN orders_per_customer o ON o.customer_id = f.customer_id
GROUP BY date_trunc('month', f.first_at)
ORDER BY cohort_month;