Most vendor evaluations ask whether an API is available. Far fewer ask what the vendor guarantees when a call times out, a webhook is delivered twice, or your receiving system is down for longer than the vendor will keep retrying. Those answers decide whether an integration quietly loses events, double-charges a customer, or leaves two systems of record disagreeing for weeks.
This guide is written for the CIO, enterprise architect, or head of integration who has to approve a SaaS or platform vendor whose events and APIs will drive consequential business operations: payments, orders, entitlements, provisioning, ledger postings. It explains how to read a vendor's delivery claims, which claims can be verified from documentation, which must be proven in a sandbox, and which obligations remain yours no matter what the vendor promises.
The framework below is a proposed design for a go/no-go evidence review. It is not a certification, a score, or a method presented as proven in any specific client engagement. It uses mandatory controls: every control must pass, or have a named compensating control with an owner and an expiry date. Where we cite vendor behavior, we cite the vendor's own documentation and state that it reflects the documentation at the time of writing. Documentation changes, so re-verification is itself one of the controls.
Key Takeaways
- An uptime SLA is not a delivery guarantee. Ask what the vendor does on retries, duplicates, ordering, replay windows, and permanent failure.
- Unknown is its own state. A timeout means completion could not be confirmed. It is not success and it is not verified failure. Reconcile authoritative state before repeating any consequential write.
- Use all-required controls, not a summed score. A vendor that scores well on average but cannot replay missed events inside your recovery time is a no-go for that integration tier.
- Acknowledge only after durable recording. Return a success response to a webhook only after the event record and the scheduled work are committed atomically, or are explicitly recoverable.
- Bind each operation to a tenant-scoped identity and an immutable payload hash. Reject changed-payload key reuse, claim work atomically, and give legitimately later operations their own identity.
- Identifiers can be sensitive. Event IDs, idempotency keys, and object IDs can link to people or accounts, so assign an owner for their retention and logging.
- Scope every standard. HTTP idempotency semantics, an HTTP header draft, and a SOC 2 report each answer a narrow question, and none of them guarantees your business outcome.
Why Vendor Delivery Guarantees Are the Least-Examined Line in an Integration Deal
Key takeaway: Networks fail between systems, so vendors retry, and retries create duplicates, reordering, and ambiguous outcomes. Procurement checklists rarely test for any of that.
Every integration crosses a network, and every network call can end in one of three ways: confirmed success, confirmed failure, or silence. Silence is the dangerous one. A client that sends a request and receives no response cannot tell whether the server never saw it, processed it and failed to reply, or is still processing it. Vendors compensate by retrying, and sensible vendors document that behavior. Consumers then inherit the consequences: the same event can arrive more than once, events can arrive out of order, and an outage on your side can outlast the vendor's retry window.
Typical enterprise vendor reviews cover availability targets, security attestations, data residency, and price. These matter, but they measure different things. An availability percentage describes how often the vendor's endpoints respond. It says nothing about whether your system recorded each business event exactly once in effect. Security attestations describe control environments within a defined scope and period. For a deeper treatment of how to read those, see our go/no-go guide to validating SOC 2 and ISO 27001 evidence.
The vocabulary you need before you ask vendors anything
Vague questions get vague answers. Use precise terms, and ask the vendor to confirm which apply.
| Term | What it means | Question to put to the vendor |
|---|---|---|
| At-least-once delivery | The sender retries until it sees an acknowledgment, so duplicates are possible. | Is duplicate delivery documented as expected behavior? What stable identifier lets us detect it? |
| Out-of-order delivery | Events can arrive in a different sequence than they were generated. | Is ordering guaranteed? If not, what version or sequence field, or authoritative fetch, resolves it? |
| Acknowledgment | The receiver's signal that the event was accepted. | Which response codes and timeouts count as success, retry, or permanent failure? |
| Retry window | How long the sender keeps trying. | What happens when the window ends: dropped, dead-lettered, endpoint disabled, or replayable? |
| Idempotency key | A client-supplied identifier that lets a server recognize a retry of the same operation. | How long is a key retained, and what happens on reuse with different parameters or concurrent use? |
| Unknown outcome | Completion could not be confirmed. | What is the documented way to establish the authoritative state of an operation? |
What the standards do and do not tell you
Scope matters here, because teams routinely over-read standards. RFC 9110 (HTTP Semantics) defines which HTTP methods are idempotent: repeating the same request has the same intended effect on server state. That is a property of the method's semantics. It does not tell you that a vendor's business operation is safe to repeat, and POST is not idempotent by definition, which is exactly why vendors offer keys. The IETF's Idempotency-Key HTTP header work targets request retries on HTTP APIs, and it was an Internet-Draft, not a finalized standard, when we last reviewed it. Check its current status before citing it in a contract. It does not govern webhook delivery, message brokers, or what happens inside your receiver.
Finally, treat identifiers as data. Event IDs, idempotency keys, and object IDs can themselves be sensitive if they embed or can be joined to personal or account information. Stripe's API documentation, for example, advises avoiding sensitive data such as email addresses or personal identifiers as idempotency keys. That advice belongs on your review list, not only the vendor's.
2026 update: what changed, and what to re-verify in any year
As of this writing in late 2026, leading API vendors document at-least-once webhook delivery, unordered events, and explicit duplicate-handling guidance. Some now offer longer idempotency retention on newer API versions: Stripe's documentation, for instance, describes a 30-day replay window for its API v2 idempotency, versus a minimum of 24 hours for v1. The direction of travel is toward better replay and reconciliation tooling. The evergreen lesson is that these windows, retry schedules, and behaviors are vendor-controlled and versioned. Whatever the year, the review should record the exact documentation version it relied on, and a calendar owner should re-verify it on a fixed cadence and on every vendor API version change.
Why This Fails in the Real World: Five Failure Patterns That Catch Capable Teams
Key takeaway: These failures are system and governance gaps, not individual mistakes. Each one passes a conventional vendor review, and each is cheap to catch if it is tested before go-live.
The scenarios below are illustrative composites of well-known integration failure modes. They are not reports of specific client results. In each, intelligent, experienced people did reasonable things, and the process around them had no place where the gap could surface.
Pattern 1: The early success response
Scenario (illustrative). A web framework template returns an immediate success response to every webhook and hands the payload to an in-memory background task, so the vendor never sees a timeout. A deployment restarts the process mid-queue. The vendor saw a success response, so it considers the event delivered and will not retry.
Why capable teams miss it. Fast acknowledgment is common advice, and the template did exactly that. Nobody owned the definition of what an acknowledgment means. The control that would have caught it: acknowledge only after the event record and scheduled work are durably committed.
Pattern 2: The new key per attempt
Scenario (illustrative). A client library retries a payment-creation call after a timeout, generating a fresh idempotency key on each attempt. Two operations execute. The vendor's idempotency feature worked as designed; it was never given a stable operation identity to work with.
Why capable teams miss it. Libraries generate keys per request by default, and tests run on reliable networks. Vendor guidance, such as Stripe's, is explicit that retries of the same operation must reuse the same key and parameters, and that if your application retries across separate calls or process restarts, you should persist a key per operation. The missing control is a durable, tenant-scoped operation record created before the first attempt.
Pattern 3: The outage that outlasts the retry window
Scenario (illustrative). A receiver is down for a long weekend. The vendor retries for a documented period, then stops. Events from the tail of the outage are gone, and no replay or reconciliation job exists. Finance finds the gap at month end.
Why capable teams miss it. The retry window was in the documentation, but nobody compared it to the organization's realistic worst-case recovery time. For the recovery side, see our CIO's framework for reconciling unknown-outcome operations.
Pattern 4: The key that swallowed a legitimate second operation
Scenario (illustrative). To be safe, a team derives the idempotency key from the order ID. A customer later receives a second, separate partial refund on the same order. The vendor, or the team's own dedupe table, treats it as a duplicate of the first refund. The money never moves, and nothing errors visibly.
Why capable teams miss it. Deduplication was designed around the retry case and never around the legitimate repeat case. Operation identity must come from business intent (this specific refund request), not from the object the operation touches.
Pattern 5: Identifiers in the logs nobody owns
Scenario (illustrative). Debug logging records raw webhook payloads and keys so engineers can replay failures. Months later, those logs are copied into a general-purpose analytics store with a different retention policy and access list.
Why capable teams miss it. The integration team owns delivery; the privacy office owns personal data; nobody owns the replay store in between. Our CDO's go/no-go guide to idempotency and replay stores covers that ownership gap in detail.
Pattern summary
| Pattern | Root cause (system, not person) | Control that catches it |
|---|---|---|
| Early success response | No definition of acknowledgment | C2 acknowledgment contract plus durable inbox test |
| New key per attempt | No durable operation identity | C5 mutation safety plus operation ledger |
| Outage beyond retry window | Vendor window never compared to recovery time | C4 replay and reconciliation drill |
| Key swallows a legitimate later operation | Identity derived from object, not intent | C5 intent-based operation identity |
| Unowned identifiers in logs | No named owner for replay and log stores | C7 privacy ownership assignment |
A Proposed Framework: The Delivery Guarantee Evidence Review
Key takeaway: Nine controls, all required. Each has a documentary test and, where possible, a sandbox test. No arithmetic: one unmet control blocks the integration tier it applies to, unless an owner signs a time-limited compensating control.
This is a newly proposed design for structuring due diligence, not a proprietary method CIS claims to have applied across past engagements. Its purpose is to turn vague reassurance (the vendor says it is reliable) into artifacts someone can inspect. Passing it does not certify production readiness. It establishes that the vendor's contract of behavior is knowable, testable, and compatible with your recovery objectives, so that a pilot can proceed.
The nine controls
| ID | Control | GO requires | NO-GO if |
|---|---|---|---|
| C1 | Delivery semantics | Documented delivery model, retry schedule, retry window, and behavior when retries are exhausted | Semantics are described only in marketing language, or exhaustion behavior is unstated |
| C2 | Acknowledgment contract | Documented success, retry, and permanent-failure response codes; timeout length; behavior when your endpoint is disabled or removed | You cannot determine what response causes a retry versus a drop |
| C3 | Event identity and ordering | Stable unique event ID; documented duplicate possibility; either ordering guarantee or a sequence/version field or authoritative fetch to resolve order | No stable ID, or ordering is both unguaranteed and unresolvable |
| C4 | Replay and reconciliation | Ability to list or resend missed events, and to fetch current authoritative state; replay window at least as long as your worst-case recovery time | Missed events cannot be recovered, or window is shorter than your recovery objective with no compensating poll |
| C5 | Mutation safety | Idempotency support for consequential writes; documented behavior on changed parameters, concurrent same-key requests, key retention, and unknown outcomes | Consequential writes cannot be made safely repeatable, and no authoritative operation lookup exists |
| C6 | Authenticity | Verifiable signatures, replay protection (such as signed timestamps), and secret-rotation procedure | Payloads cannot be authenticated |
| C7 | Privacy and tenant boundaries | Data-minimized payloads or retrievable-on-demand detail; documented retention of delivery logs; named owner on your side for identifiers, replay stores, and logs | No owner, or you cannot isolate one tenant's events and keys from another's |
| C8 | Operability | Delivery logs you can inspect, alerting when an endpoint fails or is disabled, a support escalation path, advance notice of behavior changes | Failures are invisible until a customer reports them |
| C9 | Evidence currency | Documentation version recorded; sandbox behavior differences listed; certification scope and period confirmed; re-verification owner and cadence set | Review relies on undated claims or a certification whose scope excludes the relevant service |
How to apply the gate
- Tier the integration first. A consequence tier decides which controls are mandatory (see the trade-offs section). Consequential mutations, such as money movement, entitlements, and ledger entries, require all nine.
- Collect evidence, not assurances. For each control, attach a documentation excerpt with version or retrieval date, a test result, or a signed statement from the vendor.
- Record unknowns as unknowns. If a control cannot be evidenced, its status is not 'probably fine'. It is open, and open means no-go until resolved or compensated.
- Name owners and expiry dates. A compensating control, such as scheduled reconciliation polling against the vendor's authoritative API, needs an accountable owner and a date by which it is revisited.
- Separate three kinds of claims. Section 4 explains how to sort vendor statements, compliance-support features, and your own obligations.
Reading Vendor Claims: Vendor Statement, Compliance-Support Feature, or Your Obligation?
Key takeaway: A claim is only as strong as its source, its scope, and its date. Sort every claim into one of three buckets before it enters your evidence file.
Vendor documents mix three very different things. Conflating them is how a feature description becomes, in a steering committee deck, a compliance guarantee.
| Category | Example | How to treat it |
|---|---|---|
| Vendor statement of behavior | A documented retry window or idempotency retention period | Evidence of intent and current behavior. Verify in a sandbox where possible, record the version, and re-check on change. |
| Compliance-support feature | Signed payloads, audit logs, data-retention controls | A tool that helps you meet your own obligations. It does not make you compliant by itself. |
| Reader-specific legal or regulatory obligation | Data-protection duties, sector rules, contractual commitments to your customers | Yours. Determine with your counsel and privacy office. A vendor attestation does not transfer it. |
What precise vendor documentation looks like
Use precise documentation as your benchmark for what to demand from others. Stripe's published webhook documentation, at the time of writing, states that it attempts delivery for up to three days with exponential backoff in live mode, that sandbox events are retried three times over a few hours, that it does not guarantee delivery in generation order, and that endpoints may receive the same event more than once, advising teams to track processed event IDs. See Stripe's webhook documentation. Its API guidance on idempotent requests states that keys are retained for at least 24 hours on v1, that the idempotency layer errors if incoming parameters differ from the original request, and that results are saved only once execution begins. Its advanced error handling guidance adds that after a connection failure you may not know whether the request executed, and that if the outcome remains unknown after the retry window you should reconcile before repeating the operation.
Notice what makes these statements useful: numbers, named behaviors, explicit failure modes, and an instruction for the unknown case. We cite Stripe here as an example of documentation quality and as a source of verified behavior, not as a recommendation or an assertion that any other vendor behaves the same way. Also notice the sandbox difference: the documented sandbox retry behavior differs from live, so a sandbox test cannot fully prove the live retry window. Record that as a C9 limitation.
Red-flag phrases
- 'Enterprise-grade reliable delivery' with no retry schedule, window, or exhaustion behavior.
- 'Exactly-once delivery' without a description of the mechanism and its limits. Treat it as a claim to test, not a design assumption; your own idempotent handling is still required.
- 'Compliant' or 'certified' attached to a feature rather than to a named service, scope, and period.
- 'Contact support' as the only replay mechanism for consequential events.
- Documentation with no version or date.
Questions to include in the RFP or security questionnaire
- What delivery guarantee does each event type carry, and where is it documented?
- What exactly counts as an acknowledgment, and what happens on timeouts, redirects, and 4xx versus 5xx responses?
- When retries are exhausted, what happens to the event and to the endpoint?
- How do we list and replay missed events, and for how long?
- How do we fetch authoritative current state for any object an event refers to?
- How long are idempotency keys retained, and what is returned for reuse with different parameters, for concurrent same-key requests, and after expiry?
- How will you notify us before changing any of the above, and with how much notice?
- Which delivery and idempotency records do you retain, for how long, and who at the vendor can access them?
For connecting these answers to your wider integration architecture, our enterprise pages on enterprise integration and APIs and API governance and architecture describe the capabilities we bring to this work.
What Your Side Must Prove: Receiver and Caller Invariants
Key takeaway: Even a perfectly documented vendor leaves you with duties. Your system must acknowledge only what it has durably recorded, treat unknown as unknown, and give every consequential operation an identity that survives retries, restarts, and concurrent workers.
A due diligence review that stops at the vendor is half a review. The vendor's guarantees only deliver business value if your side upholds the following invariants. Ask your integration team to demonstrate each one, not describe it.
| Invariant | What it requires | Failure it prevents |
|---|---|---|
| Verified acknowledgment | A success response is sent only after the inbox record and the scheduled work are committed atomically, or are explicitly recoverable | Events acknowledged but lost (Pattern 1) |
| Terminal failure handling | Events that can never be processed go to a dead-letter state with an owner, an alert, and a decision path | Silent poison messages and endless retry loops |
| Uncertain-input handling | An event with a known ID but a different payload, an unverifiable signature, or an unknown type is quarantined, not auto-processed and not discarded | Corruption by ambiguous input |
| Tenant-safe idempotency | Deduplication keys are scoped by tenant (and provider), never global | One tenant's event suppressing another's |
| Durable operation identity | Each consequential operation has a tenant-scoped identity bound to an immutable, approved payload hash; reuse with a changed payload is rejected | Wrong-payload replays and key misuse |
| Atomic claim | Workers claim work with a single atomic statement or lease, so two workers cannot process the same item | Concurrent double processing |
| Legitimate later operations | Identity derives from business intent (this refund request), so a second genuine operation is not mistaken for a retry | Pattern 4 |
| Target-side conditional mutation | Updates use a version check or conditional request evaluated by the target system. If the target cannot, document the serialization and conflict limitations | Lost updates from read-compare-then-write races |
| Unknown means reconcile | After a timeout on a consequential write, read authoritative state first. Do not blindly retry | Duplicate effects after ambiguous failures |
| Privacy ownership | A named owner decides retention, access, and logging for identifiers, payload copies, and replay stores | Pattern 5 |
An illustrative receiver pattern
The sketch below is illustrative pseudocode in SQL form, not any vendor's official API contract and not production-ready. It shows the shape of an inbox that deduplicates per tenant, stores a hash rather than the raw payload, and schedules work in the same transaction as the record. Adapt it to your database, isolation level, and recovery design.
-- Illustrative only. Names and schema are hypothetical. -- Step 1: record the event and schedule work in ONE transaction. BEGIN; INSERT INTO inbox (tenant_id, provider, provider_event_id, payload_sha256, status, received_at) VALUES (:tenant_id, :provider, :event_id, :payload_sha256, 'received', now()) ON CONFLICT (tenant_id, provider, provider_event_id) DO NOTHING; -- If no row was inserted, load the existing row. -- Same payload hash: a duplicate delivery; safe to acknowledge. -- Different payload hash: uncertain input; quarantine and alert, do not process. INSERT INTO work_queue (tenant_id, inbox_key, status) SELECT :tenant_id, :event_id, 'pending' WHERE EXISTS ( SELECT 1 FROM inbox WHERE tenant_id = :tenant_id AND provider = :provider AND provider_event_id = :event_id AND status = 'received' ) ON CONFLICT DO NOTHING; COMMIT; -- Only after COMMIT succeeds: return a 2xx to the sender. -- Step 2: a worker atomically claims one item with a lease. UPDATE work_queue SET status = 'claimed', claimed_by = :worker_id, lease_expires_at = now() + interval '5 minutes' WHERE id = ( SELECT id FROM work_queue WHERE status = 'pending' ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1 ) RETURNING id, tenant_id, inbox_key; -- Step 3: for consequential outbound writes, create the operation FIRST. INSERT INTO operations (tenant_id, operation_id, intent, payload_sha256, state) VALUES (:tenant_id, :operation_id, :intent, :approved_payload_sha256, 'pending') ON CONFLICT (tenant_id, operation_id) DO NOTHING; -- Existing row with a different payload hash: reject. Never reuse the identity. -- Step 4: target-side conditional mutation (must be enforced by the target). UPDATE target_table SET balance = :new_balance, version = version + 1 WHERE id = :id AND version = :expected_version; -- Zero rows updated means a conflict: reconcile, do not overwrite.Three honest caveats. First, a read followed by an application-side comparison and then a write is not compare-and-swap. The condition must be evaluated by the target at write time, for example through a version column, or an HTTP conditional request such as If-Match where the target supports it. Where the target is a third-party system that offers no conditional write, disclose the serialization limits and funnel updates through a single ordered worker per entity. Second, a transaction spanning your database and a message broker is not automatic. Either use a transactional outbox or inbox within one datastore, or design an explicitly recoverable sequence, with a sweeper that finds received events that lack scheduled work. Third, 'terminal failure' needs a definition agreed in advance: for instance, an event that fails validation after a bounded number of attempts moves to dead-letter, pages a named owner, and is never silently dropped.
The timeout rule for consequential writes
When a write to a vendor times out, the state is unknown. The disciplined sequence is: keep the same operation identity and parameters; query the vendor's authoritative state for that operation; if it exists, adopt its result; if it demonstrably does not and the retry window is still open, repeat with the same identity; if the retry window has closed and the outcome is still unknown, stop and escalate to reconciliation rather than starting a new operation. This is consistent with Stripe's documented guidance for unknown outcomes. For a fuller implementation view, see our VP Engineering's go/no-go guide to idempotent webhooks and API retries.
Practical Implications, Trade-offs, and When This Advice Does Not Apply
Key takeaway: Depth of review should track consequence. Over-reviewing a notification feed wastes weeks; under-reviewing a payment integration risks money. Tier first, then require every control within the tier.
Consequence tiers decide which controls are mandatory
The tiers below are a proposed convention, not a scoring system. Within a tier, every listed control must pass.
| Tier | Typical integration | Mandatory controls | Review effort |
|---|---|---|---|
| 1: Consequential mutation | Payments, refunds, provisioning, entitlements, ledger postings | C1 to C9, plus sandbox fault injection and a reconciliation drill | Highest; include architecture, security, privacy, finance |
| 2: Operational state sync | Order status, inventory, CRM record sync | C1 to C5, C7, C8, C9 | Moderate; reconciliation job required |
| 3: Tolerant notification | Internal alerts, non-critical analytics feeds | C1, C2, C6, C7 | Light; loss is acceptable and documented |
What each leader should do differently
- CIO: Make the evidence review a gate in vendor onboarding for Tier 1 and Tier 2 integrations, and require named owners for compensating controls.
- Enterprise architect: Own the control definitions and the tiering. Insist that replay windows are compared with measured recovery objectives, not assumed ones.
- Procurement and legal: Convert behavioral claims into contract language: notice periods for semantic changes, log-export rights, and support commitments for replay. Interpretations of legal obligations belong with your counsel.
- CISO and privacy office: Review signature verification, secret rotation, and retention of identifiers and payload copies. Confirm certification scope matches the service you will use.
- VP Engineering: Demonstrate the invariants in Section 5 in a test environment before production traffic.
Risks and trade-offs
- Slower onboarding. Evidence collection adds elapsed time, especially when vendors answer slowly. Stage it: documentary review first, so weak vendors fall out before engineering time is spent.
- Engineering cost. An inbox, an operation ledger, and a reconciliation job are real work. Reuse them across integrations through a shared integration platform pattern rather than rebuilding per vendor.
- Sandbox limits. Sandboxes often differ from live in retry timing, rate limits, and data. Test what you can, document what you cannot, and keep a monitored first-production ramp.
- Vendor refusal. If a vendor will not commit to replay or to documenting exhaustion behavior, either choose another vendor or build compensating polling against its authoritative API. Record the residual risk and who accepted it.
- Over-collection of data. Storing raw payloads for replay increases privacy exposure. Prefer hashes, minimized payloads, and fetch-on-demand, with explicit retention limits.
When this advice does not apply
- The integration is read-only with no consequential downstream effect, and occasional loss is acceptable (Tier 3).
- Both ends sit inside one transactional boundary you control, where database transactions already provide atomicity. A different review applies.
- You are evaluating a message broker or event bus you operate, rather than a vendor's external events. Broker guarantees and consumer design are a separate subject.
- A regulator or customer contract imposes specific delivery or audit rules. Those requirements supersede this generic framework and should be interpreted with counsel.
A Lower-Risk Path: Prove the Guarantees Before You Sign
Key takeaway: A short, structured proof phase converts documentation into observed behavior. Run it before contract signature where possible, and always before production traffic.
The most reliable way to de-risk a vendor integration is to make the vendor's guarantees observable inside your own environment. The following sequence is a proposed plan; adjust durations to your tier and your vendor's sandbox maturity.
Phase 1: Documentary review
- Fill the nine-control table with excerpts, versions, and retrieval dates.
- Mark every control as evidenced, open, or compensated.
- Eliminate vendors with unresolved C1, C2, or C4 gaps before any engineering time is spent.
Phase 2: Sandbox fault injection
Exercise the failure modes your design must tolerate. At a minimum:
- Duplicate delivery: replay the same event and confirm one business effect.
- Out-of-order events: deliver a later state before an earlier one and confirm the authoritative fetch resolves it.
- Receiver failure after receipt: kill the process between receipt and processing and confirm nothing was acknowledged without a durable record.
- Write timeout: inject a timeout after the vendor has executed a write and confirm reconcile-first behavior.
- Changed payload, same identity: confirm the vendor, and your own ledger, reject it.
- Concurrent same-identity requests: confirm exactly one executes and the other waits or conflicts.
- Legitimate later operation: submit a genuinely separate operation on the same object and confirm it is processed.
- Poison event: submit a malformed event and confirm dead-letter handling and alerting.
Phase 3: Reconciliation drill
Simulate an outage longer than your target recovery time. List the events missed, replay or fetch them using the vendor's mechanism, and compare the resulting state against the vendor's authoritative records. Time the exercise. If it takes longer than the vendor's replay window allows, C4 fails regardless of what the documentation promises.
Phase 4: Contract and ownership
- Record named owners for acknowledgment semantics, operation identity, reconciliation, and privacy of identifiers and replay stores.
- With legal counsel, seek commitments on advance notice of changes to retry, replay, and idempotency behavior, and on access to delivery logs.
- Schedule re-verification on a fixed cadence and after any vendor API version change.
Is your next vendor integration approved on an uptime number?
Duplicates, replay gaps, and ambiguous timeouts rarely appear in a demo. They appear in month-end reconciliation.
Talk to CIS integration engineers about a delivery-guarantee review and proof phase for your Tier 1 integrations.
Request Free ConsultationIf you would rather have an experienced team run the proof phase, our integration consulting services cover architecture review, test design, and reconciliation tooling. We would rather you find a vendor gap in a sandbox than in a quarter-end close.
Conclusion: Five Actions for Your Next Vendor Integration Decision
The decision in front of a CIO is not whether a vendor's API works. It is whether the vendor's behavior under failure is knowable, testable, and compatible with your recovery objectives, and whether your side can uphold its half of the contract. Use the following actions as a decision guide.
- Tier every integration by consequence. Require all nine controls for consequential mutations, and write down which lighter tier applies to everything else.
- Demand documented numbers. Retry schedule, retry window, exhaustion behavior, key retention, and replay window must be stated with a version or date. Treat undocumented behavior as open, not as acceptable.
- Compare vendor windows with your measured recovery time. If the vendor stops retrying before you can realistically recover, require replay, polling, or another compensating control with a named owner and expiry date.
- Make your side demonstrate the invariants. Durable acknowledgment, tenant-scoped deduplication, operation identity bound to a payload hash, atomic claiming, target-side conditional writes, and reconcile-first handling of unknown outcomes should be shown in a test, not described in a slide.
- Assign owners for identifiers and replay stores, and schedule re-verification. Privacy decisions and vendor behavior both change. Put a calendar date and a name against each.
About the review
Cyber Infrastructure (CIS) is an AI-enabled software development and IT services company founded in 2003, delivering enterprise integration, modernization, and custom software for clients across the USA, EMEA, and Australia with an in-house team. CIS states that it operates under ISO 27001 and CMMI Level 5 frameworks; as this article advises for any vendor, ask for current certificates, scope statements, and audit periods rather than relying on a summary. This article was reviewed by CIS Expert Team.
Frequently Asked Questions
What is the difference between a webhook delivery guarantee and an API uptime SLA?
An uptime SLA describes how often a vendor's endpoints are available. A delivery guarantee describes what the vendor does with an event or request when something fails: how often it retries, for how long, what it does when retries are exhausted, whether duplicates or reordering can occur, and how you recover missed events. A vendor can meet its uptime SLA and still deliver duplicates, deliver events out of order, or stop retrying before your system has recovered.
Is exactly-once webhook delivery realistic?
Treat it as a claim to test, not an assumption. Many major vendors document at-least-once delivery and advise customers to deduplicate by event ID. Even where a vendor describes stronger behavior, your receiver still needs idempotent handling, because network failures between the vendor and you can leave outcomes ambiguous. Design for duplicates and verify any stronger claim in a sandbox.
Should I retry a payment or other consequential API call after a timeout?
Not blindly. A timeout means completion could not be confirmed. Query the vendor's authoritative state for that operation first. If you retry, reuse the same operation identity and the same parameters while the vendor's retention window is open. If the window has passed and the outcome is still unknown, escalate to reconciliation instead of starting a new operation. This mirrors the guidance in Stripe's published documentation for unknown outcomes.
How long should a vendor's replay window be?
At least as long as your realistic worst-case recovery time, measured rather than assumed. If your longest plausible outage, including weekends, approval delays, and escalation, exceeds the vendor's retry and replay window, you need a compensating control such as scheduled reconciliation against the vendor's authoritative API.
Does a SOC 2 report or ISO 27001 certificate prove a vendor's webhooks are reliable?
No. Those attestations describe control environments within a defined scope and period. They do not specify delivery semantics, retry windows, or idempotency behavior. Confirm that the report or certificate covers the specific service you will use, check the period, and obtain the behavioral guarantees separately in documentation, tests, and contract terms. Legal obligations specific to your organization remain yours and are best interpreted with counsel.
Can idempotency keys contain sensitive data?
They should not. Keys, event IDs, and object IDs can be logged, copied into analytics stores, and joined with other data. Stripe's documentation advises against using email addresses or personal identifiers as idempotency keys. Prefer random identifiers, hash anything derived from sensitive inputs, and assign a named owner to the retention and access policy for any store that holds identifiers or payload copies.
What if a vendor refuses to provide replay or detailed delivery documentation?
Treat the control as open. Options are to select a different vendor, to add a compensating control such as polling the vendor's authoritative API on a schedule, or to accept the residual risk through a named owner with an expiry date. For consequential mutations, an undocumented exhaustion behavior combined with no replay path should normally block approval.
How is this framework different from your guides on idempotent webhooks and outage recovery?
Those guides cover implementation and recovery inside your own systems. This guide covers the earlier decision: how to evaluate and contract with a vendor so that its documented behavior, your recovery objectives, and your receiver design fit together before you commit. It is a proposed due diligence design, and it links to those guides for the engineering details.
Before you sign, find out what happens when delivery fails.
A vendor's reliability story is easy to tell and hard to verify. A structured evidence review and a short proof phase make it verifiable.
Ask CIS to help you pressure-test vendor delivery guarantees, design a durable receiver, and plan reconciliation for your most consequential integrations.
Request Free ConsultationIntegration-consulting-services
This article is most relevant for technology and digital-transformation leaders who need to commercial evaluation. Use the related CISIN path to compare delivery options, implementation fit, risk, and practical next steps.
Reviewed for technology and business decision makers
This guide is reviewed for clarity, technical and operational relevance, service alignment, and a useful next step.
Validate legal, security, data, budget, and operational requirements with the relevant stakeholders before rollout.

