Availability & tier gating
- FREE — no builder (the dashboard hides the section). Invoices render with the standard ArcenPay layout.
- PLUS / PRO — full builder: create, edit, activate, duplicate, and (for custom templates only) delete templates.
- White-label — Plus/Pro can also remove the “Secured by ArcenPay” badge from their embedded billing page (
component-renderenforces this server-side).
How it works
- Seeded default. On first visit, Plus/Pro teams get an active “Classic” template. The seeded default is protected — it can be edited and published but never deleted (
403 PROTECTED_TEMPLATEon delete). - Design. Change colors, font, orientation, logo (PNG/JPEG, uploaded to object storage), section visibility (header, metadata, addresses, items table, totals, footer), column widths, watermarks (e.g.
PAID/OVERDUE) and footer notes. A live PDF preview updates as you edit. - Publish. Activating a template makes it the active design. Only one template is active per environment scope.
- Immutability. The design is snapshotted onto every invoice at its first render. Editing or replacing the template never changes invoices that were already issued.
On-demand PDFs (Stripe-style)
Invoices and receipts are never stored as files. A signed, expiring download URL renders the PDF live from the invoice object:GET /api/v1/invoices/:id/download— issue a signed render URL (dashboard session).GET /api/invoices/public/:id/download?kind=invoice|receipt&exp=…&sig=…— public render endpoint; signature is HMAC-SHA256 overinvoiceId.kind.exp.- Receipts are only available for
PAIDinvoices and derive their number deterministically.
Template endpoints
All template routes require
invoices:read / invoices:write roles. Write routes additionally enforce the invoiceBuilder tier feature (FREE → 402 INVOICE_BUILDER_REQUIRES_UPGRADE).
Object storage
Logos and future assets are stored through a pluggable object store (STORAGE_DRIVER=r2 for Cloudflare R2, local filesystem fallback). Asset reads for rendering go through the same store — no external bucket permissions are needed by your customers.
