Finance → Receivables → Payments → /payments · Receive Pay → /receive-pay
There are two surfaces for money coming in:
| Surface | Use it for |
|---|---|
| Payments | The full ledger of received payments — search, reconcile, refund, allocate, report. |
| Receive Pay | The fast counter-style capture flow: pick the unit, see what is due, take the money. |
Receiving a payment at the counter
Receive Pay is built for someone taking money with a tenant in front of them.
Find the unit
Search by unit name. The screen shows the outstanding items with their Due Amount.
Enter what was paid
Paid Amount, Paid Date, Paid By, the Bank Account the money landed in, and any Notes.
Submit
The payment is recorded against the unit's lease and becomes available for allocation.
Recording a payment from the Payments list
Add a payment
Payments → Add.
Identify the payer
Select the lease or unit. This determines whose balance the money lands on, so get it right — correcting the subject later is more work than choosing it now.
Enter the money
Amount, paid date, payment type (mobile money, bank transfer, cheque, cash), and the receiving bank account.
Record the reference
The Confirmation # — the M-Pesa code, bank reference or cheque number. This is what makes the payment reconcilable against a bank statement later. Do not leave it blank.
Save, then allocate
Saving records the cash. It does not settle any invoice until it is allocated. See Allocations.
The payments list
Useful columns include:
| Column | Meaning |
|---|---|
| Paid Date / Paid At | When the money was received. |
| Paid By | Who paid. |
| Paid Amount | Gross received. |
| Allocated Amount | How much has been applied to invoices. |
| Available Amount | What is left to allocate — the wallet contribution. |
| # Units Allocated | How many units the payment was spread across. |
| Confirmation # | The external reference. |
| Payment Type | Method. |
| Bank / Bank Account Name / Number | Where the money landed. |
| Origin | How the payment entered the system (counter capture, import, integration). |
| Property / Block / Unit | Where it applies. |
| Invoice # / Invoice Amount / Invoice Date / Invoice Status | The invoice side, on allocated rows. |
| Archived | Whether the record has been archived. |
| Auto-Allocate | Whether this payment is Allowed into automatic allocation, or On hold. |
| Bank Balance | The account's own balance straight after the payment, as the bank reported it. |
On the Bank Statement view, money is split across Money In and Money Out — exactly one of the pair carries a figure on any row and the other is left blank, which is what makes it read like a statement.
Filter on Available Amount > 0 to find every payment still waiting to be allocated. That single filter is the fastest way to clean up a messy receivables position.
Holding a payment back from automatic allocation
Sometimes a payment should not be matched automatically — it is disputed, it is somebody else's, or it is waiting on a decision. Rather than switching automatic allocation off for the whole property, hold back the single payment.
Don't Auto-Allocate is available on the Suspense Account and Wallet Credits lists (tick the rows first) and on an individual payment's menu. You are asked for a note, because the person who finds the payment in three weeks is usually not the person who held it.
| What holding does | What it does not do |
|---|---|
| Background matching and the Auto-Allocate and Pay From Wallet buttons skip it. | It does not archive the payment — it stays in the list with the same balance. |
| The row shows On hold, with your note in the tooltip. | It does not stop you allocating it by hand. |
| Allow Auto-Allocate releases it back into the queue. | It is not irreversible. |
The payment record page
Every payment now has a page of its own at /payments/<uuid>, reachable by clicking the payment
anywhere it is referenced. It is the surface to open when somebody disputes a payment, because it
answers the whole question in one place instead of across five panels:
| Section | What it tells you |
|---|---|
| The money | The whole figure, then where every shilling of it went — allocated, refunded, still unapplied. Figures are exact, never rounded for display, because they get reconciled against a bank statement. |
| Journey | Received → matched → allocated → settled, with the step it stopped at shown as a state, not just a colour. |
| Why it stopped | If the allocation engine passed this payment over, its reason is stated above the fold rather than buried in a run log. |
| What happened | One ordered account of the payment: the receipt, the payer's own forwarded proof, every engine pass, allocations and their reversals, refunds, receipts sent, and any hand edits. |
| Bills | The invoices it settled, and for how much. |
| Refunds | See Refunds from a payment below. |
| Documents | The receipt, deposit slips and screenshots. |
| Related | The lease, unit, resident and bank account it touches, as chips you can open. |
The older drawer is still what opens from a grid row; the page is where the drawer's open full page link takes you.
The code the payer actually holds
On a bank-relayed M-Pesa transfer — money that reaches you through a bank feed rather than straight from Safaricom — the Confirmation # is the bank's reference. The tenant has never seen it. What they have is the M-Pesa code on their own phone, and until recently that code existed nowhere on the record.
It is now captured as the M-Pesa Code, and it behaves as a real lookup key:
- On the grids it is a column on all three payment lists. It is hidden by default because the visible-column budget is spent, so switch it on from the column chooser, or filter on it without showing it.
- On the record it is printed only when it differs from the confirmation number. On a direct M-Pesa payment the two are the same string, and printing it twice would read as two facts.
- In the filter and in global search one box takes either code. Nobody handed a payment code knows which kind they were handed.
Refunds from a payment
Refunds are managed directly from the payment:
Open the payment and expand Refunds
Existing refunds are listed with their amount, date and reason.
Add a refund
Enter the refund amount, the bank account it is paid from, the refund date, and a reason.
Save
Guards check that the amount is actually available and that a bank account is set before the refund can be recorded.
See Refunds for the full refunds ledger and its controls.
Bulk import of payments
Historical or bank-exported payments can be imported through Admin → Bulk Upload with the Payments type. The importer validates before committing and keeps a per-row outcome so you can see exactly what was created, skipped and rejected. See Bulk upload.
Reconciling to the bank
Filter by bank account and date range
Work one account and one statement period at a time.
Match on confirmation number
Not on amount. Amounts repeat; references do not.
Investigate anything unmatched
Money in the bank with no payment record means a receipt was never captured. A payment record with no bank line means it was captured twice or against the wrong account.
Check the wallet position
After matching, filter on available amount to confirm nothing is sitting unallocated.
Common problems
| Symptom | Cause and fix |
|---|---|
| Tenant insists they paid; nothing on their statement | The payment was captured against a different unit or lease. Search by confirmation number, not by tenant — and note the search box also accepts the M-Pesa code the payer holds, which on a bank-relayed transfer is not the confirmation number. |
| Payer says the M-Pesa prompt was refused seconds after a successful one | Safaricom refuses a second push for the same amount from the same phone to the same paybill within a short window — its own duplicate guard, not a limit on their account. The checkout now names the earlier payment and asks them to wait rather than reporting it as an account problem. Paying a different amount, or waiting a minute, goes through. |
| Invoice still unpaid after a payment | Not allocated. |
| Payment appears twice | Captured manually and imported. Archive the duplicate rather than deleting a record that has already been allocated — reverse the allocation first. |
| Negative wallet on a lease | An over-allocation from a legacy path. Report it; do not adjust balances by hand. |