PostPrep
← Blog
2026-06-13

How Salons and Spas Can Use Canva Bulk Create for Service Menus, Stylist Cards, and Promo Posts

Draft — Post #19 · Target keyword: canva bulk create salons · Meta: Build service menu cards, stylist profiles, and retail promos from one spreadsheet. The Canva Bulk Create salons workflow that actua

Pete B.
Pete B.
Founder, Postprep

Draft — Post #19 · Target keyword: canva bulk create salons · Meta: Build service menu cards, stylist profiles, and retail promos from one spreadsheet. The Canva Bulk Create salons workflow that actually embeds your photos.

You offer 32 services across hair, color, nails, and skin. Every one of them needs a clean menu card with a photo, a price, and a duration. Your three stylists each need a profile card for the booking page. You have a retail shelf full of products that should be posting to Instagram every week. And the holiday gift card promo was supposed to go out yesterday.

Every one of those is the same design with a different photo, name, and price. The right tool for this is Canva Bulk Create. You probably already found that out, dropped a spreadsheet full of image links into it, and watched Canva spit back a stack of cards with blank photo slots or the raw URL printed across the image.

This post walks through the full Canva Bulk Create salons workflow, the one piece Canva does not handle on its own, and a repeatable rhythm a busy salon or spa can actually keep up with.

Why Canva Bulk Create Stalls for Salons

Salons and spas run on photos. Service shots of a balayage or a gel set. Headshots of each stylist. Product packaging for the retail shelf. Before-and-after transformations. Every one of those lives somewhere as an image URL — your booking software, an Instagram archive, a supplier's product page, a shared phone camera roll synced to Drive.

Canva Bulk Create handles the text fields without trouble. Drop in a column of service names, prices, durations, or stylist titles and Canva merges them in cleanly. Text-only jobs like a plain price list or a class schedule do not need any of this. If a card is just words, Bulk Create works straight out of the box and you can skip the conversion step entirely.

Photos are the problem. 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 text to Canva. It either prints the link as a literal string inside the card or leaves the photo slot empty. We covered the technical reason in Why Canva Bulk Create Ignores Image URLs.

For a salon this is the difference between a working menu rollout and a dead end. A list of 30 services with photo URLs will not render unless those photos are embedded inside the XLSX before you upload it to Canva.

The Manual Workaround Most Salons Try First

The standard hack goes like this. Open the spreadsheet, switch to Excel, click each photo cell, use Insert > Picture > Place in Cell, point to the file on disk, repeat for every service. That works in theory if every photo is already downloaded, cropped, named to match the row, and sitting in one folder on your laptop.

In practice your service photos are scattered across your Instagram, your stylists' phones, a Google Drive folder, and a few supplier sites. By the time you have them all downloaded, renamed, and inserted by hand, you could have built the cards one at a time and been done.

The other hack is the =IMAGE() formula in Google Sheets. It looks like it should embed photos, and it does show them inside the sheet. But Canva sees nothing. We covered why in Why =IMAGE() Doesn't Work for Canva Bulk Create. Short version: =IMAGE() is a live cell reference, not embedded image data. When Canva parses the file, the image slot is empty.

What You Need Before You Start

Two things have to be in place.

A Canva template per card type. Most salons cycle through a handful of recurring designs. The common ones look like this.

A service menu card with a photo, service name, price, and duration. A stylist or therapist profile card with headshot, name, title, and specialties. A retail product post with the product photo, name, price, and a short benefit line. A before-and-after promo with two photos and a service label. A seasonal offer card with a hero photo and the promo terms.

Each template needs Canva Bulk Create placeholders for the text variables like {{service_name}}, {{price}}, {{duration}}, and an image element where the photo goes.

A single source-of-truth spreadsheet. One row per output card. Columns for every text field plus a column with the direct image URL. If you already keep a service list or price sheet, you are most of the way there. The only column you might need to add is a direct URL to the photo. The same prep rules we wrote up for Etsy sellers apply here: one row per output, one column per data field, image URLs in their own column.

Step 1: Collect Your Photo URLs

This is the step that costs most salons the most time. Each source exposes URLs differently.

Google Drive. Convert the share link to a direct image URL using the format https://drive.google.com/uc?id=FILEID&export=download. This is the easiest place to dump phone photos that need to go into cards.

Your booking or website CDN. If your service photos already live on your salon website or booking platform, right-click the image and copy image address. Those URLs usually work as-is.

Supplier product pages. For retail items, most brands host product photos you can right-click and copy. The URL ends in .jpg or .png. Confirm you are allowed to use the brand's images for your own marketing before you post them.

Instagram archive. Instagram URLs expire and are not reliable as direct links. Better to download the original photo and re-host it on Drive, then use the Drive link.

Drop every URL into the spreadsheet under one column. Name it photo or image_url — pick a convention and stick with it.

Step 2: Build the Salon Spreadsheet

A typical service menu sheet looks like this.

service_namecategorypricedurationphoto
Full BalayageColor$185180 minhttps://drive.google.com/uc?id=...&export=download
Gel ManicureNails$4545 minhttps://drive.google.com/uc?id=...&export=download
Deep Tissue MassageSpa$12060 minhttps://drive.google.com/uc?id=...&export=download

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

Step 3: Convert the Spreadsheet With Postprep

This is the conversion step Canva refuses to do.

Go to postprep.app, upload your CSV, and pick the column that holds the photo 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 30-row menu takes a few seconds. The free tier covers 100 rows with no account required, which is more than enough for a full service menu plus your retail shelf.

Step 4: Bulk Generate in Canva

Open your service card template in Canva. Make sure you are on a plan that supports Bulk Create. Canva lists Bulk Create as a Pro and Teams feature, and it runs from the desktop editor. Plan eligibility and naming change over time, so confirm against your own account before you rely on it.

In the left panel click Apps, then Bulk Create. Click Upload data and pick your converted XLSX. Drag each column onto its matching placeholder, or use Auto-connect if your column names already match.

Click Generate designs. Canva produces one finished card per row with the photos, names, and prices already merged. Download as a ZIP and you have the full menu ready to print or post.

If you run three card types off the same sheet — a menu card, a retail post, and a stylist profile — take the same XLSX into each template and run Bulk Create three times. Same data, three sets of branded graphics.

A Realistic Salon Workflow

Here is what the rhythm looks like for a working salon.

Quarterly menu refresh. Once a season, update prices and swap in fresh service photos in your master sheet. Run it through Postprep. Regenerate the full menu in Canva for the booking page, the front desk display, and the print menu. Twenty minutes, not an afternoon.

Weekly retail posts. Keep a sheet of retail products with photo URLs. Each week, pull a handful of rows, run Postprep, and generate Instagram posts for the products you want to push. Schedule them out.

Seasonal promos. Holiday gift cards, a back-to-school color special, a Valentine's couples package. Build one sheet of offers with hero photos, convert, generate the promo cards in your seasonal template, and you have a full campaign in one sitting.

The whole cycle is about 20 minutes of spreadsheet time and 10 minutes of Canva time per template, whether you have 10 services or 60. Doing it by hand at scale is a 3 to 4 hour job per template.

Frequently Asked Questions

Do I need this for a plain text price list?

No. If your menu is just service names and prices with no photos, Canva Bulk Create handles it on its own. The conversion step only matters when cards include photos.

My service photos are on my stylists' phones. What is the fastest path?

Have everyone drop their photos into one shared Google Drive folder. Convert each share link to the direct download format, paste the links into your sheet, and run it through Postprep. The phone-to-card pipeline becomes a copy-paste job.

Can I use the same sheet for both my booking page and my print menu?

Yes. Run Bulk Create once and export the generated cards to PNG for the booking page or PDF for print. The photo data is embedded at the original resolution, so it holds up at print sizes as long as your source photos are sharp enough.

What about before-and-after cards with two photos?

Add two photo columns to your sheet, like before_photo and after_photo, and put two image placeholders in your Canva template. Postprep embeds both. Map each column to its slot in the Bulk Create panel.

Some products do not have a photo yet. Will that break the run?

No. Leave the photo cell blank for those rows. Postprep skips the embed for empty cells and Canva leaves the placeholder visible. Re-run once you have the photo.

The Short Version

Canva Bulk Create handles the merge work for every service card, stylist profile, retail post, and seasonal promo your salon ships. The one thing it does not do is convert photo URLs into embedded images inside the XLSX. Postprep is the missing step.

Build one master sheet for your menu and one for your retail shelf. Convert with Postprep. Bulk generate in Canva. Refresh the whole thing each season without losing an afternoon to drag-and-drop.


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