What is active member rate?
What does an active member rate chart look like in Metabase?
Plot the rate as a monthly line with the definition — posts, replies, and reactions — printed right in the card title, so nobody mistakes it for a different active count. The steady climb means engagement is deepening as the community grows, while December's dip is the quiet holiday stretch that touches every activity metric and recovers on its own.
Definition
Active member rate is the share of members who were active in a window — the DAU/MAU idea applied to a community. Everything hinges on the written definition of 'active': posts, replies, and reactions are visible everywhere, but read-only activity is not — Discourse logs reads per member, while chat platforms like Slack and Discord mostly do not expose them — so lurkers are counted or invisible depending on the platform, not on your intent. Pick the qualifying signals, pick the window (30 or 90 days), and print both on the dashboard.
What data do you need?
- Activity events — posts, replies, reactions — with member IDs and timestamps
- A membership table with join dates and deletion flags, for an honest denominator
- A written definition of 'active': the qualifying signals and the window
- Read or login events where the platform exposes them, kept as a separate signal
- A staff flag, so team activity does not pad the rate
SQL pattern
WITH months AS (
SELECT generate_series(
date_trunc('month', CURRENT_DATE - INTERVAL '12 months'),
date_trunc('month', CURRENT_DATE - INTERVAL '1 month'),
INTERVAL '1 month'
)::date AS month
), members AS (
-- Denominator: members who had joined before the month ended and
-- were not deleted before it started.
SELECT
m.month,
COUNT(*) AS total_members
FROM months m
JOIN community_members cm
ON cm.joined_at < m.month + INTERVAL '1 month'
AND (cm.deleted_at IS NULL OR cm.deleted_at >= m.month)
GROUP BY m.month
), active AS (
-- Active = posted, replied, or reacted in the month. That is the
-- definition this card uses; state it in the card title, because
-- adding logins or reads produces a different (larger) number.
SELECT
date_trunc('month', e.occurred_at)::date AS month,
COUNT(DISTINCT e.member_id) AS active_members
FROM community_activity_events e
WHERE e.event_type IN ('post', 'reply', 'reaction')
GROUP BY 1
)
SELECT
m.month,
mem.total_members,
COALESCE(a.active_members, 0) AS active_members,
ROUND(
100.0 * COALESCE(a.active_members, 0)
/ NULLIF(mem.total_members, 0), 2
) AS active_member_rate_pct
FROM months m
JOIN members mem USING (month)
LEFT JOIN active a USING (month)
ORDER BY m.month; Common pitfalls
Where does this metric apply?
This metric commonly uses data from Discourse, Circle, Discord, Slack, Bettermode, plus any warehouse models built on exported community and event records at the same grain.