Tutorial

Host your podcast for $1 a month with a CDN

Should you host a podcast with a CDN?

Hosting with a CDN is a great way to keep costs down if you're into podcasting for fun and don't care about monetization or in-depth listener analytics. If you found this article thinking that there has to be a different way to serve a few audio files for a show that you haven't posted to in months, and you don't want to pay for all the features you aren't using, you've come to the right place. Realistically, if you have a podcast that still posts regularly or are happy with the tools your podcast host provides and are just looking for a lower cost alternative, this article is probably not for you.

Before we begin

I'm making these instructions to help anyone looking to do the same, as I couldn't find information to do exactly what I wanted. This is mostly written for users who have a decent understanding of how podcasts are served on a technical level. If you're following this tutorial step by step, you’ll need a domain name and a web host you can access the file structure of or be able to upload your XML feed to without the URL changing each time it's updated.

Setting up a CDN

I chose to go with Bunny.net as they looked dead simple to set up and like my usage would land near the minimum price of $1/month at an average cost of $0.01 per GB. Considering my previous host was $12/month, that’s a cost savings of $132/year, which sounded great to me.

Once logged in, the first thing that’s needed is a Storage Zone. Select + Add > Storage Zone from here you can adjust the settings for those zones to your needs. My personal settings are below, but feel free to change your Main Storage Region based on your location. It's important to note that Geo-Replication Zones cannot be removed without deleting the entire Zone and starting over. Don't choose more than you think you'll need during the initial setup, and you shouldn't need more than 2.

Storage Zone Name: example
Storage Tier: Standard
Main Storage Region: US East (New York)
Geo Replication: Europe (Falkenstein)

Next up is to tie the storage zone to a CDN, so your files can be accessed from the web. Select + Add > Pull Zone and choose your settings for the CDN. I selected to only host in North America since that’s my primary audience, and I’m fine with a slightly longer loading time for users outside the North American region and wanted to keep my costs down.

Pull Zone Name: example.b-cdn.net
Origin Type: Storage Zone > example
Choose Tier: Standard Tier
Pricing Zones: North America

Now that everything is configured, head back to your storage zone and add a file. I added a few folders to separate my images and audio. There is FTP and API access available if you prefer that as well. Check to make sure everything is functioning properly after uploading by visiting your Pull Zone and adding the file path: example.b-cdn.net/audio/episode-1.mp3. If that works, we can move on to the next step.

One of the reasons I liked Bunny was the ease of adding a custom domain for the CDN to add that touch of polish that helps me sleep better at night. If you would like to add a custom URL – which I highly recommend in case you ever want to move your hosting elsewhere, this is the time to do it. Select your CDN and add a Custom Hostname like cdn.example.com and add the CNAME record in your DNS settings for your domain. Once the CNAME is added, enable the SSL certificate and check that the Hostname is functioning by visiting cdn.example.com/audio/episode-1.mp3. DNS can take up to a few days to fully propagate, so don’t worry if it’s not loading immediately.

Create an RSS feed (Manually)

This part can be a completely manual process if you would rather not pay for anything else, and your listeners won’t notice a difference. If you have more than one podcast or want to avoid building your RSS file line by line, I’ve found a macOS app that works well. If you'd like to do that instead, skip to the next section.

Below is a basic RSS feed template that can be edited in a plain text or code editor like VS Code. Details on how to format it follow.

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
<channel>
<title>CHANGE ME - Example Podcast</title>
<link>CHANGE ME - Podcast Website</link>
<language>en-us</language>
<copyright>CHANGE ME - Copyright Holder or Notice</copyright>
<itunes:subtitle>CHANGE ME - Subtitle</itunes:subtitle>
<itunes:author>CHANGE ME - Author Name</itunes:author>
<itunes:summary>CHANGE ME - iTunes Show Summary</itunes:summary>
<description>CHANGE ME - Show Description</description>
<itunes:owner>
<itunes:name>CHANGE ME - iTunes Author Name</itunes:name>
<itunes:email>CHANGE ME - iTunes Account Holder Email</itunes:email>
</itunes:owner>
<itunes:image href=“CHANGE ME - Podcast Icon URL”/>
<itunes:category text=“CHANGE ME - Podcast Category”> </itunes:category>
<item>
<title>CHANGE ME - Episode Title</title>
<itunes:author>CHANGE ME - Episode Author</itunes:author>
<itunes:subtitle>CHANGE ME - Episode Subtitles</itunes:subtitle>
<itunes:summary>CHANGE ME - Episode Summary</itunes:summary>
<enclosure url=“CHANGE ME - Episode MP3 URL” length="CHANGE ME" type="audio/mpeg"/>
<guid>CHANGE ME - 4c24c1f5-5cec-4471-9604-ffedb53bc5f8</guid>
<pubDate>CHANGE ME - Mon, 1 Jan 2024 12:00:00 CST</pubDate>
<itunes:duration>CHANGE ME - in seconds</itunes:duration>
<itunes:explicit>CHANGE ME - false</itunes:explicit>
</item>
</channel>
</rss>

I've collected some basic instruction and resources on how to format different aspects of the RSS Feed to comply with the standards. However, Apple's guide to RSS is extremely helpful for the most up-to-date information.

URLs - Use the full URL, including https://
<language> - RSS Language Codes
<itunes:category> - Apple Podcast Categories
<enclosure length="CHANGE ME"> - This is the length of the episode in bytes. This can be viewed by right-clicking on the final MP3 file and selecting Get Info. Size will be displayed in bytes near the top and should be added without commas or extra spaces between the numbers.
<guid> - Is a unique code for each episode, so the podcast player knows if it needs to redownload an episode if it has changed. I found using a UUID generator tool was the best way to prevent issues.
<pubDate> - The value specified must meet the Date and Time specifications as defined by RFC822.
<itunes:duration> - Convert Hour/Minute duration to seconds
<itunes:explicit> - Should be filled with a "true" or "false"

Once you have your RSS feed completed, save the file. I recommend just using feed.xml or your show name. This file should then be uploaded to your web hosting provider to a location that will not change when you update the file. Once you test the URL you chose and can see the RSS feed, move on to the Publish section.

Create an RSS feed (Automatically)

If you looked at the content above and thought I have a podcast a not a newsletter for a reason – there's no chance I'm typing all of that. Feeder has a user interface that’s a little more feature rich that can do it for you. I’m not affiliated with the developer in any way, but after searching around for a few hours, this appears to be the best option for macOS users.

Once Feeder is installed, a new feed can be added with + > New Feed > Podcast. The feed tab of the app looks pretty similar to the interface found on many podcast hosts, once filled out, episodes can be added using the Items tab. If you don’t want your dates to change for when the podcast was posted, ensure to uncheck the auto-button and enter the previous published times.

The settings tab has some really great features, like the ability to add extensions like chapters. Episodes or Items as the app refers to them as have several options, ensure Enclosures has Allow HTTPS enclosures checked, so content can be delivered securely from the Bunny CDN.

Under the Publishing tab is where things start to get exciting. Using the FTP option for the Enclosures and Images sections allows uploading directly to your Bunny Storage Zone. I also configured the XML file for the feed to upload to my web host, so I could just use domain.com/feed.xml allowing the ability to redirect the feed if I decide to change to another host in the future.

Publish

The last step to make all of this work is to publish your feed. I have mine uploaded and accessible by example.com/feed.xml and automatically uploaded by Feeder. However, as long as your web host allows you to upload files, you can easily manually upload and replace the XML file when you update your podcast.

I would like to reiterate I strongly advise against using the default b-cdn.net URL for your feed as you would not be able to create a permanent redirect if you ever change back to a regular podcast host.

Additionally, I recommend adding your new feed to your podcast player and testing a few episodes to make sure everything was configured properly before changing your current feed to redirect to the one that was just created. From now on, every time you update the XML file on your web host with new episodes, it will be updated and populated by the Podcast players, making your show available to your listeners.

If you have any questions or suggestions for ways to improve this guide, feel free to reach out to me on my contact page.

Some links may be referral links. Your price stays the same, but it helps support the blog. Thank you!