PostPrep
← Blog
2026-05-28

How Photographers Can Use Canva Bulk Create for Client Previews and Social Teasers

Generate sneak peeks, client preview cards, and booking graphics for every session in one batch. Here's the Canva Bulk Create workflow built for photographers.

Pete B.
Pete B.
Founder, Postprep

Every shoot ends the same way. You pick the best frames, edit them, then sit down to build the social teasers. One sneak peek for the couple, three for Instagram, a carousel for the blog post, a "now booking" graphic with their best portrait, plus the client preview card you send through email.

Multiply that by every wedding, family session, brand shoot, or newborn gig on your calendar and you have a second job that nobody is paying you for.

Canva Bulk Create is designed to kill exactly this kind of repetitive work. Build one template, feed it a spreadsheet of session data plus image URLs, and generate the whole batch at once. The problem is that Canva refuses to read image URLs from your spreadsheet, which breaks the entire workflow before it starts.

Why Canva Bulk Create Photographers Workflows Usually Stall

Photographers live in URLs. Your finals sit in Pixieset, ShootProof, Pic-Time, SmugMug, CloudSpot, or a Dropbox folder. When you go to bulk-generate sneak peeks, you grab the gallery share link or a direct image URL and drop it into your spreadsheet.

Canva Bulk Create cannot use those URLs. It only accepts images that are physically embedded inside an XLSX file, stored as binary image data in a format called DrawingML. A URL is just text to Canva, so it either prints the link as plain text inside your template or leaves the image slot blank.

This is the same wall every Etsy seller, Shopify store owner, and real estate agent hits when they try the feature for the first time. We covered the technical reason in detail in Why Canva Bulk Create Ignores Image URLs. For photographers the result is the same: a spreadsheet of perfectly good gallery URLs that produces a stack of blank designs.

There is no toggle inside Canva to flip on URL fetching. The XLSX has to be converted before Canva ever sees it.

What You Need Before You Start

Two pieces have to be in place.

A Canva template per graphic type. Most photographers run a small set of recurring assets. Common ones:

A square sneak peek with the client first names, session date, and one hero image. A booking availability card with month, available dates, and a sample portrait. A blog header for each session reveal. A client preview email card with the gallery link. A "now featured" or testimonial graphic with a portrait plus a quote.

Each template needs Bulk Create placeholders for the variable text such as {{client_names}}, {{session_date}}, {{gallery_link}}, and an image element where the photo will sit.

A session tracking spreadsheet. One row per session, one column per data field, plus a column with the image URL you want pulled in. If you already track shoots in Notion, Airtable, Google Sheets, or HoneyBook, you are mostly there. The only column you might need to add is the direct image URL of the hero shot.

Step 1: Get Your Hero Image URLs Out of Your Gallery Host

This is the step that trips most people up. Different platforms expose direct image URLs in different ways.

Pixieset. Open the gallery, right-click the hero image, and choose Copy Image Address. The URL ends in .jpg and points to the rendered image on Pixieset's CDN. Those URLs are public and stable as long as the gallery remains active.

ShootProof. Open the photo in the gallery, click the share icon, and grab the direct image link rather than the gallery share link. The gallery link points to a page, not an image, and will not work for bulk generation.

Pic-Time. Right-click the image in the gallery preview and copy the image address. Pic-Time URLs follow a CDN pattern and remain valid for the life of the gallery.

Dropbox or Google Drive. Direct linking is more involved. For Dropbox, take the share link and change ?dl=0 at the end to ?raw=1. For Drive, the share link has to be converted to the https://drive.google.com/uc?id=FILEID&export=download format. Both work, but it is faster to upload your hero shots to your gallery host or a simple image CDN.

Your own website. If you embed featured work on your portfolio, those image URLs already work. Right-click and copy image address.

Drop the image URL into your spreadsheet under a column called hero_image or preview_url or whatever you prefer.

Step 2: Build the Session Spreadsheet

A typical wedding or portrait photographer's bulk sheet looks something like this.

client_names session_date session_type gallery_link hero_image
Sarah & Mike June 14, 2026 Wedding pixieset.com/sm-wedding https://cdn.pixieset.com/.../hero1.jpg
The Garcia Family June 22, 2026 Family pixieset.com/garcia https://cdn.pixieset.com/.../hero2.jpg
Emma Brand Shoot July 1, 2026 Brand pixieset.com/emma-co https://cdn.pixieset.com/.../hero3.jpg

Save it as a CSV or XLSX. Column names do not need to match Canva exactly because you will map them in the Bulk Create panel, but matching names lets Canva auto-connect everything.

Step 3: Convert the Spreadsheet With Postprep

This is the conversion step Canva does not do for you.

Go to postprep.app, upload your CSV, and select the column that holds the image URLs. Postprep fetches each URL, downloads the image, and embeds it directly into the XLSX in the DrawingML format Canva requires. Every other column passes through unchanged.

A sheet of 25 sessions takes under a minute. Free tier covers 100 rows, no account required.

For the deeper technical breakdown of what the conversion actually does, see Why =IMAGE() Doesn't Work for Canva Bulk Create. The short version: Canva needs binary image data inside the file, not a reference.

Step 4: Generate Every Graphic in Canva

Open your sneak peek template in Canva.

In the left sidebar go to Apps and find Bulk Create. Click Upload data and select the converted XLSX. Drag each column onto the matching placeholder, or use Auto-connect if your column names match your placeholders.

Click Generate designs. Canva produces one finished design per row, each with the correct client names, dates, and hero image already baked in.

If you have three template types running off the same spreadsheet (a sneak peek square, an Instagram Story version, and a blog header) take the same XLSX into each template and run Bulk Create three times. Same data, three sets of perfectly branded assets.

Download the batch as a ZIP. You now have a full month of social content ready to schedule.

A Realistic Photographer Workflow

This is what the rhythm looks like in practice.

Every Sunday night, pull up your sessions tracker. Add any new shoots from the week with their hero image URLs. Run the sheet through Postprep. Take the XLSX into your two or three core templates. Schedule the outputs through Later, Planoly, or Canva's own scheduler.

The whole loop takes about 20 minutes for a working photographer doing 4 to 8 shoots a week. Without it, you are spending 10 to 15 minutes per session manually building each post.

The math works out the same for studios with multiple shooters. Each photographer adds their sessions to a shared sheet. Studio manager runs the bulk job once. Whole team is set for the week.

Frequently Asked Questions

Will this preserve image quality for high-resolution gallery exports?

Yes. Postprep embeds the image at its original resolution. If your gallery exports a 2400px wide JPG, that is what ends up in the XLSX and in the final Canva design. Canva does its own compression on export, but the source pixels stay intact.

My Pixieset gallery is password protected. Will the image URLs still work?

The image CDN URLs themselves are usually unprotected even when the gallery page requires a password. Right-click the image inside the password-protected gallery and copy the image address. That direct URL typically resolves without authentication. If it fails, switch the hero photo to your own portfolio site or a public CDN.

What if I want to add a watermark before the bulk generation?

Add the watermark in Canva as part of the template itself, layered over the image placeholder. That way every generated design gets the watermark applied automatically with no extra step.

Can I run this for engagement sessions, then reuse the same workflow for the wedding?

Yes. Most photographers keep both the engagement and the wedding as separate rows tied to the same client. Different image URLs, different session dates, same template. The workflow assumes one row per design output.

Does this work for video stills or just photos?

Any image format that Canva accepts as a placeholder works. JPG and PNG are the common ones. If you have video, export a still frame to JPG first and use that URL.

Is there a row limit?

Postprep allows 100 rows on the free tier with no account. For higher volumes a paid tier removes the cap. Canva's own Bulk Create has its own per-job limits depending on your plan, so larger studios sometimes split big batches into two jobs.

The Short Version

Canva Bulk Create handles the heavy lift of generating every sneak peek, preview card, and booking graphic from one spreadsheet. The only piece Canva does not handle is converting image URLs into embedded images inside the XLSX. Postprep is the missing step.

Track sessions in a sheet. Convert with Postprep. Bulk generate in Canva. Every shoot ships its full set of social assets without another hour at the laptop.


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