
Charge Meses Sin Intereses by API: Stripe, Mercado Pago & Conekta (2026)
MSI lets a buyer pay a Mexican credit card in fixed no-interest monthly installments while the merchant absorbs the financing fee. It needs MXN and a Mexican consumer credit card. Each rail differs: Stripe uses payment_method_options[card][installments][enabled]; Conekta uses monthly_installments_enabled + options; Mercado Pago configures MSI in the dashboard and applies it to Checkout API card payments.
How to charge meses sin intereses (MSI) by API
Meses sin intereses (MSI) lets a buyer split a MXN credit-card charge into fixed, no-interest monthly payments while you, the merchant, absorb the financing fee. You turn it on by API: Stripe via payment_method_options[card][installments][enabled], Conekta via monthly_installments_enabled, and Mercado Pago in the dashboard, then applied to Checkout API card payments.
The buyer sees “3, 6, 12 meses sin intereses” at checkout and their bank splits the charge; you get paid (near) in full, minus the financing cost you agreed to. It only works with MXN and a Mexican consumer credit card — never debit, never corporate cards. The key word is intereses: no interest to the buyer. Somebody still finances those months, and in the MSI model that somebody is you. Think of it as a discount you’re paying to close a bigger cart — that single fact drives everything else in this post: pricing, plan selection, and reconciliation.
The hard constraints: MXN plus a Mexican consumer credit card
Before you touch any API, internalize the two constraints that make MSI eligible at all. Miss either one and the installment option silently won’t appear — no error, just a card form with a single full charge.
- Currency must be MXN. MSI is a Mexican domestic-card product. A USD or EUR PaymentIntent is not eligible, full stop.
- The card must be a Mexican consumer credit card. Debit cards, prepaid cards, corporate/business cards, and foreign-issued cards do not qualify. A buyer paying with a debit card will simply see no installment choice.
These are card-network rules, not gateway quirks, so they hold across Stripe, Conekta, and Mercado Pago. When you test, use a real Mexican consumer credit card (or the gateway’s MX installment test card) — a generic 4242… test card will not surface MSI. If you’re still choosing a gateway, my payment gateways in Mexico comparison covers the wider tradeoffs beyond installments.
Stripe by API: enable installments on the PaymentIntent
On Stripe you enable MSI per-PaymentIntent with payment_method_options[card][installments][enabled] = true. When Stripe sees an eligible Mexican credit card and an amount that clears the plan minimum, it offers the buyer the installment plans in the Payment Element. Supported plans are 3, 6, 9, 12, 18, and 24 months.
import Stripe from "stripe";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
// MSI is priced in MXN; amount is in centavos (cents).
const paymentIntent = await stripe.paymentIntents.create({
amount: 120000, // MXN 1,200.00 -> clears the 12-month minimum
currency: "mxn",
// Force the card + installments path explicitly (see the trap below).
payment_method_types: ["card"],
payment_method_options: {
card: {
installments: { enabled: true },
},
},
});
The buyer picks a plan on the client, and Stripe records the chosen plan on the confirmed PaymentIntent under payment_method_options.card.installments. Nothing about your webhook handling or settlement changes — you still verify the payment_intent.succeeded event and reconcile as usual. See how to integrate Stripe into your SaaS for the baseline PaymentIntent + webhook flow this builds on.
Per-plan minimums (it is NOT a flat MXN 300)
The most common Stripe MSI mistake is assuming a single MXN 300 floor. The minimum is per plan — a longer plan requires a larger cart so each monthly slice stays reasonable. If the amount doesn’t clear the plan’s minimum, that plan just won’t be offered.
So: 3 mo = MXN 300, 6 mo = MXN 600, 9 mo = MXN 900, 12 mo = MXN 1,200, 18 mo = MXN 1,800, 24 mo = MXN 2,400. You can override these floors in the Stripe Dashboard if you want to gate longer plans behind larger carts. Issuer coverage also varies: the card must come from a supported Mexican issuer (BBVA, Santander, Amex, Banamex, and others), and Banamex supports only 3/6/9/12 — it does not do 18 or 24. Don’t promise “hasta 24 MSI” in your UI if a chunk of your buyers are on Banamex cards. Always confirm the current issuer list and floors against Stripe’s MX installments docs rather than hard-coding them from memory.
The #1 Stripe trap: MSI won’t render under Automatic Payment Methods
Here’s the bug that eats an afternoon. You enable MSI in the Dashboard, you create the PaymentIntent with Automatic Payment Methods (dynamic payment methods), you load the Payment Element with a real Mexican credit card — and no installment option appears. Stripe’s docs imply dynamic PMs surface installments for you, but in practice they don’t reliably render the option (documented in stripe-js issue #454, filed in 2023 — the explicit-config workaround is still the reliable fix).
The fix is to set the explicit installments option on the PaymentIntent instead of relying on automatic methods:
// DOES NOT reliably show MSI:
await stripe.paymentIntents.create({
amount: 120000,
currency: "mxn",
automatic_payment_methods: { enabled: true }, // installments may not render
});
// SHOWS MSI: explicit card method + installments enabled
await stripe.paymentIntents.create({
amount: 120000,
currency: "mxn",
payment_method_types: ["card"],
payment_method_options: { card: { installments: { enabled: true } } },
});
If you’re staring at a checkout where MSI stubbornly refuses to appear, I wrote a dedicated walkthrough: Stripe installments not showing in Mexico — the fix. Nine times out of ten it’s this, the currency, or the card type.
Conekta by API: monthly_installments_enabled + options
Conekta enables MSI on the Order’s checkout object. Set monthly_installments_enabled: true and pass the plans you want in monthly_installments_options, restrict allowed_payment_methods to ["card"], use currency: "MXN", and price line_items in centavos. Note the unit: 9000000 is MXN 90,000.00, not ninety pesos.
{
"currency": "MXN",
"line_items": [
{
"name": "Laptop Pro 14",
"unit_price": 9000000,
"quantity": 1
}
],
"checkout": {
"allowed_payment_methods": ["card"],
"monthly_installments_enabled": true,
"monthly_installments_options": [3, 6, 9, 12, 18, 24]
}
}
Conekta also enforces per-plan minimum amounts — send an amount that’s too small for a given plan and it’s rejected, exactly like Stripe’s floors. One caveat: do not hard-code bank-specific rules like “24 months is BBVA/Banorte only.” That per-bank/per-plan eligibility isn’t spelled out consistently in the primary docs, so surface the plans, let Conekta reject what’s ineligible, and verify current per-bank/per-plan rules in Conekta’s MSI docs. If you’re wiring Conekta from scratch, my Conekta integration guide (cards/OXXO/SPEI + webhooks) covers the Order + webhook plumbing.
Mercado Pago: MSI-con-tarjeta vs Meses sin tarjeta (Mercado Crédito)
Mercado Pago has two different products with confusingly similar names. Conflating them is where MP integrations go wrong.
(1) Cuotas sin interés / MSI con tarjeta. The buyer pays interest-free installments on a credit card and you cover the financing cost. You enable it in the dashboard (Tu negocio → Costos y MSI → Checkout → Ofrecer MSI), and it then applies to both Checkout Pro and Checkout API card payments. On a Checkout API card payment, the installments field carries the plan count:
{
"transaction_amount": 12000.00,
"token": "CARD_TOKEN",
"description": "Laptop Pro 14",
"installments": 12,
"payment_method_id": "master",
"payer": { "email": "comprador@example.com" }
}
(2) Meses sin tarjeta (Mercado Crédito). This is not a card product. Mercado Pago extends the buyer a line of credit — up to 12 installments with no card at all — finances them, and pays you in full. You integrate it by creating a preference with purpose: "onboarding_credits":
{
"items": [
{ "title": "Laptop Pro 14", "quantity": 1, "unit_price": 12000.00, "currency_id": "MXN" }
],
"purpose": "onboarding_credits"
}
The distinction matters for who eats the fee: with MSI con tarjeta, you finance the interest; with Mercado Crédito, MP finances the buyer. My Mercado Pago integration guide covers the Checkout Pro/Bricks + webhook baseline both sit on. Confirm current fields against the Mercado Pago Checkout API docs.
MSI con tarjeta
- Requires a Mexican credit card
- Merchant absorbs the financing fee
- Enabled in dashboard, applied via installments field
- Works on Checkout Pro + Checkout API
Meses sin tarjeta (Mercado Credito)
- No card needed
- Mercado Pago finances the buyer, pays you in full
- Up to 12 installments
- Preference with purpose: onboarding_credits
Compare & decide: the three rails side by side
All three do MSI-con-tarjeta with the same shape — MXN, Mexican consumer credit card, merchant eats the fee — but the switch you flip is different, and so is the ergonomics.
- Stripepayment_method_options[card][installments][enabled]=true per PaymentIntent; plans 3/6/9/12/18/24; per-plan MXN minimums; watch the Automatic PM trap.
- Conektamonthly_installments_enabled + monthly_installments_options on the Order checkout; centavos unit_price; per-plan minimums; verify per-bank eligibility in docs.
- Mercado PagoEnable MSI in the dashboard; installments field on Checkout API card payments; keep MSI-con-tarjeta separate from Mercado Credito.
Rule of thumb: if you already run Stripe, enabling MSI is one PaymentIntent option (plus dodging the AP-methods trap). If you’re Conekta-native, it’s two fields on the Order. On Mercado Pago the enablement lives in the dashboard, and your code only carries the installments count — just don’t accidentally reach for onboarding_credits when you meant card installments.
The shared reality: you eat the financing fee — price it in
MSI is a growth lever, not free money. The merchant absorbs the financing cost of those months, so a 12-MSI sale nets you less than the same cart paid in full. The engineering-adjacent decision is pricing: either bake the expected MSI cost into your list price, or gate longer plans (18/24) behind higher cart minimums so the fee stays proportional. The per-plan minimums above are your natural gate — a MXN 300 cart can only ever be 3 MSI, and that’s fine.
Everything downstream of the buyer’s choice is ordinary payment engineering. MSI changes what the buyer is offered and who eats the fee; it does not change your webhook, idempotency, or settlement plumbing. Verify webhook signatures, dedupe on idempotency keys, and reconcile settlements against the plan the buyer actually chose (the installment count comes back on the confirmed payment/order). If you’re deciding how to learn payment state, webhooks vs polling vs API walks through the tradeoffs. And when an MSI sale needs a CFDI, auto-invoice CFDI from Stripe/Mercado Pago shows how to invoice the full amount even though it settles over months.
Related payments guides on cesarayala.dev
- Payment gateways in Mexico: Stripe vs Mercado Pago vs Conekta — pick the rail before you wire MSI.
- Stripe installments not showing in Mexico — the fix — the Automatic Payment Methods trap in depth.
- How to integrate Stripe into your SaaS — the PaymentIntent + webhook baseline.
- Conekta integration: cards, OXXO, SPEI + webhooks — the Order + webhook plumbing MSI sits on.
- How to integrate Mercado Pago (Checkout Pro, Bricks, webhooks) — the baseline both MP products build on.
- Auto-invoice CFDI from Stripe & Mercado Pago — invoice the MSI sale for the LATAM payments stack.