> For the complete documentation index, see [llms.txt](https://help.meltingspot.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.meltingspot.io/manage-spot/embed/multi-domaines.md).

# Multi-domaines et redirection des membres

Votre Spot est intégré à plusieurs endroits ? Déclarez pour chaque membre les URLs d'embed vers lesquelles il doit être redirigé.

Lorsque votre Spot est intégré (embed) à plusieurs endroits, par exemple dans votre produit et sur votre site internet, ou dans un produit qui a une URL par client (`company1.acme.com`, `company2.acme.com`…), MeltingSpot doit savoir **vers quelle page renvoyer chaque membre** lorsqu'il clique sur un lien : email de notification, contenu d'un widget, lien court…

Cette page explique comment déclarer ces URLs pour chaque membre, et comment MeltingSpot choisit l'URL finale.

{% hint style="info" %}
**Prérequis** : l'embed doit être activé avec une base URL, et les [paramètres de redirection](/manage-spot/embed.md#parametres-de-redirection) doivent être réglés sur `Tous les utilisateurs` ou `Uniquement les utilisateurs SSO`. Avec `Pas de redirection`, les URLs déclarées pour vos membres sont ignorées.
{% endhint %}

## Principes

### Base URL du Spot et URLs d'embed des membres

* **La base URL du Spot** est unique. Elle est définie dans l'onglet `Embed` des paramètres de votre Spot et sert d'URL par défaut pour tous les membres.
* **Les URLs d'embed d'un membre** sont propres à chaque membre. Il s'agit d'une liste d'URLs, chacune identifiée par une **clé** :

```json
{
  "default": "https://company1.acme.com/academy",
  "website": "https://www.acme.com/communaute"
}
```

Les clés n'existent qu'au niveau de chaque membre : il n'y a pas de liste de clés à déclarer au niveau du Spot. Une même clé peut donc pointer vers une URL différente selon le membre (par exemple `default` vers `company1.acme.com` pour un membre, et vers `company2.acme.com` pour un autre).

### La clé `default`

`default` est la **seule clé réservée**. Elle est utilisée :

* lorsqu'aucune clé n'est demandée, ce qui est le cas de **tous les emails de notification** ;
* lorsque la clé demandée n'existe pas pour le membre.

{% hint style="success" %}
Nous vous recommandons de toujours définir une URL `default` pour chaque membre auquel vous déclarez des URLs.
{% endhint %}

### Les clés personnalisées

Vous choisissez librement le nom des autres clés (`company1`, `website`, `customContext`…). Elles sont **sensibles à la casse** : `Website` et `website` sont deux clés différentes.

Une clé personnalisée n'est utilisée que lorsqu'elle est transmise via le paramètre `domain` d'un widget, de l'embed ou du Coach (voir [Choisir la clé](#choisir-la-cle-le-parametre-domain)).

### Format des URLs

Chaque URL doit être l'URL complète, au format `https://`, **de la page qui héberge l'embed** de votre Spot, et non uniquement le domaine. C'est la même règle que pour la base URL du Spot : les scripts de l'embed doivent être installés sur cette page.

Pour ouvrir la bonne ressource, MeltingSpot ajoute son chemin dans le paramètre `ms_url` de l'URL. Le script de l'embed lit ce paramètre et affiche la page correspondante. Les autres paramètres déjà présents dans l'URL sont conservés.

```
URL du membre : https://company1.acme.com/academy
Live ciblé    : /lives/<liveId>
URL finale    : https://company1.acme.com/academy?ms_url=%2Flives%2F<liveId>
```

{% hint style="warning" %}
MeltingSpot ne vérifie pas le format des URLs que vous déclarez. Si l'URL retenue pour un membre n'est pas une URL valide, il est redirigé vers la version classique du Spot (`https://go.meltingspot.io/spot/{spotId}`).
{% endhint %}

## Déclarer les URLs d'un membre

Deux moyens sont disponibles. Ils n'ont pas le même comportement :

|                   | Token JWT (SSO)                                             | API                                           |
| ----------------- | ----------------------------------------------------------- | --------------------------------------------- |
| Membres concernés | Membres qui se connectent via SSO                           | Tous les membres                              |
| Moment            | À chaque connexion SSO                                      | À tout moment                                 |
| Comportement      | **Fusion** : ajout, modification ou suppression clé par clé | **Remplacement** de toutes les URLs du membre |

{% hint style="info" %}
Il n'est pas possible pour les Admins de visualiser ou de modifier ces URLs depuis la table audience de la plateforme. Utilisez l'API pour les consulter.
{% endhint %}

### Via le token JWT (SSO)

Ajoutez le paramètre `domains` au token SSO de l'utilisateur (voir [Générer un token SSO](/manage-spot/sso.md#generer-un-token-sso)) :

* `set` : objet `{ clé: URL }` des URLs à ajouter ou à remplacer ;
* `unset` : tableau des clés à supprimer.

```javascript
const userData = {
  sub: user.id,
  firstName: user.firstName,
  lastName: user.lastName,
  email: user.email,
  domains: {
    set: {
      default: 'https://company1.acme.com/academy',
      website: 'https://www.acme.com/communaute',
    },
    unset: ['oldWebsite'],
  },
};
```

Règles appliquées à chaque connexion SSO, que le membre soit nouveau ou existant :

* les clés de `set` sont ajoutées, ou remplacées si elles existent déjà ;
* les clés de `unset` sont ensuite supprimées : une clé présente à la fois dans `set` et dans `unset` est donc **supprimée** ;
* les clés déjà enregistrées qui ne figurent ni dans `set` ni dans `unset` sont **conservées** ;
* si le paramètre `domains` est absent, les URLs du membre ne changent pas.

Par exemple, avec le token ci-dessus :

```
Avant : { "default": "https://app.acme.com/academy", "oldWebsite": "https://old.acme.com", "partner": "https://partner.acme.com/academy" }
Après : { "default": "https://company1.acme.com/academy", "website": "https://www.acme.com/communaute", "partner": "https://partner.acme.com/academy" }
```

{% hint style="warning" %}
Limites : 50 clés maximum dans `set`, 255 caractères maximum par URL, 50 clés maximum dans `unset`. Si le paramètre `domains` ne respecte pas ce format, **le token entier est refusé** et la connexion échoue.
{% endhint %}

### Via l'API

Utilisez l'endpoint de modification d'un membre avec le champ `embedBaseUrls` :

```bash
curl -X PUT "https://openapi.meltingspot.io/v1/spotMembers/{spotMemberId}" \
  -H "Authorization: <votre clé API>" \
  -H "Content-Type: application/json" \
  -d '{
    "embedBaseUrls": {
      "default": "https://company1.acme.com/academy",
      "website": "https://www.acme.com/communaute"
    }
  }'
```

{% hint style="warning" %}
**L'API remplace toutes les URLs du membre** : les clés absentes du body sont supprimées. Pour ajouter une clé sans perdre les autres, lisez d'abord les URLs actuelles du membre, puis renvoyez l'objet complet.
{% endhint %}

* Si le champ `embedBaseUrls` est omis, les URLs du membre ne changent pas.
* Si vous envoyez `{}` ou `null`, toutes les URLs du membre sont supprimées.
* Si le champ n'est pas un objet dont toutes les valeurs sont du texte, l'API répond une erreur `400`.

Pour consulter les URLs d'un membre, utilisez `GET https://openapi.meltingspot.io/v1/spotMembers/{spotMemberId}` : la réponse contient le champ `embedBaseUrls` (`{}` si le membre n'en a aucune).

## Choisir la clé : le paramètre `domain`

Les clés personnalisées ne sont utilisées que si le paramètre `domain` est transmis. Sinon, c'est la clé `default` qui s'applique.

| Source                                                      | Liens concernés                                                |
| ----------------------------------------------------------- | -------------------------------------------------------------- |
| Script d'un [widget](/manage-spot/widget/implementation.md) | Clic sur un contenu du widget, liens partagés depuis le widget |
| Script de l'embed                                           | Liens générés depuis l'embed (boutons de partage…)             |
| SDK Coach                                                   | Liens des contenus et des widgets affichés par le Coach        |
| Lien court généré depuis l'une de ces sources               | La clé est mémorisée dans le lien court                        |
| Emails de notification                                      | Aucune clé : la clé `default` s'applique                       |

Dans chacun de ces scripts, ajoutez la clé à utiliser :

```javascript
domain: 'website',
```

{% hint style="success" %}
Usage typique : sur chaque page qui intègre un widget ou l'embed, indiquez la clé qui correspond à cette page. Par exemple `domain: 'website'` sur votre site internet : un membre qui clique sur un contenu restera sur votre site, tandis que ses emails de notification le mèneront vers son URL `default`.
{% endhint %}

## Algorithme de redirection

Pour chaque lien, MeltingSpot calcule l'URL de destination du membre de la façon suivante :

1. Si l'embed est désactivé, si la base URL est vide, ou si la redirection est réglée sur `Pas de redirection` : le membre est envoyé vers `https://go.meltingspot.io/spot/{spotId}/…`.
2. Si la redirection est réglée sur `Uniquement les utilisateurs SSO` et que le membre ne s'est **jamais connecté via le SSO JWT** : il est envoyé vers `https://go.meltingspot.io/spot/{spotId}/…`.
3. Sinon, MeltingSpot retient la première URL disponible, dans cet ordre :
   1. l'URL du membre pour la clé transmise via `domain` ;
   2. l'URL du membre pour la clé `default` ;
   3. la base URL du Spot.
4. MeltingSpot ajoute le chemin de la ressource dans le paramètre `ms_url` de l'URL retenue. Si cette URL n'est pas valide, le membre est envoyé vers `https://go.meltingspot.io/spot/{spotId}/…`.

{% hint style="info" %}

* Une URL vide (`""`) est considérée comme absente.
* Une modification des URLs d'un membre ou des paramètres d'embed peut mettre jusqu'à une minute à être prise en compte.
  {% endhint %}

### Cas des liens courts

Si les [liens courts](/manage-spot/customize-your-spot.md#liens-courts) sont activés, les emails et les boutons `Partager` produisent un lien `https://mltngs.pt/s/…`. Ce lien est **le même pour tous les membres** : la destination est calculée **au moment du clic**, pour le membre connecté, avec l'algorithme ci-dessus.

* Un lien court généré depuis un widget, l'embed ou le Coach configuré avec un paramètre `domain` mémorise cette clé. Elle s'applique à chaque membre qui clique, avec repli sur sa clé `default` s'il ne l'a pas.
* Les autres liens courts, dont ceux des emails, n'ont pas de clé : la clé `default` s'applique.
* Si le membre n'est pas connecté, il passe par la page de connexion avant d'être redirigé.

Si les liens courts sont désactivés, le lien copié depuis un bouton `Partager` est l'URL de la page sur laquelle vous vous trouvez : tous les membres qui cliqueront dessus arriveront sur ce même embed.

## Exemple complet

Configuration du Spot : base URL `https://www.acme.com/academy`, redirection réglée sur `Tous les utilisateurs`.

URLs d'embed des membres :

* **Alice** : `{ "default": "https://company1.acme.com/academy", "website": "https://www.acme.com/communaute" }`
* **Bob** : `{ "website": "https://www.acme.com/communaute" }`
* **Chloé** : aucune URL

Redirection vers un Live (`/lives/<liveId>`) :

| Situation                                                    | Alice                                                                          | Bob                                                                          | Chloé                                                     |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------- | --------------------------------------------------------- |
| Email de notification                                        | `https://company1.acme.com/academy?ms_url=%2Flives%2F<liveId>`                 | `https://www.acme.com/academy?ms_url=%2Flives%2F<liveId>` (base URL du Spot) | `https://www.acme.com/academy?ms_url=%2Flives%2F<liveId>` |
| Clic dans un widget avec `domain: 'website'`                 | `https://www.acme.com/communaute?ms_url=%2Flives%2F<liveId>`                   | `https://www.acme.com/communaute?ms_url=%2Flives%2F<liveId>`                 | `https://www.acme.com/academy?ms_url=%2Flives%2F<liveId>` |
| Clic dans un widget avec `domain: 'company2'` (clé inconnue) | `https://company1.acme.com/academy?ms_url=%2Flives%2F<liveId>` (clé `default`) | `https://www.acme.com/academy?ms_url=%2Flives%2F<liveId>` (base URL du Spot) | `https://www.acme.com/academy?ms_url=%2Flives%2F<liveId>` |

Avec la redirection réglée sur `Pas de redirection`, les trois membres arrivent sur `https://go.meltingspot.io/spot/{spotId}/lives/<liveId>` dans tous les cas.

## Bon à savoir

* **Mon membre arrive sur go.meltingspot.io alors que je lui ai déclaré des URLs. Pourquoi ?**\
  Vérifiez que la redirection n'est pas réglée sur `Pas de redirection`. En mode `Uniquement les utilisateurs SSO`, vérifiez que le membre s'est déjà connecté via le SSO JWT. Vérifiez enfin que l'URL retenue est une URL valide.
* **Que se passe-t-il si la clé transmise n'existe pas pour le membre ?**\
  Le membre est redirigé vers son URL `default`, ou vers la base URL du Spot s'il n'en a pas.
* **Que se passe-t-il pour un membre à qui je n'ai déclaré aucune URL ?**\
  Il est redirigé vers la base URL du Spot (ou vers `go.meltingspot.io` en mode `Uniquement les utilisateurs SSO` s'il ne s'est jamais connecté via le SSO JWT).
* **Le token JWT peut-il supprimer toutes les URLs d'un membre ?**\
  Oui, en listant toutes ses clés dans `unset`. Pour repartir d'une liste vide, vous pouvez aussi envoyer `"embedBaseUrls": {}` via l'API.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://help.meltingspot.io/manage-spot/embed/multi-domaines.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
