Nonprofit · International
A charity newsroom that has to keep counting
Save Ukraine returns children deported by Russia. Its site is a newsroom, an evidence archive and a donation channel in English and Ukrainian — over three thousand records the team publishes itself, and one number that has to be right everywhere it appears.
- Result
-
3,000
records the team publishes without a developer - Vertical
- Nonprofit
- Stack
- WordPress, Custom theme, 10 custom post types, 3 languages, Contact Form 7
- Live site
- saveukraine.org
The problem
Save Ukraine finds children deported to Russia and the occupied territories and brings them home. It also runs rehabilitation centres, a hotline, school programmes and a path back into ordinary life for the children who return.
A site like that is four things at once. A newsroom that publishes almost every day. An archive of evidence that journalists and investigators will read. A donation channel that has to work from abroad. And the first thing a partner reads before deciding to work with them. It has to do all of that in English and Ukrainian, and the team has to run it without a developer on call.
What I built
Ten kinds of record, not one blog
The easy way is to make everything a post and sort it with categories. It stops working within a year. Instead, each kind of thing the organisation publishes is its own record, with its own fields and its own page layout. Counted on the live site in September 2026, across both languages:
- 1,940 news entries
- 472 stories of children who came home, and 6 abduction cases, kept deliberately apart — one is a story, the other is evidence, and different people read them for different reasons
- 437 international-day entries
- 102 partners, 23 projects, 9 community centres with 21 child profiles attached
- 4 tenders, because a charity at this scale buys in public
Keeping the abduction cases separate from the stories is the decision I would defend hardest. They look alike in a database and they are not the same thing: one may be cited in a legal proceeding, the other is communication. Merging them would have saved a week in month one and been unfixable in year two.
The team adds all of this itself. A new partner is a new partner record with a logo field, not a request to a developer to find the right row on the page.
The one number
1,705 children returned. Beside it, 5,000+, 9,000+ and 165,000+ for the other programmes. It is the number the organisation is known by and the most important element on the site. It has to be trivial to update, impossible to get wrong by accident, and it has to be the same number in English, in Ukrainian and in the Canadian edition. Everything else on the home page is arranged around it.
Two languages, one site
English and Ukrainian, plus a Canadian edition of the English site for donors there. One site, one admin: the Ukrainian version of a news entry sits next to the English one, not on a second site with a second login.
On mobile
The hero slider becomes a single stacked story and the donate button stays within reach. Part of this audience reads on old phones on poor connections, some of them in occupied territory. Mobile here is not a percentage in analytics; it is the whole point.
What I would change next
The front page still carries more tracking and analytics than a reader rationing mobile data should pay for. Some of it the organisation needs for its reporting; which of it can go is their decision, and it is the first thing I would put in front of them. The second is the photograph library, served at full size — weight that a reader on a slow connection feels.
What the team gets
A news entry, a returned child’s story, a new partner or a tender goes up the same day, in both languages, by the person who has it — no developer in the loop. The number the organisation is judged by changes without anyone touching the layout. And a case file stays a case file, wherever it is cited.
The site itself
