# La routine settimanale di distribuzione come skill di Claude: bozze il lunedì, approvazioni dei clienti, report dei clic il venerdì

_2026-10-06 · Una skill di Claude Code per la settimana di un'agenzia in Shager: bozze dai piani, approvazioni, programmazione solo dell'approvato e report del venerdì._

Una routine settimanale di distribuzione è una skill che ripete ogni settimana gli stessi tre lavori: il lunedì trasforma il piano editoriale di ogni cliente in bozze Shager con testi diversi per account e le invia in approvazione; a metà settimana programma tutto ciò che è stato approvato; il venerdì raccoglie i clic per account e scrive il report. In Claude Code la avvii con `/shager-weekly plan` o `/shager-weekly report`, oppure senza interfaccia da uno scheduler con `claude -p`. I controlli umani stanno tra la stesura e la programmazione, dove costano meno e intercettano di più.

L'articolo parte dalla [skill di base per Shager](/en/blog/build-a-claude-skill-for-shager). Qui ci concentriamo sulla routine: input, modalità, protezioni e come farla girare senza nessuno alla tastiera.

## Com'è fatta, in concreto, una settimana?

Prendiamo un'agenzia con otto clienti e circa 150 account collegati. Una settimana che funziona ha questo aspetto.

| Quando | Modalità | Cosa fa la skill | Ruolo umano |
|---|---|---|---|
| Lunedì 09:00 | `plan` | Legge il piano di ogni cliente, carica i media, crea le bozze, chiede l'approvazione | Nessuno durante l'esecuzione |
| Da lunedì a mercoledì | | I clienti approvano o chiedono modifiche tramite i link di approvazione | Revisione del cliente |
| Mercoledì 14:00 | `schedule` | Programma ogni post approvato all'orario previsto | L'account manager dà un'occhiata al riepilogo |
| Venerdì 15:00 | `report` | Raccoglie i clic per account e per post, scrive un report per cliente | L'account manager lo invia |

La routine non si inventa mai gli argomenti della settimana. Lavora su un file di piano scritto da una persona, perché la strategia è compito dell'agenzia. Quello che elimina è la parte meccanica: quaranta varianti di testo, link tracciati, scelta dei formati, solleciti.

## Com'è fatto il file di piano?

Un file Markdown per cliente e per settimana, in un repository che la skill può leggere:

```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
```

Testo semplice che la skill analizza, e un file che qualsiasi account manager può modificare senza imparare un nuovo strumento.

## Il file 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.
```

### A cosa serve ogni protezione

`disable-model-invocation: true` fa sì che Claude non avvii mai la routine di sua iniziativa solo perché in una conversazione si è parlato dei «post di questa settimana». Secondo la [documentazione delle skill di Claude Code](https://code.claude.com/docs/en/skills), quel campo impedisce il caricamento automatico, quindi la routine parte solo quando qualcuno, o qualcosa, digita il comando.

L'elenco `allowed-tools` contiene tutto ciò che serve al lavoro e niente di più. Niente `cancel_post`, niente `create_connect_link`, niente `create_workspace`. Una routine che gira senza supervisione non deve poter fare cose che nessuno ha previsto.

La programmazione tocca solo i post con stato `APPROVED`, e quello stato esiste solo dopo che il cliente ha approvato tramite il suo link. Se un cliente non approva mai, il post semplicemente non esce, e il riepilogo del mercoledì lo segnala. Perché l'approvazione stia proprio in questo punto è spiegato nel [flusso di approvazione dei clienti per le agenzie](/en/blog/client-approval-workflow-for-agencies).

## Quale chiave deve usare la routine?

È la scelta che stabilisce quanta fiducia dai alla routine.

| Configurazione | Ambiti della chiave | Risultato |
|---|---|---|
| Solo bozze | `read`, `write` | `plan` e `report` funzionano; la programmazione la fa una persona in Shager |
| Con approvazione obbligatoria | `read`, `write`, `publish` e approvazione richiesta in ogni workspace | La routine programma solo ciò che i clienti hanno approvato |
| Pilota automatico completo | `read`, `write`, `publish`, nessuna approvazione | Solo per contenuti ricorrenti a basso rischio che pubblicheresti comunque senza revisione |

La seconda riga è quella che consigliamo alla maggior parte delle agenzie. L'ambito `publish` va a una sola chiave, creata solo per questa routine su https://app.shager.ai/dashboard/agents, così il registro in quella pagina mostra tutte le chiamate fatte dalla routine e nient'altro. Se qualcosa non torna, revochi quella chiave e tutte le altre integrazioni continuano a funzionare.

## Come la fai girare senza aprire un terminale?

La modalità non interattiva di Claude Code esegue una skill da uno script. La [documentazione sulla modalità headless](https://code.claude.com/docs/en/headless) spiega che le skill invocate dall'utente funzionano in modalità `-p` se inserisci `/skill-name` nel prompt, e che `--allowedTools` pre-approva gli strumenti con la sintassi delle regole di permesso. Descrive anche `--permission-mode dontAsk`, che nega tutto ciò che altrimenti chiederebbe conferma: così una chiamata a uno strumento inatteso fallisce invece di restare in sospeso.

```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"
```

E il crontab, nell'ora locale del server:

```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
```

Tutto questo presuppone che il server MCP di Shager sia registrato nel `.mcp.json` del progetto con la chiave letta da `SHAGER_API_KEY`, come mostrato in [collegare Shager a Claude Code](/en/blog/connect-shager-to-claude-code). L'output JSON ti dà l'id della sessione e il riepilogo finale, cioè ciò che inoltreresti al canale del team.

## Cosa richiede ancora una persona ogni settimana?

Tre cose, e la routine è pensata attorno a loro, non contro di loro.

1. Scrivere il file di piano. Argomenti, offerte e tempi sono strategia.
2. Leggere il riepilogo del mercoledì. Elenca ciò che non è stato approvato, i canali saltati e i rifiuti 422. Cinque minuti.
3. Inviare il report del venerdì con un po' di contesto. I clic per account sono un dato; cosa significano per il cliente è una conversazione. Ricorda ai clienti che i clic sui link non sono contatti, e indirizzali all'[attribuzione dei contatti per account](/en/blog/utm-per-account-lead-attribution) se vogliono colmare questa lacuna nel loro CRM.

## Domande frequenti

### E se un cliente approva dopo mercoledì?

Esegui di nuovo `/shager-weekly schedule`, a mano o con una seconda riga di cron il giovedì. La modalità programma solo i post `APPROVED` non ancora programmati e rifiuta gli orari nel passato, quindi lanciarla due volte non crea problemi.

### La routine può collegare nuovi account quando un cliente apre una nuova sede?

No, per scelta. `create_connect_link` è escluso dagli strumenti consentiti perché collegare account coinvolge il cliente e deve essere un'azione umana consapevole. Quando si aggiunge una sede, l'account manager invia un link di collegamento e aggiunge il nuovo canale al gruppo giusto; l'esecuzione successiva lo include automaticamente.

### Funziona anche con Codex o Cursor al posto di Claude Code?

File di piano, modalità e protezioni si trasferiscono senza modifiche, perché gli strumenti di Shager sono gli stessi in ogni client MCP. Il frontmatter di `SKILL.md` e l'invocazione `claude -p` sono specifici di Claude Code; altrove terresti le istruzioni in un file di prompt e le eseguiresti con gli strumenti di automazione di quel client.

## Il prossimo passo

La routine gestisce la settimana; la [pipeline di contenuti completa con un agente](/en/blog/agent-content-pipeline-end-to-end) mostra tutta la catena intorno: dal brief del cliente ai media e ai testi generati, fino ai post pubblicati e ai clic misurati, con ogni chiamata a Shager nell'ordine giusto.

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