How to build Zoho CRM sales dashboards in Metabase
Zoho CRM is where your leads, deals, and activities live. Metabase is where you turn that pipeline activity into shared, trustworthy sales dashboards. This guide covers two complementary paths: a lightweight MCP + CLI route that pulls live data with the Zoho CRM MCP servers and loads a CSV into Metabase with the Metabase CLI for quick analysis, and a durable pipeline route that syncs Zoho CRM into a database so you can build pipeline, win-rate, and conversion dashboards anyone can read.
How do you connect Zoho CRM to Metabase?
Most teams combine both routes: use the Zoho CRM MCP servers and Metabase CLI route to pull live data and stand up a quick analysis, and the pipeline route for the sales dashboards the team depends on.
Live data in, quick analysis out
Pair Zoho's official CRM MCP servers (to read live deals, contacts, and activities) with the Metabase CLI, whose upload command loads a CSV into Metabase as a ready-to-query table and model.
- Quick lookups like "which deals slipped their closing date?"
- Loading a Zoho CRM CSV export into Metabase in seconds
- Spot-checks and one-off analyses without a warehouse
- Great for exploration, not governed reporting
- Use read-only Zoho servers (data insights) to avoid accidental writes
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
Sync Zoho CRM into a database or warehouse with a managed connector, dlt, or the API, then point Metabase at it.
- Pipeline, win-rate, and conversion dashboards the whole team relies on
- Sales cycle and stage-conversion trends over quarters
- Joining CRM data with product usage, billing, or support data
- Requires a destination database and a sync to maintain
- You own the stage and win definitions and the refresh schedule
- Sync stage history if you want accurate velocity metrics
What can you analyze from Zoho CRM data in Metabase?
- Pipeline — open value by stage, owner, and pipeline, plus coverage against target
- Win rate — deals won vs. closed, by pipeline, source, and stage
- Sales cycle length — created to won, with median and p90
- Stage conversion — where deals advance and where they stall
- Deal size — average and median value, plus mix by pipeline
- Activity — calls, tasks, and meetings by rep and account
Which Zoho CRM dashboards should you build in Metabase?
Pipeline
The open book of business, right now.
- Open deals by stage (funnel)
- Pipeline value by owner and pipeline (bar)
- Coverage vs. target for the period (number)
- Deals past their closing date (table)
Conversion
Where deals advance and where they stall.
- Stage-to-stage conversion (funnel)
- Win rate by pipeline and lead source (bar)
- Deals created vs. won by week (dual line)
- Lost-reason breakdown (bar)
Velocity
How fast deals move and close.
- Median sales cycle length (number + trend)
- Time-in-stage by stage (bar)
- Deal velocity: value / cycle time (number)
- Aging of open deals (table)
Sales activity
Effort and coverage, not surveillance.
- Calls, tasks, and meetings by rep (bar)
- Activities per open deal (number)
- Overdue activities (number)
- New-lead response time (line)
How do you use the Zoho CRM MCP servers with the Metabase CLI?
Pair Zoho's CRM MCP servers with the Metabase CLI for fast, hands-on analysis. Zoho's MCP servers look up current deals, contacts, and activities; the Metabase CLI's upload command loads a CSV into Metabase and creates a ready-to-query table and model. For analysis, stick to the read-only data-insights server.
Example workflow
- Ask the Zoho MCP which deals slipped their closing date, or an account's open deals and recent activity.
- Export the deals or pipeline view 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 Zoho MCP is great for live lookups — not for scheduled or audited pipeline reporting.
- A CSV upload is a point-in-time snapshot; refresh it with
mb upload replaceor move to the pipeline for real history. - Use Zoho's read-only data-insights server so analysis can't trigger writes, and respect API credit limits and the connected user's permissions.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up the Zoho CRM MCP servers and the Metabase CLI?
Zoho CRM MCPofficial
- Servers
- Four composable: data insights, data operations, modules, workflow
- Setup
- Pick servers in Zoho's Server Registry, copy config
- Auth
- OAuth on first connection
- Clients
- Cursor, Claude, VS Code, Windsurf
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": {
"zoho-crm": {
"url": "https://<your-zoho-mcp-server-url>/mcp"
}
}
}# 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 Zoho CRM CSV export — creates a table AND a model
mb upload csv --file zoho-deals.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file zoho-deals.csvZoho publishes four composable MCP servers for CRM — data insights, data operations, modules, and workflow/automation. Choose the servers you need in Zoho's Server Registry, copy the generated config into your MCP client, and authenticate via OAuth on first use. The Metabase CLI stores its credentials securely after mb auth login.
Can you generate a Zoho CRM dashboard with AI?
Yes. Use the prompt below with any assistant that can run the Zoho CRM MCP servers and the Metabase CLI. It works end to end: if Zoho tables already exist in Metabase it analyzes those; otherwise it pulls the data over the Zoho MCP, loads it with mb upload csv, then builds the dashboard — fixing the win-rate denominator and skipping metrics the data can't support instead of faking them.
Create a polished Metabase dashboard for Zoho CRM sales analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help sales leaders understand pipeline, win rate, conversion, sales cycle,
and rep activity from Zoho CRM data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for Zoho CRM tables and
models). If durable Zoho 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 Zoho CRM MCP servers (use the read-only
data-insights server where supported): deals, contacts, accounts, activities,
and stages. 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:
Zoho CSV exports are usually flat and pre-aggregated (one row per deal, with
columns like stage, amount, and closing date), while warehouse tables are raw and
normalized across modules (deals, stage history, contacts, activities). Inspect
the actual tables and column names first; do not assume exact names or that a
stage-history table exists.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
Zoho CRM — it reads a database or CLI-uploaded tables.
- Define "won" and "closed" once (stage = Closed Won vs. Closed Won/Closed Lost)
and reuse them.
- For win rate, state the denominator explicitly (won / closed vs. won / created)
and hold the cohort fixed.
- Report sales cycle length and deal size as medians (p50) and p90, never plain
averages — both are right-skewed.
- Only compute sales cycle length, time-in-stage, or stage conversion when stage
history exists; otherwise use a caveat.
- Zoho supports multi-currency — convert all amounts to a single reporting
currency; caveat any mix.
- 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: Zoho CRM Sales Overview
Sections:
1. Executive summary (KPI cards): Open pipeline; Coverage vs. target; Win rate
(last 90 days); Median sales cycle length; Average and median deal size; Deals
closing this period.
2. Pipeline: Open deals by stage; value by owner and pipeline; deals past close
date.
3. Conversion: Stage-to-stage conversion; win rate by pipeline and source; lost
reasons.
4. Velocity: Median cycle length; time-in-stage; deal velocity; aging.
5. Activity: Calls/tasks/meetings by rep; activities per open deal; overdue
activities.
Filters: Pipeline, Stage, Owner, Lead source, Date range.
Reuse the models Metabase auto-created from uploaded CSVs, or (for a warehouse)
create reusable models: modeled_zoho_deals, modeled_zoho_stage_history,
modeled_zoho_contacts, modeled_zoho_accounts, and modeled_zoho_activities.
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. Reconcile totals against
Zoho CRM's own Analytics. Keep it practical, dense, and executive-readable. Avoid
vanity metrics.How do you sync Zoho CRM data into a database or warehouse?
For dashboards that need history and reliability, land Zoho data in a database first, then connect Metabase to that database.
Connector options
- Airbyte (managed ETL) — has a Zoho CRM source covering modules like deals, contacts, accounts, and activities.
- Fivetran (managed ETL) — offers a Zoho CRM connector with a maintained schema and incremental syncs.
- Zoho CRM Bulk Read API (raw) — the source of truth; export modules and use the field/stage history for transitions.
- Zoho Analytics sync — if you already replicate CRM into Zoho Analytics' warehouse, you can point other tools at that store.
Notes
- Land raw tables first, then build clean models on top.
- Sync stage history (Stage_History related list or field history) if you want sales cycle length, time-in-stage, and stage conversion.
- Zoho supports multiple pipelines and layouts — normalize stage names and order in a model.
- Multi-currency is common in Zoho — store both the deal currency and a converted reporting amount.
How should you model Zoho CRM data in Metabase?
Core tables
| Module | Grain | Key columns |
|---|---|---|
deals (Potentials) | one row per deal | id, stage, pipeline, amount, currency, closing_date, created_time, owner_id, account_id |
stage_history | one row per change | deal_id, stage, modified_time |
contacts | one row per contact | id, account_id, lead_source, created_time |
accounts | one row per account | id, name, industry, owner_id |
leads | one row per lead | id, lead_source, lead_status, created_time |
activities | one row per task/call/event | id, deal_id, type, status, due_date, owner_id |
Modeling advice
- Build a
modeled_zoho_dealstable with cleanstage,pipeline,amount(one currency), andclosing_date. - Derive
modeled_zoho_stage_historyfrom the Stage_History module or field history for time-in-stage and cycle length. - Normalize stage names and order across layouts so funnels stay stable.
- Convert deal amounts to one reporting currency if you sell in several.
- Reconcile modeled pipeline and win rate against Zoho CRM Analytics before anyone trusts the numbers.
Which Zoho CRM metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Open pipeline | Sum of amount for open deals. | Segment by stage, owner, pipeline. |
| Win rate | Won ÷ closed deals in a cohort. | Fix the denominator (closed vs. created) before comparing. |
| Sales cycle length | Created → won, in days. | Report median and p90; it's right-skewed. |
| Stage conversion | Deals reaching stage N+1 ÷ reaching stage N. | Needs stage history. |
| Deal velocity | Won value ÷ average cycle time. | Read alongside coverage, not alone. |
| Average deal size | Won amount ÷ won deals. | Report the median too; outliers distort the mean. |
What SQL powers Zoho CRM dashboards in Metabase?
These assume the modeled tables above (PostgreSQL dialect). Adjust identifiers to match your warehouse.
Won as a share of closed deals over the last 12 months.
SELECT
date_trunc('month', d.closing_date) AS month,
COUNT(*) FILTER (WHERE d.stage = 'Closed Won') AS won,
COUNT(*) FILTER (WHERE d.stage IN ('Closed Won', 'Closed Lost')) AS closed,
ROUND(
100.0 * COUNT(*) FILTER (WHERE d.stage = 'Closed Won')
/ NULLIF(COUNT(*) FILTER (WHERE d.stage IN ('Closed Won', 'Closed Lost')), 0),
1
) AS win_rate_pct
FROM modeled_zoho_deals d
WHERE d.stage IN ('Closed Won', 'Closed Lost')
AND d.closing_date >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;The current funnel — open deals and value by stage.
SELECT
d.stage,
COUNT(*) AS open_deals,
ROUND(SUM(d.amount), 2) AS open_value
FROM modeled_zoho_deals d
WHERE d.stage NOT IN ('Closed Won', 'Closed Lost')
GROUP BY d.stage
ORDER BY open_value DESC;Days from created to won; medians beat averages here.
-- Median days from created to won, by month closed
SELECT
date_trunc('month', d.closing_date) AS month,
percentile_cont(0.5) WITHIN GROUP (
ORDER BY EXTRACT(EPOCH FROM (d.closing_date::timestamp - d.created_time)) / 86400.0
) AS median_cycle_days,
percentile_cont(0.9) WITHIN GROUP (
ORDER BY EXTRACT(EPOCH FROM (d.closing_date::timestamp - d.created_time)) / 86400.0
) AS p90_cycle_days
FROM modeled_zoho_deals d
WHERE d.stage = 'Closed Won'
GROUP BY 1
ORDER BY 1;