---
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: "Java"
sdk_version: "v8.3.0"
reader_profile: optional
reader_manifest: "https://studio.inttegro.com/machine/java/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: 465
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: 2993
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/java/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/java/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/java/inttegro-mcp/tools.md#get_payment_method_settings) checks availability, [create_order](https://studio.inttegro.com/machine/java/inttegro-mcp/tools.md#create_order) creates an unpaid order, and [pay_order](https://studio.inttegro.com/machine/java/inttegro-mcp/tools.md#pay_order) starts collection only after exact confirmation. [get_order](https://studio.inttegro.com/machine/java/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 `executePayment(…)` set to `true`, inspect [`order(…).payment(…).nextAction(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html), 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 `executePayment(…)` to `true` starts payment execution; the response tells you whether customer confirmation is required.

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

```java
import com.inttegro.Client;
import com.inttegro.orders.OrderCreateParams;
import com.inttegro.RequestMeta;
import com.inttegro.customers.CustomerData;
import com.inttegro.paymentmethods.PaymentMethodData;
import com.inttegro.paymentmethods.PaymentMethodType;
import com.inttegro.paymentmethods.MobileMoneyParams;
import com.inttegro.paymentmethods.MobileMoneyNetwork;
import com.inttegro.orders.OrderLineItemParams;
import com.inttegro.orders.ProductLineItemParams;
import com.inttegro.products.ProductType;
import com.inttegro.prices.PriceParams;
import com.inttegro.money.Currency;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = new Client(System.getenv("INTTEGRO_API_KEY"));
    var params = OrderCreateParams.builder()
      .requestMeta(RequestMeta.builder()
          .idempotencyKey("order_momo_2025_001")
          .build())
      .executePayment(true)
      .customerData(CustomerData.builder()
          .name("Akosua Mensah")
          .email("akosua@example.com")
          .phoneNumber("+233244123456")
          .build())
      .paymentMethodData(PaymentMethodData.builder()
          .type(PaymentMethodType.MOBILE_MONEY)
          .mobileMoney(MobileMoneyParams.builder()
              .network(MobileMoneyNetwork.MTN)
              .accountNumber("0244123456")
              .build())
          .build())
      .lineItem(OrderLineItemParams.product(ProductLineItemParams.builder()
            .type(ProductType.DIGITAL)
            .name("Premium Subscription - 1 Month")
            .quantity(1L)
            .price(PriceParams.of(Currency.GHS, 5000))
            .build()))
      .build();
    var result = client.orders().create(params);
  }
}
```

### Key parameters

- **`executePayment(…)`** - Set to `true` to initiate payment immediately.
- **`paymentMethodData(…).mobileMoney(…).network(…)`** - Use [`MobileMoneyNetwork.AIRTEL`](https://java.inttegro.dev/v8.3.0/com/inttegro/paymentmethods/MobileMoneyNetwork.html#AIRTEL), [`MobileMoneyNetwork.MTN`](https://java.inttegro.dev/v8.3.0/com/inttegro/paymentmethods/MobileMoneyNetwork.html#MTN), [`MobileMoneyNetwork.TELECEL`](https://java.inttegro.dev/v8.3.0/com/inttegro/paymentmethods/MobileMoneyNetwork.html#TELECEL), or [`MobileMoneyNetwork.VODAFONE`](https://java.inttegro.dev/v8.3.0/com/inttegro/paymentmethods/MobileMoneyNetwork.html#VODAFONE).
- **`paymentMethodData(…).mobileMoney(…).accountNumber(…)`** - The wallet phone number in local or international format.
- **`lineItem(…)[].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(…).nextAction(…).confirmPayment(…).request(…).tokenSize(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html), [`order(…).payment(…).nextAction(…).confirmPayment(…).request(…).sentVia(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html), and [`order(…).payment(…).nextAction(…).confirmPayment(…).expiresAt(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html)  instead of assuming fixed values.

## Step 2: confirm customer intent with OTP

When [`order(…).payment(…).nextAction(…).type(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html)  is [`PaymentNextActionType.CONFIRM_PAYMENT`](https://java.inttegro.dev/v8.3.0/com/inttegro/payments/PaymentNextActionType.html#CONFIRM_PAYMENT), collect the token from the customer and submit it before [`order(…).payment(…).nextAction(…).confirmPayment(…).expiresAt(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html). 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/java/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(…).nextAction(…)`](https://java.inttegro.dev/v8.3.0/com/inttegro/orders/Order.html); 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**

```java
import com.inttegro.Client;

public class Example {
  public static void main(String[] args) throws Exception {
    var client = new Client(System.getenv("INTTEGRO_API_KEY"));
    var result = client.orders().lookup("or_abc123xyz");
  }
}
```

Payment statuses: [`PaymentStatus.REQUIRES_ACTION`](https://java.inttegro.dev/v8.3.0/com/inttegro/payments/PaymentStatus.html#REQUIRES_ACTION)  while waiting for confirmation, [`PaymentStatus.PAID`](https://java.inttegro.dev/v8.3.0/com/inttegro/payments/PaymentStatus.html#PAID)  after success, [`PaymentStatus.FAILED`](https://java.inttegro.dev/v8.3.0/com/inttegro/payments/PaymentStatus.html#FAILED)  after a failed or canceled payment, and [`PaymentStatus.EXPIRED`](https://java.inttegro.dev/v8.3.0/com/inttegro/payments/PaymentStatus.html#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 [`Currency.GHS`](https://java.inttegro.dev/v8.3.0/com/inttegro/money/Currency.html#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 `paymentMethodData(…).mobileMoney(…).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/java/guides/charge-repeat-customers.md)** - Save payment methods for one-click checkout
- **[Handle payment failures](https://studio.inttegro.com/machine/java/guides/retry-a-payment.md)** - Retry failed transactions gracefully
- **[Set up payouts](https://studio.inttegro.com/machine/java/products/payouts.md)** - Withdraw funds to your bank account
- **[Understand payment method settings](https://studio.inttegro.com/machine/java/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/java/api/orders.md).
