Firebase account deletion fails in two ways, and only one of them is visible. The documented one is requires-recent-login, thrown when the sign-in behind the delete call is too old. The quieter one is the order of operations: the app deletes the Auth user first, the cleanup that runs afterwards fails halfway, and no signed-in user is left to retry from. The data stays in your database with no account attached.
Make deletion a server-owned job. The app reauthenticates with a provider the account actually has, then calls one callable function. That function checks token freshness itself, because the Admin SDK can delete any user without a recent sign-in, and records the request in a transaction so a second tap returns the current status instead of starting another job.
Then delete application data first and the Auth user last. Every step has to tolerate a rerun. While the identity exists, a failed job is one the user can sign in and retry. Once it is gone, nothing can.