PostPrep
← Blog
2026-08-30

Coda to Canva Bulk Create: The Complete Workflow (With Images)

Draft — Post #42 · Target keyword: coda to canva bulk create · Meta: Coda's CSV export can drop image columns entirely. Here's the full Coda to Canva Bulk Create workflow, from Image URL columns to bu

Pete B.
Pete B.
Founder, Postprep

Draft — Post #42 · Target keyword: coda to canva bulk create · Meta: Coda's CSV export can drop image columns entirely. Here's the full Coda to Canva Bulk Create workflow, from Image URL columns to bulk-generated designs.

You run your product catalog, content calendar, or client roster out of Coda. Every row has a name, a few properties, and a photo sitting right in the table, either dropped in as an upload or linked in from somewhere else.

So you do the obvious thing. Export the table as CSV, open Canva, fire up Bulk Create, connect the columns. The text merges fine. The image column comes back empty, or in a lot of cases, it's just missing from the file entirely.

This is the Coda to Canva Bulk Create wall, and it hits harder than it does on other no-code tools. Coda doesn't just export your images as unusable text links. Depending on how you stored them, it can drop the image column from the CSV altogether. This post walks through why that happens, which column type actually gets you a usable link, and the one-step way to get real embedded images into Canva from a Coda export.

Why Canva Bulk Create Stalls on Coda Exports

Coda tables can hold images two different ways: an Image column, where you upload or drag a file directly into the cell, or an Image URL column, where you paste a link to an image hosted somewhere else. The two look almost identical in the table view. They behave completely differently on export.

Export a table with an Image column to CSV, and Coda drops the file. This isn't a rare edge case. Coda's own community forum has threads going back years asking for the ability to export image cells to CSV at all, and the answer has stayed the same: attachments don't survive a standard export. You end up with a column that's blank or missing, not even a broken link to clean up.

Export a table with an Image URL column, and you get what you'd expect: the plain text URL sitting in the cell. That's a step better, but it runs into the same wall as every other spreadsheet-to-Canva workflow. Canva Bulk Create 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 link inside your design or leaves the image element blank. We covered the technical reason in full in Why Canva Bulk Create Ignores Image URLs.

So Coda users are actually solving two problems, not one: first, get a usable image URL out of Coda at all, then get that URL turned into an embedded image Canva can read.

The Manual Workaround Most Coda Users Try First

The first hack people reach for is the Excel one. Export the CSV, open it in Excel, click each image cell, use Insert > Picture > Place in Cell, point to a downloaded copy of the photo, repeat for every row. That's fine for a dozen rows. At catalog or calendar scale, across dozens or hundreds of rows, it's an afternoon gone.

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.

Some Coda users try the API next, pulling row data with a script and hoping the image field returns a stable link. It doesn't, reliably. Attachment data from the API tends to come back as a temporary reference rather than a durable public URL, and Coda's own developer documentation notes that these kinds of links expire. Fine for a one-time script run, bad for a workflow you want to repeat every week.

What You Need Before You Start

Two things.

A Canva template per design type. Most Coda workflows revolve around a small set of repeating layouts: a product card with photo, name, and price; a content calendar tile with a thumbnail and a headline; a roster card with a headshot and a title. Each template needs Bulk Create placeholders for the text fields like {{title}} or {{price}}, plus an image element for the photo.

Your images living in an Image URL column, not an Image column. This is the Coda-specific step, and it's the one that actually matters. If your photos are currently uploaded directly into the table as an Image column, host them somewhere public (your website, a CDN, cloud storage with shareable links) and paste those links into a new Image URL column instead. If your images already live in an Image URL column, you're most of the way there already.

The same clean-sheet rules we use for Airtable and Notion apply here: one row per output, one column per data field, image links in their own column.

Step 1: Set Up an Image URL Column (If You Don't Have One)

If your table already has an Image URL column with working links, skip to Step 2.

If your images are currently uploaded as an Image column, add a new column and set its type to Image URL. Host each photo somewhere public, wherever you already keep public assets, and paste that link into the new column for each row. It's manual the first time. Once the column exists, new rows just need a link pasted in going forward.

Step 2: Export Your Coda Table as CSV

Open the table, switch to the view you want to turn into graphics, and trim it. Hide columns you don't need, filter to just the rows you want, sort it the way you want the designs to come out.

Then export the view to CSV. Coda writes one row per record. Your Image URL column comes through as a plain text link. If you still have an Image column in the mix, that column will come through blank or missing, so double check your Image URL column is the one doing the work before you move on.

Step 3: Clean Up the Image Column

Open the CSV. You want one clean image URL in the image column for each row.

Trim any stray text around the link down to the bare URL ending in .jpg, .png, or similar. Rename the column something simple like image_url. Leave every other column as is.

Step 4: Build the Spreadsheet

A typical Coda product table, cleaned up for Bulk Create, looks like this.

titlepricecategoryimage_url
Linen Throw Pillow$38Homehttps://cdn.yoursite.com/pillow.jpg
Ceramic Mug Set$24Kitchenhttps://cdn.yoursite.com/mugs.jpg
Wool Blanket$89Homehttps://cdn.yoursite.com/blanket.jpg

Save it as CSV or XLSX. Column names don't 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 5: 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 holding the image URLs. Postprep fetches each link, 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, enough to test the full round trip before committing to a bigger batch.

Step 6: 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're not sure your plan qualifies, check Canva's current plan details, since 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, names, and prices already merged. Download the set as a ZIP, ready to post, print, or schedule.

A Realistic Coda Workflow

Here's the rhythm once it's set up.

You keep Coda as the single source of truth, the way you already do. Every record carries its image link in the Image URL column. When you need a batch of graphics, you open the relevant view, hide the noise, and export. Clean the image column, run the file through Postprep, bulk-generate in Canva. That's a few minutes of spreadsheet work and a few minutes in Canva, whether the view has 15 rows or 500.

When the table changes, you don't rebuild anything. Update the records, re-export, re-run Postprep, 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. If your team runs the same setup in Airtable or Notion instead, it's the same idea with an export wrinkle of its own on Airtable and Notion.

Frequently Asked Questions

Why did my image column disappear from the CSV entirely?

You likely have an Image column (uploaded files) rather than an Image URL column. Coda's standard CSV export doesn't carry attachment files or their links out of the doc. Switch to an Image URL column with publicly hosted links, and the export will include the text URL instead.

Can I just use the Coda API to pull image links instead of exporting a CSV?

You can pull row data through the API, but attachment images tend to come back as temporary references rather than durable public URLs, and Coda's own developer documentation notes these expire. It's workable for a one-off script, not something to build a repeatable weekly workflow on. An Image URL column with links to a public host is the more stable path.

Do I need a paid Coda plan for this?

No. Any Coda plan that lets you export a table as CSV works. The conversion and bulk generation happen outside Coda, so your Coda plan doesn't gate this. You do need a Canva plan that includes Bulk Create.

The text merged but the images are blank or show the raw link. What went wrong?

Canva read your image links as plain text instead of an embedded image. Run the CSV through Postprep first, then upload the converted XLSX to Bulk Create.

Can I keep my Coda column names?

Yes. Canva maps columns by what you drag onto each placeholder, so names are just for your own clarity. Matching them to your template variable names saves a step because Canva can auto-connect, but it's optional.

Does this work for non-product tables, like a content calendar or team roster?

Yes. Any Coda table with text columns and an Image URL column per row converts the same way: export, clean the image column, convert, bulk generate.

The Short Version

Coda holds your data in one flexible doc, but its CSV export handles images worse than most spreadsheet tools. Uploaded images don't survive the export at all, and linked images come out as plain text URLs Canva can't read. Postprep closes that second gap in one upload, once your images are living in an Image URL column to begin with.

Move your photos to an Image URL column, export the table, clean the image column, convert with Postprep, bulk generate in Canva. Your Coda doc becomes a design pipeline, and you never hand-place another image.


Try it free at postprep.app — 100 rows, no account required.

Try it free

Canva Bulk Create with real embedded images.

Upload your CSV or XLSX. Select your image column. Download a Canva-ready file. Free for up to 100 rows — no account needed.

Try Postprep →
Pete B.

Written by

Pete B.

Pete is a small business owner who got tired of social media eating his evenings. Posting product graphics across channels used to mean opening Canva, dropping in each image by hand, and repeating that for every listing and every platform. He kept hitting the same wall: Canva Bulk Create can save hours, but it refuses to read image URLs from a spreadsheet — turning a 5-minute workflow into a 2-hour copy-paste job. So he built Postprep to fix that one specific limitation, and writes about bulk content workflows, design tool limitations, and shipping social content without burning out.

Discussion