Skip to content

Setting up payment gateways

So parents can pay fees online. About an hour, plus however long your provider takes to approve a live account.

How money flows

Two separate things, and people mix them up:

Who paysWho receives
Schools paying youEach schoolYou — subscription and plan charges
Parents paying feesParentsThe school, into the school's own account

A gateway is enabled once by you, then connected to each school with that school's own account details — so fee money lands in the school's bank account, not yours.

Choose a provider

44 payment providers are supported, plus offline methods.

India — Razorpay · PayU Money · Paytm · PhonePe · Cashfree · Instamojo · UPI QR Africa — Paystack · Flutterwave · M-Pesa · Monnify · DPO · Cinetpay · Pesapal · Wompi Southeast Asia — Midtrans · Xendit · PayMongo · Billplz · toyyibPay · VNPAY · PayHere Middle East — Tap · PayTabs · Moyasar · Iyzico Global — Stripe · PayPal · Square · Mollie · Paddle · Checkout.com · Authorize.Net · MercadoPago · SSLCOMMERZ · JazzCash · Khalti · Fondy · Nowpayments · Coinbase Commerce · Zenvia and others

Plus three that take no API at all:

MethodWhat it does
ManualRecords a payment the school collected another way
Bank TransferParent transfers to the school's account, school confirms it
Mobile MoneySame, for mobile money transfers

Start with Bank Transfer

It works immediately, needs no approval, and lets a school collect fees online from day one while its card gateway is still being approved.

Step 1: Enable the gateway

Sidebar → Settings → Payments

Add the gateway you want. Each one asks only for the fields it actually needs — the form is built from the provider's own requirements.

You will see two groups of credentials:

GroupWhen it is used
Live — production credentialsReal money
Sandbox — test credentialsTesting, with fake cards

Fill in Sandbox first and leave the gateway in sandbox mode until you have made a successful test payment.

Step 2: Set the webhook URL

Skip this and payments will break in the worst possible way

Without a webhook, a parent pays successfully, their money leaves their account — and the system never learns about it. The fee stays unpaid, the parent has a receipt from their bank, and the school insists nothing was received.

This is the single most damaging misconfiguration in the whole system.

On the gateway's settings drawer you will see Webhook URL with a Copy button next to it. Copy that address and paste it into the same provider's dashboard, in whatever they call their webhook or callback setting.

Each gateway has its own URL. Do not reuse one for another provider.

Step 3: Connect a school

A school does not use your account — it connects its own, so the money reaches it directly.

For each school: enable online fee payment, choose the gateway, and enter that school's own credentials from its provider account.

A school must open its own provider account

Razorpay, Stripe and the rest verify the business receiving the money. A school cannot collect fees through your account — settlement, tax and refunds all follow the account holder.

Step 4: Test before going live

  1. Leave the gateway in sandbox mode
  2. Pay a small test fee using the provider's test card details
  3. Confirm the payment shows as paid in the system, not only at the provider
  4. Only then switch to live credentials

Step 3 is the one that matters — it is what proves the webhook works.

If payments are not working

What you seeCauseFix
Parent pays, money leaves, fee still shows unpaidWebhook URL not set, or set at the wrong providerStep 2
"Invalid key" or "authentication failed"Live credentials in sandbox mode, or the reverseCheck which mode the gateway is in
Works for one school, fails for anotherThat school's own credentials are missing or wrongStep 3
Payment page never opensGateway not enabled for that school, or online fee payment is off for itStep 3
Test card declined in sandboxUsing a real cardUse the provider's published test card numbers
Everything works, receipts never emailedNot a payment problem — email or cron