There are many reasons an app install to a mobile device can fail. When the user tries to install again, the JSS doesn't even attempt it, because of the previous failure. I'm not sure why this is the behavior, I am continually having to clear failed commands so the user can attempt the install again.
The JSS should automatically delete failed app install errors if an install request is initiated through Self Service. I suggest a one or two minute timeout between an error and a reinstall to account for network delays.