This returns {'ok', ne_binary()} | 'error', which will be bound into Timezone.

Might I suggest returning api_binary(), either the timezone or 'undefined' instead. You'll want to filter the list of values being set in L298 below.

Another idea is to just call get_user_timezone(AccountId, UserId) and have a clause:

get_user_timezone(AccountId, 'undefined') -> get_account_timezone(AccountId);
get_user_timezone(AccountId, UserId) ->...

Thoughts?