laravel-billing maintained by proovit
Proovit Laravel Billing
Laravel 13 billing package for invoices, quotes, payments, credit notes, public invoice sharing, PDF rendering, and API-driven billing workflows.
Need to certify invoices, keep a proof trail, or publish business evidence online? See ProovIT.
What this package gives you
- Eloquent models with a stable
uuid_identifierroute key - Single-action HTTP controllers grouped by concern
- Form requests and JSON resources split by domain
- Draft, finalize, payment, credit note, quote, and quote-to-invoice flows
- A PDF pipeline that works with Eloquent models or with plain DTOs
- Optional database-backed mode or fluent document builder mode
- Configurable storage disk and directory for generated invoice files
- Translatable labels and package translations
- Optional Scramble documentation at
docs/api/billing - Optional signed public sharing for invoices
Requirements
- PHP 8.3
- Laravel 13
- Composer
Install
composer require proovit/laravel-billing
php artisan billing:install
The installer can:
- enable or disable the database-backed stack
- enable or disable the API
- install and configure Sanctum if you want
auth:sanctum - publish package resources when requested
- enable or disable signed public invoice links
- enable or disable Scramble documentation
Quick examples
Full stack
config([
'billing.database.enabled' => true,
'billing.api.enabled' => true,
'billing.api.auth_middleware' => ['auth:sanctum'],
'billing.public_shares.enabled' => true,
'billing.docs.enabled' => true,
]);
Fluent document builder
$document = \Proovit\Billing\Builders\Documents\InvoiceDocumentBuilder::make()
->withSeller([
'legal_name' => 'ProovIT SAS',
'display_name' => 'ProovIT',
'address' => ['line1' => '1 rue de Paris', 'city' => 'Paris', 'country' => 'FR'],
])
->withCustomer([
'legal_name' => 'Acme Ltd',
'reference' => 'ACME-001',
'billing_address' => ['line1' => '2 avenue des Tests', 'city' => 'Lyon', 'country' => 'FR'],
])
->addLine([
'description' => 'Consulting',
'quantity' => '1',
'unit_price' => '250.00',
'tax_rate' => '20',
])
->withNumber('INV-2026-0001')
->withIssuedAt(now())
->withDueAt(now()->addDays(30))
->withLocale('en')
->validate()
->build();
$pdf = app(\Proovit\Billing\Actions\Invoices\GenerateInvoicePdfAction::class)->handle($document);
If you already have a fully normalized draft and totals object, you can still build the immutable document DTO directly with InvoiceDocumentData::fromDraft(...).
The fluent builder is the recommended public API for applications that do not want to pass a large DTO object around by hand.
Documentation
Use cases
- Customers
- Invoices
- Quotes
- PDF rendering
- Sample PDF output
- Web preview and print
- Document builder mode
- Storage
- Public sharing
- Demo data
- Scramble documentation
Repository layout
src/Actions/Customersfor customer workflowssrc/Actions/Invoicesfor invoice, payment, credit note, and PDF workflowssrc/Actions/Quotesfor quote workflows and quote conversionsrc/Http/Controllers/Apifor API controllerssrc/Http/Requests/Apifor API validationsrc/Http/Resources/Apifor JSON responsessrc/Http/Controllers/Webfor web preview and public sharing controllersdatabase/factoriesfor package factoriesdatabase/seedersfor demo and sample data seedersresources/views/pdffor the PDF HTML viewresources/views/webfor browser preview and print viewsdocs/for package documentationMakefilefor common local and Sail-based tasks
Release notes
1.0.1
- Added a downloadable sample PDF generated from the default invoice Blade views
- Refined the classic invoice layout and page spacing
1.0.0
- Added optional database-backed and fluent document builder billing modes
- Added PDF document DTOs and offline PDF generation support
- Added configurable invoice storage disk and directory
- Added optional resource publication in the installer
- Added Scramble grouping by concern
- Added English docs with user-facing examples
- Added web preview and print views for invoices
- Added package factories and a demo seeder
- Added a package-local Makefile for QA and Sail workflows
Notes
- HTTP access uses
uuid_identifier, not the numeric primary key. - Controllers are single-action
__invokeclasses. - Scramble docs are exposed on a configurable path so they do not overwrite the host application's docs.
- AI, MCP, and Filament documentation belongs to their respective packages, not this one.
- The package
Makefileonly covers package-local QA; sandbox commands live at the repository root.
Acknowledgements
The package builds on the Laravel ecosystem and related tooling: