Creating a Stripe Subscription
Here is how you can use ExceptT:

  -- I hard-code the secret key, which I'm fine with for now
  let config = StripeConfig $ StripeKey "&lt;redacted&gt;"
  let stripe' :: (FromJSON (StripeReturn a))
              =&gt; StripeRequest a -&gt; ExceptT StripeError Handler (StripeReturn a)
      stripe' = ExceptT . liftIO . stripe config

  -- Here's where things get hairy...
  r &lt;- runExceptT $ do
    Customer {..} &lt;- stripe' createCustomer
    Plan {..} &lt;- stripe' $ getPlan (PlanId "PRO")
    stripe' $ createSubscription customerId planId
  case r of
    Left err -&gt; do
      setMessage $ toHtml $ show err
      redirect (AppR :#: ("subscribe" :: Text))
    Right _ -&gt; do
      setMessage "Subscription successful. Thanks!"
      redirect AppR


I used RecordWildcards so that the intermediate variables (e.g. cid and pid) aren't necessary. 
You'll also need to enable FlexibleContexts because of the way stripe is defined in the library.