Invoice Payments

NexusRMS provides comprehensive payment tracking for every invoice. You can record manual payments, accept online card payments via Stripe, or let clients self-report payments they have already made. Each payment is assigned a unique payment number and linked to the invoice for full financial reconciliation.

Recording a manual payment

Open any invoice and click Record Payment to open the payment dialog. Fill in the following fields:

  • Amount (required) — The payment amount. Defaults to the invoice's amount_due for convenience.
  • Payment Date (required) — The date the payment was received. Defaults to today.
  • Payment Method (required) — Select from the 18 available payment methods (see below)
  • Reference Number — A reference such as a cheque number, bank transfer reference, or transaction ID
  • Notes — Any additional details about the payment

When you submit the payment, the system auto-generates a payment number in the format PAY-YYYY-#### (e.g., PAY-2026-0001). The recordPayment() method on the invoice updates amount_paid and amount_due, and changes the invoice status to partial (if some balance remains) or paid (if the invoice is fully settled, with paid_date set to now).

Manual payment methods (cash, check, bank_transfer, card) are automatically marked as completed on creation. Electronic payment methods go through processing first.

Payment methods

NexusRMS supports 18 payment methods via the PAYMENT_METHODS constant:

  • cash — Cash
  • check — Check/Cheque
  • bank_transfer — Bank Transfer
  • card — Credit/Debit Card
  • stripe — Stripe (online card payment)
  • paypal — PayPal
  • square — Square
  • direct_debit — Direct Debit
  • standing_order — Standing Order
  • bacs — BACS
  • faster_payments — Faster Payments (UK)
  • sepa — SEPA (EU)
  • ach — ACH (US)
  • wire — Wire Transfer
  • xero_sync — Synced from Xero
  • quickbooks_sync — Synced from QuickBooks
  • sage_sync — Synced from Sage
  • other — Other

The last three methods (xero_sync, quickbooks_sync, sage_sync) are used when payments are pulled from your accounting software via the two-way integration. These payments include the corresponding sync ID (xero_payment_id, quickbooks_payment_id, or sage_payment_id) and the synced_at timestamp.

Payment statuses

Every payment tracks its own status, independent of the invoice status:

  • pending — Payment recorded but not yet confirmed
  • processing — Payment is being processed by the payment provider
  • completed — Payment successfully received. The markAsCompleted() method sets processed_at and updates the invoice totals.
  • failed — Payment attempt failed. The markAsFailed(reason) method records the failure_reason for audit purposes.
  • refunded — Payment has been refunded. The refund(?amount) method reverses the payment on the invoice (and on the payment plan installment if linked).
  • cancelled — Payment was cancelled before completion

Payment record fields

Each Payment record stores comprehensive transaction data:

  • payment_number — Unique identifier (PAY-YYYY-####)
  • invoice_id — The invoice this payment applies to
  • client_id — The client who made the payment
  • payment_plan_installment_id — Links to a specific PaymentPlanInstallment if the payment is part of a structured payment plan
  • amount and currency — Payment amount and currency
  • payment_date and processed_at — When the payment was made and when it was processed
  • reference_number — External reference (cheque number, transfer ref, etc.)
  • transaction_id — Payment processor transaction ID
  • payment_processor — The processor used (stripe, paypal, square)
  • processor_response — Full JSON response from the payment processor, stored for audit and troubleshooting
  • processing_fee — Fee charged by the payment processor
  • bank_name — Bank name for bank transfers and cheques
  • receipt_url — URL to the payment receipt or proof of payment
  • notes — Client-visible payment notes
  • internal_notes — Staff-only payment notes
  • failure_reason — Reason for failed payments

Stripe online payments

When an invoice has online_payment_enabled set to true and Stripe Connect is configured, clients can pay directly from a secure public payment page (InvoicePayment.vue).

Generating the payment link

The getOrCreatePaymentToken() method creates a unique public_payment_token for the invoice. The getPaymentUrl() method returns the full payment page URL using the tenant's domain. The canAcceptOnlinePayment() method verifies that the invoice is in a payable status (draft, sent, viewed, partial, or overdue), has an amount_due greater than zero, and has online payments enabled.

Client payment page

The public payment page presents two tabs:

  1. Pay by Card — Powered by Stripe Elements with secure card input fields, a lock icon indicating secure payment, and real-time validation. The payment is processed via a Stripe PaymentIntent, with stripe_payment_intent_id and stripe_payment_status tracked on the invoice.
  2. I've Already Paid — For clients who have already sent payment via another method. This tab offers a payment method selector (Bank Transfer, Cheque, Cash, PayPal, Direct Debit, Other), a reference number field, and a notes field. Submitting this form calls markAsPaidByClient(note), which records client_marked_paid_at and client_marked_paid_note. The invoice status does not change automatically — a staff member must verify and record the actual payment.

Payment history

The invoice detail page includes a payment timeline showing every payment recorded against the invoice. Each entry displays the payment date, amount, payment method, reference number, and status. A running balance shows how the amount_due decreases with each payment.

Refunding a payment

To refund a payment, open the payment record and click Refund. You can refund the full amount or enter a partial refund amount. The refund() method:

  1. Sets the payment status to refunded
  2. Reverses the payment amount on the invoice (increases amount_due)
  3. If the payment was linked to a payment plan installment, reverses the amount on that installment as well

Accounting synchronisation

Payments synced from accounting software are marked with the synced_from_accounting flag and include the external payment ID (xero_payment_id, quickbooks_payment_id, or sage_payment_id). The synced_at timestamp records when the sync occurred. This prevents duplicate recording of payments that originate from your accounting system.

Tips

  • Enable Stripe for faster collections — Invoices with online payment enabled get paid significantly faster than those requiring manual bank transfers.
  • Verify client-reported payments promptly — When a client uses the "I've Already Paid" option, the invoice remains in its current status until you verify and record the actual payment. Check your bank statements and record the payment to keep your records accurate.
  • Record reference numbers — Always enter the cheque number, bank transfer reference, or transaction ID. This makes reconciliation much easier when reviewing payment history.
  • Use internal notes for context — Record any special circumstances (e.g., "Payment split across two bank transfers" or "Partial refund issued due to damaged item") in internal notes for future reference.
  • Review processing fees — The processing_fee field helps you track the true cost of accepting card payments, which is useful for financial reporting and pricing decisions.

Next steps

Continue to the next article to learn how to create and manage credit notes for returns, billing errors, and other adjustments.

Was this article helpful?