Dispute response
Dispute response answers chargebacks and contested deliveries with the Startup’s own records as Evidence, under each Dispute kind’s rules and deadlines.
Dispute response answers chargebacks and contested deliveries with the Startup’s own records as Evidence. Each Dispute kind has its own judge, deadline and remedies.
Contract
A chargeback arrives from Stripe when a cardholder’s bank opens it. An outcome or marketplace Dispute opens when a Customer contests delivered work through Order.dispute.
| Rule | chargeback | outcome or marketplace |
|---|---|---|
| Decided by | The cardholder’s bank: Dispute.decidedBy is issuer | A Worker uninvolved in the Order: worker |
| Ruling | Won or lost, final | Dispute.decision is buyer, seller or split |
| Answer | One submission through Dispute.answer before Dispute.answerBy | Evidence before Dispute.answerBy |
| Appeal | None | One, by a Worker who took no part: Dispute.appeal |
| Held | Dispute.held is the disputed amount, and Dispute.fee leaves the balance with it | Dispute.held is the contested amount |
| Refund while open | Refused by Invoice.refund and Order.refund | Allowed |
| Status | What it means | Moved by |
|---|---|---|
inquiry | The bank asks before it charges back; an answer or a full refund closes it with no fee. | Dispute.answer |
open | Evidence is due by Dispute.answerBy; a missed deadline decides for the buyer. | Stripe, or Order.dispute |
answered | The Evidence is frozen and submitted. | Dispute.answer |
decided | The ruling is in, and the held amount is released or returned. | Dispute.decide |
appealed | One second review, never for a chargeback. | Dispute.appeal |
closed | Final, and kept forever. | Dispute.accept, or the final ruling |
Dispute.answer builds the Evidence from records: the Agreement Version the buyer accepted, the delivery Evidence, and every Action on the Order. To concede, Dispute.accept closes the Dispute at once and records the reason as a Decision.
| Prevention | How |
|---|---|
| Screen first | Order.screen holds or blocks a risky payment before it is charged. |
| Early fraud warning | Order.screen stops fulfillment at once and, at or below the dispute fee, proposes a refund. |
| Refund first | A refund through Invoice.refund before a complaint costs less than a chargeback. |
| No surprise renewals | Renewal notice writes before every yearly renewal and long trial converts. |
Verbs
| Verb | Object | Event |
|---|---|---|
| Dispute.answer | Dispute | Dispute.answered |
| Dispute.accept | Dispute | Dispute.accepted |
| Dispute.decide | Dispute | Dispute.decided |
| Dispute.appeal | Dispute | Dispute.appealed |
| Order.dispute | Order | Order.disputed |
Interfaces
Example
import { $ } from 'startup-builder'
// patentpad.com sold a $300 prior-art search. The buyer's bank opened a chargeback, "product not received",
// and Stripe took $300 plus the $15 fee from the balance. Evidence is due by answerBy.
const [dispute] = await $.Dispute.list({ where: "kind = 'chargeback' and status = 'open'" })
// Answer once, from records: the Agreement Version the buyer accepted, the delivered report and its download log.
await $.Dispute.answer({ dispute: dispute.$id, evidence: ['evidence_agreement', 'evidence_delivery', 'evidence_download'] })
// Weeks later the bank rules for the Startup: Dispute.decided arrives, and the $300 and the fee return.
$.on('Dispute.decided', (event) => console.log(event.data))