Bug reporting for data analysts — the 2026 playbook
Role-specific bug-reporting playbook for data analysts: what to capture, how to file, and how to handoff cleanly to engineering — without bouncing tickets back.
Why Data Analysts need a different playbook
Data analysts file a kind of bug nobody else does: the dashboard renders, no error pops, but the number is wrong. The breakage almost always lives in the filter state, and that state is not in the screenshot you took. In Tableau, Power BI, and Metabase the active filters are encoded in the URL query string; in Apache Superset they sit behind a native_filters_key permalink. If an engineer re-types those filters by hand from your screenshot, one wrong letter case or one mis-formatted date silently returns different rows and no error fires. The bug you can hand over as an exact filter URL is the bug that gets fixed on the first pass.
This is the 2026 playbook for filing a BI dashboard bug an engineer can actually reproduce: where filter state really lives in Tableau, Power BI, Metabase, and Superset, why a numeric between filter or an off-by-one date boundary produces a wrong total that only repros with the literal filter string, and how an AI coding agent can read the captured filter URL, console, and failing data query over MCP and draft the reproduction before you finish writing the ticket. Gartner estimates poor data quality costs organizations an average of 12.9 million dollars per year, so a dashboard showing the wrong figure is not cosmetic when a pricing or staffing decision rides on it.
Common pitfalls
The recurring mistakes that get bug reports bounced back — and how to avoid them.
Real-world examples
What these bugs look like in practice, and how to file them cleanly.
The dashboard total is wrong for a specific date filter
What it looks like: A KPI or sum looks right for most ranges but is off for one date window. It reads like a broken measure, but the math is fine and the boundary is being read differently than you assume.
How to file it: Reproduce with the literal date string from the URL, not a re-typed date. Power BI reads Date gt '2018-08-03' as midnight, so rows with a nonzero time on the 3rd get pulled in. Attach the exact filter query string and the resulting number so an engineer can confirm boundary versus calculation.
# The literal filter from the URL, not a re-typed date
?filter=Sales/OrderDate gt '2018-08-03'
# Power BI expands this to '2018-08-03T00:00:00'
# -> any 2018-08-03 row with a time component IS included -> total looks 1 day offA between filter breaks the cards but the UI hides the real state
What it looks like: A numeric between filter on a Metabase dashboard accepts only one bound, the connected question cards error out, and the filter status just reads '2 selections' instead of the actual numbers. A screenshot of the filter panel does not reveal what triggered the failure.
How to file it: Do not rely on the filter UI. Capture the dashboard URL (Metabase encodes the filter as ?param=value, ampersand-separated) plus the console and the question's underlying query, so the person fixing it sees the literal inputs, not a picture of the controls. (Metabase issue #54364.)
# Metabase writes the filter into the URL as you set it
/dashboard/42?revenue_between=1000 # only ONE bound supplied
# UI reads '2 selections'; connected cards throw -> capture the URL, not the panelA Superset dashboard hangs with filters out of scope until the permalink loads
What it looks like: With 'Select first filter value by default' plus tabs, the dashboard hangs and the filters report as out of scope until the user clicks them or reloads. The plain page URL does not carry the state that reproduces it.
How to file it: Copy the Superset permalink that contains native_filters_key, not the address-bar URL. The reproduction depends entirely on that key, so a capture that records the resolved permalink, the network calls, and the console is what an engineer can replay. (Apache Superset issue #20797.)
# Capture the PERMALINK, not the page URL
https://superset.example.com/superset/dashboard/p/AbC123/ # encodes native_filters_key
# the bare /dashboard/sales/ URL loses the filter scope that triggers the hangWorkflow comparison
The same bug, filed two ways — with and without a capture tool.
| Feature | BugMojo | Screenshot / re-typed URL |
|---|---|---|
| Capture the exact filter state that produced the number | Full filter URL + permalink captured live | Screenshot of the chart, state lost |
| Preserve Superset native_filters_key / Metabase query params | Resolved permalink + query string retained | Bare page URL, filter scope dropped |
| AI agent reads the filter URL + console + failing query via MCP | Yes — Claude Code or Cursor parses it directly | No — a human re-keys the URL from an image |
| Pair the rendered chart with console + the data request | Captured together in one report | Separate tabs, manually correlated |
| Validate the warehouse query / SQL that returned the wrong rows | Not its job — pair with dbt tests / query logs | Not captured either |
| Deep semantic-layer or measure debugging in the BI tool | No — use Tableau / Power BI native lineage | No |
| rrweb DOM session replay | Scrubbable, on-demand | Varies / always-on only |
| Zero-setup Quick Capture | No project, no SDK | Account / SDK required |
BugMojo records the DOM, console, and network — then ships a one-click ticket with the full replay attached. No SDK, no setup.
Try BugMojo freeFrequently asked questions
Frequently asked questions
Sources
- Filter a Report Using Query String Parameters in the URL — case-sensitive Table/Field, 10-expression AND limit, 2,000-char URL cap, date gt '2018-08-03' reads as midnight, 'URL filters are not a security mechanism' — Microsoft Learn (2025-12-01)
- How View URLs Are Structured — Tableau filters via case-sensitive ?Field=value, commas for multiple values, ampersands for multiple filters, date format yyyy-mm-dd hh:mm:ss — Tableau (Salesforce) (2024)
- Issue #54364: numeric between dashboard filter with partial input breaks connected cards; status shows '2 selections' instead of the limits — Metabase (GitHub) (2025)
- Issue #20797: dashboard does not load with 'Select first filter value by default'; filters out of scope until native_filters_key permalink refresh — Apache Superset (GitHub) (2024)
- Dashboard filters — entering a value changes the URL to include it (?param=value, ampersand-separated) — Metabase Docs (2025)
- Data Quality: Why It Matters and How to Achieve It — poor data quality costs organizations an average of $12.9 million per year — Gartner (2024)
- Specification 2025-11-25 — Model Context Protocol connects LLM applications to external data sources and tools — Model Context Protocol (2025-11-25)

