Structured expense management for F&B operations — receipt upload, approval workflow, audit trail, and payment tracking.
In most small F&B businesses, expense claims work like this: a staff member buys something for the outlet, takes a photo of the receipt on WhatsApp, sends it to the manager, the manager forwards it to the owner, the owner pays cash or bank transfer, nobody records it properly, and at month end the accountant asks where all the money went.
This is not an accounting system. It is not an ERP. It is a simple, structured way for staff to submit claims, managers to approve them, and owners to track what gets paid and what doesn't — with every receipt stored, every decision logged, and every rupee accounted for.
Taiwan Maami staff regularly make small purchases for the outlets — cleaning supplies, small equipment, emergency ingredient top-ups between deliveries. Before this system, these were tracked in a WhatsApp group and a spreadsheet.
The problems were predictable: receipts got lost, amounts were disputed, staff sometimes waited weeks for reimbursement, and the owner had no real-time view of outstanding claims.
This system takes ten minutes to set up and replaces all of that.
| Problem | What operators do today | What this system does |
|---|---|---|
| Receipt management is WhatsApp photos | Group chat chaos | Structured upload, stored in Cloudinary, always retrievable |
| No approval trail | Verbal approval, forgotten | Multi-step approval — submit, review, approve, pay |
| Staff wait weeks for reimbursement | Manual follow-up | Real-time status — submitted, under review, approved, paid |
| Owner has no visibility | Ask each manager | Dashboard showing all pending, approved, and paid claims |
| Amounts get disputed | No record | Receipt photo attached to every claim, immutable |
| Outlet claims mixed together | One spreadsheet | Outlet-scoped — each manager sees only their outlet |
| No audit trail | Nothing | Every action logged — who submitted, who approved, when, why rejected |
| Category tracking | None | Claims categorised — supplies, equipment, transport, other |
- Staff submit claims with amount, category, description, and receipt photo
- Receipt upload via mobile camera — stored in Cloudinary
- Outlet auto-assigned based on staff login
- GST number capture for tax-deductible expenses
- Manager reviews and approves or rejects with reason
- Owner has final approval for claims above threshold
- Rejection with reason — staff can see why and resubmit
- WhatsApp notifications on status change
- Approved claims marked as paid with payment date and method
- Bank transfer reference number stored
- Outstanding claims dashboard — what is approved but not yet paid
- Payment history per staff member
- Monthly expense summary by category
- Per-outlet expense breakdown
- Outstanding claims report
- Staff-level claim history
- Export to CSV for accountant
- Every action recorded — submitted, viewed, approved, rejected, paid
- Timestamp and user on every state change
- Immutable — no editing after submission, only rejection and resubmission
| Layer | Technology |
|---|---|
| Backend | Node.js, Express, tRPC |
| Frontend | React, Vite, Tailwind CSS |
| ORM | Drizzle ORM |
| Database | MySQL 8 — DigitalOcean Managed Database, Bangalore |
| Auth | Employee Master API (staff login via mobile number) |
| File Storage | Cloudinary (receipt uploads) |
Core tables covering:
claims— full claim records with status trackingclaim_items— line items per claimclaim_receipts— receipt images with Cloudinary referencesapprovals— approval chain with reasonspayments— payment records with method and referencecategories— configurable expense categoriesaudit_log— every state change with user and timestampusers— outlet-scoped staff with role assignment
/server
/routers/ — tRPC routes (claims, approvals, payments, reports)
/db/ — Database queries
/client/src
/pages/ — Staff claim submission, manager approval, owner dashboard
/components/ — Receipt viewer, claim status tracker, payment recorder
/drizzle/ — Schema and migrations (11 tables)
If you run a multi-outlet F&B business and your expense claim process lives in a WhatsApp group, this was built for exactly that problem.
It works standalone or as part of the full Thamarai Foods stack — POS, inventory, employee management, and expense claims — all connected through a shared data lake.
Contact: kannan.swamy@taiwanmaami.com
- Direct bank transfer integration — planned
- Recurring expense templates — planned
- Multi-currency support — planned
- Integration with accounting software (Tally, Zoho Books) — planned
This software is proprietary. All rights reserved by Thamarai Foods and Trading Private Limited.
You may view this code for evaluation purposes. You may not use, copy, modify, distribute, or deploy this code without a valid commercial licence agreement.
To obtain a licence: kannan.swamy@taiwanmaami.com
- Taiwan Maami POS — Customer ordering, staff POS, admin panel, daily WhatsApp digest
- Inventory Management — WAC costs, stock takes, landed cost, wastage analytics
- Employee Master — Staff records, outlet assignments, payroll integration
Replace your WhatsApp receipt group with something that actually works.