Background

On first launch, the desktop app asks the user for an email address, sends a confirmation email, and completes registration once the user clicks the link in that email. There was a trap here for anyone who closed the app before clicking the link.

Email does not always arrive immediately. Closing the app with the intention of clicking the link once the email shows up, then reopening later, is a perfectly natural way to use it. But on restart the app decided that registration was still incomplete and showed the first-launch screen (the email input) from the beginning. The user had to type their email address again.

That is where the second half of the trap sprang. Re-entering the address made the app call the registration endpoint on the server again, and the server issued a new verification token. The link in the email that had already arrived was now invalid. When the user finally clicked that first link, they got an "invalid link" error. Two traps, back to back.

Naming the symptom