hillelcoren/invoice-ninja
Invoice Ninja is an open-source invoicing, billing, and payments platform built on Laravel, with invoices, quotes, recurring billing, expenses, time tracking, projects, a client portal, and dozens of payment gateway integrations.
InvoiceNinja v5.13.50 is a self-hosted Laravel application rather than a drop-in composer package, so "installing" it means cloning the repo and bootstrapping the app:
invoiceninja/invoiceninja, check out v5.13.50, run composer install, copy .env.example to .env, generate the app key, then php artisan migrate --seed. This is a patch on top of v5.13.49, so an existing checkout can simply merge/pull the tag and re-run composer install + php artisan migrate.app/Models/ and app/Repositories/ — almost every feature (invoices, quotes, payments, expenses, reports) is a Model + Repository pair, and the repository is where most of the recent patched logic lives (filters, eager loading, batched chart summaries, user-purge scoping)./api/v1/clients and /api/v1/invoices. Note that v5.13.50 changed the transformers that define available includes, so re-check which ?include= values your client sends.app/Services/Payment/ drivers before anything else — since v5.13.49 the minimum Stripe API version is 2025.basil, so your Stripe SDK/app config must be current.app/Console/Kernel.php (or routes/console.php) early — v5.13.50 touched the scheduler request layer, which is what drives recurring invoices, reminders, and report dispatches.app/Filters/ query filters, not ad-hoc where() calls in controllers.with() arrays in repositories; if a page starts throwing N+1s, fix the repository, not the Blade view. Recent releases have repeatedly patched eager-loading regressions, so treat with() as load-bearing code.include= parameters rather than expecting fat payloads. The company/account transformers were cleaned up in this release; if you add a new relation to the API, expose it as an include in the transformer rather than always serializing it.2025.basil as the minimum, pin your Stripe PHP SDK and test the payment-intent / invoice-download paths. Any code that hand-built a …/invoices/{id}/download URL should use the corrected route.tests/Feature, factories, RefreshDatabase) when you add your own. The suite still skips some FR reporting tests — don't assume French reporting is covered by CI.v5.13.49 → v5.13.50 in a matter of weeks).?include= values on company or account endpoints, diff the transformer include lists after upgrading; some previously available includes may have been renamed or removed. Fail loudly in your client rather than silently rendering empty relations.withoutOverlapping), re-verify them. Also spot-check reminders: v5.13.50 includes fixes to endless reminders, which historically have been the most fragile scheduled path.2025.basil minimum is effectively a breaking change for anyone on an older API version: webhook payload shapes, payment-method handling, and invoice finalization can differ. Re-run your payment test suite against a Stripe test-mode account before deploying.composer update --lock-style checks and re-run your integration suite rather than assuming a no-op.php artisan queue:failed and Horizon for mail/PDF/Stripe jobs; php artisan schedule:list and schedule:test for scheduler issues; Laravel Telescope in non-production for query inspection (very useful for spotting N+1s and lock contention); config/invoiceninja.php and the settings tables for feature toggles that override .env.PaymentDriver implementations in app/Services/Payment/, custom filters in app/Filters/, event listeners on existing model events (Invoice created/sent/paid), additional API includes via transformers, and a private composer package for your own models. Avoid editing Blade views deep in resources/views/ unless you are prepared to re-merge.How can I help you explore Laravel packages today?