Creating a website is like creating a product: you must know what problem you are solving, and you must think of a good design. You also face specific challenges related to the web platform.
A lot of thinking before even sketching
The developer must answer many questions before even starting to sketch the website. What will be the scope of the website? What will be the role of the website. What problem is it solving. Who is it for? Is it even worth it? What is the easiest way to do it? Who will maintain the website? Is a website enough? Does the website extend your business or simply brings it online?
Starting from scratch
The un-styled look of webpage is unacceptable for most uses, so it cannot be relied upon. There is no standard development kit for the web. You have the responsibility to pick a general style and make sure it's appropriate for the website. The styling must fit the needs of the client and be relevant to the targeted audience.
You either use a CSS framework that comes with pre-defined styles, or create it all from scratch. There is no ideal solution and there is no "best" style. This makes the task arduous.
Inconsistent and unpredictable results: the same code doesn't render the same on different browsers. You must test your website on all the main browsers to check for inconsistencies and try to hack your way out or simply give up on supporting all the browsers.
Mobile-first but desktop-friendly
You must target both mobile and desktop with one unique codebase. This causes complexity in the code as mobile and desktop have appearances of their own. Yet you only serve one version of HTML. CSS must do the heavy-lifting of finding out the device width and apply specific rules on desktop devices.
The big puzzle of third-party services integration
Most websites rely on third-party services to fulfil specific functions:
Content Management (CMS),
Authentication and more generally Back-end as a Service,
Integrating those services on your website is a non trivial task and requires specific consideration.