partner_user_id you supply when creating the
intent — you build nothing for this,
and the PaymentSheet renders the right copy when a
payment is blocked.
Vietnam — VietQR (vn_vietqr)
Limits apply to the local-currency (VND) value of the payment at the bound
quote, per
partner_user_id.
For corridors not listed here, current limits are provided during onboarding —
contact partners@zennopay.com.
What enforcement looks like
- The check runs server-side on
POST /v1/payment_intents/:id/confirm. A payment that would breach a window is rejected before any money moves. - The SDK surfaces it as a typed failure with the stable error code
limit_exceeded; the sheet explains the limit to the user in plain language, so your app only needs to handle the terminalfailedresult like any other. - Limits are enforced against the same windows in sandbox, so you can test the blocked-payment path before going live.
Your side of the contract
partner_user_id must be your internal, opaque identifier — never a raw
government ID — and it must be stable per user: Zennopay accumulates the
daily and monthly windows against it. Rotating the ID per payment would
break limit enforcement (and your compliance posture). See
Build your session endpoint for where the ID is
supplied and attested.