Singapay Home Page
Logo Icon
  1. Getting Started
  2. Money In Journey

Money In Journey

This page explains the complete transaction lifecycle for Money In products on SingaPay — how payments are received, what happens when they fail, and how disputes are resolved.

Applies to: Virtual Account, E-Wallet (Money In), QRIS, and Payment Link


How It Works

All Money In products on SingaPay follow a callback-based (notification-based) model. SingaPay does not process the payment directly — instead, it relies on vendor banks or payment service providers (PJP) to confirm whether a customer’s payment was successful.

Money In – Payment Lifecycle🏪MerchantSingaPay🏦Vendor (Bank/PJP)👤CustomerCreate payment (VA/E-Wallet/QRIS/Payment Link)Return payment details (status: open/unpaid)Customer pays via bank/e-wallet appVendor sends callback notificationVerify & confirm with vendor bankWebhook: payment success

Step-by-step:

  1. Merchant creates a payment (Virtual Account, E-Wallet checkout, QRIS, or Payment Link) through the SingaPay API.
  2. SingaPay returns the payment details with an initial status of open (or unpaid).
  3. Customer pays through their banking app, e-wallet app, or by scanning the QR code.
  4. The vendor bank/PJP sends a callback to SingaPay notifying that a payment has been received.
  5. SingaPay verifies and confirms with the vendor bank.
  6. If confirmed successful, the transaction status is updated to success and a webhook notification is sent to the merchant.

What Happens When a Payment Fails?

Important: Money In products do not have a “failed” status in the traditional sense.

Unlike Money Out, Money In transactions do not transition to a failed status. Here’s what actually happens:

ScenarioWhat HappensFinal Status
Customer pays successfullyVendor confirms payment → SingaPay verifies → transaction marked as successsuccess
Customer doesn’t payNo callback received → transaction remains open/unpaid until it expiresexpired
Customer payment fails at bankBank rejects the payment on their end → no callback sent to SingaPay → transaction stays open/unpaidexpired
Vendor confirms success but delayedSingaPay receives late callback → verifies with vendor → processes manually to successsuccess

Key Takeaway

A Money In transaction will never show “failed”. It will either be confirmed as success (if the bank/vendor confirms the payment), or remain open/unpaid until it expires. There is no intermediate “failed” state because SingaPay waits for positive confirmation from the vendor — if no confirmation arrives, the transaction simply expires after its designated time window.

Status Lifecycle

┌──────────┐
│  OPEN /  │──── Customer pays & vendor confirms ────▶ ┌─────────┐
│  UNPAID  │                                           │ SUCCESS │
│          │                                           └─────────┘
│          │
│          │──── No payment / time runs out ──────────▶ ┌─────────┐
│          │                                           │ EXPIRED │
└──────────┘                                           └─────────┘

There is no direct path from open/unpaid to failed for Money In products.


Dispute Resolution (Money In)

If a customer claims they have paid but the transaction still shows open/unpaid or expired, follow this dispute resolution procedure:

Money In – Dispute Resolution Procedure👤Customer🏪MerchantSingaPay Support🏦Vendor (Bank/PJP)1. Report: "I already paid but status still unpaid"2. Contact support with transaction details & proof3. Investigate & verify payment with vendor bank4. Confirm payment status5. Report findings & resolve transaction6. Inform customer of resolution

Steps:

  1. Customer reports the issue to the merchant — typically claiming they have already completed the payment but the status has not updated.
  2. Merchant contacts SingaPay support — provide the transaction reference number (reff_no), payment amount, payment timestamp, and any proof of payment from the customer (e.g., screenshot from their banking/e-wallet app).
  3. SingaPay investigates — the support team verifies the payment status directly with the vendor bank or payment service provider.
  4. Vendor bank confirms — the bank provides the actual payment status on their end.
  5. SingaPay resolves the transaction — if the vendor confirms the payment was successful, SingaPay will manually process the transaction to success and notify the merchant.
  6. Merchant informs the customer — once resolved, the merchant can confirm to the customer that the payment has been processed.

What to provide when contacting SingaPay support: Transaction reference number (reff_no), account ID, payment amount, approximate payment time, and customer’s proof of payment if available.


Best Practices

  1. Always listen for webhooks — Do not rely on polling alone. Implement a webhook receiver to get real-time payment confirmations.
  2. Handle expiration gracefully — Show appropriate messages to your customers when a payment window expires.
  3. Don’t treat “no callback” as failure — The absence of a callback simply means the customer hasn’t paid yet, or the payment is still being processed.
  4. Use Inquiry Status endpoints — For E-Wallet (Money In) and QRIS, you can proactively check the payment status using the inquiry-status API.
  5. Contact SingaPay support for disputes — If a customer reports they have paid but the transaction has not updated, contact the SingaPay support team with the transaction details.

FAQ

“A customer says their payment failed, what happened?”

Transactions don’t have a “failed” status on SingaPay’s side. If a customer reports their payment failed, it likely means their bank or e-wallet app rejected the payment on their end before it reached SingaPay. In this case, no callback is sent to SingaPay and the transaction remains open/unpaid until expiry. Advise the customer to check their bank statement and try again, or contact SingaPay support if the funds were deducted.

“How long should I wait before considering a transaction dead?”

Each product has its own expiration time. Once expired, the transaction cannot be paid anymore. You can also set custom expiration times when creating certain payment types (e.g., E-Wallet checkout). After a transaction expires, if the customer still wants to pay, a new transaction must be created.

“Customer’s money was deducted but status is still unpaid. What do I do?”

This can happen if there is a delay or issue with the vendor callback. Contact SingaPay support immediately with the transaction reference number and proof of deduction from the customer. SingaPay will verify directly with the vendor bank and process the transaction manually if confirmed.


Comparison: Money In vs Money Out

AspectMoney InMoney Out
ProductsVA, E-Wallet (Money In), QRIS, Payment LinkDisbursement, E-Wallet (Money Out)
Who initiates?Customer pays into SingaPaySingaPay sends money out
Initial statusopen / unpaidpending
Has “failed” status?No — unpaid transactions expireYes — bank can reject transfers
Typical resolution timeDepends on customer (minutes to hours)1–2 seconds (normal), up to ~15 min (uncommon)
If no response from vendorTransaction stays open → eventually expiredTransaction stays pending → resolved by SingaPay team
Confirmation modelCallback-based (waiting for vendor notification)Real-time response from bank
If something goes wrongContact SingaPay support with transaction detailsContact SingaPay support — do not retry without guidance

See Also