A few weeks ago our Controller, Roi Fang, wrote about her process for fighting disputes : open Stripe, pick a dispute, then open Zendesk, Orb, Slack, and Google Drive to assemble the case before she could write a single word of the response. Five tabs and 45 minutes per dispute on a chargeback that had maybe a 30% chance of winning. The result: too many chargebacks expired, and the company ate the loss.
Roi isn't an engineer and doesn't write Python. She built an Airbyte Agents automation that does the tab-switching for her, and contested disputes went from under 10% to over 90%. The bottleneck was never the decision. She always knew which disputes to fight. The half hour of research per dispute made it impossible to get to them all.
That automation worked well enough that we packaged it. Instead of building the workflow yourself, you can now install the dispute-fighter Claude skill, point it at your tools in a short conversation, and get the same loop running. In this post I’ll cover what the skill does and how to set it up for yourself.
Why make a skill Roi's automation solved a specific shape of a common problem. A chargeback response is mostly retrieval and judgment against a deadline. You pull the disputed charge from Stripe, the support history from your help desk, the relevant policy from your docs, and any billing or usage signals from wherever those live. Then you match that evidence to the exact reason code the issuer cited, because that's what decides the outcome.
Card networks give you one submission per dispute and a hard due date. Even for strong cases, win likelihood tops out around 60% according to Stripe's documentation .
This runs well on Airbyte Agents thanks to the Context Store. Your sources sync into a queryable layer, so the agent discovers the right records first and reads fresh state only when it needs to. As Roi put it, the agent "queries pre-synced data instead of making live API calls at report time," which keeps it fast and avoids rate-limiting across multiple different APIs.
In Airbyte's benchmarks, that pattern makes about 40% fewer tool calls and uses up to 80% fewer tokens. Connecting those sources happens once through managed auth.
Roi’s post walks through a custom build based on our tools: Stripe, Zendesk, Orb, Slack, and Google Drive. The skill keeps the same logic but makes the sources configurable, so you can run it on your own tools without rebuilding anything.
What the skill does dispute-fighter has four capabilities:
Evaluate whether a dispute is worth fighting with honest reasoning. The skill would rather give you an “accept the loss” answer with valid reasoning than burn a non-refundable dispute fee on an unwinnable case.Build the evidence package. If you decide to fight the dispute, the skill will create a rebuttal document as well as an evidence.json file keyed to Stripe's dispute.evidence field names.Post a daily digest of every open dispute that still needs a response, sorted by deadline, so nothing slips past its due date.Learn from previous resolutions with a learnings.md and a pitfalls.md. In this way, it can continuously improve its recommendations based on your business and tools.Two things from Roi's account are now built into the skill.
The reason-code playbook: the skill knows that a "product not received" rebuttal centers on shipping carrier, tracking number, and delivery date, while a duplicate charge centers on the duplicate charge ID and explanation, and it maps your evidence to those fields. A guardrail: The skill never auto-submits. Disputes are effectively one-shot and irreversible, so it always stops for a human to review and submit. The dispute fighter uses the email address from Stripe to identify the customer across different platforms. If your tool masks customer emails (looking at you, Amazon Seller Partner), it may rely on other fields such as an order ID or customer name from Stripe’s metadata. The more information shared between Stripe and your tools, the more likely it is to find evidence.
Setup Prerequisites Create a project in Claude To get started, create a Claude project to house your files. This is where your configuration settings, as well as learnings and pitfalls, will live.
Install the skill to the folder. Anthropic's documentation can walk you through that one .
Specify your connectors Enter set up dispute-fighter in a Claude chat. It walks you through which tool fills each role, one at a time, and writes the config file for you.Stripe is pinned as the system of record for disputes. Every other source is a configurable role, so you map your stack to what each role provides:
customer_comms for support history (Zendesk by default; you can instead use Intercom, Freshdesk, Salesforce, or HubSpot)policies for refund, cancellation, and ToS docs (Google Drive by default; you can instead use Notion, Confluence, or Airtable)internal_chat for the threads where your team discussed the account (Slack; you would need to wire up your own connection for a different chat app)service_usage (optional) for proof the customer used the product. This populates Stripe's access_activity_log and is often decisive for "subscription cancelled" and fraud disputes. Roi used Orb here; Amplitude also works.order_data (optional) for line items, shipping, and tracking on e-commerce orders. You could use Shopify, WooCommerce, or Amazon Seller Partner.Because the logic is keyed to roles, not tool names, the same evaluation runs whether your docs live in Google Drive or Notion. With no config file present, the skill falls back to Zendesk, Google Drive, and Slack.
Claude will also confirm a few policy settings: your non-refundable dispute fee , a minimum dispute amount worth evaluating (anything below it is auto-skipped), and a minimum winnability floor (the skill recommends accepting disputes whose odds fall below it). All three are optional and default to fight any strong case above $0, regardless of the winnability odds.
After confirming the numbers for winnability, it also prompts you to list the currencies your disputes could be in. This skill doesn’t handle conversions, so you will need to keep that in mind for dispute amounts versus fees.
A successfully generated config looks something like this:
{
"stripe" : {
"dispute_fee_cents" : {
"USD" : 1500 ,
"EUR" : 1500 ,
"CAD" : 1500 ,
"default" : 1500
} ,
"default_currency" : "usd"
} ,
"evaluation" : {
"min_amount_cents" : {
"USD" : 2500 ,
"EUR" : 2500 ,
"CAD" : 2500 ,
"default" : 2500
} ,
"high_value_cents" : {
"USD" : 20000 ,
"EUR" : 20000 ,
"CAD" : 20000 ,
"default" : 20000
} ,
"min_winnability" : 0.3
} ,
"sources" : {
"customer_comms" : {
"connector" : "zendesk-support" ,
"entity" : "tickets" ,
"match_field" : "requester_email" ,
"comments_entity" : "ticket_comments"
} ,
"policies" : {
"connector" : "google-drive" ,
"entity" : "files" ,
"name_field" : "name" ,
"keywords" : [
"refund policy" ,
"cancellation policy" ,
"terms of service" ,
"shipping"
]
} ,
"internal_chat" : {
"connector" : "slack" ,
"entity" : "messages" ,
"text_field" : "text"
} ,
"service_usage" : null ,
"order_data" : null
} ,
"digest" : {
"connector" : "slack" ,
"channel" : "richelle-test" ,
"post_time" : "09:00" ,
"timezone" : "America/Los_Angeles" ,
"urgency_hours" : {
"red" : 48 ,
"orange" : 96
}
} ,
"storage" : {
"local_dir" : "~/dispute-fighter-data"
} ,
"winnability_overrides" : { }
} This config file is now ready for use, but it will not persist after you finish the current chat. For that reason, you must then take the generated config file and upload it to your dispute fighter project. Doing so allows you to save the configuration between different Claude sessions.
After connecting, Claude will ask you for a Slack channel to post the daily digest. You can either allow it to create a new channel or enter the name of a channel to post to.
Create a scheduled task Once your connectors are set, you can instruct Claude to schedule a recurring digest of new disputes through one of the following methods:
Claude's cloud scheduler (default) Cron job (macOS/Linux): Your computer must be on for the task to run. Scheduled task (Windows): Your computer must be on for the task to run. Run a quick test Make sure everything’s running correctly by asking Claude to run the digest once and post it to your Slack channel. You can ask Claude to do this too.
Use the skill You drive the skill in plain language from any Claude Desktop chat, no slash commands or flags to memorize. Here are the phrases it responds to, grouped by what you're trying to do.
Evaluate a dispute
evaluate dp_123 — runs the full workflow for one dispute: gather context, an honest FIGHT / ACCEPT / SKIP verdict, and (only if fighting) the evidence package.evaluate dp_123, dp_456, dp_789 — runs the full workflow for each dispute independently and returns a consolidated summary plus the individual recommendations.is dp_123 worth fighting? / what are our odds on this chargeback? — the same evaluation, phrased as a question.evaluate the dispute for ch_… / pi_… or …for order 1234 / Jane Doe / Zendesk ticket 987 — hand it a charge, payment intent, order number, customer, or ticket and it resolves to the dispute first.Build and submit
build the evidence package for dp_123 — produces the evidence.json (mapped to Stripe's exact field names) and the human-readable evidence_package.md rebuttal, then stops for your review.Daily digest and scheduling
run the dispute digest and post it to Slack — posts the triage table of open disputes needing a response, sorted by deadline.show me a full digest of every open dispute — the complete list rather than just what's new since the last run.schedule the daily digest at 9am to the disputes channel — sets up the recurring cloud run (or a local cron / Task Scheduler job).Add the skill to your workday Here's an example of how to use this skill with an amount threshold of $100.
In the morning, a scheduled task posts the digest to your disputes channel. You see a headline (how many disputes are open, total dollars at risk, how many are due within 48 hours) and one line per dispute, sorted by the earliest deadline. Each line carries a quick recommendation and a paste-ready action.
🛡️ *Disputes needing a response — Jul 6, 2026*
5 open · USD 1,262.99 at risk · 2 due within 48h · 1 below evaluate threshold
Dispute
Amount
Reason
Due
Lean
Customer
dp_TESTaa01
USD 249.99
product_not_received
🔴 due in 1d
FIGHT
Jordan Alvarez
dp_TESTee05
USD 89.00
duplicate
🔴 due in 2d
SKIP
Sam Lindqvist
dp_TESTbb02
USD 149.00
subscription_canceled
🟠 due in 3d
FIGHT
Priya Nair
dp_TESTff06
USD 450.00
bank_cannot_process
🟠 due in 4d
ACCEPT
Aisha Rahman
dp_TESTcc03
USD 325.00
fraudulent
🟢 due in 5d
FIGHT
Marcus Webb
_Paste `evaluate <dispute-id>` into Claude (with the dispute-fighter skill) to run the full evaluation. `SKIP` = below your $100 amount threshold · `ACCEPT` = process/low-odds reason · no auto-submit._
The quick recommendation does not run a full analysis. It triages disputes to help you identify the easiest wins. To get a full analysis, you will need to enter the dispute in Claude Chat.
You pick one and paste evaluate dp_123 into a Claude chat. The skill gathers context for that dispute through the Agents MCP into a single dispute_context.json, including:
The dispute reason code The amount The due date The charge and its risk signals The customer Matching support tickets Relevant policy excerpts Order or usage data (if connected) Then it evaluates. You get a clear FIGHT or ACCEPT verdict, the base odds for that reason code, the evidence you have, the evidence you're missing, and the economics of the amount against the dispute fee. If the call is to fight, it builds the package: an evidence.json mapped to Stripe's exact fields and an evidence_package.md with a chronological narrative, a field-by-field evidence list, and a checklist of files you still need to upload. Then it stops for your review.
Future possibilities You can now follow the same loop Roi runs, minus the part where you build it all from scratch. The digest surfaces what's on the clock, you decide what's worth your time, and the skill does the cross-system retrieval and the evidence mapping that can easily eat a morning.
You could do something similar for any recurring process that requires several tools to make a decision. Refund approvals, new account onboarding, and support ticket analysis could all be partially automated with an Airbyte Agents skill.
This time we’ve built the skill for you, but next time with Airbyte installed, you can build and schedule your own skills.
First sign up to use Airbyte Agents for free. Then just install the skill, connect your sources, and let the agent do the tab-switching.