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.

Beginone transactionINV-2026-00042

Receivable · Northwind Trading Inc.

Steel bracket, 12 mmITEM-000712010,200.00
Hex bolt M8 — box of 50ITEM-0012245,760.00
Delivery — Metro ManilaSRV-000211,500.00
Total due · Net 30₱19,555.20

Stock ledger · Main warehouse

Steel bracket, 12 mmITEM-0007−120380 left
Hex bolt M8 — box of 50ITEM-0012−2436 left
Moved out · moving-average value−144₱37,200.00
Commitboth sides, or neitherrolled back on any failure

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.

  1. 01Draft

    The only state you can freely edit. Nothing has been numbered or posted yet.

  2. 02Submitted

    Number allocated, lines locked, stock posted — one transaction, or none of it.

  3. 03Paid

    Payments applied against the document; outstanding recalculated as they land.

  4. 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, receivables
    Shipped
  • InventoryMulti-warehouse, batches, stock ledger, moving-average valuation
    Shipped
  • PurchaseSuppliers, purchase orders, bills, supplier payments
    Shipped
  • AccountingChart of accounts is in. Ledger, statements, and fiscal periods are next
    In progress
  • CRMLeads, opportunities, quotations
    Planned
  • HR & PayrollEmployees, attendance, payroll runs
    Planned
  • ManufacturingBOMs, work orders, production planning
    Planned
  • ProjectsTasks, timesheets, project costing
    Planned

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.