# Une routine de diffusion hebdomadaire en skill Claude : brouillons le lundi, validation client, rapport de clics le vendredi

_2026-10-06 · Une skill Claude Code qui fait tourner la semaine d'une agence dans Shager : brouillons, validations client, programmation du validé et rapport de clics._

Une routine de diffusion hebdomadaire est une skill qui enchaîne les trois mêmes tâches chaque semaine : le lundi, elle transforme le plan éditorial de chaque client en brouillons Shager, avec une légende par compte, puis les envoie en validation ; en milieu de semaine, elle programme tout ce qui a été validé ; le vendredi, elle récupère les clics par compte et rédige le rapport. Dans Claude Code, vous la lancez avec `/shager-weekly plan` ou `/shager-weekly report`, ou sans interface depuis un planificateur avec `claude -p`. Les points de contrôle humains se placent entre la rédaction et la programmation : c'est là qu'ils coûtent le moins et qu'ils interceptent le plus.

Cet article prolonge [la skill Shager de base](/fr/blog/build-a-claude-skill-for-shager). Ici, l'accent est mis sur la routine : les entrées, les modes, les garde-fous et la façon de la faire tourner sans personne au clavier.

## À quoi ressemble concrètement une semaine ?

Prenons une agence avec huit clients et environ 150 comptes connectés. Voici une semaine qui fonctionne.

| Quand | Mode | Ce que fait la skill | Rôle humain |
|---|---|---|---|
| Lundi 9 h | `plan` | Lit le plan de chaque client, importe les médias, crée les brouillons, demande la validation | Aucun pendant l'exécution |
| Du lundi au mercredi | | Les clients valident ou demandent des modifications via les liens de validation | Relecture par les clients |
| Mercredi 14 h | `schedule` | Programme chaque publication validée à l'horaire prévu | Le chargé de compte jette un œil au résumé |
| Vendredi 15 h | `report` | Récupère les clics par compte et par publication, rédige un rapport par client | Le chargé de compte l'envoie |

La routine n'invente jamais les sujets de la semaine. Elle travaille à partir d'un fichier de plan rédigé par une personne, car la stratégie est le métier de l'agence. Ce qu'elle supprime, c'est la partie mécanique : quarante variantes de légende, les liens suivis, le choix des formats, les relances.

## À quoi ressemble le fichier de plan ?

Un fichier Markdown par client et par semaine, dans un dépôt que la skill peut lire :

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

Du texte brut que la skill analyse, et un fichier que n'importe quel chargé de compte peut modifier sans apprendre un nouvel outil.

## Le 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.
```

### La raison d'être de chaque garde-fou

`disable-model-invocation: true` signifie que Claude ne lance jamais cette routine de sa propre initiative parce qu'une conversation a mentionné « les publications de cette semaine ». D'après la [documentation des skills de Claude Code](https://code.claude.com/docs/en/skills), ce champ empêche le chargement automatique : la routine ne tourne que lorsque quelqu'un, ou quelque chose, tape la commande.

La liste `allowed-tools` couvre exactement le besoin, rien de plus. Pas de `cancel_post`, pas de `create_connect_link`, pas de `create_workspace`. Une routine qui tourne sans interface ne doit pas pouvoir faire ce qu'aucune personne n'a prévu.

La programmation ne touche que les publications au statut `APPROVED`, et ce statut n'existe qu'une fois que le client a validé via son lien. Si un client ne valide jamais, la publication ne part tout simplement pas, et le résumé du mercredi le signale. Pourquoi placer la validation précisément à cet endroit ? La réponse se trouve dans [le circuit de validation client pour les agences](/fr/blog/client-approval-workflow-for-agencies).

## Quelle clé la routine doit-elle utiliser ?

C'est la décision qui définit le degré de confiance que vous accordez à la routine.

| Configuration | Portées de la clé | Résultat |
|---|---|---|
| Brouillons uniquement | `read`, `write` | `plan` et `report` tournent ; une personne programme dans Shager |
| Avec validation | `read`, `write`, `publish` et validation requise sur chaque espace | La routine ne programme que ce que les clients ont validé |
| Pilote automatique complet | `read`, `write`, `publish`, sans validation | Uniquement pour du contenu récurrent à faible risque que vous publieriez de toute façon sans relecture |

C'est la deuxième ligne que nous recommandons à la plupart des agences. La portée `publish` est accordée à une seule clé, créée pour cette seule routine sur https://app.shager.ai/dashboard/agents : le journal d'audit y montre ainsi chaque appel de la routine, et rien d'autre. Si quelque chose cloche, vous révoquez cette clé et toutes les autres intégrations continuent de fonctionner.

## Comment la faire tourner sans ouvrir de terminal ?

Le mode non interactif de Claude Code exécute une skill depuis un script. La [documentation du mode headless](https://code.claude.com/docs/en/headless) indique que les skills invoquées par l'utilisateur fonctionnent en mode `-p` dès que vous incluez `/skill-name` dans le prompt, et que `--allowedTools` pré-approuve des outils selon la syntaxe des règles d'autorisation. Elle décrit aussi `--permission-mode dontAsk`, qui refuse tout ce qui déclencherait sinon une demande de confirmation : un appel d'outil inattendu échoue au lieu de rester bloqué.

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

Et la crontab, à l'heure locale du serveur :

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

Cela suppose que le serveur MCP de Shager est déclaré dans le `.mcp.json` du projet, avec la clé lue depuis `SHAGER_API_KEY`, comme le montre [connecter Shager à Claude Code](/fr/blog/connect-shager-to-claude-code). La sortie JSON vous donne l'id de session et le résumé final, que vous transférerez au canal de l'équipe.

## Qu'est-ce qui demande encore une personne chaque semaine ?

Trois choses, et la routine est conçue autour d'elles, pas contre elles.

1. Rédiger le fichier de plan. Les sujets, les offres et le calendrier relèvent de la stratégie.
2. Lire le résumé du mercredi. Il liste tout ce qui n'a pas été validé, les canaux ignorés et les rejets 422. Cinq minutes.
3. Envoyer le rapport du vendredi avec du contexte. Les clics par compte sont un fait ; ce qu'ils signifient pour le client, c'est une conversation. Rappelez aux clients que des clics sur un lien ne sont pas des prospects, et orientez-les vers [l'attribution des prospects par compte](/fr/blog/utm-per-account-lead-attribution) s'ils veulent combler cet écart dans leur CRM.

## FAQ

### Et si un client valide après mercredi ?

Relancez `/shager-weekly schedule`, à la main ou via une deuxième ligne cron le jeudi. Ce mode ne programme que les publications `APPROVED` qui ne le sont pas déjà et refuse les horaires passés : le lancer deux fois ne pose aucun problème.

### La routine peut-elle connecter de nouveaux comptes quand un client ouvre un nouvel établissement ?

Non, et c'est voulu. `create_connect_link` ne figure pas dans les outils autorisés, car connecter des comptes implique le client et doit rester une action humaine délibérée. Quand un établissement s'ajoute, le chargé de compte envoie un lien de connexion et ajoute le nouveau canal au bon groupe ; l'exécution suivante le prend en compte automatiquement.

### Est-ce que ça marche avec Codex ou Cursor au lieu de Claude Code ?

Les fichiers de plan, les modes et les garde-fous se transposent directement, puisque les outils Shager sont les mêmes dans tous les clients MCP. Le frontmatter du `SKILL.md` et l'appel `claude -p` sont propres à Claude Code ; ailleurs, vous garderez les instructions dans un fichier de prompt et le piloterez avec l'automatisation propre à ce client.

## Prochaine étape

La routine gère la semaine ; [la chaîne de contenu de bout en bout avec un agent](/fr/blog/agent-content-pipeline-end-to-end) montre tout ce qui l'entoure, du brief client jusqu'aux publications en ligne et aux clics mesurés, en passant par les médias et les légendes générés, avec chaque appel Shager dans l'ordre.

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