Designing a Custom Terminal App

Systems Design
Client
Osprey EV Charging Network
Project type
Systems Design
Project year
May 2024 - March 2025

Problem Statement

Paying for EV charging relied on rigid, machine-led terminal flows that didn’t work well for drivers in real charging situations. The experience needed to be clearer, more forgiving, and work alongside the charger screen, while still being reliable enough to scale across thousands of locations.

Outcomes

I designed a custom payment app for Adyen-powered Payter terminals at Osprey charging points. The work covered payment flows, error handling, receipts, and session recovery, supported by a small, scalable design system. The app was tested on site and rolled out across thousands of EV chargers.
I designed a driver-first payment experience that made paying for EV charging clearer and less stressful in real-world conditions.
The custom terminal app handled edge cases like failed payments, interrupted sessions, and receipts more gracefully, reducing friction at a critical moment in the charging journey.
The work scaled across thousands of charging points, creating a more consistent and reliable payment experience across Osprey’s network.

Context

Osprey uses Adyen payment terminals to support contactless payment for EV charging. While Adyen handles the payment flow, the terminal has limited awareness of charger state, creating ambiguity during key moments such as starting and stopping a charge — particularly at sites where a single terminal serves multiple connectors.

This work explored how a custom terminal app could bridge that gap by aligning terminal UI states with backend and charger events. The focus was on defining a clear, reliable terminal experience within the constraints of Adyen hardware, fixed payment screens, and real-world connectivity issues, while supporting walk-up use without reliance on a mobile app.

Constraints

The terminal app had to work within the limitations of fixed hardware and alongside an existing charger screen, rather than replacing it. Designs needed to be clear and legible on a small display, handle multiple charging states, and remain reliable across thousands of locations. There was also a need to create a lightweight design system that could scale across terminals without becoming overly complex. Fixed Adyen payment screens cannot be modified Split-screen or dense layouts are impractical Terminal UX must work without assuming the user has a phone Offline scenarios (terminal vs charger) must be handled explicitly

Primary Challenge

The main challenge was helping drivers understand what was happening at the charger at a glance, especially when multiple charging sessions could be active at the same unit. The interface needed to clearly communicate availability, payment status, and next steps, while handling errors and interruptions without causing confusion or frustration.

Discovery

  • I started by reviewing the existing terminal payment flows to understand where drivers were getting confused, stuck, or slowed down.
  • I spent time testing the terminals in real charging environments, observing how people approached the charger, switched between the charger screen and the terminal, and reacted when things didn’t go to plan.
  • I worked closely with engineers to understand the technical constraints of the Payter terminals and how payment states, errors, and session data were handled behind the scenes.

To ground the work, I reviewed existing Wallbox and terminal-based charging flows from Osprey and other operators (including Kempower and Tesla for references).

The goal was to understand how payment terminals behave in real-world charging scenarios before proposing a custom terminal app.

These findings informed:

  • Which screens could be custom vs system-controlled
  • A simplified state model for the terminal
  • Clear separation between payment, instruction, and session status screens

No items found.

Design Goals

  • Define a clear terminal state model
    Establish a small, explicit set of terminal states that accurately reflect payment, charging, and session progress, including start, active, stop, and end conditions.
  • Align terminal behaviour with backend reality
    Ensure the terminal experience mirrors confirmed backend and charger states, avoiding mismatches between what the user sees and what the system is actually doing.
  • Support reliable start and stop of charging
    Design terminal flows that make it unambiguous how charging begins and ends, including scenarios where a single terminal controls multiple connectors.
  • Reduce ambiguity in constrained environments
    Create an interface that remains readable and usable on small screens, in poor lighting, and under time pressure, with minimal information per screen.
  • Account for operational edge cases
    Explicitly design for offline terminals, unavailable chargers, failed payments, and interrupted sessions so users always understand what has happened and what to do next.
  • Deliver a complete walk-up experience
    Enable drivers to complete the charging journey without relying on a mobile phone or prior setup.

Principles

  • Clarity over completeness
    The terminal prioritises clear system states and next actions rather than attempting to explain the full charging process on a constrained screen.
  • Single source of truth
    Charging behaviour is owned by the backend and charger. The terminal UI reflects confirmed states only, avoiding inferred or speculative feedback.
  • Focused interactions
    Each screen supports one primary action at a time, reducing error risk and confusion — particularly in dual-connector scenarios.
  • Designed for constrained environments
    The interface accounts for small screen size, glare, low lighting and limited input precision, favouring legibility and touch accuracy over density.
  • Explicit edge-case handling
    Offline states, unavailable connectors and simultaneous sessions are surfaced deliberately, preventing invalid actions rather than reacting after failure.
  • Device-independent by default
    The terminal experience is complete without relying on a mobile phone or companion app, supporting walk-up use in public settings.

Design Decisions

Streamlined Payment Flow

I wanted users to have a seamless and intuitive experience when initiating payments at the charging terminal. By simplifying the steps and making the payment process really clear, I reduced user confusion and made sure that even first-time users could get through it without any hassle.

Accessibility and Feedback Loops

Ensuring that the interface was accessible to all users in real world settings was key to the projects success. We conducted real world testing and designed with accessibility principles guiding the designs , so that the terminal app could be used comfortably by people with different levels of tech familiarity.

Receipt and Completion Options

At the end of the charging session, we wanted to make sure users had a simple and clear way to get their receipt. Offering a scannable QR code or an easy receipt process ensured a smooth wrap-up to the whole experience. By leaving the QR code on screen for up to a minute, we considered user context of retrieving their device ad being able to scan easily.

The Solution

I designed a custom terminal app that replaced rigid payment flows with a clearer, driver-first experience. By focusing on simplified data, predictable states, and robust error and recovery flows, the app worked smoothly alongside the charger screen and scaled across thousands of terminals. A small, purpose-built design system ensured consistency while remaining flexible enough to adapt to different charging scenarios.

Defined a terminal state framework
Mapped a finite set of terminal states (idle, payment, authorising, charging active, stop, summary, error) to backend and charger events, forming the foundation for all terminal UI behaviour.

Separated system-controlled and custom screens
Clearly distinguished between fixed Adyen payment screens and custom Osprey screens, reducing risk while maximising control where it was technically feasible.

Designed single-action terminal screens
Created focused screens with one primary action per state, reducing interaction errors and supporting fast, glanceable use.

Handled dual-connector scenarios explicitly
Designed clear rules for how a single terminal behaves when two connectors are in use, including session identification and stop-charging behaviour.

Introduced explicit offline and failure states
Added clear terminal feedback for offline terminals, unavailable chargers, and failed payments, preventing silent failures and user confusion.

Optimised for walk-up use
Ensured the terminal experience works end-to-end without requiring a phone or app, supporting first-time and public users.

No items found.

Learnings

Terminal UX is mostly about state management
The hardest part of the problem was not visual design, but defining a reliable state model that stayed in sync with backend and charger behaviour.

Payment terminals are not neutral surfaces
Adyen terminals impose fixed flows and constraints that meaningfully shape the user experience. Designing within those limits required early technical alignment rather than late-stage UI iteration.

Dual-connector setups multiply complexity quickly
What appears simple in single-connector scenarios becomes ambiguous when one terminal controls multiple sessions. These cases need to be treated as first-class, not edge conditions.

Offline scenarios drive real user frustration
Terminal and charger connectivity failures are common in the field. Making these states explicit was more valuable than attempting to mask them.

Constraints improved decision-making
Clear limits on screen size, modifiability, and available actions forced prioritisation and removed unnecessary UI complexity.

Early collaboration reduced rework
Working closely with engineering and payment providers during discovery prevented unrealistic designs and shortened iteration cycles later.

Let's work together

For enquiries about product design roles or collaborations, feel free to get in touch.

Some work is subject to confidentiality and can’t be shared publicly, but I’m happy to discuss further examples on request. I aim to respond within one business day.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.