2 min read
What it means
The account had insufficient funds to cover the collection. A Direct Debit or card collection that bounced for lack of balance.
Where you see it
It arrives in the webhook payload:
{
"data": {
"object": {
"id": "pay_7M3X1",
"loan_id": "loan_2K9P4",
"status": "failed",
"failure_code": "insufficient_funds"
}
}
}
How to handle it
Respond supportively: a gentle reminder and hardship signposting, not pressure. The collection is usually re-attempted on schedule.
Reconcile against live state, since webhooks are unordered and a later event may supersede this one.
In practice
Treat insufficient_funds as one branch of your failure_code handling, not the whole story. For payments, the value tells you why a collection failed so you can respond proportionately — a technical failure needs no customer contact, whereas an insufficient-funds failure is a moment for supportive, hardship-aware messaging. Always confirm current state before acting, because a later success event (a retry that cleared) may already have superseded this failure, and webhook delivery is unordered.
Frequently asked questions
Is insufficient_funds final?
Not necessarily — for payments, a later retry may succeed. Reconcile against live loan state before acting.
Should I show this reason to the customer verbatim?
Map it to your own clear, humane copy rather than surfacing the raw code. See Map errors to user-facing messages.
Where does insufficient_funds appear in the payload?
Under data.object.failure_code in the payment.failed webhook. Verify the signature, then branch on it.
Related reading
Funding for UK limited companies
Credicorp lends to your company, not to you personally — short-term working capital with no personal guarantee. See what your business could access.
