Lo esencial
Imagina que construiste un cartero mecánico que funciona de maravilla en tu casa. Ahora hay que mandarlo a trabajar por su cuenta: a una oficina a la que llegará todos los días a las 9 de la mañana, sin depender de ti. Desplegar (deploy) es justo eso: pasar tu automatización de "funciona en mi computadora" a "funciona siempre, en la nube, sin mí".
Conceptos clave
- La diferencia entre ejecutar algo en tu computadora y desplegarlo en la nube
- Cloudflare Workers como plataforma edge (cómputo en los servidores más cercanos al usuario) para automatizaciones 24/7
- Lo desplegado es determinista: el código hace exactamente lo escrito, sin autocorregirse
- Rate limiting (límite de frecuencia de solicitudes) y las cuotas de las claves de API (interfaz de programación de aplicaciones) en producción
- Vercel para desplegar aplicaciones web
- Alternativas: Trigger.dev, Modal, Railway (comparación)
Teoría
Qué cambia al desplegar
Cuando desarrollas un workflow (flujo de trabajo) con Claude Code, el agente (un programa ejecutor autónomo) puede corregir un error sobre la marcha. ¿Escribiste mal la ruta de un archivo? El agente lo nota, lo corrige y sigue. A esto se le llama ejecución adaptativa.
Al desplegar eso no existe. Despliegas código y herramientas, no al agente con su capacidad de razonar y corregir. El código se ejecuta de forma determinista: paso 1 → paso 2 → paso 3. Si en el paso 2 algo sale mal, aparece un error. Nada de "espera, lo voy a repensar".
Conclusión: todas las pruebas hay que hacerlas durante el desarrollo, no esperar a que "en producción se arregle solo".
Cloudflare Workers: tu fábrica de automatizaciones en el edge
Cloudflare Workers son funciones edge que corren en los servidores de Cloudflare en cientos de ciudades del mundo. No es una plataforma SaaS (software como servicio) aparte, sino parte de la infraestructura de Cloudflare.
Qué pueden hacer los Workers:
- Cron Triggers (programación con cron, un planificador de tareas): cada lunes a las 08:00, el primer día del mes, cada 15 minutos
- Webhooks HTTP (un webhook es un aviso por HTTP): llega una solicitud → el Worker ejecuta la lógica
- KV Storage (almacenamiento clave-valor): guardar datos entre ejecuciones (estado, resultados, caché)
- Avisos a un chat: enviar los resultados directo a un bot de mensajería, por ejemplo de Telegram
¿Por qué Cloudflare Workers y no Trigger.dev?
| Cloudflare Workers | Trigger.dev | |
|---|---|---|
| Plan gratis (free tier) | 100,000 solicitudes/día | Tiene plan gratis; condiciones en su página de precios |
| De pago | desde $5/mes (10 millones de solicitudes incluidas, después $0.30 por millón) | Planes de pago; precios en su sitio |
| Edge | Cientos de ciudades en el mundo | Las tareas corren en los servidores del servicio, no en el edge |
| Almacenamiento | KV (integrado, con un volumen gratis) | Necesitas una base de datos externa |
| Monitoreo | wrangler tail + registros |
Un panel (bonito) |
| GitHub | GitHub Actions o wrangler deploy |
Integración nativa |
| Límite de ejecución | Límite de CPU: 10 ms (free); para cron en los planes de pago el límite es mayor, consulta la página de límites de Cloudflare | Sin límite de duración |
Los precios y límites de Cloudflare en la tabla están a octubre de 2026. Precios y versiones vigentes: Lo vigente.
Cuándo conviene más Trigger.dev: si la tarea calcula o procesa datos durante más tiempo del que permiten los límites de CPU de Workers (scraping pesado, procesamiento de video). Para la mayoría de las automatizaciones ligeras, Workers es más barato y rápido.
Trigger.dev es una buena herramienta. Usamos Workers porque a pequeña escala sale más barato y está integrado en el ecosistema que ya usamos. Compara con tus propias cifras.
El proceso de despliegue: 5 pasos
Paso 1: Crear el proyecto del Worker
npm create cloudflare@latest -- my-automation
cd my-automationLa herramienta te hará algunas preguntas: elige "Hello World example", "Worker only" y el lenguaje TypeScript. Creará la estructura del proyecto con wrangler.jsonc (la configuración; en proyectos viejos es wrangler.toml, y el formato toml también se admite) y src/index.ts (el código). Abajo la configuración se muestra en formato toml; el sentido de los ajustes es el mismo.
Paso 2: Configurar los secretos
Los secretos se agregan con la CLI (interfaz de línea de comandos), no en archivos:
wrangler secret put ANTHROPIC_API_KEY
# Escribes la clave en la terminal: se cifra y se guarda en Cloudflare
wrangler secret put TELEGRAM_BOT_TOKENNunca guardes claves en el código. Solo con wrangler secret put.
Paso 3: Configurar el horario en wrangler.toml
name = "weekly-job-scraper"
main = "src/index.ts"
compatibility_date = "2026-10-01" # pon la fecha de hoy
[triggers]
crons = ["0 9 * * 1"] # cada lunes a las 09:00 UTC
[[kv_namespaces]]
binding = "CACHE"
id = "your-kv-namespace-id"Paso 4: Escribir el Worker
export default {
async scheduled(event, env, ctx) {
// 1. Leemos el estado anterior desde KV
const lastRun = await env.CACHE.get("last-run");
// 2. Llamamos a la API de Anthropic
const response = await fetch("https://api.anthropic.com/v1/messages", {
method: "POST",
headers: {
"x-api-key": env.ANTHROPIC_API_KEY,
"content-type": "application/json",
"anthropic-version": "2023-06-01"
},
body: JSON.stringify({
model: "claude-sonnet-5-5", // el identificador vigente del modelo está en la página Lo vigente
max_tokens: 1024,
messages: [{ role: "user", content: "Genera un resumen..." }]
})
});
const data = await response.json();
const result = data.content.map((b) => (b.type === "text" ? b.text : "")).join("");
// 3. Lo enviamos a Telegram
await fetch(`https://api.telegram.org/bot${env.TELEGRAM_BOT_TOKEN}/sendMessage`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
chat_id: env.TELEGRAM_CHAT_ID,
text: result,
parse_mode: "Markdown"
})
});
// 4. Guardamos el estado
await env.CACHE.put("last-run", new Date().toISOString());
}
};Paso 5: Despliegue y monitoreo
# Despliegue
wrangler deploy
# Monitoreo en tiempo real
wrangler tail
La prueba del cron se hace en tu computadora: ejecuta npx wrangler dev --test-scheduled y, en otra ventana de la terminal, corre:
curl "http://localhost:8787/cdn-cgi/local/scheduled"En el Cloudflare Dashboard ves los registros de cada ejecución, los errores y las métricas.
Un ejemplo real: el resumen semanal de vacantes
La tarea: cada viernes reunir vacantes de empleo y enviar un resumen a un chat (en el ejemplo, un bot de Telegram).
Arquitectura del Worker: 1. Cron Trigger: "0 17 * * 5" (viernes 17:00 UTC) 2. Leer los resultados anteriores desde KV (para quitar duplicados) 3. Obtener datos de 5 APIs de vacantes 4. Llamar a la API de Anthropic para estructurar + analizar 5. Quitar duplicados (lo que ya salió la semana pasada) 6. Guardar los resultados nuevos en KV 7. Enviar el resumen a Telegram 8. Registrar métricas (tokens, la unidad mínima de texto para la IA; costo) en un KV de auditoría
Una limitación importante: el límite de CPU time (tiempo de procesador). En el plan Free son 10 ms de CPU por ejecución; en el de pago (mínimo $5/mes), el límite para un cron es mucho mayor y depende de cada cuánto se ejecuta (consulta la página de límites de Cloudflare). Esperar la respuesta de la red (llamar a una API, leer KV) no cuenta como CPU time, así que para la mayoría de los workflows con APIs alcanza. Para scraping pesado con Playwright necesitas Trigger.dev o un servidor aparte.
Rate limiting: la pared invisible
En producción trabajas con los límites reales de las APIs:
Anthropic:
- Los límites de solicitudes y de tokens por minuto dependen del nivel (tier) de tu cuenta y del modelo; los valores exactos están en Claude Console y en la sección Rate limits de la documentación
- Las cuentas nuevas empiezan en un nivel bajo, y los límites suben conforme las usas
Si se rebasa el límite: la API devuelve el error 429. Sin lógica de retry, el workflow se cae.
La solución: agregar pausas entre solicitudes y usar retry con espera exponencial:
async function callWithRetry(fn, maxRetries = 3) {
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (e) {
if (e.status === 429 && i < maxRetries - 1) {
await new Promise(r => setTimeout(r, 1000 * Math.pow(2, i)));
continue;
}
throw e;
}
}
}Planear las cuotas: si el workflow procesa 500 documentos al día, calcula cuántos tokens se van a gastar. No rebases las cuotas diarias.
Vercel: para aplicaciones web
Cloudflare Workers es para automatizaciones y tareas en segundo plano. Vercel es para aplicaciones web y APIs:
- Despliegue de apps de Next.js / React
- Serverless functions (sin administrar un servidor): endpoints de REST API (puntos de entrada)
- Edge Functions: se ejecutan cerca del usuario
- El plan gratis Hobby: sirve para prototipos personales, pero solo para proyectos no comerciales. Para proyectos comerciales necesitas el plan de pago Pro (a octubre de 2026: $20 al mes por desarrollador)
Una combinación típica:
Vercel (interfaz web) ←→ Cloudflare Workers (tareas en segundo plano) ←→ KV Storage
↓
Bot de chat (avisos)El usuario presiona un botón en el sitio → Vercel recibe la solicitud → un Cloudflare Worker lanza la tarea → el resultado va a KV + al bot.
Una nota aparte sobre sitios estáticos: para ellos y para apps full-stack, Cloudflare ahora recomienda Workers con archivos estáticos (Workers Static Assets); Pages sigue funcionando, pero las funciones nuevas aparecen en Workers (a octubre de 2026).
Cloudflare Workers: planes
| Parámetro | Free | De pago (desde $5/mes) |
|---|---|---|
| Solicitudes | 100,000/día | sin límite (10 millones/mes incluidas, después $0.30 por millón) |
| CPU time por solicitud | 10 ms | más; consulta la página de límites |
| Lecturas de KV | volumen diario; consulta la página de precios | volumen mensual incluido; consulta la página de precios |
| Escrituras de KV | volumen diario; consulta la página de precios | volumen mensual incluido; consulta la página de precios |
| Cron Triggers por cuenta | limitado; consulta la página de límites | más; consulta la página de límites |
| Workers | limitado; consulta la página de límites | más; consulta la página de límites |
Para empezar: el plan Free alcanza para 1 a 3 automatizaciones. El de pago (desde $5/mes) es para un uso serio. Las cifras son a octubre de 2026.
Precios vigentes: Cloudflare Workers Pricing
Comparación de todas las plataformas de despliegue
| Plataforma | Para qué | Precio (a octubre de 2026) | Límite de ejecución | ¿Nuestra elección? |
|---|---|---|---|---|
| Cloudflare Workers | Cron + automatizaciones con APIs | desde $5/mes, tiene plan gratis | CPU: 10 ms (free) / más para cron (de pago) | ✅ Principal |
| Trigger.dev | Tareas pesadas y largas | Plan gratis y planes de pago; consulta su página de precios | Sin límite de duración | Alternativa |
| Vercel | Apps web + APIs | Hobby gratis (solo no comercial), Pro $20/mes | Según el plan; consulta la documentación | Para la interfaz |
| Modal | Tareas de ML + GPU | Pago por uso; consulta su página de precios | Consulta la documentación | Para cargas pesadas de IA |
| Railway | Un servidor completo | Consulta su página de precios | Consulta la documentación | Si necesitas un VPS (servidor privado virtual) |
| Render | Web services + cron jobs | Consulta su página de precios | Consulta la documentación | Despliegue sencillo |
Errores comunes al desplegar
Olvidar configurar los secretos con
wrangler secret put. El error más común: copiaste el código, lo desplegaste y el Worker falla con "undefined", porque las claves de API no están configuradas. Siempre revisawrangler secret listantes de desplegar.No probar en tu computadora antes de desplegar.
wrangler devejecuta el Worker localmente: úsalo. Una corrida conwrangler devte ahorra una hora de depuración en producción.Guardar secretos en
wrangler.toml. El archivowrangler.tomlsuele terminar en git. Los secretos (claves de API, tokens) van solo conwrangler secret put, nunca enwrangler.tomlni en el código.Ignorar el límite de CPU time. Free tier = 10 ms de CPU time. Esperar la red no cuenta, pero procesar respuestas grandes y la lógica compleja lo rebasan fácil. Revisa con
wrangler tailcuánto CPU time gasta el Worker.Olvidar el retry ante errores 429. En producción, los servicios de API devuelven 429 (rate limit) con regularidad. Sin lógica de retry, el Worker simplemente se cae a las 3 de la mañana y te enteras en la mañana.
Un wrangler.toml real: la configuración del Worker
name = "my-weekly-digest"
main = "src/index.ts"
compatibility_date = "2026-10-01" # pon la fecha de hoy
# Horario: cada lunes a las 09:00 UTC
[triggers]
crons = ["0 9 * * 1"]
# Almacenamiento KV para el estado entre ejecuciones
[[kv_namespaces]]
binding = "CACHE"
id = "abc123def456" # el ID que da `wrangler kv namespace create CACHE`
preview_id = "xyz789" # para wrangler dev
# Variables de entorno (NO son secretos: pueden ir en la configuración)
[vars]
TELEGRAM_CHAT_ID = "123456789"
ENVIRONMENT = "production"
# Los secretos se agregan con la CLI:
# wrangler secret put ANTHROPIC_API_KEY
# wrangler secret put TELEGRAM_BOT_TOKENAtención: el id del KV namespace lo obtienes con wrangler kv namespace create CACHE. Los secretos (ANTHROPIC_API_KEY, etc.) se configuran solo con wrangler secret put.
Lista de verificación antes de desplegar
Antes de desplegar, revisa sin falta:
Práctica
Tarea: desplegar una automatización sencilla en Cloudflare Workers
- Instala Node.js (lo necesitas para los comandos de abajo). Wrangler viene en el proyecto, no hace falta instalarlo de forma global: usa
npx wrangler ... - Crea el proyecto:
npm create cloudflare@latest -- quote-bot(Hello World, Worker only, TypeScript) - Inicia sesión:
npx wrangler login - Escribe el Worker: cada 5 minutos, obtener un registro de una API pública de prueba (por ejemplo, jsonplaceholder.typicode.com) y registrar el resultado
- Configura el cron en la configuración de Wrangler:
crons = ["*/5 * * * *"] - Prueba en tu computadora:
wrangler dev --test-scheduled - Despliega:
wrangler deploy - Observa la ejecución:
wrangler tail - Extra: agrega un secreto (
wrangler secret put MY_SECRET) y úsalo en el Worker comoenv.MY_SECRET - Extra 2: crea un KV namespace y guarda el número del último registro, para no repetir
Resultado esperado: en wrangler tail se ven ejecuciones exitosas regulares con los registros.
Herramientas y recursos
- Cloudflare Workers: plataforma edge para automatizaciones
- Wrangler CLI: la CLI para crear, probar y desplegar Workers
- Cloudflare KV: almacenamiento clave-valor para el estado entre ejecuciones
- Cloudflare D1: base de datos SQL (SQLite) para Workers, si KV no alcanza
- Cloudflare R2: almacenamiento de archivos (parecido a S3), con un volumen gratis (condiciones en la página de precios)
- Cloudflare Workers Pricing: tarifas vigentes
- Vercel: despliegue de apps web; el plan gratis Hobby es solo para proyectos no comerciales
- Trigger.dev: alternativa para tareas largas
- Railway: un servidor completo, si necesitas un VPS
- Render: despliegue sencillo de web services + cron jobs
- GitHub Actions: alternativa para pipelines de CI/CD (integración y entrega continuas)
Ideas clave
Al desplegar envías código, no al agente. El código no se corrige solo: por eso prueba DURANTE el desarrollo, no después.
El rate limiting es un problema real en producción. Agrega pausas y lógica de retry antes de que algo se caiga a las 3 de la mañana.
Cloudflare Workers = velocidad del edge + almacenamiento KV + cron listos para usar. A pequeña escala sale notablemente más barato que Trigger.dev. Para la mayoría de las tareas ligeras es una buena elección.
Lecciones relacionadas
- → Loop vs. Scheduled Tasks: programar las ejecuciones de Workers con cron y Trigger.dev
- → Headless Mode y CI/CD: despliegue automático de Workers con GitHub Actions
- ← APIs e integraciones: los Workers hacen llamadas a APIs de servicios externos; entender las APIs es indispensable
Siguiente lección
→ Multimodalidad: imágenes, PDF y audio en el trabajo con Claude
La marca se guarda solo en este navegador y no se envía a ningún sitio. Mi progreso