Accounting Engine

The Auto-Journal Engine

Every operational action generates balanced double-entry journal entries. Your books are always correct — by design, not by effort.

The problem with restaurant accounting

Most restaurant operators face the same impossible choice: spend hours on manual bookkeeping or accept that your financials are always behind, incomplete, or wrong.

Restaurant operators aren’t accountants — they shouldn’t have to be.

Manual journal entry is error-prone and time-consuming.

Most restaurant software doesn’t do accounting at all.

You end up with operations in one system and accounting in another.

Month-end reconciliation becomes a nightmare.

BasilBook's approach

You never write a journal entry. You record a purchase, import sales, log waste, run payroll — and the system generates every Dr/Cr entry automatically. Balanced, classified, and linked to its source. Accounting happens as a side effect of doing your job.

Purchase Journals

Every purchase line resolves its own GL account based on item configuration. Tracked inventory items debit the asset account; expense items hit the P&L directly.

journalForPurchase()
TransactionDebitCredit
Tracked itemInventory AssetCash / Bank / Payables
Expense itemExpenseCash / Bank / Payables
  • Each purchase line resolves its own account based on item configuration
  • Payment account determined by purchase payment method
  • Total always balances (Dr = Cr enforced before posting)

Sales Journals

Every imported invoice generates a balanced journal entry. Revenue is classified automatically by sale item category — food vs beverage, dine-in vs delivery.

journalForImportedInvoices()
TransactionDebitCredit
Cash / Card saleCash / BankFood Revenue + Beverage Revenue
Delivery saleReceivable + Commission ExpenseDelivery Revenue
  • Food items → Food Revenue (4000) or Delivery Food Revenue (4210)
  • Beverage items → Beverage Revenue (4100) or Delivery Beverage Revenue (4220)
  • Commission = gross amount × platform commission rate
  • Per-invoice entries with reference to invoice number

Waste Journals

When tracked inventory is wasted, the cost moves from the asset account to a waste expense. Each entry links back to the waste record for full traceability.

journalForWaste()
TransactionDebitCredit
Tracked item wasteWaste ExpenseInventory Asset
  • Only for tracked inventory items (expense items have no stock to deduct)
  • Links back to the waste record via referenceId
  • Waste reasons preserved: spoiled, expired, overcooked, prep waste, unknown loss

Expense Journals

Overhead costs like rent, utilities, and services are recorded as direct expenses against a payment account.

journalForExpense()
TransactionDebitCredit
Overhead expenseExpense AccountCash / Bank
  • Not tied to inventory items
  • Expense account selected per transaction
  • Payment account defaults to Cash on Hand

Payroll Journals

When a payment account is selected, salaries are recorded as an immediate expense. Without a payment account, an accrual is created against the Payroll Payable liability.

journalForPayroll()
TransactionDebitCredit
Immediate paymentPayroll Expense (5300)Cash / Bank
Deferred (no payment acct)Payroll Expense (5300)Payroll Payable (2300)
  • Most restaurants pay immediately — Dr Expense, Cr Cash
  • Deferred accrual only when no payment account is provided
  • Pro feature — requires active staff with monthly salary set

Inventory Behavior

Each inventory item has a behavior that determines how purchases, waste, and recipe usage are recorded in the books. The auto-journal engine adapts automatically.

Tracked Inventory

TRACKED_INVENTORY

Purchase

Dr Inventory Asset

Cr Cash / Bank

Waste

Dr Waste Expense

Cr Inventory Asset

Recipe Use

Dr COGS

Cr Inventory Asset

e.g. Beef, rice, beer, cooking oil

Expense on Purchase

EXPENSE_ON_PURCHASE

Purchase

Dr Expense

Cr Cash / Bank

e.g. Cleaning supplies, disposables, rent, utilities

Revenue Classification

Sale items are automatically classified by category keywords. This gives you four distinct revenue streams in your income statement — without any manual tagging.

AccountLabelChannel
4000Food RevenueDine-in / Takeaway
4100Beverage RevenueDine-in / Takeaway
4210Delivery Food RevenueGrab, FoodPanda, Nham24
4220Delivery Beverage RevenueGrab, FoodPanda, Nham24
Beverage: beer, coffee, tea, juice, drink, latte, soda, smoothie + Khmer keywords
Food: Everything else (default classification)

Delivery channels use sub-accounts (4210, 4220) separate from dine-in (4000, 4100). This gives you four revenue streams in your income statement automatically.

Safety Rails

The auto-journal engine is designed to prevent the mistakes that manual accounting makes easy. Every safeguard is enforced in code, not by policy.

Balance enforcement

Every journal entry must balance (Dr = Cr) — enforced in writeJournal() before any entry is persisted.

Status workflow

DRAFT → POSTED → REVERSED. Posted entries are never deleted — only reversed with a counter-entry.

Source reference

Every auto-generated entry links to its source transaction: invoiceNumber, purchaseId, or wasteRecordId.

Read-only journalsFREE

View all auto-generated journal entries. Manual entries require Pro.

Full journal controlPRO

Create manual journal entries, edit drafts, and reverse posted entries.

Audit trail

Every entry records who created it, when, and why. System logs track imports, price changes, and account modifications.

Accounting that runs itself

Stop wrestling with journal entries. Record your operations and let BasilBook handle the accounting — balanced, classified, and audit-ready.