Mode A — your static QR / bank details
The default mode, and the one that needs no code from you: the partner shows the borrower your payment details, the borrower pays your account, and Fieldproof's operations team verifies the partner's proof before anything is booked or emitted.
You provide (once per environment, at onboarding)
- Your static UPI QR image and/or UPI ID
- Bank account details (account name, number, IFSC) for borrowers who transfer instead of scanning
You build
We provide
- Your QR / UPI ID / bank block rendered in the partner app at the borrower's door
- Proof upload from the partner and OCR-assisted UTR / amount reading
- Operator verification before anything is booked
- The ledger record and the
payment.collectedevent after verification
Mode A artefacts are configured by Fieldproof ops in the CRM Integrations tab. Sandbox and production are separate: at go-live you supply the production QR / UPI ID / bank details again — nothing carries over from sandbox.
The flow
- The partner opens the payment step and shows the borrower your QR, UPI ID or bank details in the app. Cash is not offered — the app removes it for external-organisation cases.
- The borrower pays. Money lands in your account immediately; Fieldproof never sees or touches it.
- The partner records the collection — amount, payment mode (usually
upi) — and uploads the payment proof. Nothing is emitted yet. The case holds the partner's claim pending verification. - Fieldproof's operations team verifies the proof, with OCR reading the UTR and amount to assist the operator.
- On verification the ledger row is written and
payment.collectedfires, carrying the operator-confirmed amount — which may differ from what the partner claimed. Trust the event. If the verified amount clears the outstanding,case.closedfollows withstatus: "collected",reason: "full_settlement". - A rejected proof emits nothing — no
payment.collected, no correction event. From your side a rejected claim never existed.
{
"sourceLoanNumber": "LN-2026-0001",
"caseId": "CC-2026-2388ED42",
"amount": 3000,
"mode": "upi",
"reference": "UTR2026081812345",
"totalCollected": 3000,
"outstandingAfter": 9500,
"collectedAt": "2026-08-18T09:30:12.000Z"
}
amountis the incremental verified figure in whole INR rupees;totalCollectedandoutstandingAfterare absolute for the case.modeis the mode the partner recorded — usuallyupi.referenceis the UTR where it could be extracted, otherwisenull. Do not make your booking depend on it being present.
:::warning Before verification, GET /cases shows an unverified claim
GET /api/v1/partner/cases/{sourceLoanNumber} lists the last 20 visits with
amountCollected, paymentMode and paymentReference. Until operations
verify a proof, that visit's amountCollected is the partner's unverified
claim. Never book money into your ledger from the case snapshot — book only
from payment.collected, which exists only for verified money.
:::
Reconciling on your side
Pair each payment.collected with the matching credit in your bank statement
— by amount and by reference (the UTR) when present, by amount and
collectedAt when not. Because verification is operator-gated, treat the event
as your bookkeeping truth and the bank statement as its audit pair; a credit
that never produces an event, or an event you cannot pair, is a support
escalation to [email protected] with the eventId — not something to
resolve by guessing. Full detail in Reconciliation.
:::tip Sandbox
The sandbox has no simulated field agents, so nobody uploads proofs by
themselves. Ask [email protected] to run a Mode A verification against
one of your sandbox cases — you will see the payment.collected (and, on full
clearance, case.closed) land at your sandbox webhook and in
GET /cases/updates, exactly as in production.
:::
Want confirmations without an operator in the loop? That is Mode B — links minted on your own gateway, confirmed by you.