All posts
Abstract illustration of a dense cluster of image tiles dissolving into a light, flowing stream, representing heavy photos being optimized.
8 min read

Why Your Nonprofit’s Website Feels Slow — and the Free Fix Hiding in Your Photos

Your website is full of photos, and it should be. The volunteers at the last build day. The kids in the after-school program. The board chair cutting the ribbon. Those photos are how people feel your mission before they read a single word about it.

So here’s the good news and the bad news. The good news: those photos are doing exactly what they should. The bad news: they’re probably also the biggest reason your site loads slowly. And a slow site quietly costs you the very people you’re trying to reach.

The fix doesn’t take a developer. Most of it doesn’t take a dollar either. Let me walk you through it.

A slow site loses people before they ever see your work

When a page takes too long, people don’t wait. They leave — usually before they ever reach your donate button or your volunteer sign-up form. It happens most on phones, where people are quick to give up and move on, and where a lot of your visitors are.

You don’t really need a study to know this. Think about the last time you tapped a link, watched a blank white screen for a few seconds, and backed out before it ever loaded. Your supporters do the same thing on your site.

And here’s the part that matters most: images are almost always the heaviest thing on a web page. So when a site feels slow, the photos are usually the first place to look.

Every second your event recap takes to load is a second a potential supporter is deciding whether to keep waiting. A lot of them won’t.

What’s actually happening when you upload a photo

This part surprises people, so it’s worth a minute.

When you upload one photo, WordPress doesn’t just keep that one file. It quietly makes several copies of it at different sizes — usually five to ten of them — every single time. It does this so it can show a small version in one place and a large version in another.

That’s fine on its own. The trouble is the math. Multiply those copies by every event you’ve posted, every gallery, and every volunteer who uploaded a photo straight from their phone. A three-year-old website can be carrying several gigabytes of images without anyone noticing.

And the photo straight off a phone is the real culprit. A modern phone photo is often 4 to 6 megabytes and more than 4,000 pixels wide — far larger than your website will ever actually display. You end up shipping a billboard just to show a postcard.

The good news is that all of this is fixable, and you can do it in three steps.

Step 1: Fix it before it ever reaches your site

This is the step most guides skip. For a small team, it’s the most important one.

The problem almost always starts at the upload. A volunteer takes a wonderful photo, and drops it straight into WordPress at full size. So the simplest fix is to shrink the photo before it ever goes up.

Two plain rules cover almost everything:

You don’t need special software. Squoosh is a free website — you drag a photo in, set the width, and download the smaller version. No account, no install. The photo editor already on your phone or computer works too.

While you’ve got the photo open, rename it too. This one isn’t about speed — it’s about your own sanity six months from now. A photo straight off a phone has a name like IMG_4032.jpg. Picture a media library with three hundred files named that way, and you trying to find the one good shot from the spring gala. Impossible. So before you upload, give the file a plain, descriptive name: spring-gala-2026-ribbon-cutting.jpg. Two good things happen. You can actually find the photo later by searching your media library, and WordPress uses that filename as a starting point when it fills in the photo’s description — the alt text I’ll get to in a minute.

This habit, done consistently, prevents the problem instead of cleaning it up later. If you do nothing else on this list, do this.

Step 2: Let a plugin carry the weight

Step 1 handles new photos. For the hundreds you’ve already uploaded — and to keep the squeeze automatic going forward — an image optimization plugin does the work for you in the background.

A good one will:

A quick word on budget. The original source for this post recommends paying for the “pro” version of these plugins, and he’s right that paid plans compress a bit better. But if your budget is zero today, here’s the honest version: the free tier of a good plugin, plus the upload habit from Step 1, gets you most of the way there. Start free. Upgrade when you can, not before.

The popular ones — EWWW, Imagify, ShortPixel, and Smush — are all similar. Any of them works. Pick based on price and which screen feels easiest to you.

One gotcha worth knowing. “Lazy loading” means photos further down the page don’t load until someone scrolls toward them. That’s a good thing — it makes the top of your page appear faster. But there’s a catch: if the plugin accidentally lazy-loads the big image at the very top of your page, it actually makes the page feel slower, not faster. WordPress and the good plugins try to skip that first image automatically. If a speed-test tool ever complains that your “Largest Contentful Paint image was lazily loaded,” that’s exactly what happened — and there’s a setting in the plugin to skip the first image or two. That whole confusing piece is usually one checkbox.

Step 3: Let the network do the rest

The last layer happens out on the network, before an image ever reaches your visitor.

If your site uses Cloudflare — it’s free and very common — it can compress your images and serve those modern formats automatically, from a location close to each visitor. On the free plan, the basic speed-up is already working for you. The automatic image compression feature (Cloudflare calls it Polish) sits on their paid plan, around $25 a month.

Truthfully, most small nonprofits don’t need to pay for this. Steps 1 and 2 do the heavy lifting. Think of the network layer as the “when you’re ready, when traffic grows” step — not the place to start.

Two more things that matter for you

These didn’t come from the original talk, but they belong here.

1. Write a short description for every photo. WordPress gives every image a field called “alt text.” Two reasons it matters. First, it’s how supporters who are blind or low-vision experience your photos — a screen reader reads that description aloud, so a missing one means a missing piece of your story for them. Second, Google reads it too, which helps people find you. It just makes sense that everyone should be able to experience your site. One plain sentence per photo does it. “Volunteers planting trees at the spring build day” beats “IMG_4032” every time, and it only takes a few seconds. And if you named the file well back in Step 1, you’re already halfway there — WordPress often pre-fills a suggestion from the filename.

2. Give your volunteers one simple rule. The whole image problem comes from many different hands uploading photos. You can fix it once by handing everyone the same short checklist. Here’s one you can copy and tape next to anyone who touches the website:

Before you upload a photo to our website:

  1. Is it wider than 2,000 pixels? Resize it at Squoosh.app — drag the photo in, set the width to 2000, download the smaller copy.
  2. Is the file bigger than 500 KB? Shrink it with the same tool.
  3. Rename the file something plain and descriptive — spring-gala-ribbon-cutting.jpg, not IMG_4032.jpg.
  4. When WordPress asks for a description, write one plain sentence about what’s in the photo.

That’s it. Four quick checks, about a minute.

You don’t need a developer for this

You need a habit at upload, one plugin doing the quiet work in the background, and — only when you’re ready — the network layer. Do Step 1 alone and you will feel the difference.

Your site is yours. Keeping it fast is just another way of keeping it welcoming to everyone who shows up wanting to help.


The technical foundation of this post came from a webinar by Nathan Ingram, “The Image Problem: The Easiest Fix for WordPress Speed.” Nathan teaches this material for web professionals; I’ve reframed it here for the realities of a small nonprofit team. If you’d like the deeper, agency-level version, his work is well worth seeking out.

Geoffrey Lowthian

Written and cared for, as always.