Zeintzeonk Nagusi?
Euskal Herriko mapan jokatzen den "muinoko erregea". Aukeratu zure herria, ordaindu azken puja gehi euro bat, eta zure izena eta mezua bertan geratzen dira norbaitek gehiago ordaindu arte. Next.js, Stripe, Postgres eta Realtime, ideiatik produkziora egun batean.
- Produktu propioa
- 2026
- Weba
- Rola: dena
- Egoera: martxan



Jokoak galdera hitzez hitz hartzen du: Araba, Bizkaia, Gipuzkoa, Nafarroa eta Iparraldea, 681 herri, eta bakoitza azkena ordaindu duenarena da. Ez dago titulua eta laurogei karaktereko mezua baino irabazteko, eta horixe da gatza: herriko harrotasuna eta auzokoen arteko pikea.
ZubiLabsen bosgarren produktua da, eta weberako lehena. Abiadura-proba bat ere izan zen: Next.js proiektu huts batetik ordainketa errealak, SEOa eta partekatzeko irudiak dituen webgune martxan dagoen batera, lanegun bakar batean.
Arauak lerro batean sartzen dira, baina diruak zorrotz bihurtzen ditu. Bi pertsonak herri bera ordain dezakete segundo berean, eta bakarrak irabaz dezake. Besteak ezeren truke ordaindu du, eta dirua berreskuratu behar du emailik idatzi gabe. Stripek bi aldiz berresten duen ordainketa batek ezin du bi aldiz zenbatu.
Horma publiko bat ere bada. Izenak eta mezuak edonork parteka dezakeen mapa batean agertzen dira, beraz estekak, irainak eta karaktere ikusezinak ordainketaren aurretik geldiarazi behar dira, ez ondoren. Eta dena euskaraz egon behar zuen, datu ofizialek gehienetan gaztelaniaz edo frantsesez ematen dituzten 681 herri-izenak barne.
Orrialde bakarra, mapa goian. Herri bakoitzak bere prezioaren kolorea du, libretik 500 € edo gehiagora; bat ukitzean haren fitxa irekitzen da, egungo nagusiarekin, mezuarekin, noiztik den nagusi eta gutxieneko pujarekin. Maparen azpian: 681 herrien bilatzailea, pujak zuzenean, herri garestienak, herri gehien dituzten nagusiak eta lurralde bakoitzaren aurrerapena.
Puja Stripe Checkout bidez egiten da. Zerbitzariak izena, mezua eta zenbatekoa egiaztatu eta saio bat irekitzen du; webhookak puja aplikatzen du ordainketa berresten denean, eta mapa ireki guztiak Supabase Realtime bidez eguneratzen dira. Herri bakoitzak bere orria, partekatzeko bere irudia eta Instagram eta WhatsApp istorioetarako 1080×1920 irudi bertikala ditu, beraz erosketa bakoitza ondoko herriarentzako gonbidapena ere bada.
Dena. Jokoaren arauak, datu geografikoak eta haien garbiketa, diseinua eta euskarazko testuak, Next.js aplikazioa, datu-basearen eskema eta puja-funtzioa, Stripe itzulketa automatikoekin, moderazioa, denbora errealekoa, herri bakoitzeko orria duen SEOa, partekatzeko irudiak, lege-orriak eta hedapena.
Erabaki nagusiak, eta zergatik:
- Puja Postgres funtzio bat da. puja_egin funtzioak Stripe saioa lehendik prozesatu den egiaztatzen du, herriaren errenkada SELECT … FOR UPDATE bidez blokeatzen du, zenbatekoa egungo prezioarekin alderatzen du, eta herria eta puja transakzio berean idazten ditu. Aldi bereko bi ordainketa datu-baseak ordenatzen ditu; aplikazioaren kodeak ez du lasterketarik kudeatu beharrik.
- Webhooka da idazle bakarra. Nabigatzaileak ez du inoiz pujarik idazten. Ordainketa-bideak saio bat irekitzen du soilik; puja Stripek ordainketa berresten duenean aplikatzen da, ordainketa-metodo atzeratuak barne. Bitartean norbaitek gehiago ordaindu duela erantzuten badu funtzioak, webhookak dirua berehala itzultzen du.
- Nabigatzailetik irakurtzeko soilik. Row Level Securityk edonori uzten dio herriak eta pujak irakurtzen, eta inori ez idazten; idazketek gako sekretua erabiltzen dute, zerbitzarian soilik. Orriko gako publikoa nahikoa da maparako eta Realtimerako, eta ez du beste ezertarako balio.
- Geografia estatikoa. Udal-mugak IGN/INEtik datoz Hegoalderako eta geo.api.gouv.fr-tik Iparralderako, mapshaperrekin sinplifikatuak eta fitxategi estatiko gisa zerbitzatzen den GeoJSON batean bilduak, euskarazko izenak Wikidatatik. Datu-baseak aldatzen dena baino ez du gordetzen: prezioa, nagusia eta mezua.
- Bi irabazle herri baterako. Stripek ordainketak modu asinkronoan berresten ditu, eta gertaera bera bi aldiz bidal dezake. Puja idenpotentea da saioaren idaren arabera, errenkadaren blokeoak erabakitzen du nor iritsi den lehenengo, eta galtzaileari dirua automatikoki itzultzen zaio. Arauen orriak argi esaten du, inor ez harritzeko.
- Edonork idazten duen horma. Izen eta mezuei kontrol- eta norabide bikoitzeko karaktereak kentzen zaizkie, 30 eta 80 karakterera mugatzen dira, estekak bilatzen dira, eta hitz-zerrenda batekin alderatzen dira azentuak eta leetspeaka normalizatu ondoren. Dena Stripe deitu aurretik gertatzen da, beraz inork ez du ordaintzen baztertuko den mezu baten truke.
- Izen bera, bi herri. Herri batzuek izen bera dute lurralde desberdinetan. Slugak euskarazko izenarekin eraikitzen dira eta talka dagoenean bakarrik gehitzen zaie lurraldea, beraz herri bakoitzak URL labur, egonkor eta irakurgarri bat du partekatzeko eta sitemaperako.
Joko osoa duen webgune bat martxan: 681 herrien mapa, ordainketa errealak eta itzulketa automatikoak dituzten pujak, denbora errealeko eguneraketak bost segundoko ordezkoarekin, herri bakoitzeko orria eta partekatzeko irudiak, istorioetarako irudiak, sailkapenak, bisitarien kontagailua, lege-orriak eta gakorik gabe dabilen demo modua.
ZubiLabsentzat abiaduraren froga da: ordainketak, konkurrentzia-bermeak dituen datu-basea eta SEO serioa dituen produktu bat, hasi zen egun berean produkzioan.
- Araua, datuak dauden lekuan. Puja bat aplikatzen den uneko prezioaren aurrean bakarrik da baliozkoa. Errenkada blokeatuta duen datu-base funtzio batean egiaztatzeak produktuaren zatirik zailena SQL lerro gutxi batzuk bihurtu zituen.
- Itzuli, galarazi beharrean. Ordainketak irauten duen bitartean herria erreserbatzeak itxaron-denborak, utzitako ordainketak eta herri blokeatuak ekarriko zituen. Biei ordaintzen utzi eta galtzaileari dirua itzultzea sinpleagoa da kodearentzat eta bidezkoa jokalariarentzat.
- Erosketa bakoitza partekatu egiten da. Herri bakoitzeko orri, irudi eta istorio batek puja bakoitza ondoko herriarentzako mezu bihurtzen dute. Hazkunde-begizta produktuan dago, ez kanpaina batean.