DisputeResolve
Step 2: Resolve dispute
After careful review by the WePay administration team, the dispute is resolved. The decision is sent as disputeDecision.
| Decision | What happens |
|---|---|
PartialRefund | Part of the escrowed amount is refunded. Status becomes PartiallyRefunded. A partial-refund webhook carries the refunded amount, then a partial-refund succeeded webhook is sent when the refund settles. |
FullRelease | The escrowed amount is released. Status becomes Released, and a release webhook carries the released amount. |
These webhooks are sent together for one resolution. They can arrive in any order. Match them with disputeId, and with milestoneId when the dispute is on a milestone.
dispute.resolvedcarriesdisputeDecisionandcomment. It does not includestatusoramount. It includesmilestoneIdonly when the dispute is on a milestone.milestone.disput.resolvedorcontract.disput.resolvedcarries the status change.amounton this event is0. Read the refunded or released amount from the refund or release webhook. The event name isdisput.resolved.- The money-movement webhook:
PartialRefundsendsrefund.partial-initiatedormilestone.refund.partial-initiated(transactionIdis the refund id), then latermilestone.refund.partial-succeeded(transactionReferenceis the original payment reference).FullReleasesendsmilestone.released(transactionReferenceis the original payment reference,amountis the released amount).
comment is the resolution note. disputeId is a string.
Milestone partial refund
milestone.disput.resolved
{
"id": "b9814b02-5920-4b32-9aa9-877ceecfa054",
"event": "milestone.disput.resolved",
"createdAt": "2026-10-06T10:49:57.8567191Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZHR5",
"disputeId": "774",
"disputeDecision": "PartialRefund",
"status": "PartiallyRefunded",
"previousStatus": "Escrow",
"contractStatus": "Approved",
"contractPreviousStatus": "Dispute",
"amount": 0,
"currency": "SAR",
"comment": "testing",
"transactionReference": "trans_01M48D6850BDQ7N5RH77K35KZF",
"timestamp": "2026-10-06T10:49:57.7678822Z"
}
}
dispute.resolved
{
"id": "3bb6b6fc-8a61-4bf2-b009-d437180480d1",
"event": "dispute.resolved",
"createdAt": "2026-10-06T10:49:57.8676609Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZHR5",
"disputeId": "774",
"disputeDecision": "PartialRefund",
"currency": "SAR",
"comment": "testing",
"timestamp": "2026-10-06T10:49:57.8658008Z"
}
}
milestone.refund.partial-initiated
amount here is the amount being refunded. metadata.milestoneId repeats the milestone id.
{
"id": "80f3e99a-34c6-4dae-a232-ac3ae212facd",
"event": "milestone.refund.partial-initiated",
"createdAt": "2026-10-06T10:49:57.9502074Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZHR5",
"status": "PartiallyRefunded",
"previousStatus": "Escrow",
"contractStatus": "Approved",
"contractPreviousStatus": "Dispute",
"amount": 400,
"currency": "SAR",
"transactionId": "1424",
"timestamp": "2026-10-06T10:49:57.9475973Z",
"metadata": {
"milestoneId": "MST-01M48D4SZHR5"
}
}
}
milestone.refund.partial-succeeded
Sent when the partial refund has settled. It carries transactionReference (the original payment), not transactionId.
{
"id": "6b55471a-53d7-4a81-a879-5477c9a196e4",
"event": "milestone.refund.partial-succeeded",
"createdAt": "2026-10-06T10:53:15.5610125Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZHR5",
"status": "PartiallyRefunded",
"previousStatus": "Escrow",
"contractStatus": "Approved",
"contractPreviousStatus": "Dispute",
"amount": 400.00,
"currency": "SAR",
"transactionReference": "trans_01M48D6850BDQ7N5RH77K35KZF",
"timestamp": "2026-10-06T10:53:15.5574041Z"
}
}
Milestone full release
milestone.disput.resolved
{
"id": "6a9212bb-9fc1-4c27-9213-4f517fbef177",
"event": "milestone.disput.resolved",
"createdAt": "2026-10-06T10:55:14.2619952Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZH53",
"disputeId": "775",
"disputeDecision": "FullRelease",
"status": "Released",
"previousStatus": "Escrow",
"contractStatus": "Approved",
"contractPreviousStatus": "Dispute",
"amount": 0,
"currency": "SAR",
"comment": "dispute resolved with full release and reason: testing",
"transactionReference": "trans_01M48DJXFQ731SF5PZKVHN450B",
"timestamp": "2026-10-06T10:55:14.2579313Z"
}
}
dispute.resolved
{
"id": "84e0e304-d5dc-4356-8ca0-0862b38a6c82",
"event": "dispute.resolved",
"createdAt": "2026-10-06T10:55:14.2673122Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZH53",
"disputeId": "775",
"disputeDecision": "FullRelease",
"currency": "SAR",
"comment": "rdhrhtrhtrtryhtr",
"timestamp": "2026-10-06T10:55:14.2640094Z"
}
}
milestone.released
{
"id": "bcd238d1-b5c0-43ec-9a1b-de450a285415",
"event": "milestone.released",
"createdAt": "2026-10-06T10:55:14.2828313Z",
"data": {
"contractId": "CNT-01M48D4SZYAW",
"milestoneId": "MST-01M48D4SZH53",
"status": "Released",
"previousStatus": "Escrow",
"contractStatus": "Approved",
"contractPreviousStatus": "Dispute",
"amount": 1000,
"currency": "SAR",
"transactionReference": "trans_01M48DJXFQ731SF5PZKVHN450B",
"timestamp": "2026-10-06T10:55:14.2792703Z"
}
}
Contract partial refund
A contract without milestones uses contract.disput.resolved and refund.partial-initiated. dispute.resolved has no milestoneId.
contract.disput.resolved
{
"id": "d8ac4673-35b5-4584-9d51-9a24d5e22f76",
"event": "contract.disput.resolved",
"createdAt": "2026-10-06T11:34:12.6752373Z",
"data": {
"contractId": "CNT-01M48FPS2A4R",
"disputeId": "777",
"disputeDecision": "PartialRefund",
"status": "PartiallyRefunded",
"previousStatus": "Dispute",
"amount": 0,
"currency": "SAR",
"comment": "testing",
"transactionReference": "trans_01M48FR847WMRG9HWQQGYCPPJN",
"timestamp": "2026-10-06T11:34:12.6705123Z"
}
}
dispute.resolved
{
"id": "7e8e2409-5ece-45c3-8a14-2bfb52746fec",
"event": "dispute.resolved",
"createdAt": "2026-10-06T11:34:12.6821962Z",
"data": {
"contractId": "CNT-01M48FPS2A4R",
"disputeId": "777",
"disputeDecision": "PartialRefund",
"currency": "SAR",
"comment": "testing",
"timestamp": "2026-10-06T11:34:12.6785388Z"
}
}
refund.partial-initiated
{
"id": "a01842d1-444d-4b01-ab4d-01a670965e05",
"event": "refund.partial-initiated",
"createdAt": "2026-10-06T11:34:12.6957216Z",
"data": {
"contractId": "CNT-01M48FPS2A4R",
"status": "PartiallyRefunded",
"previousStatus": "Dispute",
"amount": 2000,
"currency": "SAR",
"transactionId": "1425",
"timestamp": "2026-10-06T11:34:12.6915178Z"
}
}