A duplicate transaction is when an equivalent payment action tied to the same transaction occurs multiple times, often unintentionally. For example, a customer might notice on their bank statement that they were charged twice for the same item. Or you might review a transaction in the Dashboard and realize you refunded a customer multiple times.
Understanding how these scenarios happen helps you resolve them and prevent them from recurring. Preventing genuine duplicate transactions can also help reduce your dispute ratios.
How it works with Checkout.com
Depending on the cause, most reports of duplicated transactions can be categorized into one of the following:
- Customer issues
- Merchant-side integration issues
- System errors
Customer issues
Each bank reports authorized funds, refunds, and credited funds differently on its statements. For example, a hold on funds for an authorized payment can look the same as a captured payment, even when funds have not left the customer's account. The payment capture might then appear as a separate action in the account activity. This can confuse the customer and lead them to report a duplicate transaction by mistake.
When a customer reports a duplicate transaction, always review your payments in the Dashboard before you take any further action. This helps you verify whether a single payment has multiple authorizations or captures.
Occasionally, a customer action can accidentally result in a genuine duplicate transaction. For example, if they:
- Select the payment button on your website multiple times in quick succession.
- Refresh the page while the payment is being processed.
- Submit a payment form multiple times, due to perceived website slowdown.
These can cause multiple requests to be sent to the backend with the same reference and session ID.
Merchant-side integration issues
Many of the Checkout.com API endpoints support idempotent requests, which let you safely retry API requests without the risk of a duplicate. However, if you do not configure them correctly, they might not work as expected.
To prevent a request from being processed more than once, send the same idempotency key with each attempt for a given request. This ensures that we do not process any later attempts with the same key as a new request.
Your backend generates idempotency keys. If your logic generates a new key for each request regardless of the source transaction, it prevents the expected idempotency behavior, because we treat every request as a unique action.
We recommend updating your key generation logic to use a single, consistent key for each attempt tied to a unique payment request.
System errors
Occasionally, a system error can result in a duplicate transaction. For example:
- Your system automatically retries a payment request due to a network issue or timeout while the first one is processed.
- A technical issue occurs during the initial request that causes the payment action to be processed twice.
Scenarios and resolution
| Scenario | Resolution | Who to contact |
| Duplicate payment authorizations, neither captured. | Void one authorization and capture the other to continue processing the customer's payment. | Inform the customer that you've cancelled one of the authorizations. |
| Duplicate payment authorizations, one captured. | Void the authorization that has not been captured. | Inform the customer that you've cancelled one of the authorizations. |
| Duplicate payment captures. | Refund one of the payments. | Inform the customer that you've refunded one of the payments. |
| Duplicate payment refunds. | Request a refund reversal for one of the payments. | Contact Checkout.com to request a refund reversal after the refund has cleared. Inform the customer that you've cancelled one of the refunds. |
Workflow
- You or the customer reports a duplicate transaction.
- You validate if and how the duplicate transaction occurred by reviewing the payment activity in the Dashboard.
- If the report is genuine, you contact the customer's bank or Checkout.com to resolve the duplicate transaction. For example, if you accidentally charged the customer twice.
- You contact the customer and inform them of the resolution steps.
Where to go next
- Validate your Checkout.com integration's idempotency logic.
- Set up your integration with logic to capture, refund, or void a payment.