Naar hoofdinhoud
Casestudy · Webontwikkeling en e-commerce

Casestudy: eclipseando.com, een website en e-commerce-backend vanaf nul gebouwd in 19 dagen

Een eigen website met 8.132 gemeentepagina's in zeven talen, een webshop met Stripe en vier verschillende logistieke leveranciers gekoppeld via API, webhook of e-mail. Zo is het gebouwd, en wat ervan bruikbaar is voor jouw webshop.

Interactieve kaart van eclipseando.com met de totaliteitszone over Spanje, de gemeentezoeker en de schakelbare lagen

Op 12 augustus 2026 was er een totale zonsverduistering boven Spanje. Op 24 juli bestond eclipseando.com niet: geen domein, geen ontwerp, geen regel code. Negentien dagen later stond de website online, met een pagina voor elke gemeente in Spanje, een webshop die via Stripe betaalde en een logistieke keten die bestellingen plaatste bij vier verschillende leveranciers. We vertellen het hier omdat dit het project is dat het best laat zien hoe we werken wanneer de opdracht "een website en een backend vanaf nul" is, en omdat elk onderdeel in productie staat en te bezoeken is.

Kernidee: een e-commerce-website is geen sjabloon met een betaalknop. Het is de frontend, de kassa, de gegevensopslag en de koppelingen met wie produceert en wie verzendt. Bij eclipseando.com hebben we die vier lagen zelf geschreven, en elke laag is gedekt door tests die vóór elke publicatie draaien.

De opdracht: een website met een houdbaarheidsdatum

Het project was van ons, niet van een klant, en dat maakt het een eerlijker voorbeeld: er was geen budget om op te rekken en geen onderhandelbare deadline. De datum werd bepaald door de hemel. De eisen kwamen voort uit voorafgaand onderzoek en waren concreet: de vraag "hoe laat en hoeveel zie ik vanuit mijn dorp?" beantwoorden voor elke gemeente in Spanje, gecertificeerde brillen en gepersonaliseerde souvenirs per gemeente verkopen, en dat ook doen in het Catalaans, Engels, Duits, Frans, Italiaans en Portugees, omdat een deel van het publiek uit het buitenland kwam.

We hebben Shopify en WooCommerce uitgesloten voordat we begonnen. Niet vanwege de prijs, maar omdat het moeilijke deel van het project niet de webshop was: het waren de 8.132 berekende pagina's, de kaart, de wolkenvoorspelling en logistieke koppelingen die geen enkel platform standaard meebrengt. Wanneer de waarde zit in wat niet standaard meekomt, staat het platform meer in de weg dan dat het helpt. Datzelfde criterium passen we toe wanneer een klant ons vraagt of hij zijn website op Odoo Website of apart moet bouwen.

Wat er is gebouwd, stuk voor stuk

OnderdeelWat het doetWaarmee het is gebouwd
Frontend8.132 gemeentepagina's, kaart, zoekfunctie, webshop en blog, in zeven talen met een eigen URL per taal.Statische site gegenereerd met Astro; geserveerd door nginx op een eigen server.
APIWinkelmandje, checkout, levering van de digitale kit, bestellingen bij leveranciers, tracking, nieuwsbrief, wolken per gemeente, analytics zonder cookies en beheerpaneel.FastAPI in Python, status in SQLite, 1.370 geautomatiseerde tests.
BetalingStripe Checkout met een ondertekende webhook; de prijs wordt altijd op de server berekend, nooit in de browser.Stripe-API; taal van de betaalpagina volgt de webshop waarin gekocht wordt.
LogistiekVier leveranciers: twee met een API, een met een dropshipping-API en een zonder API waaraan de bestelling per e-mail en CSV wordt doorgegeven.Eigen koppelingen, het uitlezen van de mailbox van de vervoerder en berichten aan de koper.
Geplande takenZeven timers: mailbox, wachtrijen, nieuwe pogingen, wolken, levertijden van de drukkerij en het hemelrapport.systemd-units op dezelfde server.

De frontend: 8.132 pagina's die worden berekend, niet geschreven

Elke gemeente in Spanje heeft een eigen pagina met het begintijdstip, het maximum, het einde, het bedekkingspercentage en, in de totaliteitszone, de seconden duisternis. Die gegevens heeft niemand ingetypt: ze worden berekend op het moment dat de site wordt gegenereerd, op basis van de elementen van de zonsverduistering en de coördinaten van elke gemeente, en een test vergelijkt een steekproef van resultaten met die van het Instituto Geográfico Nacional. Als de berekening afwijkt, wordt de site niet gepubliceerd. Naast Spanje zijn er overzichten voor Portugal, Frankrijk, Italië, Duitsland, Ierland, IJsland, Groenland, Marokko, Nederland en het Verenigd Koninkrijk.

De meertaligheid is echt, geen automatische vertaling eroverheen: elke taal heeft een eigen pad (/ca/, /en/, /de/…), eigen teksten en eigen shoppagina's, en tests controleren dat de zeven versies van elk sjabloon bestaan en naar elkaar verwijzen. Het is dezelfde regel die we toepassen op flexigotech.com en pernocta.eu.

De backend: een kleine API die kassa, magazijn en balie in één is

Alles wat statisch is, wordt door nginx geserveerd. Alles wat dynamisch is, hangt onder /api/* en is een FastAPI-applicatie met de status in SQLite. Het klinkt bescheiden, en dat is bewust zo: één persoon onderhoudt het, het draait op een server van een paar euro en het verwerkte de piek op de dag van de zonsverduistering zonder aanpassingen. De beslissingen die ertoe doen zitten er binnenin:

  • Het winkelmandje wordt op de server gewaardeerd. De browser bewaart de regels, maar elke prijs wordt herberekend aan de hand van de actuele catalogus bij het aanmaken van de betaalsessie. Anders opent iedereen de console en koopt een sweatshirt voor een euro.
  • De Stripe-webhook beslist. Een betaling geldt als ontvangen wanneer Stripe die bevestigt met een geverifieerde handtekening, niet wanneer de browser terugkeert op de bedankpagina. Als de bestelling bij de leverancier mislukt na de betaling, geeft de API een foutmelding zodat Stripe het opnieuw probeert, en een tabel met de sessie-id voorkomt dat er twee keer wordt geproduceerd.
  • Het digitale product wordt geleverd met een ondertekende link (HMAC, vervalt na 72 uur, maximaal vijf downloads) en het vakje voor afstand van het herroepingsrecht is verplicht vóór de betaling: de API weigert de checkout van de kit als het niet is aangevinkt.
  • E-mails gaan niet verloren. Elke bevestiging verstuurt via Brevo; als Brevo niet reageert, komt de e-mail in een wachtrij in SQLite die een timer elke vijftien minuten leegt. Een koper zonder bevestigingsmail is een klacht, dus die regel kent geen uitzonderingen.

De logistieke koppelingen: vier leveranciers, vier manieren van communiceren

Dit is het deel dat het meest lijkt op wat klanten ons vragen. De webshop verkocht dingen die uit verschillende plaatsen kwamen, en elke plaats communiceerde op zijn eigen manier:

  • Een drukkerij met API en webhook. Bij betaling genereert de API het printbestand (een SVG-sjabloon met de naam van de gemeente, het tijdstip en de duur, gerasterd op 300 dpi), maakt de bestelling aan en wacht op de webhook "verzonden" om de koper zijn tracking te sturen.
  • Een tweede drukkerij met een fabriek in Barcelona voor kleding, omdat de eerste geen kleding in Spanje produceerde en de levertijd niet haalbaar was. Beide API's zijn met echte bestellingen gemeten voordat er werd beslist; de mok bleef bij de eerste omdat die wel hier werd gemaakt.
  • Een brillenfabrikant met een dropshipping-API die verzendt naar Spanje, Frankrijk, Duitsland, het Verenigd Koninkrijk en Portugal. De bestelling wordt automatisch aangemaakt bij betaling, en vóór de betaling wordt de werkelijke beschikbaarheid per land opgevraagd.
  • Een distributeur zonder API. Hij verzendt de brillen binnen 24-48 uur op het schiereiland en de Balearen, maar de bestelling wordt per e-mail doorgegeven. Het paneel levert met één klik precies wat hij nodig heeft: ontvanger, adres, telefoon, artikel en aantal, als tekst en als bijgevoegde CSV. En omdat zijn zendingen met GLS vertrekken, leest de API elke tien minuten de mailbox uit, classificeert de e-mails van de vervoerder (onderweg, in afhaalpunt met uiterste afhaaldatum, afwezig) en informeert de koper over elk daarvan.

Een gevolg dat klein lijkt en dat niet is: een bestelling met brillen en een T-shirt zijn twee pakketten van twee leveranciers. Daarom leeft de tracking per zending en niet per bestelling, met een rij voor elk paar bestelling-leverancier. Eén veld "trackingnummer" had gewerkt tot de eerste klant die beide kocht.

Levertijden worden gemeten, niet beloofd

De offerte-API van de drukkerij antwoordde "standaardlevering, 5-10 dagen" voor alles, ook voor producten die ze later weigerde bij een echte bestelling. Dat ontdekten we door een verkoop die niet geleverd kon worden. Sindsdien maakt een timer elke nacht een conceptbestelling aan voor elke combinatie van product en land, leest de vervoerder en de werkelijke dagen die de drukkerij teruggeeft, en verwijdert die. Die cijfers, en niet die uit de documentatie, ziet de koper op de productpagina voordat hij betaalt. Het is dezelfde les die we toepassen op Odoo-connectoren: een groene test tegen een mock bewijst niets; je moet meten tegen het echte systeem.

Wat vanzelf draait

Zeven systemd-units doen wat in een kleine webshop meestal iemand met de hand doet: elke tien minuten de mailbox van de vervoerder uitlezen, de e-mailwachtrijen leegmaken en betaalde bestellingen zonder productie elke vijftien minuten opnieuw proberen, elke drie uur de wolkenvoorspelling van AEMET verversen voor de meest bezochte gemeenten en dagelijks de levertijden van de drukkerij meten. Geen enkele roept een externe dienst aan in het pad van een webverzoek: de pagina's lezen uit de cache, en een test garandeert dat.

Wat hiervan bruikbaar is voor jouw webshop

Bijna alles, als je de zonsverduistering vervangt door jouw assortiment. Wat een klant ons vraagt wanneer hij zegt "ik wil een e-commerce-website vanaf nul" is precies deze lijst: een snelle, meertalige frontend, een kassa die niet te foppen is, koppelingen met wie produceert en wie verzendt, tracking die de klant bereikt zonder dat iemand die met de hand overtypt, en taken die vanzelf draaien. Wanneer de klant al Odoo heeft, wordt die API vervangen door het ERP zelf en zijn de koppelingen vervoerderconnectoren binnen Odoo; wanneer hij dat niet heeft, of zijn bedrijf niet in een ERP past, wordt het gebouwd zoals hier.

Veelgestelde vragen

Waarom is het niet gebouwd met Shopify of WooCommerce?

Omdat het moeilijke deel niet de webshop was maar wat eromheen zat: 8.132 berekende pagina's, een eigen kaart, weersvoorspelling en vier verschillende logistieke koppelingen. Wanneer de waarde zit in wat het platform niet meebrengt, is het platform een vaste kostenpost die bovendien beperkt. De webshop zelf, met Stripe Checkout, was een klein deel van het werk.

Hoe koppel je een leverancier die geen API heeft?

Door het menselijke werk terug te brengen tot één klik en te automatiseren wat wel via een leesbaar kanaal binnenkomt. Bij eclipseando.com verlaat de bestelling bij de brillendistributeur het paneel als tekst en CSV, klaar om in een e-mail te plakken, en worden de berichten van de vervoerder elke tien minuten uit de mailbox gelezen en omgezet in statussen en e-mails aan de koper.

Kan hetzelfde op Odoo?

Ja, en het is gebruikelijk wanneer de klant al het ERP heeft: de frontend koppelt aan Odoo, het winkelmandje en de bestelling leven in de verkoop, en de vervoerders komen binnen via connectoren die in de App Store van Odoo staan. Het wordt apart gebouwd wanneer er geen Odoo is of wanneer de kern van het bedrijf, zoals hier, geen catalogus is maar een berekening.

Nuttige links binnen FlexigoTech

MaatwerkontwikkelingWebsites, backends en Odoo-modules vanaf nul geprogrammeerdWebontwikkeling: onze projecten in productieeclipseando.com, pernocta.eu en clentic.comLogistieke integratie in OdooVervoerders, labels en tracking binnen het ERPEen e-commerce-website vanaf nul ontwikkelen met logistieke integratieDe vijf lagen en in welke volgorde ze worden gebouwd

Wat wij hierover doen

Webontwikkeling en e-commerceWat het doet, screenshots, versies en prijs.

Heb je een website of webshop nodig die vanaf nul is gebouwd, met gekoppelde logistiek?

Vertel ons wat je verkoopt, wie het maakt en wie het verzendt. Wij zeggen je wat er gebouwd wordt, wat via API wordt gekoppeld en wat niet geprogrammeerd hoeft te worden. Schrijf naar comercial@flexigobe.com of bel +34 616 809 504.

Praat met een engineer