MLS Listing Photos to Canva Bulk Create: The Real Workflow
Draft — Post #63 · Target keyword: mls listing photos to canva bulk create · Meta: Your MLS export has photo URLs, not embedded images. Here's how to get MLS listing photos to actually show up in Canv

Draft — Post #63 · Target keyword: mls listing photos to canva bulk create · Meta: Your MLS export has photo URLs, not embedded images. Here's how to get MLS listing photos to actually show up in Canva Bulk Create graphics.
A new listing hits your MLS at 9am and you want the Just Listed graphic live by lunch. You pull the listing export, grab the photo field, drop it into your Canva Bulk Create spreadsheet, and generate. Every card comes back with a blank image box, or worse, a raw MLS media URL printed across the photo where the house should be.
This isn't a template problem. It's not a Canva bug, either. It's what happens every time you feed Canva Bulk Create a column of image links instead of actual images, and MLS exports are almost always links.
If you're only running one or two listings a month, fixing each card by hand is annoying but doable. Once you're juggling a real pipeline, or you're on a team pushing Just Listed, Open House, and Just Sold graphics for a dozen active listings at once, the manual fix eats a whole afternoon every week.
Why Canva Bulk Create Stalls for MLS Photos Specifically
Canva Bulk Create only pulls a photo into a design when the image is physically embedded inside the spreadsheet, in a format called DrawingML. A link in a cell doesn't count, no matter how valid it is. Canva reads it as text, the same as the list price or the agent's name, and either leaves the image frame empty or prints the raw URL string into your design. We covered the full mechanics in why Canva Bulk Create ignores image URLs — the short version is that Canva needs the picture sitting inside the cell, not a pointer to where it lives online.
MLS data makes this worse than most sources because of how photos are delivered. Whether your MLS runs on the modern RESO Web API standard, an older RETS connection, or a flat FTP export, what lands in your spreadsheet is a column of links like https://media.yourmls.com/listing123/photo1.jpg, not a downloaded file. Field naming varies by platform too — Matrix, Flexmls, and Paragon each label the photo column a little differently (MediaURL, PhotoURL, MediaURL1) — so the first thing to confirm is which column actually holds the image link.
We've written the general playbook for real estate agents using Canva Bulk Create if you want the full listing-graphics workflow. This post is the narrower version: specifically getting photos out of your MLS or IDX feed and into a spreadsheet Canva can actually use.
The Manual Workaround Most Agents Try First
Two fixes come up before agents find a converter, and both fall apart past a handful of listings.
Insert > Pictures in Excel. Download each photo from the listing detail page, save it locally, then place it into the spreadsheet cell by cell with Insert > Pictures. Fine for one listing's hero shot. For ten active listings across three graphic types, it's an hour of downloading, resizing, and re-aligning images that tend to float above the cell instead of sitting inside it — which breaks Canva's row matching anyway.
The =IMAGE() formula in Google Sheets. Paste =IMAGE("https://media.yourmls.com/...") and the photo appears to sit in the cell. It isn't actually embedded, it's a live formula rendering a preview. Export to XLSX or CSV and Canva sees a broken formula or flattened text, never a picture. We wrote the full breakdown in our =IMAGE() post.
Both work for a single listing. Neither survives a week where three new listings, two price reductions, and a closing all need graphics on the same day.
What You Need Before You Start
- A Canva template per graphic type (Just Listed, Open House, Price Reduced, Just Sold) with placeholders like
{{address}},{{price}},{{beds}},{{baths}}, and an image frame for the listing photo - Your MLS export or IDX feed access, so you can pull the photo URL field alongside your listing data
- A quick check of your local MLS's photo redistribution rules — more on this below, since it's the one part of this workflow that's genuinely worth double-checking before you publish anything
Step 1: Get Your MLS Photo URLs Into a Spreadsheet
From your MLS export. Most MLS platforms let you run a search filtered to your active listings, select all, and export as CSV. Look for ListPrice, BedsTotal, BathsTotal, FullAddress, and a media field — MediaURL, PhotoURL, or MediaURL1 depending on your system. That's your image column.
From an IDX feed or CRM. If your listings flow through an IDX plugin or a CRM like Follow Up Boss or LionDesk, check its export options. Most support CSV export with custom field selection — include the photo URL field alongside your listing data.
Manual, for a small pipeline. For five or ten active listings, it's often faster to keep a running sheet and copy the main photo URL straight from the listing detail page (right-click the photo, Copy Image Address). Not efficient at scale, but fine if your whole pipeline fits on one screen.
Here's what the sheet should look like before conversion — image_url still holding plain text links:
| address | price | beds | baths | image_url |
| 412 Maple St | $489,000 | 3 | 2 | https://media.yourmls.com/l1/photo1.jpg |
| 88 Ridgeview Dr | $612,500 | 4 | 3 | https://media.yourmls.com/l2/photo1.jpg |
| 215 Harbor Ln | $355,000 | 2 | 1 | https://media.yourmls.com/l3/photo1.jpg |
Step 2: A Quick Word on MLS Photo Rights
MLS photos are typically copyrighted by the listing brokerage or the photographer, not free for any agent to reuse however they like. Most boards allow the listing agent to use their own active listing photos for marketing, but rules on how long that lasts after a listing expires and whether teammates can reuse them vary by MLS. Check your local rules of cooperation or ask your broker before batch-publishing — five minutes now beats a takedown request later.
Step 3: Convert the URLs Into Embedded Images
This is the step that actually fixes the Canva problem. Postprep takes your spreadsheet, fetches the image behind every URL in the column you pick, and returns an XLSX with each photo embedded directly in its cell.
- Go to postprep.app
- Upload your MLS export (CSV or XLSX)
- Select image_url (or whatever your MLS named the field —
MediaURL,PhotoURL) as the column to convert - Download the finished XLSX
No account needed for the first 100 rows, which covers most agents' entire active pipeline in one pass.
A note on MLS photo URLs that time out. Some MLS systems serve photos through session-authenticated or time-limited links that only work while you're logged into the MLS portal. If Postprep flags a URL it can't fetch, the link likely expired or requires authentication — download that photo manually and host it somewhere stable (your website, Google Drive, Dropbox) before running the sheet again.
Step 4: Build or Reuse Your Canva Template
If you already have listing templates, open the one you need. If not:
- Start a new design at your target size — Instagram post, Story, or a printable flyer
- Add text boxes for your variable fields and type
{{address}},{{price}},{{beds}},{{baths}} - Drop in an image frame for the listing photo
- Repeat for each graphic type: Just Listed, Open House, Price Reduced, Just Sold
Field names in {{double braces}} need to match your spreadsheet's column headers exactly, capitalization included.
Step 5: Run Bulk Create
- With your template open, click Apps → Bulk Create in Canva's side panel
- Upload the XLSX Postprep gave you
- Connect each spreadsheet column to its design element, or use Auto-connect if your names line up
- Click Generate designs
Canva outputs one finished graphic per listing row. Download the batch and you've got a full set of on-brand, on-time listing graphics ready to schedule.
A Repeatable Workflow for MLS-Based Agents
New listing day. The moment a listing goes active in your MLS, add the row to your master sheet, run it through Postprep, and generate the Just Listed batch. Same-day posting instead of a weekend backlog.
Weekly status sweep. Once a week, pull anything that changed status — price reductions, new open houses, closings — and regenerate just those rows across the relevant templates.
Team and brokerage rollups. If multiple agents share an MLS feed, one shared spreadsheet with an agent_name column lets a marketing coordinator batch-generate graphics for the whole team's active listings in one pass, instead of chasing down photos agent by agent.
Rentals and property management. Same workflow, same MLS-style photo URL problem, just a different template set. The fix doesn't change.
Frequently Asked Questions
Does this work with Matrix, Flexmls, and Paragon exports?
Yes. The column name for the photo field differs by platform (MediaURL, PhotoURL, MediaURL1), but the underlying problem and fix are identical across all three. Find your photo field, point Postprep at it.
Am I allowed to use MLS photos in social graphics?
Generally yes for your own active listings, but the specifics (how long after expiration, whether teammates can reuse them, attribution requirements) depend on your local MLS's rules. This is genuinely worth confirming with your board or broker rather than assuming — it varies enough that we can't give a blanket answer here.
What if the photo URL is broken or requires login?
Postprep flags any URL it can't fetch. That usually means the link is session-authenticated or expired. Download the photo directly and host it somewhere stable, then rerun the sheet with that URL instead.
Can I run different photos for different graphic types from the same listing?
Yes. Add multiple image columns — hero_photo, kitchen_photo, exterior_photo — and connect different columns to different Canva templates. Postprep embeds all of them in one pass.
How is this different from the general real estate Canva Bulk Create post?
The general real estate workflow covers the whole process end to end. This post is specifically about getting photo URLs out of an MLS or IDX feed cleanly, since that's the step where most agents get stuck first.
The Short Version
MLS exports hand you real, working photo links, and Canva Bulk Create still can't use them, because Bulk Create only reads images that are physically embedded in the spreadsheet, not linked to it. Pull your listing data and photo URLs from your MLS, IDX feed, or CRM, run the sheet through Postprep to get the images properly embedded, then upload that file to Canva Bulk Create.
Export from your MLS, convert with Postprep, generate in Canva. New listing to finished graphics before lunch.
Try it free at postprep.app — 100 rows, no account required.