Build a Simple Expense Tracker in ViibeStack, Skip the SaaS
September 10, 2026

Build a Simple Expense Tracker in ViibeStack, Skip the SaaS

The expense app you're paying for is built for a different company

Tools like Expensify and Ramp's expense module are genuinely good products -- for companies that process thousands of receipts a month, issue corporate cards to dozens of employees, and need a policy engine to flag a $400 dinner before it hits the books. They charge per active user per month because that's the workload they're solving: continuous, high-volume expense intake with automated fraud and policy checks layered on top. Most small businesses don't have that problem. A team of six might have one person submit a client lunch, another log mileage to a job site, and a third get reimbursed for a software subscription they put on a personal card -- maybe a dozen submissions in a month, total. That's not a volume problem. It's a form, an approval, and a log. Paying $5-15 per active user per month for OCR receipt scanning and corporate card feeds you'll never use is solving a scale problem you don't have.

What a small team's expense workflow actually needs

Strip the category down to its essentials and you get three things: 1. A submission form -- amount, category, a short note explaining what it was for, and a photo of the receipt. 2. An approval step -- the submission routes to the right manager, who approves or rejects it with a click. 3. A log tied to the employee and, where relevant, the client or project the expense was billed against -- so you can see who spent what, on what, and whether it's reimbursable to a client. That's the whole job. It doesn't require a policy engine that auto-flags spending limits, a live corporate card feed, or machine-learning receipt parsing. It requires a record and a rule about who signs off on it.

Building the submission form

Start with an Expenses table or object with fields for: employee (linked to your team/user table), date, amount, category (a dropdown -- meals, mileage, software, travel, supplies, other), a short description, a receipt image upload field, and, if you bill clients for reimbursable costs, a client or project field linked to wherever you track that work. If you're already tracking clients or projects somewhere, link this field to that table instead of retyping names -- it's what makes the client/project spend report possible later. The submission form itself is just that table exposed as a form: the employee fills in amount, picks a category, writes a one-line note, attaches a photo of the receipt with their phone, and optionally tags a client or project. No app to install, no separate login -- it's the same ViibeStack app your team already uses for other internal workflows.

Adding the approval step

Add a status field to the same record: Submitted, Approved, Rejected, Paid. When an employee submits an expense, status defaults to Submitted and a notification goes to their manager -- either a fixed manager field on the employee record, or a simple rule like "route by department." The manager sees a queue of Submitted items, opens each one, checks the receipt image and note, and moves the status to Approved or Rejected with an optional comment. Once approved, whoever runs payroll or AP marks it Paid when the reimbursement actually goes out -- via payroll, a bank transfer, or however your business already pays people back. This is the same pattern used for routing any internal approval, and if you want a deeper look at how to set up who can see and act on what, the guide on role-based permissions in ViibeStack covers the mechanics of restricting the approval action to managers only.

Reporting: spend by employee, category, and client

Once expenses are logged in one table with employee, category, client/project, amount, and status, the reporting is a set of filtered views, not a custom build. You want at minimum: total approved spend by employee over a period (useful for budget conversations), total spend by category (are software subscriptions creeping up?), and total spend by client or project (so you can pull reimbursable costs into an invoice or check margin on a job). Group and sum the Amount field by whichever dimension you're looking at, filtered to Approved or Paid status so pending submissions don't skew the numbers. If you want trend lines or month-over-month comparisons rather than a static table, that's where you'd lean on ViibeStack's broader reporting capabilities rather than building custom charts from scratch. Either way, this expense log doesn't have to live in isolation -- it's a natural fit alongside whatever else you're already tracking in ViibeStack's Finance & Billing tools, since reimbursements are ultimately a cash-out event like any other bill.

Where a dedicated tool still wins

Be honest about what this build doesn't do. Expensify-style OCR that reads an amount and merchant straight off a photo saves real time if you're processing hundreds of receipts a week -- your first ViibeStack build will have employees typing the amount in themselves. A live corporate card feed that auto-matches transactions to submissions is genuinely useful once you've issued cards to a dozen employees. Multi-level approval policies (manager approves under $500, finance approves above it, with automatic escalation) matter for larger orgs with more cost centers than you can track in your head. And a built-in mileage calculator that turns a start and end address into a dollar amount is a nice convenience, even if it's easy enough to compute manually for a handful of trips a month. None of that matters much when your monthly expense volume is a dozen submissions and one manager can eyeball every receipt. It starts to matter when you're processing thousands of receipts a month across multiple departments -- at that point, the per-seat SaaS bill is buying you automation that actually pays for itself. For everyone else, a simple tracker that ties submissions to approvals to a clean log is the right amount of software, and it sits naturally next to your HR & People Ops tools since it's ultimately tracking who on your team is owed what.

← Back to the blog