> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wifipadi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connecting a payment provider

> Add your Paystack, Monnify or Flutterwave keys so customers can pay you directly.

Customers pay into **your own** provider account. WifiPadi never holds your money — it reads the payment, activates the plan, and gets out of the way.

Go to **Settings → Payments**. You need at least one provider connected before anyone can buy a plan.

**Which providers you are offered depends on the country you chose at signup.** A provider that cannot sign up merchants there is not shown, because its checkout would fail rather than work badly.

| Country  | Providers                      | What your customers can pay with  |
| -------- | ------------------------------ | --------------------------------- |
| Nigeria  | Paystack, Flutterwave, Monnify | Card, bank transfer, USSD, OPay   |
| Ghana    | Paystack, Flutterwave          | Mobile money, card, bank transfer |
| Kenya    | Paystack, Flutterwave          | M-PESA, card, bank transfer       |
| Cameroon | Flutterwave                    | Mobile money, card                |
| Uganda   | Flutterwave                    | Mobile money, card                |

Connecting more than one is fine.

### What they charge

Fees are set by the provider, not by us, and they change. Treat this as a guide and your provider's own pricing page as the truth.

| Provider    | Country           | Roughly                                                          |
| ----------- | ----------------- | ---------------------------------------------------------------- |
| Paystack    | Nigeria           | 1.5%, plus ₦100 on charges of ₦2,500 and above, capped at ₦2,000 |
| Paystack    | Ghana / Kenya     | \~1.95% Ghana; \~2.9% card in Kenya, less on M-PESA              |
| Monnify     | Nigeria           | 1.5%, capped at ₦2,000                                           |
| Flutterwave | Nigeria           | \~2% on local methods                                            |
| Flutterwave | Ghana / Kenya     | \~2.6% / \~3.2%                                                  |
| Flutterwave | Cameroon / Uganda | \~4.8% on card, less on mobile money                             |

<Note>
  You never have to work this out yourself. WifiPadi reads the actual fee back from the provider on every online payment and shows it against that payment, so **Payments** tells you what you were really charged rather than an estimate. See [Payments and revenue](/payments).
</Note>

## What to paste

<Tabs>
  <Tab title="Paystack">
    From your Paystack dashboard, **Settings → API Keys & Webhooks**:

    | Field               | Key               |
    | ------------------- | ----------------- |
    | Paystack public key | starts `pk_live_` |
    | Paystack secret key | starts `sk_live_` |

    Test keys (`pk_test_` / `sk_test_`) are accepted so you can trial the flow, but they take no real money. Switch to live keys before you open to guests.
  </Tab>

  <Tab title="Monnify">
    From your Monnify dashboard, **Settings → API Keys**:

    | Field              | Where                     |
    | ------------------ | ------------------------- |
    | Monnify API key    | API Keys                  |
    | Monnify secret key | API Keys                  |
    | Contract code      | Shown alongside your keys |
  </Tab>

  <Tab title="Flutterwave">
    From your Flutterwave dashboard, **Settings → API**:

    | Field                     | Where                                                     |
    | ------------------------- | --------------------------------------------------------- |
    | Public key                | API keys                                                  |
    | Secret key                | API keys                                                  |
    | Secret hash (for webhook) | You choose this value and set the same one in Flutterwave |
  </Tab>
</Tabs>

Secret keys are write-only. Once saved they show as `••••••` and are never shown again — leave the field blank to keep the saved value, and only retype it when you are replacing it.

## Connect the webhook

This is the step people skip, and it costs your customers minutes every time.

After saving your keys, the settings page shows a **Webhook URL**. Paste it into your provider's dashboard:

| Provider    | Where it goes                  |
| ----------- | ------------------------------ |
| Paystack    | Settings → API Keys & Webhooks |
| Monnify     | Settings → API Keys            |
| Flutterwave | Settings → Webhooks            |

The webhook is how your provider tells us a payment succeeded. With it, access is granted in seconds. Without it, a fallback check runs a few minutes later — the customer still gets online and you still get paid, but they wait, and some give up first.

<Note>
  The webhook URL is the same for every business on WifiPadi. That is expected. Payments are matched by reference and verified against **your** secret key, so another business's webhook can never touch your payments.
</Note>

## Reading the webhook status

Under the URL, Paystack reports what is actually arriving:

| What you see                                               | What it means                                                                       |
| ---------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| **Webhook connected — payments confirm instantly**         | Working. Nothing to do.                                                             |
| **No webhook has reached us yet**                          | The URL has not been pasted into your provider dashboard, or nobody has paid yet.   |
| **Paystack is sending webhooks and we are rejecting them** | Paystack is delivering, but the signature does not match the secret key saved here. |

<Warning>
  The rejection state has no symptom you would otherwise notice. Payments still complete through the fallback check, so your revenue looks right and nothing appears broken — the only effect is that every customer waits minutes instead of seconds.

  It usually means the secret key here belongs to a different Paystack account than the one holding the webhook, or the key was rotated in Paystack and not updated here. Re-copy the secret key and save it again.
</Warning>

## Test it before you open

Buy the cheapest plan yourself from a phone on the WiFi.

* Access should be granted within a few seconds of paying.
* The payment appears under **Payments** as **Successful**.
* The webhook line reads **connected**.

If access takes minutes, the webhook is not connected — the payment succeeding is not proof that it is.

## Changing provider later

Save the new provider's keys and connect its webhook. Existing plans and customers are unaffected; only new checkouts move to the new provider.

Leave the old provider's keys in place until any pending payments there have settled. Clearing a field removes those credentials, and a pending payment can no longer be verified without them.
