---
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: "Go"
sdk_version: "v11.0.1"
reader_profile: optional
reader_manifest: "https://studio.inttegro.com/machine/go/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: 462
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: 3163
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/go/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/go/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/go/inttegro-mcp/tools.md#get_payment_method_settings) checks availability, [create_order](https://studio.inttegro.com/machine/go/inttegro-mcp/tools.md#create_order) creates an unpaid order, and [pay_order](https://studio.inttegro.com/machine/go/inttegro-mcp/tools.md#pay_order) starts collection only after exact confirmation. [get_order](https://studio.inttegro.com/machine/go/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`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#CreateParams.ExecutePayment) set to `true`, inspect [`Order.Payment.NextAction`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#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 [`ExecutePayment`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#CreateParams.ExecutePayment) to `true` starts payment execution; the response tells you whether customer confirmation is required.

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

```go
package main

import (
  "context"
  "log"
  "os"

  inttegro "github.com/inttegro/inttegro-sdk-go/v11"
  "github.com/inttegro/inttegro-sdk-go/v11/customer"
  "github.com/inttegro/inttegro-sdk-go/v11/money"
  "github.com/inttegro/inttegro-sdk-go/v11/order"
  "github.com/inttegro/inttegro-sdk-go/v11/paymentmethod"
  "github.com/inttegro/inttegro-sdk-go/v11/price"
  "github.com/inttegro/inttegro-sdk-go/v11/product"
  "github.com/inttegro/inttegro-sdk-go/v11/request"
)

func main() {
  ctx := context.Background()
  client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))

  params := order.CreateParams{
    RequestMeta: &request.Meta{
      IdempotencyKey: "order_momo_2025_001",
    },
    ExecutePayment: inttegro.Bool(true),
    CustomerData: &customer.Data{
      Name: "Akosua Mensah",
      Email: "akosua@example.com",
      PhoneNumber: "+233244123456",
    },
    PaymentMethodData: &paymentmethod.Data{
      Type: paymentmethod.TypeMobileMoney,
      MobileMoney: &paymentmethod.MobileMoneyParams{
        Network: paymentmethod.MobileMoneyNetworkMTN,
        AccountNumber: "0244123456",
      },
    },
    LineItems: []order.LineItemParams{
      {
        Type: order.LineItemTypeProduct,
        Product: &order.ProductLineItemParams{
          Type: product.TypeDigital,
          Name: "Premium Subscription - 1 Month",
          Quantity: 1,
          Price: price.InlineParams{
            AmountParams: money.AmountParams{
              Currency: money.GHS,
              Value: 5000,
            },
          },
        },
      },
    },
  }
  result, err := client.Orders.Create(ctx, params)
  if err != nil {
    log.Fatal(err)
  }
  _ = result
}
```

### Key parameters

- **[`ExecutePayment`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#CreateParams.ExecutePayment)** - Set to `true` to initiate payment immediately.
- **[`PaymentMethodData.MobileMoney.Network`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyParams.Network)** - Use [`paymentmethod.MobileMoneyNetworkAirtel`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyNetworkAirtel), [`paymentmethod.MobileMoneyNetworkMTN`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyNetworkMTN), [`paymentmethod.MobileMoneyNetworkTelecel`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyNetworkTelecel), or [`paymentmethod.MobileMoneyNetworkVodafone`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyNetworkVodafone).
- **[`PaymentMethodData.MobileMoney.AccountNumber`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyParams.AccountNumber)** - The wallet phone number in local or international format.
- **`LineItems[].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://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#Order), [`Order.Payment.NextAction.ConfirmPayment.Request.SentVia`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#Order), and [`Order.Payment.NextAction.ConfirmPayment.ExpiresAt`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#Order)  instead of assuming fixed values.

## Step 2: confirm customer intent with OTP

When [`Order.Payment.NextAction.Type`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#Order)  is [`payment.NextActionTypeConfirmPayment`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/payment#NextActionTypeConfirmPayment), collect the token from the customer and submit it before [`Order.Payment.NextAction.ConfirmPayment.ExpiresAt`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#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/go/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://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/order#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**

```go
package main

import (
  "context"
  "log"
  "os"

  inttegro "github.com/inttegro/inttegro-sdk-go/v11"
)

func main() {
  ctx := context.Background()
  client := inttegro.NewClient(os.Getenv("INTTEGRO_API_KEY"))

  result, err := client.Orders.Lookup(ctx, "or_abc123xyz")
  if err != nil {
    log.Fatal(err)
  }
  _ = result
}
```

Payment statuses: [`payment.StatusRequiresAction`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/payment#StatusRequiresAction)  while waiting for confirmation, [`payment.StatusPaid`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/payment#StatusPaid)  after success, [`payment.StatusFailed`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/payment#StatusFailed)  after a failed or canceled payment, and [`payment.StatusExpired`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/payment#StatusExpired)  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 [`money.GHS`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/money#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`](https://pkg.go.dev/github.com/inttegro/inttegro-sdk-go/v11@v11.0.1/paymentmethod#MobileMoneyParams.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/go/guides/charge-repeat-customers.md)** - Save payment methods for one-click checkout
- **[Handle payment failures](https://studio.inttegro.com/machine/go/guides/retry-a-payment.md)** - Retry failed transactions gracefully
- **[Set up payouts](https://studio.inttegro.com/machine/go/products/payouts.md)** - Withdraw funds to your bank account
- **[Understand payment method settings](https://studio.inttegro.com/machine/go/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/go/api/orders.md).
