Metric

What is community engagement rate?

Definition

Community engagement rate is the share of members who did something in a period — posted, replied, or reacted — divided by the members who could have. It is really two metrics wearing one name: the participation ratio (how many people took part) and intensity (how many actions each of them took). Report both, because a community where ten people post constantly looks identical to a healthy one in an intensity-only view.

Formula: Engagement rate = members with at least one qualifying action in the period / eligible members in the period × 100

What data do you need?

  • Activity events — posts, replies, reactions — with member IDs and timestamps
  • A membership table with join dates, to build the denominator honestly
  • A staff flag, so team activity can be excluded from community engagement
  • A written list of which actions qualify as engagement
  • Category or channel labels, if engagement is compared across spaces

SQL pattern

Engagement rate and actions per engaged member (PostgreSQL)PostgreSQL
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
), eligible AS (
  -- Denominator: members who had already joined by the start of the month.
  SELECT
    m.month,
    COUNT(*) AS eligible_members
  FROM months m
  JOIN community_members cm ON cm.joined_at < m.month
  GROUP BY m.month
), engaged AS (
  SELECT
    date_trunc('month', p.created_at)::date AS month,
    COUNT(DISTINCT p.member_id) AS engaged_members,
    COUNT(*) AS actions
  FROM community_posts p
  JOIN community_members cm ON cm.member_id = p.member_id
  WHERE NOT cm.is_staff
  GROUP BY 1
)
SELECT
  e.month,
  e.eligible_members,
  COALESCE(g.engaged_members, 0) AS engaged_members,
  ROUND(
    100.0 * COALESCE(g.engaged_members, 0)
    / NULLIF(e.eligible_members, 0), 2
  ) AS engagement_rate_pct,
  ROUND(
    1.0 * COALESCE(g.actions, 0) / NULLIF(g.engaged_members, 0), 1
  ) AS actions_per_engaged_member
FROM eligible e
LEFT JOIN engaged g USING (month)
ORDER BY e.month;

Common pitfalls

Using all-time registrations as the denominator.→ Every dormant signup from three years ago drags the rate toward zero. Choose a defensible denominator — members who joined before the period, or members active in the last 90 days — and label it.
Counting staff replies as community engagement.→ Exclude staff from the numerator, or split the card. A support team answering every thread is a service metric, not a community one.
Reporting participation without intensity.→ Show actions per engaged member alongside the rate; the two moving in opposite directions is the signal worth catching.

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.

Dashboards

Integrations

Metrics

Analytics

FAQ

Do reactions count as engagement?
They can, but weight them separately. A reaction costs one click; a reply that answers someone's question costs real effort. Many teams keep a strict rate (posts and replies only) as the headline and a loose rate including reactions as context, rather than blending them into one number that moves whenever an emoji picker changes.
What is a good engagement rate?
There is no credible cross-community benchmark, because the denominators aren't comparable — a Discord server counts everyone who ever joined, a gated forum counts a vetted list. Compare the rate against your own history and against the same definition across your own spaces, and treat published benchmarks as marketing.