How to use Draftship with Klaviyo
Klaviyo's HTML editor accepts pasted Draftship exports cleanly, but the personalization layer uses Django templating, dynamic blocks lock content, and product feeds want their own block type. Here's the path that keeps render fidelity.
Klaviyo dominates ecommerce email because it ties tightly to product events: Shopify checkout abandoned, viewed product, started checkout, all of it. The flip side: their email editor mixes drag-drop blocks with raw HTML, and the drag-drop blocks lock the surrounding HTML when used. If you want your Draftship export to survive intact, use a blank HTML template and add Klaviyo's dynamic features through Django syntax in the body.
Where Klaviyo accepts pasted HTML
Klaviyo offers two template types: drag-drop and HTML. Pick HTML. From your dashboard, go to Email Templates → Create Template → HTML. The full code editor opens. Paste your Draftship export.
Django template syntax
Klaviyo uses Django's template language, not Liquid. The two look similar but the filter syntax differs. Defaults use a colon-quote pattern.
| Draftship | Klaviyo |
|---|---|
{{ first_name }} | {{ first_name|default:'there' }} |
{{ last_name }} | {{ last_name|default:'' }} |
{{ email }} | {{ email }} |
{{ company }} | {{ properties.company|default:'' }} |
| Unsubscribe link | {% web_view_link %} and {% unsubscribe_link %} |
| Profile attribute | {{ person.first_name }} (in flows) |
For event-driven flows (cart abandon, browse abandon), the event payload is in scope. To reference an item:
liquid{% for item in event.extra.line_items %} <p>{{ item.product_name }}: ${{ item.price }}</p> {% endfor %}
This is Django syntax, even though it visually resembles Liquid. {% for %}, {% if %}, {% endif %} are all supported.
Dynamic content blocks (and why to avoid them in your HTML)
Klaviyo's drag-drop has a "Dynamic Content" block type that swaps content based on profile properties. They render as opaque components in the HTML editor. If you've pasted a clean Draftship export and add a dynamic block, Klaviyo wraps it in their own divs and rewrites the surrounding cells. This is the behavior to avoid.
The Django-native way is to write the conditional yourself in your pasted HTML:
liquid{% if person.tier == 'gold' %} <p>You're a gold member. Here's your perk.</p> {% else %} <p>Welcome to our list.</p> {% endif %}
This survives every save and stays in your control.
Image hosting
Klaviyo offers an image library at Content → Images. Upload there for permanent hosting on Klaviyo's CDN. External URLs work but aren't auto-mirrored. For ecommerce stores syncing product images from Shopify, Klaviyo can reference Shopify CDN URLs directly without a re-upload.
Klaviyo's link tracking and UTM behavior
Klaviyo wraps links at send time for click tracking. It preserves your existing UTM parameters. Two things to know:
- Tracking can be disabled per link by adding
?_kx=disableto the URL. Useful for unsubscribe and preference center links you don't want clicked-through metrics on. - Klaviyo's UTM defaults are configurable per account. If you've baked UTMs into your Draftship hrefs, disable Klaviyo's auto-UTM under Account Settings → UTM Tracking to avoid duplication.
Test send checklist
- Use Send Preview with a real profile from your test list.
- Confirm Django conditionals resolved, not the raw
{% if %}blocks. - Open the rendered HTML in Klaviyo's preview source, copy it, and run through the size checker.
- For Flow emails, trigger the flow with a test event before going live.
When to use Klaviyo's drag-drop instead
If your team has marketers building emails weekly without engineering support, the drag-drop is the right tool, and the lock-in tradeoff is acceptable. For high-stakes one-off campaigns, the HTML template path with Draftship gives you more control.
For UTM hygiene across ESPs, see UTM parameters for email marketers.