Invoices Module
Tenant customer-billing module on the frozen platform — the first Phase 3 (Billing) module. Mirrors the Quotations / Contracts notes/timeline/assignment pattern, extended with a status-driven balance (amount_paid, amount_credited, balance_due) that the Payments and Credit Notes modules now drive.
No hard dependency. Unlike Quotations/Contracts (which require Opportunities), Invoices has no required module_dependencies row — it can be installed on its own. Contact, Company, and Quotation links are all optional and only validated when their module is entitled.
Naming note: the backend model is
CustomerInvoice(tablecustomer_invoices) — distinct from the platform's own Central billingInvoicemodel (subscription invoices the platform sends to tenants). This module lets a tenant bill its own customers.
Guides
| Audience | Document |
|---|---|
| Operators / workspace users | invoices.md |
| Engineers | invoices.md |
| Production / ops | invoices.md |
| Module Development Standard | module-development.md |
| Reference blueprint | quotations.md |
| Tenant API | ../api/tenant-v1-invoices.md |
Capabilities
- Invoice fields: title, optional contact/company link (with gated New inline create when Contacts/Companies is entitled), optional quotation / estimate / contract links, currency, issue date, due date, notes, terms (workspace default from Settings → Branding)
- Recurring series (weekly / monthly / quarterly / semi-annually / yearly). Next invoice date auto-fills from the issue date plus frequency and can be overridden; later drafts follow the frequency from that date. Stop recurring ends the series without voiding history
- Download invoice PDF (workspace-branded from Settings → Branding: color, logo, company profile, bank details; Tax registration ID from Settings → General when set)
- Email customer after Send (
POST /invoices/{id}/email,invoices.send) — optional PDF attachment; default recipient from linked contact/company; recordsemailedtimeline + tenant email log - Record page lists posted payment allocations when Payments is entitled (
payments.view) - Auto-numbered (
INV-00001; prefix backed by theinvoices_number_prefixtenant setting, defaultINV-— editable under Settings → General → Document number prefixes) - Line items (description, quantity, unit price, tax rate) — subtotal / tax total / total computed server-side
- Balance tracking:
amount_paid,amount_credited,balance_due(read-only via this API —amount_paid/balance_dueare populated by Payments;amount_credited/balance_dueare populated by Credit Notes) - Status workflow:
draft → unpaid → paid | cancelled(POST /invoices/{id}/send,.../voidcancels,.../status) —paidis set automatically as Payments clear the balance; partial payments stayunpaid - Assignment with assignee scoping via
invoices.assign - Notes + domain activity timeline (mirrors Quotations)
- Ask EloSync triage (with AI Assistant entitled): fetch invoice, overdue list, confirmed status / assign / note writes — see AI Assistant
- Trash filtering plus Restore and Delete permanently
- Module licensing (
module:invoices) + Spatie permissions — free Marketplace opt-in (Billing category) - Audit + activity logging; assignment notification
Permissions
invoices.view · create · update · delete · restore · force.delete · assign · send · void
Enable Invoices from Marketplace (free) — no other module is required first. Catalog: slug invoices, category billing, is_default_included = false, is_billable = false, sort_order = 10, version 1.9.1.
Related modules
No hard dependency. Optional: Contacts and Companies (customer pickers only appear/validate when entitled), Quotations (an invoice may optionally reference the quotation it was generated from), Accounting (soft: Send posts Dr AR / Cr Revenue). Payments and Credit Notes both hard-depend on Invoices (not the other way around). See Module Dependencies.
Explicitly deferred
- Multi-currency conversion