En bref
Créez un compte Nexoply gratuit et copiez la clé de votre chatbot depuis la page Chatbot de votre tableau de bord. Avec l’App Router, ajoutez <Script src="https://nexoply.com/widget.js" data-chatbot={key} strategy="afterInteractive" /> depuis next/script dans <body> de app/layout.tsx ; avec le Pages Router, placez le même <Script> dans pages/_app.tsx. Aucun paquet npm à installer : le widget s’exécute uniquement dans le navigateur, garde la conversation pendant la navigation côté client et ne touche pas à votre balisage, donc aucun problème d’hydratation.
- Aucun paquet npm : une balise next/script, ou un petit composant <Chatbot /> qui l’enveloppe, dans votre layout racine (App Router) ou _app (Pages Router).
- Gardez la clé dans NEXT_PUBLIC_NEXOPLY_KEY ; elle est publique, ce n’est pas un secret et elle ne donne aucun accès à votre compte.
- Utilisez strategy="afterInteractive" (le choix par défaut) ou "lazyOnload" pour le charger après tout le reste.
- Compatible SSR : il s’exécute uniquement dans le navigateur, se monte dans un Shadow DOM sur document.body et survit aux changements de route.
- Ouvrez le chat depuis votre propre bouton avec window.dispatchEvent(new Event("nexoply:open-chat")).
Avant de commencer
- Un compte Nexoply. Inscrivez-vous gratuitement : l’offre gratuite comprend 50 conversations par mois, sans carte bancaire.
- Les informations de l’entreprise dans Nexoply : services et prix, FAQ, politiques, horaires d’ouverture et zones d’intervention. Le plus rapide est d’entrer l’adresse du site web et de laisser Nexoply importer les pages publiques (y compris celles rendues en JavaScript) ; vous examinez les suggestions et rien n’est ajouté avant que vous ne l’approuviez.
- La clé de votre chatbot. Dans le tableau de bord, ouvrez Chatbot (cliquez sur Créer le chatbot si ce n’est pas encore fait). Le code d’installation qui s’y trouve contient la clé dans son attribut data-chatbot.
Pour un site en HTML simple, il suffirait de coller le code d’installation avant </body> :
<script src="https://nexoply.com/widget.js" data-chatbot="YOUR-KEY" async></script>Avec Next.js, vous ne modifiez pas le HTML directement : vous ajoutez donc le même script avec le composant intégré next/script. La clé est publique : elle indique seulement au widget à quelle entreprise il appartient.
App Router : ajouter le script à app/layout.tsx
Le layout racine enveloppe toutes les pages : y ajouter le script place donc le chat sur tout le site. Importez Script depuis next/script et placez-le dans <body>, après {children} :
// app/layout.tsx
import Script from "next/script";
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>
{children}
{/* Widget de chat Nexoply : se charge dans le navigateur après l’hydratation */}
<Script
src="https://nexoply.com/widget.js"
data-chatbot={process.env.NEXT_PUBLIC_NEXOPLY_KEY}
strategy="afterInteractive"
/>
</body>
</html>
);
}Mettez ensuite la clé dans une variable d’environnement. Le préfixe NEXT_PUBLIC_ indique à Next.js de l’inclure dans le bundle du navigateur, ce qui ne pose pas de problème ici puisque la clé n’est pas un secret :
# .env.local (non versionné dans git)
NEXT_PUBLIC_NEXOPLY_KEY=YOUR-KEYPages Router : ajouter le script à pages/_app.tsx
Avec le Pages Router, pages/_app.tsx enveloppe toutes les pages : le même <Script> va donc là, à côté de <Component {...pageProps} />. Utilisez la même variable de .env.local :
// pages/_app.tsx
import type { AppProps } from "next/app";
import Script from "next/script";
export default function App({ Component, pageProps }: AppProps) {
return (
<>
<Component {...pageProps} />
<Script
src="https://nexoply.com/widget.js"
data-chatbot={process.env.NEXT_PUBLIC_NEXOPLY_KEY}
strategy="afterInteractive"
/>
</>
);
}Si votre projet combine les deux routeurs, ajoutez le script à la fois dans app/layout.tsx et dans pages/_app.tsx. Le charger deux fois est sans conséquence : le widget ne se monte qu’une fois par clé de chatbot.
Facultatif : un composant <Chatbot /> réutilisable
Vous préférez un composant <Chatbot />, comme dans le guide du composant chatbot React ? Déplacez le Script dans son propre fichier. next/script fonctionne dans les Server Components tant que vous ne lui passez pas de gestionnaires d’événements comme onLoad : ce fichier n’a donc pas besoin de "use client" :
// components/Chatbot.tsx
import Script from "next/script";
export function Chatbot() {
return (
<Script
src="https://nexoply.com/widget.js"
data-chatbot={process.env.NEXT_PUBLIC_NEXOPLY_KEY}
strategy="afterInteractive"
/>
);
}Affichez ensuite <Chatbot /> dans <body> de app/layout.tsx, après {children}, ou à côté de <Component {...pageProps} /> dans pages/_app.tsx. Placez-le dans le layout, et non dans une seule page, pour qu’il se charge sur toutes les routes.
Choisir une stratégie, et son comportement
strategy="afterInteractive" charge le widget juste après que la page devient interactive : le bouton de chat apparaît rapidement. strategy="lazyOnload" attend que le navigateur soit inactif et que tout le reste soit chargé ; choisissez-la si vous voulez un premier chargement aussi léger que possible et qu’un bouton qui apparaît un instant plus tard ne vous gêne pas. Les deux gardent le script hors du chemin de rendu critique. Consultez la documentation de next/script pour plus de détails.
- Navigation côté client. Le widget garde la conversation ouverte pendant que les visiteurs passent d’une page à l’autre avec <Link> ou le routeur, et revérifie vos règles par page quand l’URL change, sans code supplémentaire.
- Sans risque pour le SSR et l’hydratation. Il s’exécute uniquement dans le navigateur et se monte sur document.body, en dehors du balisage que React hydrate : il ne provoque donc jamais d’erreur d’hydratation.
- Shadow DOM. Votre Tailwind ou votre CSS global ne déborde pas sur le chat, et ses styles ne débordent pas sur votre application. Les re-rendus ne le retirent jamais.
- StrictMode et Fast Refresh. Des effets exécutés deux fois en développement ou des rechargements à chaud ne peuvent pas créer un second chat : il se monte une fois par clé.
- Stockage. Il ne dépose aucun cookie ; il utilise localStorage pour un identifiant de visiteur anonyme et sessionStorage pour la conversation en cours.
Construire votre propre chatbot Next.js ou utiliser un chatbot hébergé
Next.js permet de construire facilement votre propre chatbot, et c’est parfois le bon choix. Les deux approches répondent à des besoins différents :
- Le construire vous-même avec une bibliothèque d’interface de chat ou vos propres composants, plus un route handler ou une route d’API qui appelle un modèle d’IA avec votre propre clé d’API. Le contenu à partir duquel il répond, le stockage des conversations et la protection contre les abus sont aussi à votre charge. C’est adapté quand le chat fait partie de votre produit, par exemple un assistant qui travaille avec les données de vos propres utilisateurs.
- Un chatbot IA hébergé comme Nexoply fournit l’interface, l’IA et le backend ensemble. Il répond aux questions des visiteurs uniquement à partir des informations sur l’entreprise que vous ajoutez ou importez (services et prix, FAQ, politiques, horaires d’ouverture) et le dit quand il ne sait pas. Pas de clé d’IA, et rien ne s’exécute sur votre serveur ; les conversations, les questions sans réponse et la protection contre le spam se gèrent dans le tableau de bord. C’est adapté à un site web destiné aux clients, qui doit répondre aux questions sur l’entreprise.
Si vous voulez un contrôle total sur l’interface et le modèle, construisez-le. Si l’objectif est de répondre aux questions des visiteurs sans faire tourner de backend, le widget hébergé demande moins de travail. Découvrez comment Nexoply répond à partir des informations sur votre entreprise.
Ouvrir le chat depuis votre propre bouton
Vous voulez un bouton « Discutez avec nous » dans votre section d’accroche ou de tarifs ? Déclenchez l’événement nexoply:open-chat sur window. Comme il utilise onClick, ce doit être un composant client :
"use client";
// components/ChatButton.tsx
export function ChatButton() {
return (
<button
type="button"
// ouvre la fenêtre de chat Nexoply
onClick={() => window.dispatchEvent(new Event("nexoply:open-chat"))}
>
Discutez avec nous
</button>
);
}Utilisez <ChatButton /> dans n’importe quelle page ou n’importe quel composant serveur. Il n’existe pas d’API pour retirer le widget une fois chargé : pour masquer le bouton de message sur certaines pages (par exemple /checkout), ajoutez une règle par page avec « Aucun bouton » sous Chatbot → Personnaliser → Bouton de message → Différent sur certaines pages.
Tests en local, sites autorisés et CSP
Lancez next dev, ouvrez http://localhost:3000 et un bouton de chat apparaît dans le coin. Posez une vraie question, comme « Travaillez-vous le week-end ? » ; en quelques secondes, la conversation apparaît sous Conversations dans votre tableau de bord. Les modifications faites dans le tableau de bord arrivent sur le site en une minute environ, sans redéploiement.
Si votre application envoie un en-tête Content-Security-Policy (par exemple depuis un middleware ou next.config), autorisez Nexoply dans :
- script-src https://nexoply.com : pour charger widget.js.
- connect-src https://nexoply.com : pour les requêtes du chat.
- img-src https://nexoply.com : pour les images comme le logo et l’icône du bouton.
Dépannage et étapes suivantes
- Pas de bouton, et data-chatbot est vide dans le code source de la page. La variable d’environnement n’a pas été lue : vérifiez le préfixe NEXT_PUBLIC_, redémarrez next dev, puis ajoutez la variable chez votre hébergeur et redéployez.
- Le script est dans une seule page au lieu du layout. Placez-le dans app/layout.tsx ou pages/_app.tsx pour qu’il se charge sur toutes les routes.
- La balise a été modifiée. Elle doit garder l’attribut data-chatbot et un src contenant widget.js.
- Bloqué par la CSP ou les sites autorisés. Cherchez des erreurs dans la console du navigateur et vérifiez les deux sections ci-dessus.
- Chatbot désactivé. Vérifiez que l’interrupteur Chatbot activé est allumé.
- Bloqueurs de publicité. Plus rarement, une extension bloque les widgets de chat. Essayez une fenêtre de navigation privée sans extensions.
Une fois que tout fonctionne, adaptez-le au site sous Chatbot → Personnaliser : icône du bouton, libellé, couleurs et position, ou un onglet latéral sur le bord de l’écran (comme « Aide ») ; une apparence différente sur mobile ; et des règles par page pour certaines pages (par exemple un onglet latéral uniquement sur /pricing). Découvrez toutes les options de personnalisation et comment l’assistant apprend à connaître votre entreprise, comparez les offres et les limites de conversations, ou lisez le guide du composant chatbot React et le guide du chatbot pour Vue et Nuxt.
Questions fréquentes
Existe-t-il un composant de chatbot React prêt à l’emploi pour Next.js ?
Il n’existe pas de paquet npm officiel ni de bibliothèque de composants, et vous n’en avez pas besoin. Le composant <Chatbot /> de ce guide tient en quelques lignes autour de next/script, que vous copiez dans votre projet. Le widget est toujours le script https://nexoply.com/widget.js avec un attribut data-chatbot, et tous les réglages se font dans votre tableau de bord Nexoply.
Le chat survit-il à la navigation côté client ?
Oui. Les visiteurs gardent leur conversation pendant qu’ils passent d’une page à l’autre avec <Link> ou le routeur, et les règles par page sont revérifiées quand l’URL change, sans code supplémentaire. Le widget vit sur document.body, en dehors de vos layouts : les changements de route ne le retirent jamais.
Fonctionne-t-il sur Vercel ?
Oui. Ce n’est qu’une balise script chargée dans le navigateur du visiteur : rien ne s’exécute sur votre serveur, et il n’y a ni route d’API ni paramètre serveur à ajouter. Définissez NEXT_PUBLIC_NEXOPLY_KEY dans les variables d’environnement de votre projet Vercel et redéployez.
A-t-il un effet sur les Core Web Vitals ou les performances ?
Il est conçu pour ne pas en avoir. Le script se charge de manière asynchrone après l’hydratation (afterInteractive) ou quand le navigateur est inactif (lazyOnload) : il ne bloque donc jamais le rendu, et il se monte en dehors de la mise en page de votre site.
App Router ou Pages Router : lequel utiliser ?
Celui que votre projet utilise déjà ; le widget fonctionne de la même façon avec les deux. App Router : app/layout.tsx. Pages Router : pages/_app.tsx.
Puis-je le charger uniquement après le consentement aux cookies ?
Oui. N’affichez le <Script> qu’une fois que le visiteur a donné son accord, par exemple dans un composant client qui vérifie l’état de votre consentement. Le widget lui-même ne dépose aucun cookie.
