PostPrep
← Blog
2026-08-30

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

Draft — Post #18 · Target keyword: Notion to Canva bulk create · Meta: Notion exports your database as a CSV, but Canva Bulk Create ignores the image links. Here's the full Notion to Canva Bulk Create

Pete B.
Pete B.
Founder, Postprep

Draft — Post #18 · Target keyword: Notion to Canva bulk create · Meta: Notion exports your database as a CSV, but Canva Bulk Create ignores the image links. Here's the full Notion to Canva Bulk Create workflow, images included.

You run your content in Notion. A product database, a content calendar, a speaker roster, a wiki of case studies, whatever it is. Each row has a title, a few properties, and an image sitting right there in the record.

So you do the obvious thing. Export the database as 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:// characters across your template.

This is the Notion to Canva Bulk Create wall. Your image field did export, but it came out as text, and Canva does not read image links. This post walks through why that happens, the manual fixes that eat your afternoon, and the one-step way to get embedded images into Canva from a Notion export.

Why Canva Bulk Create Stalls on Notion Exports

When you export a Notion database, you choose "Markdown & CSV." The database itself comes out as a flat CSV: one row per record, one column per property, pure text. There is no image data inside that file.

Canva Bulk Create handles every text column without complaint. Titles, dates, prices, captions, statuses all merge cleanly into your template placeholders. Images 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 link 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.

There is a second Notion-specific catch worth knowing before you start. How your images export depends on where they live in Notion:

  • Images stored in a URL or text property (a link you pasted pointing to a publicly hosted image) export as a clean text URL in the CSV. This is the version that works.
  • Images uploaded into a Files & media property do not export as usable public links. In a Markdown & CSV export they download as separate local files in subfolders, and Notion's own file links are signed and time-limited, so they are not reliable to fetch later.

For a clean Notion to Canva pipeline, you want your image links in a URL or text property pointing at publicly reachable images. More on that below.

The Manual Workaround Most Notion Users Try First

The first hack people reach for is the Excel one. Export the Notion 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 dozens of times. For a handful of rows it is fine. At database 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 Notion to Canva's API. Those can work, but they mean mapping fields across tools, paying for another subscription, and debugging a broken automation. A lot of overhead if you just want graphics out the door.

What You Need Before You Start

Three things.

A Canva template per design type. Most Notion workflows revolve around a small set of repeating layouts. A product card with photo, title, and price. A speaker card with a headshot, name, and talk title. A case-study graphic with a logo and a stat. Each template needs Bulk Create placeholders for the text fields like {{title}} or {{price}}, plus an image element for the photo.

A URL or text property holding your image links. This is the Notion-specific step. Add a property to your database (call it Image URL) and put a publicly reachable image link in each row. If your images already live on a CDN, your store, or any public host, paste those links here. If they are uploaded inside a Files & media property, you will get cleaner results by hosting them somewhere public and linking, rather than relying on the export's local files.

A database view trimmed for export. One row per output design, with only the columns you actually need. Hide everything else before you export so your CSV stays clean.

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 links in their own column.

Step 1: Export Your Notion Database as CSV

Open the database, switch to the view you want to turn into graphics, and trim it. Hide properties you do not need, filter to just the records you want, and sort it the way you want the designs to come out.

Then open the database menu (the ••• at the top right), choose Export, and pick "Markdown & CSV" as the format. Notion emails you a download link or prepares the file directly. The database comes through as a CSV with one row per record and your Image URL property as a plain text column.

A note on timing: Notion's export download link expires after about 7 days, so grab the file soon. More importantly, if any image link points at a signed or temporary URL, fetch it sooner rather than later. Stable, public image links do not have this problem.

Step 2: Clean Up the Image Column

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

If a cell holds extra text around the link, trim it down to the bare URL that ends in .jpg, .png, or similar. If a row has no image yet, leave the cell blank. Name the column something simple like image_url and leave every other column as is.

Step 3: Build the Spreadsheet

A typical Notion product database, 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. 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 links. 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, which is enough to test the full round trip before you commit to a bigger batch.

If any image fails to embed, it is almost always because the link was not publicly reachable: a private file, a login-gated host, or an expired signed URL. Swap in a public link and re-run.

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 Notion Workflow

Here is the rhythm once it is set up.

You keep Notion as your single source of truth, the way you already do. Every record carries its image link in the Image URL property. 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 database changes, you do not rebuild anything. Update the records, re-export, 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. If your data lives in Airtable instead, the Airtable to Canva Bulk Create workflow is the same idea with one export wrinkle of its own.

Frequently Asked Questions

Do I need a paid Notion plan for this?

No. Any Notion plan that lets you export a database as CSV works. The conversion and the bulk generation happen outside Notion, so your Notion plan does not gate this. You do need a Canva plan that includes Bulk Create.

My images are uploaded inside Notion, not linked. Will this still work?

Not reliably. Files uploaded into a Files & media property do not export as clean public links you can fetch later. The dependable path is to host those images somewhere public and store the links in a URL or text property, then export that. (Notion's behavior here has changed over time, so confirm how your current export handles file properties.)

The text merged but the images are blank. What went wrong?

Canva read your image links as plain text. You need to embed the images inside the XLSX first, which is exactly what Postprep does. Run the CSV through Postprep, then upload the converted file to Bulk Create.

Can I keep using my Notion property 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 rows.

Does this work for non-product databases, like a content calendar or team directory?

Yes. Any Notion database with text properties and an image link per row converts the same way. Some Notion jobs are pure text and need no images, in which case you can skip the conversion and feed Canva the CSV directly.

The Short Version

Notion holds your data in one tidy database. Canva Bulk Create can merge that data into a stack of designs. The gap is that a Notion CSV exports images as links, and Canva only reads images embedded inside the XLSX. Postprep closes that gap in one upload.

Keep your image links in a URL property, export the database, clean the image column, convert with Postprep, bulk generate in Canva. Your Notion workspace 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