My team was building a web application for a client. During the new-business journey, the application collected a user's information. After 23 days, the client wanted an email to warn the customer that their cooling-off period was coming to an end.
The middleware responsible for this notification had several jobs. It needed to retrieve information from the database, send an API request that added a cooling-off document to the user's account, and trigger an email telling the customer that they had new correspondence.
It was difficult to keep the whole system in a stable state for long enough to perform this action. I therefore took a systems-thinking approach to understand why the middleware appeared to fail so often and how we could align all the subsystems before testing the document.
- 01Elapsed time
The customer had to reach day 23 of the cooling-off period.
- 02Customer data
The database needed the correct journey and account information.
- 03Middleware
The scheduled process had to find the customer and coordinate the work.
- 04Document API
An API request had to add the cooling-off document to the account.
- 05Correspondence
The updated account had to show that new correspondence was available.
- 06Email
The notification service had to tell the customer about the correspondence.
Why does the middleware keep failing?
What must be true across every subsystem at the same moment for the journey to succeed?
Taking a systems-thinking approach
The middleware could not be understood in isolation. A failed test might have been caused by its own behaviour, but it could also have come from time-dependent state, incomplete data, an unavailable API, an account update that had not completed, or a notification service that was not ready.
The testing problem was therefore to make the relationships visible: define the required state at each boundary, identify where that state could drift, and establish which conditions had to be controlled or observed before treating a failure as evidence of a middleware defect.
A component can look unreliable when the wider system is misaligned. Systems thinking shifts the focus from one failing component to the timing, state, dependencies, and information flows that produce the end-to-end outcome.