Multi-tenant PIM-platform — AI-verrijking & multichannel sync

Voor een e-commerce merk met duizenden actieve producten bouwde ik een Product Information Management platform dat productdata centraliseert, met AI verrijkt en synchroon houdt over Shopify, marketplaces en ERP — met een mens die elke wijziging controleert voordat die live gaat.

Multi-tenant PIM
AI-verrijking
Vector search / RAG
Multichannel sync

Rol & scope

Volledig ontworpen en gebouwd, en sindsdien doorlopend doorontwikkeld: een multi-tenant PIM-platform met tenant-isolatie (super admin, tenant admin, tenant user), een draft/publish-workflow zodat elke wijziging eerst gereviewd wordt voordat die live gaat, en volledige audit-logging met before/after-snapshots.

  • Shopify-first synchronisatie, met daarnaast NetSuite ERP-koppeling en export naar Amazon en andere marketplaces via ChannelEngine.
  • AI-verrijking van titels, beschrijvingen, SEO-teksten en vertalingen — met een reviewstap voordat gegenereerde content gepubliceerd wordt.
  • Een ingebouwde RAG-assistent die het productteam via chat laat zoeken en werken in de catalogus: vector search over productdata, met tool-aanroepen voor acties die de gebruiker eerst moet goedkeuren.
  • Een losse Chrome-extensie waarmee het team producten op marketplace-paginas direct in de verrijkingsqueue kan zetten.
  • EU GPSR-compliance module, SEO-module met keyword-volume-validatie, en achtergrondtaken (vector-sync, verrijking, scheduler) via een queue met retries.

Impact

  • Ruim 3.400 actieve producten in de kernmarkt, met exportstromen naar honderden extra listings op marketplaces als Amazon.
  • Een AI-vertaalpipeline die stilzwijgend categorie-URL's overschreef, teruggedraaid en vervangen door een versie die redirects aanmaakt en alles in een audittrail vastlegt.
  • Een sync-bug waarbij elke NetSuite-koppeling AI-content en Shopify-wijzigingen overschreef, structureel opgelost in plaats van telkens handmatig hersteld.
  • Ruim 350 commits over acht maanden doorlopende ontwikkeling — geen eenmalige oplevering maar een systeem dat meegroeit met het assortiment.

Architectuur

Turborepo-monorepo met een NestJS-backend en een Next.js 14 (App Router) frontend, gedeelde Prisma-database-package en gedeelde types. PostgreSQL met de pgvector-extensie slaat zowel productdata als embeddings op, zodat vector search en reguliere queries op dezelfde database draaien. Achtergrondwerk (vector-sync, AI-verrijking, marketplace-sync) loopt via Redis-gebackte queues met automatische retries en exponential backoff, losgekoppeld van de gebruikersinterface zodat een trage marketplace-sync de rest van het platform niet blokkeert.

Modelkeuze

De ingebouwde RAG-assistent is bewust multi-provider: verschillende taken lopen via verschillende modellen (van een goedkoop model voor routinematige chat tot zwaardere Claude- en GPT-varianten voor complexere verrijkingstaken), met per-model tokenprijzen bijgehouden zodat kosten per gesprek zichtbaar zijn in plaats van een black box. Gegenereerde content (titels, beschrijvingen, vertalingen) gaat altijd eerst naar een reviewstap — het model stelt voor, een mens keurt goed, dezelfde reden waarom bijvoorbeeld ook prijslogica in andere projecten nooit rechtstreeks door een taalmodel loopt.

Kosten & latency

  • Per-conversatie tokenkosten worden bijgehouden per model, zodat duurdere modellen bewust en zichtbaar ingezet worden, niet standaard.
  • Achtergrondtaken (vector-sync, verrijking) draaien asynchroon met maximaal 3 retries en exponentiële backoff, zodat een tijdelijke marketplace-storing niet meteen tot dataverlies leidt.
  • Vector search en reguliere productqueries draaien op dezelfde PostgreSQL-instantie (pgvector), wat een aparte vector-database en de bijbehorende sync-laag overbodig maakt.

Lessons learned

De AI-vertaalpipeline overschreef categorie-URL's zonder waarschuwing zodra een vertaling opnieuw gegenereerd werd — goed voor SEO leek het, maar brak bestaande externe links. Opgelost door historische URL's te herstellen, redirects toe te voegen en een audittrail in te bouwen die zulke wijzigingen voortaan zichtbaar maakt vóór ze live gaan. Een tweede bug: elke NetSuite-synchronisatie overschreef AI-gegenereerde content en Shopify-wijzigingen zodra een product aan NetSuite gekoppeld werd — geen incident maar een structureel patroon, opgelost door de sync-richting te herzien in plaats van telkens handmatig te herstellen. En een derde, kleiner maar illustratief: de vertaalpipeline vertaalde materiaalafkortingen als "RVS" fout, opgelost met een expliciete woordenlijst-regel in plaats van te vertrouwen op het model om domeinkennis te raden.