Skip to main content

Dispute Management

Source: internal/api/v1/store/Controllers/dispute.js

Overview

The Dispute controller manages Stripe dispute (chargeback) operations including listing, retrieval, evidence submission, and dispute closure. It provides connected account sellers with tools to respond to customer disputes.

Key Capabilities

  • List disputes with filtering and pagination
  • Retrieve individual dispute details
  • Update dispute evidence
  • Submit evidence to Stripe
  • Close disputes
  • Upload evidence files

MongoDB Collections

CollectionOperationsPurpose
_store.disputesRead, UpdateDispute tracking
_accountsReadAccount/business info population

Service Methods

getDisputes

Lists all disputes for the connected account.

Endpoint: GET /store/disputes

Authorization: Requires payments_enabled = true

Query Parameters:

{
page: number,
limit: number,
filter: object // Optional: additional MongoDB filters
}

Response: Paginated dispute list with account/business info

Filtering:

{
account: req.auth.account_id,
connected_account: req.auth.account.stripe_connected_account
}

getDispute

Retrieves a single dispute by MongoDB _id.

Endpoint: GET /store/disputes/:id

Authorization: Requires payments_enabled = true

Response: Dispute object with populated account


updateDispute

Updates dispute evidence and optionally submits to Stripe.

Endpoint: PATCH /store/disputes/:id

Authorization: Requires payments_enabled = true

Request Body:

{
evidence: {
// Stripe evidence fields
customer_name: string,
customer_email_address: string,
billing_address: string,
receipt: string, // File ID from uploadEvidence
customer_signature: string, // File ID
shipping_documentation: string, // File ID
// ... other Stripe evidence fields
},
submit: boolean // Optional: submit evidence to Stripe
}

Response: Updated dispute object

Business Logic:

  1. Find dispute with account access validation
  2. Update Stripe dispute with evidence
  3. Update MongoDB document
  4. Return updated dispute with populated account

closeDispute

Closes a dispute, accepting the dispute loss.

Endpoint: POST /store/disputes/:id/close

Authorization: Requires payments_enabled = true

Response: Updated dispute object

Business Logic:

const dispute = await stripe.disputes.close(dispute.stripe_id, {
stripeAccount: stripe_connected_account,
});

await StoreDispute.findByIdAndUpdate(id, { ...dispute });

uploadEvidence

Uploads evidence files to Stripe for use in dispute responses.

Endpoint: POST /store/disputes/:id/evidence/upload

Authorization: Requires payments_enabled = true

Request: Multipart form data with file

Response: Stripe file object with ID

Business Logic:

const file = await stripe.files.create(
{
purpose: 'dispute_evidence',
file: {
data: req.file.buffer,
name: req.file.originalname,
type: 'application.octet-stream',
},
file_link_data: {
create: true,
},
},
{ stripeAccount: stripe_connected_account },
);

Usage: Returns file ID to be used in updateDispute evidence fields


Business Logic Flows

Dispute Evidence Submission

graph TD
A[Get Dispute] --> B[Upload Evidence Files]
B --> C[Get File IDs]
C --> D[Update Dispute with Evidence]
D --> E{Submit to Stripe?}
E -->|Yes| F[Set submit: true]
E -->|No| G[Save as Draft]
F --> H[Stripe Reviews]
G --> I[Can Edit Later]

Evidence Fields

Common Stripe evidence fields:

  • customer_name: Customer's full name
  • customer_email_address: Customer's email
  • billing_address: Billing address
  • receipt: Proof of purchase (file ID)
  • customer_signature: Signed contract (file ID)
  • shipping_documentation: Shipping proof (file ID)
  • customer_communication: Communication logs (file ID)
  • refund_policy: Refund policy document (file ID)
  • cancellation_policy: Cancellation policy (file ID)
  • product_description: Description of service/product

Edge Cases & Business Rules

1. Connected Account Only

All dispute operations require:

  • payments_enabled = true
  • Valid stripe_connected_account
  • Account and connected_account must match authenticated account

2. Evidence Submission Timing

Evidence can be submitted multiple times until deadline:

  • Draft updates: submit: false or omitted
  • Final submission: submit: true
  • Cannot modify after submission deadline

3. File Upload Requirements

  • Purpose must be 'dispute_evidence'
  • File buffer from multipart form
  • Creates file link automatically for sharing

4. Dispute Status Tracking

Stripe dispute statuses:

  • warning_needs_response: Evidence required
  • warning_under_review: Evidence submitted, under review
  • warning_closed: Closed, won
  • lost: Dispute lost
  • won: Dispute won

💬

Documentation Assistant

Ask me anything about the docs

Hi! I'm your documentation assistant. Ask me anything about the docs!

I can help you with:
- Code examples
- Configuration details
- Troubleshooting
- Best practices

Try asking: How do I configure the API?
09:31 AM