Receiving payments

Capture incoming money — M-Pesa, bank, cash — reconcile it to the right lease, and hand it to allocation.

Finance → Receivables → Payments → /payments · Receive Pay → /receive-pay

There are two surfaces for money coming in:

SurfaceUse it for
PaymentsThe full ledger of received payments — search, reconcile, refund, allocate, report.
Receive PayThe 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.

  1. Find the unit

    Search by unit name. The screen shows the outstanding items with their Due Amount.

  2. Enter what was paid

    Paid Amount, Paid Date, Paid By, the Bank Account the money landed in, and any Notes.

  3. Submit

    The payment is recorded against the unit's lease and becomes available for allocation.

Recording a payment from the Payments list

  1. Add a payment

    Payments → Add.

  2. 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.

  3. Enter the money

    Amount, paid date, payment type (mobile money, bank transfer, cheque, cash), and the receiving bank account.

  4. 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.

  5. 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:

ColumnMeaning
Paid Date / Paid AtWhen the money was received.
Paid ByWho paid.
Paid AmountGross received.
Allocated AmountHow much has been applied to invoices.
Available AmountWhat is left to allocate — the wallet contribution.
# Units AllocatedHow many units the payment was spread across.
Confirmation #The external reference.
Payment TypeMethod.
Bank / Bank Account Name / NumberWhere the money landed.
OriginHow the payment entered the system (counter capture, import, integration).
Property / Block / UnitWhere it applies.
Invoice # / Invoice Amount / Invoice Date / Invoice StatusThe invoice side, on allocated rows.
ArchivedWhether the record has been archived.
Auto-AllocateWhether this payment is Allowed into automatic allocation, or On hold.
Bank BalanceThe 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 doesWhat 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:

SectionWhat it tells you
The moneyThe 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.
JourneyReceived → matched → allocated → settled, with the step it stopped at shown as a state, not just a colour.
Why it stoppedIf the allocation engine passed this payment over, its reason is stated above the fold rather than buried in a run log.
What happenedOne 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.
BillsThe invoices it settled, and for how much.
RefundsSee Refunds from a payment below.
DocumentsThe receipt, deposit slips and screenshots.
RelatedThe 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:

  1. Open the payment and expand Refunds

    Existing refunds are listed with their amount, date and reason.

  2. Add a refund

    Enter the refund amount, the bank account it is paid from, the refund date, and a reason.

  3. 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

  1. Filter by bank account and date range

    Work one account and one statement period at a time.

  2. Match on confirmation number

    Not on amount. Amounts repeat; references do not.

  3. 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.

  4. Check the wallet position

    After matching, filter on available amount to confirm nothing is sitting unallocated.

Common problems

SymptomCause and fix
Tenant insists they paid; nothing on their statementThe 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 oneSafaricom 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 paymentNot allocated.
Payment appears twiceCaptured manually and imported. Archive the duplicate rather than deleting a record that has already been allocated — reverse the allocation first.
Negative wallet on a leaseAn over-allocation from a legacy path. Report it; do not adjust balances by hand.

Next steps