Handling bill cancellation
To be honest, your original implementation of cancelBills looks pretty good - it's very focused and is fairly easy to understand what it's doing even without much context.
If you really want to write the function as a single chain of functions then your alternative version is most of the way there. I'd consider replacing the last three functions in the chain with a single Result.asyncBind function to simplify it somewhat, i.e.
module Result  =
    let asyncBind (asyncBinder: 'T -&gt; Async&lt;Result&lt;'U, 'TError&gt;&gt;) (result: Result&lt;'T, 'TError&gt;) =
        match result with
        | Result.Ok value -&gt; asyncBinder value
        | Result.Error error -&gt; async { return Result.Error error }

This is effectively just an async equivalent of the built-in Result.bind, so shouldn't add much overhead when reading the code and should be fairly re-usable if you're piping Result and Async around a lot. That being said, if you're not going to be re-using Result.asyncBind (or your equivalent function chain) then just stick with your original implementation of cancelBills!