How to charge subscriptions with MercadoPago in a SaaS: what I learned building LeadsLocales
Charging in pesos every month without anyone paying by hand. How MercadoPago recurring billing works, why the plan is activated by the webhook and not the redirect, and the business decisions I made in LeadsLocales.

To charge subscriptions with MercadoPago in a SaaS you use its subscriptions API, known as preapproval: the user authorizes a recurring charge on their card once, MercadoPago bills it every period and notifies your backend via webhook. The most important rule is that your app activates the plan when it confirms the status with MercadoPago, not when the user comes back from checkout.
That is how billing works in LeadsLocales, my lead-generation SaaS. Here is the flow, the technical safeguards and the business decisions around it.
Why MercadoPago for an Argentine SaaS?
Because your users already have it. A freelancer or agency in Argentina has most likely paid for something with MercadoPago, has their card saved and trusts the checkout. You also charge in pesos, so users do not have to pay in dollars with an international card, which can be a real barrier in Argentina.
Like any payment provider, MercadoPago takes a fee on each payment. Check the current terms on its site before setting your prices, since they change over time and depend on the payout timing you choose.
What is preapproval and how does it work?
A preapproval is a subscription: an agreement in which the user authorizes your account to charge them an amount every period. MercadoPago lets you create them tied to a plan (you define the plan once and each user subscribes to it) or without a plan (you create the subscription with the amount and frequency directly).
Each subscription has a status. The ones you will see most are pending (created, not yet authorized), authorized (active, charged every period), paused and cancelled. Your app needs to mirror that status: it is the source of truth on whether the user is paying. Exact endpoint, field and event names can change, so always keep MercadoPago’s official docs open.
What does the full flow look like, step by step?
- The user picks a plan on your pricing page.
- Your backend creates the subscription in MercadoPago, including an external reference with the user id so you know whose it is later.
- You redirect the user to MercadoPago checkout using the link the API returns.
- The user authorizes the charge with their card or account.
- MercadoPago notifies your webhook that the subscription changed.
- Your backend fetches the subscription by id, confirms the status and activates the user’s plan.
- Every period, MercadoPago attempts the charge and notifies you again. If it fails or the user cancels, your app reflects it.
Why does the webhook activate the plan, and not the redirect?
Because the page users return to after checkout (the return URL) is just that: a page. Anyone can open it by copying the address, users can close the tab before it loads, or the payment can stay pending. If you activate the plan there, sooner or later you will have users on a paid plan who never paid, or users who paid and do not have the plan.
The webhook, on the other hand, is triggered by MercadoPago when something changes. In LeadsLocales, the webhook activates the plan automatically: users come back to the platform and their plan is already active, without anyone doing anything by hand. The return page just shows a "confirming your payment" message.
What safeguards does the webhook need?
- Do not trust the notification body. Treat it as a heads-up and fetch the subscription from the API with your credentials to read the real status.
- Validate the signature. MercadoPago signs its notifications with a secret key you set up in your account: verify it to reject fake calls.
- Respond fast. Return 200 right away and process afterwards. If your endpoint is slow or fails, MercadoPago retries.
- Make it idempotent. The same notification can arrive more than once: processing it twice must not activate two plans or add extra credits.
- Keep a log. Every notification received and every plan change, with timestamps. When a user says "I paid and it did not activate", it is the first thing you will check.
- Test with test users. MercadoPago provides test credentials and test users to simulate the whole flow without real charges.
What does your app do in each subscription status?
| Status | What it means | What your app does |
|---|---|---|
| pending | Created, not authorized. | Activates nothing. Shows "payment pending". |
| authorized | Active, charged every period. | Activates the plan and renews its benefits each period. |
| paused | Paused, not charged. | Depends on your policy: suspend benefits or grant a grace period. |
| cancelled | Ended. | Moves the user to the free plan and keeps whatever your policy says. |
Status names follow MercadoPago’s subscriptions API; double-check them in the official docs when you implement.
How is billing set up in LeadsLocales?
LeadsLocales has a free plan and paid plans in pesos with recurring billing via MercadoPago PreApproval and an automatic activation webhook. Each plan comes with monthly credits to open business contacts.
Two business decisions matter as much as the tech. First: contacts a user has opened stay with them forever, even if they cancel. It builds trust ("I do not lose what I paid for") and lowers churn, because nobody feels they have to keep paying to keep their work. Second: the admin panel lets me change a user’s plan by hand (override), with an activity log. There is always an edge case, like an extended trial or a payment settled some other way, and it is better to handle it without touching the database.
See the LeadsLocales technical caseWhat stack did I use?
React on the frontend, Node.js with Express on the backend and SQLite as the database. I explain why I chose SQLite in production in the LeadsLocales story. If you are comparing managed backends for your product, Supabase vs Firebase may help.
Frequently asked questions
Can you charge subscriptions with MercadoPago?
Yes. MercadoPago has a subscriptions API (preapproval) that automatically charges the user’s card every period and notifies you by webhook. It is what LeadsLocales uses for its paid plans in pesos.
When should you activate the user’s plan?
When you confirm with MercadoPago that the subscription is authorized, not when the user lands back on your site after checkout. Anyone can open the redirect URL; the status fetched from the API is the reliable source.
What happens to what users already paid for if they cancel?
It is a business decision. In LeadsLocales, the contacts a user has already opened with their credits stay with them forever, even if they cancel: it builds trust and lowers churn.
How much does it cost to build a SaaS with subscriptions?
It depends on the features, how many plans it has, the integrations and the admin panel you need. Tell me your idea over WhatsApp or email and I will send you a fixed quote within 48 hours.
If you have a SaaS idea and need to charge subscriptions in pesos, I build it end-to-end: product, payments, admin panel and server.