RevoTickets, for Revolution Stage · 2025–2026 · the build

building RevoTickets

RevoTickets is the event-ticketing platform I build for Revolution Stage, a Malaysian live-events company. This is the project-management side of it: how a small, AI-augmented team shipped a real seat-selling product in waves, the timeline it actually took, and what got cut to make a launch date. The three posts before this one dug into single hard problems. This one steps back and looks at the whole thing.

The RevoTickets storefront home page
RevoTickets · storefront
Responsibilities

Product, delivery, full-stack build

Technology stack

Rails 8, Bullet Train, Hotwire, PostgreSQL, Solid Queue, ToyyibPay

Year

Status

Pre-launch, GA target Sep 2026

Summary

Revolution Stage puts on live theatre and music in Malaysia, and they needed a way to sell reserved seats for their own shows without handing a cut and their audience data to a third-party platform. RevoTickets is that: a bilingual (English and Malay) storefront that sells numbered seats, takes payment through the local bank rails, and hands over a scannable entry pass. I own the product and the build. The interesting part, for a project-management write-up, is that this got built the way a much larger team would build it, by one to two people leaning hard on AI, and the discipline that made that possible is worth more than any single feature.

Here is what it looks like today, on a laptop and on a phone.

What it had to do

A ticketing platform sounds like a solved problem until you write down the list. Model a real hall, seat by seat. Show it to a buyer who is choosing where to sit, and keep that map honest while other people are grabbing seats at the same second. Take money through FPX, which is how Malaysians actually pay online, and survive that gateway going quiet mid-transaction. Issue a wallet pass. Let door staff check people in from a phone. Do all of it in two languages, and do it as a proper multi-tenant system so more than one organiser can run on it later.

None of those are hard on their own. The job was getting all of them to stand up together and stay standing while the requirements kept moving. The event page below is the middle of the funnel: pick a show, read the synopsis, go choose seats.

Shipped in waves, behind a gate

The method that made a small team move like a big one was boring and strict: break the work into small waves, plan each wave in writing before touching code, review it, and then lock the result behind an automated gate so it could never regress. Every wave left the product shippable. Nothing sat half-finished on a branch for a month.

  1. 1

    Plan in writing

    Each wave started as a short plan document: what it delivers, what it explicitly does not, and how to tell it worked. Deciding scope on paper is cheaper than deciding it in code.

  2. 2

    Review before building

    Plans got a review pass, sometimes from a second opinion, before implementation. More than one design decision got reversed at this stage, which is exactly where you want to reverse it.

  3. 3

    Build the wave

    Implement the slice, keep the app shippable at the end of it. A wave that leaves the product broken is not a wave, it is a debt.

  4. 4

    Ratchet the gate

    Lock the win behind an automated check that fails the build on a regression. The design system, for instance, is enforced by a test that rejects a stray colour or an off-scale spacing value. You only have to win each fight once.

The timeline it actually took

The heavy building happened across 2026, in overlapping tracks rather than a tidy single file. Language coverage and a framework upgrade came first, then the seat-map foundation and the design-system re-skin ran alongside the venue and booking work, and the public storefront got its own revamp near the end. The chart below is the shape of it.

            gantt
              title RevoTickets, the 2026 build
              dateFormat YYYY-MM-DD
              axisFormat %b
              section Foundations
                Bahasa Malaysia coverage        :2026-05-15, 12d
                Bullet Train 1.44 upgrade        :2026-05-17, 6d
              section Seat map
                Seat-map foundation (Plans A-E)  :2026-07-08, 10d
                Hall builder                     :2026-07-20, 33d
              section Design system
                Foundation + ratcheting gate     :2026-07-03, 12d
                Primitives and waves             :2026-07-15, 32d
              section Venues and bookings
                Bookings wave (PR A-C)           :2026-07-03, 20d
                Venue-streamline (Waves 0-3)     :2026-07-22, 12d
              section Storefront
                Public marketing revamp          :2026-08-13, 12d
              section Launch
                GA hardening (M1)                :2026-08-25, 24d
            
The 2026 build, in overlapping tracks. July was the peak: a single week hit 134 commits, and the month as a whole ran past 350.

A fair caveat on the numbers, because the Work section is for honest facts and not sales copy: the repository was started from a Bullet Train template years earlier, so a raw commit count includes inherited history and overstates the bespoke work. The delivery intensity is real though, and the peak-week figure is the part I would stand behind: 134 commits in seven days is what a deadline looks like.

The seat map, a project of its own

The single biggest line item was the seat map, and it earned that. It is not one screen, it is a builder for staff to lay out a hall, a preview, a live buyer view, and the engine that draws them all from the same source. It went through its own set of plans (seat identity, a serializer, real-time updates, roles, then a cutover) before it was trustworthy. If you want the gory detail of how a right-to-left row keeps its aisle in place, that is the first post in this series. Here is the buyer's-eye result, on both screens.

What is under the hood

For a sense of the surface area one or two people were keeping in the air, here is the count as it stood mid-year. An independent bottom-up estimate put a from-scratch rebuild of this at roughly 1,700 hours of work.

34
Domain models
61
Database tables
215
Migrations
~14.3k
Lines of Ruby

Ninety-six controllers, seventeen background jobs, a fistful of service objects, thirty Stimulus controllers on the front. It is not a small app pretending to be big. It is a real one that a small team kept honest with tests and gates.

What got cut, and why that mattered

The most useful project-management work on RevoTickets was deciding what not to build. A launch date only exists if you are willing to move things off the near list, and we moved plenty. The organiser analytics dashboard, the people merge-and-invite flows, and the in-app help centre were all split out of the design-system re-skin so it could actually finish, rather than sprawling until it never did. A planned move to self-hosted infrastructure got deferred whole, with only the one piece that a nearer feature needed pulled forward. The hall builder shipped English-only on purpose, because translating an internal staff tool that only a handful of people use was not worth holding a launch for.

Every one of those was written down as a decision with a reason, not lost in a backlog. That is the difference between deferring something and dropping it.

The road ahead

RevoTickets is pre-launch as I write this, and it is not vapour: it has already sold real seats to real Revolution Stage shows through the checkout described in these posts. The plan from here is staged, roughly six milestones over two years, each one a fundable chunk rather than a wishlist. The near one is the only one with a date I would defend.

  1. 1

    Public launch (GA) · target Sep 2026

    The money path hardened, payment reconciliation automated, an accessibility pass, load testing, and launch operations. Most of this milestone is making the payment side boringly reliable.

  2. 2

    Organiser self-serve · late 2026

    An analytics dashboard, settlement and payout statements, and the people invite-and-merge flows that were deferred out of the launch.

  3. 3

    Infrastructure and scale · early 2027

    The deferred move to self-hosted infrastructure, monitoring and backups, tighter security headers. Housekeeping that buys headroom.

  4. 4

    Promoter platform · mid 2027

    Multi-tenant white-labelling for other promoters, plus a discovery and marketplace portal so events are findable, not just linkable.

  5. 5

    Mobile and offline · late 2027

    An installable app, a sturdier offline check-in scanner for the door, and wallet-pass polish.

  6. 6

    Marketplace and regional · 2028

    Recommendations, an additional payment gateway for cards and international buyers, and a partner API.

What I took from it

If the single-problem deep dives are more your thing, the three posts below pull apart the seat map, the payment path, and the seat-selling race one at a time.

the RevoTickets deep dives

22.08.2026
The Aisle That Moves

The seat-map engine, and the right-to-left row that has to mirror without moving its aisle.

Read more
23.08.2026
Money Out, No Ticket

Deciding whether a customer really paid, without trusting the gateway that says they did.

Read more
24.08.2026
Two People, One Seat

Never selling the same seat twice, across a booking that leaves for the bank and comes back.

Read more