16 September 2026 · Development preview
An accounting starter for invoices, bills and stock
PHP Ledger 0.4.0-preview connects customer and supplier accounting with optional Purchasing and Inventory. Start with fictional records, follow a document into its payment and journal, and tell us where the workflow needs attention.
What can you follow from beginning to end?
A customer invoice can become a partial receipt, a linked credit and a final payment, with the outstanding amount visible throughout.
Supplier bills follow the corresponding payable workflow. Shared party records can represent a customer, a vendor or both. Each document retains its source and accounting trail; remaining receivable and payable amounts come from the authoritative open-item ledger. The ageing report can look back to a chosen date, and control reconciliation compares that detail with the general ledger. Payments also use the existing bank CSV matching workflow. Matching a bank row to an existing payment does not create another accounting entry.
AR and AP belong to the required core. A service business can hide unused navigation while its permissions, accounting services and report balances remain intact. Optional vertical modules can build on these shared receivables and payables. A future distributor's route, delivery and collection tools should reuse AR rather than invent a second customer balance.
How do purchasing and inventory fit together?
A purchase order records what was ordered; a goods receipt records what arrived; the later supplier bill records what is owed.
An order has no journal effect. Partial receipts add stock at the reviewed net order cost and record received-but-unbilled clearing. A later AP bill matches the received quantities. Explicitly reviewed price or rate differences go to a selected variance account, preserving the receipt's recorded cost. Returns connect the physical movement with the appropriate supplier credit and matching history.
Inventory provides shared products, one stock location, immutable movement history, moving weighted-average valuation, counts and reviewed adjustments. A stock invoice issues goods and records their cost through the central posting service. The existing cash POS remains its own sample cash-sale flow; it does not deduct shared stock. Multiple warehouses, batches, serials, expiry, landed cost and manufacturing are later work.
What does manually configured tax mean?
The owner enters tax codes, dated rates and their input/output accounts, then chooses whether prices include or exclude tax.
For a fictional 10% example, exclusive entry of 100.00 gives net 100.00, tax 10.00 and total 110.00. Inclusive entry of 110.00 produces the same split. This is an arithmetic example, not a country's rate. Documents retain their reviewed mode and tax snapshot; credits preserve the original tax basis. The first engine does not determine applicability, withholding, nonrecoverable treatment or statutory filing obligations.
Try a small service-business experiment
Use a separate fictional company with zero opening balances, one currency and no tax for this exercise.
Complete the company's opening setup and use dates in an open period after its cutover date. Select ordinary service income and expense accounts, the appropriate AR/AP controls and one cash/bank account. In the hosted demo, use the prepared Accounting starter playground and inspect its starting balances before adding activity; the empty-book totals below apply only to the stated baseline.
| Step | Action | Expected remaining amount |
|---|---|---|
| Customer invoice | Post 1,000.00; receive 400.00 | AR 600.00 |
| Customer credit | Credit 100.00; receive the final 500.00 | AR 0.00; total receipts 900.00 |
| Supplier bill | Post 300.00; pay 120.00 | AP 180.00 |
| Supplier credit | Credit 30.00; pay the final 150.00 | AP 0.00; total payments 270.00 |
With no other activity, the bank closes at 630.00 and net profit is 630.00. Inspect the journals, document balances and control reconciliation. Run ageing as of the date after the partial payment and before the credit to see the earlier outstanding position. Use distinct accounting dates if you want that historical comparison.
For a separate stock exercise, order ten units at 10.00, receive six and then four, and match a 100.00 supplier bill. Stock should be ten units valued at 100.00, with zero received-but-unbilled clearing. Selling five units at 20.00 creates a 100.00 invoice and 50.00 cost of sales, leaving five units valued at 50.00. These figures assume one currency, no tax or other movements.
Which demo choice should you open?
Choose Accounting starter playground for the new module flows. The other four choices preserve the existing multi-year teaching histories.
The playground is a focused synthetic workspace, not a fifth deep historical dataset. The four older packs and their reporting guides retain their original assumptions. Each visit has a private sample company; records and access expire with the hourly reset. Enter no personal information or real business books. Opening and bank administration exercises may require a separate self-hosted test installation because the public demo restricts sensitive administrative operations.
How should you install or upgrade?
Download the exact release archive, verify its SHA-256, and follow the included INSTALL.md or UPGRADE.md.
Use PHP 8.2+ with the required extensions, MySQL 8.4, HTTPS and command-line access. PHP 8.3 is recommended. The package includes production dependencies. Expose only www/phpledger/public. There are 26 migration receipts, including nine additive migrations numbered 017–025 after the 0.3.0 foundations. Preserve the existing migration checksums, stop application and worker traffic during upgrade, and rehearse restoring a matched code/database/configuration backup.
Existing unpaid opening evidence requires explicit party mapping and exact reconciliation before conversion. Supported stock openings likewise need reviewed product mapping. These conversions tie details to the existing opening journal; they do not post the opening amounts twice. Ambiguous or already-used bases can be rejected.
The download page provides the package size and checksum. The versioned implementation record describes the tested scope and remaining gates. Website publication does not upgrade an existing installation.
What remains outside this starter?
Advances, unapplied credits, overpayments and cash refunds are not included. Manual document and settlement rates are supported, but outgoing payments from foreign-currency bank accounts remain blocked; automated rate feeds, revaluation and consolidation are later work.
There is no public financial write API/MCP, automatic bank feed, payment processor, document scanner or enabled outbound connector. Quotes remain a separate future plugin. New country account catalogues, expanded synthetic companies and UX changes are research and review work, not features in this release. Qualified accounting review, observed operator use and supported reporting packages remain separate acceptance gates.
Share a result someone else can reproduce
Record the version, fictional starting balances, module choices, steps, expected result and actual result. Include the document and report dates when a balance differs.
Use the issue tracker for reproducible defects and Discussions for workflow feedback. Keep credentials and real records out of either. General bookkeeping education is available in the learning library; hosting and recovery guidance lives under Self-hosting.
Frequently asked questions
Are receivables and payables included in the core?
Yes. AR/AP are required core modules. Owners can hide their navigation without disabling services or changing reports. Purchasing and Inventory are bundled optional modules.
Does the tax engine select country rules?
No. Codes, dated rates and input/output tax accounts are configured manually. Exclusive or inclusive prices are supported, but country applicability, statutory forms and e-filing are outside this release.
Does the cash POS use Inventory?
The existing cash POS showcase does not deduct shared stock. Stock invoice lines use Inventory and post their cost through the shared accounting service.
Which demo should I choose?
Choose Accounting starter playground for the new module flows. Four existing multi-year business histories remain separate teaching datasets. All demo records are fictional and expire with the hourly reset.
