How to Get Image URLs for Canva Bulk Create (When Your Photos Are Just Files on Your Computer)
Every Canva Bulk Create guide assumes you already have image URLs. Here is how to get image URLs for Canva Bulk Create when your photos are files in a folder.

You have 120 product photos in a folder called photos-final-v3. You have a spreadsheet with product names, prices, and SKUs. You want Canva to turn those into 120 designs.
Then you read a Bulk Create guide and it says: put your image URLs in a column. And you stop, because you do not have image URLs. You have JPGs. They live on your laptop. Nothing about them is a link.
This is the step nobody explains. Every tutorial starts one step past where you actually are. Here is what to do when your images are files, not links, and what Canva's own documented answer costs you in clicking.
Why Canva Bulk Create Needs Something You Do Not Have
Canva Bulk Create takes a spreadsheet and clones a template once per row. Text columns work exactly as you would expect. Image columns are where it falls apart.
Canva states it plainly in its own Bulk Create documentation: image URLs from cloud photo storage are not supported and will be treated as plain text. So even when you do get URLs, pasting them into a CSV gets you 120 designs with a line of blue text where the photo should be.
What Canva actually reads is an image embedded inside the spreadsheet file, in a single cell, in the DrawingML format that XLSX files use internally. That is a different thing from a URL and a different thing from a file path. We wrote up the technical reason in Why Canva Bulk Create Ignores Image URLs.
So there are really two gaps between your folder of photos and a finished batch. Gap one: your photos are not reachable at a URL. Gap two: even a URL does not embed. Most guides only address one of them, which is why the advice never quite works.
The Manual Workaround Most People Try First
Canva does have a documented path for exactly your situation, and it is worth knowing about before you dismiss it.
Inside the Bulk Create panel, choose Enter data manually. Click Add image to create an image column. Then, for each cell, you hover, click the plus icon, pick an image from your Canva media library, and select Done.
That works. It is officially supported. It is also one image at a time, by hand, for every single row. At 10 rows it is fine. At 120 rows you are clicking through a picker 120 times, and you have already had to upload all 120 photos to Canva first. The manual route stops being reasonable somewhere around twenty rows, which is roughly where anyone doing this cares enough to be reading a blog post about it.
The second thing people try is Excel's Insert > Picture. Same ceiling, plus a new problem: pictures inserted this way often float over cells instead of sitting inside one, and Canva needs them anchored in a single cell.
The third thing people try is =IMAGE() in Google Sheets. This one looks like it works and does not. The formula renders a preview on screen but stores a formula, not an image, so the export contains nothing. We covered why in Why =IMAGE() Doesn't Work for Canva Bulk Create.
What You Need Before You Start
- Your photos, in one folder, named in a way you can sort
- A spreadsheet with one row per design and a column for whatever text goes on it
- A Canva plan that includes Bulk Create (Pro, Teams, Business, Enterprise, Education, or Nonprofits, on desktop only; see Does Canva Bulk Create Require a Pro Plan?)
- Somewhere the images can live at a public URL, whether that is a store you already run or cloud storage
How to Get Image URLs for Canva Bulk Create: Two Routes That Work
Option 1: Your photos already live somewhere with URLs and you have not noticed
Before you host anything, check whether the images are already online. If these are product photos you have already listed for sale, they are. Shopify, WooCommerce, Squarespace, Etsy, eBay, BigCommerce and most other platforms expose a public image URL on every product, and most of them will export it in a CSV for you.
Same for a photo gallery service. Same for a website you already run. If the picture is visible to the public anywhere, right-click it in a browser, choose "Copy image address," and you have a URL.
This is the cheapest option by a mile, because it means you never upload anything. Skip to the conversion step below.
Option 2: Put them in cloud storage and generate direct links
If the photos genuinely only exist on your machine, cloud storage is the usual answer. Google Drive, Dropbox and OneDrive will all give you a link to a file. The catch is that the link they hand you by default points at a preview page, not at the image itself, and a preview page is not something any tool can fetch.
Each service has its own trick for turning a share link into a direct file link, and each one has changed its behaviour at least once. Google's is the most volatile. The widely-shared drive.google.com/uc?id= pattern stopped working reliably after a permissions change, so advice written before then is now wrong. We keep a current walkthrough for each:
Two things to watch. Sharing permissions have to be set to anyone-with-the-link, or the URL works for you and fails for everything else. And generating 120 links by hand is its own tedious afternoon, so if you go this route, look for a bulk-link feature in your storage tool rather than clicking file by file.
Then: get the URLs embedded, and stop there
Worth saying out loud: the URL is not the goal. The embedded image is the goal. The URL is only the delivery mechanism.
So once you have a column of working links from Option 1 or Option 2, you are done with the hard part and you should not spend another minute on embedding. Hand the file to a converter. Postprep reads the URL column, fetches every image, and returns an XLSX with each one embedded as a real DrawingML object inside a single cell, which is precisely the format Canva reads. One upload, whole batch.
This is the half of the problem that has no manual shortcut. Finding URLs is tedious. Embedding 120 images by hand is worse.
Building the Spreadsheet
Your sheet needs one row per design and one column per data field. Headers matter more than you would think, because Canva's Auto-match tries to guess connections from them.
| Product Name | Price | Image URL |
| Linen Tote, Sand | $48 | https://yourshop.com/img/sand-tote-01.jpg |
| Linen Tote, Rust | $48 | https://yourshop.com/img/rust-tote-01.jpg |
| Canvas Weekender | $96 | https://yourshop.com/img/weekender-01.jpg |
One URL per cell, no cell holding two. Before you convert the whole thing, paste two or three of those links into a fresh browser tab. If the image loads on its own with no sign-in prompt and no preview page around it, the link is good. If it does not, fix that now rather than after a failed batch.
Then:
- Convert the file at postprep.app. Free tier handles 100 rows with no account.
- Open Canva and build your template first. Add a frame or grid from the Elements tab wherever a photo goes. Canva only connects image data to frames and grids, not to a pasted picture.
- In the editor, click the page background, choose Edit, then Bulk create, then Upload data, and pick your converted XLSX. If the file has more than one sheet, Canva will ask which one.
- Connect the fields, either with Auto-match fields or by dragging each one onto its element.
- Use Preview to check a few rows, then Continue.
Under Advanced options you can pick individual design files instead of one long multi-page design, and name each output from a data column. Details in Canva Bulk Create Download.
Making It Repeatable
The first run is the expensive one. After that, the point is to never do the hard part twice.
Keep one master spreadsheet with a fixed column order. Every new batch is new rows in the same shape, which means the Canva template you built keeps working and Auto-match keeps guessing correctly.
Standardise your filenames at the source. If every photo is named sku-01.jpg and they all sit under the same folder, the whole URL column becomes one formula dragged down instead of 120 copy-pastes: ="https://yourshop.com/img/"&A2&"-01.jpg". This is the single biggest time saver in the whole workflow and it only works if you name files consistently from the start.
And keep the batches under 100 rows if you can. Canva caps a selection at 300 rows anyway, and smaller batches fail more cheaply when something is wrong. More on the caps in Canva Bulk Create Row Limit.
FAQ
Can I just put the file path in the spreadsheet?
No. C:\Users\me\photos\tote.jpg means nothing to Canva. It has no access to your filesystem, so it treats the path as text and prints it on the design.
Do I have to upload my photos to Canva first?
Only if you use the manual Enter data manually route, where you pick each image from your Canva media library cell by cell. If your images come in embedded inside the XLSX, they travel with the file and you do not upload them separately.
Is there a free way to host 120 images?
Cloud storage you already pay for is usually the answer: a Drive or Dropbox account you have anyway. Free image hosts exist, but read their terms before you put a product catalogue on one. Several delete inactive images, and a dead URL mid-batch fails silently.
Will the URLs still need to work later?
Once the images are embedded in the XLSX, no. The picture is inside the file at that point, not fetched at open time. That is also why an expired or deleted link does not break designs you already generated.
What about Canva Sheets? Does that solve it?
Canva Sheets has the same rule: images must be embedded in a cell, not linked. It is a different surface, not a different limitation. See Canva Sheets Bulk Create: Why Your Images Aren't Showing Up.
Does everything need an image?
No, and this is worth checking before you spend an afternoon on it. If half your batch is text-only (quote cards, price lists, schedules), those rows do not need an image column at all. Bulk Create handles text on its own perfectly well. Only solve the image problem for the rows that actually have images.
The Short Version
Canva Bulk Create asks for images, not links, and every guide that says "add your image URLs" is skipping the part where you do not have any.
Two routes to a URL. Your photos may already be online somewhere, in which case copy the addresses and move on. If not, cloud storage will give you direct links once you know each service's trick.
Then one route from there: convert, so the images end up embedded in single cells inside an XLSX, which is the only thing Canva actually reads. The URL was never the goal. It was just how the images get to the file.
Try it free at postprep.app — 100 rows, no account required.