Self-Service Terminals at National Scale
Built the TypeScript UI and channel service orchestration layer for in-branch self-service kiosks deployed across 880+ locations serving 24M+ customers.
Overview
I contributed to the development and ongoing technical support of self-service terminals deployed across the entire branch network of one of South Africa's largest retail banks. These in-branch kiosks handle account management, document generation, card services, and biometric verification for millions of customers daily.
My role spanned two key areas: building the TypeScript-based terminal UI and developing the channel service layer that orchestrates communication between the terminal front-end and backend product services.
Architecture
The SST platform follows a layered architecture separating presentation, orchestration, and domain logic.
Terminal UI Layer
Built in TypeScript for constrained kiosk hardware. Touch-optimised, minimal cognitive load, accessible for varying digital literacy levels, and fast rendering on limited hardware. Deliberately kept thin — presentation and input capture only, all business logic delegated to the channel service layer.
Channel Service Layer
The orchestration and resilience boundary:
- Request routing — directing terminal requests to appropriate product service endpoints
- Retry logic — configurable policies with exponential backoff to avoid cascading load
- Timeout management — strict timeouts per service call to prevent terminal hangs
- Response transformation — normalising responses into a consistent UI contract
- Session context — maintaining state across multi-step flows
Engineering Challenges
Resilience in a Physical Environment
A kiosk failure means a customer standing at a broken screen. The channel service handles downstream timeouts gracefully, provides meaningful fallback states, and ensures partial failures don't leave inconsistent state.
Network Variability
880+ branches, varying network conditions nationally. Timeouts tuned per service call type, retry policies balanced user experience against system load.
Hardware Integration
Card readers, biometric scanners, printers. Firmware inconsistencies across terminal batches and graceful handling when peripherals failed mid-interaction.
Technologies
| Front-End | TypeScript, touch-optimised kiosk UI |
| Orchestration | Channel service layer, retry policies, timeout management |
| Patterns | Exponential backoff, graceful degradation, session management |
| Integration | Card readers, biometric scanners, printers |
| Scale | 880+ branches, 24M+ customers |
Key Takeaways
The channel service pattern proved essential. By keeping the UI thin and centralising orchestration, we could evolve backend integrations without redeploying to every terminal.
Supporting at this scale sharpened diagnostic skills. When a terminal fails 1,000km away, you need robust logging, clear error taxonomies, and the ability to reason about failure modes from telemetry alone.