Software Design
Fishbowl Dashboard
The Problem
Restaurant operators were making decisions based on gut feel — not because the data didn't exist, but because it lived in six different places and none of them talked to each other. Reservations in one tool. Email campaigns in another. Loyalty points somewhere else entirely.
Fishbowl needed a dashboard that could pull it all together and make it readable in under a minute.
What I Built
A modular widget system covering every dimension of restaurant performance — guest counts, campaign metrics, loyalty balances, offer redemptions, trending menu items, review sentiment, and AI-powered insights — all in a single configurable dashboard. As the sole designer, I owned the system end to end: from defining the widget grammar to every state, interaction, and edge case.

The library was organized around the questions restaurant operators actually ask — not around data categories. How are my campaigns performing? Who are my best guests? Are my promotions working? What's driving foot traffic? Each group of widgets answers one of those questions directly, so operators can build a dashboard around what they're trying to solve, not around what data happens to be available.
One System, Consistent Rules
Every widget shares the same structure: a title, a primary metric, a comparison period, and a color signal. Green means up. Red means down. Blue means no change. Yellow means no data selected yet. Applied consistently across 20+ widgets, this means users never have to relearn how to read a new component — the system speaks one language.

Flexible Without Being Complicated
Two patterns do the heavy lifting across the whole library.
Dropdowns
Keep widgets compact while still allowing precision. Default view shows high-level totals. Open the dropdown and you choose the timeframe — days, weeks, custom range — without the widget changing size or breaking the layout.

Expandable States
Let a single widget serve two different user needs. At a glance, it shows the key metric. Expand it and you get the full trend graph. One component, two depths of information.

Four Dashboards, One Library
The same widgets assemble into completely different views depending on who's using them and what they're tracking.
Main –
Daily health check. Transaction trends, guest counts, reservations, review sentiment.
Marketing –
For campaign teams. Email and SMS performance alongside the campaign calendar.
Offers –
Tracks redemptions, rejections, and revenue from promotions over time.
Guests –
Customer lifecycle view. Recency, frequency, and spend to find your best guests and your at-risk ones.

How It Feels to Use
Four interaction patterns make the system navigable regardless of how much data is on screen:
Filter:
timeframe, channel, and segment controls per widget
Drill Down:
click a metric to open a breakdown
Switch:
toggle between related views within a widget
Expand:
scale up in place to reveal trend charts and history
What Changed
Before: operators needed help from the Fishbowl team to pull reports. Custom exports. Spreadsheets. Waiting.
After: open the dashboard before service, see everything that matters in thirty seconds — no exports, no interpretation, no waiting.
The shared widget system also changed how the product team works. Engineers, designers, and data teams now build from the same library, which reduced back-and-forth during development and gave the product a consistency it didn't have before.
Reflection
The biggest lesson wasn't about design — it was about restraint. Early versions tried to show everything. The shift came from realizing that a good dashboard doesn't surface all the data. It surfaces the right signal at the right moment and gets out of the way.
An engineering constraint helped: some metrics were too expensive to compute in real time. That pushed the design toward smarter defaults and pre-calculated comparisons — which turned out to be faster and more useful than live data would have been anyway.
Next: personalized dashboards that adapt to restaurant type and size, and alert-based widgets that flag anomalies automatically — moving the system from reporting what happened to telling operators what to do about it.

