SPINS · 2020

No more drinking from the firehose

Redesigning the SPINS data ingest dashboard so data ops can see what's wrong and where, instead of digging through raw logs.

Role
Product Designer
Timeline
Mar – Aug 2020
Team
8 full-stack developers, 1 product owner, 1 designer
Focus
Internal tools, data visualization, user research
The original SPINS dashboard retailer list with the store-level sales data screen layered over it

Result

30–60minutes, before
1–2minutes, after

Time for data ops to find an ingest issue, from first alert to knowing what's wrong and where.

Background

SPINS and data ingest

SPINS is a data company for the natural, organic, and specialty products industry. Retailers send point-of-sale data weekly; SPINS maps it to stores and products and turns it into market insight.

The ingest dashboard is the internal tool data ops uses to manage retailers and stores and keep that data flowing. When I joined, it showed everything and explained nothing.

I was the only product designer on an extreme programming team, and I ran the user interviews and the pattern testing behind the redesign.

“I just need to know what the issue is.”

Data ops, during interviews

The status quo

Finding one error

Here's what it took to find a single ingest error before the redesign.

  1. 0 min

    Start in the DAG logs

    Rows of red and green task states. A failed run links out to Google Cloud Storage.

  2. 2 min

    Open the raw file

    Download it or open it in the browser: thousands of unhighlighted lines.

  3. 5 min

    Find the error line

    Each line packs the error, the file row, and a giant string of metadata. Here, a date was in the wrong format.

  4. 6 min +

    Match it to the config

    Compare the retailer's sales config to the file by eye. It took another 5–30 minutes to fix, then a re-ingest to confirm it.

The sales config opened from the DAG logs, with its date format compared by eye against the raw file
Matching the config to the file was a manual comparison across two windows.

Objectives

Project goals

Change how data ops sees the problem

Move from a stream of individual failures to a map of what's complete and what isn't.

Identify the error

Show what failed, where, and why, without opening a raw file.

Surface the state of ingest

At a glance: which retailers, stores, and weeks have complete data, partial data, or none.

Personas

Who uses ingest data

Core target

Data Ops

“Clean, organized, and correct.”

Keep weekly retailer data flowing, and fix it when it breaks.

Data Science

“Looking at the buckets of data.”

Work with ingested data in aggregate, and need to trust each bucket.

Product + Sales

“What can we do with this?”

Need to know what data SPINS has before they can sell it.

Workflow

Retailer, then store, then week

Retailers were the first logical bucket. Everyone knew them, from data ops to sales, and they follow the API's call-and-response structure. Selecting a retailer opens its stores, and each store shows its weekly ingest status.

Management view listing all retailers with ID, roll-up day, FTP, code and tag
Retailers: the entry point.
Retailer page with details and a table of its stores
Store data: what ingest uses to assign each row to a store.

Defining patterns

Complete, partial, missing

The first weekly view was a wall of check marks. Interviews showed it hid the gaps and couldn't show partial data or errors.

I tested icon shapes and colors with users—every user preferred circles: full, half and empty read as complete, partial, and missing. Stars read as a rating. Then we removed the complete state entirely, because a full circle on every healthy week added noise and no information.

Weekly data v1: a check mark for every store and week
Before: v1, a check mark in every cell.
Weekly data v2: half circles mark partial weeks and empty red circles mark missing weeks
After: v2, only the problems stand out.

Workflow

Fix it where you find it

Every flagged week in the grid is a way in. Clicking a half or empty circle opens that week's issue report as a modal over the store data, so the store and the week stay in view.

The report groups problems by type, shows how many rows each one hits, and includes a real example from the file. Here, 3,000 rows had a date in the wrong format.

Beside the issues are the file's configs, ready to edit, and a Re-ingest button to run the file again. Finding the error, fixing the mapping, and re-running it now happen in one place, with no raw logs and no line numbers to remember.

Issue report for week 6 of 2020 open as a modal over the weekly store data: 3,030 issues grouped by type with examples, the file type and sales configs, and a Re-ingest button
The issue report for week 6 of 2020, open over the weekly store data.

Reflection

What I learned

Show the exception, not the rule

Removing the complete state left only gaps and errors on screen. Data ops didn't need more data; they needed less, in the right shape.

Bring the fix to the error

Most of the lost time went to moving between tools. Putting the issue, the config, and re-ingest in one place mattered more than any single screen.

More work