Cloudinary for Klaviyo lets you use your Cloudinary media — including dynamic, personalized image templates — directly in Klaviyo emails. This guide covers everything: what the integration is, how to install and connect it, and how to build per-recipient personalized content.
Overview
The integration has two complementary pieces. You can use either on its own, but they work best together.
| Piece | Where it runs | What it does |
|---|---|---|
| Cloudinary for Klaviyo app | Inside the Cloudinary Digital Asset Manager (DAM) | Connects your Cloudinary cloud to Klaviyo and adds your Cloudinary images, videos, and templates to Klaviyo as Universal Content blocks that reference your Cloudinary URLs — without leaving Cloudinary. |
| Cloudinary browser extension (optional) | Inside the Klaviyo email editor (Chrome) | Adds a Cloudinary picker and the same personalization panel directly inside Klaviyo's editor, so you can personalize image and template blocks while you design the email. |
Which should I use? The DAM app works for everyone and requires no browser extension. The extension is a convenience layer for teams that want Cloudinary controls inside Klaviyo's editor itself.
Before you start
- A Cloudinary account with access to the Media Library / DAM.
- A Klaviyo account, with permission to authorize (install) third-party apps.
- Google Chrome — only if you also want the optional browser extension.
Install and connect the app
- Open the Cloudinary for Klaviyo app in your Cloudinary Media Library (direct link: urls.cloudinary.app/klaviyo).
- Install it on your cloud, then open the Setup tab.
- Click Install Klaviyo app. A popup opens (Klaviyo can't load inside the Cloudinary iframe) where you authorize the connection.
- Approve the requested permissions. When it returns, the Setup tab shows Connected.
To remember which Klaviyo block each asset maps to (so you can re-edit it later instead of creating duplicates), the app stores a small link in a structured metadata field named “Klaviyo Universal Content” (klaviyo_ucb) on your assets. The Setup tab checks whether that field exists and, if it doesn't, shows a Create metadata field button — creating it is an explicit, one-time action you approve (it adds one field to your Cloudinary product environment's schema). Until you create it, everything still works; the per-asset link just isn't stored on the Cloudinary side.
Permissions (OAuth scopes)
The app requests the following Klaviyo scopes. If you change scopes later, everyone who installed the app must reconnect (Klaviyo does not grant new permissions to existing connections).
| Scope | Why it's needed |
|---|---|
| accounts:read | Identify the connected Klaviyo account. |
| templates:read, templates:write | Create and update Universal Content blocks. |
| images:read, images:write | Upload a copy of an image into Klaviyo Images (used only when you choose the "upload a copy" option). |
| metrics:read | List the events you can personalize on (e.g. Placed Order, Added to Cart). |
| events:read | Read recent event samples to populate event fields and product images. |
(Optional) Install the browser extension
- Install the extension from urls.cloudinary.app/chrome — or, from the Setup tab, open the Cloudinary in the Klaviyo editor card and click Add to Chrome.
- After installing, open a Klaviyo campaign or flow email. Look for the Cloudinary controls on image, link, and Universal Content HTML blocks.
The Setup tab shows an "Extension active" badge once the extension is detected.
Core concepts
- Single source of truth (SSOT) — everything you send to Klaviyo becomes a Universal Content block that references your Cloudinary URL. Nothing is copied into Klaviyo, so re-rendering an asset in Cloudinary (same public ID) updates every email that uses it. (For images you can optionally upload a copy to Klaviyo Images instead — see Send assets.)
- Images & videos — regular Cloudinary assets. They become Universal Content blocks pointing at the Cloudinary delivery URL. Video embeds as an inline animated preview — Cloudinary delivers an animated WebP/GIF with automatic format selection — that links through to the full-quality video.
- Templates (CLDT) — Cloudinary dynamic templates (.cldt.json assets) that define a base image, a transformation, and one or more personalizable slots (text or image). A template becomes a personalizable Klaviyo Universal Content block.
- Universal Content block (UCB) — a reusable Klaviyo content block you can drop into any campaign or flow email.
- Slots — the parts of a template you can personalize: a text slot (e.g. a headline) and an image slot (e.g. a product photo or logo). Each slot has a default that everyone sees unless you bind it to recipient data.
Send assets to Klaviyo
By default, everything you send becomes a reusable Universal Content block that references your Cloudinary URL — no copies are uploaded, so Cloudinary remains the single source of truth.
- In Cloudinary DAM, select one or more assets and choose Send to Klaviyo (asset menu or bulk actions).
- Images become an image block pointing at the Cloudinary delivery URL.
- Videos become an image block whose image is a Cloudinary animated preview (automatic WebP/GIF) that links to the full video — so it "plays" in the inbox where the client supports animation.
- Templates become Universal Content blocks. With a single template selected you can Personalize with Cloudinary (next section) or Create with defaults.
Choosing how images are added: when your selection includes images, you can pick one of two options:
- As Universal Content blocks (recommended) — the block references your Cloudinary URL; updates in Cloudinary stay in sync everywhere.
- Upload a copy to Klaviyo Images — the image bytes are stored in Klaviyo's own image library (a separate copy that won't auto-update). Useful when you specifically want the asset in Klaviyo's image picker. Videos and templates always use Universal Content.
See what each asset became under the Links to Klaviyo tab.
Find where an asset is used (Links to Klaviyo)
Select one or more assets in DAM and open the Links to Klaviyo tab. For each asset you'll see the Universal Content block(s) created from it — the block name, a thumbnail, its type (image, video, or template), and whether it still exists in Klaviyo. This is the live link between a Cloudinary asset and Klaviyo.
Note: Klaviyo's API reports usage at the block level — not which individual campaigns or flows embed a block — so this shows the block(s) an asset powers, not every email that uses them.
Personalize a template in the Cloudinary app
This is the recommended way to build personalized blocks, and it needs no browser extension.
- Select a single template (.cldt.json) in DAM and choose Send to Klaviyo.
- Click Personalize with Cloudinary. The editor opens with a live preview, the template's fields, and the block's HTML.
- (Optional) Pick an Event (e.g. "Placed Order") to personalize with that event's data. Leave it on None to use profile data only.
- For each text field, choose what it shows: a fixed value, a profile attribute (first name, city, …), or an event field.
- For each image field, keep the template image or bind it to a product/item image from the selected event — each recipient sees their own.
- Watch the preview update with sample values. Advanced users can edit the block HTML directly.
- Click Save to Klaviyo. The app creates the Universal Content block and saves the connection on the Cloudinary template's metadata.
Re-editing: open the same template again and the app reloads your previous choices and updates the same block in Klaviyo instead of creating a duplicate.
Personalize inside the Klaviyo editor (extension)
With the extension installed, the same "Personalize with Cloudinary" panel appears inside Klaviyo's Universal Content HTML editor when a Cloudinary template block is present. Bind fields to Klaviyo data exactly as above; the panel writes the personalization into the block and shows a live preview (Klaviyo doesn't render merge data in its own editor preview, so the panel renders the sample itself).
Use the block in a campaign or flow
- In Klaviyo, edit a campaign or flow email and add your Universal Content block.
- For event-based personalization, make sure the email is in a flow triggered by the matching event.
- Use Klaviyo's preview with a profile / event, or send a test, to confirm each recipient's text and images resolve correctly.
How personalization works
- Every template renders with its defaults, so the block always shows something — even to recipients with no matching data.
- When you bind a field, Klaviyo fills it per recipient at send time using profile or event data, falling back to the default when data is missing.
- Image personalization can be fully per-recipient: product images from your own Cloudinary library stay dynamic, and other images are fetched per recipient. The on-screen preview uses sample values because real data is only available when the email is sent.
Troubleshooting
| Symptom | What to do |
|---|---|
| "Installed with limited scopes" banner | Reconnect from the Setup tab so Klaviyo grants the current permissions (including metrics:read and events:read). |
| No event fields / images available for an event | Some custom metrics can't be queried for sample data. Profile fields still work; try a standard event (e.g. Placed Order), or bind images from your Cloudinary library. |
| Preview image looks broken in Klaviyo's own editor | Klaviyo doesn't evaluate personalization in its editor preview. Use the Cloudinary panel's preview, or send a test from a campaign/flow. |
| Extension not detected | Confirm it's installed and enabled in Chrome, reload the Klaviyo editor tab, and check the Setup tab for the "Extension active" badge. |
| "Couldn't send a DAM session" | Reopen the app from the Cloudinary DAM (asset menu, bulk actions, or settings) so it receives a fresh session. |
FAQ
Do I need the browser extension? No. The Cloudinary app does everything inside the DAM. The extension is an optional convenience for working inside Klaviyo's editor.
Does sending an asset duplicate it in Klaviyo? By default, no — blocks reference your Cloudinary URL and the bytes are always served from Cloudinary, so re-rendering the asset in Cloudinary (same public ID) updates every email. If you choose Upload a copy to Klaviyo Images for an image, Klaviyo stores its own copy, which won't auto-update.
Can I use video? Yes. Send a video and it becomes a block with an animated preview (automatic WebP/GIF) that links to the full video. Email clients that don't animate will show the first frame, and the link still works.
Where is the template-to-Klaviyo connection stored? On the Cloudinary asset's structured metadata (the klaviyo_ucb field), and mirrored in the app, so re-editing updates the same block.
Will recipients without data see a broken email? No — every field falls back to the template's default.
Can one template power many emails? Yes. A Universal Content block is reusable across campaigns and flows.
Support
Need help? Contact support@cloudinary.com.
Comments
0 comments
Article is closed for comments.