Back to the journal
Momo Business Guides

Take payments inside a flow

Collect payment by prompt, link or lipa number, hold a booking until it is paid, create orders priced from the catalogue, refund with approval — and where the money lands.

A flow can ask for money and wait for it to arrive. One step does it — Collect payment — and the conversation holds until the payment settles, expires or is cancelled. This guide explains what the customer sees, where the money lands, and what to draw so that nothing is promised before it is paid.

Message flows run on WhatsApp in this release, and payments inside them use the mobile-money and card gateway the platform is connected to.

The one step for money: Collect payment

Set the amount in whole money — 12500, or {{vars.oda.total}} from an order — and the method:

Method The customer gets
ussd_push a payment prompt on their phone (M-Pesa, Tigo Pesa, Airtel Money, HaloPesa)
link a checkout page to open
lipa a lipa number to pay from any app
ask three buttons — they pick, and the flow charges the way they chose

The step talks three times on its own: before the gateway is called ("Naandaa ombi la malipo… subiri kidogo" — it promises nothing, because there is no prompt yet), once the ask is out (where the prompt went, the lipa number, or the link), and if the ask could not be started (nothing was charged). Each line can be your own wording; set notify off only if the steps that follow say it themselves. A customer who types ghairi or cancel while the prompt is open cancels it.

The step leaves by paid, failed, expired (after expires_in_minutes, default three hours) or cancelled. Draw all four. A payment step that leads nowhere on failed is a customer left with a checkout open and nobody saying anything.

{{vars.payment}} holds payment_id, reference, state, amount, currency, and the checkout_url or payment_token when there is one. Use the reference in your confirmation message.

Pay before you confirm

When the payment is for a record — a booking, a seat, an order row in your Data tables — set hold_table_id and hold_record_id (usually {{vars.booking.$id}}). The record is held while the payment is open, and a booking whose payment never settled can be swept later instead of sitting confirmed and unpaid. See Organize business records with Data tables for the tables side.

Orders first, then payment

Create order turns what the conversation gathered into a real order. Lines that come from a variable (items_from) are priced from the catalogue — a line the catalogue does not know is dropped and named in {{vars.__order_error}}, and the price the customer typed is never charged. Lines you type on the step yourself are charged as written. Then Collect payment charges {{vars.order.total}}. The catalogue guide covers the products.

Refunds

Refund payment gives back some or all of a payment collected earlier. Every refund goes to a person for approval — the flow is software, and money leaving is a decision — and the conversation waits for the answer unless you draw pending_approval. The approver sees it in Approvals.

Where the money lands

Payments are collected by the gateway the platform is configured with, into the settlement account attached to your workspace; they appear in Payments with the flow, conversation and step that raised them, and the customer's wallet history shows the same reference. A workspace with its own approved gateway can be switched to collect directly — ask us. The reconciliation guide, Reconcile pending mobile-money payments, is what to read when a payment shows pending for longer than the prompt lived.

The older Take payment step (payment_request) is retired: flows that still carry it keep running, but the palette no longer offers it and publish warns. Move to Collect payment when you next edit.

What it costs, and what stops it

Flow messages are charged like any other WhatsApp message from your wallet. A flow cannot send when the wallet is empty — the conversation ends and the owners are told — so keep the balance in view in Billing. Payments in flows are not on every plan.

Try it safely

In the Studio a payment step always answers paid and marks the variable simulated; to test the failed and expired branches, use Make a step answer… and pick the exit. Nothing is charged in a simulation. Then run one real payment from a phone you control before you publish widely.

Where next

Thanks for reading.Explore more stories