ShowPlanr

Every show, costed three times

ShowPlanr is a touring and booking platform for live entertainment. We rebuilt it on a new stack and put the promoter's hardest sum at the centre of it: what a night will make, what it might make now, and what it actually made.

3
Front ends on one API: the public ticket site, the promoter back office and the platform console
74
Cost lines a date can carry, across show, venue and marketing
91
Permissions in the access model, from deal terms down to individual report tabs
Client
ShowPlanr, a touring and booking platform for live entertainment. The product belongs to its owner; JDD built it.
Users
Promoters, bookers and producers planning tours; venue and production teams working from the same record; and the public, buying tickets on the front of it
Stack
Laravel 12 on PHP 8.4 with Sanctum and Meilisearch, two MariaDB stored functions carrying the money logic, a Quasar and Vue 3 back office shipped as a progressive web app, a second Vue console for platform operators, GitLab CI, Docker and Traefik
Engagement
A multi-year build: the original platform, then a full rebuild on a new stack with a staged migration off the old database
01

A tour is a hundred small bets

A promoter books a date months before anyone buys a ticket. They agree a fee with the artist, a split with the venue, a marketing budget, and a dozen other terms that only matter if the night goes well, or badly enough. Then they wait, watch tickets trickle in, and decide whether to spend more on advertising or cut their losses.

Most of that runs on spreadsheets. One workbook per tour, passed around by email, with the deal terms in a corner and a formula nobody wants to touch. It works until there are forty dates, three people editing and a question about which version is current.

ShowPlanr already existed and already did some of this. The job was to rebuild it properly: the same business, a new stack, and the arithmetic moved out of the workbook and into the system.

Forecast, revised and actual
Deal terms in SQL
Four-level cost inheritance
Weekly sales pacing
Staged legacy migration
A ShowPlanr booking overview on a laptop, showing profit, gross revenue and costs with forecast and revised figures alongside, and the five steps from tickets by price band to the split between parties
A booking overview: profit, gross and costs, each carrying a forecast and a revised figure alongside what actually sold. Every show, venue and figure on this page is invented — the screens are rebuilt, not screenshotted.
02

Forecast, revised, actual

Every money figure in ShowPlanr exists three times. Forecast is what was believed when the date was booked. Revised is what is believed now, halfway through the on-sale. Actual is what came through, summed from the ticket sales themselves rather than stored as a running total.

Tickets live on price bands, so a booking's forecast is a number per band rather than one number for the room. Sales arrive as positive deltas against an allocation of a band — a row per source per day — which means the actual figure is always a sum, never a stale snapshot somebody forgot to update.

before   one workbook per tour, with last week's figures and this week's argument
after   three scenarios on every booking, recalculated from the sales table
outcome   the same question answered the same way on every date in the book

Gross is carried excluding VAT throughout, which sounds like a detail until you are weighing a flat guarantee against a percentage of the door and the two are quoted differently.

Buyouts are their own sale type. Where a show is bought outright there is no ticket curve to follow, and the actual gross is the fee rather than the box office.

03

Costs fall down the hierarchy

A touring production carries the same costs night after night — crew, trucking, sound, insurance, the artist's fee — and then one hall charges differently for security and another absorbs the marketing. Re-entering all of it per date is how errors get in.

So a cost is set once, at whatever level it is actually true, and everything below inherits it. The booking's figure wins if it has one; otherwise the tour's, otherwise the show's, otherwise the venue's. Seventy-four cost lines across show, venue and marketing categories, each resolving down that chain, and percentage-based lines resolving against the gross for whichever scenario is being calculated.

Before

A cost typed into forty rows of a workbook, thirty-nine of them still correct.

After

Set once where it's true, inherited everywhere below, overridden only where it isn't.

The detailed forecast grid listing tour dates with tickets, sales, net and costs, alongside the order of cost precedence and the promoter deal terms: guarantee, splits, per ticket, first call, second call and risk
The detailed forecast: every date in the book with tickets, sales, net and costs, each shown as forecast, revised, contracted and paid.
04

The deal, written down as arithmetic

The hard part is not the profit. It is who gets it. A promoter deal can carry a guarantee set against a split, a per-ticket payment above an agreed target, a first call off the top to one party and a second call to another, an affiliate taking a cut, and a different apportionment of risk if the night loses money.

That calculation lives in a stored function in the database, taking a profit, a ticket count and nineteen deal-term fields and returning the split three ways. Putting it there rather than in application code means a report across four hundred dates computes the splits in the same query that computes the profit, instead of pulling every booking into memory to do it a row at a time.

Terms cascade the way costs do. Agree them on the show, and every tour and every date created underneath inherits them, until someone negotiates something different for one night.

The public ShowPlanr ticket site on a phone beside a sell-through comparison chart and a grid of tour micro-sites, with the pacing, budgeting, riders, micro-sites, ad spend and access capabilities listed alongside
The public ticket site on a phone, sell-through compared across a season, and the micro-site generator that gives each tour its own page.
05

Is this show selling, or is it just early?

Sales for a live date follow a curve, not a line: a spike at on-sale, a long flat middle, and a rush in the final fortnight. A date at forty per cent eight weeks out can be healthy or dead, and the difference is whether you have seen that shape before.

Before

A number in a spreadsheet and someone's instinct about whether it's enough.

After

This week measured against the same week on every comparable date you've played.

Each booking gets an on-sale target — four months before the date, unless someone sets otherwise — and a week grid generated from it with a weight per week. The forecast is distributed along that curve and the actual sales laid over it, so the question stops being how many have we sold and becomes are we ahead or behind at this point in the sell. A new date's forecast is seeded from the same venue's own history: what comparable shows actually did in that room, rather than what somebody hoped.

06

Moving a live touring business

The old system was still running the business, so the new one had to be filled from it. That is an eight-stage import — shows, media, venues, tours, bookings, deal terms, sales, ad sets — run in order, resumable, with a per-stage timing report and the option to skip or re-run any single stage.

The interesting problems were the mismatches. The old schema held forecast and revised ticket counts on the booking; the new one holds them per price band, so each figure is distributed across the bands with the remainder going to the most expensive first. Bookings with no tour had tours synthesised for them, grouped by show, with start and end dates derived from the bookings themselves. Sales stored as running totals became deltas, with negative steps clamped and logged rather than silently accepted.

Every booking imports inside its own transaction. A bad row rolls back, gets logged with its old identifier, and the import carries on — because at that volume the alternative is a migration that fails at ninety per cent and starts again.

07

Where it stands

ShowPlanr is live. The public ticket site, the promoter back office and the platform console all run on the same Laravel API, so a rule about how a split is calculated, or about who is allowed to see a deal, is written down in one place.

The product belongs to its owner, not to us. Our part was the rebuild: the API, the two front ends, the calculation engine, and the migration that moved a working touring business onto it without stopping the tours.

Is your margin still living in a spreadsheet?

The systems that run real operations are usually a workbook that grew. Moving one into software is less about features than about writing down arithmetic nobody has ever had to state precisely — and then making it survive a hundred edge cases. We have made that move before, for a business that could not pause while we did it.