Skip to main content

DisputeResolve

Step 2: Resolve dispute​

After careful review by the WePay administration team, the dispute is resolved. The decision is sent as disputeDecision.

DecisionWhat happens
PartialRefundPart 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.
FullReleaseThe 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.

  1. dispute.resolved carries disputeDecision and comment. It does not include status or amount. It includes milestoneId only when the dispute is on a milestone.
  2. milestone.disput.resolved or contract.disput.resolved carries the status change. amount on this event is 0. Read the refunded or released amount from the refund or release webhook. The event name is disput.resolved.
  3. The money-movement webhook:
    • PartialRefund sends refund.partial-initiated or milestone.refund.partial-initiated (transactionId is the refund id), then later milestone.refund.partial-succeeded (transactionReference is the original payment reference).
    • FullRelease sends milestone.released (transactionReference is the original payment reference, amount is 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"
}
}