What we’re learning

The full findings.

Over the last few weeks we asked engineers one question in one-on-one conversations: when an API contract changes, how does your team find the real downstream consumers and coordinate their owners before merge - and do your current workflows actually solve it?

This is the detailed version of the summary: every mechanism, pain point and pushback we heard, paraphrased and anonymized. Roles and employers are withheld; these were personal conversations, never company positions.

The short version

Three kinds of answers showed up. All three are on this page.

Confirmed pain

The problem is real

Five replies described a real pain point or gap in handling API changes, from missed downstream impact to testing coverage and human error.

Mechanism gaps

Setups with clear edges

Several more described setups that work - and exactly where they stop: unknown consumers, service-level visibility, and manual owner coordination.

Working today

Solved for some

A few told us this is not a pain for them, and explained why: written-down contracts, versioning, and mandated caller identity.

Confirmed pain points

Replies that explicitly confirmed the problem from the engineer’s own experience, paraphrased.

Confirmed pain

Blast radius is invisible at review time

Most of the time, the people making or reviewing a change do not know its blast radius.

Confirmed pain

Still an open problem

Blast radius is still a problem that people are actively trying to solve.

Confirmed gap

A testing workflow gap

There is still a gap in testing workflows when an API contract changes.

Confirmed pain

Registries only see the registered

Even with a schema registry in place, it covers registered app-to-app traffic. Older or open clients can still fly under the radar.

Confirmed gap

Manual notification leaks

Consuming teams are informed through a manual process, which has room for human error. Automatically identifying downstream services and notifying their owners would address a genuine problem.

In between

Real, with a safety net

One engineer confirmed contract changes can have a blast radius - and finds contract tests catch it early and reduce the blast. We read this as confirming the problem exists, not as a workflow failing.

Where today’s mechanisms stop

These replies did not frame the problem as pain. They described, concretely, where their current setup stops.

Mechanism gap

HTTP has no contract tests

Events and shared libraries run smoothly because the contract is written down and versioned. For HTTP between services there are no shared types or contract tests, and clients are hand-written. Observability shows which services call an endpoint, not which fields they read - so a breaking change still means reading the caller’s code. Mobile apps and devices appear as traffic, not as named callers. It still depends on people knowing the system.

Mechanism gap

Hits are visible, consumers are not

Runtime monitoring mostly shows the hits. Sometimes the consumer behind them never becomes known at all.

Mechanism gap

Communication alone is not enough

Communication does not solve this at platform level unless technical safeguards back it: canary rollouts behind feature flags, a versioned envelope consumers can fall back on, and consumer-side monitors. Adding optional fields rarely breaks anyone; deleting fields is what creates panic.

Mechanism gap

The known-consumer list

A change announcement goes by email to the teams currently known to consume the API, and any team not on the list is expected to flag its own dependency. Unlisted dependencies have surfaced before - rarely, but they have.

Mechanism gap

Async needed an in-house fix

The hard case was downstream services called asynchronously, until an in-house wrapper around the message queue made async consumers enumerable. Coordinating with code owners is still manual whenever a request shape changes.

Mechanism gap

Maps without owners

Dependency mapping shows which services a change might affect. Mapping that back to the right owners - and keeping contract test coverage adequate - still takes manual coordination and validation.

What solved looks like

Some replies told us plainly that this is not a pain for them. That signal matters too.

Working today

Contracts written down

Where the contract is strongly typed and versioned - or every change goes out behind a version that keeps the old one working - teams told us this simply is not a problem for them.

Working today

Caller identity mandated

Some teams require every client to send its details and publish events at each leg of a call, so the caller list is complete by construction.

Working today

Honest about limits

One engineer declined to call this a recurring pain from limited exposure - while agreeing that identifying dependencies and coordinating owners gets harder as a microservices ecosystem grows.

The pattern across all three groups: where contracts are written down, versioned, and consumers are registered, the process works. Trouble concentrates where consumers are unknown, unregistered, old, or asynchronous - and where visibility stops at the service level instead of the field level.

What we are taking from it

Teams can generally manage the consumers they know about. The gap is the consumer nobody registered: the old pinned client, the cron job, the one-off internal tool, the mobile app that only ever shows up as traffic.

That is the gap Impact Gate works on. Before a merge, Impact Gate checks an API change against its downstream consumers and shows a warn-only impact summary, so an unregistered consumer surfaces before the change ships - not after.

Method note: these findings come from one-on-one conversations with engineers, held between 17 October and 2 November 2026. The set is small, self-selected and drawn from the founder’s own network. Replies are paraphrased and anonymized; messages their authors later deleted are not used. Directional signal, not market statistics.

See Impact Gate in action.

The demo runs on a bundled example project - no account needed. Connect GitHub to try it on your own repos.