How Restaurants Can Use Canva Bulk Create for Menu Items, Daily Specials, and Social Posts
Draft — Post #16 · Target keyword: canva bulk create restaurant · Meta: Turn one spreadsheet into menu cards, daily specials, and social posts with food photos. The Canva Bulk Create workflow built fo

Draft — Post #16 · Target keyword: canva bulk create restaurant · Meta: Turn one spreadsheet into menu cards, daily specials, and social posts with food photos. The Canva Bulk Create workflow built for restaurants and cafes.
It's Sunday night. You need 24 menu item cards for the new digital board, a daily specials graphic for each of the next six days, and an Instagram post for every dish on the fall menu. Each one is the same layout with a different dish name, price, description, and food photo.
You already know Canva Bulk Create is built for exactly this. Then you load your spreadsheet of dishes with the photo links in a column, hit generate, and every card comes out with the photo slot blank. The text merged fine. The food photos did not show up at all.
This post walks through the full Canva Bulk Create restaurant workflow, the one step Canva won't do for you, and a weekly rhythm that turns menu updates from an all-night job into 20 minutes.
Why Canva Bulk Create Stalls for Restaurants
Restaurant content is photo-first. Nobody scrolls past a burger because the caption was clever. The dish photo is the whole point, and that's exactly where Bulk Create breaks.
Your menu data already lives somewhere structured. A spreadsheet of dishes from your POS, a Google Sheet your chef updates, a Toast or Square export, a shared folder of food photography from the last shoot. Each dish has a name, a price, a description, and a photo URL.
Canva Bulk Create handles the text fields without complaint. Drop in a column of dish names, prices, or descriptions and Canva merges them cleanly into your template.
Image URLs 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 raw link inside your card or leaves the photo frame empty. We covered the technical reason in full in Why Canva Bulk Create Ignores Image URLs.
For a restaurant that means a menu sheet with 30 dish photo links will not render. The text shows up, the food does not, and a menu card without the food photo is useless.
The Manual Workaround Most Restaurants Try First
The usual hack is to embed each photo by hand. Open the sheet in Excel, click a cell, use Insert > Picture > Place in Cell, find the photo on disk, repeat for every dish. That works if every food photo is already downloaded, cropped to the same size, and named to match the right row.
In practice your photos are scattered. Some are on the photographer's Drive folder, some on your phone, some pulled from last season's posts, a few still sitting in a text thread from the chef. By the time you've downloaded, renamed, and inserted 30 dishes by hand, you could have built the cards one by one in Canva and skipped the spreadsheet entirely.
The other dead end is the =IMAGE() formula in Google Sheets. It looks like it embeds the photo, but it's a live cell reference, not real image data. Canva sees nothing when it reads the file. We broke that down in Why =IMAGE() Doesn't Work for Canva Bulk Create.
What You Need Before You Start
Two things have to be in place.
A Canva template per format. Most restaurants cycle through a handful of recurring designs. A menu item card with dish photo, name, price, and description. A daily specials graphic with the special's photo, name, and price. A social post per dish with a bigger photo and a short caption hook. A digital menu board tile sized for your screen.
Each template needs Bulk Create placeholders for the text variables like {{dish_name}}, {{price}}, {{description}}, plus a photo frame for the image element.
One source-of-truth spreadsheet. One row per output design. Columns for every text field and one column for the direct photo URL. If your menu already lives in a Google Sheet, a POS export, or an inventory file, you're most of the way there. The only thing you may need to add is a direct link to each dish photo. The same clean-sheet rules we wrote about for product catalogs apply here: one row per output, one column per field, photo URLs in their own column.
Step 1: Collect Your Dish Photo URLs
This is the step that eats the most time, because restaurant photos live everywhere.
Google Drive or shared folder. Convert the share link to a direct image URL using the format https://drive.google.com/uc?id=FILEID&export=download, or move your final dish shots into a public folder on your website.
Your website or online ordering page. If your photos are already live on your site, Toast, Square Online, or a delivery menu, right-click the photo and copy image address. The URL usually ends in .jpg or .png, which is exactly what you want.
Photographer handoff. Most food photographers deliver a gallery link (Pixieset, Dropbox, Drive). For Dropbox, change the trailing ?dl=0 to ?raw=1 to get the raw image. For galleries, use the download or direct image link, not the preview page.
Instagram archive. If your best photos are old posts, it's cleaner to pull the original files from your phone or camera roll and upload them to one folder than to scrape the links.
Drop every URL into the spreadsheet under one column. Name it photo_url and keep the convention consistent.
Step 2: Build the Menu Spreadsheet
A typical restaurant bulk sheet looks like this.
| dish_name | price | description | category | photo_url |
| Smash Burger | $14 | Double patty, aged cheddar, house sauce | Mains | https://yoursite.com/photos/smash.jpg |
| Truffle Fries | $9 | Hand-cut, parmesan, truffle oil | Sides | https://yoursite.com/photos/fries.jpg |
| Fall Cider Donut | $6 | Warm, cinnamon sugar, maple glaze | Dessert | https://yoursite.com/photos/donut.jpg |
Save it as CSV or XLSX. Your column names don't have to match Canva exactly because you map them in the Bulk Create panel, but matching names lets Canva auto-connect everything in one click.
Step 3: Convert the Spreadsheet With Postprep
This is the conversion Canva refuses to do.
Go to postprep.app, upload your CSV, and pick the column that holds the photo 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 untouched.
A 30-dish sheet takes well under a minute. The free tier covers 100 rows with no account required, which is more than enough for a full menu.
Step 4: Bulk Generate in Canva
Open your menu card template in Canva. Make sure you're on a plan that supports Bulk Create. Based on Canva's documentation, Bulk Create is part of the paid tiers and runs on desktop. Plan eligibility and pricing change often, so confirm your current plan includes it before you build the whole workflow around 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 dish with the food photo, name, price, and description already merged.
Running three formats off the same sheet (a menu card, a social post, and a board tile) just means opening each template and running Bulk Create three times against the same XLSX. Same data, three sets of branded assets. Download as a ZIP and you're done.
A Realistic Weekly Restaurant Workflow
Here's the rhythm for a working kitchen or small chain.
Menu launch or seasonal change. Build one master sheet for the full menu with photo URLs. Run it through Postprep once. Generate the entire set of menu cards and social posts in Canva. This is the big batch that used to swallow a whole evening.
Weekly specials. Keep a small "specials" sheet. Each week the chef drops in the six dishes and their photos. Re-run Postprep, generate the six daily specials graphics, and schedule them. Two minutes of spreadsheet, two minutes in Canva.
One-off additions. New dish lands mid-week? Add one row, re-run, generate the single card. No designer, no late night.
The whole menu cycle takes about 20 minutes regardless of whether you run one location or six. Without the converted XLSX you're looking at hours of manual photo dragging every time the menu shifts.
A useful honesty note: some restaurant graphics are text-only. A "We're closed for the holiday" notice, a hours-change post, or a plain-text specials board with no photos needs no conversion at all. Bulk Create handles those straight from a CSV. Postprep only matters when your designs include the dish photos.
Frequently Asked Questions
Can I use this for a digital menu board and printed menus from the same sheet?
Yes. Canva exports the same generated designs to PDF for print or PNG for screens. Run Bulk Create once per template size, download both formats. The photos embed at their original resolution, so they hold up at print sizes as long as your source images are high enough quality.
My menu is in my POS, not a spreadsheet. What do I do?
Most POS systems (Toast, Square, Clover) export an item list as CSV. Export it, add a photo_url column with your dish photo links, and you have your source sheet.
Some dishes don't have a good photo yet. Can I still run the batch?
Leave the photo URL cell blank for those rows. Postprep skips the embed for empty cells and Canva leaves the placeholder visible. Re-run once you've shot the missing dishes.
Do the photos need to be a specific size?
Not for the conversion. Postprep embeds whatever the URL returns. For clean cards, it helps if your photos share a similar aspect ratio so they fill the Canva frame consistently, but that's a design preference, not a requirement.
Can I generate posts for multiple platforms at once?
Run the same converted XLSX through a square template for Instagram and a vertical template for Stories or Reels covers. One sheet, two templates, two runs. For the broader month-of-content version of this, see How to Use Canva Bulk Create for a Month of Social Media Posts.
What about allergen icons or rating badges per dish?
Those are usually fixed graphics, not per-row photos, so set them in the template itself. The per-row photo column is just for the dish image.
The Short Version
Canva Bulk Create does the merge work for every menu card, daily special, and dish post you need. The one thing it won't do is turn your photo URLs into embedded images inside the XLSX. Postprep is that missing step.
Build one master menu sheet with a photo URL column. Convert with Postprep. Bulk generate in Canva. Every dish ships its card and its post without another Sunday-night marathon.
Try it free at postprep.app — 100 rows, no account required.