Lueira started in March 2023 as a booking engine for mountain sports schools. In an earlier post I wrote about the architectural bet we made from day one: build one multi-tenant system that could serve many schools without forking the codebase every time someone asked for something slightly different. Two years later, that bet has been tested well beyond skiing. Lueira now runs bookings, staff and stock for five distinct sectors, and this post is about what it actually took to stretch one product across that many different activities — where the same core model held up cleanly, and where it needed real, non-trivial work to stop breaking.
1. Five sectors, one core loop
If you look at how we describe Lueira on the site today, there are five sectors listed: winter sports (classes, equipment, online sales, all synced), watersports (classes and camps, calendar, instructors), multi-adventure centers (coordinating activities and instructors through a connected booking engine), diving and underwater sports (organizing dives, selling online, syncing everything in real time), and wine tourism (tastings, reservations, visitors, payments). On paper those look like five different businesses. But underneath, every one of them is running the same loop we described in the booking-engine post: a resource, a time slot, and a capacity limit.
- Winter sports: instructor → ski/snowboard instructor; consumable → skis, boots, passes
- Watersports: instructor → surf/kayak/sailing instructor; consumable → boards, wetsuits, kayaks
- Multi-adventure: instructor → guide; consumable → harnesses, helmets, circuit-specific gear
- Diving: instructor → dive guide/instructor; consumable → tanks, regulators, wetsuits, boat seats
- Wine tourism: instructor → host/sommelier; consumable → bottles, tasting glasses, table seats
2. Where the abstraction held
The parts of the model that generalized well are the parts we'd already made generic on purpose. An instructor, in the database, was never really "a ski instructor" — it was a person with a qualification, a schedule, and a capacity to lead a group. Equipment followed the same pattern: it was already modeled as a limited, trackable resource with a size or variant and a stock count, so wetsuits, kayaks, and wine bottles slotted in without touching the core tables. Even the booking flow barely changed between a ski lesson and a wine tasting.
3. Where it didn't
Weather is the clearest case. A ski lesson and a dive both depend on conditions that a wine tasting never has to think about. Lueira's core booking model has no concept of "this slot might get cancelled by a storm" — that had to be built as an extension layered on top of certain verticals, not folded into the generic loop.
Multi-day and multi-stage activities were the second real gap. A multi-adventure center often sells a circuit — a morning of via ferrata followed by an afternoon of canyoning. Our booking model assumes one resource, one slot, one capacity. A circuit is really several bookings glued together with dependencies between them.
Group dynamics were the third, quieter difference. A ski class has to account for mixed skill levels within one group. A wine tasting group is booked once and stays fixed.
4. The tension that doesn't go away
Two years in, the honest summary is that expanding verticals is not a problem we solved once — it's a tension we manage on every new sector we add. Every time a new type of business asks to run on Lueira, there's a real decision: does this need a new field on an existing generic model, or does it need its own extension layer? We've landed, most of the time, on keeping the core loop untouched and pushing sector-specific logic into layers that sit on top of it. That's held up reasonably well through five sectors. I don't know yet if it holds up through a sixth.
What I'd tell another team doing the same thing: don't assume the abstraction that worked for your first pivot will hold for the next one for free. The right level of abstraction isn't a property of the model — it's a bet you keep re-checking every time you add a sector that's genuinely different from the ones you've already handled.
