The Host's Casebook / The school fundraiser that crashed at its best moment

The school fundraiser that crashed at its best moment

CASEBOOK

6 min read · 1,340 words

A note on authenticity. This is a composite story written by the editors, built from situations that come up again and again. It is not the account of a particular named person or business. Real reader stories go through the submission page and are marked as reader-submitted.

A primary school ran an online auction to raise money for its new library. Parents and local businesses had donated about sixty items: a signed football, a weekend cottage stay, framed pictures by the pupils, a term of music lessons. The parents' committee built a simple bidding site on the school's small shared hosting plan and announced it a fortnight ahead. Bids trickled in. Everything looked fine.

The auction was set to close on a Sunday evening. In the final hour, the committee shared the link in several parents' chat groups at once, with a reminder that the most popular items were about to end. Then it all stopped working at the one moment the money was decided. This is a fictional composite, but anyone who has run a time-limited event on small hosting has seen some version of it.

The story is worth telling in detail because the cause was not a fault. The site did what it was built to do, for the number of people it was built for.

A site that worked until it mattered

For two weeks the traffic was gentle. A few dozen parents visited each evening, placed a bid, and left. On a typical visit the site loaded a PHP page, ran several database queries to fetch the item and its current highest bid, and returned about 300 KB of HTML, images and styles. Pages came back in under a second. The committee had tested it themselves, with five people, and it felt quick.

What nobody measured was how much the plan could serve at once. Shared hosting divides a server's resources among many accounts. A typical small plan caps the number of PHP processes that can run at the same time, often somewhere between a dozen and a few dozen, and limits memory and CPU time per account. Those limits are not a problem when requests arrive one at a time. They matter when everybody arrives at once.

Sunday evening, minute by minute

TimeWhat was happeningWhat visitors saw
19:00Message goes out in the chat groups. About 40 visitors in the first few minutes.Normal pages, slightly slower.
19:10Link forwarded to wider groups, and to a local community page. Concurrent visitors pass 150.Pages take 5 to 10 seconds.
19:20Many people refresh repeatedly to see the latest bid. Around 300 people are on the site.Timeouts and error pages.
19:30The most popular item reaches its closing minutes. Bids fail to save."Service unavailable" or a blank page.
19:45The auction closes at its scheduled time. Several items have received no final bids.Site returns slowly, final totals look low.

The last row was the painful one. Auctions famously concentrate their value in the final minutes, when people who have been watching decide to commit. The site broke in exactly that window.

What was actually happening on the server

Think of the plan as a shop with a small number of tills. Each visitor's request needs a till for the time it takes to build the page. If requests arrive slower than the tills can serve them, nobody waits. If they arrive faster, a queue forms, and queued requests wait. Once the queue grows past what the server will hold, or the wait passes the web server's timeout, the visitor gets an error instead.

300 visitorseach presses refreshWaiting queuegrows, thentimes outPlan limite.g. 20 PHP workersplus databaseconnection limit
Each page build occupies a worker for a moment; when arrivals outpace workers, requests queue and then fail.

Two features of the auction made it worse. First, every page showed a live "current bid", so it could not be stored and handed out unchanged, and each visit ran database queries. Second, people refresh in a panic. A visitor who gets no response clicks again, and each click adds another request while the first is still waiting. Three hundred people can produce well over a thousand requests in a minute without anyone doing anything unreasonable.

Wrong turns on the night

The committee's treasurer, a volunteer with no technical background, tried the obvious things. She asked people in the groups to stop refreshing, which reached some of them and made no difference to the rest. She emailed the host, whose support replied the next morning, long after the auction was over. She also tried logging in to the control panel to upgrade the plan mid-event, which in many cases takes minutes to apply and also does not guarantee a fix, because a bigger plan with the same design may still choke.

It is worth saying plainly that none of these was foolish. Without a measure of the plan's limits or a prepared fallback, she had nothing better to reach for.

What the plan could have been given

There were three levers, and each changes the answer by a different amount.

Illustrative visitors handled per minuteOriginal pageabout 120Cached pageabout 1,500Static page + CDNbar cut short: capacity far higher
Numbers are illustrative; the point is the order of magnitude between a dynamic page, a cached one and a static one.

What the committee did next time

For the following auction, they changed the shape of the whole thing rather than tuning the old site. They used a hosted auction service built for timed events, which handles bidding, countdowns, outbid emails and payment capture on infrastructure sized for spikes. The school website went back to being what a school website is for: a page with the date, the rules and a link to the service.

They also changed the human side. The end time was staggered, so that items closed across an evening instead of together. The link was shared at set times rather than blasted out in the final hour, and the message gave a calm reminder that bids placed on the service were recorded. Total raised for the second event was well above the first, though the committee were careful not to credit the technology alone.

Checking it yourself

Before any event with a deadline, run a rough load test. A free tool such as ab (ApacheBench) shows what a small plan can serve:

ab -n 500 -c 50 https://example.com/auction/item/12

This sends 500 requests, 50 at a time, and reports requests per second, failures and the slowest responses. Run it against a test copy, not the live site, and with permission from your host, since some hosts treat sudden bursts as abuse. Divide the requests per second by two or three for a cautious estimate of real visitors per minute, because people read between clicks but panic when they cannot load.

Read the plan's resource limits in the control panel, and use the hosting quiz if you are unsure what kind of plan fits an event. For the failure messages you may see on the night, the status code reference explains 503 and 504.

Reading the warning signs earlier

The site gave hints before the evening itself. The previous Thursday, when a single class teacher shared the link, page times had crept from under a second to three or four seconds for about ten minutes. Nobody noticed, because nobody was watching. A simple habit would have caught it: open the site from a phone on mobile data at a busy moment, time how long the item page takes, and write the number down. If a small, ordinary bump in interest triples the response time, a proper rush will not be gentle.

The host's control panel also kept usage graphs for CPU, memory and concurrent processes. Those graphs showed the account sitting at its process limit for much of that Thursday spike. It was all there to read, in a part of the panel the committee had never opened.

PreviousThe accountant who was impersonatedNextThe band that lost its mailing list

More from The Host's Casebook

Composite case

The nonprofit site that only one volunteer understood

A community garden's website was built by a volunteer who knew what he was doing and kept everything in his...

Composite case

The local news site and the comment spam

A volunteer-run local news site enabled comments on every story. For a year it was lively and polite. Then...

Composite case

Two sites on one account, one infection

A web designer hosted two client sites and her own on a single hosting account to save money. One client's...