Resolving Payments That Couldn't Auto-Match (Reconciliation Queue)
Most provider payments match themselves to an invoice automatically the moment the webhook fires. The reconciliation queue exists for the exceptions — a genuine, verified payment that the automatic matching couldn't confidently assign anywhere.
How a payment ends up here
Every entry in the queue is a signed, real payment from your provider — not a guess or a parent's claim. It lands here when the automatic matcher can't confidently tie it to a specific student's invoice (for example, a transfer reference that doesn't map cleanly to any account).
What staff actually see
Money → Reconciliation opens on a Pending tab. Each row shows the provider (Paystack or Monnify), when it was paid, the provider's own transfer reference, the account reference the money came in against (if any), and the amount — with a running total of everything still waiting to be matched shown at the top of the page. Choosing Resolve on a row opens an inline panel with two choices: Assign to a student, or Not a Fees101 payment.
Searching for and assigning the right student
Choose Assign to a student on the entry.
Type into the search box — it matches by student name or admission number (not by parent name or phone), and only starts searching once you've typed at least 2 characters.
Pick the right student from the matching results shown (each listed with their class and admission number to help tell two similarly-named students apart).
04Optionally add a note — e.g.
how you confirmed this was the right student — which is saved alongside the resolution for later reference.
Choose Assign payment.
Once assigned, the money is applied to the student's oldest open invoice first — exactly the same rule an automatic, auto-matched payment follows. Anything left over after that invoice is covered goes to the student's credit balance rather than disappearing or needing a second manual step.
Gotchas
Assigning is built as an atomic claim: the write only succeeds if the entry is still pending at that exact moment. If two staff members try to resolve the same entry within moments of each other, the loser gets "This payment has already been resolved by someone else, or no longer exists" instead of the money being applied twice — there's no separate manual "claim" button to click first, the protection is built into the Assign/Dismiss action itself.
Running reconciliation on demand
Fees101 also runs an automatic background reconciliation sweep on its own schedule. If a parent reports a payment that hasn't shown up yet and you don't want to wait for the next automatic pass, go to School → Payments and choose Run Now to trigger the same engine immediately.
