First-party source analysis - three platforms - 18 minute read

Retry and reconciliation contracts

A retry is a business decision.

Stripe, AWS, and n8n each make retries easier, but they solve different layers of the problem. Safe automation begins by naming which layer owns identity, which layer records execution, and which layer can prove the business outcome before anything acts again.

Caller intentProvider contractDurable receiptReconciliation route

The translation problem

"Retry supported" does not mean "outcome proven."

A retry begins because something is unknown. The client may not know whether the request reached the provider. The workflow may know an HTTP call returned but not whether a downstream system committed the business change. An operator may see a failed execution even though an email, charge, or record was already created. Repeating the same automation step does not remove that uncertainty; it can convert it into a duplicate.

Platform documentation is most useful when read as a contract. It says what a component recognizes, retains, returns, or replays. It does not silently assume ownership of the next component's state. The workflow designer must connect those contracts and define what evidence authorizes another attempt.

RULE

Retry transport only when the business operation is replay-safe.

If the operation may already have succeeded and no provider contract can return the same result, reconcile before another side effect.

Three first-party sources

Each platform supplies one piece of the safety boundary.

SourceContract it suppliesWhat the workflow still owns
Stripe API v1A caller-provided idempotency key can return the stored status and body for the first request, including an error result.Stable operation identity, parameter consistency, key-retention awareness, and business-outcome verification.
AWS Builders' LibraryCaller intent can be represented by a unique client request ID; repeat calls can return a semantically equivalent response.Choosing intent boundaries, handling late arrivals, reconciling uncertainty, and deciding where at-most-once is worth the complexity.
n8n executionsA failed execution can be retried with previous execution data using the original or currently saved workflow.Replay-safe side effects, version-aware behavior, downstream receipts, and an explicit rule for ambiguous outcomes.

These are not competing promises. Stripe describes how one API namespace treats a repeated mutation. AWS explains the design work required to make retries semantically safe in distributed systems. n8n documents how an operator can replay execution data. A production workflow may use all three ideas: a source event identifies intent, the provider prevents duplicate mutation, and the orchestration layer records the attempt and controls recovery.

Stripe's bounded promise

The same key can return the same stored result.

Stripe's current API v1 reference says that POST requests accept idempotency keys. For a given key, Stripe saves the status code and response body after endpoint execution begins. Later requests with the same key return that stored result, including a 500 response. The provider also compares repeated parameters with the original request and rejects a mismatch. That contract is valuable because a network failure no longer forces the caller to guess whether a second create call will create a second object.

The boundaries matter. Stripe documents that keys may be pruned after they are at least 24 hours old; reuse after pruning can create a new request. A validation failure or concurrent conflict that occurs before endpoint execution begins does not save an idempotent result. The key is caller-generated and should not contain sensitive information. A workflow therefore needs to know which operation the key represents, how long retries remain valid, and whether its parameters are identical.

The stored response is not necessarily the final business outcome. A create request can return an object that later moves through other states. A payment flow may continue asynchronously. An email API can accept a message before final delivery. The workflow should store both the request receipt and the business state it expects to observe. Idempotency protects the mutation boundary; reconciliation proves whether the intended process reached its terminal condition.

STRIPE

Reuse one key for one unchanged intent.

Do not generate a new key merely because the workflow execution changed. Do not reuse an old key when the requested operation or parameters changed.

AWS's deeper design lesson

Safe retries require a way to express caller intent.

The AWS Builders' Library article begins with a distributed workflow: one controlling process calls several services to create a larger outcome. Retrying transient faults can simplify clients, but only if the repeated operation does not create extra side effects. AWS uses a concrete example: a timed-out request to launch a singleton workload leaves the caller unsure whether the workload exists. Blind retry can create two. Without an idempotent contract, the caller must reconcile.

AWS describes a preference for a unique, caller-provided client request identifier. That identifier expresses intent more reliably than inferring duplicates from identical parameters. Two calls with the same fields may be accidental duplicates, or the caller may truly want two identical resources. The client token separates those meanings. It also becomes auditable in logs and can be associated with the created resource.

The service implementation is not just a lookup table. AWS notes that recording the token and performing the mutation need an atomic, consistent, isolated, and durable boundary. Otherwise the system can record the token without creating the resource or create the resource without recording the token. Both outcomes break the promise the client is relying on. Idempotency is therefore a storage and state transition guarantee, not a decorative request header.

Semantic equivalence matters too. Returning only "already exists" on a replay may avoid a second side effect, yet still leave the caller uncertain about whether this request created the resource. AWS discusses returning a response with the same meaning for the same client request identifier. The caller can then handle the result without special retry branches. That is a stronger, more usable contract than merely refusing a duplicate mutation.

The source also covers late arrivals and changed parameters. A retry can arrive after the resource changes or is deleted. Knowledge of an idempotent request cannot be retained forever. Reusing a token with different parameters may represent a different intent and should be rejected. These cases explain why a workflow must record the original intent, parameter fingerprint, retention assumptions, and receipt instead of treating a token as a permanent universal shield.

n8n's orchestration boundary

Execution replay is power, not duplicate protection.

n8n's executions documentation says an operator can retry a failed execution with data from the earlier run. The operator may choose the currently saved workflow or the original workflow definition. That is a useful recovery feature: a corrected workflow can process the same input, or the earlier definition can be replayed for consistency. It also makes operation identity essential. Two n8n executions may represent one business event.

An n8n execution ID identifies an orchestration attempt. It does not automatically identify the source event, payment operation, message, order, or customer update. If a workflow creates a new random key on every attempt, a manual retry will look like new intent to the downstream provider. The correct key should enter with the source event or be derived from a documented business operation and remain stable across every execution retry.

Workflow version choice adds another dimension. Retrying with the current definition can change validation, transformation, or target selection. Retrying with the original definition can preserve a bug that caused the failure. The recovery record should state which version ran, which input was reused, which operation key was sent, and whether the downstream action began. An operator should not have to infer those facts from a visual canvas after an incident.

The safest design separates preparation from consequence. A retried workflow can re-parse input, re-run deterministic validation, and rebuild a proposal. Before the external action, it claims the stable operation key or calls an API with a documented idempotency contract. After the action, it stores the provider receipt and the expected terminal state. If the action phase is uncertain, the workflow stops for lookup or review instead of beginning a fresh mutation.

Evidence before action

Classify the failure phase before choosing retry.

Available evidenceBounded decisionRequired record
Validation failed before the action beganCorrect the request or data; a retry may be safe.Rejected input, validation reason, no-action evidence.
Rate limit or transient service response before acceptanceRetry within a bounded backoff policy if the API contract permits it.Attempt count, next eligible time, stable operation key.
Connection ended after the request was sentRetry only under a trustworthy idempotency contract; otherwise reconcile.Request ID, operation key, parameters, ambiguous phase.
Provider returned a durable object or action identifierStore the receipt and return it on replay.Provider ID, status, timestamp, operation key.
Workflow succeeded but the business result is not observableDo not equate green execution with completion; verify or review.Expected outcome, lookup route, reconciliation owner.

HTTP status alone cannot always classify the phase. A timeout may occur before a provider receives the request, while the provider is working, or after the provider commits the result but before the response returns. Use the API's documented contract, request ID, operation key, and lookup endpoint. When those cannot resolve the state, route the operation to reconciliation. "Unknown" is a real state and should not be silently mapped to "failed."

A portable operation receipt

Store enough evidence to answer the next retry.

Intent recordWritten before action
{
  "operation_key": "order_813:issue_refund",
  "source_event": "evt_1042",
  "parameter_hash": "sha256:...",
  "workflow_version": "refund-v7",
  "status": "processing"
}
Outcome receiptWritten after provider evidence
{
  "operation_key": "order_813:issue_refund",
  "provider_request_id": "req_...",
  "provider_object_id": "re_...",
  "business_state": "refund_pending",
  "status": "accepted"
}

The operation key names the business intent, not merely the payload. The parameter hash detects accidental changes without storing sensitive content in the key. The source event connects the action to its cause. Workflow version explains which transformation and policy ran. Provider identifiers support lookup and support cases. Business state distinguishes request acceptance from the terminal outcome the process actually cares about.

Design the receipt before the happy path. Ask which fields would let an operator decide, one hour later, whether another action is safe. If the answer depends on searching logs across three systems and guessing which request belongs to which event, the retry contract is incomplete. A good receipt makes the safe next action mechanical: return the stored result, wait, look up, retry within contract, or escalate.

Retry policy

Limit attempts at one layer and make overload visible.

Retries also affect the service being called. A client, queue, workflow node, SDK, and provider can each retry the same failure. Multiplication across layers can turn a small incident into a request surge. Choose one primary retry layer where possible, cap attempts, apply backoff and jitter for transient failures, and preserve the operation key across every attempt. A timeout budget should cover connection and response phases rather than letting each nested call consume a fresh unbounded window.

Not every error is transient. Validation errors, permission failures, unsupported actions, parameter mismatches, and policy rejections need correction or review. Retrying them wastes capacity and may hide a defect. Rate limits and some server or network failures may be retryable, but only within the provider's guidance. An ambiguous response after a mutation requires idempotent replay or reconciliation, not a generic exponential-backoff branch.

Automatically retry

  • Bounded transient failures named by the provider
  • Stable key and unchanged operation parameters
  • Attempt cap, total deadline, and observable backoff
  • A response contract that prevents duplicate mutation

Stop and reconcile

  • The external action may already have happened
  • No trustworthy idempotent replay is documented
  • The operation changed intent or parameters
  • The terminal business state cannot be observed

Test the contract

A useful test suite forces uncertainty into the open.

  1. 01

    Repeat after success

    Send the same operation key again and prove one business action.

  2. 02

    Repeat during processing

    Race two attempts and prove the claim boundary is atomic.

  3. 03

    Change parameters

    Reuse the key with different intent and require an explicit rejection.

  4. 04

    Lose the response

    Let the provider act, hide the response, and prove safe lookup or replay.

  5. 05

    Replay a new workflow version

    Document whether changed logic may prepare again but cannot act twice.

Count the downstream effect, not just requests or green executions. A test passes when one source intent creates at most one approved action and every repeated attempt converges on a known receipt. Add a negative control with a distinct operation key to prove the design does not suppress legitimate repeated business actions. Test the key retention boundary and the provider's parameter-mismatch behavior, because those are part of the contract the workflow depends on.

Adoption checklist

Turn documentation into an operating agreement.

For every mutating node, write the source of business identity, the provider's retry statement, the key scope and retention, the parameter rule, the final receipt, and the reconciliation route. Name the maximum attempts and total deadline. Name the owner of ambiguous records. If a provider offers no idempotency contract, either perform a safe lookup before retry, use an internal claim that truly protects the side effect, or require human approval.

Separate status words. "Submitted" means a request left the workflow. "Accepted" means the provider returned a durable receipt. "Completed" means the expected business state is verified. "Failed before action" can be retryable. "Ambiguous after action" requires reconciliation. Clear states prevent dashboards and automation branches from turning a transport result into a false business claim.

Review the contract when an API version changes, a workflow changes its operation parameters, a new retry layer is added, or an incident reveals a previously unobservable state. Safe retry is not a box checked once. It is a maintained relationship between caller intent, provider semantics, orchestration history, and business evidence.

HANDOFF

The next operator should not need to guess.

The record should say whether the action is safe to repeat, which evidence supports that decision, and exactly how to reconcile when the answer is unknown.

Primary sources

Three documents, one explicit synthesis.

Stripe documentation

Idempotent requests

The exact API v1 key, response-storage, retention, validation, and parameter-comparison behavior used in this analysis.

Read Stripe's current reference

AWS Builders' Library

Making retries safe with idempotent APIs

The caller-intent, semantic-equivalence, late-arrival, and atomic-service patterns summarized above.

Read the AWS source

n8n documentation

Retry failed workflows

The exact operator choices for replaying previous execution data with the current or original workflow definition.

Read the n8n execution guide

Disclosure: this is independent, self-directed source analysis by One Workflow Fixed. It is not endorsed by Stripe, AWS, or n8n, does not describe client work, and does not replace the documentation for the exact API versions and services in a real implementation.

Contract boundaries

Questions to answer before the next retry branch.

Does an idempotency key make every retry safe?

No. It is safe only within the provider's documented scope, retention window, parameter rules, and side-effect contract. Your workflow still needs stable intent, receipt storage, and downstream verification.

Can an n8n execution ID be the business operation key?

Usually not by itself. A manual or automatic replay may represent the same source event in a different execution. Prefer a source-controlled event or operation identifier that survives every execution attempt.

When should an ambiguous request go to human review?

When the external action may have happened, no safe idempotent replay exists, and the outcome cannot be resolved automatically with a bounded lookup. Review should reconcile before any repeat action.

Is this a claim about every Stripe, AWS, or n8n feature?

No. It compares the exact first-party pages linked in the article and translates their bounded contracts into a general workflow design. Always verify the specific API, version, node, and service you use.

Need an evidence-based second look?

Review the exact retry boundary before production.

The $25 review returns five prioritized reliability risks, failure examples, and retest steps for one supplied n8n workflow. No credentials or production access are requested.