Expiring & Closing intents

Understanding Payment Intent Status Discrepancies

MoneyHash uses a Payment Intent to allow merchants to make multiple payment attempts, trying different methods until one succeeds. However, there are situations where the payment flow depends on an external provider's page or a 3D Secure (3DS) redirect. During those times, MoneyHash cannot control what happens externally, until we hear back from the payment provider.

External Flow Scenarios

  • External Payment Provider Page (iframe or redirect)The buyer is entering payment details or confirming a transaction on a provider‐hosted page.
  • External 3D Secure Page (usually a redirect)The buyer is authenticating the payment with a bank or card issuer.
  • Async Pending StateThe payment provider has accepted the request but is still processing the outcome (e.g., under review, awaiting final confirmation).

How Discrepancies Arise

While a transaction is in one of these "externally controlled" states, the merchant might:

  • Close the Payment Intent via API
  • Have an Expiry Time configured, which is triggered before the external process finishes.

If either of these events (closing or expiry) occurs while the external provider is still finalizing the payment, MoneyHash will mark the transaction as failed. Then, if the external provider eventually completes the payment as a success (after the buyer finishes the 3DS flow or the provider's async process completes), MoneyHash has already declared that transaction failed and the intent as closed/expired, and can no longer accurately reflect this successful outcome in the Payment Intent.

As a result, the final reported payment status in MoneyHash won't match the external provider's eventual success—this is the status discrepancy.

Current Measures to Minimize Discrepancies

1. Frequent Background Polling

MoneyHash periodically polls the payment provider in the background to update each transaction's status as soon as possible. This proactive check helps synchronize changes in cases where the external provider's response might have been delayed, potentially catching successful payments that would otherwise be missed.

2. Provider-Level Expiry

If the payment provider supports an expiry setting, MoneyHash automatically configures it when creating the payment transaction. Doing so ensures that the provider itself will no longer consider a payment valid after a certain time—minimizing the chance that the provider will complete a payment after MoneyHash has already declared the Intent expired.

Best Practices to Avoid Discrepancies

1. Close the Intent Only After All Payment Attempts Conclude

Wait until you're certain no further payment attempts or confirmations are pending. If the buyer is still on a 3DS flow or the provider is in an async state, let that process complete (either successfully or unsuccessfully) before closing the Intent. This is can be done from Payment flows in the dashboard and doesn’t require engineering work from your side.

2. Consult with MoneyHash for Complex Payment Flows

If you have an advanced or non-standard scenario (multiple retries, extended 3DS flows, very long async processes), reach out to MoneyHash's support team. We can help you design a more robust setup that minimizes timing conflicts and ensures accurate reconciliation between MoneyHash and the external provider.