Selling

Connecting Monnify

Take bank transfers, cards and USSD through your own Monnify merchant account.

Monnify is a Nigerian payment gateway. It takes bank transfers, cards, USSD and phone-number payments, and it is particularly good at the first of those — a customer paying by transfer gets a bank account number generated for that one order, so the payment matches itself without anybody reading a reference off a screenshot.

It is your account, not ours

You open the Monnify account. You supply the keys. Money settles into your Monnify wallet and is paid out to your bank account on your own settlement schedule. WeSelling never holds it and never sees it.

The same applies to what it costs. Monnify's transaction fees are charged to you under whatever agreement you have with them — we do not add a margin, and we cannot change or discount their pricing. If you want a better rate, that is a conversation with Monnify.

Note There is no WeSelling Monnify wallet. Your Monnify balance lives in Monnify's dashboard; what you see here is what has been paid against your orders, which is a different question and answered from your own ledger.

Opening a Monnify account

  1. Sign up at monnify.com

    You register as a business. Have your CAC registration and a bank account in the business's name ready — Monnify verifies both before it will let you go live.

  2. Complete verification

    Until this is done you can use test keys and nothing else. That is fine — set the whole thing up and test it while verification is in progress.

  3. Add your settlement account

    The bank account Monnify pays your money out to. This is between you and Monnify; WeSelling never sees it.

Where to find the three credentials

In the Monnify dashboard, open Settings → API Keys & Webhooks. You need three things:

WhatLooks likeWhat it is for
API keyMK_TEST_… or MK_PROD_…Identifies your account
Secret keyA long random stringSigns your requests and your webhooks
Contract codeA numberWhich of your contracts to bill against
The secret key is a password Anyone holding it can take payments as you and forge payment notifications. Once you save it here we will not show it back to you — not to anyone, including you. Keep your own copy wherever you keep your other credentials, and if you ever paste it somewhere it should not go, rotate it in the Monnify dashboard rather than hoping.

Test keys first

Monnify gives you two sets of keys and two separate environments. Test keys move no money; live keys move real money.

They are not interchangeable, and this is the single most common thing to get wrong: a live key sent to the test environment is rejected as though it were invalid. If you are certain your keys are right and Monnify says they are not, check this setting before you check anything else.

Tip Set it up on Test, put a real order through end to end, and only then switch to Live. The test cards and test bank details are in Monnify's own documentation.

Connecting it here

  1. Open Settings → Integrations

    Settings → Integrations, then scroll to the Monnify card.

  2. Paste the API key, secret key and contract code

    All three. Monnify cannot start a transaction without the contract code, so two out of three leaves it not working.

  3. Choose Test or Live

    Match the keys you pasted.

  4. Save

  5. Press Test connection

    This signs in to Monnify with the keys you just saved. It takes no payment and moves no money — it only proves the three credentials work together. Save before testing: it checks what is stored, not what is on screen.

The webhook — do not skip this

In the Monnify dashboard, on that same API Keys & Webhooks page, add this address as your webhook URL:

https://<your-shop-address>/api/webhooks/monnify

So a shop at kafadona.weselling.store uses https://kafadona.weselling.store/api/webhooks/monnify. If you are on your own domain, use that instead.

This is what confirms a payment when the customer does not come back — they paid by transfer from their banking app and never returned to the browser tab, or their signal dropped on the way. Monnify tells us directly, and the order is confirmed regardless.

Without the webhook, some payments will never be confirmed The order sits unpaid while the money has already left the customer's account, and somebody has to sort it out by hand. It takes two minutes to set up and it is the difference between bank transfer working and bank transfer half-working.

How a Monnify payment is confirmed

Never by the customer's browser. Coming back to the shop after paying only proves a browser followed a redirect — that page can be reloaded, shared, or reached by pressing Back. Marking orders paid on that basis is how shops give goods away.

What actually happens:

StepWhat it proves
The customer returns, or Monnify's webhook firesSomething happened worth checking
We ask Monnify directly about that transactionWhether it was paid, and how much
The amount is checked against what was owedThat the order was paid in full
One confirmed payment is written against the saleThe order is paid
Note Only the middle step decides anything. A duplicate webhook, a reloaded return page and the scheduled sweep all reach the same single confirmed payment — the order cannot be paid twice, the stock cannot be deducted twice, and the tickets cannot be issued twice.

Going live

  1. Finish Monnify's verification

    Live keys are not issued until it is done.

  2. Copy the live API key, secret key and contract code

  3. Paste them here and switch Environment to Live

  4. Save, then press Test connection again

  5. Check the webhook

    Monnify keeps separate webhook settings for test and live. Setting one does not set the other, and a live shop with only the test webhook configured is the exact failure this page warns about above.

When something is wrong

What you seeWhat it usually is
Monnify does not appear at checkoutOne of the three credentials is blank. All three are required.
“Refused these credentials”Live keys on Test, or test keys on Live. Check Environment first.
Payments taken but orders stay unpaidThe webhook is not set, or is set on the other environment.
“Monnify status: PARTIALLY_PAID”The customer transferred less than the total. The order stays unpaid on purpose.

What we have not built

Monnify also offers payouts, reserved accounts, wallets and verification services. None of them are connected here. This integration collects payment for orders and nothing else — if you use those products, you use them in Monnify's own dashboard.