DEV Community

Nwajichukwu Goodness
Nwajichukwu Goodness

Posted on

Correct behavior does not guarantee successful implementation

 An API returns the expected response. An SDK runs without errors. A deployment platform provisions the requested infrastructure. An authentication service successfully issues a token.

From the product team's perspective, these are encouraging results. The feature works. The system behaves as intended. The implementation example demonstrates the expected functionality.

But what happens when the customer tries to use that same product in a real application?

Perhaps the API request succeeds, but the application cannot safely handle retries. The SDK works locally, but the developer has not configured the production environment correctly. The infrastructure platform provisions a server, but the customer still needs to configure the network, permissions, and software running on it.

None of these situations necessarily means the product is defective.

They illustrate a different problem: a product can perform its intended function while the customer remains unable to complete the implementation they actually need.

This distinction matters for companies selling APIs, developer tools, cloud infrastructure, authentication services, fintech platforms, and other products that developers must integrate into their own systems.

A feature demo establishes that a particular capability works under particular conditions. A successful API request establishes that a particular request succeeded. Neither result, by itself, establishes that a customer can implement, operate, and maintain the complete solution.

Understanding that difference requires looking beyond the feature and following the customer's implementation path.

  1. The product team's definition of success may be narrower than the customer's

Consider a company that provides an API for creating payment transactions.

Its engineering team builds an endpoint, publishes the API reference, and provides a working code example. A developer follows the example, sends a request, and receives a successful response.

The product team can reasonably conclude that the endpoint is functioning as expected.

The developer, however, may be trying to accomplish something considerably larger:

  • Integrate payment creation into an existing application.
  • Authenticate requests using the correct credentials.
  • Distinguish test transactions from live transactions.
  • Handle network failures and retry requests safely.
  • Process asynchronous payment notifications.
  • Prevent duplicate business operations.
  • Record transaction states correctly.
  • Investigate failed or delayed transactions.
  • Deploy the integration without exposing credentials.

These responsibilities are not all necessarily part of the payment API's scope. Some may belong to the customer, some may be supported by other product features, and others may depend on the customer's application architecture.

The important distinction is between the capability being demonstrated and the outcome the customer is trying to achieve.

The product team may be asking:

Does the endpoint create a transaction when given a valid request?

The customer may need to answer:

Can my application reliably manage the complete payment workflow?

Those are different questions.

What the evidence establishes

A successful request provides evidence about the particular interaction that occurred.

It does not automatically establish that authentication is configured correctly across all environments, that failure conditions are handled, or that the surrounding application behaves correctly.

This is not a criticism of APIs. It is a limitation of what can be concluded from a single successful interaction.

The same distinction applies to an SDK example, a deployment demonstration, or an authentication quickstart.

A product team should therefore be careful about treating feature correctness as sufficient evidence of implementation success.

  1. Implementation is a path, not a single successful action

A customer rarely adopts a developer-facing product by performing one isolated action.

Even a seemingly simple integration usually involves a sequence of dependent steps.

For example, consider a developer integrating a third-party API into an application.

Implementation stage| What the developer is trying to accomplish| What must be established
Initial setup| Obtain access to the product| The account, project, or workspace is configured appropriately
Authentication| Make an authorized request| The correct credentials and permissions are being used
First interaction| Confirm basic functionality| The request and response behave as expected
Application integration| Connect the API to existing code| The application handles responses and failures appropriately
Environment configuration| Prepare the application for deployment| Environment-specific credentials and settings are correct
Production operation| Use the integration with real workloads| Relevant security, reliability, monitoring, and operational requirements are addressed
Ongoing maintenance| Keep the integration working| Changes, failures, and lifecycle requirements can be managed

This table is a general investigation framework, not a claim that every API requires these exact steps.

The sequence varies by product and use case. Some products automate several stages. Others provide features that remove the need for certain customer responsibilities.

That variation is precisely why the implementation path needs to be examined rather than assumed.

A quickstart might demonstrate the first three stages exceptionally well. A customer may still need to understand the remaining stages before the integration is ready for its intended use.

The gap becomes important when a developer believes that completing one stage establishes something that has not actually been established.

For instance:

  • A successful authentication request does not establish that every required application permission is configured correctly.
  • A working local integration does not establish that the production environment has equivalent configuration.
  • A successful deployment does not establish that monitoring, recovery, and operational procedures are in place.
  • An automatically provisioned resource does not establish that every dependent resource has also been configured.

Each statement concerns a different boundary between the product's capabilities and the customer's responsibilities.

The goal is not to assume that these boundaries are unclear. The goal is to identify them and determine whether customers have enough information to act on them correctly.

  1. A useful real-world example: The shared responsibility model in cloud infrastructure

Cloud infrastructure provides a particularly clear illustration of why a functioning product and a successful customer implementation are not the same thing.

Amazon Web Services explicitly describes cloud security as a shared responsibility between AWS and its customers.

According to the official "AWS Shared Responsibility Model" (https://aws.amazon.com/compliance/shared-responsibility-model/), AWS is responsible for protecting the infrastructure that runs its cloud services. Customer responsibilities depend on the services selected and may include application security, permissions, data protection, operating systems, and configuration.

AWS also explains that the division of responsibility changes depending on the service being used.

For example, a customer deploying a virtual server using Amazon EC2 has responsibilities that differ from those involved in using a more abstracted managed service.

This distinction is important because the customer is not purchasing a single undifferentiated outcome called security.

The customer is using a collection of services with different operational boundaries.

What the official guidance establishes

Verified fact: AWS defines responsibilities that it manages and responsibilities that customers must manage. Those responsibilities vary according to the services and configurations involved.

Analysis: A customer who understands only that AWS operates secure infrastructure may still lack an accurate understanding of the responsibilities associated with their own workload.

Hypothesis: If a customer misunderstands those responsibilities, the resulting configuration or operational decisions could leave important security requirements unmet.

The hypothesis is plausible, but the shared responsibility model alone does not establish that a particular customer misunderstood it or suffered a security incident.

That distinction matters. A credible implementation investigation should not turn a general technical possibility into an unsupported claim about customer harm.

Why this example matters beyond cloud security

The shared responsibility model demonstrates an important product-design reality: providing a capability does not necessarily mean assuming responsibility for every decision required to use it.

A cloud provider can manage the underlying infrastructure while the customer manages application permissions.

An authentication platform can issue tokens while the customer determines how those tokens are handled within its application.

A deployment tool can automate provisioning while the customer remains responsible for application configuration.

The relevant question is not whether the product does enough in the abstract.

It is whether the customer understands what the product handles, what remains their responsibility, and what they must do to achieve the intended outcome.

For DaxMac, that division of responsibility is an important place to begin an implementation investigation.

  1. The dangerous assumption: If the example works, the implementation is complete

Developer-facing products frequently use examples to help customers reach a first successful result.

Examples are valuable. They reduce the effort required to understand an API, learn an SDK, or configure a new service.

The problem arises when the example is treated as evidence of more than it demonstrates.

Imagine an API quickstart that shows a developer how to create a resource.

The developer copies the example, inserts valid credentials, sends the request, and receives the expected response.

The example has done its job if its purpose is to demonstrate resource creation.

But a customer integrating that operation into a production application may need to answer additional questions:

  • What happens if the request times out after the server has processed it?
  • Can the request safely be retried?
  • Does the operation require additional permissions in a different environment?
  • What happens if a dependent resource has not been configured?
  • How should the application respond when the API returns an error?
  • Are there lifecycle requirements for the created resource?
  • Which settings must change before deployment?

Not every API requires every consideration. The point is that the answers depend on the actual operation and its intended use.

A product team should not expect a short quickstart to explain an entire production architecture.

However, the team should understand the boundary between what the example proves and what the customer still needs to establish.

A concrete illustration: Retrying an API request

Stripe's official "idempotent requests documentation" (https://docs.stripe.com/api/idempotent_requests) explains how idempotency keys allow supported API operations to be retried without accidentally performing the same operation twice.

This is a useful example of an implementation concern that extends beyond receiving a successful response.

Suppose an application sends a request to create an object. A network problem occurs, and the application does not receive the response.

The application may not know whether the server processed the original request.

Blindly sending another request could have different consequences depending on the operation and whether duplicate execution is possible.

Stripe documents an idempotency mechanism that addresses this class of problem for supported requests.

Verified fact: Stripe provides documented support for idempotent requests and explains how idempotency keys are used when retrying requests.

Analysis: A developer who tests only the successful response may not have established how the application should behave when the response is lost or a retry becomes necessary.

Hypothesis: If the surrounding application handles retries incorrectly, it could create duplicate operations or otherwise produce an unintended result, depending on the endpoint and implementation.

The example does not prove that Stripe's quickstart is inadequate, nor does it establish that customers commonly make this mistake.

Instead, it demonstrates a more general principle: the implementation questions that matter in production may differ from the questions answered by a successful example.

An implementation review should determine which of those questions are relevant to the particular customer workflow.

  1. The product may be correct while the customer's mental model is wrong

An implementation problem does not always begin with an error message.

Sometimes the product behaves exactly as designed, but the developer has formed an incorrect understanding of what the product does.

Consider three hypothetical situations.

Scenario A: The developer assumes a setting is automatic

A deployment platform automatically provisions a service.

The developer assumes that the platform also configures every application-level permission required by the workload.

The service starts successfully, but an application operation later fails because an additional permission was required.

The provisioning process may have worked correctly. The question is whether the developer had a reliable basis for understanding which permissions were configured and which remained their responsibility.

Scenario B: The developer assumes environments are interchangeable

An integration works in a development environment.

The developer deploys the application to production and discovers that the production project requires different credentials or resource configuration.

The product may support both environments exactly as intended.

The implementation problem, if one exists, concerns the transition between them and the assumptions the developer made about what would carry over.

Scenario C: The developer assumes an SDK removes a decision

An SDK provides a convenient method for sending a request.

The developer assumes the SDK also handles a surrounding operational requirement, such as application-level retry policy or business-specific error recovery.

The SDK may perform its documented function correctly while leaving those decisions to the application.

These are hypothetical examples, not reports of incidents at named companies.

Their purpose is to show how an incorrect assumption can exist without a product defect.

In each scenario, the investigation should establish four things:

  1. What the developer is trying to accomplish.
  2. What the developer might reasonably believe the product handles.
  3. What the product actually handles, based on evidence.
  4. What the developer must still do to complete the intended implementation.

That fourth point is especially important.

It is not enough to identify a missing feature or an additional step. The reviewer needs to establish whether the customer can discover the requirement, understand its significance, and complete it in the context of the actual workflow.

  1. How implementation gaps become business problems

Implementation friction does not automatically translate into lost revenue, increased support costs, or production incidents.

Those outcomes require evidence.

Nevertheless, there are plausible pathways connecting an implementation problem to a business consequence. Product teams should investigate those pathways rather than treating them as either inevitable or irrelevant.

Pathway 1: Additional implementation work

A developer expects a setup process to configure several related resources automatically.

The product configures only some of them, leaving the developer to identify and configure the remainder.

If the responsibility boundary is not sufficiently clear, the developer may spend additional time investigating the required steps.

The possible business consequence is increased time spent implementing the product.

Whether that additional work is material depends on the workflow, the customer's experience, and the frequency with which the situation occurs.

Pathway 2: Support requests

A developer cannot determine why a workflow behaves differently from what they expected.

They search the documentation, inspect examples, consult community discussions, or contact support.

If the underlying problem is a recurring misunderstanding, individual support responses may resolve each customer's immediate question without addressing the pattern that generates those questions.

The possible business consequence is repeated support work.

However, one public question does not establish a recurring problem, and a support request does not necessarily indicate a product implementation gap. The customer may be encountering an unusual environment, an unrelated defect, or a requirement that is already explained clearly.

The evidence needs to distinguish between these possibilities.

Pathway 3: Engineering escalation

A customer encounters an implementation failure that support cannot resolve independently.

The case moves to engineering because understanding the behaviour requires deeper technical investigation.

If similar cases repeatedly require engineering involvement, the company may be spending engineering time on customer implementation questions that could potentially be addressed earlier in the implementation process.

This is a possible cost, not an automatic consequence of every difficult integration.

A well-designed escalation process is also necessary for legitimate technical problems.

The objective is not to eliminate support or engineering involvement. It is to identify avoidable work caused by recurring misunderstandings or preventable implementation gaps.

Pathway 4: Delayed adoption

A developer begins integrating a product but cannot complete the intended workflow.

The developer may need to investigate additional requirements, change the application architecture, request help, or postpone deployment.

In some circumstances, the delay could affect an evaluation or adoption decision.

But the existence of an implementation difficulty does not prove that a customer will abandon the product.

A credible analysis should identify the observed difficulty, explain the plausible pathway to delayed adoption, and look for evidence showing whether the consequence actually occurred.

The commercial lesson

These pathways explain why implementation investigations can be commercially valuable.

A company may already know that its API is available, its SDK passes tests, and its deployment platform works.

What it may not know is where customers struggle to translate those capabilities into complete implementations.

That question matters because the business outcome depends on more than whether an individual feature works.

It depends on whether customers can use the product successfully for the job they purchased it to perform.

  1. How to investigate the gap without assuming the product is at fault

A useful investigation begins with a specific implementation objective rather than a general search for weaknesses.

For example:

Can a developer move an integration from an initial test environment to production while correctly handling the credentials, configuration, and operational requirements relevant to that workflow?

That question gives the investigation a defined purpose.

The reviewer can then trace the path and examine the evidence.

Step 1: Define the customer's intended outcome

Avoid starting with a broad question such as whether the product is easy to use.

Define an outcome that can be examined.

Examples include:

  • Deploy an application that uses the API.
  • Configure authentication for a production integration.
  • Migrate an existing integration to a new API version.
  • Provision a service and make it available to an application.
  • Move an integration from a test environment to production.
  • Configure an SDK for the intended application workflow.

The objective should be specific enough that the reviewer can determine which steps and dependencies are relevant.

Step 2: Trace the implementation path

Follow the steps a developer would need to complete, using the product's publicly available materials and any other appropriate evidence.

Relevant sources may include:

  • Quickstarts.
  • API references.
  • SDK examples.
  • Configuration guides.
  • Migration instructions.
  • Product interfaces.
  • Changelogs.
  • Public GitHub issues and discussions.
  • Public support conversations.
  • Engineering articles.

Record the dependencies between steps.

If a later stage assumes that a resource has already been created, identify where that prerequisite is established.

If the workflow changes between environments, determine which settings or resources must change.

If the product automates a step, establish precisely what the automation performs.

The purpose is to understand the workflow as a whole, not simply to collect individual documentation pages.

Step 3: Identify the assumptions the workflow could create

For each important step, ask what a developer might reasonably conclude.

For example:

Product behaviour| Possible developer assumption| Question to investigate
The platform provisions a service| The service is ready for the intended workload| Which application-level configurations remain?
The SDK successfully sends a request| The SDK handles the complete operation| Which responsibilities remain with the application?
A quickstart works in a test environment| The same configuration can be used in production| Which environment-specific settings must change?
A migration guide lists changed API fields| The migration is complete once the fields are updated| Are there other relevant behavioural or operational changes?

The table identifies investigation questions, not verified defects.

A product may already explain each responsibility clearly. If so, the evidence should show that rather than forcing the reviewer to produce a negative finding.

Step 4: Verify the responsibility boundary

This is where assumptions must be checked against actual evidence.

Compare the expected behaviour with the official product materials and, where appropriate, observable product behaviour.

Ask:

  • What does the product perform automatically?
  • What does the developer have to configure?
  • What must the developer verify independently?
  • Which responsibilities depend on the selected service or deployment model?
  • What happens if a prerequisite is absent?
  • Does the product make the remaining responsibility apparent?
  • Is the necessary information available at the point where the decision must be made?

Do not assume that a responsibility gap exists simply because a developer must perform additional work.

Some responsibilities are intentionally assigned to customers to preserve control, flexibility, or security.

The concern is whether the division is sufficiently understandable for the intended implementation.

Step 5: Separate evidence from inference

A strong implementation investigation makes its reasoning visible.

Consider a hypothetical finding:

Observation: The official guide describes how to configure an integration in a test environment but does not establish, within the examined workflow, how the relevant configuration should be transferred or recreated for production.

Possible assumption: A developer may believe that completing the test setup establishes everything needed for production.

Analysis: The examined path does not yet establish the complete transition between environments.

Unknown: Whether the product provides another workflow, whether customers encounter difficulty, and whether any customer has experienced a resulting failure.

Recommended investigation: Examine the remaining environment-specific configuration and determine whether the transition is documented, automated, or intentionally left to the customer.

Notice what this finding does not claim.

It does not say that the product is broken, that its documentation is bad, or that customers are losing money.

It identifies a bounded question, explains why it matters, and states what additional evidence would be required.

That is more useful than a dramatic claim that cannot be substantiated.

Step 6: Determine the potential consequence

After establishing the implementation gap, identify what it could mean for the customer.

Depending on the workflow, possible consequences might include additional configuration work, incorrect assumptions, a failed deployment, unnecessary troubleshooting, or delayed completion.

But the consequence must follow from the evidence.

If the only verified fact is that an additional configuration step exists, the finding should not claim that the step causes production failures.

If public discussions show that multiple developers are struggling with the same requirement, that may strengthen the case for investigating a recurring pattern. It still does not automatically establish the size of the affected population or the financial cost.

Evidence strength determines how confidently the conclusion can be stated.

Step 7: Recommend a proportionate response

The response should address the demonstrated issue rather than defaulting to rewriting documentation.

Depending on the evidence, a product team might investigate whether to:

  • Clarify a prerequisite before the relevant step.
  • Make a responsibility boundary more explicit.
  • Provide a complete example of an important environment transition.
  • Add a validation step before deployment.
  • Improve an error message so it identifies a missing requirement.
  • Automate a repetitive configuration task.
  • Provide a migration check or verification mechanism.
  • Test whether a customer can complete the workflow without undocumented assumptions.

These are possible remediation directions, not universal recommendations.

A product should not automate a step merely because automation is possible. Nor should every implementation requirement become a new feature.

The appropriate response depends on the customer need, the product's intended scope, the evidence, and the cost of changing the workflow.

  1. What product teams should measure

A product team that wants to understand implementation success needs evidence that extends beyond feature correctness.

Useful measures depend on the product and the availability of reliable data.

They may include:

Time to complete a defined implementation. Measure the time required to reach a clearly specified outcome, rather than relying on a vague measure of ease of use.

Completion rates for important workflows. Determine how many customers complete the relevant setup, migration, or integration process when reliable measurement is available.

Repeated implementation questions. Examine whether multiple customers ask about the same requirement, while accounting for differences in customer environments and use cases.

Support escalation patterns. Identify recurring implementation topics that require specialist or engineering involvement.

Environment-transition failures. Where appropriate data exists, investigate failures associated with moving from development or testing to production.

Customer verification of critical steps. Determine whether developers can establish that important configuration, security, or operational requirements have been met.

These measures should not be treated as interchangeable.

A longer implementation time does not necessarily mean the product is worse. A security-sensitive workflow may appropriately require additional verification. A high number of support requests may reflect rapid adoption rather than a defective implementation path.

The goal is to connect observations to a defined customer outcome and interpret them in context.

When direct usage or support data is unavailable, an outside review can still examine public implementation materials and identify questions that deserve internal validation.

It should not pretend that public evidence provides visibility into the company's private customer experience.

  1. Why an outside review can reveal questions that feature testing misses

Product teams usually have detailed knowledge of their own systems.

They know why a configuration option exists, which prerequisites are important, and how the components fit together. Engineers may have implemented the same workflow many times.

That knowledge is valuable, but it can also influence how they evaluate the implementation experience.

An experienced engineer may automatically supply a missing assumption because they already know the answer.

A developer encountering the product for the first time does not have that knowledge.

The difference does not mean internal teams are careless. It means the people who build and maintain a system approach it with a different level of context from someone encountering it for the first time.

An outside reviewer can investigate the workflow without relying on undocumented internal knowledge.

The reviewer can ask:

  • What does the published workflow establish?
  • Which prerequisites must be inferred?
  • What does a successful example actually demonstrate?
  • Which responsibilities are assigned to the customer?
  • Can the intended outcome be reached using the available instructions and product behaviour?
  • Where would additional verification be necessary?
  • Which unanswered questions deserve further investigation?

The outside perspective is particularly useful when the product is technically sound but the customer must coordinate several resources, environments, services, or operational responsibilities.

It is not a substitute for engineering tests, security reviews, usability research, or customer interviews. It answers a different question: what can an informed person establish about the implementation path from the customer's side?

Where live testing is appropriate, the reviewer can also attempt the workflow and record actual behaviour. Where testing has not occurred, the conclusions must remain bounded by the available evidence.

  1. The principle: Examine the outcome the customer needs, not just the capability the product provides

A product team can demonstrate that an endpoint works, an SDK runs, a resource is provisioned, or an authentication flow returns a token.

Those are meaningful technical achievements.

But a customer purchases or adopts the product to accomplish something beyond observing an isolated capability.

They need to integrate it into an application, configure it for their environment, understand its responsibilities, and operate it within the constraints of their own system.

The gap between those two levels is where important implementation questions can arise.

The answer is not to label every difficult workflow a product failure. Complex products will always require customer decisions, and some of those decisions should remain under customer control.

The answer is to investigate the actual implementation path, establish what the evidence supports, identify the relevant responsibility boundaries, and determine whether the customer has what they need to complete the intended outcome.

That investigation can reveal where the product is already working well, where a responsibility is deliberately assigned to the customer, and where a reasonable assumption may lead to additional work or an incomplete implementation.

For product teams, this provides a more precise basis for deciding what to clarify, test, automate, or leave unchanged.

For customers, it helps distinguish between a product that performs a feature correctly and a product they can successfully implement in their own environment.

The central lesson is simple: proving that a feature works is not the same as proving that a customer can implement it successfully. The implementation path is where that difference must be examined.

Top comments (0)