Supabase Analytics Dashboard: Signups, Actives, Retention
Build a user growth dashboard from your Supabase Postgres tables: daily signups, active users, DAU/MAU and retention, with setup through the session pooler.
Summary
A Supabase user growth dashboard tracks signups, daily and monthly active users, stickiness (DAU/MAU) and early retention from your app's own tables. Better Analyst connects to the Supabase Postgres database with database credentials and reads your application schema, so the dashboard runs on a public profiles or events table rather than the auth schema.
On this page
Who this report is for
Indie developers and startup teams building on Supabase who want product metrics from their own database without adding a separate analytics SDK first.
What the report includes
| Metric | Source field | Why it matters |
|---|---|---|
| Signups | public.profiles.created_at (example schema) | New users per day or week, from the profile row your app creates at signup. |
| Activity | public.events.user_id, public.events.created_at (example schema) | Defines who was active on a given day. |
| Daily active users | Calculated: COUNT(DISTINCT user_id) per day | Day-to-day usage level. |
| Monthly active users | Calculated: COUNT(DISTINCT user_id) over trailing 30 days | Breadth of the active base. |
| Stickiness | Calculated: DAU ÷ MAU | How often active users come back within a month. |
| Week-1 retention | Calculated: signups active 7–13 days after signup ÷ signups | Early signal of whether onboarding works. |
How to build it in Better Analyst from Supabase
- In the Supabase dashboard, copy the Session pooler connection details: host, port 5432, database postgres and a username like postgres.<project-ref>. Use the database password, not the anon or service_role API keys.
- In Better Analyst, open Connectors, choose Supabase, enter those details with SSL set to require and schema public, then test the connection and save.
- Make sure signups are visible in your application schema (many apps create a public profiles row per user), because the auth and storage schemas aren't accessible to the connector.
- Ask for daily signups, DAU, MAU, DAU/MAU and week-1 retention for the last 90 days, then turn it into a dashboard.
Questions to ask
- “Show me signups and logins by day for the last 30 days.”
- “What's our DAU/MAU ratio by week this quarter?”
- “Build a retention dashboard from my events table.”
- “What share of last month's signups were active in their second week?”
Sample output
Sample data for illustration, not real account data.
| Week starting | Signups | Avg DAU | MAU | DAU/MAU | Week-1 retention |
|---|---|---|---|---|---|
| Sep 1 2026 | 640 | 1,180 | 5,420 | 21.8% | 31.4% |
| Sep 8 2026 | 712 | 1,236 | 5,610 | 22.0% | 29.8% |
| Sep 15 2026 | 698 | 1,301 | 5,790 | 22.5% | 33.1% |
Charts to use
- Signups and active users (Combo chart): Weekly signups as columns with DAU and MAU as lines.
- Stickiness (Line chart): DAU/MAU trend, which shows whether engagement deepens as the base grows.
Keep it up to date
A weekly scheduled task can send the growth summary to Slack, and an alert on daily signups catches a broken signup flow quickly.
Further reading
Frequently asked questions
Can Better Analyst read the Supabase auth.users table?
No. The Supabase connector is focused on your application schema; the auth and storage schemas aren't accessible. Use a public profiles table populated at signup, or an events table, for user metrics.
Why the session pooler instead of the direct connection?
It's the connection the Better Analyst Supabase docs specify: the session pooler host on port 5432 with a postgres.<project-ref> username, which works from external services.
What counts as an active user?
Whatever meaningful action you choose, such as any logged event or a specific core action. Define it once in Data Context so DAU and MAU stay consistent.