Creating Invoices

Invoices in NexusRMS can be created from scratch or generated directly from an accepted quote. Each invoice tracks its payment status in real time, supports online payment collection via Stripe, and integrates with Xero, QuickBooks Online, and Sage for automated accounting synchronisation.

Creating a new invoice

Navigate to Financial > Invoices and click Create Invoice. Alternatively, open an accepted quote and click Convert to Invoice to pre-fill the form from the quote data.

Invoice form fields

  • Client (required) — Select the client using the autocomplete dropdown. When a client is selected, their default currency, tax rate override, and payment terms are applied automatically.
  • Project (optional) — Link the invoice to a project for financial tracking and reporting
  • Issue Date (required) — The date the invoice is issued. Defaults to today.
  • Due Date (required) — The date by which payment is expected. Calculated automatically when payment terms are selected.
  • Currency — The invoice currency: GBP, USD, EUR, or other configured currencies. Defaults to the client's preferred currency.
  • Payment Terms — Select from your configured payment term templates. Options include due_on_receipt, net_7, net_14, net_30, and net_60. Payment terms follow a three-tier resolution order: project-level terms take priority, then client-level defaults, and finally the tenant-wide default.
  • Notes — Client-visible notes displayed on the invoice PDF
  • Terms & Conditions — Terms and conditions text for the invoice
  • Discount Percentage — A global discount applied to the subtotal
  • Tax Rate — The default tax rate, typically 20% for UK VAT. Overridden by client-level settings if configured.
  • PO Number — The client's purchase order reference number
  • Online Payment Enabled — Toggle to allow clients to pay this invoice online via Stripe

Invoice number

The invoice number is auto-generated when you save. It uses the prefix from Configuration > Financial Settings (default INV-) followed by an auto-incrementing four-digit sequence (e.g., INV-0001). Database-level locking prevents duplicate numbers.

Creating from a quote

When creating an invoice from scratch, a Quote Selection Dialog allows you to import line items from any accepted quote for the selected client. This pre-fills the invoice with the quote's line items, client details, and financial settings.

Invoice line items

Each invoice line item (InvoiceItem) shares the same core fields as quote line items, with additional fields for tracking and grouping:

  • Name — The display name of the item
  • Description — Detailed description of the item or service
  • SKU — Stock keeping unit reference
  • Quantity — Number of units billed
  • Unit — Unit of measurement
  • Unit Price — Price per unit
  • Discount Percentage / Discount Amount — Per-line discount
  • Taxable — Whether this item is subject to tax
  • Tax Rate — Item-specific tax rate
  • Start Date / End Date — Rental period dates
  • Sort Order — Display order on the invoice
  • Metadata — JSON field for additional item data

Additional InvoiceItem fields

  • quote_item_id — Links back to the original QuoteItem if the invoice was created from a quote, maintaining full traceability
  • sub_project_id — Associates the line item with a specific sub-project for grouped invoice display
  • group_label — A text label used for visual grouping of related items on the invoice
  • group_subtotal — The subtotal for a group of related items

Section headers

To visually group items on an invoice, create a line item with item_type set to section_header and a group_label. The isSectionHeader() method checks whether a line is a grouping header. Section headers appear as bold dividers on the invoice PDF, making it easy for clients to see costs broken down by sub-project or category.

Quick Add Equipment

The Add from Equipment dialog lets you browse your equipment catalogue and add items with pre-filled names, SKUs, and rental rates, just as with quotes.

Summary calculations

The invoice summary displays the following values, all calculated automatically:

  • Subtotal — Sum of all line_total values
  • Discount — Global discount applied as a percentage or fixed amount
  • Tax — Tax calculated on the discounted subtotal
  • Total — Final invoice amount: subtotal − discount + tax
  • Amount Paid — The total of all completed payments recorded against this invoice
  • Amount Due — The remaining balance: total − amount_paid

Sending an invoice

Click Send to Client to email the invoice with a PDF attachment. The markAsSent() method sets sent_at and changes the status to sent. When the client opens the invoice, markAsViewed() records the first_viewed_at and viewed_at timestamps, and the status changes to viewed.

Invoice statuses

Invoices progress through the following statuses:

  1. draft — Invoice is being prepared
  2. sent — Invoice has been emailed to the client
  3. viewed — Client has opened the invoice
  4. partial — One or more payments received, but amount_paid is less than total
  5. paid — amount_paid equals or exceeds total; paid_date is set
  6. overdue — The due_date has passed with an outstanding balance. The isOverdue() method checks this condition, and days_overdue is calculated automatically.
  7. cancelled — Invoice has been voided, with cancelled_at, cancellation_reason, and cancelled_by recorded
  8. refunded — All payments have been refunded

Payment reminders

For overdue invoices, the system tracks reminder_sent (boolean), reminder_sent_at (timestamp), and reminder_count (number of reminders sent). Payment reminders can be sent manually or configured to send automatically.

Internal notes and auto-save

Use the Internal Notes field for staff-only comments. Like quotes, the invoice form auto-saves drafts to localStorage and offers draft restoration if you return to an unsaved form.

Tips

  • Use the quote-to-invoice flow — Converting from an accepted quote ensures consistency and provides a complete audit trail from proposal to payment.
  • Set payment terms at the client level — Clients with default payment terms automatically get the correct due date when you create an invoice, saving you from manual calculation.
  • Enable online payments — Toggling online_payment_enabled adds a "Pay Now" button to the client-facing invoice, reducing the time between sending and receiving payment.
  • Use section headers for multi-stage projects — If your invoice covers multiple sub-projects, add section headers to group line items by stage. This makes invoices clearer and easier for clients to review.
  • Monitor overdue invoices daily — The Financial dashboard shows overdue invoices with days_overdue. Send reminders promptly to maintain healthy cash flow.

Next steps

Continue to the next article to learn how to record payments, manage payment methods, and accept online payments via Stripe.

Was this article helpful?