<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6" -->

---
title: How I Migrated My Website to Cloudflare and Saved $228
description: A step-by-step account of migrating a static website from Netlify to Cloudflare Pages, eliminating a $19/month hosting bill with zero downtime. The approach...
canonical: https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How I Migrated My Website to Cloudflare and Saved $228 | daily.dev
og:description: A step-by-step account of migrating a static website from Netlify to Cloudflare Pages, eliminating a $19/month hosting bill with zero downtime. The approach...
og:url: https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6
og:image: https://api.daily.dev/og/posts/jnB0ux8F6.png
og:image:alt: How I Migrated My Website to Cloudflare and Saved $228
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How I Migrated My Website to Cloudflare and Saved $228

**[Milan Jovanović](https://daily.dev/sources/milanjovanovic)** · 8 min read · 35 upvotes · 2 comments

## Summary

A step-by-step account of migrating a static website from Netlify to Cloudflare Pages, eliminating a $19/month hosting bill with zero downtime. The approach uses a dual-deploy CI strategy: both hosts receive the same build simultaneously, allowing the new Cloudflare Pages copy to be verified before a single DNS record flip completes the cutover. Key steps covered include inventorying DNS records before moving nameservers, handling redirects via a _redirects file, and maintaining a rollback path throughout. A bonus section covers using Cloudflare R2 for free nightly Postgres database backups with rclone, taking advantage of R2's zero egress fees.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://milanjovanovic.tech/blog/how-i-migrated-my-website-to-cloudflare-and-saved-228-dollars>

## Questions this post answers

### How do you migrate a static website from Netlify to Cloudflare Pages without downtime?

Deploy to both hosts from the same CI build using a dual-deploy step (keep the existing Netlify deploy and add a wrangler pages deploy step), verify the Cloudflare Pages copy on its own pages.dev URL, move DNS hosting to Cloudflare while records still point at Netlify, then flip the website record to Pages as a custom domain. Rollback is a single DNS record change since Netlify keeps serving until cutover.

_Developers planning a zero-downtime host migration can find similar step-by-step playbooks on daily.dev._

### Does Cloudflare R2 charge egress fees for downloading data?

No, R2 has zero egress fees, unlike most other cloud object storage providers, making downloads free. The free tier also includes 10 GB of storage, which makes it well suited for use cases like nightly database backups where you need to pull data back out without incurring extra cost.

_Anyone comparing object storage costs for backups can track pricing differences like this on daily.dev._

### How do you handle DNS records like MX, SPF, DKIM, and DMARC when switching DNS hosting providers?

Inventory every DNS record before changing nameservers, since email authentication records (MX, SPF, DKIM, DMARC TXT records) are the ones most likely to cause silent damage, such as emails landing in spam if a DKIM record breaks. Cloudflare's automatic import of existing records is not guaranteed to be complete, so records should be checked manually against the inventory and kept DNS-only (grey-clouded) rather than proxied.

_Teams changing DNS providers can avoid email delivery breakage by checking guidance like this on daily.dev._

## Community discussion

Top comments from developers on daily.dev.

**@trevorsuna** · 0 upvotes

> Dual-deploying before the DNS flip is the smart part here. It turns the move into a boring, reversible change, and boring migrations are usually the best ones. The R2 backup tip is a nice bonus.

**@bobbyiliev** · 0 upvotes

> CloudFlare is awesome

## Similar posts on daily.dev

- [Migrating From MinIO to Cloudflare R2 \(And Saving Myself a VPS Upgrade\)](https://daily.dev/posts/migrating-from-minio-to-cloudflare-r2-and-saving-myself-a-vps-upgrade--66shcx0vu) · Waseem .NET Newsletter · 4 upvotes · 2 comments
- [How I Save $1,483 per Month Using Claude Code as My Server Admin](https://daily.dev/posts/how-i-save-1-483-per-month-using-claude-code-as-my-server-admin-9bl8oqokx) · TypeScript.TV · 0 upvotes · 0 comments
- [How GitHub Copilot enables zero DNS configuration for GitHub Pages](https://daily.dev/posts/how-github-copilot-enables-zero-dns-configuration-for-github-pages-df2px9onj) · GitHub Blog · 1 upvotes · 0 comments
- [How to Host a Static Site on AWS for the Price of a Domain](https://daily.dev/posts/how-to-host-a-static-site-on-aws-for-the-price-of-a-domain-ntpwo7tdy) · Atomic Spin · 0 upvotes · 0 comments

---

Tags: [#github-actions](https://daily.dev/tags/github-actions), [#dns](https://daily.dev/tags/dns)

[View this post on daily.dev](https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"How I Migrated My Website to Cloudflare and Saved $228","url":"https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6"},"datePublished":"2026-07-18T00:08:07.749Z","dateModified":"2026-09-14T07:14:45.717Z","description":"A step-by-step account of migrating a static website from Netlify to Cloudflare Pages, eliminating a $19/month hosting bill with zero downtime. The approach...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/61023fa04ecf61433933ff04d5b66a39?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/61023fa04ecf61433933ff04d5b66a39?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"Milan Jovanović","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"Milan Jovanović","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/78d8abfb692746538410dee47f93e566","url":"https://daily.dev/sources/milanjovanovic"},"commentCount":2,"discussionUrl":"https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":35},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":2}],"keywords":"github-actions,dns","timeRequired":"PT8M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"Milan Jovanović","item":"https://daily.dev/sources/milanjovanovic"},{"@type":"ListItem","position":3,"name":"How I Migrated My Website to Cloudflare and Saved $228"}]}
{"@context":"https://schema.org","@type":"WebPage","@id":"https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6","comment":[{"@type":"Comment","text":"Dual-deploying before the DNS flip is the smart part here. It turns the move into a boring, reversible change, and boring migrations are usually the best ones. The R2 backup tip is a nice bonus.","datePublished":"2026-07-18T03:49:47.868Z","url":"https://daily.dev/posts/jnB0ux8F6#c-su7kLMqV6","author":{"@type":"Person","name":"Trevor Suna","url":"https://daily.dev/trevorsuna","image":"https://media.daily.dev/image/upload/s--dZ7gXxpp--/f_auto/v1784081551/avatars/avatar_EMoP47rpuw8DNjhp6R1b6?_a=BAMAMicg0"}},{"@type":"Comment","text":"CloudFlare is awesome","datePublished":"2026-07-18T09:14:39.181Z","url":"https://daily.dev/posts/jnB0ux8F6#c-09XTnfpnJ","author":{"@type":"Person","name":"Bobby Iliev","url":"https://daily.dev/bobbyiliev","image":"https://avatars3.githubusercontent.com/u/21223421?v=4"}}]}
{"@context":"https://schema.org","@type":"FAQPage","@id":"https://daily.dev/posts/how-i-migrated-my-website-to-cloudflare-and-saved-228-jnb0ux8f6#faq","mainEntity":[{"@type":"Question","name":"How do you migrate a static website from Netlify to Cloudflare Pages without downtime?","acceptedAnswer":{"@type":"Answer","text":"Deploy to both hosts from the same CI build using a dual-deploy step (keep the existing Netlify deploy and add a wrangler pages deploy step), verify the Cloudflare Pages copy on its own pages.dev URL, move DNS hosting to Cloudflare while records still point at Netlify, then flip the website record to Pages as a custom domain. Rollback is a single DNS record change since Netlify keeps serving until cutover. Developers planning a zero-downtime host migration can find similar step-by-step playbooks on daily.dev."}},{"@type":"Question","name":"Does Cloudflare R2 charge egress fees for downloading data?","acceptedAnswer":{"@type":"Answer","text":"No, R2 has zero egress fees, unlike most other cloud object storage providers, making downloads free. The free tier also includes 10 GB of storage, which makes it well suited for use cases like nightly database backups where you need to pull data back out without incurring extra cost. Anyone comparing object storage costs for backups can track pricing differences like this on daily.dev."}},{"@type":"Question","name":"How do you handle DNS records like MX, SPF, DKIM, and DMARC when switching DNS hosting providers?","acceptedAnswer":{"@type":"Answer","text":"Inventory every DNS record before changing nameservers, since email authentication records (MX, SPF, DKIM, DMARC TXT records) are the ones most likely to cause silent damage, such as emails landing in spam if a DKIM record breaks. Cloudflare's automatic import of existing records is not guaranteed to be complete, so records should be checked manually against the inventory and kept DNS-only (grey-clouded) rather than proxied. Teams changing DNS providers can avoid email delivery breakage by checking guidance like this on daily.dev."}}]}
```

