1. Principle
- You run the import in the supplier portal (
app.getfittle.com/supplier/) in the Bulk import (ZIP) card. - The item code (SKU) is the key. The same code in your account = an update of the existing item (price, name, image, model), not a duplicate. An image or model missing from the archive stays as it was.
- Always start with a Dry run (no writes): you get a line for every item and nothing is saved. Then Import.
- New decor items go to approval; changing an approved item sends it back to approval. Furniture retailers on a trial invitation are approved automatically.
- Limits: 5,000 items and 5 GB per archive; image up to 4 MB, thumbnail up to 256 kB, model up to 8 MB, variant image up to 1 MB. The archive is uploaded in 50 MB parts and processed in the background – a big archive takes tens of minutes; keep the page open, progress shows in the log. The temporary ZIP is deleted after the import; only the extracted images and models stay in storage.
2. Archive layout
One folder per item, folder name = code (letters, digits, . _ -, max 40 characters). The archive may have one common root folder (Windows "Send to → Compressed folder" creates one).
catalog.csv optional bulk price list (Excel) – overrides product.json
OAK-HALIFAX/ folder = code
product.json item fields (chapter 3)
image.jpg decor: texture; object: preview – png/jpg/webp, max 4 MB
thumb.jpg optional panel thumbnail (≈160 px, max 256 kB)
model.glb 3D object only: .glb / .gltf / .kmz / .dae / .obj, max 8 MB
variants/WHITE.jpg optional variant images (name = variant code, max 1 MB)
OAK-SB-120/
…
Flat archive for decors
Decors without models and variants need no folders: catalog.csv + images named by code (OAK-HALIFAX.jpg, OAK-HALIFAX.webp…). The code in the CSV and the file name must match.
.skp and the import rejects it. Export File → Export → 3D Model → glb (or kmz / dae), or use the plugin fittle_convert.rb (Window → Extension Manager → Install Extension → Extensions → Fittle → Convert catalogue): from a folder of CODE/model.skp it creates model.glb, image.jpg, thumb.jpg and the size in product.json. Shrink models over 8 MB (fewer polygons, textures max 1,024 px).3. product.json
{
"kind": "model",
"name": { "en": "Oak sideboard 120", "de": "Kommode Eiche 120", "sk": "Komoda Dub 120" },
"description": { "en": "Solid oak, 3 drawers, soft close." },
"category": "Sideboards",
"size_cm": { "w": 120, "d": 42, "h": 78 },
"price": 349.00, "currency": "EUR", "vat": 0.23, "price_includes_vat": true, "unit": "ks",
"url": "https://shop.example/oak-sideboard-120",
"tags": ["living room", "solid wood"],
"variants": [
{ "sku": "WHITE", "name": { "en": "white" }, "price": 369.00 },
{ "sku": "BLACK", "name": { "en": "black" }, "price": 369.00, "url": "https://shop.example/oak-sideboard-120-black" }
]
}
| Field | Type | Required | Note |
|---|---|---|---|
kind | decor / floor / tile / model | no | without kind: a model file → model, otherwise decor |
name | text or {lang: text} | yes (new item) | 24 EU languages (en, de, sk, cs, pl, hu…); missing language → en → first available |
description | text or {lang: text} | no | max 1,000 characters |
category | text | no | e.g. "Wood · light", "Sideboards" – categories form the drop-down in the configurator, use the same spelling |
finish | wood / matt / gloss | no | decors: surface (default wood) |
hex | #RRGGBB | no | average decor colour (fallback until the image loads) |
size_cm | {w, d, h} | yes for model | object size W × D × H in cm – the model is scaled to it |
tile_cm | {w, h} | yes for tile | size of one tile in cm |
price | number | no | unit price; unit = ks (piece), m2, bm (running metre) |
currency | EUR… | no | default EUR |
vat | 0–1 | no | VAT rate, e.g. 0.23 |
price_includes_vat | true/false | no | default true (gross price) |
url | https link | no | product page in your e-shop ("Order") |
tags | array of text | no | max 20 |
variants | array | no | max 50; each sku (required), name, price, url; image = variants/<sku>.jpg |
Prices are shown only in configurators of retailers with the price mode enabled; carpenters never see prices.
4. catalog.csv
Header in the first row, delimiter , or ;, UTF-8 encoding (in Excel "CSV UTF-8"). All columns are optional except sku:
sku;kind;name_en;name_de;name_sk;desc_en;category;finish;hex;price;currency;vat;unit;url;w;d;h;tile_w;tile_h;tags
OAK-SB-120;model;Oak sideboard 120;Kommode Eiche 120;Komoda Dub 120;Solid oak;Sideboards;;;349;EUR;0.23;ks;https://shop.example/sb120;120;42;78;;;living room|solid wood
OAK-HALIFAX;decor;Halifax oak;;Dub Halifax;;Light wood;wood;#C9A87C;;;;;;;;;;;
- A CSV value overrides
product.json– the CSV suits monthly price updates from your system without re-sending models. - A row without a folder and files updates an existing item (e.g. price only); a new item also needs an image.
- Names per language: columns
name_xx; separatetagswith a vertical bar|.
5. How the import runs
- Pick the archive and click Dry run (no writes). The archive is uploaded and checked; the result is a table: will be created / will be updated / skipped / error + reason. Nothing is written.
- Fix the errors (chapter 6) and click Import. Upload and processing run in the background; a log line is added for every product. The log can be downloaded.
- After the import: new decors wait for approval (the portal shows them as pending), as do updated items whose name/image changed; retailers on a trial see the items in their shop within minutes.
- The import history under the form shows every run (dry and real) with a summary and the log.
6. What is checked (reasons in the log)
- missing name / image / model / size depending on the item kind,
- image over 4 MB, thumbnail over 256 kB, model over 8 MB,
.skpinstead of an export, - invalid JSON, unknown
kind,finishoutsidewood/matt/gloss,hexnot#RRGGBB, - price not a number, currency not a 3-letter code, VAT outside 0–1, unit outside
ks/m2/bm, - variant without
sku, variant image without a matching variant in the JSON, - files outside the layout are ignored (listed as "skipped").
7. Rolling an import back
Made a mistake (wrong price list, wrong models)? In the import history the latest real import has a Roll back button: items the import created are deleted with their files; items it changed get their previous data, images and models back (files are versioned, older versions are kept for 30 days). Only the latest real import can be rolled back – if you imported again since, roll back the newer one first. Dry runs need no rollback.
Other guides
- Guide for decor suppliers – registration, adding a decor by hand, approval, subscription.
- Guide for furniture retailers – invitation, models from SketchUp, a shop with a cart.
- User guide – the configurator from the carpenter's and the customer's point of view.