πŸ›’ Bringo

Integrations

Payment Gateways

18 payment gateways ship with the platform, plus Cash on Delivery and Wallet payment. Everything is configured from Admin β†’ Payment Methods β€” keys are stored in your database, never in source code. Every gateway arrives switched off with blank credentials; enable only the ones you need.

πŸ’³
Included: Razorpay Β· PayPal Β· Paystack Β· Cashfree Β· Stripe Β· PhonePe Β· Paytm Β· PayU Β· Xendit Β· Maya Β· Midtrans Β· eSewa Β· DOKU Β· iPay88 Β· Billplz Β· HitPay Β· Omise Β· Flutterwave β€” plus Cash on Delivery and Wallet. Each gateway runs in Test or Production mode.

On this page

Before you start β€” why a gateway may not appear at checkout

A gateway is shown to customers only when both of these are true:

  1. It is Active in Admin β†’ Payment Methods, with credentials saved.
  2. It supports your store currency β€” the currency of the active country in Admin β†’ Settings β†’ System Info. A gateway that doesn't support that currency is hidden even when it is switched on.
⚠️
This is the single most common "my gateway disappeared" cause. The admin page shows your store currency in a banner at the top, lists each gateway's supported currencies on its card, and flags the mismatched ones with "No <currency> support β€” will not appear at checkout even when Active". The supported currencies of every gateway are listed in the table below.

General steps

  1. Open Admin β†’ Payment Methods.
  2. Pick a gateway and toggle it on.
  3. Paste the keys from your gateway dashboard (per-gateway sections below).
  4. Choose Test or Production and save.
  5. Register the webhook URL in the gateway dashboard, if that gateway needs one β€” the admin page prints the exact URL for you.
  6. Place a test order and confirm the order is marked paid end-to-end.
Payment Methods admin page
Admin β†’ Payment Methods.

Rules that apply to every gateway

Two credential fields
Every gateway uses the same two boxes β€” API Key and Secret Key β€” but each provider calls them something different. The admin page relabels them per gateway (e.g. "Key ID" / "Key Secret" for Razorpay); the table below lists all the mappings.
Secrets are write-only
A saved secret is never shown again. Leave the field blank to keep the stored value; type a new one to replace it.
Environment
Test uses the provider's sandbox host, Production the live host. Switch it together with the keys β€” a test key in Production mode will fail.
Placeholder keys don't count
Any value still containing YOUR_ is treated as unconfigured and the gateway stays hidden at checkout.
Field limits
API key: max 128 characters, letters/numbers/-/_/. only. Secret: max 256 characters.

Three gateways are validated more strictly when you save:

Razorpay
Key must be rzp_test_… in Test mode and rzp_live_… in Production. Mixing them is rejected with an error.
Stripe
Publishable key must start with pk_test_ / pk_live_; the secret must start with sk_.
PayPal
Client ID must be at least 20 characters.
πŸ”‘
Five gateways need no API Key value. Stripe and Paystack use only the secret key server-side (the public key box is optional); Xendit, Midtrans and HitPay show no API Key box at all β€” their single secret/server key is enough.

All gateways at a glance

GatewayAPI Key field is…Secret Key field is…Extra fieldsWebhookCurrencies
Cash on Deliveryβ€”β€”β€”β€”Any
RazorpayKey IDKey Secretβ€”β€”INR
PayPalClient IDClient Secretβ€”β€”25 major currencies
PaystackPublic Key (optional)Secret Keyβ€”β€”NGN GHS ZAR USD KES EGP CIV RWF
CashfreeApp IDSecret Keyβ€”β€”INR
StripePublishable Key (optional)Secret KeyWebhook Signing Secret/api/webhooks/stripeINR USD EUR GBP SGD AUD CAD JPY
Walletβ€”β€”β€”β€”Any
PhonePeClient IDClient SecretMerchant ID, Client Versionβ€”INR
PaytmMIDMerchant KeyWebsite Namecallback URLINR
PayUMerchant KeySaltβ€”callback URLINR
Xenditnot usedSecret API KeyWebhook Verification Token/api/webhooks/xenditIDR PHP USD
MayaPublic KeySecret Keyβ€”/api/webhooks/mayaPHP
Midtransnot usedServer Keyβ€”/api/webhooks/midtransIDR
eSewaProduct CodeSecret Keyβ€”β€”NPR
DOKUClient IDSecret Keyβ€”/api/webhooks/dokuIDR
iPay88Merchant CodeMerchant Keyβ€”callback URLMYR SGD IDR
BillplzAPI KeyX-Signature KeyCollection ID/api/webhooks/billplzMYR
HitPaynot usedAPI KeyWebhook Salt (optional)β€”SGD MYR PHP
OmisePublic KeySecret Keyβ€”β€”THB JPY SGD
FlutterwaveClient IDClient SecretEncryption Key, Webhook Secret Hash/api/webhooks/flutterwaveNGN GHS KES ZAR UGX USD

PayPal's 25 supported currencies: AUD, BRL, CAD, CNY, CZK, DKK, EUR, HKD, HUF, ILS, JPY, MYR, MXN, TWD, NZD, NOK, PHP, PLN, GBP, RUB, SGD, SEK, CHF, THB, USD.

Setup β€” global gateways

Stripe

Dashboard β†’ Developers β†’ API keys.

Publishable key
Optional β€” paste into API Key (pk_test_… / pk_live_…).
Secret key
Paste into Secret Key (sk_test_… / sk_live_…). This is what actually charges.
Mode
Test with sk_test_, Production with sk_live_.

Stripe webhook (required)

Stripe confirms payments by calling your server β€” without it some payments never get marked paid.

  1. Stripe Dashboard β†’ Developers β†’ Webhooks β†’ Add endpoint.
  2. Endpoint URL: https://your-domain.com/api/webhooks/stripe
  3. Select events β€” checkout session and payment intent, succeeded & failed.
  4. Copy the Signing secret (whsec_…) into the Webhook Signing Secret box on the Stripe card in Admin β†’ Payment Methods.

PayPal

developer.paypal.com β†’ Apps & Credentials β†’ create an app (Sandbox first, then Live).

Client ID
Paste into API Key (at least 20 characters).
Secret
Paste into Secret Key.
Environment
Test uses api-m.sandbox.paypal.com, Production uses api-m.paypal.com.

The buyer is redirected to PayPal and back automatically β€” no URL to register in the PayPal dashboard.

Setup β€” India

Razorpay

Dashboard β†’ Settings β†’ API Keys β†’ Generate Key.

Key ID
Paste into API Key β€” rzp_test_… for Test, rzp_live_… for Production.
Key Secret
Paste into Secret Key.

Razorpay also powers in-app checkout in the Customer app β€” no extra app configuration; the key is sent to the app at checkout time.

Cashfree

Cashfree merchant dashboard β†’ Developers β†’ API Keys.

App ID
Paste into API Key (sent as x-client-id).
Secret Key
Paste into Secret Key (sent as x-client-secret).
Environment
Test uses sandbox.cashfree.com, Production api.cashfree.com.

PhonePe

PhonePe Business dashboard β†’ developer/API credentials. This integration uses the OAuth (client id + secret) PG API.

Client ID
Paste into API Key.
Client Secret
Paste into Secret Key.
Merchant ID
Extra field on the PhonePe card β€” e.g. M22XXXXXXXXXX.
Client Version
Extra field β€” 1 unless PhonePe tells you otherwise.
Environment
Test uses the PhonePe pre-prod sandbox, Production the live PG host.

Paytm

Paytm for Business β†’ API Keys.

MID
Merchant ID β†’ paste into API Key.
Merchant Key
Paste into Secret Key.
Website Name
Extra field β€” WEBSTAGING in Test, DEFAULT in Production (or the value Paytm assigned you).
Environment
Test uses securegw-stage.paytm.in, Production securegw.paytm.in.

Paytm posts the result back to /payment/paytm/callback on your domain (with matching wallet and parcel callbacks). These are sent with each transaction β€” nothing to register manually.

PayU

PayU dashboard β†’ merchant key & salt.

Merchant Key
Paste into API Key.
Salt
Paste into Secret Key β€” used to sign and verify every transaction.
Environment
Test uses test.payu.in, Production secure.payu.in.

Results come back to /payment/payu/callback (plus wallet and parcel variants), sent with each request.

Setup β€” South-East Asia

Xendit

Xendit dashboard β†’ Settings β†’ API Keys (create a secret key with Money-in permissions).

Secret API Key
Paste into Secret Key. Xendit shows no API Key box β€” the secret is all that's needed.
Webhook Verification Token
Extra field. Xendit dashboard β†’ Settings β†’ Webhooks β†’ Verification token. Without it, incoming webhooks are rejected.
Webhook URL
Register https://your-domain.com/api/webhooks/xendit for invoice events.

Maya (PayMaya)

Maya Manager β†’ API keys (sandbox keys first, then production).

Public Key
Paste into API Key.
Secret Key
Paste into Secret Key.
Environment
Test uses pg-sandbox.paymaya.com, Production pg.paymaya.com.
Webhook URL
https://your-domain.com/api/webhooks/maya

Midtrans

Midtrans dashboard β†’ Settings β†’ Access Keys.

Server Key
Paste into Secret Key. Midtrans shows no API Key box.
Environment
Test uses app.sandbox.midtrans.com, Production app.midtrans.com.
Payment Notification URL
Set https://your-domain.com/api/webhooks/midtrans in Midtrans β†’ Settings β†’ Configuration. Notifications are signature-verified with your server key.

DOKU

DOKU back office β†’ integration / API credentials.

Client ID
Paste into API Key (sent as Client-Id).
Secret Key
Paste into Secret Key β€” signs requests and verifies notifications.
Environment
Test uses api-sandbox.doku.com, Production api.doku.com.
Notification URL
https://your-domain.com/api/webhooks/doku

Payment links expire after 60 minutes by default. To change that, set a doku_payment_due_date setting (in minutes) in the settings table.

iPay88

iPay88 merchant portal β†’ merchant code and key.

Merchant Code
Paste into API Key.
Merchant Key
Paste into Secret Key.
Environment
Test uses the iPay88 sandbox host, Production the live host.
Callbacks
The response and backend URLs (/payment/ipay88/callback plus wallet and parcel variants) are sent with every transaction. If your iPay88 account restricts return URLs, whitelist those paths with iPay88 support.

Two optional settings-table keys fine-tune the checkout: ipay88_payment_id (force a specific payment method) and ipay88_lang (defaults to UTF-8).

Billplz

Billplz dashboard β†’ Settings β†’ API keys and Billing β†’ Collections.

API Key
Paste into API Key.
X-Signature Key
Paste into Secret Key β€” used to verify callbacks.
Collection ID
Extra field. Billplz dashboard β†’ Billing β†’ Collections; every bill is created inside this collection.
Environment
Test uses billplz-sandbox.com, Production billplz.com.
Callback URL
https://your-domain.com/api/webhooks/billplz

HitPay

HitPay dashboard β†’ Settings β†’ Payment Gateway β†’ API keys.

API Key
Paste into Secret Key. HitPay shows no API Key box.
Webhook Salt
Optional extra field β€” same screen in HitPay. Used to verify webhook calls.
Environment
Test uses api.sandbox.hit-pay.com, Production api.hit-pay.com.

The customer is redirected to HitPay and back; the payment is then verified server-side, so no webhook registration is strictly required.

Omise

Omise dashboard β†’ Keys.

Public Key
Paste into API Key β€” used to tokenise card details at checkout.
Secret Key
Paste into Secret Key β€” used server-side to create and verify the charge.
Environment
Use your test keys with Test mode, live keys with Production.

Setup β€” Nepal

eSewa

eSewa merchant onboarding provides a product code and secret.

Product Code
Paste into API Key β€” EPAYTEST in the sandbox.
Secret Key
Paste into Secret Key β€” signs each payment form (HMAC-SHA256).
Environment
Test uses rc-epay.esewa.com.np, Production epay.esewa.com.np.

Success and failure return URLs are submitted with the payment form β€” nothing to register.

Setup β€” Africa

Paystack

Dashboard β†’ Settings β†’ API Keys & Webhooks.

Public Key
Optional β€” paste into API Key.
Secret Key
Paste into Secret Key (sk_…). This is what initialises and verifies transactions.

The callback URL is sent with each transaction, so no dashboard configuration is needed.

Flutterwave

Uses the Flutterwave v4 API. Dashboard β†’ Settings β†’ API.

Client ID
Paste into API Key.
Client Secret
Paste into Secret Key.
Encryption Key
Extra field β€” Settings β†’ API β†’ Encryption Key. Required: card details are encrypted with it before charging.
Webhook Secret Hash
Optional extra field β€” Settings β†’ Webhooks β†’ Secret hash. Used to verify incoming webhooks (sent as the verif-hash header).
Webhook URL
https://your-domain.com/api/webhooks/flutterwave

Cash on Delivery & Wallet

Cash on Delivery
No keys, no currency limits. Toggle it on and it appears at checkout. It cannot be used for wallet top-ups or AI-assistant cart payment.
Wallet
Lets customers pay from their in-app wallet balance. No keys. To let them fund that wallet you must also mark one online gateway as the wallet top-up gateway β€” see below.

Webhook & callback URLs

Replace your-domain.com with your live domain. The admin page prints these for you on the relevant gateway cards.

GatewayURL to register in the gateway dashboard
Stripe/api/webhooks/stripe
Midtrans/api/webhooks/midtrans
Xendit/api/webhooks/xendit
DOKU/api/webhooks/doku
Billplz/api/webhooks/billplz
Maya/api/webhooks/maya
Flutterwave/api/webhooks/flutterwave

PayU, Paytm and iPay88 post their result to callbacks that the platform submits with each transaction β€” you don't register them, but they must be reachable over HTTPS:

GatewayOrderWallet top-upParcel
PayU/payment/payu/callback/wallet/payment/payu/callback/parcel/payment/payu/callback
Paytm/payment/paytm/callback/wallet/payment/paytm/callback/parcel/payment/paytm/callback
iPay88/payment/ipay88/callback/wallet/payment/ipay88/callback/parcel/payment/ipay88/callback

Wallet top-up & AI cart payment

Two toggles on each gateway card decide where else that gateway can be used:

Use for Wallet Top-up
The gateway customers use to add money to their wallet.
Use for Cart Payment (AI Assistant)
The gateway used when a customer checks out from inside the AI assistant chat.
☝️
Only one gateway can hold each toggle. Switching it on for one gateway automatically switches it off everywhere else. Cash on Delivery can hold neither; Wallet cannot be its own top-up method. Both toggles are cleared automatically if you deactivate the gateway.

POS payment methods

In-store POS sales don't use the gateways above β€” they record a tender type from a separate list: Cash, Card, UPI and Net Banking.

🧾
These four are installed once and there is no admin screen to edit them β€” change them directly in the pos_payment_method database table if you need different tenders. Always keep a row whose name contains "cash": the Seller app's cash-reconciliation report finds it by name.

Test cards

Stripe
4242 4242 4242 4242, any future date, any CVC.
Razorpay
Use the test card shown in Razorpay's test-mode docs.
Everyone else
Each provider publishes sandbox cards / test wallets in its own docs β€” use them with Environment set to Test.
βœ…
Always run one real transaction in Production mode (a small amount, then refund it) before launch. Sandboxes don't catch account-level problems like an unapproved merchant profile or a missing webhook.

Troubleshooting

Gateway doesn't appear at checkout
It's inactive, its keys are still placeholders (YOUR_…), or it doesn't support your store currency. Check the currency banner at the top of Admin β†’ Payment Methods.
Customer paid but the order still says unpaid
The webhook isn't registered or isn't reachable. Re-check the URL in the gateway dashboard, confirm HTTPS works from outside, and (Stripe/Xendit/Flutterwave/HitPay) that the signing secret / verification token is saved.
"Production environment requires a rzp_live_ key"
Razorpay key and Environment don't match β€” use test keys with Test, live keys with Production.
"Stripe secret key must start with sk_"
You pasted the publishable key into the secret box. The pk_ key goes in API Key, the sk_ key in Secret Key.
The wallet top-up gateway keeps changing
Expected β€” the toggle is exclusive. Enabling it on a second gateway clears it on the first.
Saved a secret but the gateway still fails
Secrets are write-only; if you typed into the field and then re-saved the form from a stale page, you may have kept the old value. Re-enter it and save again.
πŸ‘‰
Next: SMS Gateways for OTP and order alerts.