I review a lot of websites. And the most expensive ones often perform the worst.
Not because the designers are bad — many are genuinely talented. The problem is a process gap: beautiful design gets shipped, and the "technical stuff" is supposed to happen later. Except it rarely does. And by then, the foundation is already wrong.
Let me break down exactly what's happening, with real metrics.
What "Beautiful but Broken" Actually Looks Like in the Browser
Here's the typical pattern I see:
- Full-screen hero video (uncompressed, autoplay)
- Smooth scroll animations using heavy JS libraries
- Custom fonts loaded from 3 different sources
- Images served as 4MB PNGs with no lazy loading
- Vague headline: "We Create Magic"
- No schema markup, no meta descriptions, no alt text
- Mobile nav hidden behind a tiny hamburger icon with no contrast
The Lighthouse score on a site like this?
Performance: 34
Accessibility: 51
Best Practices: 67
SEO: 52
The client paid £6,000–£12,000 for it. And it's invisible on Google.
The Core Technical Issues (And Why They Happen)
1. Images Are Still the #1 Killer
Most design-first websites skip image optimisation entirely. The designer exports from Figma or Photoshop, the developer uploads it as-is, and nobody checks.
What it should look like:
<!-- ❌ What most sites ship -->
<img src="/hero.png" width="1920" height="1080" alt="">
<!-- ✅ What it should be -->
<img
src="/hero.webp"
srcset="/hero-480.webp 480w, /hero-1024.webp 1024w, /hero-1920.webp 1920w"
sizes="(max-width: 600px) 480px, (max-width: 1200px) 1024px, 1920px"
alt="[Descriptive alt text for SEO and accessibility]"
loading="lazy"
width="1920"
height="1080"
/>
Using srcset + WebP + loading="lazy" can cut image payload by 60–80%. LCP improves dramatically.
2. Animation Libraries Add Serious Weight
I often see sites importing all of GSAP or Framer Motion for a single scroll fade. That's 50–150KB of JS for an effect that can be done natively:
/* ✅ Native CSS — zero JS, zero bundle weight */
@media (prefers-reduced-motion: no-preference) {
.fade-in {
opacity: 0;
transform: translateY(20px);
transition: opacity 0.4s ease, transform 0.4s ease;
}
.fade-in.visible {
opacity: 1;
transform: translateY(0);
}
}
// Tiny IntersectionObserver to trigger it
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) entry.target.classList.add('visible');
});
});
document.querySelectorAll('.fade-in').forEach(el => observer.observe(el));
Same visual effect. Zero library dependency. Respects prefers-reduced-motion as a bonus.
3. Heading Structure Is Broken (And It Destroys SEO)
Design-led projects treat headings as a visual choice. Developers sometimes follow the comp without questioning it.
Real example I've audited:
<!-- ❌ Typical design-first heading structure -->
<h1>We Create Magic</h1>
<h3>Our Work</h3>
<h2>Get In Touch</h2>
<h4>Services</h4>
This tells Google nothing. There's no keyword signal, no hierarchy, no structure.
What a functional heading structure looks like:
<!-- ✅ Functional AND clear to users -->
<h1>Web Design & SEO for Small Businesses in South East London</h1>
<h2>Our Services</h2>
<h3>Website Design</h3>
<h3>Local SEO</h3>
<h3>Performance Optimisation</h3>
<h2>Recent Projects</h2>
<h2>Get a Free Website Audit</h2>
One change. Enormous impact on both rankings and clarity.
4. No CLS Consideration = Bad Core Web Vitals
Designers export comps without layout dimensions. Developers implement them without specifying image/video dimensions. The result: massive Cumulative Layout Shift as assets load.
<!-- ❌ Causes CLS -->
<img src="/team-photo.jpg" alt="Our team">
<!-- ✅ Reserves space, prevents CLS -->
<img src="/team-photo.webp" alt="Our team" width="800" height="600">
Always set explicit width and height on images and iframes. The browser can then calculate aspect ratio before the asset loads.
The Real Gap: Where Does Responsibility Live?
Here's what the handoff often looks like:
| Role | Thinks they own |
|---|---|
| Designer | Visual output |
| Developer | Implement the comp |
| SEO person (if hired) | Keywords and content |
| Client | The results |
Nobody explicitly owns: performance, heading structure, mobile UX, Core Web Vitals, schema, image optimisation.
This isn't a blame game — it's a process failure. The fix is to define these responsibilities before the project starts, not after the site launches.
A Pre-Launch Technical Checklist I Use
Before any site goes live, I run through this:
Performance
- [ ] All images converted to WebP and properly sized
- [ ]
loading="lazy"on below-fold images - [ ] No render-blocking resources above the fold
- [ ] Critical CSS inlined, non-critical deferred
- [ ] Lighthouse Performance score ≥ 85 on mobile
SEO Foundation
- [ ] Logical H1 → H2 → H3 hierarchy with keywords
- [ ] Unique, descriptive meta titles and descriptions
- [ ] Alt text on all meaningful images
- [ ] Schema markup (LocalBusiness, FAQPage, etc.)
- [ ] robots.txt and sitemap.xml configured
Core Web Vitals
- [ ] LCP < 2.5s
- [ ] CLS < 0.1
- [ ] INP < 200ms
- [ ] Explicit dimensions on all images and videos
Mobile UX
- [ ] Tap targets ≥ 48px
- [ ] Text readable without zooming (≥ 16px base)
- [ ] No horizontal scroll
- [ ] CTA visible without scrolling on mobile
Conversions
- [ ] Clear primary CTA above the fold
- [ ] Phone number / booking link in header
- [ ] Trust signals visible (reviews, testimonials, accreditations)
- [ ] Contact friction minimal (one-click to call or form ≤ 3 fields)
What "Beautiful AND Functional" Actually Scores
When you combine strong design with this technical foundation:
Performance: 91
Accessibility: 97
Best Practices: 100
SEO: 98
That's the target. And it's completely achievable without compromising the design.
The Bottom Line for Developers
If you're a developer working with designers, push back (kindly) on:
- Unoptimised assets handed to you to "just upload"
- Vague headings used purely for visual effect
- Heavy animation libraries for simple effects
- Missing alt text and accessibility attributes
- No discussion of Core Web Vitals targets before delivery
The best websites aren't the ones that look fanciest. They're the ones that load fast, rank well, and convert visitors into customers.
Beauty is a multiplier — but only when the foundation is solid.
I'm Michael Adeleye, a software/web developer and local SEO specialist based in South East London. I help small businesses build websites that actually get found and convert. If you want a straight-talking audit of your site, reach out here.
Top comments (0)