access_tier, and whether the
store is a location of your own or a restaurant you integrate for. Listo never
charges the restaurant for a plan you pay, and never learns what you charge it:
bill your own clients however you like.
Some partners’ agreements with Listo work the other way: each restaurant pays its
own Plan Listo, and you pay nothing for it. If that is your agreement, Listo has
set it on your account and the rest of this page about charges to you does not
apply to you. Where each restaurant pays its own plan
says what changes. If you are not sure which one you have, ask Listo.
A live store without a paid-up plan cannot request couriers. Test stores have no
plan, never pay one and are never refused for lack of one.
What a plan costs
At list price, Plan Listo is MX$1,990 plus IVA a month for each store:199000
cents before IVA, 230840 with it. If you agreed a different price with Listo,
every one of your stores is charged the price agreed with Listo instead.
A price is per store and never pooled. Ten live stores are ten plans, each with
its own renewal date and its own charge.
When your agreed price changes, the change reaches each store at its next
renewal. The month a store already paid for does not move, and a store you
create after the change starts at the new price. Listo emails you when it
happens.
The plan covers the couriers, the Listo console and the WhatsApp AI assistant for
that store. A store on the full tier that runs the assistant past the
conversations its plan includes is charged for those too, and they are charged to
you along with that store’s plan.
When it is charged
The plan starts the day you create the store with a live key, and the first month is charged in that same request. If your balance and card cannot cover that first charge, the store is still created but the plan has not started: it starts the day that charge is paid (when the first charge cannot be paid). From then on it renews every month on the same day of the month. A store created on the 29th, 30th or 31st moves to an earlier day the first time a month is shorter, and stays there. While the plan is paid up,next_charge_on on the store carries the exact date.
Each charge is paid from your live balance or from the card saved on your
account, whichever you choose on the Planes y facturación page of the
partner dashboard, with the other one as an
optional backup when the first cannot pay. It is never paid from a store’s own
balance, and never from your test balance.
A month paid from the balance spends against balance_cents, exactly as a
delivery does, and appears on
GET /v1/ledger as a
plan_charge row with the whole amount, IVA included, the store in store_id
and a delivery_id of null. A month paid by card moves nothing on your balance and writes no ledger
row. See balance and withdrawals.
When the first charge cannot be paid
A store whose first charge your balance and card cannot cover is still created, and the create still answers201 with the store. It has no plan yet: its plan
reads awaiting_payment, and every delivery it asks for is refused with 402 plan_required until the month is paid. Nothing is past due, because nothing has
been used.
Listo charges it by itself the moment your live balance or your card covers it,
as soon as you top up or save a card, and from then on the store can request
couriers. You are told once that the store is waiting (see
what Listo tells you), and the price it will be charged
is already fixed: it is the one your store took when it was created.
When a charge fails
A renewal your balance or card cannot pay leaves a store that was already runningpast_due, and every delivery it asks for is refused with 402 plan_required
until the month is paid.
Listo tries the charge again as soon as you top up your live balance or save a
card, and every day until it goes through. You are told when the charge fails,
and three days before a renewal your balance cannot cover (see
what Listo tells you).
Reading plan on a store
Every store object carries plan: the create response, GET /v1/stores/{id},
every row of GET /v1/stores, the update response, and the store object a
store.updated event carries.
plan is null when the store needs no plan: a test store, or a live store created before Plan Listo existed, which keeps requesting couriers without one. If your agreement has each restaurant pay its own plan, plan is also null on a store whose restaurant has not bought one yet.
When plan is an object, every key in it is always present, and the ones that do
not apply are null.
paid_by is "store" while a restaurant you connected is still paying its own plan: pending_paid_by is then "partner" and pending_paid_by_on is the date of its next renewal, the day the plan becomes yours and your first charge. On every other store both are null. If your agreement has each restaurant pay its own plan, paid_by is "store" for good and price_cents and interval are the price and the billing interval the restaurant pays. The one exception is a plan you were already paying on the day your agreement changed: it stays paid_by: "partner" until its next renewal, with pending_paid_by: "store" and pending_paid_by_on the day it passes to the restaurant, and next_charge_on is null because you are not charged again.
paid_by and billing answer different questions, and neither can be read off
the other. billing says whose balance pays the store’s deliveries, and
follows access_tier. paid_by says who pays its plan, which is you on every
tier. A full store reads billing: "store" and paid_by: "partner".
A change to a store’s plan sends a store.updated event carrying the whole
store object, plan included: a plan that starts, a monthly renewal, a charge
that fails or goes through, a cancellation, its undo, a plan that ends, a
restart, a change of your price, and a plan moving to you. One act sends one
event, carrying the state the plan ended in: a new store whose first charge
cannot be paid sends a single event reading awaiting_payment, never an active
before it.
Changes that land close together can arrive as one event carrying the latest
state, so read the plan each event carries rather than counting events. See
webhooks. When a restaurant connects, its
store.connected comes first and shows the plan as it stood when the owner
approved; the store.updated for the plan passing to you follows it.
When a quote or a delivery is refused
A live store without a paid-up plan answers402 plan_required on
POST /v1/quotes, on
POST /v1/deliveries and on
POST /v1/deliveries/{id}/retries.
The quote refuses too, because it would promise a price for a delivery the create
would then refuse. Nothing was created, nothing was dispatched, and nothing was
taken from your balance.
error.message names the one it is:
retryable is false: the identical request fails until somebody on your side
pays, restarts the plan or hears back from Listo, or until the cycle renews. Branch on the code, surface it
to whoever manages your Listo account with error.message, and tell the reasons
apart by error.message alone. Do not read the store’s plan.status for that: a
store whose plan is active can still have used all the deliveries it includes,
so plan.status stays active for that refusal.
A card order created while the plan was paid up still dispatches when your
customer pays, even if the plan lapsed in between: the order passed the check
when it was created.
Ending a store’s plan
POST /v1/stores/{id}/plan_cancellation
cancels a store’s plan, which the dashboard calls Dar de baja. It takes no
body. The plan ends at the end of the month you already paid, with no refund,
and the store keeps requesting couriers until then. It answers 200 with the
store, whose plan now reads canceling, with canceled_at and ends_on filled
in and next_charge_on at null.
A plan whose charge is pending (past_due) has no paid month left to run out,
and the store is already without couriers, so it ends the day you cancel it:
the store answers with its plan canceled and that day in ends_on.
From ends_on the plan is canceled and deliveries are refused with
plan_required: a plan paid through 6 October reads ends_on: "2026-10-07" and
stops serving that day. Nothing else goes away: the store keeps its id, its
delivery history, its balance if it owns one, and its invoices, and nothing more
is charged for it.
Idempotency-Key is required, as it is on a delivery create. Repeating the call
with the same key answers with the original response, so a cancellation that
timed out can be sent again safely.
409 not_cancellable means there is no plan to cancel: the store is already
canceling, its plan has ended, or it needs no plan at all.
Changing your mind
DELETE /v1/stores/{id}/plan_cancellation
undoes a cancellation before ends_on. The plan goes back to active and
renews on the date it would have, as if you had never canceled it. It answers
200 with the store.
It is safe to repeat. On a store whose plan is running with no cancellation to
undo, it changes nothing and answers 200 with the store as it is. Once the plan
has ended it is too late to undo, and the answer is 409 plan_ended, whose
message gives the date the cancellation took effect: restart the plan with
POST /v1/stores/{id}/plan instead.
A connected restaurant that is still paying its own plan decides its own
cancellation until the plan moves to you. In that window a cancellation of its
plan answers 409 not_cancellable, and so does an undo of a cancellation the
restaurant gave.
Restarting an ended plan
POST /v1/stores/{id}/plan
restarts the plan of a store whose plan is canceled. It takes no body. It
charges a new month right away, from the same balance or card any other charge
would use, and from then on the plan renews every month on the day of the month
you restarted it. It answers 200 with the store, its plan active.
Idempotency-Key is required here too. A restart that timed out and is repeated
with the same key answers with the original response rather than charging a
second month.
All three plan endpoints answer
404 not_found to a test key, because a test store
has no plan to end or restart.
A restaurant that already pays its own plan
A restaurant that runs on Listo with an account of its own, and connects to you, may already be paying its own Plan Listo. If it has paid its current month, it goes on paying until its next renewal, and from that renewal its plan is charged to you. A restaurant that prepaid a year moves at the end of that year. Nothing is charged twice, there is no gap between the two, and nothing is prorated. The months it paid before that day are its own: they are invoiced to the restaurant, and never touch your balance, your invoices or your RFC. So is anything it still owed Listo for its own plan when it connected: Listo collects that from the restaurant, you are never told about it, and it never stops the couriers you pay for. Until that day the store readspaid_by: "store", with pending_paid_by: "partner" and the date in pending_paid_by_on. next_charge_on is already your
first charge and price_cents already your price, so the block always describes
what you will pay. The store.connected event for the store shows the plan as
it stood when the owner approved, the restaurant’s own; a store.updated
follows within moments with the block as above, and another arrives when the
plan moves, the day it passes to you included.
If the restaurant cancels its own plan before that day, its cancellation wins:
the plan runs to the end of the time the restaurant already paid for and ends
there, and it is never charged to you. The block then reads status: "canceling" with paid_by: "store" and no pending_paid_by, and your
dashboard says the business canceled its plan and when it ends. You cannot undo
the restaurant’s cancellation, and there is nothing to reactivate until the plan
has ended. From then on the store is an ended store like any other, and
reactivating it starts your own plan that day. If the restaurant takes its
cancellation back while its plan is still running, the move to you is back on,
for the same renewal, and you are told again.
A connected restaurant with no live plan of its own starts one the day it
connects, and that first month is charged to you that day, exactly as for a store
you create.
A connected restaurant whose current month is unpaid when it connects does not
wait for a renewal either: the plan passes to you that day, the month it had not
paid is voided, so nobody is charged for it, and one full month is charged to
you that day, exactly as for a store you create. Whatever it owed Listo for
earlier months stays its own, as above.
What Listo tells you
Every email goes to every user on your partner account. The same moments reach you on WhatsApp when you set the number for charge notices on Planes y facturación: one number for the account, optional.- A store’s plan started and its first month was charged.
- A store’s first month could not be covered by your balance or card, so the store is waiting and has no couriers until it is charged. Once per store.
- The stores that renewed today: one email a day, with their invoices.
- A charge failed. Once, when it fails: the daily retries after it are silent.
- A renewal is three days away and your balance does not cover it.
- You canceled a store’s plan, with the day it ends.
- Your agreed price changed, and from when.
- A restaurant you connected is moving its plan to you, and the date.
- A restaurant you connected canceled its own plan before it moved to you, so it does not move to you, and the day it ends.
Invoices
Each paid charge is invoiced with a CFDI to the fiscal data in Datos de factura on Planes y facturación. The invoice is emailed to every user on your account, and to the invoice address in Datos de factura when you set one, and it is listed on that page as PDF and XML, one row per charge and store. Only the months you pay are invoiced to you: a month a connected restaurant paid before its plan moved to you is invoiced to the restaurant. A charge paid before your fiscal data is in is invoiced as soon as you fill it in, and that invoice arrives in an email of its own. Fill it in before you create your first live store, so the first invoice comes with the first charge.Where each restaurant pays its own plan
Some partners’ agreements with Listo have each restaurant pay its own Plan Listo instead of the partner. Listo sets this on your account; it is not something the API or the dashboard changes. When it is set on yours:- You are never charged for a new store-paid period, and none of the charge emails
or WhatsApps above reach you for one. Your balance and your card are not used for
new plan periods. The change is forward only: a month already billed to you
stays yours to pay, a plan you were already paying runs to the end of the period
you paid and passes to the restaurant at its next renewal (
pending_paid_by: "store", with the date inpending_paid_by_on), and nothing is refunded or waived. - A store you create in live mode starts with no plan, so its
planisnull. Before the restaurant can buy Plan Listo, the store must havewalletorfullaccess and its owner must be invited to sign in: the restaurant buys the plan from its own console, in Ajustes > Plan, and pays from its own balance or card like any restaurant on Listo. A live store withapi_onlyaccess has no console, so nobody could buy its plan: creating one, or moving a live store toapi_only, is refused withvalidation_failedandparam: "access_tier", and Listo does not switch your account to this agreement while you hold one. Once the restaurant has bought it,planis an object withpaid_by: "store"and the price andinterval("month"or"year") the restaurant pays. - Until a restaurant has a paid plan, its quotes and deliveries are refused with
402 plan_required, as for any live store without a paid-up plan. There is no trial for these stores: test mode is where you rehearse. - A store that connects to you through connect an existing account keeps paying its own plan, and nothing moves to you.
POST /v1/stores/{id}/plandoes not restart such a plan, because it is not yours to pay: the restaurant does that from its console.
In test mode
None of this happens with a test key. Test stores carryplan: null, nothing is
charged, no quote or delivery is refused with plan_required, and the three plan
endpoints answer 404 not_found. Test mode is where you rehearse everything else; the first
plan you see is on your first live store. See
test mode.