
# Actions de lien

La famille `link` crée un lien court suivi pendant l'exécution d'un workflow, et transmet son adresse à l'étape suivante. Le lien de campagne d'un produit qui n'existait pas au moment du déploiement ne peut pas être déclaré en configuration ; c'est ainsi qu'on le fabrique. Trois opérateurs.

| Opérateur | Props                                                               | Description                                                                 |
| --------- | ------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `create`  | `slug`, `destination`, `title?`, `tags?`, `notes?`, `utm?`          | Crée un lien et renvoie son adresse.                                        |
| `update`  | `slug`, plus l'un de `destination`, `title`, `tags`, `notes`, `utm` | Réoriente ou renomme un lien existant. Les props omises restent inchangées. |
| `delete`  | `slug`                                                              | Retire un lien. En douceur — l'historique des clics survit.                 |

```yaml
# Annoncer un produit dès sa création
- name: mint
  type: link
  operator: create
  props:
    slug: 'product-{{trigger.record.handle}}'
    destination: 'https://example.com/products/{{trigger.record.handle}}'
    title: '{{trigger.record.name}} — lancement'
    utm: { source: newsletter, medium: email, campaign: launch }

# L'envoyer
- name: announce
  type: email
  operator: send
  props:
    to: '{{trigger.record.owner_email}}'
    subject: 'Votre lien est en ligne'
    body: '{{steps.mint.result.shortUrl}}'
```

## L'adresse reçue par l'étape suivante

`create` et `update` renvoient quatre champs ; `delete` renvoie `slug` et `changed`.

| Champ         | Valeur                                                                    |
| ------------- | ------------------------------------------------------------------------- |
| `slug`        | Le slug résolu, après application des modèles.                            |
| `destination` | La cible actuelle du lien.                                                |
| `shortUrl`    | L'adresse absolue, par ex. `https://app.example.com/l/product-atlas`.     |
| `qrUrl`       | Le QR code absolu, par ex. `https://app.example.com/l/product-atlas.svg`. |

:::callout
**Les deux URL sont absolues, et c'est tout l'intérêt.** Elles sont fabriquées pour être collées dans un e-mail, un SMS ou un PDF, où un `/l/product-atlas` relatif à la racine n'a aucune page contre laquelle se résoudre et n'est qu'une chaîne morte. L'origine vient de `BASE_URL` si vous la définissez, sinon de l'adresse à laquelle le serveur s'est réellement lié, et seulement ensuite de `localhost` et du port. Définissez `BASE_URL` en production — c'est ce que portera le lien cliqué par un client.
:::

## Les modèles sont résolus d'abord, vérifiés ensuite

Chaque prop de type chaîne est un modèle. `slug`, `destination`, `title`, `notes` ainsi que chaque entrée de `tags` et `utm` sont interpolées contre le déclencheur et les étapes précédentes, et c'est la valeur **résolue** qui est validée.

C'est cet ordre qui rend l'action sûre à templater librement. Un slug est vérifié contre les règles de slug après que `{{trigger.record.handle}}` est devenu `atlas` : un enregistrement dont le handle vaut `Pas Un Slug !` fait donc échouer l'étape au lieu d'enregistrer une adresse que personne ne peut atteindre. Une destination est vérifiée de la même façon : la valeur résolue doit être un chemin relatif à la racine ou une URL `http(s)` absolue, si bien qu'une valeur `javascript:` ou `data:` arrivant par un champ d'enregistrement est refusée plutôt que publiée.

## Deux slugs qu'une automatisation ne peut jamais prendre

Les deux refus font échouer l'étape en nommant la raison : un run en échec indique donc lequel des deux s'est produit.

| Refus                     | Signification                                                             |
| ------------------------- | ------------------------------------------------------------------------- |
| `LINK_IS_CONFIG_DECLARED` | Le slug est déclaré dans `links[]`. Modifiez le fichier de configuration. |
| `LINK_SLUG_TAKEN`         | Un lien actif le détient déjà. Choisissez un autre slug.                  |

Le premier est le plus important. La configuration est la source de vérité pour les liens qu'elle déclare, et une automatisation capable d'en écraser un reviendrait à muter la configuration par une porte dérobée en forme de données. `update` et `delete` refusent un slug déclaré en configuration pour la même raison — ils ne peuvent toucher que des liens créés à l'exécution.

`LINK_SLUG_TAKEN` est un refus, pas un écrasement : créer deux fois le même slug conserve le premier lien. Réorienter une adresse déjà partagée, et réattribuer les clics qu'elle a déjà obtenus, n'est pas ce qu'un déclencheur répété doit faire par accident. Utilisez `update` quand la réorientation est bien votre intention.

Ajoutez `continueOnError: true` à l'étape si un refus ne doit pas arrêter le workflow.

## La suppression conserve l'historique

`delete` est une suppression en douceur. Le lien cesse de résoudre et répond `404`, et chaque clic déjà obtenu reste dans l'[analytique](/fr/docs/analytics), rapporté sous le même slug. Une suppression définitive détruirait l'historique de campagne en même temps que le lien.

Supprimer deux fois est un succès, pas un échec — le second appel rapporte `changed: false`, si bien qu'un workflow rejoué ne casse pas. Un slug retiré peut être recréé plus tard.

Il n'y a pas de renommage. Le slug est l'adresse que porte déjà chaque partage et la clé sous laquelle chaque clic est enregistré : le changer casserait les partages et orphelinerait l'historique d'un même geste. Créez plutôt un nouveau lien.

## Pages connexes

- [Liens courts](/fr/docs/short-links) — déclarer des liens en configuration, et leur résolution.
- [Vue d'ensemble des actions](/fr/docs/automation-actions-overview) — le modèle d'action et les props de base.
- [Analytique](/fr/docs/analytics) — où sont rapportés les clics obtenus par ces liens.
- [E-mails et notifications](/fr/docs/automation-email-actions) — l'étape qui envoie généralement l'adresse créée.
