Lack of liquidity almost never, we got a lot better in managing our liquidity over the past months :)
It's usually due to constraints on Lightning, depending on the direction:
Chain -> Lightning: usually user doesn't have enough inbound capacity (usually personal nodes) or LSP fails to open channel on the fly for X,Y,Z reason (mobile wallets like Phoenix) or route to user is more expensive than our fee threshold (happens when sending to very popular high volume destinations like CEXes) OR some other mobile wallet or implementation-specific weirdness. But for most weirdness we have workarounds in the code by now. If it fails though, users have to go through a refund process and since this is a pain we are constantly improving things on this front.
Lightning -> Chain: if user doesn't manage to route the required amount to us, no biggie. Nothing happened. If user managed to route and we ran out of liquidity (almost never happens as mentioned above), lightning payment just bounces back. So this direction is less problematic.