Cloudflare R2: almacenamiento sin costo de egreso vs S3
Cloudflare R2 es el servicio de almacenamiento de objetos compatible con S3 que no te cobra cargos de egreso. Mientras AWS S3 te factura USD 0,09 por cada GB que servís a tus usuarios, R2 cobra USD 0,00 por esa transferencia. Para una app SaaS con tráfico real, esa diferencia define la factura de fin de mes.
El almacenamiento de Cloudflare R2 es un servicio de object storage de Cloudflare, compatible con la API de Amazon S3, que guarda archivos no estructurados (imágenes, videos, backups, assets) y los sirve sin costo de transferencia de salida. Se integra de forma nativa con Cloudflare Workers y corre sobre la red edge de la empresa. Su diferencial es el cobro de egreso en cero.
En 30 segundos
- Egreso gratis: R2 cobra USD 0,00 por transferencia de salida, contra los USD 0,09/GB de AWS S3.
- Almacenamiento barato: USD 0,015 por GB al mes, más operaciones a USD 4,50 y USD 0,36 por millón.
- Compatible con S3: usás el AWS SDK o el CLI wrangler sin reescribir tu código.
- Edge real: corre sobre la red edge global de Cloudflare, pegado a Workers.
- Casos confirmados: Cloudflare Images ya corre en producción sobre R2.
¿Por qué Cloudflare R2 es una alternativa real a AWS S3?
Ponele que tenés una app que sirve fotos de perfil, PDFs o videos cortos. Cada vez que un usuario descarga un archivo desde S3, AWS te cuenta el egreso. Con tráfico alto, ese renglón crece más rápido que el del propio almacenamiento. Para más detalles técnicos, mirá gestión segura de credenciales en Workers.
Ahí está el quiebre. R2 elimina ese cobro. La página oficial de R2 lo plantea sin vueltas: no hay cargo por transferencia de datos hacia afuera. El almacenamiento de Cloudflare R2 te cobra lo que guardás y las operaciones que hacés, pero no te penaliza por servir.
¿Y eso cuánto pesa en la práctica? Cuando tu negocio es servir archivos a escala, el egreso suele ser el renglón que más crece, y sacarlo de la ecuación cambia el orden de magnitud del gasto mensual. El egreso es el costo, no un detalle.
¿Cómo funciona R2 sobre la red edge de Cloudflare?
R2 vive dentro de la infraestructura de Cloudflare, sobre su red edge global. Eso significa que tus archivos se sirven desde nodos cercanos al usuario final, sin que vos pagues por ese viaje.
La parte que más me gusta es la integración con Workers. Atás un bucket a tu Worker con una línea en wrangler.jsonc y leés o escribís objetos desde el mismo código que maneja tus requests. No necesitás pasar por un servidor intermedio. Sumás Smart Tiering y Cache Reserve, y el contenido caliente queda cacheado cerca de quien lo pide. Más contexto en integración con pipelines CI/CD modernos.
Eso sí: R2 no es una CDN por sí solo. Es el origen. La capa de caché y entrega corre en la red de Cloudflare.
¿Cuánto cuesta exactamente Cloudflare R2?
Acá viene lo bueno: los precios son públicos y simples. Pagás almacenamiento, operaciones de escritura (clase A) y operaciones de lectura (clase B). El egreso no aparece en la cuenta.
| Concepto | Cloudflare R2 | AWS S3 (referencia) |
|---|---|---|
| Almacenamiento | USD 0,015 /GB/mes | ~USD 0,023 /GB/mes |
| Egreso (transferencia salida) | USD 0,00 /GB | USD 0,09 /GB |
| Operaciones clase A (escritura) | USD 4,50 /millón | USD 5,00 /millón aprox. |
| Operaciones clase B (lectura) | USD 0,36 /millón | USD 0,40 /millón aprox. |

Hagamos la cuenta gorda. Si guardás 1 TB y servís 10 TB por mes, en S3 el solo egreso te clava unos USD 900. En R2, esos 10 TB de salida cuestan USD 0. El almacenamiento de 1 TB ronda los USD 15 en R2. Tomá los números de AWS con pinzas porque varían por región, pero el orden de magnitud es ese. Esto se conecta con lo que analizamos en automatización de deploys con GitHub Actions.
¿Cómo configurás un bucket de R2 y subís archivos?
El flujo básico tiene cuatro pasos. Cualquiera que haya tocado S3 va a reconocer el patrón al toque.
- Creás el bucket:
wrangler r2 bucket create tanstack-ship-proddesde la terminal. - Generás un API token: desde el panel de Cloudflare, con permisos de lectura y escritura sobre R2.
- Configurás CORS: definís orígenes y métodos permitidos (GET, PUT, POST) vía la API S3 con
aws s3api put-bucket-cors. - Subís archivos: con el CLI wrangler, el AWS SDK apuntando al endpoint de R2, o presigned URLs para uploads directos desde el navegador.
Para archivos grandes conviene la subida directa desde el cliente. Generás una presigned URL válida por una hora y el navegador manda el archivo a R2 sin pasar por tu Worker. Menos carga en tu backend, menos timeouts.
¿Cómo integrás R2 con Workers y apps SaaS?
El ejemplo más claro lo trae la guía de integración con TanStack Start: bindeás el bucket al Worker, exponés un dominio propio (por ejemplo r2.tuapp.com) y emitís URLs de acceso de corta duración por usuario.
Para un SaaS típico el patrón es directo. Cada cliente tiene su carpeta lógica, vos generás presigned URLs cuando alguien necesita un archivo, y el acceso expira solo. Sumale Cloudflare Image Resizing por query params y servís miniaturas o formatos optimizados sin guardar diez versiones de cada imagen. En servir contenido desde múltiples regiones profundizamos sobre esto.
¿Casos donde brilla? Apps multimedia, backups frecuentes, plataformas con descargas masivas y cualquier producto donde el egreso te estaba comiendo el margen. Si además estás montando la infra web del proyecto en Argentina, podés combinar el storage en R2 con hosting y dominio en donweb.com y resolver todo el stack desde acá.
¿Qué errores comunes aparecen al configurar R2?
- Error 403 al subir: casi siempre es el API token mal armado o sin permiso de escritura. Revisá los scopes del token en el panel.
- CORS sin configurar: si el upload falla solo desde el navegador, te falta la política CORS con tu dominio en
AllowedOrigins. - Endpoint equivocado: R2 usa
https://<account-id>.r2.cloudflarestorage.com, no una región de AWS. Si copiaste un endpoint estilous-east-1, no conecta. - Multipart incompleto: los uploads multiparte que se cortan dejan partes colgadas. Cerrá o abortá la operación para no acumular basura facturable.
Preguntas Frecuentes
¿Qué es Cloudflare R2 y cuál es su ventaja principal?
Cloudflare R2 es un almacenamiento de objetos compatible con S3. Su ventaja principal es que no cobra cargos de egreso: servís archivos a tus usuarios sin pagar por la transferencia de salida, algo que en AWS S3 cuesta USD 0,09 por GB.
¿Cuánto cuesta usar Cloudflare R2?
R2 cobra USD 0,015 por GB de almacenamiento al mes, USD 4,50 por millón de operaciones clase A y USD 0,36 por millón de operaciones clase B. El egreso es USD 0,00, así que no pagás por servir los datos.
¿Cuál es la diferencia entre Cloudflare R2 y AWS S3?
La diferencia central es el egreso: R2 no lo cobra y S3 sí (USD 0,09/GB). Ambos comparten la misma API, así que migrás con poco cambio de código. R2 también corre integrado a Cloudflare Workers y a su red edge.
¿Cómo accedés a un archivo guardado en R2?
Accedés vía un dominio público propio (como r2.tuapp.com), con presigned URLs de corta duración para acceso privado, o desde un Worker que lee el objeto del bucket. Los archivos se sirven desde la red de Cloudflare, cerca del usuario.
¿R2 es compatible con el AWS SDK?
Sí. R2 implementa la API de S3, así que funciona con el AWS SDK y con herramientas como aws s3api. Solo cambiás el endpoint por el de R2 y usás tu account ID en lugar de una región de AWS.
Conclusión
Lo que cambia R2 no es la tecnología de storage en sí, sino la estructura de costos. Sacar el egreso de la ecuación da vuelta el cálculo para cualquier app que sirva archivos a escala, y por eso casos como Cloudflare Images terminaron ahí.
¿Qué hacés con esto? Si tu factura de S3 está dominada por la transferencia, armá un bucket de prueba, conectá el AWS SDK al endpoint de R2 y medí. La compatibilidad con S3 hace que el experimento te cueste horas, no semanas. Si el tráfico es bajo y estable, la diferencia es menor y no vale la mudanza. El número manda.






