Company
- name · slug
- timezone
- 1—n User
- 1—n SaleOrder
- 1—n AccountMove
Laravel ERP covering inventory, billing and CRM for growing teams.
Odoo set a model for ERPs: modules you install as you need them, record-level access rules and several companies in one instance. But it ties you to Python and its own framework. Laroo asks the question: can that modular logic live in the Laravel ecosystem?
Deliver lightweight ERP modules (stock, billing, CRM) on Laravel.
A Laravel 12 monolith split into 24 Odoo-style modules, each with its module.json manifest, dependencies and service provider. A manager installs modules in dependency order. Business logic lives in about a hundred services connected by events, and multi-company works through the /app/{company}/… URL and global Eloquent scopes.
An ERP online with a back office, customer portal and REST API: CRM, sales and purchasing, valued inventory, accounting, HR, manufacturing and quality, marketing, and a Studio to add fields and views without code. Differences from Odoo are documented module by module.
Lead developer
Users
Application
External services
The /app/{company}/… request checks the user has access to it, then sets the current company.
Confirming a sales order fires the SaleOrderConfirmed event.
A listener queues the confirmation e-mail to the customer.
Validating the stock move computes the cost (FIFO or average) and updates quantities, in a single transaction.
Listeners create the valuation entries and, when needed, quality checks.
Posting checks that debit and credit balance to the cent, then marks the entry as posted.
The main entities, their key fields and their relations.
Kanban pipeline, lead scoring and assignment rules.
Orders, receipts, blanket orders and price lists.
Moves, lots, replenishment, FIFO or average costing.
Journal entries, bank reconciliation, credit notes, recurring entries, reminders.
Leave, attendance, payroll; bills of materials, manufacturing orders, quality checks.
Custom fields, views and automated actions without code.
ProblemEvery query must only see the current company’s data, except what is explicitly shared.
FixA global scope that also accepts records shared through a dedicated table.
ProblemTwo invoices created at the same moment could get the same number.
FixRow lock (lockForUpdate) on the sequence.
ProblemA half-validated move left quantities and valuation out of sync.
FixCost layers consumed and quantities updated in a single transaction.
ProblemThe current company only lived in the session, which made links ambiguous.
FixRouting redesign: the company is in the URL and in the route defaults.
ProblemSome sensitive controllers didn’t always check permissions.
FixSystematic authorisation, Form Requests and webhook signature checks.
Taken from the project’s source code and Git history on 8 October 2026. No usage or revenue figures are published.
Available for PHP / Laravel / WordPress / Silverstripe missions in Belgium and remote EU.