Roll & omfattning
Helt designad och byggd, och kontinuerligt vidareutvecklad sedan dess: en PIM-plattform med flera tenants och isolering mellan dem (super admin, tenant admin, tenant-användare), ett utkast/publicera-flöde så att varje ändring granskas innan den går live, och fullständig revisionsloggning med före/efter-ögonblicksbilder.
- Shopify-first-synkronisering, vid sidan av en NetSuite-ERP-koppling och export till Amazon och andra marknadsplatser via ChannelEngine.
- AI-berikning av titlar, beskrivningar, SEO-texter och översättningar — med ett granskningssteg innan genererat innehåll publiceras.
- En inbyggd RAG-assistent som låter produktteamet söka och arbeta i katalogen via chatt: vektorsökning över produktdata, med verktygsanrop för åtgärder som användaren först måste godkänna.
- Ett separat Chrome-tillägg som låter teamet skicka produkter från marknadsplatssidor direkt in i berikningskön.
- En modul för EU:s GPSR-efterlevnad, en SEO-modul med validering av sökordsvolym, och bakgrundsuppgifter (vektorsynk, berikning, schemaläggare) via en kö med omförsök.
Effekt
- Drygt 3 400 aktiva produkter på kärnmarknaden, med exportflöden till hundratals ytterligare listningar på marknadsplatser som Amazon.
- En AI-översättningspipeline som tyst skrev över kategori-URL:er rullades tillbaka och ersattes med en version som skapar omdirigeringar och registrerar allt i ett revisionsspår.
- En synkbugg där varje NetSuite-koppling skrev över AI-innehåll och Shopify-ändringar löstes strukturellt i stället för att lagas för hand varje gång.
- Drygt 350 commits över åtta månaders löpande utveckling — ingen engångsleverans utan ett system som växer med sortimentet.
Arkitektur
Ett Turborepo-monorepo med NestJS-backend och Next.js 14-frontend (App Router), ett delat Prisma-databaspaket och gemensamma typer. PostgreSQL med pgvector-tillägget lagrar både produktdata och embeddingar, så att vektorsökning och vanliga frågor körs mot samma databas. Bakgrundsarbete (vektorsynk, AI-berikning, marknadsplatssynk) går via Redis-backade köer med automatiska omförsök och exponentiell backoff, frikopplade från gränssnittet så att en långsam marknadsplatssynk inte blockerar resten av plattformen.
Modellval
Den inbyggda RAG-assistenten är medvetet multi-leverantör: olika uppgifter går genom olika modeller (från en billig modell för rutinchatt till tyngre Claude- och GPT-varianter för mer komplex berikning), med tokenpriser spårade per modell så att kostnaden per konversation syns i stället för att vara en svart låda. Genererat innehåll (titlar, beskrivningar, översättningar) går alltid först genom ett granskningssteg — modellen föreslår, en människa godkänner; samma skäl till att prislogik i andra projekt heller aldrig går rakt genom en språkmodell.
Kostnad & latens
- Tokenkostnad per konversation spåras per modell, så att dyrare modeller används medvetet och synligt i stället för som standard.
- Bakgrundsuppgifter (vektorsynk, berikning) körs asynkront med högst 3 omförsök och exponentiell backoff, så att ett tillfälligt avbrott hos en marknadsplats inte omedelbart leder till dataförlust.
- Vektorsökning och vanliga produktfrågor körs på samma PostgreSQL-instans (pgvector), vilket gör en separat vektordatabas och dess synklager onödig.
Lärdomar
AI-översättningspipelinen skrev över kategori-URL:er utan varning så snart en översättning genererades om — till synes bra för SEO, men det bröt befintliga externa länkar. Löst genom att återställa de historiska URL:erna, lägga till omdirigeringar och bygga ett revisionsspår som hädanefter gör sådana ändringar synliga innan de går live. En andra bugg: varje NetSuite-synk skrev över AI-genererat innehåll och Shopify-ändringar så snart en produkt kopplades till NetSuite — ingen enskild incident utan ett strukturellt mönster, löst genom att se över synkriktningen i stället för att laga för hand varje gång. Och en tredje, mindre men talande: översättningspipelinen översatte materialförkortningar som ”RVS” (rostfritt stål) fel, löst med en explicit ordlisteregel i stället för att lita på att modellen gissar sig till domänkunskap.