You want the latest Instagram posts in a welcome series or a weekly brand email. The “easy” path is usually a Zap: new Instagram post → somehow → Mailchimp / Klaviyo. It works until the task meter spikes, the Zap breaks on a Meta permission change, or someone asks why the images in last month’s send are blank.
There is a quieter option most email tools already support: a feed URL. Paste it into a native RSS block (Mailchimp) or a web feed (Klaviyo). No Zap. No Make scenario. No third widget whose free tier pauses when a campaign goes semi-viral.
We built Feedframer for that path — among others. This is the email-shaped write-up: how it works, what it costs next to Zapier, and the trade-offs we will not paper over.
The usual stack (and why it feels expensive)
Three common ways people get Instagram into email:
| Approach | What you pay for | What goes wrong |
|---|---|---|
| Zapier / Make | Tasks / operations every time a post fires and an email tool is touched | Metered cost scales with activity; OAuth reconnects; image URLs go stale; multi-step Zaps are another thing to babysit |
| View-capped Instagram widgets | A widget UI, then views | Fine for a site embed; awkward in email; free tiers often pause the account when views run out |
| DIY Graph API → your own RSS | Engineering time | Token refresh every ~60 days, media CDN copies, a host for the feed — same on-call as any Instagram integration |
Zapier is not evil. It is a tax on a problem that email platforms already solved for blogs: “give us a feed URL and we will pull it.” Instagram just does not publish a public RSS feed for your account. Someone has to turn posts into a feed (or JSON) that Mailchimp and Klaviyo can read.
That someone can be you, or a small hosted API.
What “native” actually means here
Mailchimp has RSS-to-email automations. You paste an RSS URL, pick daily / weekly / monthly, and Mailchimp only sends when there is something new. Merge tags like *|RSSITEM:CONTENT|* render the post body.
Klaviyo has web feeds. You register a URL once under Settings → Other → Web feeds, then loop over it in any campaign or flow template. Klaviyo prefers JSON over XML for this; more on that below.
Neither tool needs Zapier for “pull latest posts into this email.” They need a stable HTTPS URL that returns posts in a format they understand.
Feedframer’s job: connect a Business or Creator Instagram account once, refresh the token on our side, copy media to our CDN, and expose:
- RSS:
https://feedframer.com/api/v1/rss?api_key=YOUR_API_KEY - JSON:
https://feedframer.com/api/v1/me?api_key=YOUR_API_KEY
Same key. Same posts. Pick the format the email tool wants.
Honest prerequisites:
- Personal Instagram accounts lost API access when Basic Display shut down (December 2024). Business or Creator only.
- Free plan: 6 posts per account in the feed, unlimited API calls, JSON / GraphQL / RSS, no card required.
- Premium: $6/month or $60/year — more posts (up to 100), hourly Instagram checks instead of daily, responsive image sizes.
We cap posts, not views. A big send does not pause the feed.
Mailchimp: RSS automation in four steps
- In Feedframer, open RSS Feed, pick the account, copy the URL (it includes the API key — treat it like a password).
- In Mailchimp: Automations → flow templates → Share blog updates via RSS.
- Paste the Feedframer URL, choose how often to send, optionally tick “Resize RSS feed images.”
- In the email body, use something like:
*|RSSITEMS:|*
<div style="margin: 0 0 32px 0;">
*|RSSITEM:CONTENT|*
<p style="color: #666666; font-size: 12px;">Posted *|RSSITEM:DATE:F j, Y|*</p>
</div>
*|END:RSSITEMS|*
Use *|RSSITEM:CONTENT|* for the image. Avoid *|RSSITEM:IMAGE|* — for many video posts that points at an MP4, and email clients will not show it as a picture. Feedframer’s content already includes a sensible still for videos.
Mailchimp only fires when the feed has posts it has not sent yet. First send looks back 24 hours / 7 days / 30 days depending on cadence; later sends take everything new since the previous one. Posts need to be in the feed at least a few hours before the send (Mailchimp’s rule, not ours).
Free-plan gotcha: we check Instagram daily on Free. If you post and Mailchimp runs before our next check, that post is not in the feed yet. Weekly or monthly automations are more forgiving than daily ones. Premium checks hourly; you can also hit Refresh Posts on the dashboard after publishing.
Klaviyo: web feed (prefer JSON, not RSS)
Klaviyo can ingest XML, but their own docs push JSON — and for Instagram that advice is right. In our RSS feed, a video’s enclosure is often an MP4. In JSON you get thumbnailUrl for a still and mediaType so you can label videos. Layout control is better too: separate caption, permalink, and image fields instead of one HTML blob.
- Settings → Other → Web feeds → Add Web Feed.
- Name it something without spaces, e.g.
Instagram. - URL:
https://feedframer.com/api/v1/me?api_key=YOUR_API_KEY - Method
GET, content typeJSON.
Then in an HTML block inside a campaign or flow email:
<table role="presentation" width="100%" cellpadding="0" cellspacing="0">
{% for item in feeds.Instagram.posts|slice:":3" %}
<tr>
<td style="padding: 0 0 24px 0;">
<a href="{{ item.permalink }}">
<img
src="{% if item.thumbnailUrl %}{{ item.thumbnailUrl }}{% else %}{{ item.mediaUrl }}{% endif %}"
alt="{{ item.caption|default:'Instagram post'|truncatechars:100 }}"
width="560"
style="display: block; width: 100%; max-width: 560px; height: auto;"
>
</a>
{% if item.caption %}
<p style="margin: 8px 0 0 0;">{{ item.caption|truncatechars:200 }}</p>
{% endif %}
<p style="margin: 8px 0 0 0;"><a href="{{ item.permalink }}">View on Instagram</a></p>
</td>
</tr>
{% endfor %}
</table>
Change Instagram if you named the feed differently. |slice:":3" shows three posts; Free maxes at six in the response.
What Klaviyo will not do: start a flow because a new Instagram post appeared. Web feeds are content you pull into a send that was triggered by something else (welcome series, campaign schedule, purchase, and so on). If you need “email the list every time we post,” Mailchimp’s RSS automation is the better fit.
Keep the feed URL private. If you regenerate the API key, update Klaviyo immediately — a failing web feed can stop emails that depend on it from sending.
Cost sketch: Zapier tax vs a feed URL
Numbers move, so treat this as a shape, not a quote:
- A Zap that watches Instagram and pushes into an ESP usually wants a paid Zapier (or Make) plan once you leave the free task allotment. Every post, every retry, every test send can burn tasks.
- A view-metered Instagram widget is priced for embeds, not for “Klaviyo fetched this JSON on send.” Hit the free view cap and the account pauses — honest metering, bad surprise on a product launch week.
- Feedframer Free is enough to prove the path: six recent posts, unlimited calls, no card. Premium is a flat $6/mo (or $60/yr) when you need more than six posts or fresher checks.
You still pay Mailchimp or Klaviyo. You stop paying a middleware tax for a feed those tools already know how to read.
When this is the wrong tool
Be boringly honest:
- Need multi-network UGC walls (TikTok + Instagram + moderation queue) → an aggregator (Juicer and friends), not us.
- Need a WordPress grid with a visual builder → Smash Balloon; we are an API, not a theme customizer.
- Need a new Instagram post to trigger a Klaviyo flow → native web feeds do not do that; use a Zap/webhook path or Mailchimp RSS automation instead.
- Compliance says tokens and media never leave your VPC → DIY Graph API (and budget the 60-day refresh). Related reading on why tokens die quietly: Your Instagram embed will die in 60 days (and how to stop it).
- Personal Instagram account → Meta will not give you the API. Switch to Business/Creator or stop here.
Soft checklist
- Confirm Business or Creator.
- Connect once at feedframer.com; copy RSS for Mailchimp or JSON for Klaviyo.
- Do not put raw Instagram CDN URLs into a long-lived email archive — use a host that copies media (we do).
- Decide what “free limit” means before a client launch: six posts in the feed is a hard cap, not a soft nag.
- Document key rotation: regenerate on the dashboard → update the URL in the ESP the same day.
Soft CTA
If the goal is “Instagram in the email without another Zap,” try the Free tier, paste the URL into Mailchimp or Klaviyo, and send yourself a test. Upgrade only if six posts or daily freshness is not enough.
If the goal is a custom site grid in Next or Astro, the same key speaks REST and GraphQL — email was just the excuse for this article.
Top comments (0)