arrow_back All features
point_of_sale

Billing & Cashier

Charge, collect, and account for every peso.

Charge, collect, and account for every peso

Billing & Cashier handles the money side of the clinic — what each patient owes, what they have paid, and what is still outstanding. It keeps the cashier's day clear and the books in order.

What it does

Where charges come from

Charges are raised on the visit itself, from the availed-items checklist on the appointment: tick what the patient received and it goes on the bill; untick it and it comes off. Reception, nurses and doctors can all do this, so a bill is never held up waiting for one person.

Because the checklist is the single source of truth, a patient is only ever charged for what was recorded as given — nothing is added behind the scenes. Completing a visit does not raise a charge by itself, so a visit that was never billed simply has nothing owing; record what the patient availed and it appears on their balance.

The cashier's screens are unchanged: charges arrive on the patient's balance the same way, are settled together by reference number, and print on one receipt.

The visit shows its whole bill, not just the open one. Because charges are gathered by the visit's reference number, the appointment lists every charge raised against that visit — settled, voided, or still open, and whether it came from the availed-items checklist or from the laboratory, imaging or the pharmacy counter during the same visit. Each is shown with its lines, discounts, total, amount paid and balance, under a billed/paid/balance summary for the visit, with links through to view or take payment. Nobody has to piece a day together from separate screens to answer what a patient still owes.

A lab test is billed once per visit, however it gets there

A lab test can be billed to a visit from more than one place — a lab order, a repeat order, a checklist service that includes the test, or a package with that service among its components. All of these can happen in any order, including after the fact (ticking a linked service once a test has already been ordered, or unticking it again later).

CareClinic keeps the invariant simple from the cashier's side: one visit is charged for one test once. Whichever line would otherwise double the charge keeps its description and unit price, is marked "billed on another line for this visit", and totals ₱0.00 for that test, so the full record of what was done still appears — nothing is hidden, only the second charge is. A package counts each lab test it includes at that test's share of the package price, not its full list price, so marking a package line never takes off more than the package actually charged for the test. Untick or remove the line that is currently paying for the test and the charge moves to the next eligible line automatically; a re-saved checklist nets out to the same total every time.

The line that keeps the charge is decided in a fixed order, so the answer is always the same for the same set of facts:

  1. A line that has already collected money for it wins outright. Once a charge is partly or fully paid, its lines are not silently discounted out from under the payment.
  2. Otherwise, a checklist service or package pays for it — the price the clinic set on that catalogue item.
  3. Otherwise, the lab order pays for it. A repeat order of a test already billed elsewhere adds nothing further.

Sometimes every line for a test sits on a bill that has already been paid, and each of them was marked "billed on another line" — for instance the checklist service that was paying for it was later zeroed at the cashier. Those paid lines are never changed, so CareClinic adds one new lab line for the test to the visit's open bill instead. The test is then billed exactly once rather than not at all.

A checklist can't rewrite a bill that already has a payment. If the visit's open bill is partly paid, saving the availed-items checklist changes nothing — neither the checklist nor the bill — and shows: "This visit's bill already has a payment, so its lines can't be changed here. Void or refund at the cashier." Removing or replacing a line under a payment would change what the patient has already paid for, so that correction belongs to the cashier. The same applies when a checklist line sits on an earlier bill rather than the visit's current one — a checklist first saved before the visit had a reference number, or a visit whose bill has since been paid in part or in full. If that bill has a payment, the save is refused with the same kind of message. If it has no payment, the old line is removed from it and that bill's total drops accordingly, so re-saving never charges the patient for the same item twice. Lines on a voided bill are left alone. A bill with no payment yet updates as usual. Saving the checklist also gives a visit its reference number if it has none yet, so the lines always land on that visit's own bill.

This applies to lab tests specifically — imaging studies have no equivalent linked-service overlap to guard against.

Why it helps

For the clinic

A reliable record of income and outstanding balances means healthier cash flow and far less guesswork at the end of the day.

For doctors

Doctors can focus on care, confident that the charges for their services are captured accurately.

For staff

The cashier sees exactly what each patient owes and what has been settled, making collections faster and disputes rarer.

For patients

Clear, itemized charges and proper records mean no surprises and an easy way to see what they paid for.

The cashier and outstanding-balance views remain available to your team even if other optional billing features are switched off, so day-to-day collections never stop.

The Cashier role

Cashiers sign in at their clinic's normal subdomain and work from Cashier (/cashier). A Tenant Admin adds one through Staff → New, selects Cashier, and either links the existing user account or creates an account with a temporary password. The staff profile and cashier role are assigned together, so the account can sign in immediately.

The default Cashier role can search patients, review and create charges, collect payments, print receipts, and view or export its transaction list. It can use the billable service and pharmacy lines already presented in the cashier flow, but it cannot browse or manage Pharmacy inventory, change prices or discounts, void charges, manage disbursements, view revenue reports, or open clinical records. A Tenant Admin may create a separate custom role when a clinic deliberately needs a different separation of duties.

Where a clinic also runs Pharmacy Counter, the cashier gets a Pharmacy Queue of counter orders waiting to be paid, oldest first, with the amount due already worked out. A pharmacist who does not hold the cashier's payment permission cannot settle at the counter, so the order comes here instead — which is how a clinic keeps selling and collecting in different hands. A pharmacist who does hold both settles on the spot, and nothing reaches this queue.

Counter takings appear in the revenue report broken out from patient charges, because a walk-in sale is settled in its own right rather than against a patient's account. A sale is only ever one or the other, so nothing is counted twice.

The transactions page, the revenue report and their PDF exports also break takings down by line type — services, packages, laboratory, imaging, pharmacy and miscellaneous. Lab and imaging lines are billed straight from their orders and have their own rows.

Refunds

A cashier can pay back all or part of a payment. A refund is a separate record: the original payment is never edited or flipped to a "refunded" status, so it stays in the day it was taken.

Who can refund

Refunding needs both the Refund payments access and the right to view charges. Refund payments is held by the Tenant Admin only; a clinic can give it to another role deliberately. Taking a payment does not include it, because a refund is money leaving the clinic. Every refund requires a reason. The reason is stored as plain text on the clinic's financial records, so the form tells the cashier not to put clinical details in it. It is kept out of event payloads and logs.

A refund is started from a payment's Refund action on the charge page (/cashier/payments/{id}/refund). The form shows what was received, what has already been refunded and what can still be refunded, and asks for the amount, the method it is paid back by (cash, bank transfer, POS, card, GCash, Maya or other), an optional reference, and the reason. Recording it opens a printable refund slip (/cashier/refunds/{id}). A multi-charge receipt has one payment row per charge, so to refund a whole receipt the cashier refunds each row.

The clinic's two settings

A Tenant Admin sets them in Settings → Cashier (/settings/cashier, for staff who may manage clinic settings).

Whatever the settings, a refund is also refused when the payment is not completed, when it was already refunded in full, when the amount is zero or less, and when the amount is more than what is still refundable.

What a refund does

What a refund does not undo

Pharmacy stock already dispensed, laboratory and imaging orders already performed, and documents already issued all stay as they are. If a clinic wants any of those reversed, that is a separate action.

How it shows in the reports

A refund reduces the day it is paid back, not the day of the original payment.

The certificate payment check

A certificate that requires payment looks at the payment. A payment that has been refunded in full no longer satisfies it; a partly refunded payment still does.

Referral points

When the clinic runs its referral program, an eligible line of a referrer's own charge shows a Pay with points control with the points the line can take. Points become a Referral points discount on that line, separate from other discounts; voiding the charge or removing the line returns them. See Patient Referral Program.

A refund takes back the referral points a visit earned, but only when nothing is still paid on that visit. The points are found through the visit: the refunded charge, the visit it was raised for, the referred patient's active referral, and that appointment's earn. This works even when the earn was written at completion, before anyone paid. A partial refund, or a second charge on the same visit that is still paid, leaves the points alone. When the referrer has already spent some of them, the reversal comes out of their other unspent points; whatever cannot be taken is recorded as a shortfall, and the balance never goes below zero. Under the "keep" reassignment policy, a full refund after a reassignment does not take back the old referrer's points: the clawback follows the current referrer. A visit refunded in full and then paid again does not earn again for the same referrer, because there is one earn per visit and referrer.

Reporting caveats

Deploying refunds

Apply tenant migration 092 on every tenant before the code ships. Without the payment_refunds table the cashier and accounting screens, the certificate payment check and every revenue report fail; only the Platform Admin tenant statistics panel degrades, to gross revenue. Platform migration 062 adds the Refund payments access. There is no mobile or REST refund endpoint: refunding is a web Cashier action only.

When a patient's records are deleted

Charges, payments and receipts survive a patient deletion. The clinic's books have to balance, and accounting obligations outlive a request to be forgotten.

What changes is the name: the patient becomes "Deleted patient #4" everywhere the record appears — invoices, receipts, the outstanding list and revenue reports. Totals are unaffected, so a report run before and after a deletion shows the same figures.

Because of this, a patient with an unpaid balance cannot be deleted. Settle it or void the charge first. The system refuses the request and tells you the amount outstanding, rather than quietly leaving you a balance you can no longer chase or write off against a named patient.

Deploying this update

Run tenant migration 089 on every tenant before deploying this code. Every charge line the new code inserts or updates writes three new columns, so on an un-migrated tenant all of these fail, not just lab billing: adding an item or creating a charge at the cashier, changing a line's brand, pharmacy, imaging and consultation charges, the charge API, the accounting screens and the availed-items checklist. The migration only adds nullable columns and widens the item-type list, so the code being replaced runs unchanged on a migrated database. Migrate first, then deploy. See Laboratory for the details.

apps Back to all features