> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.templated.io/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Bulk Rendering from Spreadsheets

Generate hundreds of images or PDFs at once by uploading a CSV or Excel file. Each row of the spreadsheet becomes one render. No code is needed.

## Where to find it

1. In the Templated dashboard, go to **Integrations**.
2. Open **Spreadsheet Generation** (https://app.templated.io/integrations/spreadsheet).
3. Upload your file (CSV, XLSX or XLS, up to 10 MB).
4. Check the **Column Validation** in the preview window.
5. Click **Start Generation**.

## Required column: `template`

Your spreadsheet must have a column named exactly `template` (lowercase). Each row contains the ID of the template to use. Different rows can use different templates.

The template must belong to your account. See "Where to find your template ID".

## Layer columns: `{layer-name}_{property}`

To change a layer, name the column with the layer name, an underscore, and the property:

| Column | What it changes |
|---|---|
| `title_text` | Text of the layer "title" |
| `title_color` | Text color of the layer "title" |
| `title_font_family` | Font of the layer "title" |
| `title_font_size` | Font size of the layer "title" |
| `photo_image_url` | Image of the layer "photo" |
| `photo_object_fit` | How the image fits (for example cover or contain) |
| `box_fill` | Fill color of the shape "box" |
| `badge_hide` | Hide the layer "badge" (true or false) |
| `cta_link` | Clickable link of the layer "cta" (PDF) |

Other supported properties include `color_2`, `font_weight`, `horizontal_align`, `vertical_align`, `autofit`, `background`, `border_width`, `border_color`, `border_radius`, `stroke`, `html`, `x`, `y`, `width`, `height`, `rotation` and the rating properties.

### Important: no underscores in layer names

Templated splits the column name at the **first underscore**. Everything before it is the layer name, everything after it is the property.

- Layer `product-name` with column `product-name_text` works.
- Layer `product_name` with column `product_name_text` does **not** work (Templated looks for a layer called "product").

If your layer names contain underscores, rename the layers in the editor to use hyphens (for example `product-name`), save the template, and update your column headers.

Layer names must match exactly what you see in the layers panel, including uppercase and lowercase. If a name does not match, that column is ignored and the render uses the template's original content. No error is shown.

## Image columns

Use `{layer-name}_image_url`, for example `photo_image_url`. Each cell must contain a public, direct link to the image file (for example `https://example.com/images/shoe.jpg`). Links to a web page that shows the image, or private links (Google Drive, Dropbox share pages, links that need a login), do not work.

## Optional setting columns

| Column | What it does |
|---|---|
| `name` | The name of the render. It is also used as the file name inside the ZIP. |
| `format` | Output format: `jpg` (default), `png`, `pdf`, and the other formats supported by the API |
| `transparent` | `true` for a transparent background (PNG) |
| `background` | Background color, for example `#FFFFFF` |

## Empty cells

An empty cell is skipped: the layer keeps the value from the template. To remove a layer for one row, use a `{layer-name}_hide` column with `true`.

## Example

| template | name | format | title_text | title_color | photo_image_url |
|---|---|---|---|---|---|
| 9dcf568e-26b3-4ef4-aa8c-075cdf9f4066 | 001-john | png | Welcome John | #FF0000 | https://example.com/john.jpg |
| 9dcf568e-26b3-4ef4-aa8c-075cdf9f4066 | 002-jane | png | Welcome Jane | #0000FF | https://example.com/jane.jpg |

## Credits

- Each row uses 1 credit per image. Multi-page templates use 1 credit per page. PDF uses 1 credit per page.
- Before the job starts, Templated checks that you have enough credits for the whole file. If not, the job does not start and you see "Insufficient credits. This bulk job requires X credits, but your team only has Y remaining." Upgrade or split the file into smaller files.
- If your subscription payment is past due, bulk generation is blocked until you update your payment method in Account Settings > Manage Subscription.

## Downloading the results as a ZIP

1. Wait until the job in the **Executions** list shows **COMPLETED**.
2. Click **Generate ZIP**. The status changes to GENERATING ZIP.
3. When it finishes, click **Download ZIP**.

Each render is also available as a normal render with its own URL.

### File names and order inside the ZIP

- Files are named after the `name` column, for example `001-john.png`.
- Without a `name` column, files are named with the render ID, which looks random.
- If two rows have the same name, the next one gets a number, for example `card (1).png`.
- Files are not numbered by row automatically. To keep your spreadsheet order, start each name with a zero-padded number: `001`, `002`, `003`. Without zero padding, many file managers sort `10` before `2`.

## Multi-page documents (one PDF per group of rows)

Add a `page` column to switch to document mode. In document mode, each row becomes one **page** instead of one render:

- `page`: the page name of the template to use for that row. Repeat the same page name to create one page per product.
- `document`: rows with the same value are combined into one document, in row order. Empty cells inherit the value from the row above. Without a `document` column, the whole file becomes one document.
- `merge`: `true` with `format` `pdf` combines all pages into one PDF.
- Settings (template, format, merge, name) are read from the first row of each document.

For product catalogs with categories, covers and grids, use the Catalog integration instead. See "Catalog Integration: Product Catalogs from a Spreadsheet".

## Tips

- Test with 2 or 3 rows first.
- Use the Playground or the template's layers list to copy the exact layer names.
- Keep image files reasonably sized (for example under 4000 px on the longest side). Very large images make renders slow or fail.

## FAQ

Q: Which columns are required?
A: Only `template`, with the template ID in each row. Add layer columns like `title_text` for the content you want to change.

Q: My spreadsheet ran but the images show the template's default text. Why?
A: The column names do not match your layer names. Check spelling, uppercase and lowercase, and make sure the layer names do not contain underscores.

Q: How do I change an image for each row?
A: Add a column named `{layer-name}_image_url` with a public direct image link in each row.

Q: How do I name the files?
A: Add a `name` column. Its value becomes the file name in the ZIP.

Q: The files in the ZIP are in the wrong order. How do I fix it?
A: Start each name with a zero-padded number (001, 002, 003...).

Q: Why didn't my job start?
A: Usually because there are not enough credits for the whole file, a template ID is wrong or belongs to another account, or a column header is invalid. The error message lists the rows with problems.

Q: Can I create one PDF with many pages from a spreadsheet?
A: Yes. Use document mode with the `page`, `document` and `merge` columns, or the Catalog integration for product catalogs.

Q: Does it support Excel files?
A: Yes. CSV, XLSX and XLS, up to 10 MB.