Skip to content

Software Engineering

Custom Software Development Services

Off-the-shelf software makes you operate the way a vendor imagined. When that mismatch becomes the thing slowing the business down, custom software is the answer. We design it, build it in short reviewable cycles, run it in production, and hand you everything.

What Custom Software Development means in practice

Who it’s for: Organisations whose process is a competitive advantage and whose software should fit it rather than fight it, and teams replacing spreadsheets, manual bridging or a product that has stopped fitting.

The honest starting position is that most software should be bought rather than built. Accounting, payroll, email, CRM, helpdesk: these are solved problems where a mature product will beat anything we could write for you, and a consultancy that fails to say so is selling you its own utilisation. Custom software earns its place in a narrower and more valuable band: the processes that are genuinely specific to your organisation, the ones that are a competitive advantage rather than a commodity, and the ones where the gap between how the vendor thinks you should work and how you actually work has become a tax paid daily in workarounds.

That band is where we work. Internal operations platforms that replace a sprawl of spreadsheets, shared inboxes and one person’s memory. Customer-facing products and portals, often sitting on top of a core system that is not going anywhere. Systems of record built for a niche no vendor has bothered to serve properly. And the integration work that makes the tools you already run behave as one system rather than five that need a human to carry data between them. We build with boring, well-supported technology, typically TypeScript and Node, Python, .NET and Postgres, because your software has to be maintainable by whoever comes next, not just by us.

The single most useful thing we do is spend real time at the front of an engagement on the decisions that are cheap now and ruinous later: the domain model, the boundaries between parts of the system, and the contracts with everything it integrates with. Those decisions cost nothing in week one and cost a rewrite in year two. After that, the work is deliberately unglamorous: short cycles, working software deployed continuously, and progress you can see in the product rather than in a status deck. You own the repositories, the cloud accounts and the intellectual property from the first commit.

What you get

  • A written architecture and domain model you own and can defend: the boundaries, the data model, the integration contracts and the reasoning behind each significant choice
  • Working software deployed from the first weeks and continuously thereafter, in short cycles you review against the running system rather than against a specification
  • Integrations designed rather than bolted on, with retries, idempotency and reconciliation for the days a third party is slow, wrong or unavailable
  • Automated tests at the levels that actually pay (a fast unit layer, integration tests over the real database, a thin end-to-end layer over critical journeys), running in CI on every change
  • Accessibility to WCAG 2.2 AA and a performance budget treated as requirements rather than as a pass someone does before launch
  • Monitoring, structured logging, backups you have actually restored from, and runbooks, so the system can be operated by people who did not write it
  • A handover built for independence: your repositories, your cloud accounts, documented decisions, and a codebase your own engineers can extend

Work like this

Real engagements, written with the client’s own facts and published as they are approved.

What Custom Software Development does for you

  • The workaround tax stops being paid

    Every mismatch between a bought product and how you really work is paid for daily: in double entry, in a spreadsheet that shadows the official system, in the exceptions only two people know how to handle, and in the training time it takes to explain why the software says one thing and the business does another. Custom software removes that tax at source rather than managing it. The saving is rarely dramatic in any single week, which is precisely why it goes unnoticed for years, and it compounds.

  • Your process can keep changing

    Bought software fixes your process at whatever the vendor’s roadmap allows. If a change to how you operate needs a feature request, a professional services engagement or a version upgrade, your ability to improve is throttled by someone else’s priorities. When you own the system, a change to the process is a change to the software, on your schedule. For an operation whose way of working is the advantage, that responsiveness is usually worth more than the build cost.

  • Knowledge moves from people into the system

    The most fragile thing in most operations is not the software, it is the undocumented expertise holding it together: the person who knows which orders need checking, which customers are exceptions, and what to do when the file does not arrive. Building the process into software forces that knowledge to be made explicit, argued about, and written down. The result is an organisation that survives a resignation, which is a quieter benefit than efficiency and often a larger one.

Why teams choose us for Custom Software Development

  • You want engineers who will tell you which parts you should buy rather than build, and who treat a smaller, better-integrated system as a better outcome than a larger invoice.
  • You want the expensive decisions (domain model, boundaries, integration contracts) made deliberately at the start by people who have lived with the consequences of getting them wrong.
  • You want working software in front of real users early and continuously, so you can change direction while it is still cheap, rather than a big-bang delivery you first see near the end.
  • You want to own the outcome completely: repositories, cloud accounts, IP and documentation, with a codebase written to be handed over rather than to make you dependent.

What Custom Software Development includes

The concrete pieces of work this covers, scoped to what your problem actually needs.

  • Domain modelling and architecture

    The most consequential work in a custom build is deciding what the concepts are, what they are called, where the boundaries sit and which part of the system owns which piece of truth. We do that with the people who run the operation, in their language, and write it down. Our default is a well-structured modular monolith with clear internal boundaries and one database, because it is faster to build, far easier to change while the model is still settling, and can be split later if it genuinely needs to be. We reach for separate services when there is a real reason (independent scaling, separate release cadence, a hard security boundary) and not because a diagram looks more impressive with more boxes in it.

  • Interface and workflow design

    Internal software is judged by how quickly a competent person can do their job in it, which is a different discipline from making something look good in a screenshot. We design around the actual task: the screens people live in all day, the keyboard-first paths for high-volume work, the states that are ambiguous, the errors that are recoverable, and the reporting that stops someone exporting to a spreadsheet again. Accessibility to WCAG 2.2 AA is designed in rather than remediated, both because it is the right default and because it is increasingly a procurement requirement.

  • Integration with the systems you already run

    Almost no custom system stands alone, and integration is where most of the real difficulty lives: an ERP or finance system that owns the truth, a CRM with its own idea of a customer, a payment provider, a carrier, a legacy application with a SOAP endpoint and strong opinions, or a partner who sends a file over SFTP at unpredictable times. We design these boundaries explicitly, with an anti-corruption layer so someone else’s data model does not leak into yours, and with idempotency, retries, dead-letter handling and reconciliation, because these integrations fail routinely and the system has to survive that rather than assume it away.

  • Data migration and the transition

    The part most consistently underestimated. Moving years of history out of spreadsheets, an ageing database or a product being retired means confronting duplicates, inconsistent identifiers, values that were never validated and records that only make sense to whoever entered them. We treat migration as engineering: scripted and repeatable so it can be run dozens of times, with reconciliation reports proving nothing was lost, and rehearsed against production-like data long before cutover. We also plan the transition itself, whether that is a parallel run, a phased cutover by team or region, or a big-bang switch with a rollback path.

  • Testing, delivery and operations

    We ship with an automated test suite weighted where it earns its keep, a pipeline that runs it on every change, and a deployment that is a routine push rather than an event. In production the system carries structured logging, metrics, error tracking and alerting, backups that have actually been restored in a rehearsal, and runbooks for the recurring operational realities. We run what we build during the engagement, which is the fastest way to find out whether it was built well, and we hand over an operations story rather than only a codebase.

Where it fits

  • Replacing the spreadsheet-and-inbox operation

    A business running a real operational process across shared spreadsheets, email threads and a few people who know the exceptions. We model the process properly, build the system that runs it with roles, validation, audit history and reporting, migrate the historical data, and phase the rollout team by team. The hardest part is rarely the software: it is making the tacit rules explicit and settling the disagreements that surface when you write them down.

  • A customer portal over a core system that is staying

    An organisation whose ERP, policy system or booking engine is not going anywhere but was never designed to be exposed to customers. We build the customer-facing product separately, integrate to the core through a deliberate boundary with caching and graceful degradation for when it is slow or down, and keep the ownership of truth where it belongs. The result modernises the experience without a high-risk replacement of the system the business runs on.

  • A product for a market no vendor serves properly

    A company whose sector is specific enough that the available software is either enormous and generic or thin and abandoned. Here the custom system becomes an asset rather than an overhead, sometimes an internal advantage and sometimes a product sold to peers. We build it to be extended, with the domain model, multi-tenancy questions and integration surface treated seriously from the start, because retrofitting those is expensive.

  • Rescuing or taking over a half-built system

    A codebase inherited from a previous team or agency that works well enough to be load-bearing and badly enough to be frightening. We start with an honest assessment: what is sound, what is salvageable, what must be replaced and what the actual risk is. Usually the answer is targeted repair, test coverage around the parts that matter, and incremental replacement of the worst areas, not the full rewrite that instinct suggests and that so often stalls.

How we approach Custom Software Development

We start by trying to talk you out of half of it. The first sessions establish what the software is actually for, which parts of the process are genuinely distinctive and which are commodity, and whether an existing product with a sensible configuration would serve you better for the commodity parts. That triage usually shrinks the build and improves it, because the effort concentrates on the workflows that are specific to you rather than being spread across reimplementing a calendar, a permissions system and a reporting tool that already exist. A smaller custom system that integrates well with bought software is nearly always a better outcome than a large one that reinvents it.

What remains is designed properly before it is built, then built in thin vertical slices. Design here means a domain model and a set of boundaries agreed and written down, not a document nobody reads: enough to make the expensive decisions deliberately, and no more. Then each slice is a complete, usable path through the system, deployed to a real environment and put in front of the people who will use it. You steer off working software rather than off a specification, which is the only reliable way to discover the requirements nobody thought to mention until they saw the thing.

How the engagement runs

We open with discovery, and the deliverable is as much what we will not build as what we will. We work through the process with the people who actually operate it, not only those commissioning the project, because the exceptions and the workarounds are where the requirements really live. We separate the commodity parts, which you should buy or integrate, from the distinctive parts worth building, and we size the first useful release honestly. If the conclusion is that a configured product plus a small integration would serve you better than a build, that is what we will tell you.

Then comes the architecture work, and it is deliberately front-loaded. Over a short, intense period we agree the domain model and the language for it, the boundaries inside the system, the integration contracts with everything it touches, and the data migration and cutover strategy. This is written down concisely so it can be challenged, and it is the last time in the project that these decisions are cheap. Everything after this is designed to be changeable; these few things are not, which is exactly why they get disproportionate attention.

Build proceeds in short cycles delivering thin vertical slices: complete paths through the system, deployed to a real environment, with tests and monitoring, in front of real users as early as the workflow allows. You review working software rather than a document, which surfaces the things nobody could have specified in advance and lets you change direction while it is still inexpensive. Scope is managed against a fixed budget by reordering what comes next, and we will say plainly when a request is worth less than what it would displace.

Release and handover are treated as engineering, not as an event. Migration is rehearsed repeatedly against realistic data, cutover is phased where the operation allows it, and there is a rollback path. Afterwards you get the documentation, the runbooks, the architecture decisions and, if you want it, a period of support while your own team takes ownership. The measure we hold ourselves to is whether your engineers, or engineers you hire later, can extend the system confidently without us.

How we architect a custom system

We put the domain model at the centre and keep it clean. The rules of your business live in one place, expressed in the language your people actually use, rather than being scattered across controllers, database triggers, front-end validation and scheduled jobs. That single decision does more for the long-term changeability of a system than any framework choice, because it means a change in policy is a change in one obvious place rather than a hunt across the codebase for every location where the rule was quietly reimplemented.

Our structural default is a modular monolith: one deployable application with strong internal boundaries between modules, one database, and a discipline about which module owns which data. This is faster to build, dramatically easier to change while the domain model is still settling, and far cheaper to operate than a distributed system. The industry has spent a decade learning that microservices trade local complexity for distributed complexity, and that the trade is only worth making for specific reasons: independent scaling of a genuinely hot component, teams that must release on separate cadences, or a hard security or regulatory boundary. When one of those applies we split; when none does, we do not, and clean module boundaries mean the option stays open.

At the edges, everything external gets a deliberate boundary. Integrations go through an adapter that translates the other system’s model into yours, so a partner’s odd field naming or a legacy system’s assumptions do not spread through your code. Anything that can fail (and integrations fail constantly) is built with timeouts, retries with backoff, idempotency keys on writes, dead-letter queues and reconciliation, so the system degrades in a defined way rather than losing work. Technology choices themselves are kept boring on purpose: mature frameworks, Postgres unless there is a specific reason otherwise, and a managed platform where it removes operational burden, because the interesting part of your system should be your domain, not your infrastructure.

Security, data protection and resilience

Custom systems usually end up holding the data that matters most, so the basics are built in from the first slice rather than added before an assessment. Authentication is delegated to a proper identity provider rather than hand-rolled, single sign-on where you use it, and authorisation is enforced server-side on every object against the authenticated user, in the data access layer where it cannot be bypassed. Broken object-level access control, where changing an identifier in a request returns someone else’s record, remains one of the most common serious flaws in business applications, and it is prevented by design rather than found by testing.

On data protection, we design for UK GDPR in practical terms: collecting only what the process needs, keeping personal data out of logs and non-production environments, encrypting in transit and at rest, applying retention and deletion rather than keeping everything forever, and keeping an audit trail of who saw and changed what. Delivery carries automated dependency and secret scanning so a known-vulnerable library or a committed credential is caught in the pipeline. Backups are configured, restored in a rehearsal and documented, because an untested backup is a hope rather than a control. Where you need formal assurance beyond good engineering, whether that is an independent assessment, a structured security review or evidence for a certification, our cybersecurity service covers that as separate, dedicated work.

Signs it’s time

  • Off-the-shelf tools force your team to work around them, and the workarounds have quietly become the process
  • Critical operations live in spreadsheets, shared inboxes and one person’s head, and that person is now a single point of failure
  • Systems that should talk to each other do not, so people re-key data between them and the reconciliation is done by hand at month end
  • You are growing and the manual layer is not scaling with you, so the answer keeps being another hire rather than better software

Fixed budget, variable scope

The traditional custom software contract fixes both scope and price, which sounds reassuring and produces the worst outcomes in the industry. It forces every requirement to be guessed in advance, before anyone has seen the software, and then makes changing any of them a commercial negotiation rather than a design decision. The result is a project where both sides spend their energy on the boundary of the specification instead of on the product. We work the other way: the budget and the dates are fixed, the scope is ordered by value and stays negotiable, and the highest-value work is always what happens next. If something new turns out to matter more than something planned, it moves up and something else moves down, in the open.

This only works if progress is real and visible, so working software in a live environment is the only unit of progress we recognise. Not a percentage complete, not a demo on a branch: the thing, running, that someone can use. It also depends on being willing to argue. A good engineering partner tells you when a requested feature will cost more than it returns, when a process should be simplified before it is automated, and when the right answer is to buy something instead. We would rather have that conversation in week three than build a well-made version of something you did not need.

Technologies we build it with

Chosen per problem, not per fashion. This is the stack we most often reach for on this work.

How we deliver

  1. 01

    Discover

    We map the system, the constraints and the business it serves, including the parts nobody documented.

    Architecture brief

  2. 02

    Architect

    Decisions get made, written down and defended before a line of production code exists.

    Decision records

  3. 03

    Build

    Short cycles against working software. You see progress in the product, not in a status deck.

    Shipping increments

  4. 04

    Operate

    Monitoring, incident response and iteration. The system is alive, so the engagement is too.

    Runbooks & SLOs

Want a straight answer on Custom Software Development?

A short call with a senior engineer, before you write a brief. If Custom Software Development is the wrong answer for your situation, we will say so and tell you what we think is right.

What changes

  • Software that fits the work

    A system shaped around how you actually operate, so the workarounds disappear rather than being formalised, and new people learn one process instead of one process plus its exceptions.

  • Systems that connect

    The tools you already run integrated deliberately, with the manual re-keying and month-end reconciliation removed rather than reduced.

  • An asset you own

    Code, infrastructure and IP in your accounts, documented well enough that your own engineers, or anyone you hire next, can take it forward without us.

Industries we serve

Domain knowledge changes what gets built. A few of the sectors we know before the first meeting.

How pricing works

  • A paid discovery first, almost always. A short fixed-scope engagement that produces the domain model, the architecture and integration approach, a sequenced scope with the build-versus-buy calls made, and a realistic budget range. It is the cheapest part of the project and it determines most of the cost of the rest. The output is yours whether or not we build it.
  • A fixed-scope, fixed-budget phase for a defined release, quoted after discovery, where the price and dates hold and the scope is prioritised and adjustable within them. This suits a first release with a clear shape, and it keeps the commercial conversation about value rather than about the wording of a specification.
  • A monthly senior engagement where the product keeps evolving, with the continuity of the people who built it. This is the right shape once software becomes part of how the business runs, because the work never really ends, and it avoids the pattern where a system is delivered, left to rot for a year, and then needs a rescue.
  • Third-party costs sit with you, not marked up through us: cloud hosting, SaaS subscriptions, licences and any commercial components are bought on your own accounts, in your name, so you see real invoices and keep the relationships. We size and explain the expected running cost during design rather than leaving it as a surprise after launch.

Typical timeline

  1. 01

    Discovery and scoping

    One to three weeks with the people who run the process, separating what to buy from what to build, sizing a first useful release, and surfacing the integration and data realities that decide most of the effort.

  2. 02

    Architecture and first slice

    Two to four weeks agreeing the domain model, boundaries, integration contracts and migration approach, and delivering the first complete vertical slice to a real environment with tests and deployment already in place.

  3. 03

    Iterative build

    Short cycles delivering usable functionality continuously, reviewed against the running system, with scope reordered as real use teaches you what matters. Integrations and migration work run alongside rather than being left to the end.

  4. 04

    Rollout, stabilisation and handover

    Rehearsed migration, a phased or fully reversible cutover, a period of close support while real volume arrives, then documentation, runbooks and the handover that leaves your team able to own it.

What working with us actually means

  • We will argue for buying instead of building

    The fastest way to waste a custom software budget is to rebuild things that already exist. We separate the commodity from the distinctive early and push you towards products and integrations for the former, which shrinks the build and improves the result. A consultancy unwilling to reduce its own scope is not giving you advice.

  • Senior engineers who have lived with their own decisions

    The people modelling your domain and setting the boundaries have maintained systems long enough to know which shortcuts turn into rewrites. That experience mostly shows up as restraint: fewer services, fewer frameworks, more attention to the data model and the integration contracts that are genuinely hard to change later.

  • We operate what we build

    Running the system in production during the engagement changes what gets built. Monitoring, backups that have been restored, sane failure behaviour in integrations and deployments that are routine all go in from the start, because we are the ones who feel it when they are missing.

  • Built to be handed over

    Your repositories, your cloud accounts, your IP, conventional technology, documented decisions and a codebase written for the next engineer. We would rather you stay because the work is good than because leaving would be expensive, and we say that knowing it is the easier claim to make than to honour.

How to engage us

Three ways to work with us on this, chosen to fit the problem, not our margin.

Services in this practice

The specific services that make up this practice.

Related terms

Weighing the options

The decisions people are usually making at the same time as this one.

Common questions

Should we build this at all, or buy something off the shelf?

Often you should buy, and we will say so. If the process is a commodity (accounting, payroll, helpdesk, standard CRM), a mature product will beat a custom build on cost, features and support, and no amount of dislike for the vendor changes that arithmetic. Custom software makes sense when the process is genuinely specific to you, when it is a competitive advantage rather than an overhead, or when the mismatch with available products is already costing you daily in workarounds and manual bridging. In practice the answer is usually a mixture: buy the commodity parts, build the distinctive ones, and invest properly in the integration between them. Working out where that line sits for you is the first thing discovery does.

Will you build it as microservices?

Almost certainly not, and you should be suspicious of anyone who says yes before understanding your system. Microservices solve organisational and scaling problems: teams that need to release independently, a component with genuinely different scaling characteristics, a hard security boundary. They do it by trading local complexity for distributed complexity, which means network failures between things that used to be function calls, harder debugging, harder data consistency and a much heavier operational burden. For most custom builds a well-structured modular monolith is faster to build, easier to change while the domain model is settling, and cheaper to run. We keep the internal boundaries clean so that if a part of the system later earns its own service, extracting it is a manageable piece of work rather than an archaeology project.

Who owns the code, and what happens if we want to bring it in-house?

You own everything: the source code, the intellectual property, the cloud accounts and the data, from the first commit rather than on final payment. The repositories are in your organisation, we work in them, and the deployment runs in your subscriptions. Bringing it in-house or moving to another supplier is a normal thing to plan for, so we build for it: conventional technology rather than anything exotic, documented architecture decisions, tests that let a new engineer change things safely, and runbooks that describe operating the system. Many clients keep us on a monthly engagement for continuity, and that should be a choice about value, not a consequence of being the only people who can understand the codebase.

How do you handle requirements changing mid-project?

By expecting it, because it is a sign the project is working. Nobody can specify a system accurately before seeing it used, and the requirements that emerge once people are working in real software are usually better than the ones written in advance. We fix budget and dates and keep scope prioritised and negotiable within them, so a genuinely more valuable request displaces something less valuable rather than triggering a change-request negotiation. What we do defend hard are the few architectural decisions taken at the start, because those are the ones that are expensive to reverse. Everything else is designed to move.

We have a much cheaper quote elsewhere. What accounts for the difference?

Usually seniority, ownership and what is included, and we would rather you compare on those than on the day rate. A quote built on junior developers working to a fixed specification can be genuinely cheaper and sometimes the right choice for well-understood, low-risk work. It tends to become expensive when the difficult parts arrive: the domain modelling, the integrations that fail in production, the data migration, the security and access control, and the operational work that only surfaces after launch. Our estimates include those because they are the parts that decide whether the system survives its second year. We will also tell you when your project genuinely does not need this level of engineering, which is a cheaper answer than discovering it after the fact.

Thinking about Custom Software Development?

Tell us the problem in your own words, not in requirements. A senior engineer reads it and comes back with a straight view on whether Custom Software Development is the right answer here, or what would be.

  1. 01A senior engineer reads it. Not a form queue, and not an account manager.
  2. 02We reply either with questions or with a straight answer that we are not the right fit.
  3. 03If it looks like a fit, a technical call with the person who would actually run the delivery.
  4. 04Then scope, effort and risk in writing, before anyone signs anything.

Two fields required. We reply to real enquiries. No list, no sequence.