How to build Pylon support dashboards in Metabase
Pylon is an AI-native B2B support platform that unifies conversations from Slack, Microsoft Teams, email, and in-app chat with rich account context. Metabase is where you turn that activity into shared, trustworthy dashboards. This guide covers two complementary paths: a lightweight MCP + CLI route that pulls live data with the Pylon MCP server and loads a CSV into Metabase with the Metabase CLI for quick analysis, and a durable pipeline route that syncs Pylon into a database so you can build dashboards anyone can read.
How do you connect Pylon to Metabase?
Most teams combine both routes: use the Pylon MCP server and Metabase CLI route to pull live data and stand up a quick analysis, and the pipeline route for the dashboards people depend on.
Live data in, quick analysis out
Pair Pylon's official MCP server (to read live issues, accounts, and contacts) with the Metabase CLI, whose upload command loads a CSV into Metabase as a ready-to-query table and model.
- Account-level questions like "which accounts have open escalations?"
- Loading a Pylon CSV export into Metabase in seconds
- Spot-checks and one-off analyses without a warehouse
- Great for exploration, not governed reporting
- Pylon's MCP is scoped to your user — keep the connection read-only so analysis can't update issues
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
Sync Pylon into a database or warehouse with dlt or the REST API, then point Metabase at it.
- Account health and support-load dashboards for B2B teams
- Joining support with CRM, product usage, and renewal data
- Trends over quarters and per-account comparisons
- No first-party managed connector — plan on API or dlt-based sync
- You own the data model and refresh schedule
- Capture issue state changes for accurate time-in-status
What can you analyze from Pylon data in Metabase?
- Issue volume — created vs. resolved by day and channel
- Time to first response — overall and by account tier
- Account health — open issues, escalations, and load by account
- Backlog and aging — open work and how long it's been waiting
- Contact drivers — volume by tag and feature requests
- Channel mix — Slack vs. Teams vs. email
- Team load — workload distribution across members
Which Pylon dashboards should you build in Metabase?
Support overview
The daily pulse across channels.
- Issues created vs. resolved per day (dual line)
- Median time to first response (number + trend)
- Open backlog by status (bar)
- Volume by channel (Slack, Teams, email) (bar)
Account health
B2B support is account-shaped, not just ticket-shaped.
- Open issues by account (table)
- Accounts with rising issue volume (line)
- Escalations by account (bar)
- Top accounts by support load (table)
Response time & SLA
Are we responding fast for key accounts?
- First response time p50/p90 by week (line)
- Response time by account tier (bar)
- Aging open issues by days-open bucket (table)
- Reopened issues by week (line)
Drivers & feature requests
Turn support signal into product priorities.
- Volume by tag/topic (bar)
- Feature requests by account (table)
- Issues linked to engineering work (number)
- Top contact drivers this quarter (bar)
How do you use the Pylon MCP server with the Metabase CLI?
Pair the Pylon MCP server with the Metabase CLI for fast, hands-on analysis. Pylon hosts an official remote MCP server that reads live issues, accounts, and contacts; the Metabase CLI's upload command loads a CSV into Metabase and creates a ready-to-query table and model. For analysis, keep the Pylon connection read-only.
Example workflow
- Ask the Pylon MCP which accounts have open escalations, summarized by owner.
- Export the issues, accounts, and contacts you want to keep as CSVs.
- Run
mb upload csvto load them into Metabase as tables and models, then build questions and dashboards on top.
Be honest about the limits
- The Pylon MCP is great for live lookups — not for scheduled or audited reporting.
- A CSV upload is a point-in-time snapshot; trend and time-in-status analysis still needs a warehouse sync, or refresh with
mb upload replace. - Access follows the authenticated user's permissions in Pylon; keep the connection read-only so analysis can't update issues.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up the Pylon MCP server and the Metabase CLI?
Pylon MCPofficial
- Endpoint
https://mcp.usepylon.com- Transport
- Remote (Streamable HTTP, stateless)
- Auth
- OAuth 2.0; access scoped to your Pylon user
- Enable
- Settings → AI Controls → MCP Server
Metabase CLIofficial
- Install
npm install -g @metabase/cli- Auth
mb auth login(browser OAuth on v62+, or an API key)- Load data
mb upload csv --file data.csv- Requires
- An uploads database (Admin → Settings → Uploads)
{
"mcpServers": {
"pylon": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.usepylon.com"]
}
}
}A Pylon admin enables the MCP server under Settings → AI Controls → MCP Server, and each user needs the MCP Access role. On first connection the server opens a browser window to authorize.
# 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 Pylon CSV export — creates a table AND a model
mb upload csv --file pylon-issues.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file pylon-issues.csvThe Metabase CLI stores its credentials securely after mb auth login. Pylon's MCP is scoped to your user, so keep the connection read-only for analysis.
Can you generate a Pylon dashboard with AI?
Yes. Use the prompt below with any assistant that can run the Pylon MCP server and the Metabase CLI. It works end to end: if Pylon tables already exist in Metabase it analyzes those; otherwise it pulls the data over the Pylon MCP, loads it with mb upload csv, then builds the dashboard — using medians for response times and skipping cards it has no data for.
Create a polished Metabase dashboard for Pylon B2B support analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help support and customer success leaders understand volume, responsiveness,
account health, and contact drivers from Pylon data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for Pylon tables and
models). If durable Pylon data is already present — synced from a warehouse or
uploaded earlier — use it and skip to Step 2.
- If nothing is there, pull it with the Pylon MCP server (keep the connection
read-only): issues, accounts, contacts, and users. 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 names. Map the available raw tables into these
analytical concepts where possible: Issues, Accounts, Contacts, Users (team
members), Channels, Tags, and custom fields. Inspect the actual tables and column
names first.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
Pylon — it reads a database or CLI-uploaded tables.
- Use medians (p50) and p90 for response times, never averages.
- B2B support is account-shaped — roll metrics up to the account where useful.
- If issue state history is missing, do not calculate reopen rate or
time-in-status. Use a caveat instead.
- Only build a card if its underlying column/metric exists in the data.
- A single CSV is a point-in-time snapshot: reopen rate and time-in-status need
history, so build trend cards only if a warehouse sync or multiple uploads
provide it.
Dashboard title: Pylon Support Overview
Sections:
1. Executive summary (KPI cards): Issues created last 7 days; Resolved last 7
days; Open backlog; Median time to first response; Accounts with open
escalations; Volume by channel.
2. Volume & backlog: Created vs resolved by day; Open by status; Backlog aging;
Volume by channel.
3. Account health: Open issues by account; Accounts with rising volume; Top
accounts by load; Escalations by account.
4. Response time: First response p50/p90 by week; Response time by account tier;
Reopened by week (only if history exists).
5. Drivers: Volume by tag; Feature requests by account; Top contact drivers.
Filters: Account, Channel, Tag, Assignee, Status, Date range.
Reuse the models Metabase auto-created from uploaded CSVs, or (for a warehouse)
create reusable models: modeled_pylon_issues, modeled_pylon_accounts,
modeled_pylon_contacts, and modeled_pylon_users.
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. Keep it practical, dense,
and executive-readable. Avoid vanity metrics.How do you build the Pylon → Metabase pipeline?
For dashboards that need history and reliability, land Pylon data in a database first, then connect Metabase to that database.
Connector options
- dlt (free, code) — write a Python pipeline against the Pylon REST API; the most reliable route since there's no first-party managed connector.
- Pylon REST API (free, raw) — the source of truth; paginate issues, accounts, and contacts and upsert on a schedule.
- Managed ETL (paid, verify) — check whether your ETL vendor offers a Pylon connector; availability varies, so confirm before relying on it.
Notes
- Land raw tables first, then build clean models on top.
- Sync accounts and their custom fields — account context is what makes B2B support analytics useful.
- Capture issue state changes if you want accurate reopen rate and time-in-status.
How should you model Pylon data in Metabase?
Core tables
| Table | Grain | Key columns |
|---|---|---|
issues | one row per issue | id, state, channel, account_id, assignee_id, requester_id, created_at, first_response_at, closed_at |
accounts | one row per account (company) | id, name, domain, owner_id, tier (custom field) |
contacts | one row per contact | id, email, account_id |
users | one row per team member | id, name |
Modeling advice
- Roll issues up to the account for most B2B support dashboards.
- Normalize
state(new/open/on-hold/closed) and channel so charts stay stable. - Bring account custom fields (tier, ARR, owner) into your model so you can segment load by account value.
- Treat tags as a bridge table so an issue can carry many tags.
- Define "closed" once and reuse it everywhere.
Which Pylon metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Time to first response | Created → first response. | Report median and p90; segment by account tier. |
| Issue volume | Created vs. resolved in a period. | Segment by channel and account. |
| Open issues by account | Backlog rolled up to the account. | Core B2B health signal. |
| Escalations | Issues flagged or escalated, by account. | Watch concentration in key accounts. |
| Backlog aging | How long open issues have waited. | Bucket by days open. |
| Feature-request volume | Issues tagged as requests, by account. | Feeds product prioritization. |
What SQL powers Pylon dashboards in Metabase?
These assume the modeled tables above (PostgreSQL dialect). Adjust identifiers to match your warehouse.
The basic volume trend over the last 30 days.
SELECT
date_trunc('day', i.created_at) AS day,
COUNT(*) AS created,
COUNT(*) FILTER (WHERE i.state = 'closed') AS resolved
FROM issues i
WHERE i.created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;Where the support load concentrates across B2B accounts.
SELECT
a.name AS account,
COUNT(*) AS open_issues
FROM issues i
JOIN accounts a ON a.id = i.account_id
WHERE i.state <> 'closed'
GROUP BY a.name
ORDER BY open_issues DESC
LIMIT 25;Median from the issue's first-response timestamp.
SELECT
date_trunc('week', i.created_at) AS week,
percentile_cont(0.5) WITHIN GROUP (
ORDER BY EXTRACT(EPOCH FROM (i.first_response_at - i.created_at)) / 60.0
) AS median_first_reply_min
FROM issues i
WHERE i.first_response_at IS NOT NULL
GROUP BY 1
ORDER BY 1;Slack vs. Teams vs. email over the last 30 days.
SELECT
i.channel,
COUNT(*) AS issues
FROM issues i
WHERE i.created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY i.channel
ORDER BY issues DESC;