Page Speed SEO Issues
What This Means
Page speed refers to how quickly your web pages load and become interactive for users. Since 2010, Google has used page speed as a ranking factor, and with the 2021 Page Experience update, Core Web Vitals became critical ranking signals. Slow-loading websites rank lower in search results, lose visitors, and suffer reduced conversions.
Core Web Vitals
Largest Contentful Paint (LCP):
- Measures loading performance
- Time until largest content element renders
- Target: <2.5seconds
- Most important visible content appears
Interaction to Next Paint (INP):
- Measures interactivity and responsiveness
- Replaced First Input Delay (FID) in March 2024
- Target: <200 milliseconds
- How quickly page responds to user interactions
Cumulative Layout Shift (CLS):
- Measures visual stability
- How much content shifts during loading
- Target: <0.1- Prevents frustrating layout jumps
Additional Speed Metrics
First Contentful Paint (FCP):
- Time to first text or image
- Target: <1.8seconds
- First impression of speed
Time to First Byte (TTFB):
- Server response time
- Target: <800ms
- Server and network performance
Total Blocking Time (TBT):
- Main thread blocking time
- Target: <200ms
- JavaScript execution delay
Impact on Your Business
Search Rankings:
- Google uses Core Web Vitals as ranking factor
- Slow sites rank lower than fast competitors
- Mobile speed especially critical
- Page Experience signals affect visibility
User Experience:
- 53% of mobile users abandon sites taking >3 seconds
- Each second delay reduces conversions
- Slow sites frustrate users
- Higher bounce rates
Conversion Rates:
- Amazon: 100ms delay = 1% revenue loss
- Google: 500ms delay = 20% traffic loss
- Walmart: 1s improvement = 2% conversions
- Speed directly impacts bottom line
Mobile Performance:
- Mobile-first indexing prioritizes mobile speed
- Mobile users have less patience
- Slower networks magnify speed issues
- Mobile commerce increasingly dominant
Competitive Advantage:
- Fast sites outrank slow competitors
- Better user engagement
- Higher customer satisfaction
- Improved brand perception
How to Diagnose
Method 1: Google PageSpeed Insights (Recommended)
- Visit PageSpeed Insights
- Enter your URL
- Run test for both Mobile and Desktop
- Review Core Web Vitals:
- LCP (Largest Contentful Paint)
- INP (Interaction to Next Paint)
- CLS (Cumulative Layout Shift)
- Check "Field Data" (real user data from Chrome)
- Review "Lab Data" (simulated test results)
What to Look For:
- Red metrics (poor performance)
- Core Web Vitals failures
- Specific optimization opportunities
- Mobile vs desktop performance gaps
Method 2: Google Search Console
- Log into Google Search Console
- Navigate to "Experience" → "Core Web Vitals"
- Review URL performance:
- Poor (red)
- Needs Improvement (yellow)
- Good (green)
- Check Mobile and Desktop tabs separately
- Click "Open Report" for details
What to Look For:
- Pages failing Core Web Vitals
- Trends over time
- Mobile vs desktop differences
- Specific URLs needing fixes
Method 3: Lighthouse Audit
- Open your page in Google Chrome
- Right-click → Inspect → Lighthouse tab
- Select:
- Categories: Performance
- Device: Mobile and Desktop
- Click "Analyze page load"
- Review Performance score and metrics
What to Look For:
- Performance score <90 - Core Web Vitals in red
- Opportunities (biggest improvements)
- Diagnostics (detailed issues)
Method 4: WebPageTest
- Visit WebPageTest.org
- Enter your URL
- Select:
- Run test
- Review detailed waterfall chart
What to Look For:
- TTFB >800ms
- Render start time
- Fully loaded time
- Number of requests
- Total page size
- Render-blocking resources
Method 5: Real User Monitoring (RUM)
Use analytics to track real user data:
Chrome User Experience Report (CrUX):
- Public dataset of real Chrome users
- Powers PageSpeed Insights field data
- Shows actual user experience
-
- Track Web Vitals with custom events
- Segment by device, location, browser
- Monitor trends over time
Third-party RUM tools:
- Cloudflare Web Analytics
- New Relic
- Datadog
- SpeedCurve
What to Look For:
- 75th percentile metrics
- Real user experience vs lab tests
- Performance by geography
- Mobile vs desktop real data
- Performance trends
General Fixes
Fix 1: Optimize Images
Images are the #1 cause of slow pages:
Compress images:
# Use tools like: # - TinyPNG, Squoosh, ImageOptim # - Target: <100KB per image # - Hero images: <200KBUse modern formats:
<picture> <source srcset="image.avif" type="image/avif"> <source srcset="image.webp" type="image/webp"> <img src="image.jpg" alt="Description" width="800" height="600"> </picture>Implement lazy loading:
<!-- Don't lazy load LCP image --> <img src="hero.jpg" alt="Hero" loading="eager"> <!-- Lazy load below-fold images --> <img src="product.jpg" alt="Product" loading="lazy">Use responsive images:
<img src="image-800.jpg" srcset="image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w" sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px" alt="Description">
Fix 2: Minimize and Defer JavaScript
Reduce JavaScript blocking:
Defer non-critical JavaScript:
<!-- Bad - blocks rendering --> <script src="analytics.js"></script> <!-- Good - deferred --> <script src="analytics.js" defer></script> <!-- For non-dependent scripts --> <script src="social-widget.js" async></script>Inline critical JavaScript:
<!-- Inline small critical scripts --> <script> // Critical functionality here // Keep under 1-2KB </script>Remove unused JavaScript:
# Use Chrome DevTools Coverage tab # Identify unused code # Remove or code-split unused librariesCode splitting:
// Load code only when needed button.addEventListener('click', async () => { const module = await import('./feature.js'); module.init(); });
Fix 3: Optimize CSS Delivery
Eliminate render-blocking CSS:
Inline critical CSS:
<head> <style> /* Critical above-fold CSS */ /* Extract using tools like Critical */ body { margin: 0; font-family: sans-serif; } header { background: #333; color: white; } /* Keep under 14KB */ </style> </head>Defer non-critical CSS:
<!-- Load non-critical CSS async --> <link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'"> <noscript><link rel="stylesheet" href="styles.css"></noscript>Remove unused CSS:
# Use PurgeCSS or similar tools # Remove framework CSS not being used # Minify remaining CSS
Fix 4: Leverage Browser Caching
Cache static resources:
Set cache headers:
# Nginx location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2)$ { expires 1y; add_header Cache-Control "public, immutable"; }# Apache .htaccess <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 year" ExpiresByType text/javascript "access plus 1 year" </IfModule>Use cache versioning:
<!-- Version or hash in filename --> <link rel="stylesheet" href="styles.v2.css"> <script src="app.a3f2b1.js"></script>
Fix 5: Enable Compression
Compress text-based resources:
Enable Gzip or Brotli:
# Nginx - Brotli brotli on; brotli_comp_level 6; brotli_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss; # Nginx - Gzip fallback gzip on; gzip_vary on; gzip_comp_level 6; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss;# Apache .htaccess <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/json </IfModule>
Fix 6: Reduce Server Response Time (TTFB)
Optimize server performance:
Use a CDN:
<!-- Content Delivery Network --> <!-- Cloudflare, AWS CloudFront, Fastly --> <!-- Serves content from edge locations -->Optimize database queries:
-- Add database indexes CREATE INDEX idx_user_email ON users(email); -- Cache frequent queries -- Use Redis or MemcachedEnable server-side caching:
// PHP - page caching example $cache_file = 'cache/page.html'; $cache_time = 3600; // 1 hour if (file_exists($cache_file) && time() - filemtime($cache_file) < $cache_time) { readfile($cache_file); } else { ob_start(); // Generate page $content = ob_get_contents(); ob_end_flush(); file_put_contents($cache_file, $content); }Upgrade hosting:
- Move from shared to VPS or dedicated
- Use SSD storage
- Increase PHP memory limit
- Enable OpCode caching
Fix 7: Optimize Core Web Vitals Specifically
Fix LCP (Largest Contentful Paint):
Optimize LCP element:
<!-- If hero image is LCP element --> <link rel="preload" as="image" href="hero.jpg"> <img src="hero.jpg" alt="Hero" loading="eager" fetchpriority="high">Reduce render-blocking resources
Improve server response time
Use CDN for LCP resources
Fix INP (Interaction to Next Paint):
Reduce JavaScript execution:
// Break up long tasks async function processLargeArray(items) { for (let i = 0; i < items.length; i++) { processItem(items[i]); // Yield to main thread every 50 items if (i % 50 === 0) { await new Promise(resolve => setTimeout(resolve, 0)); } } }Defer third-party scripts
Optimize event handlers
Use web workers for heavy processing
Fix CLS (Cumulative Layout Shift):
Set dimensions on media:
<!-- Always include width and height --> <img src="photo.jpg" alt="Photo" width="800" height="600"> <video width="640" height="360" src="video.mp4"></video>Reserve space for ads:
.ad-container { min-height: 250px; /* Reserve space */ }Avoid inserting content above existing content
Use CSS transforms for animations:
/* Good - doesn't cause layout shift */ .element { transform: translateY(10px); } /* Bad - causes layout shift */ .element { margin-top: 10px; }
Fix 8: Implement Resource Hints
Help browser load resources faster:
DNS prefetch:
<!-- Resolve DNS early for third-party domains --> <link rel="dns-prefetch" href="https://fonts.googleapis.com"> <link rel="dns-prefetch" href="https://www.google-analytics.com">Preconnect:
<!-- Establish connection early --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>Preload:
<!-- Load critical resources early --> <link rel="preload" as="font" href="font.woff2" type="font/woff2" crossorigin> <link rel="preload" as="image" href="hero.jpg"> <link rel="preload" as="style" href="critical.css">Prefetch:
<!-- Load resources for next page --> <link rel="prefetch" href="/next-page.html">
Platform-Specific Guides
Detailed implementation instructions for your specific platform:
| Platform | Troubleshooting Guide |
|---|---|
| Shopify | Shopify Page Speed Guide |
| WordPress | WordPress Page Speed Guide |
| Wix | Wix Page Speed Guide |
| Squarespace | Squarespace Page Speed Guide |
| Webflow | Webflow Page Speed Guide |
Verification
After implementing speed optimizations:
PageSpeed Insights:
- Re-run tests
- Verify Core Web Vitals improved
- Check score increased
- Monitor Field Data changes (takes time)
-
- Wait 28 days for data update
- Check Core Web Vitals report
- Monitor URL status changes
- Track poor → good transitions
WebPageTest:
- Re-run tests
- Compare before/after waterfalls
- Verify load time reduced
- Check filmstrip view
Real user monitoring:
- Track actual user metrics
- Monitor 75th percentile
- Check different locations
- Verify mobile improvements
Business metrics:
- Monitor bounce rate
- Track conversion rate
- Check time on site
- Review revenue impact
Common Mistakes
- Only testing desktop - Mobile speed more critical
- Ignoring field data - Lab tests don't show real experience
- Lazy loading LCP image - Delays most important content
- Too many third-party scripts - Slow down entire page
- Not compressing images - Biggest performance killer
- Render-blocking CSS/JS - Delays page rendering
- No CDN - Slow server response times
- Missing cache headers - Repeat visitors load slowly
- Unoptimized fonts - Web fonts block rendering
- Layout shifts from missing dimensions - Hurts CLS
Page Speed Checklist
Images:
- All images compressed (<100KB typically)
- Modern formats (WebP/AVIF) implemented
- Responsive images with srcset
- Lazy loading on below-fold images
- LCP image optimized and preloaded
- Dimensions specified (width/height)
JavaScript:
- Defer non-critical JavaScript
- Unused JavaScript removed
- Code splitting implemented
- Third-party scripts minimized
- Main thread work reduced (<200ms TBT)
CSS:
- Critical CSS inlined
- Non-critical CSS deferred
- Unused CSS removed
- CSS minified
- No render-blocking stylesheets
Server:
- TTFB <800ms
- Compression enabled (Brotli/Gzip)
- CDN implemented
- Cache headers configured
- Database optimized
Core Web Vitals:
- LCP <2.5s
- INP <200ms
- CLS <0.1- [ ] All metrics pass in GSC