Skip to content
Tanner Young
All projects

Signal Dashboard

An internal metrics surface that cut the time-to-answer for product questions from days to minutes.

PythonDataVisualization

Placeholder case study. No cover image and no external links on this one, so the card renders its initials-block fallback — useful for checking that variant.

Problem

Product questions took days to answer, not because the data was missing but because answering required someone who knew the warehouse schema. Every question became a ticket, and the queue was long enough that most questions were simply never asked.

The cost was invisible in the usual sense: nobody tracks the decisions made without evidence because getting evidence was inconvenient.

Approach

Model the questions, not the tables. Rather than exposing the warehouse directly, a semantic layer defines the twenty or so metrics people actually ask about, each with an owned definition.

@metric(owner="growth")
def weekly_active_accounts(period: Period) -> Series:
    """Accounts with >=1 qualifying session in a trailing 7-day window.

    Excludes internal and automated traffic. The exclusion list is versioned
    so historical numbers stay reproducible.
    """
    return (
        sessions.filter(qualifying=True, internal=False)
        .rolling(days=7)
        .distinct("account_id")
        .by(period)
    )

Having one definition of “active account” in code — with an owner and a docstring — resolved more disputes than any dashboard feature did. Previously three teams each had a slightly different number and all three were defensible.

Composition over configuration. Metrics compose along shared dimensions, so new views are assembled from existing definitions rather than authored as new queries.

Answers, not charts. Each view opens with the number and its change, with the chart as supporting detail. People wanted a value; the visualization was context, not the point.

Outcome

  • Time-to-answer for routine product questions went from days to minutes.
  • The analytics request queue shrank by roughly 60%, freeing the data team for work that actually required their expertise.
  • Metric disputes largely ended — there is now one definition with a name attached to it.

The uncomfortable lesson was that the hard problem was never technical. It was that “active account” had never been written down, and the dashboard only worked because building it forced that conversation to happen.