Payments
A complete guide to the Payments module — recording patient payments, linking to invoices, tracking payment methods, and reviewing payment history.
Written By Dev010
Last updated 19 days ago
The Payments module records all money received from patients. Every payment is linked to a patient and optionally to a specific invoice, creating a complete financial trail from invoice issuance through to payment receipt. Payment data feeds directly into the Admin dashboard revenue charts and financial summaries.
Accessing the Module
Sidebar → Payments
Direct URL:
https://yourdomain.com/dashboard/paymentsWho can access:
Payments are accessible to Admin and Receptionist roles by default. Adjust in Dashboard → Permissions if needed.
Payments List
The main payments page shows a paginated, searchable list of all recorded payments.
Each row displays:
Patient name
Amount
Payment method
Description
Linked invoice number
Status badge
Transaction ID
Date recorded
Action buttons (edit, delete)
Search
The search bar filters payments by:
Patient name
Transaction ID
Description
Results update as you type.
Payment Statuses
Recording a Payment
Click the Record Payment button on the payments list page.
Required Fields
Optional Fields
Payment Methods
CareNova supports the following payment methods as free text — use consistent naming across your team for clean reporting:
Payment method is a free text field — you can use any value your clinic requires. Standardize the values your team uses to ensure consistent filtering and reporting.
Transaction ID
The Transaction ID field stores the reference number from an external payment system — for example:
Card terminal receipt number
Bank transfer reference
Insurance claim number
Online payment gateway reference
Recording transaction IDs creates a traceable link between CareNova's payment record and the external payment system, making reconciliation and dispute resolution straightforward.
Saving the Payment
Click Save Payment to record. The payment appears immediately in the payments list and is attributed to the patient's payment history.
Recording a payment does not automatically update the linked invoice status to
paid. After recording the payment, return to the invoice and manually set the status topaid. See the Invoices & Billing guide for the complete workflow.
Editing a Payment
Click the Edit button on any payment row to update the record.
All fields are editable including amount, method, transaction ID, linked invoice, and status.
Common edit operations:
Adding a transaction ID that was not available at time of recording
Correcting an amount entry error
Updating status from
pendingtocompletedwhen payment is confirmedRecording a refund by updating status to
refunded
Deleting a Payment
Click the Delete option from the payment row action menu.
A confirmation dialog appears before deletion.
⚠️ Deleting a payment removes it from revenue calculations and the patient's payment history permanently. If a payment was recorded in error, consider updating the status to
failedor adding a corrective note instead of deleting. Only Admin accounts can delete payments.
Linking Payments to Invoices
Linking a payment to an invoice creates a clear financial trail — you can see exactly which invoice a payment settles.
When recording a payment:
In the Invoice field, search by invoice number or patient name
Select the matching invoice from the dropdown
The invoice number appears on the payment record
After recording the linked payment, update the invoice status manually:
Sidebar → Invoices
Find the invoice
Edit → set Status to
paidSet Paid At to the payment date
Save
Partial Payments
CareNova supports recording partial payments against an invoice. If a patient pays in installments:
Record each installment as a separate payment — all linked to the same invoice
Keep the invoice status as
unpaiduntil the full amount is receivedUpdate invoice status to
paidonly when the total invoice amount is settled
To check the total amount paid against a specific invoice:
SELECT i.invoice_number,
i.total_amount as invoice_total,
SUM(p.amount) as total_paid,
i.total_amount - SUM(p.amount) as balance_due
FROM invoices i
LEFT JOIN payments p ON p.invoice_id = i.id
AND p.status = 'completed'
WHERE i.invoice_number = 'INV-XXXX'
GROUP BY i.id, i.invoice_number, i.total_amount;Viewing Payments Per Patient
To review all payments from a specific patient:
Option A — Search by patient name:
Sidebar → Payments
Type the patient name in the search bar
All payments for that patient appear in the filtered list
Option B — Full Profile Sheet:
Sidebar → Patients
Find the patient → View Full Profile
Navigate to the Invoices tab
Review linked invoices and their payment status
Payment History and Reporting
Total Revenue by Payment Method
Useful for reconciling against cash drawers, card terminals, and bank statements:
SELECT payment_method,
COUNT(*) as transaction_count,
SUM(amount) as total_amount
FROM payments
WHERE status = 'completed'
AND created_at >= date_trunc('month', now())
ORDER BY total_amount DESC;Daily Payment Summary
SELECT DATE(created_at) as payment_date,
COUNT(*) as transactions,
SUM(amount) as daily_total
FROM payments
WHERE status = 'completed'
AND created_at >= now() - interval '30 days'
GROUP BY DATE(created_at)
ORDER BY payment_date DESC;Payments Without Linked Invoices
Identify payments that were recorded without being linked to an invoice — useful for reconciliation cleanup:
SELECT p.id, pt.full_name as patient,
p.amount, p.payment_method,
p.description, p.created_at
FROM payments p
JOIN patients pt ON p.patient_id = pt.id
WHERE p.invoice_id IS NULL
AND p.status = 'completed'
ORDER BY p.created_at DESC;Monthly Revenue Summary
SELECT DATE_TRUNC('month', created_at) as month,
COUNT(*) as payment_count,
SUM(amount) as monthly_revenue
FROM payments
WHERE status = 'completed'
GROUP BY DATE_TRUNC('month', created_at)
ORDER BY month DESC;Refunds
CareNova does not have a dedicated refund workflow. To record a refund:
Find the original payment — Sidebar → Payments
Edit the payment
Update Status to
refundedAdd a note in Description explaining the refund reason and date
Save
Also update the linked invoice status back to unpaid if the refund relates to a full reversal:
Sidebar → Invoices
Find the invoice → Edit
Set Status back to
unpaidClear the Paid At field
Save
For partial refunds, record a separate negative-amount expense in the Expenses module to reflect the outgoing amount, and add a note on the original payment record.
Dashboard Integration
Payment data feeds into the Admin dashboard financial widgets:
The Admin dashboard revenue figures are calculated from invoice
status = 'paid'for some widgets and from payment amounts for others. Keep both invoice statuses and payment records in sync for accurate financial reporting.
Database Schema Reference
payments
Indexes are set on patient_id, invoice_id, created_at, and status for fast filtering and reporting queries.
Relationship to Other Modules
Workflow Examples
Standard payment at checkout:
Patient visit complete — invoice already created
Sidebar → Payments → Record Payment
Select patient
Enter amount
Set payment method (Cash / Card)
Link to the invoice
Enter transaction ID if card payment
Save payment
Sidebar → Invoices → find invoice → Edit → Status: paid → Save
Recording an insurance payment:
Insurance company sends payment
Sidebar → Payments → Record Payment
Select patient
Enter amount received from insurer
Payment Method: Insurance
Transaction ID: claim reference number
Link to the invoice
Description: "Insurance payment — [Provider Name] claim [number]"
Save payment
Update invoice status to paid
Recording a partial payment:
Patient pays partial amount today
Record Payment → enter partial amount
Link to invoice
Save — keep invoice status as
unpaidWhen second installment arrives, record another payment linked to the same invoice
Once fully paid, update invoice status to
paid
End of day cash reconciliation:
Run the payment method query above for today's date
Compare Cash total against physical cash drawer
Compare Card total against card terminal daily report
Investigate and correct any discrepancies
Processing a refund:
Find original payment → Edit
Update status to
refundedUpdate description with refund reason and date
Save
Update linked invoice status back to
unpaidArrange actual refund via cash or bank transfer externally
Troubleshooting
Payments not visible in sidebar:
Confirm your role has
billing.viewpermission in Dashboard → PermissionsDoctor and Nurse do not have billing access by default
Invoice status not updating after recording payment:
Recording a payment does not automatically update invoice status
Manually update the invoice status to
paidafter recording the payment — these are two separate steps
Revenue chart not reflecting recent payments:
Confirm payment status is set to
completed— pending and failed payments are excluded from revenue totalsHard refresh the Admin dashboard
Check that the payment
created_atdate falls within the chart's displayed date range
Cannot find invoice in payment dropdown:
The invoice dropdown searches by invoice number and patient name
Confirm the invoice exists — check Supabase → Table Editor → invoices
Confirm the invoice status is not
cancelled— cancelled invoices may be excluded from the dropdown
Duplicate payment recorded:
Do not delete the duplicate if it was an actual transaction
Edit the duplicate and update status to
failedorrefundedwith a note explaining the errorThis preserves the audit trail while excluding it from revenue
Cannot delete a payment:
Payment deletion is restricted to Admin role only
Receptionist can record and edit but not delete payments
Consider updating status to
failedinstead of deleting
Transaction ID missing on card payments:
If the terminal receipt was not available at time of recording, edit the payment later to add the transaction ID
Transaction IDs are not required but are strongly recommended for card and bank transfer payments
Next Step
Continue to the Expenses module guide to learn how to record and track clinic operational expenses in CareNova.