# La rutina semanal de distribución como skill de Claude: borradores el lunes, aprobaciones y el informe de clics del viernes

_2026-10-06 · Una skill de Claude Code para la semana de una agencia en Shager: borradores desde planes, aprobación del cliente, programar lo aprobado e informe de clics._

Una rutina semanal de distribución es una skill que hace los mismos tres trabajos cada semana: el lunes convierte el plan de contenido de cada cliente en borradores de Shager con textos por cuenta y los envía a aprobación; a mitad de semana programa lo que se aprobó; el viernes trae los clics por cuenta y escribe el informe. En Claude Code la lanzas con `/shager-weekly plan` o `/shager-weekly report`, o sin interfaz desde un programador de tareas con `claude -p`. Los controles humanos quedan entre la redacción y la programación, que es donde menos cuestan y más errores atrapan.

Este artículo parte de [la skill básica de Shager](/en/blog/build-a-claude-skill-for-shager). Aquí el foco está en la rutina: entradas, modos, salvaguardas y cómo ejecutarla sin nadie frente al teclado.

## ¿Cómo es una semana en la práctica?

Pensemos en una agencia con ocho clientes y unas 150 cuentas conectadas. Una semana que funciona se ve así.

| Cuándo | Modo | Qué hace la skill | Papel de las personas |
|---|---|---|---|
| Lunes 09:00 | `plan` | Lee el plan de cada cliente, sube los archivos, crea borradores y pide aprobación | Ninguno durante la ejecución |
| De lunes a miércoles | | Los clientes aprueban o piden cambios desde los enlaces de aprobación | El cliente revisa |
| Miércoles 14:00 | `schedule` | Programa cada publicación aprobada a su hora prevista | El responsable de la cuenta mira el resumen |
| Viernes 15:00 | `report` | Trae los clics por cuenta y por publicación, y escribe un informe por cliente | El responsable de la cuenta lo envía |

La rutina nunca inventa los temas de la semana. Trabaja a partir de un archivo de plan que escribe una persona, porque la estrategia es trabajo de la agencia. Lo que elimina es la parte mecánica: cuarenta variantes de un texto, enlaces con seguimiento, elección de formatos, seguimiento.

## ¿Cómo es el archivo de plan?

Un archivo Markdown por cliente y por semana, en un repositorio que la skill pueda leer:

```markdown
# Harbor Fitness, week 2026-W43
workspace: Harbor Fitness
timezone: America/New_York

## Post 1
when: 2026-10-20 07:00
target: group "All studios"
format: REEL
media: https://cdn.harborfitness.example/w43/6am-class.mp4 (1080x1920, 28s)
brief: New 6am strength class starts Monday. Free first session.
link: https://harborfitness.example/6am
first comment: Book your free first session

## Post 2
when: 2026-10-23 12:00
target: group "Downtown studios"
format: FEED
media: https://cdn.harborfitness.example/w43/smoothie-bar.jpg
brief: Smoothie bar reopens after renovation. 20% off this week.
link: https://harborfitness.example/smoothie
```

Texto plano que la skill interpreta, y un archivo que cualquier responsable de cuenta puede editar sin aprender una herramienta.

## El SKILL.md

```markdown
---
name: shager-weekly
description: Run the agency's weekly Shager distribution routine. Use for "/shager-weekly plan", "/shager-weekly schedule" or "/shager-weekly report", or when asked to prepare, schedule or report this week's client posts from the plans folder.
argument-hint: "plan | schedule | report [client]"
disable-model-invocation: true
allowed-tools: Read Glob Write mcp__shager__whoami mcp__shager__list_workspaces mcp__shager__list_channels mcp__shager__list_groups mcp__shager__list_posts mcp__shager__get_post mcp__shager__get_analytics mcp__shager__upload_media_from_url mcp__shager__create_post mcp__shager__request_approval mcp__shager__schedule_post
---

# Shager weekly routine

Plans live in plans/<ISO week>/<client>.md. Reports go to reports/<ISO week>/.
Mode is the first argument. Process every client unless one is named.

## plan
For each post in each plan file:
1. Resolve workspace, group and channels. Skip channels not ACTIVE and list them.
2. upload_media_from_url with width, height and duration_ms from the plan.
3. create_post WITHOUT schedule_at: per_channel captions written from the
   brief (same facts, different wording, local detail from channel name),
   cta_url = link, campaign = "<client-slug>-<iso-week>-<n>",
   first_comment = "<first comment>: <link>", label = "W43 Post 1".
4. request_approval with the client's reviewer from plans/reviewers.md.
Write a summary: client, post label, post id, accounts, approval_url.

## schedule
For each client: list_posts with status APPROVED. For each, find its
planned time in the plan file by label and call schedule_post with
schedule_at in ISO 8601 with the workspace offset. Never schedule a post
that is not APPROVED. Never schedule a time in the past; list it instead.

## report
For each client: get_analytics from last Monday 00:00 to now (with offset).
Write reports/<week>/<client>.md with a table of clicks by account,
highest first, and the top three posts with their labels.
State plainly that these are link clicks, not leads.

## Errors
Stop the current client on 401 or 403 and record the code. On 422, record
the message against the post and continue. On 429, wait 60 seconds.
```

### Por qué está cada salvaguarda

`disable-model-invocation: true` significa que Claude nunca arranca esta rutina por su cuenta porque en una conversación se mencionaron "las publicaciones de esta semana". Según la [documentación de skills de Claude Code](https://code.claude.com/docs/en/skills), ese campo impide la carga automática, así que la rutina solo se ejecuta cuando alguien, o algo, escribe el comando.

La lista `allowed-tools` tiene todo lo que el trabajo necesita y nada más. No hay `cancel_post`, ni `create_connect_link`, ni `create_workspace`. Una rutina que corre sin supervisión no debería poder hacer cosas que ninguna persona planeó.

La programación solo toca publicaciones en estado `APPROVED`, y ese estado solo existe cuando el cliente aprobó desde su enlace. Si un cliente nunca aprueba, la publicación simplemente no sale, y el resumen del miércoles lo indica. El porqué de poner la aprobación justo en ese punto está en [el flujo de aprobación de clientes para agencias](/en/blog/client-approval-workflow-for-agencies).

## ¿Qué clave debería usar la rutina?

Esta es la decisión que define cuánto confías en la rutina.

| Configuración | Permisos de la clave | Resultado |
|---|---|---|
| Solo borradores | `read`, `write` | `plan` y `report` se ejecutan; una persona programa en Shager |
| Con aprobación obligatoria | `read`, `write`, `publish` y aprobación exigida en todos los espacios de trabajo | La rutina programa solo lo que aprobaron los clientes |
| Piloto automático total | `read`, `write`, `publish`, sin aprobación | Solo para contenido recurrente de bajo riesgo que igual publicarías sin revisar |

La segunda fila es la que recomendamos para la mayoría de las agencias. El permiso `publish` se otorga a una sola clave, creada solo para esta rutina en https://app.shager.ai/dashboard/agents, así el registro de auditoría muestra cada llamada que hizo la rutina y nada más. Si algo parece raro, revocas esa clave y todas las demás integraciones siguen funcionando.

## ¿Cómo se ejecuta sin abrir una terminal?

El modo no interactivo de Claude Code ejecuta una skill desde un script. La [documentación del modo headless](https://code.claude.com/docs/en/headless) indica que las skills que invoca el usuario funcionan en modo `-p` si incluyes `/skill-name` en el prompt, y que `--allowedTools` aprueba de antemano herramientas con la sintaxis de reglas de permisos. También describe `--permission-mode dontAsk`, que rechaza todo lo que de otro modo pediría confirmación, así que una llamada inesperada a una herramienta falla en lugar de quedarse colgada.

```bash
#!/usr/bin/env bash
# run-weekly.sh  (called by cron or your CI scheduler)
set -euo pipefail
cd /srv/agency-content
export SHAGER_API_KEY="$(cat /run/secrets/shager_weekly_key)"

claude -p "/shager-weekly $1" \
  --permission-mode dontAsk \
  --allowedTools "Read,Glob,Write(reports/**),mcp__shager__whoami,mcp__shager__list_workspaces,mcp__shager__list_channels,mcp__shager__list_groups,mcp__shager__list_posts,mcp__shager__get_post,mcp__shager__get_analytics,mcp__shager__upload_media_from_url,mcp__shager__create_post,mcp__shager__request_approval,mcp__shager__schedule_post" \
  --output-format json > "logs/weekly-$1-$(date +%F).json"
```

Y el crontab, en la hora local del servidor:

```text
0 9 * * 1   /srv/agency-content/run-weekly.sh plan
0 14 * * 3  /srv/agency-content/run-weekly.sh schedule
0 15 * * 5  /srv/agency-content/run-weekly.sh report
```

Esto supone que el servidor MCP de Shager está registrado en el `.mcp.json` del proyecto, con la clave leída de `SHAGER_API_KEY`, como se muestra en [cómo conectar Shager a Claude Code](/en/blog/connect-shager-to-claude-code). La salida JSON te da el id de la sesión y el resumen final, que es lo que reenviarías al canal del equipo.

## ¿Qué sigue necesitando a una persona cada semana?

Tres cosas, y la rutina está diseñada en torno a ellas, no en contra.

1. Escribir el archivo de plan. Los temas, las ofertas y los horarios son estrategia.
2. Leer el resumen del miércoles. Enumera lo que no se aprobó, los canales omitidos y los rechazos 422. Cinco minutos.
3. Enviar el informe del viernes con contexto. Los clics por cuenta son un dato; lo que significan para el cliente es una conversación. Recuérdales a los clientes que los clics en enlaces no son leads, y remítelos a la [atribución de leads por cuenta](/en/blog/utm-per-account-lead-attribution) si quieren cerrar esa brecha en su CRM.

## Preguntas frecuentes

### ¿Y si un cliente aprueba después del miércoles?

Vuelve a ejecutar `/shager-weekly schedule`, a mano o con una segunda línea de cron el jueves. Ese modo solo programa publicaciones `APPROVED` que todavía no estén programadas y se niega a usar horas pasadas, así que ejecutarlo dos veces no tiene riesgo.

### ¿La rutina puede conectar cuentas nuevas cuando un cliente suma una sede?

No, por diseño. `create_connect_link` queda fuera de las herramientas permitidas porque conectar cuentas involucra al cliente y debería ser una acción humana deliberada. Cuando se suma una sede, el responsable de la cuenta envía un enlace de conexión y agrega el canal nuevo al grupo correcto; la siguiente ejecución lo toma automáticamente.

### ¿Funciona con Codex o Cursor en lugar de Claude Code?

Los archivos de plan, los modos y las salvaguardas se trasladan tal cual, porque las herramientas de Shager son las mismas en cualquier cliente MCP. El frontmatter de `SKILL.md` y la invocación con `claude -p` son propios de Claude Code; en otros clientes guardarías las instrucciones como un archivo de prompt y lo ejecutarías con la automatización de ese cliente.

## Siguiente paso

La rutina se ocupa de la semana; el [pipeline de contenido de punta a punta con agentes](/en/blog/agent-content-pipeline-end-to-end) muestra la cadena completa que la rodea, desde el brief del cliente, pasando por los archivos y textos generados, hasta las publicaciones y los clics medidos, con cada llamada a Shager en orden.

---
Source: https://shager.ai/es/blog/skill-weekly-distribution-routine
