{
"id": "evt_wth004",
"type": "withdrawal.failed",
"data": {
"sideshiftAccountId": "user_a1b2c3d4",
"externalId": "ext_user_456",
"amountCents": 25000,
"feeCents": 0,
"netAmountCents": 25000,
"currency": "usd",
"paymentId": "wdrl_abc123",
"status": "failed",
"metadata": {
"withdrawalId": "wdrl_abc123",
"errorCode": "account_closed",
"errorMessage": "The receiving bank rejected the transfer because the account is closed.",
"previousStatus": "in_transit"
}
},
"timestamp": "2026-05-13T05:00:00.000Z"
}Withdrawalfailed
Derived alias of withdrawal.updated for the terminal states where the money did not arrive: failed (the
payout was returned, usually by the receiving bank), denied (SideShift or the payout provider refused it), and
canceled with a metadata.errorCode (the bank or payout provider rejected the payout and the funds went back
to the user’s balance). Unlike withdrawal.completed, status is NOT normalized — read it to tell them apart.
metadata.errorCode and metadata.errorMessage carry the underlying reason when the payout provider supplies
one, which is what makes this event triageable without asking the user what happened.
A canceled withdrawal without an errorCode was canceled by the user. It is not a failure and is delivered on
withdrawal.updated only. All of these states are terminal: the withdrawal will not transition again.
A withdrawal.completed subscription implies this event — if you asked to hear when a payout lands, you receive
the bounce too, with no subscription change. Ignore unknown type values and this is a no-op until you handle it.
{
"id": "evt_wth004",
"type": "withdrawal.failed",
"data": {
"sideshiftAccountId": "user_a1b2c3d4",
"externalId": "ext_user_456",
"amountCents": 25000,
"feeCents": 0,
"netAmountCents": 25000,
"currency": "usd",
"paymentId": "wdrl_abc123",
"status": "failed",
"metadata": {
"withdrawalId": "wdrl_abc123",
"errorCode": "account_closed",
"errorMessage": "The receiving bank rejected the transfer because the account is closed.",
"previousStatus": "in_transit"
}
},
"timestamp": "2026-05-13T05:00:00.000Z"
}