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.
For: Growth, retention, CRM. Refresh: daily or weekly. Source: modeled orders keyed to a stable customer, deduped by email.
What does a repeat purchase dashboard look like?
Here’s the layout this guide builds: repeat purchase rate against its goal at the top, then the behavior cards — lifetime order counts, the time-to-second-order curve, returning-customer revenue share, and repeat rate by acquisition cohort — then the tables that name which first purchase and which customers bring people back.

An example repeat purchase dashboard in Metabase, built from Shopify, WooCommerce, or Klaviyo data. Figures are illustrative.
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;