- One environment, end to end. The payer and the merchant point at the same Atum environment — matching gateway/facilitator URLs, and the stub flag off on both sides. See Choose an environment.
- Current example and package versions. You pulled the latest
examplesrepo and reinstalled (git pull && npm install). - The right wallet. You’re using your current testnet wallet, not a stale credential. If you exported
PRIVATE_KEYin your shell earlier, rununset PRIVATE_KEYso the value in.envis the one that’s used. - Funds in place (payer). The payer wallet holds enough source token, enough native coin for the one-time Permit2
approve(), and an active Permit2 allowance on the source token. - A valid receive address (merchant).
DEST_ADDRESSis a real address you control on the destination chain. - A short, intentional quote deadline. Keep the quote window tight so a stalled quote round fails fast instead of hanging.
- Record the payment identifier before troubleshooting. Capture the settlement transaction / payment ID (x402) or the
Payment-Receipt(MPP) as soon as you have it. - Verify before retrying. After a timeout or ambiguous result, confirm settlement on-chain or via the gateway before resending — a fresh retry is a second payment. See Troubleshooting.
Start here
Pre-flight checklist
Run through this before switching the x402 or MPP examples off the stub and settling a real payment on testnet or mainnet.
This is the go/no-go list for the x402 and MPP examples. For what your wallet needs on each side — funds, gas, allowances, and a receive address — start with Prerequisites.
Local stub runs need none of this — no funds move. Before you switch the stub off and settle for real, confirm: