How to build Circle community dashboards in Metabase
Circle is a hosted community platform for creators and brands — spaces, posts, comments, events, courses, and paid memberships under one roof, with no database of your own to query. 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 Circle MCP server and loads a CSV into Metabase with the Metabase CLI, and a durable pipeline route that lands Circle data in a database so you can build dashboards anyone can read.
How do you connect Circle to Metabase?
Most teams combine both routes: quick answers through MCP and CLI uploads first, then recurring community reporting on a warehouse-backed model.
Live community answers in, quick analysis out
Pair the Circle MCP server 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.
- Quick questions such as "show me member growth and paid-membership mix"
- Loading Circle exports into Metabase in seconds
- Spot-checks and one-off questions without pipeline work
- 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
Durable community dashboards with history
Land Circle data in a database or warehouse — via connector, scheduled API pulls, or a replica of the underlying database — then point Metabase at it.
- Circle 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 paid-membership mix and space-level engagement and quiet spaces
- 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 Circle data in Metabase?
These all come from the same core objects — members and posts, plus the spaces and space groups, comments and reactions, events and RSVPs your sync exposes:
- Member growth and paid-membership mix
- Space-level engagement and quiet spaces
- Event registrations and attendance
- Course progress and completion
- Contributor concentration across spaces
Which Circle community dashboards should you build in Metabase?
Membership
Growth and paid-membership mix.
- New members by month (line)
- Members active in the last 30 days (number + trend)
- Paid vs. free membership split (bar)
- Retention by join-month cohort (table)
Space engagement
Which spaces carry the community.
- Posts and comments by space per month (stacked bar)
- Spaces with no post in 30 days (table)
- Comments per post by space (bar)
- Reactions per post over time (line)
Events and courses
Whether the programming lands.
- Event registrations by event (bar)
- Registered vs. checked in (combo)
- Course enrollments and completions (table)
- Registrations per member per quarter (line)
Contribution health
How many people carry the conversation.
- Top contributors across spaces (table)
- Share of posts from the top 10 members (number + trend)
- First-time posters per month (line)
- Members active in more than one space (number)
How do you use the Circle MCP server with the Metabase CLI?
Pair the Circle MCP server 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 members and posts for the trailing 90 days summarized by space and month, rather than a row-by-row dump of the member list.
- Export the result as CSV, keeping stable IDs, timestamps, and the category, space, channel, or event keys you group by.
- Run
mb upload csvto 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 replaceor move to the pipeline for real history. - Trends need several months of posts and joins, and Circle's monthly request quota makes repeated full pulls expensive. Sync incrementally by updated timestamp and keep the history you have already landed.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up Circle MCP and the Metabase CLI?
Circle MCP serverofficial
- Transport
- Vendor-hosted remote MCP over HTTP
- Auth
- OAuth through your MCP client; community admins only
- 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)
{
"mcpServers": {
"circle": {
"type": "http",
"url": "https://app.circle.so/api/mcp"
}
}
}Circle's own hosted server (GA April 2026), available on Business plans and above. Choose Read only at connect time — write tools are then hidden from the client entirely, which is what you want for analytics. Two separate limits apply: 2,000 requests per five minutes per IP, and a monthly request quota that MCP calls count against (5,000 on Business), tracked under Settings → Developers. A chatty agent can exhaust a month's quota in an afternoon, so pull summarized exports rather than looping over members. Not to be confused with the unrelated MCP server from Circle Internet Financial (circle.com, the USDC company).
# 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 members-and-posts export — creates a table AND a model
mb upload csv --file circle-members-and-posts.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file circle-members-and-posts.csvCan you generate a Circle dashboard with AI?
Yes. Use the prompt below with any assistant that can run the Circle MCP server and the Metabase CLI. It works end to end: if Circle 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.
Create a polished Metabase dashboard for Circle 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 member growth and paid mix, space-level engagement, event and course participation, and contributor concentration from Circle data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for circle tables and
models). If durable Circle 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 Circle MCP server:
members and posts, plus spaces and space groups, comments and reactions, events and RSVPs.
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
Circle — 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: Circle Community Overview
Sections:
1. Executive summary: New members this month; Active members (30 days,
stated on the card); Posts per month; Paid membership share;
Event registrations.
2. Membership: New members by month; paid vs. free; join-month cohorts.
3. Spaces: Posts and comments by space; quiet spaces; comments per post.
4. Programs: Event registrations and check-ins; course completions.
5. Contribution: Top contributors; top-10 share of posts; first-time posters.
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 Circle data into a database or warehouse?
For dashboards that need history and reliability, land Circle 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 Circle Admin API v2 for control over grain, fields, and refresh cadence.
- MCP + CSV — use this for quick exploration and one-off slices.
No managed connector exists — neither Airbyte nor Fivetran has a Circle source. Schedule Admin API v2 pulls (members, posts, comments, events, and space membership) with an admin API token and land them in your warehouse. Watch the same monthly request quota the MCP route consumes: paginate at the largest page size the endpoint allows, and sync incrementally by updated timestamp rather than re-reading the whole community.
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, space, post, parent-post, joined-at, and created-at fields.
How should you model Circle data in Metabase?
Core tables
| Table | Grain | Key columns |
|---|---|---|
community_members | one row per community member | member_id, email_hash, joined_at, last_active_at, plan, space_count, is_admin |
community_posts | one row per post or comment | post_id, space_id, member_id, parent_post_id, created_at, comment_count, like_count |
community_spaces | one row per space | space_id, space_group, name, visibility, member_count, created_at |
Modeling advice
- Build a clean
community_postsmodel 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 Circle community metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Member growth rate | Net new members per period over members at the start of it. | Removed members drop out of the current list — snapshot it. |
| Engagement rate | Members who posted, commented, or reacted over total members. | Joining a space is not engagement. Count actions. |
| RSVP-to-attendance conversion | Members checked in over members registered for an event. | Only meaningful for events where check-in was used. |
| Conversion rate | Free members who convert to a paid membership. | Needs the plan field kept as history, not just current state. |
What SQL powers Circle 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.
Signups per month against the members 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;Members who posted in 30 days, with the 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;Posts, comments, contributors, and last activity per space.
SELECT
s.name AS space,
COUNT(p.post_id) FILTER (WHERE p.parent_post_id IS NULL) AS posts,
COUNT(p.post_id) FILTER (WHERE p.parent_post_id IS NOT NULL) AS comments,
COUNT(DISTINCT p.member_id) AS contributors,
MAX(p.created_at) AS last_activity_at
FROM community_spaces s
LEFT JOIN community_posts p
ON p.space_id = s.space_id
AND p.created_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY s.name
ORDER BY posts DESC;