CSV Import
Bulk-assign SKUs, descriptors, and per-image metadata from a spreadsheet. The 3-step wizard, auto-detect rules, and metadata keys.
Last updated April 27, 2026
Pro feature
CSV Import is Pro-only. Free users see the button with a lock icon; clicking it opens the upgrade modal.
CSV Import is the fastest way to apply SKUs, descriptors, and {val:KEY} metadata to a large batch. Drop 200 images from a shoot, drop a 200-row CSV, and every row is assigned in one click.
When to use it
- You have a PIM or product spreadsheet with rows-per-image metadata already.
- You have a 50+ row SKU assignment that would take a half-hour to type manually.
- Your filename template uses
{val:KEY}tokens that resolve from per-image data (e.g. the E-commerce starter template).
If you only need to bucket a handful of images together, manual groups (the Group button in the selection toolbar) are faster. CSV is for the cases where filename metadata lives outside the workspace and you need it on dozens or hundreds of rows in one shot.
The three-step wizard
Upload CSV
Drop a CSV or click to pick one. The wizard displays the first row and lets you confirm whether the file has a header row (defaults to yes; toggle off for headerless CSVs). Supported encodings: UTF-8 (including BOM), UTF-16, Windows-1252.
Map columns
The wizard auto-detects which columns are the
filename,sku,descriptor, andgroupbased on header names (case-insensitive match againstfile,filename,image,sku,product,handle,descriptor,view,group,bucket, etc.). Every remaining column is surfaced as an available metadata key.Change any mapping from the dropdown. Drop down each unmapped column individually, or map it to
metadata → KEYwhere KEY becomes the name used in{val:KEY}tokens. The reserved keygrouppopulates manual-group bucket membership (see Manual groups).Review matches
The review step shows every workspace image with the CSV row that matched it (if any). Matches are made by comparing the CSV's
filenamecolumn to each image's original name. Unmatched images are flagged with a yellow badge; unmatched CSV rows are listed below.Confirm to apply. Every matched image gets its mapped metadata values (sku, descriptor, group, and any custom keys) written in one store update.
Match semantics
Matching is case-sensitive and extension-sensitive by default. IMG_4821.JPG does not match img_4821.jpg. The wizard offers a Case-insensitive checkbox at the review step that relaxes this, useful when the CSV came from a case-normalizing tool.
Exact filename matching is deliberate — fuzzy matching would silently assign the wrong SKU to a near-duplicate filename, which is impossible to notice after the fact. If your filenames don't line up, rename the CSV column to match before importing.
The metadata bag
Every image gets a flat Record<string, string> metadata bag after import. Keys are the lowercased, hyphenated versions of the CSV column headers you mapped as metadata. Values are passed through the same sanitization as descriptors before being stored.
Metadata is preserved across:
- Format Builder edits and ad-hoc format changes.
- Template applications (templates do not clear metadata).
- Session restores (the bag is persisted to IndexedDB alongside the image).
Metadata is cleared when you reset the workspace via the Start Over button. There is no per-group bulk-clear action; to wipe a single key on a group, multi-select the rows and use Set Metadata → KEY with an empty value.
Using metadata in filenames
Once metadata is loaded, any template's format string can reference {val:KEY}. See the Token reference for the full syntax, including the default= fallback.
Example CSV
For a shoot where you have a brand, product, and color for every file:
filename,sku,descriptor,brand,product,color
IMG_001.jpg,nike-001,front,nike,airmax-90,black
IMG_002.jpg,nike-001,side,nike,airmax-90,black
IMG_003.jpg,nike-002,front,nike,airmax-90,red
Apply the E-commerce starter template (format {val:brand}-{val:product}-{val:style}-{val:color}-{val:view}-{seq:2}{ext}) and the filenames become nike-airmax-90--black--01.jpg (with style and view rendering empty because the CSV didn't have them). Add those columns and they fill in.