Dodo Payments × Metabase

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.

Heads up: Metabase connects to databases and warehouses — it does not ship a native Dodo Payments connector. For dashboards that need history and reliability, you'll sync Dodo into a database first (covered below). As merchant of record, gross and net revenue differ — model both.

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.

1 · MCP + CLI route (AI-assisted)

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.

Best for
  • 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
Trade-offs
  • 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
2 · Pipeline route (warehouse-backed)

Durable dashboards with history

Sync Dodo Payments via its API and webhooks into a database, then point Metabase at it.

Best for
  • 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
Trade-offs
  • 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?

For: Founders, finance

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)
For: Finance, ops

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)
For: Growth, RevOps

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)
For: Finance, leadership

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 csv to 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 csv needs 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 (via mcp-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)
ClaudeClaude Code CLI
# Dodo Payments (local NPX server)
claude mcp add dodopayments \
  --env DODO_PAYMENTS_API_KEY=<YOUR_DODO_API_KEY> \
  -- npx -y dodopayments-mcp@latest
Cursor~/.cursor/mcp.json or .cursor/mcp.json (local server)
{
  "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?

Remote Dodo MCP (SSE via mcp-remote)
{
  "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>" }
    }
  }
}
TerminalLoad a Dodo Payments CSV with the Metabase CLI
# 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.csv

The Metabase CLI stores its credentials securely after mb auth login.

Verify before shipping: confirm an uploads database is enabled under Admin → Settings → Uploads (Metabase docs) and the current Dodo Payments MCP setup in the Dodo Payments docs. Scope the Dodo API key to read-only for analysis work.

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.

Prompt for creating a Dodo Payments Overview dashboard
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.

No paid tool required. A fully free stack: a small dlt or hand-written script (extract) → a free Postgres database like Neon or Supabase (load) → a scheduler such as GitHub Actions cron (host) → Metabase (visualize). For hosting and scheduling details, see our data pipeline guide.

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

ConceptGrainKey columns
customersone row per customerid, email, created_at, country
paymentsone row per paymentid, customer_id, amount, tax_amount, fee_amount, status, currency, created_at
subscriptionsone row per subscriptionid, customer_id, product_id, status, next_billing_date, canceled_at
refundsone row per refundid, payment_id, amount, reason, created_at
disputesone row per disputeid, payment_id, amount, status, opened_at
payoutsone row per payoutid, amount, status, arrival_date

Modeling advice

  • Model both gross and net revenue so finance sees what lands after fees/tax.
  • Build a modeled_dodo_mrr table 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?

MetricDefinitionNotes
Gross volumeSum of succeeded payment amounts.What customers paid.
Net revenueGross − Dodo fees − tax − refunds.What the business keeps (merchant of record).
Payment success rateSucceeded ÷ attempted payments.Scope to comparable payment types.
MRRActive subscriptions' normalized monthly amount.Exclude one-time payments.
Refund rateRefunded ÷ succeeded payments.Watch by product and country.
Dispute rateDisputes ÷ 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.

Daily volume and success ratePostgreSQL

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;
Gross vs. net revenue by monthPostgreSQL

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;
Current MRR and ARRPostgreSQL

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);

What are common mistakes when analyzing Dodo Payments in Metabase?

Treating a live MCP lookup or a one-off CSV as governed revenue reporting.→ Use the Dodo MCP and CSV uploads for lookups and triage; build warehouse-backed Metabase dashboards for anything finance depends on.
Reporting gross as if it were net.→ Dodo is a merchant of record — subtract fees and tax to see what the business keeps.
Counting one-time payments as MRR.→ MRR is recurring only — keep one-time payments in a separate line.
Inconsistent success-rate denominators.→ Decide whether the base is attempts or unique orders and stay consistent.
Never reconciling with the Dodo dashboard.→ Sanity-check modeled revenue and payouts against Dodo's own reports before trusting them.

Related analytics

Related metrics

Related integrations

FAQ

Does Metabase connect natively to Dodo Payments?
No. Metabase reads SQL databases and warehouses. Sync Dodo into a database first (its API and webhooks), then connect Metabase to that database.
How do I quickly analyze Dodo Payments data without a warehouse?
Pull the payments, subscriptions, refunds, and payouts you need with the Dodo Payments MCP server (use a read-only API key), export them to CSV, and run `mb upload csv --file data.csv` with the Metabase CLI. It creates a table and a model you can build questions on right away. You'll need an uploads database enabled under Admin → Settings → Uploads. Refresh later with `mb upload replace`, or move to the pipeline route when you need history.
Should I use the local or remote MCP server?
Both work. The local NPX server (dodopayments-mcp) runs on your machine with your API key; the remote SSE endpoint connects through the mcp-remote bridge. Use whichever your client supports.
What does merchant of record change about my metrics?
Dodo collects and remits tax and takes its fee, so gross (what the customer paid) and net (what you keep) differ. Model both and report net for business performance.