Skateland West opened on San Antonio's Loop 410 in 1985. Their WordPress site opened sometime around 2011 and had been quietly getting in the way ever since. Here's the long version of how we got them off it.
The short version was in the case study — hosting dropped from $500 to $85, mobile load dropped from 4.1s to 0.8s, event signups climbed 38%. This is the long version. What we threw away, what we kept, and the half-dozen decisions where the interesting work actually happened.
Why not WordPress.
The honest answer isn't that WordPress is bad. It's that this particular WordPress install had calcified. Seven active plugins, three of which weren't maintained anymore. A page builder nobody on staff knew how to use. A theme from 2017 that had been patched around six times. The "edit the Friday-night schedule" task took the owner's daughter 20 minutes and a phone call to us, every week.
We looked at whether we could clean it up in place. We could have. It would have cost about $4,000 and given them another two or three good years before the same stack of problems accreted again. For the same money we could get them onto something they'd still want to be on in 2030.
The stack we landed on.
- SvelteKit on the front. Fast, small, no framework churn expected for the next couple of years.
- Payload CMS with Postgres on the back. Editor-first, self-hostable, content model written in TypeScript so it's reviewable.
- Listmonk for the newsletter, self-hosted on the same box. Replaces the $90/mo Mailchimp bill.
- Hetzner CX22 — a $12/mo VPS in Ashburn. Everything runs in Docker, monitored by a boring little uptime check.
- A tiny admin tool for the booking flow that writes events to the Google Calendar the family already used. No new software for the team to learn.
Nothing on that list is fashionable. That's on purpose. Every piece is something we've run for other clients for at least two years without an emergency. The most exciting infrastructure is infrastructure nobody notices.
The six decisions that mattered.
01. Self-hosting vs. a managed CMS.
Sanity and Contentful are good products. They also cost more per year than Skateland's old hosting did, and they put the family's content behind another company's login. The client was very clear: we want to own it. A $12 VPS and a Postgres dump they can download any time answered that better than a SaaS ever could.
02. Postgres vs. SQLite.
We almost used SQLite. It would have been simpler. We went with Postgres because the Payload hosted-media setup plays nicer with it and because we wanted a single database for the site, the newsletter, and the little admin app. One database, one backup script, one thing to learn.
03. Keeping every word of the old copy.
The family had written the old site's copy themselves. It was imperfect. It was also theirs — it sounded like them. We migrated every word and only edited where a sentence literally couldn't be true anymore. The new site sounds like the rink because we didn't try to improve the rink's voice.
"Don't make it sound like a mall."
— the owner, on kickoff call one. We had it on a sticky note on the monitor for six weeks.
04. Booking flow: less software, not more.
The first sketch had a full booking app — inventory, slots, payment. We scrapped it. The team was running the schedule out of a shared Google Calendar and the booking tool we built just needed to write to that calendar. Same team, same tool, one less system to keep in sync.
05. Event signup form: one page, one field.
The old site had a 9-field form. The new one asks for a phone number, period. Staff calls back within a business day. Signups went up 38% against the same promo calendar last year. The rest of the fields were friction masquerading as "qualification."
06. Launch quietly.
We soft-launched on a Tuesday with no announcement. Ran both sites side by side for a week. Watched analytics, fixed two small bugs, then swapped DNS on a Friday morning. No one emailed to say "the site is broken" because by the time anyone noticed, it wasn't new anymore.
The hosting bill math.
Before:
- WordPress managed hosting: $480/yr
- Mailchimp: $1,080/yr (at their list size)
- Premium theme renewals: $89/yr
- Page-builder license: $79/yr
- Total: $1,728/yr
After:
- Hetzner CX22: $84/yr
- Postgres backup to B2: $6/yr
- Domain + email: held separately, unchanged
- Total: $90/yr
The savings in year one cover the cost of a small retainer with us. By year three the rebuild has paid for itself out of hosting savings alone, before we count the 38% signup bump.
What we'd do differently.
Two things. First, we'd set up analytics on day one of the old site, not day one of the new one — we don't have a clean baseline for the pages that didn't exist before, so some of the comparison is a little softer than we'd like. Second, we'd write the Payload content model with the family in the room. We wrote it ourselves and then had to adjust two fields after the first week of real editing. It would have been cheaper to have the fifteen-minute conversation first.
The point.
Skateland didn't need a better website. They needed their software to stop being in the way of the thing they're already great at: three generations of a family running a roller rink on Loop 410 with neon signage and three-dollar Tuesdays. The website is just a channel. The best thing we could do was make it quieter.
The slug on the footer isn't a joke. This kind of work goes slow on purpose. The rink has been there forty years. The software should aim for the same.