Payments — Production Guide
Licensing
- Catalog slug:
payments - Category: Billing (
billing) - Free Marketplace opt-in (not auto-installed)
- Catalog flags:
is_default_included = false,is_billable = false, price0,sort_order = 20 - Hard dependency on Invoices — declares a required
module_dependenciesrow oninvoices; Marketplace blocks installing Payments on a workspace that doesn't already have Invoices entitled
Bootstrap
On new workspace create:
installDefaultModules()installs publishedis_default_includedmodules only (Payments is never auto-installed)- Operators must enable Invoices before Payments becomes installable from Marketplace
- Tenant permissions include
payments.*viaconfig/tenant-permissions.php/ default role maps
Permissions rollout
New Payments permissions for existing workspaces ship as an additive data migration using TenantPermissionSynchronizer::grantMissingDefaultRolePermissions([...]) (see database/migrations/2026_07_31_221005_add_payments_permissions.php). Do not re-seed roles.
Monitoring
- Platform audit events:
customer_payment_created,customer_payment_updated,customer_payment_deleted,customer_payment_assigned,customer_payment_status_changed,customer_payment_note_added - Notifications: assignment via
CustomerPaymentAssignedNotification - Posting/voiding a payment updates linked
CustomerInvoicebalances synchronously in the same request — no queued job to monitor
Deploy checklist
- Migrate tables (
customer_payments,customer_payment_allocations,customer_payment_notes,customer_payment_activities) - Register the
paymentscatalog module via migration (DefaultModuleRegistrar) as free Billing opt-in — notdb:seed - Run the
module_dependenciesmigration that linkspayments→invoices(required) - Run the payments permissions migration so default roles receive missing
payments.*grants - Confirm
module:payments+payments.*permissions on target roles - Deploy Frontend SPA with Payments nav (Billing sidebar group, after Invoices) — verify a workspace without Invoices installed cannot install Payments from Marketplace
- Verify posting a payment correctly advances the linked invoice(s) to
partial/paid, and voiding reverses it, in a staging smoke test before rollout - Smoke posted payment: Download receipt PDF + Email receipt (
payments.send) — draft/void must 422