Stripe vs MercadoPago: comparativa para el mercado latinoamericano
Stripe vs MercadoPago: comparativa para el mercado latinoamericano
La elección de una pasarela de pagos condiciona la arquitectura de tu aplicación, la experiencia del usuario y tu capacidad de covertir en cada mercado. En Latinoamérica, esta decisión se complica: la fragmentación de métodos de pago, las regulaciones cambiantes y la volatilidad cambiaria exigen evaluar cuidadosamente cada opción. Stripe y MercadoPago son los dos actores dominantes, pero sus fortalezas difieren según el contexto.
El escenario latinoamericano: más que tarjetas de crédito
Antes de comparar código, entendamos el territorio. En Brasil, boleto bancário representa entre 15% y 20% de las transacciones online. En México, OXXO Pay procesa millones de pagos regulares. En Argentina, la inflación obliga a lógicas de precios complejas. Cada país tiene idiosincrasias que una solución global puede subestimar.
Stripe entró a Latinoamérica de forma progresiva: primero México (2019), luego Brasil (2020). MercadoPago, nacido como brazo financiero de MercadoLibre en 2003, tiene décadas de procesamiento local. Esta diferencia de origen se traduce en APIs, modelos de negocio y cobertura geográfica distintas.
Disponibilidad geográfica y métodos de pago
Stripe opera con funcionalidad completa en México y Brasil. En Chile, Colombia y Perú ofrece Stripe Tax para cálculo de impuestos, pero el procesamiento de pagos locales está en expansión limitada. Su fortaleza radica en tarjetas internacionales (Visa, Mastercard, Amex) y wallets globales como Apple Pay y Google Pay.
MercadoPago tiene presencia robusta en Argentina, Brasil, México, Chile, Colombia, Perú, Uruguay y Venezuela. Soporta métodos locales que Stripe no cubre: cupones de pago (OXXO, PagoFacil, Rapipago), transferencias bancarias inmediatas (Pix en Brasil, SPEI en México) y su propia billetera con millones de usuarios activos.
Si tu producto digital atiene usuarios en múltiples países latinoamericanos, MercadoPago ofrece cobertura más uniforme. Si tu audiencia concentra en Brasil o México y tiene alta penetración de tarjetas internacionales, Stripe compite fuertemente.
Implementación: creando un checkout básico
Evaluemos el código necesario para procesar un pago simple con tarjeta en ambas plataformas.
Stripe: Payment Intents
Stripe prioriza la confirmación del pago del lado del cliente con PaymentIntent, diseñado para cumplir SCA (Strong Customer Authentication) de forma nativa.
// Backend: Node.js creando PaymentIntent
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
app.post('/create-payment-intent', async (req, res) => {
const { amount, currency } = req.body;
const paymentIntent = await stripe.paymentIntents.create({
amount: amount, // en centavos: 5000 = 50.00
currency: currency, // 'mxn', 'brl'
automatic_payment_methods: { enabled: true },
// Stripe detecta métodos habilitados en tu cuenta
});
res.send({
clientSecret: paymentIntent.client_secret
});
});
// Frontend: React con Stripe Elements
import { loadStripe } from '@stripe/stripe-js';
import {
Elements,
PaymentElement,
useStripe,
useElements
} from '@stripe/react-stripe-js';
const stripePromise = loadStripe(process.env.REACT_APP_STRIPE_PUBLIC_KEY);
function CheckoutForm() {
const stripe = useStripe();
const elements = useElements();
const [errorMessage, setErrorMessage] = useState(null);
const handleSubmit = async (event) => {
event.preventDefault();
const { error } = await stripe.confirmPayment({
elements,
confirmParams: {
return_url: 'https://tudominio.com/confirmacion',
},
});
if (error) {
setErrorMessage(error.message);
}
};
return (
<form onSubmit={handleSubmit}>
<PaymentElement />
<button type="submit">Pagar</button>
{errorMessage && <div>{errorMessage}</div>}
</form>
);
}
El flujo de Stripe separa claramente la creación del intento (servidor) de la confirmación del pago (cliente). El client_secret es la pieza que vincula ambos mundos. Stripe Elements maneja automáticamente validación de tarjeta, detección de marca y casos de autenticación 3D Secure.
MercadoPago: Preferences y Checkout Pro
MercadoPago ofrece múltiples integraciones. Checkout Pro redirige al usuario a una página hospedada por MercadoPago. Checkout API permite control total del frontend. Veamos la versión API para comparación justa.
// Backend: Node.js creando preferencia con Checkout API
const { MercadoPagoConfig, Preference } = require('mercadopago');
const client = new MercadoPagoConfig({
accessToken: process.env.MP_ACCESS_TOKEN
});
app.post('/create-preference', async (req, res) => {
const { title, quantity, unitPrice } = req.body;
const preference = new Preference(client);
const result = await preference.create({
body: {
items: [{
id: 'producto-001',
title: title,
quantity: quantity,
unit_price: unitPrice, // en moneda local, sin centavos forzados
currency_id: 'MXN' // 'BRL', 'ARS', 'CLP'
}],
payer: {
email: req.body.email
},
payment_methods: {
excluded_payment_types: [], // puedes filtrar métodos
installments: 12 // cuotas máximas
},
back_urls: {
success: 'https://tudominio.com/exito',
failure: 'https://tudominio.com/error',
pending: 'https://tudominio.com/pendiente'
},
notification_url: 'https://tudominio.com/webhooks/mercadopago',
auto_return: 'approved'
}
});
res.send({
preferenceId: result.id,
initPoint: result.init_point, // URL para redirección Checkout Pro
sdkInitPoint: result.sandbox_init_point
});
});
// Frontend: React inicializando MercadoPago SDK
import { initMercadoPago, Wallet } from '@mercadopago/sdk-react';
initMercadoPago(process.env.REACT_APP_MP_PUBLIC_KEY, {
locale: 'es-MX'
});
function Checkout({ preferenceId }) {
return (
<div>
{/* Opción 1: Wallet de MercadoPago (iframe embebido) */}
<Wallet
initialization={{ preferenceId: preferenceId }}
customization={{ texts: { valueProp: 'smart_option' } }}
/>
{/* Opción 2: Redirección a Checkout Pro */}
<a href={initPoint}>Pagar con MercadoPago</a>
</div>
);
}
MercadoPago maneja el concepto de preferencia, que encapsula múltiples objetos de pago, descuentos, envío y configuración de métodos. La granularidad de control sobre métodos de pago (habilitar/deshabilitar cuotas, excluir tipos específicos) es superior a Stripe para el mercado local.
Webhooks y confirmación de pagos
Ambas plataformas usan webhooks para notificar eventos asíncronos, pero sus modelos difieren.
Stripe firma los payloads con un secreto verificable. La estructura de eventos es uniforme globalmente.
// Verificación de firma de webhook en Stripe
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
const express = require('express');
app.post('/webhooks/stripe', express.raw({ type: 'application/json' }), (req, res) => {
const sig = req.headers['stripe-signature'];
let event;
try {
event = stripe.webhooks.constructEvent(
req.body,
sig,
process.env.STRIPE_WEBHOOK_SECRET
);
} catch (err) {
return res.status(400).send(`Webhook Error: ${err.message}`);
}
switch (event.type) {
case 'payment_intent.succeeded':
const paymentIntent = event.data.object;
console.log('Pago exitoso:', paymentIntent.id);
// Actualizar orden, enviar confirmación
break;
case 'payment_intent.payment_failed':
console.log('Pago fallido:', event.data.object.last_payment_error);
break;
default:
console.log(`Evento no manejado: ${event.type}`);
}
res.json({ received: true });
});
MercadoPago envía notificaciones IPN (Instant Payment Notifications) o webhooks con estructura propia. No firman criptográficamente por defecto; validas consultando la API con el topic y id recibidos.
// Procesamiento de notificación de MercadoPago
const { Payment } = require('mercadopago');
const express = require('express');
app.post('/webhooks/mercadopago', express.json(), async (req, res) => {
const { type, data } = req.body;
// MercadoPago notifica: type='payment', data.id='123456789'
if (type === 'payment') {
const paymentId = data.id;
// Consulta idempotente a la API para verificar
const payment = new Payment(client);
const paymentData = await payment.get({ id: paymentId });
if (paymentData.status === 'approved') {
console.log('Pago aprobado:', paymentData.id);
// Verificar monto y external_reference antes de procesar
} else if (paymentData.status === 'pending') {
console.log('Pago pendiente, esperar:', paymentData.status_detail);
// Ej: 'pending_waiting_payment' para OXXO
}
}
res.status(200).send('OK');
});
El modelo de MercadoPago exige una consulta adicional a su API, lo que introduce latencia pero garantiza consistencia. Stripe permite validación inmediata de la firma, reduciendo llamadas de red.
Monedas, precisión y manejo de inflación
Stripe opera con centavos como unidad mínima para todas las monedas. Un producto de $50.00 MXN se representa como 5000. Esto simplifica cálculos pero obliga a conversiones explícitas.
MercadoPago usa la unidad base de cada moneda: pesos mexicanos sin decimales (50 = $50.00), pero pesos argentinos con dos decimales en la API a pesar de la desaparición del centavo físico. Para el desarrollador argentino, esto implica atención especial: la API espera 1000 para $10.00 ARS, aunque no existan monedas de $0.01.
En contextos de alta inflación (Argentina, Venezuela), MercadoPago permite actualizar precios de preferencias activas. Stripe requiere crear nuevos PaymentIntents. Si tu negocio opera con actualizaciones frecuentes de precios, evaluá el impacto en tu modelo de datos.
Comisiones y estructura de costos
Las tarifas varían por país y método, pero la estructura general es:
- Stripe: comisión por transacción procesada (típicamente 3.6% + $3.00 MXN en México, 3.99% + R$0.40 en Brasil). Sin cargos mensuales fijos. Desembolsos en 2 días hábiles para Brasil, 7 para México en nuevas cuentas.
- MercadoPago: comisiones que oscilan entre 3.49% y 5.99% según medio de pago y volumen. Cuotas sin interés asumen el costo del vendedor. Desembolso en 1 día hábil para cuentas con historial.
Stripe ofrece precios más predecibles para tarjetas internacionales. MercadoPago puede resultar económicamente superior si tus usuarios pagan con su billetera o medios de bajo costo como Pix (Brasil) o transferencias SPEI (México).
Dev experience: SDKs, documentación y comunidad
Stripe mantiene SDKs oficiales para node, python, ruby, php, java, go, .net, además de React y React Native. La documentación es exhaustiva, con tutoriales interactivos y entornos de prueba que simulan escenarios de falla.
MercadoPago renovó sus SDKs en 2023, migrando de librerías legacy a @mercadopago/sdk-react y mercadopago para backend. La documentación está mejorando pero presenta inconsistencias entre versiones. La comunidad hispanohablante es más activa en foros específicos del ecosistema MercadoLibre.
Para debugging, Stripe ofrece stripe listen (CLI) que reenvía webhooks locales en tiempo real. MercadoPago requiere herramientas externas como ngrok para el mismo flujo. Esta fricción adicional impacta en la velocidad de desarrollo.
Cuándo elegir cada plataforma
Elegí Stripe si:
- Tu audiencia concentra en México/Brasil con tarjetas bancarias
- Necesitas procesar pagos internacionales (USD, EUR) sin fricción
- Priorizás infraestructura de suscripciones (Stripe Billing) o marketplace (Stripe Connect)
- Tu equipo valora herramientas de desarrollo maduras y consistentes globalmente
- Integrás con plataformas como Shopify, WooCommerce o sistemas de contabilidad anglosajones
Elegí MercadoPago si:
- Operás en Argentina, Chile, Colombia o Uruguay donde Stripe tiene presencia limitada
- Tus usuarios prefieren efectivo (OXXO, Rapipago), transferencias inmediatas (Pix, SPEI) o la billetera MercadoPago
- Necesitás ofrecer cuotas sin integraciones adicionales
- Tu modelo incluye cobros recurrentes con medios locales que Stripe no soporta
- La penetración de tarjetas de crédito en tu segmento es baja
Arquitectura híbrida: no es excluyente
Equipos maduros implementan ambas pasarelas, enrutando según contexto:
// Servicio de enrutamiento de pagos
async function procesarPago(orden, metodoPago, paisUsuario) {
const estrategia = seleccionarPasarela({
pais: paisUsuario,
metodo: metodoPago, // 'tarjeta_credito', 'oxxo', 'pix'
moneda: orden.moneda,
usuarioTieneWalletMP: await verificarWalletMP(orden.usuarioId)
});
switch (estrategia) {
case 'stripe':
return await stripeService.crearPago(orden);
case 'mercadopago':
return await mpService.crearPreferencia(orden);
case 'ambos_disponibles':
// A/B testing o lógica de costo
return await optimizarPorComision(orden);
}
}
Esta complejidad introduce mantenimiento, pero maximiza conversión cuando el costo de oportunidad de rechazar un pago supera el overhead de desarrollo.
Conclusión
No existe pasarela universalmente superior. Stripe gana en desarrollo internacional, consistencia de API y herramientas de infraestructura financiera. MercadoPago domina en cobertura geográfica latinoamericana, métodos de pago locales y penetración de billetera entre consumidores de la región.
Para equipos que inician: evaluá cuál método de pago usa el 80% de tu audiencia objetivo e implementá esa pasarela primero. Medí conversión real, no proyectada. Los 12 puntos porcentuales de diferencia en aprobación entre una y otra pueden significar el crecimiento sostenible de tu negocio o su estancamiento en el primer año.