M-Pesa integrations, like any payment system, can run into predictable issues. Here are the ones we see most often, and what actually resolves them.
Problem: Payments Succeed But Orders Aren't Marked Paid
This usually means the callback URL — where Safaricom sends payment confirmation — isn't correctly configured or isn't reachable. Double-check the callback endpoint is publicly accessible and correctly processes the confirmation payload.
Problem: STK Push Prompt Never Arrives
Often caused by an incorrect phone number format, expired or incorrect API credentials, or the customer's network having a temporary delay. Confirm the phone number format matches what Daraja expects (typically 254XXXXXXXXX).
Problem: Duplicate Charges
This can happen if a customer submits the payment request multiple times (e.g., clicking "Pay" repeatedly while waiting). Disabling the button after the first click and adding basic duplicate-request protection prevents this.
Problem: Sandbox Works But Live Doesn't
A common oversight is not switching all credentials and endpoints from Safaricom's sandbox/test environment to the production environment when going live.
Problem: Currency or Amount Mismatches
M-Pesa only processes Kenyan Shillings — attempting to charge in any other currency will fail. Confirm your invoice or order is genuinely billed in KES before the payment request is sent.
Still Having Issues?
If you're running into a problem not covered here, reach out to us — payment integration bugs are usually fixable once you've pinpointed exactly where in the flow they're happening.