How to build Dodo Payments dashboards in Metabase
Dodo Payments is a merchant-of-record payments platform for digital products and SaaS — one-time payments, subscriptions, and payouts, with tax handled for you. Metabase is where you turn that into shared, trustworthy dashboards. This guide covers two complementary paths: a lightweight MCP + CLI route that pulls live data with the Dodo Payments MCP server and loads a CSV into Metabase with the Metabase CLI for quick analysis, and a durable pipeline route that syncs Dodo into a database for payment, MRR, and payout dashboards anyone can read.
How do you connect Dodo Payments to Metabase?
Most teams combine both routes: use the Dodo Payments MCP server and Metabase CLI route to pull live data and stand up a quick analysis, and the pipeline route for the revenue dashboards finance depends on.
Live data in, quick analysis out
Pair the Dodo Payments MCP server (to look up live payments, subscriptions, and payouts) with the Metabase CLI, whose upload command loads a CSV into Metabase as a ready-to-query table and model.
- Quick lookups like "which payments failed in the last 24 hours?"
- Loading a Dodo Payments CSV export into Metabase in seconds
- Spot-checks and one-off analyses without a warehouse
- Great for exploration, not governed revenue reporting
- Use a read-only Dodo API key so analysis can't trigger writes
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
Sync Dodo Payments via its API and webhooks into a database, then point Metabase at it.
- Payment volume, net-revenue, and payout dashboards finance relies on
- MRR and churn for subscription products over time
- Joining payments with product usage and support data
- Requires a destination database and a sync to maintain
- As merchant of record, gross and net differ — model both
- Reconcile against the Dodo dashboard before anyone trusts the numbers
What can you analyze from Dodo Payments data in Metabase?
- Payment volume — gross processed volume and transaction count
- Net revenue — what lands after Dodo fees and tax (merchant of record)
- Success and failures — payment success rate and decline reasons
- MRR and churn — recurring revenue from subscription products
- Refunds and disputes — leakage and chargeback pressure
- Payouts and fees — settlement timing and cost of processing
Which Dodo Payments dashboards should you build in Metabase?
Payments & net revenue
Processed volume and what lands after fees and tax.
- Payment volume and count by day (line)
- Net revenue after Dodo fees and tax (line)
- Gross vs. net revenue by month (dual bar)
- Average transaction value (number)
Success & failures
How reliably payments go through.
- Payment success rate by day (line)
- Failed payments by reason (bar)
- Failures by country and method (table)
- Subscription renewal success (line)
Subscriptions & MRR
Recurring revenue from subscription products.
- MRR and active subscriptions (number + trend)
- MRR movement: new, renewal, churn (waterfall)
- Revenue churn rate (line)
- Renewals due in the next 30 days (table)
Refunds, disputes & payouts
Leakage and cash landing in your account.
- Refund rate and refunded amount (number + line)
- Disputes/chargebacks by month (bar)
- Payouts and settlement timing (table)
- Fees as a share of volume (line)
How do you use the Dodo Payments MCP server with the Metabase CLI?
Pair the Dodo Payments MCP server with the Metabase CLI for fast, hands-on analysis. Dodo ships an official MCP server you can run locally (the dodopayments-mcp npm package) or reach as a remote SSE endpoint; it looks up live payments, subscriptions, and payouts. The Metabase CLI's upload command loads a CSV into Metabase and creates a ready-to-query table and model. For analysis, scope the Dodo API key to read-only.
Example workflow
- Ask the Dodo MCP which payments failed in the last 24 hours, or pull a customer's payments and subscription.
- Export the payments, subscriptions, refunds, and payouts 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 Dodo MCP is great for live lookups — not for scheduled or audited revenue reporting.
- A CSV upload is a point-in-time snapshot; MRR movement and trends still need a warehouse sync, or refresh with
mb upload replace. - Respect Dodo API rate limits and scope the API key to read-only.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up the Dodo Payments MCP server and the Metabase CLI?
Dodo Payments MCPofficial
- Local
dodopayments-mcp(npm) via NPX- Remote
https://mcp.dodopayments.com/sse(viamcp-remote)- Auth
DODO_PAYMENTS_API_KEY- Transport
- Local stdio or remote SSE
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)
# Dodo Payments (local NPX server)
claude mcp add dodopayments \
--env DODO_PAYMENTS_API_KEY=<YOUR_DODO_API_KEY> \
-- npx -y dodopayments-mcp@latest{
"mcpServers": {
"dodopayments": {
"command": "npx",
"args": ["-y", "dodopayments-mcp@latest"],
"env": { "DODO_PAYMENTS_API_KEY": "<YOUR_DODO_API_KEY>" }
}
}
}Prefer the remote SSE server through the mcp-remote bridge?
{
"mcpServers": {
"dodopayments": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://mcp.dodopayments.com/sse",
"--header", "Authorization:Bearer ${DODO_PAYMENTS_API_KEY}"
],
"env": { "DODO_PAYMENTS_API_KEY": "<YOUR_DODO_API_KEY>" }
}
}
}# 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 Dodo Payments CSV export — creates a table AND a model
mb upload csv --file dodo-payments.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file dodo-payments.csvThe Metabase CLI stores its credentials securely after mb auth login.
Can you generate a Dodo Payments dashboard with AI?
Yes. Use the prompt below with any assistant that can run the Dodo Payments MCP server and the Metabase CLI. It works end to end: if Dodo tables already exist in Metabase it analyzes those; otherwise it pulls the data over the Dodo MCP, loads it with mb upload csv, then builds the dashboard — separating gross from net and skipping cards it has no data for.
Create a polished Metabase dashboard for Dodo Payments analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help founders and finance leaders understand payment volume, net revenue,
subscriptions/MRR, failures, refunds, disputes, and payouts from Dodo Payments
data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for Dodo tables and
models). If durable Dodo 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 Dodo Payments MCP server using a
read-only API key: customers, payments, subscriptions, refunds, disputes, and
payouts. 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: Customers, Payments, Subscriptions, Products,
Refunds, Disputes, and Payouts. Inspect the actual tables and column names first.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
Dodo — it reads a database or CLI-uploaded tables.
- Dodo is a merchant of record: separate gross from net (after Dodo fees and
tax). Report net for what the business keeps.
- Compute MRR from active subscriptions, normalizing to a monthly amount.
- Compute payment success rate as succeeded ÷ attempted, scoped to comparable
payment types.
- Exclude refunds and disputes from net revenue and show their impact
separately.
- Only build a card if its underlying column/metric exists in the data.
- A single CSV is a point-in-time snapshot: MRR movement and trends need history,
so build trend cards only if a warehouse sync or multiple uploads provide it.
Dashboard title: Dodo Payments Overview
Sections:
1. Executive summary (KPI cards): Payment volume; Net revenue; MRR; Payment
success rate; Refund rate; Disputes this month.
2. Payments & net revenue: Volume by day; Gross vs. net; Average transaction
value.
3. Success & failures: Success rate; Failures by reason; Failures by country and
method.
4. Subscriptions & MRR: MRR movement; Active subscriptions; Revenue churn.
5. Refunds, disputes & payouts: Refund rate; Disputes by month; Payouts and
settlement timing; Fees as a share of volume.
Filters: Product, Country, Payment method, Currency, Date range.
Reuse the models Metabase auto-created from uploaded CSVs, or (for a warehouse)
create reusable models: modeled_dodo_payments, modeled_dodo_subscriptions, and
modeled_dodo_mrr (a monthly per-subscription MRR model).
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 the
Dodo dashboard. Keep it practical, dense, and executive-readable. Avoid vanity
metrics.How do you build the Dodo Payments → Metabase pipeline?
For dashboards that need history and reliability, land Dodo data in a database first, then connect Metabase to that database.
Connector options
- dlt / custom pipeline (free, code) — wrap the Dodo API in a Python pipeline for full control.
- Dodo API (free, raw) — paginate payments, subscriptions, refunds, disputes, and payouts into your own pipeline.
- Webhooks (free, events) — stream payment and subscription events into a table for near-real-time dashboards.
Notes
- Land raw tables first, then build clean models on top.
- Amounts are typically in minor units — divide in a model layer.
- Separate gross from net (after Dodo fees and tax) — they answer different questions.
- MRR is derived from active subscriptions and normalized prices.
How should you model Dodo Payments data in Metabase?
Core tables
| Concept | Grain | Key columns |
|---|---|---|
customers | one row per customer | id, email, created_at, country |
payments | one row per payment | id, customer_id, amount, tax_amount, fee_amount, status, currency, created_at |
subscriptions | one row per subscription | id, customer_id, product_id, status, next_billing_date, canceled_at |
refunds | one row per refund | id, payment_id, amount, reason, created_at |
disputes | one row per dispute | id, payment_id, amount, status, opened_at |
payouts | one row per payout | id, amount, status, arrival_date |
Modeling advice
- Model both gross and net revenue so finance sees what lands after fees/tax.
- Build a
modeled_dodo_mrrtable from active subscriptions for recurring revenue. - Define payment success rate on a consistent denominator (comparable payment types).
- Link refunds and disputes back to their payment to net them correctly.
- Reconcile modeled revenue and payouts against the Dodo dashboard.
Which Dodo Payments metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Gross volume | Sum of succeeded payment amounts. | What customers paid. |
| Net revenue | Gross − Dodo fees − tax − refunds. | What the business keeps (merchant of record). |
| Payment success rate | Succeeded ÷ attempted payments. | Scope to comparable payment types. |
| MRR | Active subscriptions' normalized monthly amount. | Exclude one-time payments. |
| Refund rate | Refunded ÷ succeeded payments. | Watch by product and country. |
| Dispute rate | Disputes ÷ payments. | High rates risk processor penalties. |
What SQL powers Dodo Payments dashboards in Metabase?
These assume the modeled tables above (PostgreSQL dialect, amounts in minor units). Adjust identifiers to match your schema.
Processed volume and how reliably payments go through.
SELECT
date_trunc('day', created_at) AS day,
COUNT(*) AS payments,
COUNT(*) FILTER (WHERE status = 'succeeded') AS succeeded,
ROUND(100.0 * COUNT(*) FILTER (WHERE status = 'succeeded')
/ NULLIF(COUNT(*), 0), 2) AS success_rate_pct,
ROUND(SUM(amount) FILTER (WHERE status = 'succeeded') / 100.0, 2)
AS gross_volume
FROM payments
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;Net revenue is what lands after Dodo fees and tax.
SELECT
date_trunc('month', created_at) AS month,
ROUND(SUM(amount) / 100.0, 2) AS gross_revenue,
ROUND(SUM(amount - tax_amount - fee_amount) / 100.0, 2) AS net_revenue
FROM payments
WHERE status = 'succeeded'
GROUP BY 1
ORDER BY 1;Recurring revenue from active subscription products.
-- Requires a monthly MRR model built from Dodo subscriptions
SELECT
ROUND(SUM(mrr), 2) AS mrr,
ROUND(SUM(mrr) * 12, 2) AS arr,
COUNT(*) AS active_subscriptions
FROM modeled_dodo_mrr
WHERE month = date_trunc('month', CURRENT_DATE);