Why just do a plain update, relying on row level locking to serialize requests properly, and then just do an insert where not exists? Is there value in doing the delete? I don't see it.
Note- On conflict clause is supported from 9.5+ and that is already past EOL. Upgrading to at least v10 is recommended.