Webflow + Image API: Generate Dynamic CMS Images Automatically
Webflow's CMS is powerful. You can store thousands of blog posts, products, or portfolio items. But every item needs images. Featured images, social previews, product cards.
Creating those manually defeats the purpose of a dynamic CMS. If you're uploading custom images for each item, you've just added hours of work to every content update.
Here's how to automate it. Connect an image API to your Webflow CMS, and images generate themselves whenever you add or update content.
Why automate webflow imagesWhy Automate Webflow Images?
The math is simple. Say you publish 10 blog posts per month. Each needs:
- A featured image (blog listing)
- An OG image (social sharing)
- Maybe a Pinterest image (different dimensions)
That's 30 images per month. At 10 minutes each in Canva, you're burning 5 hours monthly on repetitive design work.
With automation? Zero hours. The images create themselves from your CMS data.
What you can automate:
| CMS Collection | Generated Images |
|---|---|
| Blog posts | Featured images, OG images |
| Products | Product cards, social graphics |
| Team members | Profile cards, speaker slides |
| Events | Announcement graphics |
| Testimonials | Quote cards |
Same pattern every time: CMS data becomes visual content.
The architectureThe Architecture
Webflow doesn't have built-in automation, so we need a bridge. The typical setup:
Webflow CMS → Zapier/Make.com → Image API → Storage → Back to Webflow
Here's what each piece does:
- Webflow CMS - Stores your content and triggers updates
- Zapier/Make.com - Listens for changes, orchestrates the flow
- Imejis.io - Generates images from templates
- Storage (optional) - Cloudinary, S3, or direct Webflow upload
- Webflow CMS - Receives the generated image URL
Let's build this step by step.
Method 1 zapier integration easiestMethod 1: Zapier Integration (Easiest)
This is the quickest path for most Webflow users.
Step 1 prepare your webflow cmsStep 1: Prepare Your Webflow CMS
Your collection needs fields for the data that goes into images, plus a field for the generated image URL:
| Field Name | Type | Purpose |
|---|---|---|
| Title | Plain Text | Goes into image headline |
| Category | Option | Optional: different templates per category |
| Featured Image | Image | Generated image goes here |
| OG Image URL | Plain Text | For meta tags |
Add the "OG Image URL" field as plain text because Zapier will write a URL here, not upload a file directly.
Step 2 create the zapStep 2: Create the Zap
Trigger: Webflow - New CMS Item
Configure:
- Select your Webflow site
- Select the collection (e.g., "Blog Posts")
Action: HTTP Request (Webhooks by Zapier)
Configure:
- Method: POST
- URL:
https://render.imejis.io/v1/YOUR_TEMPLATE_ID - Headers:
Authorization:Bearer YOUR_API_KEYContent-Type:application/json
- Data: Raw
- Body:
{
"headline": "{{title}}",
"category": "{{category}}"
}The API returns the image directly as binary data.
Action: Upload to Cloudinary (or your storage)
Since Imejis.io returns the image binary, upload it to a CDN:
- Connect your Cloudinary account
- Set file input to the response from previous step
- Note the returned URL
Action: Webflow - Update CMS Item
Configure:
- Select your site and collection
- Item ID from trigger
- Set "OG Image URL" to the Cloudinary URL
Now every new blog post gets its OG image automatically.
Step 3 handle updatesStep 3: Handle Updates
Create a second Zap for "Updated CMS Item" if you want images to regenerate when content changes. Same flow, just different trigger.
Method 2 makecom with advanced logicMethod 2: Make.com with Advanced Logic
Make.com lets you add conditional logic, like using different templates for different categories.
The scenarioThe Scenario
[Webflow Trigger] → [Router] → [Category = News] → [News Template]
└→ [Category = Tutorial] → [Tutorial Template]
└→ [Default] → [Standard Template]
→ [Upload] → [Update Webflow]
Setting up the routerSetting Up the Router
- Add a Webflow "Watch Events" module
- Add a Router module
- Create filters for each category
- Each branch calls a different Imejis.io template
- Merge results and upload to storage
- Update Webflow with the image URL
This way, tutorials get a code-focused design while news posts get a headline-focused one. Same automation, different outputs.
Method 3 custom code most controlMethod 3: Custom Code (Most Control)
For developers who want direct control, use Webflow's API with a serverless function.
The webhook approachThe Webhook Approach
- Set up a webhook in Webflow (Settings > Integrations > Webhooks)
- Trigger: "Collection Item Created" and "Collection Item Updated"
- Point to your serverless function
Serverless function vercelnetlifyServerless Function (Vercel/Netlify)
// api/generate-webflow-image.js
import { WebflowClient } from "webflow-api"
const webflow = new WebflowClient({
accessToken: process.env.WEBFLOW_API_KEY,
})
export default async function handler(req, res) {
const { payload } = req.body
const { _id, title, category, slug } = payload
// Generate image from template
const imageResponse = await fetch(
`https://render.imejis.io/v1/${process.env.IMEJIS_TEMPLATE_ID}`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.IMEJIS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
headline: title,
category: category,
}),
}
)
// Image returns directly - upload to Cloudinary
const imageBuffer = await imageResponse.arrayBuffer()
const cloudinaryResponse = await fetch(
`https://api.cloudinary.com/v1_1/${process.env.CLOUDINARY_CLOUD}/image/upload`,
{
method: "POST",
body: createFormData(imageBuffer, `blog-${slug}.png`),
}
)
const { secure_url } = await cloudinaryResponse.json()
// Update Webflow CMS item
await webflow.collections.items.updateItem(
process.env.WEBFLOW_COLLECTION_ID,
_id,
{
fields: {
"og-image-url": secure_url,
},
}
)
res.status(200).json({ success: true, imageUrl: secure_url })
}Benefits of custom codeBenefits of Custom Code
- No monthly Zapier/Make.com fees
- Faster execution (no automation platform overhead)
- Full control over error handling
- Can batch process existing items
Template design for webflowTemplate Design for Webflow
Your image templates should match your site's design system.
Blog featured imagesBlog Featured Images
| Element | Source |
|---|---|
| Headline | CMS Title field |
| Category badge | CMS Category field |
| Background | Static or CMS color field |
| Logo | Static |
Keep it simple. The headline is the star.
Product cardsProduct Cards
| Element | Source |
|---|---|
| Product name | CMS Name field |
| Price | CMS Price field |
| Product image | CMS Image field URL |
| Badge | Conditional (Sale, New, etc.) |
Pull the product image URL from your CMS to composite onto the template.
Social og imagesSocial OG Images
| Element | Specification |
|---|---|
| Dimensions | 1200 x 630px |
| Safe zone | 100px margins |
| Text limit | 60 characters for headlines |
Design for Twitter and Facebook's preview cards. These dimensions work everywhere.
Connecting og images to webflowConnecting OG Images to Webflow
Once you have the image URL, connect it to your site's meta tags.
In webflows page settingsIn Webflow's Page Settings
For individual CMS pages, you can't dynamically set OG images in the built-in settings. Instead:
- Add a custom code embed in your CMS template page's
<head> - Reference your OG Image URL field:
<meta
property="og:image"
content='{{wf {"path":"og-image-url","type":"PlainText"} }}'
/>This pulls the generated image URL into your OG meta tag for each item.
Testing og imagesTesting OG Images
After publishing, test with:
These tools show exactly what your shared links will look like.
Bulk processing existing contentBulk Processing Existing Content
Already have 100 blog posts without generated images? Process them in batch.
Using webflows apiUsing Webflow's API
const processExistingPosts = async () => {
// Get all items from collection
const items = await webflow.collections.items.listItems(COLLECTION_ID, {
limit: 100,
})
for (const item of items.items) {
// Skip if already has OG image
if (item.fieldData["og-image-url"]) continue
// Generate image
const imageResponse = await fetch(/* ... */)
// Upload and update
// ... same as webhook handler
// Rate limit: wait between requests
await new Promise((r) => setTimeout(r, 1000))
}
}Run this once to backfill, then let the webhook handle new items.
Cost analysisCost Analysis
Running automated Webflow images:
| Component | Monthly Cost |
|---|---|
| Zapier Starter | $29.99 |
| Imejis.io Basic | $14.99 |
| Cloudinary Free | $0 |
| Total | ~$45/month |
For custom code approach:
| Component | Monthly Cost |
|---|---|
| Vercel Free Tier | $0 |
| Imejis.io Basic | $14.99 |
| Cloudinary Free | $0 |
| Total | ~$15/month |
Compare to hiring a designer or spending your own time. At 10 posts/month, you're paying $1.50-4.50 per image versus $20+ of your time.
Check Imejis.io pricing for volume options.
Troubleshooting common issuesTroubleshooting Common Issues
Images not appearing in webflowImages Not Appearing in Webflow
Check:
- Is the URL field updating correctly?
- Is the URL accessible (not blocked)?
- Did you publish changes after the update?
Fix: Webflow requires publishing for CMS changes to appear on the live site.
Og images not showing on socialOG Images Not Showing on Social
Check:
- Is the meta tag correctly outputting the URL?
- Is the image publicly accessible?
- Have you cleared the platform's cache?
Fix: Use the debugging tools mentioned above to force a cache refresh.
Webhook not firingWebhook Not Firing
Check:
- Is the webhook enabled in Webflow settings?
- Is your endpoint accessible (not localhost)?
- Are there errors in your function logs?
Fix: Test with a simple endpoint first (like webhook.site) to confirm Webflow is sending data.
Getting startedGetting Started
Here's your path:
- Add fields to your CMS for the generated image URL
- Create a template in Imejis.io matching your design
- Set up Zapier or Make.com to connect the pieces
- Test with one CMS item before processing everything
- Add the OG meta tag to your CMS template
- Process existing content with a batch script
Start with one collection (blog posts are usually easiest). Get that working perfectly, then expand to products, team members, or other content types.
Your Webflow site already has great content. Now give it great images to match, without the manual work.
Start generating images free with Imejis.io
FaqFAQ
Can i upload generated images directly to webflows asset managerCan I upload generated images directly to Webflow's asset manager?
Not directly through Zapier. Webflow's API has limited image upload support. The workaround is storing images on Cloudinary or S3 and using the URL in a text field, which works just as well for display purposes.
Will this slow down my webflow siteWill this slow down my Webflow site?
No. The images are generated once and stored. Your site loads them like any other image. There's no runtime generation happening on page load.
How do i handle different image sizes for different templatesHow do I handle different image sizes for different templates?
Create multiple templates in Imejis.io (square for Instagram, landscape for Twitter, etc.). In your automation, either generate all sizes or use a Router to pick the right template based on the destination.
What happens if the image generation failsWhat happens if the image generation fails?
Your automation should include error handling. In Zapier, enable error notifications. In custom code, log failures and send alerts. Don't leave broken images unnoticed.
Can i regenerate images when i update cms contentCan I regenerate images when I update CMS content?
Yes. Set up a separate automation triggered by "CMS Item Updated" in addition to "CMS Item Created." This way, changing a headline regenerates the image with the new text.

