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

# Connect Monnify

> Collect card and bank-transfer payments in Nigeria with Monnify by Moniepoint, settled to you the same day.

Monnify is Moniepoint's payment gateway for Nigerian businesses. A pay link opens Monnify's own hosted
checkout, where your client pays by card or by transferring to a one-time account number, and Monnify
tells DMLY the money arrived. You share that link on WhatsApp like any other pay link.

Monnify sits beside Paystack rather than replacing it. The main reasons to choose it: **your money
settles the same day** (at 10 PM, with free express settlement), you may already bank with
Moniepoint, and it gives you a second way to take payments if your Paystack account is still being
activated.

This page covers what's specific to Monnify. The general rules (how pay links are minted, what each
payment status means, what a missed webhook looks like) are the same for every gateway and live in
[Connect a payment gateway](/finance/payments-and-gateways).

## Connect it

Monnify is a tile under **Configurations → Integrations → Payments**. There's no "sign in with
Monnify" button: you copy three values out of your Monnify dashboard and paste them in.

<Steps>
  <Step title="Copy your keys and contract code">
    In your Monnify dashboard, open **Developers → API Keys** and copy your **API key**, **secret key**
    and **contract code**. The tile's own setup steps point to the same page.

    There is no environment dropdown in DMLY. **The API key's prefix decides whether you are taking real
    money:** `MK_PROD_` is live and `MK_TEST_` is test. Check it before you paste.
  </Step>

  <Step title="Paste them into the tile">
    Open the **Monnify** tile, paste all three into their fields and click **Connect**. DMLY signs in to
    Monnify with your API key and secret key straight away, so a typo in either fails now rather than
    at the first real payment. The contract code must be filled in, but Monnify only checks it when the
    first pay link is made, so copy it carefully. The webhook URL appears on the tile once you're
    connected.
  </Step>

  <Step title="Add the webhook in Monnify">
    DMLY does not register the webhook for you. In Monnify, go to **Developers → Webhook URLs** and paste
    the URL from the tile into **both** **Transaction Completion** and **Refund Completion**.

    There is no separate webhook secret to copy back. Monnify signs its notifications with the secret key
    you already pasted.
  </Step>

  <Step title="Take one real payment end to end">
    Send yourself a small invoice, pay it, and confirm it flips to **Paid** on its own. If it doesn't,
    the webhook isn't reaching DMLY; fix that before a client pays.
  </Step>
</Steps>

<Warning>
  **Use your live keys in DMLY.** Monnify does not sign the webhooks it sends from test mode, and DMLY
  refuses any webhook it cannot verify. With test keys a client can reach the checkout, but the payment
  will never be confirmed here. Test a live payment for a small amount instead.
</Warning>

## Card or bank transfer

A Monnify pay link offers every method your Monnify account has switched on. In a payment step, set
**Payment method** to **Bank transfer only** and the checkout opens on a one-time account number,
as it does on Paystack. **Card only** restricts it to card.

**Let the customer choose** works with Monnify too, and asks **Card** or **Bank transfer** even when
Monnify is your only gateway, because the two answers really are different: a card page, or an
account number right there in the chat (below). If you have also saved your own bank account under
**Finance → Settings → Gateways**, **Bank transfer** sends that instead, because it has no fee. See
[Collect bank transfers in chat](/finance/pay-with-transfer#let-the-client-choose).

If you have both Monnify and Paystack connected, the **Default payment gateway** under
**Finance → Settings → Gateways** decides which one booking deposits, invoice pay links and any
payment step without its own **Gateway** use.

## Account number in the chat

This is the reason to pick Monnify for transfers. Set a payment step's **Payment method** to
**Account number in chat (automatic)** and the client gets the account number as the message itself:
no link to tap, no page to load, nothing to copy out of a browser.

<Steps>
  <Step title="Monnify issues an account for this payment">
    A fresh account number for this exact amount, used for nothing else. DMLY gives Monnify your
    business name (your workspace name) as the account name, so the client can see who they are paying
    before they send anything. The client is never asked for their BVN or any other detail.
  </Step>

  <Step title="The number goes into the chat">
    Bank, account number (on a line of its own, so a long-press copies just the number), account name,
    and the exact amount. The account stays open for 24 hours.
  </Step>

  <Step title="The payment confirms itself">
    When the money arrives Monnify tells DMLY, the payment is marked **Paid** (and so is the invoice,
    if the step was paying one), and the client gets their receipt. There is no **I've paid** button and nobody on your
    team has to check a bank app.
  </Step>
</Steps>

If the step is retried in the same flow run, the client gets the same account again rather than a
second one, as long as it has more than an hour left. A new run of the flow issues a new account.

<Note>
  **When the client hasn't messaged you in the last 24 hours**, WhatsApp won't let DMLY send the details
  in its own words. The client gets your approved **dmly\_payment\_request** template instead (unless the
  step names a template of its own), with a link to Monnify's page for the same account. Install it from
  **Templates → System → Available to install** if you don't have it.
</Note>

The option only appears in the payment step when the chosen gateway (or your default gateway) is
Monnify. Paystack's **Bank transfer only** option is the nearest equivalent there: the same kind of
account, but behind a link.

## When the amount doesn't match

Paystack refuses a bank transfer for the wrong amount and sends it back. Monnify can keep money that
doesn't match, so DMLY handles each case deliberately:

<AccordionGroup>
  <Accordion title="The client paid less than asked">
    DMLY does **not** mark the payment as paid. A booking isn't confirmed and the client isn't sent a
    receipt for money that isn't all there. Your team gets a **Part payment received** alert, and the
    details are in **Reports → Logs**. Talk to the client, then either record the payment yourself under
    **Finance → Payments** or refund it from your Monnify dashboard.
  </Accordion>

  <Accordion title="The client paid more than asked">
    The payment is marked paid at the amount that actually arrived, and your team gets a **Customer
    overpaid** alert, because the client is owed the difference.
  </Accordion>

  <Accordion title="Monnify rejected the transfer">
    Nothing changes on the payment. Monnify is returning the money to the client, and your team gets a
    **Transfer rejected** alert so you can send a fresh link.
  </Accordion>
</AccordionGroup>

These alerts are the **Payment needs review** event on the **In-app alerts** tab of
[notification settings](/account/notifications). It is on by default, and an admin can turn it off.

## Refunds

The **Refund** button works for payments made **by bank transfer**. Monnify doesn't refund card payments
through its API, so for a card payment DMLY says so and doesn't record anything; refund it in your
Monnify dashboard and then record the refund in DMLY. The smallest refund Monnify accepts is ₦100.

If Monnify refuses the refund request, nothing changes in DMLY and you see Monnify's reason. If it
accepts the request, DMLY marks the payment **Refunded** straight away, while Monnify finishes the
refund in the background. Should Monnify later report that the refund failed, your team gets a
**Refund failed** alert and the reason is in **Reports → Logs**. The payment still reads
**Refunded** in DMLY at that point, so follow it up with Monnify: the client has not been paid back.

## Current limitations

These are known behaviours of the Monnify integration today, not faults to report.

<Accordion title="Subscriptions can't auto-charge a saved card yet">
  Saved-card charging on Monnify needs Monnify to switch it on for your account, and DMLY doesn't use it
  yet. A subscription on Monnify is collected with a pay link each cycle. Use another gateway for
  automatic renewals (see [Subscriptions](/finance/subscriptions)).
</Accordion>

<Accordion title="Naira, with USD on card only">
  Monnify collects NGN. USD is available on card payments only, and only for merchants Monnify has
  enabled for international collection. DMLY passes the currency straight to Monnify, so a pay link in
  a currency your Monnify account can't take fails when it is made.
</Accordion>

<Accordion title="The smallest pay link is ₦20">
  Monnify won't open a checkout for less than ₦20, so DMLY refuses a smaller link rather than sending
  one that fails.
</Accordion>

<Columns cols={2}>
  <Card title="Payments and gateways" icon="credit-card" href="/finance/payments-and-gateways">
    Pay links, payment statuses and what a failed webhook means.
  </Card>

  <Card title="Collect bank transfers in chat" icon="building-columns" href="/finance/pay-with-transfer">
    Transfer-only links, your own account details, and letting the client choose.
  </Card>
</Columns>
