This guide is for merchant integration engineers and backend or payment operations owners who implement or operate a Direct API /purchase orchestration. Use it to define a client-specific timeout, keep fulfillment safe when the client stops waiting, apply a pre-agreed shopper experience, and reconcile every attempt to a documented payment result.
A client timeout is an observation boundary, not proof that a payment failed. Keep the shopper-facing presentation separate from internal payment truth until reconciliation is complete.
DEUNA may still be processing after the client stops waiting. Record the merchant-owned
timeout_pending_reconciliationmarker and suppress fulfillment; do not store the timeout itself as a canonical DEUNA payment status.
Why timeout varies
End-to-end latency depends on the configured orchestration path. One payment may succeed with the first processor attempt. Another may require fraud analysis, receive a processor soft decline, and continue through fallback routing. Neither path establishes a universal latency bound.
DEUNA does not recommend one client-side timeout for every merchant. Define the value with your DEUNA Implementation Manager for your actual orchestration, then communicate the configured value to DEUNA so latency monitoring and alerting can align with the agreed behavior.
Prerequisites, environment, and authentication
Before implementing this flow, make sure you have:
- An existing authenticated Direct API integration that sends
/purchase. This guide changes merchant-side waiting and reconciliation, not DEUNA request schemas or authentication. - A merchant-owned
order_id, original idempotency key, and retained identical request body for each eligible operation. These values preserve the original operation identity during recovery. - A webhook consumer that can verify events where verification is enabled, process events idempotently, acknowledge them promptly, and update merchant order data. This makes webhooks the authoritative asynchronous outcome without duplicate merchant side effects.
- Access to the raw webhook body where signature verification is enabled. Follow Webhook verification before applying an event; do not invent a signature algorithm or payload field.
- A pre-agreed shopper UX policy: pending presentation or provisional decline presentation. Define the corresponding independent-reattempt control and how your existing merchant-owned status or notification experience will surface a pending attempt's final result.
- Agreement with your DEUNA Implementation Manager on the timeout, missing-webhook waiting window, reversal eligibility and provider behavior, operational escalation path, monitoring ownership, and any limitation that prevents enforcement of the duplicate-payment controls below. These details vary by merchant and must not be inferred from this guide.
- A sandbox or test integration in which you can simulate client timeouts, webhook outcomes, missing identifiers, and reversal outcomes without relying on production behavior.
Keep authentication material under your existing server-side controls. This guide does not publish hosts, credentials, headers, or request and response schemas.
Recommended flow
Both shopper UX policies start from the same internal state. When the Purchase request times out, the Merchant backend must Mark reconciliation pending with timeout_pending_reconciliation, retain the original correlation data, and Block fulfillment. The UX branch changes only what the shopper sees; it does not change payment truth or recovery precedence.
Pending presentation must Show payment pending and block an independent payment or route to the unresolved operation. Provisional decline presentation must Show provisional decline, then follow the agreed reattempt policy: either Hold new attempts until reconciliation or Correlate both attempts and reverse any late monetary outcome from the original. These labels describe shopper presentation and merchant controls only; the original payment truth remains unresolved.
Evaluate Active recovery needed and eligible?. If yes, Retry with same key and body, then ask whether the Retry returned a result?. A yes result enters Reconcile payment result. A no result, retry timeout, or transport error proceeds to Wait for verified webhook; it is not a payment failure. If the expected webhook is missing after the agreed window, Search Get Orders once. If no applicable result is found, Keep blocked and escalate. Verified webhooks remain the authoritative asynchronous outcome and must still be processed when a retry returns a result.
After reconciliation, apply the pre-agreed UX policy. Pending success must Show success and continue; pending failure must Show final failure through the merchant's existing status or notification experience. Under provisional decline, a documented failure means Keep decline final. A later authorized result means Void authorization, while processed or captured means Refund payment. When reversal is supported and the required identifiers are available, Start and track reversal. Close exception only after confirmation; otherwise, Keep blocked and escalate. A reversal request is not complete until its intended result is confirmed.
flowchart TD
A["Purchase request times out"] --> B["Mark reconciliation pending"]
B --> BH["Block fulfillment"]
BH --> C{"Shopper message"}
C -->|Pending| D["Show payment pending"]
C -->|Decline| E["Show provisional decline"]
E --> EA{"Reattempt policy"}
EA -->|Hold| EB["Hold new attempts"]
EA -->|Allow| EC["Correlate both attempts"]
D --> F{"Active recovery needed and eligible?"}
EB --> F
EC --> F
F -->|Yes| Y["Retry with same key and body"]
F -->|No| G["Wait for verified webhook"]
Y --> Z{"Retry returned a result?"}
Z -->|Yes| I
Z -->|No| G
G --> H{"Webhook received?"}
H -->|Yes| I["Reconcile payment result"]
H -->|No, after wait| J["Search Get Orders once"]
J --> K{"Result found?"}
K -->|Yes| I
K -->|No| L["Keep blocked and escalate"]
I --> M{"Shopper policy"}
M -->|Pending| N{"Payment outcome"}
N -->|Success| O["Show success and continue"]
N -->|Failure| P["Show final failure"]
M -->|Decline| Q{"Payment status"}
Q -->|Failed| R["Keep decline final"]
Q -->|Authorized| S["Void authorization"]
Q -->|Processed or captured| T["Refund payment"]
Q -->|Other| L
S --> AA{"Reversal available?"}
T --> AA
AA -->|Yes| U["Start and track reversal"]
AA -->|No| X
U --> V{"Reversal complete?"}
V -->|Yes| W["Close exception"]
V -->|No| X["Keep blocked and escalate"]
1. Agree the timeout and shopper UX policy
- Map the configured purchase paths, including a first-attempt processor success and paths that add fraud analysis, soft-decline handling, and fallback routing. This reveals why one timeout cannot safely represent every orchestration.
- Agree the client timeout with your DEUNA Implementation Manager and configure it in the merchant backend. A merchant-specific value limits false timeout outcomes without implying a provider latency guarantee.
- Communicate the configured timeout to DEUNA. This lets DEUNA align latency monitoring and alerting with the behavior your client implements.
- Choose either pending presentation or provisional decline presentation before production, and document the matching reconciliation behavior. For pending presentation, define the enforced independent-payment control and the existing merchant-owned status or notification experience that will surface the final result. For provisional decline, pre-agree whether independent reattempts are held or allowed under the correlated-attempt process below. These decisions prevent different services or operators from making contradictory payment, fulfillment, and reversal decisions.
- Agree the missing-webhook waiting window, escalation ownership, supported reversal behavior, and any duplicate-payment-control limitation with your DEUNA Implementation Manager. These operational values and provider capabilities are merchant-specific, so this guide does not assign defaults.
2. Enter the unresolved state on timeout
- When the
/purchasecall exceeds the configured client timeout, storetimeout_pending_reconciliationas a merchant-owned marker. Do not writedeniedor another canonical DEUNA status based only on the timeout, because DEUNA may still be processing. - Retain the merchant
order_id, original idempotency key, and identical request body under your existing security controls. Recovery depends on correlating the original operation rather than creating a new one. - Suppress fulfillment while the marker is unresolved. Goods or services must not be released until the documented result and any required decline-policy reversal are resolved.
- Apply the pre-agreed shopper presentation without changing internal payment truth:
- Pending presentation: tell the shopper that payment is pending and confirmation will continue asynchronously. While
timeout_pending_reconciliationremains active, block an independent payment attempt or route the shopper back to the existing unresolved operation. If your checkout cannot enforce either control, agree that limitation and the duplicate-payment handling with your DEUNA Implementation Manager before production. - Provisional decline presentation: tell the shopper that confirmation timed out and show the attempt as declined in the shopper experience. Keep
timeout_pending_reconciliationinternally because the presentation does not prove the payment failed, then enforce one of the pre-agreed independent-reattempt policies below.
- Pending presentation: tell the shopper that payment is pending and confirmation will continue asynchronously. While
Under pending presentation, block an independent payment attempt or route the shopper to the existing unresolved operation while
timeout_pending_reconciliationis active. A separate operation can create duplicate-payment risk; a warning message alone is not an enforceable control.
For provisional decline presentation, choose one independent-reattempt policy before production:
| Policy | Merchant control | Tradeoff |
|---|---|---|
| Hold reattempts | Block an independent payment attempt until the provisionally declined operation is reconciled. | This minimizes duplicate-payment risk but can delay the shopper's next attempt. |
| Allow a controlled reattempt | Create the independent operation only through a process that correlates it with the unresolved original attempt. Keep fulfillment blocked while the original remains unresolved. If the original later has a monetary outcome, apply its status-aware reversal flow even if the later attempt also succeeds. | This gives the shopper another path sooner but creates concurrent-attempt and reversal work that must remain operationally visible. |
A shopper's independent reattempt after a provisional decline is not the same-key retry of the original operation. If you allow it, correlate both attempts and reverse any late
authorized,processed, orcapturedoutcome from the original according to this guide.
3. Recover the original operation safely
- If active recovery is needed and the operation is eligible, retry the original operation with the same idempotency key and identical body to prevent a second payment operation. An already completed operation can then return its stored result without deliberate reprocessing.
- Implement retry behavior by following Idempotent Requests, Step 3. That page owns retry implementation, counts, delays, concurrency, degradation, and error behavior, so this guide does not repeat or simplify them.
- If the retry returns a matching, applicable documented payment result, record
retryas the merchant-owned reconciliation source and send that result to the same UX-specific reconciliation handler used for verified webhooks and bounded search. Reusing one handler prevents the result source from changing payment, fulfillment, or reversal rules. - If the retry returns no applicable result, times out again, or fails at the transport layer, keep
timeout_pending_reconciliationand the fulfillment hold. Continue waiting for the verified webhook because another client observation failure is not a payment failure. - Continue consuming verified webhooks even when the retry returns an applicable result. Idempotency does not replace the authoritative asynchronous channel or idempotent event handling.
Do not recover by starting a new payment operation. Preserve the original key and identical body, and use the linked retry contract when the operation is eligible.
4. Reconcile through webhooks and bounded search
Use one common reconciliation handler for an applicable documented result returned by same-key retry, a verified webhook, or the bounded Get Orders fallback. The handler records the result source, updates the merchant-owned order record, and applies the selected UX-specific rules so equivalent payment truth cannot produce source-dependent outcomes.
- Consume webhooks for every purchase attempt, including asynchronous 3DS and APM flows. Webhooks remain the authoritative asynchronous outcome and keep the merchant order record current after the synchronous wait ends.
- Where verification is enabled, apply the documented webhook verification process before updating payment truth. Process each accepted event idempotently and acknowledge it promptly so merchant handling remains safe and does not delay delivery handling.
- When a verified webhook supplies a documented payment result, replace
timeout_pending_reconciliationwith that result and record the reconciliation source and timestamp. This closes the observation gap using authenticated asynchronous evidence. - Only if the expected webhook remains missing after the merchant-specific waiting window, run one delayed Get Orders search using
order_id. This is a paginated, rate-limited search fallback, not a polling mechanism. - If that one search returns the matching order with an applicable documented payment result, use the result to replace
timeout_pending_reconciliationand continue the same UX-specific handling as for a verified webhook. Require both a match and an applicable result to prevent an uncertain search response from driving payment decisions. - If no match exists or the result is absent, ambiguous, or unresolved, keep
timeout_pending_reconciliation, keep fulfillment blocked, and escalate through the agreed DEUNA operational/support path. The fallback did not establish payment truth, so repeated search requests are not a safe substitute. - Do not use Get Order by token,
GET /merchants/orders/{order_token}, as the initial timeout-recovery mechanism when noorder_tokenwas returned. The endpoint requires a token that the timed-out response may not have supplied.
Use Get Orders by
order_idonce, only after the agreed missing-webhook window. Do not poll, assume a numeric rate limit, or assume the search result contains every identifier required for a reversal.
5. Apply the reconciled result to the shopper UX
For pending presentation:
- On a documented successful outcome, update the merchant-owned order record, clear the unresolved marker, surface success through the merchant's existing status or notification experience, and continue the normal post-payment flow. This delivers the final result to the shopper without prescribing a new DEUNA endpoint or payload.
- On a documented final failure or decline, update the merchant-owned order record, clear the unresolved marker, and surface the final failure through the same existing status or notification experience. This replaces the temporary pending presentation with payment truth where the shopper already expects merchant-owned updates.
- For any unresolved or unsupported outcome, retain the marker and fulfillment hold and escalate. Do not infer a final mapping that the status reference does not document.
For provisional decline presentation:
- On a documented final failure, clear the unresolved marker and retain the shopper decline as final. No reversal is needed because reconciliation did not establish an authorized or charged outcome.
- On
authorized, enter the reversal flow and initiate an eligible void once the required identifiers are available. The shopper was told the attempt was declined, so reserved funds must not remain without operational follow-through. - On
processedorcaptured, enter the reversal flow and initiate an eligible refund once the required identifiers are available. The shopper must not remain charged for an order the merchant treated as declined. - For any other, ambiguous, or unresolved status, keep fulfillment blocked and escalate through the agreed operational/support path. This guide does not create reversal mappings for undocumented or unsupported states.
6. Complete status-aware reversal handling
Use the documented order and payment status, Manage orders guidance, supported operation, and available identifiers to choose the reversal. Do not choose from the shopper message or the timeout itself.
| Reconciled payment status | Supported action for provisional decline presentation | Why |
|---|---|---|
authorized | Initiate the eligible void with POST /merchants/orders/{order_token}/void once the required identifiers are available. | A void releases reserved funds for a transaction in authorized state. |
processed or captured | Initiate the eligible Refund V2 operation with POST /v2/merchants/orders/{order_token}/refund once the required identifiers are available. | A refund reverses funds after processing or capture. |
| Any other, ambiguous, or unresolved status | Keep fulfillment blocked and use the agreed operational/support path. | No additional status mapping is established by this guide. |
- Confirm reversal eligibility and required identifiers before calling the supported operation. Get Orders does not guarantee that every required reversal identifier is available, and processor or payment-method support can vary.
- After initiating the void or refund, set a merchant-owned reversal-pending state and keep an operational exception open. Submission does not prove that the intended reversal completed.
- Track the documented result until the intended reversal is confirmed complete. For asynchronous refunds,
refundingorpartial_refundingis intermediate; supported configurations communicate finalrefunded,partial_refunded, ordeniedoutcomes by webhook. - Close the operational exception only when the intended reversal is confirmed complete. A
partial_refundedresult must be evaluated against the intended eligible reversal rather than assumed to satisfy it. - If the reversal is intermediate, denied, unsupported, cannot be initiated, lacks required identifiers, or is otherwise unconfirmed, keep fulfillment blocked and escalate through the agreed operational/support path. This prevents an unresolved monetary outcome from being mistaken for successful recovery.
A void or refund request is not the completion signal. Keep the merchant-owned reversal-pending state and operational exception open until the intended reversal is confirmed; provider behavior and funds-availability timing can vary.
Observe the flow
The following values are merchant-owned records, not claimed DEUNA request or response fields.
| Merchant-owned record | Purpose |
|---|---|
order_id | Correlate the purchase attempt, webhook, and delayed search. |
| Original idempotency key and retained identical body | Prove recovery reused the original operation identity. |
| Configured client timeout and timeout timestamp | Compare observed latency with the agreed configuration and measure unresolved duration. |
| Applied shopper UX policy | Explain whether the shopper saw payment pending or a provisional decline. |
timeout_pending_reconciliation and fulfillment-hold state | Keep unresolved payment truth separate from shopper presentation and prevent unsafe release. |
| Retry attempts, transport outcome, result applicability, and result timestamp | Distinguish a usable documented retry result from another timeout, transport error, or unresolved response. |
| Webhook receipt, verification, acknowledgement, and reconciliation timestamps | Measure authoritative asynchronous handling and identify missing-webhook cases. |
| Delayed-search activation, outcome, and reconciliation source | Audit bounded fallback use and detect accidental polling. |
Reconciliation source (retry, verified webhook, or delayed search) | Confirm that every applicable documented result entered the same UX-specific handler. |
| Pending-policy payment-control decision and blocked or routed attempts | Prove that an unresolved pending operation did not create an independent payment operation. |
| Provisional-decline reattempt policy and correlated attempt identifiers | Keep the original unresolved operation and any allowed independent reattempt operationally linked. |
| Final documented payment status | Drive UX-specific downstream handling using documented terminology. |
| Pending final-result update, status or notification channel, and delivery timestamp | Show that the merchant-owned order record and established shopper experience received the final result. |
| Reversal operation, merchant-owned reversal-pending state, and confirmation timestamps | Track the intended void or refund through completion. |
| Operational exception and escalation owner | Keep unresolved, denied, unsupported, or unconfirmed outcomes actionable. |
Create merchant-owned dashboards and alerts for timeout rate, latency relative to the agreed timeout, count and age of unresolved timeout markers, retry-result source and unresolved retry failures, pending shopper sessions, blocked or routed independent-payment attempts, correlated provisional-decline reattempts, pending final-result delivery failures, webhook delay, backup-search activation, reversal-pending age, reversal failures, and open operational exceptions. Agree thresholds and ownership with your DEUNA Implementation Manager; no universal values are established here.
Handle errors and edge cases
| Condition | Required handling | Why |
|---|---|---|
| The client times out while DEUNA continues processing | Keep timeout_pending_reconciliation and fulfillment blocked. | Timeout is not payment truth. |
| Same-key retry returns an applicable documented result | Record retry as the source and run the common UX-specific reconciliation handler while continuing webhook consumption. | Result handling must not vary by recovery source, and webhooks remain authoritative for asynchronous outcomes. |
| Same-key retry returns no applicable result, times out, or has a transport error | Keep the marker and fulfillment hold, then continue waiting for the webhook. | A failed client observation is not a payment failure. |
| A pending shopper tries to pay again independently | Block the operation or route the shopper to the existing unresolved operation. If neither control is enforceable, use the limitation and duplicate-payment handling agreed before production. | An independent operation can create duplicate-payment risk. |
| A provisionally declined shopper tries again independently | Enforce the pre-agreed hold policy or correlate the new attempt with the unresolved original, keep fulfillment blocked while the original is unresolved, and reverse any late monetary outcome from the original. | The decline presentation can invite a second operation before the first payment truth is known. |
| A pending attempt receives a final result | Update the merchant-owned order record and surface the result through the existing status or notification experience. | Backend reconciliation alone does not close the shopper journey. |
| An event fails verification where verification is enabled | Do not update payment truth from that event. | Unverified input cannot safely drive reconciliation. |
| The same accepted event is processed again | Handle it idempotently and avoid duplicate side effects. | Merchant event processing must be repeat-safe. |
| The expected webhook remains missing | Wait for the agreed window, then run one Get Orders search by order_id. | Search is a bounded backup, not the primary outcome channel. |
| Search returns no applicable documented result | Keep the marker and fulfillment hold, do not poll, and escalate. | The fallback did not resolve payment truth. |
The response did not provide order_token | Do not begin recovery with GET /merchants/orders/{order_token}. | Token lookup cannot run without its required identifier. |
Reconciliation under provisional decline returns authorized | Initiate an eligible void and track confirmation. | Reserved funds remain inconsistent with the shopper decline until reversed. |
Reconciliation under provisional decline returns processed or captured | Initiate an eligible refund and track confirmation. | A charge remains inconsistent with the shopper decline until reversed. |
| Reversal is intermediate, denied, unsupported, or missing identifiers | Keep fulfillment blocked and the operational exception open; escalate. | The intended monetary correction is not confirmed. |
Avoid these anti-patterns
| Anti-pattern | Safe alternative |
|---|---|
| Publishing a universal client timeout or a numeric rule for all merchants | Agree the timeout for the configured orchestration with your DEUNA Implementation Manager. |
Treating the timeout as DEUNA denied | Store timeout_pending_reconciliation until a documented result is reconciled. |
| Fulfilling while payment truth or a required reversal is unresolved | Keep the fulfillment hold until reconciliation and any required reversal complete. |
| Ignoring an applicable documented result returned by same-key retry | Send it to the common reconciliation handler, record retry as the source, and continue consuming webhooks. |
| Treating a retry timeout or transport error as payment failure | Keep the original marker and fulfillment hold and await authoritative asynchronous reconciliation. |
| Asking a pending shopper to create a separate payment attempt | Block the operation or route the shopper to the existing unresolved operation. |
| Relying on warning text when pending duplicate-payment prevention cannot be enforced | Agree the limitation and duplicate-payment handling with your DEUNA Implementation Manager before production. |
| Allowing a provisional-decline reattempt without a policy or correlation | Hold reattempts until reconciliation, or correlate both attempts and reverse any late monetary outcome from the original. |
| Leaving a pending shopper without the final result | Update the merchant-owned order record and surface the result through the existing status or notification experience. |
| Retrying as a new payment operation | Use the same idempotency key and identical body under the linked Step 3 contract. |
| Polling Get Orders | Run one delayed order_id search only after the agreed missing-webhook window. |
Assuming order_token is available after timeout | Use webhook-first reconciliation and the bounded order_id search; invoke token-based operations only when required identifiers are available. |
| Fulfilling a provisionally declined order after a later monetary result | Initiate the eligible status-aware reversal and keep fulfillment blocked. |
| Treating void or refund submission as completion | Track the intended reversal to confirmed completion and keep an exception open otherwise. |
| Assuming all processors and payment methods reverse funds identically or immediately | Validate eligibility, asynchronous behavior, and operational expectations with your DEUNA Implementation Manager. |
Validate in sandbox
Run these checks in the merchant's sandbox or test integration. They validate merchant behavior and observability; they do not promise production provider behavior, webhook timing, search availability, reversal support, or fund-availability timing.
| Scenario and action | Observable result | Where to observe it |
|---|---|---|
| Exercise a purchase path that returns before the configured client timeout. | The synchronous documented result is retained and the attempt remains covered by verified asynchronous reconciliation where applicable. | Merchant request logs, order store, and webhook or reconciliation records. |
| Simulate the client stopping its wait before the purchase result returns. | timeout_pending_reconciliation is stored with order_id and the original idempotency key, fulfillment is blocked, and no canonical DEUNA failure status is written from the timeout. | Merchant order store, timeout logs, and fulfillment logs. |
| Apply pending presentation to the timeout case and attempt an independent payment from the test UI. | The shopper sees payment pending and is blocked or routed to the existing unresolved operation; no second independent payment operation is created. | Shopper test UI, checkout logs, and payment-operation correlation records. |
| Apply provisional decline presentation to the timeout case. | The shopper sees the timeout decline while the Merchant backend retains timeout_pending_reconciliation and the fulfillment hold. | Shopper test UI, merchant order store, and fulfillment logs. |
| Under the provisional-decline hold policy, attempt an independent payment before reconciliation. | The independent operation is blocked until the original is reconciled; the original marker and fulfillment hold remain active. | Shopper test UI, checkout-control logs, merchant order store, and payment-operation correlation records. |
Under the controlled provisional-decline reattempt policy, allow an independent attempt, correlate it to the unresolved original, then reconcile a late authorized result for the original. | Both operation identities remain linked, the later attempt does not erase the original state, fulfillment remains blocked while the original is unresolved, and the original enters the eligible void and confirmation flow. | Attempt-correlation records, merchant order store, reversal logs, fulfillment logs, and exception queue. |
| For an eligible timeout, follow Idempotent Requests, Step 3 and return an applicable documented result. | The retry uses the original idempotency key and identical body, creates no second operation, records retry as the reconciliation source, and sends the result through the common UX-specific handler while webhook consumption remains active. | Merchant outbound request logs, operation-correlation records, reconciliation-source record, merchant order store, and webhook consumer logs. |
| Repeat the eligible retry scenario with no applicable result, another timeout, and a transport error. | Each case retains timeout_pending_reconciliation and the fulfillment hold, records the retry outcome, and continues waiting for the verified webhook without writing a payment failure. | Retry and transport logs, merchant order store, fulfillment logs, and webhook consumer logs. |
| Process a corresponding webhook; where verification is enabled, test valid and failed verification, then replay an accepted event. | The verified event updates payment truth, failed verification does not, processing is idempotent, acknowledgement is prompt, and replay creates no duplicate merchant side effect. | Webhook verification, acknowledgement, processing, reconciliation, and downstream side-effect logs. |
Keep the expected webhook absent through the agreed window, then return a matching applicable result from one delayed Get Orders search by order_id. | Search activation is recorded once, no polling follows, and the documented result enters the same UX-specific handling as a verified webhook. | Backup-search audit log, request logs, merchant order store, and reconciliation-source record. |
| Return no match or an absent, ambiguous, or unresolved result from the delayed search. | The marker and fulfillment hold remain, no repeat search follows, and the operational escalation is recorded. | Backup-search logs, merchant order and fulfillment records, and exception queue. |
| Reconcile success and final failure cases under pending presentation. | Each result updates the merchant-owned order record and appears through the merchant's existing status or notification experience; success enters the normal post-payment flow, final failure replaces the pending presentation, and fulfillment remains blocked until the result permits downstream handling. | Merchant order store, shopper status or notification test surface, delivery logs, reconciliation logs, and fulfillment logs. |
Reconcile authorized under provisional decline and initiate the supported void after required identifiers are available. | A merchant-owned reversal-pending state is recorded, fulfillment stays blocked, and the exception closes only after the intended void is confirmed. | Reversal request and result logs, merchant order store, fulfillment logs, and exception queue. |
Reconcile processed and captured cases under provisional decline and initiate the supported refund after required identifiers are available. | Each case enters reversal-pending; intermediate refund results do not close the exception, and only confirmed completion resolves the intended reversal. | Refund request and webhook logs, merchant order store, fulfillment logs, and exception queue. |
| Simulate an intermediate, denied, unsupported, unconfirmed, or missing-identifier reversal case. | Fulfillment remains blocked, the operational exception stays open, and escalation through the agreed path is recorded. | Reversal logs, merchant order and fulfillment records, and exception queue. |
Exercise a timeout path with no returned order_token. | Initial recovery does not call GET /merchants/orders/{order_token} and remains viable through retry, webhooks, and the bounded order_id search. | Recovery-routing and outbound request logs. |
| Inspect telemetry for all scenarios. | Correlated records expose timeout behavior, unresolved markers, retry-result source and failures, enforced pending controls, provisional-decline reattempt correlation, pending final-result delivery, webhook and search recovery, reversal progress, and open exceptions without relying on invented thresholds. | Merchant logs, metrics, dashboards, and alert test output. |
Implementation checklist
- Map the actual orchestration paths and agree the client timeout with your DEUNA Implementation Manager.
- Communicate the configured timeout to DEUNA for latency-monitoring and alert alignment.
- Pre-agree pending or provisional decline presentation, independent-reattempt controls, the missing-webhook window, provider-specific reversal behavior, and escalation ownership.
- Persist
order_id, the original idempotency key, the identical request body,timeout_pending_reconciliation, and the fulfillment hold. - Under pending presentation, block an independent payment operation or route the shopper to the existing unresolved operation; agree any enforcement limitation and duplicate-payment handling before production.
- Under provisional decline, hold independent reattempts until reconciliation or correlate every allowed reattempt with the unresolved original and reverse any late monetary outcome from the original.
- Retry eligible operations only with the same key and identical body under the linked Step 3 guidance.
- Route an applicable documented retry result through the common reconciliation handler; keep a retry timeout, transport error, or non-applicable result unresolved.
- Verify webhooks where enabled, process accepted events idempotently, and acknowledge promptly.
- Use one delayed Get Orders search by
order_idonly when the webhook remains missing; never poll. - Never depend initially on
GET /merchants/orders/{order_token}when noorder_tokenwas returned. - Under provisional decline, map only
authorizedto eligible void andprocessedorcapturedto eligible refund. - Under pending presentation, update the merchant-owned order record and surface every final result through the existing status or notification experience.
- Keep the merchant-owned reversal-pending state and fulfillment hold until the intended reversal is confirmed.
- Escalate intermediate, denied, unsupported, ambiguous, unconfirmed, or missing-identifier outcomes through the agreed path.
- Validate both UX policies and every supported recovery and reversal branch in sandbox before production.
- Configure merchant-specific dashboards, alerts, exception ownership, and operational runbooks without inventing universal thresholds.
Next steps
- Implement timeout retry with Idempotent Requests, Step 3.
- Review Webhooks and Webhook verification for asynchronous outcomes.
- Use Get Orders for the bounded
order_idfallback and Get Order by token only whenorder_tokenis available. - Confirm status behavior in Order and payment status and reversal behavior in Manage orders.
- Implement eligible void and Refund V2 operations, then track supported asynchronous refund outcomes to completion.