Dashboard

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.

Which cards belong on a repeat purchase dashboard?

Headline KPIs

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 orders table with a stable customer_id and 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?

  1. Sync your store into a database (Shopify, WooCommerce, or Klaviyo).
  2. Assign each customer a cohort from their first paid order; dedupe by email.
  3. Compute repeat rate by cohort and time between orders.
  4. Add filters for cohort range, first product, and channel.

Example card SQL

Repeat purchase rate by cohortPostgreSQL
-- 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;

Integrations

Analytics

Dashboards

Metrics

FAQ

Why cohort repeat purchase rate by first-order month?
Because a blended rate mixes seasoned customers with brand-new ones who simply haven't had time to reorder. Cohorting by first-order month holds tenure constant so you can see whether newer customers are actually more (or less) loyal. See repeat purchase rate for the full method.
How does repeat purchase relate to LTV?
Repeat purchases, at a healthy average order value, are what drive lifetime value. Improving repeat rate is usually the highest-leverage way to raise LTV and reduce dependence on paid acquisition.
How do I handle guest checkouts?
Dedupe customers by email (or another stable identity) before counting, or one returning shopper who checked out as a guest will look like several first-time buyers and understate your repeat rate.