Complex systemsB2BResearch-ledPrototyping

100% task completion on a mission-critical trade platform

Before designing a single screen, we mapped every dependency. That decision shaped everything that followed.

Duration
2021 – 2022
Year
2022
Outcome: 100% task completion rate on the core declaration journey
100% task completion on a mission-critical trade platform cover

Overview

NCTS5 — the New Computerised Transit System — facilitates the movement of goods between the UK, Northern Ireland, the EU, and other partner transit countries. The deep cross-border data requirements drive complex business logic and validation rules for every single transit movement.

The service was used by freight forwarders, customs agents, and traders to declare goods in transit across international borders. Each declaration contained nested data structures, conditional logic, and interdependencies that could change based on a user’s answers at any point in the journey.

The stakes were high. Errors in declarations have real consequences: delays, fines, goods held at border. The users were domain experts — professionals who understood international trade law — but the interface was making their expertise irrelevant by failing them at the interaction level.

We were brought in as Phase 5 of the programme: a significant redesign of the most complex parts of the service, working alongside a development team building the live product in parallel.

The ecosystem: a sprawling web of stakeholders

The service sits at the intersection of countless stakeholders. Internal dependencies involve HMRC, Border Force, and legacy government gateways. External users range from individual traders to massive hauliers and third-party software developers. Every UI decision ripples across this map.

NCTS Service Ecosystem

The Common Transit procedure spans borders and jurisdictions — any change to a pattern, a validation rule, or a journey structure had downstream consequences across the entire ecosystem. Understanding that landscape before starting design work was not optional. It was foundational.

Mapping the territory before touching a tool

The first thing we did was not open a design tool. Before any wireframe, any component, any prototype, we built two artefacts that would guide every decision that followed.

Service map first. We mapped the landscape: who the users were, what they needed to accomplish, how the service connected to upstream and downstream systems, what the regulatory dependencies were. This gave the whole team a shared picture of the territory before anyone started drawing paths through it.

Then The Model. A formal diagram of every information dependency and branching condition in the service. Which questions triggered which others. Which answers changed what a user would see later. Where conditional logic meant two users completing the “same” journey might follow entirely different paths.

The complete system revealed a dense architectural logic: sprawling decision trees dictating Route Details, Guarantee, and declaration data for every movement across multiple jurisdictions.

The Model — full system overview

The Model — Trader Details dependency flow

The Model — Guarantee journey

The Model — House Consignments, longest model

The Model became the guide to building an accurate, fully functional prototype. Without it, we would have been prototyping assumptions rather than the actual service. With it, every prototype screen was grounded in the real dependency structure.

Design philosophy: shielding users from systemic complexity

The primary design objective was cognitive relief. We took the fragmented, multi-stakeholder legal requirements and distilled them using the GOV.UK “One Thing Per Page” philosophy.

The interface acts as a protective layer — guiding traders through the labyrinth one simple question at a time. The system’s complexity is real and unavoidable; the user’s experience of that complexity is not.

The pre-task list: orienting before starting

Before anything else, users needed orientation: what they were about to do, what information they would need, and what the shape of the journey looked like. The pre-task list answered those questions before asking for input.

Homepage and pre-task list entry

Declaration type selection

Procedure type selection

Local Reference Number input

The LRN — Local Reference Number — is the anchor for the entire declaration. We handled the error state carefully: clear indication of what went wrong, direct link back to the field, no loss of prior input.

LRN error state

The office of departure journey required conditional logic based on the user’s location and route. Three sequential screens resolved what a less considered design would have collapsed into a single confusing question.

Office of departure — step 1

Office of departure — step 2

Office of departure — step 3

TIR Carnet and Security Details completed the pre-task list — each handled as an isolated, single-purpose question.

TIR Carnet

Security details

The iteration that got to 100%

Midway through the programme, we encountered a specific problem that illustrates exactly how this kind of design work goes.

At the start of the declaration journey, after five to seven questions, the service reaches a point of no return. The user cannot amend previously confirmed information. This is a genuine constraint of the underlying system — not a design choice. The question was: how do you communicate that to a user who has just spent ten minutes providing data?

Round one: We added a paragraph beneath the relevant heading explaining the constraint. Clear, accurate, appropriately placed. Six out of six users in testing missed it entirely. Not one person noticed.

First iteration — simple paragraph with heading

Round two: We escalated to warning text: bold, with a prominent icon, styled to stand out from the surrounding content. Five out of six users missed it. One noticed. One.

Second iteration — warning text with exclamation icon

Round three: We replaced it with a full notification banner — the kind used for high-priority information — styled in an experimental blue that stood outside the normal palette. Six out of six users saw it. Task completion: 100%.

Final iteration — important notification banner

The lesson was precise: the design failed twice before it succeeded. Not because the information was wrong, but because the visual weight wasn’t earning the attention the content needed. Focusing on the macro interaction — the gestalt of the page rather than an individual element — gave us the solution.

Trader details: progressive disclosure across a complex journey

The Trader Details section is where the system’s dependency complexity hits users hardest. Within the broader system, capturing this data requires navigating a web of dependencies: whether a user knows their EORI number, whether they are representing themselves or acting as an indirect representative, and what specific legal capacities they hold.

The design principle: progressive disclosure. Instead of demanding an alphanumeric code upfront, the flow begins by establishing knowledge. “Do you know the transit holder’s EORI number?” Only if they answer yes are they asked to provide it. This prevents errors and unnecessary friction for users who might not have that information immediately at hand.

Do you know the transit holder's EORI number?

Enter the transit holder's EORI number

Transit holder name

Transit holder address

Do you want to add a contact for the transit holder?

Managing error states with absolute clarity. When a user encounters a problem, the interface provides immediate, clear guidance. The error summary box prominently lists “There is a problem” and links directly to the missed interaction, ensuring users can recover quickly without losing their place or their confidence.

Error state — validation message and summary

Contact name

Contact phone number

Defining legal capacity and representation. Traders often act on behalf of others. The interface seamlessly forks the journey by asking “Are you acting as a representative?” followed by a clear choice between direct representative (acting in the name of another) and indirect representative (acting in their own name but on behalf of another).

Are you acting as a representative?

Your EORI number

Your name

What is your capacity? Direct or Indirect representative

Your contact number

Adapting for approved operators. The logic accounts for users with special statuses: approved airline, shipping, or rail freight operators. By asking “Do you want to use a reduced data set?”, the system actively looks for opportunities to shorten the declaration process for trusted entities.

Do you want to use a reduced data set?

Consistent patterns for Consignor and Consignee data. As the journey moves to capturing Consignor details, the familiar progressive disclosure pattern repeats. The user is asked if they know the Consignor’s EORI, followed by their name and address. This consistency reduces cognitive load as the user moves deeper into the form.

Do you know the consignor's EORI number?

Consignor EORI number input

Consignor name

Consignor address

Branching choices for optional contact details. “Do you want to add a contact for the consignor?” creates a clean branch in the logic. If yes, the user is smoothly guided to input the contact’s name and international telephone number.

Do you want to add a contact for the consignor?

Consignor contact name

Consignor contact number

Managing looping logic for multiple consignees. Transit movements frequently involve multiple destinations or recipients. “Is there more than one consignee?” elegantly triggers a looping sequence in the background logic, allowing users to add as many entities as necessary without needing a complex grid or table interface.

Is there more than one consignee?

Do you know the consignee's EORI number?

Consignee EORI number input

Consignee name

Consignee address

Providing cognitive relief at the end of the flow. The “Check your answers” screen gathers the fragmented, step-by-step inputs into a single comprehensive view. Here, the user can review their EORI, representative status, consignor, and consignee details with clear “Change” links — providing confidence before submission.

Check your answers — Trader Details summary

The final output transforms an overwhelming bureaucratic requirement into a clean, actionable task list. The Trader Details section is marked as a confident “COMPLETED”, while subsequent tasks like Route and Transport are clearly signposted — getting users ready for the everyday work of international trade.

Declaration summary — task list with Trader Details completed

The Guarantee journey

The guarantee section handled one of the more technically complex sub-problems: different guarantee types, each with their own validation paths and data requirements.

Guarantee — step 1

Guarantee — step 2

Guarantee — step 3

Guarantee — step 4

Guarantee — step 5

Guarantee — step 6

Guarantee — step 7

Guarantee — step 8

The routes sub-journey within the guarantee section was the final major challenge — and in some ways the most technically demanding prototype work of the project. Different combinations of route type, transport mode, and border crossing points created a decision tree with dozens of valid paths, each producing different subsequent screens.

Routes — configuration step 1

Routes — configuration step 2

We modelled this dependency tree first, then built the prototype routing logic using conditional arrays and nested if/else statements in the route configuration. When the prototype was working accurately, we took it to research. When research confirmed it held up, we handed the logic over to the development team as a reference implementation.

A/B testing the dashboard

For the save-and-retrieve functionality, we built multiple dashboard variants and created a dedicated research landing page to test them. Users navigated to whichever variant they were assigned. The results informed a design decision that would otherwise have been made on instinct.

Dashboard variant A

Dashboard variant B

Outcomes

100% task completion on the declaration journey. The most complex, dependency-heavy, multi-party journey in the service achieved a 100% task completion rate in user research.

Service map and dependency model adopted. Both became team-wide reference documents, consulted throughout the programme.

Validation framework adopted. Other prototype teams adopted the four-level validation framework: branching logic, data passing between pages, conditional display logic, and proper error handling.

Pair session shared. The recorded pair-programming session on the routes sub-journey was shared across the design community as a reference resource.

The work ran from landscape mapping in April 2022 through to completion in September 2022: five months from first principles to a tested, research-validated prototype of a mission-critical system.