How to build DataForSEO dashboards in Metabase
DataForSEO is a pay-as-you-go SEO-data API provider serving raw SERP results, keyword data, backlinks, and on-page crawls at bulk scale. Metabase is where you turn that SEO data into shared, trustworthy dashboards. This guide covers two complementary paths: a lightweight MCP + CLI route that pulls live data with the DataForSEO MCP server and loads a CSV into Metabase with the Metabase CLI, and a durable pipeline route that syncs DataForSEO snapshots into a database so you can build dashboards anyone can read.
How do you connect DataForSEO to Metabase?
Most teams combine both routes: use MCP and CLI uploads for a fast first pass, then move recurring SEO reporting to a warehouse-backed model.
Live data in, quick analysis out
Pair the DataForSEO MCP server with the Metabase CLI. Use MCP for live lookups, write a scoped result to CSV, then load it into Metabase as a ready-to-query table and model.
- Quick lookups such as "show me rank tracking from raw serp snapshots"
- Loading a DataForSEO export into Metabase in seconds
- Spot-checks and one-off analyses without a warehouse
- Great for exploration, not governed recurring reporting
- MCP and API calls draw from the same plan quotas — scope requests tightly
- CSV uploads are snapshots — refresh or move to the pipeline for history
Durable dashboards with history
Sync DataForSEO snapshots and rollups into a database or warehouse on a schedule, then point Metabase at it.
- DataForSEO reporting that SEO and content leads depend on
- Joining DataForSEO data with Search Console, analytics, and revenue data
- Long-run trends for rank tracking from raw serp snapshots and serp-feature presence by keyword set
- You own the refresh schedule and the snapshot grain
- Sync dated snapshots and rollups — not one-off exports
- API-unit budgets constrain how wide and how often you can pull
What can you analyze from DataForSEO data in Metabase?
- Rank tracking from raw SERP snapshots — built from SERP result snapshots and the related keyword search volume and CPC, SERP feature presence, backlink index rows data your sync exposes.
- SERP-feature presence by keyword set — built from SERP result snapshots and the related keyword search volume and CPC, SERP feature presence, backlink index rows data your sync exposes.
- Competitor share of tracked SERPs — built from SERP result snapshots and the related keyword search volume and CPC, SERP feature presence, backlink index rows data your sync exposes.
- Keyword universe: volume and difficulty coverage — built from SERP result snapshots and the related keyword search volume and CPC, SERP feature presence, backlink index rows data your sync exposes.
- On-page issue counts by crawl — built from SERP result snapshots and the related keyword search volume and CPC, SERP feature presence, backlink index rows data your sync exposes.
Which DataForSEO dashboards should you build in Metabase?
Rank tracking at scale
Positions computed from raw SERP snapshots you own.
- Position trend by keyword set (line)
- Keywords in top 10 by crawl date (area)
- Rank volatility by day (line)
- Position distribution histogram (bar)
SERP features
What the results page actually looks like for your terms.
- SERP-feature presence by keyword set (stacked bar)
- Featured-snippet ownership (table)
- AI Overview presence trend (line)
- Keywords where features push organic below the fold (table)
SERP share
Who occupies the results for the terms that matter.
- Share of top-10 results by domain (stacked area)
- Competitor entry and exit by keyword set (table)
- New domains appearing in tracked SERPs (table)
- Weighted share of voice (line)
Crawl and keyword coverage
The health of the data pipeline itself.
- Keywords crawled per day vs. plan (line)
- On-page issues by severity per crawl (stacked bar)
- Keyword universe: volume-band coverage (bar)
- API spend per module per month (table)
How do you use the DataForSEO MCP server with the Metabase CLI?
Pair the DataForSEO MCP server with the Metabase CLI for fast, hands-on analysis. MCP is useful for scoped lookups and summarized exports; the Metabase CLI's upload command loads CSV data into Metabase and creates a ready-to-query table and model.
Example workflow
- Ask the MCP server for a scoped batch of SERP result snapshots for one keyword set and location.
- Export the result as CSV, keeping keywords, domains, positions, and snapshot dates as stable columns.
- 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
- MCP lookups are excellent for exploration, not scheduled reporting.
- A CSV upload is a snapshot; refresh it with
mb upload replaceor move to the pipeline for real history. - A SERP snapshot is one crawl at one moment. Rank trends require scheduled crawls of the same keyword set — start the schedule before you need the trend.
mb upload csvneeds an uploads database configured under Admin → Settings → Uploads.
How do you set up DataForSEO MCP and the Metabase CLI?
DataForSEO MCP serverofficial
- Transport
- Local server (npm) over stdio or HTTP, plus a hosted endpoint
- Auth
- DataForSEO login and password (HTTP Basic auth)
- Best for
- Live scoped lookup and export
Metabase CLIofficial
- Install
npm install -g @metabase/cli- Auth
mb auth login- Load data
mb upload csv --file data.csv- Requires
- An uploads database (Admin → Settings → Uploads)
{
"mcpServers": {
"dataforseo": {
"command": "npx",
"args": ["-y", "dataforseo-mcp-server"],
"env": {
"DATAFORSEO_USERNAME": "your-login",
"DATAFORSEO_PASSWORD": "your-password"
}
}
}
}The official server exposes ten modules (SERP, Keywords Data, Backlinks, OnPage, DataForSEO Labs, and more); a hosted endpoint at https://mcp.dataforseo.com/mcp skips local setup. Pricing is pay-as-you-go per API call, which suits scheduled bulk pulls better than exploratory browsing.
# 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 SERP-result-snapshots export — creates a table AND a model
mb upload csv --file dataforseo-SERP-result-snapshots.csv --collection root
# Refresh that same table later from a new export
mb upload replace <table-id> --file dataforseo-SERP-result-snapshots.csvCan you generate a DataForSEO dashboard with AI?
Yes. Use the prompt below with any assistant that can run the DataForSEO MCP server and the Metabase CLI. It works end to end: if DataForSEO tables already exist in Metabase it analyzes those; otherwise it pulls scoped, summarized data over MCP, loads it with mb upload csv, then builds the dashboard and caveats any metric that needs missing history.
Create a polished Metabase dashboard for DataForSEO serp data analytics.
Work end to end: get the data into Metabase if it isn't there yet, then build.
Goal: Help SEO and marketing leaders understand rank tracking, SERP-feature presence, and competitor share computed from raw SERP snapshots from DataForSEO data.
Step 1 — Find or load the data:
- First, check what already exists in Metabase (search for dataforseo tables and
models). If durable DataForSEO data is already present — synced from a warehouse
or uploaded earlier — use it and skip to Step 2.
- If nothing is there, pull a scoped, summarized export with the DataForSEO MCP server:
SERP result snapshots, plus keyword search volume and CPC, SERP feature presence, backlink index rows.
Prefer dated snapshots and rollups over wide raw pulls — API units cost money.
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 or column names. Inspect available keywords, domains,
dates, and whether multiple snapshot dates exist before creating trend cards.
Important:
- Build on whatever data is present; don't claim Metabase connects natively to
DataForSEO — it reads a database or CLI-uploaded tables.
- Trend cards need multiple dated snapshots; a single export only supports
point-in-time cards — label them as such.
- Keep vendor metrics separate from Search Console data: estimated traffic and
search volume are modeled numbers, clicks and impressions are measured ones.
- State the position convention (best rank per keyword vs. all appearances)
once and reuse it on every card.
- Segment branded from non-branded keywords before reporting averages.
Dashboard title: DataForSEO SERP Data Overview
Sections:
1. Executive summary: Keywords tracked; Top-10 count; Rank volatility;
SERP-feature coverage.
2. Rankings: Position trends by keyword set; distribution histogram.
3. Features: Feature presence by type; snippet and AI Overview ownership.
4. Share: Top-10 share by domain; new entrants in tracked SERPs.
5. Pipeline: Crawl coverage, task success rate, and API spend.
Filters: Date range, Domain/Project, Keyword group, Search engine, Location,
Competitor.
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.How do you sync DataForSEO data into a database or warehouse?
For dashboards that need history and reliability, land DataForSEO snapshots and rollups in a database first, then connect Metabase to that database.
Connector options
- Managed ETL — use a connector when one covers the objects you need.
- Custom pipeline — use the DataForSEO API v3 for control over grain, fields, and refresh cadence.
- MCP + CSV — use this for quick exploration and one-off slices.
DataForSEO is the bulk-ELT-friendly option: no managed connector needed because the API is built for high-volume scheduled extraction — post task batches (thousands of keywords per request), collect results, and land SERP snapshots straight into your warehouse.
Notes
- Decide the snapshot grain first (daily per keyword for rankings, weekly for backlinks is the workhorse) — it drives API-unit spend and every trend card.
- Land raw snapshot tables first, then build clean Metabase models on top.
- Normalize keyword, crawl date, search engine, location, position, and domain fields.
How should you model DataForSEO data in Metabase?
Core tables
| Table | Grain | Key columns |
|---|---|---|
serp_snapshots | one row per keyword per result position per crawl date | keyword, stat_date, search_engine, location, position, url, domain, serp_feature_type |
keyword_metrics | one row per keyword per refresh | keyword, refreshed_at, search_volume, cpc, competition, keyword_difficulty |
onpage_crawl_issues | one row per issue per page per crawl | crawl_id, crawl_date, page_url, issue_type, severity |
Modeling advice
- Build a clean
serp_snapshotsmodel with common columns across tools, so multi-tool SEO dashboards don't fork definitions. - Every snapshot table needs an explicit snapshot or crawl date column — trends live or die on it.
- Keep modeled vendor estimates (volume, traffic, difficulty) in separate columns from measured Search Console data.
- Store keyword and domain join keys in a consistent normalized form (lowercase, no protocol, no trailing slash).
Which DataForSEO metrics should you track in Metabase?
| Metric | Definition | Notes |
|---|---|---|
| Average position | Volume-weighted mean rank computed from SERP snapshots. | State the convention: best rank per keyword per crawl. |
| Keywords in top 10 | Tracked keywords with a top-10 result per crawl. | Crawl cadence sets the trend resolution. |
| Share of voice | Weighted share of top results across tracked SERPs. | Weight by search volume, not keyword count. |
| Organic CTR | Clicks divided by impressions by position bucket. | Join Search Console data to see what positions earn. |
What SQL powers DataForSEO dashboards in Metabase?
These assume a cleaned analytical model in a warehouse (PostgreSQL dialect). Adjust table and column names to match your pipeline.
Rank tracking computed from raw SERP snapshots.
SELECT
stat_date,
keyword,
MIN(position) AS best_position
FROM serp_snapshots
WHERE domain = 'yoursite.com'
AND stat_date >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1, 2
ORDER BY 2, 1;Who occupies the SERPs you track.
SELECT
stat_date,
domain,
COUNT(*) AS top10_appearances,
ROUND(100.0 * COUNT(*)
/ NULLIF(SUM(COUNT(*)) OVER (PARTITION BY stat_date), 0), 1)
AS serp_share_pct
FROM serp_snapshots
WHERE position <= 10
GROUP BY 1, 2
ORDER BY 1, 3 DESC;Which features appear across the tracked keyword set.
SELECT
date_trunc('week', stat_date) AS week,
serp_feature_type,
COUNT(DISTINCT keyword) AS keywords_with_feature
FROM serp_snapshots
WHERE serp_feature_type IS NOT NULL
GROUP BY 1, 2
ORDER BY 1, 3 DESC;