All insights Claudio Torrens · Architecture field notes
Back to all insights
Keep Business Policy Out of Integration Glue
Software Architecture August 24, 2026 Claudio Torrens

Keep Business Policy Out of Integration Glue

Integration code should move and translate information—not become the hidden system that decides how the business operates.

A practical method for separating transport, translation, and workflow mechanics from business policy so that important rules remain visible, testable, and owned.

Software ArchitectureSolution ArchitectureSystems IntegrationBusiness RulesArchitecture Governance

Integration work often begins with a narrow objective: connect two systems, translate a message, or automate a handoff. Then the exceptions arrive. A customer type needs special treatment. One region follows a different approval path. An order above a threshold must wait for review. The quickest place to implement each condition appears to be the integration flow already moving the data.

That is how glue becomes a shadow application. It still looks like plumbing on the architecture diagram, but it now decides who can proceed, which values are valid, when money can move, and what happens when conditions conflict. Executives see a simple interface. Engineering teams inherit a business-critical decision engine with weak ownership, incomplete tests, and operational tools designed for message delivery rather than policy management.

My position is straightforward: integration components may enforce delivery mechanics, but important business policy should live behind an explicit, owned decision boundary. This is not a demand for another platform or microservice. It is a discipline for making consequential rules visible and putting them where their lifecycle can be managed.

Separate mechanics from meaning

An integration component legitimately performs technical work. It authenticates callers, maps schemas, handles protocol differences, applies timeouts, retries transient failures, rejects malformed messages, and records correlation identifiers. Those responsibilities protect communication between systems.

Business policy answers a different class of question. Is this customer eligible? Does this transaction require approval? Which price, limit, or entitlement applies? May the process continue when a dependency is unavailable? These decisions express how the organization chooses to operate. They need accountable owners, deliberate change control, explainable outcomes, and tests written around business scenarios.

The distinction is not whether the code contains an if statement. A retry policy may use conditions without becoming business policy. The useful distinction is consequence: does the rule determine whether information can be transported safely, or does it determine what the business is allowed to do?

Why hidden policy is expensive

Policy in integration glue creates costs that rarely appear in the original delivery estimate. The first is discovery. When a rule is spread across mappings, workflow expressions, scripts, and endpoint configurations, nobody can describe the complete decision without tracing an execution path across tools.

The second is inconsistent change. A policy adjustment may be implemented in the customer portal but missed in a batch interface or partner feed. Each channel gradually develops its own version of the truth. The business experiences this as unexplained variation; engineering experiences it as recurring reconciliation work.

The third is operational ambiguity. Integration monitoring is usually good at reporting that a message failed. It is less suited to explaining that a transaction was declined because three business conditions combined in a particular way. When policy and transport share the same failure path, support teams cannot quickly distinguish a technical incident from a valid business outcome.

Finally, hidden policy changes the risk profile of the integration estate. A component treated as replaceable plumbing becomes a critical system of record for decisions, often without receiving the engineering standards, ownership, or recovery planning that such a role deserves.

A practical placement test

Before adding a rule to an integration flow, ask the following questions. A single positive answer does not dictate the design, but several together are a strong signal that the rule belongs behind an explicit policy boundary.

  • Would a business owner recognize this as a rule? If the wording belongs in a policy manual, product definition, or operating procedure, it is more than message plumbing.
  • Must multiple channels reach the same decision? Shared outcomes should come from a shared authority rather than duplicated flow logic.
  • Will the rule change independently of the integration? Different change cadences deserve separate deployment and testing boundaries.
  • Must the outcome be explained or audited? Important decisions need reason codes, effective versions, and inputs that can be reconstructed.
  • Would inconsistency create financial, regulatory, or customer harm? Higher consequences require stronger control over the rule's location and lifecycle.

There is also a useful negative test. If a condition exists only because of a protocol, schema, or delivery constraint, it probably belongs in the adapter. Converting a date format, rejecting an invalid payload, limiting retry attempts, or routing to a dead-letter queue are integration concerns even when they influence execution.

Design the decision boundary

An explicit policy boundary can take several forms: a well-defined module inside a modular monolith, a domain service, a rules component, or a capability exposed through an API. The deployment topology matters less than the contract. Callers provide the facts needed for a decision; the policy owner returns an outcome, reason, and policy version. The integration layer coordinates the call but does not reinterpret the result.

Keep the contract about decisions

Avoid contracts that expose internal rule mechanics. An operation such as EvaluateOrderRelease is more stable than a collection of endpoints mirroring individual conditions. Return a decision that the caller can act on, along with reason codes suitable for support and audit. Do not make integration flows reconstruct the decision by chaining several low-level lookups.

Make failure semantics explicit

Every policy dependency introduces an availability choice. If the decision capability is unavailable, should the workflow stop, continue under a conservative default, or queue the request? That is itself a business decision and should be agreed before production. Hiding it as an adapter timeout default only moves the decision out of sight.

Version behavior, not just schemas

A compatible message schema does not guarantee compatible policy. Record the effective policy version with consequential outcomes. This enables teams to explain historical decisions and change rules without pretending that behavior is timeless.

Accept the tradeoffs deliberately

Centralizing every rule would create a different failure: a large, remote rules hub that adds latency, coupling, and a bottleneck to unrelated domains. The goal is not one enterprise policy engine. The goal is clear authority within each business capability.

Some simple, stable rules can remain close to a workflow when they have one consumer and low consequences. Duplication may be cheaper than a network dependency. Conversely, a shared policy boundary adds operational responsibility: availability targets, telemetry, contract evolution, and capacity planning. That cost is justified when consistency, auditability, or independent change matters enough.

Performance also deserves a conscious choice. Local evaluation, cached reference data, and asynchronous decisions can reduce synchronous dependency, but each option changes freshness and failure behavior. Document the tradeoff in business terms rather than defaulting to whichever implementation is easiest in the integration tool.

How to recover from a shadow application

Do not begin by rewriting the entire integration estate. Start with one high-consequence decision and make its current behavior observable. Catalogue the rules, identify the accountable business owner, capture representative scenarios, and add characterization tests around the existing outcomes.

  1. Separate technical validation from business eligibility in the current flow.
  2. Define a decision contract with explicit outcomes and reason codes.
  3. Move the rules behind an owned module or service while preserving existing behavior.
  4. Route one consumer through the new boundary and compare results before expanding.
  5. Remove duplicated rules only after every caller has a verified transition path.

This sequence reduces risk because it treats extraction as a change in authority, not merely a code move. The old flow stops being a decision owner only when consumers, support procedures, and operational evidence all point to the new boundary.

Conclusion

Integration platforms are valuable because they connect capabilities. They become dangerous when convenience turns them into an invisible place where the organization makes decisions. Keep transport and translation close to the interface. Put consequential policy behind a boundary with a clear owner, explicit outcomes, tested scenarios, and known failure behavior.

The result is not necessarily more architecture. It is more honest architecture: the diagram, the operating model, and the code agree about where business decisions are made.

Explore more insights

Browse more architecture, cloud, AI, and strategy articles.

Explore all insights

Recent posts

View all

Comments

Join the conversation Sign in with LinkedIn
No comments yet. Be the first to share your thoughts!