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.
Evidence due in
6 days 14 hours leftStripe due_by 10 Oct 2026, 23:59 UTC
- Amount
- $184.00 USD
- Customer
- Mara Okafor
- Order
- LG-20417
- Charged
- 9 Sep 2026
Missing shipping_documentation: upload the carrier’s delivery scan.
Narrative: 11 facts verified, 1 claim removed.
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.
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 modeRestricted API key
rk_test_51Q8x••••••••••••••Zt3a
Permissions the restricted key needs Resource Permission Disputes Write Charges Read Customers Read PaymentIntents Read Everything else None Encrypted at rest with a key derived for your organisation. Shown only as its last four characters.
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 leftTheo Lindqvist$62.50fraudulent
- 6 days 14 hours leftMara Okafor$184.00product_not_received
- 13 days 2 hours leftPriya Nair$24.00subscription_canceled
webhook charge.dispute.updated · du_…aTn3fP · evidence_details refreshed
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.
Playbook 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
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 submissionSend 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_…aTn3fP4 Oct 2026 · 10:42 UTC
SubmittedUnder reviewSnapshot of the sent packet saved.
charge.dispute.closed
Won$184.00Counted 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
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.
- 19 September 2026Stripe chargecreated
- 2Mara OkaforStripe customername
- 3$184.00Stripe chargeamount
- 4LG-20417Stripe chargemetadata.order_id
- 5USPSShipment recordcarrier
- 612 September 2026Shipment recordshipped_at
- 79400 1112 …2210 55Shipment recordtracking_number
- 816 September 2026Shipment recorddelivered_at
- 914 Alder Lane …Checkout sessionshipping_details
- 1018 September 2026Message logoccurred_at
- 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.
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
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.
- 2 days 5 hours leftTheo Lindqvist$62.50fraudulentpacket 4 of 6
- 6 days 14 hours leftMara Okafor$184.00product_not_receivedpacket 6 of 7
- 9 days 20 hours leftJonah Adeyemi$210.00product_unacceptablepacket 2 of 5
- 13 days 2 hours leftPriya Nair$24.00subscription_canceledpacket 5 of 5
- product_not_received5 of 6
- subscription_canceled3 of 4
- fraudulent2 of 5
- product_unacceptable1 of 3
$2,318.40
11 won · 7 lost · median packet 93% complete
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 leftSpend 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.