← All insights

INSIGHT / 03

Building integrations between systems

Principles for designing explicit, observable boundaries between applications, providers, devices, and communication channels.

External systems connect through adapters and a controlled boundary to internal software PROVIDER APROVIDER BCHANNEL CBOUNDARYADAPTERSVALIDATIONINTERNALSYSTEM External systems connect through adapters and a controlled boundary to internal software PROVIDER APROVIDER BCHANNEL CBOUNDARYADAPTERSVALIDATIONINTERNALSYSTEM
CONCEPTUAL SYSTEM VIEW / NOT A CLAIMED IMPLEMENTATION ARCHITECTURE

01. An integration is a boundary, not a feature toggle

Connecting two systems can look deceptively small from the product side. Add a provider, receive data, send a message, or synchronize a record. The visible result may be one button or one status. Underneath that result is a boundary between different identifiers, timing models, failure modes, ownership, and definitions of success.

Thinking of the integration as a boundary produces better questions than thinking of it as a feature toggle. Which system owns each fact? How does one system identify a record from the other? What does a successful request guarantee? Can the provider accept work and fail later? How are duplicate, delayed, or missing events handled? Who can diagnose a problem when the two systems disagree?

The conceptual diagram places adapters and validation between external providers and the internal product. It does not describe a claimed architecture for a portfolio project. Its purpose is to show that external assumptions should meet the product at an explicit edge rather than spread throughout the internal model.

A healthy integration translates between systems without making either system pretend to be the other.

02. Define ownership before mapping fields

Field mapping is necessary, but ownership comes first. If both systems can update the same value, the integration needs a conflict rule. If one system is authoritative, the other should not quietly overwrite it. If authority changes by workflow state or data category, that boundary must be stated precisely.

Ownership also applies to actions. Sending a request does not always mean the requested outcome happened. A communication provider may accept a message for processing while delivery remains a later event. An IoT provider may report device data without guaranteeing the business meaning assigned to it. An attendance system may own device events while another application owns how those events participate in a broader workflow.

Once ownership is clear, mappings become easier to reason about. Each value can be classified as sourced externally, derived internally, synchronized in one direction, or reconciled under a specific rule. This prevents the common mistake of treating every matching field as bidirectional.

Identifiers deserve the same discipline. Names, labels, and email addresses can change or collide. A stable external identifier may still need a mapping record because the internal product uses a different identity model. The mapping should be inspectable enough to diagnose a mismatch without exposing irrelevant provider details throughout the application.

03. Keep provider language at the edge

External APIs arrive with their own vocabulary, payload shapes, status codes, and constraints. Letting those concepts flow directly through the product can couple business behavior to one provider’s design. A replacement provider, version change, or second channel then requires changes far beyond the integration layer.

An adapter can translate provider-specific details into the product’s language. The product can ask to send a notification, ingest an attendance event, or process a location signal without every caller knowing a vendor field name. The adapter handles authentication, request formatting, response interpretation, and provider-specific errors. The internal system handles business intent and user-visible state.

This separation should not erase important detail. If a provider distinguishes between accepted, delivered, rejected, and expired, the product may need corresponding concepts. Translation is not simplification at any cost. It is a deliberate mapping that preserves the distinctions the operation needs while containing those that belong only to the provider.

Al Jisr Tawjih includes confirmed work across WhatsApp, email, and custom plugins. Those channels make the value of a stable internal intent easy to see. The surrounding product should be able to express what communication is needed and why. Channel-specific adapters can then handle the differences between a WhatsApp interaction, an email, and a custom plugin without forcing the whole workflow to speak three provider dialects.

04. Model asynchronous outcomes honestly

Many integrations are asynchronous even when the first call returns quickly. A request can be accepted, queued, processed, delivered, or rejected at different times. Device data can arrive in batches. A webhook can be retried. A downstream service can complete after the user has left the page.

The internal state should reflect this lifecycle honestly. “Sent” is ambiguous if it sometimes means the application issued a request and sometimes means the recipient received it. More precise states reduce false confidence. The interface does not need to expose every transport detail, but it should distinguish conditions that change the next action.

Qualiapp’s connection with ZKBioTime offers a grounded example of an asynchronous boundary without implying undocumented implementation details. Attendance information originates in a separate system and becomes relevant in Qualiapp. The experience should account for the fact that external information may not be available at the exact moment someone expects it. “No attendance event,” “not synchronized,” and “unable to retrieve” can represent different operational situations.

Callbacks and webhooks add another question: how much should be trusted? An incoming event should be authenticated according to the provider’s supported mechanism, validated, and associated with a known request or entity where possible. Its arrival should not allow an external payload to bypass the product’s own state rules.

05. Design for repeats, delays, and partial failure

Distributed boundaries make partial failure normal. The external request can succeed while the internal confirmation write fails. The internal action can commit while the response to the caller is lost. A webhook can be delivered more than once. Retrying can be necessary, but repeating a non-idempotent action can create a second message, record, or side effect.

Idempotency is therefore a product reliability concern. The integration needs a way to recognize that two attempts represent the same intended operation when the provider and use case support it. The exact mechanism varies, but the design question is consistent: what should happen if this instruction is received again?

Retries need boundaries as well. Immediate infinite retries can amplify an outage and hide a persistent configuration problem. A controlled policy can separate temporary conditions from failures that require attention. The visible system should show that work is pending or needs intervention rather than leaving a record permanently in a vague processing state.

The Transmap portfolio includes an IoT Connector and Gateway in a product concerned with routing and connected data. That confirmed scope illustrates why failure must be considered along the whole path. A provider, connector, gateway, network, or internal consumer may be unavailable independently. A useful integration boundary can identify which stage last handled an event without claiming that a single “online” flag describes the entire chain.

06. Make integrations observable for humans

An integration is not supportable if its only evidence is a generic error in the interface or a large volume of raw logs. Observability should connect technical events to the business operation being attempted.

At minimum, a diagnostic view often needs the internal entity, external identifier where appropriate, attempted operation, current integration state, last relevant time, and a safe explanation of the failure category. Sensitive credentials and raw personal data do not belong in a broad operational view. The goal is sufficient context for triage, not unrestricted exposure.

Correlation is particularly useful. A request identifier or traceable operation key can link an internal action to adapter activity and a provider response. The user-facing product may show only a concise reference, while engineering tools carry deeper detail. This creates a path from “this notification is still pending” to the evidence needed to understand why.

Metrics should answer operational questions rather than exist as decoration. Are events arriving? Is processing delayed? Are failures concentrated around one provider response or mapping condition? No performance numbers are claimed here. The principle is to measure the boundary in terms that help distinguish absence, delay, rejection, and internal failure.

07. Give failure a recovery path

An error state is incomplete until ownership and recovery are clear. Some failures can retry automatically. Some require credentials or configuration to be corrected. Some require a mapping decision. Some require a user to choose another communication channel. Treating all of them as “integration failed” prevents the product from guiding the next step.

Recovery actions should be safe and scoped. A manual retry should explain whether it can repeat an external side effect. A remapping action should show which future data it affects. A fallback channel should not silently change the meaning or privacy expectations of the communication. An operator should be able to resolve one record without triggering an uncontrolled replay of unrelated work.

The system should also preserve evidence across recovery. Replacing the failed state with success without retaining the earlier attempt makes later diagnosis difficult. A concise history can show that an operation failed, why it was retried, and which attempt ultimately reached the current state.

For communication channels such as WhatsApp and email, recovery may involve channel-specific outcomes. A permanent rejection is different from a temporary provider outage. For attendance or IoT data, recovery may mean synchronizing a missed range or correcting a mapping rather than simply resending one request. The interface should reflect these different operational verbs.

08. Review the contract from both sides

An integration review should be performed from the external and internal perspectives. From the external side, examine authentication, rate or usage constraints, supported identifiers, event guarantees, versioning, and documented error behavior. From the internal side, examine state transitions, ownership, retries, permissions, user-visible language, and diagnostic needs.

Then test the seams. What happens when a field is absent? When an identifier is unknown? When a callback arrives twice or out of order? When the provider accepts work but never supplies a final event? When credentials expire? When one channel is unavailable but another is permitted? When a person corrects a mapping after earlier events were received?

Contract changes also need a plan. External systems evolve, and a provider-specific field can change meaning or disappear. Validation at the boundary should make incompatible data visible rather than allowing it to contaminate the internal model. Versioned mappings or compatibility periods may be appropriate depending on the provider, but the essential requirement is explicit change handling.

Transmap’s connected components, Qualiapp’s ZKBioTime connection, and Al Jisr Tawjih’s communication channels demonstrate three different integration contexts: device and IoT data, attendance information, and outbound or interactive communications. They do not prove one universal architecture. They show why the same engineering discipline travels across domains.

That discipline is to keep ownership clear, translate provider language at an explicit boundary, model asynchronous state honestly, expect repetition and partial failure, and give people evidence plus recovery. A successful connection is not merely one that works in the ideal request. It is one whose behavior remains understandable when two independent systems do not move at the same speed or agree on the same view of the world.