Case study / Self-initiated internal tool

Turning a 250 page PDF into a review clinicians can actually finish

Three disconnected files, one workspace, and a weekend prototype that engineering is now building on.

Role
Product Designer. Research, interaction design, prototype build
Company
Ultramed, pre-operative assessment software for NHS trusts
Team
Solo, with account managers, form builders and in-house clinicians
Status
Working prototype, handed to engineering as a proof of concept
The problem

Reviewing one questionnaire was exhausting a trust before they had even gone live.

Clinical teams had to work through 150+ questions in a 250 page PDF, log every change by hand in a separate spreadsheet, and check a third preview link to see what patients would get. One trust returned around 1,000 change requests for a single form. Roughly half were duplicates.

The outcome

One workspace, tested at 6.5 out of 7, now being productised by engineering.

A weekend prototype replaced all three artefacts with a single reviewable question list. It was adopted as a proof of concept, made a company objective, and handed to the engineering team as a working codebase rather than a spec.

The QuestFlow review workspace showing a questionnaire broken into five section cards, each with its question count, number of conditional questions, and review status, above a submit review bar.
QuestFlow. The questionnaire opens as five reviewable sections with the conditional logic surfaced up front, replacing a 250 page PDF, a spreadsheet and a preview link.

01 / Problem

Before a trust can go live, clinicians have to review 150+ questions across three files that do not talk to each other.

Every hospital trust customises the standard pre-operative questionnaire before launch: keep, remove or add questions, and confirm the conditional logic behaves the way their pathway expects. It is one of the first hands-on experiences a trust has with us.

That review was running across three disconnected artefacts:

  • A 250 page PDF exported from a legacy form builder, poorly formatted and near impossible to scan
  • A preview link showing what the patient would eventually see
  • An Excel sheet where every requested change had to be logged by hand
The starting point. Three artefacts, no shared state, all reconciliation done by email.
The PDF from hell. I would do anything to spare another team from this. Clinician, onboarding trust
250Pages in the exported PDF
150+Questions to review by hand
3Separate files per review
1,000Change requests from one trust, roughly half of them duplicates

What it actually cost

  • Delayed onboarding. Clinicians with full lists were asked to spend hours transcribing decisions into a spreadsheet
  • Noise instead of signal. One trust returned around 1,000 change requests for a single form. After filtering, roughly 500 were real
  • Email churn. The PDF never showed what a question did downstream, so account managers fielded long clarification threads
  • Commercial risk. A trust became reluctant to expand with us, citing the effort of getting one questionnaire through review

02 / Context

Nobody assigned this. I heard it in an all-hands and built something over the weekend instead of writing a proposal.

The feedback came up in passing when an account manager relayed it to the wider team. It sat outside my remit: the form builder was legacy backend, onboarding belonged to implementation, and there was no ticket for any of it.

So rather than argue for the work, I made something people could open.

The constraint I set myself: no change to the legacy form builder. Whatever I built had to consume what already existed, so adoption would never depend on a backend rewrite.

03 / Approach

The PDF treated a question as a line of text. It is closer to a small system.

A question can raise a clinical flag, trigger a system action, open a conditional branch, or carry patient-facing content, none of it visible in the export. That's why reviewers kept emailing to ask what a question did. The fix was to stop showing questions as text and start showing them as objects with their behaviour attached.

I built the prototype as a working tool in Claude Code, not a Figma flow, parsing the real CSV export so it had to survive messy real questions and stakeholders could use it instead of imagining it. And because clinicians needed low-effort review while account managers and form builders needed clean, de-duplicated output, most of the decisions here were about serving both without favouring either.

Anatomy of a question

Everything below the answer options was invisible in the PDF. Surfacing it is what removed most of the clarification emails.

A QuestFlow question card annotated to show its parts: the conditional banner showing the parent question that reveals it, the question text, a collapsible dropdown with additional patient-facing information, the answer options, the suggested tasks triggered by an answer, and the quick action menu for faster review.

Why this mattered

A clinician deleting this question in the PDF couldn't see it was also removing an ECG trigger and a report flag: the delete looked free. Showing that behaviour on the card turned deletion into an informed decision, and made the returned change requests safer for our clinical team to sign off.

Four versions, before it stuck

Built in code, so each version was tested against the real questionnaire, not a sample.

Question card

The bare MVP

Superseded once real feedback came in
  • Section, question type, and the characteristic tied to each option — nothing else
  • Built before any clinician or trust had a version to react to
Version 01 of the question card: a plain single-choice question with the answer options listed alongside their raw backend variable names, such as patient_is_male and patient_is_female.

Quick actions arrive

Superseded as more behaviour needed surfacing
  • Section, page, and conditional trigger logic now shown on the card
  • Bolder question text to stand out from the metadata
  • Three quick actions added: Mark as required, Delete, Approve
Version 02 of the question card: a conditional question showing which parent question and answer reveal it, the question text, and a free-text answer field, with no indication of what happens after it is answered.

Everything, all at once

Too much repeated information to stay usable
  • Badges, suggestion count, and suggested tasks added
  • Approve removed — questions assumed approved unless flagged
  • Add question and Add suggestion replaced Approve in the action bar
Version 03 of the question card: a required, conditional multi-select question with a suggested task attached to two of its options, shown inline in green beneath each checkbox.

Stripped back to what mattered

Kept — shipped as the version stakeholders reviewed
  • Removed everything Version 03 said twice: conditional status became a single badge top-left, required became a small marker in the question text itself
  • Same information as Version 03, without repeating it across the card
Version 04 of the question card: the shipped design, showing the conditional parent question, a collapsible more information dropdown, the answer options, a suggested task triggered by an answer, and the quick action menu.

What I built, and what I left out

The prototype existed to earn a decision, not to be complete.

In the weekend build

  • 01CSV import. No backend work, no dependency on anyone else.
  • 02Question cards with behaviour attached. The entire argument for the tool.
  • 03Quick actions with a reason. What replaces the spreadsheet.
  • 04Export in the existing format. The receiving team changes nothing.

Deliberately not yet

  • 05Real-time collaboration. Would've made it a build project, not a demo.
  • 06Auth and permissions. Needed for production, not for proving the concept.
  • 07Editing the questionnaire itself. Clinical sign-off stays with our clinical team.
  • 08Polish beyond the card. Spent the time on the screen the argument rested on.

04 / Solution

Three artefacts collapsed into one workspace, with the review decision captured where the question is.

Before: the same section of the questionnaire as a redacted PDF export page.
After: the same section of the questionnaire as QuestFlow question cards.
After Before

The same section of the same questionnaire, before and after. Drag to compare.

Feature 01

Question list and card view

Every question is navigable from a single list, with a card exposing the options, characteristics, logic and linked content the PDF hid.

Feature 02

Quick actions in place

Delete, mark required, add a question, add a suggestion. The decision is recorded on the question itself rather than retyped into a spreadsheet.

Feature 03

Export in the format the team already uses

The clinical team downloads the CASOD sheet the form builders work from, which removes the manual transcription step and the duplicates it produced.

Feature 04

One shared source per trust

Account managers and form builders maintain questionnaire versions in one place and share them with each incoming trust, so review stops happening across email.

The workspace. List, card and actions in a single view.

05 / Where it landed

Tested well, adopted as a proof of concept, now being productised by engineering.

6.5 / 7
Usability scores across 12 participants, covering comprehension of purpose, navigation between sections, understanding of an individual question card, and use of the quick actions. Tasks included adding suggestions, modifying existing questions, and adding new, similar questions.
Preferred
10 of 12 participants said they would rather review a questionnaire here than in Google Forms or Microsoft Forms.
Adopted
Taken on as a proof of concept and made a company objective. Engineering is now productising it from the working codebase, so developers can log in and see the intended behaviour instead of interpreting a static file.
On the numbers

The team estimates the review cycle can be cut by more than half. That is an internal projection rather than a measured result: the tool has not yet been through a full onboarding cycle with a live trust.

06 / What it changed beyond the tool

The bigger shift was how design hands work over.

01

Handover became a running build

Engineering picked up a working codebase rather than a Figma file, so behaviour and interaction were demonstrable instead of described.

02

A shared vocabulary for questions

Naming the layers of a question gave clinical, account management and engineering the same words for what a change request actually touches.

03

A route for unassigned problems

Building first and asking second turned out to be a faster way to test whether a problem was worth company time.

07 / Reflection

The strongest signal in this project was a throwaway quote in a meeting.

What I learned

Qualitative signal beats a ticket

"The PDF from hell" was not in a research report. Deciding it was worth acting on before anyone asked me to was most of the work.

What I learned

Building changed the design

Nested logic and the pull between clinician and account manager needs would both have been handoff surprises in a Figma-only process. In code they were design problems.

What I would change

Instrument first

I would measure the review cycle before the tool went live, so the improvement could be reported rather than estimated. I would also test with clinicians across more trusts, since customisation appetite varies widely.

What is still open

The real test has not happened

Whether the 500 genuine change requests become clearer and fewer, and whether the review that exhausted one trust becomes something the next one barely notices.