Skip to content

Chargeback evidence for Stripe merchants

Every chargeback, answered before the deadline.

Disputely lists your open Stripe disputes by due date, assembles the evidence each reason code asks for, writes a narrative that states only facts in the packet, and submits it through Stripe when you say so.

$29 a month, flat. Never a share of what you win. Free for 3 disputes a month.

du_1Q8xLmB2eZvKYlo2C0aTn3fPNeeds response

Evidence due in

6 days 14 hours left

Stripe due_by 10 Oct 2026, 23:59 UTC

Amount
$184.00 USD
Customer
Mara Okafor
Order
LG-20417
Charged
9 Sep 2026
Reasonproduct_not_received
Completeness6 of 7 · 86%

Missing shipping_documentation: upload the carrier’s delivery scan.

Narrative: 11 facts verified, 1 claim removed.

A packet page in the demo. Larkspur Goods and Mara Okafor are synthetic; the dispute is a Stripe test-mode dispute.

A dispute is a deadline with paperwork attached, and the paperwork takes the better part of an hour.

  • 7–21 days: to answer a dispute with an evidence packet the bank can read. Stripe gives the exact due date on each one.

  • About 12 percent: Manual representment wins roughly 12% of the time.

    Vendor-published figure.

  • 25 percent: of everything recovered, with no cap, is what the leading automation vendor takes.

01How it works

Four steps, with the deadline on screen the whole time.

Follow one synthetic dispute through: Mara Okafor says her $184.00 order never arrived, and Larkspur Goods has six days and fourteen hours to answer.

  1. 01rk_test_… · 4 read, 1 write

    Connect Stripe with a restricted key

    Create a restricted key in your Stripe Dashboard with read access to disputes, charges, customers and payment intents, and write access to disputes. Paste it into Settings. Disputely encrypts it at rest with a key derived for your organisation and never shows it in full again.

    Settings · Stripe connectiontest mode

    Restricted API key

    rk_test_51Q8x••••••••••••••Zt3a

    Permissions the restricted key needs
    ResourcePermission
    DisputesWrite
    ChargesRead
    CustomersRead
    PaymentIntentsRead
    Everything elseNone

    Encrypted at rest with a key derived for your organisation. Shown only as its last four characters.

  2. 02disputes.list · charge.dispute.*

    Sync disputes with their deadlines

    A sync lists your disputes and pulls the charge, payment intent, customer and receipt, plus the shipping address and line items where Stripe Checkout was used. Stripe’s dispute webhooks keep it current between syncs. Open disputes sort by due date, with the time left in days and hours.

    Disputes · open, soonest deadline firstsynced 09:12 UTC
    • 2 days 5 hours left
      Theo Lindqvist$62.50
      fraudulent
    • 6 days 14 hours left
      Mara Okafor$184.00
      product_not_received
    • 13 days 2 hours left
      Priya Nair$24.00
      subscription_canceled

    webhook charge.dispute.updated · du_…aTn3fP · evidence_details refreshed

  3. 03playbook: product_not_received

    Assemble the packet by reason code

    Each reason code has a playbook: the evidence fields the bank looks for, and which of your records fill them. Disputely fills what it can from Stripe and your library (policies and where customers saw them, product descriptions, message logs, tracking numbers), scores completeness, and lists what is still missing.

    product_not_received6 of 7 required
    • customer_nameStripe customer

      Mara Okafor

    • shipping_addressCheckout session

      14 Alder Lane, Portland, OR 97211

    • shipping_carrierShipment record

      USPS

    • shipping_tracking_numberShipment record

      9400 1112 0261 7840 2210 55

    • shipping_dateShipment record

      2026-09-12

    • customer_communicationMessage log

      2 messages, 18 Sep 2026

    • shipping_documentation

      Missing: carrier delivery scan (PDF or image, up to 5 MB)

    Also included

    • refund_policy· Policy library
    • refund_policy_disclosure· Policy library
    • uncategorized_text· Narrative, verified
  4. 04disputes.update(id, { evidence, submit: true })

    Review, submit, track

    One page holds the countdown, the playbook, every field with its source, the checked narrative and a PDF preview. When you confirm, Pro submits through the Stripe Disputes API; on Free you submit from the PDF. Webhooks mark the outcome won or lost.

    Confirm submission

    Send this packet to Stripe for du_…aTn3fP?

    Stripe accepts one submission per dispute. After this, the evidence cannot be edited.

    fields
    10
    attachments
    2 files
    narrative
    665 / 2,500 chars
    Timelinedu_…aTn3fP
    1. 4 Oct 2026 · 10:42 UTC

      SubmittedUnder review

      Snapshot of the sent packet saved.

    2. charge.dispute.closed

      Won$184.00

      Counted in the win rate for product_not_received.

02The narrative

The narrative never states a fact that isn’t in the packet.

A model writes the bank-facing summary from the assembled evidence. Then a check that has nothing to do with the model runs over it: every date, amount, name and tracking number must match a field in the packet. Anything that does not is removed, and flagged so you can see what was cut.

  • Facts from the packet only
  • Under 2,500 characters
  • No guesses about motive, no legal threats
uncategorized_text665 / 2,500 chars

On 9 September 20261, Mara Okafor2 ordered a linen duvet cover (queen, oat) from Larkspur Goods for $184.003, order LG-204174. The order shipped with USPS5 on 12 September 20266 under tracking number 9400 1112 0261 7840 2210 557 and was delivered on 16 September 20268 to 14 Alder Lane, Portland, OR 972119, the shipping address given at checkout. Removed claim: The customer confirmed receipt by email on 17 September 2026. On 18 September 202610 the customer emailed to ask how returns work, and Larkspur Goods replied the same day with its 30-day11 return policy, which was shown at checkout above the Pay button. The carrier record shows delivery to the address the customer provided, which does not support the claim that the order was not received.

Fact check11 verified
  1. 19 September 2026Stripe chargecreated
  2. 2Mara OkaforStripe customername
  3. 3$184.00Stripe chargeamount
  4. 4LG-20417Stripe chargemetadata.order_id
  5. 5USPSShipment recordcarrier
  6. 612 September 2026Shipment recordshipped_at
  7. 79400 1112 …2210 55Shipment recordtracking_number
  8. 816 September 2026Shipment recorddelivered_at
  9. 914 Alder Lane …Checkout sessionshipping_details
  10. 1018 September 2026Message logoccurred_at
  11. 1130-dayPolicy libraryrefund_policy

Removed and flagged

17 September 2026 does not appear anywhere in the packet. The message log has one email from the customer, dated 18 September. The sentence is left out of what Stripe receives and kept here so you can see what was cut.

Highlighted: a date, amount, name, address or tracking number that matched a field in the assembled evidence. Struck through: a claim the check could not match. Synthetic demo dispute.

03Reason-code playbooks

Eight reason codes, eight different packets.

A bank reading a product_not_received dispute wants tracking and a delivery scan. One reading subscription_canceled wants the cancellation terms and proof of use. Each playbook names the Stripe evidence fields that matter and fills them from your records.

  • fraudulent

    The cardholder says they did not make the purchase.

    Proof the buyer was the cardholder.

    • billing_address
    • customer_purchase_ip
    • shipping_address
    • access_activity_log
  • product_not_received

    They paid and say nothing arrived.

    Carrier, tracking and the delivery scan.

    • shipping_carrier
    • shipping_tracking_number
    • shipping_date
    • shipping_documentation
  • product_unacceptable

    It arrived, but they say it was faulty or not as described.

    What you described, your refund policy and where they saw it.

    • product_description
    • refund_policy
    • refund_policy_disclosure
    • customer_communication
  • subscription_canceled

    They say they cancelled before the charge.

    The cancellation terms they accepted, and use after the date they claim.

    • cancellation_policy
    • cancellation_policy_disclosure
    • cancellation_rebuttal
    • access_activity_log
  • duplicate

    They say one purchase was charged twice.

    The other charge, and why the two are separate.

    • duplicate_charge_id
    • duplicate_charge_explanation
    • duplicate_charge_documentation
  • credit_not_processed

    They say a refund you promised never came.

    Your refund terms and why this order did not qualify.

    • refund_policy
    • refund_policy_disclosure
    • refund_refusal_explanation
    • customer_communication
  • unrecognized

    They do not recognise the charge on their statement.

    A receipt and proof the account holder received it.

    • customer_name
    • customer_email_address
    • receipt
    • shipping_documentation
  • general

    Any reason that does not fit the others.

    A clear account of the purchase and what was said.

    • receipt
    • customer_communication
    • uncategorized_text

04Pricing

$29 a month. Not a quarter of what you win.

Percentage pricing grows with your success and never stops. A flat fee does not care how much you recover.

Free3 disputes a month, manual submit
$0
Prounlimited, one-click submit
$29

Compare plans in detail

Fees on an example month with $4,800 recovered

Recovered from won disputesexample month
$4,800
25% of recoveries, uncappedthe leading automation vendor’s fee
$1,200
Disputely Pro, flatthe same every month
$29

You keep, on a percentage

$3,600

$14,400 a year in fees at this rate

You keep, on Disputely Pro

$4,771

$348 a year, whatever you win

Drawn to scale: the full track is $4,800. $4,800 is an example month, not a customer result. 25% of recoveries with no cap is the fee the leading automation vendor takes.

In fairness to percentages: one costs nothing in a month you win nothing, and $29 does not. The flat fee is the cheaper of the two once you recover more than $116 in a month, and Free costs nothing for up to three disputes a month.

05Outcomes

What is due next, and what you won.

The dashboard leads with open disputes by deadline and the amount at stake, then your win rate by reason code and the dollars recovered, from Stripe’s own outcomes.

Open, by deadline$480.50 at stake
  • 2 days 5 hours left
    Theo Lindqvist$62.50
    fraudulentpacket 4 of 6
  • 6 days 14 hours left
    Mara Okafor$184.00
    product_not_receivedpacket 6 of 7
  • 9 days 20 hours left
    Jonah Adeyemi$210.00
    product_unacceptablepacket 2 of 5
  • 13 days 2 hours left
    Priya Nair$24.00
    subscription_canceledpacket 5 of 5
Win rate by reasonlast 90 days
  • product_not_received5 of 6
  • subscription_canceled3 of 4
  • fraudulent2 of 5
  • product_unacceptable1 of 3
Recoveredlast 90 days

$2,318.40

11 won · 7 lost · median packet 93% complete

Won × 11
Example workspace for the fictional Larkspur Goods. Synthetic data, not a customer result.

06Security

Your Stripe key, your customers’ details.

A restricted key, encrypted per organisation
Disputely asks for the five permissions it uses and nothing more. The key is encrypted at rest with a key derived for your organisation, and you can revoke it in Stripe at any time.
No model sees a card number
Stripe’s API returns a card’s brand and last four digits, never the full number, so Disputely never holds one to pass on. The narrative model is given the assembled facts of the order and nothing else.
Test mode in the demo
The demo connects a Stripe sandbox key and creates disputes with Stripe’s dispute test cards, against a fictional store. Billing runs in test mode too, so no money moves.
Nothing reaches the bank without you
Submission waits for your confirmation, and the exact packet sent is kept as a snapshot. Every sync, draft, check and submission is written to an event log.

07Questions

What merchants ask first.

Will this win my disputes?

Nobody can promise that: the cardholder’s bank decides. What Disputely changes is what the bank receives. Every packet is built for its reason code, says plainly what is missing, and goes in before the deadline rather than not at all.

For context, manual representment wins roughly 12% of the time (vendor-published figure). Disputely does not publish a win rate of its own; the dashboard shows yours, by reason code, from Stripe’s outcomes.

Does it submit anything without me?

No. Submitting calls the Stripe Disputes API only after you confirm on the packet page, because Stripe accepts one submission per dispute and the evidence cannot be edited afterwards. Disputely keeps a snapshot of exactly what was sent. On Free you submit the packet yourself from the PDF; Pro submits it in one click once you have reviewed it.

Can the narrative make things up?

It is written from the assembled evidence only, kept under 2,500 characters, and told not to speculate about the cardholder or make legal threats. Then every date, amount, name and tracking number in it is checked against the packet. Anything the check cannot match is removed and flagged on the packet page, so you see what was cut and why.

Why a restricted key instead of signing in with Stripe?

A restricted key lets you grant exactly what is needed (read disputes, charges, customers and payment intents; write disputes) and nothing else, and you can revoke it in Stripe at any time. It is stored encrypted with a key derived for your organisation. Stripe Connect sign-in is planned for later.

What if I am missing evidence?

The packet page shows a completeness score and lists each missing field with what would fill it, such as a carrier delivery scan or the page where your refund policy was shown. You can add it from your policy library, paste a message log, enter tracking by hand, or upload a file. You can also submit an incomplete packet; it just tells you what the bank will not see.

Does it work with Shopify Payments?

Not yet. Disputely works with Stripe today; Shopify Payments is on the list for later.

Can I try it without a real dispute?

Yes. Connect a Stripe sandbox key and press Create demo disputes: Disputely makes test charges with Stripe’s dispute test cards and loads a policy library and message logs for a fictional store, Larkspur Goods, so the whole flow runs against real Stripe test-mode disputes.

Evidence due in

6 days 14 hours left

Spend the time on the packet, not on finding the paperwork.

Free for 3 disputes a month. Connect a sandbox key, create the demo disputes, and watch a packet assemble itself.