CASE() is not well-suited to this type of work (sorting a single number into one of a number of buckets). The function just can't work with booleans in the way we would need here.
The documentation on the CASE() function suggests using
IF() to return numbers instead, but at that point you're pretty much using
IF() to do the real work instead. It starts to make sense to cut out the middleman.
The good news is that what you've shared with us is at least 80% of the way to just using nested
The other issue you have here is a hole in donation amount ranges.
When you check
Total_Donations__c < 4999.99 and
Total_Donations__c > 5000.00, you're missing the scenario where the total donations are exactly 5000.00. The way math/logic works, the opposite of
One other thing to note is that if you fail the check for
Total_Donations__c < 4999.99, you can assume that it is greater than or equal to 5000.00. There is no need to explicitly check that.
So putting that all together, you'd end up with
/* IF() always takes 3 arguments */
/* the condition, the value when the condition is true, the value when the condition is false */
/* By chaining additional IF(), we can make an if-else if-else */
AND(Total_Donations__c > 1000.00, Total_Donations__c < 5000.00),
Total_Donations__c < 10000.00,
Total_Donations__c < 25000.00,
/* and so on */
Do keep in mind that donation totals less than 1000 would also fail all of the
IF() conditions and end up spitting out "Level 5" for you. I doubt that's what you want, so you'll need to do something to handle that scenario too.