---
title: "Accept mobile money payments"
description: "Accept mobile money payments from MTN, Telecel, and AirtelTigo customers across Ghana with real-time settlement."
canonical: "https://studio.inttegro.com/guides/accept-mobile-money-payment"
format: inttegro-machine-docs/v1
language: "Python"
sdk_version: "v12.0.0"
reader_profile: optional
reader_manifest: "https://studio.inttegro.com/machine/python/readers/index.json"
reader_identification: "Optional: declare your client only if known and your current-session capabilities; use reader_manifest for supplemental recommendations."
preamble_estimated_tokens: 468
model_token_report: "https://studio.inttegro.com/machine/token-report.json"
preamble_questions: 5
preamble_source: "curated"
recommended_mcp_tools: ["get_integration_guide","check_integration_readiness","get_order"]
estimated_tokens: 2966
token_estimate_method: "utf8_bytes_divided_by_4"
---

## Machine preamble

**Summary:** Create a mobile-money order, follow its requested customer actions, and reconcile the final payment from current order state.

### Five questions

#### Q1. What sequence does a mobile-money payment require?

Create an order that starts payment execution, then use the returned next action to present any requested confirmation or authorization. [Orders](https://studio.inttegro.com/machine/python/api/orders.md#create-an-order) defines the request and current state.

#### Q2. How should the next customer action be chosen?

Inspect the current order payment next action after each phase. Do not assume that one SMS, one prompt, or one network-specific branch completes every payment.

#### Q3. Is a separate integration needed for each Ghanaian network?

No. The documented flow supports MTN, Telecel, and AirtelTigo wallets; Inttegro routes by phone-number prefix. Check enabled payment-method settings before promising availability.

#### Q4. When may the business treat the payment as paid?

Only after [reading current order state](https://studio.inttegro.com/machine/python/api/orders.md#lookup-an-order) and seeing the paid outcome. A confirmation request, authorization prompt, or browser return may be intermediate.

#### Q5. Which MCP abilities help with readiness and tracking?

With an authenticated connection, [get_payment_method_settings](https://studio.inttegro.com/machine/python/inttegro-mcp/tools.md#get_payment_method_settings) checks availability, [create_order](https://studio.inttegro.com/machine/python/inttegro-mcp/tools.md#create_order) creates an unpaid order, and [pay_order](https://studio.inttegro.com/machine/python/inttegro-mcp/tools.md#pay_order) starts collection only after exact confirmation. [get_order](https://studio.inttegro.com/machine/python/inttegro-mcp/tools.md#get_order) reconciles status.

## Document content

# Accept mobile money payments

Mobile money is Ghana's dominant payment method, accounting for over 70% of digital transactions. This guide shows you how to accept payments from MTN, Telecel, and AirtelTigo wallets through a three-phase flow: create an order, confirm customer intent with an OTP, then wait for payment authorization.

> Mcp Guide Callout is interactive content. Use the canonical page to view it.

## How it works

Mobile money payments can require more than one customer action. Create an order with [`execute_payment`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#CreateNewCustomerInput.execute_payment) set to `True`, inspect [`order.payment.next_action`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order), and present the requested confirmation or authorization experience. After each action, use the returned order state to decide whether to wait, request confirmation, or consider the payment paid.

## Supported networks

Inttegro integrates with all three major networks in Ghana: **MTN Mobile Money** (24M+ wallets), **Telecel Cash** (8M+ wallets), and **AirtelTigo Money** (6M+ wallets). Inttegro automatically routes transactions based on phone number prefix—no network-specific integration needed.

## Step 1: create the order

Creating an order bundles the customer, payment method, and line items into one request. Setting [`execute_payment`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#CreateNewCustomerInput.execute_payment) to `True` starts payment execution; the response tells you whether customer confirmation is required.

**Create mobile money order — POST /orders/create**

```python
import os

import inttegro
from inttegro import InttegroClient

client = InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])

result = client.orders.create(inttegro.order.CreateNewCustomerInput(
  request_meta=inttegro.order.CreateNewCustomerInputRequestMeta(
    idempotency_key="order_momo_2025_001",
  ),
  execute_payment=True,
  customer_data=inttegro.customer.DataInput(
    name="Akosua Mensah",
    email_address="akosua@example.com",
    phone_number="+233244123456",
  ),
  payment_method_data=inttegro.payment_method.DataInput(
    type=inttegro.payment_method.Type.MOBILE_MONEY,
    mobile_money=inttegro.payment_method.DataInputMobileMoney(
      network=inttegro.payment_method.MobileMoneyNetwork.MTN,
      account_number="0244123456",
    ),
  ),
  line_items=[
    inttegro.product.LineItemInput(
      type=inttegro.order.LineItemType.PRODUCT,
      product=inttegro.product.InlineDetailsInput(
        type=inttegro.product.Type.DIGITAL,
        name="Premium Subscription - 1 Month",
        quantity=1,
        price=inttegro.price.InlineParams(
          currency=inttegro.money.Currency.GHS,
          value=5000,
        ),
      ),
    ),
  ],
))
```

### Key parameters

- **[`execute_payment`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#CreateNewCustomerInput.execute_payment)** - Set to `True` to initiate payment immediately.
- **[`payment_method_data.mobile_money.network`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#DataInputMobileMoney.network)** - Use [`inttegro.payment_method.MobileMoneyNetwork.AIRTEL`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#MobileMoneyNetwork.AIRTEL), [`inttegro.payment_method.MobileMoneyNetwork.MTN`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#MobileMoneyNetwork.MTN), [`inttegro.payment_method.MobileMoneyNetwork.TELECEL`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#MobileMoneyNetwork.TELECEL), or [`inttegro.payment_method.MobileMoneyNetwork.VODAFONE`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#MobileMoneyNetwork.VODAFONE).
- **[`payment_method_data.mobile_money.account_number`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#DataInputMobileMoney.account_number)** - The wallet phone number in local or international format.
- **`line_items[].product.price.value`** - Use minor units (pesewas). GHS 50.00 is `5000`.

The response includes the order, payment, and confirmation-request identifiers needed for the next action. Read [`order.payment.next_action.confirm_payment.request.token_size`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order), [`order.payment.next_action.confirm_payment.request.sent_via`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order), and [`order.payment.next_action.confirm_payment.expires_at`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order)  instead of assuming fixed values.

## Step 2: confirm customer intent with OTP

When [`order.payment.next_action.type`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order)  is [`inttegro.payment.NextActionType.CONFIRM_PAYMENT`](https://python.inttegro.dev/v12.0.0/inttegro/payment.html#NextActionType.CONFIRM_PAYMENT), collect the token from the customer and submit it before [`order.payment.next_action.confirm_payment.expires_at`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order). After confirmation, inspect the returned order again; some payments require a separate authorization action before they become paid.

> **Note:**
>
> Confirmation is bound to the current order and confirmation request. Pass the
> identifiers and token returned by the create call to your SDK's confirmation
> operation. See [Confirm a payment](https://studio.inttegro.com/machine/python/api/orders.md#confirm-a-payment) for the exact
> request shape in the selected SDK.

Inttegro validates the token and returns the latest order state. Continue only according to [`order.payment.next_action`](https://python.inttegro.dev/v12.0.0/inttegro/order.html#Order); don't assume confirmation alone completed the charge.

**Common errors:**

- `confirmation_bad_token` - Ask the customer for the latest
  token and retry the confirmation call.
- `confirmation_expired` - Request a new confirmation before
  retrying.
- `confirmation_max_reached` - Request a new confirmation
  because the active request has no attempts remaining.

## Step 3: verify payment status

After the customer authorizes the payment with their mobile money provider, look up the order to verify completion. This typically happens within 5-15 seconds after authorization:

**Check payment status — POST /orders/lookup**

```python
import os

from inttegro import InttegroClient

client = InttegroClient(api_key=os.environ["INTTEGRO_API_KEY"])

result = client.orders.lookup("or_abc123xyz")
```

Payment statuses: [`inttegro.payment.Status.REQUIRES_ACTION`](https://python.inttegro.dev/v12.0.0/inttegro/payment.html#Status.REQUIRES_ACTION)  while waiting for confirmation, [`inttegro.payment.Status.PAID`](https://python.inttegro.dev/v12.0.0/inttegro/payment.html#Status.PAID)  after success, [`inttegro.payment.Status.FAILED`](https://python.inttegro.dev/v12.0.0/inttegro/payment.html#Status.FAILED)  after a failed or canceled payment, and [`inttegro.payment.Status.EXPIRED`](https://python.inttegro.dev/v12.0.0/inttegro/payment.html#Status.EXPIRED)  when the authorization window closes.

## Important details

**Transaction limits**: MTN (GHS 5K/transaction, 10K daily), Telecel (3K/transaction, 5K daily), AirtelTigo (2K/transaction, 3K daily). Exceeding limits returns an `amount_too_large` error.

Order limits: Each order can contain up to 64 line items. Order totals are capped at 100,000 for [`inttegro.money.Currency.GHS`](https://python.inttegro.dev/v12.0.0/inttegro/money.html#Currency.GHS)  and 50,000 for all other supported currencies, measured in the currency's smallest unit. Contact [support](mailto:support@inttegro.com)  if you need these limits increased. **Settlement**: Real-time to your balance, but 7-day aging period before payout eligibility (Bank of Ghana dispute window).

**Pricing**: 1.5% + GHS 0.50 per transaction, deducted before funds reach your balance.

Network detection: Inttegro validates that [`payment_method_data.mobile_money.network`](https://python.inttegro.dev/v12.0.0/inttegro/payment_method.html#DataInputMobileMoney.network)  matches the phone prefix (MTN: 024/054/055/059, Telecel: 020/050, AirtelTigo: 027/057/026/056).

## Next steps

You're now accepting mobile money payments! Here's what to explore next:

- **[Charge repeat customers](https://studio.inttegro.com/machine/python/guides/charge-repeat-customers.md)** - Save payment methods for one-click checkout
- **[Handle payment failures](https://studio.inttegro.com/machine/python/guides/retry-a-payment.md)** - Retry failed transactions gracefully
- **[Set up payouts](https://studio.inttegro.com/machine/python/products/payouts.md)** - Withdraw funds to your bank account
- **[Understand payment method settings](https://studio.inttegro.com/machine/python/guides/understand-payment-method-settings.md)** - Configure verification and confirmation requirements

For detailed parameter documentation, see the [Orders API reference](https://studio.inttegro.com/machine/python/api/orders.md).
