Skip to content
Internal Tools

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

  1. Team works normally

    Existing tools stay untouched

  2. Scheduled data pull

    REST APIs on a timer

  3. Normalize and store

    Supabase Postgres tables

  4. Attention rules run

    Flags overdue and stalled items

  5. Dashboard renders

    Next.js app on Vercel

  6. Role-filtered views

    Supabase auth and access rules

  7. 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.