Skip to content

Accepting Online Payments ​

Let customers pay for a WiFi plan online, right from the login page - no voucher needed. Once a payment gateway is connected, customers can buy or renew a plan themselves and get online automatically the moment payment succeeds.

Overview ​

There are two parts to this feature:

Payment Gateways - Connect the payment providers your business accepts. Found under Operator Settings → Payment Gateways.

Payment Transactions - A history of every payment attempt, successful or not, for bookkeeping and support. Found under Reports → Payment Transactions.

Supported Gateways ​

GatewayCurrencyCustomers pay withCredentials you need
AblePayINRCard, UPI, netbankingAPI Key, Salt Key
RazorpayINRCard, UPI, netbanking, walletsKey ID, Key Secret
M-PesaKESAn M-Pesa prompt on their phoneConsumer Key, Consumer Secret, Passkey, Paybill Short Code

Your Currency Decides Which Gateways Work

A gateway can only be enabled when it supports the currency set in Settings. For example, an operator using INR can enable AblePay or Razorpay but not M-Pesa, and an operator using KES can only enable M-Pesa. If you change your currency later, gateways that no longer match stop being offered to customers - you can still disable or delete them.

You can connect several gateways at once (one of each). Customers then choose which one to pay with.

Connecting a Payment Gateway ​

Navigate to Operator Settings → Payment Gateways and click + Add. The fields change depending on the gateway you pick.

Payment Gateway (required) - Choose the provider. Gateways you've already connected aren't offered again; once every gateway is connected, the + Add button is disabled.

Status - Enabled lets customers pay through this gateway. Choose Deactivated to switch it off temporarily without losing your saved credentials.

AblePay ​

API Key and Salt Key (required) - From your AblePay dashboard.

Mode (required) - Test for AblePay's sandbox (no real money moves), or Live for real payments.

Razorpay ​

Key ID and Key Secret (required) - From your Razorpay dashboard under API Keys.

There's no separate Mode setting: Razorpay decides from the keys themselves. Use keys starting with rzp_test_ to try the flow, and rzp_live_ keys for real payments.

M-Pesa ​

These come from your Safaricom Daraja app with M-Pesa Express enabled.

Consumer Key and Consumer Secret (required) - Your Daraja app's credentials.

Passkey (required) - The M-Pesa Express (Lipa na M-Pesa Online) passkey for your short code.

Paybill Short Code (required) - The paybill or till number customers pay to. The Daraja sandbox uses 174379.

Mode (required) - Test uses the Daraja sandbox; Live uses the real M-Pesa service.

Payment Confirmations

Safaricom confirms each payment by calling back to the portal, so the portal must be reachable over public HTTPS. This is already the case on XceedNet's hosted portal.

Editing Saved Credentials ​

For security, saved keys are never shown again - the edit form only shows the last 4 characters (for example ••••••••a1b2) so you can tell which key is in use. Leave the key fields blank to keep the existing credentials, and only fill them in when you're replacing them. You can change Mode, Status or the M-Pesa Paybill Short Code on their own without re-entering any keys.

Keep Test and Live Separate

Always try a new gateway in test mode first. Only switch to live once a full test payment has activated a plan correctly.

What the Customer Sees ​

When a customer without an active plan opens the WiFi login page, they get two choices:

  • 💳 Buy Online - Shows your paid plans as cards (name, price, validity, speed and data limit).
  • 🎫 Renew with Voucher - The existing voucher code option.

Under each plan card there's a payment button:

  • One gateway enabled - A Buy Now button.
  • Several gateways enabled - A Pay Now ▾ button that opens a Choose payment method menu listing each gateway.

What happens next depends on the gateway:

  • AblePay and Razorpay - The customer completes payment on the gateway's own payment page or popup.
  • M-Pesa - The customer enters their M-Pesa phone number and taps Pay KES … with M-Pesa. A payment prompt appears on their phone; they confirm it with their M-Pesa PIN. The login page waits for the confirmation, and there's an I have paid — continue button if the page needs a nudge.

As soon as payment succeeds, the customer is connected with their new plan automatically - no need to reload the page or re-enter anything.

Works Even Without WiFi Yet

Customers don't have internet access until they've paid - so how do they reach the payment page? The system briefly grants a very limited, slowed-down connection just long enough to complete payment (including any bank or UPI app redirect), then upgrades them to their real plan the moment payment is confirmed.

Limiting Payment Attempts ​

Because each Buy Now grants that short temporary connection, someone could keep starting payments without finishing them just to get free internet. To stop this, each customer may only start a limited number of online payments per day.

Set the limit under Operator Settings → General Settings → Payments & Devices → Max Payment Attempts (default 5 per day). A customer who reaches it is asked to use a voucher or contact you instead.

If a genuine customer gets stuck, reset their count from their customer page (Online Payment Attempts → Reset) or from the dashboard card that lists customers who've hit the limit.

If a Customer Is Stuck on Their Phone ​

Some phones show WiFi sign-in pages in a locked-down mini-browser that blocks payments from completing. When this is detected, the customer sees a short message with a few ways to continue in their real browser (Safari or Chrome) instead - a press-and-hold link, a one-tap "Open in Chrome" button on Android, or a copyable link as a last resort. This is normal and only takes a few extra seconds.

Viewing Payment Transactions ​

Navigate to Reports → Payment Transactions to see every payment attempt:

Subscriber - Which customer made the attempt.

Package - Which plan they were buying.

Gateway - Which payment provider processed it.

Amount - What they were charged.

Status:

  • Success (🟢) - Payment completed, plan activated.
  • Pending (🟡) - Payment started but not yet confirmed.
  • Failed (🔴) - Payment did not go through - no plan was activated, and the customer wasn't charged for it.

Transaction ID - Your internal reference for this attempt.

Gateway Transaction ID - The payment provider's own reference, useful when contacting their support about a specific payment.

Use this list to confirm a customer's payment, investigate a support query ("I paid but I'm not online"), or reconcile against your gateway's own dashboard.

Common Use Cases ​

Cafes & Retail ​

Turn on online payments alongside vouchers, so walk-in customers can pay for WiFi themselves without asking staff for a code.

Hotels ​

Let guests renew or upgrade their WiFi plan directly from their room without needing to visit the front desk.

Kenya: Pay with M-Pesa ​

Connect M-Pesa so customers can pay from their phone's M-Pesa wallet - no card needed.

Reducing Front-Desk Work ​

Once online payments are live, most customers will self-serve. Vouchers remain useful for guests without a card or mobile money, or for promotional giveaways.

Troubleshooting ​

Customer says "Buy Online" isn't showing ​

Check the gateway is enabled - Go to Payment Gateways and confirm its Status is Enabled.

Check your currency - A gateway that doesn't support your currency (see the table above) is never offered to customers.

Check you have a paid plan - Only packages with a price greater than zero appear as purchasable.

Check their payment attempts - A customer who has reached Max Payment Attempts for the day is pointed to vouchers instead. Reset their count from their customer page.

Customer paid but isn't connected ​

Check Payment Transactions - Find the transaction and check its status.

  • Success but still not online - Ask them to reconnect to the WiFi network; their device sometimes needs a moment to pick up the new connection.
  • Pending - The gateway hasn't confirmed the payment yet. This can happen if the customer closed the page before returning from the gateway. Check the payment in your gateway's own dashboard; if it went through, renew the customer's plan manually from their customer page.
  • Failed - The customer wasn't charged for that attempt (gateways only charge on success). Ask them to try again.

M-Pesa prompt never appears ​

Check the phone number - It must be the customer's M-Pesa-registered number.

Check Mode - In Test mode, prompts only work with Daraja sandbox test numbers, not real phones.

Check the short code and passkey - They must belong to the same Daraja app as your consumer key.

Testing before going live ​

Always run a full test purchase first - Test mode for AblePay and M-Pesa, rzp_test_ keys for Razorpay - and confirm the plan activates before switching to live credentials.


Next Steps

Make sure you have at least one paid Package created with a Price to Subscriber greater than zero - free packages won't show up as purchasable. To let staff view transactions without touching gateway credentials, give them a role with Reports but not Payment Gateways - see Team Members & Roles.

Released under the MIT License