Internal Operations Dashboard for Small Business Teams
The team ran on disconnected tools — orders in one, tasks in another, numbers in spreadsheets. With no single view, mornings started with twenty minutes of tab-hopping and things still slipped through.
Industry
Product-based small business (e-commerce orders and fulfillment)
Role
Systems consultant — discovery, data modeling, dashboard build, documentation and handover
Impact
The daily status scramble across five tools became a two-minute glance at one screen, and overdue orders stopped being found by accident.
01 - Problem
The problem
A small product business had orders in their e-commerce platform, fulfillment tasks in a task manager, key numbers in a spreadsheet one person updated when they remembered, and the rest in people's heads. The tools were fine; the problem was that no single screen showed the state of the business. Every question — what shipped, what's stuck, what needs a decision today — meant opening four or five tabs and stitching the answer together. The founder's daily round-up ate the first half hour, two people would chase the same order while a genuinely overdue one sat untouched, and when the founder traveled, visibility dropped to whatever someone messaged. Off-the-shelf reporting dashboards mostly charted history; they needed an operational view — live status plus a clear signal of what needs attention now.
Before writing code, I mapped where the data lived and where it broke: order statuses meant different things across tools, task assignments didn't map cleanly to people, and the spreadsheet had drifted from the source systems. That shaped the build — the dashboard had to be honest about data freshness and conflicts, not just pretty. Structure first, then the internal tool on top.
02 - System Flow
How the system moves
Team works normally
Existing tools stay untouched
Scheduled data pull
REST APIs on a timer
Normalize and store
Supabase Postgres tables
Attention rules run
Flags overdue and stalled items
Dashboard renders
Next.js app on Vercel
Role-filtered views
Supabase auth and access rules
Team acts on flags
Two-minute review, any device
03 - Build
What I built
Data layer and API integration sync
Scheduled sync jobs pull orders, tasks, and key figures from the team's existing tools through their REST APIs into a Supabase Postgres database. Each source gets a small mapping layer that translates its statuses and fields into one shared vocabulary, so an "order" means the same thing everywhere. Every sync writes a timestamped log with record counts, which made debugging straightforward and lets the dashboard show how fresh each source is.
Operations dashboard UI
The front end is a Next.js app styled with Tailwind CSS on Vercel. The home view answers the morning questions in one screen: open orders by status, tasks due or stalled, and the few key numbers the founder actually checks. I designed it mobile-first because the founder reviews it from their phone — large tap targets, no horizontal scroll, attention list always at the top.
Attention flags instead of more charts
Instead of charts the team would learn to ignore, we defined a short list of conditions that genuinely mean someone needs to act: orders unshipped past a threshold, tasks idle too long, numbers outside an agreed range. Those rules run on the synced data and surface as one flagged-items list, each with a reason and a link back to the source tool where the fix happens. The dashboard is for seeing; the existing tools stay the place for doing.
Role-based access
Supabase Auth handles sign-in, with roles enforced at the database level through row-level security rather than hidden in front-end code. The founder sees everything including financial figures, the operations lead sees orders and tasks, and part-time staff see only their own queue. Keeping access rules in the database means a future developer can't bypass them from the UI.
Documentation and handover
I wrote a plain-language runbook: what each sync does, how to read the sync logs, what every attention flag means, and what to check first when a number looks wrong. I documented how to rotate API keys and add a user, then ran a handover session. An internal tool only earns trust if the team can operate it without me on call.
04 - Impact
Business impact
The founder's morning round-up across five tools became a two-minute review of one flagged-items list, on a phone if needed.
Overdue orders and stalled tasks now surface automatically through attention flags instead of when a customer follows up.
The whole team works from the same numbers and the same definition of "needs attention," ending the duplicate-chasing and the gaps between informal lists.
The manually maintained KPI spreadsheet was retired; figures now come straight from source systems on a schedule.
The founder can travel without operational visibility dropping to whatever someone remembers to message.
Because the data is already normalized in Supabase, future workflow automation — alerts, weekly summaries, escalations — can be added without rebuilding the foundation.
05 - Edge Cases
What had to be handled
Source API down or rate-limited: each sync retries with backoff, keeps the last good data, and the dashboard shows a stale-data banner with the last successful sync time instead of silently showing old numbers.
Conflicting statuses between tools, like an order shipped in one system but open in another: the record is flagged for human review rather than the dashboard guessing which is right.
Records that don't map cleanly, like a task assigned to someone who isn't a dashboard user: these land in an "unmapped items" view instead of being dropped, so nothing disappears quietly.
Upstream field or API changes: the mapping layer validates expected fields each sync and fails loudly into the log rather than writing malformed rows.
A staff member leaving: access is revoked in one place via Supabase Auth, and row-level security keeps their role's data unreachable even if a session lingers.
Duplicate records from overlapping sync windows: upserts keyed on the source system's ID make every sync safe to re-run.
06 - Improvements
What I would improve next
Add scheduled digest notifications — a short morning summary of flagged items pushed to the team's chat tool, so the dashboard comes to them on busy days.
Add light trend views over the accumulated Supabase data, like week-over-week order volume, now that several months of clean history exist.
Move from timer-based syncs to webhooks for sources that support them, so urgent changes like a payment failure appear in near real time.
Let the team adjust attention-flag thresholds from a small settings page instead of asking me to change a config value.
Related capabilities