Business Intelligence, Reporting, and Dashboards Questions
The reporting and presentation layer of analytics: semantic/metrics layers, report development and automation, self-service BI, and the architecture that feeds dashboards and reports. Covers dashboard and visualization design (tool selection across Tableau/Power BI/Looker-style platforms, drill-downs, information architecture, communicating metrics visually), refresh strategies, and query performance for interactive reporting workloads. Spans both the engineering behind the reporting layer and the design of the dashboards that consume it.
Tell me about a time you discovered a data-quality issue in a production BI report, for example wrong totals, duplicates, or missing rows. How did you detect it, what did the root-cause investigation actually look like, and what did you change afterward to prevent the same class of issue?
Sample Answer
Direct answer
A data-quality issue caught in a production BI (business intelligence) report, wrong totals, duplicates, or missing rows, usually starts with someone noticing the number looks off, not with an automated check catching it first, which is itself a useful signal about what to fix afterward: strengthening detection so the NEXT issue is caught by monitoring rather than by a stakeholder's suspicion.
Structured elaboration
How it's typically detected: either a stakeholder flags a number that doesn't match their own expectation or a separate source they trust, or, in a better-instrumented setup, an automated check (a reconciliation or anomaly-detection check, the kind) catches it before anyone downstream sees the wrong number at all.
Root-cause investigation: working backward from the symptom, are the wrong numbers coming from a transformation bug (a join fanning out rows, causing duplicates), a source-data problem (the upstream system itself sent bad data), or a timing issue (the report ran before all the day's data had landed). Checking the pipeline's logs and re-running the relevant transformation step against a known sample is usually faster than guessing.
Fix and prevention: the immediate fix corrects the specific issue (deduplicating, correcting a join, re-running with the right data), and prevention means adding a specific automated check that would have caught this exact class of problem next time, closing the detection gap, not just fixing this one instance.
Worked example
A quarterly report shows total order count roughly 8% higher than the finance team's own independently-tracked figure. Detection: a finance analyst flagged the discrepancy after comparing it against their own tracking, not an automated check, since none existed for this specific report at the time. Root-cause investigation: tracing the pipeline revealed a recent change joined the orders table to a new promotions table to compute a discount-eligibility flag, and that join was one-to-many (a small number of orders had multiple matching promotion records), silently duplicating those orders in the final count. The fix: correcting the join to deduplicate before the final aggregation, and reprocessing the affected historical period. Prevention: adding a row-count reconciliation check comparing the source orders table's row count against the final reporting table's row count after every pipeline run, specifically the kind of check that would have caught this exact fan-out bug the moment it was introduced, rather than a month later when a finance analyst happened to cross-check manually.
Trade-offs and pitfalls
A fix that corrects the immediate wrong number without adding the specific preventative check that would catch the same class of bug again is only half the job, and it's tempting to stop there once the pressing issue is resolved, especially under time pressure to move on to the next task; the discipline of actually closing the detection gap, not just the immediate symptom, is what distinguishes a genuinely learned lesson from a one-off fix that the same bug pattern can reintroduce later in a different part of the pipeline.
You shipped a dashboard, or ran a push to get frontline teams using existing ones, and adoption is disappointing months later even though the data itself is correct. Walk through how you would diagnose why nobody is using it, and what you would actually change as a result, not just what you would ask people.
Sample Answer
Direct answer
When a dashboard has low adoption months after launch despite the underlying data being correct, the fix almost never starts with the dashboard's polish; it starts with figuring out whether the problem is that people don't know it exists, don't trust it, don't need what it answers, or find it too slow or confusing to use. Diagnosing which of those it actually is determines whether the fix is communication, a redesign, or accepting that the dashboard answers a question nobody actually has.
Structured elaboration
Diagnosis, in order of how cheap they are to check:
- Awareness: do the intended users even know the dashboard exists. This sounds trivial but is a shockingly common root cause; check usage logs against the intended audience list, and just ask a sample of them directly.
- Trust and design: when people do open it, do they immediately understand what they're looking at, and do they believe the numbers. A confusing layout or a number that contradicts what someone already believed from another source kills return visits fast.
- Fit: does the dashboard actually answer the question the audience has, or does it answer the question the builder assumed they had. This requires talking to actual users, not just looking at usage data, since usage data tells you WHAT happened, not WHY.
- Cadence and workflow fit: is the dashboard's refresh timing and access point aligned with when and where the decision it's meant to inform actually happens (a weekly-refreshed dashboard is useless for a daily standup decision).
Remediation, once the cause is known: if it's awareness, targeted communication and demos in the actual meetings where the decision happens beat a generic announcement. If it's trust or design, a redesign informed by direct user interviews, not guesswork, plus a visible way to verify the numbers against a source people already trust. If it's fit, that's a harder conversation, sometimes the honest answer is the dashboard should be retired or fundamentally reworked around what people actually need, not incrementally polished.
Worked example
A high-profile executive dashboard launches with fanfare, and two months later usage logs show only 2 of 8 intended executives have opened it more than once. Interviews reveal: three didn't know it existed beyond the launch email (an awareness problem); two opened it once, found the top-line number didn't match what they'd heard verbally from their team the same week and didn't trust it enough to return (a trust problem, likely a definitional mismatch between the dashboard's metric and the informal number they were used to); and one said it answers a question they don't actually have, since their real decision cadence is monthly, not weekly. The remediation plan: reconcile and publicly explain the definitional gap causing the trust issue, add the dashboard as a standing agenda item in the meeting where the relevant decision already happens (fixing awareness and workflow fit simultaneously), and for the one exec whose actual need is monthly, point them to a different, lower-frequency view rather than forcing everyone onto one dashboard cadence.
Trade-offs and pitfalls
It's tempting to treat low adoption as a design problem and jump straight to a visual redesign, because that's the most controllable and satisfying fix, but if the real cause is awareness or fit, a prettier dashboard changes nothing and the team burns effort on the wrong lever. The other trap is over-indexing on usage-log data alone: it tells you who opened what and when, but not why someone opened it once and never came back, which is exactly the question that determines the right fix, so the diagnosis genuinely needs direct conversations with the intended audience, not just an analytics dashboard about the dashboard.
Define concrete SLOs for a reporting/BI platform, not just 'the data should be fresh and correct.' For each dimension you choose (freshness, correctness, availability, or similar), state what you would actually measure, what threshold makes it pass or fail, and what happens operationally when it's violated.
Sample Answer
Direct answer
Defining real SLOs (service-level objectives) for a reporting platform means going beyond a vague promise like 'the data should be fresh and correct' and committing to specific, measurable objectives for freshness, correctness, and availability, each with a concrete threshold, a way to measure it, and a defined operational response when it's violated.
Structured elaboration
Freshness: how stale is the data allowed to get before it's a problem, measured as the time between when the source data was generated and when it's reflected in the report. Different reports legitimately have different thresholds (an operational dashboard might need freshness under 15 minutes; a historical trend report might be fine with a daily refresh), so this needs to be set per report tier, not globally.
Correctness: what fraction of the time is the data actually right, measured against some ground truth or reconciliation check (a percentage of automated data-quality checks passing, or a reconciliation against a source system within an agreed tolerance).
Availability: what fraction of the time is the report actually accessible and loading successfully when someone tries to view it, similar to an application uptime SLO.
For each SLO: an objective (the target, e.g. 99% of daily refreshes complete within 15 minutes of the scheduled time), a measurement approach (how you actually calculate whether you hit the target, from what instrumentation), an error budget (how much violation is tolerated before it's treated as a real incident, since 100% is rarely realistic or worth the cost of achieving), and an escalation and remediation path (what happens operationally when the error budget gets exhausted: a review, a temporary pause on new feature work in favor of reliability work, a formal incident).
Worked example
A reporting platform sets three SLOs for its tier-1 (executive-facing) dashboards: freshness SLO of 99% of refreshes complete within 15 minutes of the scheduled time, measured by comparing each job's actual completion timestamp against its schedule; correctness SLO of 99.9% of automated reconciliation checks passing (checks comparing a sample of dashboard totals against source-system totals), measured daily; and availability SLO of 99.5% successful page loads, measured via application monitoring on the BI (business intelligence) tool itself. The freshness error budget is 1% of refreshes; for a tier of about 10 to 13 daily-refreshing executive dashboards, that's roughly 300 to 390 refreshes a month, so the budget allows about 3 to 4 of them to run late before it's treated as exhausted (this count has to be derived from the tier's actual refresh volume, not assumed as a fixed figure, since a bigger tier or a faster cadence within it raises the allowed count proportionally); when that budget is exhausted mid-month, the team's policy is that new dashboard feature requests pause and the team focuses on reliability work (fixing whatever's causing the late refreshes) until the SLO is back on track, rather than continuing to add new reports on top of an already-strained pipeline.
Trade-offs and pitfalls
Setting an SLO's threshold too aspirational (99.99% freshness on everything) either requires infrastructure investment disproportionate to the actual business need, or gets quietly ignored the first time it's violated because nobody actually planned for what happens then, both of which defeat the purpose; the threshold should reflect what the business genuinely needs and what the team is actually willing to invest in maintaining, not the most impressive-sounding number. The other common failure is defining an SLO without a real error budget and remediation process behind it: an SLO that's just a number on a dashboard nobody acts on when it's breached is indistinguishable from having no SLO at all, so the escalation and remediation commitment is the part that actually makes the SLO meaningful, not the number itself.
Design a continuous-integration and deployment process for report and semantic-layer development, the same discipline a software team would apply to application code. Cover what you would put under version control, what you would test before anything reaches production (data checks, performance, visual changes), how changes move through environments, and how you would roll one back if it breaks something downstream.
Sample Answer
Direct answer
Building a CI/CD pipeline for report and semantic-layer development means applying the same discipline software engineering uses: put definitions under version control, run automated checks before anything reaches production, promote changes through environments, and be able to roll a bad change back quickly. Retrofitting this onto a legacy system where metric logic is embedded directly as SQL inside individual dashboards is largely the same discipline applied as a migration rather than a greenfield build.
Structured elaboration
What goes under version control: report and semantic-layer definitions (metric expressions, joins, access rules), not just dashboard layout. If a BI (business intelligence) tool stores these as opaque binary project files, that's a real constraint (see pitfalls below); tools that expose definitions as text (LookML, dbt-style metric YAML) fit this model directly.
What gets tested before anything reaches production: data validation (does the metric's output look plausible against a recent window, are there unexpected nulls), query-performance thresholds (did this change make a widely-used report meaningfully slower), and visual regression (did a layout or calculated-field change unintentionally alter what a chart renders) for the report layer specifically.
Promotion across environments: changes move dev to staging to production, the same as application code, with staging validated against production-like data volumes so a performance regression shows up before it reaches real users, not after.
Secrets and credential management: warehouse connection strings and service-account credentials belong in a secrets manager the pipeline references, never checked into the same repository as the report definitions.
Rollback: a bad change to a widely-used metric or report needs a fast, well-rehearsed path back to the last known-good version, not a scramble to remember what changed.
Migrating legacy embedded-SQL reports into this model is the same target state reached by refactoring rather than building fresh: extract the metric logic that's currently duplicated inside dashboard-level SQL into a shared, versioned layer (a dbt model or a metric-layer definition), write tests against the extracted definitions comparing their output to the original embedded queries for a fixed historical window (a regression test that the refactor didn't change the numbers), then repoint the dashboards at the new shared definitions one at a time rather than in one large cutover.
Worked example
A revenue dashboard currently computes 'net revenue' via SQL pasted directly into the dashboard tool. Migrating it: first, extract that SQL logic into a dbt model, net_revenue, and write a test asserting that for a fixed historical month the new model's output matches the old dashboard's cached value to the cent (this is the regression test proving the extraction didn't change the number). Then a pull request changing net_revenue's logic (say, to also exclude a new fee type) runs the CI suite: the dbt test suite, a query-performance check comparing the new query's runtime against a threshold, and a visual-regression snapshot of the three dashboards that consume net_revenue. Only after all three pass does the change promote to staging, get validated against a staging-scale dataset, and then promote to production; if a dashboard breaks in production anyway, the rollback path is reverting the dbt model to its previous tagged version, which every consuming dashboard picks up automatically since they all reference the shared model rather than their own copy of the SQL.
Trade-offs and pitfalls
The biggest practical obstacle is tooling that doesn't expose definitions as diffable text: a BI tool storing reports as opaque binary project files makes meaningful code review and automated testing much harder, so part of choosing this discipline is choosing (or migrating toward) tools that support it. Visual regression testing in particular is noisy in practice (font rendering, rounding of pixel positions) and needs a tolerance threshold or it becomes an alert everyone ignores. And CI passing is not the same as correctness: automated tests catch what you thought to test for; a genuinely new kind of bug (a join that fans out only under a specific, untested data shape) can still pass CI and reach production, which is why staged rollout and monitoring after promotion remain necessary even with a mature pipeline.
You need to expose analytics outside the walls of your own BI tool, either embedding dashboards into a customer-facing product or exposing the data through an API. Design the access-control and delivery layer for this: how you authenticate the caller, how you enforce that each customer only sees their own data, how you keep it fast enough to embed, and what you'd mask or exclude given that this data is now leaving your internal environment.
Sample Answer
Direct answer
Exposing analytics outside your own BI (business intelligence) tool, whether embedding a dashboard in a customer-facing product or offering an API, means the access-control boundary that used to be "whoever has a login to our internal BI tool" now has to be enforced explicitly at the edge, with strong authentication, strict per-customer data isolation, and real thought about what's safe to mask or exclude now that this data is leaving your internal environment.
Structured elaboration
Authentication and authorization: for an API, this typically means OAuth (a standard token-based authorization protocol) or scoped service tokens rather than a shared secret, with rate limiting to prevent abuse; for an embedded dashboard, single sign-on (SSO) integration with the host application and token rotation so an embedded session can't be hijacked or reused indefinitely.
Data isolation for multi-tenant scenarios: the same row-level-security discipline applies here with higher stakes, since a leak here means one customer seeing another customer's data through your product, not just an internal access-control slip; this needs to be enforced at a layer that can't be bypassed by a misconfigured embed, ideally the warehouse or semantic layer, not just the embedding code.
Performance for external-facing use: caching and, where relevant, pre-rendering matter more here than for internal BI, since an external customer's expectations for load time in your product are different from an internal analyst's tolerance for a BI tool; pagination and precomputation for heavy reports keep response times reasonable without exposing the underlying warehouse to arbitrary external query load.
What to mask or exclude specifically because data is now external: internal-only fields (cost structure, internal notes, another customer's benchmark data used for context) that were fine for an internal analyst to see alongside a customer's data need to be explicitly excluded from anything customer-facing, since the audience and trust boundary have fundamentally changed. Concretely, this includes PII (personally identifiable information) handling: masking, tokenization, or differential privacy for user-level detail, and a clear policy for what user-level detail is even appropriate to show externally versus only in aggregate.
Legal and privacy considerations: sharing metrics externally, even with the data's own "owner," the customer, can trigger data-sharing agreements, regional privacy regulation requirements, or contractual limits on what can be exposed, which need review before anything goes live, not after.
Auditing: a record of who accessed what through the external-facing surface, which matters more here than internally since an external access anomaly (a token being used from an unexpected pattern) is a stronger signal of a real problem.
Worked example
A company embeds a usage-analytics dashboard into its own product so customers can see their own account's data, and separately offers a read-only API for customers who want to pull the same data into their own systems. For the embed: SSO ties the embedded dashboard's session to the customer's existing login in the host product, with short-lived, rotating tokens so a session can't be replayed later; row-level security at the warehouse layer ensures the underlying query can only ever return that specific customer's rows, regardless of what the embedding code requests, so even if the embed were misconfigured, no cross-customer leak is possible. For the API: requests authenticate via OAuth-issued, scoped tokens (a token only grants access to that customer's data), rate-limited to prevent one customer's automated pulls from degrading performance for others, and heavy report endpoints are paginated with precomputed daily summaries available for the common case rather than forcing every API call to hit the raw warehouse.
Trade-offs and pitfalls
A common mistake is treating an embedded dashboard's access control as "whatever the embedding code passes in" without a warehouse- or semantic-layer-level enforcement backing it up, which means a single bug in the embedding integration becomes a genuine cross-customer data leak rather than a contained failure; the same layered-defense principle from row-level security generally applies here with more urgency, since the audience is external. The other frequent gap is legal review happening too late: teams sometimes build the full technical embedding or API solution before checking whether the specific data being exposed is even contractually or legally permissible to share in that form, which can mean re-architecting after the fact rather than designing the right constraints in from the start.
Unlock Full Question Bank
Get access to all 46 Business Intelligence, Reporting, and Dashboards interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.