# Bulk-generate Canva campaign assets from a Google Sheet

> Pick a brand template, map it to your spreadsheet once, then generate every campaign design with the file names you actually want.

- Workflow type: app
- Services: Canva, Google Sheets, Google Drive
- Categories: Marketing, Operations
- Published: 2026-08-16

## What it does

- Lists your Canva brand templates and shows each one's fillable fields next to the columns of the Google Sheet you choose, so you match them up once.
- Shows a preview table of exactly what every design will say, with checkboxes so you only generate the rows you actually want.
- Builds each design, exports it in the file type you picked, and files it in a Google Drive folder using a name you assemble from your own columns.
- Tracks every row live as queued, generating, exporting, done or failed, and puts a retry button on only the rows that failed.

## What you'll need

- A Canva account on a Pro or Enterprise plan, since brand templates and autofill are not available on the free plan
- At least one brand template in Canva with fillable fields already set up
- A Google account with the campaign spreadsheet and permission to add files to Drive
- A spreadsheet laid out with column headers in the first row and one design per row underneath

## Prompt

Build me an app my marketing team opens whenever a campaign needs its assets built. It should replace the copy, paste and download ritual we go through today: one Canva brand template, one spreadsheet of rows, and every design generated, exported, named properly and filed in Drive without anyone downloading anything by hand.

On load, call Canva Get User Capabilities before anything else. Brand templates and autofill require a Canva Pro or Enterprise plan, so if the connected account does not report those capabilities, say so plainly at the top of the app in plain language and disable the Generate button. Keep the rest of the interface visible and explorable rather than hiding it, so someone can still see what the app would do and know which plan to upgrade to.

The main screen is a setup step with two pickers side by side. On the left, list the brand templates from Canva List Brand Templates, showing the template name and thumbnail, and remember that this endpoint uses continuation token pagination rather than page numbers, so load more via the continuation token. On the right, let the user choose a Google Sheet: list candidate spreadsheets with Google Drive List Files using a query that filters to spreadsheet files, and also accept a pasted spreadsheet URL or ID. Once a sheet is chosen, use Google Sheets Get Spreadsheet to list its tabs so the user can pick the right one.

Picking a template opens the mapping view. Call Canva Get Brand Template Dataset to get that template's fillable fields and their types, which may be text, image or chart. Call Google Sheets Get Values on the chosen tab to read the header row and the data rows. Show the template fields in a column on the left and, beside each one, a dropdown of the spreadsheet's column headers, so the user maps each field to a column exactly once. Flag any unmapped field before generation and respect the field type, for example an image field needs a column containing an image URL or asset reference, not arbitrary text. Persist this mapping keyed by template plus spreadsheet plus tab so the team never redoes it for a recurring campaign.

On the same screen, give the user a file naming pattern builder. They compose a pattern from column tokens and literal text, something like {Campaign}_{Channel}_{Date}, and see a live sample filename rendered from the first data row as they type. Sanitize characters that are illegal in filenames, and if two rows resolve to the same name, append a numeric suffix so nothing overwrites anything. The file extension comes from the chosen export format and gets appended automatically. This naming pattern is a headline feature, not a detail: Canva has no custom file naming and names every download after the design title, so without this a fifty row campaign produces fifty files called Instagram Post.

Let the user pick the export file type for the run up front. Because Canva Get Design Export Formats needs a design that exists, check it per row after that row's design has been created, then call Export Design in the chosen format. If the created design does not support the requested format, mark that row failed with a readable reason instead of retrying blindly, and note that Canva Docs cannot be exported to PNG or JPG so PDF or PPTX is the right choice for those.

Below the mapping, show a preview table: one line per spreadsheet row, with the resolved value of each template field and the computed filename, plus a checkbox on every row and a select all and select none control. The header row is excluded from the data. This preview is the whole point of the review step, since it shows exactly what each design will say before any generation is spent.

Hitting Generate first creates the destination folder once for the run with Google Drive Create Folder, defaulting the name to the campaign plus today's date and letting the user choose the parent folder. Then, for each selected row, run this pipeline: Canva Autofill Brand Template with the mapped values, wait for the resulting design, call Get Design Export Formats for that design, call Export Design in the chosen format and wait for the download URLs, fetch the finished file, upload it into the run folder with Google Drive Upload File (Multipart) under the patterned filename, and finally write the design link and the Drive file link back into that row with Google Sheets Update Values, into columns the user picked during setup.

Autofill and export are asynchronous jobs, and this shapes the status handling. A 2xx on the start call only means the job was queued, so per-row status must reflect the polled job result rather than the start call. Poll every second or two, expect jobs to finish within roughly ten to thirty seconds, and handle a job that comes back failed with an error code and message by surfacing that message on the row. Export download URLs expire after 24 hours, which is exactly why the file is pulled and uploaded to Drive during the run instead of being linked directly.

The generation table needs a live per-row status of queued, generating, exporting, done or failed, updating as the run progresses rather than only at the end. Show a retry button on failed rows only. A retry resumes from the furthest stage that already succeeded, so a row whose design exists but whose export failed is not autofilled again, and a row whose file already uploaded only needs its sheet write. Offer both retry on a single row and retry all failed rows.

Make the run robust: process a few rows concurrently rather than firing fifty at once, back off exponentially on 429 responses and respect a Retry-After header if present, and keep run state server side so closing the tab does not lose the partial results of a long batch. Persist per user the last used template, spreadsheet, tab, field mapping, filename pattern, export format and Drive parent folder, and keep a short run history showing when each batch ran, how many rows succeeded or failed, and a link to the Drive folder it produced.

## How to customize

- Change the file naming pattern to any mix of your own columns and text, like campaign name plus channel plus date
- Switch the export file type per run, for example PNG for social posts and PDF for print handouts
- Choose which columns the finished design link and file link get written back into

## FAQ

### Do I need a paid Canva plan for this?

Yes. Brand templates and autofill are Pro and Enterprise features. The app checks the connected account the moment it opens and tells you plainly if that account cannot use them, rather than letting you set everything up and fail halfway through a run.

### Can I control what the files are named?

Yes, and that is the main point. Canva names every download after the design title, so a fifty row campaign arrives as fifty files called Instagram Post that you then rename by hand. Here you build a name out of your own spreadsheet columns and every file lands correctly named the first time.

### What happens if one row fails?

Only that row is marked failed and gets its own retry button. Rows that already finished stay done, so one bad row never costs you the whole batch.

### Why do the files go to Google Drive instead of just downloading?

Canva's finished file links stop working after 24 hours. Saving the assets straight into a Drive folder means they are still there next week, and the link written back into your sheet keeps working.

### Do I have to generate every row in the sheet?

No. The preview table has a checkbox on each row, so you can run a handful, check the results, and come back for the rest whenever you are ready.

Use this prompt in General Input: https://www.generalinput.com/prompts/bulk-generate-canva-campaign-assets-from-a-google-sheet