orderAction.actionData lives in
API reference tables.
This page does not repeat it.
What do I have to receive and handle if I build my own payment page?
Four things, in this order:
Nothing about step 4 changes when you build your own page. A customer arriving
back on your page is not proof of payment, and a rendered QR code is not proof
of payment. The notification and the inquiry remain the only authoritative
sources.
When is orderAction.actionData actually populated?
Only when the order already resolved to one specific payment method at
create time. This is the single most important rule for a merchant-built
checkout, and it is easy to miss:
The reason is mechanical: when the customer has not chosen yet, no payment has
been submitted to the payment method, so there is no account number, no QR
payload and no expiry to return. They come into existence only after a method
is picked. If you leave the choice to the customer, the choice happens on the
Waffo-hosted page — and at that point the data has nowhere to go except that
page.
So if
actionData is empty and you expected content, check the payment-method
parameters on your create request first.
Which payment instruments come back as raw data, and which force a redirect?
actionData carries whatever the routed payment method produces. Broadly:
Two consequences worth planning for:
- You render the QR yourself.
paymentQris the raw payload string. Encode it into a scannable code client-side, at a size that survives a phone camera. - A method can populate several of these, or none. Which fields arrive is a property of the payment method the transaction routed to, not of the country or of your account. Build your page to render whichever fields are present and to fall back to the redirect when none are.
Can I get a local bank account number — a CLABE, an IBAN, a virtual account?
Yes, through the same field:bankAccount. It carries the account the customer
must transfer to, in whatever form the local system uses — a CLABE in Mexico, an
IBAN elsewhere, a routing plus account number, or a virtual account generated
for that one order. bankName, bankBeneficiary and referenceNumber come
alongside it.
Two caveats:
- It is populated for bank-transfer and virtual-account style methods that
return one. It is not a field you can request for an arbitrary payment
method, and asking for “the CLABE” in the abstract has no answer — the
question is always whether the specific method you are integrating returns a
bankAccount. Verify per method in sandbox before you build the screen. - The rule above still applies: you get it only if you pinned the payment method on the order.
userInfo.userTerminal you will
send — terminal type affects which methods are eligible at all, so the answer
can differ between a PC and a mobile session.
For how these fields behave once the customer transfers — expiry, wrong amount,
reconciliation on referenceNumber — see
Bank transfers and virtual accounts.
apiMethod says POST. Do I have to build and submit a form myself?
On a merchant-built checkout, yes. orderAction describes the redirect
completely, and a POST redirect needs all three parts:
Do not drop or re-encode parameters while doing this — several payment methods
carry required values in the URL or the body, and a rewritten URL fails at the
payment method rather than at Waffo.
If you use the Waffo-hosted checkout instead, this is handled for you: the page
builds and submits the form itself.
Do I have to query payment-method availability and amount limits myself?
Yes. This is the main ongoing cost of a merchant-built checkout, and it is the one most often underestimated.
On the Waffo-hosted checkout all four are automatic: unavailable methods are
grayed out, out-of-range methods are not offered, and a newly signed method
shows up without a code change. On your own page, an out-of-date list turns
into a failed order the customer already committed to.
Who validates the customer fields a payment method requires?
You do, for the fields you send. Several payment methods have fields that are documented as optional on/api/v1/order/create but are mandatory for that
method — a national ID, a phone number, a postcode, an email address. If you
collect them on your own page, you own the format validation, and Waffo’s only
feedback is a rejected order-create call.
The list of which fields become mandatory for which method type is in
Conditionally required fields,
and the field paths that can appear in a missing-field error are in the same
place.
On the Waffo-hosted checkout these fields are collected on the page, with the
payment method’s own format rules applied inline, before the payment is
submitted.
Can I mix the two — self-built for some payment methods, hosted for others?
Yes, and it is decided per order rather than per account. The same/api/v1/order/create endpoint gives you either behaviour:
- Pass a specific payment method → the customer never sees a Waffo selection page, and you receive the instrument or the redirect to drive your own screen.
- Pass no payment method → the customer lands on the Waffo-hosted checkout and chooses there.
Can I build the over-the-counter store selection page myself?
Not as a self-serve integration. For over-the-counter methods where the customer picks a specific store or outlet, the store list is presented by the Waffo-hosted checkout during the payment step;actionData returns the payment
code the customer takes to the counter, not the list of places that accept it.
So a merchant-built page can present the code and the instructions, but the
selection step it comes from has no merchant-facing equivalent. If your product
needs that screen inside your own UI, raise it with your Waffo contact as a
product request rather than looking for a parameter.
Can I build my own page for card payments?
Only if you are prepared to be in PCI DSS scope. That is the trade-off in the integration comparison: with the Waffo-hosted checkout, card data never touches your systems. Two intermediate options exist that keep you out of scope while still letting you control the page:- Card tokenization, where the card fields are rendered by the Waffo front-end SDK inside your page — see Tokenization.
- The embedded checkout, where the Waffo checkout is rendered inside your page rather than replacing it — see Checkout integration steps.
Is Apple Pay available to a merchant-built checkout?
Yes — a direct Apple Pay integration against your own Apple merchant identity is one of the supported options, alongside redirecting to the Waffo checkout, loading it in an App WebView, and loading it in an iframe with the Waffo front-end SDK. The four options and what each one requires are set out in Apple Pay integration. What is not available is a plain iframe of the checkout URL for Apple Pay: that path requires the front-end SDK plus domain verification arranged in advance.Does a self-built checkout change my reporting, receipts or refunds?
No. Everything after the payment is identical, because the order is the same order:
The parts that differ are all on the presentation side: payment-method
selection, required-field collection, instrument rendering, status polling and
the result screen.
What does the hosted checkout do that I would have to rebuild?
Worth reading as a checklist before committing:- Payment-method selection, grouping and per-country ranking, plus hiding or graying out methods that are unavailable right now
- Collecting and validating each method’s required customer fields
- Rendering QR codes and barcodes, and offering copy and save actions
- Polling for the payment result and advancing the page when it lands, so the customer is not left on a dead screen
- The retryable-error path, where a transient failure is retried in the background and the page moves on by itself
- Letting the customer pick a different payment method after a failure, without a new order
- The amount breakdown — price, discount, subtotal with the FX rate, customer fee, tax, total
- The display language, including selecting one when you did not send
cashierLanguage - The expired-link and already-paid screens for a link a customer reopens later
Still deciding? Choosing an integration approach has the side-by-side comparison. If you have picked the merchant-built route and need to confirm what one specific payment method returns, contact support with the payment method, the country and the
userInfo.userTerminal you will send.