A beautiful website can still be a bad one, because design gets reviewed in its best state and used in its worst.
Mockups are built with ideal content and a perfect connection: the short product name, the item in stock, the payment that goes through, the photo that uploads in one second. Real traffic brings the other half. A name that wraps to three lines. A category with nothing in it yet. A card that gets declined. A phone down to one bar of signal. An upload that dies at 80 percent.
If those states were not designed, they were not removed either. The code just falls back to whatever the framework does by default. A blank rectangle. A spinner with no end. A line of technical text the visitor was never meant to read. And the better the happy path looks, the sharper the drop feels when someone lands in one of those moments, because the site has already promised that it is well run.
So when we review a design with a client, we ask for the unhappy states before we agree on the pretty ones: what this screen shows when it is empty, when it is loading, when the text is twice as long as expected, when the action fails. It is a short conversation, and it probably decides most of what people will actually experience.
When something goes wrong on your site, the page either explains it or goes quiet. That gets decided either way, by you or by the framework default.