proovit / laravel-billing
Laravel 13 billing package for invoices, quotes, payments, credit notes, public invoice sharing, PDF rendering, and API-driven billing workflows.
Requires
- php: ^8.3
- barryvdh/laravel-dompdf: ^3.1
- brick/math: ^0.14.2
- illuminate/contracts: ^13.0
- illuminate/database: ^13.0
- illuminate/support: ^13.0
Requires (Dev)
- dedoc/scramble: ^0.13.17
- larastan/larastan: ^3.9.3
- laravel/pint: ^1.29.0
- orchestra/testbench: ^11.0
- pestphp/pest: ^3.8
- phpstan/phpstan: ^2.1.22
README
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
billing:install is recommended, not required.
You can skip it if you want to start with the package defaults and adjust the config later.
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
If you skip the installer:
- the package still works with its defaults
- you can publish config, views, translations, and routes later
- you can keep the package database-backed or document-builder-only through config changes
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
- Events
- 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.7
- Backfilled UUID identifiers for existing billing records so historical invoices, quotes, payments, and related resources keep resolving Filament URLs
1.0.6
- Improved Scramble response schemas so API documentation shows the real JSON payloads
- Added clearer API and documentation wiring for the billing panel
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.
devis the integration branch; tags are cut frommain.- Core and Filament releases should share the same tag when they are released together.
- If only
filament-billingchanges, use the fourth numeric segment for plugin-only tags. - 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.
Release notes
1.0.7
- Backfilled UUID identifiers for existing billing records so historical invoices, quotes, payments, and related resources keep resolving Filament URLs
Acknowledgements
The package builds on the Laravel ecosystem and related tooling: