Discord × Metabase

How to build Discord community dashboards in Metabase

Discord is the chat platform where a huge share of developer, gaming, and creator communities actually live — guilds, channels, threads, roles, and scheduled events, all reachable only through a bot. Metabase is where you turn that activity into shared, trustworthy community dashboards. This guide covers two complementary paths: a lightweight MCP + CLI route that pulls a scoped slice with the Discord community MCP servers and loads a CSV into Metabase with the Metabase CLI, and a durable pipeline route that lands Discord data in a database so you can build dashboards anyone can read.

Heads up: Metabase connects to databases and warehouses — it does not ship a native Discord connector, and it never calls a SaaS API directly. The good news: members, posts, and registrations are ordinary tabular data. Land them in a database, define "active member" and "attended" once, and every dashboard downstream inherits the same definitions.

How do you connect Discord to Metabase?

Most teams combine both routes: quick answers through MCP and CLI uploads first, then recurring community reporting on a warehouse-backed model.

Discord is the highest-intent community tool with the weakest data access. Everything runs through a bot you create and authorize yourself, and the Message Content and Server Members intents must be switched on in the Developer Portal before member or message data is visible at all.

1 · MCP + CLI route (AI-assisted)

Live community answers in, quick analysis out

Pair the Discord community MCP servers with the Metabase CLI. Use MCP for live lookups, write a scoped result to CSV, then load it into Metabase as a ready-to-query table and model.

Best for
  • Quick questions such as "show me member growth and joins vs. leaves"
  • Loading Discord exports into Metabase in seconds
  • Spot-checks and one-off questions without pipeline work
Trade-offs
  • Great for exploration, not the weekly community or event report
  • Use read-only credentials or scoped API keys wherever supported
  • CSV uploads are snapshots — refresh or move to the pipeline for history
2 · Pipeline route (warehouse-backed)

Durable community dashboards with history

Land Discord data in a database or warehouse — via connector, scheduled API pulls, or a replica of the underlying database — then point Metabase at it.

Best for
  • Discord dashboards the community, marketing, and support teams all trust
  • Joining community activity with product, support, and CRM data
  • Long-run trends for member growth and joins vs. leaves and message volume by channel and hour
Trade-offs
  • You own the refresh schedule and the grain
  • Define "active member" once, in the model layer, and state the window
  • Identity matching across tools caps how far member-level analysis goes

What can you analyze from Discord data in Metabase?

These all come from the same core objects — messages, plus the guild members and roles, channels and threads, reactions your sync exposes:

  • Member growth and joins vs. leaves
  • Message volume by channel and hour
  • Active member ratio against total membership
  • Support-channel response times
  • Scheduled event attendance

Which Discord community dashboards should you build in Metabase?

For: Community managers

Membership

Joins, leaves, and net growth.

  • Joins and leaves by month (combo)
  • Net member growth (number + trend)
  • New members sending a first message within 7 days (number)
  • Bot vs. human accounts (bar)
For: Community team

Message activity

Where and when the server talks.

  • Messages by channel, top 15 (bar)
  • Messages by hour and weekday (heat map)
  • Active member ratio over 30 days (number + trend)
  • Threads started per week (line)
For: Support volunteers

Help channels

Whether questions get picked up.

  • Median time to first reply in help channels (line)
  • Share of help messages with no reply (number + trend)
  • Busiest help hours (bar)
  • Longest-waiting open threads (table)
For: Leadership

Community health

Concentration and quiet corners.

  • Top posters by month (table)
  • Share of messages from the top 10 members (number + trend)
  • Channels with no message in 30 days (table)
  • Scheduled event interest vs. attendance (combo)

How do you use the Discord community MCP servers with the Metabase CLI?

Pair the Discord community MCP servers with the Metabase CLI for fast, hands-on analysis. MCP is useful for scoped lookups and summarized exports; the Metabase CLI's upload command loads CSV data into Metabase and creates a ready-to-query table and model.

Example workflow

  • Ask the MCP server for messages for the trailing 30 days aggregated by channel and day, plus join dates for guild members.
  • Export the result as CSV, keeping stable IDs, timestamps, and the category, space, channel, or event keys you group by.
  • Run mb upload csv to load it into Metabase as a table and model, then build questions and dashboards on top.

Be honest about the limits

  • MCP lookups are excellent for exploration, not scheduled reporting.
  • A CSV upload is a snapshot; refresh it with mb upload replace or move to the pipeline for real history.
  • Message history has to be paged newest-to-oldest, and Airbyte's messages stream is full-refresh only — plan the first backfill as a one-off, off-hours job and keep what it produces.
  • mb upload csv needs an uploads database configured under Admin → Settings → Uploads.

How do you set up Discord MCP and the Metabase CLI?

Discord community MCP serverscommunity

Transport
Local server (Docker or JVM) over stdio
Auth
Discord bot token, with privileged gateway intents enabled
Best for
Live scoped lookups and summarized exports

Metabase CLIofficial

Install
npm install -g @metabase/cli
Auth
mb auth login
Load data
mb upload csv --file data.csv
Requires
An uploads database (Admin → Settings → Uploads)
MCPExample MCP client config
{
  "mcpServers": {
    "discord": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
        "-e", "DISCORD_TOKEN",
        "-e", "DISCORD_GUILD_ID",
        "saseq/discord-mcp:latest"],
      "env": {
        "DISCORD_TOKEN": "your-bot-token",
        "DISCORD_GUILD_ID": "your-guild-id"
      }
    }
  }
}

Be precise about what's official here. Discord ships an official MCP server for its developer documentation at docs.discord.com/mcp (March 2026) — it searches docs and exposes no guild, member, or message data, so it is no help for analytics. For community data itself there is no first-party server; the options are community projects such as SaseQ/discord-mcp, all authenticating with a bot token. Treat them as unofficial: read the source, scope the bot's permissions to read-only, and enable only the intents you need.

TerminalLoad a Discord CSV with the Metabase CLI
# Install the Metabase CLI
npm install -g @metabase/cli

# Log in (opens your browser; requires Metabase v62+)
mb auth login --url https://your-metabase.example.com

# Load a messages export — creates a table AND a model
mb upload csv --file discord-messages.csv --collection root

# Refresh that same table later from a new export
mb upload replace <table-id> --file discord-messages.csv

Can you generate a Discord dashboard with AI?

Yes. Use the prompt below with any assistant that can run the Discord community MCP servers and the Metabase CLI. It works end to end: if Discord tables already exist in Metabase it analyzes those; otherwise it pulls scoped, summarized data, loads it with mb upload csv, then builds the dashboard and caveats any metric that needs missing history.

Prompt for creating a Discord Community Overview dashboard
Create a polished Metabase dashboard for Discord community analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.

Goal: Help community, marketing, and support leaders understand joins and leaves, message activity by channel, the active member ratio, and help-channel response times from Discord data.

Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for discord tables and
  models). If durable Discord data is already present — a warehouse sync, a
  database replica, or an earlier upload — use it and skip to Step 2.
- If nothing is there, pull a scoped, summarized export with the Discord community MCP servers:
  messages, plus guild members and roles, channels and threads, reactions.
  Prefer summarized rollups by month, category, space, channel, or event over raw
  message and post bodies. Write each result to a CSV, then load it with the
  Metabase CLI — run "mb upload csv --file <export>.csv" so each upload creates a
  table and a ready-to-query model. Use "mb upload replace <table-id> --file
  <export>.csv" to refresh an existing table instead of creating duplicates.

Step 2 — Inspect before querying:
Do not assume exact table or column names. Inspect available fields, categories,
spaces or channels, events, and date ranges before creating trend cards.

Important:
- Build on whatever data is present; don't claim Metabase connects natively to
  Discord — it reads a database or CLI-uploaded tables.
- Every "active member" card must state its window and its action (posted?
  logged in?) in the card title or description. There is no standard definition.
- Deleted and anonymized accounts disappear from the current member list, which
  silently rewrites historical member counts. Prefer daily snapshots over
  recomputing history.
- Attendance is unknowable without check-in data. Exclude events where nobody
  checked anyone in rather than scoring them as 0% attendance.
- A single CSV is a point-in-time snapshot: only build trend cards if there is
  a usable date column or multiple periods have been uploaded.

Dashboard title: Discord Community Overview

Sections:
1. Executive summary: Joins this month; Leaves this month; Net growth;
   Active member ratio (30 days, stated on the card); Messages per month.
2. Membership: Joins vs. leaves by month; first message within 7 days; bots.
3. Activity: Messages by channel; messages by hour and weekday; threads.
4. Help channels: Median time to first reply; no-reply share; open threads.
5. Health: Top posters; top-10 share of messages; channels with no activity.

Filters: Date range, Category or Space or Channel, Event, Member segment,
Ticket type.

Output: Build the dashboard if you have permission; otherwise provide the exact
questions, SQL, model definitions, and layout. Include caveats for any metric
that cannot be calculated from the available data.

How do you sync Discord data into a database or warehouse?

For dashboards that need history and reliability, land Discord data in a database first, then connect Metabase to that database.

Connector options

  • Managed connector or database replica — use a connector when one genuinely covers the objects you need, or replicate the underlying database when you host it yourself.
  • Custom pipeline — use the Discord API for control over grain, fields, and refresh cadence.
  • MCP + CSV — use this for quick exploration and one-off slices.

Airbyte's source-discord is the practical pipeline: bot-token auth, with streams for guilds, channels, messages, members, roles, threads, and scheduled events. It's a Marketplace (community-supported) connector, and the messages stream is full-refresh only — backfilling a busy guild's history is slow and worth scheduling off-hours. Fivetran has no Discord connector. Rolling your own means paging message history newest-to-oldest with snowflake cursors, honoring per-route rate-limit headers.

Notes

  • Decide the grain first (one row per post, message, or registration; daily rollups on top) — it drives every trend card.
  • Land raw tables first, then build clean Metabase models on top of them.
  • Normalize member, channel, thread, message, joined-at, and created-at fields.

How should you model Discord data in Metabase?

Core tables

TableGrainKey columns
community_membersone row per guild membermember_id, joined_at, roles, is_bot, left_at, first_message_at, last_message_at
community_postsone row per messagemessage_id, channel_id, thread_id, member_id, created_at, reply_to_message_id, reaction_count
community_channelsone row per channelchannel_id, name, type, category, is_archived, created_at

Modeling advice

  • Build a clean community_posts model with common columns across forums, community platforms, chat servers, and event tools, so multi-source dashboards don't fork definitions.
  • Snapshot member counts daily into a table you own. Deleted and anonymized accounts vanish from the live member list, which changes last quarter's numbers every time you refresh.
  • Keep the definition of "active member" — the window and the action — in the model layer, and surface it in card titles. There is no standard.
  • Treat attendance as missing, not zero, when no check-in was recorded. Flag those events explicitly so conversion cards can exclude them.
  • Hash or drop email addresses at the pipeline boundary and join members across tools on a stable ID wherever you have one.

Which Discord community metrics should you track in Metabase?

MetricDefinitionNotes
Member growth rateJoins minus leaves over members at the start of the period.Filter bots first or growth is a bot-invite chart.
Engagement rateMembers who sent a message over total guild members.Chat servers skew low. Track the trend, not the level.
Reply rateShare of help-channel questions that get at least one reply.Threads and inline replies must both be counted.

What SQL powers Discord community dashboards in Metabase?

These assume a cleaned analytical model in a warehouse (PostgreSQL dialect). Adjust table and column names to match your pipeline — the modeled names above rarely survive a sync unchanged.

New members and growth rate by monthPostgreSQL

Joins per month against the membership you already had.

SELECT
  date_trunc('month', joined_at) AS month,
  COUNT(*) AS new_members,
  ROUND(
    100.0 * COUNT(*) / NULLIF(
      SUM(COUNT(*)) OVER (
        ORDER BY date_trunc('month', joined_at)
        ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
      ), 0
    ), 1
  ) AS growth_rate_pct
FROM community_members
GROUP BY 1
ORDER BY 1;
Active member ratio over a stated windowPostgreSQL

Members who sent a message in 30 days, window declared.

-- "Active" here means: posted at least once in the trailing 30 days.
-- That window is a choice. Put it on the dashboard card.
WITH active AS (
  SELECT DISTINCT member_id
  FROM community_posts
  WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
)
SELECT
  COUNT(DISTINCT m.member_id) AS total_members,
  COUNT(DISTINCT a.member_id) AS active_members,
  ROUND(
    100.0 * COUNT(DISTINCT a.member_id)
    / NULLIF(COUNT(DISTINCT m.member_id), 0), 1
  ) AS active_member_pct
FROM community_members m
LEFT JOIN active a ON a.member_id = m.member_id
WHERE NOT m.is_bot;
Messages by channel and hourPostgreSQL

Where and when the server is actually awake.

SELECT
  c.name AS channel,
  EXTRACT(HOUR FROM p.created_at) AS hour_utc,
  COUNT(*) AS messages,
  COUNT(DISTINCT p.member_id) AS posting_members
FROM community_posts p
JOIN community_channels c ON c.channel_id = p.channel_id
WHERE p.created_at >= CURRENT_DATE - INTERVAL '30 days'
  AND NOT c.is_archived
GROUP BY 1, 2
ORDER BY messages DESC;

What are common mistakes when analyzing Discord in Metabase?

Reporting an active member count without saying what active means.→ Thirty days or ninety? Posted, reacted, or merely logged in? Each choice produces a different number, and none of them is a standard. Put the window and the action in the card title, and keep the definition in one model.
Backfilling a busy guild's message history during business hours.→ The Airbyte messages stream is full-refresh only and pages history under per-route rate limits. Schedule the first load off-hours, keep what it produces, and don't re-run it casually.
Counting every account in the guild as a member.→ Bots, alts, and people who joined for a giveaway all sit in the same list. Filter is_bot, and always show the active member ratio next to the raw membership total.
Building dashboards from live MCP lookups only.→ MCP is useful for exploration; durable community dashboards need a database-backed model with history behind them.

Related analytics

Related dashboards

Related integrations

FAQ

Does Metabase connect natively to Discord?
No. Metabase reads databases and warehouses. Land Discord data in a database first — via connector, scheduled API pulls, or a replica of the underlying database — or upload a CSV with the Metabase CLI, then build Metabase models and dashboards on top.
Should Metabase replace Discord?
No — they answer different questions. Discord is where the community or the event actually happens, and its built-in reporting is fine for a quick look. Metabase is where you build governed, shareable reporting for the whole company, and join community and event activity with product usage, support tickets, and CRM data.
Does Discord have an official MCP server for community data?
Not for community data. Discord ships an official MCP server for its developer documentation at docs.discord.com/mcp — it searches docs and exposes no guild, member, or message data, so it cannot help with analytics. For the community data itself there is no first-party server; the available options are community projects that authenticate with a Discord bot token. Read their source, scope the bot to read-only permissions, and enable only the intents you need.
Why can't I see message content or the full member list?
Privileged gateway intents. Message Content and Server Members must be switched on for your application in the Discord Developer Portal before either is visible to a bot at all — no amount of pipeline work gets around it. Turn them on before you plan a backfill, then scope the bot's channel permissions to the channels you actually report on.