Backend & APIs

Backend systems and APIs that behave under load

We design and build the part of the product nobody sees until it breaks: APIs, data models, authentication and the integrations that hold a business together.

Where backends usually go wrong

Backend problems are rarely about raw speed. They are about a data model that made sense for the first version and now requires three joins and a subquery to answer a routine question; about an API that returns HTTP 200 with an error inside the body, so every client has to guess; about integrations that fail silently at 3am and are discovered a fortnight later through a customer complaint.

The costly decisions are made early and are hard to unwind. How the schema is normalised, where the boundaries between services sit, how authentication and authorisation are separated, whether the API is versioned. Getting these wrong is survivable for a while and then suddenly is not.

We would rather spend a week on the data model than a quarter migrating one.

What we build

APIs designed for their consumers

REST or GraphQL, chosen for the clients that will use it rather than by preference. Consistent error handling with correct status codes, pagination that works on large collections, and versioning in place before you need it β€” because retrofitting versioning while clients are live is painful.

Data models that survive the next feature

Schema design with the queries you will actually run in mind, appropriate indexing, and migrations that are reversible. We use relational, document or graph databases according to the shape of the data rather than habit.

Authentication and authorisation, kept separate

Session or token authentication implemented against current practice, and a permission model that is checked on the server for every request. Conflating who you are with what you may do is one of the more common causes of access-control bugs.

Integrations that fail loudly

Third-party connections with retries, backoff, idempotency and dead-letter handling, plus alerting when something stops. A failed integration should page someone, not accumulate silently.

Background work and scheduling

Queues for anything slow, unreliable or spiky β€” imports, exports, document generation, notifications β€” so a user request never waits on a third party.

Observability from the first deploy

Structured logging, health checks and metrics on the paths that matter. Diagnosing a production issue should be a query, not an archaeology exercise.

Technologies we use for this

Runtime

  • Node.js
  • Express
  • TypeScript

PHP

  • Laravel
  • PHP

API

  • REST
  • GraphQL
  • OpenAPI
  • Webhooks

Databases

  • MySQL
  • MongoDB
  • Neo4j

Operations

  • Docker
  • Azure
  • GitHub Actions

We choose from these based on what the project needs and what your team can maintain after we hand over β€” not on what we most enjoy working with. Where an existing stack is already in place and sound, we work within it.

Typical engagements

An API for a mobile or web client

Building the server side of a product where the interface is already designed or already built, including the authentication and data model underneath it.

Rescuing a slow database

Query profiling, index work and schema changes on a system that has outgrown its original design. Frequently cheaper and faster than the infrastructure upgrade being considered instead.

Decomposing a monolith, selectively

Extracting the parts of a large application that genuinely need independent scaling or deployment β€” and leaving alone the parts that do not, which is usually most of them.

Connecting systems that do not talk

Integration work between platforms with incompatible assumptions about identity, timing and data shape. The value is in handling the edge cases properly.

Questions we are asked about this

Node.js or Laravel β€” which should we choose?

Both are capable of running serious production systems, so the decision usually comes down to context rather than benchmarks. Node with TypeScript lets you share types and language with a React frontend, and suits real-time and high-concurrency I/O. Laravel gives you a great deal of structure out of the box β€” authentication, queues, scheduling, an ORM β€” which tends to reach a working product faster for conventional business applications. Your existing team's skills should weigh heavily, because maintainability outlasts the build.

REST or GraphQL?

REST is simpler to cache, simpler to debug and adequate for most applications. GraphQL earns its additional complexity when many different clients need different shapes of the same data, or when mobile clients are making too many round trips. Choosing GraphQL for a single web client usually adds work without a corresponding return.

Can you improve an existing backend rather than replace it?

Usually, and it is normally the better economics. We start with profiling and a review, then target the specific bottlenecks. Full rewrites are a last resort β€” they take longer than anyone estimates and pause feature work for their duration.

Do you handle hosting and deployment?

We set up the deployment pipeline, containerisation and environments, and can manage infrastructure on an ongoing basis or hand it to your team with documentation. The accounts stay in your name either way.

How do you approach security?

Server-side validation on every input, parameterised queries, secrets kept out of the repository, dependency scanning in CI, least-privilege access, and current practice for password storage and session handling. We are not a penetration-testing firm; for systems handling regulated data we will recommend an independent assessment as well.

Thinking about backend & apis?

Send us the problem and any constraints you already know about. We will come back with what we think it needs, an approach, and a realistic range β€” or tell you it is not work we are right for.

Start a conversation