Cobrar Meses Sin Intereses por API: Stripe, Mercado Pago y Conekta (2026) — Cesar Ayala
← Todos los artículos

Cobrar Meses Sin Intereses por API: Stripe, Mercado Pago y Conekta (2026)

MSI permite al comprador pagar con tarjeta de crédito mexicana en mensualidades fijas sin interés, mientras el comercio absorbe la comisión de financiamiento. Requiere MXN y una tarjeta de crédito de consumo mexicana. Cada rail difiere: Stripe usa payment_method_options[card][installments][enabled]; Conekta usa monthly_installments_enabled + options; Mercado Pago configura MSI en el panel y lo aplica a pagos con tarjeta de Checkout API.

Cómo cobrar a meses sin intereses (MSI) por API: Stripe, Conekta y Mercado Pago

Los meses sin intereses (MSI) dejan que el comprador divida un cargo con tarjeta de crédito mexicana en mensualidades fijas y sin interés para él, mientras tú, el comercio, absorbes la comisión de financiamiento. Lo activas por API: en Stripe con payment_method_options[card][installments][enabled], en Conekta con monthly_installments_enabled, y en Mercado Pago desde el panel, que luego aplica a los pagos con tarjeta de la Checkout API.

Es un producto específico de México: solo funciona en MXN y solo con una tarjeta de crédito de consumo mexicana (no débito, no corporativa). Lo que casi nadie te dice de entrada: la comisión de financiamiento la pagas tú. El comprador ve “12 meses sin intereses” y no paga nada extra; el banco emisor cobra esa tasa y Stripe, Conekta o Mercado Pago te la descuentan a ti del monto liquidado. MSI cambia qué se le ofrece al comprador y quién se come la comisión — no cambia tu plomería de webhooks ni de conciliación. Si vienes de mi comparativa de pasarelas de pago en México, esto es la capa de arriba: el “cómo cobro a plazos” encima del “qué proveedor elijo”.

Las restricciones duras: MXN y una tarjeta de crédito de consumo mexicana

Antes de tocar código, interioriza los tres candados. Si no se cumplen, MSI simplemente no aparece o el cargo se rechaza, y vas a perder horas creyendo que es un bug de integración.

  • Moneda MXN. MSI no existe fuera de pesos mexicanos. Si tu PaymentIntent u orden viene en usd, no hay meses.
  • Tarjeta de crédito de consumo mexicana. No débito, no tarjeta corporativa/empresarial. La tarjeta tiene que ser emitida por un banco mexicano soportado (BBVA, Santander, Amex, Banamex, etc.).
  • Monto mínimo por plan. No es un mínimo plano. Cada plan (3, 6, 9, 12, 18, 24 meses) tiene su propio piso. Un monto por debajo del mínimo del plan hace que ese plan no se ofrezca.
MonedaSolo MXN — nada de USD
TarjetaCrédito de consumo MX (no débito, no corporativa)
Quién pagaEl comercio absorbe la comisión de financiamiento
MínimoPor plan, no plano (ver tabla de Stripe)

Stripe por API: payment_method_options[card][installments][enabled] con un ejemplo en Node

En Stripe habilitas los meses en el PaymentIntent poniendo payment_method_options[card][installments][enabled]=true. Los planes soportados son 3, 6, 9, 12, 18 y 24 meses. Cuando el comprador usa una tarjeta de crédito mexicana elegible con un monto suficiente, el Payment Element le muestra las opciones de meses disponibles y él elige.

// server.js — PaymentIntent con MSI habilitados explícitamente
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);

const paymentIntent = await stripe.paymentIntents.create({
  amount: 120000, // MXN 1,200.00 en centavos -> habilita hasta 12 meses
  currency: "mxn",
  payment_method_types: ["card"],
  payment_method_options: {
    card: {
      installments: { enabled: true }, // <- ESTO es lo que prende MSI
    },
  },
});

Fíjate en dos cosas. Primero, amount va en centavos (120000 = MXN 1,200.00). Segundo, el enabled: true es explícito y no negociable — ya verás en la sección de la trampa por qué. Si quieres el fundamento de webhooks e idempotencia sobre el que esto se apoya, lo desarrollé en cómo integrar Stripe en tu SaaS.

Mínimos por plan en Stripe: 300/600/900/1200/1800/2400 para 3/6/9/12/18/24

El monto mínimo en Stripe es por plan, no plano. Este es el error de datos más común que veo repetido en tutoriales: dicen “el mínimo son MXN 300” y es falso — 300 solo desbloquea 3 meses. Para ofrecer 12 meses el monto tiene que llegar a MXN 1,200; para 24 meses, a MXN 2,400.

3 mesesMXN 300
6 mesesMXN 600
9 mesesMXN 900
12 mesesMXN 1,200
18 mesesMXN 1,800
24 mesesMXN 2,400

Reglas prácticas que tienes que tener presentes:

  • El plan solo se ofrece si el monto alcanza su mínimo. Un cargo de MXN 700 ofrece 3 y 6 meses, pero no 9.
  • Puedes sobrescribir estos mínimos desde el Dashboard si tu negociación con Stripe lo permite.
  • Banamex solo soporta 3, 6, 9 y 12 meses — nunca 18 ni 24. No es un límite que tú configures; es del emisor. Así que aunque el monto llegue a MXN 2,400, una tarjeta Banamex no verá 24 meses.

La tarjeta debe ser una tarjeta de crédito de consumo mexicana de un emisor soportado. Los detalles vivos están en docs.stripe.com/payments/mx-installments — verifica emisores y planes ahí, nunca contra tu memoria.

La trampa #1 de Stripe: los MSI no aparecen con métodos de pago automáticos/dinámicos

Aquí está el bug que te va a comer una tarde entera si no lo sabes de antemano. Si prendes MSI en el Dashboard pero creas el PaymentIntent con Automatic Payment Methods / métodos de pago dinámicos, las opciones de meses no se renderizan en el Payment Element (ni en móvil). La documentación de Stripe da a entender que los métodos dinámicos exponen los meses automáticamente, pero en la práctica no sucede.

// ❌ Con esto los meses NO aparecen, aunque estén activos en el Dashboard
const pi = await stripe.paymentIntents.create({
  amount: 120000,
  currency: "mxn",
  automatic_payment_methods: { enabled: true }, // dinámico -> MSI invisible
});

// ✅ La cura: definir installments de forma explícita en el PaymentIntent
const piFixed = await stripe.paymentIntents.create({
  amount: 120000,
  currency: "mxn",
  payment_method_types: ["card"],
  payment_method_options: { card: { installments: { enabled: true } } },
});

Esto quedó documentado en el issue #454 de stripe-js, reportado en 2023 — el workaround de configuración explícita sigue siendo el fix confiable. La solución es siempre definir payment_method_options[card][installments][enabled]=true de forma explícita en el PaymentIntent. Es el bug número uno de “mis meses sin intereses no aparecen” — le dediqué el desglose completo con captura en por qué los meses sin intereses no aparecen en Stripe y cómo arreglarlo.

Conekta por API: monthly_installments_enabled + monthly_installments_options, centavos y mínimos por plan

En Conekta configuras MSI en el objeto checkout de la orden. Pones monthly_installments_enabled: true y monthly_installments_options: [3, 6, 9, 12, 18, 24], con allowed_payment_methods: ["card"], currency: "MXN" y los line_items con unit_price en centavos.

{
  "currency": "MXN",
  "line_items": [
    { "name": "Laptop Pro", "unit_price": 9000000, "quantity": 1 }
  ],
  "checkout": {
    "allowed_payment_methods": ["card"],
    "monthly_installments_enabled": true,
    "monthly_installments_options": [3, 6, 9, 12, 18, 24]
  }
}

Ojo con unit_price: va en centavos, así que 9000000 son MXN 90,000.00. También hay mínimos por plan en Conekta — un monto demasiado pequeño se rechaza para ese plan, igual que en Stripe. La elegibilidad puede depender del banco y del plazo, y esos detalles cambian; verifícala directamente en developers.conekta.com/docs/cargo-unico-meses-sin-intereses antes de prometerle plazos al cliente. El resto del cableado de Conekta — tarjetas, OXXO, SPEI y webhooks — lo tienes en integrar Conekta (OXXO/SPEI + webhooks).

Mercado Pago: MSI con tarjeta (panel + Checkout API) vs Meses sin tarjeta / Mercado Credito

Aquí hay que separar dos productos distintos que la gente confunde todo el tiempo:

1. Cuotas sin interés / MSI con tarjeta. El comprador paga a plazos sin interés con una tarjeta de crédito y tú cubres el costo del financiamiento. Se activa desde el panel (Tu negocio → Costos y MSI → Checkout → Ofrecer MSI) y una vez activo aplica tanto a Checkout Pro como a Checkout API. En los pagos con tarjeta de la Checkout API, el conteo de meses viaja en el campo installments.

// Checkout API — el conteo de meses viaja en installments
const payment = await new Payment(client).create({
  body: {
    transaction_amount: 90000,   // MXN 90,000.00
    token: cardToken,            // token de la tarjeta desde el front
    installments: 12,            // 12 MSI (MSI activado en el panel)
    payment_method_id: "master",
    payer: { email: "comprador@correo.com" },
  },
});

2. Meses sin tarjeta (Mercado Credito). Hasta 12 mensualidades sin tarjeta: Mercado Pago financia al comprador y a ti te paga completo. Se integra creando una preferencia con purpose: "onboarding_credits". Es un producto diferente, no lo confundas con el MSI con tarjeta.

// Meses sin tarjeta (Mercado Credito) — preferencia con purpose
const pref = await new Preference(client).create({
  body: {
    items: [{ title: "Laptop Pro", quantity: 1, unit_price: 90000, currency_id: "MXN" }],
    purpose: "onboarding_credits", // habilita Mercado Credito
  },
});

El flujo base de preferencia → webhook → verificar → dar acceso no cambia; lo detallé completo en cómo integrar Mercado Pago. MSI solo cambia qué se le ofrece al comprador. Referencia: mercadopago.com.mx/developers.

Comparar y decidir: los tres rails lado a lado

Stripe

  • Param: payment_method_options[card][installments][enabled]=true
  • Planes 3/6/9/12/18/24; mínimo por plan (300...2400)
  • Banamex solo 3/6/9/12
  • Trampa: no aparece con automatic_payment_methods

Conekta / Mercado Pago

  • Conekta: monthly_installments_enabled + options, unit_price en centavos
  • Conekta: mínimos por plan; verifica elegibilidad por banco en sus docs
  • MP: MSI con tarjeta se activa en el panel, viaja en installments
  • MP: Meses sin tarjeta = purpose onboarding_credits, hasta 12
  1. Stripepayment_method_options[card][installments][enabled]=true por PaymentIntent; planes 3/6/9/12/18/24; mínimos por plan; ojo con la trampa de métodos automáticos.
  2. Conektamonthly_installments_enabled + monthly_installments_options en el checkout de la orden; unit_price en centavos; mínimos por plan; verifica elegibilidad por banco en las docs.
  3. Mercado PagoActiva MSI en el panel; el conteo viaja en installments en la Checkout API; no confundas MSI con tarjeta con Mercado Credito.

Cómo lo decido en la práctica: si ya estás en Stripe y solo necesitas MSI con tarjeta, quédate ahí y define el parámetro explícito. Si tu base de compradores usa mucho la wallet de Mercado Pago o quieres ofrecer meses sin tarjeta, Mercado Pago gana por el Mercado Credito. Conekta es mi opción cuando ya tengo OXXO/SPEI cableado ahí y quiero MSI en el mismo rail sin sumar un proveedor más.

La realidad compartida: tú absorbes la comisión de financiamiento — inclúyela en el precio y concilia

El punto que aplica a los tres rails: la comisión de financiamiento la pagas tú. En un cargo a 12 o 18 meses esa tasa no es trivial y sale de tu margen. Dos consecuencias de ingeniería:

  • Inclúyela en el precio. Si vas a ofrecer 18 y 24 meses, modela la comisión en tu precio o en tus mínimos internos antes de prenderla. No la descubras en el estado de cuenta.
  • Concilia contra el neto liquidado, no contra el amount del cargo. El monto que ves en el PaymentIntent u orden no es lo que te depositan; MSI mete un descuento adicional. Reconcilia siempre contra el neto.

La plomería estándar no cambia: verifica la firma del webhook, sé idempotente y concilia. MSI no altera tu plomería de webhooks ni de liquidación — solo cambia qué se le ofrece al comprador y cuánto te descuentan. Si necesitas afinar esa base, verificar la firma del webhook de Stripe y webhooks vs polling vs API son las dos piezas que más veo mal cableadas.

Guías de pagos relacionadas en cesarayala.dev

Si estás armando tu stack de cobros para México, estos son los siguientes pasos naturales:

Fuentes oficiales: docs.stripe.com/payments/mx-installments, developers.conekta.com y mercadopago.com.mx/developers. Verifica emisores, planes y mínimos vigentes contra estas docs antes de ir a producción — cambian sin avisar.