wallet-dispute-message-added

Sent when a message is posted on a wallet dispute, by the holder or by you.

wallet-dispute-message-added tells you that someone wrote on a wallet dispute's thread. The holder and your team share one thread per dispute.

When it fires

When the holder answers a dispute that is needs-more-info, you also receive wallet-dispute-status-changed, because the dispute goes back to under-review. The two events can arrive in either order.

The event is sent as soon as the message is saved. Files attached to the message appear on the thread only once they finish uploading, which can be after the event arrives.

What to do

  • Read the thread with List Wallet Dispute Messages and find the message whose ID is messageId.
  • Ignore messages your own team posted, if you do not need them.

Payload

data is the dispute plus the new messageId. The dispute is as Get Wallet Dispute returns it, without holderId and takenOver, read when the webhook is sent. Fields with no value are omitted. Amounts use the Money object.

FieldTypeDescription
messageIdstringID of the message that was added, for example DM-01JD8E5G7J9L1N3Q5S7U9W1Y3A. Only on this event.
disputeIdstringDispute ID, for example DS-01JD7C3E5G7J9L1N3Q5S7U9W1Y.
walletIdstringID of the wallet the dispute is about.
statusstringWhere the dispute stands. See Dispute statuses.
reasonCodestringWhy the holder disputes the entry. See Reason codes.
disputedAmountMoneyAmount the holder claims. Never more than what could still be claimed when the dispute was filed.
subjectEntryIdstringID of the wallet entry being disputed.
subjectEntryTypestringKind of entry disputed: deposit (a card load) or charge (a spend from the wallet). Absent on older disputes, which are all deposits.
transactionIdstringID of the checkout transaction that paid for the load. Set for deposit disputes only.
holderStatementstringThe holder's own explanation. Always set when reasonCode is other.
responseDueAtstringDeadline for the holder to answer, in ISO 8601 UTC. Set while status is needs-more-info.
outcomestringWhat was agreed. Set when status is accepted. See Outcomes.
agreedAmountMoneyAmount agreed, which can be less than disputedAmount. Set when status is accepted.
declineReasonstringWhy the dispute was declined. The holder sees this text. Set when status is declined.
createdAtstringWhen the holder filed the dispute, in ISO 8601 UTC.
updatedAtstringWhen the dispute last changed, in ISO 8601 UTC.

Dispute statuses

StatusMeaning
openFiled. Nobody has picked it up yet.
under-reviewBeing reviewed, by you or by Payment Labs.
needs-more-infoWaiting for the holder to answer, before responseDueAt.
acceptedFinal. Decided in the holder's favour, with an outcome and agreedAmount.
declinedFinal. Decided against the holder, with a declineReason.
withdrawnFinal. The holder cancelled the dispute.
expiredFinal. The holder did not answer before responseDueAt.
superseded-by-chargebackFinal. The card issuer reversed the payment first, so the dispute no longer applies.

New statuses may be added. Treat a value you do not recognise as "in progress" and fetch the dispute.

Reason codes

CodeMeaning
unauthorizedThe holder says they did not make the transaction.
duplicate-chargeThe holder says they were charged twice.
incorrect-amountThe holder says the amount is wrong.
not-creditedThe holder paid for a load, but the wallet was never credited.
otherAnything else. holderStatement explains it.

Outcomes

OutcomeMeaning
card-refundRefund the card that paid for the load. Deposits only.
wallet-creditCredit the wallet from your funds. Does not reverse the card.
complete-creditCredit the wallet with the load it never received. Deposits only.

Accepting a dispute records the outcome only. Money moves when the dispute is resolved with Resolve Wallet Dispute.

Example

The full request body Payment Labs sends:

{
  "payorId": "6f1c2a7e-4b8d-4e0f-9a3c-2d5b7e9f1a04",
  "event": "wallet-dispute-message-added",
  "timestamp": "2026-04-11T08:40:52.517Z",
  "data": {
    "disputeId": "DS-01JD7C3E5G7J9L1N3Q5S7U9W1Y",
    "walletId": "W-01JC2R4T6V8X0Z2B4D6F8H0K2M",
    "status": "under-review",
    "reasonCode": "incorrect-amount",
    "disputedAmount": {
      "value": 40,
      "wholeValue": 4000,
      "currency": "USD",
      "formattedValue": "$40.00",
      "digits": 2
    },
    "subjectEntryId": "WE-01JD7B1C3E5G7J9L1N3Q5S7U9W",
    "subjectEntryType": "deposit",
    "transactionId": "ST-01JD7A9B1D3F5H7K9M1P3R5T7V",
    "holderStatement": "I loaded $60 but my card was charged $100.",
    "createdAt": "2026-04-10T16:22:05.000Z",
    "updatedAt": "2026-04-11T08:40:51.000Z",
    "messageId": "DM-01JD8E5G7J9L1N3Q5S7U9W1Y3A"
  }
}