
Chargeback Management Prevention
- 73 installs
- 41 repo stars
- Updated March 13, 2026
- finsilabs/awesome-ecommerce-skills
Prevent and fight chargebacks with fraud scoring, compelling-evidence automation, and Visa CE 3.0 / Mastercom integration to keep dispute ratios below network thresholds.
About
A skill for reducing and disputing ecommerce chargebacks through fraud scoring, evidence automation, and card-network dispute tooling. A developer uses it to keep chargeback ratios under Visa/Mastercard limits and win representments.
- Fraud scoring plus compelling-evidence automation
- Visa CE 3.0 and Mastercom representment integration
Chargeback Management Prevention by the numbers
- 73 all-time installs (skills.sh)
- Ranked #552 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill chargeback-management-preventionAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 73 |
|---|---|
| repo stars | ★ 41 |
| Last updated | March 13, 2026 |
| Repository | finsilabs/awesome-ecommerce-skills ↗ |
What it does
Prevent and fight chargebacks with fraud scoring, compelling-evidence automation, and Visa CE 3.0 / Mastercom integration to keep dispute ratios below network thresholds.
Files
Chargeback Management and Prevention
Overview
A chargeback occurs when a cardholder disputes a transaction with their bank, forcing a reversal of funds and levying a fee ($15–$100 per dispute) on the merchant. A chargeback ratio above 1% (Visa) or 1.5% (Mastercard) triggers the card network's dispute monitoring programs, which can result in monthly fines and ultimately account termination.
Effective chargeback management has two tracks: (1) preventing disputes with fraud scoring and clear communication, and (2) winning more disputes by submitting complete evidence within the response window. Most platforms now integrate directly with Stripe or PayPal for dispute management, making automated evidence submission accessible to all merchants.
When to Use This Skill
- When chargeback ratio is approaching 0.65% (the early-warning level Visa monitors before the 1% threshold)
- When your team is manually compiling evidence packages and missing response deadlines
- When processing international transactions with higher dispute rates
- When your dispute win rate is below 40% and you need to understand why
- When friendly fraud (customers who received goods but dispute anyway) is a significant problem
Core Instructions
Step 1: Determine your platform and dispute management approach
| Platform | How Disputes Are Handled | Recommended Tool |
|---|---|---|
| Shopify Payments | Disputes managed in Shopify Admin → Payments → Disputes | Shopify's built-in dispute response + Chargebacks911 or Kount for high volume |
| Shopify + Stripe | Disputes appear in Stripe Dashboard + Shopify Admin | Stripe Radar for prevention; Stripe's dispute workflow for response |
| WooCommerce + Stripe | Disputes in Stripe Dashboard; no WooCommerce-native interface | Stripe Radar for fraud scoring; Stripe Dashboard for dispute response |
| WooCommerce + PayPal | Disputes in PayPal Resolution Center | PayPal Seller Protection + manual evidence submission in Resolution Center |
| BigCommerce | Depends on payment gateway; Stripe and PayPal most common | Same as WooCommerce equivalent above |
| Custom / Headless | Stripe Radar + Stripe dispute webhooks for automation | Build automated evidence collection triggered by charge.dispute.created webhook |
Step 2: Set up fraud prevention (before chargebacks happen)
The most cost-effective chargeback strategy is prevention.
Shopify
1. Enable Shopify Fraud Analysis: Go to Settings → Payments → Fraud prevention. Shopify automatically analyzes orders and flags high-risk ones with indicators (billing/shipping address mismatch, CVV failure, AVS mismatch).
2. Act on fraud indicators: For orders with multiple red flags, go to Orders → [Order] → Fraud analysis and review the risk factors before fulfilling. Cancel and refund orders with a "High" risk level before they ship.
3. Enable Shopify Protect (if on Shopify Payments): This is Shopify's built-in chargeback protection for fraudulent orders. Eligible orders are automatically covered — Shopify pays the chargeback amount and fee. Go to Settings → Payments to verify Protect is active on your account.
4. Install Signifyd or NoFraud: For higher-volume stores, install Signifyd or NoFraud from the Shopify App Store. These provide chargeback guarantees — if a fraud dispute occurs on an order they approved, they pay the chargeback.
WooCommerce
1. Enable Stripe Radar: In the Stripe Dashboard, go to Radar → Rules and configure fraud rules. Stripe Radar evaluates every transaction and blocks high-risk ones.
2. Add Stripe Radar rules for your risk profile:
- Block payments where the billing zip code does not match
- Require 3D Secure for transactions above $500
- Block prepaid cards for digital goods (high fraud category)
3. Enable AVS and CVV checks: In Stripe Dashboard → Settings → Radar enable AVS and CVC checks. Go to WooCommerce → Settings → Payments → Stripe and enable the "Require a valid postal code from the customer" option.
BigCommerce
1. Go to Store Setup → Payment Methods and enable your gateway's fraud filters 2. For Stripe: configure Radar rules in the Stripe Dashboard (same as WooCommerce above) 3. For PayPal: enable PayPal Seller Protection requirements — require signature confirmation for orders over $250
Step 3: Respond to disputes effectively
Shopify Payments
1. Go to Settings → Payments → Disputes — all open disputes appear here with response deadlines 2. Click on a dispute to see the reason code and deadline (typically 7–21 days from the dispute date) 3. Click Submit evidence and fill in:
- Tracking number and carrier confirmation of delivery
- Customer's IP address and billing address at time of purchase
- Email communications with the customer about the order
- Your refund policy (link to the policy page)
- For digital goods: proof of delivery and usage logs
4. Submit before the deadline — Shopify notifies you via email when a new dispute is created
Shopify makes this straightforward: it pre-fills much of the evidence from the order data (shipping address, IP, order details).
Stripe Dashboard (WooCommerce, BigCommerce, Custom)
1. Go to Stripe Dashboard → Disputes — all open disputes with deadlines are listed 2. Click on a dispute to open the evidence submission form 3. Stripe's form has specific fields for each evidence type:
- Shipping documentation: paste the tracking number and carrier
- Customer communication: paste email correspondence
- Refund policy: paste your policy text or URL
- Service documentation: describe what was delivered and when
4. Under Uncategorized text, add a narrative summary: "Customer placed order on [date], order shipped [date] via [carrier], tracking [number], delivered [date]" 5. Click Submit evidence — Stripe sends the package to the card network
Key rule: respond to every dispute, even low-value ones. Accepting a $10 chargeback still counts against your dispute ratio.
PayPal Resolution Center (WooCommerce, BigCommerce)
1. Log in to your PayPal Business account and go to Resolution Center → Cases 2. Click on the open case and select Respond 3. For "Item Not Received" disputes: provide the tracking number and delivery confirmation 4. For "Unauthorized Transaction" disputes: provide proof of shipment, IP address, and any communication with the customer 5. Submit by the deadline shown on the case
Step 4: Use Visa CE 3.0 for friendly fraud
Visa Compelling Evidence 3.0 (CE 3.0) is a powerful tool for disputing friendly fraud (customer received goods but claims they did not authorize the purchase). If the customer has 2 prior non-disputed transactions on the same card in the past 120 days, you can submit these as evidence to shift liability to the issuer.
In Stripe Dashboard: when submitting evidence for a Visa fraud dispute, scroll to the Prior undisputed transactions section and add the charge IDs of 2 prior non-disputed purchases by the same customer. Stripe will format and submit this as CE 3.0 evidence.
Step 5: Monitor your dispute ratio
Set a calendar reminder to check your dispute ratio monthly. Both Stripe and Shopify Payments provide this data:
- Stripe: Go to Dashboard → Radar → Disputes and filter by month. Count disputes / total transactions = dispute ratio
- Shopify Payments: Go to Settings → Payments → Disputes and review the monthly summary
Alert thresholds:
- 0.65%: Warning level — review your fraud prevention rules
- 0.90%: Critical level — Visa's early intervention program; contact your payment processor
- 1.00%: Visa monitoring program enrollment — monthly fines begin
Best Practices
- Respond to every dispute — even $5–$20 disputes count against your ratio; only accept (concede) a dispute if the win probability is near zero
- Collect evidence at order creation, not when the dispute arrives — delivery confirmations, IP addresses, and device data are harder to obtain 60 days later
- Use Shopify Protect or Signifyd if on Shopify — chargeback guarantees remove the financial risk entirely for covered orders
- Set response deadline reminders at T-5 days — the response window is non-negotiable; build calendar reminders for all open disputes
- Block repeat disputers — customers with 2+ chargebacks in 12 months should be flagged; Stripe Radar allows you to create a block rule for email addresses with prior disputes
Common Pitfalls
| Problem | Solution |
|---|---|
| Missing the response deadline | Stripe and Shopify both send email alerts when a dispute is created; ensure alerts go to a monitored inbox, not a noreply@ address |
| Evidence submitted but dispute still lost | Evidence must be factual and specific — vague statements lose; tracking numbers, delivery scans, and customer emails win |
| High friendly fraud rate | Implement Visa CE 3.0 using prior transaction evidence; add an explicit refund policy acceptance checkbox at checkout |
| Dispute ratio counted differently by processor and card network | Visa counts chargebacks-to-transactions in the same calendar month; use the same calculation window for your monitoring |
| PayPal disputes not visible until escalated | Check PayPal Resolution Center daily, not just your email; disputes start as "Inquiries" before becoming "Disputes" |
| Shopify Protect not covering all orders | Protect has eligibility requirements (card-present equivalent signals); review the Protect coverage report to see which order types qualify |
Related Skills
- @stripe-integration
- @payment-reconciliation-automation
- @fraud-detection
- @order-processing-pipeline
{
"context": "Tests whether the agent implements the correct chargeback database schema (tables, columns, indexes), handles all three Stripe dispute webhook event types, calculates network-specific response deadlines, and uses Stripe charge metadata to link disputes to orders.",
"type": "weighted_checklist",
"checklist": [
{
"name": "chargebacks table columns",
"max_score": 12,
"description": "schema.sql includes a chargebacks table with at least these columns: processor_dispute_id (unique), network, reason_code, reason_category, disputed_amount, currency, chargeback_date, response_due_date, status, win_probability_score, auto_submitted, evidence_submitted_at"
},
{
"name": "chargeback_evidence table",
"max_score": 8,
"description": "schema.sql includes a chargeback_evidence table with at least: chargeback_id (FK to chargebacks), evidence_type, content or file_url, and collected_at"
},
{
"name": "Three database indexes",
"max_score": 8,
"description": "schema.sql creates at least three indexes on the chargebacks table: one on (status, response_due_date), one on order_id, and one on chargeback_date"
},
{
"name": "All three webhook events handled",
"max_score": 10,
"description": "webhook-handler.js (or equivalent) explicitly handles charge.dispute.created, charge.dispute.updated, AND charge.dispute.closed — all three event types"
},
{
"name": "Amex deadline: 20 days",
"max_score": 8,
"description": "Amex disputes are assigned a response window of 20 days"
},
{
"name": "Discover deadline: 45 days",
"max_score": 8,
"description": "Discover disputes are assigned a response window of 45 days"
},
{
"name": "Visa/MC fraud deadline: 30 days",
"max_score": 8,
"description": "Visa/Mastercard disputes with a fraud reason are assigned a 30-day response window; non-fraud reasons get 20 days"
},
{
"name": "Expand payment_intent metadata",
"max_score": 8,
"description": "When retrieving the Stripe charge, the code expands payment_intent AND payment_intent.metadata to extract the order_id"
},
{
"name": "order_id in Stripe metadata",
"max_score": 8,
"description": "design-notes.md or code comments note that order_id must be passed in Stripe payment_intent metadata at order creation time so disputes can be auto-linked"
},
{
"name": "Score-based dispute routing",
"max_score": 10,
"description": "After scoring, the code auto-submits when score is high AND days remaining is sufficient, notifies team for manual review for mid-range scores, and sends a low-win-probability notification for very low scores"
},
{
"name": "Status is 'open' on creation",
"max_score": 5,
"description": "Newly created chargeback records have status defaulting to 'open'"
},
{
"name": "win_probability_score persisted",
"max_score": 7,
"description": "After evidence collection and scoring, the win_probability_score is stored on the chargeback record"
}
]
}
Chargeback Dispute Ingestion System
Problem/Feature Description
FinPay is a growing payment facilitator that processes transactions for several hundred small e-commerce merchants. The ops team has been tracking chargebacks manually in spreadsheets, and they are regularly missing response deadlines because disputes come in from different card networks (Visa, Mastercard, Amex, Discover) with different response windows. A dispute from a Discover cardholder has different urgency than one from an Amex cardholder, and mixing them in a spreadsheet has already cost the company several uncontested losses.
The engineering team has been asked to build the foundation of a proper chargeback management system. The first milestone is: (1) a database schema that captures all the information needed to manage disputes through their lifecycle, and (2) a Stripe webhook handler that ingests new disputes automatically, calculates the correct response deadline based on the card network and dispute reason, links the dispute back to the original order via Stripe charge metadata, and initiates automated evidence collection and win-probability scoring.
Output Specification
Produce the following files in your working directory:
schema.sql— PostgreSQL DDL for the chargeback-related tables and indexes needed to support the full dispute lifecycle.webhook-handler.js— A JavaScript/Node.js module that handles incoming Stripe dispute webhooks. It should process the relevant dispute event types, calculate the correct response due date, persist the new chargeback record, run evidence collection and scoring, and route the dispute appropriately based on the resulting score and time remaining.design-notes.md— A short document (bullet points are fine) explaining your key design decisions: which Stripe webhook event types you handle, how you determine the response deadline per network, how metadata is used to link disputes to orders, and any assumptions made.
{
"context": "Tests whether the agent implements the correct evidence scoring weights, applies Visa CE 3.0 with the correct eligibility conditions and lookback window, uses appropriate score thresholds for routing, submits evidence to Stripe correctly with file uploads, and updates the chargeback record accurately after submission.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Delivery weight 0.35",
"max_score": 8,
"description": "The delivery_confirmed evidence factor is assigned a weight of 0.35 (or 35%) in the win probability score calculation"
},
{
"name": "Customer communication weight 0.25",
"max_score": 8,
"description": "The customer_communication evidence factor is assigned a weight of 0.25 (or 25%)"
},
{
"name": "CE 3.0 prior transactions weight 0.30",
"max_score": 8,
"description": "The Visa CE 3.0 prior undisputed transactions factor is assigned a weight of 0.30 (or 30%)"
},
{
"name": "Policy accepted weight 0.10",
"max_score": 8,
"description": "The refund policy acceptance factor is assigned a weight of 0.10 (or 10%)"
},
{
"name": "CE 3.0 Visa+fraud only",
"max_score": 8,
"description": "The CE 3.0 logic is only triggered when the dispute network is 'visa' AND the reason_category is 'fraud'"
},
{
"name": "CE 3.0 requires 2+ prior transactions",
"max_score": 8,
"description": "CE 3.0 eligibility requires at least 2 prior undisputed transactions (not 1, not 3+)"
},
{
"name": "CE 3.0 lookback 120 days",
"max_score": 8,
"description": "Prior undisputed transactions are searched within a 120-day lookback window"
},
{
"name": "Auto-submit threshold 0.65",
"max_score": 8,
"description": "Evidence is auto-submitted when win_probability_score >= 0.65 (and sufficient days remain)"
},
{
"name": "Low-probability threshold 0.25",
"max_score": 8,
"description": "Disputes with win_probability_score < 0.25 trigger a low-win-probability notification rather than auto-submission"
},
{
"name": "File upload with dispute_evidence purpose",
"max_score": 8,
"description": "File evidence is uploaded to Stripe using stripe.files.create with purpose set to 'dispute_evidence'"
},
{
"name": "Stripe submission with submit: true",
"max_score": 8,
"description": "Evidence is submitted via stripe.disputes.update with submit: true"
},
{
"name": "Post-submission status update",
"max_score": 12,
"description": "After submission, the chargeback record is updated with status = 'evidence_submitted', evidence_submitted_at timestamp, and auto_submitted = true"
}
]
}
Automated Chargeback Evidence Engine
Problem/Feature Description
Retail.io is an e-commerce platform with around 15,000 monthly transactions. Their dispute win rate is 28%, well below industry average. After a manual audit, the fraud team found two root causes: (1) the team inconsistently collected evidence — sometimes attaching delivery confirmation, sometimes not bothering with customer communication logs — and (2) every Visa fraud dispute was submitted with the same generic template with no attempt to leverage the cardholder's own purchase history. The team wants to replace the manual process with an automated engine that gathers all available evidence from the order record, scores it to predict the win probability, intelligently includes Visa CE 3.0 prior-transaction data when applicable, uploads any file attachments, and routes the dispute through Stripe automatically or escalates to human review based on how winnable the case looks.
The company already has order records in a database. Each order stores: customer_email, tracking_number, carrier, session_id, customer_ip, policy_accepted_at, and stripe_charge_id.
Output Specification
Produce the following files:
evidence-collector.js— A JavaScript module with the evidence collection and scoring logic. It must collect the relevant evidence types from the order, calculate a win probability score, include Visa CE 3.0 logic where applicable, and return the evidence bundle and score.representment.js— A JavaScript module that takes the chargeback record and evidence bundle, uploads any file-based evidence to Stripe, submits the dispute evidence via the Stripe API, and updates the internal chargeback record to reflect the submission.routing-logic.md— Document describing the thresholds and decision rules used to decide whether to auto-submit, escalate for review, or accept the dispute without fighting.
Input Files
The following stub is provided to show the data shape available. Extract it before beginning.
=============== FILE: inputs/order-sample.json =============== { "id": "ord_7f3a2b", "customer_email": "jane.doe@example.com", "customer_ip": "203.0.113.42", "session_id": "sess_abc123", "tracking_number": "1Z999AA10123456784", "carrier": "UPS", "policy_accepted_at": "2026-01-10T14:22:00Z", "stripe_charge_id": "ch_3OxYz2LkdIwHu7ix0", "created_at": "2026-01-10T14:20:00Z", "status": "completed" }
{
"context": "Tests whether the agent uses the correct network-specific chargeback ratio thresholds, applies the same calendar-month calculation window as Visa, sends deadline reminders at the right intervals, flags repeat disputers with the correct lookback period and count, and recommends checkout-level friendly fraud prevention and reason-code-segmented win-rate analytics.",
"type": "weighted_checklist",
"checklist": [
{
"name": "Visa warning threshold 0.65%",
"max_score": 10,
"description": "monitoring.js uses 0.0065 (0.65%) as the Visa early-warning threshold — NOT 1% or any other value"
},
{
"name": "Visa critical threshold 1.00%",
"max_score": 8,
"description": "monitoring.js uses 0.0100 (1.00%) as the Visa critical/monitoring-program threshold"
},
{
"name": "Mastercard warning threshold 1.00%",
"max_score": 8,
"description": "monitoring.js uses 0.0100 (1.00%) as the Mastercard early-warning threshold"
},
{
"name": "Mastercard critical threshold 1.50%",
"max_score": 8,
"description": "monitoring.js uses 0.0150 (1.50%) as the Mastercard critical/excessive-chargeback threshold"
},
{
"name": "Calendar-month ratio window",
"max_score": 8,
"description": "Chargeback ratio is computed as chargebacks in a calendar month divided by transactions in the same calendar month (not rolling 30 days or other window)"
},
{
"name": "Deadline reminder at T-5 days",
"max_score": 8,
"description": "deadline-alerts.js sends a reminder 5 days before the response_due_date for open disputes"
},
{
"name": "Deadline reminder at T-2 days",
"max_score": 8,
"description": "deadline-alerts.js sends a second reminder 2 days before the response_due_date"
},
{
"name": "Repeat disputer: 2+ in 12 months",
"max_score": 10,
"description": "repeat-disputer.js flags a customer when they have 2 or more chargebacks within the past 12 months — not 3+, not a different time window"
},
{
"name": "Checkout refund policy checkbox",
"max_score": 10,
"description": "design-doc.md recommends adding an explicit refund policy acceptance checkbox (with timestamp) at checkout to combat friendly fraud"
},
{
"name": "Win-rate by reason code",
"max_score": 10,
"description": "design-doc.md describes segmenting win-rate analytics by reason code (e.g. 10.4 vs 13.1, or 'item not received' vs 'not as described') rather than reporting a single aggregate win rate"
},
{
"name": "Respond to all disputes",
"max_score": 6,
"description": "design-doc.md or code notes that disputes should be responded to regardless of amount, since accepting chargebacks still counts against the ratio"
},
{
"name": "Escalation path awareness",
"max_score": 6,
"description": "design-doc.md describes the dispute escalation path (dispute → representment → pre-arbitration → arbitration) and notes that each step has fees, indicating when to concede"
}
]
}
Chargeback Risk Dashboard and Prevention Controls
Problem/Feature Description
MerchantHub processes payments for a B2C marketplace. Their payment operations lead recently received a warning letter from their acquiring bank: Visa's internal systems flagged the merchant's dispute ratio as elevated over the past two months. The lead doesn't have a reliable way to track the ratio in real time, doesn't know exactly where the warning and critical thresholds sit for different card networks, and the team keeps getting caught off-guard by upcoming response deadlines.
Additionally, the fraud team has identified a pattern of "friendly fraud": certain customers file disputes repeatedly and the same email addresses appear across multiple chargebacks within a year. The marketplace also noticed it has a high friendly fraud rate on Visa transactions and wants to reduce it by adding a checkout control. Finally, the analytics team wants to understand whether their dispute strategy is working differently for different dispute categories — their overall win rate number tells them nothing about whether "item not received" disputes are being won at a different rate from "not as described" ones.
You have been asked to deliver: (1) a monitoring module that computes the monthly chargeback ratio per card network and fires alerts at the correct warning and critical thresholds, (2) a deadline management module that sends automated reminders for open disputes approaching their response window, (3) a customer-risk utility that identifies repeat disputers, and (4) a short design document covering checkout-level changes to reduce friendly fraud and how to correctly segment win-rate analytics.
Output Specification
Produce the following files:
monitoring.js— JavaScript module that computes the monthly chargeback ratio for a given month and network, using the correct calendar-month window, and fires warning and critical alerts at the appropriate network-specific thresholds.deadline-alerts.js— JavaScript module that queries open disputes and sends automated reminders at the correct intervals before each response deadline.repeat-disputer.js— JavaScript module with a function that takes a customer email and determines whether that customer should be flagged for manual review based on their chargeback history.design-doc.md— Covers: (a) the specific checkout-level change that combats friendly fraud at the point of sale, and (b) how to correctly segment win-rate reporting so that different dispute types can be measured and improved separately.
{
"name": "finsi/chargeback-management-prevention",
"version": "0.1.0",
"summary": "Prevent and manage chargebacks with fraud scoring, compelling evidence automation, Visa CE 3.0 / Mastercom integration, and win-rate optimization",
"skills": {
"chargeback-management-prevention": {
"path": "SKILL.md"
}
}
}