How Animal Shelters Can Use Canva Bulk Create for Adoptable Pet Posts, Foster Cards, and Adoption Updates
Canva Bulk Create for animal shelters: turn your adoptable pet export into a batch of photo graphics without dragging in every image one at a time.

It is Sunday night. You have 38 animals available, 11 new intakes from the weekend, four dogs whose foster placement ends Friday, and a volunteer who can give you two hours. Every animal needs a post with a photo, name, breed, age, sex, one line of personality, and the adoption link. Canva Bulk Create for animal shelters should make this a five-minute job, and for most shelters it does not.
So somebody opens Canva, duplicates the adoptable-pet template, drags in a photo, retypes the name, retypes the breed, retypes the age, and does it again. Thirty-eight times. That eats the two hours before anything gets scheduled.
The frustrating part is that your data already exists in the shape Canva wants. Your shelter software already pushes a pets file with photo URLs to Petfinder and Adopt-a-Pet. Canva should be able to read it. It cannot, and this post covers why, plus the one step that fixes it.
Why Canva Bulk Create Stalls for Animal Shelters
Bulk Create is built for exactly this job. One template, one row per animal, one finished design per row. The text side works perfectly. Drop in columns for name, breed, age, sex, weight, adoption fee, kennel number, and "good with kids" and Canva merges every one of them without complaint.
The photo column is where it dies. Canva Bulk Create only reads images that are physically embedded inside the XLSX file as binary data, in a format called DrawingML. A photo URL is just a string of text as far as Canva is concerned. It either prints https://dl5zpyw5k3jeb.cloudfront.net/photos/pets/... across your design in 8pt type or leaves the frame empty.
Canva says this plainly in its own Bulk Create documentation: image URLs from cloud photo storage are not supported and will be treated as plain text. We covered the full technical reason in Why Canva Bulk Create Ignores Image URLs.
For a shelter this is the difference between a two-hour Sunday and a five-minute one. Your pet data is already a spreadsheet with a photo column. The only thing standing between that file and 38 finished graphics is the embedding step.
The Manual Workaround Most Shelters Try First
The usual first attempt is Excel. Open the export, click each photo cell, use Insert > Picture > Place in Cell, browse to the downloaded photo, repeat. This works, technically. It also assumes every photo is already on the laptop, named to match the right animal, and in the right order. In a shelter, where the intake photos were taken on three different phones by three different volunteers, that assumption falls apart immediately. We wrote about that manual grind in How to Bulk Embed Images in Excel From URLs.
The second attempt is usually the =IMAGE() formula in Google Sheets. It looks like it works, because the photos appear in the cells. Export the sheet and the images are gone. =IMAGE() is a live cell reference, not embedded image data, so Canva reads nothing. Full explanation in Why =IMAGE() Doesn't Work for Canva Bulk Create.
Worth saying plainly: not every shelter graphic needs a photo column. Volunteer shift calls, donation appeals, low-cost clinic announcements, and "our lobby is closed Monday" posts are text-only and Bulk Create handles them today with no extra step. The workflow below is for the per-animal graphics, which is where the volume actually is.
What You Need Before You Start
A Canva template per graphic type. Most shelters cycle through a small set. An adoptable-pet card with photo, name, breed, age, and sex. An urgent or foster-needed card with a deadline. An "Adopted!" celebration graphic. A pet-of-the-week feature. A litter or bonded-pair card. Each template needs Bulk Create placeholders for the text fields and an image frame for the photo. Canva requires the image placeholder to be a frame or grid from the Elements tab, not a pasted image, or Bulk Create will not offer it as a connection target.
One spreadsheet with a photo URL column. One row per output graphic. This is the part shelters usually already have.
Step 1: Get Your Pet Data Out With Photo URLs
Your shelter management software is almost certainly already producing this file, because that is how your animals get onto the adoption aggregators in the first place.
RescueGroups.org. Its animal import and export format supports named photo fields (photo1 through photo4) alongside name, type, priBreed, secBreed, sex, age, size, color, and a description field. Those photo fields hold URLs. Export your adoptable animals to CSV and you have the sheet.
Shelterluv. The AnimalInventory export is the standard CSV and covers status, breed, age, and intake data. Photos are a known gap in Shelterluv's standard exports, so you may need to request them or pull the image URLs from the feed it sends to the aggregators. Ask their support what your account includes before you plan around it.
Adopt-a-Pet AutoUpload. Shelters using AutoUpload push a pets.csv to Adopt-a-Pet by FTP, and most shelter software transfers photos as URLs rather than files. If your software builds that file, it can usually hand you a copy.
Petfinder. Photos sit on Petfinder's CDN in the form https://dl5zpyw5k3jeb.cloudfront.net/photos/pets/PET_ID/1/?bust=NNNNN. The Petfinder API returns these as primary_photo_cropped in small, medium, large, and full sizes. The API path needs a developer key and OAuth, which is more than most shelters want to take on. Note also that these URLs carry a ?bust= cache parameter, so test a couple before you build a whole batch on them.
No software at all. Plenty of small rescues run on a Google Sheet and a phone. Upload the photos anywhere that gives a direct link ending in .jpg or .png, paste the links into a column, and you are in the same position as a shelter with a full software stack.
Step 2: Build the Sheet
One row per animal, one column per field, photo URLs in their own column.
| name | species | breed | age | sex | note | photo_url |
| Biscuit | Dog | Beagle mix | 3 yrs | Male | Loves car rides, no cats | https://cdn.shelter.org/pets/biscuit.jpg |
| Olive | Cat | Domestic shorthair | 8 mos | Female | Bonded with Pickle | https://cdn.shelter.org/pets/olive.jpg |
| Rufus | Dog | Pit mix | 5 yrs | Male | Adult-only home, house trained | https://cdn.shelter.org/pets/rufus.jpg |
Trim the export down before you upload. Shelter exports carry microchip numbers, intake dates, medical flags, and internal IDs that nobody needs on a social graphic. Delete those columns so the Bulk Create panel stays readable.
Bulk Create accepts up to 300 rows and 150 columns in one selection, which is more than enough for a full kennel roster. If you are working through a backlog larger than that, see Canva Bulk Create Row Limit.
Step 3: Convert the Sheet With Postprep
Go to postprep.app, upload the CSV, and pick the column holding your photo URLs. Postprep fetches each photo and embeds it inside the XLSX as DrawingML, the binary format Canva actually reads. Every other column passes through untouched.
A 40-animal roster takes seconds. The free tier covers 100 rows with no account required, which covers most shelters' entire adoptable population in one pass.
Step 4: Bulk Generate in Canva
Open your adoptable-pet template. Bulk Create sits under Apps in the left panel, and it runs on desktop only. It is available on Canva Pro, Teams, Business, Enterprise, Education, and Nonprofits plans. If you are a registered nonprofit, Canva's nonprofit program is worth checking before you pay for Pro, since it may cover you at no cost. Details on plan eligibility are in Does Canva Bulk Create Require a Pro Plan?
Click Upload data, choose your converted XLSX, then drag each column onto its matching placeholder. Hit Generate designs. Canva returns one finished card per animal, photo already in the frame.
Then run the same XLSX through your other templates. Same file, one pass each, and you have adoptable cards, Instagram Stories, and printable kennel cards from a single export.
A Realistic Weekly Shelter Workflow
Monday. Export the current adoptable list from your shelter software. Delete the internal columns. Run it through Postprep once.
Monday, ten minutes later. Take the converted XLSX into three templates: the square adoptable card, the vertical Story card, and the printable kennel sign. Generate all three batches. Download as ZIP.
Tuesday through Sunday. Schedule the cards across the week rather than dumping 38 posts at once. Pull urgent and long-stay animals forward.
As adoptions happen. Keep a separate "Adopted" tab with the same photo URLs and run it through the celebration template whenever an animal goes home. The photo is already in your sheet, so it costs nothing.
The whole cycle is one export, one conversion, and three generate clicks, whether you have 20 animals or 200. If you also schedule these out to social, How to Bulk Upload Instagram Posts From Google Sheets covers the next step.
Frequently Asked Questions
Our photos are on our own website. Does that work?
Yes, as long as the URL points directly at the image file and the page is publicly reachable. Right-click the photo, copy image address, and check that the link ends in .jpg, .png, or .webp rather than opening a gallery page.
Can I put three photos of the same animal on one card?
Yes. Use three columns (photo_1, photo_2, photo_3) and three frames in the template. Postprep embeds each column, and you connect each one to its own frame in Bulk Create.
What about bonded pairs and litters?
One row per output graphic, not per animal. A bonded pair that gets one card is one row, with both names in the name field and one photo of the two together. A litter of six kittens with one card each is six rows.
Some animals have no photo yet.
Leave the cell blank. Postprep skips empty cells and Canva leaves the frame as-is, so you get a placeholder card you can fill in later rather than a broken batch.
Will the photos be sharp enough to print kennel cards?
That depends on your source photos, not on the conversion. Postprep embeds whatever the URL returns at its original resolution. Aggregator-hosted photos are often resized for web, so if you are printing, pull from your original camera or phone files instead.
Does this work for foster-recruitment and volunteer graphics too?
For anything with a per-person or per-animal photo, yes, same workflow. For generic text-only appeals you do not need the conversion step at all, since Bulk Create already handles text.
The Short Version
Your shelter already produces a spreadsheet of adoptable animals with photo URLs in it, because that is how the aggregators get your listings. Canva Bulk Create can merge every text field in that file and ignores the photo column completely.
Postprep is the step in between. Export, convert, generate. The Sunday-night batch goes from two hours to about ten minutes, and the volunteer gets to spend the rest of it with the animals.
Try it free at postprep.app — 100 rows, no account required.