I have often seen the general rule of thumb be 30 block confirmations. Is this adequate or is it better to count to 900 endorsements or use some other more complicated approach to determining confidence in the finality of a transaction?
It is better (although more complex) to use fitness/endorsements. 900 fitness/endorsements is roughly 30 "normal" blocks (i.e. blocks with close to full endorsements), which is a simpler rule of thumb for users to remember and check.
The difference would be if the past 30 blocks have very low endorsements/fitness - this would make a chain-split in the past a higher probability. Confirming after just "30 blocks" is more riskier in my opinion.
If you can monitor the fitness/endorsement difference, I would use that.
Tezos current protocol (003) achieves probabilistic finality after a recommended time of 30 confirmations which reduces the chances of the transaction being impacted by a reorg.