← Back to blog
·6 min·The SwyDex team

P2P escrow design — 90 days in production

SwyDex P2P trades have been live since November. ~2,400 trades, 11 disputes, one nasty edge case. Notes:

How escrow works

Buyer signals intent on an ad. Seller funds the escrow account from their custodial wallet. Buyer makes off-platform payment (bank transfer, mobile money). Buyer marks paid. Seller confirms receipt. Escrow releases to buyer.

If seller doesn't confirm, buyer can open a dispute. SwyDex moderators review the chat, payment proof, and on-chain evidence; resolve in favor of one party.

What worked

  • WebSocket-driven trade chat. Latency is good, retries are fine, no third-party dependency.
  • Mandatory KYC for dispute escalation. Buyers and sellers without KYC can trade up to a low cap; disputes require verified identity.
  • Escrow funded BEFORE buyer signals payment. Stops a lot of bad-faith sellers.

What didn't

  • Default trade timeout was too short (15 minutes). Off-platform payments take longer for some payment methods. We extended to 30 by default, configurable per ad.
  • Our chat moderation tools were thin. Disputes take longer than they should because moderators are scrolling through paginated chat. We're building a search + flag-as-evidence UI.
  • The one nasty edge case: a seller marked “trade complete” on a trade where they hadn't actually received payment, then the escrow released. We caught it the next day via a reconciliation alert. We now require a buyer-side “confirm release” click for any trade above $1,000 — if seller is impatient, they can wait a few extra minutes.

What we'd change

The dispute resolution UX is the weakest link. If we started over, we'd build chat + evidence pinning + decision audit trail as one cohesive thing rather than three loosely-coupled features.


More posts