Back to Blog

Building Spendaroo: Company Card Spend, Split Two Ways

July 8, 2026Jeff Conn
Building in PublicSpendarooCustom SoftwarePlaid

Five Star Group isn't one company — it's a handful of LLCs that share cards, people, and a single overworked accountant. Which means every month, the same quiet misery: a pile of company-card transactions where each line needs two answers, not one. What was it? And which company does it belong to?

That second question is the one no off-the-shelf tool wants to ask. Most spend software assumes one business, so it gives you a category and calls it done. But a coffee run charged on a shared card might belong to the hotel, the theater, or the lodging company — and the category (Meals? Travel? Office?) is a separate decision entirely. Get either dimension wrong and the books are wrong. Multiply that by hundreds of transactions a month, done in a spreadsheet after hours, and you understand why it never gets done on time.

So I built Spendaroo: company card spend, categorized — across both dimensions, fast.

Spendaroo home dashboard: a 'For you' list — 167 transactions to review, 65 missing a category, 98 missing an entity — next to connected cards and a 90-day spend trend, in a dark brass-accented theme.

The two-dimensional model

The whole product is organized around one idea: every transaction gets a Category (a GL-coded chart of accounts — what the money was for) and an Entity (which LLC it belongs to). Those are independent axes, and the interface treats them that way. You can see it right on the home screen above: it doesn't greet you with a vanity number, it greets you with the work — 167 to review, 65 missing a category, 98 missing an entity. The two dimensions aren't buried in a form; they're the to-do list. Click into any of them and you're in a dense, keyboard-navigable workbench with a detail overlay for the lines that need a closer look.

Because the two dimensions are first-class, the reports downstream are too. When the accountant asks "what did the theater spend on maintenance in Q2," that's not a heroic spreadsheet exercise — it's two filters.

Design: a well-lit ledger

I wanted this to feel like a ledger you actually enjoy opening — calm, precise, quietly premium, not another cramped fintech dashboard. The personality I wrote into the spec was literally "a well-lit ledger."

That translated into specific choices: a dark theme by default with a light mirror, a single brass accent reserved for primary actions and focus rings, and a serif — Fraunces — for page titles and the big money figures, against Inter for the tables. Money is always set in tabular figures so columns of numbers line up to the digit. Table rows are tall and airy at 56px with hairline dividers and no zebra striping; status lives in small pills (Unreviewed, Reviewed, Exported). It's restrained on purpose. When you're staring at hundreds of numbers, the interface should get out of the way.

How the transactions get there

Spendaroo pulls transactions directly from the card accounts through Plaid. The sync is cursor-based and deduped, so re-running it never doubles a charge, and — this is the part that makes it usable — categorization rules run at ingest. By the time a transaction lands in the workbench, the rules you've taught it have already made their best guess at category and entity. The human job shrinks from "categorize everything" to "review the guesses and fix the few that are wrong." That's the difference between a tool you dread and one you actually keep up with.

From there it's a review workflow, an insights view for spotting trends and recurring charges, and an accountant-ready CSV export at the end — the thing that was the whole point.

Built to hold real money data

A tool that touches bank connections and financials has to be locked down from the first line. A few decisions I care about:

  • Every table is scoped to your organization at the database level with row-level security — not in application code that a bug could bypass.
  • The Plaid access tokens have no client-side access at all. They're readable only by the server's service role, so a compromised browser session can't reach them.
  • Receipts live in a private bucket and are served through short-lived signed URLs, never public links.
  • Every write is a server action, and the sensitive ones are audit-logged — who changed what, when.

The stack

Spendaroo is Next.js 16 on the App Router, Supabase for Postgres, auth, storage, and row-level security, Plaid for the card connections, and Vercel for hosting. I built it the way I build everything now — directing AI coding agents through the plumbing while I make the product calls and review every decision. From empty folder to a working, seeded, deployable app was a single focused day.

It started as a fix for my own monthly headache across a group of small companies. It turns out "spend, split two ways" is a problem a lot of multi-entity owners have, and almost nobody has a calm place to do it.