Software & Platforms
The full domain, and the other capabilities within it.
Integration designed for the day the network fails, not only for the day the demo works.
Integration is the work of making separate systems behave as one: an API gateway that presents a coherent surface, a message broker that decouples producers from consumers, and connectors that speak each system's own protocol. We design the contracts, build the flows, and instrument them so that failure is visible while it is still small.
The failure mode is always the same, and it is always discovered in production. An integration built on a plain HTTP call with no idempotency key, no retry policy and no dead-letter queue will lose messages the first time a network blips, or duplicate them the first time a timeout is retried. Both are silent. You learn about them from a reconciliation mismatch weeks later.
If more than one of these is true, this is usually the right place to start.
| Deliverable | What it contains |
|---|---|
| API specifications | Versioned OpenAPI or AsyncAPI contracts with worked examples and a deprecation policy, published where internal and external consumers can actually find them. |
| Gateway and broker config | Infrastructure as code for the gateway, broker and connectors, applied through your pipeline rather than clicked into a console. |
| Integration flows | The running integrations with idempotency keys, retry policy, dead-letter queues and a replay procedure someone on call can follow. |
| Observability pack | Tracing across service boundaries, per-consumer usage dashboards, and alerts tied to the failure modes each flow can actually have. |
A reference, not a template. Your estate decides which parts apply and in what order they arrive.
Targets are agreed with you before the work starts, and reported against for its duration.
Each answers a different question. REST for broad, cacheable, external-facing surfaces. GraphQL where clients need to shape their own queries and you accept the caching and complexity cost. gRPC for chatty internal service-to-service calls. Events where the producer should not have to know who consumes. Most real estates use several, and the mistake is picking one for everything.
Additive changes go into the current version; breaking changes get a new one, with both running while consumers migrate. That requires knowing who your consumers are, which is why per-consumer usage analytics matter more than they first appear to. A deprecation policy with dates published in advance is what makes the migration possible at all.
HTTP is enough when the caller can usefully wait for the answer and can safely retry it. A broker earns its operational cost when the consumer may be down, when load spikes must be absorbed, or when several systems need the same event. It also adds a system you have to run, which is worth saying plainly before it appears on the diagram.
In a distributed system there is no exactly-once delivery. There is at-least-once delivery plus idempotent processing, which together produce an exactly-once effect. That is why every consumer we build has an idempotency key and a de-duplication strategy. Anyone promising exactly-once at the transport layer is describing something else.
Usually. The options are database views with change tracking, file exchange with a checksum and manifest, terminal or screen automation as a last resort, and a strangler layer that fronts the old system behind a stable contract. Each has different failure characteristics, and we will name them, because a fragile connector needs monitoring built in from the first day.
Authentication and authorisation at the gateway with OAuth 2.0 or mutual TLS, per-consumer credentials and rate limits, request validation against the published schema, and secrets held in a managed store rather than in configuration files. Payload-level controls such as field encryption, signing and data minimisation are decided against what actually crosses the boundary, not applied uniformly.
The full domain, and the other capabilities within it.
Multi-tenant SaaS engineering where tenancy, metering, entitlements and progressive release are design decisions taken before the first enterprise customer.
Web applications built to an accessibility and performance budget from the first commit — architecture, API layer, CI/CD and observability you own.
The fastest way to a useful answer is a short, scoped look at what you already have.