Expiring and Closing Intents
A payment intent allows multiple payment attempts - the customer can try different methods until one succeeds. However, when a payment involves an external provider page or a 3DS redirect, MoneyHash cannot control what happens outside its system until the provider responds. If an intent is closed or expires while that external process is still in progress, a status discrepancy can occur.
When external flows are involved
Some payment flows hand control to an external party before the outcome is known:
| Scenario | What happens externally |
|---|---|
| Provider-hosted page | The customer enters payment details or confirms a transaction on the provider's own page, rendered as an iframe or redirect |
| 3DS redirect | The customer authenticates the payment with their bank or card issuer on an external page |
| Async pending state | The provider has accepted the request but is still processing - for example, under review or awaiting final confirmation |
During any of these states, MoneyHash is waiting for the provider to report back. The outcome is not yet known.
How discrepancies arise
If the intent is closed via API or reaches its expiry time while the external process is still in progress, MoneyHash marks the transaction as failed and the intent as CLOSED or EXPIRED.
If the provider then completes the payment successfully - after the customer finishes the 3DS flow or the provider's async process concludes - MoneyHash has already declared the intent terminal and can no longer reflect that success. The result is a mismatch between MoneyHash's reported status and the provider's actual outcome.
A discrepancy does not mean funds were lost. It means MoneyHash's recorded status does not match what the provider processed. This should be caught with our Anomaly Detection feature and during reconciliation - see Settlement & Reconciliation.
How MoneyHash minimizes discrepancies
Background polling
MoneyHash periodically polls the payment provider in the background to pick up status changes as soon as they are available. This catches successful payments that would otherwise be missed due to delayed provider responses.
Provider-level expiry
Where the provider supports an expiry setting, MoneyHash configures it automatically when creating the transaction. This ensures the provider stops processing the payment after a defined window - reducing the chance of a late success arriving after the intent has already been closed or expired on the MoneyHash side.
Best practices
Do not close an intent while a 3DS flow or provider async process is still in progress. Wait for the external process to conclude - either successfully or with a failure - before closing the intent via API.
Configure intent expiry carefully
If you use expiry time on intents, set it long enough to accommodate the full external flow - including 3DS authentication and provider async processing time. A short expiry window increases the risk of closing an intent before the provider has finished.
Use payment flows in the dashboard
Intent expiry can be configured directly in Payment Flows in the MoneyHash dashboard without requiring engineering changes. This is the recommended way to adjust expiry behavior for most scenarios.
Consult MoneyHash for complex flows
If your integration involves multiple retries, extended 3DS flows, or long async processing windows, reach out to MoneyHash. We can help design a setup that minimizes timing conflicts and ensures accurate reconciliation.
Updated 29 days ago