What goes in a feature adoption and engagement dashboard?
A feature adoption and engagement dashboard answers the question every roadmap review circles back to: is what we shipped getting used, by whom, and is usage deepening or fading? It runs on daily usage rollups per feature and account — never raw event streams.
Which cards belong on this dashboard?
- Adoption rate by feature across active accounts
- Weekly active users per key feature
- Usage breadth: features used per account
- Usage depth: events per active user per feature
- Activation rate by signup cohort
- Time to first key action
- Accounts with declining usage (28-day vs. prior 28-day)
- Adoption by plan tier and segment
What data does this dashboard need?
- Daily usage rollups per feature per account (events, users)
- Account dimension with plan, segment, and active status
- Feature dimension with launch dates for cohort framing
- Signup and activation event timestamps per user
- Internal-user and test-account exclusion flags
How do you build it?
- Sync the source tools into a database and retain raw IDs, timestamps, statuses, and segment fields.
- Build modeled tables at the grain this dashboard requires.
- Create one saved question per card and certify the shared models and definitions.
- Add dashboard filters for Date range, feature, plan, segment, cohort.
- Show refresh time, and exclude internal and test activity from every headline card.
Example card SQL
WITH eligible_accounts AS (
-- One eligible population, used on BOTH sides of the ratio.
-- Add plan/entitlement filters here if the feature ships on some plans only.
SELECT id AS account_id
FROM accounts
WHERE is_active
AND NOT is_internal
), adoption AS (
SELECT
r.feature_name,
COUNT(DISTINCT r.account_id) AS adopting_accounts
FROM product_usage_rollups r
JOIN eligible_accounts e ON e.account_id = r.account_id
WHERE r.usage_date >= CURRENT_DATE - INTERVAL '28 days'
GROUP BY r.feature_name
)
SELECT
a.feature_name,
a.adopting_accounts,
(SELECT COUNT(*) FROM eligible_accounts) AS eligible_accounts,
ROUND(
100.0 * a.adopting_accounts
/ NULLIF((SELECT COUNT(*) FROM eligible_accounts), 0), 1
) AS adoption_pct
FROM adoption a
ORDER BY adoption_pct DESC;