Airtable to Canva Bulk Create: The Complete Workflow (With Images)
Draft — Post #12 · Target keyword: Airtable to Canva Bulk Create · Meta: Airtable exports records as a CSV, but Canva Bulk Create ignores the image URLs. Here's the full Airtable to Canva Bulk Create

Draft — Post #12 · Target keyword: Airtable to Canva Bulk Create · Meta: Airtable exports records as a CSV, but Canva Bulk Create ignores the image URLs. Here's the full Airtable to Canva Bulk Create workflow, images included.
You run your whole operation out of Airtable. Products, content calendar, speaker roster, real estate listings, whatever it is. Every record has a name, a few text fields, and an attachment field with the photo or logo already sitting right there in the row.
So you do the obvious thing. Export the view as a CSV, open Canva, fire up Bulk Create, and connect the columns. The text merges fine. The image slots come back empty or print a long string of https:// gibberish across your template.
This is the Airtable to Canva Bulk Create wall, and almost everyone hits it the first time. Your attachment field did export, but it exported as a text URL, and Canva does not read image URLs. This post walks through why that happens, the manual fixes that waste an afternoon, and the one-step way to get embedded images into Canva from an Airtable export.
Why Canva Bulk Create Stalls on Airtable Exports
When you export an Airtable view to CSV, attachment fields do not bring the files with them. They export as a comma-separated list of URLs that point back to Airtable's servers. The CSV is pure text. There is no image data inside it.
Canva Bulk Create handles every text column without complaint. Names, prices, dates, captions, SKUs all merge cleanly into your template placeholders. Image URLs are where it breaks.
Canva only accepts images that are physically embedded inside the XLSX file as binary data, in a format called DrawingML. A URL is just a string of characters to Canva. It either prints the raw URL inside your design or leaves the image element blank. We covered the technical reason in full in Why Canva Bulk Create Ignores Image URLs.
For an Airtable user this is the whole problem. Your base might have 300 product records with a photo in every row, but none of those photos will render in Canva unless the images are embedded inside the spreadsheet before you upload it.
One extra wrinkle specific to Airtable: when an attachment cell holds more than one file, the export packs all of them into a single cell separated by commas. Bulk Create wants one image per placeholder, so you want one image URL per cell going in.
The Manual Workaround Most Airtable Users Try First
The first hack people reach for is the Excel one. Export the Airtable CSV, open it in Excel, click each image cell, use Insert > Picture > Place in Cell, point to the downloaded file, and repeat for every row. That works if you have already downloaded all the images, sized them, named them to match, and have the patience to do it 300 times. For a handful of rows it is fine. At catalog scale it is an afternoon you will not get back.
The second hack is the =IMAGE() formula in Google Sheets. It looks like it embeds the picture, because the cell shows the image. It does not. =IMAGE() is a live cell reference, not embedded image data, so Canva sees nothing when it parses the file. We broke that one down in Why =IMAGE() Doesn't Work for Canva Bulk Create.
There are also automation routes through Zapier, Make, or n8n that wire Airtable to Canva's API. Those can work, but they are built for people comfortable mapping fields across tools, paying for another subscription, and debugging a broken zap. If you just want graphics out the door, that is a lot of overhead.
What You Need Before You Start
Two things.
A Canva template per design type. Most Airtable workflows revolve around a small set of repeating layouts. A product card with photo, title, and price. A listing graphic with a hero image and details. A speaker or team card with a headshot, name, and role. Each template needs Bulk Create placeholders for the text fields like {{title}} or {{price}}, plus an image element for the photo.
An Airtable view set up for export. One row per output design, with only the columns you actually need. Hide everything else in the view before exporting so your CSV stays clean. Keep one attachment field per image slot, and ideally one file per cell.
If your base already holds the records and images, you are most of the way there. The same clean-sheet rules we use for Etsy sellers and Shopify stores apply here: one row per output, one column per data field, image URLs in their own column.
Step 1: Export Your Airtable View as a CSV
In Airtable, open the view you want to turn into graphics. Trim it down first. Hide columns you do not need, filter to just the records you want, and sort it the way you want the designs to come out.
Then use the view menu and choose Download CSV. Airtable writes one row per record. Your attachment field comes through as a URL (or a comma-separated list of URLs if a cell has several files).
A quick note worth knowing: Airtable's attachment URLs are now time-limited and expire after a window rather than living forever. Run the next steps soon after exporting rather than sitting on the CSV for days. If an image fails to embed later, a stale URL is the likely cause, and re-exporting fixes it. (Airtable has changed this behavior over time, so confirm the current expiry window if timing matters.)
Step 2: Clean Up the Image Column
Open the CSV. You want one clean image URL in the image column for each row.
If a cell holds multiple comma-separated URLs from a multi-file attachment, keep the one you want and delete the rest. If the exported URL came wrapped with extra filename text or metadata, trim it down to the bare link that ends in .jpg, .png, or similar.
Name the column something simple like image_url. Leave every other column as is.
Step 3: Build the Spreadsheet
A typical Airtable product export, cleaned up for Bulk Create, looks like this.
| title | price | category | image_url |
| Linen Throw Pillow | $38 | Home | https://v5.airtableusercontent.com/.../pillow.jpg |
| Ceramic Mug Set | $24 | Kitchen | https://v5.airtableusercontent.com/.../mugs.jpg |
| Wool Blanket | $89 | Home | https://v5.airtableusercontent.com/.../blanket.jpg |
Save it as CSV or XLSX. The column names do not have to match Canva exactly, since you map them in the Bulk Create panel, but matching names lets Canva auto-connect in one click.
Step 4: Convert the Spreadsheet With Postprep
This is the step Canva refuses to do for you.
Go to postprep.app, upload your CSV, and pick the column that holds the image URLs. Postprep fetches each URL, downloads the image, and embeds it inside the XLSX as DrawingML, the binary format Canva actually reads. Every other column passes through unchanged.
A few hundred rows take about a minute. The free tier covers 100 rows with no account required, which is enough to test the full round trip before you commit to a bigger batch. Because Airtable URLs can expire, do this soon after exporting, not next week.
Step 5: Bulk Generate in Canva
Open your template in Canva. You need a plan that supports Bulk Create. Canva lists this under its paid tiers, and Bulk Create runs on desktop. If you are not sure your plan qualifies, check Canva's current plan details, since the eligible tiers have shifted over time.
In the left panel click Apps, then Bulk Create. Click Upload data and choose your converted XLSX. Drag each column onto its matching placeholder, or use Auto-connect if the names line up.
Click Generate designs. Canva produces one finished design per row with the photos, titles, and prices already merged. Download the set as a ZIP, ready to post, print, or schedule.
If you run several layouts off the same data, take the same converted XLSX into each template and run Bulk Create once per template. Same data, multiple sets of branded assets.
A Realistic Airtable Workflow
Here is the rhythm once it is set up.
You keep your base as the single source of truth, the way you already do. When you need a batch of graphics, you open the relevant view, hide the noise, and export. You clean the image column, run the file through Postprep, and bulk-generate in Canva. That is a few minutes of spreadsheet work and a few minutes in Canva, whether the view has 20 records or 500.
When the base changes, you do not rebuild anything. Update the records, re-export the view, re-run Postprep, and regenerate. The data already lives in one place; this workflow just turns it into finished designs without the manual middle. For the broader version across any source, see How to Use Canva Bulk Create With Images.
Frequently Asked Questions
Do I need the Airtable paid plan for this?
No. Any Airtable plan that lets you export a view as CSV works. The conversion and the bulk generation happen outside Airtable, so your base plan does not gate this. You do need a Canva plan that includes Bulk Create.
My attachment cell has three images. Which one does Canva use?
Bulk Create maps one image per placeholder. When you clean the CSV, keep the single URL you want in that row and delete the others. If you genuinely need all three on one design, that is a multi-image layout, which Bulk Create does not handle in one pass. Split it into separate columns and placeholders, or build that design manually.
The images embedded fine yesterday but fail today. What changed?
Most likely the Airtable attachment URLs expired. Re-export the view to get fresh URLs, then run the file through Postprep again right away. Treat the export and the conversion as one sitting.
Can I keep using my Airtable column names?
Yes. Canva maps columns by what you drag onto each placeholder, so the names are just for your own clarity. Matching them to your template variable names saves a step because Canva can auto-connect, but it is optional.
What if some records have no image yet?
Leave the image cell blank for those rows. Postprep skips the embed for empty cells, and Canva leaves the placeholder visible in the generated design. Fill in the record later, re-export, and regenerate just those.
Does this work for non-product bases, like a content calendar or team directory?
Yes. Any Airtable view with text fields and an image attachment per row converts the same way: export, clean the image column, convert, bulk generate.
The Short Version
Airtable holds your data and your images in one tidy base. Canva Bulk Create can merge that data into a stack of designs. The gap is that an Airtable CSV exports images as URLs, and Canva only reads images embedded inside the XLSX. Postprep closes that gap in one upload.
Export the view, clean the image column, convert with Postprep, bulk generate in Canva. Your base becomes a design pipeline, and you never hand-place another image.
Try it free at postprep.app — 100 rows, no account required.