Chat in-app

Le support dans votre application, sans SDK

Une URL dans une WebView. Aucun paquet à installer, aucun build à casser, et chaque conversation arrive dans la même boîte de réception que le reste de votre support.

01 · De quoi s'agit-il
En résumé

Le chat in-app dans inrelay est une page de chat hébergée à l'adresse de votre propre centre d'aide. Orientez une WebView vers /chat et votre application iOS, Android ou React Native dispose du chat en direct, des réponses IA et de vos articles d'aide intégrés — sans SDK, sans dépendance et sans nouvelle version sur les stores pour modifier quoi que ce soit.

La page est le même chat que celui utilisé par les visiteurs de votre site web, affichée en plein écran au lieu d'une bulle. Cela signifie qu'elle hérite de tout ce que vous avez déjà configuré : votre marque et votre couleur d'accentuation, vos heures d'ouverture, le chatbot IA et sa base de connaissances, le formulaire de contact, ainsi que la boîte de réception dans laquelle travaille déjà votre équipe. L'activer n'est pas un grand projet — l'adresse existe dès que le chat en direct est activé.

C'est inclus dans tous les forfaits. Aucun module mobile payant, aucun frais par conversation, et rien à acheter avant d'essayer.

Looping animation: one hosted address, help.acme.com/chat, fans out into a chat bubble on a website and a full-screen chat inside an app, and ends marked already live.
02 · Votre adresse

Une URL, trois détails optionnels

Votre page de chat se trouve à l'adresse /chat sur votre centre d'aide — votre domaine personnalisé si vous en avez connecté un, ou l'adresse .inrelay.support que vous avez réservée. Vous trouverez l'URL exacte, prête à être copiée, dans Paramètres → Widget d'aide → Dans votre application mobile.

https://support.yourbrand.com/chat

Cette URL suffit à elle seule pour une intégration complète : un visiteur peut discuter de manière anonyme, et la conversation le suit entre chaque ouverture de l'application sur cet appareil. Si votre application connaît l'identité de l'utilisateur, vous pouvez la transmettre avec trois paramètres d'URL — tous optionnels, tous sans risque en cas d'omission :

  • token_id — votre propre identifiant opaque et aléatoire pour cet utilisateur. C'est ce qui restaure sa conversation sur un nouvel appareil ou après une réinstallation.
  • email — pour qu'une réponse puisse leur parvenir lorsque l'application est fermée.
  • name — pour que votre équipe sache qui elle aide.
https://support.yourbrand.com/chat?token_id=8f2c…&email=ada%40example.com&name=Ada%20Lovelace

Encodez les valeurs pour l'URL. Sauf si vous activez l'identité vérifiée (ci-dessous), traitez token_id comme un secret : quiconque en détient un peut reprendre cette conversation. Générez donc des valeurs aléatoires longues — jamais une adresse e-mail, un nom d'utilisateur ou un identifiant séquentiel.

03 · Les recettes

Trois façons de l'ouvrir

Chacun de ces exemples constitue l'intégralité de l'intégration. Les deux paramètres essentiels sur chaque plateforme sont JavaScript et le stockage DOM — c'est le stockage DOM qui conserve la conversation d'un visiteur entre deux ouvertures de l'application.

iOS — WKWebView

import UIKit
import WebKit

final class SupportViewController: UIViewController {
  private let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())

  override func viewDidLoad() {
    super.viewDidLoad()
    webView.frame = view.bounds
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    webView.scrollView.bounces = false
    view.addSubview(webView)

    var url = URLComponents(string: "https://support.yourbrand.com/chat")!
    url.queryItems = [
      URLQueryItem(name: "token_id", value: user.supportToken),
      URLQueryItem(name: "email", value: user.email),
      URLQueryItem(name: "name", value: user.fullName)
    ]
    webView.load(URLRequest(url: url.url!))
  }
}

Android — WebView

class SupportActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val webView = WebView(this)
    setContentView(webView)

    webView.settings.javaScriptEnabled = true
    webView.settings.domStorageEnabled = true   // keeps the conversation across launches
    webView.webViewClient = WebViewClient()     // keep navigation inside the WebView

    val url = Uri.parse("https://support.yourbrand.com/chat")
      .buildUpon()
      .appendQueryParameter("token_id", user.supportToken)
      .appendQueryParameter("email", user.email)
      .appendQueryParameter("name", user.fullName)
      .build()
    webView.loadUrl(url.toString())
  }
}

React Native — react-native-webview

import { SafeAreaView } from 'react-native'
import { WebView } from 'react-native-webview'

const params = new URLSearchParams({
  token_id: user.supportToken,
  email: user.email,
  name: user.fullName
})

export function SupportScreen() {
  return (
    <SafeAreaView style={{ flex: 1 }}>
      <WebView
        source={{ uri: `https://support.yourbrand.com/chat?${params}` }}
        javaScriptEnabled
        domStorageEnabled
        originWhitelist={['https://support.yourbrand.com/*']}
      />
    </SafeAreaView>
  )
}

Donnez tout l'écran à la WebView et laissez-la gérer son propre défilement — la page est déjà dimensionnée pour un téléphone, y compris la zone de sécurité en bas.

Restreignez la liste d'autorisations à votre propre adresse, avec la barre oblique finale. Un motif comme https://* permet à n'importe quel site de s'afficher dans votre écran de support, et un motif sans barre oblique — https://support.votremarque.com* — correspond aussi à support.votremarque.com.example.net. Si vous vérifiez également l'URL vous-même, comparez l'origine analysée plutôt que de tester un préfixe.

04 · Identité vérifiée

Prouvez qu'il s'agit bien d'eux

Optionnel, désactivé par défaut, et activable d'un simple basculeur plutôt qu'une migration : chaque espace de travail dispose déjà d'un secret de signature qui l'attend dans Paramètres → Widget d'aide.

The In your mobile app settings block with the verification toggle

Lorsque la vérification est active, les informations transmises par votre application doivent arriver avec une signature générée par votre serveur. Tout élément non signé — ou signé pour un autre utilisateur — est ignoré : le chat s'ouvre toujours, simplement de manière anonyme. Il n'y a jamais d'erreur bloquante, car un écran de support qui ne charge pas est pire qu'un écran qui ne connaît pas votre nom.

Signez exactement cette chaîne, en joignant les trois valeurs par des sauts de ligne et en utilisant une chaîne vide pour les éléments omis :

token_id + "\n" + email + "\n" + name
// on your server, never in the app binary
import { createHmac } from 'node:crypto'

const payload = [tokenId, email ?? '', name ?? ''].join('\n')
const signature = createHmac('sha256', INRELAY_EMBED_SECRET)
  .update(payload)
  .digest('hex')

Ajoutez-la sous la forme &signature=…. Signez les valeurs exactement telles que vous les insérez dans l'URL — sans supprimer d'espaces ni passer en minuscules — et signez les trois : une signature ne couvrant que le jeton ne validera pas une requête dont l'e-mail diffère. Les valeurs contenant des sauts de ligne sont refusées.

  • Le secret réside sur votre serveur et est lu par le nôtre. Il ne doit jamais figurer dans le binaire de votre application, où n'importe qui pourrait l'extraire.
  • Récupérez la signature depuis votre propre point de terminaison authentifié lorsque l'utilisateur ouvre le support, puis construisez l'URL.
  • Activez la vérification avant le lancement si vous prévoyez de l'utiliser. La rajouter plus tard, alors que vos utilisateurs discutent déjà, nécessite de réémettre chaque jeton.
05 · Lorsque l'application est fermée

Les réponses leur parviennent par e-mail

Un utilisateur pose une question, ferme votre application, et votre équipe répond dix minutes plus tard. La réponse est envoyée par e-mail à l'adresse associée à la conversation — issue des paramètres d'identité de l'application ou demandée par le chat — et lorsqu'il rouvre le support, tout le fil de discussion est toujours là.

Soyons clairs sur le fonctionnement : cette version ne contient pas de notification push in-app. Aucun SDK ne permet d'enregistrer un jeton d'appareil, une réponse ne peut donc pas mettre à jour le badge de votre application. L'e-mail est le canal de distribution, et un client ayant laissé son adresse reçoit toujours une réponse.

  • La conversation persiste sur l'appareil et suit un token_id vers un nouvel appareil.
  • Tout ce que voit le visiteur est le chat fourni : réponses de l'IA, vos articles d'aide, vos heures d'ouverture.
  • Les notifications push in-app ne font pas partie de cette version — les réponses arrivent par e-mail lorsque l'application est fermée.
  • Aucune interface de chat native ni SDK de plateforme n'est fourni. Il s'agit délibérément d'une page hébergée dans une WebView.
06 · Configuration

En ligne en quatre étapes

Activez le chat en direct

Paramètres → Widget d'aide. Si le widget de votre site web permet déjà de discuter, cette étape est terminée.

Copiez l'URL de votre chat

Le bloc “Dans votre application mobile” le contient, avec un bouton de copie. Réclamez d'abord une adresse de centre d'aide si vous en voulez une personnalisée.

Ouvrez-la dans une WebView

Collez l'un des extraits ci-dessus dans votre écran de support. Activez JavaScript et le stockage DOM.

Ajoutez l'identification, si vous le souhaitez

Transmettez un jeton, un e-mail et un nom — puis activez la vérification par signature dès que vous êtes prêt.

07 · Dans le même esprit

Tout le reste de la boîte de réception.

Le chat dans l'application est une porte d'entrée vers la gamme de fonctionnalités inrelay — voici celles sur lesquelles il s'appuie.

Commencer aujourd'hui

Votre application, support inclus.

Gratuit pour démarrer avec votre propre boîte de réception — toutes les fonctionnalités, sans carte bancaire, jamais par utilisateur.

Vos questions, nos réponses.

Dois-je ajouter une dépendance à mon application ?
Non. Il n'y a pas de paquet inrelay pour iOS, Android, React Native ou Flutter — vous ouvrez simplement une URL dans la WebView déjà intégrée à votre plateforme. Rien à mettre à jour, et aucune version de notre côté à aligner sur la vôtre.
Que se passe-t-il si je ne passe aucun paramètre ?
Le chat fonctionne. Le visiteur reste anonyme, sa conversation est conservée sur cet appareil, et le chat demande lui-même un e-mail si votre formulaire de prospection est activé — ce qui permet à votre réponse de le joindre.
Quelqu'un d'autre peut-il lire une conversation s'il devine un jeton ?
Lorsque la vérification est désactivée, toute personne possédant un token_id valide peut reprendre cette conversation — c'est pourquoi les jetons doivent être longs et aléatoires, et pourquoi l'option de vérification existe. Lorsqu'elle est activée, un jeton non signé est totalement ignoré.
Le client reçoit-il une notification push lorsque nous répondons ?
Pas dans cette version. Les réponses leur parviennent par e-mail lorsque l'application est fermée, et la conversation les attend lorsqu'ils rouvrent le support. Les notifications push in-app nécessiteraient un SDK, ce que cette approche évite délibérément.
Le chat dans l'application est-il inclus dans tous les forfaits ?
Oui. C'est le même chat en direct que vous utilisez déjà, proposé sous forme de page — il n'y a pas d'option mobile payante ni de frais par conversation.

Prenez le contrôle de vos messages.

Offrez à vos clients des réponses plus rapides et à votre équipe ses soirées.

Sur ordinateur et mobile. Gratuit en solo.