Resolving a dispute
How an admin works a P2P dispute — reading the evidence, the four outcomes and exactly what each does to the escrow, the guards that stop a second ruling, and what to do when the money has already gone.
A dispute is a decision about somebody else's money, taken on incomplete
information, that cannot be undone. The screen is at /admin/p2p/dispute and
needs view.p2p.dispute to read and edit.p2p.dispute to rule.
The queue
Each row shows the trade, the amount, who filed, who it is against, the reason, the priority and the age. Three statuses:
| Status | Meaning |
|---|---|
PENDING |
filed, unclaimed |
IN_PROGRESS |
an admin is working it |
RESOLVED |
ruled, and the escrow settled — or withdrawn by the trader who filed it |
Priority is assigned automatically at filing — HIGH for
FRAUDULENT_ACTIVITY, PAYMENT_NOT_RECEIVED or an amount above 1000; MEDIUM
above 100; LOW otherwise — and cannot be changed afterwards.
Move a dispute to IN_PROGRESS before you start. It moves no money and it is
the only signal other admins have. Two people working the same case ends with
one ruling silently losing to the other — and the loser is whoever ruled first,
because the second attempt is now blocked by the already-resolved guard.
Claiming a case has a second effect now: it stops the filer withdrawing it. See below.
The traders can see how long they have been waiting
The trade room shows both parties a clock beside Under review: how long it has been since the dispute was opened, and how much of your stated target remains. That target is Dispute Review Target (hours) on P2P settings, 48 hours by default.
It is worth setting to something you can meet. Before it existed, "under review" read identically at hour two and hour thirty and the trader's money was frozen behind it, so the only way to find out whether anything was happening was to open a support ticket — a second queue, staffed by you, asking about the first one. Past the target the room says the case is overdue, which is a promise you have visibly missed; raise the number rather than let that be the normal state.
Nothing resolves when the clock runs out. An escrow decided by a timer would pay somebody out on silence alone.
Cases that withdraw themselves
A trader can withdraw a dispute they filed, from the trade room, and a case that disappears from your queue with the outcome WITHDRAWN is one of these rather than something you missed.
It is deliberately narrow: only the trader who filed it, and only while the
dispute is still PENDING. Once you move it to IN_PROGRESS you are reading
evidence and forming a decision, and the button is gone — a case cannot be
pulled out from under you, including by a filer who has been talked into it.
Nothing is unwound, because nothing had moved: filing a dispute writes a row and
changes the trade's status, and withdrawing puts the status back. The record
stays — the trade keeps its disputedAt stamp, the timeline keeps both the
opening and the withdrawal, and the dispute keeps its evidence and messages with
a resolution reading WITHDRAWN. The same trader can file again if the matter
turns out not to be settled, which is what makes the button safe to offer.
Most of what this removes from your queue is the same case: a buyer files the moment a seller goes quiet, and the payment lands or the seller answers minutes later. Those used to sit until somebody read them.
What you are looking at
Opening a dispute gives you everything on one screen:
- The trade — amount, price, total, currency, wallet type, both parties, the offer it came from, and the current escrow status.
- The timeline — the authoritative record. Every status change with its timestamp, every chat message with its author, every admin action.
- The payment details snapshot — what the buyer was actually told to pay, taken at the instant the trade opened. This is the agreement; anything sent in the chat afterwards is not.
- The evidence — what the filer attached, plus anything an admin has added.
- The messages — the dispute's own thread, separate from the trade chat.
- Admin notes — internal, never shown to users.
You can add evidence yourself (images), post a message that both parties see and are notified about, and record internal notes. Notes are where your reasoning should go; the notification a user receives is short and the audit entry is structured rather than narrative.
Reading a case
The three questions that decide almost every P2P dispute:
Not "was it sent". Not "does the screenshot look right". A screenshot proves a screen existed. Ask the seller to state plainly whether the funds are in their balance and settled. If the rail has a chargeback window, "arrived" is not the same as "safe", and a seller who released early has no recourse — the trade is terminal.
Third-party payments are the most common shape of P2P fraud: the buyer pays with someone else's stolen account, the seller releases, the real owner reverses it. Compare the sending account against the buyer's identity, and the receiving details against the snapshot on the trade — not against anything posted in the chat.
Timestamps are hard to argue with. When was payment declared? How long did the
seller wait? Was there a message thread at all, or did one side go silent? A
BUYER_UNRESPONSIVE claim against a buyer who posted a payment reference within
two minutes is not a strong case.
Where the record genuinely does not settle it, SPLIT exists. It is not a
cop-out — it is the correct answer when both parties acted in good faith and
something outside the platform failed.
The four outcomes
Both the dispute door and the trade force-resolve door offer the same four, and both route through the same escrow authority, so they cannot disagree about what a word means.
| Outcome | Escrow settlement | Trade ends as | Platform fee | Offer capacity |
|---|---|---|---|---|
BUYER_WINS |
whole escrow to the buyer | COMPLETED |
charged | not restored |
SPLIT |
divided by an explicit buyer share | COMPLETED |
charged on the buyer's share only | not restored |
SELLER_WINS |
escrow back to the seller | CANCELLED |
none | restored |
CANCELLED |
escrow back to the seller | CANCELLED |
none | restored |
SELLER_WINS and CANCELLED are identical in their money effect. The
difference is what the record says and what both parties are told: one is a
finding, the other is "this trade should not have happened".
Setting a split
Two ways, and one takes precedence:
| Field | Meaning | Range |
|---|---|---|
buyerPercentage |
percentage of the escrow the buyer receives — wins if both are sent | 0–100 |
buyerShare |
absolute gross amount to the buyer, in the trade currency | 0 to the escrowed amount |
Neither given: an even 50/50 split. The authority clamps whatever you ask for to what is genuinely held, so an over-large share cannot overdraw the escrow.
The fee is taken from the buyer's share only, and never from the seller's remainder — a seller getting their own funds back is not taxed for it.
What actually happens when you rule
One transaction:
- The escrow settles through the single authority, which locks the trade,
guards on
escrowStatusso it can be paid out at most once across every door, charges the fee, syncs ecosystem chain ledgers forECOwallets, and draws down the parent offer's attributed escrow. - On
SELLER_WINSorCANCELLED, the offer's advertised capacity is restored — capped at its original total and, for a SELL offer, at the escrow genuinely still held, so it can never re-advertise liquidity that has left. - The trade moves to
COMPLETEDorCANCELLED, withresolutionrecording the outcome, your notes, your user id, the timestamp, and the real figures the settlement produced. DISPUTE_RESOLVEDis appended to the trade timeline.- The dispute is marked
RESOLVEDwithresolvedOnand the same figures. - Activity and admin-audit entries are written inside the transaction, so a failure rolls the log back with the money.
After the commit: a WebSocket status broadcast to whoever has the trade open, and notifications to both parties.
The ordinary cancellation notice names one of the traders as the canceller and only reaches the other side. An admin ruling is neither, so both parties get a direct message naming the verdict and the amount returned — or saying plainly that no funds were held at the time of resolution.
The guards
Four refusals you will meet, all of them deliberate.
If your own account is the buyer or the seller, the ruling is refused with a 403. Use another admin.
Marking a dispute RESOLVED without an outcome is refused with a 400.
Closing the case without one used to leave the trade DISPUTED and its escrow
stranded with nothing left to settle it.
A resolved dispute cannot be re-ruled. A second ruling returns 409: "This dispute has already been resolved and its escrow settled. Re-open it before recording a different outcome." The money was never at risk — the escrow authority settles once — but the recorded outcome, the resolver and the notes were being overwritten, so the audit trail showed the last ruling rather than the one the funds actually followed. Re-opening is a deliberate act: change the status first, then rule.
A ruling that moves nothing says so. The response carries a settlement summary, and where nothing moved it adds a warning — either "this trade's escrow had already been settled" or "no escrow was held for this trade". Both mean the ruling is recorded but the money is not where the ruling says it is.
When the escrow has already gone
This is the case that needs a human answer rather than a button.
It happens when the seller released before the dispute was filed, when the expiry cron returned the funds, or when another admin resolved the trade from the trades screen. The dispute is still open, and there is nothing left to settle.
What to do:
-
Read the timeline and establish where the money went and under which event.
escrowStatuson the trade tells you the shape:RELEASEDmeans it was paid out,REFUNDEDmeans it went back. -
Record the ruling anyway, with the outcome that reflects your finding and a note explaining that the escrow was already settled. The dispute must not be left open — an open dispute is a promise to somebody that a decision is coming.
-
Handle any correction outside P2P. There is no P2P door that credits a user without a held escrow, and there must not be. Use the platform's own wallet tooling, and record what you did and why in the dispute's admin notes so the two records agree.
-
If it was fraud, act on the account rather than only on the trade. Blocking the account is a core-platform action; leaving them able to post offers is what turns one dispute into ten.
The same applies to a complaint about a trade that already completed normally.
COMPLETED is terminal precisely so a settled trade cannot re-enter the escrow
money path — a second payout would be drawn from whatever else the seller was
holding, which in practice is another offer's escrow and another customer's
money.
Keeping the desk honest
- Rule from the timeline, not the chat's tone. The loudest party is not usually the wronged one.
- Write the note before you press the button. If you cannot state the finding in two sentences, you are not ready to move somebody's money.
- Do not promise an outcome in a dispute message. Both parties see those, and a message that pre-announces a ruling makes the eventual notification look like a reversal.
- Watch the 3-per-24-hours dispute limit. A user pinned against it is either being systematically defrauded or is the problem. Both are worth investigating before the next case lands.