Project in één oogopslag
Sector
Retail fysieke winkel en webshop
uitdaging
Shopify en kassasysteem draaiden op aparte eilanden met gesplitste voorraad en prijzen
oplossing
Backend synchronisatieplatform als integratilaag tussen Shopify en kassasysteem
Resultaat
Voorraad en prijzen consistent op beide kanalen, geen manuele exports meer
Technologie
Webshop: Shopify
Backend: Node.js
Integratie: REST API
Architectuur: event-based queueing
Resultaat
- Voorraad is consistent over online en fysiek kanaal na elke mutatie.
- Prijswijzigingen verschijnen automatisch in Shopify na aanpassing in het kassasysteem.
- Manuele productbeheer in Shopify is geëlimineerd.
- Online bestellingen worden automatisch verwerkt in het kassasysteem zonder manuele invoer.
- Gecombineerde rapportering is mogelijk zonder manuele samenstelling.
Context
Een retailbedrijf had zowel een fysieke winkel als een online Shopify-webshop. Beide kanalen draaiden op aparte systemen met eigen productcatalogi, voorraadbeheer en verkoopregistratie.
Door de disconnectie liep de voorraad regelmatig uit sync, verschenen prijswijzigingen niet consistent op beide kanalen en vergde rapportering manuele samenstelling uit twee aparte bronnen.
Waarom standaard niet volstond
Shopify biedt standaard integraties met een beperkt aantal kassasystemen. Het gebruikte kassasysteem viel buiten dat ecosysteem en had een eigen API die directe mapping vereiste.
De synchronisatierichting en -frequentie dienden afgestemd te worden op de operationele werking: het kassasysteem was de primaire bron voor producten en prijzen, Shopify voor online bestellingen.
Uitdaging
- Bepalen van de juiste datarichting per entiteit: welk systeem is de bron van waarheid voor producten, prijzen en voorraad.
- Voorraadmutaties in beide richtingen correct bijhouden zonder conflict of overschrijving.
- Productwijzigingen vanuit het kassasysteem propageren naar Shopify zonder manuele export of import.
- Online bestellingen verwerken in het kassasysteem voor correcte voorraadaftrek en rapportering.
- Omgaan met timing: een product dat tegelijk online en in de winkel verkocht wordt kan leiden tot negatieve voorraad.
- Foutafhandeling bij tijdelijke onbeschikbaarheid van een van beide systemen.
Doelstelling
- Producten en prijzen worden centraal beheerd in het kassasysteem en automatisch gesynchroniseerd naar Shopify.
- Voorraad is consistent over beide kanalen na elke mutatie.
- Online bestellingen worden automatisch verwerkt in het kassasysteem.
- Rapportering is mogelijk over beide kanalen samen zonder manuele samenstelling.
- Geen negatieve voorraad door gelijktijdige verkopen.
Oplossing
Er werd een backend synchronisatieplatform gebouwd dat fungeert als de integratilaag tussen Shopify en het kassasysteem. Dit platform is de enige component die met beide systemen praat.
Het kassasysteem is aangewezen als de single source of truth voor productdata en prijzen. Wijzigingen in het kassasysteem worden opgepikt via een webhook of polling-mechanisme en doorgestuurd naar Shopify.
Online bestellingen uit Shopify worden via de integratilaag doorgezet naar het kassasysteem. Na verwerking wordt de voorraad bijgewerkt in Shopify op basis van de bevestiging van het kassasysteem.
Voor voorraadsynchronisatie is een conflictresolutiestrategie gedefinieerd: bij gelijktijdige mutaties geldt een lock-mechanisme om race conditions te vermijden.
Integraties en datastromen
01
Producten
Producten worden aangemaakt en beheerd in het kassasysteem. Wijzigingen worden via de integratilaag naar Shopify gesynchroniseerd.
De mapping tussen kassasysteem-productstructuur en Shopify-producten is vastgelegd in de configuratie van de integratilaag. Nieuwe velden of attributen vereisen een aanpassing van de mapping.
Verwijderde producten in het kassasysteem worden in Shopify gearchiveerd, niet verwijderd, om orderhistoriek intact te houden.
02
Prijzen
Prijzen komen uit het kassasysteem en worden gesynchroniseerd naar Shopify bij elke wijziging. Shopify-prijzen worden nooit manueel aangepast om conflicten te vermijden.
Promoties en tijdelijke prijzen worden apart gesynchroniseerd met een geldigheidsdatum, zodat Shopify de juiste prijs toont zonder dat het kassasysteem continu bevraagd moet worden.
03
Voorraad
Voorraadmutaties worden in beide richtingen bijgehouden. Elke verkoop, zowel online als in de winkel, verlaagt de centrale voorraad.
Bij een online bestelling wordt de voorraad in Shopify onmiddellijk gereserveerd. Na bevestiging door het kassasysteem wordt de definitieve aftrek doorgevoerd.
Een minimumdrempel per product kan worden ingesteld om een veiligheidsmarge te bewaren en verkoop van de laatste eenheid te vermijden.
04
Orders
Online bestellingen vanuit Shopify worden via de integratilaag doorgezet naar het kassasysteem. De mapping omvat klantgegevens, bestelregels, leveringsinfo en betaalmethode.
Na verwerking in het kassasysteem wordt de orderstatus in Shopify bijgewerkt. De klant ontvangt een bevestiging via Shopify.
05
Rapportering
Verkoopdata uit beide kanalen wordt verzameld in de integratielaag en beschikbaar gesteld voor gecombineerde rapportering.
Dagelijkse reconciliatieraporten vergelijken de data van beide systemen en signaleren afwijkingen voor manuele controle.
Betrouwbaarheid en beheer
- Alle synchronisatieoperaties worden gelogd met tijdstip, richting, payload en resultaat. Bij een fout blijft de originele data bewaard voor herverwerking.
- Webhook-events van Shopify worden bevestigd na verwerking. Bij timeout of fout wordt de event opnieuw aangeboden via een retry-queue.
- Race conditions bij gelijktijdige voorraadmutaties worden vermeden via een optimistic locking-strategie op voorraadrecords.
- Bij een tijdelijke onbeschikbaarheid van het kassasysteem worden mutaties gebufferd en verwerkt zodra de verbinding hersteld is. Online bestellingen worden in die periode in een wachtrij geplaatst.
- Dagelijkse reconciliatie detecteert discrepanties die door de synchronisatielogica niet zijn opgevangen.
