Search pages in the SMS Pay documentation.
Check these in order:
PENDING.customerReference.| Field | Purpose |
|---|---|
customerReference | Short provider-facing payment reference shown on checkout and used for SMS matching. Keep it 16 characters or fewer. |
merchantReference | Your own order, invoice, or external reference. Use this for long order numbers. |
idempotencyKey | Stable retry key for creating the same payment intent without duplicates. It is not shown to customers. |
Recommended pattern:
customerReference.merchantReference.payment_intent_${order.id} as idempotencyKey.customerReference must be shorter than or equal to 16 characters?Your integration is probably sending a long order number as customerReference, for example ORD-1779771263742-7236.
Fix the payment intent request so the long order number is sent as merchantReference, and omit customerReference unless you have a short provider-safe code:
{
"amount": 500,
"currency": "BDT",
"merchantReference": "ORD-1779771263742-7236",
"idempotencyKey": "payment_intent_15aa64a2-92a5-4bf4-a54d-d7d27f373760"
}
SMS Pay will generate a short customerReference like SP7A91BC2D0 and return it in the response. Show/use that short value for wallet payment reference matching.
Check:
Most matching failures are caused by:
Use SMS Events and Reconciliation to inspect parsed amount, parsed reference, parsed TrxID, receiver, and match reason.
If the payment intent expired before confirmation, SMS Pay will not auto-confirm it. Review the SMS evidence if needed, but your backend should not automatically fulfill expired payments. Create a new payment intent for customer retry.
Wrong amount does not become paid automatically. If the reference or TrxID identifies the payment evidence, the payment may move to REVIEW_REQUIRED. Merchant admins should review the evidence and decide the operational outcome.
Check Dashboard -> Webhooks:
2xxRetry the delivery after fixing your endpoint.
Webhook delivery is at least once. Store X-Webhook-Id or X-Webhook-Idempotency-Key and make your fulfillment transaction idempotent. If the order is already paid, return 200 again.
successUrl?No. successUrl is a browser redirect for customer experience. Fulfill only from a signed payment.paid webhook or from your backend retrieving the payment intent and confirming status === "PAID".
No. Sandbox API keys, payment intents, SMS simulator events, and webhook tests are separate from live data. Live payments require live API keys and live Android device SMS evidence.