How do I integrate SPEI transfers into my e-commerce checkout via a payment API?
Question
Answers
I've done this integration twice—once with Conekta and once with Clip/OpenPay. My recommendation is Conekta if you want a single SDK that handles both SPEI and card in the same API.
For SPEI orders they return a virtual CLABE with a 72-hour expiry window (configurable). The webhook fires within 3-5 seconds of Banxico confirming the transfer. Here's the rough flow:
const order = await conekta.orders.create({
currency: 'MXN',
customer_info: { name, email, phone },
line_items: [{ name: 'Product', unit_price: 50000, quantity: 1 }],
charges: [{ payment_method: { type: 'spei' } }]
})
// order.charges[0].payment_method.clabe ← send to customer
Gotcha: CLABE is tied to the order amount. If the customer sends a different amount the transfer still arrives but lands in an exception queue — you need to handle reconciliation logic explicitly.
Adding to the above — if you also need meses sin intereses, be aware that not all processors support it through the same API object. Stripe México added MSI support in 2024 via payment_method_options.card.installments, which makes it cleaner if you're already on Stripe globally.
One important gotcha I hit: MSI is only available on Mexican-issued cards (Banamex, BBVA México, Santander MX, etc.). Cards issued by international banks will just ignore the installment option and charge in full. Your checkout UI should detect the BIN and conditionally show MSI.
Integration time: ~2 weeks for a clean implementation including webhooks, reconciliation logic, and a basic retry handler for failed webhooks.
Thanks both — this is really helpful.
@spei_builder regarding the exception queue for wrong-amount transfers: does Conekta provide an API to query that queue and manually match transfers? Or do you have to handle that entirely on your end by checking transaction amounts against open orders?
Also — does either provider support CoDi / DiMo (QR transfers) in the same integration, or would that require a separate integration layer?
@carlos_dev Yes, Conekta exposes a transfers endpoint where you can list unmatched/pending SPEI transfers and manually reconcile them against order IDs. It's not fully automated but it covers the most common cases.
For CoDi/DiMo — as of early 2026, none of the major third-party processors support CoDi natively. You'd need a direct bank integration (BBVA, Banorte, etc.) which typically requires a commercial banking relationship. For most e-commerce use cases SPEI + OXXO covers 95%+ of Mexican payment preferences anyway.
One more thing worth adding: make sure your webhook endpoint handles duplicates. Banxico sometimes re-triggers confirmations and the provider may fire the webhook twice for the same transfer. Always check order_id + charge_id idempotency on your side before marking an order paid.
We run a simple Redis dedup set with a 24-hour TTL keyed on the webhook event ID. Has saved us from double-fulfillment several times.
We are building an e-commerce checkout for a Mexican market and want to support SPEI bank transfers alongside card payments.
I'm looking for a Mexico payment API that:
We're on Node.js. Has anyone actually integrated something production-grade in Mexico? What providers did you use and how long did the integration take? Any gotchas with CLABE expiry or partial payments?