Case study · Work

Arts venue

Three stages, two hundred performances a season, and a box-office system nobody was allowed to replace. The site's job was to make the two read as one thing.

Photo cutout of a theatre stage with red curtains and rows of seats

The numbers

PlatformCraft CMS 5
Spaces3 stages, one what's-on
TicketingDeep link to the box office
AccessCaptioned, BSL and relaxed, flagged per performance
Figma to live9 weeks

The studio's rebrand gave a regional venue its confidence back: big type, photography with stage light in it, and a what's-on that looked like a season rather than a spreadsheet. Underneath it sat a box-office system on a five-year contract, and the first line of the brief was that we were not to touch it.

Where it started

Before quoting we asked to watch the programming team load a show into the old CMS. It took forty minutes and involved creating the same production nine times, once per date, each copy drifting slightly from the last. The first document we sent back wasn't a quote. It was a content model in which a production is one entry and its performances are dates that belong to it, each carrying its own stage, time and access flags. The team lead read it and said, that's what I've been asking for since 2019. Then we quoted.

The build

Productions hold the copy, the imagery and the trailer. Performances hold everything that varies by night. The what's-on assembles itself from whatever is on sale, filterable by date, stage and access type, and a production page lists its own dates without anyone maintaining a list. When the run ends, the page stays up for the archive and stops offering tickets, rather than 404ing out of the venue's history.

Ticketing is a handoff, not a rebuild. Every performance carries its box-office ID, and the book button deep-links straight to that performance in the existing system. The brand holds right up to the seat map, the card details remain the box office's problem, and the five-year contract goes untouched.

Access information is fields rather than a page someone forgets. Captioned, BSL-interpreted and relaxed performances are flagged where the performance is created, show up as what's-on filters, and feed the access page automatically, so the venue's promise to disabled audiences comes from the same data as the listings and can't go stale on a forgotten page.

The season builder

Twice a year the venue announces a season, which used to mean a fortnight of after-hours data entry and one very tense morning. Now the programming team loads the whole season against an embargo date, previews it through tokened links that go into the press pack, and on announcement morning one person presses one button. The first season announced this way went live in four minutes, most of which was the marketing head triple-checking before pressing it.

The 7pm problem got its own attention. The site is busiest in the hour before curtain, on phones, on the venue's own wifi. Listings pages serve from cache and purge per production when something changes, and sold-out states come from a box-office feed that refreshes on a schedule the venue tunes: aggressive on on-sale mornings, relaxed in August.

Built at programming speed

Craft 5's nested entries are what make the model work. A performance is an entry that lives inside its production, so the venue's data finally has the shape the printed programme always had. The what's-on filters are plain URL parameters, which sounds like nothing and does a lot. The box office can email a link to every captioned performance this season and it keeps working as the season changes, and when a filter changes the result count is announced to screen readers, so a keyboard user knows something happened.

Nine weeks stretched to cover a season builder because so much of the kit was assembly rather than invention. The blocks share field groups with builds that came before them, and project config meant staging and production never argued. The what's-on got its responsive pass in the bus queue outside the venue, which is roughly where it will mostly be used. The card hover is the only flourish, a small lift that doesn't run under reduced motion. We tried a curtain-style reveal on production pages and cut it within a day. The photography was doing the theatre already.

Checks, with the house lights down

We tested the handoff against the box office's staging system for three weeks, including the failure case where their system is down and ours isn't, which now shows the box-office phone number instead of a dead button. The what's-on filters had a screen-reader pass and a keyboard walk like every other block, and the trailer block sits still for anyone with reduced motion on, because a venue that flags relaxed performances should have a website that behaves like one.

The season went up in four minutes. Last year it took nine days and a temp.
The venue's marketing head, via the studio

After launch

Two seasons have been announced since, both by the programming team, neither involving us. The access filters turned out to matter more than anyone expected. The venue reports captioned-performance bookings up noticeably since launch, which they put down to people finally being able to find them. We'd put it down to the flags being fields.

Yours could
be next

Send one component from your current Figma and we'll build it for free. Check it against the file yourself before you sign anything.