A lite double-entry ledger. It exists to answer "where did this money go/come from," not to replace a dedicated accounting package — there's no tax filing, no depreciation schedules, no multi-book consolidation.
Chart of accounts
Every tenant starts with 11 standard accounts: Cash, Accounts Receivable, Inventory Asset, Accounts Payable, Tax Payable, Payroll Deductions Payable, Sales Revenue, Realized FX Gain/Loss, Cost of Goods Sold, Inventory Adjustments, and Wages Expense. These are marked as system accounts — you can rename them or toggle them active/inactive, but not delete them or change their type/code, since the rest of the app posts to them by exact reference. Add your own accounts alongside them freely.
Where journal entries come from
Almost every entry posts itself automatically, as a side effect of something else happening:
- Sending an invoice posts Debit Accounts Receivable / Credit Sales Revenue (+ Credit Tax Payable if any line has tax), and for stock-tracked lines, Debit COGS / Credit Inventory Asset — using the cost Inventory just computed.
- Recording a payment posts Debit Cash / Credit Accounts Receivable, plus a realized FX gain/loss line if the payment's exchange rate differs from the invoice's own frozen rate.
These auto-posted entries have no "posted by" user — they're clearly attributable to the invoice or payment that triggered them, not to whoever happened to click the button.
You can also post a manual journal entry directly (Accounting → Journal Entries → New) if you have the Accountant role or equivalent permission — useful for opening balances, corrections, or anything that isn't one of the automatic flows above. A journal entry's debits and credits must balance exactly before it's accepted; the ledger has no mechanism for an unbalanced entry to exist.
Made a mistake on a posted entry? Reverse it — this creates a new, mirrored entry (debits and credits swapped) linked back to the original. The original entry is never edited or deleted; the reversal is the correction, and both stay in the ledger for the audit trail.
Fiscal periods
The ledger supports closed fiscal periods — a closed period rejects any new posting into it, manual or automatic. Manage them from Accounting → Fiscal Periods: create a period (name + date range, rejected if it overlaps an existing one), then Close it once it's done, or Reopen it if you need to post a late correction. A period can only be deleted while reopened and only if nothing has posted into its date range. No period is closed by default, so a fresh tenant posts normally everywhere until you close one yourself.
Reports
- Trial Balance — every account's debit/credit totals for a date range; should always sum to zero.
- Profit & Loss — revenue and expenses over a date range.
- Balance Sheet — assets, liabilities, and equity as of a date, folding the current period's net income into equity so Assets always equals Liabilities + Equity (there's no separate year-end close-out step in this lite ledger).
- AR Aging — unpaid/partially-paid invoices bucketed by how overdue they are (current, 1-30, 31-60, 61-90, 90+ days), computed directly from invoice balances rather than the ledger.
Backfilling entries for data that predates your chart of accounts
If you had invoices or payments recorded before you set up (or re-set-up) your chart of accounts, run:
php artisan accounting:backfill-journal-entries --tenant=<tenant_id>
This re-runs the same automatic posting logic against historical sent invoices/payments that never got a journal entry, without re-touching stock (it only posts the missing ledger entry). It's safe to run more than once — it skips anything that already has an entry.
← All Coravo – AI CRM & ERP Software for Growing Businesses documentation