# Dispute response

URL: /systems/finance/dispute-response · Id: `capability: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](/business/nouns/startup)’s own records as [Evidence](/business/nouns/evidence). Each [Dispute](/business/nouns/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](/business/nouns/customer) contests delivered work through [`Order.dispute`](/business/nouns/order/dispute).

| Rule | `chargeback` | `outcome` or `marketplace` |
| --- | --- | --- |
| Decided by | The cardholder’s bank: `Dispute.decidedBy` is `issuer` | A [Worker](/business/nouns/worker) uninvolved in the [Order](/business/nouns/order): `worker` |
| Ruling | Won or lost, final | `Dispute.decision` is `buyer`, `seller` or `split` |
| Answer | One submission through [`Dispute.answer`](/business/nouns/dispute/answer) before `Dispute.answerBy` | Evidence before `Dispute.answerBy` |
| Appeal | None | One, by a Worker who took no part: [`Dispute.appeal`](/business/nouns/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`](/business/nouns/invoice/refund) and [`Order.refund`](/business/nouns/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](/business/nouns/dispute/decide) |
| `appealed` | One second review, never for a `chargeback`. | `Dispute.appeal` |
| `closed` | Final, and kept forever. | [Dispute.accept](/business/nouns/dispute/accept), or the final ruling |

`Dispute.answer` builds the Evidence from records: the [Agreement](/business/nouns/agreement) [Version](/business/nouns/version) the buyer accepted, the delivery Evidence, and every [Action](/business/nouns/action) on the Order. To concede, `Dispute.accept` closes the Dispute at once and records the reason as a [Decision](/business/nouns/decision).

| Prevention | How |
| --- | --- |
| Screen first | [Order.screen](/business/nouns/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](/workflows/processes/billing/renewal-notice) writes before every yearly renewal and long trial converts. |

## Verbs
| Verb | Object | Event |
| --- | --- | --- |
| [Dispute.answer](/business/nouns/dispute/answer) | [Dispute](/business/nouns/dispute) | [`Dispute.answered`](/business/events/Dispute.answered) |
| [Dispute.accept](/business/nouns/dispute/accept) | [Dispute](/business/nouns/dispute) | [`Dispute.accepted`](/business/events/Dispute.accepted) |
| [Dispute.decide](/business/nouns/dispute/decide) | [Dispute](/business/nouns/dispute) | [`Dispute.decided`](/business/events/Dispute.decided) |
| [Dispute.appeal](/business/nouns/dispute/appeal) | [Dispute](/business/nouns/dispute) | [`Dispute.appealed`](/business/events/Dispute.appealed) |
| [Order.dispute](/business/nouns/order/dispute) | [Order](/business/nouns/order) | [`Order.disputed`](/business/events/Order.disputed) |

## Interfaces
- [API](/code/api/reference)
- [SDK](/code/sdk/reference)
- [CLI](/code/cli/reference)
- [MCP](/code/mcp/reference)
- Webhooks

## Example
```ts
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))
```