ERP guidance for growing businesses
[email protected]Talk to an ERP expert

Practical ERP guidance

ERP Integration Incident Recovery: A CIO's Runbook for Reconciling Unknown Outcomes

By ShionProductivity

An ERP integration incident rarely ends as a clean failure. A request times out after the ERP has already committed the sales order. A queue redelivers a message after a worker crashes. A multi-step posting completes two steps and stops. The monitoring dashboard shows a mix of successes and errors, and the warehouse reports that one order shipped twice.

The hard part of ERP integration incident recovery is not restarting the pipeline. It is deciding, record by record, what actually happened in the system of record, and doing so before anyone retries, re-keys or deletes anything. Teams that skip this step often turn one incident into three: the original fault, the duplicates created by the cleanup, and the audit questions that follow.

This article is written for the CIO or IT head who owns integration architecture and will be asked, usually at short notice, whether it is safe to replay. It covers:

  • Why integration incidents produce an unknown state, and why unknown is neither success nor verified failure.
  • Why the common responses (blind replay, heuristic de-duplication, deleting rows) fail.
  • A proposed five-step runbook: Contain, Classify, Reconcile, Repair, Prove.
  • Ten mandatory go/no-go controls that must all hold before automated repair is allowed.
  • Failure patterns, deployment implications, and how to evaluate any ERP platform, including ArionERP, against these controls.

The runbook is a proposed design drawn from widely documented engineering practice. It is not an industry standard, a certification, or a method we claim to have validated at any named customer. Code and scenarios are illustrative. Validate every step against your own ERP's documented behavior.

Key Takeaways

  • Unknown is a real state. If completion could not be confirmed, the outcome is neither success nor verified failure. Treat it as unresolved until the authoritative system says otherwise.
  • Never blindly retry an ambiguous timeout on a consequential mutation. Query the ERP's authoritative operation state first, then decide whether to replay, mark complete, or reverse.
  • Bind each operation to a durable, tenant-scoped identity and an immutable approved payload hash. Reject reuse of an identity with a changed payload, and claim work atomically so concurrent workers cannot both act.
  • Acknowledge delivery only after it is safe. Deduplication, the inbox or outbox record, and work scheduling must commit atomically, or be explicitly recoverable, before you tell the sender you have it.
  • Repair with compensating documents, not deletes. Reversals need named business approvers and an audit trail.
  • Privacy is part of recovery. Payloads, dead-letter queues and even identifiers can be sensitive data. Assign an owner, a retention rule and an access rule before incident responders start copying data around.
  • Ten go/no-go controls, all required. There is no score. A pass means the recovery path has no known blocking gap, not that the integration is certified production-ready.

Why ERP Integration Incidents Leave Records in an Unknown State

πŸ”‘ Key takeaway: Distributed systems cannot always tell you whether an operation happened. Your recovery process must be designed for that, because the network will not cooperate.

An ERP rarely works alone. Orders arrive from eCommerce and CRM, stock moves are reported by warehouse or shop-floor systems, and postings flow to finance and BI. Each hop adds a place where a request can be sent but its outcome never confirmed. The common causes are:

  • Timeout after commit. The ERP applied the change, but the response was lost or too slow. The caller sees a failure that did not happen.
  • At-least-once delivery. Message brokers and webhook senders commonly redeliver when they do not receive an acknowledgment. Duplicates are normal behavior, not a bug.
  • Partial completion. A posting that creates an order header, reserves stock and writes a financial entry can stop between steps.
  • Human re-entry. Someone sees an error and re-keys the transaction while automation is still retrying.
  • Mapping or schema changes. A transformation change mid-incident means two payloads can describe one business intent.

HTTP gives a useful but narrow vocabulary here. RFC 9110 on HTTP semantics classifies methods such as PUT and DELETE as idempotent and POST as not. That is a statement about the protocol method, not a guarantee that your business operation (create this order, post this receipt) will happen exactly once. Once-only business effect has to be designed on top of the transport.

The five outcome states you should name

StateEvidence requiredWhat it must not be called
Confirmed appliedAuthoritative ERP record found, matching the approved payload hash or expected contentFailed, just because the caller saw a timeout
Confirmed not appliedAuthoritative query shows no record for the operation identity or business key, and no in-flight workApplied, just because the request was sent
Applied differentlyRecord exists but quantities, prices, dates or status differ from the approved payloadApplied (it needs a correction decision)
DuplicatedMore than one record traces to one business intentA data-quality nuisance (it has financial and fulfillment effects)
UnknownCompletion could not be confirmedSuccess or verified failure

The last row is the one most teams lack. An unknown result means completion could not be confirmed. It is neither success nor verified failure, and it cannot be closed by assumption.

How Most Teams Respond to an Integration Incident, and Why It Fails

πŸ”‘ Key takeaway: The usual responses optimize for restoring flow quickly. They trade away certainty about what is in the ledger.

Under pressure, teams reach for the actions that feel productive. Each has a reason to exist, and each has a specific way of making recovery worse.

Common responseWhy it is attractiveWhat breaks
Replay everything since the first alertFast, simple, restores the feedRecords that were applied are applied again. The true incident window usually starts before the first alert.
Retry on every timeoutStandard client behaviorAn ambiguous timeout on a consequential mutation may duplicate it. Retrying is safe only when the operation is protected by a durable identity.
De-duplicate by heuristic (same customer, same amount, within N minutes)Needs no new designLegitimate repeat orders are removed, and true duplicates with a changed field survive.
Delete the extra rowsThe data looks clean againDownstream documents (shipments, invoices, stock moves) still reference them. Audit trails break.
Re-key manually while automation runsGets the customer an answer todayTwo actors, one operation. Neither knows about the other.
Treat any 2xx as doneMatches the success pathA gateway or proxy can return success for work the ERP has not completed.

Vendors who publish careful guidance on this tend to be explicit about it. Stripe's documentation, for example, says to treat the outcome of a request that returned a 500 as indeterminate, to avoid retrying with a new idempotency key until the original outcome is resolved, and to reconcile by retrieving the object and using webhook events. That is one payments vendor's API contract (see Stripe's advanced error handling documentation), and it should not be assumed to describe your ERP. The principle, however, transfers: reconcile the authoritative state before you repeat a consequential action.

For a deeper treatment of prevention, including safe retries, duplicates and timeouts at design time, see our companion guide on idempotent ERP integration. This article picks up where prevention has already failed.

A Proposed Design: The Contain, Classify, Reconcile, Repair, Prove Runbook

πŸ”‘ Key takeaway: Five ordered steps keep responders from repairing before they know what is broken. The order matters more than the speed of any single step.

The runbook below is a proposed design for CIOs to adapt, not an established proprietary method. It is consistent with the incident handling lifecycle emphasis in NIST SP 800-61 Revision 3, which frames incident response as part of broader risk management. NIST's guidance is about security incidents. We apply the same discipline of preparation, analysis, containment and recovery to integration data incidents, which is our adaptation rather than NIST's statement.

Step 1: Contain

  • Pause automatic retry and replay for the affected operation classes (for example, order creation), not the whole ERP.
  • Freeze dead-letter queue purging and log rotation for the affected window so evidence is not lost.
  • Name an incident lead and the business owners who will approve repairs (finance for postings, operations for fulfillment and stock).
  • Treat the incident window as a hypothesis. Start with the first alert, then look backward for the first anomalous record.

Step 2: Classify

Build an inventory of every operation in the window, keyed by tenant and durable operation identity. Assign each to one of the five states from the first section. At this stage nearly everything is unknown. That is expected and honest.

Step 3: Reconcile

  • Query the ERP's authoritative state using the operation identity, or a business key you stored on the target document at creation. Do not infer from logs alone, and do not rely on timestamps.
  • Compare what exists against the approved payload hash or the expected content.
  • Check for in-flight work before declaring anything not applied. A queued job may still complete.
  • If the ERP cannot be queried by operation identity or business key, automated repair is a no-go. Reconcile manually from documents and obtain business sign-off.

Step 4: Repair

Reconciled stateAllowed repairNot allowed
Confirmed appliedMark complete. Do not replay.Replay for safety
Confirmed not appliedReplay through the normal claim path with the same operation identity and payload hashReplay under a new identity, which would hide a late-completing original
Applied differentlyBusiness-approved correction, recorded as a new operation linked to the originalReusing the original identity with the changed payload
DuplicatedReverse with the ERP's compensating documents (cancel, credit note, stock adjustment with reason code) after business approvalDeleting rows or editing balances directly
UnknownHold in quarantine with an owner and a decision dateClosing as success or as failed

Step 5: Prove

  • Tie control totals (count and value by tenant and document type) between source system, ERP and downstream systems such as WMS and billing.
  • Obtain named sign-off from each business owner.
  • Leave any unresolved item open as unknown, with an owner, rather than closing it to make the dashboard green.
  • Feed the lessons back into the go/no-go controls in the next section.

Illustrative code: durable identity, payload binding and atomic claim

The following SQL is illustrative only. It is not an ArionERP schema or API contract. It shows how the invariants fit together in an integration layer you control.

-- Illustrative only. Not an ArionERP schema or API. CREATE TABLE integration_operation (   tenant_id     uuid        NOT NULL,   operation_id  text        NOT NULL,  -- durable identity of one business intent   payload_hash  bytea       NOT NULL,  -- hash of the immutable approved payload   state         text        NOT NULL DEFAULT 'pending',   claimed_by    text,   lease_expires timestamptz,   target_ref    text,                  -- ERP document id, once confirmed   PRIMARY KEY (tenant_id, operation_id) );  -- 1. Record intent. Same identity, different hash = conflict, not a retry. INSERT INTO integration_operation (tenant_id, operation_id, payload_hash) VALUES (:tenant, :op, :hash) ON CONFLICT (tenant_id, operation_id) DO NOTHING; -- Then read the row: if payload_hash differs from :hash, reject the request.  -- 2. Atomic claim: exactly one worker can move pending to in_flight. UPDATE integration_operation    SET state = 'in_flight', claimed_by = :worker,        lease_expires = now() + interval '2 minutes'  WHERE tenant_id = :tenant AND operation_id = :op    AND payload_hash = :hash AND state = 'pending' RETURNING operation_id;   -- zero rows = someone else owns it  -- 3. An expired lease means UNKNOWN, never pending. The earlier worker may --    have reached the ERP. Reconcile before anything is re-sent. UPDATE integration_operation    SET state = 'unknown'  WHERE state = 'in_flight' AND lease_expires < now();

Two details matter. The identity is derived from the business intent (for example, order version plus shipment line), not from the order number alone, so a legitimate second shipment against the same order gets its own identity. And an expired lease routes to unknown, not back to pending, because the previous worker's request may have succeeded.

Illustrative code: conditional mutation at the target

Where a correction changes an existing ERP record, the check and the write must happen together at the target. A read followed by a comparison in your application, followed by a write, is not compare-and-swap. Another actor can change the record between the read and the write.

-- Illustrative only. The version predicate makes check and write one atomic step. UPDATE sales_order    SET quantity = :new_qty, version = version + 1  WHERE tenant_id = :tenant AND order_id = :order    AND version = :expected_version; -- Rows affected = 0 means a conflict: re-read, re-decide, never overwrite blindly.

If your ERP's API does not offer an equivalent conditional update (an ETag or version precondition, for example), disclose that limitation in the runbook and serialize writes to that record through a single owner. Do not present a read-compare-then-write sequence as safe.

Mandatory Go/No-Go Controls Before Any Automated Repair

πŸ”‘ Key takeaway: These ten controls are all required. Do not add them up into a readiness score. One missing control is a reason to repair manually, not an acceptable trade for the other nine.

A summed score invites teams to average a critical gap away. A mandatory control set does the opposite. It tells you precisely which repair actions are blocked until a specific gap is closed. Passing every control means the recovery path has no known blocking gap. It does not certify the integration as production-ready, and it is not a compliance attestation.

#ControlGo conditionNo-go signal
1Authoritative state lookupYou can query the ERP for what happened to an operation by identity or business keyOnly logs or the sender's retry history tell you what happened
2Tenant-scoped operation identityThe identity is durable and unique within the tenant, never shared across tenantsKeys are global, or derived from values that collide across tenants
3Immutable approved payload hashEach identity is bound to a hash. Reuse with a changed payload is rejected.The same key can carry a different payload, with the latest one silently winning
4Atomic claimOne worker wins a claim through a conditional database update or equivalentWorkers check status then act, with a gap in between
5Verified acknowledgmentDeduplication, inbox or outbox record and work scheduling commit atomically, or are explicitly recoverable, before acknowledging the senderThe sender is acknowledged first and the record written afterward
6Terminal failure stateExhausted or rejected work reaches a named state with an owner and a deadlineRetries continue indefinitely, or failed items sit in a queue nobody owns
7Uncertain-input handlingMalformed, ambiguous or unmappable input is quarantined for a human decisionThe mapper guesses, defaults a field, or drops the record
8Target-side conditional mutationUpdates carry a version or precondition enforced at the ERP, or serialization limits are disclosedRead-compare-then-write in application code is described as safe
9Compensating repair pathReversals use documented ERP documents with named approversRepairs mean database edits or deletions
10Privacy ownershipPayloads, logs, DLQs and exports each have an owner, retention rule and access rule. Identifiers are treated as potentially sensitive.Responders copy payloads into tickets, chat or spreadsheets

Scoping the standards you lean on

Idempotency guidance is easy to over-apply. Keep each reference inside its own scope:

  • The Idempotency-Key HTTP header. The IETF HTTPAPI working group's Idempotency-Key header draft describes a client-generated key for making POST or PATCH requests fault-tolerant. It says a key must not be reused with a different payload, suggests a 409 response for a concurrent retry and a 422 response for payload mismatch, and says resources must publish their own idempotency specification. It is an Internet-Draft, not a published standard, and it covers HTTP requests only. It does not address message queues, file feeds or batch interfaces. Check its current status before citing it in a design document.
  • Vendor-specific semantics. Stripe's documented behavior (key retention windows, saved responses, differences between API versions) belongs to Stripe. Your ERP's retention and replay rules may differ, and you must read them.
  • Retry design in general. The AWS Builders' Library article Making retries safe with idempotent APIs is a well-regarded engineering explanation. It describes AWS's approach and is not a substitute for your ERP vendor's contract.
  • Recording and scheduling together. The transactional outbox pattern describes writing state changes and outbound messages in a single local transaction. It is one way to satisfy control 5, not the only one.

Why identifiers belong in the privacy conversation

Control 10 surprises teams. An idempotency key, order number or customer reference can be personal or commercially sensitive data, especially when it embeds an email address, tax identifier or account number. Stripe's own guidance, for instance, advises against using email addresses or personal identifiers as idempotency keys. Our companion article on ERP integration data privacy walks through payload, log and dead-letter queue ownership in more detail. Your legal and privacy obligations depend on your jurisdiction and contracts, and your counsel should interpret them. This article does not.

Why This Fails in the Real World: Common Failure Patterns

πŸ”‘ Key takeaway: Capable teams fail here because of system gaps and split ownership, not carelessness. Each scenario below is illustrative and describes a pattern, not a specific customer's result.

Pattern 1: The replay that doubled the shipments

Illustrative scenario. An eCommerce platform posts orders to the ERP, which releases pick tasks to a warehouse system. During a database failover, the ERP commits a batch of orders but the responses never reach the platform. The platform's retry logic sees timeouts and resubmits the batch under new request identifiers. The ERP, with no durable identity linking the two submissions, creates a second set of orders. The warehouse picks both.

Why intelligent teams still fail: Retrying on timeout is textbook client behavior, and each component was working as designed. No component owned the question, "Did this business intent already happen?" The monitoring showed error rates falling after the retries, which looked like recovery.

Pattern 2: The corrected payload under the old key

Illustrative scenario. A pricing error is found, so the integration is fixed and the failed orders are replayed. The replay reuses the original operation keys, but the corrected payload has different line prices. Depending on the platform, the system either rejects the replay as a mismatch (good, but now nobody knows which orders were corrected) or silently returns the stored result of the first request (bad, because the corrected prices never arrive). Finance later finds invoices at the old prices and cannot tell which path each order took.

Why intelligent teams still fail: The team assumed a key identifies an order, when it should identify one approved payload. A correction is a new operation linked to the old one. Without payload binding, a success response proves nothing about content.

Pattern 3: The cleanup that created a privacy exposure

Illustrative scenario. Responders export the dead-letter queue to a spreadsheet to sort failures by hand, and paste samples into a chat channel. The payloads include customer names, delivery addresses and account references. No one owns the retention of those copies, and the access list on the channel is broader than the access list on the integration.

Why intelligent teams still fail: Incident urgency overrides data-handling habits. The runbook never said who owns incident evidence, so everyone assumed someone else did.

Pattern 4: Two workers, one operation

Illustrative scenario. A worker crashes mid-request, and a supervisor restarts the job after a timer expires. The first worker's request had in fact reached the ERP. Both operations complete. The check for existing work and the start of new work were separate steps, so there was a gap for the second worker to exploit.

Why intelligent teams still fail: Timer-based reassignment feels like resilience. It is safe only when the claim is atomic and an expired lease routes to unknown and reconciliation, not straight to a retry.

What the patterns share

  • Nobody owned the question of authoritative state.
  • A success signal (a 2xx, a falling error rate, a drained queue) was taken for proof of correct content.
  • Ownership was split across integration, ERP and business teams with no single runbook.
  • The shortcut was tolerable on an ordinary day and expensive on the worst one.

For the floor-level view of the same problem, see our plant-manager guide to shop floor transaction recovery. For the operations-side controls on order and inventory feeds, see our ERP integration exception handling guide.

Practical Implications for the CIO: Deployment, Evidence and Platform Questions

πŸ”‘ Key takeaway: Your deployment model decides what evidence you can reach during an incident, and how fast. Decide that before you need it.

How SaaS and on-premises deployments change recovery

ArionERP is offered as both Cloud (SaaS) and On-Premises, and the two models carry different recovery responsibilities. The same shape applies to most ERP platforms.

Recovery needCloud (SaaS) deploymentOn-premises deployment
Querying authoritative stateThrough documented APIs, exports and vendor-provided audit viewsThrough APIs and, where policy allows, controlled direct database reads
Log and payload retentionShared: vendor retention for platform logs, your retention for your integration layerYours end to end, including storage, backup and access control
Restore or point-in-time optionsDefined by the service agreement and vendor procedure. Confirm the process and timeline in writing.Defined by your own backup design. Test restores, not just backups.
Vendor support during an incidentCentral to the response. Confirm channels and severity definitions in advance.Depends on your support plan and your team's depth
Privacy and access ownershipSplit between vendor and customer. Confirm the split contractually.Primarily customer-owned

Neither model is inherently safer for recovery. The risk lies in assuming the evidence will be there without checking. For a broader view of this trade-off, see the cloud vs on-prem ERP overview and the pages for ArionERP Cloud and ArionERP On-Premises.

Who decides what

DecisionAccountable ownerCIO's role
Pausing and resuming integration flowsCIO or delegateDecides
Whether a duplicate invoice or posting is reversedFinance leaderProvides evidence and tooling
Whether a duplicate shipment is recalled or keptOperations leaderProvides evidence and tooling
Retention of incident payloads and logsNamed data owner, with privacy or legal inputEnforces technically
Closing an unknown itemBusiness owner of the recordConfirms evidence is complete

Comparing platform patterns on recovery questions

When you evaluate any ERP, include recovery questions in the demo, not just happy-path integration. The table below generalizes typical patterns and is not a claim about specific products or editions. Capabilities vary by vendor, edition, configuration and partner tooling, so verify against each vendor's primary documentation.

Recovery questionLarge suite pattern (varies)Lightweight ERP pattern (varies)What to verify with ArionERP
Can I look up an operation's outcome by identity or business key?Often possible, sometimes through add-on tooling or partner workOften limited to UI search or basic reportsAsk for a live lookup demonstration, and check the API documentation
How are concurrent or repeated requests handled?Depends on module and interface typeFrequently left to the integratorAsk what the documented contract is per interface, then test it with a repeated and a concurrent request
Are reversals handled by documented compensating documents?Generally yes for core financial and logistics documentsVaries widelyWalk through a reversal of a posted order and its downstream documents
Who holds evidence in an incident?Depends on hosting choice and contractUsually the vendor, with limited export optionsCompare Cloud and On-Premises evidence access in your scenario
What does recovery tooling cost in effort?Typically partner-heavyTypically in-house scriptsAsk for the integration scope in the integrations overview and request a written answer on each control above

To keep the claims honest, we are not asserting here that a specific ArionERP interface offers idempotency keys, payload fingerprinting or conditional updates. That is what the proof test is for. For security and compliance scope, review the security and compliance page and ask for the specific attestation, its scope and its date, because a certification held by an organization does not automatically describe every product, hosting arrangement or your own obligations.

Risks, Trade-Offs and a Lower-Risk Approach

πŸ”‘ Key takeaway: Safer recovery costs design effort and some latency. The cheaper alternative is paying in reconciliation hours later, at a worse time.

Trade-offs you should accept knowingly

ControlWhat it costsWhy it is usually worth it
Durable operation ledgerAn extra write per operation, plus storage and retention rulesIt is the only reliable way to answer "what did we send, and what was approved?"
Atomic claim and acknowledgmentSlightly higher latency and more careful transaction designIt removes the gap in which duplicates and lost messages occur
Quarantine for uncertain inputSome orders wait for a humanThe alternative is guessing in the ledger
Reversal through compensating documentsMore steps and approvals than a deleteIt preserves the audit trail and downstream consistency
Retention limits on payloads and DLQsLess history for forensic workSmaller privacy footprint. Choose retention deliberately and document it.

Limits you should disclose, not hide

  • Not every interface can be made exactly-once. File drops, legacy batch jobs and some partner APIs offer no identity or lookup. For those, document the serialization limits and accept manual reconciliation as the control.
  • Idempotency-key retention windows are finite. If a key expires, a late retry can execute again. Tie your retry limits to the documented window and reconcile once it closes.
  • Reconciliation requires someone to decide. Tooling shortens the investigation, but a business owner still signs off on reversals.

A lower-risk approach in practice

  1. Choose the interfaces that can hurt you most. Start with order creation, goods receipt, invoice posting and stock adjustments, not every feed.
  2. Run the ten controls as a design review, with a named owner for each no-go.
  3. Rehearse. Inject a timeout after commit, a duplicate delivery, a worker crash and a changed-payload replay in a test environment, and run the five-step runbook against the result.
  4. Write the unknown policy down. Who may close an unknown, on what evidence, by when?
  5. Re-test after every material change to mappings, ERP upgrades, or hosting.

2027 update: what to re-verify, and what stays constant

As of late 2026, the IETF Idempotency-Key header work was still an active working-group draft and not a published standard. Cloud and ERP vendors also continue to revise their API retry and replay behavior, including between API versions. Re-check any standard's status and each vendor's retention windows when you review this runbook. The underlying logic does not depend on any of that: an unconfirmed outcome stays unresolved until authoritative state says otherwise, a key binds to one approved payload, and repairs go through compensating documents.

Can your ERP prove what happened after a timeout?

Ask for the proof test, not the feature list. Lookup by identity, repeated request, concurrent request, reversal.

Walk through these ten controls against ArionERP Cloud or On-Premises with our team.

Contact Us

Conclusion: What to Do Before the Next Incident

Integration incidents are certain. Duplicate or missing postings are not. The difference is whether your team can establish authoritative state quickly and repair through controlled steps. Five actions to take now:

  1. Add unknown to your incident vocabulary. Define the five outcome states and forbid closing an unknown as success or failure without evidence.
  2. Run the ten go/no-go controls against your three riskiest interfaces. Treat any no-go as a block on automated repair for that interface until it is closed or the limitation is disclosed and accepted by the business owner.
  3. Prove authoritative lookup. For each interface, show that you can find what the ERP did by operation identity or business key. If you cannot, document the manual reconciliation path.
  4. Assign owners for repairs and evidence. Name the approvers for reversals and the owner of payload, log and dead-letter queue retention, including how identifiers are handled.
  5. Rehearse once, then after every major change. Inject a post-commit timeout, a duplicate delivery and a worker crash, and run the five-step runbook end to end.

About ArionERP and this review

ArionERP is a modular, AI-enhanced ERP platform offered as Cloud (SaaS) and On-Premises deployments, built for SMBs and mid-market organizations with a focus on manufacturing. It is developed by Cyber Infrastructure (CIS), a software company operating since 2003. For the current scope, dates and holders of any certifications or attestations, consult the security and compliance page and request the underlying documents, since scope varies by entity, product and hosting arrangement.

Reviewed by ArionERP Expert Team. This article offers general architectural guidance and illustrative scenarios. It does not constitute legal advice or a compliance determination, and it does not describe results at any named customer.

Frequently Asked Questions

What is ERP integration incident recovery?

It is the process of working out what actually happened to business operations (orders, receipts, postings, stock moves) after an integration fault, and then repairing the differences safely. It centers on reconciling against the ERP's authoritative state before replaying, reversing or correcting anything.

Is it ever safe to retry after an ambiguous timeout?

Only when the operation is protected by a durable, tenant-scoped identity bound to the approved payload, and when the target's documented behavior makes a repeated request return the original outcome. Even then, retries should stay within the documented retention window. For consequential mutations without that protection, query the authoritative operation state first, then decide whether to replay, mark complete or reverse.

What does an unknown result mean?

It means completion could not be confirmed. It is not success, and it is not a verified failure. Keep the item quarantined, with an owner and a decision date, until the authoritative system supplies evidence.

How is changed-payload key reuse handled?

It should be rejected. A key or operation identity binds to one immutable approved payload hash. If the business needs a corrected payload, record it as a new operation with a new identity, linked to the original after the original's outcome is resolved. The IETF Idempotency-Key draft takes a similar position for HTTP requests, but remember it is a draft and covers HTTP only.

How do I tell a duplicate from a legitimate repeat order?

Derive operation identity from the business intent (for example, order version and shipment line), not from time proximity or customer and amount similarity. Heuristic matching removes legitimate repeats and misses true duplicates that differ in one field.

Should we delete duplicate records?

Generally no. Downstream documents may reference them, and deletion breaks audit trails. Use the ERP's compensating documents (cancellations, credit notes, stock adjustments with reason codes) with named business approval.

Can a read followed by a conditional write in my application serve as compare-and-swap?

No. Another actor can change the record between your read and your write. Use a conditional mutation enforced at the target (a version predicate or precondition), or disclose the serialization limits and route writes for that record through a single owner.

Why do identifiers matter for privacy during recovery?

Order numbers, account references and keys can themselves identify people or reveal commercial information, particularly if they embed email addresses or tax numbers. Define who owns payload, log and dead-letter queue data, how long it is kept, and who may access it. Your legal obligations depend on your jurisdiction and contracts, so involve your counsel.

Does passing all ten controls mean the integration is production-ready?

No. The controls are mandatory checks that expose known blocking gaps in the recovery path. They are not a score, a certification or a compliance attestation. Production readiness also depends on testing, monitoring, capacity, security review and business sign-off.

How does SaaS versus on-premises deployment affect recovery?

It changes who holds the evidence and who can act. In SaaS, you rely on documented APIs, exports and vendor procedures, so confirm them in writing. On-premises, you control logs, backups and database access, and you carry the responsibility to retain and test them. Neither is automatically safer for recovery.

Take the next step

Ready to apply this ERP insight?

Discuss your goals with our ERP team, or continue with more practical ERP guidance.