Disputas, contracargos y fraude en Stripe: cómo pelearlos y prevenirlos con Radar (2026) — Cesar Ayala
← Todos los artículos

Disputas, contracargos y fraude en Stripe: cómo pelearlos y prevenirlos con Radar (2026)

Un contracargo retira el cargo más una comisión de disputa no reembolsable de unos $15 USD (no se cobra en México) y te da ~7-21 días para enviar evidencia; el emisor decide en ~60-75 días. Puedes pelear con evidencia ordenada, pero prevenir gana: reglas de Stripe Radar más 3D Secure, que traslada la responsabilidad del fraude al emisor.

¿Qué pasa realmente cuando un cliente disputa un cargo?

Una disputa no empieza contigo. Empieza cuando el tarjetahabiente llama a su banco emisor y dice “no reconozco este cargo”, “nunca recibí el producto”, “me cobraron dos veces” o “esto es fraude”. El emisor abre el contracargo y, a partir de ahí, las reglas las pone la red de tarjetas (Visa, Mastercard), no tú ni Stripe.

Lo que sí pasa de tu lado es inmediato y duele: Stripe retira de tu balance el monto disputado más una comisión de disputa (alrededor de $15 USD a partir de 2026, no reembolsable; confirma el valor actual). Un detalle importante para quienes operamos desde acá: Stripe no cobra esta comisión de disputa en México según su documentación (confirma que siga vigente). El dinero se va antes de que tú puedas decir nada.

Después se abre tu ventana para responder. La red de tarjetas te da, por lo general, entre 7 y 21 días para enviar evidencia. Te enteras porque Stripe dispara el webhook charge.dispute.created — ese evento es tu fuente de verdad, no el correo que tal vez nunca leas. Una vez que respondes, el emisor evalúa, y aquí viene la parte lenta: típicamente tarda entre 60 y 75 días en decidir si ganas o pierdes.

Si ganas, los fondos regresan a tu balance. Pero la comisión de disputa generalmente no se reembolsa. Y bajo la estructura de comisiones más reciente de Stripe, puede aplicar una comisión adicional de “dispute countered” encima de la comisión de “dispute received” cuando peleas (confirma el valor actual). O sea: pelear no es gratis, ni siquiera cuando ganas.

Si nunca habías montado tu base de pagos, esto se entiende mejor con el flujo completo de cómo integrar Stripe en tu SaaS. Y los detalles oficiales del ciclo están en cómo funcionan las disputas.

El ciclo de vida de un contracargo

El cliente disputaLlama a su banco emisor: fraude, no recibido, duplicado
Stripe retira fondos + comisiónMonto + ~$15 USD no reembolsable (no se cobra en México)
Tú envías evidenciaVentana de la red: ~7-21 días, desde charge.dispute.created
El emisor evalúaDecide en ~60-75 días
Ganas o pierdesSi ganas, vuelven los fondos; la comisión no
Dónde tienes control (evidencia) y dónde no (el emisor decide). Tiempos según Stripe, 2026 — confirma los actuales.

La economía brutal: por qué una disputa te cuesta aunque ganes

Quiero ser honesto con los números porque es lo que motiva todo lo demás. Cuando llega una disputa, no pierdes una sola cosa, pierdes varias al mismo tiempo.

Primero, pierdes el valor del producto o servicio que ya entregaste. Segundo, los fondos quedan retenidos durante toda la evaluación — eso son 60 a 75 días de flujo de caja congelado por cada disputa. Para un negocio chico, varias disputas simultáneas pueden apretar la operación de verdad. Tercero, esa comisión de ~$15 USD no la recuperas aunque ganes. Haz la cuenta: una disputa de $20 que “ganas” puede terminar en negativo una vez que sumas la comisión que no regresa y las posibles comisiones de “dispute countered”.

Y hay un costo que casi nadie ve hasta que es tarde: si tu tasa de disputas se dispara, las redes te empujan hacia los programas de monitoreo de Visa y Mastercard. Esos programas traen sus propias multas y ponen en riesgo tu cuenta entera. Ya no es una disputa de $20, es tu capacidad de seguir cobrando.

Lo que cuesta una disputa, en frío

Comisión de disputa~$15 USD, no reembolsable
Fondos retenidos~60-75 días
Si ganas, la comisiónNo regresa
Si peleasPosible fee 'dispute countered' encima
Cifras de Stripe a partir de 2026; confirma las actuales. La comisión no se cobra en México.

Mi opinión, después de correr esto con dinero real moviéndose: por debajo de cierto ticket, pelear cuesta más en comisiones y horas de lo que vale el cargo. No pelees todo por orgullo. Filtra cuáles disputas vale la pena contestar y cuáles dejas ir. Y sobre todo: esta matemática es exactamente la razón por la que prevenir le gana a pelear.

¿Cómo respondo a una disputa con evidencia (y realmente gano)?

Cuando decides pelear, la disciplina es todo. Trata charge.dispute.created como la fuente de verdad y conéctalo a un handler que abra una tarea interna y recupere el contexto del pedido: quién es el cliente, qué compró, cuándo, cómo se entregó. No dependas de que alguien revise el Dashboard a tiempo. Si quieres entender por qué el webhook gana sobre revisar a mano, lo desarmo en webhooks vs polling vs API.

// Handler del webhook charge.dispute.created (Express + Stripe Node)
app.post("/webhooks/stripe", async (req, res) => {
  const event = req.stripeEvent; // ya verificado con la firma

  if (event.type === "charge.dispute.created") {
    const dispute = event.data.object;

    // El evento es la fuente de verdad: registra y abre la tarea interna
    console.log(`Disputa ${dispute.id} por ${dispute.reason}, vence:`,
      dispute.evidence_details.due_by);

    // Reúne la evidencia que corresponda al reason code.
    // Nota: submit va al mismo nivel que evidence, NO dentro de evidence.
    await stripe.disputes.update(dispute.id, {
      evidence: {
        customer_email_address: "cliente@ejemplo.com",
        receipt: "file_receipt_id",
        shipping_documentation: "file_delivery_id",
        uncategorized_text: "Logs de uso, IP, AVS y CVC coinciden.",
      },
      // submit: true, // cuando toda la evidencia esté completa
    });
  }

  res.json({ received: true });
});

La evidencia que gana es la que está ordenada y alineada con el motivo de la disputa. Si el reason es “producto no recibido”, manda el comprobante de entrega y los logs. Si es “fraude”, manda IP, resultados de AVS y CVC, y la comunicación con el cliente. Si es “no reconozco el cargo”, manda el recibo y tu descriptor. Incluye siempre: recibo, comunicación con el cliente, logs de entrega/uso, IP, resultados de AVS y CVC, y la política de reembolso que mostraste en el checkout.

Stripe también tiene Smart Disputes, parte de la gestión de disputas de Radar: su IA puede ensamblar y enviar la evidencia automáticamente para bajar tu tasa de disputas y ayudarte a mantenerte fuera de los programas de monitoreo de las redes. Úsalo, pero entiende qué está mandando.

Y lo más simple que la gente olvida: responde mucho antes del deadline. Si la ventana se cierra sin respuesta, pierdes por default. No hay prórroga.

Stripe Radar: bloquear el fraude antes de que se vuelva contracargo

Aquí cambia el juego de reactivo a proactivo. Stripe Radar es detección de fraude por machine learning entrenada con toda la red de Stripe, incluida en una base. Le pone un score a cada pago y puede bloquear o marcar pagos riesgosos antes de que se asienten — antes de que se conviertan en un contracargo que ya te costó la comisión.

Si quieres más control, Radar for Fraud Teams agrega reglas personalizadas, listas de allow/block y colas de revisión manual, a un costo adicional por transacción (alrededor de $0.07 por transacción; confirma el actual). Para marketplaces con Connect existe Radar for Platforms.

Las reglas que yo correría en la práctica:

  • Bloquear o mandar a 3D Secure los pagos con score de riesgo alto.
  • Marcar cuando AVS o CVC no coinciden.
  • Rate-limit por IP y por email para frenar pruebas de tarjetas robadas.
  • Allow-list a tus clientes buenos conocidos para evitar falsos rechazos.

Mi opinión fuerte aquí: ajusta tus reglas contra tu costo real de falsos positivos. Sobre-bloquear mata ingresos buenos en silencio, y eso es mucho más difícil de ver que un contracargo, porque el cliente bueno simplemente se va y nunca te enteras. Un contracargo grita; un falso rechazo es mudo. Los detalles del producto están en Stripe Radar.

3D Secure y SCA: el cambio de responsabilidad que termina las disputas por fraude

Si tuviera que quedarme con una sola palanca de todo este post, sería esta. Autenticar un pago con 3D Secure traslada la responsabilidad del fraude al emisor de la tarjeta. En pocas palabras: si un pago autenticado con 3DS después se disputa como fraudulento, tú normalmente no eres responsable. El banco que aprobó la autenticación carga con esa.

Lo contrario también es cierto y por eso importa tanto: si 3DS no se usa, falla, o no está disponible, tú sigues siendo responsable del fraude. Stripe además puede adjuntar automáticamente los datos de autenticación 3DS como evidencia en las disputas con liability shift, así que ni siquiera tienes que armarla a mano.

Hay un dato que mucha gente deja sobre la mesa: SCA ya exige 3DS para muchos pagos en la UE. Si ya lo estás usando ahí por obligación regulatoria, estás dejando esa misma protección de responsabilidad sin aprovechar en el resto de tus pagos.

// Exigir 3D Secure en un PaymentIntent (Stripe Node)
const intent = await stripe.paymentIntents.create({
  amount: 4999,
  currency: "mxn",
  payment_method_options: {
    card: {
      request_three_d_secure: "any", // fuerza el reto 3DS
    },
  },
});

La mejor jugada no es prender 3DS en todas las transacciones — la fricción del reto cuesta conversión. Dispáralo selectivamente en los pagos que Radar marcó como riesgosos, con una regla de Radar. Buenos clientes pasan sin fricción; los sospechosos pasan por el reto y, de paso, te blindan la responsabilidad.

Una advertencia honesta para que no te confíes: el liability shift cubre disputas por fraude, no las de “producto no recibido” ni “no es como se describió”. Para esas, 3DS no te salva — necesitas recibos, entrega clara y comunicación. La referencia oficial es 3D Secure.

Pelear una disputa vs prevenirla

Pelear (reactivo)

  • Reaccionas a charge.dispute.created
  • Evidencia + Smart Disputes
  • La comisión ya se fue, aunque ganes
  • Fondos congelados ~60-75 días
  • Cuenta el deadline en contra

Prevenir (proactivo)

  • Reglas de Radar bloquean antes de asentar
  • 3DS traslada la responsabilidad al emisor
  • No hay contracargo = no hay comisión
  • Protege tu tasa y tu cuenta
  • Menos fricción para clientes buenos
La reactiva ya perdió la comisión; la proactiva detiene el contracargo antes de que exista.

El stack de prevención que yo sí usaría

Junto todo en un orden de operaciones que puedes implementar tal cual. Este es el sistema, en secuencia:

El stack de prevención, en orden

  1. 1. Reglas de Radar primeroBloquea fraude obvio, marca la zona gris, allow-list a clientes buenos
  2. 2. 3DS en pagos riesgososRutea lo que Radar marcó por 3D Secure para trasladar la responsabilidad al emisor
  3. 3. Descriptor de cobro claroLa mayoría de 'no reconozco el cargo' viene de una línea críptica en el estado de cuenta
  4. 4. Buenos recibos y comunicaciónRecibos a tiempo, política de reembolso visible, soporte fácil: que reembolsen en vez de disputar
  5. 5. Pipeline de evidencia rápidocharge.dispute.created -> ensamblar (Smart Disputes o tuyo) -> enviar antes del deadline
Implementa de arriba hacia abajo. La mayoría del ROI está en los primeros tres pasos.

El paso 3 lo subestima todo el mundo: muchísimas disputas de “no reconozco este cargo” nacen de un descriptor críptico en el estado de cuenta. Pon un descriptor reconocible — el nombre que el cliente sí asocia con su compra — y eliminas una categoría entera de disputas sin pelear nada.

El paso 4 va en la misma línea: si el cliente puede pedir un reembolso fácil y rápido, lo hace en vez de ir con su banco. Un reembolso te cuesta el monto; una disputa te cuesta el monto más la comisión más tu tasa. Siempre prefiere el reembolso.

Y mantén tu tasa de disputas por debajo de los umbrales de monitoreo de Visa y Mastercard. La prevención no solo te salva cargos individuales: protege tu standing con las redes, que al final es lo que te deja seguir cobrando.

Por cierto, si tu modelo es de suscripción y cobras por consumo, la otra gran fuente de fricción en los cobros la ataco aparte en facturación por uso para SaaS de IA con Stripe.

Preguntas frecuentes: disputas, contracargos y fraude en Stripe

¿Recupero la comisión de disputa si gano? Generalmente no. La comisión de ~$15 USD no es reembolsable aunque ganes (y en México no se cobra; confirma el actual).

¿Cuánto tiempo tengo para responder una disputa en Stripe? Por lo general entre 7 y 21 días, según la red de tarjetas. Después el emisor decide en unos 60 a 75 días.

¿3D Secure detiene todos los contracargos? No. Traslada la responsabilidad solo en disputas por fraude, no en “producto no recibido” ni “no es como se describió”.

¿Stripe Radar es gratis? El Radar base viene incluido. Radar for Fraud Teams agrega reglas y colas de revisión a alrededor de $0.07 por transacción (confirma el actual).

¿Cuál es la diferencia entre una disputa y un contracargo? El contracargo es el mecanismo de la red de tarjetas; en Stripe lo manejas como una “disputa” sobre el cargo. Es lo mismo visto desde dos lados.

¿Debo pelear todas las disputas? No. Por debajo de un ticket pequeño, las comisiones y el tiempo suelen superar el valor del cargo. Filtra cuáles vale la pena contestar.

La conclusión honesta

Pelear disputas es control de daños. Vas a perder la comisión aunque ganes y vas a quemar horas armando evidencia. Sirve, pero es el último recurso, no la estrategia.

Las victorias reales están río arriba: reglas de Radar que bloquean el fraude antes de que se asiente, 3DS que traslada la responsabilidad al emisor, un descriptor de cobro claro y buenos recibos. Móntalo una vez y tu tasa de disputas — y tu estrés — bajan en serio. Ese es el sistema que yo corro con dinero real moviéndose, y la diferencia entre andar apagando incendios y no tenerlos.

Si quieres esto cableado correctamente en tu stack de Stripe, reglas de Radar, 3DS selectivo y un pipeline de evidencia que dispare con el webhook, ese es exactamente el tipo de cosa que construyo.