Mobile Money Webhooks

SaySwitch sends webhook notifications to your configured endpoint when a payout status changes.

All webhooks are POST requests with a JSON payload. Respond with HTTP 200 to acknowledge receipt.

Notify Types

Notify TypeTrigger
payout - successfulTransfer completed and funds delivered to beneficiary
payout - failedTransfer could not be completed

Successful Payout Webhook Payload

{
  "notify": "payout",
  "notifyType": "successful",
  "data": {
    "id": 95596,
    "reference": "a02f886f-ea04-4eba-a286-79e7d8012306",
    "sessionid": "GHJEG4462C800D0304727AD7008D8FDC7629C",
    "currency": "GHS",
    "amount": "10",
    "fee": "1",
    "stamp_duty": "0",
    "bank_code": "MTNGH",
    "bank_name": "MTNGH",
    "account_number": "233245690993",
    "account_name": "JOSHUA AKANYIFE",
    "countryCode": "GH",
    "paymentMode": "momo",
    "narration": "Test transfer",
    "sender": "SAYSWITCH",
    "domain": "live",
    "status": "success",
    "created_at": "2026-05-12T05:19:56.000000Z",
    "updated_at": "2026-05-12T05:20:02.000000Z"
  }
}

Webhook Payload Fields

FieldTypeDescription
notifyStringNotification category. Always payout
notifyTypeStringsuccessful or failed
data.idNumberInternal transaction ID
data.referenceStringYour unique transaction reference
data.sessionidStringPayment processor session identifier
data.currencyStringTransaction currency
data.amountStringTransfer amount
data.feeStringFee charged for the transaction
data.bank_code / data.bank_nameStringDestination bank identifiers
data.account_numberStringBeneficiary account or phone number
data.account_nameStringVerified beneficiary name
data.paymentModeStringmomo or bank
data.senderStringOriginator name, SAYSWITCH
data.statusStringsuccess or failed
data.created_at / data.updated_atStringISO 8601 timestamps

Handling Webhooks

  • Return HTTP 200 after receiving the webhook.
  • Validate notify and notifyType before updating a payout record.
  • Use data.reference to match the webhook to your original transfer request.
  • Treat webhook processing as idempotent so duplicate notifications do not create duplicate fulfillment actions.