---
agentTools:
  projectIndex: https://developer.flutterwave.com/llms.txt
---

# Ghana Mobile Money

Learn about Mobile Money support in Ghana.

***

agentTools:
projectIndex: <https://developer.flutterwave.com/llms.txt>
----------------------------------------------------------

# Ghana Mobile Money

Collect `GHS` payments directly from your customers' mobile money wallets in Ghana.

> 📘 **At a glance**
>
> * **Endpoint:** `POST https://api.flutterwave.com/v3/charges?type=mobile_money_ghana`
> * **Currency:** `GHS`
> * **Supported networks:** `MTN`, `Telecel`, `TIGO`
> * **Flow:** Initiate charge → Redirect customer to authorize → Receive webhook → Verify transaction
> * **Test mode:** Payments are authorized automatically after a few seconds.

## Before you begin

Make sure you have:

* Your **secret key** from the Flutterwave dashboard.
* A **webhook URL** configured, so you can be notified when the payment completes.

## How it works

1. **You initiate the charge.** Send the customer's phone number, network, and payment details to the charge endpoint.
2. **You redirect the customer.** The response contains a URL where the customer authorizes the payment.
3. **The customer approves the payment.** They enter an OTP on the checkout page, then approve the prompt on their phone with their mobile money PIN.
4. **Flutterwave notifies you.** You receive a `charge.completed` webhook.
5. **You verify the transaction** before giving value to the customer.

## Step 1: Initiate the charge

Send a `POST` request to the charge endpoint with `type=mobile_money_ghana`.

### Request parameters

| Parameter      | Type   | Required | Description                                                     |
| -------------- | ------ | -------- | --------------------------------------------------------------- |
| `tx_ref`       | string | Yes      | Your unique reference for this transaction. Must not be reused. |
| `amount`       | number | Yes      | Amount to charge, in `GHS`.                                     |
| `currency`     | string | Yes      | Must be `GHS`.                                                  |
| `email`        | string | Yes      | Customer's email address.                                       |
| `phone_number` | string | Yes      | Customer's mobile money number.                                 |
| `network`      | string | Yes      | Customer's mobile money network: `MTN`, `VODAFONE`, or `TIGO`.  |
| `fullname`     | string | No       | Customer's full name.                                           |
| `meta`         | object | No       | Custom key-value data you want attached to the transaction.     |

For the full list of parameters, see the [endpoint reference](/v3.0.0/reference/charge-via-ghana-mobile-money).

### Example request

```shell cURL
curl --request POST \
  --url 'https://api.flutterwave.com/v3/charges?type=mobile_money_ghana' \
  --header 'Authorization: Bearer YOUR_SECRET_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "tx_ref": "REF-GH-0001",
    "amount": 1500,
    "currency": "GHS",
    "country": "GH",
    "email": "joebloggs@acme.co",
    "phone_number": "054709929220",
    "network": "MTN"
  }'
```
```javascript Node.js
// Install with: npm i flutterwave-node-v3

const Flutterwave = require('flutterwave-node-v3');
const flw = new Flutterwave(process.env.FLW_PUBLIC_KEY, process.env.FLW_SECRET_KEY);

const payload = {
  tx_ref: `REF-GH-${Date.now()}`,
  amount: 1500,
  currency: 'GHS',
  country: 'GH',
  email: 'joebloggs@acme.co',
  phone_number: '054709929220',
  network: 'MTN',
};

flw.MobileMoney.ghana(payload)
  .then((response) => console.log(response))
  .catch((error) => console.error(error));
```
```php PHP
<?php
// Install with: composer require flutterwavedev/flutterwave-v3
// Set FLW_PUBLIC_KEY and FLW_SECRET_KEY as environment variables.

$mobileMoneyService = new \Flutterwave\MobileMoney();

$payload = [
    "type"         => "mobile_money_ghana",
    "tx_ref"       => "REF-GH-" . uniqid(),
    "amount"       => 1500,
    "currency"     => "GHS",
    "country"      => "GH",
    "email"        => "joebloggs@acme.co",
    "phone_number" => "054709929220",
    "network"      => "MTN",
];

$response = $mobileMoneyService->mobilemoney($payload);
print_r($response);
```
```ruby Ruby
# Install with: gem install flutterwave_sdk

require 'flutterwave_sdk'

flw = Flutterwave.new(ENV["FLW_PUBLIC_KEY"], ENV["FLW_SECRET_KEY"], ENV["FLW_ENCRYPTION_KEY"])
charge = MobileMoney.new(flw)

payload = {
  tx_ref: "REF-GH-#{Time.now.to_i}",
  amount: 1500,
  currency: "GHS",
  country: "GH",
  email: "joebloggs@acme.co",
  phone_number: "054709929220",
  network: "MTN"
}

response = charge.initiate_charge(payload)
puts response
```

## Step 2: Redirect the customer to authorize

A successful request returns `status: "success"` and a `meta.authorization` object.

```json Success
{
  "status": "success",
  "message": "Charge initiated",
  "meta": {
    "authorization": {
      "mode": "redirect",
      "redirect": "https://checkout.flutterwave.com/captcha/verify/lang-en/3441:877713af5525b0668a8a7018727a9a83"
    }
  }
}
```

| Field                         | What to do with it                         |
| ----------------------------- | ------------------------------------------ |
| `meta.authorization.mode`     | Will be `redirect` for Ghana mobile money. |
| `meta.authorization.redirect` | Redirect your customer to this URL.        |

> ⚠️ **Important:** A `success` status here means the charge was **initiated**, not paid. Do not give value to the customer at this point.

## Step 3: The customer completes the payment

This step happens between the customer, the Flutterwave checkout page, and their mobile money provider. You don't need to call any API here. The screens below show what your customer sees, so you can describe the flow in your own UI or support content.

### 3.1 Enter the OTP

The checkout page asks the customer for a one-time password (OTP). Flutterwave sends this OTP to the customer's phone by **SMS and WhatsApp**.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/f1c2e5fb55bdd36b2ce19df62c5aba099142bc7dbf2b656fd8a25caca953ec2c-image_13.png",
        null,
        "Checkout page asking the customer to enter the MoMo validation OTP sent via SMS and WhatsApp"
      ],
      "align": "center"
    }
  ]
}
[/block]

### 3.2 Wait for the approval prompt

After the OTP is accepted, the page shows **Complete Payment** with a loading indicator. The customer's mobile money provider sends a push prompt to their phone.

If the customer doesn't receive the prompt, the page lists the steps to approve the payment manually from their phone's USSD menu.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/a518500ce1b173f391da894ccc213fda1dcd86badbf7f39a52c00ca579b330c1-image_14.png",
        null,
        "Complete Payment page with a loading indicator and manual USSD approval steps"
      ],
      "align": "center"
    }
  ]
}
[/block]

### 3.3 Approve on the phone

On their phone, the customer:

1. Sees a prompt showing the amount and **Flutterwave Technology Solutions Limited** as the recipient, and enters their mobile money PIN.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/1572141777267597bc6eed6e265bba11887231a1ca1e5e183dd95c1f4041e429-ghana-momo-03-pin-prompt.png",
        null,
        "Checkout page asking the customer to enter the MoMo validation OTP sent via SMS and WhatsApp"
      ],
      "align": "center"
    }
  ]
}
[/block]

2. Confirms the transaction by choosing **1) Yes**.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/3c558eca66661aea7c770b6c1fbc78df931a283e17f092b2d1a47b98f2555eb1-ghana-momo-04-approve.png",
        null,
        "Checkout page asking the customer to enter the MoMo validation OTP sent via SMS and WhatsApp"
      ],
      "align": "center"
    }
  ]
}
[/block]

3. Receives a confirmation message from their provider.

[block:image]{"images":[{"image":["https://files.readme.io/c4b515d36018f3f28610e06113cccd44d6c2886f9945d50ae8bd8163c4e11c91-ghana-momo-05-success-sms.png",null,"Checkout page asking the customer to enter the MoMo validation OTP sent via SMS and WhatsApp"],"align":"center"}]}[/block]

### 3.4 See the result

The checkout page updates automatically and shows the final status.

[block:image]
{
  "images": [
    {
      "image": [
        "https://files.readme.io/dbc44bc807604e1521fa0e3964282d5b7190aaa442feba451ad77c5096308e90-ghana-momo-06-success-page.png",
        null,
        "Checkout success page showing Thanks for your payment"
      ],
      "align": "center"
    }
  ]
}
[/block]

> ⚠️ **Important:** The success page is for the customer only. Your system should still wait for the webhook (Step 4) and verify the transaction (Step 5) before giving value.

> 🧪 **Testing tip:** In [Test Mode](/v3.0.0/docs/testing#mobile-money), Ghana mobile money payments are authorized automatically after a few seconds. You won't see the OTP or phone prompts.

## Step 4: Receive the webhook

When the payment completes, Flutterwave sends a `charge.completed` event to your webhook URL.

```json
{
  "event": "charge.completed",
  "data": {
    "id": 2073992,
    "tx_ref": "REF-GH-0001",
    "flw_ref": "flwm3s4m0c1620380894041",
    "device_fingerprint": "N/A",
    "amount": 1500,
    "currency": "GHS",
    "charged_amount": 1500,
    "app_fee": 43.5,
    "merchant_fee": 0,
    "processor_response": "Approved",
    "auth_model": "MOBILEMONEY",
    "ip": "::ffff:10.30.86.54",
    "narration": "MerchantName",
    "status": "successful",
    "payment_type": "mobilemoneygh",
    "created_at": "2021-05-07T09:48:13.000Z",
    "account_id": 732559,
    "meta": null,
    "customer": {
      "id": 841600,
      "name": "Anonymous Customer",
      "phone_number": "054709929220",
      "email": "joebloggs@acme.co",
      "created_at": "2021-05-07T09:48:13.000Z"
    }
  }
}
```

## Step 5: Verify the transaction

Never rely on the webhook payload alone. Before giving value, call the [verify transaction endpoint](/v3.0.0/docs/transaction-verification-1) with `data.id` from the webhook and confirm that:

* `status` is `successful`
* `tx_ref` matches the reference you generated in Step 1
* `amount` and `currency` match what you expected to charge

Only then should you credit the customer or fulfil the order.

## Next steps

* [Transaction verification](/v3.0.0/docs/transaction-verification-1)
* [Testing mobile money](/v3.0.0/docs/testing#mobile-money)
* [Charge via Ghana Mobile Money: API reference](/v3.0.0/reference/charge-via-ghana-mobile-money)