How to build Jitbit help desk dashboards in Metabase
Jitbit is an IT help desk available as SaaS or self-hosted, with tickets, categories, assets, and SLAs. Metabase is where you turn that activity into shared, trustworthy dashboards. This guide covers two complementary paths: a lightweight MCP + CLI routethat pulls live data with the Jitbit MCP server and loads a CSV into Metabase with the Metabase CLI for quick analysis, and a durable pipeline route — and, uniquely, if you self-host Jitbit, Metabase can connect directly to its SQL Server database.
How do you connect Jitbit to Metabase?
Most teams combine both routes: use the Jitbit MCP server and Metabase CLI route to pull live data and stand up a quick analysis, and a pipeline or direct-database connection for the dashboards people depend on.
Live data in, quick analysis out
Pair Jitbit's built-in, read-only MCP server (to search and read live tickets) with the Metabase CLI, whose upload command loads a CSV into Metabase as a ready-to-query table and model.
- Quick lookups like "what's open in the IT queue?"
- Loading a Jitbit CSV export into Metabase in seconds
- Spot-checks and one-off analyses without a warehouse
- Great for exploration, not governed reporting
- Jitbit's MCP server is read-only and needs Jitbit 11.21 or later
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
On Jitbit SaaS, sync via the REST API. On self-hosted Jitbit, Metabase can connect directly to the underlying SQL Server database.
- SLA, category, and volume dashboards the team relies on
- Self-hosted instances where you control the database
- Trends over quarters and year-over-year comparisons
- SaaS has no first-party warehouse connector — use the REST API or dlt
- Direct DB access is read-only best practice — never report off the live OLTP under load
- You own the data model and refresh schedule
What can you analyze from Jitbit data in Metabase?
- Ticket volume — created vs. closed by day and category
- First response time — how long requesters wait for a technician
- Resolution time — created to closed, with median and p90
- Category drivers — what's generating IT tickets
- Backlog and aging — open work and how long it's been waiting
- Technician performance — workload distribution and resolution speed
- Repeat requesters — users filing tickets repeatedly
Which Jitbit dashboards should you build in Metabase?
Support overview
The daily pulse of the help desk.
- Tickets created vs. closed per day (dual line)
- Median first response time (number + trend)
- Open backlog by status (bar)
- Volume by category (bar)
SLA & response time
Are we meeting internal SLAs?
- First response time p50/p90 by week (line)
- Overdue tickets by category (table)
- Aging open tickets by days-open bucket (table)
- Reopened tickets by week (line)
Technician performance
Balance workload across the team.
- Closed tickets by technician (bar)
- Median resolution time by technician (bar)
- Open assigned tickets by technician (table)
- Volume by priority (bar)
Categories & assets
Understand what's driving IT tickets.
- Volume by category over time (line)
- Top recurring issue types (bar)
- Tickets by department/requester group (bar)
- Repeat-requester customers (table)
How do you use the Jitbit MCP server with the Metabase CLI?
Pair the Jitbit MCP server with the Metabase CLI for fast, hands-on analysis. Jitbit ships a built-in, read-only MCP server that searches and reads current tickets; the Metabase CLI's upload command loads a CSV into Metabase and creates a ready-to-query table and model.
Example workflow
- Ask the Jitbit MCP for unassigned high-priority tickets created today, or open tickets in a category summarized by technician.
- Export the tickets or comments you want to keep as a CSV.
- 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
- The Jitbit MCP is great for live lookups — not for scheduled or audited reporting.
- Jitbit's MCP server is read-only and needs Jitbit 11.21 or later.
- A CSV upload is a point-in-time snapshot; refresh it with
mb upload replaceor move to the pipeline for real history. mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up the Jitbit MCP server and the Metabase CLI?
Jitbit MCPofficial
- Endpoint
https://yourcompany.jitbit.com/api/mcp- Transport
- Streamable HTTP (stateless)
- Auth
- Bearer API token from your Jitbit profile
- Requires
- Jitbit 11.21 or later (SaaS or on-prem)
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": {
"jitbit": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://yourcompany.jitbit.com/api/mcp",
"--header",
"Authorization:Bearer YOUR_JITBIT_TOKEN"
]
}
}
}# 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 Jitbit CSV export — creates a table AND a model
mb upload csv --file jitbit-tickets.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file jitbit-tickets.csvUse the hosted /api/mcp endpoint when your client supports HTTP transport; a thin jitbit-helpdesk-mcp npm proxy exists for stdio-only clients. The Metabase CLI stores its credentials securely after mb auth login.
Can you generate a Jitbit dashboard with AI?
Yes. Use the prompt below with any assistant that can run the Jitbit MCP server and the Metabase CLI. It works end to end: if Jitbit tables already exist in Metabase (a sync on SaaS, or the SQL Server replica on self-hosted) it analyzes those; otherwise it pulls the data over the Jitbit MCP, loads it with mb upload csv, then builds the dashboard — using medians and skipping cards it has no data for.
Create a polished Metabase dashboard for Jitbit help desk analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help IT support leaders understand volume, responsiveness, SLA, category
drivers, and technician workload from Jitbit data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for Jitbit tables and
models). If durable Jitbit data is already present — synced from a warehouse,
read directly from a self-hosted SQL Server replica, or uploaded earlier — use
it and skip to Step 2.
- If nothing is there, pull it with the read-only Jitbit MCP server: search and
read tickets, comments, and categories. 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: Tickets, Comments, Users (technicians and end
users), Categories, Statuses, Priorities, Tags, and Departments. Inspect the
actual tables and column names first.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
the Jitbit SaaS API — it reads a database, a self-hosted SQL Server, or
CLI-uploaded tables.
- Use medians (p50) and p90 for response and resolution times, never averages.
- Define "first response" as the first technician comment, excluding internal
notes and automated messages.
- If status-change 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: only build trend cards if there is a
usable date column or multiple periods have been uploaded.
Dashboard title: Jitbit Help Desk Overview
Sections:
1. Executive summary (KPI cards): Tickets created last 7 days; Closed last 7 days;
Open backlog; Median first response time; Volume by category.
2. Volume & backlog: Created vs closed by day; Open by status; Backlog aging;
Volume by category.
3. SLA & response time: First response p50/p90 by week; Overdue by category;
Reopened by week (only if history exists).
4. Technician performance: Closed by technician; Median resolution time by
technician; Open assigned by technician; Volume by priority.
5. Categories & drivers: Volume by category over time; Top recurring issue types;
Tickets by department; Repeat requesters.
Filters: Category, Technician, Priority, Status, Department, Date range.
Reuse the models Metabase auto-created from uploaded CSVs, or (for a warehouse or
direct database) create reusable models: modeled_jitbit_tickets,
modeled_jitbit_comments, modeled_jitbit_users, and modeled_jitbit_categories.
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 Jitbit → Metabase pipeline?
Your route depends on whether you run Jitbit SaaS or self-hosted. On self-hosted, Metabase connects straight to the database; on SaaS, a pipeline is the same four stages — extract from the API, load into a database, model the raw tables into clean ones, and visualize in Metabase.
Self-hosted: connect directly
- Self-hosted Jitbit stores data in SQL Server / Azure SQL, which Metabase connects to natively. Point Metabase at a read replica and model on top — no ETL required.
- Never run heavy reporting against the live production database under load; use a replica or restored backup.
SaaS: sync via the API
- dlt (free, code) — write a Python pipeline against the Jitbit REST API to land tickets and comments in your warehouse.
- Jitbit REST API (free, raw) — the source of truth on SaaS; paginate tickets and comments and upsert on a schedule.
Notes
- On either route, build clean models rather than reporting off raw tables.
- Capture status changes if you want accurate reopen rate and time-in-status.
How should you model Jitbit data in Metabase?
Core tables
| Table | Grain | Key columns |
|---|---|---|
Tickets | one row per ticket | TicketID, StatusID, PriorityID, CategoryID, AssignedToUserID, UserID (requester), IssueDate, ResolvedDate |
Comments | one row per comment | IssueID, UserID, ForTechsOnly, CommentDate |
Users | one row per user | UserID, IsAdmin (technician), UserName, Email |
Categories | one row per category | CategoryID, CategoryName |
Modeling advice
- Map
StatusIDandPriorityIDcodes to readable labels in a model. - Define first response from the first non-internal technician comment (
ForTechsOnly = false, technician author). - Treat tags as a bridge table so a ticket can carry many tags.
- On self-hosted, build models on a replica so dashboards don't load the OLTP database.
- Define "closed" once (e.g.
StatusID = 3) and reuse it everywhere.
Which Jitbit metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| First response time | Created → first technician comment. | Report median and p90; exclude tech-only notes. |
| Resolution time | Created → resolved/closed. | Decide whether to include on-hold time. |
| Ticket volume | Created vs. closed in a period. | Segment by category and priority. |
| Category mix | Tickets by category. | Reveals recurring IT issues. |
| Backlog | Open tickets right now. | Pair with aging buckets. |
| Technician load | Open and closed tickets per technician. | Frame as balance, not a leaderboard. |
What SQL powers Jitbit dashboards in Metabase?
These use Jitbit's SQL Server table names (shown in PostgreSQL-style syntax). On SQL Server, swap percentile_cont and date functions for the T-SQL equivalents.
The basic volume trend over the last 30 days (StatusID 3 = closed).
SELECT
CAST(t.IssueDate AS date) AS day,
COUNT(*) AS created,
COUNT(*) FILTER (WHERE t.StatusID = 3) AS closed
FROM Tickets t
WHERE t.IssueDate >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY CAST(t.IssueDate AS date)
ORDER BY 1;Median from the first non-internal technician comment per ticket.
WITH first_tech_comment AS (
SELECT
c.IssueID,
MIN(c.CommentDate) AS first_reply_at
FROM Comments c
JOIN Users u ON u.UserID = c.UserID
WHERE u.IsAdmin = true -- technician
AND c.ForTechsOnly = false
GROUP BY c.IssueID
)
SELECT
date_trunc('week', t.IssueDate) AS week,
percentile_cont(0.5) WITHIN GROUP (
ORDER BY EXTRACT(EPOCH FROM (f.first_reply_at - t.IssueDate)) / 60.0
) AS median_first_reply_min
FROM Tickets t
JOIN first_tech_comment f ON f.IssueID = t.TicketID
GROUP BY 1
ORDER BY 1;Top IT ticket drivers over the last 90 days.
SELECT
cat.CategoryName AS category,
COUNT(*) AS tickets
FROM Tickets t
JOIN Categories cat ON cat.CategoryID = t.CategoryID
WHERE t.IssueDate >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY cat.CategoryName
ORDER BY tickets DESC;Open tickets bucketed by how long they've been waiting.
SELECT
CASE
WHEN CURRENT_DATE - t.IssueDate::date <= 1 THEN '0-1 days'
WHEN CURRENT_DATE - t.IssueDate::date <= 3 THEN '2-3 days'
WHEN CURRENT_DATE - t.IssueDate::date <= 7 THEN '4-7 days'
ELSE '8+ days'
END AS age_bucket,
COUNT(*) AS open_tickets
FROM Tickets t
WHERE t.StatusID <> 3
GROUP BY 1
ORDER BY MIN(CURRENT_DATE - t.IssueDate::date);