You can't guarantee reliable pubsub messaging inside Redis. That's not what the feature is for. In fact, few pubsub systems offer that sort of reliability.
On the other hand, if you are willing to add a bit more, you might be able to get what you want. If each web client could be waiting on its own channel to receive its own "done" response, then what you're really looking for is point-to-point messaging, and/or you are looking for a concept in the task processing world called a "tombstone". The first one is easier to get, so I'll explain that one.
You want your client to be able to get the message when it's ready, and you don't want it to accidentally miss it. Solution: use Redis LISTs. You can have your web client BLPOP on a key that only it (and whatever is going to be sending "done") knows about (you can generate random keys for this, passing it to whatever will be sending "done"). Whatever would be sending the "done" message then RPUSHes the message to the key, while also setting the expiration time (say 30-60 minutes) to automatically clean up after itself if the web client never tries to fetch the message. That's it.
If this won't work for you, it would help if you might be able to give us more information about your specific problem, what you are trying to accomplish overall, etc.
Regards,
- Josiah