Start with the original payment attempt
If the bank or checkout return page says “successful” while your order is pending, look up the original attempt on your server and verify its status with your payment provider. Release the order once you have a trusted final success that matches the original attempt, order, amount and currency. If the evidence is incomplete, keep the order pending, give the customer a way to check it, and investigate that attempt before asking for another payment.
This is a runbook for businesses already taking MYR online banking payments, including digital goods and subscription platforms where a successful order grants access immediately. It also gives payment teams a test plan for comparing providers. A customer can finish at the bank while your own order record is still waiting for a status message or an internal update.
- Browser return. The customer may land on a bank receipt, a provider page or your own return page. Record which page displayed success. Use the browser return to resume the checkout and load the order’s current server-side status. Treat a screen label or an unsigned URL parameter as a clue.
- Payment attempt. This is the provider’s transaction record for that try. A trusted callback or an authenticated status lookup under the merchant’s approved integration can confirm whether that attempt reached final success. Compare the provider result with the references and amount stored when the attempt was created.
- Merchant order. The order has its own fulfilment state. If the matched payment is confirmed and the order still shows pending, trace the update from payment confirmation through the fulfilment job. Separately track whether the payment appears in the provider’s finance report and whether the associated funds have settled.
Payments Network Malaysia Sdn Bhd (PayNet) documents separate direct and browser-carried responses in its FPX consumer checkout flow. It also documents an enquiry flow for debit exceptions. SecurePay’s merchant documentation gives a provider example with separate redirect and callback URLs, a checksum for verification and a transaction status endpoint. Use your own provider’s integration contract for the source of truth, valid statuses and recovery steps. These examples describe those products’ documented behaviour. See the source documents.
Decide what to do with the pending order
| Evidence | Order decision | Next action |
|---|---|---|
| Browser shows success. The callback is missing or the lookup is unavailable. | Keep pending. | Queue a lookup of the original reference under the provider’s retry rules. Tell the buyer you’re checking. |
| Trusted result is pending, or no record is found during the provider’s documented visibility window. | Keep pending. | Schedule the next check and escalate if the route-specific investigation deadline passes. |
| Trusted final success matches the original attempt, account, order, amount and currency. | Record the payment once. | Release eligible fulfilment once. If the order closed or was already paid by another attempt, route the extra receipt to review. |
| Verified messages conflict, or the amount, currency or identity differs. | Hold for review. | Preserve both results and ask the provider to resolve the discrepancy. Keep the case open until someone owns the next action. |
| Trusted final failure or cancellation is confirmed and no other attempt for the order is unresolved or paid. | Offer a fresh attempt if allowed. | Use a separate attempt reference and link it to the same order so both results remain traceable. |
Define the recovery window separately from the time a buyer spends at checkout. Your provider’s enquiry availability and final status rules determine when your team can close an attempt. A merchant-side timer can end the checkout session and trigger a support review while the original payment remains unresolved.
Trace a successful return and a pending order
1. Rebuild the timeline
Start with the merchant order ID and list every linked payment attempt. For each one, collect the original provider reference, merchant account or route, environment, expected amount and currency, and the creation time with its time zone. Add when the buyer returned and what your site displayed. Track callback delivery, lookup time and the last order write separately. This shows whether the missing step is with the bank or provider, at your callback endpoint, or after the event entered your system.
2. Check callback receipt and processing
Look for the provider reference in the endpoint and application logs. If the provider reports a delivery but you have no record, check the registered callback URL, environment, DNS and TLS, proxy access rules, and any route or firewall changes around that time. If you have a request, check the verification result, response status and durable record of the event. An HTTP success response only shows that the endpoint replied. Follow the event through parsing, the order update and the worker that releases the order. Check for dead-letter jobs or database rollbacks before asking the provider to resend.
3. Query the same attempt on the server
Use the stored reference and account credentials for the original route. Use the documented status endpoint or the provider’s approved operational escalation channel. Avoid calling a lookup URL supplied by the browser. If an API returns “not found,” check that you used the correct reference type, environment and account, then apply the provider’s guidance for that response. A status query that times out leaves the payment unresolved. Give one worker ownership of subsequent checks so customer refreshes and support actions do not each launch their own retry loop.
4. Apply the result once and let the browser read it
Route both a verified callback and a verified status lookup through the same order update. Guard the transition so two workers cannot both record the same successful attempt or release the same entitlement. For example, save the receipt and the pending fulfilment job in one database transaction, and make the worker safe to replay. Keep the receipt tied to the attempt and the delivery tied to the order. Use the provider’s documented state transitions when messages arrive out of order. A stale pending event should leave a confirmed receipt intact, while a documented later reversal belongs in its own workflow.
For the buyer, reload the order status from your authenticated backend or use a short-lived order status link. A workable pending message is “We’re verifying your payment. Please check this order again before making another payment.” Share the next review time only if your team can meet it. The return page can show the status but should use the same backend record as the account page and customer support.
5. Hand off the exceptions with a named owner
Support should collect the merchant order ID, attempt time, MYR amount and any available provider receipt reference through an approved support channel. Ask buyers to keep bank login details, one-time codes and full account numbers private. Engineering owns callback and status lookup failures. Finance owns unmatched receipts, two successful attempts against one order, and refunds or reversals after confirmation. A provider escalation should include the reference, account or route, environment, time zone, last trusted status, callback result and the mismatch. Keep customer identifiers and secrets out of incident summaries.
Hypothetical case: the buyer paid, but access is still locked
A subscription platform sells access for MYR 120.00. The buyer sees success at the bank, then returns to a pending merchant order. Support finds attempt EXAMPLE-A1 and asks the buyer to wait while it checks. The order has no other attempts. Engineering finds a callback verification error after a configuration change and queries the original attempt under the correct merchant account. The lookup initially reports pending, so the team records that result and leaves access locked.
A later authenticated lookup returns final success for the same reference and MYR 120.00. The shared updater saves the receipt and schedules one access grant. The callback arrives again after the configuration fix and passes verification. It matches the saved receipt, so it leaves the existing grant in place. The customer sees the updated status from their account. Finance later matches the provider report to that same receipt. This amount, reference and sequence are illustrative. The times and statuses in production depend on the merchant’s approved route.
If the entitlement still failed to appear after payment confirmation, the next check would be the access grant job and its error history. The platform could recover that job without reopening the payment attempt. If a second attempt had also succeeded, finance would review the second receipt under the agreed refund policy while preserving the record of both payments.
Acceptance tests for a new route or provider switch
- Return before callback. Delay the callback in a test run. Verify that the browser can show pending, the provider lookup can resolve the order when supported, and a later callback creates no extra entitlement.
- No return at all. Close the browser at the bank. Complete a test attempt under the provider’s supported test flow and confirm that server-side recovery can update the order without that browser session.
- Bad or stale evidence. Send an invalid callback signature and simulate an older pending message after final success. Confirm the first cannot change the order and the second cannot downgrade the receipt.
- Partial system failure. Interrupt the fulfilment worker after confirmation, then restart it. The paid receipt should still be traceable and fulfilment should recover without making a second charge or grant.
- Lookup and report gaps. Simulate an unavailable lookup and reconcile a later report entry. Verify the case has an owner, a next review time, and a way to tie the report entry to the exact original attempt before taking action.
During a cutover, agree who owns pending payments on the old route and how long the old callback and enquiry access must remain usable. Run these scenarios before changing routing, and record which evidence an on-call engineer can retrieve without waiting for another team. Track unresolved attempts, age of the oldest pending item, and how often a confirmed payment fails to fulfil. These checks show where the recovery process breaks.
For replay protection, see the guide on duplicate payment webhooks. For the wider collection workflow, see the Malaysia online banking and QR payment overview.
Sources and verification date
Documentation checked on .
- Payments Network Malaysia Sdn Bhd (PayNet). FPX consumer checkout flow and FPX exception handling describe separate response paths and the debit enquiry flow.
- SecurePay. Callback and redirect URLs and transaction status lookup show how one provider exposes merchant-side verification and enquiry.
Discuss your MYR checkout requirements
If you’re assessing a Malaysia collection integration, share your business website, payment flow, approximate MYR volume and how your team handles delayed confirmations. An anonymised example can help frame the review. Keep customer details and live payment credentials out of the enquiry.
Prepare a Malaysia collections enquiry