Leveranciersprijslijst importeren via CSV
Prijslijsten van je leverancier in bulk importeren met de CSV-importwizard in Tembo.
Krijg je van je leverancier een prijslijst met honderden of duizenden onderdelen? Dan tik je die niet één voor één in. Met de CSV-importwizard laad je de volledige lijst in één keer in: Tembo koppelt elke rij automatisch aan je bestaande producten via de SKU, werkt gewijzigde prijzen bij en slaat ongewijzigde rijen gewoon over. Je gebruikt deze werkwijze telkens wanneer een leverancier een nieuwe of bijgewerkte prijslijst doorstuurt — de eerste keer én bij elke update daarna.
Deze gids neemt je mee door het volledige traject: het CSV-bestand voorbereiden, de drie stappen van de wizard, wat er na de import achter de schermen gebeurt, en hoe je het resultaat controleert.
Voor je begint
- De leverancier moet al bestaan in Tembo (menu Suppliers). De prijslijst hoort altijd bij één specifieke leverancier.
- Weet hoe de prijzen in het bestand gestructureerd zijn: staan er alleen nettoprijzen (jouw aankoopprijs) in, of ook brutoprijzen (adviesprijzen), kortingspercentages of kortingscodes? Dat bepaalt straks welke "Pricing Mode" je kiest.
- Werk je met kortingscodes (bv. code A = 40 %, code B = 30 %)? Configureer die dan eerst onder Settings → Suppliers → [leverancier] → Configuration, in het onderdeel Discount Structure. Zonder die mapping weigert de wizard de import in kortingscode-modus.
- Optioneel maar handig bij terugkerende imports: stel standaardinstellingen per leverancier in, zodat de wizard telkens vooraf ingevuld staat (zie Standaardinstellingen per leverancier).
De vier prijsmodi
In stap 3 van de wizard kies je een "Pricing Mode". Kies de modus die overeenkomt met wat er in het bestand van je leverancier staat:
| Pricing Mode | Wat de leverancier aanlevert | Wanneer kiezen |
|---|---|---|
| "Net Price Only" | Alleen de nettoprijs (jouw aankoopprijs) | De eenvoudigste en meest voorkomende situatie: één prijskolom, geen kortingsinfo |
| "Pre-calculated (Gross + Net)" | Brutoprijs (adviesprijs) én nettoprijs | De leverancier rekent de korting zelf al uit; Tembo leidt het kortingspercentage af uit het verschil |
| "Gross + Discount Percentage" | Brutoprijs plus een kortingspercentage per rij | Tembo berekent de nettoprijs: bruto × (1 − korting %) |
| "Gross + Discount Code" | Brutoprijs plus een kortingscode (bv. A, B, C) | De codes worden opgezocht in de Discount Structure van de leverancier; een onbekende code levert géén nettoprijs op |
Onthoud het verschil: de brutoprijs is de adviesprijs die (bij prijssynchronisatie) je verkoopprijs wordt; de nettoprijs is jouw aankoopprijs bij de leverancier.
Je CSV-bestand voorbereiden
De wizard aanvaardt .csv, .txt, .xlsx en .xls tot 500 MB. Excel-bestanden worden bij het uploaden automatisch omgezet naar CSV — maar alleen het eerste werkblad wordt gelezen. Staat je prijslijst op een tweede tabblad, verplaats die dan eerst.
Regels voor het bestand:
- De eerste rij moet de kolomkoppen bevatten. De wizard behandelt de eerste rij altijd als koptekst; daar is geen instelling voor.
- Elke rij heeft een unieke SKU (artikelnummer). Rijen zonder SKU worden stilzwijgend overgeslagen; bij dubbele SKU's in één bestand telt alleen de laatste rij.
- Prijzen: alleen cijfers en een decimaal punt. Geen euroteken, geen duizendtallenscheiding.
- Bewaar het bestand als "CSV UTF-8" (in Excel: Opslaan als → "CSV UTF-8 (door komma's gescheiden)"). Tembo leest het bestand als UTF-8; bij een andere codering raken tekens zoals é of ë verhaspeld.
Decimale komma = fout geïmporteerde prijzen
Prijzen moeten een decimaal punt gebruiken: 12.50, niet 12,50. Een decimale komma geeft géén foutmelding — de prijs wordt stilletjes afgekapt: 12,50 wordt geïmporteerd als 12,00 euro. Ook duizendtallenscheiding (1.234,56 of 1,234.56) en eurotekens (€ 12.50) doen de prijskolom mislukken. Controleer dit vóór je uploadt; achteraf zie je alleen verkeerde prijzen in de lijst.
Voorbeeldbestand
Dit voorbeeld gebruiken we doorheen de rest van de gids: een prijslijst van een fictieve leverancier, gescheiden met puntkomma's, met bruto- én nettoprijzen (alle prijzen zijn illustratief):
variant_sku;product_title;variant_title;description;gross_price;net_price
118810099-01;Maaimes 85 cm;Standaard;Maaimes 85 cm voor zitmaaier;24.95;14.20
118399914-00;Aandrijfriem 95 cm;Standaard;Aandrijfriem voor maaidek 95 cm;39.90;22.75
322110210-02;Luchtfilter motor;Standaard;Luchtfilterelement benzinemotor;12.50;6.95
118810316-01;Meskoppeling;Standaard;Meskoppeling zitmaaier;54.50;31.90
125722410-00;Bougie;Standaard;Bougie voor benzinemotor;7.95;3.60
381007138-02;Wiel 11x4.00-4;Standaard;Compleet wiel 11 inch;29.95;17.40Je leverancier gebruikt wellicht andere kolomkoppen (bv. onderdeelnummer, omschrijving, lijstprijs, inkoopprijs) — dat is geen probleem: in stap 3 wijs je elke kolom zelf toe, en de wizard herkent ook veel Nederlandse koppen automatisch.
Stap voor stap
Stap 1: open de prijslijstsectie van de leverancier
Ga naar Suppliers in het menu en klik op de leverancier. Scrol naar de sectie "Price List". Daar zie je de huidige prijslijstitems (of, bij een nieuwe leverancier, de melding "No price list items found").
Stap 2: klik op "Upload CSV"
Klik op de knop "Upload CSV" rechtsboven in de sectie. De importwizard opent schermvullend, met bovenaan drie stappen: "Upload File", "Configure Format" en "Map Fields".
Sluit je de wizard tussentijds, dan vraagt Tembo bevestiging ("Cancel Import — Are you sure you want to cancel? Your progress will be lost.") en gaat je voortgang verloren.
Stap 3: upload het bestand ("Upload File")
Sleep je bestand naar de zone "Drop file here" of klik erop om te bladeren. Onder de zone staan de limieten: "Accepted formats: .csv, .txt, .xlsx, .xls" en "Maximum size: 500MB".
Heb je eerder standaardinstellingen voor deze leverancier bewaard, dan zie je bovenaan een banner "Using configured defaults for [leverancier]:" met badges voor de parsemethode en de prijsmodus — die vullen de volgende stappen vooraf in, maar je kan ze in de wizard nog altijd aanpassen.
Na een geslaagde upload verschijnt een groen vinkje met de bestandsnaam (en een knop "Change File" als je je vergist hebt). Klik op "Next".
Stap 4: configureer het formaat ("Configure Format")
Onder "Choose Parsing Method" kies je hoe het bestand gelezen wordt:
- "Delimited File (CSV)" — de normale keuze voor CSV-bestanden. Kies daaronder bij "Select Delimiter" het scheidingsteken: "Comma (,)", "Semicolon (;)" (gebruikelijk bij Belgische en Nederlandse Excel-exports — ook voor ons voorbeeldbestand), "Tab" of "Custom" (één zelfgekozen teken).
- "Use Template" — laadt een vooraf door de beheerder geconfigureerd sjabloon voor leveranciers met een vast, afwijkend bestandsformaat. Zijn er geen sjablonen, dan meldt de wizard "No templates available. Contact your administrator to add import templates."
- "Fixed-Width Columns" — momenteel enkel bruikbaar via een sjabloon; handmatig instellen is uitgeschakeld.
Onder "File Preview" toont de wizard live de eerste rijen zoals ze gelezen worden, met de melding hoeveel kolommen er gevonden zijn. Controleer dit altijd: zie je maar één brede kolom en de waarschuwing "Only 1 column detected - check delimiter configuration", dan heb je het verkeerde scheidingsteken gekozen. Met ons voorbeeldbestand moet je zes nette kolommen zien.
Klik op "Next" zodra het voorbeeld er goed uitziet. Met fouten in de configuratie kan je niet verder ("Cannot proceed — Please fix configuration errors before continuing").
Stap 5: kies de "Pricing Mode" ("Map Fields")
Bovenaan de laatste stap staat de kaart "Pricing Mode" ("Select how prices are structured in this file"). Kies de modus die bij je bestand past (zie De vier prijsmodi). Voor ons voorbeeldbestand met bruto- én nettoprijzen kies je "Pre-calculated (Gross + Net)".
Kies je "Gross + Discount Code" zonder dat er kortingscodes geconfigureerd zijn, dan toont de wizard de rode waarschuwing "No discount code mappings configured" met een link naar de leveranciersconfiguratie — los dat eerst op.
Stap 6: wijs de verplichte velden toe
In de kaart "Required Fields" koppel je elke rubriek aan een kolom uit je bestand. De wizard doet automatisch een voorstel op basis van de kolomkoppen (ook Nederlandse koppen zoals onderdeelnummer, lijstprijs of inkoopprijs worden herkend) — controleer elk voorstel en pas aan waar nodig via de keuzelijst ("Select column..."). Naast elke kolom staat een voorbeeldwaarde uit je bestand, zo zie je meteen of de koppeling klopt.
De basisvelden, voor ons voorbeeldbestand:
| Veld | Kolom in het voorbeeld | Waarvoor het dient |
|---|---|---|
| "Product Title" | product_title | Naam van het product; wordt ook de titel van automatisch aangemaakte producten |
| "Variant Title" | variant_title | Variantomschrijving (maat, uitvoering, ...); bij één uitvoering volstaat bv. "Standaard" |
| "Variant SKU" | variant_sku | De sleutel van de hele import: hiermee koppelt Tembo de rij aan je bestaande productvarianten |
| "Gross Price" | gross_price | Brutoprijs / adviesprijs; dit is de prijs die bij prijssynchronisatie je verkoopprijs wordt |
| "Description" | description | Omschrijving van het onderdeel |
Afhankelijk van de gekozen prijsmodus komt daar één veld bij: "Discount (Net Price)" (bij "Pre-calculated" — wijs hier net_price toe), "Discount (Percentage)" of "Discount (Code)".
De teller op de kaart (bv. "6/6 Complete") toont wanneer alles is toegewezen.
Stap 7: wijs de optionele velden toe
Klap de kaart "Optional Fields" open. Hier vind je:
- "Net Price" — jouw aankoopprijs (netto). Zie de waarschuwing hieronder!
- "Category" — productcategorie(ën), meerdere gescheiden door komma's; onbestaande categorieën worden automatisch aangemaakt en gekoppeld.
- "Quantity" — beschikbare hoeveelheid of minimale bestelhoeveelheid.
- "Notes" — vrije opmerkingen bij het item.
In "Net Price Only"-modus is "Net Price" verplicht
Kies je als prijsmodus "Net Price Only", dan staat het veld "Net Price" verwarrend genoeg onder "Optional Fields" — maar de import vereist het wél. Wijs het dus altijd toe. Doe je dat niet, dan mislukt de import met de melding Missing required field mappings for pricing mode "net_only": net_price.
Stap 8: klik op "Import & Create Price List"
Pas als alle verplichte velden zijn toegewezen wordt de knop "Import & Create Price List" actief. Klik erop. De wizard sluit meteen en toont een melding dat de import gestart is; de verwerking gebeurt op de achtergrond, ook bij heel grote bestanden.
Tembo maakt bij elke import een nieuw prijslijstrecord aan met de automatische naam "Price List - [datum]" (een eigen naam kiezen kan niet in de wizard) en als omschrijving "Imported from [bestandsnaam]". De valuta is die van de leverancier (standaard EUR).
Stap 9: controleer het resultaat
Vernieuw de prijslijstpagina van de leverancier na de import (kleine bestanden zijn doorgaans binnen enkele ogenblikken verwerkt; heel grote bestanden kunnen langer duren). Controleer:
- Het aantal items in de tabel komt overeen met je bestand (min de bewust overgeslagen rijen).
- Steekproef op de prijzen: kloppen "Gross Price" en "Net Price" van een paar bekende artikelen? Zie je afgekapte bedragen (12 in plaats van 12,50), dan zat er een decimale komma in het bestand.
- Zoek via het zoekveld ("Search by SKU...") een paar SKU's op om te zien of ze aan de juiste producten gekoppeld zijn.
- Kijk in je productcatalogus of er geen onverwachte nieuwe producten zijn bijgekomen (zie hieronder waarom dat kan gebeuren).
Wat gebeurt er achter de schermen?
Per rij in je bestand doet Tembo het volgende:
- Koppelen op SKU. De waarde in "Variant SKU" wordt exact vergeleken met de SKU's van je productvarianten. Bij een match wordt het prijslijstitem aan die variant gekoppeld en wordt meteen ook de leverancier-productrelatie aangemaakt of bijgewerkt (zodat inkoop weet dat dit onderdeel bij deze leverancier verkrijgbaar is).
- Ongewijzigde rijen worden overgeslagen. Importeer je later een nieuwe versie van dezelfde lijst, dan vergelijkt Tembo elke rij met het bestaande item (SKU, bruto, netto, korting, hoeveelheid). Identieke rijen worden niet opnieuw weggeschreven — een herimport van een grotendeels ongewijzigde lijst is daardoor snel en veilig.
- Gewijzigde prijzen worden bijgewerkt, met een prijshistoriekrecord zodat je latere prijsevoluties per artikel kan terugzien (klik op een rij in de tabel om de historiek te openen).
- Onbekende SKU's worden nieuwe producten. Vindt Tembo géén variant met die SKU, dan wordt er automatisch een nieuw, gepubliceerd product aangemaakt: titel uit "Product Title", één variant met de SKU uit het bestand, prijs in de importvaluta, zichtbaar in alle verkoopkanalen, met voorraad 0 op elke locatie.
Automatisch aangemaakte producten herkennen
Auto-creatie is handig bij een eerste import van een nieuw gamma, maar bij een gewone prijsupdate betekent een reeks nieuwe producten meestal dat de SKU's in het bestand niet exact overeenkomen met je catalogus (bv. voorloopnullen, spaties of een ander streepjesformaat). De matching is hoofdlettergevoelig exact. Herken auto-aangemaakte producten aan: recent aangemaakt, status gepubliceerd, precies één variant "Standaard"/"Default", voorraad 0. Controleer na elke import even je recentste producten.
Fouten in individuele rijen (bv. een onleesbare prijs) stoppen de import niet: de rest van het bestand wordt gewoon verwerkt. Foutieve of overgeslagen rijen verschijnen niet in de tabel — vandaar de steekproef in stap 9.
Verkoopprijzen: "Use as Pricing Source" en Sync Prices
Een prijslijst bijwerken verandert op zich niets aan je verkoopprijzen — ze registreert wat de leverancier aanrekent. Wil je dat de brutoprijzen (adviesprijzen) uit de lijst ook je verkoopprijzen in de catalogus worden, dan werkt dat via prijssynchronisatie:
- In de leveranciersinstellingen staan drie schakelaars: "Use as Pricing Source" (mag deze leverancier je verkoopprijzen bepalen?), "Auto-Sync Prices" (automatisch synchroniseren bij elke import) en "Pricing Priority (0-999)" (welke leverancier wint als meerdere leveranciers hetzelfde artikel leveren).
- Staan beide eerste schakelaars aan, dan schrijft Tembo tijdens de import de brutoprijs van elk gewijzigd item weg als verkoopprijs van de gekoppelde variant. De nettoprijs blijft je aankoopprijs en raakt de verkoopprijs nooit.
- Zonder "Use as Pricing Source" synchroniseert er niets — je prijslijst blijft dan puur informatief voor inkoop.
- De kolom "Sync Status" in de prijslijsttabel toont per item het resultaat: "Synced" (groen, met tijdstip), "Not Synced", "Pending", "Skipped" (bv. "No gross_price specified" of "Another supplier has higher pricing priority") of "Failed".
Naast automatische synchronisatie bestaat er op de prijslijstpagina ook een knop "Sync Prices" (en knoppen om items handmatig toe te voegen of te bewerken); de exacte werking daarvan wordt nog geverifieerd en valt buiten deze gids.
Standaardinstellingen per leverancier
Importeer je regelmatig lijsten van dezelfde leverancier, stel dan eenmalig de standaarden in via Settings → Suppliers → [leverancier] → Configuration, onderdeel "Default Import Settings":
- "Default Pricing Mode" — bv. "Net Price Only" of "Discount Codes".
- "Default Parsing Method" — bv. "Delimited (CSV)" met puntkomma als scheidingsteken.
Klik op "Save Import Defaults". Vanaf dan opent de wizard voor die leverancier vooraf ingevuld (je ziet de banner uit stap 3), en hoef je alleen nog het bestand te slepen en de veldtoewijzing te controleren. Alles blijft per import aanpasbaar; de standaarden zijn enkel een voorinvulling. Op dezelfde configuratiepagina beheer je ook de Discount Structure met kortingscodes.
Problemen oplossen
| Melding of symptoom | Oorzaak | Oplossing |
|---|---|---|
| "Invalid file type — Only CSV, TXT, XLS, and XLSX files are supported" | Verkeerde bestandsextensie | Exporteer opnieuw als CSV |
| "File too large — File size must be less than 500.0 MB" | Bestand groter dan 500 MB | Splits het bestand op |
| "File is empty" | Leeg bestand geüpload | Exporteer opnieuw vanuit de bron |
| Voorbeeld toont één kolom + "Only 1 column detected - check delimiter configuration" | Verkeerd scheidingsteken gekozen | Kies "Semicolon (;)" voor Belgische/Nederlandse Excel-exports, "Comma (,)" voor standaard-CSV |
| "Cannot proceed — Please map all required fields" | Niet alle verplichte velden toegewezen | Vul elke rij in de kaart "Required Fields" in |
| "Discount code mappings required" | Modus "Gross + Discount Code" zonder geconfigureerde codes | Configureer de Discount Structure in de leveranciersconfiguratie |
Import mislukt met Missing required field mappings for pricing mode "net_only": net_price | "Net Price" niet toegewezen (staat onder "Optional Fields", maar is in deze modus verplicht) | Klap "Optional Fields" open en wijs "Net Price" toe |
| Prijzen afgekapt geïmporteerd (12 in plaats van 12,50) | Decimale komma in het bestand | Gebruik decimale punten, geen duizendtallenscheiding, geen eurotekens |
| Rijen ontbreken na de import | Rijen zonder SKU worden stilzwijgend overgeslagen; bij dubbele SKU's telt alleen de laatste rij | Zorg dat elke rij een unieke SKU heeft |
| Vreemde tekens (é, ë) in omschrijvingen | Bestand niet in UTF-8 bewaard | Bewaar als "CSV UTF-8" en importeer opnieuw |
| Onverwachte nieuwe producten na de import | SKU's kwamen niet exact overeen met bestaande varianten → auto-creatie | Vergelijk de SKU-schrijfwijze in het bestand met je catalogus (exacte match vereist) |
| Sync Status "Skipped — No gross_price specified" | Item geïmporteerd zonder brutoprijs | Neem een bruto-/adviesprijskolom op als verkoopprijzen moeten synchroniseren |
| Sync Status "Skipped — Another supplier has higher pricing priority" | Een andere leverancier met "Use as Pricing Source" heeft een hogere prioriteit | Pas "Pricing Priority (0-999)" aan in de leveranciersinstellingen |
| Er synchroniseert helemaal niets | "Use as Pricing Source" staat uit voor deze leverancier | Zet de schakelaar aan in de leveranciersinstellingen |
Volgende stappen
- Kwamen er auto-aangemaakte producten uit de import? Werk ze bij (categorie, merk, foto's) volgens de gids Producten en varianten aanmaken.
- Stel voor terugkerende leveranciers de standaardinstellingen in, zodat de volgende import in een paar klikken klaar is.
- Bekijk het overzicht van alle werkwijzen voor aanverwante processen.