One submit, and the numbers move together.
Tabula is a multi-tenant ERP for small and medium businesses in the Philippines. Submitting a sales invoice allocates its number, locks its lines, and posts every stock movement it causes — in a single database transaction, or none of it at all.
No credit card. Self-hosted or hosted.
Receivable · Northwind Trading Inc.
| Steel bracket, 12 mmITEM-0007 | 120 | 10,200.00 |
| Hex bolt M8 — box of 50ITEM-0012 | 24 | 5,760.00 |
| Delivery — Metro ManilaSRV-0002 | 1 | 1,500.00 |
Stock ledger · Main warehouse
| Steel bracket, 12 mmITEM-0007 | −120 | 380 left |
| Hex bolt M8 — box of 50ITEM-0012 | −24 | 36 left |
The stock moved the moment the invoice did.
No overnight sync, no “post to inventory” step someone forgets on a Friday. Submitting INV-2026-00042 wrote these ledger entries inside the same transaction that created it.
If any part of it failed — a number collision, a short stock check — the whole thing rolls back. You never end up with an invoice whose goods never left the warehouse.
Every document walks the same four states.
Invoices, purchase orders, stock entries — one lifecycle, learned once, enforced by the database rather than by habit.
- 01Draft
The only state you can freely edit. Nothing has been numbered or posted yet.
- 02Submitted
Number allocated, lines locked, stock posted — one transaction, or none of it.
- 03Paid
Payments applied against the document; outstanding recalculated as they land.
- 04Cancelled
Reversed with a matching entry and an audit row. The original never disappears.
Eight modules. Three of them are done.
Tabula is built in phases, in public. Here is exactly where it stands today.
lifted = shipped · rising = in progress · down = planned
- SalesCustomers, items, invoices, payments, receivablesShipped
- InventoryMulti-warehouse, batches, stock ledger, moving-average valuationShipped
- PurchaseSuppliers, purchase orders, bills, supplier paymentsShipped
- AccountingChart of accounts is in. Ledger, statements, and fiscal periods are nextIn progress
- CRMLeads, opportunities, quotationsPlanned
- HR & PayrollEmployees, attendance, payroll runsPlanned
- ManufacturingBOMs, work orders, production planningPlanned
- ProjectsTasks, timesheets, project costingPlanned
Each organization gets its own Postgres schema — t_acme, t_northwind — so one tenant's data cannot be queried from another's session, by construction rather than by a WHERE tenant_id everyone has to remember.
Boring where boring is correct.
Money is a decimal, never a float. Documents are immutable once submitted. The unglamorous parts are the product.
- Next.js 16
- TypeScript
- Prisma + Postgres (Neon)
- shadcn/ui
- Tailwind 4
- NextAuth v5
- Vercel
Questions
What the product does today, and what it does not.
- What can I use today?
- Sales, inventory, and purchase. You can keep customers and suppliers, raise invoices, receive and issue stock, and record payments. Accounting has a chart of accounts. The general ledger and financial statements are not in yet.
- Is each company's data separate?
- Yes. Every workspace gets its own Postgres schema. Another company's session cannot query yours. There is no shared tenant_id column to remember.
- What happens when I submit a document?
- A draft is the only editable state. Submit numbers the document and posts its side effects, such as stock, in one transaction. Cancel does not delete it. It writes a reversal and leaves the original in place.
- How is stock valued?
- Moving average. A receipt updates the rate. An issue or a sales invoice consumes stock at the current average. FIFO is not the cost method.
- Is accounting finished?
- No. The chart of accounts is available. Journal entries, the general ledger, profit and loss, and the balance sheet are still planned.
- Do I install anything?
- No. Tabula is a website. Create a workspace, confirm the email code, and you are on your own subdomain.
Start with an empty ledger.
Create a workspace, add your first customer and item, and raise an invoice in a few minutes.