In Nigeria, where 70% of web traffic comes from mobile devices on 3G/4G connections, every second of load time matters. Research shows:
53%
of mobile users abandon sites that take >3 seconds to load
-7%
conversion drop for every 1-second delay in page load
+32%
increase in conversions when load time drops from 5s to 2s
Below, we'll walk through 12 proven fixes with implementation details, before/after metrics, and a real Nigerian e-commerce case study.
Understanding Core Web Vitals
Google uses these 3 metrics to rank websites. Poor scores = lower search rankings + fewer conversions.
LCP (Largest Contentful Paint)
How fast the main content loads
Target: <2.5s | Poor: >4s
INP (Interaction to Next Paint)
How fast clicks/taps respond
Target: <200ms | Poor: >500ms
CLS (Cumulative Layout Shift)
Visual stability (no jumping content)
Target: <0.1 | Poor: >0.25
The 12 Speed Fixes (Ranked by Impact)
1. Compress and Resize Images
Impact: -40% page weight, -2.1s LCP on average
Images account for 60-80% of page weight on Nigerian e-commerce sites. Most use unoptimized JPEGs at 2-5MB each.
Implementation:
- Use AVIF/WebP: 30-50% smaller than JPEG with same quality (use
image/avif, image/webpwith JPEG fallback) - Serve responsive sizes:
<img srcset="hero-400.avif 400w, hero-800.avif 800w" /> - Lazy-load below fold:
loading="lazy"on images not in viewport - Tools: Squoosh.app, Cloudinary, ImageOptim
❌ Before
Hero image: 4.2MB JPEG | LCP: 6.8s on 3G
✅ After
Hero image: 180KB AVIF | LCP: 2.1s on 3G
2. Enable HTTP/2 + CDN
Impact: -35% TTFB, global edge caching
HTTP/2 multiplexes requests; CDNs serve static assets from servers closest to Lagos/Abuja users.
Implementation:
- Cloudflare (free tier): Enable "Auto Minify" + "Brotli" compression
- Cache-Control headers:
Cache-Control: public, max-age=31536000, immutablefor versioned assets - Use versioned filenames:
app.a3f8d2.jsso browsers cache forever
Nigerian tip: Cloudflare has 2 edge locations serving West Africa (Lagos traffic routes via Europe, but still 40-60% faster than US-only hosting).
3. Minify & Code-Split JavaScript/CSS
Impact: -50% JS bundle size, faster INP
Most Nigerian sites ship 800KB-2MB of JavaScript—including entire libraries users never interact with.
Implementation:
- Code-split by route: Next.js/Vite do this automatically; each page loads only its JS
- Purge unused CSS: Tailwind's
purgeremoves 95% of unused styles - Defer non-critical JS:
<script defer>or<script type="module"> - Tree-shake dependencies: Use ES6 imports (
import { specific } from 'lodash-es')
❌ Before
1.4MB JS bundle | INP: 620ms (slow)
✅ After
280KB initial JS | INP: 180ms (good)
4. Optimize Web Fonts
Impact: -0.8s LCP, eliminates FOUT
Google Fonts add 300-500ms latency. Self-hosted fonts with font-display: swap render text instantly.
Implementation:
- Download WOFF2 fonts, host locally in
/public/fonts - Use
@font-facewithfont-display: swap - Limit to 2 font weights (Regular + Bold) to save 200KB+
- Preload critical font:
<link rel="preload" href="/fonts/inter.woff2" as="font" crossorigin />
5. Preload Critical Assets
Impact: -0.6s LCP for hero images
Tell the browser to fetch above-the-fold assets (hero image, critical CSS) ASAP, before parsing HTML.
Add to <head>:
<link rel="preload" as="image" href="/hero.avif" fetchpriority="high" /> <link rel="preload" as="style" href="/critical.css" /> <link rel="preload" as="font" href="/fonts/inter-bold.woff2" crossorigin />
6. Reduce Third-Party Scripts
Impact: -1.2s total blocking time
Chat widgets, analytics, ad pixels often add 500KB-1MB of JS and block rendering. Audit and remove unused ones.
Quick wins:
- Remove: Unused Facebook Pixel, redundant analytics (pick Google Analytics OR Mixpanel, not both)
- Defer: Chat widget until user scrolls 50% down
- Use Tag Manager: Load all scripts via GTM with timeout limits
- Self-host: Google Analytics via Plausible/Umami (70% lighter)
7. Optimize API Responses
Impact: -40% data transfer, faster page hydration
Many Nigerian sites fetch unoptimized APIs returning 2MB JSON payloads with redundant data.
Backend optimizations:
- Cache GET requests: Redis for 5-60 minutes on static data (product catalogs, blog posts)
- Paginate: Return 20 items per page, not 500
- Compress responses: Enable Gzip/Brotli on API server
- Use GraphQL: Fetch only fields you need (
{ id, title, price }) - Avoid N+1 queries: Use
JOINor DataLoader to batch DB calls
8. Lazy-Load Images & Videos
Impact: -60% initial bandwidth on image-heavy pages
Don't load images/videos below the fold until user scrolls near them. Modern browsers support this natively.
<!-- Images below fold --> <img src="product.avif" loading="lazy" alt="Product" /> <!-- Videos (only load poster initially) --> <video poster="thumb.jpg" preload="none"> <source src="demo.mp4" /> </video>
9. Use Static Generation (SSG)
Impact: -80% server response time
Pre-render content pages at build time. Serve static HTML instead of running server logic on every request.
Best for:
- Blog posts, product pages, landing pages (95% of Nigerian business sites)
- Next.js
getStaticPropsor Astro for ultimate speed - Hydrate only interactive components (search, cart)
10. Monitor Core Web Vitals Weekly
Impact: Prevents regressions, maintains speed gains
Set up automated monitoring to catch performance regressions before they hurt traffic.
Tools (all free tiers available):
- Lighthouse CI: Run on every deploy, fail builds if LCP > 3s
- Google Search Console: Real-user Core Web Vitals data
- web-vitals.js: Track LCP/INP/CLS in production with Google Analytics
- Vercel Analytics: Real-time performance scores per page
11. Set a Mobile-First Performance Budget
Impact: Forces discipline, prevents bloat
Define hard limits on bundle sizes—and enforce them in CI/CD.
Recommended budgets for Nigerian sites:
- Initial JS: <100KB gzipped
- Initial CSS: <20KB
- Hero image: <200KB AVIF
- Total page weight: <600KB for 3G users
12. Use Image CDNs with On-the-Fly Transforms
Impact: Auto-optimizes images, no manual work
Cloudinary/Imgix automatically serve AVIF/WebP, resize for device, and cache globally.
<!-- Cloudinary URL --> <img src="https://res.cloudinary.com/.../w_800,f_auto,q_auto/hero.jpg" /> <!-- Auto-serves 180KB AVIF on Chrome, 240KB WebP on Safari -->
Real Case Study: Lagos Fashion Store
A Lagos-based online fashion retailer came to us with a 68% mobile bounce rate. After a 7-day performance sprint, here's what happened:
❌ Before (May 2024)
- • LCP: 7.2s (poor)
- • INP: 680ms (slow clicks)
- • CLS: 0.34 (jumpy layout)
- • Page weight: 4.8MB
- • Mobile bounce rate: 68%
- • Conversion rate: 1.2%
✅ After (June 2024)
- • LCP: 1.9s (good) ⬇️ 73%
- • INP: 160ms (fast) ⬇️ 76%
- • CLS: 0.08 (stable) ⬇️ 76%
- • Page weight: 820KB ⬇️ 83%
- • Mobile bounce rate: 42% ⬇️ 26pp
- • Conversion rate: 2.9% ⬆️ 142%
What we fixed in 7 days:
Days 1-2: Images
Converted 280 product JPEGs to AVIF, added lazy-loading
Day 3: JavaScript
Code-split by route, removed jQuery (saved 380KB)
Day 4: CDN
Migrated to Cloudflare, enabled Brotli + auto-minify
Days 5-6: Fonts & Scripts
Self-hosted fonts, removed 3 unused analytics scripts
Day 7: Monitoring
Set up Lighthouse CI + Google Search Console alerts
Result
₦2.8m extra revenue in first month post-launch
Where to Start? (Priority Matrix)
If you only have 1 week, focus on the highest-impact fixes first:
Images: Compress to AVIF/WebP, add lazy-loading (40% of gains)
JavaScript: Code-split, defer non-critical scripts (25% of gains)
CDN: Enable Cloudflare, configure caching (15% of gains)
Fonts & Preload: Self-host, preload critical assets (10% of gains)
Clean-up & Monitor: Remove unused scripts, set up Lighthouse CI (10% of gains)
Want a 7-Day Performance Sprint?
We'll audit your site, fix the top speed bottlenecks, and improve your Core Web Vitals scores—usually within 7 days. Most clients see 30-50% conversion lift within the first month.
Book Your Performance Audit