Tots els articles

De SnowTeach a un marketplace genèric: RocRoi, KayakGrandTour, NaturaAdventour

Publicat 8 d’ag. del 20254 min de lectura
  • Producte
  • Marketplace
  • Enginyeria
De SnowTeach a un marketplace genèric: RocRoi, KayakGrandTour, NaturaAdventour

Idees clau

  • Van caldre uns dos anys i mig, i portar primer RocRoi i després KayakGrandTour, perquè la pregunta oberta de SnowTeach quedés prou validada per invertir a generalitzar-la.
  • Un backend en Go amb Ent, un CMS en Directus i un storefront i backoffice en Next.js donen avui servei a RocRoi, KayakGrandTour i NaturaAdventour mitjançant variables d'entorn, no mitjançant tres codis bifurcats.
  • A diferència del multi-tenant de Lueira, aquestes tres marques comparteixen la mateixa lògica de reserves i inventari però necessiten marca, SEO i contingut genuïnament diferents perquè poden competir pel mateix client.
  • El nucli compartit està fent créixer un servei d'IA basat en Mastra per a SEO i traduccions, a més d'un servidor MCP de catàleg que exposa widgets interactius.

Al desembre de 2022 vaig escriure sobre SnowTeach, el nostre primer marketplace de dos costats, i vaig acabar aquell article amb una pregunta que sincerament no sabia respondre: si funciona, hi ha a sota una versió més general d'aquesta plataforma — no un marketplace específic per a classes d'esports de neu, sinó per a altres activitats a l'aire lliure que topen amb el mateix problema de dos costats? Vaig dir en aquell moment que no saber-ho era precisament el motiu d'escriure-ho. Han calgut uns dos anys i mig, i dues marques més funcionant sobre el mateix codi, per esbrinar-ho de debò.

1. Què ha canviat des de SnowTeach

SnowTeach va funcionar prou bé, i ens va ensenyar prou sobre com portar un marketplace, que la següent prova natural no era "hauríem de construir-ne un altre" sinó "pot la mateixa plataforma sostenir una marca diferent?". RocRoi va ser aquesta prova: activitats d'aventura a Espanya, ràfting i caiac entre elles, un esport diferent i un client diferent del de les escoles d'esquí i snowboard, però amb la mateixa forma de dos costats reconeixible a sota.

Després va arribar KayakGrandTour, i aquesta marca va estirar el model molt més del que ho havia fet RocRoi. No és un marketplace d'una sola regió com ho van ser al principi SnowTeach i RocRoi; és un catàleg estatal, multi-destinació, que abasta Cantàbria, Lleó, Menorca, València, Saragossa, Lleida, Màlaga i més, entre caiac, ràfting, barranquisme, piragüisme, SUP, via ferrata, triatló, senderisme i paquets multiaventura. Aconseguir que un catàleg tan variat es comportés de manera consistent va ser el que realment va forçar la pregunta que SnowTeach només havia plantejat.

Quan va arribar NaturaAdventour com a tercera marca, el patró ja era innegable: ja no estàvem construint marketplaces d'un en un, estàvem construint el mateix marketplace tres vegades amb roba diferent.

2. Un sol codi, tres marques

El que vam generalitzar és un backend en Go amb Ent com a ORM, Directus com a CMS, i un storefront i backoffice en Next.js — un únic codi que avui dona servei a RocRoi, KayakGrandTour i NaturaAdventour mitjançant variables d'entorn en lloc de tres bifurcacions. Un sol pipeline de desplegament, un sol motor de reserves i inventari, un sol model de catàleg. El que canvia per marca és la configuració: identitat de marca, domini, textos i presentació de l'storefront, no la lògica de sota.

Aquest és el guany avorrit i poc glamurós de generalitzar tard en comptes d'aviat. Si haguéssim intentat dissenyar un "marketplace genèric d'aventura a l'aire lliure" des del primer commit de SnowTeach, hauríem estat endevinant requisits que RocRoi i KayakGrandTour encara no ens havien ensenyat.

3. Un "un nucli, moltes cares" diferent del de Lueira

Ja he escrit abans sobre per què Lueira, la nostra plataforma de reserves per a escoles esportives, es va dissenyar multi-tenant des del primer dia. És el mateix instint en joc aquí — un nucli que serveix molts — però l'eix de variació és genuïnament diferent.

Els tenants de Lueira són negocis diferents: una escola d'esquí al Pirineu i un centre de busseig a Canàries, que comparteixen infraestructura i back office, però que mai veuen les dades de l'altre ni competeixen pel mateix client. L'aïllament és tot l'objectiu.

RocRoi, KayakGrandTour i NaturaAdventour no són negocis separats en aquest sentit — són un sol negoci amb tres aparadors diferents, i aquests aparadors sí que poden competir de debò per la mateixa persona. Algú que busqui una sortida en caiac a Espanya podria acabar a RocRoi o a KayakGrandTour. Això vol dir que la marca, el SEO i el contingut de cada marca no poden ser un simple canvi d'aparença cosmètic — cada marca necessita la seva pròpia veu, el seu propi posicionament, la seva pròpia empremta de cerca, o es canibalitza a si mateixa en lloc de sumar abast. El difícil no és compartir la lògica de reserves i inventari; el difícil és fer que tres marques que comparteixen columna vertebral semblin i es llegeixin com si no la compartissin.

4. Què ve: una capa d'IA al nucli compartit

El repositori central sobre el qual corren les tres marques ha començat a fer créixer una capa que cap tenia en l'etapa de SnowTeach: un servei d'IA basat en Mastra que genera SEO i descripcions de producte i s'encarrega de les traduccions, combinant Claude Sonnet, Claude Haiku i GPT-5-mini segons la tasca. Al costat hi ha un servidor MCP de catàleg que exposa widgets interactius de tipus "MCP App" — targetes de producte, un calendari de disponibilitat — pensats per renderitzar-se dins d'un client compatible amb MCP com Claude o ChatGPT. Ja he escrit en un altre lloc sobre per què a Maladeta construïm servidors MCP per a gairebé tot, així que no repetiré aquest argument aquí.

Res d'això era el pla quan vam llançar SnowTeach. La pregunta amb què vaig acabar aquell article es va quedar sense resposta durant dos anys i mig, i no es va respondre asseient-nos a dissenyar una plataforma genèrica — es va respondre portant una segona marca, després una tercera, i adonant-nos de com de poc codi calia canviar per fer-ho.