# Varianten en de configurator

Wat je bij **Wat verkoop je?** hebt gekozen, bepaalt welke extra kaarten de productpagina heeft. Een **Product** krijgt de kaart **Opties & varianten**; een product **Op maat** krijgt de drie configuratorkaarten (**Dimensies**, **Prijsregels** en **Optiegroepen**). Dit zijn kaarten op dezelfde productpagina, geen aparte tabbladen of schermen, en ze slaan direct op in plaats van via **Opslaan** in de kop. Alles hier bouwt voort op [Producten beheren](/nl/docs/products/index).

## Opties & varianten

Alleen zichtbaar bij producten die als **Product** zijn aangemaakt. Opties zijn optioneel: een product zonder opties wordt tegen zijn eigen prijs verkocht.

### Opties definiëren

Een product kan maximaal 3 opties hebben. Elke optierij heeft een **Optienaam** (bijv. Maat) en door komma's gescheiden **Waarden** (bijv. `S, M, L`). Bewerk de rijen en klik op **Opties opslaan** ("Opties opgeslagen" bevestigt het).

### Varianten genereren

1. Klik op **Varianten genereren**. De kaart bouwt elke ontbrekende combinatie van je optiewaarden als conceptrij; combinaties die al als variant bestaan worden overgeslagen.
2. Vul op elke conceptrij de **SKU** en **Prijs** in.
3. Klik op **{count} varianten opslaan** om ze aan te maken, of klik op **Weglaten** bij een rij die je niet wilt.

### Bestaande varianten beheren

De variantentabel toont elke variant met deze kolommen:

| Kolom | Omschrijving |
| --- | --- |
| Afbeelding | De eigen afbeelding van de variant, gekozen uit het onderdeel **Media** van het product. Klik op het vierkantje om er een te kiezen; **Geen afbeelding** haalt hem weg. Heeft het product nog geen afbeeldingen, dan vraagt de kiezer die eerst toe te voegen. Haal je een afbeelding uit de galerij, dan verdwijnt hij ook bij elke variant die hem gebruikte. Je webshop kan deze afbeelding tonen als een klant de variant kiest. |
| Variant | De optiewaarden samengevoegd met " / " (bijv. `S / Red`). |
| SKU | De SKU van de variant. |
| Prijs | De eigen prijs van de variant, of "(overgenomen)" wanneer die leeg is en de standaardprijs van het product geldt. |
| Voorraad | Voorraadveld per variant met een knop **Opslaan** (Enter slaat ook op). 0 of hoger, met maximaal 3 decimalen en een punt of een komma. Alleen zichtbaar wanneer de Voorraad-module is ingeschakeld. |
| Actief | Of de variant te koop is, met een schakelaar **Activeren** / **Deactiveren**. |

**Verwijderen** verwijdert een variant na een bevestiging: 'Variant "{label}" verwijderen? De voorraad wordt hiermee ook verwijderd.' Bij het verwijderen van een variant wordt de bijbehorende voorraad mee verwijderd.

## De configurator

Alleen zichtbaar bij producten die als **Op maat** zijn aangemaakt. De configurator is een eigen module, **Configurator**, die je platformbeheerder per bedrijf inschakelt. Staat hij aan, dan wordt **Op maat** aangeboden bij het aanmaken van een product en verschijnen deze kaarten op de productpagina. Staat hij uit, dan zijn de kaarten verborgen, toont de productpagina "Op maat staat uit; dit product kan niet gekocht worden." en kunnen webshops zo'n product niet configureren of kopen.

Een product op maat wordt op een van twee manieren geprijsd. Zonder dimensies is de **Basisprijs** van het product het startpunt en passen optiekeuzes die aan (een console met opslag- en kleuropties, een menu met extra's). Met maximaal 2 numerieke dimensies (zoals breedte en hoogte) vervangt een rooster van prijsregels over die dimensies de basisprijs, en passen optiekeuzes de roosterprijs aan (maatwerkproducten). Het zwevende **Productvoorbeeld** op de detailpagina toont de live configurator, zodat je het resultaat kunt testen zoals een klant het zou zien.

### Dimensies

De kaart **Dimensies** bevat maximaal 2 dimensies. Elke dimensie heeft:

| Veld | Omschrijving |
| --- | --- |
| Sleutel | De technische identificatie van de dimensie. |
| Label | Wat de klant ziet (bijv. Breedte). |
| Eenheid | De eenheid die naast het invoerveld staat (bijv. cm). |
| Min | De kleinste waarde die een klant kan invoeren. |
| Max | De grootste waarde die een klant kan invoeren. |

Gebruik **Dimensie toevoegen** om een rij toe te voegen en de verwijderknop om er een weg te halen, en klik daarna op **Dimensies opslaan** ("Afmetingen opgeslagen").

Een dimensie hernoemen terwijl de as blijft bestaan, neemt de constraints per keuze mee.

Als een keuze op het product **per m²** geprijsd is en nog **Actief** staat, wordt het opslaan van minder dan twee dimensies geweigerd met de namen van die keuzes: oppervlakteprijzen hebben beide assen nodig. Verwijder of deactiveer ze eerst. Zo'n keuze weer activeren terwijl het product één as heeft wordt om dezelfde reden geweigerd; hem bewerken terwijl hij inactief blijft kan gewoon.

Het wijzigen van het *aantal* dimensies verwijdert elke prijsregel op het product. De dialoog waarschuwt "Het wijzigen van het aantal dimensies verwijdert alle {count} prijsregel(s) voor dit product. Doorgaan?" en de bevestigingsknop luidt **Opslaan en regels verwijderen**. De waarden van een dimensie bewerken zonder het aantal te wijzigen behoudt je regels.

#### Beperkingen

Elke opgeslagen dimensie heeft een dialoogvenster **Beperkingen**. Een beperkingsrij koppelt een **Keuze** (uit je optiegroepen) aan een **Min** en/of **Max** die het bereik van de dimensie versmallen wanneer die keuze is geselecteerd. Elke rij heeft minstens één grens nodig, min mag max niet overschrijden, en elke keuze kan per dimensie maar één beperking hebben. Opslaan bevestigt met "Beperkingen opgeslagen."

### Prijsregels

De kaart **Prijsregels** verschijnt zodra er minstens één dimensie bestaat. Prijzen zijn georganiseerd in matrices, getoond als tabbladen bovenaan de kaart. Een matrix zonder voorwaarden heet **Standaard**.

- **Matrix toevoegen** maakt een nieuwe matrix aan met een naam en een voorwaardenkiezer van optiekeuzes. De matrix is "Van toepassing wanneer alle geselecteerde keuzes zijn gekozen", zodat je bijvoorbeeld een premium materiaal over het hele rooster anders kunt prijzen.
- Elke matrix heeft een actiemenu met **Naam wijzigen**, **Voorwaarden bewerken** en **Matrix verwijderen** (de bevestiging vermeldt hoeveel regels de matrix bevat).
- De voorwaardenkiezer weigert een **inactieve** keuze: een matrix met zo'n voorwaarde kan nooit gekozen worden, dus zijn prijzen zouden nooit gelden. Activeer de keuze of kies een andere.

#### Banden en het prijsrooster

Binnen een matrix krijgt elke dimensie een bandeditor: paren **Van**-**Tot** die het bereik van de dimensie opdelen. Gebruik **Band toevoegen** om er een toe te voegen; een band verwijderen waarin al prijzen zijn ingevoerd vraagt om bevestiging. De hulpfunctie **Banden genereren** bouwt gelijkmatig gestapte banden op basis van de waarden **Van**, **Tot** en **Stap** (alleen gehele getallen).

Het prijsrooster is een tabel met de banden van dimensie 1 als rijen en die van dimensie 2 als kolommen (één rij als er maar één dimensie is). Typ in elke cel een prijs. Je kunt een blok cellen rechtstreeks uit een spreadsheet plakken (gescheiden door tabs of regeleinden); is een geplakte waarde geen geldige prijs, dan wordt de hele plakactie geweigerd.

**Prijsregels opslaan** valideert elke band en elke cel voordat er wordt opgeslagen ("Prijsregels opgeslagen"). Roosters met meer dan 400 cellen tonen een waarschuwing dat de editor traag kan worden.

Vormen de regels op het product geen rooster (bijvoorbeeld regels die via de API zijn aangemaakt), dan schakelt de kaart over naar een platte lijsteditor met de melding "Deze regels vormen geen rooster — bewerk ze als lijst." Elke regelrij heeft dan een min/max per dimensie plus een prijs, met **Prijsregel toevoegen**, verwijderen en **Prijsregels opslaan**.

### Optiegroepen

De kaart **Optiegroepen** is een uitklaplijst van groepen, elk met keuzes die de klant in de webshopconfigurator maakt. Anders dan bij dimensies en prijsregels slaat deze kaart automatisch op: elk veld wordt opgeslagen bij het verlaten of omschakelen, een groen vinkje bevestigt de opslag, en de waarde springt terug (met een foutmelding) als het mislukt. Er is hier geen opslaanknop.

Groepen en keuzes staan in de volgorde waarin de webshop ze toont. Gebruik de pijlen **Omhoog** / **Omlaag** op een groepskop of een keuzerij om die volgorde te wijzigen; de nieuwe volgorde wordt direct opgeslagen en bevestigd met "Volgorde opgeslagen." Het nummer voor elke groepsnaam is de positie.

Per groep kun je bewerken:

| Veld | Omschrijving |
| --- | --- |
| Naam | Het label van de groep. |
| Type | **Enkele keuze** of **Meervoudige keuze**. |
| Verplicht | Of de klant in deze groep iets moet kiezen. |

Gebruik de rij **Groep toevoegen** (naam, type, verplicht) om een groep aan te maken, en **Groep verwijderen** om er een weg te halen (de bevestiging vermeldt het aantal keuzes).

Per keuze heeft elke rij:

| Veld | Omschrijving |
| --- | --- |
| Naam | Het label van de keuze. |
| Type wijziging | Hoe de keuze de prijs verandert: **Vast bedrag**, **Per oppervlakte**, **Percentage van basis** of **Percentage van totaal**. |
| Waarde | De prijs of het percentage voor de wijziging. |
| Componentproduct | Een ander product dat deze keuze als component verbruikt. |
| Aantal | Hoeveel eenheden van het componentproduct, groter dan 0 met maximaal 3 decimalen (een punt of een komma, bijv. `2,16` m² stof). |
| Standaard | Of de keuze vooraf is geselecteerd. |
| Actief | Of de keuze überhaupt wordt aangeboden. Uitzetten verbergt ook elke andere keuze waarvan de **Vereist**-regel alleen naar deze keuze wees, zodat de storefront nooit een optie toont die niet meer gekozen kan worden. |
| Alleen offerte | Indien aan, dwingt het selecteren van deze keuze de bestelling naar een offerte in plaats van direct afrekenen. Dit geldt per keuze en staat los van de productinstelling **Aankoopwijze** met de waarde "Alleen offerte". Het werkt pas zodra offerteaanvragen zijn ingeschakeld onder [Verkoop → Instellingen → Offertes](/nl/docs/sales/settings#offerteaanvragen); tot die tijd toont de kaart een hint. |

Elke keuze heeft daarnaast drie acties:

- **Regels** opent een dialoogvenster met rijen die **Vereist** of **Sluit uit** koppelen aan een doelkeuze: "Bepaal wanneer deze keuze beschikbaar is. Vereist: minimaal één geselecteerd per groep. Sluit uit: niet combineerbaar." Opslaan bevestigt met "Regels opgeslagen."
- **Afbeeldingen** opent een dialoogvenster om geordende afbeeldingen uit de mediabibliotheek te kiezen; zie [Media](/nl/docs/products/media).
- **Keuze verwijderen** verwijdert de keuze na bevestiging.

**Een keuze deactiveren waar andere keuzes van afhangen.** Een **Vereist**-regel betekent "minimaal één target per groep geselecteerd", dus **Actief** uitzetten bij een van twee alternatieven in dezelfde targetgroep verandert niets. Zet je het laatste actieve target in een groep uit, dan wordt de keuze die dat target vereiste ingetrokken: de storefront biedt hem niet meer aan en kan hem niet meer selecteren, ook al staat die keuze hier nog op **Actief**. Het effect werkt door, dus een keuze die de ingetrokken keuze vereiste wordt ook ingetrokken, terwijl twee keuzes die elkaar vereisen ongemoeid blijven. Zet je het target weer aan, dan komen ze allemaal terug; aan de regels zelf verandert niets. **Keuze verwijderen** werkt bewust anders: een verwijderd target neemt zijn regels mee, dus de keuzes die het vereisten blijven wel in het aanbod. De kaart markeert een ingetrokken keuze voor je: onder de rij verschijnt een waarschuwingslabel met "Verborgen in de storefront: vereist Groep: Keuze, en die keuze is inactief." (of "en die keuze is zelf verborgen" als het genoemde target op dezelfde manier is ingetrokken), en een **Verplichte** groep waarin niets meer beschikbaar is krijgt in de kop "Niets beschikbaar in deze verplichte groep: klanten kunnen dit product niet samenstellen." Het **Regels**-venster zet achter een inactief target bovendien "(inactief)", zodat je ziet waar je een regel op richt; zo'n target kiezen mag gewoon, want het is omkeerbaar.

Gebruik de keuze-toevoegen-rij onderaan elke groep om nieuwe keuzes toe te voegen.

Hoe een webshop de configurator aanstuurt en prijsopgaven ophaalt, lees je in de [API-referentie voor de configurator](/nl/api/configurator/index).
