A 1-second delay in page load reduces conversions by 7%. At 3 seconds, you've lost half your visitors. For Nigerian mobile users on unstable 3G connections, performance is even more critical.
Here are the actual causes — not vague advice, but specific technical problems and their solutions.
Cause 1: Shared Nigerian hosting
Shared cPanel hosting means your site shares a server with 200–500 other websites. When any of them spike in traffic, everyone slows down. Nigerian-hosted servers are often located in Nigeria, which can help for local users but hurts for cached static assets.
Fix: Move to Vercel (free), Cloudflare Pages (free), or a proper cloud host. If you're on WordPress, WP Engine or Kinsta's cheapest plans (around $25–35/month) are dramatically better than any local shared host.
Cause 2: Unoptimized images
Images are the #1 cause of slow websites. A photo from your phone is 3–10MB. Your homepage slider has 5 of them. That's 50MB just to show someone your office.
Fix:
- Resize images to maximum display size (1920px wide at most)
- Convert to WebP format (40-60% smaller than JPEG at same quality)
- Use lazy loading (
loading="lazy"attribute) - Use CDN for image delivery
For Next.js, use next/image — it handles all of this automatically:
import Image from "next/image";
<Image
src="/hero.jpg"
width={1200}
height={630}
alt="TrueWeb office"
priority // only for above-the-fold images
/>
Cause 3: Too many external scripts
Every external script (analytics, chat widgets, social share buttons, font loaders) adds network round trips. Some popular Nigerian additions:
- Google Analytics (adds ~50KB if not deferred)
- WhatsApp Chat Button plugin (~100KB)
- Font Awesome (when you need 3 icons)
- Multiple Google Fonts families
Fix: Audit your scripts. Load only what's needed. Defer everything non-critical:
<!-- Bad: blocks render -->
<script src="analytics.js"></script>
<!-- Good: defers until page is interactive -->
<script src="analytics.js" defer></script>
<script src="analytics.js" async></script>
For Next.js, use next/script:
import Script from "next/script";
<Script src="https://..." strategy="afterInteractive" />
Cause 4: No caching
Every time a visitor hits your site, their browser re-downloads everything. Static files — images, CSS, JS — don't change often. Tell the browser to cache them.
Fix: Set Cache-Control headers. On Vercel, add to next.config.js:
async headers() {
return [
{
source: "/(.*)",
headers: [
{ key: "Cache-Control", value: "public, max-age=31536000, immutable" },
],
},
];
},
For dynamic pages, use Cache-Control: s-maxage=60, stale-while-revalidate=3600 to cache at the CDN edge.
Cause 5: No CDN
If your server is in Lagos and your visitor is in Kano, the data travels Lagos → Kano for every request. A Content Delivery Network (CDN) caches your content on servers close to visitors.
Fix: Vercel, Cloudflare, or Netlify all include a CDN automatically. If you're on a traditional host, point your domain to Cloudflare (free plan covers most cases).
Cause 6: Render-blocking CSS and fonts
CSS files in <head> block the browser from rendering anything until the CSS is fully downloaded and parsed.
Fix:
- Inline critical CSS (the above-the-fold styles) in
<head> - Load non-critical CSS asynchronously
- Use
font-display: swapfor web fonts so text is readable while fonts load
@font-face {
font-family: "Inter";
src: url("/fonts/inter.woff2");
font-display: swap; /* show fallback font immediately */
}
Cause 7: Unused CSS/JS bundles
WordPress with 10 plugins loads CSS and JS for all 10 plugins on every page, even pages that don't use those features.
Fix: For WordPress, use Asset CleanUp plugin to disable scripts per page type. For React/Next.js apps, use dynamic imports for heavy components:
import dynamic from "next/dynamic";
const HeavyChart = dynamic(() => import("./HeavyChart"), {
loading: () => <div>Loading chart...</div>,
ssr: false,
});
Measuring your improvements
After each fix, measure:
- PageSpeed Insights — Tests both mobile and desktop, gives specific suggestions
- WebPageTest.org — Test from Lagos server location
- Chrome DevTools Network tab — Shows exactly what's loading and how long each takes
Target metrics:
- First Contentful Paint (FCP): < 1.8s
- Largest Contentful Paint (LCP): < 2.5s
- Total Blocking Time (TBT): < 200ms
- Cumulative Layout Shift (CLS): < 0.1
A real-world example
One of our clients — a Lagos-based fashion retailer — came to us with a site loading in 14 seconds on mobile. Issues we found:
- 12MB of unoptimized images on the homepage
- Google Fonts loading 6 font weights
- 4 analytics scripts (Google Analytics, Facebook Pixel, Hotjar, TikTok Pixel)
- Hosted on shared Nigerian cPanel
- No CDN
After migrating to Vercel + image optimization + deferring non-critical scripts, load time dropped to 2.1 seconds. Checkout conversion increased 34% in the following month.
The site didn't change visually. The business changed financially.