# En verktygsbutik byggd direkt på Crystallize

> Tools Universe är en demo för verktygsbranschen i Norden: sex tillverkare, köp eller hyr, företagskunder och privatpersoner, fyra språk. Allt är ren Crystallize: webbutiken läser Discovery API och Shop API och inget annat.

- **416** produkter från sex tillverkare, 611 utföranden
- **~2 800** typade specifikationsvärden, 106 komponenter med ETIM-kod
- **13** batteriplattformar
- **24** hyrmaskiner, 75 enheter på fem depåer
- **4** språk och tre valutor

## Så hänger det ihop

En tenant, två API:er. Seeden skriver tenanten via PIM-API:et; allt en besökare, en assistent eller en crawler ser läses tillbaka via Discovery och Shop API.

- **Tillverkarkällor:** Datablad, listpriser och bilder från de sex varumärkenas egna webbplatser. Ingen data från återförsäljare.
- **Seed:** `npm run seed`: tio idempotenta steg, från modell till kunder
- **PIM:** Shapes, typade pieces, topics, ETIM-klasser, vektorer
- **Discovery API:** Sök, facetter, `rankBy` med kundens smak
- **Shop API:** Varukorg, kassa, ordrar, offerter, hyrbokningar
- **Webbutik:** Next.js 16, cachade Discovery-anrop, kunddata strömmas in
- **Vem läser den:** Kunder (Fyra språk, momsväxel, kontoväljare); Assistent på sajten (Claude med katalogverktygen); MCP-klienter (Claude, Claude Code, alla MCP-värdar); Crawlers och LLM:er (JSON-LD, llms.txt, .md-sidor)

## Specifikationer är typade, inte text

Inga egenskapstabeller. Varje specifikation är sin egen komponent, så den kan filtreras, rankas, översättas och exporteras utan tolkning.

Ett verktyg har två gemensamma pieces, `power` (strömkälla, spänning, motor) och `physical` (vikt, mått, vibration, buller), och en **specifikationsfamilj** vald per produkt: borrning, betong, sågning, slipning, träbearbetning, infästning, installation, mätning, utsug, batteri och laddning, byggarbetsplats, förvaring, utomhus eller förbrukning. Familjen är ett enkelval, så en bilningshammare kan inte få en sågs fält.

Tal är numeriska komponenter med enhet (`230 Nm`, `18 V`, `5 Ah`), ja/nej är booleska, fasta urval är selections. 106 komponenter har sin ETIM 10.0-egenskap, och de norska, svenska och nederländska etiketterna är ETIM:s officiella namn. Varje produkt ligger i sin ETIM-klass.

Samma typade värden styr facetterna i kategorierna (intervallfilter på slagenergi, klingdiameter …), specifikationsbladet, JSON-LD med UN/CEFACT-enhetskoder, och specifikationsfiltren i assistenten och MCP-servern.

- **Slagenergi:** `specs.concrete.impactEnergy` · J (JOU) · EF002831
- **Verktygsfäste:** `specs.concrete.toolHolder` · SDS-max · EV005657
- **Vikt:** `physical.weight` · kg (KGM) · EF011121

## Taxonomi, varumärken och batteriplattformar

Elva topic maps beskriver varje produkt så som branschen tänker, på fyra språk.

Varumärke, batteriplattform, produkttyp, yrke, material, nivå, prisklass, egenskap, tillgänglighet, bildtyp och ETIM-klass: 188 topics. De styr navigering, facetter och smakvektorer.

Varumärken, batteriplattformar och tekniker är dokument med egna sidor. **Batteriplattformen** (Milwaukee M18, Makita LXT, Hilti Nuron …) är valet en yrkesperson redan har gjort: den avgör vilka batterier som passar, och den är den starkaste signalen i personaliseringen. Tillbehör, klingor och batterier anger maskinerna de passar till; maskinerna har tillverkarens rekommenderade tillbehör.

## Uthyrning med riktig bokning

Tung utrustning hyrs per dag, helg, vecka eller fyra veckor, från fem depåer i Oslo, Bergen, Stockholm, Göteborg och Rotterdam.

Varje hyrartikel är en bokningsbar produkt med en pool av namngivna enheter, de fysiska maskinerna. Webbutiken visar tillgänglighet per depå och period från Shop API, bokar enheten i varukorgen och bekräftar bokningen i kassan, kopplad till ordern.

Tre bokningsregler ger ledtid och ett **avbokningsfönster** på 24 eller 48 timmar: inom det kan en hyra fortfarande tas bort ur varukorgen och enheten frigörs. Behörighetskrav, deposition och leverans till arbetsplatsen ingår i hyrartikeln.

## Fyra språk, tre valutor, moms åt båda håll

Namn, texter, topics, bildtexter och URL-sökvägar är översatta. Språket väljer marknaden.

Engelska och nederländska säljer i EUR (21 % moms), norska i NOK och svenska i SEK (25 %). Priser lagras netto, per valuta, med mängdpriser. **Inkl./exkl. moms**-växeln överst byter varje pris på sidan; företagskunder ser exkl. moms som standard.

Företagskunder får företagets prislista från Crystallize-marknader: Discovery ger `nokPriceFor(marketIdentifiers)` och varukorgen i Shop API använder samma lista. Faktura med inköpsreferens, offerter i egen pipeline, och en kontosida med ordrar, hyror och offerter per status.

## Rankad för varje kund

Ingen separat rekommendationstjänst. En smakvektor per kund, och Discovery rankar.

Topics blir tre vokabulärer: **ecosystem** (varumärke och plattform), **work** (yrke och material) och **gear** (produkttyp, nivå, egenskaper). Varje produkt har en vektor i varje. Kundens smakvektor byggs från orderhistoriken i Shop API och skickas med varje anrop som `context.userTaste`, med en `rankBy`-regel som blandar den med försäljning, marginal och lager.

Byt demokund i sidhuvudet så rankas butiken om: startsidan, ordningen i kategorierna, bilderna i megamenyn, tillbehör och alternativ. Sindre, en möbelsnickare som bara köper Festool, har den tydligaste vektorn; Lotte, helgsnickare med DeWalt, ser en helt annan butik.

## Bara data från tillverkarna

Inget kommer från återförsäljare.

Specifikationer, listpriser och bilder kommer från de sex tillverkarnas egna webbplatser, insamlade av research-agenter och normaliserade in i modellen med källa per produkt. Produkttexterna är skrivna för demon. Bosch, Festool och Hilti har listpriser; resten, och NOK och SEK, är uppskattade och avrundade till hyllpriser. Depåer, enheter, kunder och antal recensioner är fiktiva.

## En idempotent seed

Tenanten är kod. Ändra data eller modell, kör ett steg igen, och tenanten följer med.

`npm run seed` kör tio steg i ordning: tenant-inställningar, innehållsmodell, taxonomi, bilder, katalog, uthyrning, översättningar, landningssidor, vektorer, kunder. Varje steg kan köras för sig; det uppdaterar det som finns i stället för att skapa dubbletter. Smakvektorerna beräknas sist, skrivs som utkast, publiceras och indexeras.

Bygget är inspelat steg för steg för uppspelning, och det Crystallize-skillsen borde ha berättat skrivs ner längs vägen.

- **00–02:** Tenant, 29 pieces och 11 shapes, 11 topic maps
- **03–05:** 1 104 bilder, 416 produkter, 24 hyrartiklar
- **06–07:** Norska, svenska, nederländska; landningssidor
- **08–09:** Vektorer och index; kunder och historik

## En assistent på sajten, och en MCP-server för alla agenter

Samma katalog, samma rankning, två vägar in.

**Fråga**-knappen i sidhuvudet öppnar en shoppingassistent som körs på Claude med butikens egna verktyg: sök med typade specifikationsfilter, produktdetaljer, plattformar, uthyrning och varukorg.

Butiken är också en MCP-server. Lägg till den i Claude som koppling, logga in som demokund och handla från chatten: jämför verktyg på en plattform, boka en hyrmaskin, fyll varukorgen och gå till kassan i butiken. Varje sida är också byggd för att läsas av sökmotorer och språkmodeller.

## Saker att prova

1. Byt kund i sidhuvudet (prova Sindre, sedan Lotte) och se startsidan och kategorierna rankas om.
2. Sök på en specifikation, inte ett namn. https://tools-universe.superfast.shop/sv/search?q=sds%20max%20bilningshammare
3. Öppna en batteriplattform från menyn och se varje verktyg, batteri och laddare på den.
4. Hyr en bilningshammare över en helg: välj depå, se vilka enheter som är lediga, boka den i varukorgen.
5. Växla inkl./exkl. moms överst, och byt språk för att se NOK och SEK.
6. Fråga assistenten: ”Vilka batterier passar mina verktyg, och vilket ger mest för pengarna?”
7. Lägg till .md på en URL för att se vad en språkmodell läser.

[Koppla Claude till butiken](https://tools-universe.superfast.shop/sv/mcp.md): MCP-konfiguration, demoinloggning, och hur butiken är byggd för AI-sök

---

Webbsida: https://tools-universe.superfast.shop/sv/about
Markdown-version av sidan, för språkmodeller. Priserna är netto (exkl. moms) om de inte är märkta inkl. moms.
