Store Builder

The Payments app

Take money on your storefront through your own VNPay, MoMo, payOS or ZaloPay account — the money reaches you directly, not the platform.

Manage → Apps carries a Payments card on the Built-in shelf. Once installed, it opens two tabs: Gateways, where your keys go, and Transactions, where every charge is listed.

The money is yours

This is your account with the gateway, not the platform's. You open one with VNPay, MoMo, payOS or ZaloPay, paste the keys here, and what a shopper pays lands in that account. The platform never holds the money and takes no cut per order — the fee is the gateway's, on terms between you and them.

With no gateway connected, the store still sells: orders still arrive, and you collect the money however you already do — cash on delivery, a transfer by hand. An order's three independent statuses are covered in Orders.

The two things people miss

Read these first. Both fail without an error message: the page still works, the shopper still pays, and only the outcome is wrong.

The callback address has to be pasted into the gateway

Each gateway shows a Callback URL with a copy button. VNPay and payOS do not take that address per payment — they read one address configured in their dashboard. You have to go there and paste it into the IPN / webhook field.

Skip that step and a shopper pays successfully, the money reaches your account, and the store never finds out: the order sits at Unpaid forever. Nothing reports an error, because as far as the store is concerned nobody ever called back.

The method's name IS its value

In the form builder, the Payment method field drops already carrying the list of gateways you have switched on. Do not rewrite the entries. The string a shopper picks is the string the store looks the gateway up by: vnpay finds VNPay, VNPay card finds nothing.

Prettify the wording and shoppers can still pick it, orders still arrive, and no gateway ever opens — the shopper waits for a payment page that never comes. If you want different wording, change it after you have run a test order and can check it again.

Entering the keys

Each gateway asks for what it needs, and every field carries a line saying where to find that value in the gateway's own dashboard.

  • A secret key is write-only. Once saved, the field only reports that a key exists — nobody can read it back, you included. It is encrypted before it touches disk. Type over it to change it; leave it empty on save to keep it. Fields that are not secret (VNPay's terminal code, MoMo's partner code) do read back: they already travel in the open, in the payment URL.
  • Test mode is the STORE's choice, not the platform operator's. Switched on, payments go to the gateway's sandbox. Test there first, always — this platform is written to each gateway's published documentation, and only a real order through the sandbox proves your account agrees with it.
  • Forget keys deletes every key stored for that gateway. Charges already taken through it are kept.

Every gateway here takes VND only, for now.

Your store needs a real public address — a custom domain, or a published subdomain. The gateway calls back to that address, so a store that has none is refused a payment rather than opening one that could never be reconciled.

How a shopper pays

Add the Payment method field to your order form (form builder → the Basic group). It drops already wired to the order's payment column and already carrying your gateways.

A shopper picks one and submits: the order is written first, then the browser goes to the gateway's page. A shopper picking Cash on delivery sees the thank-you message, like any other form.

The order is written before the shopper leaves, deliberately: money arriving with no order behind it is money nobody can reconcile.

The store believes only the gateway's signed callback, never the browser. A shopper who gets back to the completion page before the callback arrives sees Pending for a moment — which is the truth at that moment, and it changes on its own when the callback lands.

The Transactions tab

Every charge is a row: the gateway, the reference, the amount, the status, the pay link.

One order can have several rows. A shopper who abandons VNPay and comes back through MoMo is two charges against one order — and that history is exactly what answers "was I charged twice?".

  • Record refund means what it says: it records a refund you have already made, through the gateway's dashboard or by transfer. It moves no money itself. The charge and its order are marked refunded, and the original settlement time is left alone — that is the timestamp you reconcile a bank statement against.
  • Abandoned charges expire after a day. Most payments are opened and never paid — the shopper closes the tab, and no gateway reports that. Left alone, the list fills with rows stuck at Pending forever, and the two that really are live are lost among them.

Removing the app

Switch every gateway off first. An app that is "removed" while shoppers are still being sent to a payment page — and money is still arriving — is a state that must not exist, so the store refuses until you have.

Removing it keeps your keys: install it again and they are still there.

Updated 02/09/2026