Batch Generation from CSV
Batch generation lets you produce hundreds or thousands of personalized images in one job. You supply a CSV file where each row is one render, with columns matching your template’s variable names.
- Click Generate to open the Generate Images dialog.
- Click the Batch from CSV tab. It needs a saved template: on a template you haven’t saved yet, the tab asks you to Save Template first.
Step 1 — Get the CSV template
Section titled “Step 1 — Get the CSV template”The top of the tab lists the template’s variables (required ones are marked *). Click CSV Template. This downloads a pre-built CSV file with the correct column headers (one header per variable in your template). Open it in a spreadsheet app and fill in your data rows.
The first row is the header — keep it unchanged. Add one row per image you want to generate.
Example CSV for a coupon template with first_name and discount_code variables:
first_name,discount_codeAlice,ALICE10Bob,BOB20Charlie,CHARLIE15Columns for image variables take an https:// URL or a reference copied from My Images (⋯ → Copy image reference). A reference that doesn’t exist or that you can’t use is flagged on its row before you submit.
Step 2 — Upload your CSV
Section titled “Step 2 — Upload your CSV”Drag your completed CSV into the upload area (“Drop your CSV file here or click to browse”), or click it to browse. The area also states the most rows one job may have on your plan.
Zandovi parses the file and checks it against the template:
- A missing required column is reported as Missing required columns, and the file isn’t validated further.
- A column that matches no variable is listed under Unknown columns (will be ignored); it doesn’t block the batch.
- Each row is then validated, and errors are listed by row and column: missing required values, values not on a variable’s allowed list, invalid barcode data, and unknown image references.
- A file with more rows than your plan allows per job shows Too many rows for your plan.
- Columns whose values are much longer than the design’s default get an advisory Longer than the design allows for warning; it doesn’t block the batch.
Fix any errors in your spreadsheet, re-upload, and re-validate.
Step 3 — Submit the batch
Section titled “Step 3 — Submit the batch”Choose Format and Scale (or the output DPI on a print canvas) — plus JPEG Quality for JPEG — and click Submit Batch Job (N images). The button stays disabled until every row is valid. After submitting, the dialog switches to Job History.

Tracking batch jobs
Section titled “Tracking batch jobs”After submission the job appears in the Job History tab. Each job row shows:
| Item | Description |
|---|---|
| Status | PENDING / PROCESSING / COMPLETED / FAILED / CANCELLED |
| Images · format | Number of images and the output format (e.g. 50 images · PNG) |
| Template | The project or template the job came from |
| Submitted | Relative timestamp (e.g. “2m ago”) |
| Progress | While running, a progress bar with rendered / total |
Click a row to expand its details: status, item counts, render time and completion time.
Counts of in-progress, completed, failed, and cancelled jobs sit above the list, and Refresh re-reads it. While any listed job is still running the list refreshes itself.
Designer jobs and API jobs in one list
Section titled “Designer jobs and API jobs in one list”Job History shows every batch you submitted, whichever way you submitted it — from this tab or with one of your API keys. The All / Designer / API filter at the top narrows the list, and your choice is remembered. Jobs submitted with a key carry a badge naming the key, so you can tell which automation produced which batch; the badge reads as a deleted key if that key has since been removed. Jobs an AI assistant submitted through the Zandovi MCP connector (for example in Claude or ChatGPT) carry a badge with a sparkle icon naming that app instead. They count as API jobs in the filter.
A colleague’s jobs never appear here, whether they came from the designer or from the API.
Long histories page in — click Load more to append the next page.
When complete
Section titled “When complete”Click Download on a COMPLETED job (or Download results in its expanded details). A ZIP file downloads containing one image per CSV row, named sequentially (image-000.png, image-001.png, …).

If something fails
Section titled “If something fails”Expand a FAILED job to see which rows errored and why. The panel lists the first five failures plus a count of the rest. Correct the issues in your CSV, re-upload, and resubmit.
Deleting jobs
Section titled “Deleting jobs”The trash icon removes a job and its results. When it asks first, confirm with Yes.
- A running job is cancelled by deleting it, so it asks for confirmation first (“Cancel job?”). The rows that hadn’t rendered yet are refunded to your quota.
- A job submitted with an API key always asks for confirmation — deleting it destroys the result archive and the per-row outcome history that an API integration may still be reconciling against, and for a running one the prompt names the key that submitted it.
- A finished job you submitted from the designer is deleted on the first click.
Batch limits
Section titled “Batch limits”- Maximum CSV file size and maximum row count depend on your plan. See Usage & Quotas.
- A batch consumes one render per row — a 45-row job costs 45 renders from your API Quota (the single Renders pool on the Free plan), whether you submit it here or via the API. Deleting a running job here stops it and refunds the rows that hadn’t rendered yet, the same as cancelling through the API.
Automate it with the API
Section titled “Automate it with the API”The same batch engine is available programmatically: POST /api/v1/batch-jobs takes a template ID and a rows array instead of a CSV upload, and adds idempotent retries, filename patterns, per-row result reporting, cancellation with refunds, and a completion callback so your code doesn’t have to poll. See Batch Rendering.