Documentation OpsIQ

Construire, exploiter et Étendre OpsIQ.

C'est la documentation complète pour OpsIQ. Configurez le produit, lancez le support, configurez l'IA, gérez le CRM, installez le widget, construisez des connecteurs, appelez le REST API, recevoir des webhooks, paqueter les applications du marché et opérer des déploiements auto-organisés.

Guide du clientGuide d'administrationGuide du développeurRéférence CRMSDK de connecteurAPI RESTAuto-hébergé
Portée

Portée du présent manuel

Tout OpsIQ fait, en un seul endroit: comment chaque écran fonctionne, comment connecter vos propres systèmes, et comment construire sur elle. Commencer n'importe où, les sections suivent la même commande que la barre latérale d'administration.

Portée
Carte de documentationLe manuel est organisé autour du produit OpsIQ, suivant le même ordre que la barre d'administration.Carte de documentationProduit OpsIQAUDIENCEOpérateursBÂTIMENTDéveloppeursRUNAdministrateursVUE DE L'ESPACE DE TRAVAIL EN DIRECTUtilisez OpsIQÉcrans et workflows de produitsInclusExtender OpsIQConnecteurs, APIs et widgetInclusUtiliser OpsIQSécurité, cron et déploiementInclusRéférenceContrats de package, API et webhookInclus1CHOOSE AUDIENCEOpérateur ou développeur2FOLLOW THE UIMiroir de sections OpsIQ3USE SOURCE TRUTHLe statut vient de la construction
Le manuel est organisé autour du produit OpsIQ, suivant le même ordre que la barre d'administration.
Guide de terrain Portal Studio

Utilisez le guide d'administration et de développement dédié pour l'architecture du portail, les pages, les composants, la version préliminaire, le centre d'aide, l'identité, SCIM, les versions régies, les extensions, les migrations et la certification.

Ouvrir le guide Portal Studio

Ce qui est ici

Exécuter le produit

Chaque écran de l'administrateur : analyse, chat en direct, tickets, CRM_, base de connaissances, Intelligence du site, promotions et le portail du compte client.

Connectez vos systèmes

Le widget du site Web, les boîtes aux lettres de courrier électronique, les webhooks entrants et sortants et la bibliothèque de connecteurs pour des plateformes comme Shopify, WooCommerce, WHMCS Zendesk, Stripe, Slack et Gmail.

Construisez votre propre

Le Connector Builder pour les connecteurs sans code, Actions & Triggers si vous préférez ne pas utiliser de connecteurs du tout et le REST API avec chaque action, portée et code d'erreur.

Faites-le fonctionner

Rôles et autorisations, sécurité, cron, diagnostics, sauvegardes et déploiement hébergé ou auto-hébergé.

Où commencer

1
Si vous exécutez OpsIQ jour après jour

Chaque page s’ouvre avec l’objet de la page, vous pouvez donc arrêter dès que vous avez ce dont vous avez besoin.

2
Si vous l'administrez

Ajoutez les sections Paramètres, Sécurité, Diagnostics, Cron et Production qui décident si tout le reste fonctionne.

3
Si vous créez une intégration

Commencez par Connecteurs, puis le Constructeur de connecteur, puis REST API Lisez-les dans l'ordre et vous aurez vu toutes les façons de créer des webhooks. OpsIQ Il peut parler à un autre système.

💡
Deux choses changent ce que vous voyez. Les permissions masquent les pages de votre rôle, donc une section décrite ici peut manquer dans votre barre latérale. Demandez à un administrateur de vérifier votre rôle. Et les connecteurs portent une étiquette de maturité de Production, Beta, Preview ou Template; la construction en cours et son manifeste de connexion sont l'autorité sur laquelle vous avez, pas cette page.
Commencez ici

Ce que OpsIQ fait pour votre entreprise

OpsIQ Il remplace vos analyses, chat en direct, service d'assistance, CRM, boîte à outils SEO, middleware d'intégration et plate-forme de développement par un seul administrateur unifié où chaque outil partage le même contexte client. Au lieu de coller ensemble 8-12 Des produits SaaS séparés, vous installez OpsIQ Une seule fois et de tout faire fonctionner à partir d'un seul écran.

La plateforme
OpsIQ plateforme unifiéeUn cerveau central d'IA connecté au chat en direct, au CRM, aux tickets, à l'intelligence du site, aux promotions et aux analyses.Chat en directPromotionsCRM AISite d'IntelBilletsAnalytiqueOpsIQCERVEAU IA1ONE WORKSPACETous les outils dans un seul admin2SHARED BRAINUn contexte client3ANYWHERECloud ou auto-hébergé
OpsIQ est une plateforme avec un contexte client partagé, chaque outil alimente, et est alimenté par, le même cerveau d'IA.

Tout OpsIQ fait · en détail

Analyse du site Web et intelligence des visiteurs

Suivi des visiteurs en temps réel

Chaque chargement de page, clic, défilement et événement de navigation est capturé en temps réel. Voyez qui est sur votre site en ce moment, quelles pages ils regardent, combien de temps ils passent, et d'où ils viennent, tous sans cookies tiers.

Journal des visiteurs et sessions

Historique complet de chaque visiteur avec l'appareil, le navigateur, le système d'exploitation, le pays, la ville, le référent, les paramètres UTM, la page de destination et la résolution des identités. Les sessions regroupent les vues de pages en parcours afin que vous puissiez voir tout le chemin emprunté par un visiteur.

Relecture de session

Lecture de style chronologique des sessions de visiteurs capturés. Voyez exactement ce que les utilisateurs ont fait : mouvements de souris, clics, défilements, transitions de page et interactions de forme. Utilisez-le pour diagnostiquer les problèmes UX, comprendre les points de dépôt et vérifier les flux de conversion.

Flux en direct

Un flux en temps réel de l'activité des visiteurs au fur et à mesure. Voir les pages vues, les débuts de chat, les soumissions de formulaires et les signaux d'intention mis à jour toutes les quelques secondes. Filtrer par pays, appareil ou référent pour se concentrer sur des segments de trafic spécifiques.

Pages haut de page

Pages classées par visites, temps d'engagement, taux de rebond, conversions et activité d'assistance Identifiez votre contenu le plus performant et les pages qui doivent être améliorées.

Géo-intelligence

Distribution des appareils et des navigateurs, analyse de la source du trafic, suivi des moteurs de recherche référents et informations sur la pénétration du marché.

Entonnoir d'intention

Suivre les signaux d'intention des visiteurs (visites de pages, retours répétés, modèles de navigation documentaire et interactions de soutien) afin d'identifier les visiteurs susceptibles d'acheter, de faire des achats ou d'avoir besoin d'aide.

Expériences A/B

Exécutez des tests de split sur votre site web directement depuis OpsIQ. Créez des variantes, définissez l'allocation du trafic, les objectifs de conversion et mesurez la signification statistique.

Suivi des erreurs JavaScript

Capturez automatiquement les erreurs JavaScript côté client de votre site Web. Consultez les messages d'erreur, les traces de pile, les navigateurs affectés, le nombre de fréquences et les pages qui les déclenchent.

Journal des événements

Chaque événement suivi (vues de page, événements personnalisés, interactions de chat, présentations de formulaires, achats) dans un journal de bord consultable et filtrable avec métadonnées complètes.

Ventes et conversions

Suivez les commandes, le chiffre d'affaires, les remboursements, les renouvellements d'abonnement et attribuez les conversions aux sources de trafic, aux campagnes et au parcours des visiteurs.

Plombs

Les visiteurs à haut niveau d'intention identifiés par les modèles de comportement. Le pointage est basé sur les visites de page, l'heure sur le site, la fréquence de retour, les interactions de soutien et les signaux personnalisés.CRM pipeline.

Site Intelligence (SEO et analyse de contenu)

Crawls de site

Analyse automatisée de l'ensemble de votre site Web pour découvrir des pages, détecter les liens cassés, trouver les balises Meta manquantes, vérifier le texte alternatif d'images, valider URLs canonique et cartographier la structure de votre Site.

Audit SEO technique

Analyse technique complète : scores de vitesse des pages, ergonomie mobile, Core Web Vitals, état du certificat SSL, chaînes de redirection, contenu dupliqué

Audit de contenu

Évaluez la qualité de chaque page, le nombre de mots, le score de lisibilité, la densité des mots-clés, la structure du titre, le ratio liens internes/externes et la fraîcheur.

Recherche alimentée par l'IA

Posez des questions en langage naturel sur votre contenu et obtenez des réponses synthétisées par l'IA avec les références de la page source.

Suivi du SERP rank

Surveillez vos classements sur les moteurs de recherche pour des mots-clés cibles sur Google et d'autres moteurs. Suivez les changements de position au fil du temps, comparez avec la concurrence et voyez quelles pages se classent pour quels termes.

Recherche de mots clés

Découvrez les opportunités de mots-clés en fonction de votre contenu, de l'analyse des concurrents et des données sur le volume de recherche.

Analyse de backlink

Voyez quels sites vous renvoient, suivez les liens nouveaux et perdus, analysez la distribution des textes d’ancrage et identifiez les opportunités de création de liens.

Grille SEO locale

Pour les entreprises disposant d'un emplacement physique, visualisez votre visibilité dans la recherche locale sur une grille géographique et voyez comment vos classements varient en fonction de l'emplacement, de la distance par rapport à votre entreprise et de l’intention de recherche.

Synchronisation du profil Google Business

Connectez votre profil Google Business à OpsIQ. Synchronisez les avis, les publications, les questions et réponses, les photos et les informations professionnelles. Gérez votre page GBP depuis l'intérieur de _OpsIQ. Répondez aux avis, publiez des publications et suivez les statistiques.

visualHtml

Rapports automatisés SEO et analytiques générés sur votre horaire (quotidiennement, hebdomadairement, mensuellement). Les rapports comprennent les changements de classement, les tendances du trafic, les problèmes techniques trouvés, et la performance du contenu.

Support alimenté par l'IA

Chat IA client

L'IA répond aux questions des clients sur votre site Web 24/7 Utilisez votre base de connaissances, les données de la plateforme connectée (commandes, comptes, abonnements) et des invites de formation personnalisées. Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), et Grok (xAI).

Assistante d'IA

Un copilote d'IA dans votre panneau d'administration qui vous aide à rédiger des réponses aux tickets, à rédigez les communications clients, à analyser les tendances de support, à rechercher les données client sur toutes les plateformes connectées et à exécuter des actions via le système de connecteur.

Ancrage des connaissances en IA

L'IA est ancrée dans vos articles de base de connaissances, les entrées FAQ, la documentation du produit et les données de plate-forme connectées. Il ne hallucine pas. Il répond à partir de vos informations commerciales réelles ou s'aggrave quand incertain.

Auto-handoff aux humains

Lorsque l’IA ne parvient pas à résoudre une question, détecte un problème ou que le client demande la présence d’un humain, elle passe automatiquement le relais à votre équipe avec le contexte complet de la conversation.

Invites de formation à l'IA

Écrivez des invites d'instructions distinctes pour l'IA destinée aux clients et celle destinée à l'administrateur. Contrôlez le ton, les limites, les règles d’escalade, les sujets interdits et le comportement spécifique de l'entreprise.

Historique et audit de l’IA

Chaque conversation d'IA est enregistrée avec tous les détails de la demande/réponse, l'utilisation du jeton, le suivi des coûts, le fournisseur utilisé et la version du modèle.

Insights sur l'IA

Consultez les questions courantes, les taux de résolution, la fréquence des remises, la satisfaction client par sujet et les domaines dans lesquels l'IA a besoin d'une meilleure formation.

Configuration de l'IA par espace de travail

Chaque site/espace de travail connecté peut utiliser son propre fournisseur d’IA, modèle, température, budget de token et invites de formation. Une entreprise SaaS peut utiliser Claude pour le produit principal et GPT-4o pour une marque secondaire.

Gestion de l'IA et BYOK

Deux modes d'IA : Gestion de l'IA (inclus dans votre plan, non API clé nécessaire) ou Apportez votre propre clé (utilisez la vôtre OpenAI/Anthropic/Google/xAI API Les deux sont de première classe, chaque fonction fonctionne avec l'un ou l'autre mode.

Budgets et contrôle des coûts pour les tokens d’IA

Définissez des budgets de token mensuels, des limites par conversation et des alertes en cas de solde faible. Suivez les dépenses par fournisseur, par espace de travail et par conversation.

Tickets et helpdesk

Système de tickets natif

Un service d'assistance complet avec les départements, les priorités (faible/moyen/élevé/urgent), les statuts, le suivi des SLA, les notes internes, la réponse du client, les pièces jointes et les conversations en fil.

Triage et réponse automatique par IA

L'IA trie automatiquement les tickets entrants par département et priorité. Activez la réponse automatique pour des départements sûrs. L'AI rédige et envoie une réponse après un délai configurable (par défaut : 2 minutes) afin que les humains puissent intervenir en premier.

Ingestion d'email

Connectez une boîte aux lettres (Gmail, IMAP ou spécifique à un fournisseur) pour créer automatiquement des tickets à partir d’e-mails entrants.

Intégration du portail des billets

Intégrez un portail de billets orienté client sur votre site Web. Les clients peuvent soumettre des billets, afficher leur historique, répondre à des tickets ouverts et vérifier l'état, tous marqués à votre conception.

Fusion de tickets

Fusionnez les tickets en double dans un seul fil de discussion. Les tickets fusionnés affichent [Fusionné] sur la ligne d’objet, et l’historique des conversations est conservé dans le ticket qui restera.

Retour à AI

Une fois qu'un agent humain a pris en charge un ticket, utilisez « Retour à l'IA » pour laisser l'AI reprendre la réponse automatique sur ce ticket. Utile lorsque la partie humaine est résolue mais que le client a des questions de suivi que l'intelligence artificielle peut gérer.

Boîte de réception copilote

Le copilote suggère des réponses, résume l’historique de conversation, recommande les affectations par priorité/service et peut exécuter des actions sur les plateformes connectées.

Chat et support en temps réel

Boîte de réception du chat

Chat client en temps réel géré à partir d'une boîte de réception unifiée. Voir toutes les conversations actives, l'identité du client, l’historique des conversations et les suggestions d'IA. Plusieurs agents peuvent collaborer sur une conversation.

Règles de chat proactives

Trigger chat messages based on visitor behavior: time on page, specific URL visited, scroll depth, return visit count, exit intent, or custom events. Example: show a help message after 60 seconds on the pricing page.

Widget de chat

Un widget de chat personnalisable intégré à votre site Web. Prend en charge le chat IA, le chat d'agent en direct, la soumission de tickets, la recherche dans la base de connaissances et l'identité du visiteur.

Enquêtes CSAT

Collectez les notes de satisfaction des clients après les interactions via le chat et les tickets. Concevez des sondages avec vos propres questions, échelles d’évaluation et invites de suivi, puis intégrez les résultats dans la performance de l’équipe et les informations issues de l'IA.

Sondage par e-mail post-chat

Après la fin d'un chat, les visiteurs ayant un e-mail connu peuvent recevoir un message personnalisé avec un résumé de l'IA de ce qui a été traité et un clic sur « Est-ce que c'était facile? » Oui/Non. Une fois par fil, des liens à usage unique signés, chaque envoi enregistré et le résultat se trouve sur la page Feedback comme son propre signal à côté des étoiles dans le chat.

Boucle d'identité de retour

Chaque élément de retour d'information qui transporte une personne lui montre: nom, e-mail, un clic vers son parcours client complet et le contact CRM, ainsi que des réponses en un clic par e-Mail ou AI basées sur leur historique réel.

Écrire une IA

Utilise sa propre invite (et non le cerveau du chat) pour la rédaction professionnelle d'e-mails, de réponses aux tickets, d'annonces et de communications avec les clients.

CRM axé sur l’IA

Centre de Commande CRM

Un seul écran affiche l’état complet de votre CRM : la valeur du pipeline, la vitesse des transactions, les tâches à venir, les transactions à risque, l’activité des agents et les recommandations d’IA.

Contacts et entreprises

Gérez les contacts clients avec des profils complets : nom, adresse e-mail, téléphone, société, balises, étape du cycle de vie, historique des conversations, historiques des tickets, historiqus des achats et champs personnalisés. Liez les contacts aux entreprises pour la gestion des relations B2B.

Conseil des transactions et du pipeline

Tableau de transactions visuel de style Kanban avec étapes personnalisables. Faites glisser les offres entre les étapes, définissez des valeurs, assignez des propriétaires, suivez les dates de clôture et consultez la valeur du pipeline à chaque étape.

Entraînement AI

L’IA analyse chaque transaction et fournit un coaching: signaux de risque (départ silencieux, concurrents mentionnés, préoccupations budgétaires), recommandations sur la meilleure action à suivre, probabilité de gagner et calendrier de suivi suggéré.

Prévisions et rapports

Les rapports incluent le pipeline par étape, par propriétaire, par source, les taux de conversion, la taille moyenne des transactions et la durée du cycle de vente.

Agent de prospection (DTS)

La prospection basée sur l'IA identifie les clients potentiels à partir des données de vos visiteurs, des signaux de lead et de l'activité de la plateforme connectée.

Séquences de suivi

Séquences de suivi automatisées en plusieurs étapes: envoyer un e-mail, attendre, envoyer, vérifier la réponse, Définissez des séquences pour les nouveaux prospects, les affaires bloquées, les contrôles post-achat et les campagnes de réengagement.

Cycle de vie et rétention

Suivez les étapes du cycle de vie des clients (lead, prospect, client, churned) avec des transitions automatisées. L'agent de rétention surveille les signaux de churn et suggère des interventions.

Agent de gestionnaire des données

Agent d'IA qui nettoie et enrichit continuellement vos données CRM: déduplique les contacts, remplit les champs manquants, valide les e-mails, standardise les noms des entreprises et signale les enregistrements obsolètes.

Construire mon CRM

Configuration CRM en langage naturel : indiquez à l’IA à quoi ressemble votre processus de vente et il crée vos étapes du pipeline, des champs personnalisés, des modèles d’affaires et des règles d'automatisation.

Vérification de la santé CRM

Audit automatisé de la qualité des données CRM : contacts en double, offres sans étapes suivantes, pipelines obsolètes, informations de contact manquantes et notation de l’exhaustivité des données.

Dial de confiance

Contrôle de l’autonomie à trois niveaux pour chaque agent d’IA CRM : Pilote automatique (l’IA agit indépendamment), Copilote (l'IA suggère, l’humain approuve) et Manuel (l‘IA observe uniquement). Définissez le cadran par agent, par type d’action et par seuil de valeur de transaction.

Quatre agents d'IA

Le CRM exécute quatre agents d’IA spécialisés : Steward (qualité des données), SDR (prospection), Retention (prévention du décrochage) et Analyst (rapports et informations). Chaque agent a son propre paramètre de numérotation fiable.

Connecteurs et intégrations

Connecteurs pré-construits

Connecteurs prêts à l'emploiShopify, WooCommerce, BigCommerce, Magento2, PrestaShop, OpenCart, osCommerce,WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Postmark, Renvoyer, SendGrid, Mailgun,Gmail, IMAP, Slack, et Google Business Profile . Chaque connecteur apporte des actions d'IA spécifiques à la plate-forme, connaissances, et de la synchronisation des données.

Constructeur de connecteurs

Construisez des connecteurs personnalisés pour n'importe quelle plate-forme, aucun code, AI assisté ou code complet. Le constructeur supporte REST et GraphQLAPIs, OAuthflux de code d'autorisation, enregistrement automatique webhook avecStripeet des schémas de signature simples, pagination (offset, page, curseur et link-header), transformation de la liste/erreur, contexte multi-action et emballage du marché.

Création de connecteur assistée par IA

ConnectorBuilderAI vous aide à créer des connecteurs : décrivez ce que vous voulez et il suggère des actions, écrit les gestionnaires de requêtes et mappe les réponses API. Gère l'authentification, la pagination et le traitement des erreurs automatiquement.

OAuth flux pour n'importe quel connecteur

In-app générique OAuth Prise en charge de PKCE, gestion d'état à l'échelle du site, actualisation automatique des jetons. Les connecteurs définissent leurs propres OAuth paramètres et OpsIQ Il gère le flux.

Bus de capacité (extension à l'échelle de la plate-forme)

Les connecteurs n'ajoutent pas simplement des actions de plate-forme. Ils peuvent alimenter les fonctions centrales par des "bus" de capacité. Un connecteur déclare une capacité (calendrier, enrichissement, esign dans CRM; local_listing, range_data dans Site Intelligence; web_analytics dans Analytical; payment_provider dans Payments; email_sync dans Mailbox; video_meeting dans comms) et implémente son petit ensemble de méthodes; OpsIQ le découvre via CapacityRegistry et le télécharge dans l'interface utilisateur, le client 360 Plusieurs connecteurs peuvent offrir la même capacité sans verrouillage. Voir les connecteurs/PLATFORM_CONNECTORS.md.

Pré-installé vs Marketplace

Les connecteurs préinstallés (connecteurs/) sont actifs dans le registre hors de la boîte, maintenus à l'écart de la référence sans clé et du fournisseur le plus utilisé par capacité (par exemple Google Calendar, Gmail, Google Business Profile). Les connecteur de marché (marketplace_connectors/) peuvent être découverts mais inertes jusqu'à leur installation, p. ex. Microsoft 365 Calend, Outlook, DocuSign, Stripe, GA4, SerpApi, Zoom. Chaque pont surmonte une liste de marché afin que l'interface utilisateur et l'IA puissent « installer depuis le marché » (notifier-à-installer) lorsqu'une capacité n'a pas de fournisseur prêt, jamais un bouton cassé.

Marché des connecteurs

Publiez vos connecteurs sur le. OpsIQ Connecteurs de paquet avec le profil.json, la connaissance.json, workflow_recipes.json Marketplace prend en charge les connecteurs gratuits et payants avec facturation multi-source.

Signature de connecteur

Tous les connecteurs sont signés cryptographiquement pour vérifier leur intégrité. La signature est vérifiée au moment de l'installation, et vous pouvez utiliser l'outil resign_all_connectors pour resigner après les mises à jour.

SmartLookup

Système déclaratif de correspondance floue pour les actions du connecteur. OpsIQ Exemple : find_country("germ") fait correspondre l'Allemagne à, la France avec, le Royaume-Uni avec. 88.9% Confiance.

Contrats d'action

Le généralOpsIQ APIpublie chaque enregistrementJSONl'opération comme une action nommée découvrable. Utilisez meta.actions pour le total en direct et les contrats dactylographiés exacts; paquets de connecteurs déclarent leurs propres actions de fournisseur par l'intermédiaire de l'ActionExécuteur unifié.

Recettes de connecteur

Des recettes de workflow prédéfinies qui combinent plusieurs actions de connecteur en flux de travail métier communs. Exemple : « Lorsqu'une nouvelle commande arrive sur Shopify, créez un ticket, mettez à jour le CRM et envoyez une notification Slack.»

Synchronisation des connaissances

Les articles d'aide spécifiques à la plateforme, les guides de configuration et les étapes de dépannage sont automatiquement disponibles pour l'IA sans saisie manuelle des connaissances.

Plateforme de développement

API REST

A named JSON API Couvre tous les administrateurs enregistrés JSON fonctionnement, avecAPI-authentification par clé, isolation de l'espace de travail, étendues, limitation du débit, écritures idempotentes, OpenAPI et une collection Postman générée.

Webhooks

Webhooks sortants pour tous les événements majeurs: commandes, factures, abonnements, tickets, chats, leads, inscriptions d'utilisateurs et abandon de panier. Livraison asynchrone via la file d'attente des tâches, réessai exponentiel, protection SSRF et désactivation automatique après 15 échecs consécutifs.

Signature de webhook

Chaque webhook sortant est signé avec HMAC-SHA256. Vérifiez les signatures sur votre fin de réception pour assurer l'authenticité du webhake.

Widget SDK

JavaScript SDK Installez des recettes pour React, Vue, Next.js, jQuery et JavaScript pour le widget de suivi avec résolution d'identité, suivi personnalisé des événements, contrôle par programmation du chat et configuration spécifique à la page. WordPress, Shopify, et statique HTML.

Plugins et SDK

SDK côté serveur et plugins pour des cadres communs.WordPressplugin,WHMCSmodule, et bibliothèques d'intégration génériques PHP/Node.js.

Événements API

Poussez des événements personnalisés dans OpsIQ depuis votre backend: achats, inscriptions, utilisation de fonctionnalités, erreurs ou tout autre évéement commercial. Les évélements apparaissent dans la timeline du visiteur et sont alimentés dans le contexte analytique et d'IA.

Livre de cuisine pour les triggers

Créez des workflows automatisés déclenchés par des événements (nouveau ticket, chat lancé, visiteur identifié, changement de stade d'une transaction ou évéement personnalisé) qui exécutent des actions de connecteur, envoient des webhooks, mettent à jour les enregistrements ou notifient votre équipe.

API constructeur

Visual API Configurez les points de terminaison, testez les requêtes, inspectez les réponses et déboguez les intégrations sans quitter l'interface d'administration. OpsIQ.

Équipe et administration

Contrôle d'accès basé sur les rôles

Trois rôles: Propriétaire (accès complet, facturation, zone de danger), Administrateur complet (toutes les opérations sauf la facturation et la zone de risque) et Agent (seulement les services affectés, pas d'accès aux paramètres).

Tableau de bord des performances d'équipe

Le propriétaire et le tableau de bord Full Admin seulement montrant les temps de résolution, la répartition de la charge de travail, profondeur de la poignée, ventilation des canaux, analyse des tendances,SLA conformité,CSAT par agent, les tarifs de réouverture, les roulements d'équipe, et les heures les plus occupées.

Présence et suivi en ligne de l'administrateur

Widget qui-est-en ligne en temps réel dans la navigation de l'administrateur.60-second ping, 300-second extend, auto-prune après 120 Voir quels administrateurs sont actuellement actifs et sur quelles pages.

Paramètres par espace de travail

Chaque site connecté (espace de travail) peut avoir sa propre configuration d’IA, ses paramètres de connecteur, ses services de tickets, son image de marque et ses règles opérationnelles.

Gestion de plusieurs sites

Gérez plusieurs sites Web à partir d'un seul administrateur OpsIQ. Chaque site a son propre extrait de suivi, ses données de visiteur et sa configuration.

Système de modèles d'email

Modèles d'e-mail basés sur le registre pour toutes les communications automatisées: notifications de tickets, transcriptions de chat, e-mails de bienvenue, réinitialisation du mot de passe et alertes système. HTML Modèles avec prévisualisation en direct, puces variables ({{customer_name}}, {{ticket_id}}), et le contrôle global de la mise en page.

Importation et exportation

Importez des contacts, des tickets et des articles de connaissances à partir de CSV/JSON. Exportez les données des visiteurs, les rapports d'analyse et les enregistrements CRM.

Sécurité, conformité et opérations

Entreprise SSO

OIDC (OpenID Connect) authentification unique avec runtime complet: découverte, autorisation, rappel, vérification de signature JWKS, userinfo, liste d'autorisations du domaine, provisionnement JIT et gardes d'état. SAML Support de configuration.

GDPR et conformité des données

Gestion intégrée des demandes d'accès aux données (DSAR) : exportez et supprimez les données clients dans tous les systèmes. Effacement des données au niveau du contact, y compris les sessions, les tickets, les chats, le CRM et les journaux de messagerie.

IP blocage et protection contre la force brute

Bloc spécifique IPs Le verrouillage automatique après des tentatives de connexion échouées configurables. Log d'échec de connexions avec IP, horodatage et agent utilisateur.

HSTS et en-têtes de sécurité

Les déploiements auto-hébergés peuvent ajouter des en-têtes CSP via la configuration du serveur. The self-hosted deployments can add CSP headers through server configuration.

Hardening de webhook sortant

SSRF guard bloque les webhooks vers private/metadata IP La livraison asynchrone empêche les points de terminaison lents de bloquer votre application. 15 Les défaillances consécutives empêchent le gaspillage de ressources sur les points finaux morts.

Isolation de l'espace de travail

Les visiteurs, les tickets, les chats, les enregistrements CRM et les conversations d’IA sont intégrés à leur espace de travail. Les fuites de données entre les espaces de travail sont empêchées au niveau des requêtes.

Gestion du cycle de facturation

Prise en charge des cycles de facturation mensuel, trimestriel, semestriel, annuel, biennal et à vie. Normalisation des devises pour les passerelles multi-devises Conversion de devises sur réception du paiement pour un reporting précis des revenus.

Cron et automatisation planifiée

Système cron intégré pour les tâches planifiées: génération de rapports, nettoyage des données, renouvellement d'abonnements, mises à jour de formation AI, synchronisations de connecteurs et retentations de webhook.

Politiques de conservation des données

Configurez la durée de conservation des sessions de visiteur, des transcriptions de chat, de l'historique des conversations d'IA et des journaux d'événements. Nettoyage automatique des données obsolètes pour gérer le stockage et se conformer aux politiques de rétention.

Diagnostic et santé

Tableau de bord d'intégrité du système affichant l'état cron, la connectivité à la base de données, le statut du fournisseur d'IA, l'intégralité du connecteur, les taux de livraison des webhook et l'utilisation du stockage.

À qui OpsIQ est destiné

Magasins de commerce électronique

Magasins

Suivez chaque visiteur de l'atterrissage à l'acquisition. Laissez l'IA répondre « Où est ma commande? » en utilisant des données Shopify/WooCommerce/BigCommerce en temps réel. Gérez les tickets d'assistance avec la réponse automatique AI. Exécutez un pipeline d'affaires pour les prospects grossistes et B2B. Attribuez le chiffre d'activité aux sources de trafic et aux campagnes.

Entreprises de SaaS et logiciels

SaaS

Suivez les pages de documentation qui sont converties. Automatisez l'assistance grâce à une IA ancrée dans votre environnement API Gérez les revenus des abonnements et les offres d'expansion dans le CRM. Connectez votre plateforme de facturation (Stripe, WHMCS Utilisez l'agent de cycle de vie CRM pour détecter et prévenir le churn (départ des clients).

Agences et indépendants

Agence

Offrez des portails d'analyse et de soutien en marque blanche aux clients. Suivez les pistes sur plusieurs sites clients à partir d'un seul administrateur.CRM Construisez des connecteurs personnalisés pour les plates-formes clientes à l'aide du Connector Builder. Générez une marque SEO rapports avec le site Intelligence. revendre des connecteurs de marché comme services à valeur ajoutée.

Hébergement et infrastructure

Hébergement

Deep WHMCS Intégration avec 80+ Actions d'IA pour la recherche de commande, gestion des services, DNS Répondez automatiquement aux questions d'hébergement courantes à l'aide des articles de la base de connaissances. Suivez l'engagement de la page d'état du serveur. Gérez les tickets d'assistance technique avec le triage par IA. Utilisez l'échelle de cycle de facturation pour les plans d'hôte mensuels et à vie.

Entreprises à forte intensité de soutien

Appui

Défaut 40-70% des questions répétitives avec le chat AI ancré dans votre base de connaissances. Routez les tickets au bon département avec triage AI SLA la conformité, et CSAT par agent. Utilisez l'intelligence artificielle écrite pour la rédaction de réponses professionnelles. Surveillez les tendances de soutien avec des informations sur l'IA.

Équipes marketing et SEO

Commercialisation

Suite complète de Site Intelligence: crawls, audits SEO techniques, analyse de contenu, suivi du classement SERP, recherche de mots-clés, surveillance des backlinks et grille SEO locale. Gestion du profil Google Business. Rapports en marque blanche planifiés pour les clients. Test A/B intégré au widget de suivi.

Fondateurs en solo et petites équipes

Démarrages

Commencez par simplement suivre et discuter, libre d'ajouter. Puis ajoutez des tickets lorsque vous obtenez du volume de support. Activez le CRM lorsque vous commencez à vendre. Connectez les plateformes que vous adoptez. OpsIQ d'une personne faisant tout à une 50- une équipe d'opérations avec le CCRA, les ministères et le suivi des performances par agent.

Entreprise et multi-marques

Entreprise

Entreprise SSO avecOIDCpour l'authentification centralisée. Isolement multi-espace de travail pour des marques ou divisions distinctes. Configuration AI par espace de travail avec différents fournisseurs et modèles. Développement de connecteurs personnalisés avec distribution sur le marché.GDPR les outils de conformité et les politiques de conservation des données.

Ce que OpsIQ remplace

Google Analytics + Hotjar et Plausible

Analyse complète du site Web avec suivi des visiteurs, replay de session, classements de pages, géo-intelligence, entonnoirs d'intention, attribution de conversion, événements, expériences A/B, et suivi des erreurs JS, tout est respectueux de la vie privée, le tout dans une seule plateforme.

Intercom + Drift + Tidio

Chat client basé sur l'IA avec ancrage des connaissances, prise en charge de l'intelligence artificielle multi-fournisseurs, transfert automatique aux humains, règles de chat proactives, historique des conversations, sondages CSAT et création de tickets à partir du chat.

Zendesk + Freshdesk et Help Scout

Système de tickets natif avec départements, priorités, SLA, triage par IA, réponse automatique avec délai configurable, ingestion d'e-mails, incorporation de ticket, fusion de ticket et fonctionnalité Return to AI.

HubSpot + Pipedrive + Salesforce

CRM d'abord AI avec quatre agents spécialisés en IA (Steward, SDR, Retention, Analyst), contrôle de l'autonomie Trust Dial, tableau de pipeline, coaching des affaires, prévisions, séquences, gestion du cycle de vie et configuration CRM en langage naturel.

Ahrefs + SEMrush + Moz

Site Intelligence avec des crawls automatisés, des audits SEO techniques, une analyse de contenu, une recherche AI, un suivi du classement SERP, une étude de mots-clés, une analysis de backlinks, une grille SEO locale et des rapports en marque blanche planifiés.

Zapier + Make + middleware personnalisé

Connecteur SDK with 25+ connecteurs prédéfinis, Connector Builder (sans code/AI-assistée/code complet), OAuth Flux, enregistrement automatique de webhook, un vaste catalogue de définitions d'actions de connecteur qui ne deviennent exécutables que lorsque le connecteur concerné est installé, activé, configuré et validé, SmartLookup, marketplace et packages signés.

Gestionnaire de profils Google Business

Connecteur GBP complet: gestion de l'examen, publication post-édition, gestion des questions et réponses, téléchargements de photos, synchronisation d'informations commerciales, suivi des informations et réponses d'examen alimentées par l'IA, toutes depuis l'intérieur OpsIQ.

Outils de modèles d'email séparés

Modèles d'e-mails basés sur le registre avec éditeur visuel, aperçu en direct, puces variables, contrôle de la mise en page globale et personnalisation par événement pour toutes les communications automatisées.

Tableaux de bord de gestion d'équipe

Performances d'équipe intégrées: temps de résolution, charge de travail, conformité aux SLA, CSAT par agent, taux de réouverture, heures les plus occupées, suivi des présences en temps réel et ventilation par service.

GDPR outils de conformité

Gestion native DSAR, effacement des données dans tous les systèmes, gestion du consentement, politiques de conservation et pistes de vérification, intégrées à la plate-forme, non verrouillées.

Deux éditions

Déploiement hébergé

OpsIQ L'exploitation du produit est la même ; l'infrastructure, les mises à jour et les sauvegardes sont prises en charge par l'opérateur d'hébergement. Ce manuel documente le fonctionnement de OpsIQ Exécution plutôt que les flux de comptes marketing ou commerciaux.

Module auto-hébergé

Installer OpsIQ Installez le logiciel sur votre propre serveur pour un contrôle total des données, de la marque, des mises à jour et des intégrations. 8.4+, MySQL 5.7+ ou MariaDB 10.3+, HTTPS et le OpsIQ Unified cron. Supports WHMCS Intégration en tant que module complémentaire. Souveraineté totale sur les données.

Ordre de lecture recommandé

1
Démarrage rapide

Suivez le guide de configuration en 30 minutes pour faire fonctionner le suivi, le chat et l'IA basique sur votre site Web.

2
Tableau de bord et analyses

Apprenez à lire les données de vos visiteurs, configurer la lecture des sessions, identifier les prospects et comprendre les schémas de trafic.

3
Intelligence du site

Exécutez votre premier crawl SEO, vérifiez votre santé technique et configurez le suivi du classement SERP pour vos mots-clés cibles.

4
Tickets et support

Configurez les départements, configurez la réponse automatique avec l'IA, connectez l'ingestion d'e-mail et entraînez votre IA à gérer les questions courantes.

5
CRM

Organisez vos contacts, créez votre pipeline, configurez les agents d'IA, définissez des niveaux de Trust Dial et laissez l'IA coacher vos offres.

6
Connecteurs et outils de développement

Connectez votre plateforme de commerce électronique/facturation, créez des connecteurs personnalisés, configurez des webhooks et intégrez-vous via le REST API.

💡
New to OpsIQ? Start with the Quick Start guide below. You can have tracking and basic AI chat running in under 30 minutes.
Commencez ici

Démarrage rapide en 30 minutes

Suivez ces étapes pour mettre OpsIQ en marche. Chaque étape s'appuie sur la précédente, et à la fin vous aurez le suivi des visiteurs, un chat AI et une assistance de base pour les tickets.

Étapes
Liste de contrôle de démarrage rapideUne liste de contrôle d'installation guidée montrant l'installations des widgets, la connexion à la plateforme, la formation en IA, l'invitation de l'équipe et le lancement, avec une barre de progression de 60 pour cent.Commencez à jouersetupInstaller le widget OpsIQFAITConnecter une plateforme (WHMCS, Shopify...)FAITEntraînez votre IA sur vos contenusFAITInvitez votre équipeVérifiez et passez en directProgrès de l'installation3 des 5 · 60%1STEP 1Installer le widget2STEP 2Connectez & entraînez l'IA3STEP 3Inviter & aller en ligne
Le chemin de 30-minute: installer le widget, connecter une plateforme, entraîner votre IA, inviter l’équipe, puis aller en ligne.

La configuration 30-minute

1
Activer votre licence

Entrez votre clé de licence dans l'administration du OpsIQ. Allez à Paramètres, entrez la clé fournie pour cette installation et cliquez sur Activer. Vous devriez voir un badge vert "Actif".

2
Définissez votre identité d'entreprise

Allez dans Paramètres et remplissez le nom de votre entreprise, l'industrie, le fuseau horaire, la devise par défaut et les heures d'assistance. Cette information est utilisée par l'IA pour répondre aux questions des clients et par les analyses pour les rapports tenant compte du fuseaux horaires.

3
Choisissez un fournisseur d’IA

Allez dans Configuration de l'IA et sélectionnez votre fournisseur. Options: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), ou Grok (xAI). Entrez votre API Cliquez sur « Test de connexion » pour vérifier si vous utilisez votre propre clé, ou utiliser l'IA gérée si disponible dans votre forfait.

4
Installer le widget de suivi

Go to Connected Sites, copy the tracking snippet, and paste it before the closing </body> tag on your website. Visit your site in a private browser, then check the Live Feed in OpsIQ. You should see yourself as a visitor within 15 seconds.

5
Connectez votre plateforme

Si vous utilisez Shopify, WooCommerce, WHMCS, ou une autre plateforme prise en charge, accédez à Connecteurs, recherchez votre plateforme, entrez les informations d’identification et cliquez sur Connexion de test.Cela donne à l’IA un accès aux données des commandes, aux profils clients et au contexte du support.

6
Invitez votre équipe

Accédez à Équipe, cliquez sur Inviter, entrez leur adresse e-mail et leur rôle (Propriétaire, Administrateur complet ou Agent). Les agents peuvent uniquement accéder aux services auxquels vous les avez affectés.

Le chemin le plus rapide possible (5 minutes)

Étape 1: Installer le widget

Copiez l'extrait de code des sites connectés et collez-le sur votre site Web, ce qui vous permet d'effectuer le suivi immédiatement.

Étape 2: Activer l'IA

Allez dans Configuration de l'IA, choisissez un fournisseur, entrez votre clé et enregistrez. Le chat AI est maintenant actif sur votre site Web.

Fait

Vous pouvez ajouter des tickets, un CRM et des connecteurs plus tard, mais vous devez toujours utiliser le même nom d’utilisateur.

Jour 2: Rendre utile

Ajouter des connaissances

Accédez à la base de connaissances et ajoutez 5-10 L'IA utilise ces articles pour répondre aux questions les plus fréquentes des clients avec précision.

Créer des départements

Allez dans Tickets et créez au moins 2 départements (par exemple, « Ventes » et « Support ») et assignez des membres à chacun d'eux.

Écrivez votre AI prompt

Accédez à la formation sur l’IA et rédigez une invite d’IA client qui décrit votre entreprise, votre ton de voix et vos règles d’escalade.

Tester une conversation

Ouvrez votre site web dans un navigateur privé et discutez avec l’IA en tant que client, vérifiez que les réponses sont exactes et le ton est correct.

Semaine 1: Construisez vos opérations

Connecter l'email

Configurez une boîte aux lettres (Gmail, IMAP ou un connecteur de fournisseur) pour que les e-mails des clients créent automatiquement des tickets.

Configurer la réponse automatique

Définissez un délai de 2minutes afin que les humains puissent intervenir en premier.

Examen des analyses

Regardez le nombre de visiteurs, le taux de rebond, les pages principales et les ventes si le suivi est connecté.

Démarrez votre CRM

Ouvrez AI CRM et laissez OpsIQ importer les contacts de vos plateformes connectées.

Mois 1: Optimiser

Examiner l'historique de l'IA

Recherchez les mauvaises réponses, les questions manquées et les occasions d'ajouter des connaissances.

Ajouter des règles proactives

Créez une règle : si un visiteur est sur la page de tarification pendant plus de 60 secondes, affichez un message de chat lui demandant s'il a besoin d'aide.

Construisez un connecteur

Si vous utilisez une plateforme qui ne dispose pas d’un connecteur intégré, utilisez le Connector Builder pour en créer un.

Configurer des webhooks

Connectez OpsIQ à vos outils internes en utilisant des webhooks sortants pour les tickets, le chat et les événements de vente.

Puis-je ignorer l'IA et simplement utiliser le suivi ?+

Oui. Le fournisseur d'IA est optionnel. OpsIQ fonctionne comme une plateforme d'analytique et de billetterie pure sans IA. Vous pouvez activer l'IA plus tard lorsque vous êtes prêt.

Puis-je ignorer les connecteurs et les ajouter plus tard?+

Oui, les connecteurs enrichissent l’IA avec des données spécifiques à la plateforme, mais OpsIQ fonctionne sans eux. Commencez par le suivi et le chat, puis connectez les plateformes au besoin.

Que faire si je n'ai pas encore de site web?+

Vous pouvez toujours utiliser OpsIQ pour les tickets, le CRM et la collaboration d'équipe. Le widget de suivi est facultatif, ajoutez-le lorsque votre site Web sera prêt.

Comment savoir si le widget est installé correctement ?+

Visit your website in a private/incognito browser. Then check OpsIQ Live Feed. You should see your visit appear within 15 seconds. If not, check: (1) is the snippet pasted correctly, (2) is the site key correct, (3) are ad blockers or CSP headers blocking the script.

Commencez ici

Carte complète des produits

OpsIQ n’est pas une fonctionnalité, c’est un administrateur d’opérateur, un widget de site web, une couche de support IA, un système de ticket/helpdesk, un CRM complet avec quatre agents AI, une suite Site Intelligence, une plateforme de connecteur avec marketplace et une surface de développeur. Voici tous les composants qu’il contient.

Opérateur admin

Tableau de bord, flux en direct, journal des visiteurs, sessions, replay de session, pages principales, géo-intelligence, entonnoir d'intention, journal d'événements, expériences A / B, suivi des erreurs JS, ventes et conversions, prospects, AI CRM (centre de commande, contacts, entreprises, offres, tableau de pipeline, coaching commercial, prévisions, prospection, séquences, cycle de vie, intendance des données, Construire mon CRM, configuration CRM, santé CRM, CRM API), tickets, boîte de réception du chat, règles proactives, sondages CSAT, brouillons e-mail, boîtiers électroniques, configurations IA, formation IA, historique IA, informations sur l'IA, base de connaissances, connecteurs, Connector Builder, marché, sites connectés, gestion d'équipe, performances de l'écurie, paramètres, diagnostics et licence.

Surfaces face au client

Widget de suivi du site Web (balise analytique + chat + intégration de ticket + recherche dans la base de connaissances), chat client AI, portail de soumission de tickets, gestion des jetons d'identité des visiteurs, téléchargement de fichiers, widget d'enquête CSAT et centre d'aide orienté vers le client.

CRM axé sur l’IA

Centre de commande, contacts, entreprises, offres, tableau de pipeline avec glisser-déposer, coaching d’offre AI (signaux de risque, meilleure action suivante, probabilité de gagner), prévision des revenus, agent de prospection (SDR), séquences de suivi automatisées, gestion du cycle de vie et de la rétention, agent délégué aux données (désurveillance, enrichissement, validation), Build my CRM (configuration en langage naturel), configuration CRM, vérification de l’état du CRM, Trust Dial (pilote automatique / copilote / manuel par agent), quatre agents spécialisés (Steward, SDR, Rétention, Analyste) et CRM API avec webhooks.

Suite Site Intelligence

Crawls de site automatisés, audit SEO technique (vitesse, mobile, Core Web Vitals, ) SSL, redirections, données structurées), audit de contenu (nombre de mots, lisibilité, densité des mots clés, structure du titre), recherche sémantique alimentée par l'IA, suivi du classement SERP sur tous les moteurs, recherche de mot-clé avec notation d'opportunité, analyse et surveillance des backlinks, visualisation de la grille SEO locale, synchronisation du profil Google Business (avis, publications, Q&R, photos, informations), rapports planifiés (quotidiens/hebdomadaires/mensuels) et marque blanche. PDF Output for agencies.

IA et automatisation

Client AI chat (multi-fournisseurs: Claude, GPT-4o, Gemini, Grok), assistant d'IA administratif, ancrage des connaissances en IA, transfert automatique avec rétablissement configurable, configuration de l'IA par espace de travail, gestion de l’IA et. BYOK Les modes, les budgets de jetons et les contrôles des coûts, la piste d'audit historique de l'IA, l'analyse des informations sur l'AI, le triage AI des tickets, la réponse automatique aux tickets avec retard, l’écriture IA (invite séparée) et le copilote de boîte de réception administrateur.

Connecteurs et intégrations

25+ connecteurs pré-construits (Shopify, WooCommerce, BigCommerce, Magento2, PrestaShop, OpenCart, osCommerce, WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Postmark, Renvoyer, SendGrid, Mailgun, Gmail, IMAP, Slack, Google Business Profile), Connector Builder (sans code/AI-assisted/code complet), générique OAuth Flux de travail avec PKCE, marketplace de connecteurs avec distribution payante, signature et vérification des connecteurs, correspondance floue SmartLookup, un vaste catalogue de définitions d'actions HTTP dont la disponibilité dépend de l'installation du connecteur, activation, configuration et validation, synchronisation des connaissances et recettes de workflow.

Plateforme de développement

RESTAPI(visiteurs, événements, tickets, contacts, paramètres, connecteurs), OpenAPI spec,API Gestion des clés, webhooks sortants (asynchrones, signés, réessayés, protégés par SSRF, désactivation automatique), ÉvénementsAPI Pour l'ingestion d'événements personnalisés, widget SDKavec résolution d'identité, livre de recettes des déclencheurs, contrats d'action, connecteur SDK, packaging de marché, SDK côté serveur (PHP, Node.js), WordPress plugin, et WHMCS Module.

Paramètres et opérations

Identité d'entreprise, configuration de l'IA par espace de travail, paramètres de suivi, sécurité (HSTS, politique des autorisations, blocage IP, protection contre la force brute), RBAC (propriétaire / administrateur complet / agent), gestion et invitations d'équipe, tableau de bord de performances de l’équipes, suivi de la présence de l‘administrateur, système de modèles d’email (guidé par le registre, éditeur visuel, puces variables), concepteur d’enquêtes, connaissance du domaine, configurations d’intégration de tickets, marque, politiques de conservation des données, gestion du cycle de facturation (mensuel à vie), normalisation de devises, import/export, diagnostics, automatisation cron et zone dangereuse.

Sécurité et conformité

Enterprise SSO (OIDC avec vérification JWKS, provisionnement JIT), SAML configuration, GDPR/DSAR traitement (exportation et suppression dans tous les systèmes), effacement des données par contact, gestion du consentement, isolation de l'espace de travail (étendue stricte de la couche de requête), pistes d'audit, suivi des échecs de connexion, IP Blocage, webhook sortant SSRF guard et politiques de conservation des données.

Pont de fournisseur

Gestion de l'IA OpsIQ prestataire URL, appels de fournisseurs de renseignements sur le site, validation de licence, rapports de santé, PDF le rendu et les exportations de données, toutes acheminées à travers le paramètre du fournisseur configuré, pas le fournisseur direct API appels depuis votre serveur.

Chaque page d'administration

Tableau de bord

Nombre de base

Centre de commande quotidien: aperçu du trafic, compteur de visiteurs en direct, résumé des ventes, profondeur de la file d'attente d'assistance, alertes d'activité IA et raccourcis rapides.

Flux en direct

Analytique

Flux de visiteurs en temps réel : pages vues, démarrages de chat, soumissions de formulaires et signaux d'intention mis à jour toutes les quelques secondes avec des filtres par pays, appareil et référent.

Journal des visiteurs

Analytique

Enregistrements complets des visites: appareil, navigateur, système d'exploitation, pays, ville, référent, paramètres UTM, page de destination, identité et historique complet des pages vues.

Séances

Analytique

Vue groupée par parcours : flux de page, temps sur la page, profondeur de défilement, chemin de conversion et page de sortie pour chaque session du visiteur.

Relecture de session

Analytique

Lecture chronologique des événements capturés: mouvement de la souris, clics, défilements, transitions de page et interactions de formulaire pour le diagnostic d'UX.

Pages haut de page

Analytique

Classement des performances de la page: visites, temps d'engagement, taux de rebond, conversions, interactions avec le support et direction de la tendance.

Géo-intelligence

Analytique

Rapports géographiques: ventilation par pays/ville avec cartes, distribution des appareils, part de navigateur, sources de trafic et pénétration du marché.

Entonnoir d'intention

Analytique

Suivi de l’intention comportementale : prix des visites, fréquence de retour, navigation dans les documents, interactions avec le support et signaux personnalisés avec probabilité de conversion.

Journal des événements

Analytique

Historique des événements consultable: pages vues, évéements personnalisés, chats, achats, soumissions de formulaires avec métadonnées complètes et filtrage.

Expériences A/B

Analytique

Tests de division : créer des variantes, répartir le trafic, définir les objectifs, mesurer la signification et déclarer les gagnants, tous à partir de l'intérieur OpsIQ.

Erreurs de JS

Analytique

Capture d'erreurs frontales: messages, traces de pile, navigateurs affectés, fréquence, pages affectées et suivi des tendances.

Ventes

Ventes

Tableau de bord des revenus: commandes, renouvellements, remboursements, attribution par source, performances de la campagne, comparaison entre périodes et analyse des tendances.

Plombs

Ventes

Gestion des prospects : scoring, attribution de la source, statut CRM, coordonnées, signaux comportementaux et routage dans le pipeline.

CRM AI

CRM

CRM complet: centre de commande, contacts, entreprises, offres, conseil d'administration du pipeline, coaching, prévisions, prospection, séquences, cycle de vie, délégué aux données et santé.

Billets

Appui

Boîte de réception du support: départements, priorités, suivi des SLA, triage par IA, réponse automatique, notes internes, pièces jointes, fusion et gestion du statut.

Boîte de réception du chat

Appui

Conversations en direct : IA et chat humain, transfert, collaboration, historique des conversations, identité client et collecte de CSAT.

Brouillons d'e-mails

Appui

Gestion des e-mails: courrier entrant aux tickets, composition de réponse assistée par IA, sélection de modèle et configuration de boîte aux lettres.

Configuration de l'IA

IA

Configuration du fournisseur : sélectionnez Claude/GPT-4o/Gemini/Grok, entrez la clé API ou activez l’IA gérée, définissez le modèle, la température et les budgets de jetons par espace de travail.

Formation à l'IA

IA

Création d'invites : invites destinées aux clients et aux administrateurs, règles d'escalade, directives de ton, sujets interdits et configuration des limites.

Histoire de l'IA

IA

Audit de conversation : journaux complets des demandes/réponses, utilisation du jeton, coût par conversation, fournisseur, version du modèle et résultat de la résolution.

Insights sur l'IA

IA

Analyse des modèles : questions courantes, taux de résolution, fréquence de transmission, satisfaction par sujet et identification des lacunes en matière de formation.

Base de connaissances

IA

Contenu de formation sur l'IA: articles, entrées FAQ, documentation produit, connaissance des connecteurs et entrée personnalisée. Recherche sémantique et par mots-clés pour la mise à la terre de l'AI.

Connecteurs

Intégrations

Hub d’intégration : connecteurs installés, statut de santé, inventaire des actions, gestion des informations d’identification, navigateur du marché et Connector Builder.

Sites connectés

Paramètres

Gestion du site: extrait de suivi, clé de site, configuration de widget, paramètres de domaine et isolation de l'espace de travail par site.

Équipe

Paramètres

Gestion des utilisateurs : invitez les membres, attribuez des rôles (propriétaire/administrateur complet/agent), définissez l'accès du service et gérez les autorisations.

Performance de l'équipe

Paramètres

Mesure des opérations: temps de résolution, charge de travail, conformité aux SLA, CSAT par agent, taux de réouverture, heures d'affluence et analyse des tendances.

Paramètres

Paramètres

Configuration: identité d'entreprise, configuration de l'IA, suivi, sécurité, image de marque, rétention, modèles d'email, facturation, import/export, diagnostic et zone dangereuse.

Licence

Paramètres

Gestion des plans : statut de la licence, fonctionnalités du plan, indicateurs d'utilisation, date de renouvellement et options de mise à niveau/rétrogradation.

Commencez ici

Onboarding guidé

Le parcours d'intégration transforme une nouvelle installation en un espace de travail OpsIQ fonctionnel et peut être quitté et repris sans perte de progression.

Écran de produit
IntégrationOnboarding affiche chaque zone de configuration, son état actuel et la prochaine action à effectuer.Intégrationespace de travailPROGRESS60%COMPLETED6SUIVANTWidgetVUE DE L'ESPACE DE TRAVAIL EN DIRECTLicenceValider la licence du produitFaitFournisseur d'IASélectionner le fournisseur et la clé de testFaitMarqueIdentité et ton d'entrepriseFaitSite webAjouter un site et installer le widgetSuivant1COMPLETE BASICSLicence, marque, IA2CONNECT DATASite et connecteur3VERIFY LAUNCHÉquipe, courriels, chèques
Onboarding affiche chaque zone de configuration, son état actuel et la prochaine action à effectuer.

Séquence recommandée

  1. Licence: Valider la licence et confirmer que l'espace de travail est actif.
  2. Fournisseur d'IA: L’IA peut être ignorée si l’espace de travail n’utilisera initialement que les analyses et les tickets, mais vous pouvez également utiliser le modèle d’analyse pour créer des rapports.
  3. Identité de l'entreprise: Définissez le nom, l'industrie, la description, le ton client et les détails de marque utilisés par le widget et l'IA.
  4. Connecteur : Activer au moins une plateforme externe lorsque OpsIQ a besoin de commandes, clients, tickets, e-mails ou d'autres contextes de plateformes.
  5. Site et widget: Créez le site/espace de travail, copiez la clé du site et vérifiez une visite en mode navigateur privé dans Live Feed.
  6. Équipe et routage: Inviter des administrateurs/agents, créer des départements, définir le routage de courrier électronique et confirmer les préférences de notification.
  7. Vérifications de mise en service: Testez le chat, un ticket, la synchronisation de connecteur, cron, e-mail sortant, webhooks et en-têtes de sécurité.

Le retour à l’intégration devrait afficher les étapes terminées plutôt que de forcer un redémarrage.

Commencez ici

Navigation et autorisations d'administrateur

La barre latérale OpsIQ tient compte des permissions. Ce plan explique où se trouve chaque domaine opérationnel et pourquoi une page peut ne pas être visible par tous les administrateurs.

Écran de produit
Navigation OpsIQLa barre latérale regroupe OpsIQ par zone de travail; les liens individuels n'apparaissent que lorsque le rôle actuel peut les utiliser.Navigation OpsIQespace de travailGROUPS8PAGEPermission baséeSEARCHDisponibleVUE DE L'ESPACE DE TRAVAIL EN DIRECTAppuiTickets, email, CSAT, connaissanceOuvertCRMContacts, pipelines, marchés, prospectionOuvertAutomatisationFlux de travail, règles, objectifsOuvertSécurité et confidentialitéAperçu, vérification, consentement, blocsAdministrateur1PICK A GROUPCorrespondre à la barre latérale2CHECK ROLEHidden signifie restreint3USE PAGE HELPOuvrez la section correspondante
La barre latérale regroupe OpsIQ par zone de travail; les liens individuels n'apparaissent que lorsque le rôle actuel peut les utiliser.
Appui

Billets, plateforme de messagerie de l'équipe, CSAT, le Centre d'aide et les flux de chatbot.

CRM

Les surfaces de vente quotidiennes: CRM Home, Command Center, contacts, pipeline, prévision, cycle de vie, prospection, segments, classement, approbations de marchés, data steward, outils de croissance et le flux d'activité.

Automatisation

Workflows axés sur les événements, règles du cycle de vie et objectifs de conversion.

Commercialisation

Sensibilisation, messages proactifs, annonces, Studio de promotion, Studio d'enquête, campagnes de push et visites guidées.

Analytique

Les surfaces de rapport d'abord — Analytics Hub, AI perspicacités, ventes, clients, leads, entonnoirs, tests A/B, replay de session, tableaux de bord personnalisés et rapports programmés — avec les journaux de visiteurs, de sessions, de pages, de géographie et d'événements bruts dans une sous-section Données brutes.

Pages autonomes

Le renseignement, le rendement et la rétroaction des équipes sont des entrées directes à l'extérieur des groupes.

Intégrations

Connecteurs, actions et déclencheurs, boîtes aux lettres, brouillons, paramètres de messagerie, paramètres d'entrée, boutons de sortie et touches API.

Sécurité et confidentialité

Vue d'ensemble de la sécurité, confidentialité et conformité, consentement aux cookies, activité d'audit, connexion ratée, bloquéIPsetJavaScripterreurs.

Paramètres

Bases de l'espace de travail (général, équipe, sites, langues), puis sous-sections pliables : AI Brain (instructions, configuration, évaluation, histoire), CRM Setup (constructeur, champs personnalisés, score de plomb, santé), Data & Health (diagnostic, exportation) et Se mettre en route (à bord, aide).

Les pages qu'un rôle ne peut pas ouvrir sont cachées dans la barre latérale. Mise à jour tag et ouvrir un écran de mise à niveau dans l'application.

Cacher un lien dans une barre latérale n'est pas le seuil de sécurité : chaque action protégée doit passer ses vérifications d'autorisation et d'espace de travail.

Analytique

Hub d'analyse

Le hub Analytics rassemble les rapports sur le support, le chat, l'IA, les visiteurs et les agents dans un espace de travail filtré par date avec des résultats exportables.

Écran de produit
Hub d'analyseLe Hub Analytics affiche une plage de dates, des cartes et onglets statistiques pour les performances du support, du chat, de l’IA, des visiteurs et des agents.Hub d'analyseespace de travailBILLETS184AI RESOLVE63%CSAT4.7VUE DE L'ESPACE DE TRAVAIL EN DIRECTAppuiCréé, fermé, en attente, SLATabulationChatRésultats IA/humains et temps de traitementTabulationIAConfiance, retours d’expérience, utilisation de jetonsTabulationAgentVolume, rapidité et satisfactionTabulation1CHOOSE DATESPréréglé ou personnalisé2CHANGE TABSoutien à l'agent3EXPORTTélécharger CSV
Le Hub Analytics affiche une plage de dates, des cartes et onglets statistiques pour les performances du support, du chat, de l’IA, des visiteurs et des agents.

Filtres et contrôles

  • Utiliser un paramètre prédéfini ou personnalisé de/à Sélectionnez une plage, puis Actualiser pour reconstruire chaque carte et graphique pour la même période.
  • Exporter CSV exporte la vue analytique active plutôt qu’une capture d’écran.
  • La portée par espace de travail est automatique ; changer de site change le jeu de données sous-jacent.

Ce que chaque onglet mesure

  • Support : Tickets créés/fermés/en attente, première réponse, résolution, réduction au premier contact, SLA et ventilation par priorité/service/état.
  • Clavardage : sessions démarrées, résolutions d'IA, escalades, abandons, temps de traitement, messages par session et IA/humain/toutes les CSAT.
  • AI: Confiance moyenne, taux de confiance faible, précision du triage, rétroaction, déviation des connaissances, utilisation de jetons/cache et les éléments à examiner.
  • Visiteur: Les tendances du trafic et de l'engagement pour la période sélectionnée.
  • Agent : Mesure de la charge de travail, de la vitesse, des clôtures et de la satisfaction par agent.

Utilisez Analytics Hub pour l'examen inter-équipe; utilisez les pages dédiées Visiteurs, Tickets, CSAT, Historique de l'IA et Performance d'équipes lorsque vous avez besoin d'une enquête au niveau des enregistrements.

Analytique

Le tableau de bord

Le tableau de bord est votre centre de commande quotidien. Il affiche le trafic, les ventes, la charge d'assistance, l'activité d'IA et les indicateurs de conversion dans une vue unique. Ouvrez-le chaque matin pour comprendre ce qui s'est passé pendant la nuit et ce qui nécessite une attention aujourd'hui.

Tableau de bord
Tableau de bord d'aperçuL'écran Aperçu est dirigé par un OpsIQ Panneau d'intelligence artificielle (avec résumé quotidien, alertes intelligentes, prévisions), tuiles de widget KPI et un widget de trafic sur sept jours, plus un contrôle de mise en page Reset.Aperçuespace de travailOPSIQ INFORMATIONSChoisissez une analyse et OpsIQ l'écritRésumé quotidienDes alertes intelligentesPrévisionsRéinitialiser la mise en pageVISITEURS AUJOURD'HUI2,481+12%REVENUS$8.2k+5%TICKETS OUVERTS143 SLATrafic · derniers 7 jours1AI-FIRSTOpsIQ Panneau de renseignements2WIDGETSLes KPI que vous organisez3À vousRéinitialiser la mise en page à tout moment
L'écran Aperçu réel : OpsIQ Panneau d'intelligence vers le haut (pick une analyse et il l'écrit) au-dessus des widgets KPI que vous arrangez vous-même.

Cartes de tableau de bord expliquées

Visiteurs en direct

The number of people on your website right now. This updates every 15 seconds (configurable). A visitor is "active" if they loaded a page within the active threshold (default: 90 seconds).

Nombre de visiteurs uniques

OpsIQ identifie les visiteurs par une combinaison d'empreintes digitales du navigateur, de cookies et (si disponible) d'une identité authentifiée.

Nouveau vs retour

Les nouveaux visiteurs voient votre site pour la première fois. Des visiteurs récurrents ont déjà été vus auparavant. Un taux de retour élevé signifie que votre contenu attire les gens à revenir.

Taux de rebond

Le pourcentage de visiteurs qui sont partis après avoir visionné une seule page. Un taux de rebond au-dessus 70% sur les pages d'atterrissage signifie généralement que la page ne répond pas aux attentes des visiteurs, à un contenu erroné, à une charge lente ou à une mauvaise expérience mobile.

Temps moyen sur la page

Durée moyenne de visite sur chaque page. Des temps très courts (moins de 10 secondes) sur les pages de contenu indiquent que le contenu n'est pas intéressant, tandis que des temps très longs sur les sites de paiement peuvent être un signe de confusion.

Menaces bloquées

IPadresses qui OpsIQ Les sites identifiés comme potentiellement malveillants en fonction du score de menace, des tentatives de force brute ou des blocages manuels. IPs Liste.

Ventes aujourd'hui / cette semaine / ce mois-ci

Chiffre d'affaires des sources de ventes connectées (Shopify, WooCommerce, Stripe, etc.). Si les ventes affichent zéro, vérifiez que votre connecteur de plateforme est connecté et en cours de synchronisation.

Graphique de tendance

Recherchez des tendances: pics de trafic (campagnes, mentions dans la presse), baisses (week-ends, jours fériés) et tendance soutenue. Recherche d'un modèle pour le nombre de visiteurs sur une période donnée.

Sources principales

D’où viennent vos visiteurs : direct, Google, réseaux sociaux, campagnes d’emailing, sites de parrainage… Utilisez ces informations pour comprendre quels canaux marketing fonctionnent.

Top des navigateurs

Chrome, Safari, FirefoxSi un navigateur affiche un taux de rebond anormalement élevé, vous avez peut-être une erreur. CSS ou JavaScript Problème de compatibilité.

Carte thermique horaire

Une grille affichant l'activité des visiteurs par heure du jour et jour de la semaine. Utilisez-la pour décider quand planifier les quarts d'assistance, quand envoyer des annonces et quand exécuter des promotions.

Les visiteurs récents

Les derniers visiteurs avec pays, page, appareil et source. Utile pour des contrôles ponctuels rapides pendant les campagnes.

Utilisation du filtre de plage de dates

Cliquez sur le sélecteur de date en haut à droite du tableau de bord. Présets: Aujourd'hui, Hier, Dernier7jours, derniers30jours, ce mois, le mois dernier, plage personnalisée. Toutes les cartes et cartes de tableau de bord mettent à jour lorsque vous changez la plage. La plage de dates est dans votre fuseau horaire configuré (réglages).

Exemples de travaux

Enquête sur le taux de rebond

Scénario :
Votre taux de rebond a sauté de 45% to 78% Qu'est-il arrivé cette semaine?
Que faire:

Vérifiez : (1) Une page de renvoi en particulier a-t-elle changé? Allez dans Top Pages et triez par taux de rebond. (2) Une campagne a-t-elle envoyé du trafic vers la mauvaise page? Vérifiez les principales sources pour de nouveaux référents. (3) Le site est-il cassé sur mobile? Vérifiez la panne du navigateur pour le taux de rebond mobile. (4Vérifiez le compteur de menaces et les détails des visiteurs pour détecter d'éventuels schémas suspects.

Zéro visiteur sur le tableau de bord

Scénario :
Le tableau de bord affiche 0 visiteurs en direct, même si votre site Web reçoit du trafic.
Que faire:

Vérifiez : (1) Le widget de suivi est-il installé? Consultez le code source de votre site web et recherchez OpsIQ script. (2) La clé du site est-elle correcte? Comparez la clé data-site dans le script avec celle de Sites connectés. (3) Un CDN ou un cache diffuse-t-il une page obsolète sans le script? Effacer votre cache CDN. (4) Un bloqueur de publicité ou un en-tête CSP bloque le script? Vérifiez la console du navigateur pour les requêtes bloquées.

Lecture de la carte thermique horaire

Scénario :
Votre carte de chaleur montre une forte activité entre 10h et 14h en semaine, mais rien le week-end.
Que faire:

Il s'agit d'un modèle de trafic B2B. Vos visiteurs sont des professionnels qui naviguent pendant les heures ouvrables.1) Planifier le personnel de soutien pour les heures d'ouverture en semaine. (2) Envoyer des campagnes d'email mardi-jeudi matin. (3) Les fenêtres de maintenance du week-end sont sûres. (4Envisagez d’offrir le chat en direct uniquement pendant les heures de pointe.

Pic de trafic provenant d'une source inconnue

Scénario :
Vous voyez une augmentation soudaine des visiteurs 500 en une heure à partir d'un référent inconnu.
Que faire:

Allez sur Visiteurs et filtrez par la fenêtre de temps.1) Sont-ils de vrais visiteurs ou des robots? Regardez la durée de session, les pages consultées et la diversité du navigateur. (2) Si réel, sur quelle page atterrissent-ils? (3) Vérifiez la référence URL. Quelqu'un pourrait vous avoir lié de Reddit, Hacker News ou un blog populaire. (4) Si c'est le trafic de bot, vérifier les menaces et envisager de bloquer la IP portée.

Pourquoi mon compte de visiteurs diffère-t-il de Google Analytics?+

OpsIQ Il utilise l'empreinte digitale du navigateur et les cookies, tandis que GA utilise un modèle de cookie différent. Le filtrage des bots, les taux de blocage d'annonces et l'ordre de chargement des scripts peuvent également entraîner des différences. 10-20% La variance est normale.

Puis-je intégrer le tableau de bord dans un autre outil?+

Le tableau de bord est conçu pour le. OpsIQ Pour les rapports externes, utilisez le REST API.API pour extraire des données analytiques et les afficher dans votre propre tableau de bord ou outil BI.

Que signifie le compteur de "menaces"?+

It counts IP adresses qui OpsIQ Cliquez sur le compteur pour afficher les détails et gérer les blocages.Click the counter to see details and manage blocks.

Analytique

Journal des visiteurs

Le journal des visiteurs affiche chaque visite de vos sites Web suivis, avec une ligne pour chaque page chargée par un visiteur. Utilisez-le pour étudier le comportement individuel des visiteur, trouver du trafic de campagne et diagnostiquer les problèmes de suivi.

Journal des visiteurs
Journal des visiteursUne table des visiteurs avec une barre de filtre (date, recherche IP/email/ville, source, périphérique) et des colonnes pour _IP/e-mail, emplacement, sources, péliphériques et temps, avec une ligne de menace signalée.Journal des visiteursyoursite.com7 joursRechercher IP, e-mail, ville…Source ▾Appareil ▾IP / EMAILLOCALISATIONSOURCEDISPOSITIFQUAND[email protected]États-Unis · New YorkgoogleBureau2 m41.62.10.4Royaume-Uni · LondresdirectMobile6 millions[email protected]DE · Berlinutm:adsMobile14 millions203.0.113.9NG · LagosreferralBureauthreat1–25 des 3,402Séance →1FILTERDate · rechercher · source · appareil2REAL COLUMNSIP/email · localisation · dispositif · menace3DRILL INOuvrir la session complète
Le journal des visiteurs réel : filtrez par date, recherche et périphérique, puis lisez chaque visite par IP/email, emplacement, source, appareil et heure, menaces signalées en rouge.

Ce que chaque ligne montre

IP adresse

Le visiteur IP Anonymisé si IP L'anonymisation est activée dans les paramètres. Cliquez pour voir toutes les visites de ce IP.

Pays et ville

Détecté à partir duIP Nécessite la base de données MaxMind GeoLite2 ou Cloudflare Affiche "Inconnu" si GeoIP n'est pas configuré.

PageURL

La page que le visiteur a chargée. Cliquez pour voir la fiche complète URL. Long URLs Les données sont tronquées dans la vue de tableau.

Référent

D'où le visiteur est venu avant d'atterrir sur votre site. "Direct" signifie pas de référent (signets, URLs tapé, certains liens vers des applications).

Appareil et navigateur

Le type d'appareil du visiteur (ordinateur de bureau, mobile, tablette) et le navigateur utilisé (Chrome, Safari, Firefox, etc.).

Date et heure

Lorsque la page a été chargée, dans votre fuseau horaire configuré.

Identité du client

Si le visiteur est identifié (via un jeton d'identité ou de connexion), son nom ou son adresse e-mail apparaît, sinon il s'affiche comme anonyme.

Filtres

plage de dates

Filtrer les visites sur une période spécifique. Par défaut: derniers 7 jours.

Recherche

Recherche par : IP adresse, page URL, référent, pays ou e-mail du client.

Source

Filtrer par source de trafic: Direct, Organique, Social, Référence, Payé, Email.

Appareil

Filtrez par ordinateur, mobile ou tablette.

Nouveau seulement

Affichez uniquement les visiteurs qui ne vous ont jamais vu auparavant.

Exemples de travaux

Trouver des visiteurs provenant d'une campagne spécifique

Scénario :
Vous avez lancé une campagne Google Ads avec le paramètre UTM utm_source=google&utm_medium=cpc&utn_campaign=summer-sale, comment trouvez-vous ces visiteurs?
Que faire:

Dans le journal des visiteurs, utilisez le champ de recherche et tapez « soldes d'été ».URLs et page URLs Vous pouvez également filtrer par Source = Payé pour affiner davantage les résultats.You can also filter by source = Paid to narrow down further.

Recherchez un client qui a signalé un problème

Scénario :
Un client a envoyé un courriel disant « votre page de paiement était cassée hier vers 15h ».
Que faire:

Recherchez leur adresse e-mail dans le journal des visiteurs. S'ils étaient connectés, leur identité apparaîtra. Définissez la plage de dates sur hier. Rechercher les visites aux pages de paiement vers 15h. Cliquez sur leur session pour voir le flux complet de la page et toute erreur JavaScript.

Détecter un boucleur ou un grattoir

Scénario :
Vous remarquez unIPadresse a500+ visites en une heure, toutes sur la même page.
Que faire:

Il s'agit probablement d'un bot, un scraper ou un script endommagé.Allez dans le journal des visiteurs et recherchez par ce mot-clé:IP. Vérifiez: (1) Toutes les visites sont-elles sur la même page? (2) L'agent utilisateur est-il un bot connu? (3) Est-ce que la durée de session est toujours 0 Si vous êtes confirmé comme étant un bot, allez dans Sécurité et bloquez le.IP.

Journal des visiteurs vs Sessions vs Flux en direct

Journal des visiteurs

Idéal pour: enquêter sur des pages spécifiques, trouver du trafic provenant de sources spécifiques, diagnostiquer les problèmes de suivi.

Séances

Une ligne par session de visite. Idéal pour: comprendre le flux des utilisateurs, mesurer la durée de la session, identifier les chemins de conversion.

Flux en direct

Affiche les visiteurs actuellement sur votre site. Idéal pour: surveiller les campagnes en cours, repérer les visiteur à haute intention, observer les opportunités de support.

Pourquoi vois-je mes propres visites dans le journal?+

OpsIQ Pour exclure votre propre trafic, ajoutez vos références à la liste des visiteurs.IPAdresse aux exclus IPs Liste dans Paramètres > Suivi.

Pourquoi un visiteur affiche-t-il le pays "Inconnu"?+

La recherche GeoIP nécessite soit Cloudflare En-têtes géographiques (automatique si vous utilisez )Cloudflare) ou un fichier de base de données MaxMind GeoLite2.Vérifiez Paramètres > Chemin d'accès GeoIP pour vous assurer que le fichier de la base existe et est lisible.

Combien de temps les données des visiteurs sont-elles conservées?+

Les données des visiteurs sont conservées pendant la période de rétention configurée dans Paramètres (par défaut: 90 jours), après quoi les anciens enregistrements sont automatiquement nettoyés par le travail de réception cron.

Analytique

Séances

Les sessions regroupent plusieurs pages vues par la même personne en un seul parcours. Le journal des visiteurs affiche les chargements de page individuels, tandis que les sessions vous montrent comment les utilisateurs se déplacent sur votre site Web depuis l'atterrissage jusqu'à la sortie.

Séances
SéancesLe tableau du journal de session avec les colonnes IP, pays, périphérique, source, durée et pages, ainsi qu'une ligne de menace signalée.Séancesyoursite.comPays (NG)Journal de sessionIP(S)PAYSDISPOSITIFSOURCEDURÉEPAGE41.62.10.4Royaume-UniBureaugoogle3m 12s6102.89.6.2NGMobiledirect1m 05s388.21.4.9DEBureauutm:ads7m 48s11203.0.113.9États-UnisMobilereferral0m 42s21SESSION LOGVoyages en groupe2COLUMNSPays · appareil · source · durée3THREATSessions à risque signalées
Le vrai journal de session : chaque visiteur voyage en ligne (IP, pays, appareil, source, durée et pages) avec des sessions risquées marquées en rouge.

Comment fonctionnent les sessions

Une session commence lorsqu'un visiteur charge sa première page. Elle se poursuit à mesure qu'il navigue vers d'autres pages. Une session prend fin lorsque le visiteur est inactif pendant la période de délai d'attente de la session (par défaut : 30 minutes) ou ferme son navigateur. La même personne qui revient après l'expiration du délai crée une nouvelle session.

Ce que chaque séance montre

Première page

La page d'accueil, où le visiteur a entré votre site. Cela vous indique quel contenu attire les gens.

Dernière page

La page de sortie, où le visiteur est parti. Si la page de départ est souvent la page des prix, les visiteurs pourraient vous comparer avec les concurrents.

Nombre de pages

Plus de pages signifie généralement plus d'engagement, mais cela peut aussi signifier que le visiteur est perdu.

Durée

Les sessions avec 0 secondes sont des rebonds (vue d'une seule page, aucune autre interaction).

Source

La source de trafic pour cette session (direct, Google, social, référence, etc.).

Pays

Pays détecté à partir de l'adresse IP du visiteur.

Bounce

Si le visiteur a quitté la page après avoir consulté une seule page.

Conversion

Si le visiteur a complété un événement de conversion suivi (achat, inscription, envoi d'un formulaire) au cours de cette session.

Filtres

Recherche

Recherche parIP, courriel, pageURL, ou référent dans les sessions.

Type

Filtrer par Nouveaux visiteurs (première session) ou Visiteurs de retour.

Source

Filtrer par source de trafic.

Pays

Filtrer par pays pour voir les sessions d'une région spécifique.

Menaces/Rebondissements

Filtre pour afficher uniquement les sessions rebondies ou signalées comme menaces.

Exemples de travaux

Profiler un client à forte valeur ajoutée

Scénario :
Un client vient de faire un achat important, vous voulez comprendre son parcours avant d’acheter.
Que faire:

Recherchez leur email dans Sessions. Voir toutes leurs sessions : (1) Combien de fois ont-ils visité avant d'acheter? (2) Quelles pages ont-ils consulté? (3) Ont-ils utilisé le chat ou ouvert un ticket? (4) Quel a été le temps total entre la première visite et l'achat?Cela vous indique le parcours d'achet typique pour les clients à forte valeur ajoutée.

Détecter la connexion à partir d'un nouvel emplacement

Scénario :
Un client se connecte généralement depuis le Nigeria, mais vous voyez une session de la Russie.
Que faire:

Recherchez l'e-mail du client dans Sessions. Comparez le pays des sessions récentes. Si une session apparaît soudainement à partir d'un pays inhabituel, il pourrait s'agir de voyages légitimes ou d'une violation du compte.1) Y a-t-il eu une tentative de connexion échouée avant la réussite? (2) A-t-il IP Signalez-le pour examen si vous pensez qu'il est suspect.

Quelle est la différence entre une session et un visiteur?+

Un visiteur est une personne (ou un navigateur). Une session correspond à une seule visite de cette personne. Le même visiteur peut avoir plusieurs sessions au fil du temps. Les sessions expirent après la période d'expiration.

Comment OpsIQ identifie-t-il les visiteurs récurrents?+

OpsIQ utilise une combinaison de cookies, d'empreintes digitales du navigateur et de jetons d'identité authentifiés. Si un visiteur efface ses cookies et n'est pas connecté, il apparaîtra comme un nouveau visiteur.

Analytique

Flux en direct

Le Live Feed affiche les visiteurs actuellement sur votre site en temps réel. Il est mis à jour automatiquement toutes les 15 secondes (configurable). Utilisez-le pendant les campagnes, les lancements de produits et les périodes d'assistance chargées pour voir ce qui se passe en ce moment.

Flux en direct
Flux en directUn flux d'activité en temps réel montrant un compte de visiteurs en ligne et un flux des actions récentes des visiteurs par pays.Flux en directyoursite.com37visitors online nowActivité en directmaintenantÉtats-Unis · consulte /pricing2sFrance · a commencé un chat5sAjouté au panier9sCA · inscription terminée1RIGHT NOWVoir qui est sur place2AUTO-REFRESHMises à jour tous les 15s3ACTEEntrez dans un chat en direct
Voyez qui est sur votre site cette seconde et ce qu'ils font, rafraîchissant automatiquement toutes les 15 secondes.

Comment ça fonctionne

Le flux en direct interroge votre serveur à l'intervalle d'actualisation configuré. Chaque ligne affiche un visiteur actuellement sur votre site : sa page courante, son pays, son appareil, sa source, la durée de sa session et le nombre de pages.

Paramètres

Intervalle de rafraîchissement

Fréquence de mise à jour du flux en direct. Par défaut: 15 Les valeurs inférieures (5-10s) donnent des mises à jour plus rapides mais utilisent davantage de ressources du serveur.30-60s) sont plus faciles sur le serveur mais moins en temps réel.

Seuil actif

How long a visitor is considered "active" after their last page load. Default: 90 seconds. If a visitor loads a page and then reads it for 2 minutes without clicking, they disappear from the live feed after the threshold.

Bouton de pause

Cliquez sur Pause pour arrêter l'actualisation automatique. Utile lorsque vous souhaitez lire les détails sans que la liste soit mise à jour, cliquez sur Reprendre pour redémarrer.

Exemples de travaux

Repérez un lead chaud pendant une campagne

Scénario :
Un visiteur vient de consulter votre page d'accueil, puis les fonctionnalités, puis la tarification et se trouve maintenant sur la page de paiement.
Que faire:

C'est un comportement de haute intention. Dans le flux en direct: (1) Cliquez sur le visiteur pour voir sa session. (2) S'ils démarrent un chat, l'IA aura le contexte complet de leur voyage. (3) S'ils quittent sans acheter, ils deviennent un lead dans la page Leads. (4Envisagez de créer une règle proactive pour afficher un message de chat lorsque les visiteurs atteignent la caisse.

Trop de visiteurs du même IP

Scénario :
Vous voyez20visiteurs de la mêmeIPadresse, le tout sur différentes pages.
Que faire:

Cela pourrait être: (1) Un bureau avec Internet partagé. Vérifiez si les visites ressemblent à de vrais humains (pages différentes, durées raisonnables de la session). (2Un bot ou un racleur. Vérifiez si les sessions sont très courtes (0-1ou frapper systématiquement les pages. (3) Un test de charge. Si vous effectuez des tests automatisés, exclure le IP de traquer.

Pourquoi le flux en direct montre-t-il les visiteurs 0 lorsque mon site a du trafic?+

Vérifiez : (1) Le script du widget est-il installé sur votre site? (2) La clé du site est-elle correcte? (3) Le seuil actif est-il dépassé? (4) Les visiteurs utilisent-ils des bloqueurs de publicité agressifs qui bloquent le script de suivi?

Puis-je filtrer le flux en direct par pays ou appareil?+

Le flux en direct affiche tous les visiteurs actifs. Pour des vues filtrées, utilisez la page Journal des visiteurs ou Sessions avec leurs options de filtrage. Le flux en live est intentionnellement simple pour le suivi en temps réel.

Analytique

Pages haut de page

Les pages les plus consultées indiquent quelles sont les pages de votre site Web qui reçoivent le plus de trafic, en fonction des visites, de l'engagement, des conversions et de l’activité d'assistance. Utilisez cette fonctionnalité pour identifier vos meilleurs contenus, trouver les pages peu performantes et découvrir celles qui génèrent des questions d'aide.

Pages haut de page
Pages haut de pageUne liste classée des pages les plus visitées avec des barres de visite horizontales et des compteurs.Pages haut de pageyoursite.comLes pages les plus visitées/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKEDLes pages les plus visitées2SIGNALSVisites & conversions3FINDPages qui génèrent des tickets
Vos pages classées par trafic et engagement, afin que vous puissiez repérer le meilleur contenu et les pages qui génèrent du soutien.

Ce que chaque page montre

PageURL

Le plein URL Les pages similaires (par exemple, les variantes de produits) sont groupées si le regroupement est activé.

Vues

Nombre total de fois que cette page a été chargée dans la période sélectionnée.

Nombre de visiteurs uniques

Combien de personnes différentes ont consulté cette page (une personne qui consulte la même page deux fois est comptée comme 1 unique).

Taux de rebond

Pourcentage de visiteurs qui ont quitté votre site après avoir consulté cette page uniquement. Un taux élevé de rebond sur les pages d'accueil = problème, et un taux de rebondir élevé sur les « pages de remerciement » = normal.

Temps moyen

Combien de temps les visiteurs passent en moyenne sur cette page. Très court = pas de lecture, très long sur une page de formulaire = confusion.

Le chat commence

Si le chat commence sur une page de produit, cela signifie que la description du produit peut ne pas être claire.

Tickets de support

Nombre de tickets d’assistance créés par les visiteurs présents sur cette page. Un nombre élevé de tickets signale un problème potentiel d’ergonomie ou de contenu.

Exemples de travaux

Trouver des pages qui génèrent des questions d'assistance

Scénario :
Votre équipe d'assistance reçoit sans cesse des questions sur l'expédition. Quelle page ne fonctionne pas?
Que faire:

Recherchez les pages de produits ou d'expédition qui affichent un nombre élevé. La page avec le plus grand nombre de questions relatives à l'assistance contient probablement des informations peu claires. Corrigez le contenu de la page et vérifiez si le nombre de ces questions diminue.

Repérer les pages à fort taux de sortie

Scénario :
Vous voulez savoir où les utilisateurs quittent le plus souvent votre site.
Que faire:

Ignorez les pages qui sont naturellement des points de sortie (pages de remerciement, pages de confirmation). Concentrez-vous sur les pages destinées à retenir l’attention des visiteurs : pages produit, prix, fonctionnalités.

Pourquoi une page affiche-t-elle 0 vues alors que je sais qu'elle a du trafic?+

Vérifiez : (1) Le widget de suivi est-il installé sur cette page spécifique? Les applications à une seule page peuvent ne pas déclencher des pages vues lors de changements d'itinéraire.2) La page est-elle exclue dans les paramètres de suivi? (3Un CDN sert-il une version mise en cache sans le script de suivi?

Analytique

Géo-intelligence

La fonctionnalité Geo Intelligence vous permet de comprendre l'origine de vos visiteurs par pays, ville, appareil et source, ainsi que les marchés géographiques, de décider du support linguistique, de planifier le marketing régional et de détecter des schémas de trafic suspects.

Géo
Géo-intelligenceUne carte des emplacements de visiteurs à côté d'un classement par pays.Géo-intelligenceyoursite.comVisiteurs par localisationÉtats-UnisRoyaume-UniDEPaysNG1MARKETSPays, ville, appareil2PLANLangue & régions3WATCHRepérer le trafic étrange
D'où viennent vos visiteurs (par pays, ville et appareil) à la taille des marchés et repérer le trafic inhabituel.

Ce que vous voyez

Top pays graphique à barres

Cliquez sur un pays pour afficher les données au niveau de la ville.

Beignet de pays

Répartition visuelle du trafic par pays. Passez le curseur pour les pourcentages.

Tableau complet des pays

Chaque pays ayant reçu des visiteurs au cours de la période sélectionnée, avec le nombre de visiteurs, le nombre d'ouvertures de session, le taux de rebond et le taix de conversion.

Déroulement vers le bas

Cliquez sur un pays pour voir les villes de ce pays qui ont le plus de visiteurs.

Comment fonctionne la détection GeoIP

OpsIQ détecte l'emplacement des visiteurs de deux façons: (1) Cloudflare en-têtes géo. Si votre site est derrière Cloudflare, la détection par pays est automatique et précise (2) Base de données MaxMind GeoLite2. Téléchargez la base de données gratuite et configurez le chemin dans Paramètres. La détection au niveau de la ville nécessite la base GeoLité2-City, pas seulement la base Country.

Trafic VPN et proxy

Les visiteurs utilisant des VPN semblent provenir de l'emplacement du serveur VPN, et non de leur emplacement réel. OpsIQ ne peut et ne devrait pas essayer de contourner les VPN. Si vous voyez des modèles de pays inhabituels, considérez que 10-20% des visiteurs peuvent utiliser des VPN.

Exemples de travaux

Trafic de pays inattendu

Scénario :
Vous gérez une entreprise aux États-Unis uniquement, mais 30% du trafic provient de l'Inde.
Que faire:

Vérifiez : (1Regardez la durée de la session et les pages consultées. Des sessions très courtes avec un taux de rebond élevé = des bots probables.2) Est-ce qu'ils vous trouvent via Google? Vérifiez le référent. (3Si le trafic est authentique et engageant, envisagez d’ajouter des prix ou du contenu spécifiques à l’Inde.

Décider du soutien linguistique

Scénario :
Vous voulez savoir si vous devriez traduire votre site en espagnol.
Que faire:

Si les pays hispanophones (Espagne, Mexique, Colombie, Argentine, etc.) représentent ensemble plus de 10% de votre trafic avec des taux de rebond faibles, la traduction vaut la peine d'être envisagée. Vérifiez également: les visiteurs de ces pays convertissent-ils à des taUX similaires à ceux de votre marché principal?

Planification des quarts de travail du soutien régional

Scénario :
Vous devez décider des heures de l'équipe d'assistance pour différents fuseaux horaires.
Que faire:

Utilisez la carte thermique horaire (dans le tableau de bord) combinée avec Geo Intelligence. 40% La majeure partie de votre trafic provient d'Europe et 35% La carte thermique montre exactement quand chaque région est la plus active, ce qui vous permet d'améliorer votre visibilité.

Pays avec des visites mais pas de commandes

Scénario :
L'Allemagne affiche 500 visiteurs ce mois-ci mais zéro vente.
Que faire:

Enquêter : (1) Est-ce qu'ils rebondissent sur la page de prix? Peut-être que votre tarification n'est pas compétitive pour ce marché.2) Livrez-vous en Allemagne? Vérifiez si votre page d'expédition mentionne l'Allemagne. (3) Votre paiement est-il disponible en EUR? Un décalage de devises entraîne des paiements abandonnés. (4) Ces visiteurs proviennent-ils d'une seule source qui pourrait être un trafic à faible intention?

Pourquoi un visiteur affiche-t-il le pays "Inconnu"?+

Soit configurez Cloudflare (qui ajoute automatiquement les en-têtes géographiques) ou téléchargez la base de données MaxMind GeoLite2 et définissez le chemin du fichier dans Paramètres > Chemin GeoIP.

Puis-je bloquer le trafic de pays spécifiques?+

OpsIQ Utilisez votre serveur web ou configurez-le à l'aide d'un navigateur Web. Cloudflare Règles de pare-feu pour le blocage par pays.OpsIQ Se concentre sur la visibilité, pas le contrôle d'accès au niveau du réseau.

Analytique

Entonnoir d'intention

L'entonnoir d'intention classe les sessions des visiteurs en fonction de ce qu'ils semblent essayer de faire : parcourir, rechercher, comparer, acheter, obtenir un support ou quitter. Utilisez-le pour comprendre l'équilibre des intentions sur votre site et identifier où les visiteurs abandonnent.

Entonnoir d'intention
Entonnoir d'intentionUn entonnoir de la recherche à la recherche pour comparer à l'achat avec des comptes, plus le soutien et laissant les jetons.Entonnoir d'intentionyoursite.comParcourir · 8,200Recherche · 4,100Comparer · 1,650Acheter · 520Soutien 6%Quitter 11%1CLASSIFYCe que les visiteurs veulent2STAGESParcourir pour acheter3FIXETrouver le point de dépôt
Sessions classées par intention (parcour, recherche, comparaison, achat) afin que vous puissiez voir exactement où les gens déposent.

Catégories d'intention

Navigation

Visiteurs regardant autour d'eux. Sessions courtes, peu de pages, aucun objectif spécifique détecté.

Recherche

Visiteurs lisant des pages de produits/fonctionnalités, des documents ou du contenu de blog. Temps sur la page plus long, plusieurs pages de contenu.

Comparaison

Les visiteurs qui consultent les prix, la comparaison des forfaits ou les tableaux de fonctionnalités.

Achat

Visiteurs à la caisse, au panier ou aux pages d'inscription. Haute intention. Ce sont vos possibilités de conversion.

Recherche d'appui

Les visiteurs sur les pages d'aide, les pages de contact ou qui démarrent un chat.

Rebondissant

Les visiteurs qui ont quitté après une page. Faible engagement.

Comment lire l'entonnoir

Interpréter votre entonnoir

Scénario :
1,000 visitors viewed Pricing. 270 opened chat. 92 started checkout. 64 paid. 18 opened support tickets.
Que faire:

La page de tarification est assez forte pour créer une intention. Le chat est important dans le chemin d'achat: 27% Les tickets de support après la commande peuvent indiquer l'activation ou la confusion du paiement. Action: (1) Assurez-vous que le chat AI répond bien aux questions de prix. (2) Enquêter sur 18 les tickets d'assistance post-vérification pour les questions communes.

Filtres de temps

Utilisez le filtre de la plage de dates pour comparer les tendances d'intention entre les périodes. Par exemple, comparez la semaine du vendredi noir à une semaine normale. Vous devriez voir un pic dans l'intention "Acheter" et éventuellement "Support-cherching" si vos promotions ont créé de la confusion.

Comment OpsIQ classe-t-il l'intention?+

OpsIQ Vues sur la page URLs Les pages de tarification indiquent une intention de comparaison. Les pages d'achat indiquent l'intention d'acquérir un produit. Les page d'aide/de contact indiquent la volonté de prendre en charge le client.

Puis-je personnaliser les catégories d'intention?+

Pas pour le moment. Les catégories sont intégrées en fonction des modèles de comportement Web courants, et la classification personnalisée d'intention est prévue dans la feuille de route.

Analytique

Entonnoirs, rétention et cheminement

Créez des parcours personnalisés à partir d'étapes de page ou d'événement, mesurez la rétention de cohorte et découvrez les chemins que les visiteurs empruntent le plus souvent sur un site.

Écran de produit
EntonnoirsUn entonnoir personnalisé affiche chaque étape de page/événement, les visiteurs restants et le pourcentage de conversion.Entonnoirsespace de travailSTEPS4CONVERSION28.4%WINDOW72hVUE DE L'ESPACE DE TRAVAIL EN DIRECTPrix consulté1,420 visiteurs100%Plan sélectionné780 visiteurs54.9%Le checkout a commencé530 visiteurs37.3%Commande complétée403 visiteurs28.4%1DEFINEChoisir 2–8 étapes2MESUREDéfinir la fenêtre de conversion3AMÉLIORERTrouver la plus grande baisse
Un entonnoir personnalisé affiche chaque étape de page/événement, les visiteurs restants et le pourcentage de conversion.

Entonnoirs

Créer un entonnoir nommé avec 2à8 Définissez la fenêtre de conversion en heures ; un visiteur est compté uniquement lorsque les étapes ordonnées se produisent dans cette fenêtre. Utilisez le décalage entre les étape pour choisir où inspecter la rejouabilité, les erreurs, la vitesse de page ou la messagerie.

Conservation

La rétention regroupe les visiteurs en cohortes hebdomadaires et montre combien d'entre eux retournent. 6, 8 ou 12 Gardez la définition de cohorte stable lors de la comparaison des sorties ou des campagnes.

Chemin

Chemins liste les séquences de pages les plus courantes. Choisissez une longueur de chemin à partir2à5les pages pour garder le résultat lisible. Utilisez-le pour trouver des détours inattendus, des sorties communes et du contenu qui précède à plusieurs reprises la conversion.

Pour réagir à une étape terminée, créez un objectif de conversion, un segment, un déclencheur ou un flux de travail.

Analytique

Relecture de session

La fonctionnalité Replay de session vous permet d'afficher une chronologie des actions effectuées par un visiteur sur votre site : les éléments sur lesquels il a cliqué, la façon dont il a fait défiler le contenu, l'endroit où il s'est arrêté et ce qu'il a saisi (les champs sensibles étant masqués).

Relecture de session
Relecture de sessionUn lecteur de replay affichant une fenêtre de page avec un curseur, un panneau d’informations sur la session et un déflecteur de timeline.Relecture de sessionyoursite.comAcheter maintenantSESSIONDurée 3m 12s14 clicsUS · BureauChrome 1241WATCHCliques, défilement, saisie2MASKEDChamps sensibles cachés3DIAGNOSEVérifier les rapports de bogue
Rejouez exactement ce qu'un visiteur a fait : clics, défilements, saisie (champs sensibles masqués), sur un épurateur de timeline.

Trouver la bonne session

Dans la page Sessions, recherchez les sessions comportant des problèmes signalés, un nombre élevé de pages sans conversion ou des sessions provenant de clients qui ont déposé des tickets d’assistance.

Ce que montre le replay

Chronologie

Une barre horizontale affichant les événements au fil du temps. Cliquez n’importe où sur la chronologie pour passer à ce moment-là.

Navigation de la page

Chaque chargement de page apparaît comme un segment sur la timeline, vous pouvez voir le chemin exact que le visiteur a emprunté.

Cliques

Les événements de clic sont affichés sous forme de points sur la timeline et en surbrillance sur la reconstruction de page.

Défilement

La profondeur de défilement est suivie afin que vous puissiez voir jusqu'où le visiteur a lu.

Interaction de formulaire

La saisie de texte dans les champs à mot de passe et sensibles est masquée par défaut.

Confidentialité et masquage

Les champs de mot de passe, les saisies de carte bancaire et les champs marqués avec data-opsiq-mask ne sont jamais enregistrés. Vous pouvez configurer des règles de masquage supplémentaires dans Paramètres > Suivi. Si votre stratégie de conformité l’exige, vous pouvez désactiver complètement la lecture en continu.

Diagnostiquer un checkout cassé

Scénario :
Un client dit "J'ai essayé d'acheter mais le bouton n'a rien fait."
Que faire:

Recherchez leur session dans la page Sessions (recherche par e-mail). Ouvrez le replay. Regardez le segment de la page de paiement.1) Ont-ils cliqué sur le bon bouton? (2) Did a JavaScript (Consultez la page Erreurs JS à ce moment-là.)3) La page a-t-elle été rechargeée ou affiché un message d'erreur? (4) Un champ obligatoire était vide? Le replay montre exactement ce qui s'est passé.

Quel volume de stockage la relecture de session utilise-t-elle ?+

Pour les sites à trafic élevé, envisagez une période de conservation plus courte (par exemple 30 jours) afin de gérer le stockage. Pour les sites avec un trafic faible, envisagent une période plus longue (par ex.

Les visiteurs peuvent-ils refuser la retransmission?+

Si l'option "Respecter Do Not Track" est activée dans les paramètres, les visiteurs avec des en-têtes DNT ne sont pas enregistrés. Vous pouvez également exclure certaines pages de la lecture dans les réglages de suivi.

Analytique

Journal des événements

Le journal des événements affiche tous les évéements enregistrés par OpsIQ (page vue, clics, démarrage de chat, création de ticket, vente et évéments personnalisés) pour vous aider à déboguer vos intégrations, vérifier la livraison du webhook et comprendre l'ordre d'action.

Journal des événements
Journal des événementsUn journal chronologique des événements avec des badges de type codés par couleur: pageview, chat, vente, webhook et personnalisé.Journal des événementsyoursite.compageviewÉtats-Unis · /pricing12:04:01chat.startRoyaume-Uni · widget ouvert12:04:09vente$49.00 · numéro de commande 104212:05:22webhookpayment.succeeded12:05:23customdemo_booked12:06:101EVERYTHINGChaque événement enregistré2DEBUGVérifier la livraison du webhook3ORDERVoir la séquence exacte
Une chronologie de tout les enregistrements OpsIQ (pageviews, chats, ventes, webhooks, événements personnalisés) pour le débogage et l'audit.

Événements intégrés (automatiques)

⚠️
Voici events-log noms — quels OpsIQ documents sur la timeline du visiteur pour l'analyse, le débogage et la vérification. webhook sortant Si vous construisez un récepteur webhook, utilisez la liste dans la section Webhooks ou appelez webhooks.events.list; s'abonner à un nom de cette table ne donnera rien.

Chaque ligne indique le nom que vous avez envoyer et le nom canonique OpsIQ magasins les deux sont enregistrés : le nom brut que vous avez envoyé, et celui canonique qu'il map à, ainsi un rapport écrit contre la taxonomie canonique continue de fonctionner quel alias un tracker utilisé.

pageview page.viewed

Une page de suivi des charges. Comprend URL, titre, référent et timestamp. page_view et view sont acceptées comme la même chose.

chat_open support.chat_opened

Un visiteur ouvre le widget de chat.

chat_send support.chat_message_sent

Un visiteur envoie un message de chat. Le côté réponse est stocké comme support.chat_message_received.

ticket_open support.ticket_created

Un ticket de support est créé. ticket_create est accepté comme la même chose; les réponses et les fermetures sont stockées support.ticket_replied et support.ticket_closed.

form_submit form.submitted

Un formulaire suivi est soumis. submit est accepté comme la même chose.

purchase commerce.purchase_completed

Un achat est terminé. purchase_success, et les alias de vente order.completed, sale.completed, payment.completed et invoice.paid, sont tous acceptés d'une plate-forme connectée.

Checkout commerce.checkout_started

La vérification commence. cart_view, checkout_view, checkout_intent, checkout_abandon, add_to_cart.

login_success identity.signed_in

Un visiteur s'inscrit. login_failed, stocké comme identity.login_failed; un lock-out est login_lockout_created.

inscription conversion.signup

Un visiteur complète une inscription. lead, stocké comme conversion.lead.

js_error error.js

Une erreur JavaScript est capturée sur une page suivie.

💡
Un nom d'événement que vous envoyez qui n'est pas un de ces alias est toujours enregistré in extenso — rien n'a été laissé tomber. Il n'y a tout simplement pas de cartographie canonique, donc il ne se retrouvera pas dans les rapports basés sur la taxonomie.

Événements personnalisés

Vous pouvez envoyer des événements personnalisés depuis votre site Web ou serveur à OpsIQ. Les évéements personnalisé sont utiles pour suivre les actions spécifiques à votre entreprise: clics sur un bouton, utilisation de fonctionnalités, lectures vidéo, téléchargements, etc.

JavaScript · événement personnalisé depuis le navigateur
// Send a custom event from the browser
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "plan_selected", {
  plan: "pro",
  billing: "annual",
  value: 99
}]);
PHP · enregistrer une activité de contact depuis votre serveur
// Record a server-side activity for a contact (PHP)
$ch = curl_init("https://your-opsiq-domain.com/api/v1.php");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer opq_your_key",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "action" => "crm.activities.record",
        "site_key" => "site_abc123",
        "email" => "[email protected]",
        "event" => "subscription.upgraded",
        "value" => 50,
        "currency" => "USD",
    ]),
]);
$response = curl_exec($ch);
curl_close($ch);

Filtrage des événements

Type d'événement

Filtrer par noms d'événement spécifiques: pageview, chat. started, ticket. created, etc.

plage de dates

Afficher les événements d'une période de temps spécifique.

Recherche

Recherchez les données d'événement par mot-clé (URL, e-mail, valeurs de propriété d'évènement).

Combien de temps les événements sont-ils conservés?+

Les événements suivent la stratégie de conservation définie dans Paramètres. Par défaut: 90 jours. Les évéements à forte valeur (achats, évéments de sécurité) peuvent être configurés avec une rétention plus longue.

Puis-je utiliser des événements dans les expériences A/B?+

Oui. Lorsque vous créez une expérience, vous choisissez un événement de conversion. Tout évéement intégré ou personnalisé peut être utilisé comme objectif de conversion, mais il ne doit pas être le même pour tous les utilisateurs.

Analytique

Expériences A/B

Les expériences vous permettent de tester deux versions d'une page ou fonctionnalité et de déterminer celle qui fonctionne le mieux. OpsIQ Suivre les impressions, conversions et signification statistique.

Expériences A/B
Expériences A/BDeux cartes de variante comparant les taux de conversion, avec un badge gagnant et une signification sur la variante principale.Expériences A/Byoursite.comVariante A4.2%Conversion · 1,020 vuesVariante BGRANDS6.8%Conversion · 1,005 vues+62% Ascenseur · 96% significative1ESSAIDeux variantes en tête-à-tête2MESUREConversions & signification3DÉCIDEDéclarer un gagnant
Exécutez deux variantes, observez les conversions et la signification statistique, puis déclarez le gagnant.

Comment fonctionnent les expériences

1
Créer une expérience

Donnez-lui un nom, définissez votre statistique principale (événement de conversion) et configurez les variantes (contrôle et test).

2
Exécutez-le

OpsIQ affecte de manière aléatoire les visiteurs à des variantes et suit leur comportement. Ne modifiez pas l'expérience pendant son exécution.

3
Lire les résultats

Une fois que suffisamment de données ont été recueillies, vérifiez le niveau de confiance. 95% la confiance signifie que vous pouvez être _95% sûr que la différence est réelle et non aléatoire.

États de l'expérience

Brouillon

Créée mais pas encore démarrée. Vous pouvez toujours modifier les variantes et statistiques.

Exécution

Attribuer activement les visiteurs aux variantes. Ne pas modifier pendant l'exécution.

Terminé

Atteint la signification statistique ou a été arrêté manuellement. Les résultats sont définitifs.

Archivé

Les résultats ont été examinés et l’expérience n’a plus sa place dans la liste active.

Les meilleures pratiques

Définissez votre métrique avant le lancement

Choisir une mesure après avoir vu les résultats introduit un biais, et vous risquez de ne pas être satisfait.

Exclure le trafic interne

Ajoutez les adresses IP de votre équipe à la liste d'exclusion afin que les visites du personnel ne fassent pas biaiser les résultats.

Courir assez longtemps

N'arrêtez pas une expérience après 100 visiteurs, car vous avez besoin de centaines ou de milliers de visiteurs par variante pour obtenir des résultats fiables.

Tester un changement à la fois

Si vous changez le titre ET la couleur du bouton, vous ne saurez pas quel changement a causé l'amélioration.

Enregistrez votre décision

Une fois l’expérience terminée, notez quelle variante a gagné et pourquoi vous avez choisi de la mettre en œuvre.

De combien de visiteurs ai-je besoin pour une expérience valide?+

Cela dépend du taux de conversion de base et de la taille de l'effet que vous voulez détecter. En règle générale, au moins 500 visiteurs par variante pour une 20% Pour les effets plus petits, vous avez besoin de milliers.

Puis-je exécuter plusieurs expériences en même temps?+

Oui, mais attention : si deux expériences affectent la même page, leurs résultats peuvent interagir. Il est plus sûr d'exécuter des expériences sur différentes pages ou fonctionnalités en même temps.

Analytique

JavaScript erreurs

JavaScriptErreurs collecte des erreurs côté client de votre site Web visiteurs. Un bouton cassé, un échecAPIappel, ou une ressource manquante apparaît ici. Utilisez-la pour trouver et corriger des bugs qui affectent les clients réels.

Erreurs de JS
JavaScript erreursUne liste des erreurs front-end capturées avec les points de gravité, le fichier source, le navigateur et le nombre d'occurrences.JavaScript erreursyoursite.comLes erreurs récentesTypeError: impossible de lire x d'undefinedCommentaires sur checkout.js:42 · Chrome×214404 chargement /assets/app.cssAccueil · Safari×88Non attrapé (en promesse) NetworkErrorapi.js:17 · Firefox×51Avertissement de dépréciation: unload eventVendeur. js · Edge×331CAPTUREErreurs côté client2IMPACTCompteurs & navigateurs3FIXESquash vrais bugs
De vrais visiteurs qui frappent la surface de code cassée ici (message, source, navigateur et à quelle fréquence) pour que vous puissiez résoudre ce qui compte.

Ce que chaque erreur indique

Message d'erreur

Le texte d'erreur JavaScript (par exemple, "TypeError: Cannot read properties of undefined").

PageURL

Sur quelle page l'erreur s'est produite.

Navigateur et appareil

Le navigateur et le type d'appareil qui ont généré l'erreur. Certaines erreurs sont spécifiques au navigateur.

Pile de trace

L'emplacement du code où l'erreur s'est produite. Cliquez pour développer la trace de pile complète.

Première fois vu

Lorsque cette erreur est apparue pour la première fois.

Dernière fois vu

Quand cette erreur s'est produite la dernière fois.

Compte

Combien de fois cette erreur a été enregistrée.

Sessions affectées

Combien de sessions différentes ont connu cette erreur.

Hiérarchisation des erreurs

Pas tous JavaScript Les erreurs nécessitent une attention immédiate. Prioriser par: (1) erreurs sur les pages critiques (caisse, inscription, connexion), (2) des erreurs avec un nombre élevé de sessions, (3) des erreurs apparues récemment (régression possible d'un changement de code), (4) des erreurs sur votre propre code (pas de scripts tiers).

Réparation d'un bouton de paiement cassé

Scénario :
La page Erreurs JS affiche "TypeErreur: Impossible de lire les propriétés de non-défini (lecture de soumettre)" sur/checkout,affectant45Cette semaine.
Que faire:

Cela signifie : 45 Les clients réels n'ont pas pu compléter le paiement. Étapes: (1) Ouvrez la page dans le même navigateur/appareil. (2) Ouvrez la console du navigateur et reproduisez l'erreur. (3) Vérifiez la trace de pile pour trouver la ligne exacte du code. (4) Corrigez le bogue, déployez et surveillez le nombre d'erreurs allant à zéro.

OpsIQ capture-t-il les erreurs des scripts tiers?+

Oui, OpsIQ captures all JavaScript Les erreurs sur la page, y compris les erreurs provenant des scripts d'analyse, des widgets de chat et les scripts publicitaires. URL Dans la trace de pile pour se concentrer sur votre propre code.

Comment puis-je exclure les erreurs connues inoffensives?+

Vous ne pouvez pas supprimer des erreurs spécifiques dans OpsIQ, mais vous pouvez filtrer la liste par page URL Corrigez ou ignorez les erreurs provenant des extensions du navigateur (elles apparaissent souvent sous la forme d'erreurs de sources inconnues).

Ventes

Ventes et conversions

Le suivi des ventes connecte votre boutique ou plateforme de facturation à OpsIQ afin que vous puissiez voir les revenus en même temps que le comportement du visiteur. Chaque achat est attribué au parcours du visiteurs, ce qui vous permet de savoir quelles pages, campagnes et canaux génèrent des revenus.

Ventes
VentesL'écran des ventes: un total de revenus avec une période de contrôle All-time, une recherche et un tableau Achats récents (date, client, plateforme, montant, source).Ventesyoursite.comREVENUS$42,180+18%Tout le temps ▾Recherche par email, IP, numéro de commande…Achats récentsDATECLIENTPLATFORMEMONETSOURCEJuin 3[email protected]Shopify$49googleJuin 3[email protected]WooCommerce$129directJuin 2[email protected]Stripe$480publicités1REVENUSCommandes & renouvellements2RECENT PURCHASESDate · client · montant3ATTRIBUTEDVers la source de trafic
L'écran de vente réel, les revenus en haut, puis les achats récents (date, client, plate-forme, montant), chacun attribué à sa source de trafic.

Tableau de bord des ventes

Les ventes d'aujourd'hui

Revenu des commandes passées aujourd'hui. Actualise à chaque nouvel événement de commande depuis votre plateforme connectée.

Cette semaine / ce mois-ci / total

Les revenus cumulés au cours de la période. Les remboursements sont soustraits de ces totaux.

Graphique de tendance

Recherchez les pics (promotions, campagnes) et les creux (problèmes, saisonnalité), puis affinez votre recherche en fonction de ces données.

Top sources de conversion

Quelles sources de trafic mènent au plus grand nombre d'achats. Les acheteurs « directs » ont souvent mis votre site en favoris, tandis que les acheteurs Google vous ont trouvé par le biais des recherches.

Les achats récents

Les dernières commandes avec l'adresse e-mail du client, le montant, la devise et les articles achetés.

Achats non confirmés (voyage du client)

Lorsque le traqueur voit un visiteur atteindre une confirmation d'achat dans le navigateur mais qu'aucune plate-forme connectée n'a encore signalé que la vente, le parcours client montre une ligne d'Achat (non confirmée) avec un badge ambre. Il ne compte jamais comme revenus.

Rapprochement

Les connecteurs de vente ne dépendent pas d'un seul webhook. Chaque signal de paiement envoyé par la plate-forme peut ouvrir la vente, et le contrat de connexion 2.3 relise la propre liste des ventes de la plateforme sur un horaire (par défaut horaire par espace de travail) afin qu'un webhook la plate-forme jamais livré ne puisse pas perdre une vente. Les opérateurs peuvent l'exécuter à la demande de la ligne de commande avec tools/sales_reconcile.php.

Guides de configuration de la plateforme

Shopify

Aller à Connecteurs >Shopify. Créez une application personnalisée dans votre.Shopify admin (Paramètres > Applications et canaux de vente > Développer des applications). Champ d'application de l'autorisation: read_orders, read_customers et read_products. API Jeton d'accès. Dans OpsIQ, entrez le domaine de votre boutique (par ex. your-store.myshopify.com) et le jeton d'accès. Cliquez sur Tester la connexion. Si cela réussit, activez la synchronisation webhook pour les notifications de commande en temps réel.

WooCommerce

Aller à Connecteurs >WooCommerce Dans votre. WordPress admin, go to WooCommerce> Paramètres > Avancé > REST API. Créez une clé avec autorisation de lecture/écriture. Copiez la clé et le secret du consommateur. OpsIQ, entrez votre site URL, la clé du consommateur et le secret du consommteur. Cliquez sur Tester la connexion.

BigCommerce

Accédez à Connecteurs > BigCommerce. Dans votre administrateur BigCommerce, accédez à Paramètres avancés >API Création d'un compte V2/V3 API Copiez le jeton d'accès, l'ID du client et la clé de connexion dans les champs correspondants.API Entrez-les dans le champ. OpsIQ et test.

Magento 2

Allez dans Connecteurs > Magento. Dans votre admin Magento, allez dans Système > Intégrations et créez une nouvelle intégration avec. API Activez l'intégration et copiez le jeton d'accès. Entrez-le dans, puis cliquez sur OK. OpsIQ Avec votre base Magento URL.

PrestaShop

Allez dans Connecteurs > PrestaShop. Dans votre administrateur Prestashop, allez dans Paramètres avancés > Webservice. Activez le webservice et créez une nouvelle clé. Accorder l'accès aux commandes, clients et produits. Copier la clé et entrer-la dans OpsIQ Avec votre magasin. URL.

OpenCart

Allez dans Connecteurs > OpenCart. Générer API Entrez les informations d'identification de votre panneau d'administration OpenCart.API URL, nom d'utilisateur et mot de passe OpsIQ. Le connecteur utilise le REST d'OpenCart API Pour les données de commande et client.

osCommerce

Allez dans Connecteurs > osCommerce. Configurer l'accès à la base de données ou API L'intégration osCommerce nécessite généralement un accès direct à la base de données ou une connexion personnalisée.API Module.

Stripe

Accédez à Connecteurs > Stripe. Copiez votre compte Stripe restricted API Cliquez sur la clé dans le tableau de bord Stripe (Développeurs >API La clé doit avoir un accès en lecture aux clients, frais, factures et abonnements. Entrez-la dans le champ OpsIQ Configurer le point de terminaison webhook pour les événements en temps réel.

Personnalisé / autres plateformes

Utiliser le REST API Envoyez des événements order.completed avec l'adresse e-mail du client, le montant, la devise et les articles. Voir les Événements API Section pour le format de la charge utile.

Comprendre votre entonnoir de vente

Top sources de conversion

Affiche quels canaux apportent des clients payants. Si Google apporte 1000 visiteurs et 50 les ventes, c'est un5% taux de conversion. Si email apporte 200 visiteurs et 30 les ventes, c'est-à-dire 15%. L'email est plus efficace par visiteur.

Remboursements

Les commandes remboursées sont suivies séparément et réduisent votre chiffre d'affaires net total. Si les taux de remboursement sont élevés pour une source donnée, il est possible que le trafic soit de mauvaise qualité.

Manipulation des devises

OpsIQ stocke la devise et le montant originaux de la transaction. Les entreprises multidevises voient leurs revenus dans chaque devise, tandis que les rapports normalisés utilisent le taux de change configuré.

Exemples de travaux

100 visiteurs, zéro vente

Scénario :
Votre page de tarification reçoit 100 visiteurs par jour mais aucune conversion.
Que faire:

Enquêter sur: (1) Utilisez Session Replay sur les visiteurs de la page de prix. Regardez comment ils interagissent avec le tableau de prix (2) Consultez les pages en haut pour connaître le taux de rebond et le temps sur la page des prix. (3) Consultez les conversations de discussion des visiteurs de la page de prix. Quelles questions posent-ils? (4) Comparez votre page de prix aux concurrents. (5) Essayez une expérience A/B avec différentes mises en page de tarification.

Attribution pour une campagne marketing

Scénario :
Vous avez envoyé une campagne email avec des balises UTM, comment mesurez-vous son impact sur les revenus?
Que faire:

Allez dans Ventes et filtrez par source. Recherchez le paramètre UTM de la campagne, vous verrez: (1) Combien de visiteurs sont venus du courriel. (2) Combien ont converti en ventes. (3) Revenu total attribué à la campagne. (4) Par rapport à la même période avant la campagne.

Pourquoi les ventes affichent-elles zéro alors que ma boutique a des commandes?+

Vérifiez : (1) Le connecteur de plateforme est-il connecté et en bon état? Allez dans Connecteurs et vérifiez l'état. (2) La synchronisation webhook est-elle activée? Si vous utilisez le polling, la tâche cron est en cours d'exécution? (3) Le connecteur a-t-il le droit API Pour? Shopify, vous avez besoin de read_orders.

Comment OpsIQ attribue-t-il une vente à un visiteur?+

Lorsqu'une commande est reçue via le connecteur, OpsIQ fait correspondre l'adresse e-mail du client à un visiteur connu. Si le visiteur a été suivi avant l'achat, la vente est attribuée au parcours de son visiteur, y compris la source de trafic, la page de destination et l'historique des sessions.

Puis-je ajouter manuellement des ventes?+

Vous pouvez envoyer des événements de vente via le REST API Le format des événements est documenté dans la section Events (Événements).API section.

Commerce

Construire, lancer et exploiter le Storefront natif

Le Storefront estOpsIQIl s'agit d'une boutique native pour les produits, pages, livres de présentation, panneaux promotionnels, caisse, comptes clients et vente assistée par l'IA dans le Chat Client et les canaux sociaux pris en charge.

Début de la commercialisation → Front de magasin

1
Choisissez l'espace de travail

Confirmez le site que vous configurez. Les produits, les paramètres, les pages, les commandes et l'analyse sont isolés de cet espace de travail.

2
Activer le commerce électronique et Storefront

Paramètres généraux → Le commerce électronique est l'autorité mère. L'édition, la création et les paiements en magasin restent séparés afin que vous puissiez prévisualiser un catalogue en toute sécurité.

3
Publier les produits complets

Définir le type de produit, prix, devise, inventaire, variantes/options, médias et réalisation. Prévisualiser les choix de produit et de caisse avant publication.

4
Configurer le paiement et l'exécution

Connectez une passerelle ou ajoutez un virement bancaire, un paiement comptant ou un paiement de comptoir. Les biens matériels ont besoin de zones de livraison ou de collecte; les biens numériques ont besoin d'un fichier ou d'une code protégé.

5
Exécution de la phase de lancement

Réparer chaque bloqueur et examiner chaque avertissement, puis compléter une commande de bac à sable du magasin public.

Débuter A propos et contenu de la politique

Les magasins nouveaux et mis à niveau reçoivent un texte de démarrage modifiable pour À propos de nous, Termes et conditions, Confidentialité, et Remboursements et retours Lorsque ces champs sont vides. La copie marchande existante n'est jamais écrasée.

  • Remplacer chaque [Add …] rapide et rapide TEMPLAIRE DE DÉmarrage avis avant le lancement.
  • Utilisez le nom légal réel, l'itinéraire de contact, les promesses de réalisation, les règles de retour, les pratiques en matière de données, les périodes de conservation et les marchés desservis.
  • Obtenir des conseils appropriés aux produits et aux pays que vous servez. Le démarrage est une orientation opérationnelle, pas un conseil juridique.

Conception, pages et promotions

Thème et conception des pages

Choisissez un thème et une composition en couleurs curées, puis accordez la typographie, les remplissages/gradients, les formes, la largeur, le mouvement, le vol stationnaire et le comportement lumière/obscurité.

À propos, Contact, Afficher/Lookbook et Compte

Construisez chaque page à partir de blocs réordonnés. Chaque bloc a des variantes de conception premium. Gardez des blocs de revendication tels que les statistiques, l'équipe, les prix ou les citations jusqu'à ce que leur contenu soit vrai.

Pages personnalisées

Définir le titre, la limace, le héros, SEO et les blocs commandés; prévisualiser pendant le brouillon, puis publier. Les itinéraires de stockage réservés tels que panier, caisse, compte et politiques ne peuvent pas être réutilisés.

Boutons publicitaires et panneaux latéraux

Créez une page modale avec au moins un bloc. Choisissez la conception premium, le placement centre/gauche/droit/fond, la charge/delay/sortie/clic déclencheur, fond, mouvement, largeur, coupon et comportement une fois par visiteur. Testez la fermeture, le clavier et la mise en page du téléphone.

Menus et pied de page

Lien vers des pages, des produits, des collections, des politiques, des actions de compte/aide/cart, des modes en direct ou des éléments externes sûrs URLs. Les éléments d'en-tête supportent un niveau déroulant/méga-menu.

Chat client et ordres sociaux

Activer la vente de la discussion client, puis choisir où les clients peuvent acheter. L'assistante recherche le catalogue et demande au serveur une soumission faisant autorité; le serveur – pas le modèle – crée la carte de commande signée. La confirmation se produit uniquement par l'intermédiaire de cette carte sur le web ou l'interaction vérifiée sur le canal social.

WhatsApp, Messenger, Instagram, Telegram, LINE, SMS et X utilisent le compte de canal vérifié par le fournisseur en tant qu’identité du canal. Les e-mails sont toujours collectés pour les reçus.La commande via un connecteur conserve son contrat universel signé et son total autorisant le commerçant; la configuration Storefront ne modifie pas ce contrat.

Magasin Analyse des renseignements

Consultez les visiteurs uniques, les vues des produits, les ajouts de panier, les départs/abandons/complétions de caisse, la conversion, les commandes confirmées, les revenus par devise, l'acquisition, les appareils, les pays/villes, des produits haut, la récupération et les avertissements de qualité des données.

GénéralitésOpsIQ API

Utilisez une clé au porteur avec commerce.read; analytics.read L'espace de travail lié par la clé fait autorité.

Lits en avant de magasin
{ "action": "commerce.storefront.get" }
{ "action": "commerce.storefront.catalog.get" }
{ "action": "commerce.pages.list", "kind": "modal", "status": "live" }
{ "action": "commerce.analytics.snapshot", "range_days": 30 }
{ "action": "commerce.readiness.get" }
{ "action": "commerce.products.list", "filters": { "active": true } }

Storefront get retourne la configuration publique, URL, les menus et l'état de starter-review. Storefor catalogue renvoie chaque thème, conception de page, type de bloc, composition de bloc et shell promotion premium pour que les constructeurs distants ne codent jamais les choix. Pages liste retourne les pages personnalisées et les modes premium. Analytics retourne les agrégats sans identité client. Readiness retourne des vérifications de lancement actionnables. OpenAPI et Postman utilisent ces mêmes contrats.

Dernière étape avant le lancement

  1. Bureau et téléphone: accueil, recherche, produit/variant, panier, validation de caisse, compte, suivi, téléchargements, A propos, Contact, politiques, lookbook, pages, menus et chaque promotion en direct.
  2. Effectuez un paiement en bac à sable et vérifiez l'état de commande, la réception, le stock et l'exécution.
  3. Placez une commande de Chat Client et une commande en boîte de fournisseurs sur chaque canal social activé.
  4. Confirmez que ces événements apparaissent sous la bonne surface et la bonne monnaie dans le service de renseignements.
⚠️
Le texte de la politique de démarrage rend un magasin non vide, mais il ne fait pas la copie juridique examinée.
Ventes

Plombs

Leads sont des visiteurs ou des clients qui montrent l'intention d'acheter ou de soutenir.OpsIQdétecte automatiquement les leads en fonction du comportement: visites de page de prix, visites de retour, interactions de chat, démarrage de la commande et engagement élevé. Utilisez la page Leads pour prioriser le suivi et alimenter votre CRM pipeline.

Plombs
PlombsL'écran Leads: un tableau interrogeable avec IP/email, emplacement, périphérique, source et temps sur le site, ainsi que la principale source et le pays.Plombsyoursite.comSearch IP, ville, pays…Source principale : google · Pays principal : États-UnisIP / EMAILLOCALISATIONDISPOSITIFSOURCEHEURE41.62.10.4Royaume-Uni · LondresMobilegoogle4m 12s[email protected]États-Unis · New YorkBureaudirect7m 02s[email protected]DE · BerlinMobileutm:ads5m 40s203.0.113.9CA · TorontoBureaugoogle3m 28s1DETECTEDVisiteurs à haute intention2TOPSources de lead & pays3ENRICHEDIP, localisation, dispositif, temps
L'écran Leads réel, les visiteurs à haut niveau d'intention comme une table consultable (IP/email, emplacement, appareil, source, temps sur le site) avec les sources et les pays les plus importants.

Ce qui fait un lead

Tarification des visites de page

Les visiteurs qui consultent votre page de tarification ou de forfaits envisagent activement un achat.

Visites de retour

Les visiteurs qui reviennent plusieurs fois sont engagés mais pas encore convertis.

Interactions de chat

Les visiteurs qui commencent un chat cherchent activement de l'aide, soit avant l'achat ou après l'acquisition.

Le checkout commence

Les visiteurs qui atteignent la page de paiement mais ne terminent pas l'achat.

Formulaire de soumission

Les visiteurs qui soumettent un formulaire de contact, une demande de démo ou un formulaires d’inscription.

Engagement élevé de la page

Les visiteurs qui consultent de nombreuses pages avec une longue durée de session font des recherches approfondies.

Panneau de détail

Cliquez sur n'importe quel lead pour voir son profil complet:

Identité

Nom, adresse e-mail et société si connu. Les prospects anonymes affichent IP et leur emplacement.

Séances

Toutes les sessions de ce lead avec flux de page, durée et source.

Pages consultées

Toutes les pages qu'ils ont visitées, classées par récentes.

Source

Comment ils vous ont trouvé : organique, payé, social, par renvoi, direct.

Score du prospect

Un score de 0 à _100 basé sur l'intensité du comportement, la récente et l'intention de page.

État du CRM

Si ce lead a été ajouté au CRM en tant que contact ou offre.

Astuce de vente

Proposition générée par l'IA sur la suite à donner (p. ex. 3 temps · envisager une approche proactive").

Badge de lead à haute valeur

Les prospects dont le score est supérieur à 80 obtiennent un badge « Valeur élevée ». Ce sont vos meilleurs prospects, que vous pouvez hiérarchiser pour les sensibiliser, leur proposer une discussion proactive ou les inclure dans votre pipeline CRM.

Exemples de travaux

Travailler une piste chaude

Scénario :
Un prospect a consulté votre page de tarification 3 times in 2 Il y a quelques jours, j'ai commencé un chat pour poser des questions sur les plans d'entreprise, mais n'a pas acheté.
Que faire:

C'est une piste de haute intention. Étapes: (1) Vérifiez les détails de leur prospect pour obtenir des informations sur l'entreprise et le rôle. (2) Examinez la transcription du chat pour les besoins et objections spécifiques. (3) Créer une offre dans le CRM avec les informations recueillies. (4) Attribuer une tâche de suivi à un membre de l'équipe commerciale. (5) S'ils retournent à la page de tarification, la règle de chat proactif peut déclencher un message personnalisé.

Convertir des leads anonymes en contacts CRM

Scénario :
Vous avez 50 prospects anonymes avec des scores élevés mais aucune adresse e-mail.
Que faire:

Options: (1) Créez une règle proactive qui offre un rabais ou le téléchargement d'une ressource en échange d'un e-mail sur les pages à forte intention.2) Utilisez le widget de chat pour demander un e-mail lorsque des visiteurs anonymes commencent une conversation.3) Ajoutez un jeton d'identité à vos pages de connexion / inscription afin que les visiteurs récurrents soient automatiquement identifiés.

Comment le score de lead est-il calculé?+

Le score prend en compte: la récente des visites (récent = plus élevé), la fréquence des visite (plus = supérieur), les pages consultées (prix/caisse = supérieure), la durée de session (plus longue = meilleure), les interactions sur le chat (engagé = meilleur) et les visites répétées (session multiple = mieux).

Puis-je personnaliser les règles de notation des prospects?+

Dans la configuration CRM, vous pouvez ajouter des règles de notation des prospects qui augmentent le score en fonction de mots clés, d'événements, de sources ou de modèles de page spécifiques.

CRM

Votre CRM · commencez ici

OpsIQ envoie un CRM complet d'IA-premier qui capture la vérité client, nettoie les données, scores leads, coachs traite, prévoit des revenus et agit, avec l'intelligence du site Web, support, billets, produits et paiements comme un graphique en direct. Chaque action d'AI est source, expliquée, réversible et contrôlée par approbation.

CRM AI
Présentation de l'AI CRMUn Compteur de confiance mis en Copilote à côté des quatre cartes d'agent IA: Steward, Prospector, Retention et Analyst.CRM AIespace de travailDial de confianceManuelCopilotePilote automatiqueCombien l’IA fait-elle par elle-même?DSÀ la rechercheDéduper, enrichir,valider les donnéesDTSProspecteurTrouver & marquerNouvelles affairesRTConservationLe churn,Renouvellements de licenceANAnalystePrévisions &Expliquer les chiffres1AI-FIRSTQuatre agents spécialisés2YOU DECIDEAutonomie du Trust Dial3TRUSTEDSourcé & réversible
Un premier CRM AI géré par quatre agents spécialisés, et un Dial de confiance qui décide combien ils font sur leur propre.

Aperçu des pages CRM

AI CRM (Centre de commande)

Commencez ici

Votre écran d’accueil quotidien: pulsation des revenus, ce que l’IA a trouvé, ce qu’elle a fait, file d’attente d’approbation, prochaines étapes, santé de l’agent et retour sur investissement.

Personnes à contacter

Nombre de base

Personnes et entreprises dans votre CRM. Recherchez, filtrez, notez et gérez les profils.

Pipeline

Nombre de base

Tableau de négociation visuel avec des étapes glisser-déposer, la probabilité de gagner et le coaching AI.

Prévisions et rapports

Nombre de base

Prévisions de qualité: engagées, probables, cas le plus favorable, avec intervalles de confiance et suivi de la précision.

Cycle de vie

Nombre de base

Où se trouve chaque client : actif, à risque, prêt pour l’expansion, renouvellement attendu ou en décrochage.

Construire mon CRM

Configurer

OpsIQ génère un plan réversible et l'applique à l'approbation. Description de votre configuration CRM en anglais clair.

CRM Santé

Opérations

Page d'auto-vérification: schéma, agents, routes, actions IA et compteurs de données en direct.

Comment OpsIQ vous protège

Demander avant d'agir

Les propositions d'IA sont mises en file d'attente pour approbation. Vous pouvez les approuver, les modifier ou les rejeter, mais rien ne se passe sans votre consentement.

Ne jamais écraser

Lorsque l’IA suggère un changement, elle affiche la valeur actuelle et la valeur proposée. Les données saisies par des humains sont protégées contre les modifications de provenance.

Tout est réversible

Chaque action de l'IA est enregistrée dans le journal et vous pouvez annuler n'importe quelle modification en un seul clic.

Explicable

Chaque recommandation d’IA montre son raisonnement et les sources de données qu’elle a utilisées.

Tout neuf? Commencez ici

1
Ouvrir AI CRM

Cliquez sur AI CRM dans la barre de navigation gauche. Le Centre de commande affiche votre état actuel.

2
Vérifier la santé CRM

Ouvrez CRM Health pour vérifier que le schéma, les agents et les itinéraires sont prêts.

3
Importer des contacts

Si un connecteur est actif (Shopify, WHMCS, etc.), les contacts sont importés automatiquement. Sinon, importez via CSV Ou créer manuellement.

4
Créer un pipeline

Allez dans Pipeline et créez votre premier pipeline avec des étapes (par exemple, Lead, Qualifié, Proposition, Négociation, Gagnant, Perdu).

5
Ajouter votre première offre

Créez une offre à partir d'un contact, définissez le montant et l'étape, puis laissez-vous guider par le coach de vente.

Dois-je utiliser le CRM ?+

Non, le CRM est optionnel. OpsIQ fonctionne parfaitement comme une plateforme de suivi + support + IA sans le CRM, activez-la lorsque vous êtes prêt à gérer les ventes et la relation client.

Le CRM peut-il fonctionner sans connecteurs?+

Oui, vous pouvez créer manuellement des contacts et des offres. Les connecteurs enrichissent le CRM avec les données de la plateforme (commandes, abonnements, tickets), mais ne sont pas obligatoires.

Qu'est-ce que la couche de confiance?+

La couche de confiance est le système de sécurité qui contrôle ce que l’IA peut faire. Mode copilot (par défaut) : L’IA propose, l’humain approuve.

CRM

L’écran d’accueil du CRM IA

Le Centre de Commandement est votre briefing quotidien, ouvrez-le chaque matin pour voir ce qui s'est passé, ce qui nécessite votre attention et ce que vous devez faire ensuite.

Centre de commandement
Centre de Commande CRML’accueil du CRM, avec les bascules Prévisions / Taux de réussite / Pipeline, un indicateur de prévision pondérée et une file de propositions IA offrant Approuver et Ignorer sur chaque ligne.Centre de Commande CRMespace de travailPrévisionsTaux de victoirePipelinePRÉVISIONS · CETTE Q74k $87%Propositions d'IA · approuver la fileCréer une offre · Acme $24kD'un chat avec l'acheteurApprouverRejeterDéplacer Nimbus → PropositionRéponse positive détectéeApprouverRejeterLog task · suivre la tâcheAucune activité dans les derniers 7 joursApprouverRejeter1TOGGLEPrévisions · Taux de victoire · Pipeline2AI PROPOSESOffres, étapes, tâches3YOU DECIDEApprouver ou rejeter
Le véritable centre de commande : basculer entre Prévision, Gagnez le taux et Pipeline, et travailler la file d'attente de proposition AI, approuver ou rejeter les offres, les mouvements d'étapes et les tâches qu'il suggère.

Ce que le Centre de commande affiche

Les chiffres d'aujourd'hui

Valeur pipeline, offres gagnées/perdues, nouvelles pistes, offres actives et tendances de revenus, un instantané de votre état actuel.

Ce que OpsIQ a trouvé

Des informations découvertes par l’IA : transactions bloquées, comptes à risque, nouvelles opportunités, problèmes de qualité des données et signaux du marché.

Ce que OpsIQ a fait

Actions que l’IA a prises (en pilote automatique) ou proposées (en copilote): avancées d’étape, mises à jour de score, enrichissement des contacts et création de tâches.

Besoin d'approbation

Une file d’attente de propositions IA en attente de votre décision. Chacune montre l’action proposée, le raisonnement et les preuves.

Les prochains pas

Liste des chefs d'État et de gouvernement 10 Les choses les plus importantes à faire aujourd'hui: suivre une affaire chaude, vérifier un compte à risque, rechercher un nouveau lead, etc.

Statut d'assistant

Santé des agents d’IA: Capture, Data Steward, Deal Intelligence, Deal Coach, SDR, Retention. Vert = en cours, jaune = nécessite une attention particulière, rouge = erreur.

Résultats

Suivi du ROI: transactions influencées par l’IA, gain de temps, précision des prédictions et comparaison avec le travail manuel CRM.

Briefing du matin

1
Lire les chiffres d'aujourd'hui

Vérifiez l’état de votre pipeline et la tendance des revenus.

2
Effacer la file d'attente d'approbation

Approuvez les actions sûres, modifiez si nécessaire et rejetez les mauvaises suggestions.

3
Vérifiez ce que OpsIQ a trouvé

Lisez les informations sur l’IA. Des transactions sont-elles à risque? Y a-t-il de nouvelles opportunités?

4
Travailler la liste des prochains mouvements

Commencez par la priorité absolue, que l’IA a classée en fonction de son urgence et de son impact potentiel.

Rattacher après le temps libre

Scénario :
Vous étiez absent pendant une semaine, qu'est-il arrivé?
Que faire:

Ouvrez le Centre de commande et vérifiez: (1) "What OpsIQ done" montre toutes les actions de l'IA pendant votre absence. (2) "Besoin d'approbation" montre les propositions en attente de votre révision. (3) "What OpsIQ"Non trouvé" met en évidence les éléments urgents. (4Définissez la plage de dates du tableau de bord sur votre période d'absence pour voir la tendance.

CRM

Contacts, entreprises et offres

Le CRM organise vos relations commerciales en quatre objets : Contacts (personnes), Entreprises (organisations), Offres (opportunités de revenu) et Tâches (actions de suivi).

Objets de CRM
Objets de CRMUn enregistrement Contact lié aux objets Company, Deal et Task dans un graphique connecté.Objets de CRMespace de travailPersonne à contacterPersonne · courriel · téléphoneSociétéaccountsMarché concluOpportunité de revenusTâchesuivi1OBJECTSContacts, entreprises, offres2LINKEDUn graphe connecté3TASKSSuivi joint
Quatre objets de base (contacts, entreprises, transactions et tâches) liés à un seul graphique client connecté.

Personnes à contacter

Qu'est-ce qu'un contact

Une personne dans votre CRM, qui peut être un client, un prospect, un partenaire ou un lead. Les contacts ont une adresse e-mail, un nom, une société, des balises, une étape du cycle de vie et un score d'attractivité.

Trouver des contacts

Utilisez la barre de recherche pour trouver par nom, e-mail, société ou tags. Utilisez des filtres: étape du cycle de vie, score de lead, source, pays, date de dernière activité, propriétaire assigné.

Profil de contact

Cliquez sur un contact pour voir son profil complet : informations personnelles, société, offres, activités, tickets, chats, visites de site Web, score de lead et informations d'IA.

Score de chaleur

Un score de 0 à _100 calculé à partir des signaux comportementaux: visites du site Web, engagement par e-mail, interactions sur le chat, historique d'achat et récent.

Entreprises

... plus de billets...
Contact-société liant

Les contacts sont liés aux entreprises par domaine d'email ou par attribution manuelle, une entreprise peut avoir plusieurs contacts.

Offres

Qu'est-ce qu'une offre

Les offres ont un titre, un montant, un pipeline, une étape, une probabilité de gagner, une date de clôture, un propriétaire assigné et des contacts/entreprise associés.

Probabilité de gagner

Un pourcentage de chances de gagner l'affaire. Défini manuellement ou calculé par l'IA en fonction de vos données historiques de gains.

Traiter la santé

Vert (en bonne santé), jaune-automne (à risque) ou rouge (au point mort) en fonction de la récente activité, de la durée du stade et des signaux d’engagement.

Tasks

Qu'est-ce qu'une tâche

Les tâches ont un titre, une date d'échéance, une priorité, un type (appel, courriel, réunion, autre) et le contact/l'affaire liés.

Tâches générées par l'IA

L’IA crée automatiquement des tâches lorsqu’elle détecte quelque chose qui nécessite de l’attention : suivre une transaction bloquée, répondre à un compte à risque, rechercher un nouveau lead.

Trouver des leads chauds

Scénario :
Vous souhaitez voir tous les contacts à score élevé au Royaume-Uni qui n'ont pas été contactés récemment.
Que faire:

Aller à Contacts. Filtrer par: Lead score > 80, Pays = Royaume-Uni, Dernière activité > 7 Il y a quelques jours. Trier par lead score descendant. Ce sont vos leads négligés les plus chauds, prioriser la sensibilisation.

Création d'une offre à partir d'un contact

Scénario :
Un contact vient de manifester son intérêt pour votre plan d'entreprise lors d'une conversation.
Que faire:

Ouvrez le profil du contact. Cliquez sur « Créer une offre ». Entrez le titre de l'offre (p. ex., « Acme Corp - Plan Entreprise »), le montant, la filière et l'étape (p. ex., "Qualifié"). Définissez la date de clôture et assignez-vous cette date. Le coach d'affaires commencera à suivre cette opportunité.

CRM

Le pipeline (votre tableau de bord)

Le Pipeline est un tableau visuel où les offres se déplacent à travers les étapes de gauche à droite. Faites glisser et déposez des cartes pour avancer les offre, chaque carte montre le montant de la transaction, la probabilité de gagner, et l'état de santé.

Pipeline
Pipeline CRML'écran du pipeline avec les statistiques des offres ouvertes, de la valeur ouverte, des prévisions pondérées et des offrer attribuées, un bouton Nouvelle offre, une file d'attente Approuver par IA et le tableau Lead/Qualifié/Gagné.Pipelineespace de travailOffres ouvertes23Valeur ouverte128 000 dollarsPrévision pondérée74k $Affaires attribuées12+ Nouveau dealApprouver la file d'attente2 à évaluerPLUMBERVolt Inc.4000 $Lume6k dollarsQUALIFIÉNimbus30k $Pic9 000 $GAGNÉOrbite48k $1LIVE STATSValeur ouverte et prévision pondérée2AI QUEUEApprouver les offres proposées3BOARDFaire glisser les offres par étape
L’écran du pipeline réel: statistiques en direct (valeur ouverte, prévision pondérée), une file d’attente AI Approve pour les offres proposées et le tableau de glisser-déposer.

Utilisation du panneau de pipeline

1
Voir vos offres

Le pipeline affiche toutes les transactions actives sous forme de cartes disposées en colonnes (étapes) dont l'en-tête indique la valeur totale des transactions dans cette étape.

2
Faites glisser pour avancer

Faites glisser une carte vers le niveau suivant, la probabilité de gagner et les comptes sont mis à jour instantanément. Si le déplacement échoue (erreur de validation), la carte se replie sur sa position initiale.

3
Badges de carte de chèque

Badge vert = en bonne santé (activité récente, sur la bonne voie). Ambre = à risque (ralentissement, attention requise). Rouge = au point mort (pas d'activité depuis trop longtemps).

4
Cliquez pour les détails

Cliquez sur une carte pour ouvrir le panneau de détails d’une offre avec les contacts, les activités, le résumé du coach et les actions rapides.

La file d'attente d'approbation

Les propositions d’IA apparaissent dans la file d’attente d’approbation en haut de la page du pipeline. Chaque proposition indique ce que l’IA souhaite faire, pourquoi et les preuves.

Approuver

L'action s'exécute à travers la couche de confiance et est enregistrée dans le journal. The action runs through the Trust Layer and is recorded in the journal.

Éditer

Modifiez la proposition avant d’approuver, par exemple en modifiant l’étape proposée ou le montant.

Rejeter

L’IA apprend des refus pour faire de meilleures suggestions à l’avenir.

Probabilité de gagner expliquée

La probabilité de gagner peut être définie manuellement ou calculée par l'IA. Lorsque l'AI la calcule, elle utilise un modèle entraîné sur vos propres transactions fermées (gagnées et perdues). Si vous ne disposez pas de suffisamment de données historiques, l'intelligence artificielle utilise la probabilité par défaut du stade. $10,000 deal at 30% La probabilité contribue $3,000 Aux prévisions "probables".

Déplacer une offre vers Won

Scénario :
Un client a signé le contrat et payé.
Que faire:

Faites glisser la carte jusqu'à l'étape "Gagné". OpsIQ will: (1) Marquer la transaction comme close-won. (2) Mettre à jour les prévisions. (3) Ajoutez une activité "Gagné" à la chronologie. (4) Si configuré, déclenche un événement webhook (crm.deal.won).5) Mettez à jour l'étape du cycle de vie du contact sur "Client".

Repérer les offres bloquées

Scénario :
Vous voulez trouver des offres qui ont été dans la même étape depuis trop longtemps.
Que faire:

Recherchez les badges rouges (bloqués) sur le tableau de bord du pipeline. Ces offres n'ont pas eu d'activité depuis plus longtemps que le seuil de pourriture configuré (défini dans Configuration CRM > Pipelines).

Puis-je avoir plusieurs pipelines?+

Oui, allez dans Configuration CRM > Pipelines pour créer des pipelines supplémentaires. Cas d'utilisation courants : pipelines distincts pour les nouvelles affaires et les renouvellements ou pour différents produits/services.

Que se passe-t-il lorsque je fais glisser une offre vers "Perdu"?+

L'opération est marquée comme fermée-perdue. On vous demandera une raison de perte. L'affaire est retirée du forum actif mais peut être trouvée dans le filtre des affaires fermées. Le contact reste dans le CRM.

CRM

Coaching des affaires

Le Deal Coach analyse chaque affaire et vous donne un bref état de santé, des signaux de risque, des personnes clés, une liste de contrôle de qualification, la préparation de réunion et les prochaines actions suggérées. Tout est source. L'entraîneur montre de quel ticket, chat ou activité chaque réclamation provient.

Entraîneur de vente
Entraîneur de venteUne carte d’offre répertoriant les signaux de risque détectés par l’IA avec des sources de preuves, à côté d’une recommandation IA et d’un bouton brouillon-email.Entraîneur de venteespace de travailAcme Corp ·$24,000Étape : Proposition · 60 % de chances de succèsSIGNALS DE RISQUEPas de réponse dans les 10 joursLe champion s'est tuConcurrent mentionné dans le chatSources: ticket #482 · chat 6/12 · fil d'emailAI recommandeRétablir l'économieacheteur avec un récapitulatif ROIet un plan de clôture de 7jours.Rédigez l'e-mail1SIGNALSPourquoi un accord peut échouer2SOURCEDChaque allégation cite des preuves3MESURESÉtape suivante en un clic
Le coach drape pourquoi un accord pourrait glisser (chaque signal cite sa source) et vous donne le prochain mouvement à prendre.

Ce que vous dit l'entraîneur

Explication de santé

Signaux spécifiques: jours en cours, date du dernier contact, fréquence des activités, mentions de concurrents, schémas d’objection.

Signaux

Chaque signal est lié à sa source (transcription de chat, ticket, courriel, activité) et peut être utilisé pour identifier les objections soulevées, mentions des concurrents, discussions sur la tarification, indicateurs de risque d’assistance, signaux de renouvellement/expansion.

Carte de champion et de bloqueur

Qui aide à la transaction (champion) et qui résiste (bloquant), basé sur l’analyse des interactions et les rôles de contact.

Liste de contrôle des qualifications

Liste de contrôle MEDDICC ou BANT (configurable) indiquant les critères de qualification qui sont remplis et ceux qui manquent. Catégorie: A, B, C, D ou F.

Préparation des réunions

Avant une réunion prévue, le coach génère un brief: ordre du jour, points clés à aborder, questions à poser, risques à traiter et matériel à préparer.

Répondre et appeler des plans

Suggestion du prochain message ou script d'appel en fonction de l'état actuel de la transaction et des interactions récentes.

Échéancier des preuves

Chaque réclamation que le coach fait est liée à une source : un numéro de ticket, l’ID d’une transcription de chat, la date d’activité ou la visite du site Web.

Comment utiliser le coach

1
Lire le brief

Ouvrez n’importe quelle offre et faites défiler jusqu’à la section Coach de l’offre.

2
Combler les écarts de qualification

Si l'élément « Acheteur économique » est manquant, planifiez la désignation et le recrutement du titulaire du budget.

3
Agir sur les suggestions

Le coach propose des actions concrètes. Cliquez pour créer une tâche, rédiger un courriel ou planifier une réunion, toutes acheminées par la file d'attente d'approbation.

Préparation à une grande réunion

Scénario :
Vous avez une réunion avec un prospect demain au sujet d'une affaire $50,000.
Que faire:

Ouvrez l'offre et lisez la section Préparation de la réunion.1) Points de discussion clés basés sur des interactions récentes. (2) Objections qu'ils ont soulevées dans le chat la semaine dernière. (3) Concurrent qu'ils ont mentionné dans un ticket de support. (4) Questions à poser sur leur chronologie. (5Utilisez ce mémoire pour préparer un programme ciblé et fondé sur des données probantes.

Comprendre pourquoi une transaction est à risque

Scénario :
Le pipeline affiche un badge rouge sur une transaction que vous pensiez se dérouler bien.
Que faire:

Click the deal and read the Deal Coach health explanation. It might say: "This deal has been in Proposal stage for 22 days (threshold: 14). Last contact was 11 days ago. The primary contact opened a support ticket about data migration concerns 5 days ago (ticket #T-892). Suggestion: address the migration concern and schedule a follow-up call." Now you know exactly what to fix.

CRM

Prévisions et rapports

Des prévisions de qualité avec une plage défendable, des explications sur les changements au niveau de l'offre et un suivi de la précision pour que vous puissiez prouver et expliquer vos chiffres.

Prévisions
PrévisionsUn nombre de prévisions trimestrielles avec les bandes Commit, Best-case et Pipeline et une note d'exactitude.Prévisionsespace de travailPRÉVISIONS · CE TRIMESTRE312 000 dollars87% à l'objectifS'engagerLe meilleur casPipelinePondérée par l'IA en fonction de la santé et de l'historique des transactions1CatégoriesS'engager à la pipeline2AI-WEIGHTEDPar deal santé3PROVABLEPrécision suivie
Commit, best-cas et pipeline en un coup d'oeil, AI pondéré par la santé de l'affaire, avec précision suivi pour que vous puissiez le défendre.

Catégories de prévision

Engagé

Les offres avec une probabilité de gain égale ou supérieure à 80%. Ce sont vos gains les plus probables, et ils devraient représenter votre revenu minimum attendu.

Probable pondéré par l'IA

Toutes les transactions ouvertes sont pondérées par leur probabilité de gagner calculée par l'IA, c'est la prédiction la plus réaliste de ce que vous ferez.

Le meilleur cas

Toutes les offres ouvertes à pleine valeur, c’est-à-dire le revenu maximal possible si tout se passe parfaitement (ce qui est rarement le cas).

Intervalle de confiance

An 80% probability band showing the realistic range. Example: "You will likely close between $45,000 and $72,000 this quarter."

Ce qui a changé et pourquoi

Les prévisions incluent l'attribution des variations d'une semaine à l'autre. $15,000, le rapport explique exactement quels accords ont causé ce changement: "Accord A a glissé au prochain trimestre ($8,000), Deal B perdu ($5,000), Deal C réduit en valeur ($2,000)."

Suivi de précision

Prévisions MAPE

Erreur moyenne en pourcentage absolu : la distance entre vos prévisions et celles de l'histoire 15% signifie que vos prévisions sont généralement comprises dans 15% des résultats réels.

Calibration de probabilité de victoire

Le score de Brier mesure dans quelle mesure les probabilités de gagner correspondent aux résultats réels.70% Probabilité de gagner.70% La plupart du temps, l'étalonnage est bon.

Instantanés hebdomadaires

OpsIQ capture un instantané de vos prévisions chaque semaine (via cron) et vous pouvez voir comment la précision de vos prediction s'améliore au fil du temps.

Rollups et avertissements

Conversion par étape

Combien de transactions passent de chaque étape à la suivante. Si 80% Passer de Qualifié à Proposition mais seulement 20% Passez de la proposition à la négociation, vos propositions pourraient avoir besoin d'être améliorées.

Taux de victoire par source

Quelles sources de leads produisent le plus de gains. Investissez davantage dans les sources à taux de gain élevé.

Performance par propriétaire

Comment chaque membre de l'équipe commerciale se comporte: affaires gagnées, valeur du pipeline, taille moyenne des affaires, taux de gain.

Avertissements

Sandbagging (probabilités irréalistes), overcommitting (irréalistement élevé) et committed-at-risk (deals à forte probabilité montrant des signaux de stall).

Comprendre une baisse des prévisions

Scénario :
Vos prévisions trimestrielles ont chuté de $180,000 to $155,000 Depuis la semaine dernière.
Que faire:

Ouvrez la page Prévisions et cochez « Ce qui a changé. » Le rapport montre : « Acme Corp deal ($15,000) déménagé à Lost, concurrent choisi. Beta Inc deal ($8,000) date de clôture poussé au trimestre prochain.$3,000) ajouté cette semaine." Le changement net est -$20,000 + $3,000 = -$17,000, expliquant la baisse de 180 000 $ à 163 000 $ (avec les 8 000 $ restants expliqués par des rajustements de probabilité sur d'autres transactions).

CRM

Trouver de nouvelles affaires

L’agent de prospection vous aide à trouver et rechercher des clients potentiels. Décrivez votre client idéal, ajoutez les entreprises cibles et laissez l’IA effectuer des recherches, noter et rédiger une communication en première personne.

Prospection
ProspectionUne liste des entreprises potentielles trouvées par l’IA avec des notes d’adéquation, des scores et un bouton de prospection pour chacune.Prospectionespace de travailLes prospects trouvés par l'agent DTSSociété de gestion des ressources humainesSaaS · 50 personnel · soutien à l'embauche88Projet de communicationCobalt MfgIndustrie · 200 employés74Projet de communicationMesa RetailCommerce électronique · Personnel de 3069Projet de communicationSanté de VegaSoins de santé · Personnel 8063Projet de communication1FINDLes sources d'IA ciblent les comptes2SCOREFit & intention classé3DRAFTPremier contact écrit pour vous
L’agent SDR trouve les entreprises cibles, les évalue sur leur adéquation et rédige la première approche pour votre examen.

Une seule fois setup

1
Décrivez votre client idéal

Go to CRM Configuration > Prospecting. Describe your ideal customer profile (ICP): target industries, company sizes, job titles, geographic focus, product-match terms, and minimum fit score. Example: "B2B SaaS companies with 50-500 employees in the US/UK, selling developer tools, with a VP of Sales or Head of Growth as the primary contact."

2
Ajouter des entreprises cibles

Vous pouvez également laisser l'IA vous suggérer des entreprises en fonction de votre ICP (Identité de Produit) ou d'autres critères.

3
Réviser les résultats de recherche

L’IA enrichit chaque entreprise avec les données disponibles : taille, secteur d’activité, pile technologique, actualités récentes et score de fiabilité avec explication.

4
Approuver la sensibilisation

Pour les entreprises qui répondent aux critères, l’IA rédige un message personnalisé en première contact.

Corriger le score

Chaque prospect obtient un0-100 Score d'ajustement basé sur cinq facteurs:

Ajustement ICP

La mesure dans laquelle l’entreprise correspond à votre profil de client idéal (industrie, taille, emplacement).

Signaux d'urgence

Y a-t-il des preuves qu’ils ont besoin de votre produit maintenant?

Proximatif budgétaire

La taille de l’entreprise, le stade du financement et les indicateurs des revenus suggèrent la disponibilité budgétaire.

Correspondance de produit

La pertinence de votre produit pour leur entreprise en fonction du secteur et de la technologie.

Ajustement de l'aide

Si vous pouvez servir efficacement ce client (fuseau horaire, langue, complexité).

Recherche d’une entreprise cible

Scénario :
Vous voulez évaluer si acme.com vaut la peine d'être poursuivi.
Que faire:

Add acme.com to the prospecting list. The AI returns: Fit score 78/100 (good fit). Reasons: B2B SaaS, 120 employees, US-based, recently hired a VP of Sales (urgency signal), uses competitor X (product match). Buying signals: visited your pricing page twice last month (from website tracking). Best contact: [email protected] (VP of Sales). Drafted opener references their recent hiring and pricing page visits.

CRM

Séquences de suivi automatiques

Les séquences automatisent le suivi en plusieurs étapes : un mélange d'étapes de messagerie, d'attente, de tâche, d’appel et de webhook qui s'exécutent automatiquement après que vous ayez approuvé l'envoi initial.

Séquences
Séquences de suiviUn flux de séquence horizontale: E-mail, attendre trois jours, E-Mail, puis une tâche, avec détection de réponse.Séquences de suiviespace de travailAprès avoir approuvé le premier envoi →CourrielIntroAttendre3 joursCourrielSuiviTâcheAppelLes étapes peuvent être email, attente, tâche ou webhook. Une réponse stoppe automatiquement la séquence.1AUTOMATESuivi en plusieurs étapes2STEPSE-mail · attendre · tâche · webhook3YOU APPROVELe premier envoi est fermé
Suivi automatisé en plusieurs étapes (email, attente, email, tâche) que vous approuvez en premier et une réponse s'arrête automatiquement.

Comment fonctionnent les séquences

1
Créer une séquence

Définir les étapes: email, attendre 3 jours, email, attendre 5 Jours, tâche (appeler si aucune réponse), e-mail Chaque étape de l'e-mail a un modèle que vous pouvez personnaliser.

2
Enregistrer les contacts

Ajouter des contacts à la séquence. L’IA peut également proposer l’inscription à partir de résultats de prospection.

3
Exécution automatique

Si un contact répond à n'importe quel moment, la séquence est automatiquement mise en pause.

4
Suivre les résultats

Consultez les taux d'ouverture, de réponse, de conversion et de désabonnement par étape pour optimiser votre séquence.

Répondre à la compréhension

Lorsqu'un contact répond, l'IA classe la réponse:

Positif

Intéressé, veut parler. Pauses de séquence, tâche créée pour le suivi.

Objection

La séquence s'arrête, la tâche est créée avec les détails de l'objection.

Se désinscrire

Veut arrêter de recevoir des messages. Contact supprimé définitivement.

Pas maintenant

Intéressé mais le timing est incorrect. Séquence en pause, tâche de rappel créée.

La mauvaise personne

La séquence s'arrête, le contact est signalé pour examen.

Appui

Une question de support, pas une réponse commerciale. Pauses de séquence, ticket créé.

Protections anti-spam

Gestion de l'opt-out

Les demandes de désabonnement sont honorées immédiatement et le contact est supprimé de toutes les séquences futures.

Envoyer un cap quotidien

Limite quotidienne au niveau de l'espace de travail (par défaut: 1,000 e-mails). Empêche les envois massifs qui déclenchent des filtres anti-spam.

Limite par contact

Un message maximum par contact et par jour. Évite de submerger les personnes.

Manipulation des sur-caps

Les pas qui dépassent le plafond quotidien sont reportés au lendemain et ne sont jamais abandonnés ou ignorés.

Que se passe-t-il si un contact ouvre un ticket d'assistance pendant une séquence?+

La séquence est automatiquement mise en pause, le support ayant la priorité sur l'aide. La séquestration peut être reprise manuellement une fois que le problème de support est résolu.

Puis-je tester A/B les étapes de séquence?+

Pas directement dans les séquences, mais vous pouvez créer deux séquence avec des messages différents et comparer leurs résultats.

CRM

Outils de croissance

Une page sous CRM qui contient le moteur de croissance: revenus récurrents (MRR / ARR), catalogue de produits, formulaires de capture de leads, liens de réservation et routage des leads. Tout ici s'écrit directement dans le CRM, donc une soumission de formulaire ou un appel réservé est un contact avec historique, pas une ligne dans une feuille de calcul.

Ce qui vit sur la page

Revenus récurrents

Revenus

Les abonnements sont regroupés à partir des paiements par plateforme, le cycle de facturation est déduit des écarts de paiement et un abonnement expire lorsqu'un paiement est en retard au-delà de 1.5 fois son cycle. Les clients se connectent automatiquement aux contacts CRM lorsque le grand livre contient leur adresse e-mail.

Catalogue de produits

Catalogue

Une source unique de vérité pour ce que vous vendez. Les devis extraient le nom et le prix catalogue du catalogue, et les devis acceptés s'ajoutent au chiffre d'affaires par produit.

Formulaires de capture des pistes

Capturer

Chaque formulaire reçoit une page hébergée et un code d'intégration iframe pour votre propre site. Les soumissions deviennent des contacts, le propriétaire reçoivent une notification et vos règles de routage attribuent la piste.

Liens de réservation

Calendrier

Partagez un lien, laissez les prospects choisir un emplacement libre. Les créneaux respectent les heures de travail de l'organisateur, le fuseau horaire et les réunions existantes. Une réservation crée la réunion, envoie une confirmation par e-mail au prospect et informe l'organiseur.

Routage des pistes

Routage

Les règles du territoire s'exécutent d'abord, puis les règles de champ (combiner un champ comme le pays ou la source), puis les round-robin à travers votre rep pool. Il fait route des CONTACTS ET DES DEALS aussi bien, quel que soit le statut de l'accord: une affaire gagnée nécessite toujours un propriétaire pour l'attribution de commission, la responsabilité de compte et le suivi, et en mode de visibilité propriétaire ou équipe un enregistrement non détenu est invisible pour tout le monde sauf un gestionnaire.

Créer votre premier formulaire

1
Outils de croissance ouverts

Allez dans CRM, puis Outils de croissance, puis la section Formulaires de capture de leads.

2
Nommez-le et choisissez des champs

Tapez un nom et une liste de champs séparés par des virgules, par exemple nom,email,téléphone,message.

3
Partager ou intégrer

Copiez le lien hébergé pour le partager n'importe où, ou copiez le code d'intégration et collez-le dans une page de votre site Web.

4
Regardez les leads arriver

Chaque soumission est un contact CRM avec une activité form. submitted, une notification au propriétaire et un routage automatique.

💡
Les espaces de travail Cloud utilisent leur sous-domaine attribué (company.opsiq. help), afin que le lien résolve toujours les bonnes données.

Protections intégrées

Les bots voient le succès, vous ne voyez rien

Un champ de honeypot caché rejette silencieusement les soumissions de bot.

Taux limité

Dix soumissions par heure et par adresse IP pour les formulaires et réservations.

Le consentement reste honnête

La soumission d’un formulaire ne constitue pas un consentement au marketing, seule une case à cocher de consentement explicite le fait.

Pas de double réservation

Un emplacement est re-validé contre un nouveau contrôle de disponibilité au moment de la réservation.

D’où proviennent les données sur le chiffre d’affaires récurrent?+

Utilisez Re-sync from billing (Resynchroniser depuis la facturation) après avoir connecté une nouvelle plateforme.

Puis-je utiliser les formulaires sans avoir de site web?+

Oui, chaque formulaire a une page hébergée sur votre propre adresse qui fonctionne de manière autonome, avec ou sans JavaScript.

CRM

Hub de messagerie (SMS et WhatsApp)

Un connecteur, jusqu'à vingt passerelles. Connectez les fournisseurs de SMS et WhatsApp que vous utilisez réellement, marquez un par défaut, et choisissez l'un d'eux lors de la transmission d'un contact. Le consentement est vérifié par le CRM avant que n'importe quelle passerelle ne soit contactée.

Mettez-le en place

1
Activer le connecteur

Sur la page Connecteurs, ouvrez le Hub de messagerie (SMS et WhatsApp) et activez-le.

2
Ajouter un fournisseur

Dans le même tiroir, ou dans CRM Growth Tools, choisissez une passerelle dans la liste déroulante (Twilio, Vonage, Termii, Meta WhatsApp Cloud, Infobip et plus), collez son. API Vous pouvez en ajouter plusieurs, y compris la même passerelle deux fois avec des comptes différents.

3
Filer le webhook

Chaque entrée de fournisseur affiche son propre webhook URL Collez-le dans les paramètres de rapport de livraison et de message entrant de la passerelle pour obtenir l'état de livraison et les réponses dans. OpsIQ.

4
Envoyer à partir d'un contact

Ouvrez un contact et utilisez le bouton SMS ou WhatsApp. Si plusieurs opérateurs prennent en charge le canal, un sélecteur vous permet de choisir. Sinon, la valeur par défaut est utilisée.

Le consentement vient en premier

Consentement accordé uniquement

Un envoi refuse à moins que le consentement SMS ne soit explicitement accordé. WhatsApp utilise le même consentement.

Le non-contact gagne toujours

Un drapeau de non-contact bloque chaque canal, peu importe ce qui est défini.

Suppression honorée

Les contacts figurant sur la liste de suppression ne reçoivent jamais de messages.

Les refus donnent leur raison

Un envoi bloqué vous indique exactement pourquoi, afin que vous puissiez corriger les données au lieu de deviner.

Pour les développeurs : le contrat webhook

URL forme

https://your-address/opsiq/cron/messaging_webhook.php?sk=SITE_KEY&e=ENTRY_ID&t=TOKEN. Le token par entrée est créé lorsque le fournisseur est connecté et ne tourne jamais lors de l'édition.

Formats compris

Twilio form posts (MessageStatus/MessageSid for delivery, Body/From for inbound), Meta WhatsApp Cloud JSON (statuses and messages, including the hub.challenge subscription handshake), and a generic JSON shape: {"type":"delivery","message_id":"...","status":"delivered"} or {"type":"inbound","from":"+234...","body":"..."}.

Effets

Les messages entrants correspondent au contact par numéro de téléphone dans l’espace de travail, atterrissent comme une activité message. received et marquent la conversation comme répondue. Les rapports de livraison indiquent que le message est reçu ou non.

Mode d'échec

Réponses de jeton incorrectes ou manquantes 403 Les charges utiles inconnues sont comptées et ignorées, jamais fatales, de sorte qu'une passerelle mal configurée ne peut pas briser le point final.

Quelles passerelles sont prises en charge?+

Twilio, Vonage, Plivo, MessageBird, Sinch, Infobip, Telnyx, ClickSend, Termii, Africa's Talking, BulkSMS, Textlocal, Meta WhatsApp Cloud, 360dialog, SMSAPI, Gupshup, Kaleyra, D7 Networks, Hubtel et un webhook HTTPS personnalisé pour tout le reste.

Les identifiants sont-ils sécurisés?+

Les informations d'identification sont stockées de manière chiffrée dans les paramètres du connecteur et ne sont jamais renvoyées au navigateur. La modification d'une entrée avec un secret vide conserve celui qui a été stocké.

L'IA peut-elle envoyer des messages?+

Oui, au moyen d’actions enregistrées qui exigent une confirmation et passent par le même contrôle de consentement. L’IA peut aussi lister les fournisseurs connectés pour expliquer ce qui est disponible

CRM

Fidéliser et développer les clients

Chaque compte reçoit un score de risque de déperdition, un score d'intégrité, un pointage d'expansion et un guide recommandé pour réussir.

Cycle de vie
Conseil du cycle de vieUne carte de cycle de vie client (à bord, actif, à risque, renouvellement) avec barres de santé sur chaque carte de compte.Cycle de vieespace de travailEmbarquementAcmesanté 40ACTIFCéréalessanté 88Initechsanté 76À RISQUESoylentsanté 28RENOUVELLEMENTUmbraSe renouvelle en 12jExpansion +8 000 dollars1STAGESDe l'intégration au renouvellement2SCOREDSanté & expansion3PLAYBOOKProchaine étape recommandée
Les clients passent par l'embarquement, actif, à risque et le renouvellement, chacun marqué pour la santé et l'expansion avec un livre de jeu.

Le tableau de bord du cycle de vie

Plan de l'étape

Tableau visuel montrant où se trouve chaque compte: Lead, Prospect, Opportunité, Client, Expansion, Renouvellement, À risque, Churned.

Comptes à risque

Chaque compte affiche le principal facteur (pique de support, inactivité, échec du paiement) et une sauvegarde recommandée.

Possibilités d'expansion

Les comptes qui montrent des signes de volonté d’acheter davantage : forte utilisation, demandes de fonctionnalités, demande de forfaits.

Renouvellements à venir

Comptes avec dates de renouvellement à venir. Triés par niveau de risque et valeur des revenus.

Comment OpsIQ détecte le risque de départ

Le risque de décrochage est calculé à partir de plusieurs signaux fusionnés ensemble:

Signaux de CRM

Santé des transactions, inactivité, pertes récentes, engagement décroissant.

Signaux d’assistance

Nombre de tickets ouverts, pics de volume de ticket, sentiment négatif, escalades.

Engagement du produit

Fréquence de connexion, utilisation des fonctionnalités, visites de pages, appels API.

Signaux de facturation

Échecs de paiement, factures en retard, demandes de rétrogradation, visites de page d'annulation.

Guides pratiques

Sauver le jeu

Pour les comptes à risque : communiquez de façon proactive, répondez aux préoccupations, offrez du soutien et faites passer le problème au niveau supérieur si nécessaire.

Jeu de renouvellement

Pour les prochains renouvellements : confirmer la satisfaction, examiner l’utilisation, présenter la valeur, offrir un incitatif si nécessaire.

Jeu d'expansion

Pour les comptes prêts à croître : présentez des options de mise à niveau, partagez des histoires réussies et démontrez le retour sur investissement.

Jeu d'adoption

Pour les comptes sous-utilisés : offrez une formation, partagez les meilleures pratiques, activez les fonctionnalités qu’ils n’utilisent pas.

Repérer le churn avant qu'il ne se produise

Scénario :
Un client qui se connecte normalement tous les jours ne s'est pas connecté depuis 2 Il y a quelques semaines, ils ont ouvert. 3 Aucun ticket de support ce mois-ci.
Que faire:

The Lifecycle board flags this account as "At Risk" with drivers: inactivity (14 days since last login) and support spike (3x normal ticket volume). Recommended play: proactive outreach call to understand what is happening. Is there a product issue? Are they evaluating competitors? Early intervention can save the account.

CRM

Garder vos données propres

L'agent Data Steward détecte et corrige automatiquement les problèmes de qualité des données : doublons, champs manquants, incohérences et enregistrements obsolètes.

Responsable des données
Responsable des donnéesUne liste de problèmes de qualité des données (duplicata, manquant, stale, format), chacun avec une action de correction d'un clic.Responsable des donnéesespace de travailProblèmes de données trouvés par l'agent StewardDupliquer[email protected] et [email protected]FusionnerDisparu12 contacts n'ont pas d'entrepriseEnrichissementObsolète38 Offres intactes pour 90+ joursExamenPrésentationNuméros de téléphone dans les formats 4Réparer tout1CATCHESDupes, lacunes, vieillissement2EXPLAINSPourquoi il a signalé chaque3FIXESSur votre approbation
L'agent Steward garde votre CRM propre, en trouvant des duplicatas, des lacunes, des enregistrements inexistants et des mauvais formats, en fixant sur l'approbation.

Ce qu'il attrape

Contacts en double

Plusieurs dossiers pour la même personne (p. ex. [email protected] and [email protected]). Le steward propose de les fusionner.

Données manquantes

Contacts sans adresse email, offres sans montants, entreprises sans domaines. Suggère de remplir à partir des sources disponibles.

Enregistrements non liés

Offres sans contacts associés, contacts sans entreprises. Propose un lien en fonction du domaine et du contexte de l'email.

Incohérences

Une affaire en phase "Gagné" avec une probabilité de 20%, un contact marqué "Client" sans aucune affaire, une entreprise dont l'industrie n'est pas appariée.

Les mauvaises étapes

Les offres qui se trouvent au même stade depuis trop longtemps ou les contacts dont l’étape du cycle de vie ne correspond pas à leur activité.

Comment utiliser

1
Ouvrir la liste des stewards

Accédez à CRM et recherchez la section Data Steward (ou ouvrez-la depuis l'état de santé du CRM).

2
Approuver les correctifs sécuritaires

Les éléments verts sont sûrs : supprimez les doublons, les données manquantes évidentes. Approuvez-les en bloc.

3
Consultez le reste

Les éléments ambrés ont besoin de votre jugement : doublons possibles avec des différences mineures, changements d’étape proposés, liens entre les entreprises.

Nettoyage des contacts en double

Scénario :
L'intendant a trouvé "John Smith ([email protected])" et "J. Smith ([email protected])": même email, différents noms d'affichage.
Que faire:

Le steward propose de fusionner les deux dossiers, en conservant le dossier avec plus d'activité et en fusionnant les transactions et les activités des autres dossiers. Il examine la proposition, ajuste le nom affiché si nécessaire et approuve l'opération.

CRM

Construire mon CRM

Build My CRM vous permet de décrire votre configuration CRM en anglais clair. OpsIQ génère un plan validé et réversible, qu'il applique à l'approbation.

Construire mon CRM
Construire mon CRMUne description en langage naturel à gauche produisant un plan CRM généré des étapes, champs et segments à droite.Construire mon CRMespace de travailDécrivez votre entrepriseNous sommes une agence de web designVente de retenues mensuelles etProjets ponctuels à petitsbusiness.Construire mon CRMPlan généréÉtapes: Plomb → RétentionTypes de transaction: retenue, projetChamp : valeur mensuelleSegments: PME, agenceSéquence: l'intégrationApprouver & appliquer1DESCRIBEAnglais en ligne2AI PLANSÉtapes, champs, segments3APPROVEAppliquée · sans codage
Décrivez votre entreprise en anglais simple; OpsIQ rédige l'ensemble du CRM (étapes, champs, segments) et l'applique à l'approbation.

Comment ça fonctionne

1
Décrivez ce que vous voulez

Tapez une description en anglais de votre configuration CRM _. Exemple : « Créez un pipeline de renouvellement avec étapes : Prochainement, Contacté, Négociation, Renouvelé, Perdu. Score mène plus haut lorsqu'ils voient les prix deux fois ».

2
Examiner le plan

OpsIQ montre un aperçu de ce qu'il va créer: pipeline, étapes, probabilités d'étape, règles de notation, règle de cycle de vie.

3
Appliquer

Chaque modification est enregistrée sous forme de groupe que vous pouvez annuler en un seul clic, et chaque changement est automatiquement répertorié dans le plan.

4
Retournez si nécessaire

Si quelque chose ne va pas, cliquez sur Annuler pour rétablir l'ensemble du bundle et votre CRM revient à son état précédent.

Ce que vous pouvez construire

Pipelines et étapes

Créez des pipelines nommés avec des étapes personnalisées, des probabilités par défaut et des seuils de pourriture.

Règles de notation

Augmentez les scores des prospects en fonction de leur comportement : « Score plus élevé lorsqu'ils consultent la tarification », « Scores inférieurs lorsqu'il visitent la page Carrières. »

Règles du cycle de vie

Faites progresser automatiquement les étapes du cycle de vie : « Passer à SQL lorsqu’une démo est demandée », « Passer à Client lorsque l’affaire est gagnée ».

Champs personnalisés

Ajouter des champs aux contacts, offres ou entreprises: texte, numéro, date, sélectionner, case à cocher, URL, e-mail.

Liste de contrôle des qualifications

Définir la liste de contrôle MEDDICC ou BANT contre laquelle le coach des affaires évalue.

Mise en place d’un pipeline de renouvellement

Scénario :
Vous gérez des abonnements SaaS et avez besoin d'un pipeline pour les renouvellements.
Que faire:

Type: "Créer un pipeline de renouvellement. Étapes: 90 Jours de pluie (10%), 60 Jours de pluie (25%), Contacté (40%), Négociation (60%), renouvelé (100%), Churned (0% Réglez le seuil de pourriture à. 14 days."OpsIQ Une fois le plan généré, vous l'examinez et cliquez sur Appliquer.Le pipeline apparaît immédiatement sur votre page Pipeline.

Que faire si je décris quelque chose qui n’est pas possible?+

Le constructeur ne génère que les actions qu'il sait valider. Si vous demandez quelque chose qui n'est pas dans ses capacités (par exemple, "Integrate with my custom API"), il rejettera la requête et expliquera ce qu'elle peut faire à la place.

Puis-je annuler des modifications?+

Oui, chaque action de Build My CRM est enregistrée sous forme d'un lot réversible. Allez dans l'onglet Santé du CRM > Historique des modifications pour voir tous les lots et annuler ceux que vous souhaitez.

CRM

Configurez votre CRM à votre façon

Configuration manuelle du CRM pour les équipes qui préfèrent cliquer plutôt que de taper Tous les paramètres que Build My CRM peut créer sont également disponibles sous forme de champs de formulaire traditionnels.

Pipelines et étapes

Créez, renommez, réorganisez et supprimez des pipelines et des étapes. Définissez la probabilité de victoire par défaut par étape. Définissez le seuil de pourriture (jours sans activité avant qu'une offre ne soit marquée comme « bloquée »).

Champs personnalisés

Ajoutez des champs aux offres, contacts ou entreprises. Types de champs: texte, nombre, date, sélection (liste déroulante avec options prédéfinies), case à cocher, URL, e-mail. Les champs personnalisés apparaissent sur le profil d'objet et dans les filtres.

Liste de contrôle des qualifications

Définissez la liste de contrôle que le coach d'affaires utilise pour évaluer les affaires. Choisissez MEDDICC, BANT ou un ensemble personnalisé de critères. Chaque élément peut être marqué comme requis ou facultatif.

Règles de l'étape du cycle de vie

Définissez des transitions automatiques d’étape : lorsqu’un contact remplit une condition (consulte les tarifs, soumet un formulaire, effectue un achat), son étape de cycle de vie avance automatiquement.

Règles de lead-scoring

Augmentez ou réduisez les scores des prospects en fonction du comportement. Exemples : "Page de tarification consultée = +15"Livre blanc téléchargé = +10"Page de carrières visitée = -5Le nombre minimum de points peut être défini (par exemple, "doit voir les prix au moins 10 fois"). 2 times").

Vues enregistrées

Créez des combinaisons de filtres et de tris nommés pour les contacts, les offres ou les entreprises. Partagez des vues avec votre équipe Définissez une vue par défaut par type d'objet.

Ajout d'une règle de lead scoring

Scénario :
Vous souhaitez que les contacts qui consultent votre page de tarification deux fois ou plus obtiennent un score supérieur.
Que faire:

Accédez à Configuration CRM > Règles de notation des prospects. Cliquez sur Ajouter une règle. Set: Event = "pageview", URL contains = "/pricing", Nombre minimum =2, Boost de score = +20 La prochaine fois que le scorer s'exécutera, les contacts correspondant à cette règle obtiendront +20 à leur score de tête.

CRM

CRM Bilan de santé

La santé du CRM est une page d'autodiagnostic qui vérifie que votre CRM est configuré correctement et fonctionne sans problème.

Vérification de santé
CRM Contrôle de santéUn score de santé à 92 à côté d'une liste de contrôles de configuration réussie et avertisseur.CRM Contrôle de santéespace de travail92SAINEÉtapes du pipeline configuréesConnecteur lié & importationAgents d'IA activés!Aucune séquence de suivi active!12 contacts manquants entreprise1VÉRIFICATIONVérifie votre configuration2FLAGSCe qui manque3SCOREUn seul numéro global
Un audit CRM d’une page : un score de santé global plus une liste de contrôle des éléments correctement configurés et de ceux qui nécessitent encore une attention particulière.

Ce qui est vérifié

Schéma

Si une migration a été manquée, CRM Health l'indiquera en la marquant dans le champ correspondant.

Agents d'AI

Tous les agents CRM (Capture, Data Steward, Deal Intelligence, etc.) sont enregistrés et en bonne santé Vert = en cours d’exécution, jaune = nécessite une attention particulière, rouge = erreur.

Itinéraires

Les routes CRM API et les points de terminaison AJAX sont enregistrés et appelables.

Actions d'AI

Si des actions sont manquantes, CRM Health se répare automatiquement en les enregistrant à nouveau. CRM Health rectifie les erreurs de gestion du système et des processus.

Comptes de données en direct

Total des contacts, entreprises, affaires, tâches, activités et événements. Utile pour vérifier les importations et la capture de données en cours.

Après vérification de l'installation

Après la première configuration de CRM, ouvrez l'état du CRM et vérifiez que toutes les vérifications sont en vert. Si certaines sont orange ou rouge, cliquez sur l'élément pour obtenir une explication diagnostique et des suggestions de correctif.

À quelle fréquence dois-je vérifier l'état du CRM?+

La fonctionnalité CRM Health corrige automatiquement de nombreux problèmes (comme les enregistrements d'actions manquantes) en ouvrant simplement la page. CRM Health est une fonctionnalisation qui permet aux utilisateurs de gérer leurs actions et leur état de santé.

CRM

Connexions CRM pour les développeurs

Le CRM expose un REST public complet API et des webhooks sortants afin qu'il s'adapte à n'importe quelle pile sans exportations manuelles.

API points de fin

Authentification

API clé (Autorisation: Bearer opq_...) avec le champ d'application crm.read ou crm.write. /api/v1.php avec action et site_key.

Personnes à contacter

crm. contacts. list (recherche + filtre), crm, contact. detail (par ID), crme contact. upsert (créer ou mettre à jour), crmme contact. save.

Offres

crm. deals. list, crm. deal. detail, crme. deales. create, crmme. deaux. update, crmi. deels. advance (tous via la couche de confiance).

Activités

crm. activities. list (cadre temporel d'un contact/d'une offre), crm, activites. record (enregistrement d'une nouvelle activité).

Événements

crm. events. list (flux de modification durable avec curseur since_id), crm. event. catalog (liste des types d'événement disponibles).

Créer une offre via API
POST /api/v1.php
Authorization: Bearer opq_live_xxx
Content-Type: application/json

{
  "action": "crm.deals.create",
  "site_key": "<workspace>",
  "title": "Acme renewal",
  "amount": 12000,
  "pipeline_id": 1,
  "stage_id": 2
}

Événements de Webhook

opsiq.contact.upsert

Viré lorsqu'un contact est créé ou mis à jour. C'est l'événement de contact auquel s'abonner; il n'y a pas d'événement créé séparé.

contact.lifecycle_changed

Viré quand un contact passe à une autre étape du cycle de vie.

contact.status_changed

Viré quand un état de contact change.

contact.conversion

Viré lorsqu'une conversion est enregistrée contre un contact.

contact.tag_added

Viré lorsqu'une balise est ajoutée à un contact.

contact.erased

Viré lorsqu'un contact est effacé pour une demande de confidentialité.

crm.deal.created

Viré quand un accord est créé.

crm.deal.stage_changed

Déclenchée lorsqu'une transaction passe à une autre étape.

crm.deal.won

Déclenché quand une transaction est clôturée comme gagnée.

crm.deal.lost

Déclenchée lorsqu'une transaction est clôturée comme perdue.

crm.company.created

Viré quand une entreprise est créée.

crm.task.created

Déclenchée lorsqu'une nouvelle tâche est créée (manuelle ou générée par l'IA).

email.replied

Viré lorsqu'un contact répond à un courriel de sensibilisation.

email.bounced

Viré quand un courriel de sensibilisation rebondit.

💡
Appel webhooks.events.list pour le jeu faisant autorité sur votre installation, avec la charge utile de chaque événement. Il est généré à partir du code de livraison lui-même, de sorte qu'il ne peut jamais être en désaccord avec ce qui arrive réellement. La liste complète apparaît également dans la section Webhooks.

Tous les événements de webhook sont HMAC-signée et réétudiée sur échec.URLdans Paramètres > Webhooks, ou sondagecrm.events.list avec depuis_id pour un flux de changement durable.

Synchronisation des contacts CRM avec Google Sheets

Scénario :
Vous souhaitez que chaque nouveau contact CRM apparaisse dans une feuille de calcul Google pour votre équipe marketing.
Que faire:

Configurer un abonné webhook pouropsiq.contact.upsert. Pointez-le sur une application web Google Apps Script ou un webhook ZapierURL. La charge utile comprend le nom du contact, l'email, la compagnie, le score de tête et la source. Votre script ajoute une ligne à la feuille Google pour chaque nouveau contact.

CRM

Segments

Les segments enregistrent des filtres de contact réutilisables pour les vues CRM, la sensibilisation, les promotions et d'autres outils adaptés à l'audience.

Écran de produit
SegmentsL'éditeur de segments combine les conditions, affiche le nombre de correspondances en direct et permet à l'opérateur de choisir un filtre en direct ou une image épinglée.Segmentsespace de travailMODEEn directLOGICTOUSMATCHES1,248VUE DE L'ESPACE DE TRAVAIL EN DIRECTÉtape du client= Client actifRuleDernière activitédans les 30 joursRulePaysRoyaume-UniRuleIntention élevéeNotez au moins 70Rule1CHOOSE MODELive ou snapshot2ADD RULESTOUS ou N'IMPORTE QUEL3REUSECampagnes et CRM
L'éditeur de segments combine les conditions, affiche le nombre de correspondances en direct et permet à l'opérateur de choisir un filtre en direct ou une image épinglée.

A Live segment Recalcule à partir des données courantes chaque fois qu'il est utilisé. A Pined snapshot fige la liste de membres actuelle, ce qui est utile lorsqu'une audience d'approche ne doit pas changer après l'approbation.

Choisir TOUS Quand chaque condition doit correspondre ou N'IMPORTE QUEL Les segments système peuvent être visibles, mais protégés contre toute modification ordinaire. Les segments de données peuvent être modifiés par l'utilisateur ou les utilisateurs.

CRM

Note du chef de file

Les règles de notation des prospects transforment les signaux comportementaux et profilés en un score cohérent que les ventes et l'automatisation peuvent utiliser.

Écran de produit
Note du chef de fileLe score des leads montre les règles actives, la fenêtre mobile et le changement de score positif ou négatif que chaque règle applique.Note du chef de fileespace de travailRÈGLES12SCORED8,412HOT LEADS286VUE DE L'ESPACE DE TRAVAIL EN DIRECTActivité de tarification3+ visites en 14 jours+20Achat de mot-cléContient la migration ou l'entreprise+15Risque de soutienÉvénement de plainte dans 30 jours-10Source de confianceRéférence de partenaire+121DESCRIBE RULEUtilisez l'anglais clair2REVIEW FIELDSSignal, fenêtre, points3RESCOREAppliquer à l'espace de travail
Le score des leads montre les règles actives, la fenêtre mobile et le changement de score positif ou négatif que chaque règle applique.

Chaque règle doit toujours être vérifiée avant son activation : confirmer l’activité ou le mot-clé, le nombre minimum de mots, la fenêtre mobile et le changement du score.

Les règles positives et négatives peuvent coexister. Utiliser Espace de travail Rescore Les scores peuvent être utilisés pour alimenter les segments, le routage, la prospection et les conditions de flux de travail.

CRM

Tableau de bord des ventes

Le classement compare les représentants en utilisant l'atteinte du quota, le revenu gagné, la commission et le pipeline ouvert pour le mois sélectionné.

Écran de produit
Tableau de bord des ventesLe classement mensuel classe les représentants commerciaux tout en gardant visibles le chiffre d’affaires gagné, la commission et le pipeline ouvert.Tableau de bord des ventesespace de travailPERIODJuilletTEAM QUOTA82%GAGNÉ184 000 livresVUE DE L'ESPACE DE TRAVAIL EN DIRECTAmina104% quota · 62k £ gagné1reBen88% quota · 51k £ gagné2eC'est vrai.76% quota · 43k £ gagné3ePipeline ouvert312k £ à travers l'équipeExamen1CHOOSE MONTHComparer une période2CHECK QUOTARéalisation par représentant3COACHUtiliser le contexte du pipeline
Le classement mensuel classe les représentants commerciaux tout en gardant visibles le chiffre d’affaires gagné, la commission et le pipeline ouvert.

L’atteinte du quota n’est significative que lorsque chaque représentant dispose d’un quota actuel et que les offres ont le propriétaire, le montant, la devise et l’état de clôture corrects. Utilisez le tableau de bord pour l’encadrement et la reconnaissance, pas comme seule mesure de qualité. Associez-le à la santé des offres, à l’activité et à la précision des prévisions.

CRM

Approbations de transactions

Les approbations des transactions nécessitent l’approbation du gestionnaire avant que les transactions de grande valeur puissent être marquées comme gagnées.

Écran de produit
Approbations de transactionsLa stratégie d'approbation définit deux seuils de valeur et la file d'attente affiche les décisions en attente, approuvées et rejetées.Approbations de transactionsespace de travailPOLICYActivéWAITING6OLDEST3hVUE DE L'ESPACE DE TRAVAIL EN DIRECTNiveau 1Offres de £10,000GestionnaireNiveau 2Affaires à partir de 50 000 £AînésRenouvellement de l'entreprise£72,000 · demandé par BenEn attenteProjet de migration£18,500 · demandé par RitaApprouvé1SET THRESHOLDS0 désactive un niveau2REQUESTLe représentant soumet l'offre3DÉCIDEApprouver ou rejeter
La stratégie d'approbation définit deux seuils de valeur et la file d'attente affiche les décisions en attente, approuvées et rejetées.

Enable the policy and set Level 1 and Level 2 thresholds. A threshold of 0 Lorsqu'un non-manager tente de remporter une transaction à un seuil ou au-dessus du seuil, OpsIQ crée une demande d'approbation au lieu de changer silencieusement l'étape.

Chaque décision doit conserver le demandeur, l'approbateur, la date et la raison de la décision pour permettre son audit.

CRM

Règles du cycle de vie

Les règles de cycle de vie déplacent automatiquement les contacts entre les étapes lorsque leurs données actuelles correspondent à une condition enregistrée.

Écran de produit
Règles du cycle de vieLes règles de cycle de vie sont évaluées par priorité ; la première règle correspondante modifie l'étape du contact.Règles du cycle de vieespace de travailACTIF7RUNSNuitPRIORITYLe plus élevé d'abordVUE DE L'ESPACE DE TRAVAIL EN DIRECTLead → Qualifié(e)score ≥ 60 et activité récentePriorité 100Qualifié → clientL'événement existePriorité 90Client → À risqueAucune activité pour les 60 joursPriorité 70À risque → ClientNouvel achat ou réponsePriorité 601PICK STAGESDe et vers2DEFINE FILTERStyle de segment JSON3ORDER RULESPremier match gagné
Les règles de cycle de vie sont évaluées par priorité ; la première règle correspondante modifie l'étape du contact.

Chaque règle a une étape source, une étapes de destination, un indicateur actif, une priorité et un filtre de style segment. La tâche du cycle de vie planifiée évalue les priorités supérieures en premier et s'arrête après la première correspondance pour un contact.

Les règles doivent être mutuellement compréhensibles. Évitez d'avoir deux règles actives qui peuvent déplacer le même contact dans des directions opposées au cours de la même exécution, testez le filtre sur un segment avant de l'activer.

CRM

Flux d'activité CRM

Le flux d'activité de l'espace de travail combine les événements clients et opérationnels afin que les équipes puissent enquêter sur ce qui s'est passé sans avoir à ouvrir chaque module.

Écran de produit
Activité de CRMLe flux d'activités intercale les événements de chat, ticket, e-mail, webhook, conversion et anomalie avec des filtres et une pagination.Activité de CRMespace de travailÉVÉNEMENTS2,804CUSTOMERS1,126ANOMALIES14VUE DE L'ESPACE DE TRAVAIL EN DIRECTChat résolu[email protected] AIMaintenantTicket a réponduT-1048 · Facturation et paiement4 mÉvénement entrantsubscription.upgraded12 millionsConversionNuméro de commande 7788 · £14919 millions1FILTERÉvénement et client2OPEN CONTEXTAller au dossier3PAGE RESULTSGarder les enquêtes circonscrites
Le flux d'activités intercale les événements de chat, ticket, e-mail, webhook, conversion et anomalie avec des filtres et une pagination.

Filtrez par type d’événement, date, contact ou état du client (y compris les clients payants). Le flux est un modèle en lecture de l’activité enregistrée; il ne remplace pas le ticket source, la conversation, l’affaire ou l’enregistrement connecteur.

CRM

Flux de travail

Les workflows répondent à un événement et exécutent une série ordonnée d'actions, y compris des étapes retardées reprises par cron.

Écran de produit
Flux de travailUne exécution de workflow affiche son déclencheur, les actions terminées, le temps d’attente et l’étape suivante.Flux de travailespace de travailACTIF9RUNNING42FERMÉS1VUE DE L'ESPACE DE TRAVAIL EN DIRECTDéclencheurcontact.createdCommencerÉtape 1Envoyer un email de bienvenueFaitDélaiAttendez 2 joursEn attenteÉtape 2Créer une tâche de venteSuivant1CHOOSE TRIGGERL'événement commence la course2ORDER STEPSActions et retards3MONITORReprendre via cron
Une exécution de workflow affiche son déclencheur, les actions terminées, le temps d’attente et l’étape suivante.

Créez un workflow en choisissant le déclencheur, en ajoutant les étapes dans l'ordre et en l'activant. Les retards sont stockés, pas retenus par une requête de navigateur. Le cron unifié reprend les exécutions du workflow attendues.

Les modèles de démarrage intégrés incluent l'accueil après l'inscription, le remerciement post-achat et la confirmation de démonstration. Clonez un modèle, remplacez ses destinataires/son contenu, puis testez avec un enregistrement contrôlé avant une activation générale.

Une nouvelle tentative ne doit pas envoyer de demandes en double pour le déplacement d'argent ou créer des enregistrements en doublon.

Appui

Billets

Les billets sont votre canal de soutien officiel. Ils ont des ministères, des priorités,SLA les cibles, les pièces jointes, les notes internes et le threading complet de la conversation.OpsIQadministrateur, formulaire de ticket/embed, ingestion d'email, escalade du chat, connecteur, ouAPI.

Billets
Détail du billetUn ticket avec une barre latérale méta (priorité, département, SLA, statut), le fil de conversation et les actions d’ébauche et de remboursement de l’IA.Billetespace de travailC-12345PrioritéÉlevéDépartementFacturationSLA3h 12m à gaucheStatutOuvertJ'ai été facturé deux fois pour monSouscription le 3de juin.IAConfirmé le duplicatafrais, traitement des remboursements.projet de réponse AIRemboursement1THREADEDConversation complète + notes2SLA & ROUTINGPriorité, département, minuteries3AI DRAFTRéponse écrite pour vous
Chaque billet porte sa priorité, département, minuterie SLA et le fil complet, et l'IA peut rédiger la réponse pour vous.

Comment un ticket s'écoule

1
Le billet arrive

Un client envoie un message par e-mail, une escalade de chat, l'intégration d'un ticket ou l'administrateur crée un ticket. Le ticket reçoit un ID unique (par exemple, T-12345).

2
Triage

L’IA lit le sujet et le corps de l’e-mail, attribue la priorité (faible/normal/élevé/urgent), suggère un service et détecte les sentiments.

3
Répondre

Un agent ouvre le ticket, lit le contexte (profil du client, données de la plateforme provenant des connecteurs, tickets précédents) et rédige une réponse que l’IA peut élaborer et qu’il modifie avant d’envoyer.

4
Fermer

Lorsque le problème est résolu, l’agent ferme le ticket et en informe le client. Si ce dernier répond après la clôture du ticket, celui-ci se rouvre automatiquement.

Actions par ticket

Changer de département

Déplacer le ticket vers un autre service (par exemple, de Général à Facturation). Utile lorsque l'acheminement initial était incorrect.

Affecter à un agent

L'agent désigné voit le ticket dans sa vue « Mes tickets », puis il peut afficher les informations de contact et d'assistance.

Ajouter une note interne

Écrivez une note visible uniquement par le personnel. Utilisez-la pour : les résultats de l'enquête, les raisons du remboursement, le contexte technique, les engagements antérieurs.

Fusionner les tickets

Combinez les tickets en double provenant du même client. L’objet du ticket fusionné obtient une balise [MERGED] (Fusionné). Tous les messages des deux tickets sont conservés dans le ticket restant.

Réponse en conserve

Insérez un modèle de réponse préécrit.{{customer_name}}et{{ticket_id}}sont automatiquement remplacés.

réécriture AI

Laissez l'IA améliorer votre brouillon de réponse : ajustez le ton, raccourcissez/allongez, corrigez la grammaire ou traduisez. Vous révisez le résultat avant d'envoyer.

Changer la priorité

Définissez la priorité sur Faible, Normale, Élevée ou Urgente. La priorité affecte les minuteries SLA et l'ordre de tri.

Changer de statut

Définir comme Ouvert, En attente, Attente du client, Résolu ou Fermé.

Exemple pratique: gérer un client mécontent

E-mail du client : « Mon abonnement m'a été facturé deux fois »

Scénario :
Subject: Double charge on my account Body: Hi, I just checked my bank statement and I see two charges of $49.99 from your company dated June 3. I only have one subscription. Can you please refund the duplicate charge? This is really frustrating.
Que faire:

Step 1: AI triage assigns Priority: High, Department: Billing, Sentiment: Frustrated. Step 2: Agent opens the ticket. The connector panel shows the customer's Stripe charges, confirmed two charges on June 3. Step 3: Agent adds an internal note: "Confirmed duplicate charge in Stripe. Transaction IDs: ch_xxx and ch_yyy." Step 4: Agent drafts a reply: "Hi [Name], I can see the duplicate charge and I'm processing a refund for the second transaction right now. You should see $49.99 back in your account within 3-5 business days. I'm sorry for the inconvenience." Step 5: Agent triggers the refund action through the Stripe connector (with confirmation). Step 6: Agent sends the reply and sets status to Resolved.

Départements

Créez des départements dans Paramètres > Tickets > Départements. Département commun : Général, Facturation, Technique, Ventes, Abus, Onboarding Chaque service peut avoir différentes règles de réponse automatique, connaissances en IA et affectations d'équipe.

Réponses en conserve

Créez des modèles de réponse réutilisables dans Paramètres > Tickets > Réponse prédéfinie.

Exemple de modèle de réponse conservée
Hi {{customer_name}},

Thanks for reaching out. I checked the details and here is what I found:

{{response_details}}

If you need anything else, just reply to this ticket and I will be happy to help.

Best regards,
{{agent_name}}
{{department_signature}}

Fusion des billets

Lorsqu'un client envoie la même question plusieurs fois (par e-mail et chat, ou deux e-mailings distincts), vous pouvez fusionner les doublons. Accédez au ticket, cliquez sur Fusionner, sélectionnez l'autre ticket à fusionners. Le ticket restant reçoit tous les messages des deux tickets. L'objet du ticket fusionné reçoivent une balise [MERGED] pour indiquer qu'il a été combiné.

Les plateformes connectées suivent la fusion. Lorsque les billets sont également sur une plate-forme connectée (WHMCS, Zendesk, le portail client SaaS), la fusion se produit là aussi: la plate-forme fusionne ses copies, de sorte que le ticket que vous conservez montre le premier message et les réponses du ticket fusionné. Un billet fusionné qui n'a jamais été sur cette plateforme a sa conversation ajoutée au billet de plate-formes gardée comme une note de personnel privé, jamais comme réponse le client est envoyé par courriel WHMCS) fusionne les OpsIQ les billets de la même façon.

Priorité et SLA

Bas

Questions non urgentes, demandes de fonctionnalités, commentaires généraux. Cible première réponse: 24 heures.

Normal

Questions standard de support. Cible première réponse: 8 heures.

Élevé

Impact sur l'activité du client. Cible première réponse: 4 heures.

Urgent

Service en panne, incident de sécurité, perte de données, erreur de facturation. Cible première réponse: 1 heures.

Les minuteries SLA démarrent lorsque le ticket est créé et s'arrêtent lorsque l'état est « En attente du client ». Si la cible SLA n'est pas atteinte, le ticket sera mis en surbrillance et éventuellement transféré à un niveau supérieur.

Les clients peuvent-ils voir les notes internes?+

Les notes internes sont strictement réservées au personnel. Elles n’apparaissent pas dans le portail de tickets client, les notifications par e-mail ou toute autre surface face aux clients.

Que se passe-t-il lorsqu'un ticket fermé reçoit une réponse?+

Le ticket s’ouvre automatiquement et retourne dans la file d’attente active, l’équipe étant informée de la nouvelle réponse.

Puis-je verrouiller un ticket pour empêcher d'autres réponses?+

Oui. Utilisez l'option Verrouiller le fil pour empêcher à la fois le client et l'IA d'ajouter de nouvelles réponses. Utile pour les litiges résolus ou les enquêtes closes.

Appui

Service Studio: SLA, flux d'état et qualité

La salle de contrôle pour le comportement de votre opération d'assistance: les politiques SLA avec des échelles d'escalade, les calendriers des heures ouvrables, un flux d'état appliqué, les paramètres CSAT et les commutateurs de fonctionnalité d'entreprise. Ouvrez-le à partir de la page Tickets (bouton Service Studio dans la barre des opérations).

Politiques de SLA

Chaque nouveau ticket reçoit une première réponse et un délai de résolution à partir de la politique active la plus spécifique: département + priorité bat le département, bat la priorité, bat le délai par défaut.

Échelles d'escalade

Au lieu d'une seule action, une politique peut définir jusqu'à six étapes : par exemple prévenir le cessionnaire à 75% de la fenêtre, les gestionnaires d'alerte à 100%, réaffecter à un agent nommé à 150%. Chaque étape tire exactement une fois par billet.

Heures d'ouverture et calendriers

Avec les heures de bureau, les horloges SLA ne brûlent que pendant les heures ouvrables. Un ticket ouvert le vendredi soir n'est donc pas violé le samedi. Des calendriers nommés (fuseau horaire, jours, heures, jours fériés) peuvent être associés à des politiques individuelles pour les équipes dans différentes régions.

Flux de statut

Une matrice de départ/arrivée qui restreint les modifications d’état que peuvent effectuer les administrateurs, avec un paramètre prédéfini de style Zendesk. L’automatisation, les e-mails entrants et les réponses aux tickets émanant des clients sont toujours exemptés, donc une matrice stricte ne peut jamais engorger le pipeline.

Agréments

Les agents demandent l’approbation d’un ticket (remboursements au-delà d’une limite, exceptions aux règles). Un approbateur nommé ou un administrateur complet décide avec une note ; les requérants ne peuvent jamais approuver leur propre demande.

Relations de tickets

Liez les tickets en tant que liés, dupliqués, parents/enfants ou bloqués; divisez les réponses vers un nouveau ticket lié (l'inverse de la fusion, sans envoyer d'e-mail au client); suivez les tickets pour des notifications dans l'application et, éventuellement, CC les adresses e-mail des abonnés sur les réponset sortantes.

Boîte de réception en direct et collisions

Avec la boîte de réception en temps réel activée, les nouveaux tickets et réponses apparaissent pour les agents en quelques secondes via le flux de notification existant. Sur un ticket, les agents voient qui d’autre est en train de consulter le ticket et reçoivent une bannière d’avertissement lorsqu’un collègue d’équipe est déjà en train d’y répondre.

Routage conscient de l'IA

Les règles de routage peuvent correspondre aux signaux de triage d'IA: priorité, catégorie, sentiment et risque d'escalade, ainsi qu'aux valeurs des champs personnalisés saisies dans votre formulaire de demande du portail.

💡
L’activation d’un commutateur dans Service Studio → Qualité et automatisation est l’option de participation ; en laissant ces options désactivées, le comportement reste identique à celui d’avant la mise à niveau.
Pourquoi un client peut-il rouvrir un ticket fermé quand ma matrice interdit la fermeture → ?+

Les réponses émanant du client, les réponses par e-mail et l'automatisation sont délibérément exclues afin qu'une politique stricte ne puisse jamais bloquer les clients ou interrompre le pipeline.

Les échelles SLA remplacent-elles l'ancienne action en cas de violation?+

Non, les stratégies enregistrées avec une action de violation unique continuent à fonctionner sans modification. Une échelle remplace l'action unique uniquement sur les stratégie où vous définissez des étapes.

Appui

Réponse automatique et escalade des tickets

La réponse automatique permet à l’IA de répondre aux nouveaux tickets automatiquement. L’escalade déplace les tickets vers un autre service lorsque l’AI détecte des besoins spécialisés, et ces deux fonctionnalités fonctionnent aussi bien pour les tickets natifs que pour ceux créés par e-mail.

Auto-réponse
Réponse automatique aux ticketsUn flux: nouveau ticket, un délai de deux minutes, réponse IA à partir des connaissances et du contexte, puis envoyé ou enregistré en tant que brouillon.Auto-réponseespace de travailQuand un nouveau billet arriveNouveau ticketToute sourceDélai2 minréponses AIKB + contexteEnvoyéou projetSi un humain répond pendant le délai, la réponse automatique est annulée et l’intention peut être transmise à un autre service.1DELAYLes humains ont la première chance2AI REPLIESDe la KB + contexte3OR ESCALATERoute par intention
Les nouveaux billets sont courts (pour que les humains puissent y accéder), puis une réponse d'IA de votre connaissance, envoyée ou en attente comme un brouillon.

Comment fonctionne la réponse automatique

1
Le billet apparaît

Un nouveau ticket est créé à partir de n'importe quelle source (email, chat, portail, API).

2
Programme de réponse

OpsIQ Attend le délai configuré (par défaut: ) 2 Cela donne aux agents humains la possibilité de répondre en premier.

3
La première réponse gagne

Si un agent humain répond pendant le délai, la réponse automatique est annulée, sinon l’IA génère une réponse.

4
Générer et envoyer

L’IA lit le ticket, vérifie la base de connaissances, le contexte du connecteur et l’historique client, puis rédige une réponse qui est envoyée (ou mise en file d’attente sous forme de brouillon pour examen, selon les paramètres).

Comment fonctionne l'escalade

1
Configurer les départements

Définissez les départements pouvant recevoir des escalades (par exemple, la facturation peut être échelonnée à partir de Général, le service technique peut être escaladé à partir du Général).

2
Classer le ticket

Avant de répondre automatiquement, l’IA classe l’intention du ticket : facturation, technique, remboursement, abus, etc.

3
Déplacez-vous si nécessaire

Si l’intention du ticket correspond à un service d’escalade, le ticket est déplacé et une note interne explique pourquoi.

4
Générer dans une nouvelle voix

La réponse est générée en utilisant les connaissances du service de destination et la formation à l'IA.

Référence des paramètres

Auto-réponse activée

Activez-le pour activer la réponse automatique de l'IA pour les tickets.

Départements autorisés

Commencez par les départements à faible risque (Général, Ventes) avant d'activer la facturation.

Délai

How long to wait before the AI replies (in seconds). Default: 120 seconds (2 minutes). Set to 0 for instant replies.

Calendrier des retards

Définissez éventuellement différents délais pour les heures ouvrables par rapport aux horaires d'après-midi.

Arrêtez sur la réponse de l'administrateur

Si un agent humain répond en premier, annuler la réponse automatique. Par défaut : activé.

Escalation activée

Activez le routage automatique des départements en fonction de l'intention du ticket.

Départements d'escalade

Les départements vers lesquels les tickets peuvent être transférés.

État de l'escalade

Statut à appliquer lors d’une escalade (par exemple Ouvert, En attente).

Note d'escalade

Indique s'il faut ajouter une note interne expliquant la raison de l'escalade.

Tickets créés par e-mail

Les tickets créés à partir d’un e-mail (via le sondage de boîte aux lettres ou la distribution par pipeline MX) suivent les mêmes règles de réponse automatique et d’escalade. La réponse AI est envoyée sous forme d’e-mail au client, tandis que les brouillons sont placés dans la file d’attente des brouillont pour examen si elle est configurée.

L’IA répondra-t-elle automatiquement aux questions de facturation?+

Nous vous recommandons de commencer par désactiver la réponse automatique pour la facturation et de l'activer uniquement après avoir formé l'IA avec des connaissances approfondies en matière de facturation, puis d'effectuer des tests complets.

Et si l’IA donne une mauvaise réponse ?+

Si un client répond que la réponse était incorrecte, un agent humain doit intervenir. Revisez l'historique de l'IA pour comprendre pourquoi l'AI a donné la mauvaise réponse, puis mettez à jour la base de connaissances ou la formation de l’IA pour éviter qu’il ne se reproduise.

Puis-je vérifier les réponses automatiques avant qu'elles ne soient envoyées?+

Oui. Définissez le mode de remise sur « Brouillons » au lieu de « Envoi automatique ». Les brouillons des réponses automatiques apparaîtront dans la file d'attente Brouills pour examen humain avant l'envoi.

Appui

Intégration du portail des billets

Le portail de tickets intégré vous permet d'ajouter une interface de gestion de ticket à n'importe quel site Web. Les clients peuvent voir leurs tickets, en créer de nouveaux et répondre, le tout sans entrer dans l'administrateur OpsIQ.

Comment ça fonctionne
Intégration du portail des billetsUn portail de support intégré dans un site Web montrant à un client ses propres tickets et un bouton nouveau ticket.yoursite.com/supportCentre de soutienNouveau ticketVos billets de train#1042 · Question sur le remboursementOuvert#1038 · Aide à la configurationRésolu#1031 · Copie de la factureEn attente1EMBEDAjouter à n'importe quel site2SELF-SERVELes clients voient leurs billets3NO LOGINIdentité traitée en toute sécurité
Intégration du portail des billets

Trois saveurs embed

Intégration en ligne

Le portail prend la largeur complète de son conteneur et est affiché dans une div sur votre page.

Widget flottant

Affiche un bouton flottant qui ouvre le portail de tickets dans un panneau, similaire à un widget de chat.

Authentifié

Nécessite un jeton d’identité signé. Les clients ne voient que leurs propres tickets.

Installation

Billet et chat intégré
<!-- Signed-in customer: your server adds a fresh identity_token -->
<script async src="https://your-opsiq-domain.com/widget.php?site_key=SITE_KEY&identity_token=SERVER_GENERATED_TOKEN"
        data-opsiq-widget="client-chat"></script>

<!-- Guest: the same tag without identity_token -->
<script async src="https://your-opsiq-domain.com/widget.php?site_key=SITE_KEY" data-opsiq-widget="client-chat"></script>
💡
Remote Sites → your site → Codes → C. Signed-in customers generates the complete code for your platform (PHP, WordPress, Laravel, Node.js, Python, Django, .NET, Rails, Java, Go), including the refresh handler that keeps a long visit signed in. The WHMCS hook and the Botble connector bridge already do this.

Génération de jetons d'identité

Pour le mode authentifié, votre serveur signe un jeton de courte durée avec le secret du site. Ce jeton indique OpsIQ qui est le client pour qu'ils ne voient que leurs propres billets. C'est un standard HS256 JWT: n'importe quelle bibliothèque JWF fonctionne. Le secret ne va jamais dans une page.

PHP · générer un jeton d'identité
<?php
// Generate identity token (PHP, no dependencies)
$secret = getenv("OPSIQ_SITE_SECRET");          // the site secret, server-side only
$b64 = fn($v) => rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), "+/", "-_"), "=");
$now = time();
$signing = $b64(["alg" => "HS256", "typ" => "JWT"]) . "." . $b64([
    "site_key"      => "SITE_KEY",
    "iat"           => $now,
    "exp"           => $now + 3600,
    "authenticated" => true,                        // required
    "platform"      => "php",
    "customer"      => [
        "id"          => $user["id"],               // required
        "email"       => $user["email"],            // required
        "name"        => $user["name"],
        "external_id" => (string) $user["id"],
    ],
]);
$token = $signing . "." . rtrim(strtr(base64_encode(hash_hmac("sha256", $signing, $secret, true)), "+/", "-_"), "=");
// Put $token on the widget URL as &identity_token=
Node. js, générer un jeton d'identité
// Node.js — npm i jsonwebtoken
const jwt = require("jsonwebtoken");

function generateOpsIQToken(customer) {
  return jwt.sign({
    site_key: "SITE_KEY",
    authenticated: true,                            // required
    platform: "node",
    customer: { id: customer.id, email: customer.email, name: customer.name, external_id: String(customer.id) },
  }, process.env.OPSIQ_SITE_SECRET, { algorithm: "HS256", expiresIn: 3600 });
}

Caractéristiques du widget

Liste des billets

Liste consultable et filtrable par statut. Une mise en évidence « En attente de votre réponse » signale les tickets auxquels l’équipe a déjà répondu.

Conversation en fil

Vue complète de la conversation avec texte enrichi, pièces jointes et horodatages.

brouillon d'enregistrement automatique

Les brouillons de réponse du client sont automatiquement enregistrés afin qu'ils ne perdent pas leur travail s'ils se déplacent.

Sondage en direct

Le widget sonde pour de nouvelles réponses toutes les ~12 secondes.

Résoudre / rouvrir

Les clients peuvent résoudre ou rouvrir leurs propres tickets en un seul clic.

Les notes internes du personnel ne sont JAMAIS affichées aux clients dans l'intégration de ticket, ce qui constitue une limite de sécurité stricte.
Appui

Boîte de réception du chat

La boîte de réception du chat est l’endroit où votre équipe gère les conversations en direct avec vos clients, et affiche les discussions actives, les conversationes assignées, les discussiones gérées par l’IA et l’historique archivé.

Boîte de réception du chat
Boîte de réception du chatUne boîte de réception du chat d’agent à trois volets: la liste des conversations, la conversation en direct avec une puce brouillon IA et un panneau contextuel visiteur / CRM.Boîte de réception du chatespace de travailJD- Oui.Où est ma commandePaysMensahQuestion de facturationRTC'est vrai.AI traitéOù est ma commande ?Expédié aujourd'hui · UPSProjet d ' AI prêtRépondre à…VISITEURJane DoeÉtats-Unis · Chrome3 commandes passéesValeur vie client 480 $CRMÉtape: Le client1UNIFIEDChaque live chat2CONTEXTPanneau Visiteur + CRM3AI ASSISTDraft & réécriture
Une boîte de réception pour chaque chat en direct, liste de conversation, le thread avec l'IA brouillon sur tap, et le contexte complet visiteur + CRM.

Gestion des conversations

Les chats actifs

Point vert = le client est en train de taper ou a été récemment actif.

Géré par IA

Vous pouvez prendre la relève à tout moment en cliquant sur « Joindre » (Join) et vous connecter au chat.

Assigné à moi

Conversations qui vous sont spécifiquement assignées.

En attente

Conversations où le client attend une réponse.

Archives

Conversations terminées. Recherchable par mot-clé, date et client.

Transfert de l’IA à l’humain

Lorsque vous prenez en charge une conversation de l'IA, suivez ces trois règles:

1
Saluer personnellement

Présentez-vous par votre nom. « Bonjour, je suis Sarah de l'équipe d'assistance »

2
Contexte de référence

Montrez que vous avez lu la conversation. « Je vois que vous m'avez demandé l'état de votre commande »

3
Définir les attentes

Dites au client ce qui va suivre. « Je regarde cela tout de suite et je reviens vers vous d’ici quelques minutes. »

Activer/désactiver l'IA par conversation

Utilisez le bouton d’IA en haut de chaque conversation. Lorsque l’IA est activée, elle génère des réponses. Lorsqu’elle est désactivée, seuls les agents humains peuvent répondre. L’IA se souvient du contexte de la conversation même lorsqu’elle a été désactive et réactivée.

Mode absent / hors heures

En dehors des heures d'ouverture, l'IA peut: (1) Continuer à répondre aux clients, (2) Afficher un message « absent » et créer un ticket pour le suivi, ou (3) Désactiver complètement le chat et afficher le formulaire de ticket Choisissez le comportement qui correspond à votre modèle d'assistance.

Gérer des conversations difficiles

1
Restez calme.

Ne pas correspondre à l'intensité émotionnelle du client. Reconnaître sa frustration sans être sur la défensive.

2
Recueillir des faits

Avant de répondre, recueillez les informations pertinentes : détails de la commande, statut du compte, tickets précédents.

3
Escalate tôt

Si la situation implique des remboursements, des menaces juridiques, des abus ou de la sécurité, faites-en part à un membre supérieur de l’équipe plutôt que d’essayer de gérer le problème seul.

Puis-je avoir un chat d'équipe (agent à agent)?+

Oui, vous pouvez utiliser des notes internes dans une conversation pour communiquer avec d'autres agents. Ces notes ne sont jamais visibles par le client.

Que se passe-t-il lorsque je ferme un chat?+

Si le client envoie un nouveau message plus tard, une nouvelle conversation est créée et les messages sont déplacés vers l'archive.

Appui

Chaînes de messagerie

Connectez WhatsApp, Facebook Messenger, Instagram DM, Telegram et LINE afin que les messages que les clients vous envoient déjà arrivent dans la même boîte de réception que votre chat site, répondu par le même assistant AI.

Chaque canal se comporte de la même manière une fois connecté : un message client devient une conversation dans la boîte de réception Chat, votre assistante AI répond en utilisant les mêmes connaissances et instructions que votre chat site web, et tout agent peut prendre le relais.

À quoi ressemble la connexion

Facebook de l'Ukraine Messenger & Instagram

Un clic. Ouvrez les connecteurs → Facebook Messenger & Instagram DM, cliquez sur Connectez-vous, connectez-vous avec le compte Facebook qui gère votre page, et choisissez la page. Instagram vient avec elle lorsque votre page a un compte professionnel Instagram lié.

WhatsApp

Un clic où votre fournisseur l'offre : ouvrez le connecteur de Hub de Messagerie et utilisez Connect WhatsApp, puis suivez la connexion guidée de Meta pour récupérer ou créer votre numéro d'entreprise Whatsapp. Sinon collez les identifiants de n'importe lequel des20les portes d'entrée.

Telegram

Deux minutes. Message @BotPère en télégramme, envoyer/newbot,Choisissez un nom et un nom d'utilisateur se terminant par "bot", et collez le jeton qu'il vous donne dans le connecteur Telegram.OpsIQenregistre le webhook pour vous.

LIGNE

Créer une messagerie API canal sur developers.line.biz, coller le secret du canal et le jeton d'accès, puis copier le webhook URL figurant en OpsIQ dans LINE et éteindre ses propres réponses automatiques.

SMS

Ajouter un fournisseur (Twilio, Vonage, Termii et autres) dans le Hub de messagerie avec ses identifiants et son numéro d'expéditeur.

Chaque connecteur affiche ses propres instructions étape par étape dans le tiroir, y compris exactement ce qu'il faut copier et où. Vous n'avez jamais besoin d'identifications de développeur pour les options à un clic.

Allumer un canal

La connexion d'un canal ne démarre pas. Paramètres → Chat client → Avancé → Canaux de messagerie, allumez le maître et ensuite le canal individuel. Chaque canal a son propre commutateur de réponse automatique AI, vous pouvez piloter sur un avant d'ouvrir le reste.

1
Connectez le canal

Dans les connecteurs, en utilisant les instructions dans le tiroir de ce connecteur.

2
Tester la connexion

Cliquez sur Test. Il fait un appel réel au fournisseur et vous dit ce qui ne va pas si quelque chose est.

3
Activer les canaux de messagerie

Paramètres→Chat client→Avancé. Allumez l'interrupteur principal, puis le canal.

4
Envoyez-vous un message

D'un autre compte, envoyez un message à votre page, numéro ou bot. Il doit apparaître dans la boîte de réception Chat en quelques secondes et obtenir une réponse AI.

Fenêtres de réponse

Les plateformes de messagerie limitent la durée de réponse d'une entreprise après l'écriture d'un client. OpsIQ montre le temps restant sur chaque conversation et applique la règle pour vous.

WhatsApp

24 heures à partir du dernier message du client. Après cela, vous ne pouvez envoyer qu'un modèle approuvé, que vous configurez dans le même onglet Advanced.

Messenger & Instagram

24heures pour les réponses normales; les agents peuvent répondre jusqu'à7quelques jours plus tard, sous l'allocation d'agent humain de Meta.

Telegram, LINE, SMS

Pas de fenêtre imposée par la plate-forme.

⚠️
Si une réponse échoue parce que la fenêtre s'est fermée, la conversation montre pourquoi. Il s'agit d'une règle de plate-forme, et non d'un OpsIQ limite.

Questions fréquentes

Les clients voient-ils qu'une AI a répondu ?+

Seulement si vous leur dites. La réponse vient de votre page, numéro ou bot exactement comme une réponse humaine le ferait. Vos instructions AI contrôlent le ton et si elle s'identifie.

Un agent peut-il prendre le relais de la conversation ?+

Oui. Ouvrez la conversation dans la boîte de réception Chat et cliquez sur Join. L'IA s'arrête, vous tapez, et le client voit un fil continu sur son côté.

Et si je débranche un canal ?+

Utilisez Déconnecter sur le connecteur. L'historique des messages est conservé; les nouveaux messages cessent simplement d'arriver, et la plate-forme est dit de cesser de les envoyer.

Deux espaces de travail peuvent-ils utiliser la même page Facebook ?+

Non. Une page appartient à un espace de travail à la fois. Connecter-le ailleurs le déplace, et le premier espace de travailler cesse de recevoir des messages, donc déconnectez-vous délibérément plutôt que de se reconnecter ailleurs.

Appui

Conversations de chat réelles

Ces exemples montrent comment une IA client bien entraînée devrait gérer des scénarios courants et vous permettent de tester votre formation en IA et d’identifier les lacunes.

10 exemples de conversation

1. Client de retour s'informant sur la commande

Scénario :
Customer: Hi, I placed an order 3 days ago and haven't received any shipping notification yet. Order #ORD-5523.
Que faire:

L'AI devrait: (1) Chercher l'ordre #ORD-5523 Passez le connecteur.2) Signaler le statut actuel et les informations de suivi si disponibles. (3) Si la commande est retardée, reconnaissez le retard et fournissez un calendrier estimatif. (4) NE PAS inventer un statut d'expédition si le connecteur n'en a pas.

2. Demande de prix par un prospect

Scénario :
Client : Combien coûte votre forfait Pro? Proposez-vous une facturation annuelle?
Que faire:

L'AI devrait: (1) Répondre à partir de la base de connaissances avec les prix actuels. (2) Expliquez la différence entre facturation mensuelle et annuelle. (3) Si la réponse n'est pas dans la base de connaissances, dites-le et proposez de les connecter avec les ventes.4) NE PAS inventer des prix qui ne sont pas dans la base de connaissances.

3. Client en colère exigeant un remboursement

Scénario :
Client: C'est ridicule, votre produit ne fonctionne pas et je veux mon argent en arrière MAINTENANT.
Que faire:

L'IA devrait: (1) Reconnaissez la frustration calmement. (2) Demandez le numéro de commande ou l'email de compte. (3) Expliquer le processus de remboursement. (4) Créer un ticket de support ou passer à un agent humain. (5) Ne promettez PAS un remboursement, qui nécessite l'approbation humaine.

4. Cas de double facturation

Scénario :
Client : J'ai été facturé deux fois ce mois-ci, ma banque affiche deux débits de $29.99.
Que faire:

L'AI devrait: (1) Reconnaître la préoccupation. (2) Recueillir les détails pertinents (courriel, dates des charges).3) Expliquer que les problèmes de facturation nécessitent un examen humain. (4) Créer un ticket de service de facturation avec les détails. (5) Définissez la priorité sur Haute.

5. Client multilingue

Scénario :
Client: Bonjour, je voudrais savoir si vous livrez en France?
Que faire:

L'AI devrait: (1) Répondre dans la langue du client si cette langue est prise en charge. (2) Répondez à la question sur la livraison en France dans la base de connaissances. (3) Si la langue n'est pas prise en charge, répondez dans la langue par défaut et mentionnez les langues disponibles.

6. Conversation après les heures de travail

Scénario :
Client : Bonjour, est-ce que quelqu'un est là? J'ai besoin d'aide avec mon compte.
Que faire:

L'AI devrait: (1) Si configuré pour l'IA après les heures d'ouverture, répondre et aider. (2) Si après les heures de bureau, des tickets sont créés, dites: "Notre équipe est actuellement hors ligne. J'ai créé un ticket d'assistance pour vous et quelqu'un fera le suivi pendant les heures ouvrables."3) Fournissez le numéro du billet.

7. Acheteur de comparaison avant achat

Scénario :
Client : Comment votre produit se compare-t-il à celui de [concurrent X]?
Que faire:

L'AI devrait: (1) Décrivez les forces de votre produit factuellement. (2) Ne pas calomnier le concurrent. (3) S'il existe une page de comparaison dans la base de connaissances, créez un lien vers celle-ci. (4) Si le client demande des fonctionnalités que vous n'avez pas, soyez honnête.

8. Le client veut une recommandation

Scénario :
Client : J'ai une petite boutique en ligne avec environ 100 Quel est le plan qui me convient le mieux?
Que faire:

L'AI devrait: (1) Posez des questions de clarification si nécessaire (par exemple, quelles caractéristiques sont les plus importantes).2) Recommander un plan basé sur la base de connaissances. (3) Expliquez pourquoi ce plan répond à leurs besoins. (4) Mentionnez qu'ils peuvent commencer avec un forfait plus petit et passer à une version supérieure plus tard.

9. Client essayant d'obtenir une remise non autorisée

Scénario :
Client : J'ai vu en ligne que vous donnez des remises pour les 50%, puis-je en avoir une?
Que faire:

L'AI devrait: (1) Expliquez poliment les promotions en cours s'il y en a. (2) NE PAS créer ou promettre des remises qui ne sont pas dans la base de connaissances. (3) Si le client persiste, proposez de le mettre en relation avec l’équipe commerciale.

10. Le client a besoin d'aide avec une fonctionnalité

Scénario :
Client : Comment puis-je exporter mes données? Je ne trouve pas le bouton d'exportation.
Que faire:

L'AI devrait: (1) Fournir des instructions étape par étape à partir de la base de connaissances. (2) Inclure le chemin exact de la page et l'emplacement du bouton. (3) Si la fonctionnalité nécessite un plan particulier, mentionnez-le. (4Si la fonctionnalité n'existe pas, soyez honnête et suggérez des alternatives.

Appui

Routage et escalade des chats

Lorsqu’un chat en direct nécessite une personne réelle, l’IA répond à deux questions : quelle équipe est propriétaire de cette conversation et qui doit être informé. Les deux sont configurés dans Paramètres, Chat client, Flux d’assistance, sous Départements de routage AI.

Choisir les départements que l'IA peut utiliser

Les deux cases de ce panneau sont une liste blanche. Les départements déplacés vers la droite sont les seuls auxquels l’IA peut acheminer ou ouvrir des tickets. Tout ce qui est laissé sur la gauche est invisible pour elle, même si le département existe et qu’il est doté d’un personnel.

💡
Si aucun département n'est activé, OpsIQ revient au routage hérité à travers tous les départements qu'il peut trouver. Traitez cela comme un filet de sécurité, pas un choix de configuration.

Qui reçoit l'escalade

C’est la partie que la plupart des gens s’attendent à configurer et n’ont pas besoin de le faire. Lorsque l’IA fait passer un chat en mode avancé, OpsIQ envoie un e-mail aux personnes attachées à ce service. Vous gérez cette liste une fois, sur la page Équipe et services, et les deux escalades de ticket et de chat suivent.

Membres de l'équipe du département

Chaque administrateur actif attaché au département reçoit sa propre copie, les comptes suspendus et désactivés sont ignorés.

Administrateur principal

Utilisé quand aucun membre de l'équipe n'est attaché, donc une escalade atteint toujours quelqu'un.

Personne attaché

Le panneau de routage marque ce service en rouge et l’IA ne dit pas au visiteur qu’un humain a été notifié.

⚠️
L'adresse de courriel du service n'est délibérément jamais utilisée comme destinataire. Cette adresse est la boîte aux lettres des tickets entrants du service, celle avec laquelle les messages entrants sont comparés pour ouvrir des tickets. Une escalade envoyée à cette adresse serait renvoyée en tant que nouveau ticket plutôt qu'atteindre une personne.

Le département catch-all

Il reçoit les conversations que l’IA ne pouvait pas placer avec confiance, et c’est un dernier recours plutôt qu’un chemin normal.

1
Des signaux clairs gagnent

Le libellé de facturation va à un service de facturations, le libellé d’hébergement et d’erreur à un département technique, le texte d’achat aux ventes.

2
Le classificateur d'IA essaie ensuite

Si les mots-clés ne sont pas concluants, le modèle lit la conversation et choisit parmi les départements activés.

3
Puis le catch-all

Ce n’est que lorsque les deux sont vides que le service de capture reçoit le chat.

4
Le garde des ventes

Si le catch-all est un service commercial et que le visiteur n'a montré aucun signal d'achat, OpsIQ recherche à la place un service technique ou de support, afin que les questions de support ordinaires ne s'accumulent pas dans Sales.

Ce qui est dit au visiteur

Si l’e-mail d’escalade sort, l’IA dit au visiteur que l’équipe a été notifiée. S’il ne peut pas sortir, l'IA dit quelque chose de honnête et les invite à laisser le message dans la discussion à la place.

Le panneau indique « Personne à aviser » pour un ministère+

Personne n'est attaché à ce panneau. Ouvrez Équipe et Départements, attachez au moins un administrateur actif, puis rechargez la page des paramètres.

Les escalades de chat peuvent-elles aller ailleurs que dans l'équipe?+

Oui, une adresse personnalisée précédemment enregistrée pour un service remplace toujours la liste d'équipe. Les nouvelles configurations doivent associer les personnes au service à la place, de sorte qu'il y ait un seul endroit à maintenir.

Pourquoi mon catch-all a été sauté?+

Si c'est le cas et que le visiteur n'a pas montré de signe d'achat, OpsIQ achemine délibérément l'utilisateur vers un service technique ou de support.

Appui

Boîtes aux lettres et brouillons

OpsIQ peut se connecter aux boîtes de messagerie pour créer automatiquement des tickets à partir d'e-mails entrants et envoyer les réponses sous forme d'email.

Courriel
Envoyer par email à un amiUne boîte aux lettres IMAP sur la gauche alimentant les e-mails entrants dans un ticket en fil avec une réponse rédigée par l'IA à droite.Courrielespace de travail[email protected] · IMAPDemande de remboursement[email protected]Impossible de se connecter[email protected]Copie de facture[email protected]Billet #1042À partir de l'email · FacturationJe souhaiterais un remboursement pour leCharge en double…Brouillon AIRéviser & envoyer une réponse1INGESTIMAP & transfert dans2TO TICKETSFileté automatiquement3AI DRAFTSRéponses pour examen
Recevez les e-mails via IMAP (ou en les transférant), transformez chacun d'eux en ticket et laissez l'IA rédiger une réponse pour examen.

Connexion d'une boîte aux lettres

Protocole

IMAP (la plupart des fournisseurs), Gmail API (Google Workspace), ou Microsoft Graph (Outlook 365).

Paramètres nécessaires

Hôte, port, chiffrement (SSL/TLS), nom d'utilisateur, mot de passe ou mot de passer d'application, dossier (généralement INBOX).

Cartographie des départements

Les e-mails envoyés à [email protected] créent des tickets dans le département "Support".

Configuration de Gmail (étape par étape)

1
Activer la vérification 2-Step

Allez dans Compte Google > Sécurité > 2-Step Verification et activez cette option.

2
Créer un mot de passe d'application

Aller à Google Compte > Sécurité > Mot de passe d'application. Sélectionnez "Mail" et "Autre (OpsIQ)". Copier le16- un mot de passe caractéristique.

3
Entrez dans OpsIQ

Aller à l'email > Boîtes aux lettres > Ajouter. imap.gmail.com, port: 993, chiffrement : SSL, nom d'utilisateur: [email protected], mot de passe : le mot de Passe de l'application.

4
Essai

Si l'opération est réussie, OpsIQ commencera à rechercher de nouveaux e-mails à l'intervalle configuré.

Configuration d'Outlook 365

1
Vérifiez que IMAP est activé

Dans les paramètres Outlook > Courrier > Synchroniser le courrier électronique, assurez-vous que IMAP est activé.

2
Utiliser le mot de passe d'application ou l'authentification moderne

Si l’authentification multifacteur est activée, créez un mot de passe d’application. Sinon, utilisez votre mot de passer habituel.

3
Entrez dans OpsIQ

Hôte : outlook.office365.com, port : 993, chiffrement : SSL, nom d’utilisateur : [email protected].

cPanel configuration de webmail

1
Trouver les paramètres IMAP

In cPanel > Comptes e-mail, cliquez sur votre compte e- IMAP Réglages.

2
Entrez dans OpsIQ

Hôte: habituellement mail.yourdomain.com ou votre nom d'hôte de serveur, port: 993 (SSL) ou 143 (STARTTLS), nom d'utilisateur: adresse e-mail complète.

Brouillons d'email AI

Lorsque la réponse automatique est définie sur le mode « Brouillon », l'IA génère des brouillons de réponse qui apparaissent dans la file d'attente Brouillons.

Examen

Lisez le projet et vérifiez l'exactitude.

Éditer

Modifiez le texte, le ton ou le contenu avant d'envoyer.

Envoyer

Approuvez le brouillon et envoyez-le sous forme de réponse par courrier électronique.

Jeter

Delete the draft if it is not appropriate.

Envoi automatique

Si la confiance est suffisamment élevée et que l'envoi automatique est activé, les brouillons sont envoyés automatiquement après un délai configurable.

Pourquoi les e-mails ne sont-ils pas convertis en tickets?+

Vérifiez : (1) La boîte aux lettres est-elle connectée et en bon état? Recherchez l’état vert dans E-mail > Boîtes aux2) Le travail cron est-il en cours d'exécution? L'interrogation par courrier électronique nécessite cron. (3) Le courriel est-il filtré ou déplacé vers un dossier autre que la BOÎTE A RECEVOIR?

Puis-je utiliser plusieurs boîtes aux lettres?+

Oui, chaque boîte aux lettres peut être associée à un département différent. [email protected] va à Support, [email protected] Aller à la facturation.

Appui

Satisfaction client (CSAT)

CSAT mesure la satisfaction des tickets et du chat, fait ressortir les réponses insatisfaites et compare l’IA aux résultats humains.

Écran de produit
Satisfaction de la clientèleLa page CSAT combine des fiches de score, le suivi des détracteurs, les commentaires, la répartition par département et agent, ainsi que les commentairet du chat.Satisfaction de la clientèleespace de travailRÉPONSES386AVERAGE4.6POSITIVE91%VUE DE L'ESPACE DE TRAVAIL EN DIRECTSuivi des détracteurs12 Réponses évaluées1–2ExamenEnquêtes sur les billetsEnvoyé 24h après la fermetureAutomatiqueFeedback sur le chatAI 4.5 · Humain 4.7ComparerVue de l'agentScore et nombre de réponsesEntraîneur1WATCH AVERAGEUtilisez la tendance, pas un score2FOLLOW DETRACTORSLire le commentaire3COMPARE FAIRLYIA et humain
La page CSAT combine des fiches de score, le suivi des détracteurs, les commentaires, la répartition par département et agent, ainsi que les commentairet du chat.

Ticket surveys are scheduled after closure (normally 24 hours later). A positive response is a score of 4 or 5. Use the detractor queue for scores of 1 or 2 and read the ticket/conversation before contacting the customer.

Les petites tailles d’échantillon ne doivent pas être utilisées pour classer les agents ou les modèles, car elles peuvent entraîner des erreurs de classement.

Appui

Diffusions d'e-mail d'équipe

La page Email Platform permet à un opérateur autorisé d’envoyer un message unique à tous les agents actifs, aux agents sélectionnés ou à un service et de consulter l’historique des envois.

Écran de produit
Plateforme de messagerieLe compositeur d'e-mails d'équipe affiche l'audience, le sujet, le message et l'historique de livraison passé.Plateforme de messagerieespace de travailRECEPTEURS12DELIVERED11FERMÉS1VUE DE L'ESPACE DE TRAVAIL EN DIRECTAuditoireTous les agents actifsSélectionnéSujetRotation des services d'appui en juilletPrêtMessageNotes sur le calendrier et l'escaladePrêtHistoriqueÉmissions et résultats précédentsVoir1CHOOSE PEOPLETout, sélectionné ou équipe2WRITE CLEARLYObjet et message3REVIEW HISTORYConfirmer le résultat
Le compositeur d'e-mails d'équipe affiche l'audience, le sujet, le message et l'historique de livraison passé.

Cette page est destinée aux messages opérationnels internes, pas au marketing client. Choisissez l'audience la plus petite possible, prévisualisez les noms et adresses, puis envoyez. La livraison utilise le chemin d'envoi configuré et enregistre le résultat.

Appui

Boîtes aux lettres, livraison et courrier entrant

Configurez comment OpsIQ envoie les e-mails, transforme les messages entrants en tickets et prouve que le domaine d'envoi est prêt.

Écran de produit
Paramètres de courrielLes paramètres de messagerie combinent le routage sortant, l'identité d'origine, l’ingestion des boîtes aux lettres, les vérifications de délivrabilité et les e-mails de test.Paramètres de courrielespace de travailSORTANTSMTPMAILBOXES3DOMAINEPasserVUE DE L'ESPACE DE TRAVAIL EN DIRECTConnecteur préféréSMTP / connecteur de fournisseurConfiguréDe l'identitéSupport <[email protected]>PrêtBoîte aux lettres IMAP[email protected] · BOÎTE D'ENTREPRISESondageDélivrabilitéFPS · DKIM · DMARCPasser1CHOOSE OUTBOUNDConnecteur ou SMTP2CONNECT INBOXIMAP ou tuyau3ESSAIEnvoyer et vérifier
Les paramètres de messagerie combinent le routage sortant, l'identité d'origine, l’ingestion des boîtes aux lettres, les vérifications de délivrabilité et les e-mails de test.

Courrier électronique sortant

Les administrateurs complets peuvent choisir le connecteur de messagerie préféré; OpsIQ Revient à configured SMTP Définissez un nom/une adresse de l'expéditeur reconnaissable, envoyez un test et vérifiez la validité du message. 24-heure de succès / échec métriques.

Boîtes aux lettres

Une boîte aux lettres IMAP nécessite un nom, une adresse e-mail, le service cible, l'hôte, le port, le mode de sécurité, le nom d'utilisateur, le mot de passe, le dossier, l’état du sondage et le choix de validation des certificats. Sondage maintenant pour vérifier l’ingestion sans attendre le cron.

Piping instantané

Sur le même serveur, un pipeline de messagerie peut transmettre directement le message RFC822 brut. Un serveur de messageries distant peut envoyer le message brut au point de terminaison entrant protégé à l'aide de son jeton. Les deux chemins entrent dans le même pipeline d'acheminement des tickets, de déduplication et de threading.

Délivrabilité

La vérification SPF/DKIM/DMARC est une preuve consultative pour le domaine From configuré. Une coche verte ne garantit pas le placement dans la boîte de réception, mais un échec doit être corrigé avant d'envoyer des messages de production.

Appui

Portail de support Studio

Support Portal Studio conçoit et publie l'expérience de support client sans avoir besoin d'images externes.

Écran de produit
Portail de support StudioPortal Studio affiche un aperçu réactif avec les contrôles thème, navigation, connaissances, ticket, assistant, formulaire, pied de page et CSS.Portail de support Studioespace de travailTEMPLATEModerneAVANTAGEBureauETATBrouillonVUE DE L'ESPACE DE TRAVAIL EN DIRECTThèmeCouleurs et typographie de la marqueÉditerNavigationConnaissances, billets, assistantÉditerFormulaire de billetChamps, routage et copieÉditerPublierValider et mettre en ligneExamen1CHOOSE TEMPLATECommencer par la structure2PREVIEW SIZESDe l'ordinateur au mobile3PUBLISH SAFELYExaminer puis publier
Portal Studio affiche un aperçu réactif avec les contrôles thème, navigation, connaissances, ticket, assistant, formulaire, pied de page et CSS.

Utilisez le modèle comme point de départ, puis configurez le thème, la mise en page, la navigation, la recherche des connaissances, le formulaire de ticket, l'assistant, le pied de page, l’image de marque, le comportement du ticket et personnalisé. CSS Prévisualisez votre site sur ordinateur, tablette et mobile avant de le publier.

Appui

Lacunes dans les connaissances

La file d’attente des lacunes de connaissance recueille les questions auxquelles l’IA ne pouvait pas répondre avec confiance afin que l’équipe puisse améliorer sa couverture.

Écran de produit
Lacunes dans les connaissancesLa file d’attente des écarts classe les questions manquées ou à faible confiance et suit si l’équipe les a résolues.Lacunes dans les connaissancesespace de travailOPEN GAPS28REPEATED9RESOLVED116VUE DE L'ESPACE DE TRAVAIL EN DIRECTLimites de migrationDemandé 14 foisÉlevéSupport le week-endDemandé 8 foisMoyenCalendrier des remboursementsDemandé 6 foisMoyenRégion de APIDemandé 3 foisBas1REVIEW QUESTIONVoir le contexte de la conversation2CHOOSE FIXArticle ou message3RESOLVEVérifier la réponse suivante
La file d’attente des écarts classe les questions manquées ou à faible confiance et suit si l’équipe les a résolues.

Ouvrez un espace pour lire la question originale et la conversation à proximité, puis choisissez le bon correctif : mettez à jour un article existant, créez un nouvel article de connaissances, ajoutez un fait d’affaires, corrigez les données du connecteur ou modifiez les instructions d’escalade.

Appui

Administration de la page d'état

La page d'administration de l'état communique l'intégrité du service et les incidents à l'aide des composants, des états actuels et des mises à jour.

Écran de produit
Administration du statutL'administration de l'état répertorie les composants et les incidents afin que les opérateurs puissent publier des informations claires sur le service horodaté.Administration du statutespace de travailOVERALLOpérationnelCOMPOSANTS7INCIDENTS1VUE DE L'ESPACE DE TRAVAIL EN DIRECTSite webOpérationnelVertAPIPerformance dégradéeRegarderIngestion d'emailOpérationnelVertIncident actuelAPI recherche de latenceOuvert1UPDATE COMPONENTChoisissez l'état clair2POST INCIDENTMises à jour horodatées3RESOLVEFermer avec le résumé
L'administration de l'état répertorie les composants et les incidents afin que les opérateurs puissent publier des informations claires sur le service horodaté.

Lorsqu'un incident affecte les clients, publiez un avis initial, ajoutez des mises à jour horodatées au fur et à mesure que les faits changent, puis fermez avec un résumé concis de la résolution. N'utilisez pas la page d'état comme journal de débogage interne; les diagnostics sensibles doivent être conservés dans les journaux du serveur et de OpsIQ.

IA

Configurez votre IA

La configuration de l'IA est le lieu où vous choisissez votre fournisseur, modèle et contrôle des coûts. OpsIQ Ce site supporte plusieurs fournisseurs: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), et Grok (xAI). Vous pouvez utiliser votre propre API clé (BYOK) ou l’IA gérée si elle est disponible dans votre forfait.

Mettre en place AI
Configuration de l'IAUn panneau de paramètres d'IA: un basculeur Managed-AI / BYOK fournisseur, un sélecteur de modèle et un compteur mensuel du budget des jetons.Configuration de l'IAespace de travailConfiguration de l'IAFournisseurIA géréeVotre clé (BYOK)Modèleclaude · équilibréBudget mensuel d'IA62%1TWO MODESIA gérée ou BYOK2PICK A MODELVitesse vs profondeur3BUDGETSPlafonds de jetons et contrôle des coûts
Choisissez Managed AI ou votre propre clé, choisissez un modèle pour la vitesse par rapport à la profondeur et limitez vos dépenses mensuelles avec un budget de token.

Choisir un fournisseur

Claude (Anthropic)

Raisonnement fort, prudent avec les faits, bon à suivre des instructions complexes. Modèles: claude-sonnet-4-20250514, claude-3.5 Idéal pour: les conversations de soutien, les questions techniques, l'analyse détaillée.

GPT-4o (OpenAI)

Rapide, créatif, bonne connaissance générale. Modèles: gpt-4o, gpt 4o-mini. Idéal pour: réponses rapides, rédaction créative, questions de connaissances générales.

Gemini (Google)

Bon aux questions factuelles, support multilingue. Modèles:gemini-2.0-flash,gemini-1.5 Idéal pour: support multilingue, recherches factuelles.

Vert (xAI)

Réponses rapides et concises. Modèles: grok-3-mini-fast. Idéal pour : réponses rapides, ton décontracté.

BYOK vs IA gérée

BYOK (Apportez votre propre clé)

Vous recevez votre propre clé API du fournisseur et payez directement le fournisseur. Contrôle total sur la sélection des modèles et leur utilisation.

IA gérée

L'IA est fournie dans le cadre de votreOpsIQ- C'est pas le cas.APIL'utilisation est mesurée par rapport au solde de crédit AI de votre plan.

Configuration étape par étape

1
Aller à la configuration AI

Dans l'administration OpsIQ, accédez à Paramètres > Configuration de l'IA.

2
Sélectionner un fournisseur

Choisissez votre fournisseur d'IA dans le menu déroulant.

3
Entrez la clé API

Si vous utilisez BYOK, entrez votre. API Pour l'IA gérée, cette opération est effectuée automatiquement.

4
Choisissez le modèle

Sélectionnez le modèle spécifique à utiliser. Les plus petits sont plus rapides et moins chers, tandis que les plus grands donnent des réponses de meilleure qualité.

5
Connexion de test

Cliquez sur "Test de connexion" pour vérifier que la clé et le modèle API fonctionnent. Une coche verte signifie succès.

6
Enregistrer

Cliquez sur Enregistrer pour activer votre configuration d'IA.

Contrôles des coûts

Budget mensuel

Lorsque le budget est atteint, les fonctionnalités d’IA se dégradent gracieusement (réponses plus courtes, pas de réponse automatique) plutôt que de s’arrêter complètement.

Limite de jeton par conversation

Nombre maximum de jetons par conversation. Empêche les conversations débridées de consommer des crédits excessifs.

Alerte de solde faible

Lorsque votre solde de crédits d'IA tombe en dessous du seuil (par défaut: 50,000 tokens), un avertissement apparaît dans l'administration.

Configuration par espace de travail

Si vous gérez plusieurs sites, chaque espace de travail peut utiliser un fournisseur, un modèle et un budget différents. L'espace de travail hérite des valeurs par défaut globales sauf si elles sont remplacées. Pour configurer par espace de travaux: basculez vers l'endroit où se trouve l'écran d'accueil, puis accédez à Configuration AI et enregistrez les paramètres là-bas.

Obtenir les clés API

Anthropic (Claude)

Allez àconsole.anthropic.com > APIClés > Créer une clé. Copier la clé en commençant par "sk-ant-".

OpenAI (GPT)

Allez àplatform.openai.com > APIClés > Créer une nouvelle clé secrète. Copier la clé en commençant par "sk-".

Google (Gemini)

Aller à aistudio.google.com > Get API Clé. Créez une clé pour votre projet. Copiez la clé.

xAI (Grèce)

Aller à console.x.ai > API Clés. Créez et copiez votre clé.

Tester votre configuration d'IA

Scénario :
Après avoir entré votre clé API, cliquez sur "Tester la connexion" Vous devriez voir une coche verte et un exemple de réponse de l'IA.
Que faire:

Si le test échoue: (1) Vérifiez que le API La clé est correcte (pas d'espaces supplémentaires).2) Vérifiez que la facturation de votre compte est configurée auprès du fournisseur. (3) Vérifiez que le nom du modèle est valide. (4) Si vous utilisez Managed AI, vérifiez que votre licence est active.

Quel fournisseur est le meilleur?+

Il n'y a pas de meilleur fournisseur. Claude est excellent pour les conversations d'assistance. GPT-4o est rapide et polyvalent. Gemini gère bien plusieurs langues. Essayez chacune et voyez laquelle produit les meilleurs résultats pour votre cas d'utilisation spécifique.

Puis-je changer de fournisseur plus tard?+

Oui, vous pouvez changer le fournisseur et la clé API à tout moment. L'historique de conversation existant est conservé. L'IA utilisera le nouveau fournisseur pour toutes les conversations futures.

Que se passe-t-il quand je manque de crédits?+

L’IA se dégrade avec grâce : les réponses deviennent plus courtes, la réponse automatique s’arrête et l’administrateur affiche un avertissement de solde faible. Le suivi principal, les tickets et le CRM continuent à fonctionner sans IA.

IA

Un chat client plus intelligent et moins cher

Un ensemble de contrôles opt-in qui rendent votre client chat plus intelligent (il raisons sur le compte d'un client comme un agent humain) ou moins cher (il envoie l'IA moins, ou répond en moins de étapes). Chaque contrôle est désactivé par défaut et indépendant, allumer sur jamais changer aucun autre comportement. La plupart vivent sous Paramètres > Chat client > Comportement; quelques sont sur Configurer votre AI et Trainez votre AI.

Réponses plus intelligentes (mode agent)

Un chatbot normal répond à une question par recherche. Avec Mode d'agent sur, l'assistant peut faire plusieurs vérifications de compte en lecture seule en un seul tour et les recouper, par exemple « ai-je des billets ouverts, et est mon solde assez pour mon prochain renouvellement? » est répondu dans une réponse avec les maths fait. Il engage seulement pour les clients vérifiés pour compte ou de remboursement des questions; tout le reste exécute le chemin normal d'une réponse unique.

Mode d'agent

Jusqu'à quelques recherches en lecture seule par tour, recoupées avant de répondre. Allumez lorsque vous avez une plate-forme connectée (WHMCS, Shopify, Stripe, Zendesk, etc.). Off = le comportement mono-aspect d'aujourd'hui, inchangé.

Profondeur de réflexion pour les réponses des agents

La difficulté du modèle à raisonner sur des virages complexes (faible/moyen/haut) Commencez par le niveau faible ; la plupart des questions de support sont bien traitées là.

Modèle d'agent

Épingle un modèle plus fort pour les tours d’agent complexes, de sorte que le chat quotidien reste sur un modèle léger et bon marché et que seuls les toures difficiles paient pour la profondeur.

Planifier les réponses à un seul passage (bêta)

Une petite étape de planification décide quelles recherches tirer et si la base de connaissances est nécessaire, puis répond en ONE appel principal au lieu de plusieurs étapes. Un sous-toggle sous le mode Agent. Il ne peut être activé que si le mode agent est activé. Même qualité de réponse, moins d'appels sur les questions multi-parties.

Conversation & compréhension

Mémoire de longues conversations (bêta)

Conserve un bref résumé des anciens messages (noms, numéros de ticket/facture, montants, décisions) afin que l'assistant reste cohérent sur les conversations très longues sans renvoyer la transcription entière. Idéal pour les longs threads à forte intensité d'assistance; s'associe au mode Agent.

Tolérance au typo

Lit les petites fautes de frappe ("mes tickets ouverts", "facture non payée") comme des mots prévus afin que la bonne information soit trouvée au lieu d'être manquée. Fonctionne avec toutes les plateformes connectées.

Contexte du compte Lean

Ne fixe l'instantané du compte du client que lorsque la question porte sur son compte (solde, factures, billets, services), en le faisant passer sur des questions générales.

Économie de coûts

Ignorer la recherche de connaissances pour les salutations (bêta)

"Hi", "merci" et "ok" ne déclenchent pas une recherche de base de connaissances, ces réponses ne l'utilisent jamais. Tout message avec le contenu réel recherche toujours comme normal.

Réponse la plus longue autorisée (tokens)

La longueur de la réponse est le point le plus coûteux d'un appel, donc un plafond raisonnable (environ 500 pour l'assistance) est le contrôle des coûts du chat le plus efficace. Cela ne fait qu'abaisser votre limite globale, jamais l'augmenter.

Configurez votre IA

Profondeur de réflexion (chat client & admin)

Le temps que le modèle pense avant de répondre (minimum à élevé). Gardez le chat client sur minimal/bas pour la vitesse. Réservez des paramètres plus élevés pour l'analyse et le copilote administrateur.

Modèle par IA (par tâche)

Chaque surface d'IA (chat en direct, brouillons de tickets, résumés, analyse, copilote administratif, promotions, Intelligence du site et plus) peut fonctionner sur son propre modèle.

Contrôles des coûts de chat d'administration

Le copilote administrateur peut garder une mémoire de travail limitée et charger uniquement les outils dont une question a besoin (outils lean) au lieu de chaque outil à chaque tour.

Entraînez votre IA

Instructions de compresser

Vos instructions sont envoyées à chaque tour, de sorte que leur longueur est un coût récurrent. Le bouton Compresse réécrit une fente pour dire la même chose en moins de mots. Il refuse la réécriture si elle laisserait tomber n'importe quelle {variable} ou règle, et rapporte ce qu'il a protégé, donc il ne change jamais silencieusement le sens.

"Ce qui est déjà dans le cerveau" (ℹ️)

Affiche ce que OpsIQ sait déjà sur votre entreprise par emplacement, de sorte que vous pouvez supprimer tout ce que vous répétiez dans vos propres instructions.

💡
Pour le court entretien de l'entrée (instructions + données de compte + historique, envoyé chaque tour) coûte généralement plus que la réponse courte, le cache et le contexte maigre aident le plus là. Pour le contenu généré depuis longtemps, la sortie domine. Le plafond de longueur de réponse et une profondeur de pensée inférieure y paient. Voir Configurez votre AI pour garder la mise en cache rapide, ce qui rend la grande partie répétée de chaque tour bon marché.
Est-ce que cela change la façon dont le chat répond déjà?+

Non, chaque contrôle est désactivé par défaut et indépendant. Activer un contrôle ajoute seulement son comportement ; le désactiver remet le chat exactement comme il fonctionnait avant.

Dans quel ordre dois-je les allumer?+

Exécutez le chat quotidien sur un modèle léger et épinglez un modèle d’agent plus puissant. Ensuite, si vous avez une plateforme connectée, activez le mode Agent, puis Planifiez à l’avance, puis la mémoire de longue conversation. Puis réduisez le contexte, ignorez les KB pour les salutations et ajoutez une limite de réponse.

Le kit Admin Agent: recherche web, runbooks, missions, transfert de fichiers

Le chat d’IA de l’administrateur est un ingénieur en activité, pas seulement une boîte à questions. Il peut rechercher des correctifs sur le Web, conserver une bibliothèque de vos procédures d’exploitation, patrouiller vos serveurs selon un calendrier et déplacer des fichiers. La plupart de ces fonctionnalités sont gérées par demande dans le chat; la seule chose que vous configurez à l’avance est le fournisseur de recherche Web qu’il utilise, sur la page Configuration de votre IA.

Recherche sur le Web

Construit en

L'agent recherche sur le web des documents, des messages d'erreur et des informations actuelles pendant qu'il fonctionne. Hors de la boîte, il utilise DuckDuckGo, qui ne nécessite aucune clé ni configuration.

Livres d'exécution

Dans le chat

Une bibliothèque de vos procédures (« comment faire X ici ») que l’agent peut noter après avoir réussi un travail délicat et suivre la prochaine fois, afin que le savoir-faire survive à la fin du chat.

Missions

Programmé

Patrouilles en lecture seule planifiées. « Chaque matin, vérifiez l'espace disque et les journaux d'erreurs et informez-moi » Les résultats arrivent sur votre cloche d'administration.

Transfert de fichiers

Dans le chat

Demandez un fichier log et obtenez un lien de téléchargement privé, ou faites copier un fichier d'un serveur connecté à un autre, les deux limités à 5 MB.

Recherche Web de l'agent Admin (sur Configurer votre IA)

Fournisseur de recherche

Ce que l'agent de recherche Web utilise. La valeur par défaut est DuckDuckGo: sans clé, gratuit, fonctionne sur toutes les installations. Serper.dev (Résultats Google) renvoient généralement de meilleurs résultats mais chacun a besoin d'un API Si un fournisseur de clé échoue pour une raison quelconque (mauvaises clés, quota utilisé, problème de réseau), cette recherche revient automatiquement à DuckDuckGo, donc la recherche n'est jamais obscurcie.

Recherche de la clé API

La clé du fournisseur choisi, uniquement nécessaire pour Brave, Tavily ou Serper. Une fois enregistrée, elle est masquée et ne s'affiche plus sur la page; collez-en une nouvelle pour la remplacer. Un fournisseur avec clé n'est actif que lorsque le fournisseur et sa clé sont sauvegardés.

Livres d'exécution

Lorsque l'agent vient de terminer une tâche que vous souhaitez faire à nouveau, dites "enregistrez-la comme un runbook appelé nightly-cleanup". À partir de là, il voit le runbook par son nom dans chaque session et lorsque vous demandez la tâche par son Nom (ou la décrivez), il récupère les étapes et les suit.

💡
Un runbook est un guide, pas une autorisation. Lorsque l'agent en suit un, chaque étape qui modifierait un serveur passe toujours par votre mode d'autorisation actuel et affiche les cartes d'approbation habituelles. Un runbook ne peut jamais contourner une approbation.

Missions

Une mission est un travail récurrent que l'agent exécute seul : toutes les heures, tous les jours à une heure définie ou chaque semaine un jour donné. Les missions sont conçues en lecture seule. Elles peuvent lire des serveurs, des données et le Web, mais elles ne peuvent jamais rien changer ; elles enquêtent et font rapport. Quand une mission se termine, les résultats atterrissent sous forme de notification sur votre sonnette d'administration.

⚠️
Les missions sont exécutées par le cron OpsIQ, donc il faut le paramétrer (voir Cron et automatisation). Un "run it now" unique depuis le chat fonctionne même entre les runs de cron sur la plupart des serveurs.

Déplacement de fichiers

Demandez un fichier ("obtenez le journal d'erreurs du serveur web pour aujourd'hui") et l'agent le prépare et vous répond avec un lien de téléchargement privé. Le lien ne fonctionne que pour les administrateurs connectés et expire après environ une journée. Les fichiers sont limités à 5 MB; pour tout ce qui est plus gros, demandez à l' agent de compresser ou de couper sur le serveur en premier.

L'agent peut également copier un seul fichier entre deux serveurs connectés, toujours jusqu'à 5 MB. L'écriture sur la destination est traitée comme toute autre modification qu'il effectue: en mode demande vous obtenez d'abord une carte d'approbation, le fichier existant est sauvegardé et la copie est réversible. Pour plus de sécurité, le contenu du fichier est relu à partir de la source au moment où la copie a été appliquée, pas prise du chat.

IA

Entraînez votre IA

La formation à l’IA est le processus par lequel vous apprenez à OpsIQ comment se comporter. Vous écrivez des instructions qui définissent la personnalité, les limites, le domaine de compétence et les règles d’escalade.

Train AI
Entraînez votre IAUn éditeur d'instructions AI avec des onglets Client / Admin et un ton clair en anglais, toujours et jamais règle.Entraînez votre IAespace de travailL'IA clientAdmin IATonneSympathique, concis, jamais envahissant.ToujoursOffrez un intermédiaire humain pour les litiges de facturation.JamaisPromettre un remboursement sans vérifier le compte.1TWO MANUALSAI client & admin2PLAIN ENGLISHTon, toujours, jamais3GROUNDEDPlus votre base de connaissances
Formez l'IA comme une nouvelle location, Manuels clients et administratifs rédigés en anglais simple (ton, toujours, jamais), basé sur votre KB.

Deux zones d'entraînement

Invite de l'IA client

Contrôle la façon dont l’IA parle à vos clients dans le widget de chat C’est l’invite la plus importante à bien faire.

Invite d'IA de l'administrateur

Contrôle la façon dont l'IA assiste votre équipe d'administration dans le tableau de bord de l'opérateur, en gérant les requêtes internes et l'exécution des actions.

Rédiger une excellente invite d’IA client

Votre message d’IA client devrait couvrir ces domaines:

1
Identité

Donnez-lui un nom, un rôle et une personnalité. Exemple : « Vous êtes Luna, une assistante du service clientèle sympathique et compétente pour Acme Store ».

2
Ton et style

How should it communicate? Example: "Be professional but warm. Use simple language. Avoid jargon. Keep responses concise (2-3 paragraphs max)."

3
Les frontières de la connaissance

Exemple : « Vous connaissez nos produits, nos prix, notre politique d'expédition et de retour. Vous ne connaissez PAS les produits des concurrents ni les décisions internes de l'entreprise ».

4
Règles d'escalade

Exemple : « Passez à un agent humain lorsque le client demande un remboursement, mentionne une action en justice, signale un problème de sécurité ou pose la même question trois fois. »

5
Choses à ne jamais faire

Exemple : « Ne jamais promettre de remboursements, ne jamais partager les formules internes de tarification, ne pas inventer des caractéristiques de produits qui n'existent pas, ne donner aucun conseil médical, juridique ou financier ».

Exemple d'invites

Exemple client AI prompt · boutique en ligne
You are Aria, a friendly customer support assistant for TechGear.

PERSONALITY:
- Warm and professional
- Concise (2-3 paragraphs max per response)
- Use simple language, no jargon
- If unsure, say so honestly

KNOWLEDGE:
- Our products: laptops, accessories, software subscriptions
- Pricing: as listed in the knowledge base
- Shipping: free over $50, 3-5 business days standard, 1-2 days express ($12)
- Returns: 30-day money-back guarantee, must be in original condition

ESCALATION (hand off to human):
- Refund requests over $100
- Account security concerns
- Legal threats or complaints
- Customer explicitly asks for a human

NEVER DO:
- Promise specific delivery dates (say "estimated")
- Share discount codes not in the knowledge base
- Make up product specifications
- Give financial or legal advice
Exemple client AI prompt · entreprise d'hébergement
You are Atlas, an AI assistant for CloudHost web hosting.

TONE: Technical but accessible. Assume the customer has basic web knowledge.

KNOWLEDGE:
- Shared hosting, VPS, dedicated servers
- cPanel, DNS, SSL, email configuration
- WordPress, Joomla, Drupal installation
- Common error codes and troubleshooting

ESCALATION:
- Server outages affecting multiple customers
- Data loss or security breach reports
- Billing disputes over $50
- Complex migration requests

BOUNDARIES:
- Do NOT access customer servers or databases
- Do NOT change DNS records or passwords
- Always recommend the customer makes changes themselves
- For code issues, suggest steps but clarify you cannot debug their application

Affinez votre prompt au fil du temps

1
Démarrer avec les bases

Commencez par définir l’identité, le ton et les limites de la clé. N’essayez pas de tout couvrir dès le premier jour.

2
Revue AI History hebdomadaire

Lisez les conversations où l'IA a donné des réponses erronées ou sous-optimales.

3
Mettre à jour l'invite

Ajouter des règles spécifiques pour les problèmes récurrents. Exemple : si l'IA continue de promettre des remboursements, ajouter « Jamais promettre un remboursement. Dites que vous allez augmenter à l'équipe de facturation ».

4
Ajouter des connaissances

Si l'IA ne peut pas répondre à une question, ajoutez la réponse à la base de connaissances plutôt que d'essayer de tout mettre dans l'invite.

⚠️
Gardez votre prompt sous 2,000 mots. Des prompts trop longs peuvent confondre l'IA et augmenter les coûts de token.
Quelle est la différence entre l'invite et la base de connaissances?+

L’invite définit la personnalité, les limites et les règles de l’utilisateur, tandis que la base de connaissances fournit des informations factuelles (détails du produit, prix, politiques). L’IA lit les deux, mais l’invité façonne le comportement tandis qu’elle fournit les réponses.

Puis-je avoir des invites différentes pour différents départements?+

Si vous avez besoin d’un comportement différent de l’IA pour différents services, utilisez la base de connaissances pour fournir des informations propres à chaque service et mentionnez le contexte du service dans votre invite.

IA

Histoire de l'IA

L’historique de l’IA affiche toutes les conversations que l’AI a eues avec des clients et des administrateurs, ce qui vous permet d’auditer ses performances, de trouver de mauvaises réponses et d’identifier les lacunes en matière de formation.

Histoire de l'IA
Histoire de l'IAUn journal des tours d'IA avec les badges de type, la question et la réponse, le temps de réponse et le résultat.Histoire de l'IAespace de travailChaque tour de l'IA, enregistréchatQ: où est ma commande?A: expédié aujourd'hui, suivi UPS...0.9srépondubilletProjet de réponse pour T-12345accusé de réception du remboursement rédigé1.4sdraftedadministrateurRésumer les billets de cette semaine12-ligne de résumé retournée2.1sfaitchatQ: annuler mon abonnementRemis à un humain0.7sescalated1EVERY TURNInvite, réponse, action2SEARCHABLEFiltrer & exporter3OWNER-ONLYPiste d'audit complète
Chaque tour AI (chat, brouillon de tickets, action admin) est enregistré avec l'invite exacte, réponse, durée et résultat.

Ce que chaque conversation révèle

Date et heure

Quand la conversation a eu lieu.

Identité du client

Nom et courriel si connu, sinon IP et le pays.

Canal

Widget de chat, réponse automatique aux tickets, brouillon d’e-mail ou IA administrateur.

Messages

Transcription complète de la conversation: messages clients et réponses d’IA.

Utilisation de token

Une utilisation élevée de jetons peut indiquer que l'IA donne des réponses trop détaillées ou que la conversation a continué en rond.

Mesures prises

Toutes les actions exécutées par l'IA pendant la conversation (recherche d'ordre, création de ticket, etc.).

Évaluation

Si CSAT est activé, la note de satisfaction du client pour cette conversation.

Trouver des problèmes

Recherche par mot-clé

Recherchez des sujets spécifiques pour voir comment l'IA les traite, par exemple: recherchez "refund" (remboursement) pour vérifier si l'AI suit votre politique de remboursement.

Filtrer par classement

Affichez uniquement les conversations mal notées pour vous concentrer sur les clients insatisfaits.

Filtrer par canal

Afficher uniquement les réponses automatiques des tickets pour auditer les réponset automatisées séparément du chat.

Trier par utilisation de jeton

Les conversations à haute valeur peuvent indiquer des problèmes : l’IA vagabonde, tourne en rond ou ne répond pas à la question.

Routine d'audit hebdomadaire

1
Vérifiez les conversations peu appréciées

Qu’est-ce qui a mal tourné? S’agissait-il d’un manque de connaissances, d’une question de ton ou d’ une mauvaise réponse?

2
Vérifiez les conversations à haut jeton

Ces réponses peuvent indiquer une certaine confusion. L’IA se répétait-elle? A-t-elle échoué à comprendre la question?

3
Mise à jour de la formation

Pour les lacunes dans les connaissances, ajoutez des articles à la base de connaissance. Pour les problèmes de comportement, mettez à jour l’invite d’IA et pour les mauvaises réponses récurrentes, ajouter des règles de correction explicites.

Détecter les lacunes de connaissances

Scénario :
Vous recherchez dans l'historique de l'IA la mention « installation » et trouvez des conversations 15 où l'AI a dit « Je n'ai pas d'instructions d'installation spécifiques pour ce produit. »
Que faire:

Cela signifie que votre base de connaissances ne contient pas les guides d'installation. Créez des articles pour chaque étape d'instalation du produit, puis posez les questions d'IA sur l'installations.

IA

Insights sur l'IA

AI Insights analyse automatiquement les modèles de conversation et fait ressortir des résultats exploitables : questions courantes, tendances en matière de satisfaction, lacunes dans les connaissances et schémas d’escalade.

Insights sur l'IA
Aperçus de l'IA (Intelligence Hub)The Intelligence Hub: un résumé de l'IA aujourd'hui, des alertes intelligentes, un outil Score-a-Lead / Analyser une page et un. 14-Jour Trafic Pattern graphique.Insights sur l'IAespace de travailLE BRIEF D'AUJOURD'HUITraffic up 12%; 3 Hot leads;2Les accords doivent être suivis.Alertes intelligentesErreurs de paiement spikedRebondissez sur /pricingNouveau plomb chaud des Etats-UnisChiffre d'affaires en avance sur la semaine dernièreScore un Lead / Analyser une PageIP ou URL…Exécuter14-Jour de trafic1LE BRIEF D'AUJOURD'HUIL’IA rédige le résumé du matin2SMART ALERTSDes anomalies ont été relevées3ON DEMANDMarquer un lead · analyser une page
Le véritable Hub d'intelligence: un résumé du jour écrit par l'IA, des alertes intelligentes pour les anomalies, le score de prospect à la demande et l'analyse de page, ainsi que le modèle de trafic 14-day.

Ce que les insights montrent

Questions les plus fréquentes

Les questions les plus fréquemment posées. Si « Comment puis-je réinitialiser mon mot de passe? » est #1, votre base de connaissances a besoin d'un guide de remise à zéro bien visible.

Tendances de satisfaction

CSAT scores au fil du temps. La satisfaction en matière d'IA s'améliore-t-elle ou diminue-t'il? Des gouttes soudaines peuvent indiquer un changement de base de connaissances qui a brisé quelque chose.

Taux de résolution

Quel est le pourcentage de conversations que l’IA résout sans intervention humaine? Un taux supérieur à 70% C'est bon. Ci-dessous 50% Cela signifie que l'IA a besoin de plus d'entraînement.

Raisons de l'escalade

Raisons courantes: le client a demandé un humain, l’IA n’a pas pu répondre, sujet sensible, problème de facturation.

Lacunes dans les connaissances

Sujets où l'IA dit fréquemment "Je ne sais pas" ou donne des réponses peu fiables.

Durée moyenne de la conversation

Des conversations très longues (10+ messages) peuvent indiquer que l'IA ne comprend pas la question.

Utiliser les informations pour améliorer

Scénario :
AI Insights montre que 23% des escalades sont "Le client a demandé à propos de la garantie" et l'IA n'a pas pu répondre.
Que faire:

Il s'agit d'un manque de connaissances évident. Étapes: (1Rédiger un article complet sur la garantie dans la base de connaissances, qui couvre toutes les conditions de garantie, le processus de réclamation et les exclusions.2) Mettre à jour l'invite AI pour faire référence aux informations de garantie. (3Surveillez AI Insights la semaine prochaine pour voir si les escalades de garantie diminuent.

IA

Manuel d'IA pour les administrateurs

L'IA Admin (Ask OpsIQ) aide votre équipe à gérer OpsIQ Vous pouvez lui demander de rechercher des données, d'expliquer les fonctionnalités, de résumer les tickets et d'effectuer des actions sur la plateforme.

Admin IA
Manuel d'IA pour les administrateursLa boîte de commande Ask-OpsIQ avec une carte d'action de plateforme proposée par l'IA montrant les paramètres et confirmer / annuler.Demandez à OpsIQespace de travailDemandez à OpsIQSuspendre le service pour compte en retard #4821IAAction proposée: suspend_serviceCompte : #4821 (en retard) $120)plate-forme: WHMCS · réversible · auditéConfirmerAnnuler1ASK ANYTHINGCommandes en anglais clair2PROPOSE FIRSTAction affichée avant son exécution3YOU CONFIRMScoped & audité
Dites à l'administrateur ce que vous voulez en anglais clair; il propose l'action exacte (scoped, réversible, audité) et attend votre confirmation.

Ce que l'IA de l'administrateur peut faire

Recherchez les données

Demandez: "Montrer tous les billets de [email protected]" ou "Quel est le statut de la commande #ORD-5523?"

Résumer

Dis: "Résumez les derniers 10"Quels sont les principaux problèmes de support cette semaine?"

Expliquer les caractéristiques

Demandez-vous : « Comment puis-je configurer la réponse automatique? » ou « Que signifie le taux de rebond?

Exécuter des actions

Demandez: "Créer un ticket pour [email protected] Informations sur la facturation" ou "Fermer le ticket T-12345"

Requêtes de plateforme

Demandez-vous : « Combien de visiteurs avons-nous eu hier? » ou « Quel est notre chiffre d'affaires ce mois-ci?

Exemple de conversations

Recherche d'un client

Scénario :
Admin demande: "Trouver le client [email protected] et me montrer son activité récente"
Que faire:

L’IA recherche le client dans toutes les sources de données connectées : sessions des visiteurs, tickets, conversations sur chat, commandes et contacts CRM. Elle renvoie un résumé de l’activité récente avec des liens vers chaque élément.

Obtenir un résumé quotidien

Scénario :
Admin demande: "Qu'est-il arrivé aujourd'hui?"
Que faire:

L'IA résume: "Aujourd'hui, vous aviez245visiteurs (en haut)12%), 8nouveaux billets (3résolue par AI),2nouvelles commandes totalisées$198et1chat escalade sur un retard d'expédition."

Exécuter une action

Scénario :
Admin demande: "Changer la priorité du ticket T-5523 à Urgent"
Que faire:

L'IA confirme : « Je vais changer la priorité du ticket T-5523 de Normal à Urgent. Cela affectera le minuteur SLA. Confirmer? » Vous confirmez, et l'action est exécutée.

💡
L'IA Admin n'exécute que les actions enregistrées dans le Registre d'Actions, elle ne peut pas inventer des actions ou accéder à des systèmes en dehors de OpsIQ.
IA

Scénarios d'IA client

Cette section couvre les scénarios d'IA courants face aux clients avec le comportement attendu et des conseils de formation.

L'IA client
Scénarios d'IA clientUne bibliothèque de questions client associées au comportement attendu de l’IA et une balise de résultat pour chacune.Scénarios d'IA clientespace de travailBibliothèque de scénarios · comportement d'IA attendu"Où est ma commande?"Recherchez la commande via le connecteur, donnez le suiviRésoudre"Je veux un remboursement"Reconnaissez, ne promettez jamais · la main à un humainDélivrance"Le service est-il en panne?"Vérifier l'état, rapporter l'État actuelStatut"Annuler mon compte"Confirmer l’intention, puis acheminer vers un humainConfirmer1SCENARIOSQuestions fréquentes2EXPECTEDComment l’IA devrait répondre3ESSAITrouver des lacunes de formation
Une bibliothèque de vraies questions client et exactement comment l'IA doit gérer chacun, pour tester votre formation et trouver des lacunes.

Bibliothèque de scénarios

Demande de statut de commande

Scénario :
Client: "Où est ma commande #12345?"
Que faire:

Comportement attendu de l'IA: (1) Recherchez la commande via le connecteur de plateforme. (2) Signaler l'état actuel (traitement, expédié, livré).3) Inclure le numéro de suivi si disponible.4) Si la commande est retardée, accuser réception et fournir un calendrier estimatif. (5) Ne jamais inventer des informations de suivi.

Demande de réinitialisation du mot de passe

Scénario :
Client: "J'ai oublié mon mot de passe et je ne peux pas me connecter"
Que faire:

Comportement attendu de l'IA: (1) Fournissez les étapes de réinitialisation du mot de passe à partir de la base de connaissances. (2) Inclure le lien de réinitialisation ou le chemin d'accès à la page. (3) Mentionnez que l'email de réinitialisation peut prendre quelques minutes. (4) Suggérer de vérifier le dossier spam. (5) Si le client ne peut toujours pas réinitialiser, passez à un humain.

Demande de fonctionnalité

Scénario :
Client : « Pouvez-vous ajouter le mode sombre à l'application mobile? »
Que faire:

Comportement attendu de l'IA: (1) Je les remercie pour leur suggestion. (2) Expliquer comment les demandes de fonctionnalité sont traitées (enregistrées, examinées, hiérarchisées).3) NE promettez PAS que la fonctionnalité sera construite. (4) Si une fonctionnalité similaire existe, mentionnez-la.

Litige de facturation

Scénario :
Client : « J'ai été facturé mais mon service ne fonctionne pas »
Que faire:

Comportement attendu de l'IA: (1) Reconnaître la frustration. (2) Vérifiez l'état du service si possible. (3) Communiquez avec le service de facturation pour obtenir tous les détails. (4) Ne promettez PAS un remboursement. (5) Définissez la priorité du ticket sur Haute.

Question hors sujet

Scénario :
Client : "Quel temps fait-il à Londres aujourd'hui?"
Que faire:

Comportement attendu de l'IA: (1"Je suis l'assistant technique de votre [entreprise] et je peux vous aider à répondre aux questions sur nos produits et services. Pour obtenir des informations météorologiques, essayez un service météo."2) Demandez s'ils ont une question sur un produit.

Comment tester le comportement de l'IA client?+

Ouvrez votre site Web dans un navigateur privé/incognito et discutez avec l’IA en tant que client. Essayez des questions courantes, des cas extrêmes et des scénarios contradictoires Vérifiez que l’AI suit vos règles de prompt et utilise correctement le contenu de la base de connaissances.

IA

Base de connaissances sur l'IA

La base de connaissances est une bibliothèque d’articles que l’IA utilise pour répondre aux questions. Lorsque le client pose une question, l’AI recherche dans la base de données les articles pertinents et les utilise pour générer une réponse précise et fondée.

Base de connaissances
Base de connaissancesLes sources alimentent un magasin de connaissances, puis une IA génère une réponse cité et fondée.Base de connaissancesespace de travailSourcesCrawl de site webArticles d’aideFAQDocuments importésConnaissancesSémantique + mot-cléIARéponse motivéeAvec une source citée."Les remboursements prennent entre 3et _5business days."1INGESTCrawl, FAQ, importation2RETRIEVESémantique + mot-clé3GROUNDEDRéponses à partir de votre contenu
Parcourez votre site et importez des documents dans la base de connaissances; l'IA récupère les bons éléments et réponses, ancrés et cités.

Comment ça fonctionne

1
Le client pose une question

"Quelle est votre politique de retour?"

2
L’IA recherche dans la base de connaissances

OpsIQ trouve l'article "Politique de retour" en faisant correspondre les mots-clés et la signification sémantique.

3
L’IA génère une réponse

L’IA lit l’article et rédige une réponse en langage naturel basée sur le contenu de l’Article.

4
Le client obtient une réponse précise

La réponse est basée sur votre politique réelle, pas les données générales de formation de l'IA.

Créer de bons articles

Un sujet par article

Rédigez un article distinct pour chaque sujet : politique de retour, tarifs d'expédition, configuration du compte, réinitialisation du mot de passe.

Écrire comme un FAQ

Commencez par la question que les clients posent, puis fournissez la réponse pour aider l’IA à faire correspondre les questions aux articles.

Soyez spécifique

« Les retours doivent être initiés dans les 30 jours suivant la livraison » est mieux que « Nous avons une politique de retour. »

Inclure les cas de bord

Qu’en est-il des retours internationaux, des produits numériques et des articles achetés en solde? Couvrez les exceptions.

Gardez-le à jour

Supprimez les informations obsolètes. Mettez à jour la tarification, les politiques et les procédures lorsqu’elles changent.

Articles de démarrage que vous devriez écrire

Expédition et livraison

Frais d'expédition, délais de livraison, suivi, expédition internationale et retards de manutention.

Retours et remboursements

Fenêtre de retour, conditions, processus, calendrier de remboursement et exceptions.

Gestion de compte

Réinitialisation du mot de passe, changement d'adresse e-mail, suppression de compte et exportation des données.

Prix et facturation

Descriptions des plans, cycle de facturation, méthodes de paiement, factures et monnaie.

Guides de produits

Comment utiliser chaque produit ou fonctionnalité. Instructions étape par étape avec captures d'écran.

Dépannage

Problèmes courants et solutions. Messages d'erreur et leurs correctifs.

Informations de contact

Heures d'ouverture, canaux de support, délais de réponse et voies d'escalade.

Juridique et conformité

Résumé de la politique de confidentialité, résumé des conditions d'utilisation, demandes de données GDPR.

Connaissance du connecteur

Chaque connecteur peut apporter des connaissances à l’IA. Lorsqu’un connecteur est activé, ses articles de connaissance intégrés (catalogue de produits, questions courantes, dépannage spécifique à la plateforme) sont automatiquement disponibles pour l’AI. Vous pouvez activer ou désactiver les connaissance de connecteur par connecteur dans les paramètres du Connecteur.

Budget de jetons

La base de connaissances dispose d'un plafond configurable (par défaut: 32,000 jetons) qui contrôle la quantité de contexte de connaître envoyé à l'IA par conversation. Si votre base de données est très grande, l'AI sélectionne les articles les plus pertinents dans ce budget. Augmentez le plafond si l'intelligence artificielle ne trouve pas d'articles pertinents; diminuez-le si vous souhaitez réduire les coûts des jetons.

Combien d'articles dois-je avoir?+

Commencez par5-10 Ajoutez-en d'autres à mesure que vous identifiez des lacunes grâce à l'historique de l'IA et aux informations sur l'intelligence artificielle. La plupart des entreprises ont besoin 20-50 Articles pour une couverture complète.

Puis-je importer des articles d'un autre système?+

Actuellement, les articles sont créés manuellement dans OpsIQ Vous pouvez copier et coller du contenu à partir de FAQ, centres d'aide ou documents existants.

Dans quel format les articles doivent-ils être?+

Le texte brut fonctionne mieux. L'IA comprend le langage naturel mieux que HTML ou markdown structuré. Écrivez comme vous expliqueriez à un client.

IA

Évaluation de l’IA et Watchtower

Les ensembles d'évaluation transforment les questions critiques des clients en tests répétables pour la qualité de réponse, les citations, l'escalade et la sécurité d'action.

Écran de produit
Évaluation de l'IAL’évaluation de l’IA liste les cas d’essai, les comportements requis, les derniers résultats et les exécutions prévues de Watchtower.Évaluation de l'IAespace de travailSETS6CASES84PASS RATE96%VUE DE L'ESPACE DE TRAVAIL EN DIRECTPolitique d'expéditionCitation requisePasserDemande de remboursementConfirmation humaine requisePasserRéclamation non étayéeAction interditePasserQuestion des migrationsSource attendue manquanteFichiers1CREATE CASESEntrée et règles d'or2RUN SAFELYEssai ou évaluation en direct3WATCHProgramme quotidien ou hebdomadaire
L’évaluation de l’IA liste les cas d’essai, les comportements requis, les derniers résultats et les exécutions prévues de Watchtower.

Les administrateurs complets peuvent créer des jeux d’évaluation avec une instruction, les libellés de sources attendus, les citations obligatoires, les règles de confirmation humaine et les attentes en matière d’escalade

La Tour de Garde Planifie des vérifications quotidiennes ou hebdomadaires via cron et exécute un nombre limité de cas (jusqu'à huit par passage planifié) Examine les échecs en même temps que le fournisseur/modèle, la version prompt, la Version de connaissance, les actions proposées et le coût avant de modifier le comportement de production.

IA

Langues et traduction

Langues gère le texte traduit destiné au client et le comportement utilisé lorsque OpsIQ suit la langue du client.

Écran de produit
LanguesLa page Langues affiche la langue source, les langues traduites, l'état brouillon/en direct et le comportement de la langue du client.Languesespace de travailSOURCEAnglaisLANGUAGES4VIVRE3VUE DE L'ESPACE DE TRAVAIL EN DIRECTFrançaisInterface et contenuEn directAllemandInterface et contenuEn directEspagnolProjet de traductionBrouillonSuivre le clientRépondre dans la langue détectéeActivé1SET SOURCELangue d'origine de l'opérateur2ADD LANGUAGETraduire en arrière-plan3PUBLISHDraft ou live
La page Langues affiche la langue source, les langues traduites, l'état brouillon/en direct et le comportement de la langue du client.

OpsIQ Définissez correctement la langue source avant de créer des traductions, ajoutez les langues cibles, puis vérifiez les brouillons avant de publier. « Suivre la langue du client » contrôle la langue de réponse ; traduire l’interface du widget contrôle ses boutons, ses étiquettes et le texte du système.

Ne vous fiez pas à la traduction automatique pour les textes juridiques, de remboursement ou de sécurité sans avoir reçu une révision humaine.

Chaque endroit qui contient votre propre formulation est répertorié avec son nombre de messages: messages de chat client, promotions, messages proactifs, flux de chat, visites guidées, annonces, bulles teasers et plus encore. Sondages et formulairesLa surface du sondage couvre entièrement chaque sondage publié : titre, toutes les questions, toutes le choix de réponses, boutons, copie d’accueil et de remerciement, page chrome et pages des résultats. Les clés sont liées à l’ID de la question et à la valeur de l’option, donc en réordonnant les questions ou les options vous ne perdez jamais une traduction, et en reformulant un message, ce dernier est seulement traduit.

Le sondage par e-mail post-chat suit la langue dans laquelle le visiteur a réellement discuté, à condition que cette langue soit une des langues proposées ici. Sinon, il utilise la langue de votre système. Ses six champs modifiables sont traduits sur cette page également et ce comportement dispose de son propre commutateur dans les paramètres du chat client.

Messages de ticket et de portail couvre les opérateurs de texte fixe tapent une fois et chaque client reçoit ensuite dans cette langue: l'accusé de réception du ticket, les confirmations ouvertes, fermées et de rétroaction, les sign-offs par département et la ligne d'accueil portail. (La réponse automatique AI n'a pas besoin de cela, il répond déjà dans la langue du client.) Envoyez des e-mails à vos clients dans leur propre langue activé en OpsIQ L'écriture, l'email du ticket résolvent la langue du destinataire dans cet ordre : la langue qu'ils ont choisie dans le portail ou le centre d'aide (porté sur le ticket), la localité de leur enregistrement de contact, puis la langue dans laquelle ils ont écrit, détectée localement par la plage de scripts et les mots marqueurs, sans appel externe. Seules les langues sélectionnées sur la page Langues sont jamais utilisées, donc la fonctionnalité est inerte jusqu'à ce que des langues soient ajoutées. HTML e-mail wrapper n'est délibérément pas traduit: c'est un balisage, pas de la prose. L'e-mail adressé au personnel (notifications, alertes départementales, mémoires d'analystes, rapports programmés, le digest hebdomadaire) utilise toujours le langage système.

PeopleOS RH

PeopleOS: le système d'exploitation de la main-d'œuvre gouvernée

Exécuter le cycle de vie des employés, de la demande à l'offboarding avec un libre-service mobile, des workflows étayés par des preuves, des intégrations dactylographiées et le contrôle humain sur les décisions sensibles.

Carte du système interactif
Centre de commandement du cycle de vie PeopleOSUn tableau de bord tridimensionnel PeopleOS reliant le recrutement, les employés, la paie, l'apprentissage et l'IA régie.Centre de commandement PeopleOSVIE DE PREUVESLES PEUPLES248RÔLES OUVERTS12GAZ DE CONTRÔLE15 / 15VIE CYCLERécapitulatifLocationCroîtreRécompensesTransitionUN COMPTE RENDUIdentité + preuve d'emploiCONTRÔLE HUMAINRecours, correction, prise de contrôlePROCÉDENTPreuves des résultats et des rejets
PeopleOS garde le cycle de vie, les contrôles et la preuve sur un document régi.

Administrateurs

Opérer

Gérer les personnes, l'organisation, le recrutement, l ́embarquement, les documents, les congés, le rapprochement des salaires, les avantages sociaux, la performance, l? apprentissage, les relations avec les employés, l`analyse et la gouvernance.

Employés et gestionnaires

Libre-service

Utilisez un portail mobile-premier pour les dossiers privés, les demandes, les documents, l'embarquement, le temps, les explications de paye, l ́apprentissage, l`information et les droits de la société.

Développeurs

Élargir

Utiliser le traitement hr.* et les mesures envisagées platform.hr.* L'index généré dans la section PeopleOS API liste chacun avec sa portée.

⚠️
PeopleOS n'est pas un grand livre de paie, conseiller juridique, bureau de vérification des antécédents ou fournisseur d'identité. Les systèmes externes certifiés conservent ces responsabilités.

Obtenir PeopleOS HR

PeopleOS HR est inclus dans le plan d'entreprise. Sur chaque autre plan payé, il s'agit d'un add-on: le propriétaire du compte ouvre Compte → Add-ons et jetons, choisit un niveau HR PeopleOS et commence l'essai gratuit ou l'ajoute directement. Les niveaux diffèrent dans le nombre de personnes et combien d'activités de recrutement, d'entrevue et d'IA qu'ils portent. Les prix et les limites sont fixés sur le compte, non inscrits dans le produit, alors voir les niveaux actuels sur le page de prix. Ce que fait le module, surface par surface, est sur la Page de produit PeopleOS HR.

Qui peut l'ajouter

Un régime payé qui est actif. Un régime gratuit ne peut pas l'ajouter, et un régime payé toujours dans son propre régime procès doit attendre que ce procès se termine.

Le procès libre

L'essai s'exécute sur le niveau choisi. Lorsqu'il se termine sans achat, le droit est supprimé et rien n'est facturé. Rien n'a été supprimé : les enregistrements sont là à nouveau au moment où l'ajout est ajouté.

Lorsqu'il n'est pas détenu

PeopleOS HR n'apparaît pas dans la barre latérale, la palette de commandes, les paramètres ou l'aide dans l'application. Un lien direct vers une page HR offre le complément au lieu de la page.

Atteinte d'un plafond de niveau

Quand une limite de niveau est atteinte, la page offre le niveau suivant. L'édition ou l'élimination de ce qui existe déjà n'est jamais bloquée.

Installations auto-portées

Le droit voyage dans la licence. Ajoutez le add-on sur votre compte OpsIQ et l'installation le récupère à sa prochaine vérification de licence.

Configuration de la première semaine

Tout ci-dessous est un vrai écran; rien ici n'a besoin d'un développeur.

1
Activer le module

Ouvert PeopleOS → Accueil RH. Le panneau d'affichage commence par le commutateur maître, PeopleOS RH: sans page HR ou surface des employés est accessible. Allumer un interrupteur est une confirmation de deux clics; désactiver un seul clic est un clic. L'IA s'arrête en dessous (aide à la rédaction, sélection d'applications, assistants autonomes, interviews AI, envoi automatique d'offre, vérification d'identité) reste en dehors jusqu'à ce que vous décidiez.

2
Laissez le copilote de configuration faire la configuration

Ouvert Copilote de configuration PeopleOS → et dire ce que vous voulez en langage clair : une politique de congé avec ses jours et préavis, les jours fériés pour un pays, une catégorie de cas avec son SLA, un plafond de dépenses, un modèle d'embarquement, une impulsion mensuelle. Vous obtenez le plan avec ce qu'il a compris et ce qu ́il a supposé. Rien ne fonctionne jusqu ́à ce que l'on confirme ; une étape à risque moyen nécessite une seconde personne ; chaque course laisse un reçu.

3
Nommer le portail de l'employé

Ouvert PeopleOS → Frontline → Conception de la connexion. Sur une installation auto-accueillée, le portail vit à /hr/<address>; Adresse du portail renommer immédiatement et les liens d'accès anciens continuent de fonctionner parce que l'ancienne adresse avance. Sur le cloud, le portail est /hr sur votre hôte de l'espace de travail et n'a pas besoin d'adresse.

4
Publier votre site de carrière

Ouvert PeopleOS → Recrutement. Chaque publication que vous publiez à partir d'une demande approuvée apparaît sur la page publique des carrières; le lien Ouvrir la page des carrières publiques au sommet du recrutement montre exactement ce qu'un candidat voit.

5
Enregistrer un kiosque pour les appareils partagés

Ouvert PeopleOS → Première ligne → Kiosques et choisir Enregistrer un kiosque. Le jeton de l'appareil est montré une fois; ouvrir la page du kiosque sur la tablette ou PC (il est /kiosk Les gens s'en tiennent à leur courriel de travail et à leur NIP, ou à leur code d'insigne éphémère. La révocation d'un kiosque arrête immédiatement l'appareil.

6
Décider ce que les employés peuvent faire pour eux-mêmes

Ouvert Paramètres → HR. Chaque pouvoir libre-service (registres, demandes, documents, congés, explications de paye, etc.) est fixé à chaque employé, gestionnaire seulement, ou une équipe et les équipes qui l'ont fait. Chaque changement enregistre qui l ́a fait et pourquoi, et un pouvoir que vous éteignez est expliqué à l ́employé plutôt qu ́une absence silencieuse.

7
Ajouter des personnes et leur donner accès

Activé PeopleOS → Personnes L'accès au portail de fourniture n'est possible qu'une fois que la personne a un courriel valide et une relation d'emploi prévue; l'invitation sort du même écran et à bord commence par le voyage que vous avez mis en place.

Le cycle de vie

Planifier et recruter

Créer des demandes approuvées, publier des emplois, recevoir des demandes par l'entremise de sites Web à sécurité de répétition, des examens de structure, des entrevues sur les horaires, des décisions relatives aux dossiers, des offres d'emploi et des embauches.

Adhésion et fourniture

Construisez des parcours à bord, recueillez la version correcte du document, demandez de l'équipement, octroiez des modèles d'accès approuvés et offrez un accès sans siège.

Travail et croissance

Fonctionnement des congés, horaires, explications sur la paye, avantages sociaux, dépenses, objectifs, rétroaction, examens, apprentissage, compétences, possibilités internes, relève et analyse de l'effectif.

Soutenir et protéger

Fournir un soutien privé en RH, des dossiers de relations avec les employés, des documents juridiques, des demandes de données, des corrections, des explications, des appels et des examens humains indépendants.

Changement et congé

Utiliser des changements d'emploi efficaces, révoquer l'accès, récupérer du matériel, concilier les fournisseurs externes, appliquer la conservation et préserver les preuves requises.

Accès et identité

Une personne canonique possède des dossiers d'emploi et des facettes d'identité externe vérifiées. L'email est des données de contact mutables, jamais la clé d'identification permanente.APIscopes couche sur le dessus des permissions de route et ne jamais les contourner.

Ajouter un nouveau travailleur

Scénario :
Créer la personne, affecter l'emploi et le gestionnaire, fournir un accès au portail, puis ouvrir le voyage à bord.
Que faire:

Utilisez la run à sec et l'idempotency pour API écrit. Confirmez que la personne a un courriel valide et une relation de travail prévue avant d'envoyer l'accès.

Résoudre une identité dupliquée

Scénario :
Deux systèmes externes identifient le même travailleur différemment.
Que faire:

Relier les deux facettes vérifiées à la personne canonique et résoudre le conflit explicitement. Ne fusionnez pas les enregistrements simplement parce que deux valeurs de courriel mutables correspondent.

PeopleOS RH

Les flux de travail des RH et le portail des employés

Comment chaque zone PeopleOS est exploitée et ce que les employés voient après l'ouverture de session.

Personnes et organisation

Maintenir la personne canonique, l'emploi, le type de travailleur, le gestionnaire, l ́équipe, le lieu, les compétences, les documents et la structure organisationnelle efficace.

Recrutement et offres

Passer de la demande approuvée à l'affichage, à la demande, à des preuves structurées, à l 'entrevue, à une décision, à un offre et à l`embauche avec les moyens d'adaptation et d'appel.

A bord et documents

Assigner les étapes ordonnées par le propriétaire; recueillir, examiner, signer, expirer, conserver et supprimer les documents avec la version et accéder aux preuves.

Temps, congés et calendrier

Définir les types de congés, les soldes, les demandes, les approbations, les jours fériés, la disponibilité, les événements du calendrier et le rapprochement.

Rémunération, avantages et dépenses

Expliquez la rémunération, les événements de travailleurs approuvés à la main à la paye, réconciliez les exceptions, gérez l'admissibilité aux prestations et réglez les remboursements.

Résultats et croissance

o Mettre en oeuvre des objectifs, des vérifications, des commentaires, des examens, un étalonnage, un apprentissage, des compétences, du mentorat, des possibilités internes et de la relève.

Service et relations RH

Fournir un soutien privé aux employés tout en maintenant les griefs, la discipline, le dénonciateur et la preuve de cas scellés dans des limites de permission dédiées.

Analyse et planification

Utiliser les mesures de l'effectif, les plans de dénombrement, les repères et les données d'expérience tirées des dossiers; ne jamais déduire les résultats manquants comme succès.

Carte du portail des employés

Aperçu

Besoin de votre attention, changements depuis la dernière visite, demandes ouvertes, événements à venir, progrès à bord et annonces.

Profil et dossiers

Emploi, documents vérifiés, autorisations, demandes de protection des renseignements personnels et demandes de correction.

Appui aux RH et tâches

conversations, demandes, actions privées qui nécessitent les tâches de l'employé et de l ́entreprise montrées séparément.

Vos premiers jours

Temps de bord avec les preuves avec le propriétaire, l'état dû, la fin et le blocage du travail.

Temps et congés

Soldes, demandes de congé, disponibilité, calendrier et conséquences du calendrier.

Compétences et croissance

Apprentissage, preuves de compétences, buts, rétroaction, mentorat et possibilités internes.

Mon salaire, expliqué

Renseignements sur la rémunération en langage clair et le rapprochement de la paye que l'employé peut voir.

Société

L'annuaire et l'organigramme limités aux collègues de l'information ont choisi ou la politique leur permet de partager.

Droits et décisions

Explications, appels, consentement, correction, demandes d'accès et de suppression.

💡
Le portail est mobile-premier. La carte de compte reste accessible, la navigation et le contenu défilent indépendamment sur les écrans larges, et la navigation mobile superpose plutôt que de pousser ou couvrir la page.

Séquence de fonctionnement sûre

1
Configurer la politique et les permissions

Établir la compétence, les rôles, les voies d'approbation, la conservation, le consentement et les contrôles des caractéristiques avant de charger les dossiers en direct.

2
Connectez des fournisseurs externes

Installez le paquet signé approprié, entrez les identifiants de moindre privilège et passez des tests de connexion et de conformité.

3
Courir dans une boîte à sable ou une ombre

Exécuter des workflows complets avec des données déterministes et comparer les preuves attendues avant de permettre l'exécution de fournisseurs réels.

4
Libération sous double contrôle

Un examinateur autorisé examine les preuves de l'accès au marché, de la sécurité, de l 'intimité, de sa légalité et de son équité.

PeopleOS RH

AI, équité, contrôle vidéo et juridique

PeopleOS traite l'automatisation comme un chemin d'outil régi : la permission de politique, la tentative d'exécution, le résultat du fournisseur et la preuve sont des faits distincts.

AI et contrôles des agents

Chaque agent utilise des outils enregistrés dactylographiés avec un but, une juridiction, une classe de risque et une autonomie maximale. Prise en charge humaine, disjoncteurs, incidents et changements de juridiction arrêtent l'exécution.

Équité

Définir les cohortes, les règles minimales d'échantillonnage, les paramètres, l'identité de l'évaluateur et une évaluation publiée légalement.

Explications et appels

Constituer des explications à partir de décisions et de preuves stratégiques scellées. Envoyer des appels à un humain indépendant et préserver les preuves de résultats.

Compétences

Les politiques du pays de libération ne sont soumises qu'à un propriétaire légal nommé, ont cité des sources juridiques et ont passé des tests.

Loi de l'UE sur l'IA

Maintenir l'inventaire du système, la classe de risque, l'évaluation des incidences sur les droits fondamentaux, les avis, les surveillants, le mesurage et les preuves.

Limite de la projection vidéo

La disposition n'est pas une participation

hr.interview.room.provision crée un lieu de réunion. hr.interview.room.connect peut prouver que les médias ont atteint l'ouvrier.

Consentement spécifique à un objectif

L'enregistrement, la transcription et la vie biométrique sont des choix distincts. Le retrait s'applique à l'objectif sélectionné.

Pas d'analyse de l'apparence

Le contrat vidéo n'a aucun champ ni méthode pour l'émotion, l'attention, l ́attractivité, la race, le handicap ou l ́apparence.

Voies humaines et textuelles

Un examinateur peut prendre la relève en permanence pour la session, et un itinéraire d'hébergement texte reste disponible.

Conservation et suppression

Le connecteur signale le transport chiffré, la politique de rétention active et les références des médias fournisseurs, et doit soutenir une suppression vérifiable.

Chambre créée, AI absente

Scénario :
Une salle Zoom URL existe, mais le pont média n'a pas livré d'audio/vidéo au travailleur de l'entrevue.
Que faire:

Afficher la réunion comme étant fournie et la participation à l'IA comme étant fausse. Gardez les chemins d'entretien humain et de logement texte disponibles.

Le rappel dit qu'un chèque a été passé

Scénario :
Un rapport de vérification des antécédents signé.
Que faire:

Enregistrez le callback comme un indice, puis interrogez le fournisseur. Seule la réponse authentifiée à l'état peut mettre à jour la vérification.

🚫
Une évaluation technique de l'accessibilité peut être enregistrée par son évaluateur, mais l'attestation du WCAG exige une personne distincte.
PeopleOS RH

PeopleOS API et développement de connecteurs

Utilisez le General API pour les opérations de RH régies et les contrats de connecteurs dactylographiés pour les systèmes externes faisant autorité.

Généralités API sources de vérité

Envoyer JSON à POST /api/v1.php. Découvrez la surface de course à travers meta.actions, OpenAPI à /api/v1/openapi.phpet Postman à /api/v1/postman.php. L'indice généré ci-dessous porte le nombre exact de hr.* et examen platform.hr.* Les opérations dans cette construction, donc rien sur cette page n'est tapé à la main.

Liste des personnes
curl -sS https://your-opsiq.example/api/v1.php \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"action":"hr.people.list","page":1,"per_page":50}'
Un écrit à sec
curl -sS https://your-opsiq.example/api/v1.php \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"action":"hr.people.create","display_name":"Ada Reaudit","primary_email":"[email protected]","worker_type":"employee","idempotency_key":"hire-2026-0042","dry_run":true}'

Utilisation hr.read ou hr.write L'itinéraire de l'administrateur cible vérifie toujours sa propre autorisation. Les écritures nécessitent une clé d'idempotency stable; les écritures à haut risque exigent une confirmation. Réessayez les défaillances transitoires avec la même clé et l'état de récupération des requêtes après un délai incertain.

Chaque action de h.*

48 curated hr.* actions (22 reads, 26 writes) and 484 reviewed platform.hr.* operations, out of 2420 named actions in this build. Generated from the action registry, the same source as meta.actions, OpenAPI and Postman.

Personnes, organisation et identité (9)

hr.employee.provision

Write. Scope: hr.write. Provision seatless employee access and send the invitation. Required: person_uuid.

hr.employee.restore

Write. Scope: hr.write. Lift an employee access suspension (written reason required) and provision again. Required: person_uuid, reason.

hr.identity.facets

Read. Scope: hr.read. List a person's identity facets and open conflicts. Required: person_uuid.

hr.identity.link

Write. Scope: hr.write. Link an identity facet to a person. Required: person_uuid, facet_type, facet_key.

hr.org.tree

Read. Scope: hr.read. Read the organisation tree.

hr.people.create

Write. Scope: hr.write. Create an HR person. Required: display_name.

hr.people.get

Read. Scope: hr.read. Get one HR person. Required: person_uuid.

hr.people.list

Read. Scope: hr.read. List HR people.

hr.people.update

Write. Scope: hr.write. Update an HR person. Required: person_uuid, display_name, primary_email.

Demandes et affectations (3)

hr.postings.list

Read. Scope: hr.read. List job postings.

hr.requisitions.create

Write. Scope: hr.write. Create a requisition. Required: title, openings, justification.

hr.requisitions.list

Read. Scope: hr.read. List requisitions.

Le départ, l'apprentissage et le marché des connecteurs (3)

hr.learning.overview

Read. Scope: hr.read. Read courses, paths and enrolments.

hr.leave.overview

Read. Scope: hr.read. Read leave types and requests.

hr.marketplace.overview

Read. Scope: hr.read. Read HR connector accounts, conflicts and deliveries.

Certification de connecteur et santé (2)

hr.connectors.certify

Write. Scope: hr.write. Certify an HR connector (scope sandbox|production; production demands provider-side proof under dual control). Required: connector_class, connector_key, scope, evidence, submitted_by.

hr.connectors.health

Read. Scope: hr.read. One connector account's health: certification level and scope, last reconciliation verdict, failures and webhook backlog. Required: account_uuid.

Salles d'entretien (7)

hr.booking.slots_reconcile

Write. Scope: hr.write. Release booking slots whose claim never became a booked meeting.

hr.interview.room.connect

Write. Scope: hr.write. Connect the AI to interview media; refuses unless media really reaches the worker. Required: media_uuid.

hr.interview.room.consent

Write. Scope: hr.write. Record or withdraw consent for ONE interview purpose (recording, biometric_liveness, transcription). Required: media_uuid, purpose, state.

hr.interview.room.pause

Write. Scope: hr.write. Pause a live interview. Required: media_uuid.

hr.interview.room.provision

Write. Scope: hr.write. Provision an interview room (a place to meet — NOT AI participation). Required: session_uuid, transport, accommodation_route.

hr.interview.room.state

Read. Scope: hr.read. Read an interview room, including whether the AI is actually participating. Required: media_uuid.

hr.interview.room.takeover

Write. Scope: hr.write. A human takes the interview; the AI cannot speak in it again. Required: media_uuid, reason.

Agents et voies de cycle de vie (7)

hr.agent.incident.close

Write. Scope: hr.write. Close an agent incident — the same act that lifts the suspension it caused. Required: incident_uuid, resolution.

hr.agent.step

Write. Scope: hr.write. Run one agent step: gate verdict, execution and outcome reported separately. Required: run_uuid, agent_key, tool_key, jurisdiction, purpose.

hr.agent.step.status

Read. Scope: hr.read. What actually happened at a step (permitted, executed, proven, failed, compensated). Required: run_uuid, seq.

hr.agent.takeover

Write. Scope: hr.write. A human takes an agent run; no further agent steps are accepted. Required: run_uuid.

hr.agent.tool.grant

Write. Scope: hr.write. Grant an agent a tool for one jurisdiction and purpose, up to a risk ceiling. Required: agent_key, tool_key, jurisdiction, max_risk, purpose.

hr.agent.tools

Read. Scope: hr.read. List the registered typed tools an agent may use, and open agent incidents.

hr.lifecycle.lanes

Read. Scope: hr.read. Every lifecycle lane with its mode, KPIs and whether a live tool path really exists behind it.

Compétence (5)

hr.jurisdiction.capabilities

Read. Scope: hr.read. What this product may do in one country, per feature, with the law behind each answer. Required: code.

hr.jurisdiction.change.raise

Write. Scope: hr.write. Report a change in the law; a high or critical one suspends every lane in that jurisdiction at once. Required: pack_key, summary, severity.

hr.jurisdiction.coverage

Read. Scope: hr.read. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests.

hr.jurisdiction.explain

Read. Scope: hr.read. Why an action about one person is allowed, reduced or blocked, with the rule and citation. Required: person_uuid, feature.

hr.jurisdiction.pack.release

Write. Scope: hr.write. Put a drafted policy pack into effect; refused without a named counsel owner and a cited law. Required: release_uuid.

Décisions et recours (2)

hr.decisions.appeals

Write. Scope: hr.write. File an appeal against an AI decision on a person's behalf; it must be heard by an independent human. Required: decision_uuid, subject_type, subject_id, grounds.

hr.decisions.explanation

Read. Scope: hr.read. Plain-language explanation of one AI decision: what was looked at, which policy, and how to appeal. Required: decision_uuid, audience.

Qualité AI (2)

hr.ai.corrections

Write. Scope: hr.write. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing.

hr.ai.quality.overview

Read. Scope: hr.read. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception.

Conversations avec les travailleurs et maintien en poste (4)

hr.thread.delete

Write. Scope: hr.write. Delete a workforce conversation; refused while it is under legal hold. Required: thread_uuid, reason.

hr.thread.legal_hold

Write. Scope: hr.write. Place or lift a legal hold on a workforce conversation. Required: thread_uuid, on, reason.

hr.thread.retention

Write. Scope: hr.write. Set a conversation's retention class (standard|extended|permanent). Required: thread_uuid, retention_class.

hr.threads.retention_sweep

Write. Scope: hr.write. Run the conversation retention sweep; legal holds are never swept.

État de préparation et libération (4)

hr.experience.metrics

Read. Scope: hr.read. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys.

hr.global.readiness

Read. Scope: hr.read. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage.

hr.readiness.read

Read. Scope: hr.read. Run the HR release readiness report.

hr.release.verify

Write. Scope: hr.write. Run the four HR release gates (schema, manifest, probe, readiness).

Classes de connecteur

Recrutement

hr_job_board, hr_background_check, hr_identity_verification, hr_assessment et hr_tax_right_to_work.

Embauchage et embarquement

hr_esignature, hr_calendar, hr_video et hr_equipment_it.

Opérations sur les effectifs

hr_payroll, hr_benefits, hr_learning, hr_expense_payment, hr_directory et hr_data_warehouse.

Communication

hr_messaging est envoyé seulement. Le contrat ne contient pas de méthode de lecture de messages employés.

Paramètres de la passerelle du fournisseur

PeopleOS HR Provider Gateway 1.0
GET    /v1/hr/health
POST   /v1/hr/job-postings
PATCH  /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/job-postings/{provider_ref}/close
GET    /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/background-checks
GET    /v1/hr/background-checks/{provider_ref}
POST   /v1/hr/identity-verifications
GET    /v1/hr/identity-verifications/{provider_ref}
DELETE /v1/hr/identity-subjects/{subject_ref}
POST   /v1/hr/payroll/worker-events
GET    /v1/hr/payroll/state?cursor=...
GET    /v1/hr/payroll/exceptions
POST   /v1/hr/equipment/requests
POST   /v1/hr/access/requests
GET    /v1/hr/provisioning/requests/{request_ref}
POST   /v1/hr/provisioning/requests/{request_ref}/revoke

La passerelle nécessite HTTPS, bloque les cibles non sûres/privées, les pins validés DNS résultats, suit pas de redirections, limite la taille de la réponse, nécessite JSON, porte l'idempotency déterministe, et soutient horodaté HMAC dans les deux directions. Webhooks sont toujours des conseils suivis par la ré-requête du fournisseur.

Portes de hook en ligne

Trois portes publiques reçoivent des rappels de fournisseurs : POST /opsiq/ajax_api.php?ajax=hr_connector_webhook (champs connector_class, connector_key, topic), ?ajax=hr_esign_webhook (connector_key, offer_uuid, provider_ref) et ?ajax=hr_check_webhook (check_uuid). Chaque vérifie le corps à travers le connecteur certifié, brûle la livraison de sorte qu'un replay meurt, et enregistre seulement une ré-requête en attente; la réponse du fournisseur change l'enregistrement. Tout refus est la même réponse générique sur intention. PeopleOS ne livre pas d'événements webhook sortant aujourd'hui: webhooks.events.list est l'autorité et ne nom pas dans le hr famille, donc sondage hr.* lit ou utilise hr.connectors.health.

Références détaillées

Manuel complet PeopleOS

Lire doc/contracts/PEOPLEOS_HR.md dans une installation auto-installée pour chaque opérateur, API, connecteur, webhook et règle de libération.

Contrat de développeur de passerelle

Le paquet Marketplace contient README.md, DEVELOPER.md, connector_contract.json, hr_profile.json et un manifeste de fichier signé.

PeopleOS RH

Essais et préparation à la production

Une demande de lancement est calculée à partir de preuves. L'état de préparation du colis, la certification du fournisseur, l'approbation juridique, l 'évaluation de l'équité et l'attestation d'accessibilité sont délibérément séparés.

1
Valider le code et les contrats

Exécuter la syntaxe PHP, HR PHPUnit, route/APIParité, contrôles OpenAPI/Postman, manifeste de colis etJSONValidation du schéma.

2
Exécuter des workflows complets

Test de recrutement, examen AI, interview/vidéo, à bord, signatures, congés, paie, portail, notifications, modes et chemins de défaillance du connecteur.

3
Tester l'interface utilisateur réceptive et accessible

Conduire les mises en page de bureau, tablette et téléphone; clavier, focus, étiquettes, contraste, reflow, tooltips, dialogues, défilement de notification et navigation indépendante.

4
Recueillir des preuves externes

Utilisez des voyages aller-retour et la suppression de fournisseurs réels, des communiqués de politique juridique, des données représentatives sur l'équité et une attestation humaine indépendante WCAG.

5
Libération sous double contrôle

Un examinateur différent de l'auteur approuve le connecteur et libère les preuves. Révoquez ou tuez un connecteur si sa preuve expire.

Ce que signifie chaque résultat

Paquet signé

Les fichiers n'ont pas changé depuis la signature du paquet autorisé. Il ne prouve pas qu'un compte tiers fonctionne.

Sandbox passé

Les transitions de comportement et d'état déterministes sont conformes. Il ne prouve pas un fournisseur réel, terme de résidence ou suppression.

Connecteur de production certifié

Un compte spécifique d'espace de travail a passé les cinq obligations côté fournisseur sous double contrôle.

Rapport technique du WCAG

Il existe des preuves automatisées et dirigées par l'évaluateur pour les surfaces nommées, mais il ne s'agit pas d'une attestation de seconde personne.

Lancement prêt

Toutes les portes requises sont vertes en même temps et aucune preuve n'est expirée, révoquée, manquante ou contredite par la santé vivante.

⚠️
Ne créez jamais un dossier d'attestation de passage légal, équitable, fournisseur ou indépendant pour simplement dégager la porte. Enregistrez plutôt le bloqueur et le propriétaire. La vue de préparation est précieuse précisément parce qu'elle refuse les revendications non étayées.
Pourquoi un connecteur est-il installé mais toujours indisponible?+

L'installation prouve la présence du paquet. Activez-le, enregistrez les références réelles de moindre privilège, passez le test de connexion, puis accordez la portée correspondante de production du compte PeopleOS en utilisant une preuve véritable fournisseur et un examinateur différent.

Pourquoi un webhook n'a pas changé le record ?+

Le callback peut être valide mais seulement une indication. Vérifiez la boîte de réception webhook, le paramètre d'état du fournisseur et le résultat de réconciliation. PeopleOS change l'état faisant autorité seulement après avoir re-requête.

Où est le HR entièrement lisible par machine API?+

Appeler méta.actions et filtre pour hr. et platform.hr.; ou utiliser/api/v1/openapi.phpet/api/v1/postman.php.Ils sont générés à partir du même registre d'exécution.

Appui

Centre d'aide

Votre centre d'aide est un site d'assistance en libre-service créé à partir des articles que vous publiez. Les clients peuvent le lire et y effectuer des recherches sur sa propre page publique, ainsi qu'à l'intérieur du widget de chat, afin de trouver les réponses par eux-mêmes avant même d'ouvrir une conversation. Tout ce qui s'y trouve provient de votre base de connaissances, donc le contenu qui sous-tend votre IA alimente également votre aide publique.

Où vos clients le voient

Sa propre page publique

Un site d'aide propre et consultable à /help.php. Les clients peuvent naviguer par catégorie, rechercher et ouvrir n'importe quel article. Vous pouvez lui donner votre propre nom et style.

À l'intérieur du widget de chat

Un lien d’aide dans le widget de chat pour que les clients puissent rechercher vos articles sans quitter le chat et, s’ils ont encore besoin d’une personne, ils sont à un seul clic du début d’un échange.

Allumez-le

1
Ouvrir la page du Centre d'aide

Aller à Config, then Help Center Dans votre admin et activez Activer le centre d'aide public.

2
Donnez-lui un nom et un regard

Définissez le nom du centre d’aide, qui s’affiche dans l’en-tête et dans l'onglet du navigateur. Choisissez un style visuel. Vous pouvez désactiver la navigation supérieure pour une page propre sans menu.

3
Publier quelques articles

Rien ne s'affiche jusqu'à ce que vous publiiez des articles sur le site.

Publier des articles dans le Centre d’aide

Les articles sont stockés dans votre base de connaissances. Un article apparaît dans le Centre d’aide une fois qu’il est publié et marqué comme public, ce qui peut se faire de plusieurs façons :

Publier un article

Ouvrez l’article, marquez-le comme publié et activez l'option pour l'afficher dans le Centre d'aide.

Publiez tout en une fois

Utilisez le bouton Publier tout Utilisez le bouton pour envoyer l’ensemble de vos ensembles publiés au Centre d’aide en un seul clic, plutôt que de les faire un par un.

Transformez les FAQ en articles

Vous avez déjà des FAQ? Utilisation Publier tout pour aider Pour les transformer en articles d'aide afin qu'ils soient à côté de tout le reste.

Importer une base de connaissances existante

Vous venez d'un autre help desk? Importer KB Vous avez trois façons de faire pointer une base de connaissances existante vers votre contenu, en utilisant le bouton « Articles ».

Coller un URL

Si elle reconnaît la plateforme (par exemple Zendesk), elle lit l’arborescence de catégories exacte de cette plateforme. Sinon, elle explore le site et reconstruit la structure à partir des pages, en n’important que les articles réels et en sautant les pages de connexion, de tarification et de contact.

Choisissez une application connectée

Si une plateforme est déjà connectée à cet espace de travail et qu'elle contient une base de connaissances, elle apparaît dans un menu déroulant sous Importer à partir d'une application connectée. Sélectionnez-la et importez, pas besoin de URL ou mot de passe. L'application n'est répertoriée qu'une fois connectée et configurée.

Télécharger un CSV

Pas de site en direct à pointer? Télécharger une feuille de calcul avec title, category, et body columns. Put Parent / Child Dans la colonne de catégorie pour créer des catégories imbriquées.

Quel que soit le chemin que vous choisissez, vous obtenez un Voir l'aperçu d'abord: les articles qu'il a trouvés, regroupés par catégorie, chacun avec une case à cocher pour que vous puissiez supprimer tout ce dont vous ne voulez pas. Rien n'est enregistré jusqu'à ce que vous cliquiez sur Importer. Annuler L'importation entière en un seul clic, ou Re-synchronisation Une importation URL ou connected-app plus tard pour tirer dans les nouveaux et modifiés articles.

💡
Développeurs: n'importe quel connecteur peut annoncer sa base de connaissances à ce menu déroulant en déclarant un kb_capabilities Dans son bloc settings.json (type kb_source, avec un adapter et un base_templateVoir la section Connecteurs et la référence de connecteur de plateforme.

Organisez-vous avec l'IA

Un centre d'aide bien rangé est facile à parcourir et plus facile à rechercher. Organisez-vous avec l'IA En un clic, il lit vos articles publiés, les trie en catégories pertinentes et ajoute des balises. Il crée une catégorie quand il en a besoin, réutilise une catalogue qui y correspond déjà, et ignore tout ce que vous avez déjà organisé, de sorte que vous pouvez le lancer à nouveau chaque fois que vous ajoutez de nouveaux articles. Laissez l'IA s'organiser en sous-catégories dans les paramètres du Centre d'aide et il peut également classer des articles sous Parent / Child Catégories, ce qui est pratique juste après l'importation d'une base de connaissances qui avait des sous-sections.

💡
Les catégories permettent aux clients de naviguer et les tags affinent la recherche sur la page publique et dans le widget. Vous pouvez renommer ou déplacer des éléments par la suite, l’IA vous donne un point de départ solide, pas une configuration avec laquelle vous êtes coincé.

Le centre d'aide dans votre widget de chat

Vous pouvez afficher le Centre d'aide directement dans le widget de chat afin que les utilisateurs puissent rechercher des réponses avant de vous envoyer un message.

Dans l'en-tête

Une petite icône d'aide en haut du widget.

Au fond

Un lien textuel sous la boîte de message, par exemple « Parcourir le centre d'aide » Vous pouvez modifier le libellé.

Les deux endroits

Affichez-le dans l'en-tête et en bas pour une visibilité maximale.

Le lien d'aide a sa propre couleur sous le widget Paramètres de l'apparence. Aucun Pour correspondre à votre couleur de lanceur, ou choisissez un Solide Couleur ou un DégradéL'ensemble de l'expérience d'aide suit votre thème de widget, donc il semble toujours faire partie de votre marque.

Mettez votre centre d'aide sur votre propre adresse web

Votre centre d'aide dispose déjà de sa propre adresse propre et partageable (par exemple /help/your-help-centerVous pouvez aller un peu plus loin et le servir sous votre verre. Votre propre domaine, ainsi les clients et les moteurs de recherche le voient comme faisant partie de votre marque, par exemple yourdomain.com/help ou help.yourdomain.comTout continue de fonctionner sur votre domaine : les liens, les images, la recherche et les évaluations des articles.

Sous votre site principal

Dans Configuration, puis Centre d'aide, ouvrez le Intégré onglet et trouver "Afficher votre centre d'aide sur votre propre adresse web".Cloudflare, Nginx ou Apache), copiez le bloc prêt à l'emploi et collez-le dans votre site. Guide de configuration Cliquez sur le bouton à côté avec les étapes exactes.

Sur un sous-domaine

Préférer help.yourdomain.com? Le même panneau a une option de sous-domaine. Sur Cloudflare un sous- domaine est la route la plus fiable, et il vous donne une adresse propre sans rien après elle.

💡
Utiliser Cloudflare? Il ne fait tourner son Worker que sur une adresse qui est proxy par le biais de _Cloudflare (le nuage orange). Votre domaine principal pointe souvent directement vers votre site web, donc une règle placée sur le domaine principal ne peut rien faire tranquillement. help.yourdomain.com. Le guide de configuration vous accompagne dans l'enregistrement DNS et dans le parcours.
Bon pour SEO_. Une fois que votre centre d'aide est sur votre propre domaine, les moteurs de recherche indexent vos articles sous votre marque. Chaque page déclare son adresse correcte et le plan du site les liste, donc le même article n'est jamais indexé deux fois.
💡
Dans les paramètres "Ouvrir dans le centre d'aide" du widget de chat, définissez la valeur Où le lien va à Votre propre domaine de centre d'aide Ensuite, ces liens d'article s'ouvrent sur votre domaine aussi, et non pas sur l'adresse OpsIQ.

Découvrez comment se porte votre centre d'aide

Au-delà des votes sur un seul article, le Centre d'aide possède son propre Analyse. Activez-le dans les paramètres du Centre d'aide et enregistrez discrètement comment les gens utilisent votre aide : les articles les plus consultés, ce qu'ils recherchent, et les recherches qui sont revenues vides (une liste prête à écrire), en train de travailler sur le pays visiteur et l'appareil de son propre, de sorte qu'il n'a pas besoin du widget de chat installé pour rapporter. les deux Vous pouvez voir les endroits où votre aide apparaît, la page publique et l'aide dans le widget, ainsi que combinés, de sorte que vous pouvez voir à quel point chacun est réellement utilisé.

💡
L'analyse reste désactivée jusqu'à ce que vous l'activez, et vous pouvez avoir les adresses IP des visiteurs anonymisées. Rien n'est enregistré avant que vous ne souscriviez.

Choisissez ce qui apparaît sur chaque partie de la page

Chaque section du Centre d'aide (les catégories sur la page d'accueil, les articles populaires, la liste des articles sur une page de catégorie et plus) a sa propre règle simple. Pour chacun, vous pouvez le montrer ou le cacher, et afficher tous articles, a Numéro de série, le dernier, ou seulement ceux que vous Caractéristique Lorsqu'une règle vient compléter une liste, les clients reçoivent toujours un lien « Afficher tout », de sorte que rien n'est vraiment hors de portée.

Vous décidez également à quoi ressemblent les votes utiles: cachés, un ratio amical comme "12 of 14 Un paramètre de votes minimum empêche un tout nouvel article d'afficher une image désagréable "0Out of0".

Découvrez quels articles fonctionnent

Chaque article montre un Cette réponse vous a-t-elle été utile? Chaque oui ou non est compté par article, de sorte que vous pouvez voir en un coup d'œil quels articles répondent bien aux questions et ceux qui ont besoin d'être réécrits. Les votes répétés du même visiteur sont ignorés, donc les comptes restent honnêtes.

Texte et étiquettes

Vous pouvez modifier les titres et les étiquettes du Centre d’aide pour qu’ils correspondent à votre voix. Laissez n’importe quel champ vide pour revenir à une valeur par défaut raisonnable. Vous ne devez donc modifier que le libellé que vous souhaitez réellement changer.

Chaque article que vous publiez ici est le même contenu que l’IA utilise pour répondre aux chats et aux tickets, donc améliorer l’un améliore l’autre.

Questions fréquentes

Dois-je rédiger un contenu distinct pour le Centre d'aide?+

Non, il est construit à partir des mêmes articles de la base de connaissances que l’IA utilise déjà. Publiez un article une fois et il peut servir les deux.

Puis-je garder certains articles en interne?+

Oui. Seuls les articles que vous publiez et marquez comme publics apparaissent dans le Centre d’aide, tout ce qui n’est pas publié est exclu.

Les clients pourront-ils toujours joindre une personne?+

Oui, le lien d’aide du widget est à un clic de démarrer une conversation, donc le libre-service ne piège jamais personne.

Croissance & SEO

Site Intelligence (suite SEO)

Site Intelligence est le SEO intégré de OpsIQ et la suite de recherche-visibilité. Il rampe votre site comme un moteur de recherche, trace où vous rangez, recherche des mots clés, surveille les backlinks et les concurrents, scanne votre présence locale de carte, vérifie la vitesse de page, et transforme tout en rapports prêts à la clientèle, avec un analyste AI qui explique quoi réparer et peut rédiger les corrections. C'est une fonctionnalité premium; quand elle apparaît comme Site Intelliance dans la barre latérale.

Intelligence du site
Tableau de bord Site IntelligenceUn tableau de bord SEO montrant un score d'état du site, le suivi des mots-clés et une tendance du trafic.Intelligence du siteyoursite.com86SANTÉ DU SITE3 questions critiquesSuivi du rang de mots-clésA. Service d ' assistance#3Chat en direct#7CRM pour les agences#12Clics organiques1CRAWLTrouve les problèmes techniques2DÉPLACEMENTClassements, mots-clés, backlinks3ANALYSE DE L'AIExplique et rédige des correctifs
Le site Intelligence : un score de santé sur le site du dernier crawl, un suivi des mots clés en direct, une tendance de clics organiques et la boucle en trois étapes : crawling, track, laissez l'IA brouillonner les corrections.

Obtenir des renseignements sur le site

Site Intelligence fait partie des plans qui le portent. Sur un plan qui ne fonctionne pas, il fonctionne exactement comme PeopleOS HR: le propriétaire du compte s'ouvre Compte → Add-ons et jetonsUn plan gratuit, ou un plan payé encore dans son propre essai de plan, ne peut pas l'ajouter. Jusqu'à ce qu'il soit détenu la suite est caché de la barre latérale et un lien direct offre l'add-on; quand un niveau maximum est atteint la page offre le niveau suivant; quand une épreuve se termine sans achat le droit est supprimé et rien n'est facturé. page de prix.

Lancez un crawl · commencez ici

Un crawl est : OpsIQ Visiter vos pages comme le ferait un moteur de recherche, pour trouver des problèmes techniques : liens cassés, titres manquants, contenu maigre, pages lentes, problèmes d'indexation.

1
Commencez le crawl

Dans l'aperçu, cliquez pour démarrer un crawl. OpsIQ le met en file d'attente et parcourt vos pages en arrière-plan. Un indicateur de statut indique la progression.

2
Lire les rapports

Chaque problème est regroupé par gravité afin que vous puissiez aborder les plus grands succès en premier.

3
Laissez l'IA vous aider

L'analyste de l'IA produit un mémoire en langage clair sur ce qui est faux et pourquoi il importe, et peut générer des corrections suggérées que vous examinez avant de postuler.

Ce que Site Intelligence suit

Crawls & santé du site

Scanne vos pages pour les problèmes techniques SEO et liste chaque page avec ses problèmes. Ré-exécutez à tout moment, ou planifiez-la.

Suivi du classement

Ajoutez les mots-clés qui vous intéressent; OpsIQ vérifie où se classe votre site et suit son mouvement au fil du temps.

Recherche de mots clés

Découvrez de nouvelles idées de mots-clés à cibler, avec l'aide du coach AI pour les mots-clefs.

Liens retour

Découvrez qui vous renvoie vers votre site, actualisez la liste et refusez les liens que vous ne souhaitez pas associer à votre site.

Concurrents

Ajoutez des domaines concurrents et comparez votre visibilité avec celle de vos concurrents, grâce à une analyse concurrentielle par IA.

Grille locale (carte)

Analysez la visibilité des fiches locales sur une grille géographique pour voir où vous apparaissez sur la carte, ainsi que les outils de profil d'entreprise Google.

Vitesse de page

Lancez des contrôles de vitesse de page afin de corriger les pages lentes qui nuisent au référencement et aux conversions.

Contenu de l'IA

Générez des briefs et des brouillons de contenu ciblant les mots-clés que vous ciblez.

Rapports

Créez des rapports imprimables et prêts à l'emploi pour tous les éléments ci-dessus.

Connectez Google pour des données précises

Deux connecteurs Google transforment les estimations en nombres réels:

Console de recherche Google

Recherche

Obtenez les requêtes, clics et impressions exactes que Google rapporte pour votre site, cartographiez votre propriété et découvrez des opportunités de classement directement à partir des données propres de Google.

Google Analytics 4

Trafic

Combinez vos données de trafic et d'engagement avec vos données SEO, afin que les rapports affichent la visibilité et le comportement ensemble.

Actualisations planifiées et rapports en marque blanche

Vous n'avez pas à tout exécuter à la main. Rafraîchissements planifiés re-cours rampes, contrôles de rang, vérifications de mots clés, backlink rafraîchit, local-grid scans et rapport génération sur une cadence (quotidienne ou hebdomadaire selon le plan et le volume).OpsIQcron, voir la section Cron et l'automatisation. Les rapports générés exportent comme des documents imprimables et prêts à la clientèle: les agences envoient à chaque client un régulier SEO mise à jour, et comme les données de chaque domaine sont séparées, chaque client ne voit que les siennes.

Certaines fonctionnalités du site Intelligence appellent les fournisseurs de données externes et l'IA par OpsIQ Le fournisseur configuré. Ils fonctionnent hors de la boîte lorsque la suite est activée pour votre plan. Si un rafraîchissement ne s'exécute pas, confirmer le OpsIQ cron fonctionne (voir Cron et automatisation).
Dois-je ajouter quelque chose à mon site pour le suivi SEO?+

Pour obtenir des données exactes sur le trafic et les recherches, connectez Google Search Console à GA4.

Puis-je suivre plusieurs domaines ?+

Oui, ajoutez chaque domaine séparément ; leurs crawls, classements et rapports restent entièrement isolés les uns des autres.

À quelle fréquence devrais-je ramper?+

Une fois par semaine est suffisant pour la plupart des sites; crawlez à la demande après un changement important de contenu ou de structure.

Croissance & SEO

Auto-Implémentation (SEO Agent)

L'auto-implémentation est la partie de Site Intelligence qui applique en fait les correctifs le crawl et l'analyste AI recommandent, au lieu de vous conseiller seulement. L'agent travaille strictement à partir de ce que Site Intellectual a déjà trouvé (il ne peut jamais inventer un changement) et marche chaque fix dans la même boucle sûre : un aperçu de course à sec, votre approbation par étape, l'écriture en direct, un instantané automatique, et un re-crawl qui prouve que le nombre de dossiers ouverts a baissé.

Mise en œuvre automatique
Agent SEO d'auto-implémentationUn flux montrant les correctifs SEO recommandés passant par l'aperçu, l'approbation et une écriture en direct, avec un re-crawl de preuve.Mise en œuvre automatiqueyoursite.comCorrections recommandéesAdd missing <title>approuvéRéparation du fichier robots. txtapprouvéEnvoyer le plan du site.xmlExamenAVANTAGES DU DRY-RUN (DIFF)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>ApprouverShipPROUVEZ-LE - RÉEXPLORERQuestions en suspens 124Instantané enregistré1AVANTAGEDifférence de run-dry de chaque correction2APPROUVEZ & ÉCRIVEZSSH ou hébergé API3PROVE & ROLLBACKRe-crawl + instantané
Exécution d'une session : l'agent liste les correctifs déjà recommandés par Site Intelligence, affiche un diff de test pour chacun d'entre eux et applique ceux que vous approuvez. SSH or a hosted API, des instantanés avant chaque écriture et re-crawls pour prouver que le nombre de problèmes ouverts a chuté.

Ce qu'il peut changer

L'agent n'applique que les correctifs déjà recommandés par Site Intelligence (ou l'analyste de l'IA) pour ce domaine. Sur toutes les plateformes prises en charge, cela couvre :

Configuration du serveur

sitemap.xml, robots. txt et redirection, règles canoniques et d'en-tête dans. htaccess (Apache / LiteSpeed) ou la configuration nginx.

Chaînes de redirection

Réduit une chaîne de redirection multi-sauts à un seul saut direct vers le URL final, dans le même bloc. htaccess géré, afin que la vitesse et la valeur du lien cessent de fuir par les sauts supplémentaires.

Page <head>

Titres de page, méta descriptions, balises canoniques et blocs de données structurées (schema) manquants ou faibles.

WordPress SEO

Yoast, Rank Math et SEOPress titres & meta, et le texte d'image alt, appliqué par WP-CLI sur leSSHchemin ou le RESTAPIsur le chemin hébergé.

WordPress données structurées

Adds JSON-LD (schema) pour les pages qui ne l'ont pas. SSH Sur le chemin hébergé, un petit helper géré (un plugin à utiliser obligatoirement) imprime le balisage pour qu'il fonctionne avec ou sans un plugin SEO ; sur le chemin d'hébergement, votre plugin SEO le transporte.

Liens internes

Ajoute un lien interne pertinent à l'intérieur du contenu WordPress existant pour sauver des pages orphelines et relier les articles connexes. Un lien par page, jamais dans un titre, un liens existant ou un shortcode, et toujours approuvé par vous en premier.

Réécriture de contenu sur page mince

Brouillonne le contenu de remplacement complet pour les pages minces (activé par une option d'exploration, voir ci-dessous). Chaque brouillon est examiné et approuvé par vous avant toute publication. L'ancien contenu est conservé afin qu'il puisse être restauré.

Cache de la page (WordPress)

Active le cache de page W3 Total Cache lorsque l'exploration détecte des problèmes de vitesse et que ce plugin est installé, afin que les pages soient servies plus rapidement.

Shopify SEO

Titres et descriptions SEO de produits et collections, référencement des pages et articles de blog, plus 301 Les redirections, à travers le. Shopify Admin API.

Webflow SEO

Titre SEO par page et meta description à travers le. Webflow Données API v2.

Préparer les correctifs automatiquement (deux options de crawl)

Le panneau Configurer l'intelligence du site pour un domaine (ses paramètres d'exploration) dispose de deux options qui déterminent à l'avance le nombre de lignes que l'agent doit configurer. Les deux sont désactivées par défaut et utilisent toutes les deux des crédits d'IA. Vous ne pouvez donc les activer que lorsque vous souhaitez que ce travail soit effectué pour vous.

Préparation automatique des correctifs d'IA après chaque crawl

Chaque crawl écrit également le contenu concret de la correction (titres, descriptions méta, texte alternatif, schéma, redirections) pour ce qu'il a trouvé, afin que les corrections soient prêtes à être examinées et appliquées au moment où l'exploration se termine plutôt que d'être générées plus tard sur demande.

Réécriture de contenu par IA (pages minces)

L’agent peut rédiger un projet de contenu complet pour remplacer les pages minces. Rien n’est jamais publié seul : chaque projet apparaît comme une modification que vous examinez côte à côte et approuvez ou rejetez, le contenu précédent est conservé afin qu’il soit réversible, et il est limité à quelques pages par passage.

💡
Chaque modification passe toujours par les mêmes étapes d’approbation, de prise de vue et d’annulation que n’importe quel autre correctif, donc l’activation de ces options ne met jamais rien en ligne par elle-même.

Deux façons de se connecter

SSH / SFTPchemin

Autogéré

Pour les sites sur votre propre serveur, l'agent se connecte par SSH/SFTP Utilise les identifiants que vous stockez, modifie directement la configuration du serveur et les fichiers de page, et exécute WP-CLI pour. WordPress Idéal lorsque vous avez accès au shell et que vous voulez avoir le contrôle total des fichiers.

Accueillé...API chemin (non) SSH)

Sans coque

Pour les plates-formes qui ne permettent pas SSH, l'agent travaille entièrement à travers un fonctionnaire API connecteur, WordPress (REST + mot de passe d'application), Webflow (Données API v2) et Shopify (Administration API Rien n'est installé sur l'hôte.

💡
Wix et Squarespace n’ont pas de API SEO-write public, donc sur ces plateformes Auto-Implement fonctionne en mode consultatif: il vous montre le changement exact à faire (le titre précis, la méta ou le paramètre) pour que vous puissiez l’appliquer manuellement. Tout le reste est en lecture seule et sécurisé.

Allumez les connecteurs

L'agent atteint chaque plateforme par un connecteur:

Construit en

Shopify et WordPress connectique navire avec OpsIQ, il suffit de les activer sous Connecteurs et d'ajouter les identifiants du magasin / site.

De la Marketplace

Webflow, Wix et Squarespace s’installent depuis Connecteurs → Marketplace, puis se connectent de la même manière.

Comment une session fonctionne

1
Choisissez les correctifs

Ouvrez l'option Auto-Implement (rocket) dans la section Site Intelligence, qui répertorie les problèmes déjà détectés par Site Intelligence et qu'il peut corriger sur ce domaine.

2
Prévisualiser chaque modification

Pour chaque fix, l'agent montre une diff à sec (exactement ce qu'il écrira) avant que quelque chose ne touche le site en direct.

3
Approuver étape par étape

Vous approuvez (ou ignorez) chaque modification individuellement, rien n'est appliqué sans votre autorisation explicite à cette étape.

4
Il écrit, puis prend des clichés

Sur approbation, l'agent effectue le changement en direct. SSH ou l'hébergé API et enregistre d'abord un instantané, afin que toute modification puisse être annulée.

5
Prouvez-le, vivez

Au fur et à mesure qu’il applique chaque changement, l’agent vérifie immédiatement la page exacte et affiche un verdict « corrigé en direct » étape par étape. Vous pouvez donc regarder chaque correction atterrir sur la page active au fur et aux mesures de sécurité pour éviter les erreurs d’accès. À la fin, il re-crawl le site entier et confirme que le nombre de problèmes ouverts a diminué.

Sécurité & facturation

SEO-seulement

L'agent ne peut faire que ce que Site Intelligence recommande pour ce domaine. Il ne peut pas apporter des modifications arbitraires à votre site ou serveur.

Approbation par étape

Chaque écriture est prévisualisée en tant que diff et appliquée uniquement après votre approbation de cette étape spécifique.

Capture d'instantané & retour

Un instantané est sauvegardé avant chaque écriture, de sorte que toute modification peut être annulée.

Preuve en direct par étape

Chaque page modifiée est vérifiée à l’instant où elle est écrite et reçoit un verdict « corrigé en direct », de sorte qu’un correctif est confirmé par rapport à la page active immédiatement, pas seulement dans le re-crawl final.

Le contenu n'est jamais publié automatiquement

Les liens internes et les réécritures de contenu de page fine ont un impact plus important, donc ils vous sont toujours présentés pour approbation et ne sont jamais appliqués automatiquement, quel que soit le mode utilisé.

Managed-IA uniquement

L'implémentation automatique s'exécute sur l'IA gérée ; elle est bloquée lorsqu'un espace de travail utilise ses propres clés (BYOK).

Facturation

Les jetons AI facturent normalement comme vous les utilisez, plus un forfait par utilisation par session d'exécution automatique, tous deux tirés du même crédit Géré-AI.

Activez-la sur la page de configuration d'IA (carte Auto-Implement) et assurez-vous que le connecteur pour votre plateforme est connecté en premier.
Est-ce que ça change quelque chose sans demander?+

Non, chaque modification est prévisualisée en tant que diff de test et appliquée uniquement après avoir approuvé cette étape précise. Un instantané est sauvegardé avant chaque écriture afin que vous puissiez revenir en arrière.

Ai-je besoin d'un accès SSH?+

Pas sur WordPress, Shopify ou Webflow. Ceux qui travaillent par l'intermédiaire de leur APIs sans accès au shell. SSH est seulement l'un des deux chemins, utilisé lorsque vous voulez que l'agent modifie la configuration du serveur et les fichiers directement sur votre propre serveur.

Comment puis-je savoir si cela a fonctionné?+

Après avoir appliqué les correctifs approuvés, l'agent re-explore le site et affiche le nombre de problèmes ouverts avant et après, afin que vous puissiez confirmer que les corrections ont réduit les problèmes.

Est-ce qu'il réécrit ou publie le contenu de la page par lui-même?+

Les réécritures de contenu par IA sont désactivées jusqu’à ce que vous les activiez dans les options d’exploration, elles sont limitées à quelques pages minces par passage et chaque brouillon est affiché pour approbation côte à côte avant toute publication. Le contenu précédent est conservé, donc une réécriture peut toujours être annulée.

Puis-je l'utiliser avec mes propres clés AI?+

Non. La mise en œuvre automatique est uniquement disponible pour l’IA gérée et est bloquée sous BYOK. Elle facture les jetons d’IA normalement, plus des frais fixes par session et par utilisation, à partir du même crédit AI géré.

Croissance & engagement

Studio d'enquête

Survey Studio est l’espace de travail pour la création de sondages modifiables qui peuvent être diffusés sous forme d’une page autonome riche, d’un widget de site Web ou d’intégration en ligne. Le produit actuel fournit également des liens hébergés, des aperçus signés de brouillons, des invitations privées, le partage par code QR, la navigation dans les réponses et des analyses spécifiques au sondage.

⚠️
Limite actuelle par rapport à la cible: Connector Builder, l'expérience de création et d'aperçu premium survey Survey Studio a toujours besoin de l'architecture indépendante multi-déploiement, du jeton signé Survey Identity Gateway, du câblage cible/variable, du flux d'envoi CRM Outreach et des données typées pour les opérations de déploiement. surveys.* API.

Créer un sondage

1
Choisissez comment les gens vont le prendre

Le flux de cibles approuvé commence par le type d’enquête et ajoute plus tard les déploiements CRM par e-mail, liens privés et QR comme choix de première classe.

2
Choisissez le but

Choisissez NPS, CSAT, CES, commentaires sur les produits, post-achat, annulation, onboarding, site web, événement, webinaire, support, lead/démo, essai, témoignage, recherche, employé, accueil ou commentaires généraux.

3
Utiliser un modèle complet ou Commencer par le vide

Le choix d'un modèle crée un brouillon copié : modifier votre sondage ne change pas le démarreur ni aucun autre sondage, mais vous pouvez choisir de créer un nouveau sondage à partir du modèle.

4
Personnaliser ou Révision rapide

Personnaliser ouvre chaque question, conception, comportement et contrôle de livraison. La révision rapide ouvre le même brouillon lors du dernier contrôle de la vue client.

Choix de livraison et comportement actuel

Page & lien autonome

Une page personnalisée réactive avec son propre URL. Utilisez des invitations privées et une date d'expiration lorsque chaque destinataire a besoin d'un lien contrôlé.

Widget de site web

Il peut utiliser des règles de page, géographiques, d’appareil, de visiteur, de date, d'échantillonnage, de temps de rechargement, de visiter et de quota. Il est toujours pris en charge par le pont active-widget hérité pendant que l'architecture de déploiement est construite.

Intégration en ligne

Un sondage responsif placé à l'intérieur d'une page, d'un portail, d’un produit ou d' un centre d'aide.

Courriel

Aujourd’hui, le Studio peut générer des invitations HTML et des liens privés. L’envoi de bout en bout à partir de contacts/segments CRM, avec consentement, suppression, planification, réessai et corrélation des réponses, est la cible d’intégration approuvée de CRM Outreach.

Conception et prévisualisation d'entreprise

Les pages de sondage comprennent des thèmes et familles de mises en page propriétaires de Survey, des contrôles réactifs, une copie d’accueil et de remplissage ainsi qu’un aperçu du brouillon signé. L’aperçu du concepteur est pleine largeur sous l’éditeur, pas un rail latéral étroit, il utilise le véritable runtime hébergé dans un cadre sandbox et prend en charge les largeurs de bureau, tablette et téléphone; le trafic d’affichage n’écrit ni réponses ni analyses.

💡
Le ciblage, l'identité, les ressources, le rendu et les analyses en temps d'exécution doivent être la propriété de Survey. Le contenu promotionnel ne peut être réutilisé que par une copie/importation explicite unique qui crée des données de sondage distinctes ; les modifications ultérieures apportées à Promotion ne doivent pas avoir d'effet.

Le produit de forme complète

Déploiements indépendants

En direct

Un sondage peut avoir des déploiements de page, widget, intégration, e-mail CRM, lien privé et QR séparément en version, chacun avec son propre état, design, audience et analyse. Chaque sondage est suspendu, désactivé ou supprimé.

CRM Outreach et campagnes

En direct

Créez une audience vérifiée à partir de segments CRM et de connecteurs compatibles avec les sondages, figez-la en une version immuable, émettez une invitation signée pour chacune et envoyez-la via le connecteur d'email sortant épinglé avec preuve de livraison par invitation.

Kit de terrain et validation

En direct

Sliders, choix d'images, téléchargement de fichiers, signature, adresse, téléphone, en-têtes et texte riche, avec longueur min/max, email/URL/numéro prédéfini, texte d'erreur personnalisé et paramètres URL par question.

Logique, formules, résultats

En direct

Groupes de conditions ET/OU, règles de branchement, un moteur de formule sûr sur les réponses et des bandes de score qui portent leur propre page de résultat : un quiz noté atterrit sur son verdict.

Langue, kiosque, pré-remplissage

En direct

Une liste déroulante de langues pour les visiteurs ne répertoriant que des langues avec de vraies traductions, un mode kiosque pour tablettes partagées (cibles plus grandes, réinitialisation automatique, pas de redirections), un générateur de liens préremplissage et un badge sécurisé modifiable et du texte de pied de page.

Test de version A/B

En direct

Publiez une version challenger sur n'importe quel déploiement avec un partage du trafic. Les visiteurs sont assignés de manière collant, les réponses sont tamponnées avec la version réellement servie et le tableau comparatif affiche les réponse, l'achèvement et le score moyen par version.

Digest hebdomadaire

En direct

Un e-mail hebdomadaire contenant les KPI des derniers 7 jours de sondage, les sondages les plus occupés, l’impulsion Feedback et le dernier briefing sur l’IA, envoyé via le connecteur sortant épinglé. Configurez-le dans le Centre de diffusion, Automation.

Gouvernance

En direct

Les listes d’accès par sondage limitent les personnes pouvant modifier, publier ou supprimer un sondage. L’approbation de publication (quatre yeux) nécessite qu’un deuxième administrateur publie le brouillon exact ; la modification réinitialise l’appro btion.

Plateforme de développement

En direct

Connector Contract 2.2, enquêtes dactylographiées* et rétroaction* api/v1, événements d'enquête canonique.*, webhooks signés durables avec les formats de relais Slack et Google Sheets, et une réponse PDF export.

Croissance & engagement

Survey Analytics et Feedback sont des produits différents

Survey Analytics explique comment un sondage lui-même atteint les gens et fonctionne, tandis que Feedback explique ce que les clients ont dit à travers toutes les sources autorisées et ce que l’entreprise devrait faire à ce sujet. Les deux produits sont liés entre eux mais ne partagent pas ou n’écrasent pas la vérité analytique.

Analyse des enquêtes

Elle mesure l’éligibilité, l’exposition, le comportement des déclencheurs, les débuts, la fin, l'abandon, les frictions entre questions et branches, le timing, les résultats de déploiement/campagne/version et la fiabilité en temps d'exécution.

Vue d'ensemble & boîte de réception

Un flux chronologique avec permission pour les réponses aux sondages complétées, les commentaires des widgets existants, le chat et les CSAT de ticket, les retours sur les réponse de ticket et les évaluations des réponses d'IA du client.

Analyse des commentaires

Analyse la signification client: tendances de mesures originales, sujets/thèmes, sentiment, émotion, intention, urgence, demandes, plaintes, éloges, segments parcours/produit/service/équipe, détracteurs et résultats en boucle fermée.

Propriété des données

Les réponses au sondage restent autorisées dans le stockage du sondage. Le Feedback stocke une référence de source reconstructible et des signaux dérivés, puis charge les preuves autorisées à la demande.

⚠️
La page de commentaires actuelle dispose toujours d'un navigateur de réponses au sondage et d'une boîte de réception distincte pour le widget hérité, et ses totaux IA n'utilisent pas encore le modèle source normalisé complet.

Les indicateurs NPS, CSAT, CES, les étoiles, les notes et l’utilité doivent toujours conserver leur méthode originale, leur échelle, leur exemple, leur fenêtre de date et leur dénominateur, et ne jamais être combinés en une moyenne inexpliquée.

Croissance & SEO

Studio de promotion

Le Studio de Promotion transforme votre site en un moteur de conversion. Concevoir des pop-ups, bannières, slide-in, barres de haut/bas, prises de contrôle en plein écran, blocs en ligne et même des redirections par pays, puis montrer le bon message au bon visiteur au bon moment. OpsIQ widget déjà sur votre site, donc il n'y a rien de plus à installer. Vous concevez et enregistrez des campagnes à tout moment; elles ne montrent qu'une fois que vous les publiez et le studio est activé pour votre espace de travail.

Studio de promotion
Concepteur de Promotion StudioUn concepteur de campagne visuelle avec une palette de blocs, un pop-up sur la toile et un panneau de ciblage.Promotion Studio - Designer de modeBLOCSxBienvenue, {first_name}!Obtenez 15 % de réduction sur votre première commandeSAVE15Réclamer mon couponCiblagePaysÉtats-Unis, CADéclencheurIntention de sortieRépartition A/B50 / 50Publier1DESCRIPTIONFaites glisser des blocs sur la toile2CIBLEPays, page, audience3MESUREGagnant A/B + analyse de l'IA
Le concepteur visuel : une palette de blocs à gauche, votre campagne sur la toile (ici un popup coupon personnalisé avec un token {first_name}), et le panneau ciblage + publication à droite.

La vue d'ensemble

Campagne

Quoi?

Une promotion : pop-up, bannière, barre, diapo-in, plein écran, bloc en ligne ou géo-rédirect. Chacun a un objectif : vente, plomb, inscription, chat, sondage, annonce.

Conception et versions

Comment

Chaque sauvegarde crée une nouvelle version, donc vous pouvez toujours revenir en arrière. Rien n'est jamais perdu.

Ciblage

Qui

Qui le voit : pays, page, appareil, source de trafic, retour vs nouveau, horaire et (avec un connecteur) vos clients connectés.

Déclencheurs

Quand

Quand il apparaît: instantanément, sur retard, sur défilement, sur intention de sortie, en veille, sur un clic, après N pages ou à partir d'une conversation / activité de ticket.

Analytique

Résultats

Impressions en direct, clics, conversions, entonnoir de dépôt, séparations pays / page / appareil, gagnants A/B et un aperçu d'IA.

Lancez votre première promotion en. 5 étapes

1
Commencer à partir d'un modèle ou d'une page vierge

Ouvrez Promotion Studio et cliquez sur Nouvelle campagne, ou choisissez un design prêt à l'emploi dans la galerie Modèles.

2
Concevez-le

Faites glisser dans les blocs, les titres, le texte, les boutons, les images, les badges, les statistiques, les comptes à rebours, formulaires, coupons, vidéos, évaluations, spin-wheels. Couleurs de style, gradients et effets 3D avec les curseurs.

3
Personnalisez-le

Tapez des jetons comme {first_name}, {country} ou {company} Au moment du spectacle, ils deviennent les valeurs réelles du visiteur.

4
Cible & déclencheur

Choisissez qui la voit (pays, page, appareil, audience) et quand elle se déclenche (délai, défilement, intention de sortie). Laisser une règle vide pour signifier tout le monde.

5
Vérifiez, puis publiez

Cliquez sur Vérifier pour une analyse rapide avant le lancement, puis Publier. Il est mis en ligne en quelques secondes et commence à collecter des données analytiques.

Blocs que vous pouvez construire

Contenu

Nombre de base

En-tête, paragraphe, liste, citation, image, icône, badge, stat, diviseur et espaceur, les éléments constitutifs de tout message.

Appel à l'action

Nombre de base

Des boutons avec de vraies actions : ouvrir un lien, démarrer une conversation, créer un ticket, copier un coupon ou accéder à une page.

Urgence & capture

Prime

Compte à rebours, formulaires (email / téléphone / texte), révélations de coupon et intégration vidéo.

Gamification & feedback

Prime

Roues de spin-to-win, cartes à gratter, NPS / évaluations d'étoiles et entonnoirs multi-étapes.

Mise en page & effets

Prime

Colonnes, barres de progrès, partage social, cochés de preuve sociale, oui/non à deux étapes, quiz et effets 3D, inclinaison, lueur, parallax, verremorphisme.

Jetons de personnalisation

Tapez l'un de ces éléments dans les titres, paragraphes, boutons, badges, statistiques, listes ou citations et ils seront remplacés par les détails en direct du visiteur au moment où la promotion apparaît (toujours nettoyés pour plus de sécurité) :

Jetons disponibles
From the visit:   {country} {city} {device} {page_path} {utm_source} {referrer}
From your CRM:    {first_name} {last_name} {email} {company} {segment} {lifecycle_stage}
From a connector: {balance_due} {unpaid_invoices}   (logged-in customers only)

Référence de ciblage

Pays et localisation

Afficher uniquement dans (ou masquer de) les pays, villes ou fuseaux horaires choisis via GeoIP. Idéal pour des offres spécifiques à une région ou une géo-redirection.

Pages et URL

Limitez à certaines pages avec égal à / commence par / contient / expression régulière, et excluez également des pages.

Appareil

Bureau, tablette ou mobile, p. ex. une barre mince sur mobile, un mode de travail sur bureau.

Type de visiteur

Nouveau, récurrent, connu (dans votre CRM) ou anonyme; segments CRM, étape du cycle de vie, score de lead ou langue du navigateur.

Source de trafic

Par UTM (utm_source, utm _campaign) ou site de référence, par exemple uniquement les visiteurs d'une annonce spécifique.

Horaire & fréquence

Dates de début / fin, fenêtres d'heure du jour et fréquence à laquelle une personne peut la voir (par session, par jour, après qu'elle ait fermé / cliqué / converti).

Répartition du trafic A/B

Affichez à un pourcentage de visiteurs et exécutez des variantes en tête-à-tête ; la même personne voit toujours la même variante.

Audiences (en ligne)

Avec un connecteur activé, cible par l'état du compte en direct, par exemple les clients avec des factures impayées, ou les abonnés actifs.

Déclencheurs

Choisissez comment la promotion apparaît: Immédiatement, après un délai, sur la profondeur de défilement, sur l'intention de sortie, en mode inactif, sur un clic d'un élément, après une certain nombre de pages consultées, sur le formulaire abandonné ou à partir de l'activité du chat / ticket. window.OpsIQPromo.fire('event').

Ciblez les clients connectés (connecteurs)

C'est ce qui rend OpsIQ Spécial promotions: connectez une plateforme comme WHMCS (ou tout autre connecteur prenant en charge les audiences) et le studio peut cibler les visiteurs par l'état de leur compte actif.

1
Activer un connecteur d’audience

Sous Connectors, activez un système qui expose les faits de l'audience (WHMCS Les clients sont reconnus en toute sécurité lorsqu'ils sont connectés à cette plate-forme, OpsIQ jamais fait confiance à un email tapé.

2
Ajouter une règle d'audience

Dans le Ciblage > Audience de la campagne, exigez une connexion et ajoutez des règles comme les factures impayées >= 1, l'abonnement est en retard ou le crédit du compte > 0.

3
Personnalisez avec leurs données

Utilisez des jetons tels que {first_name} ou {balance_due}. Un rappel "Vous avez une facture en retard" s'écrit.

Le ciblage de l'auditoire est sûr : si le connecteur ne peut confirmer un fait (ou que le visiteur n'est pas connecté), la promotion ne s'affiche tout simplement pas, donc une offre ciblée sur la facturation n'arrive jamais à la mauvaise personne.

Le commerce connecté (la superpuissance des studios)

Cartes de produits depuis votre boutique

Données en direct

Un bloc produit tire des objets réels (nom, prix, prix de vente, image, lien) directement à partir WHMCS, WooCommerce, Shopify ou de votre OpsIQ Cochez "Continuez frais" et la carte met à jour son prix depuis la plate-forme toutes les heures pendant qu'elle est publiée.

Coupons fournis par le magasin

Coupons

Un bloc de coupon peut créer le vrai code de réduction dans votre boutique au moment où vous publiez, afin que le code révélé par un visiteur fonctionne toujours à la caisse.

Revenu de l'ordre-vérité

Montant alloué

Les commandes réelles de vos plateformes sont appariées à des campagnes horaires (par code promo utilisé ou par l'email du lead) donc les revenus que vous voyez proviennent des ventes réelles, pas des estimations.

Une vraie preuve sociale

Confiance

Le cocker social-proof peut mener avec de véritables commandes récentes ("Ada commandé Starter Plan · 2h year"), prénom et article seulement, jamais emails ou montants.

Expériences & voyages

Variantes A/B et gagnant automatique

Diviser le trafic entre les variantes de conception; laisser le studio promouvoir automatiquement le gagnant statistique, ou le trafic manuel à l'optimiseur de bandit qui déplace les visiteurs vers ce qui se convertit comme preuve.

Augmentation de la rétention

Réservez une tranche de visiteurs qui ne voient rien, afin que vous puissiez prouver que la campagne elle-même provoque le lift.

Variantes de segment

Différents contenus par public sur la campagne SAME (visiteurs mobiles, grands chariots, clients de retour), chaque segment obtient sa propre version.

Déclencher des expériences

Les variantes peuvent également tester QUAND apparaître: immédiate vs différée vs intention de sortie, mesurée en tête-à-tête.

Voyages (enchaînement)

Ciblez par ce que quelqu'un a fait avec une autre campagne («saw campagne A mais n'a pas converti») pour construire des séquences de promotion en plusieurs étapes.

Thésers

Une petite pilule permet aux visiteurs de rouvrir la campagne après sa fermeture, donc une pop-up fermée n’est jamais définitivement disparue.

Savoir ce qui s'est passé

Carte de chaleur des clics

Designer

Dans le concepteur, activez la carte thermique pour peindre les clics réels des visiteurs sur chaque bloc de votre design.

Entonnoir d'étapes

Entonnoirs

Les campagnes multi-étapes montrent exactement où les gens abandonnent, écran par écran.

Comparer les campagnes

Studio

Mettez jusqu'à quatre campagnes côte à côte (impressions, clics, conversions), meilleure valeur mise en évidence.

Histoire hebdomadaire & digest

IA

Chaque lundi, un résumé atterrit dans vos notifications; le bouton 📖 Weekly story écrit un résume en langage clair avec les prochaines étapes chaque fois que vous en voulez une.

Travailler confortablement

AI copilote & idées

Discutez avec le copilote de conception pour modifier la toile ("faire le titre urgent, ajouter un compte à rebours"), obtenir des idées de campagne à partir de vos propres données de trafic, traduire une campagne par pays ou corriger automatiquement un score de confection faible.

Marque Kit import

Une commande lit votre site web et propose les couleurs et polices de votre marque réelle; sauvegardez et chaque sélecteur mène avec eux.

Entonnoirs multi-écran

Les blocs d'étapes obtiennent une édition par écran véritable : onglets pour chaque écran, ajouter ou réorganiser des écrans, et l'aperçu suit.

Versions nommées & présence

Nommez les versions importantes (« candidat au lancement »), restaurez-les et recevez un avertissement lorsqu'un coéquipier modifie la même campagne.

Bande de dispositifs et règles

Affichez les ordinateurs de bureau, tablettes et mobiles côte à côte dans une seule vue ; basculez entre les règles en pixels pour un positionnement précis.

Page & canaux hébergés

Chaque campagne peut également être une page hébergée autonome pour les bios et les codes QR, une séquence de goutte à goutte d'emails pour les prospects capturés ou un brouillon web-push en un clic.

Sécurité de l'entreprise

Publiez des fenêtres de gel (périodes de gel des modifications), un commutateur d'urgence pour tout mettre en pause, les approbations, la piste d'audit et le retour à la version précédente.

Dois-je ajouter du code à mon site?+

Non, les promotions sont livrées par le même widget OpsIQ que vous avez déjà installé. Concevoir, publier, c'est fait.

Les visiteurs verront-ils la même fenêtre contextuelle encore et encore?+

Non. Réglez les bouchons de fréquence (par session / par jour, ou arrêtez-vous après que quelqu'un ferme, clique ou convertit).

Qui peut publier?+

Les fonctions de publication, d'interruption, d’archivage et de rétablissement sont limitées aux propriétaires d’espaces de travail et aux administrateurs complets.

Croissance & SEO

Designer de promotion

Promotion Designer est un éditeur de blocs réactif pour la création, l’examen, le versionnement et la publication d’une expérience de campagne.

Écran de produit
Designer de promotionLe concepteur combine une toile en direct, des aperçus d'appareils, des blocs, variables de personnalisation, commentaires et historique de version.Designer de promotionespace de travailVIEWPORTBureauVERSIONv12ETATBrouillonVUE DE L'ESPACE DE TRAVAIL EN DIRECTBloc de hérosTitre, média et CTAÉditerBloc d'offreRéduction et délaiÉditerPersonnalisationVariables de contact et de campagnePrêtVérification de lancementCommentaires et validationExamen1BUILD BLOCKSModifier la mise en page live2AVANTAGEOrdinateur de bureau, tablette, mobile3PUBLISHVersion de la version
Le concepteur combine une toile en direct, des aperçus d'appareils, des blocs, variables de personnalisation, commentaires et historique de version.

Utilisez des blocs pour composer l'expérience, prévisualiser chaque fenêtre prise en charge et insérer les variables de personnalisation approuvées. Passez en revue les commentaires et la provenance des médias d'IA avant le lancement.

Croissance & SEO

Modèles de promotion

Les modèles fournissent une galerie de départ classée et consultable pour les campagnes Promotion Studio.

Écran de produit
Modèles de promotionLa galerie de modèles filtre les mises en page premium et applique les couleurs de marque d'espace de travail lorsqu'un modèle devient un brouillon.Modèles de promotionespace de travailCATÉGORIEConversionRESULTS24GRANDEAppliquéeVUE DE L'ESPACE DE TRAVAIL EN DIRECTOffre de sortieModal avec urgence et CTAAperçuNouveau visiteur bienvenuBannière et liste des avantagesAperçuLancement de produitHéros, preuve et compte à reboursAperçuDemande de rétroactionInvite de sondage compacteAperçu1FILTERCatégorie et recherche2AVANTAGEInspecter la conception complète3USECréer un brouillon personnalisé
La galerie de modèles filtre les mises en page premium et applique les couleurs de marque d'espace de travail lorsqu'un modèle devient un brouillon.

Recherchez ou filtrez par catégorie, chargez des résultats supplémentaires, prévisualisez l'expérience complète, puis choisissez Utiliser le modèleLa nouvelle campagne reste un brouillon et peut être modifiée dans Promotion Designer avant sa publication.

Croissance & SEO

Analyse de la promotion

L'analyse des promotions relie les impressions et les clics aux conversions, au contexte de l'audience, aux résultats d'action du connecteur et à l'apprentissage de la campagne.

Écran de produit
Analyse de la promotionL'analyse de la promotion montre les performances des titres, l'audience et les déclencheurs, l’exportation de leads et les résultats d'actions connectées.Analyse de la promotionespace de travailIMPRESSIONS42.8kCTR6.4%CONVERSIONS814VUE DE L'ESPACE DE TRAVAIL EN DIRECTPaysRoyaume-Uni · 31%VentilationPage/pricing · 22%VentilationDéclencheurIntention de sortie · 44%VentilationAction de connecteurCoupon créé · 97% succèsRésultat1MESUREDes impressions à la conversion2SLICEPage, pays, appareil3LEARNAppliquer l'insight
L'analyse de la promotion montre les performances des titres, l'audience et les déclencheurs, l’exportation de leads et les résultats d'actions connectées.

Les résultats des actions du connecteur indiquent si le suivi promis de la promotion a réellement été effectué. Les informations tirées de l’IA et les résumés d’apprentissage doivent être traités comme des hypothèses à valider, pas comme une preuve automatique.

Croissance & SEO

Annonces

Les annonces publient un message dans la zone de notification du widget avec ciblage, planification et appel à l'action en option.

Écran de produit
AnnoncesL'éditeur d'annonces comprend le contenu, l'APC, l’audience, le segment, la règle de page, les dates actives et le style visuel.Annoncesespace de travailACTIF3AUDIENCESegmentANNEXESJuillet 22–29VUE DE L'ESPACE DE TRAVAIL EN DIRECTTitreEntretien planifiéPrêtContenumessage MarkdownPrêtCTALire la mise à jourFacultatifRulePages de tarification · clients actifsObjectif1WRITETitre et Markdown2CIBLEPublic, segment, page3ANNEXESFenêtre active
L'éditeur d'annonces comprend le contenu, l'APC, l’audience, le segment, la règle de page, les dates actives et le style visuel.

Choisissez tous les visiteurs, les visiteur connectés ou les nouveaux visiteurs; vous pouvez également affiner l'audience avec un segment de contact et une règle de page. Définissez des dates actives à partir/jusqu'à et un drapeau actif.

Croissance & SEO

Campagnes de push

Les campagnes push envoient des notifications de navigateur aux visiteurs abonnés après qu'ils aient quitté le site.

Écran de produit
Campagnes de pushLe compositeur de push affiche la portée, le contenu, les médias, les actions, les règles cibles et l'état du planning.Campagnes de pushespace de travailSUBSCRIBERS8,214ENVOYÉ31.6kCLICK RATE5.8%VUE DE L'ESPACE DE TRAVAIL EN DIRECTTitreVotre panier est videPrêtCorpsRetournez aujourd'hui pour une livraison gratuitePrêtCTAOuvrir le panierPrêtCalendrierEnvoyer maintenant ou planifiéBrouillon1PREPARE PUSHTitre, corps, icône2CIBLEPublic, segment, page3SENDMaintenant, programme ou projet
Le compositeur de push affiche la portée, le contenu, les médias, les actions, les règles cibles et l'état du planning.

Une campagne peut inclure le titre, le corps de l'e-mail, une icône, une image du héros, un badge, un CTA et jusqu'à deux boutons d'action.

Enregistrez un brouillon, planifiez-le ou envoyez-la immédiatement. Utilisez les statistiques d'abonnement et de clics pour évaluer la portée. HTTPS et un service worker correctement hébergé sont requis sur les sites tiers intégrés; voir Web Push sur les Sites tiers.

Croissance & SEO

Des messages proactifs

Les messages proactifs s'adressent automatiquement au moment où le comportement d'un visiteur correspond à une règle, avant de demander. Vous construisez chacun en règle générale avec trois parties: ce qui doit arriver, quand il devrait tirer, et combien de fois. OpsIQ widget déjà sur votre site.

Proactif
Des messages proactifsUn compositeur de règles proactives en trois parties: choisissez une action (chat, bannière, visite guidée, push, e-mail), ajoutez des conditions et définissez un délai de récupération de fréquence.Messages proactifsespace de travail1 · ActionMessage de chatBannièreVisitePoussezCourriel2 · Conditions généralespage = /pricingTemps sur la page > 20sretour3 · FréquenceUne fois par sessionStatut1MESURESChat, bannière, email, push…2CONDITIONSPage, temps, score, retour3FRÉQUENCETemps de recharge par visiteur
Chaque règle proactive est composée de trois choix : ce qui se produit (chat, bannière, visite guidée, push, e-mail, webhook), quand (conditions) et à quelle fréquence (relâchement).

Les trois parties d'une règle

1
Ce qui devrait se passer (action)

Afficher une bulle de chat ou une bannière sur la page, commencer une visite guidée, envoyer un push web ou un courriel, assigner à un département, ou tirer un webhook.{{visitor_name}}et{{page_title}}devenir des valeurs réelles.

2
Quand il devrait se déclencher (conditions)

N'hésitez pas à le déclencher : page/URL, heure sur la page, profondeur du défilement, score de tête, retour vs nouveau, inactif. Sans conditions, la règle s'allume pour chaque visiteur. Ajoutez au moins une pour la cibler.

3
Combien de fois (fréquence)

Réglez un refroidissement pour que la même personne ne soit pas piétinée, par exemple une fois par session ou une fois/jour. Chaque règle a un statut d'on/off.

⚠️
L'espace de travail basculer "Run time/idle rules horaires" permet aux actions côté serveur (email, push, webhook, assigner) d'allumer sur un horaire pour les contacts connus qui ne sont pas actuellement sur la page, de sorte que vous pouvez "email tain hot leads" automatiquement. OpsIQ Laisse tomber si tu veux juste des punaises en direct.
Est-ce qu'il va tirer pour tout le monde?+

Ajoutez au moins une condition (page, lead score, retour…) pour cibler les bons visiteurs et vous assurer que votre campagne est efficace.

Comment ces derniers se rapportent-ils aux flux et aux circuits?+

Ils fonctionnent ensemble : une règle proactive peut déclencher un Guided Tour, et un Chatbot Flow peut être décLENCHE par une règle Proactive. Commencez avec une seule règle de message chat, puis superposez les autres.

Croissance & SEO

Les flux de chatbot

Chatbot Flows script branche les conversations dans votre widget de chat (greetings, mots clés, chemins guidés) sans code. Un flux est un ensemble d'étapes connectées (nodes): vous posez une question, le visiteur choisit une option, et le flux les envoie vers la branche correspondante. Seuls les flux actifs s'exécutent sur votre site.

Comment ça fonctionne
Les flux de chatbotUne toile de flux : un nœud de salutation en trois boutons d'option, chacun menant à une étape suivante, regarder l'ordre, ou de laisser à un humain.SalutationComment puis-je vous aider?Suivre ma commandeQuestion de facturationParlez à un humainRecherchez l'ordre→ Agent humainDéclencheurs: Salutation · Mot-clé · Manuel · Après les détails · Fin du chat
Les flux de chatbot

Flux par rapport à l'IA · quand utiliser

Utiliser un flux

Lorsque le chemin est prévisible et que vous voulez qu'il soit identique à chaque fois : les étapes de réservation, un assistant de retour, un choix "quel plan?", collecte d'un email avant la remise.

Utilisez l'IA

Lorsque les questions sont ouvertes, « cela fonctionne avec mon installation ? ». Le client Clavardage AI répond à partir de vos connaissances formées. Un flux peut se transmettre à l'IA (ou un humain) à n'importe quelle étape.

Déclencheurs

Salutation

S'exécute comme message d'ouverture lorsqu'un visiteur ouvre le chat pour la première fois.

Mot-clé

S'exécute lorsque le visiteur tape un mot que vous avez indiqué (par exemple, remboursement, prix, annulation).

Après les détails / Après le retard

Démarre une fois que les coordonnées du contact sont partagées, ou à un moment défini dans la conversation.

En fin de chat / Proactif

S'exécute à la fin du chat (par exemple, une évaluation) ou est déclenchée par une règle de message proactif.

Construisez-en un en quatre étapes

1
Créer le flux

Cliquez sur Nouveau flux, donnez-lui un nom, choisissez un type de déclencheur (et des mots clés si vous utilisez le mot clé), enregistrez.

2
Ouvrez la toile

Cliquez sur Modifier la toile. Le constructeur visuel où vous ajoutez des étapes (messages, questions avec boutons, branches) et connectez-les.

3
Ajouter des branches et un transfert

Pour chaque choix, dessinez une branche vers l'étape suivante. Finissez les chemins en résolvant, en remettant à l'IA ou en transférant à un humain.

4
Activez-le

Cliquez sur Activer. Le flux est immédiatement actif dans votre widget, vous pouvez le désactiver à tout moment sans perdre la conception.

Les flux remplacent-ils l’IA?+

Non. Ils courent côte à côte. Utilisez les flux pour des chemins prévisibles et l'IA pour des questions ouvertes; un flux peut toujours se transmettre à l'un ou l'autre.

Croissance & SEO

Visites guidées

Les visites guidées sont des présentations étape par étape qui pointent vers certaines parties de votre page avec des bulles et un projecteur, guidant le visiteur à travers l'intégration ou une nouvelle fonctionnalité. Elles sont entièrement thématiques et construites dans un concepteur visuel avec un aperçu en direct.

Comment ça fonctionne
Visites guidéesUne page grisée avec un anneau de projecteurs autour d'un bouton Ajouter une offre et une bulle de lecture thématique Étape 1 1 of 4 avec un bouton Suivant.+ Ajouter une offreÉTAPE1DES4Créez votre première offreCliquez ici pour ajouter une offre à votre pipeline.Suivant →
Visites guidées

Comment une visite est construite

Étapes

Chaque étape cible un élément et affiche une bulle avec votre texte. Ajouter autant d'arrêts que la visite guidée a besoin et les ordonner.

Préréglages & thème

Commencez par un préréglage ou créez votre propre bulle (couleurs, dégradés, projecteurs) avec un aperçu en direct sur la droite.

Déclencheur

Vous pouvez éventuellement lier une règle proactive pour que la visite démarre automatiquement lorsque cette règle se déclenche (par exemple, lors de la première visite du tableau de bord d'un visiteur récurrent).

Toggle actif

Une visite n'est éligible à l'exécution que si Active est cochée. Décochez pour la supprimer sans la suppression.

Construisez-en un en quatre étapes

1
Nouvelle tournée

Cliquez sur Nouvelle visite guidée, donnez-lui un nom et éventuellement liez une règle proactive pour qu’elle démarre automatiquement.

2
Ajouter des étapes

Ajoutez chaque arrêt : choisissez l'élément vers lequel il pointe et écrivez le texte de la bulle, puis réorganisez jusqu'à ce que le chemin coule.

3
Concevez-le

Choisissez un préréglage ou stylez vous-même la bulle. L'aperçu en direct montre exactement ce que les visiteurs voient.

4
Activer

Cochez Active et sauvegardez. La tournée peut maintenant se dérouler, sur son propre déclencheur, ou démarrée par une règle Message Proactive.

Comment les visites guidées démarrent-elles ?+

Sur leur propre déclencheur, ou via une règle Message proactive "Visite guidée", vous décidez donc quels visiteurs voient la visite et quand.

Croissance & SEO

Objectifs de conversion

Les objectifs de conversion transforment une activité que vous aimez (un événement webhook entrant, un message de chat, une résolution de ticket) en une conversion enregistrée avec attribution complète. Lorsque l'activité s'enflamme, OpsIQ enregistre une conversion contre le contact et la relie aux campagnes, segments et sources qui y ont mené.

Comment ça fonctionne
Objectifs de conversionUn flux d'objectifs : un événement webhook payment. succeeded devient une conversion « achat » enregistrée d'une valeur de $49, attribuée à sa source et à sa campagne, avec des jetons prédéfinis de démarrage rapide ci-dessus.Démarrage rapideAchat par StripeDémo réservéeInscription à la newsletterpayment.succeededWebhook entrantConversion"achat" · $49AttribuéSource · campagne
Objectifs de conversion

Définir un objectif en trois étapes

1
Choisissez l'activité déclenchant

Cliquez sur Nouveau but de conversion. Choisissez le type d'activité qui compte comme une conversion, ou utilisez un préréglage Quick-start, achat Stripe, démo réservé, inscription à la newsletter ou abonnement démarré.

2
Nommez-le et définissez une valeur

Donnez un nom à la conversion (achat, démo_réservée, inscription) et éventuellement une valeur fixe et une fenêtre d'attribution.

3
Enregistrer

À partir de là, chaque fois que l'activité se déclenche, OpsIQ enregistre une conversion par rapport au contact avec attribution aux contacts précédents.

Les objectifs sont déjà câblés dans les webhooks entrants : tout objectif dont le déclencheur correspond au type d'événement entrant se déclencha automatiquement au moment où l'évéement atterrit. Utilisez la page Webhooks Inbound pour connecter Stripe, Calendly ou n'importe quel système pouvant POST JSON.
Qu’est-ce que la conversion?+

Toute activité enregistrée: un événement webhook entrant (paiement. succeed), une capture de chat par e-mail, une résolution de ticket, tout ce qui se trouve dans la timeline de contact.

Analytique

Tableaux de bord personnalisés

Les tableaux de bord personnalisés vous permettent d'obtenir votre propre vue des indicateurs importants, au lieu de compter uniquement sur l'aperçu standard. Ajouter les widgets que vous voulez, faites-les glisser et redimensionnez-les dans la disposition qui vous convient, enregistrez-la et partagez-la avec votre équipe.

Tableaux de bord personnalisés
Tableaux de bord personnalisésUn constructeur de tableau de bord avec des tuiles de widgets KPI et graphique, une zone de dépôt en pointillé et un bouton Ajouter-widget.Tableaux de bord personnalisésespace de travailMon tableau de bord+ Ajouter un widgetVISITES2,481REVENUS$8.2kTRAFICFaites glisser un widget iciTOP PAGES/pricing/docs/signup1ADD WIDGETSChoisir les indicateurs et les graphiques2ARRANGEFaites glisser & redimensionner3PARTAGEAvec votre équipe
Créez votre propre tableau de bord : ajoutez des KPI, des widgets de graphique et de liste, faites-les glisser et redimensionnez-les dans la disposition souhaitée, puis partagez-le avec l'équipe.

Construisez-en un en trois étapes

1
Ajouter des widgets

Cliquez sur Ajouter un widget, choisissez la mesure ou le graphique que vous souhaitez suivre et répétez l'opération pour tout ce que vous voulez ajouter au tableau.

2
Organiser la mise en page

Faites glisser des widgets pour repositionner et faites glisser leurs bords pour les redimensionner. KPIs à travers le haut, graphiques ci-dessous.

3
Enregistrer et partager

Enregistrez le tableau de bord et partagez-le avec votre équipe afin que tout le monde puisse consulter les mêmes chiffres.

Gardez des tableaux séparés pour des emplois distincts (un tableau de « coup d'œil quotidien » avec des comptes en direct, et un tableau de "revue mensuelle" avec des graphiques de tendances) afin que chaque reste concentré.
Croissance & SEO

Campagnes de sensibilisation

Outreach is OpsIQ's1:1Moteur d’emailing en masse et de messagerie personnalisée : composez un message personnalisé ou lancez une campagne vers un segment CRM, avec détection des réponses, contrôle du temps d’envoi, suivi des ouvertures/clics, pixel de traçage et désabonnement en un clic.

Sensibilisation
Campagnes de sensibilisationL'écran Outreach avec les onglets Composer/Campagnes/Modèles/Réponses et un tableau de campagne indiquant le taux d'envoi, d'ouverture et de réponse.Sensibilisationespace de travailCampagnesCompositeurModèlesRéponsesCAMPAGNEENVOYÉOUVERTRÉPONSESNewsletter de juin1,20048%7%Suivi des procès34062%14%Récupération82039%5%La détection de réponse arrête automatiquement les suivis · un clic pour se désinscrire à chaque envoi11:1 & BULKComposez ou faites campagne2TRACKEDOuvertures, clics, réponses3COMPLIANTDésabonnement intégré
Le moteur Outreach: envoyer1:1ou exécutez des campagnes pour un segment, suivez les ouvertures et les réponses et restez conforme avec la détection de désabonnement et de réponse intégrée.

Les quatre onglets

Compositeur

Écrire un commentaire1:1Envoyer un email avec {tokens} Du contact et du CRM.

Campagnes

Envoyez à un segment CRM, planifié ou immédiatement, avec des plafonds et le contrôle de l'heure d'envoi.

Modèles

Modèles de messages réutilisables pour une diffusion répétée.

Réponses

La détection de réponse enregistre les réponses et arrête automatiquement le suivi à toute personne qui a répondu.

Comment fonctionne une campagne

1
Choisissez un public

Choisissez un segment CRM (ou téléchargez une liste). La suppression et le consentement sont appliqués automatiquement.

2
Composer

Rédigez le message avec des jetons de personnalisation; prévisualiser contre un contact réel.

3
Planifier & envoyer

Envoyez maintenant ou au meilleur moment. Un pixel de suivi s'ouvre; les clics et les réponses sont attribués.

La sensibilisation est axée sur le consentement et la suppression, comprend un désabonnement en un clic à chaque envoi et suit CAN-SPAM / CASL.
Analytique

visualHtml

Rapports programmés envoyer par courriel un ensemble de mesures choisi aux destinataires choisis sur une liste (quotidienne, hebdomadaire ou mensuelle) sous forme d'étiquette blanche imprimable PDF. Réglez-le une fois et le rapport atterrit dans des boîtes de réception automatiquement à travers la OpsIQ Cron.

visualHtml
visualHtmlL'écran des rapports planifiés: un tableau de rapports avec leur calendrier, les destinataires et l'heure du dernier envoi, plus un bouton Enregistrer le rapport.Rapports programmésespace de travailvisualHtml+ Sauvegarder le rapportRAPPORTANNEXESRECEPTEURSDERNIÈRE ENVOYÉETrafic hebdomadaireMon 9:_00[email protected]2e annéeRapport client SEOMensuel[email protected]Juin 1Résumé des ventesQuotidien[email protected]todayLivré en marque blanche PDF via the OpsIQ cron1AUTOMATEDQuotidien · hebdomadaire · mensuel2LABEL BLANCPDF aux clients3RECEPTEURSEnvoyé par courriel sur le calendrier
Définir un rapport une fois (ensemble métrique, plage, calendrier, destinataires) et OpsIQ e-mails d'un label blanc PDF automatiquement sur votre cadence.

Créer un rapport

1
Choisissez ce que vous voulez envoyer

Choisissez l’ensemble de mesures (traffic, SEO, ventes, support…) et une plage de dates.

2
Définir le calendrier & les destinataires

Quotidiennement, hebdomadairement ou mensuellement, à l’heure de votre choix, à un ou plusieurs destinataires.

3
Enregistrer

Enregistrer et activer. Le rapport génère et s'envoie par courriel à l'horaire, pas d'étape manuelle.

💡
Les rapports prévus passent par OpsIQ cron, si un rapport n'arrive pas, confirme que le cron est en marche (voir Cron et automatisation).
Confidentialité

Confidentialité et conformité

La page Vie privée et Conformité est le seul endroit où afficher un auditeur que vous manipulez les données personnelles de manière responsable : le registre du consentement, le journal d'accès administratif, votre politique de résidence et de conservation des données, et une version prête à imprimer DPA, dans une vue tablée.

Confidentialité et conformité
Confidentialité et conformitéL'écran Confidentialité et conformité: onglets pour le grand livre de consentement, le journal d'accès, la résidence et DPA, avec un tableau du grand livre des accords et des révocation par canal.Confidentialité & conformitéespace de travailRegistre de consentementJournal d'accèsRésidenceDPACONTACTCANALMESURESDATE[email protected]EmailAccordéJuin 12[email protected]pushRévoquéJuin 10[email protected]marketingAccordéJuin 9Preuve consultable de chaque consentement accordé et révoqué, par canal1ESSAI DE DÉLAISPreuve de chaque subvention2ACCESS LOGQui a touché les données3DPAModèle imprimable
Un écran prêt pour l'auditeur: un registre de consentement consultable (octrois/révocation par canal), un journal d'accès des personnes ayant touché les données, les paramètres de résidence/conservation et un DPA imprimable.

Les quatre onglets

Registre de consentement

Un enregistrement consultable de chaque autorisation de consentement et révoquer, par contact, canal (email, push, SMS, in-widget), action, source et date. Votre preuve un contact accepté (ou retiré).

Journal d'accès

Qui, dans votre équipe, a consulté, édité, exporté, effacé ou envoyé des messages aux données d'un contact, avec l'administrateur, le contact, l'action, la raison indiquée et IP. Exactement ce que demande un régulateur.

Résidence & rétention

Déclarez où se trouvent les données de cet espace de travail, définissez le nombre de jours pendant lesquels les lignes d'activité sont conservées (0 = pour toujours) et enregistrez votre contrôleur de données et DPO.

Modèle DPA

Un Addendum sur le traitement des données imprimable qui indique votre contrôleur, adresse, DPO, résidence et conservation. Imprimer ou enregistrer sous PDF.

Privacy & Compliance est associé au studio de consentement aux cookies (qui recueille le consentement) et à la page Exporter (qui produit la copie des données pour un DSAR). Voir aussi Cron et automatisation pour le nettoyage nocturne de rétention.
Connecteurs

Connectez vos plateformes

Lien des connecteurs OpsIQ vers des plateformes externes: magasins de commerce électronique, systèmes de facturation, processeurs de paiement, fournisseurs d'e-mail et sur mesure APIs. Une fois connectée, l'IA peut rechercher les commandes, les données client, les abonnements, et plus encore, et prendre des mesures avec votre approbation.

Comment ça fonctionne
Hub de connecteursOpsIQ noyau connecté à WHMCS, Shopify, Stripe, WooCommerce, SendGrid et Google Business Profile, chacun affichant un statut de connexion.WHMCSShopifyStripeWooCommerceSendGridGoogle BPOpsIQCORE1PLUG IN25+ connecteurs pré-construits2AI CONTEXTDonnées réelles de la plateforme3ACTIONSTerminé avec votre approbation
Connecteurs

Navires avec OpsIQ

Ceux-ci sont présents au moment où vous installez et n'ont besoin que de leurs identifiants.

WHMCS

Facturation

Facturation d'hébergement web: clients, services, tickets, factures, domaines, serveurs.

Shopify

Commerce électronique

Commerce électronique: commandes, clients, produits, inventaire, paiements, webhooks.

WooCommerce

Commerce électronique

WordPress e-commerce: commandes, clients, produits, coupons, expédition.

WordPress

CMS

Contenu et utilisateurs sur un site WordPress.

Carré

Paiements

Paiements et points de vente: commandes, clients, catalogue.

osCommerce

Commerce électronique

E-commerce traditionnel: commandes, clients, produits.

Botble Hôtel

Pont

A Botble CMS site de l'hôtel à travers la signature OpsIQ La mise en œuvre de référence pour une plateforme sans bridge. API.

Zendesk

Appui

Helpdesk: tickets, utilisateurs, organisations, commentaires.

Profil d'entreprise Google

Commercialisation

Établissement local : avis, publications, questions-réponses, statistiques. Utilise OAuth.

Calendrier Google

Productivité

Calendriers et événements. Utilisations OAuth.

GmailetIMAP

Courriel

Boîtes aux lettres : courrier entrant et sortant, synchro-book.

SendGrid

Courriel

Envoi de courriels : envoyez des courriels et gérez des modèles.

Mailgun

Courriel

Envoi d'e-mails: envoyer des e-mail via Mailgun.

Slack, _Telegram, LIGNE, X DM

Messagerie

Les canaux de messagerie pour les conversations entrantes et sortantes.

Métacanaux

Messagerie

Facebook Messenger, Instagram DM et WhatsApp.

Renseignements sur le site (GA4, Console de recherche)

Analytique

Données analytiques et de recherche pour la suite SEO.

enrichissement du site Web et importation CRM

CRM

L'enrichissement de l'entreprise et l'importation en vrac des clients.

Disponible sur le marché

Installez-en un depuis les connecteurs, Marketplace et il est copié dans le dossier des connecteurs en direct, après quoi il se comporte exactement comme ceux ci-dessus.

Stripe

Marché

Paiements: charges, clients, factures, abonnements, paiements, litiges.

BigCommerce

Marché

E-commerce: commandes, clients, produits, catégories, marques.

Magento 2

Marché

E-commerce: commandes, clients, produits, catégories, stock.

PrestaShop

Marché

E-commerce: commandes, clients, produits, règles de panier, transporteurs.

OpenCart

Marché

E-commerce: commandes, clients, produits, catégories.

Amazon SES, Postmark, Résoudre

Marché

Livraison transactionnelle par e-mail.

Jira, linéaire

Marché

Suivi des enjeux et des projets.

Zoom, calendrier Microsoft, Outlook Mail

Marché

Réunions, calendriers et courrier.

DocuSign, en français, SerpApi, Utilisé Google Analytics

Marché

Signature, prospection, recherche et données analytiques.

Webflow, Wix, Squarespace

Marché

Plateformes de sites Web.

💡
La liste des connecteurs se déplace sous forme de paquets. La liste autorisée pour VOTRE installation est la page Connectors : ce qui est listé là est ce que l'exécution a découvert, et l'onglet Marketplace montre ce que vous pouvez ajouter.

Installation d'un connecteur

1
Accédez à Connecteurs

Accédez à Connecteurs dans la barre latérale d'administration.

2
Trouver le connecteur

Parcourez la liste ou effectuez une recherche. Les connecteurs sont regroupés par catégorie.

3
Activez-le

Cliquez sur le connecteur et activez/désactivez Activer.

4
Entrez les informations d'identification

Remplissez les champs obligatoires: API clé, URL Chaque connecteur a des exigences spécifiques documentées dans son panneau de paramètres.

5
Connexion de test

Cliquez sur « Test de connexion ». Un résultat vert signifie que le connecteur peut atteindre la plateforme externe, un résultat rouge indique l'erreur.

6
Configurer les fonctionnalités

Choisissez les fonctionnalités à activer : synchronisation des connaissances, synchronization de webhook, actions d'IA. Tous les connecteurs ne supportent pas toutes les fonctions.

Ce que les connecteurs vous donnent

Contexte de l'IA

L’IA peut consulter les données des clients, les commandes, les abonnements et plus encore via le connecteur. Lorsque le client discute, l’IA dispose de données réelles de la plateforme pour se référer.

Contexte de l'IA (auteurs du connecteur)

Le ContextProvider de votre connecteur fournit à l’IA de tickets un résumé de compte en lecture seule du propriétaire du ticket. Identifiez le client par customer_id lorsque connu; sinon, sur le ticket répond automatiquement, où le drapeau ctx customer_trust_email est vrai, regardez le compte en haut customer_email (l'expéditeur du ticket vérifié). Les plateformes distantes exposent un /context/customer-by-email C'est ce qui fait que l'IA cite un solde/facture réel au lieu de dire « s'il vous plaît connectez-vous ». Honorer les bascules de classe de données de l'opérateur (customer_sections, customer_allow_credit) et rester strictement en lecture seule, ne jamais émettre de secrets.

Répertoire client (auteurs de connecteurs)

L'IdentityProvider de votre connecteur alimente trois recherches de tickets universelles : lookupCustomerById() (carte client), lookupCustomerServices() (tableau des produits/services), et listCustomers($query,$limit): le "Rechercher client ou taper email" sur le formulaire de Compose-New-Ticket natif. {id, external_id, name, email, company, phone, platform, platform_label}. Règle à distance: si vos clients vivent dans une autre base de données ou un autre service,API à l'intérieur de ces méthodes, ne jamais lire directement les tables de l'autre système (dans le OpsIQ DB ce sont des détenteurs de place vides, c'est pourquoi une lecture locale retourne un récupérateur vide. Gate le chemin distant sur votre configuré API URL; ne garder une lecture locale qu'en tant que retour en arrière de la même BD.

Billets, détection et routage par courriel (auteurs de connecteur)

Lorsque l'e-mail entrant devient un ticket natif, OpsIQ détecte l'expéditeur en appelant lookupCustomerById(0, ['email'=>$sender]) Le premier match "possède" le client et son environnement. platform le slug est apposé sur le ticket.created événement comme _pipe_owner_platform (vide = invité).WHMCS-l'email du client ouvre un ticket dans WHMCS (WHMCS Un expéditeur inconnu reste un invité natif. Si votre connecteur met en miroir les tickets natifs sur sa propre plateforme, votre ticket.created Le gestionnaire doit être gaté sur ceci: if (array_key_exists('_pipe_owner_platform',$payload) && $payload['_pipe_owner_platform'] !== '<your-slug>') return;. La clé est absente sur les tickets non pipé (chat/manuel/AI), de sorte que ceux miroir comme avant. Le contrôle par département vit sous Team & Departments → Ouvrir les ticketes par courriel (Toute personne / Clients seulement / Off).

Actions

L'IA peut effectuer des actions via le connecteur : créer des tickets, mettre à jour les commandes, annuler les abonnements, avec votre approbation par le biais du calque de confiance.

Connaissances

Les connecteurs contribuent à l'IA des articles de connaissances spécifiques à la plateforme.Shopifyconnecteur ajoute le dépannage e-commerce;WHMCSconnecteur ajoute la connaissance de l'hébergement.

Importation de la base de connaissances (auteurs du connecteur)

Si votre plateforme héberge une base de connaissances, déclarez un kb_capabilities Bloquer dans settings.json (type kb_source) et votre connecteur apparaît dans l'éditeur du Centre d'aide Importer KB → Importation à partir d'une application connectée déroulant chaque fois qu'il est activé et configuré dans l'espace de travail. Il est déclaratif, aucune méthode à mettre en œuvre: nom un intégré adapter (zendesk pour le centre d'aide exact-tree API, ou crawl (pour tout site KB) et un base_template tels que https://{subdomain}.zendesk.com, que OpsIQ remplit à partir des paramètres stockés de votre connecteur. Les informations d'identification ne quittent jamais le serveur ; le navigateur envoie uniquement la logique du connecteur (slug). opsiq_kb_<platform>_manifest() Référencez-le par son nom. Références complètes: connectors/PLATFORM_CONNECTORS.md §5.

Webhooks

Certains connecteurs enregistrent des webhooks avec la plateforme externe pour les notifications d’événement en temps réel (nouvelles commandes, mises à jour de tickets, etc.).

Suivi des ventes

Les connecteurs de commerce électronique alimentent les données de revenus dans le tableau de bord Sales pour l'attribution et l'analyse.

💡
Chaque espace de travail peut avoir des connecteurs différents activés avec des références différentes.WHMCSl'espace de travail utiliseWHMCSconnecteur;Shopifyl'espace de travail utiliseShopifyconnecteur.
Puis-je utiliser plusieurs connecteurs en même temps?+

Oui, vous pouvez utiliser Shopify pour les commandes et Stripe pour les paiements dans le même espace de travail. L'IA fusionne les données de tous les connecteurs activés.

Que faire si ma plateforme n'est pas répertoriée?+

Utilisez le Connector Builder pour créer un connecteur personnalisé pour n'importe quelle plateforme avec une interface REST API, ou consultez la Marketplace pour trouver des connecteurs créés par la communauté.

Les connecteurs fonctionnent-ils avec OpsIQ autohébergé?+

Oui. Les connecteurs fonctionnent de manière identique dans les éditions cloud et auto-hébergées.

Connecteurs

Contrat de connecteur de vente et facturation

WHMCS est l'implémentation de référence, mais les ponts SaaS, les magasins, les fournisseurs de paiement, les connecteurs de marché et les packages Connector Builder doivent obéir aux mêmes règles.

Ce que chaque connecteur commerce doit publier

Un grand livre faisant autorité

Publish realised economic events to opsiq_sales_events through CommerceEventRegistry::normalize(). Do not build a connector-specific Sales table or make core analytics query a remote platform directly.

Identité source stable

La plate-forme est la logique de registre du connecteur, telle que whmcs, shopify ou opsiq_saas. traffic_source contient l'attribution d'acquisition vérifiée lorsqu'elle est fournie; sinon, utilisez le même slug que la solution de secours. OpsIQ Résout le nom du connecteur convivial dans l'interface utilisateur.

Idempotence

Mapper au moins un order_ref, invoice_ref ou subscription_ref immuable afin que les réessais de webhook et le remplissage en arrière mettent à jour le même événement au lieu de créer des ventes en double. service_ref identifie l'instance du produit ou du service affecté lorsqu'il existe une instance.

Horodatage de la source

occurred_at est l'heure du paiement ou de l'événement économique signalé par la plateforme source. Ne remplacez jamais les dates historiques des paiements par l'horaire d'importation.

Monnaie et devises

Si le paramètre du connecteur active la conversion de devises OpsIQ, les rapports sont convertis dans la devise de l’espace de travail. Sinon, les reports conservent la devis de la boutique ou de la plateforme de facturation. Le code du connecteurs ne doit pas coder en dur une devise ou un taux de change pour les rapport.

Cycle de vie fondé sur des données probantes

Utilisez les champs Nouveau, Renouvellement, Mise à niveau, Remboursement, Crédit ou Inconnu. Classez par raison de facturation, relation d'abonnement ou de service, type d'élément de ligne ou autre champ de source faisant autorité.

Limite de vente

Les remboursements sont signalés par l'analyse des remboursés et du chiffre d'affaires net. Le crédit de compte, les rechargements de portefeuille, les jetons et les fonds ajoutés restent des événements de grand livre de facturation et ne sont jamais comptabilisés comme ventes, conversions, volume de commandes ou revenus de ventes.

Le CRM reste séparé

CRM Les transactions ne sont pas des ventes de plate-forme commerciale à moins qu'une plateforme de facturation ou de magasin connectée émette la commande ou la facture payée réalisée par le biais du présent contrat.

Chaque signal de paiement ouvre la ligne

Ne dépendez pas d'un seul nom d'événement. Lorsque la plateforme envoie plusieurs confirmations d'une paiement (facture payée, commande payée, transaction ajoutée, paiement effectué), l'un d'eux peut ouvrir la ligne du grand livre une fois que la plate-forme confirme que la vente est payée; l'empreinte digitale de vente effondre les frères et sœurs en une seule ligne.

Rapprochement prévu (contrat 2.3)

A connector whose platform can list completed sales declares sales_reconciliation and implements SalesReconciliationInterface::reconcileSales(). Core re-reads the platform list on a schedule (once per workspace interval, bounded, cursored) through the same idempotent writer, so a dropped webhook cannot lose revenue. Conformance fails a package that can list history but does not reconcile. The Connector Builder derives the capability from the sales backfill action.

Projections dérivées

Les opsiq_conversions et les résumés de tableau de bord sont des projections de compatibilité reconstruites à partir du grand livre. Les connecteurs ne doivent pas traiter une projection comme la source financière de vérité. Les révisions de contrat peuvent réévaluer les lignes dérivées sans supprimer l'historique de facturation sous-jacent.

Délimitation de plate-forme distante

Un connecteur distant lit sa plateforme via le API authentifié configuré. Il ne doit jamais dépendre de tables de base de données du même serveur. La clé site_key exacte authentifiée du domaine est fournie par ConnectorRegistry et doit être appliquée à chaque écriture et remplissage de grand livre.

Exemple d'événement payant canonique

Événement commercial normalisé
{
  "event_id": "acme_store:invoice:INV-1042",
  "event_name": "invoice.paid",
  "platform": "acme_store",
  "order_ref": "ORDER-884",
  "invoice_ref": "INV-1042",
  "subscription_ref": "SUB-28",
  "service_ref": "SERVICE-91",
  "status": "paid",
  "lifecycle_type": "renewal",
  "amount": 129.00,
  "currency": "USD",
  "traffic_source": "acme_store",
  "occurred_at": "2026-07-23 08:30:27"
}

Mapping de Connector Builder

Lorsque la fonctionnalité Ventes et facturation est activée dans le Connector Builder, mappez le montant, la devise, l’état de la source et la date de la Source, ainsi qu’au moins une commande, une facture ou une référence d’abonnement. Mappez lifecycle_type lorsque API expose des preuves faisant autorité du cycle de vie. Le SalesIngest généré passe chaque ligne par le même normalisateur CommerceEventRegistry utilisé par les connecteurs intégrés et marketplace.

⚠️
Les crédits et les fonds d'ajout sont intentionnellement conservés pour l'historique de facturation, le contexte du solde client et l'analyse du grand livre. Les exclure des ventes ne les supprime pas; cela empêche seulement qu'ils gonflent la performance commerciale.

Le type de cycle de vie décide ce qui devient une affaire CRM

lifecycle_type n'est pas une étiquette analytique. OpsIQ lit pour décider si une vente entre dans le pipeline CRM, de sorte que chaque connecteur de vente prend une décision pipelinière qu'il ait l'intention ou non.

nouveau

Ouvre une transaction avec un client (nouvelle entreprise).

renouvellement et modernisation

Aucun accord de nouvelle entreprise — les renouvellements convertissent sur une courbe de probabilité différente et les mélangent corrompent les deux prévisions.

remboursement, crédit

Jamais ouvrir une offre, en aucun mode. L'argent retourné à un client n'est pas une victoire.

omis / inconnu

La vente est enregistrée mais n'a jamais atteint le pipeline.

Une vente, une rangée de grand livre : l'identité est la VENTE, pas l'événement

Ne pas correspondre à event_id et insérez-vous. event_id is platform:eventName:externalId, qui répond -Est-ce que nous avons déjà traité cette livraison et ne peut pas répondre -ont-nous déjà enregistré cette vente . Une plate-forme qui annonce un paiement deux fois — comme invoice.paid et encore comme payment.completed — deux cartes d'identité et deux cartes de crédit, sans rien à mettre en garde.

💡
Trouvé sur l'installation de référence : six factures avec trois lignes du grand livre chacune, à partir de trois chemins de code utilisant trois schémas event_id différents. Elles ont toutes porté 0.00 donc aucun total n'a semblé mal, et tout processus ultérieur de restauration des montants réels aurait compté un paiement trois fois.

Appelez plutôt l'écriture partagée. Core calcule l'identité commerciale de vente (sale_fingerprint), correspond à une ligne existante sur elle, conserve l'original event_id sur mise à jour et filtres aux colonnes réelles:

La seule façon d'écrire le registre des ventes
\OpsIQ\Commerce\CommerceEventContract::upsertSaleRow('opsiq_sales_events', $row);
Même vente, de nombreux événements

facture. payée, paiement. complété et vente. complete pour une facture partager une empreinte digitale et mettre à jour une ligne.

Les remboursements restent séparés

L'argent qui sort est un fait différent de l'argent en provenance. Un remboursement d'une facture conserve sa propre identité, donc il ne peut jamais écraser le paiement qu'il inverse.

Pas de référence, pas d'empreinte digitale

Une ligne ne portant aucune commande, facture, abonnement ou référence de service n'a aucune empreinte digitale du tout, donc deux lignes sans lien ne se heurtent jamais juste parce qu'elles manquent toutes deux un identificateur.

Priorité de référence

facture_ref, puis commande_ref et abonnement_ref. Ensuite service_ref — plus fort d'abord, une vente conserve une identité stable.

Le registre est en annexe seulement : ne jamais réécrire une vente

Un remboursement, une annulation ou une correction est nouvelle entrée datée. Ne mutez jamais la ligne qu'il corrige. Réécrire un paiement en remboursement semble rangé et casse trois choses à la fois:

Il détruit les recettes brutes

Le taux de vente et de remboursement brut cesse d'être séparable — et le taux de restitution est la mesure que l'inversion existe pour informer.

Il enregistre le renversement dans la mauvaise période

Un remboursement de mars d'une vente de janvier doit réduire Mars. Réécrire la rangée de janvier en silence répète une période fermée.

Il casse la piste de vérification

Un registre enregistre ce qui s'est passé à un moment donné. Les corrections sont des contre-engagements, ce qui est la façon dont la tenue de livres d'entrée double a fonctionné pendant cinq siècles.

Donc un connecteur signale l'inversion plutôt que de l'appliquer : retour refunded_at et refund_amount Le client peut aussi faire un rapport sur la vente, et le client doit écrire le remboursement comme sa propre ligne datée du moment où le remboursement a été effectué.

💡
Le même principe s'applique aux montants. Ne pas "réparer" un montant stocké à la valeur courante de la plateforme : une facture réglée à partir du crédit de compte enregistré légitimement 0 au moment du paiement, et l'argent était déjà enregistré lorsque le client a augmenté.

Le contrat de classification

OpsIQ décide du cycle de vie une fois, in \OpsIQ\Commerce\SaleLifecycleClassifier. Un connecteur ne déclare que lequel des sa propre plateforme les mots signifient ce que, en mettant en œuvre \OpsIQ\Connectors\SalesLifecycleConnectorInterface::salesLifecycleVocabulary(), puis appelle le classificateur partagé. Ne pas ré-appliquer le raisonnement.

Déclarez le vocabulaire, délèguez la décision
public static function salesLifecycleVocabulary(): array
{
    return [
        'credit'             => ['addfunds'],                  // adds balance, sells nothing
        'upgrade'            => ['upgrade'],                   // resizes an existing commitment
        'recurring'          => ['hosting', 'domainrenew'],    // continues something owned
        'acquisition'        => ['domainregister'],            // obtains something new
        'recurring_prefixes' => ['domainaddon'],               // families that grow over releases
    ];
}

$lifecycle = \OpsIQ\Commerce\SaleLifecycleClassifier::classify([
    'explicit'    => $platformSaidSo,     // wins outright when present
    'line_types'  => $types,              // your platform's own line/item types
    'vocabulary'  => self::salesLifecycleVocabulary(),
    'is_order'    => $cameFromANewOrder,
    'is_refunded' => $moneyWentBack,
]);
💡
La priorité est fixe et partagée : explicite, puis remboursé/annulé, puis crédit, puis mise à niveau, puis is_order, puis récurrent, puis acquisition, puis inconnu. Mise à jour se situe au-dessus de la vérification de commande car les plateformes soulèvent une commande pour des mises à niveau aussi; régular se trouve en dessous parce que la première facture d'un nouvel abonnement porte un type de ligne récurrent.

Déclarez la plateforme tout le vocabulaire

C'est l'échec qui coûte le plus cher et qui semble le moins faux.WHMCS connecteur assorti ['hosting','addon','domain'] — une liste qui se lit comme complète.WHMCS n'émet pas de nu Domain type pour les lignes de domaine réelles; il émet DomainRegister, DomainRenew, DomainTransfer, PromoHosting, PromoDomain, DomainAddon* et Upgrade. Tous sont tombés au-delà de la liste unknown: 1,288 factures, trois ans, aucune erreur et aucune ligne de journal.

Chaque nouveau client importe son histoire par un remblayage de connecteur, donc un bug de classification n'affecte pas un espace de travail — il affecte chaque espace de travailler qui jamais à bord à travers ce connecteur, au moment où ils regardent leur pipeline. préfixe Ainsi, un frère et une sœur que personne n'a vus se classe avec ses proches au lieu de disparaître.

💡
Un bon connecteur de vente classe presque tout. Un flux constant d'inconnu est presque jamais les données que vous n'avez pas — c'est un vocabulaire que le connecteur n'a jamais appris à lire.

Réparation de l'historique importé

Chaque connecteur de vente expédié OpsIQ implémente ce — WHMCS, Shopify, WooCommerce, osCommerce, SaaS Bridge, Stripe, BigCommerce and Magento 2. Treat it as expected, not optional: a customer imports their old records on day one, so a classification fix that cannot reach that history only helps people who signed up afterwards. Implement \OpsIQ\Connectors\SalesLifecycleRepairInterface::reclassifySale() en utilisant n'importe quel fichier récupérer votre connecteur a déjà. tools/crm_backfill_sales_lifecycle.php puis répare votre connectique , sans code de connexion : sec par défaut, se recule et vérifie le nombre de lignes avant d'écrire, réversible à travers un registre défaire, et il n'écrit jamais une lecture ratée comme réponse.

💡
Si votre connecteur ne peut pas relire les enregistrements passés — un connecteur webhook seulement ne peut — ne pas piéger la méthode. Un stub retour inconnu est pire qu'aucune implémentation: un remblayage réécrirait de bonnes lignes comme non classifiées et rapporterait le succès. Implémentez l'interface vocabulaire uniquement.
💡
Les références détaillées des paquets restent disponibles dans connectors/CONNECTOR_EVENTS. md et connectors / PLATFORM_CONNECTORIS. md dans les distributions de sources auto-hébergées.
Connecteurs

Contrat d'événement de voyage

Journey Intelligence accepte une enveloppe d'événement neutre par rapport à la plateforme provenant du widget de navigateur, des connecteurs intégrés, du pont SaaS, des packages de marché et de la sortie de Connector Builder.

Isolation et limite de confiance

Clé de domaine pair exacte

Chaque événement est lié à la clé site_key du domaine authentifié. Un connecteur doit obtenir cette clé depuis ConnectorRegistry ou son point de terminaison authentificable, et jamais depuis un corps de requête non approuvé. Les domaines conservent des enregistrements distincts; un groupe de domaine n'est qu'un agrégat en lecture.

Identité indéterminée

Les retentatives, les webhooks et les remplissages de données effectuent la mise à jour d'un événement plutôt que de dupliquer un parcours ou une vente.

Nom natif plus nom canonique

Préservez source_event_name pour les besoins de la preuve et du dépannage, puis mappez-le sur event_name_canonical.

Le serveur gagne

L’observation du navigateur peut amorcer ou déduire un parcours. Les événements authentifiés du connecteur confirment l’inscription, la connexion, le paiement, l’achat, le renouvellement, le remboursement et d’autres résultats finaux. Un jeton de corrélation valide et lié au site constitue la jointure la plus fiable ; un jeton invalide est rejeté et les identifiants qu’il contient ne sont pas considérés comme fiables.

Confidentialité

Envoyez uniquement les identifiants et champs nécessaires au voyage déclaré. Respectez les paramètres de consentement, de masquage et de conservation Ne placez jamais d’identifiants, de données de carte, de secrets d’authentification ou de corps de message privé dans des propriétés.

Enveloppe canonique

Enveloppe d'événement de voyage
{
  "contract_version": 1,
  "event_id": "myshop:order:884:paid",
  "source": "myshop",
  "source_event_name": "order.paid",
  "event_name_canonical": "commerce.purchase.completed",
  "site_key": "exact_domain_site_key",
  "occurred_at": "2026-07-23T08:30:27Z",
  "visitor_id": "optional-browser-visitor",
  "session_id": "optional-browser-session",
  "journey_id": "optional-journey",
  "attempt_id": "optional-attempt",
  "correlation_token": "optional-signed-token",
  "customer_ref": "C-42",
  "user_email": "[email protected]",
  "object_type": "order",
  "object_ref": "884",
  "order_ref": "884",
  "outcome": "succeeded",
  "evidence_level": "server_confirmed",
  "confidence": 1,
  "properties": {"amount": 129, "currency": "USD"}
}

Taxonomie canonique

Les familles prises en charge incluent les événements de page d’engagement/CTA, l’inscription au compte, la connexion, l'authentification multifacteur et la réinitialisation du mot de passe, les étapes de prospect et de formulaire, le produit, le panier, la caisse, le paiement, l‘achat, l´abonnement, le renouvellement et le remboursement, les impressions et conversions de promotion, les activités liées aux centres d’aide, au chat et aux tickets, les évènements de sécurité et les opérations personnalisées dans des espaces de noms. account.signup.succeeded, account.login.succeeded, lead.form.succeeded, commerce.payment.succeeded, commerce.purchase.completed, commerce.subscription.renewed et commerce.refund.completed.

Inférence, confirmation et abandon du navigateur

Le widget peut fonctionner sans connecteur en observant la structure de la page, les actions du formulaire, les résultats DOM et le journal du parcours du visiteur. Cette preuve reste explicitement notée comme observée ou inférieure. Un connecteur ajoute une confirmation faisant autorité du serveur et peut la corréler à la même tentative de navigateur. L'abandon est d'abord stocké comme candidat; il devient abandonné seulement après la fenêtre d'inactivité définie dans l'interface utilisateur et uniquement lorsqu'il n'existe aucune récupération ultérieure ou aucun succès.

Attribution et revenus

L'attribution privilégie un jeton de corrélation signé valide, puis une référence exacte au parcours, à la tentative, à l'activité ou au commerce, puis le graphique d'identité acceptée et enfin une correspondance comportementale limitée. Les ventes non appariées restent sans attribution. Les pondérations du grand livre multi-touch doivent totaliser 1.

⚠️
Le modèle d'attribution, les fenêtres de rétroaction, la gestion du trafic direct, le niveau minimum de confiance, le délai d'abandon et les définitions d'entonnoir sont des règles d'interface utilisateur.

Connecteur manifeste et Builder

Déclaration de trajet du connecteur
{
  "capabilities": ["sales", "journey_events"],
  "journey_capabilities": {
    "journey_events": true,
    "payments": true,
    "subscriptions": false,
    "correlation_token": false,
    "backfill": true
  },
  "journey_event_mappings": [{
    "source_event_name": "order.paid",
    "event_name_canonical": "commerce.purchase.completed",
    "field_map": {
      "order_ref": "order.id",
      "customer_ref": "order.customer_id",
      "amount": "order.total",
      "currency": "order.currency",
      "occurred_at": "order.paid_at"
    }
  }]
}

Connector Builder valide le mappage et génère la même carte neutre par rapport à la plateforme utilisée par les packages propriétaires. L'ingestion de trajet accepte un événement ou un lot limité de 100 via le point de terminaison d'intégration authentifié généré.

💡
Le pont commerce-to-journey publie les résultats confirmés par le serveur et réconcilie l'attribution après la mise en avant du grand livre idempotent existant, de sorte qu'un paiement ne devient jamais deux ventes.
Connecteurs

Comment fonctionnent les actions d'IA

Chaque connecteur déclare un ensemble d'actions, c'est-à-dire des choses que l'IA peut faire via la plateforme externe. Les actions sont le pont entre ce que dit l'AI et ce qu'elle fait.

Actions d'AI
Comment fonctionnent les actions d'IAUne demande client mappée à une carte d'action de type suppression, puis une liste de contrôle: permission vérifiée, vous confirmez, API appelé.Comment fonctionnent les actions d'IAespace de travail"Annuler mon abonnement"clientIAcancel_subscriptiondeleteConfirmer requisparams: subscription_id (à partir du contexte)TYPES D'ACTIONreadécriredeleteAutorisation & rôle vérifiésVous confirmez l'actionAPI appelé · résultat signalé1DECLAREDChaque connecteur répertorie des actions2GATEDAutorisation + confirmer3THEN RUNAPI appel, retour du résultat
Une requête devient une action déclarée (lit/écrit/supprimé) qui est vérifiée, confirmée, puis exécutée et rapportée.

Le cycle de vie des actions

1
Le client demande quelque chose

"Annuler mon abonnement." L'IA identifie que cela nécessite l'action "cancel_subscription".

2
L'IA vérifie les autorisations

Cette action est-elle autorisée? Est-elle activée ; l'utilisateur actuel a-t-il le bon rôle?

3
L’IA recueille des paramètres

L’action nécessite un ID d’abonnement que l’IA recherche dans le contexte client ou demande au client.

4
Confirmation

Pour les actions destructrices ou à fort impact, l’IA demande une confirmation avant d’exécuter.

5
Exécution

L'action appelle la plateforme externe API.

6
Résultat

L’IA rapporte le résultat au client.

Types d'action

Lire les actions

Recherchez des données sans rien modifier, par exemple list_orders ou get_customer. Sûre, aucune confirmation nécessaire.

Écrire des actions

Créer ou modifier des données. Exemples: create_ticket, update_order. Peut nécessiter une confirmation.

Supprimer les actions

Supprime les données. Exemples: annuler_abonnement. Toujours demander confirmation.

Actions HTTP

Déclaré dans les actes.json, générique API les appels définis de manière explicite.

Étiquettes de capacité

Champ facultatif de « capacité » par action dans les actions.json, une étiquette de classe neutre (p. ex. "tickets" pour une lecture/lookup de ticket, "tecket_create" pour ouvrir un ticket).OpsIQ permet à toute la classe d'accéder uniformément à chaque connecteur : le ticket lit les gouttes de l'IA lorsque l'opérateur désactive la sensibilisation au billet AI, et la création du ticket est réservée OpsIQ's propre compositeur (ainsi un outil de création de connecteur ne peut pas le reproduire).OpsIQ jamais besoin de connaître vos noms d'action. Le Constructeur de connecteurs l'expose comme un déroulant Capacité par action.

Actions du code

Implémenté en PHP dans la classe connecteur. Contrôle total sur la logique.

Exemple de définition d'action
{
  "lookup_order": {
    "label": "Look up an order",
    "description": "Find an order by ID or email",
    "method": "GET",
    "endpoint": "/admin/api/2024-01/orders.json",
    "params": {
      "order_id": { "type": "string", "label": "Order ID" },
      "email":    { "type": "email",  "label": "Customer email" }
    }
  }
}
Connecteurs

Construisez un connecteur

Le Connector Builder vous permet de créer un connecteur complet pour n'importe quelle plateforme avec une interface REST API. Aucun codage requis pour les connecteurs de base.

Construisez un connecteur
Constructeur de connecteursUn formulaire de connecteur sans code: nom, type d'authentification, base URL, un mappage d'action, un test de réussite et un bouton de publication.Constructeur de connecteursespace de travailConstructeur de connecteursNomMa plateformeResp.: Ministère de l'Economie et des FinancesOAuth 2.0(PKCE)Base URLhttps://api.example.com/v2DécisionGET/customers → liste des clientsTest réussiConnecteur de paquet1NO-CODENom, auth, base URL2ANY APIClé, Bearer, de base, HMAC, _OAuth3PUBLISHInto /connectors/<slug>/
Pointez le constructeur à n'importe quel REST API. Régler auth, base URL et les actions, testez-le, et publiez un connecteur de travail. Pas de code nécessaire.

Couverture complète du fournisseur API

Chaque généré API Le connecteur peut exposer des composants séparés.API Read and Native API Les actions sélectionnées restent préférées; les actions natives couvrent les points de terminaison du fournisseur ajoutés ultérieurement. L'exécution prend en charge REST, GraphQL, JSON, forme, XML, corps bruts et en plusieurs parties, pagination limitée,API-version des en-têtes et idempotence tout en conservant les informations d'identification dans les paramètres du connecteur de l'espace de travail.

⚠️
Les paquets du marché proviennent de. /marketplace_connectors ainsi que groupé /connectors. Augmentez la version du package, régénérez le contrat et la documentation, exécutez des tests de conformité, puis signez à nouveau et publiez la nouvelle version Marketplace.

Assistant Connector Builder

L'assistant comporte six étapes, affichées sous forme d'onglets en haut de l'écran. Enregistrer le brouillon Le bouton dans le pied de page garde votre travail à tout moment.

1
Identité et profil

Nom, limace, description et icône, puis choisir un profil de contrat: Standard API_, Commerce, Helpdesk, Mailbox, Site Intelligence, SaaS Bridge, Local PHP Platform, ou Plateforme avec noAPI lorsque la plate-forme ne sert rien d'appelable et que OpsIQ doit installer un pont. Le profil sélectionne un point de départ complet de la capacité; vous pouvez toujours ajuster les capacités individuelles.

2
Resp.: Ministère de l'Economie et des Finances

Choisissez le modèle d'authentification utilisé par la plateforme et remplissez ses champs. Entrez ici également les vraies informations d'identification de test. Elles sont utilisées pour le test de connexion à l'étape suivante, et ne sont pas stockées après la publication.

3
Essai

Entrez la API de base URL et un paramètre de vérification, puis exécutez un test de connexion en direct en utilisant les identifiants de l'étape 2. Faites ceci avant de définir des actions, si l'auth ou la base URL est faux, chaque action que vous écrivez après échouerait pour la même raison et vous débogez la mauvaise chose.

4
Actions

Définissez chaque opération: nom, méthode HTTP, chemin d'accès au point de terminaison, paramètres, mappage des champs de réponse et les paramètres de fiabilité décrits ci-dessous. Vous pouvez exécuter chaque action individuellement contre le API en direct à partir de cette étape.

5
Déclencheurs

Mappez les événements webhook que votre plateforme envoie sur des évéements OpsIQ, afin que les choses qui se produisent sur votre plate-forme puissent commencer à fonctionner dans _OpsIQ.

6
Relecture, contrat entreprise et publication

Review every action, trigger and capability. Enterprise profiles expose the generated queue, worker, hook, migration, ticket-mirror, attachment and conflict contract before publishing. Publishing writes the package into /connectors/<slug>/.

⚠️
Publier ne valide que le formulaire de l'assistant et émet des avertissements qui ne bloquent pas. La suite complète — manifeste, fichiers de capacité, contrat d'identité-ticket et la vérification bridge-snipet — fonctionne lorsque vous appuyez sur Dry-run, et encore à l'installation. Appuyez sur Dy-rune avant d'expédier, à chaque fois.

Que fait la publication que le formulaire ne vous montre pas

Cinq comportements du générateur surprennent les gens. Aucun n'est un bug; tous vous coûteront un après-midi si vous les rencontrez par accident.

Une question décide de la transmission : la plate-forme sert-elle un API ?

Répondez-le en un rien de temps1en sélectionnant le mode d'accès aux données (ou le "Platform avecAPI" profil " .APIle mode déclare native_api and emits the <slug>_api_call passthrough. Bridge mode declares platform_bridge et les STRIPS native_api même si une spécification plus ancienne la portait, de sorte que le manifeste, la classe générée et les documents d'expertise ne peuvent pas être en désaccord. ai_brain_aware est ajouté de toute façon.

SILENCE MENSUE "il a un API"

Le Constructeur suit votre réponse ; il ne fonctionne pas la vérité pour lui-même, et le défaut quand rien n'est dit estAPIDonc, un non-APIla plate-forme doit le dire ACTIVEMENT — choisissez la "Platform sansAPI" profil, accès aux données de la passerelle ou tic platform_bridge; any one of the three is enough and they cannot contradict each other. Skip the question on a platform with no API and you are back to the old failure: a dead <slug>_api_call the model keeps reaching for. This used to be stamped unconditionally, so the trap is now escapable rather than gone.

Le test de connexion par défaut pour GET /ping

Si vous laissez le chemin de vérification vide, le constructeur écrit /ping dans le connecteur généré et dans le profil.json's test block. Presque aucune plate-forme réelle ne sert cette route, donc Test Connection échoue avec HTTP404sur chaque installation et se lit comme une erreur de configuration du client plutôt qu'un défaut de paquet. Définissez un chemin de vérification que votre plateforme répond réellement. Pour un connecteur de pont, pointez-le à votre propre paramètre de diagnostic — cela prouve toute la chaîne en un seul appel: le pont est déployé, la clé correspond, et le pont peut atteindre la base de données.

Re-publier toujours écraser vos éditions main

Les capacités suivent maintenant la réponse data-access, de sorte que ceux qui ne dérivent plus. Tout le reste généré fait toujours: éditer ContextProvider. php ou tout autre fichier émis et publier suivant le remplace. La seule exception protégée est le fichier bridge — l'assistant écrase seulement un pont portant son propre marqueur, donc un manuscrit est laissé seul.

La publication des fichiers supprime

Désactivez une fonction et la publication suivante supprime son fichier fournisseur. Les modifications apportées à n'importe quel fichier généré — ContextProvider.php surtout — sont écrasées sans avertissement. Copiez d'abord les personnalisations ou prenez possession du paquet en supprimant .opsiq- Constructeur.json(après quoi l'assistant ne le gérera plus).

release_status est toujours prévisualiser

L'assistant n'a aucun contrôle pour elle. Un paquet destiné à expédier comme production doit avoir release_status changé à la main dans les paramètres.json— et que la modification rompt la signature, donc resigner ensuite.

La signature prouve l'intégrité, pas l'origine

Les paquets de constructeur sont signés avec la propre clé symétrique de cette installation. Cela détecte les manipulations. Il ne prouve pas qui a écrit le paquet, et toute installation tenant la même clé peut produire la même signature. Traiter un paquet signé localement comme autosigné.

Les collisions de boue ne sont vérifiées que dans un arbre

L'édition refuse une limace qui existe déjà sous/connectors/.Il ne regarde pas/marketplace_connectors/,Donc un paquet de première partie avec la même limace peut finir par shadowed.

💡
Un fichier de connaissances décrivant votre plateforme est généré pour vous à partir du nom, de la description, du type d’authentification et des actions que vous avez définis. Il est chargé dans l’IA lorsque le connecteur est activé. After the connector is enabled, it is loaded into the AI.

Définir une action (étape 4)

Seuls les quatre premiers paramètres sont requis, le reste est défini par l'utilisateur qui peut exécuter l'action et avec quel soin.

Clé et étiquette d'action

La clé est ce que l'IA appelle, et le label est ce qu'un humain lit. Les clés sont automatiquement associées à votre slug de connecteur. Deux connecteurs peuvent donc avoir tous deux un "list_orders" sans entrer en collision.

Méthode HTTP

GET, POST, PUT, PATCH ou DELETE.

chemin URL

Annexé à la base URL. Utilisation {name} Pour les espaces réservés, par exemple /opportunities/{id}/stage

Paramètres

Pour chaque paramètre, vous choisissez également où il va: corps, chemin, requête ou en-tête. Un paramètre path remplit un. {placeholder}; un paramètre de requête est ajouté à la URL.

Cartographie des réponses

Dites quel champ de la réponse JSON signifie ce qui, qui est le nom du client, qui correspond au courriel, qui représente le total des commandes. C'est ce qui permet à l'IA de lire les données de votre plateforme plutôt que de deviner.

Qui peut l'utiliser

Votre équipe (IA d’administration), les clients connectés (chat client), les deux ou l’assistant de rédaction. Les actions client s’exécutent uniquement pour le client connecté, et les champs d’identité sont verrouillés automatiquement afin qu’un client ne puisse pas poser de questions sur un autre.

Nécessite confirmation

Un humain doit approuver avant que l'action ne s'exécute.

Destructif

Marque l'action comme supprimant ou changeant d'état. Utilisé pour avertir avant son exécution.

Permission requise

L'administrateur doit détenir cette autorisation pour que l'IA exécute l'action en son nom; les administrateurs complets passent toujours. Choisissez parmi get_integrations, geten_general, geat_billing, gate_sales_bridge, gesten_knowledge, gage_comportement, glean_permissions, manage_dangerzone, reply_to_chats, greating_to _ticket, send_agent_email ou aucun, ce qui signifie qu'il y a un administrateur authentifié.

Description / indice AI

Optionnel, mais il vaut la peine d'être écrit. Il indique à l'IA quand elle doit utiliser cette action, par exemple "Utiliser ceci lorsque l'administrateur demande de changer une étape du deal". Un bon indice est la différence entre une action que l'AI utilise correctement et celle qu'elle ignore.

Capacité

En option, les tickets (un ticket lu ou recherché) ou ticket_create (ouvre un ticket). Le marquage permet à OpsIQ de bloquer toute la classe en même temps, par exemple, le billet caché lit lorsqu'un opérateur désactive la sensibilisation au ticket AI.

Chemin de la liste

Pour les points de terminaison qui renvoient une liste, le chemin pointillé vers le tableau, par exemple data ou data. items

Chemin d'erreur

Facultatif. Un champ de corps dont la présence signifie que l'appel a échoué, par exemple error.message, utile pour APIs qui renvoie HTTP 200 en cas d'échec.

Exécutez-le

Chaque action peut être exécutée sur le API en direct à partir de cette étape, vous pouvez donc corriger un chemin ou nom de champ erroné avant que quelqu'un d'autre ne l'utilise.

⚠️
Toute action utilisant POST, PUT, PATCH ou DELETE nécessite au départ l'autorisation manage_integrations (voir la section sur les permissions de gestion des intégrations). et Une nouvelle action d'écriture échoue fermée plutôt que de laisser l'IA changer vos données sans supervision. Vous pouvez changer à la fois sur l'action, mais les changer sciemment.
💡
Pour être appelée depuis le chat client, une action doit être en lecture seule. Laissez les options Requires confirmation et Destructive décochées. Une action qu'un client peut déclencher qui change également l'état n'est pas quelque chose que l'assistant vous laissera expédier par accident.

Réception de webhooks (étape 5)

L'étape Triggers vous donne un webhook URL pour s'inscrire sur votre plateforme, et vérifie chaque requête qui arrive sur elle.

En-tête de signature

L'en-tête avec lequel votre plateforme signe, par exemple X-Hub-Signature-256.

Algorithme de signature

HMAC-SHA1, HMA C-SHA256 ou HMA-SHA512.

Système de signature

Simple, un hexagone simple ou une base64 digest.Stripe-style, le format t=...,v1=... utilisé parStripeet plusieurs plateformes qui l'ont copié.

Préfixe de signature

Certaines plateformes préfixent le digest, par exemple sha256=. Laissez-le vide si la vôtre ne l'a pas fait.

Mappings d'événement

Mapper chaque événement que votre plateforme envoie sur l'événement OpsIQ qu'elle devrait générer.

Enregistrement automatique du webhook

Si votre plateforme dispose d'un API Pour gérer ses propres webhooks, vous n'avez pas besoin d'enregistrer le. URL Fabriqué à la main. Ouvrir Enregistrer automatiquement ce webhook sur enable et pointez-le sur deux des actions que vous avez définies à l'étape 4:

Action Create-webhook

Vous donnez le nom du paramètre qui contient URL, éventuellement celui qui contiens la liste des évènements et le chemin dans la réponse qui contien l'identifiant du nouveau webhook.

Action Delete-webhook

Appelé lorsque le connecteur est désactivé, en utilisant l'identifiant capturé ci-dessus. La désactiver arrête donc également votre plateforme d'envoyer vers un point de terminaison mort.

Des fonctionnalités que vous pouvez activer

Les profils et les capacités sont définis par le contrat de connecteur 2.2. Les capacités générées et déclaratives sont émises directement; les capacité EnterpriseExtension.php Échafaudage avec câblage de cycle de vie.

Actions

Opérations que l’IA peut exécuter sur votre plateforme : liste des commandes, recherche d’un client, émission d’une facture.

Déclencheurs

Recevez des webhooks de votre plateforme et transformez-les en événements OpsIQ.

Billets AI

AI Triage et le copilote de réponse sur les tickets qui restent sur votre plateforme. Choisissez l'endpoint qui renvoie un ticket avec ses réponses et mappez les champs; OpsIQ lit le thread à travers lui.

Boîte aux lettres et contacts

Affichez le courrier d'un client sur sa timeline, envoyez à partir d'une offre et synchronisez votre carnet d'adresses dans l'application. OpsIQ CRM.

Importation de client

Parcourez votre liste de clients et importez chacun d'eux en tant que contact OpsIQ, c'est ce que fait le bouton Importer.

Contexte

Insérez les données en direct de votre plateforme dans chaque conversation d’IA.

Identité

Déterminez lequel de vos clients est un visiteur et affichez son profil et ses achats sur un ticket.

Ventes et facturation

Insérez les événements de revenu et les chiffres MRR dans les tableaux de bord OpsIQ.

Billets d'entrée

Transformez les tickets et e-mails que votre plateforme livre par webhook en fils de support OpsIQ.

Réponses sortantes

Le staff de OpsIQ répond à la plateforme sur laquelle le fil a été créé.

Synchroniser les utilisateurs

Importez vos comptes de personnel dans les utilisateurs OpsIQ admin.

Synchroniser les départements

Importez vos services de support dans OpsIQ.

Ciblage promotionnel et flux de produits

Laissez Promotion Studio cibler les faits que vous connaissez sur une personne et affichez vos produits réels dans une promotion.

Fournisseur Survey Studio

Exposez les faits de l'enquête vérifiés par le serveur, les variables échappées et les pages des destinataires CRM Outreach délimitées via un fichier SurveyProvider. php dédié.

Blocage natif de IP

When OpsIQ blocs an IP, appelez le bloc propre à votre plateforme. API Donc le blocage est appliqué là aussi.

Événements de sécurité

Recevoir bloqué-IP Signaux de menace provenant de : OpsIQ.

Connaissance de la plateforme pour l’IA

Chaque connecteur que vous créez est livré avec une courte référence décrivant ce qu'est votre plateforme et ses actions. L'IA d'administration OpsIQ la lit chaque fois que votre connecteur est activé, de sorte qu'elle comprend votre plate-forme plutôt que de simplement voir une liste des noms d'actions.

API passage

Votre connecteur reçoit toujours un appel à usage général afin que l'IA puisse atteindre un point de terminaison pour lequel vous n'avez pas défini d'action typée. Utilisez des actions typées lorsque c'est possible; il s'agit du trapèze d'échappement.

Contrat de connecteur canonique 2.2 Référence

Version du contrat : 2.4 · 57 capabilities · 8 profiles.

Profils de connecteur

standard_api · Standard REST or GraphQL API

Actions, triggers, OAuth/API-key authentication and optional context/identity mappings. Capabilities: actions, triggers, native_api, ai_brain_aware.

commerce · Commerce and billing platform

Customers, orders, sales, subscriptions, billing, promotions and journey events. Capabilities: actions, triggers, journey_events, sales, sales_reconciliation, billing, sync_orders, customer_import, survey, promo_audience, promo_feed, context, identity.

helpdesk · Helpdesk and ticket platform

Inbound tickets, outbound replies/notes, customer roster, AI triage and bidirectional ticket mirroring. Capabilities: actions, triggers, inbound_ticket, outbound_reply, outbound_note, ai_tickets, customer_import, survey, context, identity, ticket_mirror, ticket_merge, attachment_bridge, conflict_resolution.

mailbox · Mailbox and email provider

Inbound/outbound mail, address-book sync, multi-account OAuth and CRM timeline integration. Capabilities: inbound_email, outbound_email, mailbox, email_mailbox, oauth, actions, customer_import, ai_reply.

site_intelligence · Site Intelligence data provider

SEO, analytics, search-console, local-search or monitoring provider with scheduled sync. Capabilities: actions, triggers, site_intelligence, seo, scheduled_workers, durable_queue.

saas_bridge · SaaS bridge

Deep two-way SaaS integration with customers, billing, identity, tickets, webhooks, queues, attachments and workers. Capabilities: actions, triggers, webhook, context, identity, customer_import, survey, journey_events, sales, sales_reconciliation, billing, inbound_ticket, outbound_reply, ticket_mirror, ticket_merge, attachment_bridge, durable_queue, scheduled_workers, database_migrations, conflict_resolution, enterprise_hooks, admin_assets.

no_api_bridge · Platform with no API (OpsIQ installs a bridge)

For a self-hosted PHP application that serves no callable API. The wizard generates a signed bridge file the operator drops into their own site, plus the typed actions that read and write through it. Capabilities: actions, platform_bridge, ai_brain_aware.

local_php_platform · Local PHP platform bridge

WHMCS-style local hooks, database access, two-way tickets, billing/customer sync, queues and migrations. Capabilities: actions, native_data, context, identity, customer_import, survey, journey_events, sales, sales_reconciliation, billing, inbound_ticket, outbound_reply, ticket_mirror, ticket_merge, attachment_bridge, durable_queue, scheduled_workers, database_migrations, conflict_resolution, enterprise_hooks, admin_assets.

Capacités canoniques

Mesures prises

Universal actions. Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: actions.json.

déclencheurs

Inbound event triggers. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Package files: actions.json.

webhook

Inbound webhook endpoint. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook.

journey_events

Universal Journey Event Contract mapping. Capability version: 1.1. Mode: generated. Interfaces: OpsIQ\Connectors\JourneyEventConnectorInterface. Package files: settings.json.

contexte

AI context providers. Capability version: 1.0. Mode: generated. Runtime methods: contextProviders. Interfaces: OpsIQ\Connectors\ContextConnectorInterface. Package files: ContextProvider.php.

guest_lookup

Guest record lookup without login (reference + proof match). Capability version: 1.0. Mode: generated. Runtime methods: contextProviders. Interfaces: OpsIQ\Connectors\ContextConnectorInterface. Package files: GuestLookupProvider.php.

identité

Admin/customer identity providers. Capability version: 1.0. Mode: generated. Runtime methods: identityProviders, detectAdmin, detectCustomer. Interfaces: OpsIQ\Connectors\IdentityConnectorInterface. Package files: IdentityProvider.php.

sales

Sales and revenue ingestion. Capability version: 1.2. Mode: generated. Interfaces: OpsIQ\Connectors\CommerceConnectorInterface. Package files: SalesIngest.php.

sales_reconciliation

Scheduled sales-ledger reconciliation against the platform. Capability version: 1.0. Mode: generated. Runtime methods: reconcileSales. Interfaces: OpsIQ\Connectors\SalesReconciliationInterface.

facturation

Cross-platform billing snapshot. Capability version: 1.0. Mode: generated. Runtime methods: billingProviders. Interfaces: OpsIQ\Connectors\BillingConnectorInterface. Package files: BillingProvider.php.

payments

Payment-provider capability bus. Capability version: 1.0. Mode: generated. Runtime methods: paymentsCapabilities.

commerce

Sell through chat: canonical commerce role map. Capability version: 1.0. Mode: declarative. Package files: commerce_roles.json.

inbound_ticket

External ticket/email to OpsIQ ticket ingestion. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface.

outbound_reply

Reply mirroring to the external platform. Capability version: 1.0. Mode: generated. Runtime methods: pushReply. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface.

ticket_merge

Ticket merges applied on the platform (native merge or private transcript note). Capability version: 1.0. Mode: generated. Runtime methods: mergeTickets. Interfaces: OpsIQ\Connectors\TicketMergeConnectorInterface.

sync_users

Staff/customer synchronisation. Capability version: 2.0. Mode: generated. Runtime methods: listCustomers. Interfaces: OpsIQ\Connectors\CustomerImportConnectorInterface. Package files: SyncImport.php.

sync_departments

Department/team synchronisation. Capability version: 1.0. Mode: generated. Package files: SyncImport.php.

sync_orders

Order roster and order-event synchronisation. Capability version: 1.0. Mode: declarative. Interfaces: OpsIQ\Connectors\CommerceConnectorInterface.

sync_products

Product, catalog and inventory synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

sync_projects

Project, issue and workspace synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

customer_import

CRM customer roster import. Capability version: 2.0. Mode: generated. Runtime methods: listCustomers, backfillChunk. Interfaces: OpsIQ\Connectors\CustomerImportConnectorInterface.

security_events

Receive and emit security events. Capability version: 1.1. Mode: generated. Runtime methods: securityCapabilities, syncBlockedIp, removeBlockedIp. Interfaces: OpsIQ\Connectors\SecuritySyncConnectorInterface.

security_native_block

Native remote IP/CIDR blocking. Capability version: 1.0. Mode: generated. Runtime methods: syncBlockedIp, removeBlockedIp. Interfaces: OpsIQ\Connectors\SecuritySyncConnectorInterface.

survey

Survey identity, audiences, recipients and variables. Capability version: 1.0. Mode: generated. Runtime methods: surveyAudienceCatalog, surveyAudienceFacts, surveyVariableCatalog, surveyVariables, surveyRecipientPage. Interfaces: OpsIQ\Connectors\SurveyConnectorInterface. Package files: SurveyProvider.php.

reply_feedback

Ticket reply feedback mirror (platform reply ratings land via the portal write method). Capability version: 1.0. Mode: generated. Runtime methods: replyFeedbackCatalog, pullReplyFeedback. Interfaces: OpsIQ\Connectors\ReplyFeedbackConnectorInterface.

promo_audience

Promotion targeting facts. Capability version: 1.0. Mode: generated. Runtime methods: subscribers. Interfaces: OpsIQ\Connectors\PromotionConnectorInterface.

promo_feed

Promotion product/content feed. Capability version: 1.0. Mode: generated. Interfaces: OpsIQ\Connectors\PromotionConnectorInterface.

email_mailbox

Mailbox bus, outbound mail and address-book sync. Capability version: 1.0. Mode: generated. Runtime methods: emailAccounts. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

inbound_email

Receive inbound email. Capability version: 1.0. Mode: declarative. Runtime methods: poll, handleWebhook. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

outbound_email

Send outbound email. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

mailbox

Mailbox connector. Capability version: 1.0. Mode: declarative. Runtime methods: emailAccounts. Interfaces: OpsIQ\Connectors\MailboxConnectorInterface.

ai_tickets

AI triage and Inbox Copilot for remote tickets. Capability version: 1.0. Mode: generated. Runtime methods: loadTriageContext. Package files: AiOperations.php.

ai_reply

AI-assisted reply drafting. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

ai_brain_aware

Connector expertise supplied to Admin AI. Capability version: 1.0. Mode: generated. Package files: ai_expertise_admin.md, ai_api_reference.md.

native_api

Native API passthrough. Capability version: 1.0. Mode: generated. Runtime methods: registerActions.

platform_bridge

Signed platform bridge (for platforms with no API). Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: bridge/.

native_data

Local database/platform data adapter. Capability version: 1.0. Mode: declarative. Runtime methods: nativeDataProviders. Interfaces: OpsIQ\Connectors\NativeDataConnectorInterface.

CRM

CRM capability provider (calendar, enrichment, telephony or customer data). Capability version: 1.0. Mode: declarative. Runtime methods: crmCapabilities. Interfaces: OpsIQ\Connectors\CrmCapabilityConnectorInterface.

block_registry

Remote sender block-registry synchronisation. Capability version: 1.0. Mode: declarative. Runtime methods: blockSender, unblockSender, isSenderBlocked. Interfaces: OpsIQ\Platform\BlockRegistryInterface.

inbound_comment

Inbound comment ingestion. Capability version: 1.0. Mode: declarative. Runtime methods: handleWebhook.

outbound_note

Outbound private note. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

outbound_notification

Outbound notification delivery. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

oauth

OAuth 2.0 authorisation. Capability version: 1.0. Mode: generated.

reviews

Review ingestion and response. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

Local

Local search/location data. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

seo

SEO data and actions. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

site_intelligence

Site Intelligence provider. Capability version: 1.0. Mode: declarative. Runtime methods: siteIntelligenceProviders. Interfaces: OpsIQ\Connectors\SiteIntelligenceConnectorInterface.

Analyse

Analytics data provider. Capability version: 1.0. Mode: declarative. Runtime methods: analyticsCapabilities.

comms

Communications/video-meeting provider. Capability version: 1.0. Mode: declarative. Runtime methods: commsCapabilities.

admin_assets

Connector-provided admin/account/public browser assets. Capability version: 1.0. Mode: generated. Runtime methods: adminAssets. Interfaces: OpsIQ\Connectors\AdminAssetConnectorInterface.

enterprise_hooks

Platform-native hooks and lifecycle callbacks. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

durable_queue

Durable outbox/inbox queue and retry policy. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.

ticket_mirror

Bidirectional ticket mirror with conflict handling. Capability version: 2.0. Mode: extension. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface. Package files: EnterpriseExtension.php.

attachment_bridge

Attachment upload/download transfer. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.

database_migrations

Connector-owned schema migrations. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

scheduled_workers

Connector-owned scheduled/background workers. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

conflict_resolution

Two-way sync conflict strategy. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

⚠️
Mettez des règles métier spécifiques à la plateforme dans les points d'extension générés; le cycle de vie du package, les files d'attente, les travailleurs, les migrations et les tests de conformité restent gérés par Builder.

Paramètres de fiabilité sur chaque action

Remboursements

Le nombre de fois où un appel échoué doit être réessayé, avec une mise en attente qui double chaque tentative. Seuls les délais d'attente, les erreurs 429s et 5xx sont réessayées. Une erreur 4xx est la faute de votre requête et répéter cette erreur ne ferait que brûler votre limite de débit.

Limite de taux

Un plafond par minute pour cette action, afin qu'un déclencheur occupé ne puisse pas marteler votre plateforme. Laissez-le à 0 pour aucune limite.

Délai

Combien de temps attendre pour votre plate-forme avant d'abandonner.

Confirmation

Exiger qu'un humain approuve l'action avant de la faire fonctionner. Utilisez-le pour tout ce qui est destructeur.

Types d'authentification

Étape 2 vous propose sept modèles. Choisissez celui qui correspond à votre plateforme API documentation, le générateur émet le bon client HTTP pour lui.

API clé dans l'en-tête

Une clé statique envoyée comme en-tête fixe, par exemple X-API Vous donnez le nom de l'en-tête et l'étiquette que le formulaire d'administration doit afficher. Ceci envoie la clé uniquement comme en-têtes; si votre API Si la requête attend que la clé soit un paramètre de requêtes, utilisez des en-têtes personnalisés ou un connecteur à code complet.

Bearer token

Token sent as Authorization: Bearer <token>. Common for modern APIs.

Auth de base

Nom d'utilisateur et mot de passe, encodés en base64 dans l'en-tête Autorisation Vous choisissez les étiquettes que ces deux champs affichent sur le formulaire d'administration.

HMAC-signé

Une clé publique plus un secret, avec le corps de la requête signé Vous donnez l'en-tête de signature, l'entête de la clé et l'entier d'horodatage attendu par votre plateforme.

OAuth 2.0 (informations d'identification du client)

Serveur à serveur, sans interaction utilisateur ni redirection. Vous fournissez le jeton URL et une portée facultative; l'administrateur fournit un ID client et un secret. Utilisez-le lorsque votre plateforme émet des informations d'identification à une application plutôt qu'à une personne.

OAuth 2.0 (Bouton de connexion)

Le flux d'autorisation-code avec PKCE, pour Stripe, Shopify, Slack et des applications de style QuickBooks. Vous donnez l'autorisation URL, le jeton URL Après la publication, l'administrateur clique sur Connecter sur le connecteur, autorise votre plateforme et configure les paramètres de connexion. OpsIQ stocke le jeton de rafraîchissement et les jetons d'accès mints à la demande. URI Pour vous inscrire dans votre. OAuth L'application est affichée sur la page de paramètres du connecteur.

En-têtes personnalisés

A free-form JSON Utilisez la carte d'en-tête pour tout ce que les modèles ci-dessus ne couvrent pas, par exemple {"X-API-Key":"{api_key}","X-Locataire":"{tenant_id}"}. Chaque espace réservé devient un champ sur le formulaire d'administration.

💡
Le flux d'informations d'identification du client n'a pas de redirection et aucune étape utilisateur, PKCE ne s'y applique donc pas.

Styles de pagination

Déduction

Utilise les paramètres offset et limit. Exemple:?offset=100&limit=50.

Page

Utilise le numéro de page. Exemple:? page=3&per_page=_50.

curseur

Utilise un jeton de curseur de la réponse précédente.

En-tête de lien

Utilise l'en-tête de réponse Lien avec rel="next".

Avancé: code PHP personnalisé

connector. php REMURS une instance. Il ne déclare pas une classe nommée pour laquelle OpsIQ chasse. Les noms de méthode ci-dessous sont ceux requis par ConnectorInterface; obtenir un faux est fatal à la charge, pas un avertissement.

connector. php — le contrat réel, minimal et réalisable
<?php
/* connectors/myplatform/connector.php */
declare(strict_types=1);

use OpsIQ\Connectors\AbstractConnector;

require_once __DIR__ . '/Client.php';

return new class extends AbstractConnector {

    /* ── the three identity methods. NOT identifier()/label(). ── */
    public function slug(): string        { return 'myplatform'; }
    public function name(): string        { return 'My Platform'; }
    public function description(): string { return 'Orders and customers from My Platform.'; }

    public function capabilities(): array { return ['actions', 'context']; }

    public function settingsSchema(): array
    {
        $f = __DIR__ . '/settings.json';
        if (!is_file($f)) return [];
        $j = json_decode((string)file_get_contents($f), true);
        return is_array($j['settings'] ?? null) ? $j['settings'] : [];
    }

    /* ── NOTE THE ARGUMENT. testConnection() with no parameter is a fatal. ── */
    public function testConnection(array $settings): array
    {
        try {
            $resp = \OpsIQ\Connectors\MyPlatform\Client::callWithSettings($settings, 'GET', '/me', [], []);
            $code = (int)($resp['http_code'] ?? 0);
            return ($code >= 200 && $code < 300)
                ? ['success' => true,  'info'  => ['message' => 'Connection OK', 'http_code' => $code]]
                : ['success' => false, 'error' => "Verify endpoint returned HTTP $code"];
        } catch (\Throwable $e) {
            return ['success' => false, 'error' => 'Test failed: ' . $e->getMessage()];
        }
    }

    public function onEnable(array $settings): array  { return ['success' => true]; }
    public function onDisable(array $settings): array { return ['success' => true]; }

    public function handleWebhook(array $payload, array $headers, array $settings): array
    {
        return ['success' => true, 'note' => 'No triggers declared.'];
    }

    /* Inherited from AbstractConnector: reads actions.json for you.
     * Override only to ADD actions the manifest cannot express. */
    public function registerActions(array $settings): array
    {
        return parent::registerActions($settings);
    }
};
⚠️
Three things that fatal at class load rather than failing gracefully. The identity methods are slug(), name() and description() — not identifier() and label(). testConnection() TAKES an array of settings; a no-argument version is an incompatible signature. And there is no $this->http() or runAction() on AbstractConnector — HTTP goes through your own Client.php or through an action declared in actions.json.

Miroir des tickets dans le système de billetterie natif

Lorsque votre plateforme possède un ticket, faites-en une copie en miroir dans OpsIQ à partir de votre connecteur en utilisant l'assistant d'ingestion de tickets dont hérite votre connecteurs (créer pour un nouveau ticket, ajouter une réponse pour les suivis). subscribers() méthode, ticket.created, ticket.replied, ticket.updated, ticket.deletedLa réponse automatique, l'escalade, le SLA et le CSAT sont tous liés aux mêmes événements, vous pouvez donc en hériter sans code supplémentaire.

Si vous manipulez ticket.deleted, vous gèrez aussi les fusions. Une suppression de ticket fusionnée porte merged_into et n'est pas envoyé à un connecteur qui déclare ticket_merge; la fusion arrive une fois comme ticket.merged au lieu de cela, vous pouvez fusionner sur votre plateforme plutôt que de fermer le ticket fusionné là. Voir Capacité de fusion des billets (contrat 2.4).

Dites qui a écrit le message d'ouverture

Un billet est toujours pour Le message d'ouverture peut être écrit par le client, mais personnel: un agent qui ouvre un ticket pour le compte du client, ou qui s'adresse à lui de manière proactive. ticket.created Un contrat plutôt que quelque chose que chaque connecteur résout en privé.

author_type

client (par défaut) ou admin. Omettez-le et le client est supposé.

author_id

L'identifiant du personnel lorsque author_type=admin. Jamais l'identi fi de client.

author_name

Nom d'affichage de l'agent ou du service. Revient à « Personnel ».

author_email

L'adresse de l'agent. JAMAIS celle du client. Un message du personnel sous le courriel du client est une erreur de rapport et d'audit.

Ce n'est pas cosmétique. Les consommateurs lisent author_type Une ouverture écrite par le personnel est signalée comme étant la première. client laisse auto-répondre à un message écrit par votre propre agent, et fait l'écho de votre plateforme de cette ouverture ressemble à un nouveau message client, qui se pose alors comme un duplicata et retourne le ticket à répondu. Mappez le signal de votre plateforme sur celui-ci dans les Normalisateur d'événements, jamais dans les consommateurs.

Blocage centralisé

Lorsqu'un agent bloque un expéditeur, cela s'applique à tous les tous les canal immédiatement (e-mail, chat, portail, widget et chaque connecteur jumeau) parce que le bloc est appliqué centralement, avant que n'importe quel connecteur voit le message. Votre connecteur hérite en ne faisant rien. Il n'y a pas de travail entrant pour implémenter et aucun moyen de se tromper.

La moitié facultative est à l ' étranger: indiquer à votre plateforme qu'un client a été bloqué ici, ne l'implémenter que si votre plate-forme peut exprimer quelque chose d'équivalent.

Capabilities()

Doit inclure block_registry ET la classe doit implémenter BlockRegistryInterface. Le drapeau est une revendication; l'interface est la garantie. Le registre nécessite les deux.

blockSender($b)

Récupère type (email|domaine|ip), valeur, raison, admin_id, expires_at, site_key. Retourne [résultat, détail?, référence_distant?].

unblockSender($b)

Même charge utile, inversée. Doit être idémpotente. Débloquer quelque chose qui ne soit jamais bloqué n'est pas une erreur.

isSenderBlocked($b)

Pour le rapprochement, la dérive est donc signalée plutôt que découverte par un client. Retourne [résultat, bloqué?].

Valeurs de résultat

Très bien.

Appliqué sur votre plateforme. Inclure remote_ref quand vous avez un id qui vaut la peine d'être enregistré.

noop

Déjà dans l'état demandé.

unsupported

Votre plateforme n'a pas de concept équivalent. PAS une erreur.

échoué

Vous auriez pu le faire et cela aurait mal tourné. Incluez les détails. Ils entreront dans la piste d’audit.

La réponse correcte est « décliner ». De nombreuses plateformes n'ont pas de concept de « blocage de cet expéditeur » et offrent uniquement la suspension du COMPTE, ce qui arrête la facturation, les connexions et les services plutôt que simplement le courrier d'assistance. En associant « un agent a bloqué une adresse spam » à « fermer le compte de ce client », vous permettrez qu'un seul clic erroné bloque les services d'un client payant. unsupported Et laissez-le tranquille.

Le refus couvre également le cas où la plateforme peut Vous ne pouvez pas le faire, mais vous ne le laisserez pas. API, pas une fonctionnalité: un levier qui n'existe que dans l'interface d'administration de la plateforme est un lecteur dont votre connecteur ne dispose pas.

Exemple de travail · Zendesk (la mise en œuvre de référence)

Lire connectors/zendesk/connector.php alongside this. It is short, and every branch below is a decision you will face too.

Envoyer un email → ok

PUT /api/v2/users/{id} avec suspendu=true. Les nouvelles requêtes d'un utilisateur final suspendu se détournent vers les Billets Suspendus au lieu d'en ouvrir une, vraiment la même idée que de bloquer un expéditeur, et cela n'arrête pas la facturation parce que Zendesk utilisateurs finaux n'ont pas.

Domaine → non pris en charge

Zendesk PEUT suspendre un domaine entier, mais seulement à l’aide du mot clé suspend: dans la zone de texte de liste de blocage du Centre d’administration. Aucune valeur API n’écrit ce champ. La fonctionnalité existe, le levier non.

ip → non pris en charge

Aucun bloc IP n'existe au niveau du ticket.

Adresse inconnue → noop

Zendesk ne peut pas pré-suspendre une adresse qu’il n’a jamais vue. Rien ne faire n’est pas un échec. Le blocage local arrête toujours le ticket.

Agent ou administrateur → non pris en charge

REFUSÉ. Le personnel qui suspendrait un collègue serait enfermé hors du service d'assistance. Une adresse du personnel atteignant une liste de blocs est beaucoup plus susceptible d'être une erreur qu'une instruction, vérifiez le rôle avant d'agir sur elle.

Cette dernière ligne est celle qui vaut la peine d'être copiée. Le contrat ne peut pas vous empêcher de mapper un bloc sur quelque chose de destructeur, donc chaque connecteur doit décider par lui-même ce qu'il refusera. detail Un opérateur peut lire, battre l'obéissance.

Faites des rapports honnêtement. Remarquez combien peu de ces lignes sont ok. C'est le résultat correct, pas un trou : un bloc de domaine fonctionne encore (il est appliqué dans le noyau au moment où il est écrit); il ne peut tout simplement pas être reflété vers l'extérieur. ok pour une action que vous n’avez pas effectuée indiquerait à un opérateur que le blocage a atteint votre plateforme alors qu’il n’a jamais quitté OpsIQ.

Règles

Le bloc local gagne toujours

Il est écrit AVANT que vous soyez appelé et il reste en place quel que soit le résultat de votre appel.

Ne jamais jeter

Un lancer est traité comme non supporté et enregistré, le retour échoue avec un détail à la place pour que la raison survive.

Être idempotent

Le même bloc peut être annoncé plus d'une fois.

Retournez rapidement

Le travail lent de la file d'attente est préférable à maintenir la requête ouverte.

Ne pas rappeler dans

Ne jamais rebloquer dans OpsIQ depuis votre gestionnaire. Le registre ignore le connecteur d'origine, mais un deuxième saut serait en boucle.

Chaque annonce est écrite à opsiq_block_registry_log (opération, type, valeur, raison, admin, origine, connection slug, résultat, détail et timestamp) afin qu'un opérateur puisse voir un bloc arrivé de votre plateforme plutôt que d'un agent, et ce que chaque connecteur a fait à son sujet.

Pousser les pièces jointes correctement

Main attachments array to create()/addReply(). Chaque élément porte le fichier sous l'une des trois formes suivantes:

content_b64

Base64 des octets de fichier RAW, utiliser pour les fichiers derrière auth (la plupart des cas entrants). OpsIQ le décode et ré-héberge le fichier pour vous. La forme la plus portable.

url / source_url

Un https public URL (par exemple, une content_url Zendesk). Doit être https; passe un contrôle SSRF / allowlist avant d'être stocké.

stored_path

Une référence de fichier stockée que vous avez déjà écrite (ce que le compositeur natif produit).

Items also accept filename, mime_type and size_bytes. Caps: 12 MB/file, ~24 MB total, 10 files per call. Most platform read APIs return attachment Noms de fichier uniquement (pas d'octets), donc le motif fiable d'arrivée est: lire les octets où votre code fonctionne déjà (à l'intérieur de la plate-forme, ou à partir de la charge utile webhook), base64, et les expédier comme content_b64 sur l'événement.

Sortie (OpsIQ → votre plateforme). Lorsqu'un agent joint un fichier, le ticket.replied La charge utile vous donne les fichiers de la réponse stored_path au titre de la OpsIQ Lisez-les et appuyez dans le format de votre plateforme, et vérifiez les documents de la plate-forme, les questions d'encodage: WHMCS veut base64_encode(json_encode([[name,data]])) (JSON, ne pas sérialiser) ; Zendesk télécharge les octets bruts vers /uploads.json Pour un jeton puis définit comment.uploads; Gmail envoie un message RFC-822 multipart/mixte codé en base64url raw; Amazon SES inbound attachments need the S3 receive action (the SNS path caps at 150 KB).

Plateformes distantes: API + webhook, jamais les tables d'une autre application

Si votre plateforme est une Une application ou une base de données séparée (un SaaS hébergé, un WHMCS distant, une DB différente sur le même serveur), N'écrivez jamais ses tables directement: une base de données croisée écrit des terres sur n'importe quelle connexion est active et manque silencieusement les lignes réelles. Toujours: à l ' étranger = appeler le REST signé de la plateforme API (réponses, statuts, département, suppressions); entrant = la plateforme POST un webhook signé, votre handleWebhook() Vérifie et déclenche la correspondance ticket.* Pour arrêter une boucle miroir, marquez ce que vous poussez avec un marqueur d'origine (par ex. mirror_origin:'opsiq'); la plateforme fait écho à ce message sur le webhook et votre gestionnaire entrant ignore ses propres échos. OpsIQEvents::isMirroredEvent() Au sommet de chaque gestionnaire.

Statut, priorité et département du miroir

Une réponse déplace automatiquement le statut, agent Répondre → answered, a client Répondre → customer_replyPour des modifications explicites, abonnez-vous à la liste de diffusion. ticket.updated et lire : payload['changes'] (e. g. {status:'closed'}).

Statut : L'ensemble canonique de OpsIQ est open, customer_reply, answered, in_progress, pending, closedGardez une petite carte bidirectionnelle du vocabulaire de votre plateforme, et assurez-vous que votre colonne accepte réellement les valeurs que vous écrivez (un ENUM (L'absence d'une valeur est silencieusement abandonnée à vide par certaines bases de données). Département : des OpsIQ département id est sans sens de votre côté, Ne l'envoyez jamais. Envoyer le descripteur (name, email et slug) et résolvez-le contre vos propres départements par e-mail → nom → slug, de sorte que “Département de facturation” atterrit dans votre Département de facturation au lieu de général. Déclenchement sur les deux ticket.escalated et un department_id Changement en ticket.updated.

💡
La mise en miroir d'état / priorité / sujet / département / suppression est contrôlée par des bascules par connecteur (mirror_status_changes, mirror_priority_changes, Mirror_subject_change, Mirror Department Changes, Mirror Deletes) lues à travers le partage. OpsIQ\Connectors\MirrorOptions helper. Intégrez ce bloc dans vos paramètres.json et chaque connecteur ticket-miroir lit les bascules de manière identique.

Lier un ticket à un produit / service

Si le client a choisi un produit spécifique lors de l'ouverture du ticket, ajoutez une indication afin que l'agent voit une carte de service ciblée (avec un modal « voir d'autres produits » en un clic pour le reste).

related_service_id

Preferred: the service id exactly as it appears in your IdentityProvider::lookupCustomerServices() list (each service's id). Unambiguous match.

related_service_label

Un code de service de plateforme, par exemple WHMCS S396 (service396) / D11 (domaine11). OpsIQ décompose le type-lettre + id optionnel et fait correspondre votre liste de services, avec une protection de type afin qu'un code de domaine ne corresponde jamais à un produit du même id.

related_domain

Un nom de domaine; correspondant à une sous-chaîne par rapport au détail / domaine de chaque service.

💡
Construire la liste des pièces jointes une fois, dans la forme ci-dessus, et OpsIQ Gère le reste: hébergé URLs Vous n'avez jamais besoin d'écrire une gestion de fichiers par plate-forme.You never need to write per-platform file handling.
⚠️
Les touches d'action sont des lettres minuscules, des chiffres et des soulignements.3à80caractères et permet également des points; le magasin d'action accepte2à100Si vous ajoutez une action ne crée pas de route AJAX, il n'y a donc rien à régénérer — sauvez le connecteur et il est synchronisé.

Laissez l'IA le construire pour vous

Vous n'avez pas à remplir les six étapes à la main. Décrivez le connecteur dans vos propres mots et OpsIQ's AI rédige la spécification entière, exécutez-le par le même validateur que l'assistant utilise, et montre le plan avant que quelque chose soit écrit sur disque. Il y a deux endroits pour le faire, et ils produisent le même paquet.

Dans l'assistant

Ouvert Connecteurs→+ Ajouter le connecteur→Construisez le connecteur. Sur l'étape 1 vous verrez ✨ Construisez-le pour moi. Tapez à quoi sert le connecteur — la plate-formeOpsIQde lire et ce qu'il doit écrire, et qui l'utilise — ajouter leAPIroot si vous le connaissez, et appuyez dessus. L'assistant remplit chaque étape du brouillon, et vous examinez et modifiez exactement comme si vous l'aviez dactylographié.6le même panneau apparaît comme ✨ Raffiner avec l'IA, vous pouvez donc demander un changement ("aussi lire les factures") au lieu de modifier les champs.

En demandant à OpsIQ

Ouvrez la Demandez à OpsIQ copilote n'importe où dans l'administrateur et dire ce que vous voulez. Vous n'avez jamais besoin de nommer une action ou de savoir que l'assistant existe.

1
Demande-le.

Par exemple : « Construisez-moi un connecteur pour Trello. Il doit énumérer mes tableaux et listes, lire des cartes et créer une carte sur un tableau. Trello utilise une touche API plus jeton. » Le copilote répond dans une phrase et montre une Ébauche de ce connecteur Votre message est le brief, alors mettez la plate-forme, les lectures et les écritures.

2
Confirmer le projet

Rien n'est encore écrit. Le copilote rédige la spécification, la valide et répond avec le plan: ce que fait le connecteur, les actions qu'il exposera (écrits marqués), les hypothèses qu'elle a faites, et les questions que vous devez encore répondre — généralement quelles lettres de créances à fournir.24heures.

3
Dis "construisez-le"

Le copilote montre une Construire card naming the connector and its slug. This one writes: it publishes the package into /connectors/<slug>/. Confirm it and you get the path back, together with the setting you still have to fill.

4
Saisissez les identifiants et activez

Le nouveau connecteur est publié mais PAS activé, et il ne contient aucun secret. Ouvrez ses paramètres, entrez la touche API ou jeton, appuyez sur Essai, alors Activer. Jusqu'à ce que vous le fassiez, il ne fait rien.

💡
Les deux cartes ont besoin de votre clic. L'étape d'ébauche n'écrit rien du tout ; l'étape de construction est marquée destructive et demande toujours. L'IA ne peut pas publier un connecteur, activer un ou entrer un titre de créance sur son propre.

Ce que l'IA est et n'est pas autorisé à faire

Le validateur est le mur

Une spécification rédigée passe exactement par le même() bouton Publis de l'assistant utilise. Si elle ne passe pas, l'IA reçoit les erreurs et essaie à nouveau, jusqu'à trois fois, puis refuse dans les propres mots du validateur. Un brouillon qui échoue ne devient jamais un paquet.

Il n'écrit aucune lettre de créance

Le projet d'ébauche nomme le modèle d'authentification et les champs de paramètres; il n'invente jamais une clé, un jeton ou un secret. Vous remplissez ceux qui sont ensuite sur la page de paramètres du connecteur.

Il répond par des questions, pas par des suppositions

Tout ce qu'il ne pouvait savoir — votre identifiant de compte, quelle région, quel des deux paramètres de votre plan expose — revient comme une question sur le plan plutôt que comme une hypothèse silencieuse.

Un point d'arrêt inventé échoue fort

L'IA est dit de ne jamais inventer de chemins, mais aucun modèle n'est parfait. Un mauvais chemin publie comme une action qui échoue son test en direct sur l'étape Actions ou la première fois qu'il fonctionne — ce n'était jamais un succès silencieux.

Le paquet est ordinaire

Ce qu'il produit est un paquet de Builder normal: mêmes fichiers générés, même contrat, même signature, modifiable dans l'assistant, amovible à partir de la page des connecteurs. Il n'y a pas de type distinct "connecteur AI".

Votre modèle fait la rédaction

La qualité suit le modèle que vous avez configuré sous Paramètres → AI. Un petit modèle bon marché rédige un connecteur correct mais simple et pose plus de questions; un modèle plus fort obtient plus des paramètres dès la première fois. Changez-le sous configuration AI; rien d'autre n'a à changer.

⚠️
Le copilote ne peut exécuter que des actions enregistrées par cette installation. Si les actions du Constructeur de connecteurs sont manquantes — un plan qui ne les inclut pas, ou un rôle sans manage_connectors — le copilote le dit plutôt que de proposer une carte qui échouerait en cliquant.
Connecteurs

Vendre par chat: la carte du rôle commercial

Un connecteur qui peut vendre — une plate-forme de magasin, un système de réservation, une passerelle de paiement — déclare laquelle des opérations OWN répond OpsIQ'les rôles de commerce canonique. Declare-le et le connecteur apparaît sous Paramètres → Chat client → Vendre par chat automatiquement; cesser de déclarer et il disparaît. Il n'y a pas de liste pour s'enregistrer.

Le fichier : commerce_roles.json

La déclaration vit dans son propre fichier à la racine du paquet — la présence du dossier est la revendication. Il ne peut pas vivre dans connector_contract.json: ce fichier est régénéré par les outils d'emballage et son schéma rejette les clés inconnues, de sorte qu'un bloc reajouté à la main échouerait la validation et sera écrasé.

commerce_roles.json
{
  "commerce": {
    "roles": {
      "catalog_search": { "operation": "acme_search_products", "transport": "http" },
      "customer_lookup": { "operation": "acme_customer_lookup", "transport": "http" },
      "quote":          { "operation": "acme_quote_order",     "transport": "http" },
      "payment_methods": { "operation": "acme_payment_methods", "transport": "http" },
      "order_get":      { "operation": "acme_get_order",       "transport": "http" },
      "order_create":   { "operation": "acme_create_order",    "transport": "http",
                          "recovery": "acme_get_order" }
    },
    "customer_ordering": {
      "enabled": true,
      "version": 1,
      "mode": "direct_order",
      "audience": "clients_only",
      "account_flow": "existing_client",
      "payment_flow": "connector_methods",
      "identity_parameter": "external_customer_id",
      "quantity_parameter": "quantity",
      "label": "Acme Store",
      "checkout_hosts": [],

      "transaction_kind": "purchase",
      "decision_mode": "immediate",
      "payment_timing": "on_confirmation",
      "reversibility": "reversible",
      "cancellation_flow": "platform_only",
      "fulfilment_presence": "remote_delivery",
      "notify_flow": "platform_automatic",
      "customer_fields": {"name": "required", "email": "required", "address": "required", "phone": "optional"},
      "client_tools": ["catalog_search", "catalog_get", "quote"],
      "account_timing": "before_quote"
    }
  }
}

Les règles, et pourquoi chacune existe

Les rôles sont un vocabulaire fermé

OpsIQ ne signifie jamais un rôle à partir du nom d'une action. Un rôle qui n'est pas déclaré n'existe pas — déclarer est le contrat entier.

L'opération doit être l'une de vos actions

Chaque opération cartographiée doit exister dans votre actions.json. Une typographie déclare une capacité qui ne peut pas fonctionner, et elle se présente à un client comme "je peux vérifier cela pour vous" suivie de rien.

Un rôle de lecture ne pointe jamais à une opération destructrice

Lisez les rôles (catalogue, disponibilité, devis, recherche de commande) qui doivent être map aux opérations qui ne changent rien sur votre plateforme.

Un rôle d'écriture ne se met jamais en correspondance avec une opération de disque générique

Cartographie order_create à une table brute record.create, db.insert, recordCreateUne ligne écrite directement contourne le prix de votre plateforme, le verrouillage des stocks et le courrier de confirmation, produisant une commande en laquelle votre propre système ne croit pas pleinement.

Un rôle d'écriture déclare une opération de récupération

Un idémpotent qui répond « a-t-il écrit la terre? ». Le délai le plus dangereux est celui après que votre plateforme peut déjà avoir créé l'ordre; sans une recherche de récupération, les seules options sont de reessayer aveugle ou de perdre.

Les rôles de paiement des fournisseurs comportent trois obligations supplémentaires

Un paquet qui parle directement à un prestataire de paiement doit également déclarer payment_profile (monnaies, pays, méthodes et environnement — un environnement non déclaré est la façon dont une intégration test prend un paiement en direct), webhook_verify (le système de signature réelle du prestataire; un secret-comparateur générique est refusé) et event_map (provider events on canonical ones). Un connecteur marchand qui ne met en œuvre que des record_payment reçoit des preuves de paiement canoniques déjà vérifiées; il ne doit pas prétendre être la passerelle.

Déclarez comment les clients peuvent commander à partir d'un magasin connecté

Un connecteur marchand et un connecteur de porte-paiement sont différents contrats. Commande client de magasin connecté, choisissez le mode le plus profond que la plate-forme peut prouver. Le choix est emballé à l'intérieur signé commerce_roles.json; Store et Client Chat le relisent au moment de l'exécution. En supprimant un rôle ou en désinstallant/désinstaller le connecteur, on invalide une proposition déjà rendue au lieu de laisser derrière elle l'autorité stalle.

catalog_only

Cartes catalog_search ou catalog_get. OpsIQ peut rechercher et expliquer des produits, mais il ne peut pas afficher une confirmation de commande ou de commande exécutable. Chaque paquet reste à ce défaut véritable jusqu'à ce que ses propres actions de soumission et de commande/commande passent le contrat plus profond et la certification Marketplace; jamais infer transactionnel support d'un nom de plate-forme.

platform_checkout

Cartes aussi quote et platform_checkout. L'action des marchands—non OpsIQ cœur—revient checkout_url, checkout_reference et la citation canonique. Le URL doit être HTTPS, son nom d'hôte doit correspondre customer_ordering.checkout_hosts ou l'hôte HTTPS dérivé de checkout_host_setting, et la citation peut vivre pour pas plus de15minutes. Un produit permalien, un chariot assemblé localementURLou le retourURLn'est pas une capacité de paiement émise par un marchand.

direct_order

Cartes aussi quote, order_create et order_get, avec order_create.recovery. Core rafraîchit la soumission immédiatement avant l'exécution, fournit la clé d'idempotency, et demande à l'opération de récupération après chaque résultat inconnu avant toute réessayer. payment_flow=opsiq_gateway, il doit en outre cartographier record_payment avec une opération de récupération/relecture faisant autorité. OpsIQ vérifie activement la transaction de passerelle, correspond au montant, à la devise, au marchand et à la référence de commande, écrit la référence du fournisseur une fois, puis lit la facture/commande du marchand en retour. mark_invoice_paid Le statut de bascule est rejeté parce qu'il ne contient aucune preuve de paiement. L'action de création doit invoquer la propre logique commerciale des prix, des stocks et des commandes de la plateforme; les écritures brutes de base de données sont refusées.

Vérification de l'identité et ce que l'opérateur peut changer

Lorsque OpsIQ possède le paiement, un client de chat doit atteindre email_otp avant qu'un ordre ne soit créé —OpsIQcourriels a6-code à chiffres et le demande. Ce n'est pas quelque chose qu'un connecteur opte hors de; c'est le plancher d'assurance que le noyau d'exécution exige pour order_create.

La seule exception, et qui la contrôle

Un opérateur peut accepter une adresse non vérifiée SEULEMENT lorsque votre connecteur déclare fulfilment_presence: customer_present. Un invité de l'hôtel doit arriver, donc une mauvaise adresse mal dirige un reçu et la chambre est toujours là. remote_delivery — expédié, fourni, téléchargé — et une vérification est nécessaire quel que soit le réglage de l'opérateur, car la valeur laisse sur la seule force de cette adresse. minimum_assurance ou reversibility: irreversible supprime également la capacité de l'opérateur à sauter.

Combien de temps dure le code

30 minutes par défaut, opérateur configurable à partir de5minutes avant24heures. Le client voit un compte à rebours en direct rendu dans leurs propres un code expiré dit si clairement et offre un nouveau code plutôt que de signaler un code invalide — un client tapant un code correct mais ancien n'a pas fait d'erreur, et leur disant qu'ils les ont envoyés autour de la même boucle.

Ce que le client doit fournir : customer_fields

Le nom et le courriel sont toujours requis et sont recueillis en premier. address, phone et company as required ou optional pour s'adapter à l'entreprise: un magasin qui expédie des colis déclare l'adresse requise; un hôtel déclare le téléphone requis, car un client qu'il ne peut pas appeler n'a aucun contact de réservation. L'assistant les demande dans la conversation avant de citer, etOpsIQrefuse de passer une commande qui manque un champ obligatoire. Le constructeur écrit la carte normalisée, base de référence incluse, donc le contrat sur disque est explicite.

Lorsque le compte est créé : account_timing

at_order (par défaut) permet à la commande d'écrire créer un premier compte acheteur. before_quote lorsque les prix de votre plateforme par compte —WHMCSles taxes par le client, son propre profil et les devis dans la devise du client — etOpsIQcrée le compte via votre customer_create action dès que les champs requis sont connus, puis demande le devis pour ce compte, de sorte que la carte de confirmation porte le total que vous allez facturer. account_flow: connector_signup.

L'assistant récupère, il ne lit pas : client_tools

Avec Créer des commandes, l'assistant ne lit jamais un catalogue collé. Il appelle trois outils — commerce_catalog_search (une requête vide est un aperçu des familles de produits; les résultats au-delà de la limite sont listés par nom), commerce_catalog_get pour un article complet, et commerce_quote, qui mint le serveur de carte de confirmation signé côté à travers les mêmes murs que le chemin de connecteur a toujours eu . Un outil par verbe , votre connecteur comme paramètre , donc un magasin avec six connecteurs obtient trois outils plutôt que dix-huit . client_tools limite la valeur par défaut; absent signifie chaque carte, et a catalog_only Confirmation n'est jamais un outil: le bouton carte , sur le web, l'exact CONFIRM commande sur un canal, et rien d'un modèle ne dit dépense de l'argent.

Ce que vos articles de catalogue doivent porter

id, name, un client sûr summary, a category ou famille de produits (c'est ainsi qu'un mot client trouve un élément dont le nom est un code), currency, unit_amount_minor, available, et input_schema nommant les champs dont une commande a besoin. La recherche note les mots du client contre le nom, la famille, le cycle et le résumé.

Refuser avec une raison sur laquelle le client peut agir

Retour {"success":false,"error":"…","missing":["domain"],"retryable":true} lorsqu'une valeur est fausse ou manquante. Un refus qui nomme missing ou retryable atteint le client mot pour mot ; une défaillance nue reste générique donc rien ne fuit intérieurement.

La monnaie géo et l'arrêt d'urgence

Lorsque l'opérateur allume la monnaie Geo (Client Chat → Comportement), le client lit les prix dans sa propre devise sur chaque surface — chat texte, carte web, carte de texte du canal et la monnaie d'ouverture de magasin — en utilisant la plate-forme propre boutique FX. Votre prix n'est jamais substitué: la carte affiche le visiteur , figure à côté du total du magasin, et la passerelle traite exactement le montant qu'il affiche. Pause toutes les ventes (Settings → Commerce) est le commutateur de kill : catalogue, devis et recherche restent ouverts; proposant et confirmant stop sur chaque canal.

Lorsque la vente par chat ne se comporte pas

Le marchand n'a pas pu être atteint

Le sceau du paquet est cassé : un fichier a été édité après la signature. Re-publiez le paquet. Une copie de marché installée n'est jamais éditée en place; mettez-le à jour depuis le panneau de marché.

Commande est interrompu pour ce magasin en ce moment

L'interrupteur est allumé.→Commerce→Pas de vente.

Commande n'est pas encore disponible sur cette chaîne

Le canal n'est pas coché sous Où les clients peuvent acheter. Le journal du serveur nomme le canal.

L'assistant décrit un élément mais aucune carte n'apparaît

L'outil de soumission refusé. Chaque appel est enregistré comme [opsiq][commerce][client_tool] avec la raison: un ident d'élément erroné, un champ que l'article ne déclare pas, un domaine pris, ou le marchand de son propre refus. Lire le journal avant de faire confiance à l'assistant de paraphrase.

L'assistant dit qu'il ne voit pas les produits

La page appartient à un autre espace de travail. Chaque widget du site Web appartient à une même zone de travail, et le connecteur de magasin doit être activé là-bas.

Une réponse en boîte au lieu d'une réponse

-Donnez-moi un peu plus sur ce dont vous avez besoin, signifie que le fournisseur d'IA s'est fait appeler; l'historique de l'IA montre l'erreur exacte sous ce tour, et les outils n'ont jamais été atteints.

Une modification de connecteur ne s'affiche pas dans le chat

Le travailleur recycle le code en une minute, mais une conversation reprend sa dernière carte. Commencez une nouvelle conversation pour tester.

Un visiteur nigérian voit des dollars bien que la devise géo est sur

Vérifiez que la géo...IPla base de données est configurée (Client Chat→Geo) et que la devise du visiteur a un taux FX; sans tauxOpsIQindique le prix du magasin plutôt qu'un mauvais numéro.

Votre total est le seul chiffre qui déplace l'argent

Une citation porte unit_amount_minor, quantity et total_amount_minor, et il est tentant de traiter le troisième comme dérivé des deux premiers. Il ne l'est pas, et en supposant qu'il a déjà coûté un client argent réel .

quantity C'est ce que le CLIENT a choisi — une pièce, une licence, une politique. Votre multiplicateur peut être quelque chose OpsIQ ne voit jamais: nuits, sièges, cycles de facturation, distance, poids, niveaux. Un hôtel cite une chambre pour trois nuits comme quantité 1, unité 105,000Total 315,000. OpsIQ multiplié unité par quantité pour le prix d'une carte de confirmation, montré un invité 105,000, et ensuite chargé le 315,000 Le marchand est effectivement revenu. Accepter un chiffre et être accusé un autre est la pire chose que ce contrat peut faire.

La règle

total_amount_minor est la seule figure OpsIQ montre, signe, charge et se réconcilie contre. unit_amount_minor Si votre total n'est pas exactement ce que vous voulez charger, votre devis est faux — OpsIQ ne le corrigera pas, car un total qui a été ajusté de façon utile est celui que vous n'avez jamais accepté d'honorer.

Ce que cela signifie pour votre action de citation

Remettez le chiffre tout-en. Appliquez vos propres nuits, niveaux, réductions, taxes et frais avant de répondre. Si votre ligne ne se reconcilie pas — fois un nombre entier ne correspond jamais à votre total —OpsIQtraite l'ensemble comme une seule ligne à son prix réel plutôt que d'inventer une rupture qui se réconcilie avec rien.

Six réponses qui rendent ce contrat adapté à n'importe quelle industrie

La déclaration ci-dessus a commencé par une déclaration de magasin : acheter une chose, payer maintenant, c'est à vous, vous pouvez annuler. Chacun de ces quatre est une hypothèse que certaines affaires réelles ne partagent pas. Une banque qui déplace de l'argent ne peut pas la défaire. Un assureur ne peut dire "confirmé" jusqu'à ce qu'un souscripteur ait regardé. Un commerçant facture ensuite.

Un connecteur transactionnel répond donc à six autres questions. Chaque personne par défaut à la lecture stricte — dire que rien n'est toujours sûr et jamais permissif, parce que dire rien est ce qu'un auteur fait quand il n'a pas examiné la question.

transaction_kind

purchase, booking, subscription, bill_payment, transfer, application, top_up, renewal. Vocabulaire plutôt que comportement : il décide du mot que votre client lit. Appeler un transfert de fil une "commande" fait entendre l'assistant comme il ne comprend pas l'entreprise qu'il parle, et aucune quantité de plomberie correcte se rétablit à partir de cela. purchase.

decision_mode

immediate ou deferred. Choisir deferred pour tout ce qui va à la souscription, évaluation de crédit, références, admissions ou un comité. OpsIQ présenté plutôt que confirmée, et donne la référence pour demander à ce sujet. Dire à quelqu'un que son application est confirmée alors qu'il est assis avec un humain est la chose la plus dommageable qu'un assistant de chat peut faire pour une entreprise réglementée, et c'est le comportement par défaut de chaque flux en forme de détail. immediate.

payment_timing

on_confirmation, deposit_then_balance, invoice_later ou no_payment. Ceci décide siOpsIQouvre une page de paiement - Pas du tout., donc on ne peut pas déduire de payment_flow — qui dit: qui Il prend l'argent, ça dit si et quand. Travaillez à facturer ensuite, et les applications qui ne coûtent rien à soumettre, se terminent à la confirmation au lieu d'atteindre une liste de passerelles qui est vide ou incorrecte.

reversibility

reversible ou irreversible. La chose la plus importante qu'un connecteur financier dit. Une pièce peut être libérée et un colis peut revenir; un transfert complété ne peut pas — il n'y a pas de défaire, l'argent est à l'autre extrémité, et le seul remède est de demander à un étranger de le retourner. irreversible forces automatiques cancellation_flow à none et interdit à tout opérateur de sauter la vérification d'identité, Quoi qu'il en soit, cette déclaration dit. Deux champs en désaccord n'est pas un état à résoudre au moment de l'exécution par la première lecture. reversible.

cancellation_flow

none, platform_only ou connector_cancel. Les rôles d'annulation existaient déjà sans règle sur qui pouvait les atteindre, et les deux fausses devinettes échouent dans des directions opposées: devine open et un message de chat annule une réservation payée sans frais cités; devinez fermé et un client qui veut annuler est dit au téléphone. connector_cancel demande en outre cancellation_quote et order_cancel avec une récupération — OpsIQ ne s'annule jamais avant de dire ce qu'il coûte. none.

fulfilment_presence

customer_present ou remote_delivery. Que l'adresse électronique non vérifiée peut coûter n'importe quoi. Un client de l'hôtel doit arriver, donc une mauvaise adresse mal dirige un reçu et la chambre est toujours là; un colis affiché, un serveur fourni ou un lien de téléchargement laisse sur la force de cette seule adresse. C'est ce qui rend un opérateur "skip email verification" paramètre disponible du tout, et il est déclaré par vous plutôt que choisi par eux — de sorte qu'un raisonnement hôtel , ne peut jamais être hérité par un connecteur qui expédie des marchandises . remote_delivery.

minimum_assurance et disclosure (facultatif)

minimum_assurance vous permet de demander plus La preuve d'identité que OpsIQ exige, jamais moins — une banque exigeant un échelonnement pour un transfert est l'exercice du contrat. La configuration elle supprime également la capacité d'un opérateur à sauter la vérification de votre connecteur, parce qu'un marchand , sa propre décision de risque dépasse la commodité d'une opérateur . disclosure est la formulation indiquée avant le bouton de confirmation, pour un tarif, un droit ou une taxe de refroidissement que vous devez présenter; sans cela, les entreprises réglementées font passer le libellé requis dans un nom de produit.

notify_flow

platform_automatic, platform_triggered ou none. Lorsque OpsIQ prend le paiement, votre propre commande ne fonctionne jamais, de sorte que quoi qu'il envoie normalement ne tire jamais. L'enregistrement du paiement marque la commande payée; il n'oblige aucune plate-forme à dire à personne. platform_triggered exige que order_notify rôle avec une récupération, et OpsIQ demande seulement après le retour de paiement prouve que l'argent est enregistré. none fait laOpsIQ-de confirmation côté obligatoire, car autrement un client payant n'entend rien du tout. none.

Le même contrat, neuf entreprises indépendantes

Chacun d'eux est le contrat répondant honnêtement pour une autre industrie, avec OpsIQ ne sachant rien sur l'un d'entre eux.

Un contrat, neuf industries
Hotel        booking      immediate  deposit_then_balance  reversible    -> payment page, "confirmed", identity may be waived
Online shop  purchase     immediate  on_confirmation       reversible    -> payment page, "confirmed", identity always verified
Bank         transfer     immediate  on_confirmation       IRREVERSIBLE  -> payment page, no cancel route, never waived
Insurer      application  DEFERRED   no_payment            reversible    -> no payment page, "submitted", never "confirmed"
Utility      bill_payment immediate  on_confirmation       IRREVERSIBLE  -> payment page, nothing to give back
Clinic       booking      immediate  invoice_later         reversible    -> NO payment page, billed afterwards
Tradesman    booking      immediate  invoice_later         reversible    -> NO payment page, invoiced on completion
Telecom      top_up       immediate  on_confirmation       IRREVERSIBLE  -> payment page, final once sent
University   application  DEFERRED   no_payment            reversible    -> no payment page, decision follows
Événement payant fourni aux plateformes

Après qu'un paiement de Storefront natif soit activement vérifié et engagé,OpsIQémet des payment.completed avec order_id, payment_id/provider_ref, gateway, exact amount_minor, ISO currency, client, articles de ligne, canal et paid_at. Un connecteur marchand doit persister que les preuves record_payment et le relire; un connecteur de paiement hébergé consomme son propre événement payant faisant autorité et ne doit pas recevoir une écriture de paiement en double.

AI est un proposant, pas une source d'autorité

Le modèle peut sélectionner un produit et une quantité déclarés, mais il ne peut pas choisir un nom d'opération, mint a checkout URL ou créer l'état marchand à partir du texte. Le client reçoit une carte signée exacte et doit appuyer sur son bouton de confirmation. Cette confirmation est liée à l'espace de travail, connecteur, article, quantité, devis, devise, fil et expiration.

Les clients sociaux gardent le même flux sans une demande d'email

WhatsApp, Messenger, Instagram, Telegram, LINE, SMS et X utilisent le compte de canal vérifié par le fournisseur comme identité du client. La proposition est signée sur ce compte de canaux et la confirmation passe toujours par les mêmes contrôles de nouveau devis, stock, idempotence, paiement et récupération. Un client social utilise l’action de confirmation unique exacte rendue dans sa conversation; une prose ordinaire telle que « oui » n’est jamais une autorité de commande.

L'historique de l'ordre suit un lien d'identité exact, jamais un email devine

Les commandes natives sont indexées par une identité de canal opaque, de sorte que l'IA peut répondre à : Où est ma commande ? - sans demander un email ou un numéro de commande.CRM/client enregistre et implémente une recherche de client/commande autorisée dans le connecteur. Les fournisseurs de contexte client reçoivent ce lien stocké; ils ne doivent pas choisir un compte à partir d'un nom d'affichage ou dactylographié dans le chat. Avec une commande correspondante, les réponses AI sont directement; avec plusieurs, il résume les correspondances et demande lequel; sans aucun, il dit qu'aucune histoire n'est liée.

Faire de la charge utile universelle : champs tapés et identité du serveur

Core ne contient pas de WHMCS, hôtel, SaaS, magasin, banque, produit, route ou succursale du vendeur. parameters Un connecteur de réservation peut déclarer des dates et des invités; un connecteur de facturation peut déclarer un cycle; un futur connecteur d'entreprise peut déclarer ses propres champs de sécurité.OpsIQdésinfecte les contrôles primitifs et n'envoie les valeurs collectées qu'à l'action du connecteur mapifié.

Action de citations dactylographiées
{
  "action_id": "acme_customer_quote",
  "scope": "client",
  "is_destructive": false,
  "parameters": [
    {"name":"external_customer_id","type":"string","required":true},
    {"name":"item_id","label":"Product","type":"string","required":true},
    {"name":"quantity","label":"Quantity","type":"integer","required":true,"minimum":1},
    {"name":"cycle","label":"Billing cycle","type":"select","required":false,
     "options":[{"value":"monthly","label":"Monthly"},{"value":"annual","label":"Annual"}]}
  ]
}

Pour clients_only, ensemble customer_ordering.identity_parameter Ce champ n'est jamais montré à un client et toute valeur fournie par l'appelant est supprimée; OpsIQ injecte uniquement l'identifiant d'un lien de connecteur vérifié. La commande d'invité laisse vide. Un email tapé est une preuve pour une recherche d'hôte déclarée, pas une connexion et pas une autorisation d'achat.

Domaines groupés : Les comptes clients et la configuration des connecteurs signés appartiennent à l'espace de travail du portail principal-groupe. Cependant, le jeton d'identité doit être signé pour le site membre exact qui intègre le widget, en utilisant ce secret webhook membre. OpsIQ vérifie cette surface d'abord et seulement ensuite résolve le commerce et le client lié par le primaire groupe. Ne remplacez jamais la clé du site membre par la clé principale et ne copiez jamais le secret principal à un site membre.

Enveloppes canoniques le connecteur doit retourner

Catalogue
{
  "success": true,
  "data": {"items":[{
    "id":"42", "name":"Example product", "summary":"Customer-safe summary",
    "currency":"USD", "unit_amount_minor":2500, "available":true,
    "selection":{"item_id":"42"}
  }]}
}
Citation
{
  "success": true,
  "data": {
    "quote_id":"opaque", "currency":"USD",
    "unit_amount_minor":2500, "total_amount_minor":5000,
    "selection":{"item_id":"42","quantity":2},
    "expires_at":"2026-08-31T14:05:00Z"
  }
}

La réponse de vérification de la plateforme répète le devis canonique valide et ajoute un HTTPS checkout_url. Core rafraîchit le devis à la confirmation et compare la monnaie, la sélection totale et stable exactement. Le connecteur traduit sa réponse de plate-forme dans ces enveloppes; core ne traduit jamais les champs fournisseurs ou construit le marchand URL.

Rendez une passerelle construite par l'opérateur disponible dans le magasin natif et chat

La seule capacité de paiement ne met pas une passerelle devant les clients. Portail de paiement Native Store Il ajoute un contrat en version explicite, des cartes de création de commande et de recherche active de paiement, et permet de choisir les domaines de commande hébergés par le fournisseur. Une fois que le connecteur est installé, activé et sélectionné sous les paramètres Commerce, la même passerelle apparaît dans le magasin public, le mode de vente Store, la commande client-chat et la commande autonome.

Contrat de passerelle Native Store
{
  "commerce": {
    "roles": {
      "checkout_create": { "operation": "acme_checkout_create", "transport": "http",
                           "recovery": "acme_payment_status" },
      "payment_status":  { "operation": "acme_payment_status", "transport": "http" },
      "payment_profile": { "operation": "acme_payment_profile", "transport": "http" },
      "webhook_verify":  { "operation": "acme_webhook_verify", "transport": "http" },
      "event_map":       { "operation": "acme_event_map", "transport": "http" },
      "payment_refund":  { "operation": "acme_refund", "transport": "http",
                           "recovery": "acme_refund_status" }
    },
    "storefront_gateway": {
      "enabled": true, "version": 1, "label": "Acme Pay",
      "checkout_hosts": ["checkout.acmepay.com", "*.acmepay.com"]
    }
  }
}
Sortie de caisse canonique

Les cartes d'action de caisse checkout_url et, lorsque le fournisseur en a une, session_id. Le URL doit être HTTPS, ne contenir aucune identification et correspondre à un hôte licencié.

Sortie de statut canonique

L'action de statut effectue un nouveau fournisseur API recherche et cartes paid comme un vrai booléen, amount_minor comme un entier, currency en tant que code ISO à trois lettres, et provider_ref. Une réponse URL, chaîne de requête, charge utile client, ou une instruction de paiement fournie par connecteur -acfirmée .

Contrat de remboursement facultatif

Si la passerelle supporte les remboursements, carte payment_refund et son action de récupération. accepted et completed booléens plus provider_ref; récupération effectue une recherche de fournisseur et retourne status. Sans les deux actions,OpsIQne fait pas de publicité pour les remboursements de connecteur.

Qui confirme l'ordre

Le connecteur n'écrit jamais unOpsIQle statut de l'ordre.OpsIQcompare exactement le montant retourné et la monnaie et enregistre la référence du fournisseur; seulement alors le noyau effectue la transition vérifiée par le fournisseur. Le transfert bancaire manuel reste le seul flux qu'un agent nommé peut approuver.

Dans Connector Builder, cochez commerce, cartographier les rôles et configurer Commande client de magasin connecté, Portail de paiement Native Store, ou les deux quand le connecteur fournit réellement les deux contrats. L'assistant valide la déclaration et écrit commerce_roles.json. La publication utilise toujours le processus normal de révision et signature du marché; ce contrat ne contourne jamais la vérification du paquet ou rend un connecteur non-installable. php tools/verify_commerce_contracts.php.
💡
Les transports sont http pour une API distante ou bridge pour une opération nommée sur un pont déployé (voirAPILes rôles sont le transport-agnostique; l'exécution a juste besoin du transport indiqué afin qu'il puisse version-paire d'un pont.
Connecteurs

Vendre par chat SANS connecteur: Actions & Triggers

Le contrat de commerce ci-dessus n'exige pas un paquet de connecteurs. Si votre plateforme est la vôtre — un back office personnalisé, un interneAPI, un système pour lequel personne n'envoie de connecteur — vous pouvez atteindre la même machine de vente avec les deux outils que vous utilisez déjà pour intégrer autre chose: actions personnalisées (vos paramètres HTTP, définis sur la page Actions) et Triggers (event webhooks). Même contrat, même carte, même assurance d'identité, même noyau de paiement, mêmes reçus. La seule chose manquante est le paquet, parce qu'il n'y a pas de code tiers à signer.

Comment cela s'assemble

Vous construisez une action personnalisée par rôle de commerce — chacun est un paramètre HTTPS simple sur votre côté, défini sous Actions d'AI & Automation → avec sesURL, en-tête et paramètres d'auth. Ensuite vous enregistrez une déclaration qui map les rôles à ces actions. A partir de ce moment votre magasin apparaît dans chat exactement comme un connecteur-backed: les citations AI de votre l'action de soumission, la carte de confirmation rend, le client vérifie leur email, les appels du noyau de commande votre commande action avec une clé d'idempotency, OpsIQ prend paiement par les passerelles de l'espace de travail, et votre l'action de paiement-enregistrement enregistre. Rien sur l'expérience client dit "client".

La déclaration

Enregistrer cette JSON comme paramètre de l'espace de travail commerce_custom_integration (Paramètres→paramètres avancés, ou via les paramètres RESTAPI). C'est la même forme qu'un paquet commerce_roles.json nœud de commerce, avec action nommant vos identifiants d'action personnalisés :

commerce_custom_integration
{
  "enabled": true,
  "roles": {
    "catalog_search":  { "action": "acme_catalog" },
    "quote":           { "action": "acme_quote" },
    "order_get":       { "action": "acme_order_get" },
    "customer_create": { "action": "acme_customer_create",
                         "recovery": "acme_customer_by_email" },
    "order_create":    { "action": "acme_order_create",
                         "recovery": "acme_order_by_key" },
    "record_payment":  { "action": "acme_record_payment",
                         "recovery": "acme_payment_by_key" }
  },
  "customer_ordering": {
    "enabled": true, "version": 1,
    "mode": "direct_order",
    "audience": "guests_and_clients",
    "account_flow": "connector_signup",
    "payment_flow": "opsiq_gateway",
    "label": "Acme Store",
    "identity_parameter": "client_identifier",
    "quantity_parameter": "quantity",
    "transaction_kind": "purchase",
    "fulfilment_presence": "remote_delivery",
    "notify_flow": "platform_automatic"
  }
}

Enfin, ajouter custom_commerce aux connecteurs activés pour la vente sous Paramètres→Chat client→Vente par chat. L'admission est re-vérifiée sur tous les demander, et il refuse avec des raisons nommées plutôt que de cacher silencieusement votre magasin: un rôle votre mode exige que les cartes à rien, un rôle d'écriture sans action de récupération (§15.7 — une écriture dont le résultat ne peut pas être ré-esquivé est refusé), une action qui a été supprimé ou désactivé depuis que vous avez sauvé.

Ce que chaque action doit faire

Retourne l'enveloppe du connecteur

Répondre {"success": true, "data": { ... }} — ou {"success": false, "error": "a sentence a customer may read"}. Vos actions réponse devrait pointer à l'enveloppe.

Citation : le total, en unités mineures

Retour quote_id, product_name, quantity, unit_amount_minor, total_amount_minor, currency, selection, selection_summary, expires_at. Tout dans le "votre total est le seul chiffre qui déplace de l'argent" section ci-dessus applique mot pour mot: les taxes, les frais et les multiplicateurs vont INTO votre total, parce que votre total est ce qui est signé, montré et facturé.

Création d'ordre : honorer la clé d'idempotency

Vous recevez idempotency_key, le total_minor et currency, la vérification customer_email, et vos propres paramètres de soumission. Stockez la clé avec la commande; si vous avez déjà créé une commande pour elle, retournez cette commande au lieu d'une seconde. Vérifiez l'argent — si votre système prix la commande différemment du total signé, refusez réticuleusement plutôt que sous-charger. Retourner un reference votre plateforme reconnaît.

Récupération: réponse à propos d'UN écrire

order_by_key reçoit la clé d'idempotency et les réponses {"found": true, "order": {...}} ou {"found": false}. found:false est une promesse — OpsIQ peut réessayer l'écriture sur la force de celle-ci. Un flux d'état ou une liste de commandes récentes n'est pas une réponse à propos d'une écriture.

Paiement en compte : votre propre chemin de règlement

Recevoir l'identifiant de transaction de passerelle comme clé idempotency plus votre référence de commande, aprèsOpsIQa vérifié activement le montant et la monnaie avec la passerelle. Marquez la commande payée par votre propre logique de plate-forme — lancez vos propres emails, réduisez vos propres actions. Retour platform_notified: true si votre plateforme envoie des courriels au client lui-même.

Les entrées de carte proviennent de vos paramètres d'action

Tout paramètre que vous déclarez sur votre action QUOTE (au-delà du paramètre d'identité) que l'IA n'a pas collecté est rendu sur la carte de confirmation en entrée que le client se remplit lui-même — un domaine, une date, un siège.

Déclencheurs : écoutez vos propres ventes

Deux événements s'enflamment sur le bus de l'événement partagé, de sorte que vos webhooks et automatismes entendent chaque vente de chat partout où elle a exécuté:

commerce.order.created

Le moment où l'ordre atterrit du côté marchand, avant paiement — référence, connecteur (ou custom_commerce), montant, monnaie, email client, fil id.

commerce.payment.confirmed

Exactement une fois par commande, lorsque la passerelle vérifie activement le paiement. Il chevauche la même réclamation qui empêche les reçus dupliqués, de sorte qu'il ne peut pas double-allumer votre webhook.

Quand obtenir un diplôme en connecteur

L'intégration personnalisée est la configuration de l'espace de travail : elle sert VOTRE magasin, sur votre espace de travail. Le moment où vous voulez distribuer l'intégration — autres espaces de travail, le marché, version, signature, installs payants — paquet les mêmes actions et la même déclaration qu'un connecteur.

Connecteurs

Connectez une plate-forme qui a NOAPI(le modèle de pont)

Beaucoup de plates-formes réelles ne sont pas navire RESTAPIUn CMS hôtel, un ancien système de facturation, un outil interne sur mesure.OpsIQconnecteur pour un: le connecteur expédie un seul fichier PHP que l'opérateur tombe dans leur propre webroot public, et ce fichier EST leAPI. Cette page est le modèle entier, avec les règles qui rendent sûr de courir et la raison derrière chaque règle.

La forme de celui-ci

Un connecteur normal appelle le API de quelqu'un d'autre. Un connecteur de pont apporte le sien. Rien d'autres ne change : les mêmes actions, les mêmes fournisseurs de contexte, le même contrat d'identité, la même disposition du paquet.

1
Vous écrivez un fichier PHP

It lives in your package at bridge/opsiq-<platform>-bridge.php. It talks to the platform's database directly, or boots the platform's framework, or both. It answers JSON.

2
L'opérateur le copie dans leur webroot

A côté de la plate-forme propre index. php. Aucun code de plate-formes n'est modifié, aucun plugin n'a été installé, rien à maintenir sur les mises à niveau de la plateforme.

3
Le panneau de connecteurs leur donne le fichier

Vos paramètres.json déclare webhook_help. snippet_template. La page de connecteur la rend comme un fichier copiable avec leurs paramètres en direct déjà substitués, il n'y a donc rien à modifier manuellement.

4
OpsIQ l'appelle serveur vers serveur

Votre Client.php envoie des requêtes GET avec la clé partagée dans un X-Opsiq- En-tête de la clé de pont.URLsetting est la racine du site de la plate-forme.

Le Constructeur de connecteurs peut générer ceci pour vous maintenant.API" profile (ou set data access to bridge) et il émet le fichier bridge, l'extrait de panneau correspondant et les actions dactylographiées qui lisent et écrivent à travers lui — pour une application Laravel lisant son .env, pourWordPresslecture wp-config.php, ou avec des identifiants que vous collez pour n'importe quoi d'autre.OpsIQprotocole de pont: le connecteur génère en toute sécurité api_key lorsque activé, l'envoie comme X-Opsiq-Bridge-Key, et lie cette même valeur OPSIQ_BRIDGE_KEY Author à la main seulement lorsque votre plateforme n'est pas celle, ou quand vous avez besoin de comportement le pont généré ne couvre pas. Un pont manuscrit est sûr de l'assistant : il écrase seulement un fichier de pont portant son propre marqueur.
💡
Tout sur cette page est affiché en PHP contre MySQL, parce que c'est l'implémentation de référence et la seule combinaison que le pipeline d'emballage supporte pleinement. Le modèle lui-même est langue-agnostique et moteur-agnoStique: voir "Le pont dans d'autres langues et autres bases de données" pour la porte en Node, Python, Go, Ruby, .NET et Java, la requête d'introspection pour PostgreSQL, SQL Serveur, SQLite et Oracle, et le MongoDB équivalent — avec la contrainte d'emballage qui détermine comment un pont non PHP atteint l'opérateur.

Le modèle de sécurité, et pourquoi chaque règle est là

Ce fichier est situé dans une webroot publique derrière une clé partagée. Ce seul fait conduit chaque règle ci-dessous. Ne détendez aucun d'entre eux pour rendre votre pont plus simple.

L'appelant ne fournit jamais SQL

Pas une clause OÙ, pas un fragment ORDER BY, pas juste un paramètre de requête brute "une fois". L'appelant nomme une table, une colonne et une valeur; votre fichier construit l'instruction. Le moment où un appelant peut contribuer SQL texte, une clé partagée devient arbitraire exécution de base de données.

Les noms de tableau et de colonne sont validés en fonction du_schéma d'information

Les identifiants ne peuvent être liés en tant que paramètres, ils doivent donc être vérifiés à la place. Lisez la liste de tableaux et de colonnes réelles pour CE fichier et refusez tout ce qui n'y figure pas. Un identifiant qui n ́est pas un objet réel de ce schéma ne peut alors pas atteindre une requête du tout — ce qui rend sûr d ́exposer chaque table.

Chaque valeur est un paramètre lié

Sans exception, y compris les valeurs à l'intérieur d'une recherche. Les identifiants validés plus les valeurs limites sont la paire qui rend le total de surface et la surface d'injection nulle.

Les lectures sont universelles, les écrits sont listés

Voir le prochain bloc. C'est la règle que les gens veulent le plus sauter.

Les colonnes secrètes sont expurgées en lecture et refusées en écriture

Correspondance sur la colonne NOM: mot de passe, remember_token, secret, api_key, private_key et sel. Remplacer la valeur par un porte-places en sortie. Refuser l'écriture entièrement en cours de route — écrire un hash brut n'est pas une opération, c'est un pistolet de pied. Envoyer l'opérateur au flux de mot de passer propre à la plate-forme.

Les suppressions sont à une ligne, par clé primaire

Jamais un vrac supprimer, jamais un effacer par filtre. Un enlèvement en vrac est la façon dont une base de données meurt. Si quelqu'un a vraiment besoin d'un, ils peuvent le faire dans la plate-forme.

Les lectures sont en rangée

Fermez le paramètre limite avec un plafond dur. Une requête fugueuse ne doit pas pouvoir vider la base de données à travers un message de chat.

Échec fermé jusqu'à ce que la clé soit réglée

Un pont non configuré répond 403 à tout. Un pont qui est utile avant qu'il soit configuré est un pont qui a été utile à un étranger.

Comparaison des clés à temps constant, clé dans un en-tête

La clé est dans X-Opsiq_-Bridge-Key, pas la chaîne de requête, donc elle reste hors des journaux d'accès, des journaux proxy et des en-têtes de référencier.

Obtenir seulement

Une méthode, une forme, rien à faire entrer en contrebande dans un corps. Tout ce que fait le pont est expressible comme GET avec des paramètres validés, et OpsIQ est le seul appelant.

Lire universel, écrit permis-énuméré — et pourquoi

C'est la règle qui se dispute, alors voici le raisonnement en entier. L'assistant devrait être capable de VOIR toute la plate-forme: c'est ce qui la rend utile, et une lecture ne peut rien détruire. Les écritures sont différentes. Ce fichier est situé dans un webroot public derrière UNE clé partagée. Si cette clé fuit, une surface d'écriture sans restriction fait la fuite équivalente à un contrôle complet de base de données — un nouvel utilisateur admin, une table de réservation vidée. Une liste permis signifie qu'une clé divulguée ne peut toujours pas atteindre une table que l'opérateur n'a jamais activée.

⚠️
La carte d'approbation OpsIQ permet l'IA, pas la clé. L'administrateur cliquer Permettre sur une action destructrice est un contrôle sur l'assistant. Ce n'est pas un contrôle de celui qui détient la clé de pont. Ce sont deux menaces différentes, et la liste d'autorisation est la réponse à la seconde.
Le bouton face à l'opérateur, depuis le pont Botble
/* ── WRITE ALLOW-LIST — which tables the assistant may CHANGE here.
 *
 * READS are unrestricted: the assistant can see every table in the platform.
 * WRITES are limited to this list, because this file sits in a PUBLIC webroot
 * behind ONE shared key — an allow-list means that even a leaked key cannot
 * reach a table you never enabled (no new admin users, no emptied bookings).
 *
 * Comma-separated table names. Add tables as you need them — e.g. append
 * ',pages,posts' to let the assistant edit site content. Set it to '*' to
 * allow every table, deliberately. Empty falls back to the hotel defaults. ── */
const OPSIQ_WRITE_TABLES = 'ht_bookings,ht_booking_rooms,ht_booking_addresses,ht_rooms,ht_room_types,ht_customers,customers';

Deux détails dans le chèque ci-dessous sont faciles à corriger. Le nom de la table arrive déjà RESOLVED, en portant le préfixe de la tableau d'installation, tandis qu'un opérateur écrit la liste d'autorisation non préfixée car c'est ce qu'ils taperaient naturellement. Comparez les deux façons ou une installation préfixé permet silencieusement rien et chaque pause d'écriture. Et le refus doit s'expliquer, parce que la personne qui lit est un administrateur dans une fenêtre de chat, pas un développeur avec une trace de pile.

La vérification de la liste d'autorisation, à partir de marketplace_connectors/botble/bridge/opsiq-botble-bridge.php
/** Tables a WRITE may touch. Empty = the built-in defaults. */
$writeAllowed = static function (string $table) use ($prefix): bool {
    $raw = trim((string)(defined('OPSIQ_WRITE_TABLES') ? OPSIQ_WRITE_TABLES : ''));
    if ($raw === '') $raw = 'ht_bookings,ht_booking_rooms,ht_rooms,ht_customers,customers';
    if (trim($raw) === '*') return true;                     // explicit opt-in to everything
    $bare = ($prefix !== '' && stripos($table, $prefix) === 0) ? substr($table, strlen($prefix)) : $table;
    foreach (explode(',', $raw) as $t) {
        $t = trim($t);
        if ($t === '') continue;
        if (strcasecmp($t, $table) === 0) return true;
        if (strcasecmp($t, $bare)  === 0) return true;
        if ($prefix !== '' && strcasecmp($prefix . $t, $table) === 0) return true;
    }
    return false;
};

/** One refusal, one explanation — used by every write op. */
$requireWritable = static function (string $table) use ($writeAllowed): void {
    if ($writeAllowed($table)) return;
    opsiq_bridge_out(['success' => false, 'error' =>
        'write_not_allowed: "' . $table . '" is not in this bridge\'s write allow-list. '
        . 'Reads are unrestricted. To permit writes here, add the table to OPSIQ_WRITE_TABLES '
        . 'in opsiq-botble-bridge.php (or set it to "*" to allow every table).'], 403);
};

La porte, en entier

Quatre contrôles, dans cet ordre, avant que rien ne touche les données. Copier la commande ainsi que les contrôles.

Les quatre contrôles de porte, en ordre
<?php
declare(strict_types=1);

/* ── EDIT THIS: a long random secret (40+ chars). Empty = bridge OFF. ── */
const OPSIQ_BRIDGE_KEY = '';

header('Content-Type: application/json; charset=utf-8');
header('Cache-Control: no-store');

function opsiq_bridge_out(array $payload, int $code = 200): void
{
    http_response_code($code);
    echo json_encode($payload, JSON_UNESCAPED_SLASHES);
    exit;
}

/* 1. Fail closed. An unconfigured bridge answers nothing to anyone. */
if (OPSIQ_BRIDGE_KEY === '' || strlen(OPSIQ_BRIDGE_KEY) < 24) {
    opsiq_bridge_out(['success' => false, 'error' => 'bridge_not_configured'], 403);
}
/* 2. One method. */
if (strtoupper((string)($_SERVER['REQUEST_METHOD'] ?? '')) !== 'GET') {
    opsiq_bridge_out(['success' => false, 'error' => 'method_not_allowed'], 405);
}
/* 3. Constant-time key comparison, key from a header (never the query string). */
$given = (string)($_SERVER['HTTP_X_OPSIQ_BRIDGE_KEY'] ?? '');
if ($given === '' || !hash_equals(OPSIQ_BRIDGE_KEY, $given)) {
    opsiq_bridge_out(['success' => false, 'error' => 'forbidden'], 403);
}
/* 4. Only now read credentials and connect. */

Valider les identifiants en fonction du_schéma d'information

C'est la pièce qui transforme "l'assistant peut atteindre n'importe quelle table" en sécurité. Résolvez le nom de la table de l'appelant contre le schéma réel, tolèrez un préfixe de table manquant ou supplémentaire, et retournez nul pour tout le reste. Tout en aval fonctionne alors avec un nom qui existe probablement.

Validation et rédaction des identifiants, mot pour mot depuis le pont Botble
/** Real tables in THIS database — the allow-list, straight from the DB. */
$allTables = static function () use ($pdo, $db): array {
    static $cache = null;
    if ($cache !== null) return $cache;
    $st = $pdo->prepare('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? ORDER BY TABLE_NAME');
    $st->execute([$db]);
    return $cache = array_map('strval', $st->fetchAll(PDO::FETCH_COLUMN));
};

/** Resolve a caller-supplied table name to a REAL one, or null. */
$resolveTable = static function (string $name) use ($allTables, $prefix): ?string {
    $name = trim($name);
    if ($name === '' || !preg_match('/^[A-Za-z0-9_]+$/', $name)) return null;
    $tables = $allTables();
    foreach ($tables as $t) if (strcasecmp($t, $name) === 0) return $t;
    /* Tolerate a missing or extra table prefix. */
    foreach ($tables as $t) {
        if (strcasecmp($t, $prefix . $name) === 0) return $t;
        if ($prefix !== '' && strcasecmp($prefix . $t, $name) === 0) return $t;
    }
    return null;
};

/** Column introspection: table => [column => true]. Cached per request. */
function opsiq_bridge_columns(PDO $pdo, string $db, string $table): array
{
    static $cache = [];
    if (isset($cache[$table])) return $cache[$table];
    $stmt = $pdo->prepare('SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?');
    $stmt->execute([$db, $table]);
    $cols = [];
    foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $c) $cols[strtolower((string)$c)] = true;
    return $cache[$table] = $cols;
}

/** Columns whose VALUES must never leave the platform. */
$secretCol = static function (string $c): bool {
    return (bool)preg_match('/(^|_)(password|remember_token|secret|api_key|private_key|salt|token)($|_)/i', $c);
};
/** Columns a write may never touch — auth material. */
$writeBanned = static function (string $c): bool {
    return (bool)preg_match('/(^|_)(password|remember_token)($|_)/i', $c);
};
/** Strip secret values from a row before it leaves the server. */
$redact = static function (array $row) use ($secretCol): array {
    foreach ($row as $k => $v) if ($secretCol((string)$k)) $row[$k] = '[redacted]';
    return $row;
};

Une opération de lecture et une op d'écriture, terminée

Notez ce qui est lié et ce qui a été validé. La colonne filtre est cochée sur la liste des colonnes réelles puis interpolée comme un identifiant; sa valeur est liée. La limite est serrée. Les lignes sont expurgées en sortant. La mise à jour refuse la clé primaire et toute colonne auth, et les timbres mis à jour_at lorsque la table en a une.

Lire n'importe quel tableau — identifiants validés, valeurs limites, lignes plafonnées
case 'query': {
    $t = $resolveTable((string)($_GET['table'] ?? ''));
    if ($t === null) opsiq_bridge_out(['success' => false, 'error' => 'unknown_table'], 404);
    $cols = opsiq_bridge_columns($pdo, $db, $t);
    if (!$cols) opsiq_bridge_out(['success' => false, 'error' => 'unknown_table'], 404);

    $sql = "SELECT * FROM `$t` WHERE 1=1";
    $args = [];

    /* Equality filter: column must be REAL, value is bound. */
    $wc = strtolower(trim((string)($_GET['where_column'] ?? '')));
    if ($wc !== '') {
        if (!isset($cols[$wc])) opsiq_bridge_out(['success' => false, 'error' => 'unknown_column: ' . $wc], 400);
        $sql .= " AND `$wc` = ?";
        $args[] = (string)($_GET['where_value'] ?? '');
    }
    /* Ordering: column validated, direction from a fixed pair. */
    $ob = strtolower(trim((string)($_GET['order_by'] ?? '')));
    if ($ob !== '' && isset($cols[$ob])) {
        $dir = strtoupper(trim((string)($_GET['order'] ?? 'DESC'))) === 'ASC' ? 'ASC' : 'DESC';
        $sql .= " ORDER BY `$ob` $dir";
    } elseif (isset($cols['id'])) {
        $sql .= " ORDER BY `id` DESC";
    }
    /* Hard row cap. */
    $lim = (int)($_GET['limit'] ?? 25);
    if ($lim < 1)   $lim = 25;
    if ($lim > 200) $lim = 200;
    $off = max(0, (int)($_GET['offset'] ?? 0));
    $sql .= " LIMIT $lim OFFSET $off";

    $st = $pdo->prepare($sql);
    $st->execute($args);
    $rows = array_map($redact, $st->fetchAll());
    opsiq_bridge_out(['success' => true, 'data' => [
        'table' => $t, 'returned' => count($rows), 'rows' => $rows,
    ]]);
}
Écrire une ligne — tableau en liste autorisée, colonnes auth refusées, ligne unique par clé primaire
case 'record.update': {
    $t = $resolveTable((string)($_GET['table'] ?? ''));
    if ($t === null) opsiq_bridge_out(['success' => false, 'error' => 'unknown_table'], 404);
    $requireWritable($t);                       // the allow-list, before anything else
    $cols = opsiq_bridge_columns($pdo, $db, $t);
    $pk   = $primaryKey($t);
    $id   = (string)($_GET['id'] ?? '');
    if ($id === '') opsiq_bridge_out(['success' => false, 'error' => 'id_required'], 400);

    $set = json_decode((string)($_GET['set'] ?? ''), true);
    if (!is_array($set) || !$set) opsiq_bridge_out(['success' => false, 'error' => 'set_json_required'], 400);

    $frag = []; $args = [];
    foreach ($set as $col => $val) {
        $col = strtolower(trim((string)$col));
        if (!isset($cols[$col]))  opsiq_bridge_out(['success' => false, 'error' => 'unknown_column: ' . $col], 400);
        if ($writeBanned($col))   opsiq_bridge_out(['success' => false, 'error' => 'refused: "' . $col . '" is auth material - change it through the platform own password flow, never by direct write.'], 400);
        if ($col === $pk)         opsiq_bridge_out(['success' => false, 'error' => 'refused: the primary key cannot be rewritten.'], 400);
        if (is_array($val) || is_object($val)) $val = json_encode($val, JSON_UNESCAPED_SLASHES);
        $frag[] = "`$col` = ?";
        $args[] = ($val === null) ? null : (string)$val;
    }
    if (isset($cols['updated_at']) && !isset($set['updated_at'])) $frag[] = '`updated_at` = NOW()';

    $before = $pdo->prepare("SELECT * FROM `$t` WHERE `$pk` = ? LIMIT 1");
    $before->execute([$id]);
    $prev = $before->fetch();
    if (!$prev) opsiq_bridge_out(['success' => false, 'error' => 'not_found'], 404);

    $args[] = $id;
    $up = $pdo->prepare("UPDATE `$t` SET " . implode(', ', $frag) . " WHERE `$pk` = ? LIMIT 1");
    $up->execute($args);
    opsiq_bridge_out(['success' => true, 'data' => [
        'table' => $t, 'id' => $id, 'changed' => $up->rowCount(),
        'before' => $redact(array_intersect_key($prev, $set)),
    ]]);
}

Différences de schéma de survie

Les versions de la plate-forme diffèrent. Les colonnes se déplacent, sont rebaptisées ou sont absentes. Un pont qui suppose qu'un schéma fonctionne sur une installation. Introspecter et s'adapter à la place : sélectionnez seulement les colonnes qui existent ici, tolèrez le préfixe de table, et essayez l'orthographe plausible d'une référence.

Tolérance au schéma, depuis le pont Botble
/* Only ever select columns that exist on THIS install. */
$pick = static function (array $cols, array $wanted, string $alias = 'b'): string {
    $out = [];
    foreach ($wanted as $c) if (isset($cols[$c])) $out[] = "`$alias`.`$c`";
    return $out ? implode(', ', $out) : "`$alias`.*";
};

/* References vary: stored with or without a leading "#", with or without an
 * operator-configured alpha prefix, or only as a numeric id. Try every
 * plausible form — the PROOF match is what actually gates disclosure, so
 * tolerant matching here is safe. */
$refCandidates = [$ref, '#' . $ref];
$digitsOnly = preg_replace('/\D+/', '', $ref);
if ($digitsOnly !== '' && $digitsOnly !== $ref) {
    $refCandidates[] = $digitsOnly;
    $refCandidates[] = '#' . $digitsOnly;
}
$refCandidates = array_values(array_unique($refCandidates));
💡
Donnez à votre bridge un op=diag qui ne rapporte que la STRUCTURE — quelles tables ont résolu, quelles colonnes la table principale a, et le SHAPE de la nouvelle référence avec chaque chiffre masqué. Il est clé-fait comme tout le reste, et il transforme "la recherche ne trouve rien" d'un ticket de support en une réponse dix secondes. Ne jamais laisser retourner des enregistrements réels.

Erreurs uniformes et piège de dénombrement

Une forme pour tout

Success is {"success":true,"data":{...}}. Failure is {"success":false,"error":"snake_case_reason"}. Your Client.php and every action then have exactly one response shape to handle.

Non-trouvé et sans correspondance doit être identique

Sur une surface de recherche, une référence qui n'existe pas et une référence dont la preuve ne correspond pas doit produire la réponse SAME. Différentes réponses transforment votre pont en un oracle qui confirme quelles références sont réelles, ce qui est une liste gratuite d'exportation pour tout patient.

Ne jamais divulguer la raison à un visiteur

Le pont peut être précis avecOpsIQ. Ce qui atteint un visiteur est décidé parOpsIQ, dans un refus fixe.

Le fichier copiable dans le panneau de connecteur

L'opérateur n'ouvre jamais votre dépôt. Ils ouvrent le panneau du connecteur dansOpsIQet appuyez sur Copie. Cette copie vient de paramètres.json, et il doit être le même programme que bridge/*.php.

paramètres.json — l'entrée du panneau pour un connecteur de pont
{
  "settings": [
    { "key": "base_url", "label": "API base URL", "type": "text", "required": true },
    { "key": "api_key",  "label": "Bridge key",   "type": "password", "required": true,
      "autogenerate": true,
      "help": "Auto-generated the moment you enable the connector. It must match OPSIQ_BRIDGE_KEY inside the bridge file; the copyable file below already carries this value once saved." }
  ],
  "webhook_help": {
    "title": "One file, three surfaces",
    "body": "This platform has no public REST API, so this ONE file IS the API. Copy it into the site PUBLIC webroot, keeping the filename.",
    "snippet_filename": "opsiq-yourplatform-bridge.php   (drop next to the site index.php)",
    "snippet_template": "<?php\n/* ... the whole bridge file ... */\nconst OPSIQ_BRIDGE_KEY = \u0027{{setting:api_key}}\u0027;\n..."
  },
  "snippet_bindings": [
    { "assignment": "OPSIQ_BRIDGE_KEY", "setting": "api_key" }
  ]
}
{{setting:key}} carries live values

The connector panel substitutes {{setting:<key>}} in the snippet with that connector's saved value, so the copied file already contains the operator's generated bridge key and needs no hand-edit. An empty or unsaved setting leaves the token visible, so the operator can see exactly what is still missing.

les liaisons snippet survivent à la régénération

Déclarez explicitement chaque tâche secrète générée. L'outil de synchronisation reconstruise la copie du panneau à partir du pont expédié et restaure OPSIQ_BRIDGE_KEY = {{setting:api_key}} sans cela, une mise à niveau peut copier fidèlement le fichier de paquet sans clé et supprimer silencieusement le porte-clef déployable de l'opérateur. Connector Builder émet cette liaison automatiquement pour les paquets de pont générés.

D'autres détenteurs de place sont substitués côté serveur

Indépendamment de cela,{webhook_url}, {webhook_path}, {webhook_secret}, {site_key}, {base_url}et{slug}sont remplis avant que le panneau ne voit jamais l'extrait.

webhook_help peut être un objet ou une liste

Une liste vous donne plusieurs extraits dans un panneau, par exemple un fichier de pont et un crochet de relais séparé.

🚫
Ne pas maintenir l'extrait de pont à la main. Le fichier du pont et la copie du panneau sont deux copies d'un programme, et ils DIRECT — un pont a été amélioré et sa copie du tableau n'était pas, donc quiconque a réinstallé et copié du panneau installé l'ancien pont et a silencieusement perdu toutes les nouvelles capacités.
Gardez les deux copies identiques
# Regenerate every package's panel snippet from its bridge file
php tools/sync_connector_bridge_snippets.php --apply

# Show what would change, without writing
php tools/sync_connector_bridge_snippets.php

Drift is now a failing conformance check, not a support ticket: the verifier compares the two line by line (ignoring the {{setting:...}} placeholders, which are supposed to differ) and names the first line that differs. Run the sync tool as the last step before every release, right before signing.

Ce que le pont devrait exposer

Les opérations en forme et une surface de données universelles, ensemble. Les personnes en forme retournent des réponses ordonnées, conçues pour répondre aux questions que les gens posent réellement; les personnes en ligne couvrent tout le reste afin que l'assistant ne soit jamais coincé.

Lectures en forme

statistiques, la liste d'objets principale avec filtres, un objet avec ses lignes connexes, le catalogue de ce qui est vendu, recherche client avec l'historique. Ceux-ci donnent à l'IA une bonne réponse en un appel au lieu de cinq.

Écrits en forme

Les deux ou trois changements d'état qui comptent — définir le statut, annuler. Conserver les valeurs acceptées sur la liste.

Commerce dactylographié

Pour une plate-forme vendable exposer catalogue conçu, devis, commande/commande et opérations de preuve de paiement, puis les cartographier en commerce_roles.json avec transport: bridge. Ne jamais cartographier un commerce écrire le rôle à l'enregistrement universel. create/update surface.

Découverte universelle

les tableaux (avec nombre de lignes) et décrire (colonnes, types, clé primaire, plus des drapeaux lisibles et enregistrables par colonne). C'est ainsi que l'assistant apprend une plateforme que vous n'avez pas prévue.

Lecture et écriture universelles

requête, record. get, records. create, record . update, record, record_delete. Tous validés comme indiqué ci-dessus.

Identité, avant la porte de clé

Les sondes d'identité sont appelées par le ADMIN'S BROWSER, même origine, de sorte qu'elles ne peuvent pas envoyer un en-tête personnalisé. Leur authentification est la session de plate-forme elle-même. Mettez-les en avant de la porte clé, les tenir loin de toutes les données d'enregistrement, et ne jamais les laisser retourner un secret. Voir la page d'identification du connecteur.

Diagnostic

op=diag, structure only, masked.

Carte des rôles du commerce par ponts
{
  "commerce": {
    "roles": {
      "catalog_search": {"operation":"hotel_catalog_search","transport":"bridge"},
      "quote":          {"operation":"hotel_quote","transport":"bridge"},
      "order_create":   {"operation":"hotel_order_create","transport":"bridge",
                           "recovery":"hotel_order_get"},
      "order_get":      {"operation":"hotel_order_get","transport":"bridge"},
      "record_payment": {"operation":"hotel_record_payment","transport":"bridge",
                           "recovery":"hotel_order_get"}
    },
    "customer_ordering": {
      "enabled":true, "version":1, "mode":"direct_order",
      "audience":"guests_and_clients", "account_flow":"guest_checkout",
      "payment_flow":"opsiq_gateway"
    }
  }
}
💡
Le rôle canonique contrôle la séquence et l'autorité; l'opération de pont conserve la charge utile dactylographiée de la plate-forme. Un hôtel peut exiger l'arrivée, le départ et les invités, WHMCS peut nécessiter un client existant ou une inscription de connecteur, et une plateforme SaaS peut exiger un cycle de facturation. Core ne code jamais ces champs.
⚠️
record_payment Acceptez uniquement les preuves du fournisseur vérifiées par le serveur : ordre exact, marchand, montant, monnaie ISO, référence du fournisseur, nouvelle timestamp vérifiée et clé d'idempotency. Persistez-le à travers le paiement/facture de la plate-forme API, puis retournez une commande ou un ré-évaluation de facture faisant autorité. Un résultat inconnu doit être récupéré avant toute réessayer.
💡
Un connecteur en lecture seule n'a pas besoin d'une liste d'autorisation. Si votre plateforme ne répond qu'à des questions, expédiez un pont sans écriture et toute la classe de risque d'écriture disparaît. Ajoutez les écrits lorsque quelqu'un vous les demande.

Liste de contrôle avant d'expédier un pont

Le pont refuse tout sans clé

Testez-le. Renommer la constante pour vider et confirmer chaque réponse op 403.

Une mauvaise clé est refusée en temps constant

hash_egals, et la clé lue depuis l'en-tête seulement.

Un nom de table maquillé est refusé

Et un vrai nom de table avec un faux préfixe résout encore.

Une colonne de mot de passe n'apparaît jamais dans une lecture

Et une écriture qui donne un nom à un est refusée avec une explication.

Un écrit à une table en dehors de la liste d'autorisation est refusé

Avec le message qui indique à l'opérateur comment l'élargir.

L'extrait de panneau correspond au fichier du pont

php tools/sync_connector_bridge_snippets. php le rapporte en étape.

La remise en service du connecteur n'est pas suffisante

Si votre paquet envoie un fichier de passerelle, un opérateur mettant à niveau le connecteur doit ALSO redéployer ce fichier dans leur webroot. Dites-le dans le corps du panneau et dans votre CHANGELOG, chaque version.

Connecteurs

Démarrage du cadre propre de la plateforme à partir d'un pont

Un pont qui lit seulement peut parler SQL. Un pont que CREATE les choses sur la plate-forme (un ordre, une réservation, une facture payée) doit passer par la propre couche d'application de la plateforme, et le démarrage cette couche sans tête est où chaque échec subtil dans ce modèle vit. Tout ci-dessous a été appris la manière dure sur une intégration en direct, chaque règle contre un vrai défaut qui n'a produit aucune erreur nulle part.

Une ligne dans la base de données n'est pas un ordre

Les INSERTs bruts créent un enregistrement d'ombre

La ligne apparaît, admin la liste et ce n'est toujours pas un enregistrement que la plateforme croit avoir créé : aucun numéro de référence natif, aucun crochet modèle, aucun événement, aucune facture, aucun email client, aucun lien fonctionnel avec le client. Le client cite une référence que la plate-forme n'a jamais émise au personnel qui ne peut la trouver. Créez par le service propre de la plateforme; si elle expose seulement un service post-paiement, créez le graphique qu'elle attend et remettez à la couture qu'il définit.

Ne jamais réappliquer la numérotation de la plateforme

Deux échantillons d'un format de référence le rendent facile à reproduire, et la reproduire est le même niveau d'écriture d'ombre : le jour où la plate-forme change son schéma, chaque enregistrement est erroné et rien ne vous avertit. Appelez son générateur (la réflexion atteint un non-statique), et lisez la valeur stockée plutôt que de faire confiance à ce que vous avez envoyé.

Les colonnes de plate-forme conservent les significations de la plate-formes

Avant de stocker quoi que ce soit dans une colonne de plate-forme, trouvez chaque lecteur. Une colonne nommée comme un emplacement libre peut être chargée: sur l'intégration de référence, transaction_id s'est avéré être le jeton du lien de "voir votre réservation" envoyé par email au client résout à travers: un digest idempotency stocké là a tranquillement cassé chaque lien invité idempotency_key) est le garde de replay, la contrainte refuse le jumeau concurrent, et la recherche de récupération lit la même table que la création écrite. Créer cette table AVANT de commencerTransaction: MySQL DDL commet une transaction ouverte implicitement.

Événements, auditeurs et le piège à double courrier

Lire la source du service avant de distribuer ses événements

Si le service de plate-forme que vous appelez envoie déjà l'événement, l'envoyer vous-même envoie au client deux emails de confirmation et génère deux factures. Si rien n'écoute, l ́envoi ne fait aucune erreur. Ni la défaillance ne soulève une erreur. Reflètez la méthode, tranchez ses lignes source, et lisez ce qu'il fait réellement: une estimation basée sur le nom et même un régex sur le corps ont tous deux eu ce tort avant que la source le règle.

getListeners() cache la vérité; getRawListéners(), le dit

Laravel enveloppe les auditeurs de classe dans les fermetures, donc getListeners() rapports [email protected] pour tout. getRawListeners() nomme les classes réelles. Ne jamais envoyer un événement dont les auditeurs ne peuvent pas nommer.

SiQuee ne signifie pas "course plus tard"

Avec file d'attente=sync (le défaut sur beaucoup d'installation de production) un auditeur en attente exécute INLINE dans votre demande de pont. Votre contexte de démarrage EST son contexte de rendu: chaque enregistrement ou URL défaut dans votre démarrage atterrit dans la boîte de réception du client. Vérifiez config('queue.default') avant de raisonner sur l'endroit où tout fonctionne, et regardez dans les tâches/failed_jobs avant d'assumer la participation d'un travailleur.

Gardes de rétrie avec l'état propre de la plate-forme

Un service qui expédie sans condition doit être appelé exactement une fois. Le marqueur qui ne peut dériver est le propre état de la plate-forme (seul appel alors que le disque est toujours en attente), pas un drapeau parallèle "envoy" de votre qui peut être en désaccord avec elle.

Le boot sans tête n'est pas le boot web

Enregistrez ce que le boot web enregistre

Template variables, module settings, filter hooks: platform service providers often register them only on a web request. On the reference integration the email handler substitutes only REGISTERED variables: every value was set correctly and the customer's confirmation still rendered with empty name, phone and link, no error anywhere, because registration lives in a runtime registry the headless boot never filled. Find the platform's registration call (for Botble: EmailHandler::addTemplateSettings with the module's email config) and make it in your boot, exactly as the platform's own provider does.

Pinner chaque racine URL, pas seulement le routeur

Les points de requête capturés à votre script bridge, donc route(), url() et actif() générer site.com/publique/opsiq-bridge.php/checkout/TOKEN: un lien client via une JSON fin de série. forceRootUrl(config('app.url')) corrige le générateur; le disque STORAGE a sa propre racine, de sorte que le logo envoyé par courriel reste cassé jusqu'à filesystems.disks.public.url est aussi défini (il résout paresseusement, donc le régler à l'amorçage fonctionne, et seulement quand vide ou script-relative: CDN d'un opérateur URL n'est pas à vous de passer outre).

Commit avant de te livrer

Les services de la plateforme lisent par leur propre connexion et ne peuvent pas voir votre transaction ouverte. Appelé avant le commit, un service post-paiement ne trouve aucun paiement terminé, laisse tranquillement le dossier impayé, et allume toujours ses événements, donc le client est envoyé par courriel sur un enregistrement que la plate-forme pense non payé.

Règles d'honnêteté

Pas de reculs d'ombre

Si le chemin natif est inaccessible, refuser avec une erreur réticulable AVANT que l'argent ne bouge. Jamais inventer une référence, jamais rough-update un statut pour faire un enregistrement à moitié intégré look terminé. Un paiement vérifié dont le traitement natif va à la réconciliation comme needs_attention: l' argent est réel, l'état est honnêtement «payé, pas encore traité».

Signalez les faits, pas votre déclaration

"Le service a fonctionné" et "le client a été dit" sont des faits différents: l'intégration de référence a envoyé un courriel complet avec chaque champ vide tandis que le drapeau a dit vrai platform_notified qui force les OpsIQ confirmation de repli chaque fois que la plate-forme ne traite pas, et ne réclame jamais la livraison: une boîte de réception n'est pas observable à partir d'un serveur.

Mesurer, puis écrire

Expédiez une sonde de capacités en lecture seule dans le pont : existence de classe, signatures de méthode, tranches de source des méthodes que vous comptez appeler, auditeurs bruts, pilote de file d'attente, et (lorsque l'on peut répondre à une question en appelant une fonction inoffensive) l'appel en direct lui-même. Cinq théories sur un email creux sont mortes contre les mesures avant que la source ne le règle.

Connecteurs

La passerelle dans d'autres langues et autres bases de données

Le modèle de pont n'est pas un modèle PHP.OpsIQappels est un paramètre HTTP, de sorte que le fichier peut être Node, Python, Go, Ruby, .NET ou Java, et le magasin derrière il peut être n'importe quelSQLmoteur ouMongoDB. Ce qui est en forme de PHP est le pipeline d'emballage, et cette contrainte décide comment votre pont atteint l'opérateur. Lire la section de livraison d'abord : c'est la partie qui surprend les gens.

Ce que le connecteur nécessite réellement

Rien ne donne de nom à une langue.

Transport

HTTPS. Une requête GET par appel. Pas de corps, pas d'autre méthode.

Authentification

Un secret partagé dans le X-Opsiq-Bridge-Key request en-tête, comparé en temps constant. Pas un paramètre de requête, pas un cookie, pas Basic auth.

Paramètres

- C'est une corde de requête. op désigne la surface, do Nomme l'opération, le reste sont les arguments de cette opération.

Réponse

JSON. {"success":true,"data":{...}} ou {"success":false,"error":"snake_case_reason"}. Application de type contenu/json, et sans cache.

Codes d'état

200sur le succès.403clé non configurée ou incorrecte,404non trouvé,405mauvaise méthode,400Mauvais argument,501non supporté sur ce schéma.

C'est tout.

Pas de cadre, pas d'exécution, pas de bibliothèque OpsIQ de votre côté. S'il peut servir cela, il peut être un pont.

Livraison: ce qui peut vivre dans le pont/, et ce qui ne doit pas

Le paquet signé couvre une liste fixe d'extensions de fichiers, et un fichier en dehors de cette liste est laissé hors du ZIP. Un pont dans une langue la liste ne couvre donc pas ne peut pas expédier à l'intérieur du paquet — mais il ne peut plus disparaître sur vous non plus.26Août2026un fichier dans bridge/ que le paqueteur tomberait est une défaillance de conformité difficile, donc le paquet refuse de passer plutôt que d'installer sans pont dedans.

Comment un bridge/ dossier est traité au moment de la construction
bridge/bridge.php     ->  SHIPPED, and drift-checked against the panel snippet
bridge/server.js      ->  SHIPPED, and drift-checked against the panel snippet
bridge/bridge.py      ->  REFUSED at conformance: "Bridge files are packaged" FAILS
bridge/bridge.rb      ->  REFUSED at conformance
bridge/main.go        ->  REFUSED at conformance
bridge/Bridge.cs      ->  REFUSED at conformance
bridge/Bridge.java    ->  REFUSED at conformance
PHP et JavaScript — entièrement pris en charge

Le fichier est livré dans le ZIP signé, et le vérificateur d'extrait de code contient votre copie de panneau octet-identique à elle, l'un des deux il est. La vérification de dérive lit chaque fichier dans bridge/, pas seulement les PHP, donc un pont mis à niveau avec une copie de tableau stale échoue la construction dans l'une ou l'autre langue.

Tout le reste — livrer par le panneau seulement

Le panneau snipet est un texte simple sans idée de la langue qu'il contient, donc il fonctionne pour n'importe quelle pile. Mettez le programme entier dans webhook_help. sniptepet_template, nomez le fichier dans snipset_filename, et ne laissez PAS une copie dans bridge/ — conformance refusera le paquet plutôt que de l'expédier creux. Dites clairement dans webHook_ Help. body que l'opérateur copie ce fichier plutôt que le récupérer du paquet.

Si vous avez vraiment besoin d'une autre langue dans le paquet

Widen PackageSigner::EXTENSIONS deliberately, then re-sign and re-seed. That is a decision about what executable code Nabtech distributes, so make it on purpose — do not discover it from a missing file.

💡
Nommer le fichier dans webhook_help.snippet_filename chaque fois que votre colis expédie plus d'un pont. C'est ainsi que le vérificateur sait à quel pont une copie de panneau appartient; sans elle, un appariement ambigu est signalé comme un avertissement de conformité et que l'extrait est laissé incoordonné.
⚠️
Le point de la vérification de dérive est qu'un fichier de pont et sa copie de panneau sont deux copies d'un programme et WILL divergent. Régénérer plutôt que main-modifier: php tools/sync_connector_bridge_snippets.php --apply, puis resignez le paquet.

La porte, en six langues

Mêmes quatre contrôles dans le même ordre partout : échec fermé sans clé, une méthode, comparaison de clé à temps constant depuis l'en-tête, puis connexion. Le seul vrai piège est la comparaison, et c'est un piège différent dans chaque langue.

⚠️
Comparer le SHA-256Il est correct dans chaque langue, et il écarte le fait que plusieurs comparateurs à temps constant lancent ou fuient sur une longueur inadapté — Le timing de NodeSafeEqual soulève un RangeError lorsque les tampons diffèrent en longueur, ce qui transforme une mauvaise clé en une500au lieu d'un403.
Node. js — la porte
// Node.js — no dependencies
const http = require("http"), crypto = require("crypto"), url = require("url");

const BRIDGE_KEY = process.env.OPSIQ_BRIDGE_KEY || "";   // empty = bridge OFF

const sameKey = (a, b) => {
  const ha = crypto.createHash("sha256").update(String(a)).digest();
  const hb = crypto.createHash("sha256").update(String(b)).digest();
  return crypto.timingSafeEqual(ha, hb);                 // equal lengths, always
};
const out = (res, payload, code = 200) => {
  res.writeHead(code, { "Content-Type": "application/json; charset=utf-8",
                        "Cache-Control": "no-store" });
  res.end(JSON.stringify(payload));
};

http.createServer(async (req, res) => {
  if (BRIDGE_KEY.length < 24)         return out(res, { success: false, error: "bridge_not_configured" }, 403);
  if (req.method !== "GET")           return out(res, { success: false, error: "method_not_allowed" }, 405);
  const given = req.headers["x-opsiq-bridge-key"] || "";
  if (!given || !sameKey(BRIDGE_KEY, given))
                                      return out(res, { success: false, error: "forbidden" }, 403);

  const q = url.parse(req.url, true).query;
  // ... dispatch on q.op / q.do exactly as the PHP bridge does
}).listen(process.env.PORT || 8787);
Python — la porte
# Python — Flask
import hashlib, hmac, os
from flask import Flask, request, jsonify

app = Flask(__name__)
BRIDGE_KEY = os.environ.get("OPSIQ_BRIDGE_KEY", "")      # empty = bridge OFF

def same_key(a: str, b: str) -> bool:
    return hmac.compare_digest(
        hashlib.sha256(a.encode()).digest(),
        hashlib.sha256(b.encode()).digest(),
    )

def out(payload, code=200):
    resp = jsonify(payload)
    resp.status_code = code
    resp.headers["Cache-Control"] = "no-store"
    return resp

@app.before_request
def gate():
    if len(BRIDGE_KEY) < 24:
        return out({"success": False, "error": "bridge_not_configured"}, 403)
    if request.method != "GET":
        return out({"success": False, "error": "method_not_allowed"}, 405)
    given = request.headers.get("X-Opsiq-Bridge-Key", "")
    if not given or not same_key(BRIDGE_KEY, given):
        return out({"success": False, "error": "forbidden"}, 403)
Go, Ruby, . NET et Java — la même comparaison
// Go
func sameKey(a, b string) bool {
    ha := sha256.Sum256([]byte(a))
    hb := sha256.Sum256([]byte(b))
    return subtle.ConstantTimeCompare(ha[:], hb[:]) == 1
}

func gate(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json; charset=utf-8")
        w.Header().Set("Cache-Control", "no-store")
        key := os.Getenv("OPSIQ_BRIDGE_KEY")
        if len(key) < 24 { out(w, 403, "bridge_not_configured"); return }
        if r.Method != http.MethodGet { out(w, 405, "method_not_allowed"); return }
        given := r.Header.Get("X-Opsiq-Bridge-Key")
        if given == "" || !sameKey(key, given) { out(w, 403, "forbidden"); return }
        next(w, r)
    }
}

// Ruby
def same_key?(a, b)
  OpenSSL.secure_compare(Digest::SHA256.digest(a.to_s), Digest::SHA256.digest(b.to_s))
end

// C# / .NET
static bool SameKey(string a, string b) =>
    CryptographicOperations.FixedTimeEquals(
        SHA256.HashData(Encoding.UTF8.GetBytes(a)),
        SHA256.HashData(Encoding.UTF8.GetBytes(b)));

// Java
static boolean sameKey(String a, String b) throws Exception {
    MessageDigest d = MessageDigest.getInstance("SHA-256");
    return MessageDigest.isEqual(d.digest(a.getBytes(UTF_8)), d.digest(b.getBytes(UTF_8)));
}

Validation des identifiants sur chaque moteur de base de données

La propriété de sécurité ne change pas : un nom de table ou de colonne que l'appelant fournit doit être vérifié par rapport au schéma réel avant qu'il soit interpolé, et chaque valeur doit être un paramètre lié. Seule la requête d'introduction, le caractère de citation et la clause de recherche diffèrent.

MySQLetMariaDB

Tableaux: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?. Colonnes : même contre information_schema.COLUMNS avec AND TABLE_NAME = ?. Citation avec des backticks, doubler n'importe quel backtick à l'intérieur. Page avec LIMIT n OFFSET m.

PostgreSQL

Mêmes vues d'informations_schéma, noms en minuscules, WHERE table_schema = $1 (habituellement public). Citation avec des guillemets doubles, en double de n'importe quel guillemot à l'intérieur. LIMIT n OFFSET m. Regardez la règle de pliage : un identifiant non cité est replié sur le bas du boîtier, alors comparez la case avec l'insensibilité lorsque vous résolvez un nom.

Serveur SQL

Mêmes vues INFORMATION_SCHEMA. Citation avec crochets, en doublement de tout support de fermeture à l'intérieur. ORDER BY [id] DESC OFFSET @o ROWS FETCH NEXT @n ROWS ONLY.

SQLite

Tableaux: SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'. Colonnes : SELECT name FROM pragma_table_info(?) — utiliser cette forme de table, parce que la nu PRAGMA table_info(x) ne peut pas prendre un paramètre lié et inviter l'interpolation de la chaîne il y a exactement le trou que vous essayez de fermer. Citation avec des guillemets doubles. Page avec LIMIT n OFFSET m.

Oracle

Tableaux: SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = :owner; colonnes de ALL_TAB_COLUMNS. Citation avec guillemets doubles, et rappelez-vous un identifiant non cité plie dans le cas UPPER, le contraire de PostgreSQL. Page avec OFFSET :o ROWS FETCH NEXT :n ROWS ONLY les 12C et plus tard.

MongoDB

Non SQL, donc pas d'interpolation des identifiants et aucun paramètre lié — une discipline différente pour le même but. Voir ci-dessous.

La requête d'introduction par moteur
-- MySQL / MariaDB
SELECT TABLE_NAME  FROM information_schema.TABLES  WHERE TABLE_SCHEMA = ?;
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?;

-- PostgreSQL
SELECT table_name  FROM information_schema.tables  WHERE table_schema = $1;
SELECT column_name FROM information_schema.columns WHERE table_schema = $1 AND table_name = $2;

-- SQL Server
SELECT TABLE_NAME  FROM INFORMATION_SCHEMA.TABLES  WHERE TABLE_SCHEMA = @schema;
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table;

-- SQLite
SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%';
SELECT name FROM pragma_table_info(?);

-- Oracle
SELECT TABLE_NAME  FROM ALL_TABLES      WHERE OWNER = :owner;
SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE OWNER = :owner AND TABLE_NAME = :tbl;
💡
Résolvez, puis utilisez le nom RESOLVED. Ne passez jamais l'orthographe de l'appelant à la requête même après la vérification — regardez le vrai nom dans la liste que vous avez lu du schéma et interpolez cela. Cela ne coûte rien et il comble l'écart entre "ce nom correspond quelque chose" et "c'est le nom que je suis sur le point d'exécuter".

MongoDB: les mêmes règles, sansSQL

Il n'y a pas de chaîne de requête à injecter, donc les gens supposent qu'il n'ya rien à garder. Il y a : le document filtre.JSONdirectement dans find() permet à un appelant d'envoyer {"$ne": null} ou {"$gt": ""} où vous attendiez une valeur, et sélectionnez tranquillement chaque document. Construisez le filtre vous-même.

MongoDB — liste de collecte autorisée, filtre scalaire, projection comme redaction
// Node + the official driver
const names = (await db.listCollections({}, { nameOnly: true }).toArray()).map(c => c.name);

function resolveCollection(given) {
  if (!/^[A-Za-z0-9_.-]+$/.test(given || "")) return null;
  return names.find(n => n.toLowerCase() === String(given).toLowerCase()) || null;
}

const coll = resolveCollection(q.collection);
if (!coll) return out(res, { success: false, error: "unknown_collection" }, 404);

// Build the filter from a validated field and a SCALAR value. Never spread
// caller JSON into it: {"$ne":null} would match every document.
const filter = {};
if (q.where_field) {
  if (!/^[A-Za-z0-9_.]+$/.test(q.where_field))
    return out(res, { success: false, error: "unknown_field: " + q.where_field }, 400);
  filter[q.where_field] = String(q.where_value ?? "");   // String() is the guard
}

// Projection is the redaction allow-list: drop secrets, never return them.
const projection = { password: 0, remember_token: 0, api_key: 0, secret: 0, token: 0 };

const limit = Math.min(Math.max(parseInt(q.limit ?? "25", 10) || 25, 1), 200);
const rows  = await db.collection(coll)
                      .find(filter, { projection })
                      .limit(limit)
                      .skip(Math.max(0, parseInt(q.offset ?? "0", 10) || 0))
                      .toArray();
Les noms de collection proviennent de listCollections

C'est votre information_schema. Résolvez l'orthographe de l'appelant contre lui et utilisez le nom résolu.

Forcer chaque valeur de filtre à un scalaire

Un String() ou un Number() autour de lui est la défense complète contre l'injection par l'opérateur. Un document où vous attendez une valeur est l'équivalent NoSQL d'une citation errante.

La projection est la règle de la rédaction

Exclut les champs en forme de secret dans la projection pour qu'ils ne quittent jamais le serveur, plutôt que de les supprimer du résultat par la suite.

Supprime rester un seul document par _id

deleteOne avec un _id résolu. Ne jamais supprimerBeaucoup, et jamais un filtre influencé par l'appelant.

Écrit rester sur la liste des permis

Même raisonnement que SQL : nommez les collections qu'un écrit peut toucher, et refusez le reste avec une explication.

Le paramètre d'identité dans les autres langues

La sonde d'identité est l'autre moitié d'un pont, et c'est HTTP aussi. Le bloc de signature est identique dans chaque langue : base64url la charge utile, HMAC-SHA256 cette chaîne, se joignent à un point.

Ne pas écrire à la main de zéro. Paramètres, Portail de support transporte un itinéraire prêt par langue pour le portail (une fois, deux minutes jeton). Sites distants, votre site, Codes, C. Recognise les clients connectés porte automatiquement la version de chat par langue (jeton d'une heure plus le gestionnaire de rafraîchissement).
Que changer lorsque vous le réutilisez?

Ces snippets ment un jeton PORTAL, qui est délibérément plus strict: il porte jti et single_use:true et vit autour120secondes parce qu'il voyage dans unURL. Un jeton d'identité de pont ou de widget ne porte aucun de ceux-ci et utilise un exp plus long, minutes à heures.

Ce qui reste le même

site_key, iat, exp et un haut niveau authentifié:true, plus un sujet administrateur ou client avec un id et un nom d'utilisateur ou email. Mêmes revendications, même signature, même secret.

Les deux formes de jeton vérifier

Un JWT en trois parties signé HS256 fonctionne, et la base en deux parties64url charge utile plus hex HMAC que la référence PHP émet. Utilisez la bibliothèque de votre langue qui rend naturel — une bibliothèque JWF est généralement le chemin plus court en dehors de PHP.

Ne jamais la laisser dans le navigateur

Vrai dans chaque langue. Signer côté client signifie envoyer le secret du site à chaque visiteur.

C'est honnête de choisir

La plateforme est PHP

Ecrivez le pont en PHP. Il est livré dans le paquet, il est vérifié par dérive, et il peut démarrer le propre cadre de la plate-forme pour lire une session en direct pour la sonde d'identité. Rien d'autre ne vous donne les trois.

La plateforme est Node

Un . js pont est expédié, signe et est vérifié de dérive exactement comme un PHP. Rien n'est abandonné.

La plateforme est Python, Ruby, Go, . NET ou Java

Livrez à travers l'extrait de panneau et dites-le dans le corps du panneau; ne laissez pas le fichier dans bridge/, où la conformité refusera le paquet. Le connecteur est autrement complètement normal: actions, fournisseurs de contexte, identité et recherche invités fonctionnent tous de même, car aucun d'eux ne se soucie de ce qui répond à l'appel HTTP.

Vous ne pouvez pas exécuter un processus sur l'hôte de la plateforme

Le modèle de pont n'est pas l'outil approprié. Un pont existe pour atteindre une plate-forme de l'intérieur de son propre hôte. Si vous ne pouvez l'atteindre que de l ́extérieur, vous écrivez un connecteur API ordinaire contre toute surface qu'il expose.

⚠️
Une contrainte supplémentaire mérite d'être planifiée : une sonde d'identité doit lire la session de connexion de la plateforme, ce qui signifie généralement fonctionner dans le processus propre de la plate-forme ou du moins sur son hôte avec accès à son magasin de session. Un pont écrit dans une langue différente de la plates-formes peut servir les données confortablement et peut encore lutter pour répondre op=admin_identity. Si c'est votre cas, expédiez le pont de données dans votre langue et la sonde d ́identité dans la plate‐forme.
Connecteurs

Donnez à l'assistant les deux moitiés: actions ET contexte

C'est la chose la plus commune manquante d'un connecteur qui « fonctionne mais est inutile ». Les actions laissent les choses AI DO. Sections de contexte le laisser SAVOIR des choses. Un connecteur a besoin à la fois, et la plupart des questions posées par un administrateur sont répondues par contexte, jamais par une action.

Les deux moitiés

Actions — Comment l'IA agit-elle?

Déclaré dans les actes.jsonou retourné par registerActions(). Le modèle en choisit un, remplit ses paramètres, etOpsIQLes actions sont pour les verbes : annuler cette réservation, ouvrir ce ticket, modifier ce statut.

Sections contextuelles — Comment l'IA sait les choses

Assemblé par un ContextProvider avant que le modèle ne tourne. "Combien de commandes ce mois-ci", "qui sont mes nouveaux clients", "qu'est-ce que nous vendons" tous résoudre à travers une recherche contextuelle, et ne jamais toucher une action du tout.

⚠️
Symptôme d'un fournisseur manquant: l'assistant répond "Aucun connecteur activé n'a fourni cette section contextuelle" pendant que le connecteur est installé, activé et passant son test de connexion. Rien n'est enregistré, rien d'erreur. Ce message signifie qu'aucun fournisseur n'avait revendiqué la section.

Le vocabulaire universel de la section

OpsIQ demande des sections par nom générique. Votre travail est de décider ce que chacun signifie sur votre plateforme et de répondre à elle. Une réservation d'hôtel EST la commande de l'hôtel; une chambre EST ce que l'établissement vend. Carte, ne pas inventer.

ordres / ordres_en attente

Quelle que soit la transaction sur votre plateforme : commandes, réservations, réservations et travaux. en attente_orders est la même liste filtrée aux non-finis.

clients

Le tableau des clients.

products

Ce que la plateforme vend : produits, chambres, plans, services.

facturation

Revenus et montants en forme d'argent, plus les comptes par État.

tickets, services, domaines, serveurs, activité

Utilisez-les quand votre plateforme les a réellement. Ne forcez pas une cartographie — une section sans réponse est meilleure qu'une mauvaise.

Tout ce que votre plateforme a d'autre

Un fournisseur qui déclare les sections() : ['licences','shipments'] a fusionné ceux-ci dans la liste d'autorisation de la recherche universelle, de sorte que les recherches spécifiques à la plateforme deviennent disponibles sans changement de base.

L'erreur qui coûte une journée

Un fournisseur de contexte DOIT implémenter l'interface. Le type de registre le vérifie, donc une classe qui simplement LOOKS droite est sautée — sans erreur, nulle part.

ContextProvider. php — le contrat, du paquet de référence Botble
use OpsIQ\Platform\ContextProviderInterface;

/* MUST implement ContextProviderInterface: ContextRegistry::collectAll()
 * type-checks it, so a provider that merely LOOKS right is skipped and every
 * section answers "No enabled connector supplied this context section" — the
 * exact symptom, with no error anywhere. */
final class ContextProvider implements ContextProviderInterface
{
    public function slug(): string  { return 'yourplatform_context'; }
    public function label(): string { return 'Your Platform (orders, customers, products)'; }
    public function priority(): int { return 30; }   // lower renders earlier

    /** ADMIN only. The guest surface has its own provider and its own rules. */
    public function surfaces(): array { return ['admin']; }

    /** The universal section names this connector can answer. */
    public function sections(): array
    {
        return ['orders', 'pending_orders', 'clients', 'products', 'billing'];
    }

    public function isAvailable(): bool
    {
        try {
            $s = \OpsIQ\Connectors\ConnectorRegistry::getSettings('yourplatform') ?: [];
            return trim((string)($s['base_url'] ?? '')) !== '' && trim((string)($s['api_key'] ?? '')) !== '';
        } catch (\Throwable $e) {
            return false;
        }
    }

    public function build(array $ctx): string
    {
        $section = strtolower(trim((string)($ctx['section'] ?? '')));
        $limit   = max(3, min(50, (int)($ctx['limit'] ?? 20)));
        $query   = trim((string)($ctx['query'] ?? ''));
        try {
            switch ($section) {
                case 'orders':
                case 'pending_orders': return $this->orders($limit, $query, $section === 'pending_orders');
                case 'clients':        return $this->customers($limit, $query);
                case 'products':       return $this->products($limit);
                case 'billing':        return $this->billing();
            }
        } catch (\Throwable $e) {
            return '';   // a provider must NEVER break prompt assembly
        }
        return '';
    }
}
Enregistrez-le depuis le connecteur

Implémenter ContextConnectorInterface et renvoyer vos fournisseurs de contextProviders(). La classe de connecteurs peut également implémente ContextProviderInterface directement et être enregistrée comme elle-même.

Retourner le texte clair, pas JSON

build() retourne un bloc de texte concaténé dans l'invite. Ecrivez-le pour un lecteur : un titre, puis une ligne par ligne.

Retourner '' plutôt que jeter

Un fournisseur qui lance est enregistré et ignoré, mais le retour '' est le contrat.

Le Constructeur ne peut pas écrire des sections() pour vous

Le ContextProvider. php généré envoie des sections(): array { return []; } et l'assistant n'a pas de champ pour cela. Remplissez-le à la main — et rappelez-vous que la réédition depuis l'Assistant SURVEILLANCE le fichier. Copiez vos modifications en premier.

⚠️
Indiquer le vrai TOTAL, pas le nombre de lignes que vous avez envoyées. Une page n'est pas un total. Un fournisseur qui liste vingt lignes sans dire ainsi obtient l'assistant en toute confiance répondre "vous avez20réservations" lorsque la plate-forme détient669. Une COUNT bon marché et une ligne explicite — "TOTAL au dossier:669(cette liste montre la plus récente20seulement)" — est toute la solution, et un compte confiantment faux est pire que pas de compte.
Un bloc de section qui ne peut pas être compté à tort
$lines = ['YOUR PLATFORM — ORDERS (live, newest first)'];
$lines[] = 'TOTAL orders on file: ' . (int)$total
         . ' (this list shows the newest ' . count($rows) . ' only — never count these rows to answer "how many")'
         . ' | by status: ' . $byStatus;
foreach ($rows as $r) {
    $lines[] = '#' . (int)$r['id'] . ' ' . $r['reference'] . ' | ' . $r['status']
             . ' | amount ' . $r['amount'] . ' | ' . substr((string)$r['created_at'], 0, 16);
}
$lines[] = 'Use yourplatform_get_order (order_id) for the full record.';
return implode("\n", $lines);

Nommez vos actions donc OpsIQ peut dire lectures à partir d'écritures

OpsIQ classifie une action de la WORDS dans son action_id, et elle est délibérément conservatrice : tout ce qu'elle ne peut reconnaître est traité comme un écrit et exige une carte d'approbation.

1
is_destructive ou requires_confirmation wins

Si l'un ou l'autre est réglé, l'action a toujours besoin d'approbation.

2
Un mot d'écriture n'importe où dans l'identifiant en fait un écrit

ajouter, créer, ouvrir, mettre à jour, modifier, modifier et supprimer, supprimer, détruire, annuler, rembourser, suspendre, terminer, activer, approuver, rejeter, envoyer, marquer, réinitialiser, capturer, vider, fermer, rouvrir, attribuer, révoquer, accorder, définir, basculer, activer ou désactiver, émettre, générer, appliquer, frais, payer, fournir, renouveler, mettre sur pied, fusionner, déplacer, transférer, exacerber, drapeau, enregistrer, synchroniser, pousser, importer, exécuter, déclencher, démarrer, arrêter, redémarrer et quelques autres.

3
Puis un mot de lecture fait une lecture

get, list, search, find, view, show, fetch, compt, lookup, décrivez, lire, exporter, preview, test, ping, status, summary, detail, recent, history, check, log, statistiques, métriques, panorama, revenus, ventilation, rapport, analytique, solde, utilisation, quota, snapshot, perspicacité, flux, brouillon, triage, classifier, suggérer.

4
Puis la méthode HTTP décide

GET, HEAD et OPTIONS sont lus.

5
Sinon c'est un écrit

Non reconnu signifie l'approbation requise.

⚠️
Les mots d'écriture sont vérifiés AVANT de lire les mots, donc un nom mixte comme get_and_sync_orders est classé comme un WRITE. Choisissez un verbe, mettez-le en premier et gardez-le propre : list_order, get _customer, search_bookings, annuling_booking, set_ordre_status.

Ne déclare native_api que si la plateforme en a vraiment une

The native_api capability registers a generic <slug>_api_call passthrough so the model can reach endpoints your typed actions do not cover. On a platform with no API it is worse than useless: the model keeps reaching for a tool that cannot succeed, instead of using the tools that can.

Le Constructeur décide de votre réponse data-access

Say the platform has an API and it declares native_api and emits the passthrough. Say it has none (bridge mode, or the "Platform with no API" profile) and it declares platform_bridge instead and strips native_api, so the two can never both be true. You no longer hand-edit this.

Les paquets à main doivent quand même être bien conçus.

Si vous écrivez le manifeste vous-même, déclarez exactement un de native_api ou plate-forme_bridge. La conformité traite plate-formes_bridge comme l'écoutille d'échappement qu'un connecteur de pont est censé avoir, et le constructeur refuse une spécification qui revendique plate- forme_bridge sur un connecteur API.

Gardez ai_api_reference. md honnête dans les deux sens

On a connector that declares native_api the admin brain heads that file with a line naming <slug>_api_call. Without native_api it is headed neutrally instead, so a bridge connector no longer advertises a tool it does not have. Describe your real surface — for a bridge, that is your op and do vocabulary, not a REST endpoint table.

Enseignez le cerveau de l'administrateur sur votre plateforme

Declare ai_brain_aware and ship two Markdown files. They are read from the INSTALLED package directory (opsiq/connectors/<slug>/) for ENABLED connectors only, and injected into the admin agent's system prompt.

ai_expertise_admin.md

Ce que cette plateforme est, comment ses données sont façonnées, ce que ses objets sont appelés, et les rancoeurs qui autrement feraient l'assistant de deviner. Ecrivez-le pour un collègue compétent qui n'a jamais vu la plate-forme.

ai_api_reference.md

La surface callable. Pour un connecteur de pont, ceci est votre op et faire du vocabulaire avec leurs paramètres, pas une table de fin de ligne REST.

Budget

En gros6,000caractères conservés par connecteur, et environ24,000caractères pour l'ensemble du bloc sur chaque connecteur activé. Sur le bouchon par connecteur, votre fichier est tronqué; soyez concis avant que le troncateur ne soit.

La précision paie

Ces fichiers sont la différence entre l'assistant utilisant vos outils de table universels et répondre à partir de la mauvaise section parce que rien ne lui a jamais dit que ces outils existaient.

💡
Les deux fichiers doivent être dans le paquet INSTALLED, et non seulement dans l'arborescence de votre source. Ce sont des fichiers de paquets ordinaires, donc ils sont couverts par la signature et expédiés dans le ZIP — ce qui signifie également que l'édition après la signature casse le sceau.
Connecteurs

Identité par un connecteur: admin, client, portail

Un contrat de signature sert trois surfaces. La tâche du connecteur est de transformer "qui est connecté sur la plate-forme" en un jeton signéOpsIQpeut vérifier, puis présenter le sujet vérifié dansOpsIQ's forme. Le connecteur n'authentifie jamais personne — la plate-forme le fait, et la signature porte cette affirmation.

Les trois surfaces, un signeur

Admin — votre personnel, dans votre backend

Un sujet admin. Le widget se charge à l'intérieur du panneau admin de la plateforme et chaque membre du personnel est associé à son propre agent OpsIQ.

Client — un client connecté, dans le chat du client

Un sujet client. C'est ce qui permet à un client connecté d'obtenir son compte GLOBE au lieu d'une recherche anonyme: chaque commande, détail complet et toute action en libre-service que vous autorisez.

Portail — un lien profond vers le portail de support

Les mêmes revendications plus jti et single_use, avec120- la seconde vie, parce que le jeton voyage dans unURLet doit être dépensé une fois. Ne pas faire rouler celui-ci manuellement: Paramètres, Portail de support porte un extrait prêt par langue, et la plate-forme le ment pour vous lorsque la zone de compte fonctionne sur ce serveur.

Le contrat de charge utile

Ce sont les revendications que les vérificateurs vérifient. Rien ici n'est facultatif, quel qu'un exemple partiel ailleurs pourrait suggérer.

site_key

Niveau supérieur. Doit égaler la clé de site de la demande, ou le jeton est refusé.

iat et exp

Le niveau supérieur, unix secondes. exp doit être dans le futur et après iat. Un jeton plus d'une minute dans le future est refusé. Garder la vie courte — minutes à heures.

authentifié: vrai

Haut niveau, à côté de exp. L'affirmation de votre plateforme que un vrai humain est connecté.

plateforme

Niveau supérieur. Une limace courte qui désigne l'origine. Recommandée, et elle permet au fournisseur d'identité d'un connecteur de dire ses propres jetons depuis une autre plateforme.

administrateur ou client

Un objet qui nomme le sujet. Il doit porter un id non vide, et un nom d'utilisateur ou un courriel — la porte d'accès par administrateur correspond à ceux-ci. Inclure les deux lorsque vous avez les deux.

Frappe, mot pour mot du pont Botble
$payload = [
    'site_key'      => $cfgSiteKey,
    'iat'           => time(),
    'exp'           => time() + 6 * 3600,
    'authenticated' => true,
    'platform'      => 'yourplatform',
    /* 'admin' or 'customer' — OpsIQ stamps the matching session identity
     * from whichever key is present. */
    $opsiqSubject   => $subjectPayload,
];
$payload64     = rtrim(strtr(base64_encode(json_encode($payload, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
$identityToken = $payload64 . '.' . hash_hmac('sha256', $payload64, $cfgSecret);

Les deux vérificateurs et l'échec qu'ils causent

OpsIQ a deux vérificateurs de jetons, et ils n'étaient pas identiques. Savoir cela vous sauve un après-midi, parce que le symptôme ne ressemble à rien à la cause.

Le widget d'administration a son propre vérificateur

opsiq/embed/admin_ajax. php porte un vérificateur local qui accepte le drapeau authentifié dans chaque position. La liste de conversations, l'historique et la lecture non-lue passent par elle, donc ils authentiment bien.

Le vérificateur partagé est plus strict

opsiq/inclus/customer_identity_token_verify.php se trouve derrière le flux de discussion et le noyau AJAXAPI. Il exigeait historiquement le drapeau au niveau TOP.

Le symptôme

L'historique et les conversations fonctionnent. Chaque chat tourne les réponses "Admin login required". Il se lit exactement comme un bug de session et n'est pas: le jeton est manquant le drapeau de haut niveau.

Ce que fait le noyau actuel

Il accepte maintenant le drapeau au niveau supérieur OU à l'intérieur du sujet, de sorte que le contrat est uniforme. Les cœurs plus anciens ne lisent que le niveau supérieur. Emit la forme canonique et votre paquet fonctionne sur chaque version.

Ceci est vérifié par la machine maintenant. Tout fichier dans votre paquet qui mints identité jetons est balayé statiquement contre le contrat, et une charge utile la plate-forme refuserait de ne pas se conformer au fichier exact et à la ligne. Exécutez-le vous-même: php tools/verify_identity_contracts. php.

Clients inscrits dans le chat client

Deux choses doivent être vraies. Core doit tamponner le client vérifié, et votre connecteur doit le présenter.

1
Votre pont ou endpoint menthe un jeton client

Même signataire que l'administrateur, avec un sujet client. Lisez le client de la propre session de la plateforme. Si votre plate-forme signe les clients sur un gardien différent de admins, lire le garde que vous voulez et ne jamais tomber sur des sujets — c'est ainsi qu'un client se verrait remettre un jeton d'administration.

2
Le noyau vérifie et appose

Sur un jeton valide, le sujet vérifié est inscrit dans la session. Votre fournisseur lit une identité prouvée; il n'authentifie jamais.

3
Votre fournisseur d'identité le présente

detectCustomer() retourne leOpsIQforme. Il DOIT implémenterOpsIQ\Platform\IdentityProviderInterface, ou le registre le saute silencieusement — le même piège que le fournisseur de contexte.

4
Vos actions client-scoped acceptent un client_id

Et OpsIQ le verrouille à l'identité vérifiée avant exécution. Le modèle ne peut pas le fournir.

IdentityProvider. php — lisez l'identité prouvée, présentez-la sous la forme de OpsIQ
use OpsIQ\Platform\IdentityProviderInterface;

final class IdentityProvider implements IdentityProviderInterface
{
    public function slug(): string  { return 'yourplatform_identity'; }
    public function label(): string { return 'Your Platform identity (bridge-signed identity_token)'; }
    public function priority(): int { return 25; }   // ahead of the generic session provider

    public function isAvailable(): bool
    {
        try {
            $s = \OpsIQ\Connectors\ConnectorRegistry::getSettings('yourplatform') ?: [];
            return trim((string)($s['base_url'] ?? '')) !== '';
        } catch (\Throwable $e) { return false; }
    }

    public function detectAdmin(): ?array
    {
        $row = $this->sessionRowFor('_opsiq_admin_identity');
        if (!$row || !$this->isOurs($row)) return null;
        return [
            'id'       => (int)($row['id'] ?? 0),
            'name'     => $this->displayName($row, 'Admin'),
            'email'    => (string)($row['email'] ?? ''),
            'username' => (string)($row['username'] ?? ''),
            'role'     => (string)($row['role'] ?? ''),
            'platform' => 'yourplatform',
            'source'   => 'yourplatform_identity_token',
        ];
    }

    public function detectCustomer(): ?array
    {
        $row = $this->sessionRowFor('_opsiq_customer_identity');
        if (!$row || !$this->isOurs($row)) return null;
        return [
            'id'       => (int)($row['id'] ?? 0),
            'name'     => $this->displayName($row, 'Customer'),
            'email'    => (string)($row['email'] ?? ''),
            'phone'    => (string)($row['phone'] ?? ''),
            'platform' => 'yourplatform',
            'source'   => 'yourplatform_identity_token',
        ];
    }

    /* A session identity stamped by ANOTHER platform's token must not be
     * claimed here. An empty platform is accepted because older bridges did
     * not stamp one, and the site key already scoped the token. */
    private function isOurs(array $row): bool
    {
        $p = strtolower(trim((string)($row['platform'] ?? '')));
        return $p === '' || $p === 'yourplatform' || $p === 'remote';
    }

    private function sessionRowFor(string $key): ?array
    {
        if (session_status() !== PHP_SESSION_ACTIVE) return null;
        $row = $_SESSION[$key] ?? null;
        return (is_array($row) && (int)($row['id'] ?? 0) > 0) ? $row : null;
    }
}

Actions à portée client : deux serrures, les deux nécessaires

Le modèle ne doit jamais choisir les données qu'il lit. OpsIQ force cela de son côté, et votre plateforme doit l'appliquer de l'autre côté aussi. Un verrou est un bug loin d'une fuite; deux verrous sont un contrat.

Verrouillage1 — OpsIQécrase les paramètres d'identité

Avant qu'une action de clavardage ne soit lancée, OpsIQ remplace chaque paramètre en forme d'identité par l'identifiant du visiteur VERIFIED : client_id, clientid, user_id userid, customer_id et compte_id prennent l'identification numérique vérifiée; client_identificateur, client_identifier, compte_identifiant le prennent comme une chaîne; email, client _email, client/email prennent l 'e-mail vérifié.

Verrouillez 2 — votre plateforme re-scopee chaque requête

Prenez l'id qui vous a été donné et ajoutez-le à la clause OÙ chaque lecture et chaque écriture sur cette surface. Ne faites jamais confiance à la référence dans la demande de lui-même. Un client connecté demandant au sujet de la commande d'un autre doit revenir vide, non interdit.

Nommez vos paramètres pour que le 1 puisse les trouver

Appeler customer_id, pas cust ou ref. Un paramètre OpsIQ ne reconnaît pas est un paramètre qu'il ne peut verrouiller.

⚠️
Donnez au client connecté sa surface d'exploitation OWN, séparée des opérations administratives, même lorsque le SQL semble similaire. Deux surfaces avec des règles différentes restent honnêtes; une surface avec un drapeau devient une fuite le jour où quelqu'un modifie la mauvaise branche.

Câble de page zéro : la sonde déclarée par le connecteur

You can spare the operator all page wiring. Add an admin_identity_probe_url setting (https only) pointing at your identity endpoint. The plain admin-widget loader from Remote Sites, Codes then works with no page attributes at all: the widget discovers the endpoint through the connector, calls it with the site key and widget token, and authenticates each admin individually. A page can still override with a data-identity-endpoint attribute or window.OpsIQAdminIdentityEndpoint.

paramètres.json — le réglage de la sonde
{
  "key": "admin_identity_probe_url",
  "label": "Admin identity probe URL",
  "type": "text",
  "placeholder": "https://your-site.com/opsiq-yourplatform-bridge.php?op=admin_identity",
  "help": "Set this to your bridge admin_identity endpoint and the plain admin-widget loader works with NO page wiring: the widget probes this URL by itself, the bridge answers with the signed identity of the CURRENTLY logged-in admin, and every admin is matched to their own OpsIQ agent. Leave empty to keep the admin embed off."
}
La sonde est appelée par le navigateur

Même origine, il ne peut donc pas porter un en-tête personnalisé. Son authentification est la session de plate-forme. Mettez-le AHEAD de votre porte-clé de pont, gardez-le loin des données d'enregistrement, et ne retournez rien du tout pour un visiteur connecté.

Il répond à une forme fixe

{"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} — and {"success":false,"authenticated":false,"error":"..."} when nobody is signed in.

Aucun secret de longue durée dans la source des pages

Seulement le signe, expirant jeton.

La mise en œuvre complète du critère d'évaluation de Laravel,WordPress, WHMCS, Symfony et PHP simple, ainsi que les caractéristiques de Laravel et l'ordre de dépannage, sont sur la page du widget d'administration. Ils sont le même code pour un sujet client : changez le garde que vous avez lu et la clé du sujet que vous signez.

Connecteurs

Édition : l'édition du dossier n'est pas publiée

La façon la plus courante de perdre un après-midi est d'éditer un connecteur sous marketplace_connectors/, de le réinstaller et de ne rien trouver changé. Les installateurs ne lisent pas ce dossier. Ils tirent un ZIP signé du catalogue du marché. L'édition est la séquence qui met vos changements dans ce ZIP.

Pourquoi le montage n'a rien fait

marketplace_connectors/<slug>/ is the SOURCE

C'est là que vous travaillez. Rien ne s'installe à partir de lui.

Le catalogue contient une ZIP signée

Une installation télécharge que ZIP, vérifie la signature, et le décompresser. Jusqu'à ce que vous rebâtissez la ZIP , chaque installation continue à obtenir l'ancien paquet .

Le Constructeur de connecteurs publie ailleurs

It writes into /connectors/<slug>/ on this install. That is a local connector, not a marketplace release. The two paths do not overlap.

La séquence de libération

1
Bouffer la version dans les fichiers DEUX

paramètres.jsonet le contrat de raccordement.json. La conformité les compare et échoue si la limace, la version ou le jeu de capacités ne sont pas d'accord. Ajoutez une entrée CHANGELOG.md pendant que vous êtes là — c'est un fichier obligatoire.

2
Re-synchroniser l'extrait de pont

php tools/sync_connector_bridge_snippets.php --apply — only relevant if your package ships bridge/*.php, and mandatory if it does. Skipping it means the panel hands operators the previous bridge.

3
Resigner chaque paquet

php tools/resign_all_connectors. php — la signature couvre les hashes de fichier, donc toute modification l'invalide. Signer en dernier, après chaque fichier est final.

4
Exporter la clé de signature, puis les semences

Le semencier signe chaque paquet pendant qu'il construit le ZIP, et il fonctionne dans un contexte où la clé ne peut pas être lue à partir des paramètres — donc il doit venir de l'environnement.

5
Redéployez le fichier de passerelle, si vous en expédiez un

Réinstaller le connecteur met à jour le paquet. Il ne touche pas la copie assise dans le webroot de l'opérateur. Dites-leur, dans le panneau et dans le journal de changement.

Toute la libération, pour
# 2 — hold the panel copy identical to the shipped bridge
php tools/sync_connector_bridge_snippets.php --apply

# 3 — re-sign (do this last, after every file is final)
php tools/resign_all_connectors.php

# 4 — the seeder reads the signing key from the ENVIRONMENT only
export OPSIQ_CONNECTOR_SIGNING_KEY="$(php -r 'require "bootstrap/init.php"; echo opsiq_setting("connector_signing_key","");')"
php saas/scripts/maint/seed_marketplace_free.php --apply --only=<slug>

# verify before and after
php tools/verify_identity_contracts.php
php vendor/bin/phpunit tests/phpunit/Unit/Connectors
⚠️
Pourquoi l'exportation n'est pas optionnelle : le signant recherche la clé dans OPSIQ_CONNECTOR_SIGNING_KEY d'abord et le connecteur_signing_key setting second. Le semencier fonctionne sur le bootstrap SaaS et les outils/sign_connector. php ne boots du tout rien, donc dans les deux paramètres le lecteur n'existe pas — sans variable d'environnement il n'y a pas de clé, et vous obtenez "Aucune clé de signature disponible" ou chaque paquet signalé comme sign_failed. Seuls les outils / resign_all_connectors. php boots OpsIQ et peuvent trouver la clé seule.

Qu'est-ce qui est en fait un navire

Seulement les fichiers que couvre la signature

Le ZIP est construit à partir de la propre liste de fichiers du signataire, donc un fichier errant assis dans votre dossier de paquet n'est pas expédié. C'est délibéré: un fichier non signé utilisé pour voyager avec les clients.

Extensions couvertes

php,json, js,css, md, txt,html, sh, svg, png, jpg, jpeg, gif, webp, ico, yml, yaml — récursivement, y compris la signature du pont/ et des essais/.jsonelle-même est exclue des hachages et ensuite ajoutée au ZIP afin que les installs puissent vérifier.

Tout autre élément est déclaré comme non_empaqueté

Le semencier nomme chaque fichier qu'il a laissé derrière. Lire cette liste. Un fichier que vous prévoyez d'expédier apparaît là signifie une mauvaise extension ou un mauvais emplacement — pas un succès silencieux.

Modifier tout fichier couvert brise le sceau

Y compris un fichier Markdown.

Fichiers obligatoires dans un paquet distributable

connector.php

Doit renvoyer une instance de ConnectorInterface.

settings.json

Manifeste : slug, nom, version, manifeste_version, compatibilité, capacités, connecteur_contrat_version.

connector_contract.json

Le contrat lisible par machine. Son ensemble de limaces, de versions et de capacités doit être identique aux paramètres.json.

LIRE. md, DÉVELOPPEMENT. mD, CHANGELOG. mj

Tous les trois sont vérifiés pour l'existence ET la taille minimale. DEVELOPER. md a besoin de contenu réel, pas d'un talon.

Un fichier par capacité déclarée

Chaque fonction nomme le fichier qu'elle attend — ContextProvider. php pour le contexte, IdentityProvideer. php en identité, GuestLookupProvideR. php dans guest_lookup, etc. — à moins que le connecteur ne mette en œuvre la capacité en ligne.

Rien qui ressemble à un titre de créance

La conformité scanne les trois fichiers Markdown pour des valeurs en forme de secret et des clés privées, et échoue sur un coup.

Vérifiez avant de l'expédier

La suite pleine conformité est la même qu'une installation. Il vérifie le manifeste contre le contrat canonique, qui runtime et les capacités de manifeste conviennent, que chaque capacité déclarée a son fichier et ses méthodes, le contrat d'identité dans chaque fichier de menthe, le match bridge-snipet, l'hygiène de l'accueil des invités, l ́action unicité et la sécurité de confirmation, et la signature du paquet.

Exécutez les quatre avant chaque sortie
# conformance for every marketplace package
php tools/test_marketplace_connector_conformance.php

# the identity-token contract, statically, with file:line on failure
php tools/verify_identity_contracts.php

# the connector unit suite
php vendor/bin/phpunit tests/phpunit/Unit/Connectors

# the release gate
php tools/release_gate_connectors.php
💡
Un échec est attendu et n'est pas un problème : la vérification de signature du paquet signale un avertissement pendant que vous êtes encore en train d'éditer. Il efface le moment où vous resignez.
Connecteurs

Référence de pack et cycle de vie du connecteur

Il s'agit du contrat de niveau source pour la construction d'un connecteur que OpsIQ peut découvrir, configurer, valider, activer, exécuter, tester, signer et distribuer.

Référence du développeur
Paquet de connecteurUn package de connecteur a une implémentation et un manifeste de connecteurs requis, avec des actions facultatives, des recettes, des connaissances, des ressources et des métadonnées de signature.Paquet de connecteurdeveloperMANIFESTv1VIE CYCLEGéréESPACE DE TRAVAILDélimitéVUE DE L'ESPACE DE TRAVAIL EN DIRECTconnector.phpClasse de connecteur / usineRequissettings.jsonSchéma de manifeste et paramètresRequisactions.jsonDéfinitions des mesuresFacultatifsignature.jsonMétadonnées de signature du paquetPublication1DECLAREManifeste et capacités2IMPLEMENTCycle de vie et fournisseurs3VALIDATIONTest, signe, emballage
Un package de connecteur a une implémentation et un manifeste de connecteurs requis, avec des actions facultatives, des recettes, des connaissances, des ressources et des métadonnées de signature.

Forfait minimum

connectors/example_platform/
├── connector.php          # connector implementation / entry point
├── settings.json          # manifest + configuration schema
├── actions.json           # optional action catalogue
├── README.md              # setup, scopes, webhooks and limits
├── workflow_recipes.json  # optional reusable recipes
├── knowledge.json         # optional provider knowledge
├── profile.json           # optional connector profile
├── src/                   # optional client/provider classes
├── assets/                # optional admin assets
└── signature.json         # signed release metadata

Contrat manifeste

settings.json Utilise la version manifeste 1. Le validateur attend un slug, le nom, la version, manifest_version, compatibilité, description et les capacités. opsiq_min et opsiq_max. Le statut de la version est l'un des production, bêta, prévisualiser ou modèleLes paquets hérités peuvent être normalisés avec des avertissements, mais un nouveau paquet devrait passer sans aucun avertissant.

Interface de connecteur de noyau

  • Identité et configuration: slug(), name(), description(), capabilities(), settingsSchema(), testConnection().
  • Cycle de vie: onEnable() et onDisable(). La désactivation doit être non destructive ; la purge des données est une opération distincte et délibérée.
  • Entrée/synchronisation: handleWebhook(), poll(), backfill()Le sondage gère le travail incrémentiel; le remplissage importent l'historique et doivent être sûrs de répéter.
  • Support : pushReply() où la plateforme accepte les réponses.
  • Actions : registerActions() Fournit des contrats d'action exécutoires.
  • Sécurité : securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

La base abstraite offre également un remplissage en morceaux optionnel, la liste des clients, la découverte/création de comptes e-mail, les abonnés, la détection d'administrateur/client, les fournisseurs de facturation/contexte/identité, l'extraction de réponses, le réessai des appels HTTP, l’accès au chemin JSON, le classement flou et les assistants de pagination.

Capacités et authentification

Les noms de fonctionnalité pris en charge incluent actions, déclencheurs, contexte, identité, ventes, facturation, inbound_ticket, outbound_reply, sync_users, sync_departments, security_events, customer_import, blocage_sécurité_natif, promo_audience, flux_promotion, boîte_mail, native_api, ai_brain_aware et ai_tickets. API clé, porteur, de base, HMAC,OAuth 2identifiants du client,OAuth 2Code d'autorisation et modèles d'authentification personnalisés.

Cycle de vie du registre

  1. La découverte charge le paquet et valide son manifeste.
  2. La configuration est stockée par espace de travail ; les secrets sont chiffrés.
  3. Le test de connexion vérifie les informations d'identification sans activer le connecteur.
  4. Activer les appels onEnable(), synchronise les définitions d'action et peut démarrer le remplissage initial.
  5. L'exécution de polling/webhook/abonné porte toujours le contexte d'espace de travail.
  6. Désactiver les appels onDisable() et arrête l'activité sans supprimer les données importées.
  7. La purge est une opération explicite distincte.

Règles de correction

  • Utilisez la clé de l'espace de travail/site dans chaque lecture, écriture, clé cache, cle de déduplication et recherche webhook.
  • Enregistrez un ID externe/un ID d’événement chaque fois que la plateforme en fournit un.
  • Pour les systèmes distants, utilisez leurAPI; ne jamais supposer que leurs tables de base de données existent dans leOpsIQconnexion.
  • Ne jamais exposer de secrets, traces brutes du fournisseur ou l'existence d'un autre espace de travail.
  • Déclarez uniquement les capacités que le paquet implémente réellement. actions.json Le catalogue ne rend pas une action utilisable tant que le connecteur n'est pas installé, activé, configuré et sa connexion valide.

Test et sortie

Exécutez le lint PHP, la validation du manifeste, les tests de connexion, les test des schémas d'action, les essais de signature/replay webhook, les Essais d'isolation de l'espace de travail, les Tests de répétition de remplissage en arrière-plan, les testes de connecteur désactivé et les tests d'échec/réessai. Un package marketplace doit ensuite être signé et vérifié, inclure la documentation sur la configuration/les permissions/le webhooku, et indiquer son statut de version réel.

Connecteurs

Recettes de connecteur

Des recettes étape par étape pour les configurations de connecteurs courantes.

Recettes
Recette de connecteurUne recette de configuration Shopify comme liste de contrôle: créer une application, accorder des champs d'application, coller un jeton et tester, activer les webhooks, passer une commande de test.Recette de connecteurShopifyRecette · Shopify avec des webhooksCréer une application personnalisée dans Shopify adminChamps d’application des aides: read_orders, read_customers…Collez le domaine de la boutique + jeton, cliquez sur TestActiver la synchronisation Webhook (enregistrement automatique des commandes)Passez une commande test → elle apparaît dans Ventes en 30 s1STEP BY STEPRecettes de copier-coller2REAL PLATFORMSShopify · WHMCS · Stripe · Livraison gratuite3VÉRIFIERL'ordre de test est affiché dans 30s
Chaque recette est une liste de contrôle que vous suivez haut en bas, ici, Shopify avec des webhooks en temps réel, vérifiés par un ordre de test.

Recette: Shopify avec des webhooks en temps réel

Scénario :
Objectif : Se connecter Shopify Avec synchronisation automatique des commandes et GDPR compliance.
Que faire:

1. Create a custom app in Shopify admin (Settings > Apps > Develop apps). 2. Grant scopes: read_orders, read_customers, read_products, write_customers. 3. Copy the Admin API access token. 4. In OpsIQ Connectors > Shopify, enter store domain and token. 5. Click Test Connection. 6. Enable Webhook sync, OpsIQ registers order/customer webhooks automatically. 7. GDPR webhooks register automatically (data_request, customers/redact, shop/redact). 8. Verify: place a test order, check it appears in OpsIQ Sales within 30 seconds.

Recette: WHMCS intégration

Scénario :
Objectif : Connecter WHMCS afin que l’IA puisse rechercher des clients, services, tickets et factures.
Que faire:

1. In WHMCS admin, Setup > Staff Management > Manage API Credentials. Create a key. 2. In OpsIQ Connectors > WHMCS, enter URL, API identifier, and secret. 3. Click Test Connection. 4. Install the WHMCS module addon for ticket relay. 5. Verify: ask the admin AI "Find client [email protected]". WHMCS data should appear.

Recette: Paiements Stripe

Scénario :
Objectif : Suivre les paiements Stripe et laisser l’IA rechercher les transactions.
Que faire:

1. In Stripe Dashboard > Developers > API keys, create a restricted key (read: Customers, Charges, Invoices, Subscriptions). 2. In OpsIQ Connectors > Stripe, enter the restricted key. 3. Test Connection. 4. Add webhook endpoint in Stripe: copy the webhook URL shown on the connector's own settings page. It carries a per-connector token and looks like https://your-domain.com/api/connectors.php?slug=stripe&token=THE_TOKEN A URL without the token is rejected with "Missing slug or token". 5. Select events: charge.succeeded, invoice.paid, customer.subscription.updated. 6. Copy the webhook signing secret to OpsIQ. 7. Verify: make a test payment, check it in OpsIQ Sales.

Recette: Profil d'entreprise Google

Scénario :
Objectif : Connecter GBP pour la gestion des avis, les publications et les informations.
Que faire:

1. Create a Google Cloud project, enable Business Profile API. 2. Create OAuth 2.0 credentials (Web application). 3. Set redirect URI: copy it from the connector's own settings page. Google and Microsoft connectors share one slug-less callback: https://your-domain.com/connectors.php?oauth=callback Everything else uses https://your-domain.com/connectors.php?slug=<slug>&oauth=callback OAuth redirect URIs must match EXACTLY, and a URI missing oauth=callback is read as a webhook and answered with "Missing slug or token". 4. In OpsIQ, enter Client ID and Client Secret. 5. Click Authorize, sign in, grant access. 6. Select your business location. 7. Verify: reviews, posts, and insights should appear.

Connecteurs

Étendre le CRM & Site Intelligence

OpsIQ Un connecteur peut brancher une nouvelle capacité dans le CRM ou le site Intelligence sans aucune modification à OpsIQ de base, via le registre des capacités de la plateforme (\OpsIQ\Platform\CapabilityRegistre). Déclarez la capacité, implémentez son petit ensemble de méthode, expédiez le connecteur,OpsIQ le découvre et l'insère dans l'interface utilisateur, le client 360 timeline et l'installation invite.

Extender CRM & SI
Capacités de la plateformeUn connecteur sur les bus de capacité d'alimentation gauche (CRM, Intelligence du site, Analytique) découvert par le Registre des capacités.Capacités de la plateformeespace de travailVotre connecteurdéclare ses capacitésCRMcalendrier · enrichissement · esign · paiements · boîte aux lettresIntelligence du siteLocal_listing · Classement des sitesAnalytiqueweb_analytics · rapport & ingestCapabilityRegistryDécouvre et câble l'interface utilisateur + la timeline1DECLAREDes capacités, pas des modifications de base2PLUG INCRM · SI · Bus d'analyse3AUTO-WIREDInterface utilisateur, chronologie, invites
Un connecteur déclare les capacités (calendar, enrichissement, données de classement, analytique...) et OpsIQ auto-connecte ces capacités dans CRM et Intelligence Site, aucun changement de cœur.

Déclarer les capacités

Déclarative (paramètres.json)

Ajouter un commentaire <domain>_capabilities tableau, le meilleur pour les connecteurs sans code/marché. crm, site_intelligence.

Dans le code (connector. php)

Mise en œuvre crmCapabilities() / siCapabilities() Retourner les mêmes descripteurs.

Déclarer un fournisseur de calendrier CRM (settings.json)

Scénario :
Objectif : faire apparaître un connecteur de calendrier dans le panneau CRM Schedule-meeting.
Que faire:

"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]

Déclarer un fournisseur de Site Intelligence (settings.json)

Scénario :
Objectif : alimenter les données des annonces locales dans Site Intelligence.
Que faire:

"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]

Bus de capacité et leur surface de méthode

CRM / calendrier

createEvent($settings,$params) → {success,event_id,html_link,meet_link} ; listEvents; freeBusy. Propulsé par \OpsIQ\CRM\CalendarBridge.

GRC / enrichissement

enrich($settings,$params) → {success,traits}. Propulsé par \OpsIQ\CRM\EnrichmentBridge (s'exécute également automatiquement sur la création d'entreprise lorsqu'un fournisseur est connecté).

GRC / esign

sendForSignature($settings,$params) → {success,envelope_id,sign_url}. Propulsé par \OpsIQ\CRM\EsignBridge.

Site_intelligence / local_listing

listLocations, listReviews, getInsights. Livré via le connecteur Google Business Profile.

Site_intelligence / Rank_data

keywordRanks($settings,$params) → {success,ranks}. Propulsé par \OpsIQ\SiteIntelligence\RankDataBridge. Livré avec: connecteur SerpApi.

Analyse web / Web_analytics

report($settings,$params) (synchronisation / exportation) + ingest($settings,$events) (importation). Conduit par \OpsIQ\Analytics\WebAnalyseBridge. Navires: Google Analytics (GA4) connecteur. Données API pour les rapports, Protocole de mesure pour l'importation. L'analyse est ouverte pour les connecteurs comme CRM + Intelligence du site (domaine analytics / analytics_capabilities).

Paiements / fournisseur_de_paiement

listPayments, customerPayments, createPaymentLink. Conduit par \OpsIQ\Payments\PayementsBridge. Affichez les paiements d'un client sur le calendrier CRM + envoyez un lien de paiement sur une affaire. Expédie:StripeConnecteur de paiement. Domaine payments / payments_capabilities.

Boîte aux lettres / email_sync

listMessages + sendMessage. Conduit par \OpsIQ\Mailbox\MailBoxBridge. Les courriels d'un client sur le Client 360 timeline + envoyer un email à partir d'une offre. Expédiés: Gmail + Outlook/Microsoft 365 connecteurs. Domaine mailbox / mailbox_capabilities.

Partagé OAuth application + une redirection

Tous les connecteurs Google partagent ONE app via \OpsIQ\OAuth\SharedGoogleApp. Set google_oauth_client_id/_secret une fois et Calendrier, Analytics, Business Profile + Gmail tous les travaux (les champs par connecteur (optionnel) sont des surcharges). Ils partagent également UNE redirection URI, <site>/connectors.php?oauth=callback (pas de limace par connecteur), parce que Google expose non API pour ajouter rediriger les URIs vers une application; OpsIQ récupère le connecteur à partir de la signature OAuth state Enregistrer ce URI unique une fois et chaque connecteur Google (présent + futur) autorise sans autre configuration de la console. Retour SharedGoogleApp::resolve(...),S redirect_uri De votre intérieur oauthParams()Les connecteurs Microsoft font la même chose via \, mais ils ne sont pas compatibles avec les redirections per-slug.OpsIQ\OAuth\SharedMicrosoftApp (microsoft_oauth_*).

Les boutons d'importation sont fonctionnellement limités

Le Importation (remblai historique) et Clients d'importation boutons montrent SEULEMENT pour les connecteurs qui les implémentent réellement, détectés par la réflexion, donc il n'y a pas de drapeau à déclarer. backfill() ou backfillChunk() Pour gagner le bouton Importer; surcharger listCustomers() (return {email, first_name, …} pages) pour gagner des clients d’importation. AbstractConnector no-op et le bouton reste caché, de sorte que l'interface utilisateur n'offre jamais une importation qu'un connecteur ne peut pas effectuer.

L'IA sur les bus

L'agent CRM propose et enregistre les réunions hors de la portée des signaux (\OpsIQ\CRM\MeetingProposer → CalendarBridge), et enrichit automatiquement de nouveaux comptes, le -AI exploite la boucle CRM, exécutée sur les bus de connecteur.

Recherche de ticket client-chat (fetchTicket())

Deux niveaux, pas de changements fondamentaux

Lorsqu'un visiteur fait référence à un numéro de ticket dans le chat client ("quel est l'état du T-000123?"), OpsIQ Il le résout en deux niveaux. Niveau 1 lit la billetterie partagée OpsIQ, chaque connecteur avec inbound_ticket Le serveur de tickets y reflète ses tickets, donc les tickets synchronisés fonctionnent pour TOUS les connecteurs avec zéro code par connecteur. Niveau 2 C'est une solution de secours pour les anciens tickets qui n'ont jamais été mis en miroir: fetchTicket() sur chaque connecteur activé qui l'implémente. Il est duck-typed (découvert par method_exists(), comme contextProviders()/audienceCatalog()), de sorte que le signé ConnectorInterface Les connecteurs qui n'en ont pas besoin (sources de messagerie/chat créant des tickets en natif) l'omettent simplement.

⚠️
La propriété est obligatoire et vous devez l'appliquer. fetchTicket() reçoit l'identité du visiteur VÉRIFIÉ dans $ctx (client_id + client_email, la même identité vérifiée que le client chat AI utilise). Résolvez le client de plateforme de cette identité et demandez SEULEMENT que les billets du client, puis revérifiez la propriété sur l'enregistrement de détail. null sur une quelconque erreur, erreur ou manque, jamais les données d'un autre client. null se dégrade gracieusement en "n'ai pas pu trouver ce billet".
connector.php, le contrat fetchTicket() (référence: connecteurs/whmcs et connecteurs/zendesk)
<?php
// connector.php — OPTIONAL universal client-chat ticket resolver (Tier 2).
// Only add it if your platform keeps its OWN ticket store that may hold tickets
// not yet mirrored into OpsIQ. Return the normalised array below, or null.
//
// $ref      = ['mode' => 'id'|'tid', 'value' => string]  (from extract_ticket_ref)
// $ctx      = ['client_id' => int, 'client_email' => string]  (VERIFIED visitor)
// $settings = your connector settings
public function fetchTicket(array $ref, array $ctx, array $settings): ?array
{
    try {
        $email = trim((string)($ctx['client_email'] ?? ''));
        $cid   = (int)($ctx['client_id'] ?? 0);
        if ($cid <= 0 && $email === '') return null;            // no verified identity → refuse

        // 1) Resolve THIS visitor on your platform (by verified email/id).
        // 2) List ONLY their tickets and match $ref against the ticket number/id.
        // 3) Re-confirm ownership on the detail record before returning.
        //    On any miss/mismatch/error → return null (never leak).

        return [
            'tid'        => 'T-000123',     // the customer-facing reference
            'id'         => 123,            // your internal id
            'status'     => 'open',
            'subject'    => '…',
            'department' => 'Billing',     // '' if your platform has none
            'priority'   => 'high',
            'opened_at'  => '2026-06-29 10:00:00',
            'last_reply' => '2026-06-29 12:00:00',
            'message'    => 'opening message text',
            'replies'    => [               // oldest → newest; opening message may be first
                ['who' => 'You',   'date' => '…', 'message' => '…'],
                ['who' => 'Staff', 'date' => '…', 'message' => '…'],
            ],
        ];
    } catch (\Throwable $e) {
        error_log('[yourslug][fetchTicket] ' . $e->getMessage());
        return null;                                             // graceful degrade
    }
}

Comment la plateforme l’utilise

Découverte

CapabilityRegistry::providers($domain,$type) liste les fournisseurs avec le statut installé/activé/prêt (basé sur le système de fichiers; DB uniquement pour l'indicateur activé).

Sélection

CapabilityRegistry::active($domain,$type) retourne le premier fournisseur prêt avec son connecteur chargé et les paramètres. Bridges appellent cela au lieu de limaces de codage dur.

Notifier pour installer

Lorsqu'une fonctionnalité a besoin d'une capacité non encore connectée, l'interface utilisateur affiche une invite Connect/Installer un clic, jamais un contrôle mort.

Le guide complet

Voir connectors/PLATFORM_CONNECTORS.md (CRM + Site Intelligence) et connectors/CRM_CONNECTORS.md Dans le paquet.

Connecteurs

Recherches et remboursements en libre-service (créez votre connecteur pour le chat client)

Les clients abonnés peuvent demander au client de discuter avec AI de leur compte OWN ("mon solde", "mes commandes", "le support a répondu à mon ticket") et, si l'entreprise le permet, demander des remboursements. Tout cela est alimenté par les déclarations de votre connecteur: pas de OpsIQ coeur de changement, pas de codage dur de plate-forme. L'IA appelle vos recherche comme outils natifs (il ne peut en inventer un), identité est verrouillé côté serveur au client vérifié, et les résultats sont automatiquement triés pour l'AI.

Déclarer une recherche de client

Dans votre esprit actions.json, une action en lecture seule devient appelable par le client avec ALL THREE: "scope":"client", "requires_confirmation":false, "is_destructive":false. Utilisation "scope":"both" quand la même recherche doit également être possible par votre équipe dans l'IA Admin. Le vocabulaire complet est admin, client, both et system (system n'atteigne ni AI — API et webhook seulement). Tout le reste est rejeté : la validation du paquet échoue et l'action ne s'installe pas. writing champ d'application — l'assistant à la rédaction est admin Action set.

La règle d'identité (obligatoire)

Nommez votre paramètre d'identité à partir de la série standard. Verrouillé vers l'identifiant numérique vérifié: client_id, clientid, customer_id, user_id, userid, account_id. Verrouillé sur cette id comme une chaîne: client_identifier, customer_identifier, account_identifier. Verrouillé sur l'email vérifié: email, client_email, customer_email, user_emailOpsIQ verrouille et remplit automatiquement le nom du client connecté vérifié par la plateforme; l'IA ne voit ni ne choisit jamais d'identité. Un nom non standard échoue à se fermer (refusé, jamais divulgué).

Ce qui doit rester admin-only

Tout ce qui n'est pas dans la portée de cette identité: fetch-by-bare-id (order_id/ticket_id Les listes sont disponibles sur le site Web de l'OMPI, mais elles ne sont pas disponibles. "scope":"admin".

Formulation des résultats (clés porte-réponse)

Les résultats de recherche sont structuralement parés avant d'atteindre l'IA: les clés en forme secrète sont lâchées, les longues chaînes et les listes sont captées, les champs vides sont élagés, et une carte plate plus large que le capuchon de la clé garde sa d'abord, les clés porteuses de réponses, de l'argent (credit, balance, amount, total, due, paid), identité (email, *name, phone, company), état (status, active, expir*, renew*), dates, plan/produit/domaine/service/abonnement/commande/facture/champs de billet, monnaie, nombre et stats/summary/totals, avant tout siège restant aller à d'autres clés plus petite valeur-premier. Conseils pratiques: nommer vos champs avec ce vocabulaire standard et retourner les champs qui répondent à la question du client plutôt qu'un brut100-key plate-forme dump; un champ nommé en dehors du vocabulaire rivalise pour les sièges restants et peut être paré à partir de charges utiles très larges.

Remboursements · ce que votre connecteur fournit

Deux opérations brutes, sans politique: (1) une lecture de vérification de paiement filtrable par identité ET une référence de transaction (votre API doit ET les filtres), par ex. whmcs_get_transactions; (2) une action de remboursement exécuter (scope:"admin", requires_confirmation:true, is_destructive:true, jamais exposé au client), par exemple whmcs_refund_orderL'entreprise choisit les deux clés dans Paramètres → Chat client; OpsIQ re-vérifie le serveur de paiement, applique la boîte de politique de l'entrepreneur (montant maximum, fenêtre d'âge, limite mensuelle), émet des problèmes à l'intérieur de la boite et dépose un ticket d'examen pour tout le reste.

Routage par département selon le destinataire

L'éditeur d'action du Connector Builder dispose des mêmes contrôles: définissez « Qui peut l'utiliser » sur Clients connectés, laissez les deux cases à cocher d'écriture décochées et utilisez un nom de paramètre d'identité standard.

Implémentations de référence

Les entrées "Client Self-Service" dans connectors/whmcs/actions.json, woocommerce/actions.json, oscommerce/actions.json; contrat complet en connectors/README.md §8.1–8.2 et ConnectorInterface::registerActions().

Connecteurs

Recherches d'invités — laissez les visiteurs suivre une réservation, un envoi ou une commande SANS connexion (visiteur_lookup)

Les hôtels, les messageries et de nombreuses plateformes commerciales servent aux clients qui détiennent une référence mais pas de connexion: un client avec une confirmation de réservation, un destinataire avec un numéro de suivi. guest_lookup capacité (Connector Contract, mode: généré) permet à VOTRE connecteur de servir les visiteurs dans le chat client AI — nonOpsIQles modifications de base, pas de codage dur de la plate-forme. Votre connecteur déclare CE QUI prouve le droit et QUEL champs sont visibles;OpsIQforce les interrupteurs, les gaz et l'uniforme à nier.

Le modèle de confiance

Référence + preuve, jamais identité

Le visiteur fournit la référence de l'enregistrement (apparie par le regex que vous déclarez) plus la preuve que vous choisissez — normalement l'email sur l'album. Votre action de recherche récupère l'inscription SERVER-SIDE par référence; OpsIQ's generated provider compare la preuve avec l'entrée FETCHED. L'entrée du visiteur n'est jamais fiable, et aucune identité vérifiée n'a été créée: le match donne droit au visiteur aux champs autorisés d'un enregistrement, rien d'autre.

Naissance uniforme (pas d'oracle de dénombrement)

L'IA est explicitement chargé de ne jamais confirmer l'existence d'une référence et de n'inventer aucun détail. Les tentatives sont limitées par la vitesse par conversation + IP par cœur avant que votre connecteur soit consulté.

Double opt-in, les deux par défaut OFF

Rien ne sert aux clients jusqu'à ce que l'entreprise autorise les deux commutateurs: le contrôle de l'espace de travail dans Paramètres→Sécurité→"Invités à rechercher des enregistrements dans le chat client" (permission-gated ET toujours confirmé par mot de passe, même lorsque l'étape optionnelle est désactivée), et le propre connecteur guest_lookup_enabled Installer ou activer un connecteur seul n'ouvre jamais la surface du client.

La surface réservée aux invités

Les fournisseurs générés s'inscrivent dans le registre guest surface de contexte — structurellement séparée de admin et customer. Les fournisseurs de contexte existants ne sont jamais consultés pour les visiteurs anonymes, et le fournisseur invité n'est jamais consulté pour les personnes connectées. Le ctx qu'il reçoit porte le message de chat, l'identifiant du thread et le courriel de pré-chat affirmé (non vérifié) comme un candidat à la preuve — aucun champ d'identité.

La déclarer dans le constructeur

1
Définir l'action de récupération

À l'étape Actions, ajouter une action en lecture seule qui renvoie ONE record par sa référence (par exemple : GET /bookings/{booking_number}) et map ses champs de réponse avec alias: statut, arrivée, départ, room_type, customer_email...

2
Cochez "Vieilles de recherche"

Sur l'étape de la capacité, activer guest_lookup. Un panneau dédié apparaît : choisissez l'action de récupération, nomez le paramètre de référence, donnez le motif de référence (un corps régex tel que \bBK-[0-9]{4,10}\b) nom du dossier (réservation), et choisir la preuve — courriel sur le dossier (recommandé) ou aucun (seule référence, pour le suivi de messagerie statut-seulement).

3
Autoriser la liste des champs visibles

Cochez exactement les champs que peut voir un invité. Tout le reste est DRoppED — jamais expurgé. Le Constructeur refuse les champs en forme de PII (email, téléphone, adresse, paiement...) dans la licenselist, et la suite de conformité revérifie la même règle avant de publier, donc une spécification manuelle ne peut pas s'y glisser. Notez que la validation du temps d'installation couvre le manifeste et la signature seulement, alors exécutez la suite avant de livrer. Le champ de preuve lui-même ne peut jamais être affiché.

4
Publier et activer

Le constructeur émet GuestLookupProvider.php — la mise en œuvre renforcée canonique, identique pour chaque paquet généré — et ajoute guest_lookup_enabled l'entreprise arme les deux commutateurs et le chat AI commence à offrir la recherche lorsqu'un visiteur demande votre type d'enregistrement.

Règles du contrat

Champs en forme de statut seulement

Pensez à "ce qu'un messager imprimerait sur la page de suivi publique" : statut, dates, catégorie de chambre ou service, nombres. Les noms, les coordonnées, les adresses, les données de paiement et les notes en texte libre n'ont pas leur place dans une conversation anonyme — le Constructeur et la conformité les refusent tous deux.

L'AI répond SEULEMENT à partir du bloc

Le fournisseur généré termine sa sortie par une instruction de répondre uniquement à partir des champs listés et d'offrir un ticket pour tout autre chose. Detail non dans la licenselist est "pas disponible dans le chat" — par conception.

Les suivis continuent de fonctionner

Le fournisseur redessine la référence des messages récents du visiteur dans la même conversation, donc "et quand est check-out?" fonctionne sans retypage de la référence. La référence assortie et le courriel de preuve sont rappelés sur le thread de chat comme CANDIDATES, donc les suivis ne ré-redemandent pas. Ils sont candidats seulement: chaque tour refait toujours le côté serveur d'enregistrement et recompare la preuve avant de libérer un seul champ.

Paquets d'auteurs manuels

Un paquet de marché peut expédier son propre GuestLookupProvider.php implementing ContextProviderInterface avec surfaces(): ['guest']. Suivez le contrat du modèle généré exactement — récupérer par référence, côté serveur de correction, refus uniforme, sortie uniquement permiselist — et déclarer guest_lookup in capabilities. La conformité vérifie la surface de l'invité et scanne la liste des permis pour PII.

💡
Les recherches des clients sont en lecture seule pour le chat AI. Ils n'exécutent jamais d'actions, ne créent jamais d ́identités et ne déverrouillent jamais le chemin d'action du client en libre-service ci-dessus — ce chemin nécessite toujours un client connecté vérifié par plate-forme.
Connecteurs

Ciblage de l'audience promotionnelle (promo_audience)

Laissez les campagnes de promotion de Studio par client LIVE et l'état de facturation de votre plateforme : "a une facture impayée", "commande en attente", "abonnement annulé". Tout connecteur (préinstallé, marché ou un que vous construisez) rejoint en mettant en œuvre deux petites méthodes. Non OpsIQ care change, aucun codage dur de la plate-forme : votre connecteur apparaît comme une plate-formes dans l'onglet du studio Tarification avec sa propre liste de faits, et plusieurs connecteurs peuvent être activés côte à côte.

Publicité
Ciblage de l'audienceUne identité vérifiée passée à un appel de connecteur audienceFlags produisant des faits qui entraînent une règle de ciblage, avec une note d'échec.Ciblage de l'audienceespace de travailConnectéIdentité vérifiéepublicDrapeaux()Choisissez votre connecteurFAITSunpaid_invoices = 2RÈGLEnon_payées ≥ 1Les spectacles de campagneFails closed: client inconnu ou toute erreur → la campagne reste cachée.1TWO METHODSCatalogue + Drapeaux2LIVE STATENon payé, en attente, statut3FAIL-SAFENe montre jamais à la mauvaise personne
Votre connecteur répond aux faits de facturation en direct pour le visiteur connecté; le studio cible sur eux, et échoue fermé ainsi une offre de facturation ne parvient jamais à la mauvaise personne.

Comment ça fonctionne

1
Déclarez vos faits

Implémentez audienceCatalog() sur votre classe de connecteur. Elle renvoie une étiquette et la liste des clés auxquelles votre plateforme peut répondre, chaque clé apparaissant dans le menu déroulant du studio sous le nom de votre plate-forme.

2
Réponse pour un client

Implement audienceFlags(array $identity). OpsIQ calls it at delivery time with the VERIFIED logged-in visitor identity (from the widget identity token, the same identity the client chat AI uses). Return a flat key => value map.

3
Fait

L'onglet Ciblage de Promotion Studio développe une section "Client et facturation" répertoriant votre plate-forme; les administrateurs créent des règles telles que "facture_non_payée >= 1"; chaque fait devient aussi une variable de personnalisation telle que {unpaid_invoices}.

connector. php, le contrat complet de promo_audience
public function audienceCatalog(): array
{
    return ['label' => 'My Billing Platform', 'keys' => [
        ['key' => 'unpaid_invoices', 'label' => 'Unpaid invoices (count)', 'type' => 'number'],
        ['key' => 'pending_orders',  'label' => 'Pending orders (count)',  'type' => 'number'],
        ['key' => 'client_status',   'label' => 'Client status',           'type' => 'text'],
    ]];
}

public function audienceFlags(array $identity): array
{
    // $identity = verified token payload: ['email' => ..., 'id' => ..., 'name' => ...]
    $email = strtolower(trim((string)($identity['email'] ?? '')));
    if ($email === '') return [];
    $client = $this->api('GetClient', ['email' => $email]); // your platform call
    if (!$client) return []; // unknown client -> return [] (fails CLOSED)
    return [
        'unpaid_invoices' => (int)$client['unpaid_count'],
        'pending_orders'  => (int)$client['pending_orders'],
        'client_status'   => (string)$client['status'],
    ];
}

Règles du contrat

Annoncer la capacité

Ajouter 'promo_audience' Ajouter à votre connecteur capabilities() Le tableau préinstallé est utilisé pour que la plateforme et le marché l'indiquent comme étant capable d'audience (la découverte fonctionne également à partir de la présence de méthode, mais sa déclaration est le signal propre). connectors/whmcs Le connecteur est l'implémentation de référence complète.

Nomination des clés

Petites lettres snake_case, 2-60 Les clés non déclarées retournées par audienceFlags() sont toujours utilisables dans les règles, mais déclarez tout ce que vous supportez afin que les administrateurs puissent le voir.

L'identité est vérifiée

The $identity array comes from the signed widget identity token issued by the customer site at login, never from client-supplied fields. If your platform cannot resolve the identity, return an empty array.

Échec fermé · toujours

En cas d'erreur (API down, client not found, timeout) renvoie []. Une règle dont le fait est manquant ne permet pas d'afficher la campagne. Un popup ciblé sur la facturation ne doit jamais atteindre la mauvaise personne ; OpsIQ Cela s'applique aussi dans le règle matcher.

Résultats

La fonction audienceFlags() est appelée au plus une fois par connecteur et par page vue, et UNIQUEMENT lorsqu'une campagne publiée utilise réellement les règles de votre plateforme. Les visiteurs anonymes ne vous coûtent aucun appel. 1-2 API les appels; OpsIQ Memoizes dans la requête.

Opérateurs fournis gratuitement

Les administrateurs combinent vos clés avec =, !=, >, >=, <, <=, contient, est défini, est vide, vous ne fournissez que des valeurs.

Jetons de personnalisation

Chaque fait double comme une variable dans le texte de la campagne: {unpaid_invoices}, {client_status}, plus les intégrations. {first_name} and {client_email}. Les valeurs sont désinfectées avant le rendu.

Connecteurs de marketplace sans code

Faits automatiques

Déclarative (JSON-seulement) les connecteurs de marketplace obtiennent promo_audience GRATUITEMENT: si votre connecteur déclare des ressources clients/utilisateurs, factures, commandes ou abonnements, OpsIQ Dérive les valeurs customer_status, unpaid_invoices, amount_due, pending_orders, active_subscriptions et subscription_status à partir de vos actions de recherche existantes.

Catalogue personnalisé (settings.json)

Ajouter un objet public_capabilities · {"label": "Ma Plateforme", "keys": [{"key":"open_carts", "label", "Open carts", "type": «nombre»}}, pour contrôler exactement quels faits (et étiquettes) apparaissent dans le menu déroulant du studio.

Testez votre fournisseur

1
Activer le connecteur

Connecteurs > votre connecteur > Activer. Puis ouvrez l'onglet Ciblage de toute campagne. Votre plateforme doit apparaître sous "Client & facturation (connecteurs)".

2
Créer une règle

Ajoutez: Votre plateforme · une clé · >= · 1 et définissez "Seuls les clients connectés".

3
Vérifiez les deux directions

Connectez-vous à votre plateforme en tant que client qui correspond à la règle (la fenêtre contextuelle doit être affichée) et comme un client qui ne le fait pas (la Fenêtre contextouel doit rester masquée).

Lancez une campagne à partir de votre propre code (déclencheur personnalisé)

Pourquoi?

Au-delà des déclencheurs intégrés (délay, défilement, intention de sortie, oisiveté, clic, pages vues, chat / activité ticket), vous pouvez lancer une campagne depuis n'importe où dans votre site ou le front-end connecteur, après une étape de caisse réussie, quand un chariot est abandonné, lorsque votre SPA change d'itinéraire, etc.

Comment

Définir le déclencheur de campagne Personnalisé avec un nom d'événement (p. ex. checkout_failed), puis appelez le hook global depuis votre page:

Ajouter un lien vers votre site / connecteur
// Any campaign whose Custom trigger event matches will be evaluated
// (it still respects targeting, frequency caps and audience rules).
window.OpsIQPromo && window.OpsIQPromo.fire('checkout_failed');
💡
Il ne libère que le -When. La campagne doit toujours passer toutes les règles (geo, audience, consentement, capsules) avant qu'elle ne se manifeste.
Le guide d'utilisation complet (conception, blocs, analyses, A/B, publication) est disponible dans le centre d'aide de l'application sous Engage → Promotion Studio. La capacité ici est découverte automatiquement à partir de n'importe quel connecteur ENABLED dans les connecteurs/ ou marketplace_connectors/. Il n'y a rien à enregistrer. Expédiez les deux méthodes, et le studio fait le reste.
Connecteurs

Capacité de connecteur d'enquête (Contrat 2.2)

Le survey La capacité de fournir des adaptateurs d'identité client vérifiés, des données sur l'audience, des variables sûres et des candidats destinataires à Survey Studio permet à n'importe quelle plateforme. promo_audience et ne donne pas à un connecteur la propriété des sondages, réponses, analyses ou livraison de courrier électronique.

💡
La création est terminée et utilisable aujourd'hui: Connector Contract 2.2, SurveyConnectorInterface, le panneau de construction dédié, généré SurveyProvider.php, les métadonnées du paquet et l'isolation de conformité tout le navire. La consommation n'est pas encore câblée: SurveyConnectorRegistry L’intégrité du fournisseur n’apparaît donc pas dans l’interface utilisateur d’administration et aucun package de connecteur publié ne déclare la fonctionnalité. La publication des jetons signés Survey Identity Gateway, le ciblage et l’intégration des variables, la matérialisation de CRM Outreach et les premiers mappages de fournisseurs expédiés restent des phases distinctes.

Responsabilités du fournisseur

Catalogue d'audience et faits

Les faits typiques incluent order_count, last_order_status, cancelled_order _count, customer_created_at, active_subscription_count et open_ticket_count. Les valeurs canoniques sont des données de type facts qui peuvent être utilisées pour résoudre les problèmes d'ordres ou de tickets.

Catalogue et valeurs des variables

Déclarez les variables client, compte, commande, abonnement et support avec le type, la sensibilité et le contexte autorisé.

Notification des destinataires

Énumérez en option les candidats pour la prospection CRM avec des ID externes stables, des pages limitées, des curseurs déterministes et des métadonnées liées au consentement.

Identité

Acceptez l’identité uniquement à partir de Survey Identity Gateway après la signature du jeton, l’expiration, le but, le connecteur et la vérification de l’espace de travail.

État d'exécution

SurveyConnectorRegistry est conçu pour signaler les fournisseurs compatibles, bloqués et indisponibles sans exposer les paramètres, chemins d'accès, identités brutes ou messages d'exception. Un fournisseur bloqué ne peut jamais être invoqué. La surface de reporting n'est pas encore exposée dans l'interface utilisateur d'administration : aujourd'hui un fournisseur bloque est simplement inerte.

Règles de fail-closed

Les clés non déclarées, les types incorrects, les valeurs surdimensionnées, les décalages de sujet, les temps d'attente des connecteurs et les identités inconnues sont rejetés. Une règle de ciblage qui nécessite un fait indisponible ne correspond pas.

Porte de dégagement du constructeur

Contrat 2.2 expédie l'entrée de registre de capacité, interface, panneau de cartographie d'enquête, généré SurveyProvider.php, version de la fonctionnalité, fichier README/référence du développeur et fiches de conformité. Les profils PHP locaux, les profils Commerce, Helpdesk, pont SaaS et les connecteurs standard API l'incluent.

💡
La copie de la promotion est uniquement importable : le constructeur peut traduire les mappages de promotion compatibles une fois, enregistrer une copie complète appartenant à l'enquête et enregistrer la provenance.
Connecteurs

Capacité de rétroaction (Contract 2.2)

Le reply_feedback La capacité reflète les propres cotes par réponse d'une plate-forme en OpsIQ. Une étoile un client donne une réponse du personnel à l'intérieur WHMCS L'espace client de's atterrit sur la MÊME réponse dans le OpsIQ Le fil d'administration, avec la même puce, le crédit de l'agent, l'entrée de page Feedback et le calcul Team & Performance comme une note donnée sur un OpsIQ Un stockage, une puce, un pipeline ; le connecteur ne fait que traduire.

Le chemin d'écriture unique

Il y a exactement deux chemins d'entrée et une vérité. OpsIQ Les tickets de portail écrivent nativement, les tickets de plateforme passent par le connecteur et chaque évènement du noyau arrive via ReplyFeedback::recordMirrored(): les mêmes colonnes, règle du staff-only, une évaluation par réponse des dernières années, sémantique, timbre espace de travail et l'indexation de la voix du client le portail écrire utilise. Un connecteur n'écrit jamais les lignes de rétroaction elle-même.

Conformité (quatre dossiers, puis signer à nouveau)

1
connector_contract.json

Ajouter l'entrée capabilities. reply_feedback: version 1.0, le ReplyFeedbackConnectorInterface, les méthodes replyFeed backCatalog et pullReplyFeedBack, implique inbound_ticket.

2
settings.json

Ajouter reply_feedback à la liste des capacités. C'est ce que lit la découverte de connecteurs.

3
spec.json

Déclarez reply_feedback. modes (poll et/ou webhook) et l'échelle de notation de la plateforme. C'est ce que lit la barrière de conformité.

4
Classe d'exécution

Implémentez l'interface, listez reply_feedback dans capabilities(), puis signez à nouveau le paquet.

Responsabilités du fournisseur

Catalogue

Déclarer les modes, l'échelle de notation propre à la plate-forme (le noyau normalise vers le 1-5), et tous les jetons de réaction. Le catalogue doit être conforme aux spécifications.json.

Traduction de Pull

pullReplyFeedback retourne des événements canoniques : id ticket plate-forme, id réponse plate-formes, note, réaction/comment optionnelle, temps soumis et un event_id stable. Il lit et traduit. Il n'écrit jamais.

Idempotence

event_id est stable par feedback STATE, donc un évènement rejoué n'est pas jouable et une modification de classement remplace (les dernières victoires, comme le portail).

Discipline du curseur

Les pages sont délimitées et déterministes. Un curseur qui n'avance pas met fin à l'exécution. Le remplissage historique s'écoule comme une fenêtre roulante, jamais en un seul mouvement géant.

Sécurité de la sonde

Sans configuration, retourner une page complète vide au lieu de lancer. Le coureur de conformité sondes avec des arguments vides.

Résolution de fail-closed

Le noyau résout chaque événement en une réponse locale par le marqueur miroir que le miroir de ticket est déjà marqué (<slug>:<ticket>:reply:<reply>). Un événement qui ne peut être résolu est abandonné, jamais deviné; les commentaires ne se rapportent qu'aux réponses du personnel; et le crédit d'agent provient toujours de l'auteur existant de la réponse. inbound_ticket ou ticket_mirror.

Exemple de travail: WHMCS

WHMCS stocke les évaluations par étoiles de la zone client par réponse tblticketreplies.rating. The WHMCS Le connecteur déclare le mode poll avec un. 1-5 à l'échelle, ticket_reply_ratings La commande relay dans son fichier de pont, et traduit chaque ligne en un événement dont les ids correspondent aux whmcs:<ticket>:reply:<reply> Après avoir mis à niveau le connecteur, recopiez le fichier de bridge sur le serveur WHMCS afin que la nouvelle commande y existe.

💡
Contrat de développement complet avec l'interface, les formes d'événements, les règles de normalisation et la liste de contrôle de conformité: doc/contracts/TICKET_REPLY_FEEDBACK_CAPABILITY.md Dans la rue OpsIQ Acceptation : noter une réponse à l’intérieur de la plateforme, attendre le sondage horaire, et la même réponse dans.OpsIQ La page d'accueil montre le jeton, la page de rétroaction le liste et un événement rejoué ne change rien.
Connecteurs

Capacité de fusion des billets (contrat 2.4)

Le ticket_merge La capacité fait fusionner un ticket dans OpsIQ une fusion sur chaque plate-forme de ticket connectée. Le billet de plateforme gardé reçoit les messages des tickets fusionnés, en commençant par le message d'ouverture de chaque ticket fusionné, au lieu du billet de plate-formes fusionné seulement étant fermé.

Pourquoi il existe

Une fusion OpsIQ déplace chaque message des tickets fusionnés dans le billet conservé et supprime les tickets réunis 2.4 un connecteur entendu seulement ticket.deleted pour chaque billet fusionné. WHMCS fermé ce billet et le WHMCS ticket n'a jamais reçu ce que le client a écrit pour la première fois: le sujet a montré [MERGED] et le contenu était manquant.

Ce que le noyau envoie

ticket. merged (une fois par fusion)

ticket_id, ticket_number, sujet et external_ref du billet KEPT; native_table (opsiq_tickets); site_key; sources, les billets fusionnés les plus anciens d'abord, chacun avec ticket_id, ticket_number, sujet, external_ref, client_name, client_email, created_at et des messages [{reply_id, author_type, author_name, created_at, corps}]; merged_by; merged_at. Les messages sont la conversation client-visible, capturé avant le déménagement. Les notes internes ne sont jamais incluses.

ticket. supprimé (par billet fusionné)

Encore des feux, maintenant avec merged_into {ticket_id, ticket_number, external_ref}. Core ne la livre pas à un connecteur qui déclare ticket_merge; d'autres consommateurs peuvent indiquer une fusion à partir d'une suppression.

Webhooks sortants

ticket.merged est un événement livrable. Un webhook de SaaS abonné à ticket.leeted reçoit également ticket. merged, donc une intégration construite avant 2.4 entend la fusion.

Ce que fait votre connecteur

Déclarer

List ticket_merge in capabilities() and settings.json, and implement TicketMergeConnectorInterface::mergeTickets(array $merge, array $settings). Required on Contract 2.4 for any package that declares ticket_mirror or handles ticket.deleted; conformance fails it otherwise.

Fusionnez nativement quand vous pouvez

When the kept ticket and a merged ticket both have a copy on your platform (TicketMergeContract::twins() resolves them from external_ref), call the platform's own merge.

Sinon ajouter une note privée

A merged ticket with no copy on your platform: add TicketMergeContract::transcript() to the kept platform ticket as a PRIVATE note. Never a public reply, which would email the customer their own old messages.

Signaler ce qui n'a pas fusionné

Retour {ok, mode, fusionné, noté, non fusionné, erreur}. Chaque copie fusionnée que vous ne pouviez pas fusionner va dans un merged, et le noyau applique votre manipulation normale de suppression (fermer, ou supprimer avec mirror_deletes) à exactement ceux-ci. Retourne le mode non supporté seulement lorsque la plate-forme n'a pas de fusion et aucune note privée.

Honore tes toggles

Les mêmes paramètres miroirs que la porte de votre autre porte miroir de ticket fusionne.

Merges qui commencent sur votre plateforme

Resolve the platform ids and call TicketMergeContract::applyInbound(['<prefix>'], $keptId, $mergedIds). OpsIQ merges its copies with _origin=mirror, so nothing is pushed back to you.

Implémentations expédiées

WHMCS

MergeTicket (ticketid = billet gardé, merceticetids = billets fusionnés) lorsque les deux sont dans WHMCS; AddTicketNote avec la transcription sinon. Le crochet TicketMerge du relais fusionne le OpsIQ copie lorsque le personnel fusionne dans WHMCS.

Zendesk

POSTE /api/v2/tickets/{id}/merge.json avec des commentaires de fusion privée (jusqu'à cinq billets par appel), plus la transcription comme commentaire privé sur le billet conservé, parce que Zendesk ferme les tickets fusionnés sans déplacer leurs commentaires.

OpsIQ Pont SaaS

POSTE /v1/tickets/{id}/merge avec source_ids, qui déplace les réponses et pièces jointes du portail; une réponse interne porte la transcription pour les billets qui n'ont jamais été sur le portail /manage fusionne la OpsIQ Des copies.

Constructeur de connecteurs

ticket_merge est dérivé, jamais coché : un paquet généré le déclare lorsqu'il lie le ticket de plate-forme qu'il crée (un abonné de ticket.créé avec ticket de lien), gère ticket.supprimé, ou déclare ticket_mirror. Sur l'étape des billets, sous Fusions, choisissez l'action de fusion de la plate-forme (carte fusion.target_remote_id, et fusionner.source_remote_ids ou fusionner.source_remote_id) et une action de note privée (note de carte.remote_id et note.body). La fusion généréeTickets() utilise les deux. Ni l'un ni l'autre, le Constructeur avertit que les messages d'un ticket fusionné n'atteindront pas la plate-forme.

💡
Contrat complet: doc/contracts/CONNECTOR_CONTRACT.md, section Fusion des tickets. Acceptation : fusionnez deux tickets dans OpsIQ qui existent tous les deux sur la plateforme, puis ouvrez le ticket conservé sur la plate-forme. Le premier message du ticket fusionné est là.
Connecteurs

Marché des connecteurs

Le Marketplace vous permet de découvrir, d’installer et de publier des connecteurs créés par la communauté.

Marché
Marché des connecteursUne grille de cartes de connecteur communautaire avec des catégories, des boutons d'installation et des évaluations en étoiles.Marché des connecteursespace de travailRecherche de connecteurs…CalendlyCalendrierInstaller★ 4.8HubSpotCRMInstaller★ 4.6MailchimpCourrielInstaller★ 4.7QuickBooksComptabilitéInstaller★ 4.5TwilioSMSInstaller★ 4.9NotionDocumentsInstaller★ 4.41DISCOVERConnecteurs de la communauté2INSTALLATIONEn un clic3PUBLISHSignez & soumettez le vôtre
Parcourez les connecteurs communautaires, installez en un clic ou signez et publiez vos propres niveaux de recherche, préinstallés et de marché.

Trouver et installer des connecteurs

1
Parcourir

Accédez à Connecteurs > Marketplace. Recherchez par nom, catégorie ou plateforme.

2
Examen

Vérifiez la description, les actions prises en charge et les évaluations.

3
Installer

Le package de connecteur est téléchargé et installé dans le dossier marketplace_connectors/.

4
Configurer

Activez-le dans Connecteurs, entrez les informations d'identification API et testez.

Publier un connecteur

1
Construire et tester

Utilisez le Connector Builder. Vérifiez que toutes les actions fonctionnent.

2
Paquet

Générer un profil.json, actions.json, la connaissance.json, et les fichiers PHP.

3
Signer

Run php tools/sign_connector.php <slug> to sign ONE package (it also accepts a path). It does not boot OpsIQ, so give it the key: either --key=<secret> or the OPSIQ_CONNECTOR_SIGNING_KEY environment variable, otherwise it stops with "No signing key available". tools/resign_all_connectors.php re-signs EVERY package on the install and reads the key from settings by itself, but it can also mint a NEW install-wide signing key, so reach for it only when that is what you want.

4
Soumettre

Téléchargez-le via le flux de soumission du marché pour examen.

Deux niveaux de connecteur

connecteurs/ — ce qui fonctionne réellement

Tout est en direct : les connecteurs qui expédient avec OpsIQ, tout ce qui est installé sur le marché et tout ce que publie le Connector Builder sur cette installation.

marketplace_connectors/ — où les paquets sont créés

La SOURCE d'édition pour les paquets de marché de premier parti. Ce n'est pas une racine découverte: rien ici n'y est en direct jusqu'à ce qu'il soit emballé, signé, ensemencé dans le catalogue et installé, à quel moment une copie atterrit dans des connecteurs/.

💡
Regardez dans les deux endroits. Un paquet que vous avez écrit sous marketplace_connectors/ n'est pas la copie qui fonctionne — l'installation de copies dans des connecteurs/, et seulement cette copie est découverte à l'exécution.Stripe, BigCommerce, Magento2, PrestaShop, OpenCart, Amazon SES, Postmark et Resend sont tous des paquets de marché: installer un avant de s'attendre à le trouver dans Connectors.
Développeur

API et constructeur de webhook

The API et Webhook Builder vous permet de créer des.API Points de terminaison et écouteurs webhook à l'intérieur OpsIQ sans écrire du PHP brut.

API constructeur
API et constructeur de webhookUn constructeur qui choisit un type de déclencheur (webhook entrant, planning, événement, manuel) qui alimente une action configurable.API & constructeur de webhookespace de travailDÉCLENCHEURWebhook entrantHoraire (cron)OpsIQManuelDécisionMapper les champs entrants →Créer un ticket / notifier / appeler APIEnregistrer le point de terminaison1DÉCLENCHEURSWebhook · calendrier · événement · manuel2NO RAW PHPConstruit dans l'interface utilisateur3MESURESMapper les champs, puis exécuter
Construire des paramètres sans PHP brut : choisissez un déclencheur (en ligne, calendrier, événement ou manuel), puis mapez les champs vers une action.

Déclencheurs

Événement

Courir quand quelque chose se passe dans. OpsIQ, ou lorsqu'un système externe affiche un évènement correspondant à votre webhook. URL. Tapez le nom de l'événement, par exemple ticket.created.

Calendrier

Utilisez l'un des événements d'intervalle intégrés comme nom de l'événement: cron. minutely, cron. hourly ou cron. daily L'écran Actions et déclencheurs a des boutons pour ceux-ci, donc vous n'avez pas à les retenir.

Phrase

Exécuter quand un administrateur demande à l'IA de le faire en langage clair. Ajouter la phrase qui devrait correspondre, par exemple trouver client.

Webhook entrant

Un système externe envoie un HTTP POST à votre OpsIQ Webhook URL Tout déclencheur à l'écoute de cet événement est activé.

Ne l'exécutez que parfois: conditions

Un déclencheur d'événement peut contenir des conditions, de sorte qu'il ne s'exécute que lorsque les données entrantes correspondent. Sans conditions, il s'exerce à chaque fois que l'évéement se déclenchait.

Champ

Un chemin d'accès aux données de l'événement. Utilisez un point pour les valeurs imbriquées, par exemple customer. email.

Correspond à tout ou n'importe quoi

Choisissez si toutes les règles doivent correspondre, ou seulement une d'entre elles.

Tests de texte

est égal, n'est pas égal à, contient, ne contient pas, commence par, est l'un de, n’est pas l'une de.

Tests de nombre

Les nombres écrits en tant que texte sont toujours comparés correctement. Les nombres de caractères sont toujours utilisés pour les comparaisons.

Tests de présence

est présent, est manquant, est vide, n'est pas vide.

Seul le page l'ingénieur sur appel pour les tickets urgents

Scénario :
Event ticket. created, avec une règle: priorité égale urgente.
Que faire:

L'action s'exécute pour les tickets urgents et est ignorée pour tout le reste. Aucun filtrage nécessaire de votre côté.

💡
Si vous laissez les règles vides, le déclencheur s'exécute sur chaque événement correspondant, ce qui est le même comportement qu'avant l'existence des conditions.

Actions

Envoyer un webhook

Envoyer HTTP POST à un URL externe avec une charge utile personnalisée.

Créer un ticket

Créez un ticket d'assistance avec le département, l'objet et le message spécifiés.

Envoyer un email

Envoyez un e-mail avec un modèle personnalisé.

Mettre à jour l'enregistrement

Mettre à jour un enregistrement client, ticket ou CRM.

Exécuter l'action de connecteur

Exécutez une action enregistrée à partir d'un connecteur activé avec ses règles d'autorisation et de confirmation du connecteur.

Run OpsIQ Général de l'armée française API action

Recherchez le nom complet General API Les champs, les étendues, les autorisations, la confirmation, l'idempotence et le support de test proviennent du contrat d'action en direct ; le flux de travail s'exécute dans son espace de travail enregistré et son contexte administrateur.

Envoyer une demande provider-native API

Utiliser un connecteur Native API Lu ou confirmé Native API Les informations d'identification restent à l'intérieur du connecteur et seuls les chemins de fournisseur relatifs sont acceptés.The credentials remain inside the connector and only relative provider paths are accepted.

Le constructeur d'Actions & Triggers, /api/v1.php, OpenAPI et Postman utilisent le même ActionContractRegistry, donc une action sélectionnable ne peut pas dériver de la documentation runtime.
Développeur

Livre de cuisine pour les triggers

Des recettes d'action de déclenchement prêtes à l'emploi pour les automatismes courants.

Comment ça fonctionne
Livre de cuisine pour les triggersUn flux de recette : un webhook uptime. down passe par un filtre de production, puis s’étend pour créer un ticket urgent et avertir Slack.uptime.downMonitor webhooksi produitfilterCréer un ticket urgentAvertir Slack #ops
Livre de cuisine pour les triggers

Créer automatiquement un ticket à partir de la surveillance

Scénario :
Le système de surveillance envoie POST lorsque le serveur tombe.
Que faire:

Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket · Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent

Notification Slack sur les commandes importantes

Scénario :
Envoyez un message Slack chaque fois qu'un client passe une commande sur $100.
Que faire:

Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details

Digest hebdomadaire par courriel

Scénario :
Courriel de résumé à la direction tous les lundis à 9h.
Que faire:

Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API

Escalade des tickets obsolètes

Scénario :
Si un ticket n'a pas de réponse pendant 24 heures, assignez-le au chef d'équipe.
Que faire:

Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note

Développeur

Construire votre première action

Cette procédure crée une action de connecteur simple à partir de zéro.

Actions de construction
Construire une actionUn formulaire de définition d'action : name lookup_order, une requête GET à/orders/{id}, un paramètre dactylographié id et un passage200test.Nouvelle actionespace de travailNouvelle actionNomlookup_orderDemandeGET/orders/{id}Paramsid · chaîne200 · commande trouvée1DEFINENom, méthode, paramètre2PARAMSEntrées tapé3ESSAIRésultats en direct 200
Construisez une action à partir de zéro. Nommez-la, définissez la méthode et le paramètre, déclarez les paramètres dactylographiés, et testez-le à un live 200.

Deux types d'action

Avant de commencer, décidez lequel vous voulez utiliser. Les deux sont configurés dans le même écran.

Appelez un API externe

L'action envoie une requête HTTP à votre plateforme. Choisissez cette option lorsque OpsIQ a besoin de vous contacter et d'agir de votre côté.

Exécuter une action de connecteur

L'action exécute quelque chose qu'un connecteur installé fournit déjà. Choisissez cette option lorsque le travail est déjà disponible et que vous voulez simplement le déclencher. Vous choisissez l'action du connecteur dans une liste, donc il n'y a rien à câbler.

La deuxième option est de réutiliser tout ce que vos connecteurs peuvent déjà faire sans en créer à nouveau : lire un fil de discussion de ticket, rechercher un client, importer des contacts, etc. Choisissez l’action du connecteur dans la liste déroulante et vous avez terminé.
1
Planifier l'action

Exemple : "lookup_product". Cherchez un produit par son nom, son prix de retour, son stock et sa description.

2
Définir dans les actions.json

Ajouter la définition de l'action:

actions.json — la forme réelle manifeste
{
  "actions": [
    {
      "action_id": "lookup_product",
      "label": "Look up a product",
      "category": "Catalogue",
      "description": "Find a product by name and return price, stock and description.",
      "scope": "admin",
      "requires_confirmation": false,
      "is_destructive": false,
      "delivery_type": "http",
      "http_method": "GET",
      "http_url": "/api/products/search",
      "parameters": [
        { "name": "name", "type": "string", "required": true, "in": "query",
          "description": "Product name to search for" }
      ],
      "returns": [
        { "alias": "id",          "path": "data.id",             "type": "string" },
        { "alias": "name",        "path": "data.name",           "type": "string" },
        { "alias": "price",       "path": "data.price",          "type": "number" },
        { "alias": "stock",       "path": "data.stock_quantity", "type": "number" }
      ]
    }
  ]
}
⚠️
Trois choses qui font une action ne s'enregistrent pas du tout. action_id est REQUIS et doit être2à100Le manifeste est un objet avec une LIST "actions", non une carte clé par nom d'action. Et le mapping des réponses est "retourne" avec les chemins DOTTED (data.id), pas JSONPath ($.data .id) — il n'y a pas de "réponse_mapping", "méthode", "point d'arrivée" ou "params" dans le registre.
3
Essai avec essai à sec

Dans l'étape de révision du Constructeur de connecteurs, appuyez sur Dry run. Il exécute la liste complète de vérification de conformité contre votre paquet et, lorsque vous avez fourni des informations d'identification, fait un test de connexion réel.

4
Vérifier l'utilisation de l'IA

Demandez à l'IA d'administration: "Recherchez le produit Widget Pro." L'IA devrait trouver et exécuter l'action.

⚠️
Ajout d'une action aux actions.jsonne crée PAS de route AJAX, il n'y a donc rien à régénérer.OpsIQlorsque le connecteur est activé ou que ses paramètres sont sauvegardés: réenregistrer le connecteur et la nouvelle action apparaît. tools/gen_route_registry.php couvre l'expédition admin AJAX et n'a aucune incidence sur les actions de connecteur.
Développeur

Points de terminaison d'événement entrant

Les points de terminaison entrants acceptent JSON signé d'un autre système et le transforment en activité de contact dédupliquée pouvant alimenter les échéanciers, la notation et les flux de travail.

Écran de produit
Points de terminaison entrantsChaque source entrante a son propre URL, secret, mapping et résultat d'activité récente.Points de terminaison entrantsespace de travailSOURCES5ACCEPTED12.4kREJECTED18VUE DE L'ESPACE DE TRAVAIL EN DIRECTPlateforme de facturationÉvénements d'abonnementEn bonne santéAppli de produitÉvénements d'inscription et d'utilisationEn bonne santéID de l'événementprovider_event_idDédoublementSignatureX-OpsIQ-Inbound-SignatureHMAC1CREATE SOURCEURL et secret2MAP PAYLOADE-mail, événement et ID3VÉRIFIERHMAC puis ingérer
Chaque source entrante a son propre URL, secret, mapping et résultat d'activité récente.

Créez une source par système d'envoi. OpsIQ génère un URL/token et secret. Envoyer JSON avec Content-Type: application/json et signez le corps brut exact en utilisant HMAC-SHA256:

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

Mappent les chemins JSON pour l'e-mail du contact, le nom de l'événement et l'ID d'évéement optionnel. L'ID de l’événement est la clé de déduplication préférée. L'activité acceptée entre dans la chronologie des contacts et peut affecter le score des prospects, les segments, le cycle de vie et les workflows.

Rejetez les signatures non valides avant d'analyser les données métier. Rotation d'un secret en mettant à jour les deux côtés dans une fenêtre contrôlée; ne pas consigner le secret.

Développeur

Opérations de webhook sortantes

L'administration des webhook sortants crée des abonnements signés, teste les points de terminaison et surveille la livraison asynchrone et l'intégrité des réessais.

Écran de produit
Webhooks sortantsLa page webhook sortante répertorie les points de terminaison HTTPS, les abonnements à des événements, l’état de la livraison et un test signé en un clic.Webhooks sortantsespace de travailENDPOINTS7SUCCESS99.2%RENFORCEMENT4VUE DE L'ESPACE DE TRAVAIL EN DIRECTMiroir de CRMContactez-nous.* et faites une offre.*En bonne santéBus de soutienEnvoyer un ticket.* et chat.*En bonne santéEntrepôt de données*RéessayerTest de livraisonÉchantillon de charge utile signéPrêt1SUBSCRIBEHTTPS URL et les évènements2AUTHENTICATESignature HMAC3OBSERVERail de livraison et réessais
La page webhook sortante répertorie les points de terminaison HTTPS, les abonnements à des événements, l’état de la livraison et un test signé en un clic.

Les administrateurs complets créent un point de terminaison HTTPS, choisissent des événements spécifiques ou le caractère générique, stockent le secret en toute sécurité et envoient un test. OpsIQ Signe la charge brute avec HMAC-SHA256:

X-OpsIQ-Signature: sha256=<hex hmac>

Verify the signature before deserialising or acting. Delivery is asynchronous and automatically retried after approximately 1minute, 5 minutes, 30 minutes,2heures et 12 HeuresUtilisez le rail de livraison récente pour inspecter l'état, le code de réponse et le nombre de tentatives.

Votre récepteur doit être idempotent car tout système asynchrone peut redélivrer une réponse 2xx uniquement après acceptation durable.

Développeur

Webhooks

Les webhooks permettent aux systèmes externes de notifier OpsIQ quand quelque chose se passe (inbound), et à _OpsIQ d'avertir les systèmes extérieurs lorsque quelque chose arrive en interne (outbound).

Webhooks
Webhooks sortantsL'écran des webhooks sortants: une table de points d'extrémité avec le nom, les événements abonnés, les points récents du statut de livraison et un bouton Send-test.Webhooks sortantsespace de travailPoints d'extrémité+ Enregistrer le point de terminaisonNOMÉVÉNEMENTSLIVRAISONSlack #alerte-venteshttps://hooks.slack.com/…crm. deal. won, commandeEssaiMiroir de CRMhttps://api.acme.com/hookContactez-nous.*, ticket. createdEssaiZapierhttps://hooks.zapier.com/…chat.startedEssai1ENDPOINTSNom, événements, URL2SIGNEDHMAC + réessai automatique3SEND TESTVérifier les livraisons
L'écran de webhooks réel sortant : chaque point final avec ses événements, la santé de la livraison récente, et un seul clic Envoyer test, signé et retrié.

Webhooks sortants

Souscription

Allez dans Paramètres > Webhooks. Ajoutez un point de terminaison URL et sélectionnez les événements à recevoir.

Événements

Abonnez-vous à des événements spécifiques, ou à ["*"] pour tout. La liste complète de votre installation est ci-dessous, et webhooks.events.list retourne le fichier sous la forme JSON.

Réessayer

Les livraisons ont échoué avec un retour exponentiel. Après 15 échecs consécutifs, le point de départ est automatiquement désactivé.

Signature

Chaque livraison est signée. X-OpsIQ-Signature carries v2=<hex>, et la chaîne signée est version.timestamp.delivery_id.body — pas le corps seul. Vérifiez toujours, et toujours reconstruire la chaîne exactement. Voir les exemples ci-dessous.

Protection de SSRF

OpsIQ N'enverra pas à privé/interne IPs (127.x, 10.x, 172.16.x, 192.168.x, 169.254.169.254).

Livraison asynchrone

Les webhooks sont livrés via la file d'attente des tâches, ne bloquant pas les opérations OpsIQ.

ID d'événement stable

Chaque événement possède un event_id unique qui reste le même lors des tentatives de déduplication.

Ce qui arrive avec chaque livraison

X-OpsIQ-Event

Le nom de l'événement, par exemple ticket.created.

X-OpsIQ-Delivery

L'identifiant de livraison. Il reste le même sur les relevés — utilisez-le pour ignorer un duplicata.

X-OpsIQ-Timestamp

Unix secondes à l'heure de la signature. Rejeter tout ce qui est plus vieux qu'environ cinq minutes.

X-OpsIQ-Signature

La signature en tant que v2=<hex>. Séparer sur le =: le côté gauche est la version, le côté droit est la valeur que vous comparez.

X-OpsIQ-Signature-Version

Le régime en vigueur, actuellement v2. Lisez-le à partir de l'en-tête plutôt que de la coder dur, et votre code continue de fonctionner si un v3 est ajouté.

⚠️
La chaîne signée est version.timestamp.delivery_id.body, pas le corps brut sur son propre . Hachage seul le corps est la raison la plus commune une vérification échoue - chaque livraison authentique est rejeté et l'extrémité semble cassée .

Vérification d'une livraison

PHP · vérifier unOpsIQwebhook
<?php
// Read the raw body BEFORE any framework parses it — the signature covers
// the exact bytes we sent, so a re-encoded array will not match.
$raw      = file_get_contents("php://input");
$sigHeader= $_SERVER["HTTP_X_OPSIQ_SIGNATURE"] ?? "";   // "v2=<hex>"
$ts       = (string)($_SERVER["HTTP_X_OPSIQ_TIMESTAMP"] ?? "");
$delivery = (string)($_SERVER["HTTP_X_OPSIQ_DELIVERY"] ?? "");
$secret   = "your endpoint signing secret";   // shown once when you add the endpoint

// 1. Refuse a stale delivery. This is what stops a captured request being replayed.
if ($ts === "" || abs(time() - (int)$ts) > 300) {
    http_response_code(401);
    exit(json_encode(["error" => "Stale delivery"]));
}

// 2. The header names its own version: "v2=<hex>".
[$version, $received] = array_pad(explode("=", $sigHeader, 2), 2, "");

// 3. Rebuild exactly what OpsIQ signed.
$canonical = $version . "." . $ts . "." . $delivery . "." . $raw;
$expected  = hash_hmac("sha256", $canonical, $secret);

// 4. Constant-time compare, so a timing attack cannot reveal the secret.
if ($received === "" || !hash_equals($expected, $received)) {
    http_response_code(401);
    exit(json_encode(["error" => "Invalid signature"]));
}

// 5. Accept. Deliveries retry, so treat a delivery id you have already
//    processed as a success and do the work only once.
$event = json_decode($raw, true);
// ... your handling ...

http_response_code(200);
echo json_encode(["received" => true]);
Node. js · vérifier un OpsIQ webhook
const crypto = require("crypto");

// express.raw gives you the exact bytes OpsIQ signed. express.json() does not.
app.post("/opsiq-webhook", express.raw({ type: "application/json" }), (req, res) => {
  const raw      = req.body;                                  // Buffer
  const sig      = req.headers["x-opsiq-signature"]  || "";   // "v2=<hex>"
  const ts       = req.headers["x-opsiq-timestamp"]  || "";
  const delivery = req.headers["x-opsiq-delivery"]   || "";
  const secret   = process.env.OPSIQ_WEBHOOK_SECRET;

  // 1. Reject stale deliveries (replay protection).
  if (!ts || Math.abs(Date.now() / 1000 - Number(ts)) > 300) {
    return res.status(401).json({ error: "Stale delivery" });
  }

  // 2. Split "v2=<hex>" into its version and its value.
  const [version, received] = sig.split("=", 2);

  // 3. Rebuild what OpsIQ signed: version.timestamp.delivery_id.body
  const canonical = Buffer.concat([
    Buffer.from(`${version}.${ts}.${delivery}.`),
    raw,
  ]);
  const expected = crypto.createHmac("sha256", secret).update(canonical).digest("hex");

  // 4. Constant-time compare. Lengths must match first or timingSafeEqual throws.
  const a = Buffer.from(expected), b = Buffer.from(received || "");
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).json({ error: "Invalid signature" });
  }

  // 5. Accept, and make the work idempotent on the delivery id.
  const event = JSON.parse(raw.toString("utf8"));
  res.json({ received: true });
});

Chaque événement que cette installation peut envoyer

Généré à partir de la compilation en cours d'exécution, il correspond toujours à la version sur laquelle vous êtes.

52 events can be delivered to a webhook endpoint on this install. Subscribe with ["*"] for all of them, or name the ones you want. The General API action webhooks.events.list retourne cette liste comme JSON, donc votre code n'a jamais à le coder dur.

Analyse (1)

analytics.anomaly

Fired by PHASE_ANOMALY_ALERTS when a daily KPI (sessions, pageviews, conversions, revenue) deviates from its same-weekday 4-week baseline beyond the configured threshold. Payload: day (required), title, site_key, anomalies.

commerce (2)

commerce.order.created

Fired the moment a chat-confirmed order lands on the merchant platform (connector or custom-actions integration) - before payment. Subscribe to sync carts, reserve stock, or notify fulfilment systems. Payload: reference (required), connector, amount_minor, currency, customer_email, thread_id, occurred_at.

commerce.payment.confirmed

Fired exactly once per order when the gateway actively verifies the payment (amount and currency exact). This is the settlement signal - it rides the same claim that prevents duplicate receipts, so it can never double-fire. Payload: reference (required), connector, occurred_at.

Contact (6)

contact.conversion

Fired by OpsIQ.

contact.erased

Fired by OpsIQ.

contact.lifecycle_changed

Fired by OpsIQ.

contact.status_changed

Fired by OpsIQ.

contact.tag_added

Fired by OpsIQ.

opsiq.contact.upsert

Fired by OpsIQ.

conversation (5)

conversation.assigned

Fired when a conversation is assigned to an agent or unassigned. Payload: thread_id (required), site_key, assigned_admin_id, by_admin_id, occurred_at.

conversation.created

Fired when a new Client Chat conversation (thread) is opened. Payload: thread_id (required), site_key, channel, client_email, client_name, visitor_id, created_at.

conversation.message.created

Fired when a visible message is written to a conversation by the visitor, an agent, the AI or the system. Internal notes do not fire. Payload: thread_id (required), message_id (required), site_key, sender_type, admin_id, message, has_attachment, created_at.

conversation.rated

Fired when the visitor rates a conversation (1-5 stars). Payload: thread_id (required), site_key, stars, comment, trigger, admin_id, occurred_at.

conversation.resolved

Fired when an agent resolves a conversation and hands it back to the AI. Payload: thread_id (required), site_key, by_admin_id, occurred_at.

CRM (6)

crm.company.created

Fired when a CRM company/account is created. Payload: company_id (required), name.

crm.deal.created

Fired when a CRM deal/opportunity is created (by an order, the capture agent, or a human). Payload: deal_id (required), title, amount, currency, scope.

crm.deal.lost

Fired when a deal is moved to a Lost stage (closed-lost). Payload: deal_id (required), stage, amount.

crm.deal.stage_changed

Fired when a deal moves to a different pipeline stage. Payload: deal_id (required), stage, amount.

crm.deal.won

Fired when a deal is moved to a Won stage (closed-won). Payload: deal_id (required), stage, amount.

crm.task.created

Fired when a CRM task is created (incl. AI-suggested next-step / renewal tasks). Payload: task_id (required), title.

Email (2)

email.bounced

Fired by OpsIQ.

email.replied

Fired by OpsIQ.

feedback (13)

feedback.analysis.completed

Fired when a Voice-of-Customer analysis run completes. Payload: analysis_run_id (required), workspace_key, sample_count, model_version.

feedback.detractor.detected

Fired when a newly indexed response meets its metric-specific detractor rule. Payload: feedback_item_id (required), workspace_key, source_kind, metric_kind, classification.

feedback.follow_up.completed

Fired when a Feedback follow-up is completed. Payload: feedback_item_id (required), workspace_key, actor_admin_id, outcome_code.

feedback.item.assigned

Fired when Feedback ownership changes. Payload: feedback_item_id (required), workspace_key, assignee_admin_id, team_id, actor_admin_id.

feedback.item.indexed

Fired when a source record is added to or refreshed in the canonical Feedback index. Payload: feedback_item_id (required), source_kind, source_id, workspace_key, metric_kind, classification.

feedback.item.redacted

Fired when source deletion or redaction removes Feedback content from the index. Payload: feedback_item_id (required), workspace_key, source_kind.

feedback.item.status_changed

Fired when the Feedback workflow state changes. Payload: feedback_item_id (required), workspace_key, state, actor_admin_id.

feedback.item.tagged

Fired when a tag is added to or removed from Feedback. Payload: feedback_item_id (required), workspace_key, tag, operation.

feedback.item.updated

Fired when a canonical Feedback item changes. Payload: feedback_item_id (required), workspace_key, change.

feedback.source.failed

Fired when a Feedback source replay or incremental index operation fails. Payload: workspace_key, source_kind (required), error_code, checkpoint.

feedback.source.lagging

Fired when a Feedback source checkpoint is behind its expected freshness window. Payload: workspace_key, source_kind (required), lag_seconds, last_success_at.

feedback.theme.detected

Fired when a canonical topic or theme signal is attached to Feedback. Payload: feedback_item_id (required), workspace_key, theme_key, confidence.

feedback.urgent.detected

Fired when an urgent Feedback signal is detected. Payload: feedback_item_id (required), workspace_key, source_kind, signal_key.

invoice (3)

invoice.created

Fired when an invoice is generated. Payload: invoice_id (required), customer_id, customer_email, amount, currency, due_date, items.

invoice.overdue

Fired when an invoice passes its due date unpaid. Payload: invoice_id (required), customer_id, customer_email, amount, currency, days_overdue.

invoice.paid

Fired when an invoice is paid in full. Payload: invoice_id (required), customer_id, customer_email, amount, currency, paid_at.

order (1)

order.created

Fired when a new order is placed. Payload: order_id (required), customer_id, customer_email, amount, currency, items, status, source.

paiement (3)

payment.completed

Fired when a payment succeeds. Payload: order_id (required), payment_id, provider_ref, customer_id, customer_email, amount, amount_minor, currency, gateway, invoice_id, items, paid_at.

payment.failed

Fired when a payment attempt fails. Payload: order_id, customer_id, customer_email, amount, currency, gateway, reason.

payment.refunded

Fired when a refund is issued. Payload: order_id, refund_id, customer_id, customer_email, amount, currency, reason.

sécurité (1)

security.alert

Fired by PHASE_SECURITY_ALERTS when a security rule trips: failed-login wave, new automatic IP blocks, or a tamper-evidence (audit/consent hash chain) verification failure. Payload: rule (required), title, site_key, count, blocks, errors.

subscription (3)

subscription.cancelled

Fired when a subscription is cancelled. Payload: subscription_id (required), plan_name, customer_id, customer_email, cancel_reason, cancelled_at, ends_at.

subscription.created

Fired when a subscription is started. Payload: subscription_id (required), plan_id, plan_name, customer_id, customer_email, amount, currency, interval, trial_ends_at, next_billing_at.

subscription.renewed

Fired when a subscription renews successfully. Payload: subscription_id (required), plan_name, customer_id, customer_email, amount, currency, next_billing_at.

billet (5)

ticket.closed

Fired when a ticket is closed or resolved. Payload: ticket_id (required), resolution, closed_by_type, closed_by_id.

ticket.created

Fired when a new support ticket is opened. Payload: ticket_id (required), ticket_number, subject, department_id, department_name, customer_id, customer_email, priority, message, author_type, author_id, author_name.

ticket.merged

Fired when one or more tickets are merged into another ticket. Payload: ticket_id (required), ticket_number, subject, external_ref, native_table, site_key, sources, merged_by, merged_at.

ticket.renumbered

Fired when a connector mirror adopts the remote platform's ticket number for an OpsIQ ticket. Payload: ticket_id (required), old_number (required), ticket_number (required), connector, external_ref.

ticket.replied

Fired when a reply is posted to a ticket. Payload: ticket_id (required), reply_id, author_type, author_id, author_name, message.

user (1)

user.registered

Fired when a new user/customer account is created. Payload: user_id (required), email, firstname, lastname, company, country, source.

Comment tester les webhooks localement?+

Utilisez ngrok pour exposer votre serveur local. Définissez le point de terminaison du webhook sur votre ngrok URL.

Que faire si mon point de terminaison est temporairement en panne?+

OpsIQ Si votre point de terminaison récupère dans la fenêtre de réessai, aucun événement n’est perdu.

Développeur

Clés API

API Les clés authentifient les requêtes vers le. OpsIQ REST API. Chaque clé a des autorisations d'étendue.

Clés API
Clés APIL'écran des clés API: un panneau de problèmes avec les puces d'accès et de portée, à côté d'une liste de clés masquées existantes avec des boutons de révocation.Clés APIespace de travailÉmettre une cléAccèsLecture seuleRestreintPortéescontacts.readtickets.readevents.writeClé de questionVos clés en mainIntégration de Zapieropq_••••4f2aRévoquerApplication mobileopq_••••91c7RévoquerExportation de Analyticsopq_••••2db0Révoquer1SCOPEDEn lecture seule ou restreint2PER-ACTIONChoisir des portées exactes3REVOCABLEFaites pivoter à tout moment
L'écran de touches réel API : délivrez une clé en lecture seule ou restreinte en sélectionnant des champs exacts, et retirez n'importe quelle clé à tout moment.

Création d'une clé API

1
Allez dans Paramètres > API Touches

Accédez à la gestion des clés API.

2
Cliquez sur Créer une clé

Donnez-lui un nom descriptif.

3
Sélectionner les champs d'application

Les étendues sont fournies en paires de lecture et d'écriture par zone, de sorte qu'une intégration de rapports peut être autorisée à lire uniquement les données nécessaires.

Portées disponibles

Choisissez l'ensemble le plus étroit qui fait le travail. admin Il satisfait à tous les objectifs ci-dessous, alors n'utilisez-le que lorsque vous avez réellement besoin d'un accès étendu.

Création de crm. read / crm

Contacts, entreprises, offres, activités, segments, outreach, conversions, cycle de vie et webhooks CRM.

tickets. read / tickets. write

Listez et lisez les tickets et leurs messages; répondez, mettez à jour, ouvrez et exécutez des opérations de file d'attente en vrac.

conversations. read / conversations

Lisez les conversations en direct et l'historique des messages; envoyez des messages, assignez et modifiez le statut.

kb. read / kb. write

Entrées de la base de connaissances.

Chat. read / chat. write

Modèles de réponses sauvegardés.

connectors.read

Découvrez quels connecteurs sont installés, ce qu'ils peuvent faire et testez leurs informations d'identification.

automations.read

Voir vos actions, déclencheurs et leur historique d'exécution.

departments.read

Départements disponibles pour le routage.

notifications.read

Notifications pour un opérateur nommé.

analytics.read

Sections de rapport, exportations CSV et définitions de rapport planifiées.

site_intelligence.read

Sites surveillés et leurs rapports SEO.

files.read

Liens de téléchargement signés pour les pièces jointes.

status.write

Composants de la page d'état et incidents.

écrire

Aides à l’écriture d’IA: rédiger, résumer, traduire, réécrire, composer, analyser.

administrateur

Tout, y compris un petit nombre d'actions sensibles qui sont délibérément inaccessibles par une portée étroite: supprimer un contact, modifier les paramètres de confidentialité et lire le journal des accès.

💡
Appelez meta. actions avec votre clé pour voir exactement les actions qu'il peut exécuter sur votre installation, ce qui est toujours plus fiable que de travailler à partir d'une liste.

Niveaux d'accès

Tout

La clé peut appeler tout ce que ses portées permettent.

Lecture seule

Le choix le plus sûr pour les rapports, les tableaux de bord et tout ce qui ne devrait jamais modifier les données.

Restreint

Vous listez les actions exactes que la touche peut appeler, tout le reste est refusé, même dans un périmètre autorisé.

4
Copier la clé

Affichée une fois. Commence par "opq_". Stockez-la en toute sécurité.

🚫
Ne jamais partagerAPIclés en code public, côté clientJavaScript, ou contrôle de version. Utilisez des variables d'environnement.
Développeur

Connectez votre site web

The OpsIQ Le widget est un. JavaScript Un extrait de code que vous ajoutez à votre site Web pour le suivi, le chat AI, la création de tickets et l'identification des clients.

Comment ça fonctionne
Connectez votre site webUne balise de script d'une ligne sur la gauche et, à droite, une page Web avec la bulle de chat OpsIQ apparaissant dans le coin.<!-- paste before </body> --><script src="https://cdn.opsiq.io/w.js" data-site="ws_8a2f" async></script>
Connectez votre site web

Installation de base

Extrait de widget basique
<script src="https://your-opsiq-domain.com/widget.php"
  data-site-key="site_abc123"
  async></script>

Paste before the closing </body> tag. The script loads asynchronously and does not block page rendering.

Attributs de configuration

data-site-key

Obligatoire. Votre clé de site depuis Sites connectés.

data-mode

Facultatif. "chat" (par défaut), "tickets", ou "les deux".

data-position

Facultatif. "bottom-right" (par défaut) ou "botton-left".

data-color

Code hexadécimal de la couleur primaire.

data-greeting

Facultatif. Message de bienvenue initial.

data-language

Langue de l'interface utilisateur: "en", "es", "fr", "de", "pt", "ar", etc.

data-identity-token

Jeton d'identité signé généré par le serveur.

Soutien de SPA

Suivi manuel de l'itinéraire SPA
// Manually notify OpsIQ of a route change (for custom routers)
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["pageview", {
  url: window.location.href,
  title: document.title,
}]);

Règles du CSP

Règles CSP pour le widget
script-src 'self' https://your-opsiq-domain.com;
connect-src 'self' https://your-opsiq-domain.com;
frame-src https://your-opsiq-domain.com;
Le widget ralentit-il mon site?+

Non. Sous 15 KB gzipped, chargement asynchrone après le contenu de la page.

Puis-je personnaliser l'apparence?+

Utilisez data-color pour la couleur primaire. Contactez le support pour les options de remplacement CSS.

Développeur

Widget installer des recettes

Guides d'installation spécifiques à la plateforme.

Comment ça fonctionne
Widget installer des recettesCartes d'installation de plateforme pour WordPress, Shopify and Google Tag Manager, chacun disant où ajouter le widget.Groupe de travail des politiquesWordPressInstallez le plugin, entrezEntrez votre clé de site, enregistrez.BoutiqueShopifyCollez l'extrait danstheme.liquid avant /body.GTMGestionnaire de balisesBalise personnalisée HTML, toutes les pages.
Installer des recettes

WordPress

Scénario :
Ajouter à toutes les pages d'un site WordPress.
Que faire:

Option 1: Edit theme footer.php, paste snippet before </body>. Option 2: Use "Insert Headers and Footers" plugin > Scripts in Footer. Option 3: Use a child theme footer.php to survive theme updates.

Shopify

Scénario :
Ajouter à votre boutique Shopify.
Que faire:

Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.

React / Next. js

Scénario :
Ajouter à une application React ou Next. js.
Que faire:

In Next.js, use next/script in app/layout.tsx: import Script from "next/script"; <Script src="https://your-opsiq.com/widget.php" data-site-key="site_abc" strategy="lazyOnload" />

WHMCS

Scénario :
Ajouter à votre espace client WHMCS.
Que faire:

Sélectionnez Configuration > Paramètres généraux > Autre > Contenu du pied de page global. Collez l'extrait ou modifiez le fichier footer. tpl de votre modèle.

Google Tag Manager

Scénario :
Ajouter via GTM.
Que faire:

Créer une balise personnalisée HTML, coller l'extrait. Déclencheur: Toutes les pages. Publier.

Développeur

Admin widget dans votre moteur de recherche (un contrat, n'importe quelle plateforme)

Embarquez le OpsIQ assistant administratif — chat d'administration, boîte de réception et écriture AI — à l'intérieur du panneau admin de votre plate-forme OWN, de sorte que votre équipe ne quitte jamais leurs outils SSO, c'est UN contrat générique mis en œuvre dans ~15 lignes du code serveur de votre plate-forme — le même modèle Zendesk, Intercom et de l ' usage du discours pour SSO. Il n'y a pas de plugin par plate-forme à attendre: n'importe quelle pile qui peut calculer un HMAC Je peux le faire aujourd'hui.

Étape 1 — la ligne d'intégration

De Sites éloignés→votre site→Codes, copiez la ligne de chargeur et ajoutez-la aux pages de votre panneau d'administration (y compris le pied de page, le modèle de mise en page ou une boîte JS personnalisée uniquement par admin) :

L'intégration d'une ligne
<script async src="https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=SITE_KEY&identity_token=TOKEN_FROM_STEP_2"></script>

Étape2— direOpsIQqui est connecté (serveur signé)

Seule votre application sait dans quel admin est connecté — ce n'est pas une lacune, c'est le modèle de sécurité. Votre serveur génère un jeton signé à courte durée de vie de votre propre session, exactement comme le jeton d'identité du visiteur, signé avec le même secret webhook site:

PHP · signe l'identité de l'administrateur depuis votre session
<?php
$secret  = "opsiq_whsec_your_site_secret";   // Remote Sites → Codes
$payload = json_encode([
    "site_key"      => "SITE_KEY",
    "iat"           => time(),
    "exp"           => time() + 6 * 3600,
    "authenticated" => true,          // REQUIRED, top level — see note below
    "platform"      => "your-platform",
    "admin"    => [
        "id"            => (string)$admin->id,      // from YOUR session
        "name"          => $admin->name,
        "username"      => $admin->username,
        "email"         => $admin->email,
        "role"          => $admin->role,
        "authenticated" => true,
    ],
]);
$payload64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
$identityToken = $payload64 . "." . hash_hmac("sha256", $payload64, $secret);
// Put $identityToken into the embed line (identity_token=…), or expose it as
// window.OpsIQAdminIdentityToken before the loader script.
Accès par administrateur, automatiquement

Chaque administrateur qui se connecte à votre plateforme est assorti individuellement:OpsIQ's par-admin access gate résolve le nom d'utilisateur du jeton + email contre unOpsIQ(Page de l'équipe; utilisez la liste des «messages d'échange» de votre agent lorsque les courriels de la plate-forme diffèrent) et applique les permissions de cet agent dans son espace de travail, son département et sa boîte de réception.OpsIQ; aucun changement d'intégration.

Rôles

Quelle que soit la chaîne de rôle que votre plate-forme envoie est affichée sur leOpsIQpartie pour l'attribution; l'autorisation provient toujours de laOpsIQagent record, jamais du rôle affirmé.

Pourquoi ne pas lire notre cookie de connexion ?

Les navigateurs n'envoient jamais votre cookie d'administration à une autre origine — aucun fournisseur ne peut simplement détecter votre domaine de connexion. Chaque produit sérieux résout cela de la même manière: vos chèques de serveur, signé. C'est l'ensemble du contrat.

Aucun mode partagé sur votre propre site

Hors de l'hôte OpsIQ il n'y a pas de mode non signé ou partagé-login: le chargeur reste caché jusqu'à ce qu'un jeton d'administration signé arrive. La valeur token=... dans le chargeur Codes est une clé widget qui identifie uniquement le site; il ne peut jamais connecter personne.

Le authenticated drapeau — mettre au niveau TOP

Ce drapeau est l'affirmation de votre serveur qu'un humain est vraiment connecté, etOpsIQrefuse tout jeton sans elle. "authenticated" => true beside site_key/iat/exp, PAS seulement à l'intérieur de admin objet. Current OpsIQ accepte dans l'une ou l'autre position, mais les versions plus anciennes ne lisent que le niveau supérieur — et l'échec est trompeur: liste de conversation, historique et non lu tout authentifiant bien pendant chaque chat tourner réponses "Accès administratif requis", qui ressemble à un bug de session et ne l'est pas. Si vous voyez exactement cette scission, cochez d'abord ce drapeau.

Hygiène symbolique

Se connecter sur le serveur seulement, jamais dans le navigateurJavaScript. Garder l'exp courte (minutes à heures);OpsIQles jetons périmés et à terme, et la signature lie le jeton à votre clé de site.

Implémentations de référence

LesWHMCSle module fait cela automatiquement à partir de laWHMCSsession d'administration; le fichier de bridge du connecteur Botble Hotel le fait à partir de la session Laravel (op=admin_identity). Tous deux sont juste ce contrat dans le dialecte de leur plateforme — copiez la plus proche de votre pile.

Câble à page zéro (sonde déclarée par le connecteur)

Lorsque votre connecteur OpsIQ stocke votre point de départ d'identité dans son admin_identity_probe_url la ligne PLAIN chargeur est toutes vos pages d'administration nécessaires: le widget découvre la sonde depuis le connecteur, l'appelle avec votre clé de site + jeton widnet, et authentifie chaque admin automatiquement. data-identity-endpoint attribut ou window.OpsIQAdminIdentityEndpoint.

💡
Le secret de signature est rempli pour vous. Dans les Sites distants, votre site, Codes, Option 3, Connectez-vous à votre personnel, chaque exemple contient déjà le secret de ce site, donc le code fonctionne comme collé : il n'y a rien à copier ou configurer. Les exemples sur cette page montrent opsiq_whsec_YOUR_SITE_SECRET à sa place. Chaque exemple cherche OPSIQ_SITE_SECRET (ou le réglage propre de votre cadre, nommé dans ses notes) sur le serveur d'abord et utilise que quand il est défini, vous pouvez déplacer le secret hors du fichier chaque fois que vous voulez, par exemple pour le faire tourner sans code d'édition. Soit la manière dont le fichier fonctionne sur votre serveur seulement: ne jamais le coller dans une page Web ou un navigateur JavaScript, et ne jamais l'engager dans un dépôt public, parce que quiconque détient le secret peut se connecter comme l'un de vos clients ou du personnel. WHMCS et Botble n'ont besoin de rien de tout cela: WHMCS hameçon arrive avec le secret rempli, et le Botble panneau de connexion le remplit dans le pont.

Code complet, plate-forme par plateforme

Chaque exemple imprime la balise Admin Chat uniquement pour un membre du personnel signé, avec le jeton signé ajouté, et répond au rafraîchissement du widget (?opsiq_identity_refresh=1&role=admin) avec {"success":true,"identity_token":"…"} ou 401. Sites distants, votre site, codes, option 3, Connectez-vous à votre personnel imprime le même code avec la clé du site et le secret rempli.

⚠️
Le jeton d'administration est le formulaire en deux parties: base64url(chargement payant), un point, puis l'hex HMAC-SHA256 de ce texte de base64url. Ce n'est pas un JWT, et un JVT est refusé. L'objet d'administration a besoin id et email, et exp doit être dans 24 heures.

WHMCS

Nothing to add: the WHMCS hook in Option 1 already signs your logged-in staff into Admin Chat and refreshes the token. Do not paste the Option 3 loader as well.
1

Install the Option 1 hook as includes/hooks/opsiq_tracker.php.

2

Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

includes/hooks/opsiq_tracker.php
/* WHMCS: no extra code. Option 1 (the All-in-One WHMCS Hook) signs the logged-in
 * admin into Admin Chat on every admin page and answers ?opsiq_identity_refresh=1&role=admin. */

Botble (connector bridge)

Nothing to add: the Botble bridge signs your logged-in admins. Copy the bridge from the Botble connector panel (it arrives with OPSIQ_HOST, OPSIQ_SITE_KEY and OPSIQ_SITE_SECRET filled in), then put its one admin_embed line in Botble's admin Custom JS.
1

In Botble admin → Custom JS, add: <script async src="https://YOUR-BOTBLE-SITE/opsiq-botble-bridge.php?op=admin_embed"></script>

2

Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

public/opsiq-botble-bridge.php
<!-- Botble admin → Custom JS. The bridge signs the logged-in admin; nothing secret is in the page. -->
<script async src="https://YOUR-BOTBLE-SITE/opsiq-botble-bridge.php?op=admin_embed"></script>

PHP (no dependencies)

1

Save as opsiq-admin-chat.php. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

At the very top of every ADMIN page, before any output: require 'opsiq-admin-chat.php'; opsiq_admin_chat_refresh(); and before </body>: <?= opsiq_admin_chat_tag() ?> (it replaces the Option 3 loader).

3

Replace opsiq_admin_chat_user() with your signed-in staff member. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq-admin-chat.php
<?php
/* opsiq-admin-chat.php — sign your logged-in staff into OpsIQ Admin Chat. */

// WHO IS SIGNED IN AS STAFF — replace the body. Return null for anyone who is not staff.
function opsiq_admin_chat_user(): ?array
{
    $u = $_SESSION['admin'] ?? null;    // e.g. ['id' => 3, 'email' => '…', 'username' => '…', 'name' => '…', 'role' => 'Owner']
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
}

// The admin token is base64url(payload) . '.' . hex HMAC — NOT a JWT.
function opsiq_admin_chat_token(array $u): string
{
    $secret = (string) (getenv('OPSIQ_SITE_SECRET') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; the environment wins when set
    if ($secret === '') return '';                           // fail closed: no Admin Chat
    $now = time();
    $payload = rtrim(strtr(base64_encode(json_encode([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,                      // at most 24 hours
        'authenticated' => true,
        'platform'      => 'php',
        'admin'         => [
            'id'       => (string) $u['id'],                 // REQUIRED
            'email'    => (string) $u['email'],              // REQUIRED
            'username' => (string) ($u['username'] ?? ''),
            'name'     => (string) ($u['name'] ?? ''),
            'role'     => (string) ($u['role'] ?? ''),
        ],
    ], JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
    return $payload . '.' . hash_hmac('sha256', $payload, $secret);
}

// Call at the top of every admin page, before any output.
function opsiq_admin_chat_refresh(): void
{
    if (empty($_GET['opsiq_identity_refresh'])) return;
    header('Content-Type: application/json; charset=utf-8');
    header('Cache-Control: no-store');
    $u = opsiq_admin_chat_user();
    $t = $u ? opsiq_admin_chat_token($u) : '';
    if ($t === '') { http_response_code(401); echo json_encode(['success' => false, 'login_required' => true]); exit; }
    echo json_encode(['success' => true, 'role' => 'admin', 'identity_token' => $t]);
    exit;
}

// Print before </body> on admin pages. Prints nothing for anyone who is not staff.
function opsiq_admin_chat_tag(): string
{
    $u = opsiq_admin_chat_user();
    $t = $u ? opsiq_admin_chat_token($u) : '';
    if ($t === '') return '';
    $src = 'https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=' . rawurlencode($t);
    return '<script async src="' . htmlspecialchars($src, ENT_QUOTES) . '" data-opsiq-widget="admin-chat"></script>';
}

Laravel

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET=… in .env with 'opsiq' => ['site_secret' => env('OPSIQ_SITE_SECRET')] in config/services.php on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Save the class as app/Support/OpsiqAdminChat.php; adjust isStaff() to your admin guard or role. Add the refresh middleware from the bottom of the code to your admin routes.

3

In your admin Blade layout before </body>: {!! \App\Support\OpsiqAdminChat::tag() !!}. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

app/Support/OpsiqAdminChat.php
<?php
// app/Support/OpsiqAdminChat.php — no packages needed.
namespace App\Support;

final class OpsiqAdminChat
{
    /** WHO IS STAFF — adjust to your admin guard, role or gate. */
    private static function staff()
    {
        $user = auth('web')->user();                    // or auth('admin')->user()
        return ($user && $user->can('access-admin')) ? $user : null;
    }

    /** The admin token is base64url(payload) . '.' . hex HMAC — NOT a JWT. */
    public static function token(): string
    {
        $user = self::staff();
        $secret = (string) (config('services.opsiq.site_secret') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; config wins when set
        if (!$user || $secret === '') return '';
        $now = time();
        $payload = rtrim(strtr(base64_encode(json_encode([
            'site_key'      => 'YOUR_SITE_KEY',
            'iat'           => $now,
            'exp'           => $now + 3600,
            'authenticated' => true,
            'platform'      => 'laravel',
            'admin'         => [
                'id'       => (string) $user->id,           // REQUIRED
                'email'    => (string) $user->email,        // REQUIRED
                'username' => (string) ($user->username ?? $user->email),
                'name'     => (string) $user->name,
                'role'     => 'Admin',
            ],
        ], JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
        return $payload . '.' . hash_hmac('sha256', $payload, $secret);
    }

    /** For the admin Blade layout, before </body>. Prints nothing for non-staff. */
    public static function tag(): string
    {
        $t = self::token();
        if ($t === '') return '';
        return '<script async src="' . e('https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=' . rawurlencode($t)) . '" data-opsiq-widget="admin-chat"></script>';
    }
}

/* Refresh — Admin Chat asks ?opsiq_identity_refresh=1&role=admin on the admin page it is on.
 * app/Http/Middleware/OpsiqAdminChatRefresh.php, added to your admin route group:
 *
 *   public function handle($request, \Closure $next) {
 *       if (!$request->query('opsiq_identity_refresh')) return $next($request);
 *       $t = \App\Support\OpsiqAdminChat::token();
 *       return $t === ''
 *           ? response()->json(['success' => false, 'login_required' => true], 401)->header('Cache-Control', 'no-store')
 *           : response()->json(['success' => true, 'role' => 'admin', 'identity_token' => $t])->header('Cache-Control', 'no-store');
 *   }
 */

WordPress / WooCommerce

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, add define('OPSIQ_SITE_SECRET', '…'); to wp-config.php instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Paste into your theme's functions.php or a small plugin. It shows Admin Chat inside wp-admin to users who can manage_options; change the capability to suit your team.

3

Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

functions.php
/* functions.php or a small plugin — OpsIQ Admin Chat inside wp-admin. */

if (!defined('OPSIQ_SITE_SECRET')) define('OPSIQ_SITE_SECRET', 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; wp-config.php wins when set

function opsiq_admin_chat_token(): string {
    if (!is_user_logged_in() || !current_user_can('manage_options')) return '';     // who counts as staff
    if (!defined('OPSIQ_SITE_SECRET') || OPSIQ_SITE_SECRET === '') return '';
    $u   = wp_get_current_user();
    $now = time();
    // The admin token is base64url(payload) . '.' . hex HMAC — NOT a JWT.
    $payload = rtrim(strtr(base64_encode(wp_json_encode([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,
        'authenticated' => true,
        'platform'      => 'wordpress',
        'admin'         => [
            'id'       => (string) $u->ID,                   // REQUIRED
            'email'    => (string) $u->user_email,           // REQUIRED
            'username' => (string) $u->user_login,
            'name'     => (string) $u->display_name,
            'role'     => (string) (reset($u->roles) ?: 'administrator'),
        ],
    ])), '+/', '-_'), '=');
    return $payload . '.' . hash_hmac('sha256', $payload, OPSIQ_SITE_SECRET);
}

// Refresh: Admin Chat asks ?opsiq_identity_refresh=1&role=admin on the admin page it is on.
add_action('admin_init', function () {
    if (empty($_GET['opsiq_identity_refresh'])) return;
    nocache_headers();
    $t = opsiq_admin_chat_token();
    if ($t === '') wp_send_json(['success' => false, 'login_required' => true], 401);
    wp_send_json(['success' => true, 'role' => 'admin', 'identity_token' => $t]);
});

// The loader, on every wp-admin page, for staff only.
add_action('admin_footer', function () {
    $t = opsiq_admin_chat_token();
    if ($t === '') return;
    echo '<script async src="' . esc_url('https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=' . rawurlencode($t)) . '" data-opsiq-widget="admin-chat"></script>';
});

Node.js / Express

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

adminRouter.use(opsiqAdminChat) on your ADMIN routes, after your session middleware; adjust isStaff(). It answers the refresh and sets res.locals.opsiqAdminChatTag.

3

Print res.locals.opsiqAdminChatTag (unescaped) before </body> in your admin layout. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq-admin-chat.js
// opsiq-admin-chat.js — no packages needed.
const crypto = require("crypto");

const isStaff = (user) => !!(user && user.isAdmin);        // WHO IS STAFF — adjust

// The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
function opsiqAdminChatToken(user) {
  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!isStaff(user) || !secret) return "";
  const now = Math.floor(Date.now() / 1000);
  const payload = Buffer.from(JSON.stringify({
    site_key: "YOUR_SITE_KEY",
    iat: now,
    exp: now + 3600,                                        // at most 24 hours
    authenticated: true,
    platform: "node",
    admin: { id: String(user.id), email: user.email, username: user.username || user.email, name: user.name || "", role: user.role || "Admin" },  // id + email REQUIRED
  })).toString("base64url");
  return payload + "." + crypto.createHmac("sha256", secret).update(payload).digest("hex");
}

// adminRouter.use(opsiqAdminChat)
function opsiqAdminChat(req, res, next) {
  const token = opsiqAdminChatToken(req.user);
  if (req.query.opsiq_identity_refresh) {
    res.set("Cache-Control", "no-store");
    return token
      ? res.json({ success: true, role: "admin", identity_token: token })
      : res.status(401).json({ success: false, login_required: true });
  }
  res.locals.opsiqAdminChatTag = token
    ? '<script async src="' + ("https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + encodeURIComponent(token)).replace(/"/g, """) + '" data-opsiq-widget="admin-chat"></script>'
    : "";
  next();
}

module.exports = { opsiqAdminChat };

Python (Flask)

1

No packages beyond Flask and flask-login. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Call init_opsiq_admin_chat(app) where you create the app, and adjust is_staff().

3

In your admin base template before </body>: {{ opsiq_admin_chat_tag }}. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq_admin_chat.py
# opsiq_admin_chat.py — Flask + flask-login, no other packages.
import base64, hashlib, hmac, json, os, time, urllib.parse
from flask import request, jsonify
from flask_login import current_user
from markupsafe import Markup, escape

def is_staff(user):                                           # WHO IS STAFF — adjust
    return user.is_authenticated and getattr(user, "is_admin", False)

def opsiq_admin_chat_token():
    secret = os.environ.get("OPSIQ_SITE_SECRET") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    if not secret or not is_staff(current_user):
        return ""
    now = int(time.time())
    # The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    payload = base64.urlsafe_b64encode(json.dumps({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "python",
        "admin": {"id": str(current_user.id), "email": current_user.email,           # REQUIRED
                  "username": getattr(current_user, "username", current_user.email),
                  "name": getattr(current_user, "name", ""), "role": "Admin"},
    }, separators=(",", ":")).encode()).decode().rstrip("=")
    return payload + "." + hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()

def init_opsiq_admin_chat(app):
    @app.before_request
    def _opsiq_admin_refresh():
        if request.args.get("opsiq_identity_refresh"):
            t = opsiq_admin_chat_token()
            if t:
                resp = jsonify({"success": True, "role": "admin", "identity_token": t})
            else:
                resp = jsonify({"success": False, "login_required": True})
                resp.status_code = 401
            resp.headers["Cache-Control"] = "no-store"
            return resp

    @app.context_processor
    def _opsiq_admin_tag():
        t = opsiq_admin_chat_token()
        if not t:
            return {"opsiq_admin_chat_tag": ""}
        src = "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + urllib.parse.quote(t, safe="")
        return {"opsiq_admin_chat_tag": Markup('<script async src="%s" data-opsiq-widget="admin-chat"></script>' % escape(src))}

Django

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in settings.py (for example os.environ["OPSIQ_SITE_SECRET"]) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Add "yourapp.opsiq_admin_chat.OpsiqAdminChatMiddleware" to MIDDLEWARE (after AuthenticationMiddleware) and "yourapp.opsiq_admin_chat.opsiq_admin_chat" to TEMPLATES context_processors. Staff = user.is_staff.

3

In your admin base template before </body>: {{ opsiq_admin_chat_tag }}. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq_admin_chat.py
# yourapp/opsiq_admin_chat.py — no packages needed.
import base64, hashlib, hmac, json, time, urllib.parse
from django.conf import settings
from django.http import JsonResponse
from django.utils.html import format_html

def opsiq_admin_chat_token(user):
    secret = getattr(settings, "OPSIQ_SITE_SECRET", "") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; settings win when set
    if not secret or not user.is_authenticated or not user.is_staff:
        return ""
    now = int(time.time())
    # The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    payload = base64.urlsafe_b64encode(json.dumps({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "django",
        "admin": {"id": str(user.pk), "email": user.email, "username": user.get_username(),   # id + email REQUIRED
                  "name": user.get_full_name(), "role": "Superuser" if user.is_superuser else "Staff"},
    }, separators=(",", ":")).encode()).decode().rstrip("=")
    return payload + "." + hmac.new(secret.encode(), payload.encode(), hashlib.sha256).hexdigest()

class OpsiqAdminChatMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        if request.GET.get("opsiq_identity_refresh"):
            t = opsiq_admin_chat_token(request.user)
            resp = (JsonResponse({"success": True, "role": "admin", "identity_token": t}) if t
                    else JsonResponse({"success": False, "login_required": True}, status=401))
            resp["Cache-Control"] = "no-store"
            return resp
        return self.get_response(request)

def opsiq_admin_chat(request):
    t = opsiq_admin_chat_token(request.user)
    if not t:
        return {"opsiq_admin_chat_tag": ""}
    src = "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + urllib.parse.quote(t, safe="")
    return {"opsiq_admin_chat_tag": format_html('<script async src="{}" data-opsiq-widget="admin-chat"></script>', src)}

.NET / C#

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OpsIQ:SiteSecret (user-secrets, the OpsIQ__SiteSecret environment variable or Key Vault) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

In Program.cs after app.UseAuthentication(): app.Use(OpsiqAdminChat.Refresh); staff = users in the "Admin" role (adjust).

3

In your admin layout before </body>: @Html.Raw(OpsiqAdminChat.Tag(Context)). Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

OpsiqAdminChat.cs
// OpsiqAdminChat.cs — no packages needed.
using System.Net;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

public static class OpsiqAdminChat
{
    // The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    public static string Token(HttpContext ctx)
    {
        var secret = ctx.RequestServices.GetRequiredService<IConfiguration>()["OpsIQ:SiteSecret"];
        if (string.IsNullOrEmpty(secret)) secret = "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; configuration wins when set
        if (string.IsNullOrEmpty(secret) || !ctx.User.IsInRole("Admin")) return "";      // WHO IS STAFF — adjust
        var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
        var json = JsonSerializer.Serialize(new Dictionary<string, object> {
            ["site_key"] = "YOUR_SITE_KEY", ["iat"] = now, ["exp"] = now + 3600,
            ["authenticated"] = true, ["platform"] = "dotnet",
            ["admin"] = new Dictionary<string, string> {
                ["id"] = ctx.User.FindFirstValue(ClaimTypes.NameIdentifier) ?? "",      // REQUIRED
                ["email"] = ctx.User.FindFirstValue(ClaimTypes.Email) ?? "",            // REQUIRED
                ["username"] = ctx.User.Identity?.Name ?? "", ["name"] = ctx.User.Identity?.Name ?? "", ["role"] = "Admin" },
        });
        var payload = Convert.ToBase64String(Encoding.UTF8.GetBytes(json)).TrimEnd('=').Replace('+', '-').Replace('/', '_');
        using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
        return payload + "." + Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(payload))).ToLowerInvariant();
    }

    // app.Use(OpsiqAdminChat.Refresh)
    public static async Task Refresh(HttpContext ctx, Func<Task> next)
    {
        if (string.IsNullOrEmpty(ctx.Request.Query["opsiq_identity_refresh"])) { await next(); return; }
        ctx.Response.Headers["Cache-Control"] = "no-store";
        var t = Token(ctx);
        if (t == "") { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsJsonAsync(new { success = false, login_required = true }); return; }
        await ctx.Response.WriteAsJsonAsync(new { success = true, role = "admin", identity_token = t });
    }

    public static string Tag(HttpContext ctx)
    {
        var t = Token(ctx);
        if (t == "") return "";
        return "<script async src=\"" + WebUtility.HtmlEncode("https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + Uri.EscapeDataString(t)) + "\" data-opsiq-widget=\"admin-chat\"></script>";
    }
}

Ruby on Rails

1

No gems needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

include OpsiqAdminChat in your admin base controller; adjust opsiq_staff.

3

In your admin layout before </body>: <%= opsiq_admin_chat_tag %>. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

app/controllers/concerns/opsiq_admin_chat.rb
# app/controllers/concerns/opsiq_admin_chat.rb — no gems needed.
require "base64"
require "cgi"
require "json"
require "openssl"

module OpsiqAdminChat
  extend ActiveSupport::Concern

  included do
    before_action :opsiq_admin_identity_refresh
    helper_method :opsiq_admin_chat_tag
  end

  private

  def opsiq_staff                                        # WHO IS STAFF — adjust
    current_user if respond_to?(:current_user, true) && current_user&.try(:admin?)
  end

  # The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
  def opsiq_admin_chat_token
    secret = ENV["OPSIQ_SITE_SECRET"].presence || "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    staff = opsiq_staff
    return "" if secret.blank? || staff.nil?
    now = Time.now.to_i
    payload = Base64.urlsafe_encode64({
      site_key: "YOUR_SITE_KEY", iat: now, exp: now + 3600,
      authenticated: true, platform: "rails",
      admin: { id: staff.id.to_s, email: staff.email,              # REQUIRED
               username: staff.try(:username).to_s, name: staff.try(:name).to_s, role: "Admin" }
    }.to_json, padding: false)
    payload + "." + OpenSSL::HMAC.hexdigest("SHA256", secret, payload)
  end

  def opsiq_admin_identity_refresh
    return unless params[:opsiq_identity_refresh].present?
    response.headers["Cache-Control"] = "no-store"
    t = opsiq_admin_chat_token
    return render(json: { success: false, login_required: true }, status: :unauthorized) if t.blank?
    render json: { success: true, role: "admin", identity_token: t }
  end

  def opsiq_admin_chat_tag
    t = opsiq_admin_chat_token
    return "" if t.blank?
    helpers.tag.script(nil, async: true, src: "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=#{CGI.escape(t)}", data: { opsiq_widget: "admin-chat" })
  end
end

Java (Spring Boot)

1

No libraries needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set opsiq.site.secret (for example from OPSIQ_SITE_SECRET) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace staff() with your admin lookup. The filter answers the refresh; @ControllerAdvice exposes opsiqAdminChatTag to views.

3

Admin Thymeleaf layout before </body>: <th:block th:utext="${opsiqAdminChatTag}"/>. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

OpsiqAdminChat.java
// OpsiqAdminChat.java — no libraries needed.
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.util.HtmlUtils;

@Component
@ControllerAdvice
public class OpsiqAdminChat implements Filter {
    @Value("${opsiq.site.secret:opsiq_whsec_YOUR_SITE_SECRET}")   // this site's secret; opsiq.site.secret wins when set
    private String secret;

    /** WHO IS STAFF — replace: id, email, username, name, role. Null for anyone else. */
    private Map<String, String> staff(HttpServletRequest req) {
        if (req.getUserPrincipal() == null || !req.isUserInRole("ADMIN")) return null;
        String n = req.getUserPrincipal().getName();
        return Map.of("id", n, "email", n, "username", n, "name", n, "role", "Admin");
    }

    // The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
    String token(HttpServletRequest req) {
        Map<String, String> u = staff(req);
        if (u == null || secret.isEmpty()) return "";
        try {
            long now = System.currentTimeMillis() / 1000;
            Map<String, Object> claims = new LinkedHashMap<>();
            claims.put("site_key", "YOUR_SITE_KEY"); claims.put("iat", now); claims.put("exp", now + 3600);
            claims.put("authenticated", true); claims.put("platform", "java"); claims.put("admin", u);   // id + email REQUIRED
            String payload = Base64.getUrlEncoder().withoutPadding().encodeToString(new ObjectMapper().writeValueAsBytes(claims));
            Mac mac = Mac.getInstance("HmacSHA256");
            mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
            return payload + "." + HexFormat.of().formatHex(mac.doFinal(payload.getBytes(StandardCharsets.UTF_8)));
        } catch (Exception e) { return ""; }
    }

    @Override // Admin Chat refreshing on the admin page it is on
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (req.getParameter("opsiq_identity_refresh") == null) { chain.doFilter(request, response); return; }
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Cache-Control", "no-store");
        res.setContentType("application/json");
        String t = token(req);
        if (t.isEmpty()) { res.setStatus(401); res.getWriter().write("{\"success\":false,\"login_required\":true}"); return; }
        res.getWriter().write("{\"success\":true,\"role\":\"admin\",\"identity_token\":\"" + t + "\"}");
    }

    @ModelAttribute("opsiqAdminChatTag")
    public String tag(HttpServletRequest req) {
        String t = token(req);
        if (t.isEmpty()) return "";
        String src = "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + URLEncoder.encode(t, StandardCharsets.UTF_8);
        return "<script async src=\"" + HtmlUtils.htmlEscape(src) + "\" data-opsiq-widget=\"admin-chat\"></script>";
    }
}

Go

1

No modules needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace staff() with your session lookup and wrap your admin router: OpsiqAdminChatRefresh(adminMux).

3

Pass OpsiqAdminChatTag(r) to your admin layout and print it before </body>. Each staff member needs an OpsIQ agent account with the same email (or username): that is how their own permissions apply.

opsiq_admin_chat.go
// opsiq_admin_chat.go — standard library only.
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/base64"
    "encoding/hex"
    "encoding/json"
    "html"
    "html/template"
    "net/http"
    "net/url"
    "os"
    "time"
)

type OpsiqStaff struct{ ID, Email, Username, Name, Role string }

// WHO IS STAFF — replace with your session lookup. Return nil for anyone who is not staff.
func staff(r *http.Request) *OpsiqStaff { return nil }

// The admin token is base64url(payload) + "." + hex HMAC — NOT a JWT.
func opsiqAdminChatToken(r *http.Request) string {
    u, secret := staff(r), os.Getenv("OPSIQ_SITE_SECRET")
    if secret == "" {
        secret = "opsiq_whsec_YOUR_SITE_SECRET" // this site's secret; the environment wins when set
    }
    if u == nil || secret == "" {
        return ""
    }
    now := time.Now().Unix()
    body, _ := json.Marshal(map[string]any{
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": true, "platform": "go",
        "admin": map[string]string{"id": u.ID, "email": u.Email, "username": u.Username, "name": u.Name, "role": u.Role}, // id + email REQUIRED
    })
    payload := base64.RawURLEncoding.EncodeToString(body)
    mac := hmac.New(sha256.New, []byte(secret))
    mac.Write([]byte(payload))
    return payload + "." + hex.EncodeToString(mac.Sum(nil))
}

// OpsiqAdminChatRefresh answers Admin Chat's ?opsiq_identity_refresh=1&role=admin.
func OpsiqAdminChatRefresh(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Query().Get("opsiq_identity_refresh") == "" {
            next.ServeHTTP(w, r)
            return
        }
        w.Header().Set("Cache-Control", "no-store")
        w.Header().Set("Content-Type", "application/json")
        if t := opsiqAdminChatToken(r); t != "" {
            json.NewEncoder(w).Encode(map[string]any{"success": true, "role": "admin", "identity_token": t})
            return
        }
        w.WriteHeader(http.StatusUnauthorized)
        json.NewEncoder(w).Encode(map[string]any{"success": false, "login_required": true})
    })
}

// OpsiqAdminChatTag prints the loader for staff only.
func OpsiqAdminChatTag(r *http.Request) template.HTML {
    t := opsiqAdminChatToken(r)
    if t == "" {
        return ""
    }
    src := "https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=YOUR_SITE_KEY&identity_token=" + url.QueryEscape(t)
    return template.HTML(`<script async src="` + html.EscapeString(src) + `" data-opsiq-widget="admin-chat"></script>`)
}

Mise en œuvre du critère d'identité sur Laravel (notes hard-won)

Si votre plateforme est Laravel (Botble, Bagisto, applications personnalisées) et que votre terminal est un fichier autonome qui lance le cadre pour lire l'administration connectée, trois détails vous permettront de gagner des heures — chacun a produit une véritable défaillance de production avant qu'elle ne soit apprise:

Reliure la demande AVANT le bootstrap

Vos fournisseurs de services peuvent résoudre request du conteneur pendant la botte. Le cycle de vie de Laravel relie la requête capturée première chose à l'intérieur Kernel::handle() — de refléter cet ordre: $app->instance('request', Request::capture()) QUELLES SONT LES INFORMATIONS A CONNAITRE AVANT $kernel->bootstrap()ou tu as "La classe cible [demande] n'existe pas".

Le préfixe de la session-cookie est HMAC-clé

Laravel moderne préfixe les valeurs des cookies avec un HMAC calculé avec la clé de l'application (CookieValuePrefix) — une sha1(name."v2") ne peut jamais correspondre. CookieValuePrefix::validate($name, $decrypted, $keys), avec un recul structurel (40hexagonale + | en position40). Tell: une session id plus longue que40les caractères gras (81= préfixe toujours attaché) et une session qui ne se charge que _token dedans.

Où vit le login

Le timbre d'auth est login_<guard>_<sha1(guard class)> — pour le web guard par défaut: 'login_web_' . sha1(Illuminate\Auth\SessionGuard::class). Scanner n'importe quel login_* clé numérique comme un retour pour les gardes personnalisés.

Déboguer comme le pont

Navire a debug=1 mode qui nomme l'ÉTAPE défaillant et l'exception — un attrape-tout aveugle rendu un déploiement en direct non diagnostiqué. Le pont Botble (de v1._0.7) est la référence: marqueurs d'étape au noyau/bind/bootstrap/decrypt/session/auth/db.

Laravel · point final de l'identité complète (copie, définir les deux constantes, fait)
<?php
/* identity endpoint · LARAVEL (Botble, Bagisto, any Laravel admin)
 * Drop this in your PUBLIC web root, e.g. /opsiq-identity.php
 * Answers: {"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} */
define("OPSIQ_SITE_KEY", "SITE_KEY");
define("OPSIQ_SITE_SECRET", "opsiq_whsec_your_site_secret");   // Remote Sites → Codes

header("Content-Type: application/json");
$step = "boot";
try {
    require __DIR__ . "/../vendor/autoload.php";
    $app = require_once __DIR__ . "/../bootstrap/app.php";

    $step = "bind";
    // ORDER MATTERS: bind the request BEFORE bootstrapping, or providers that
    // resolve "request" during boot throw "Target class [request] does not exist".
    $request = Illuminate\Http\Request::capture();
    $app->instance("request", $request);

    $step = "bootstrap";
    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
    $kernel->bootstrap();

    $step = "session";
    $app["session"]->driver()->setId($request->cookie(config("session.cookie")));
    $app["session"]->driver()->start();

    $step = "auth";
    $user = auth()->guard("web")->user();   // use YOUR admin guard name
    if (!$user) {
        echo json_encode(["success" => false, "authenticated" => false, "error" => "no admin session"]);
        exit;
    }

    $step = "sign";
    $admin = [
        "id"            => (string)$user->id,
        "name"          => (string)($user->name ?? $user->username),
        "username"      => (string)($user->username ?? $user->email),
        "email"         => (string)$user->email,
        "role"          => (string)optional($user->roles->first())->name,
        "authenticated" => true,
    ];
    $payload = json_encode([
        "site_key"      => OPSIQ_SITE_KEY,
        "iat"           => time(),
        "exp"           => time() + 6 * 3600,
        "authenticated" => true,          // TOP LEVEL — required
        "platform"      => "laravel",
        "admin"         => $admin,
    ], JSON_UNESCAPED_SLASHES);
    $p64   = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
    $token = $p64 . "." . hash_hmac("sha256", $p64, OPSIQ_SITE_SECRET);

    echo json_encode(["success" => true, "authenticated" => true,
                      "admin" => $admin, "identity_token" => $token]);
} catch (\Throwable $e) {
    // debug=1 names the failing STEP — never ship a blind catch-all
    $err = ($_GET["debug"] ?? "") === "1"
        ? get_class($e) . " at [" . $step . "]: " . $e->getMessage()
        : "identity unavailable";
    echo json_encode(["success" => false, "authenticated" => false, "error" => $err]);
}

Le même paramètre sur d'autres piles

Seul le "qui est connecté?" change de ligne — le bloc de signature est partout identique. Signez sur le serveur, jamais dans JavaScript.

WordPress · WHMCS· Symfony · PHP simple — échangez la recherche, gardez le signataire
<?php
/* The ONE helper every platform shares. Keep it verbatim. */
function opsiq_identity_token(array $admin, string $siteKey, string $secret, string $platform): string {
    $payload = json_encode([
        "site_key"      => $siteKey,
        "iat"           => time(),
        "exp"           => time() + 6 * 3600,
        "authenticated" => true,          // TOP LEVEL — OpsIQ refuses the token without it
        "platform"      => $platform,
        "admin"         => $admin + ["authenticated" => true],
    ], JSON_UNESCAPED_SLASHES);
    $p64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
    return $p64 . "." . hash_hmac("sha256", $p64, $secret);
}

/* ── WORDPRESS ─────────────────────────────────────────────────────────── */
require_once ABSPATH . "wp-load.php";
if (!current_user_can("manage_options")) { /* not an admin → refuse */ }
$u = wp_get_current_user();
$admin = ["id" => (string)$u->ID, "name" => $u->display_name,
          "username" => $u->user_login, "email" => $u->user_email,
          "role" => implode(",", $u->roles)];

/* ── WHMCS (inside an addon/hook, admin area) ──────────────────────────── */
$aid = (int)($_SESSION["adminid"] ?? 0);
if ($aid <= 0) { /* not an admin → refuse */ }
$row = Capsule::table("tbladmins")->where("id", $aid)->first();
$admin = ["id" => (string)$row->id, "name" => trim($row->firstname . " " . $row->lastname),
          "username" => $row->username, "email" => $row->email, "role" => "administrator"];

/* ── SYMFONY ───────────────────────────────────────────────────────────── */
$u = $security->getUser();                    // Symfony\Bundle\SecurityBundle\Security
if (!$u) { /* not an admin → refuse */ }
$admin = ["id" => (string)$u->getId(), "name" => $u->getName(),
          "username" => $u->getUserIdentifier(), "email" => $u->getEmail(),
          "role" => implode(",", $u->getRoles())];

/* ── PLAIN PHP / your own app ──────────────────────────────────────────── */
session_start();
if (empty($_SESSION["admin_id"])) { /* not an admin → refuse */ }
$admin = ["id" => (string)$_SESSION["admin_id"], "name" => $_SESSION["admin_name"] ?? "",
          "username" => $_SESSION["admin_username"] ?? "", "email" => $_SESSION["admin_email"] ?? "",
          "role" => $_SESSION["admin_role"] ?? ""];

/* ── then, on EVERY stack ──────────────────────────────────────────────── */
$token = opsiq_identity_token($admin, "SITE_KEY", "opsiq_whsec_your_site_secret", "wordpress");
echo json_encode(["success" => true, "authenticated" => true,
                  "admin" => $admin, "identity_token" => $token]);

Quand cela ne fonctionne pas — diagnostiquez dans cet ordre

Widget n'apparaît jamais, la console dit "le jeton d'identité de l'administrateur signé est requis"

Votre point d'arrêt n'a pas été rendu identity_token. Ouvrez le paramètre URL directement dans le navigateur d'administration connecté avec &debug=1 — vous verrez l'étape défaillante. Sur Laravel, c'est presque toujours l'élément de requête ou de préfixe des cookies ci-dessus.

L'histoire et les conversations fonctionnent, mais chaque tour de chat dit "Accès administratif requis"

La division classique. Votre jeton manque le TOP-LEVEL authenticated flag — le paramètre propre au widget accepte le jeton, le vérificateur partagé derrière le flux de discussion refuse. "authenticated" => true beside exp.

"admin non fourni dans OpsIQ" (HTTP 401)

Le jeton vérifié, mais son nom d'utilisateur + email ne correspondent pas OpsIQ Agent. Ajoutez l'agent dans OpsIQ → Équipe, ou ajouter le courriel de la plate-forme à la liste des correspondants-emails de cet agent quand il diffère de leur OpsIQ E-mail.

Tout 403s depuis le navigateur mais fonctionne avec curl

Un prévol CORS rejette un de vos en-têtes de requête. Votre point final doit répondre OPTIONS et faites écho à l'origine de la demande, ou évitez simplement les en-têtes personnalisés — le widget n'a besoin que du cookie.

Travaillé hier, échoue aujourd'hui

Vérifier exp: les jetons sont de courte durée par conception. Le widget re-probes automatiquement, donc cela signifie généralement que le point d'arrivée a cessé de voir la session — une rotation de clé app, un changement de pilote de session ou un changement du domaine des cookies.

💡
Le widget admin rend caché jusqu'à ce que l'identité se résout, et chaque appel chat/inbox/data est imposé côté serveur contre le correspondantOpsIQagent, peu importe ce que la page affirme. Le jeton déverrouille l'interface utilisateur; les permissions viennent toujours deOpsIQ.
Développeur

Identité du visiteur

Une fois identifié, OpsIQ relie l'historique de navigation, les discussions et les tickets au profil du client.

Comment ça fonctionne
Identité du visiteurUn flux : un utilisateur se connecte sur votre site, vous émettez un jeton d’identité signé et OpsIQ unifie ses sessions, chats et tickets en un seul profil.L'utilisateur se connecteSur votre siteJeton signéIdentité_jeton (HMAC)Un seul profilsessions+ chats+ billets d'entrée
Identité du visiteur

Deux niveaux d'identité, et quand chacun suffit

Niveau 1 — un indice non signé

Vous dites au widget qui est le visiteur avec une plaineJavaScriptobjet. Il remplit l'email et l'identifiant du client sur le journal des visiteurs, de sorte que votre tableau de bord affiche le trafic connecté et les sessions se joignent.OpsIQne publie jamais de données de compte sur la force de celui-ci.

Niveau 2 — un jeton d'identité signé

Votre serveur signe un jeton de courte durée avec le secret webhook site. OpsIQ vérifie la signature et seulement alors traite la personne comme un client éprouvé. C'est le niveau qui déverrouille les réponses de compte dans la conversation client et les recherches de connecteurs. Utilisez-le pour tout ce qu'un étranger ne doit pas voir.

⚠️
Niveau1est une commodité d'affichage.2est l'authentification. Si une question ne peut être répondue que pour le titulaire de compte réel, vous avez besoin de Niveau2.
💡
Vous n'avez pas à écrire Niveau 2 à la main : Sites éloignés → votre site → Codes → C. Les clients Signés génèrent le code de signature et le gestionnaire de rafraîchissement pour PHP, WordPress, Laravel, Node.js, Python, Django, .NET, Rails, Java et Go WHMCS crochet et le Botble connector bridge signe déjà les clients. L'identité indique qui est le client; leurs commandes ou réservations atteignent le chat par un connecteur (avec un fichier de pont seulement lorsque la plate-forme n'a pas API).

Niveau 1 — l'indice non signé

Définir l'objet AVANT le script widget, ou appeler identif() plus tard une fois que votre application sait qui est connecté. Les deux formulaires sont lus; utilisez la meilleure de vos pages.

JavaScript · les deux formulaires supportés
<!-- Form A: set the global before the loader -->
<script>
  window.OpsIQClient = {
    id:    "cust_1001",
    email: "[email protected]",
    name:  "Jane Smith",
    plan:  "pro"
  };
</script>
<script async src="https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY"></script>

<!-- Form B: identify later, e.g. after a client-side login -->
<script>
  window.opsiq.identify({
    id:    "cust_1001",
    email: "[email protected]",
    name:  "Jane Smith",
    plan:  "pro"
  });
</script>
⚠️
Only these forms are read: the window.OpsIQClient global, window.opsiqConfig.user, and window.opsiq.identify(). There is no OpsIQ.push(['identify', ...]) queue and no OpsIQClientSignature global — if you find either in an old note, it does nothing.

Niveau 2 — le jeton d'identité signé par le serveur

Exactement le même contrat symbolique que le widget admin, avec un customer sujet au lieu d'un admin un. Signez-le sur votre serveur et passez-le au widget. Deux détails décident si il vérifie, et les deux sont faciles à faux:

Les HMAC couvre la chaîne BASE64URL, pas laJSON

Signer $payload64Pas $payload. Signer le brut JSON produit un jeton qui semble juste et est rejeté à chaque fois avec une erreur de signature.

base64url, non rembourrée

Traduire +/ à -_ et de retirer = rembourrage. Base plaine64 se trouve survivre aujourd'hui; base64url est le contrat et est ce que chaqueOpsIQle vérificateur et le connecteur de référence émettent.

Authentifié va au niveau TOP

A côté site_key, iat et exp. C'est votre affirmation qu'un vrai humain est connecté, etOpsIQrefuse le jeton sans lui.

client. id est obligatoire

Un jeton portant seulement un email vérifie comme une signature et est ensuite silencieusement abandonné. Toujours envoyer un id.

Garder l'exp courte

Minutes à heures. Le jeton est une affirmation de session, pas un titre de stockage.

PHP - signez un jeton d'identité client (ce code exact vérifie)
<?php
/* Server-signed customer identity. Runnable as-is: set the two constants. */
$siteKey = "YOUR_SITE_KEY";                        // Remote Sites -> Codes
$secret  = "opsiq_whsec_your_site_secret";         // Remote Sites -> Codes

$payload = json_encode([
    "site_key"      => $siteKey,
    "iat"           => time(),
    "exp"           => time() + 3600,
    "authenticated" => true,                       // TOP LEVEL - required
    "platform"      => "your-platform",
    "customer"      => [
        "id"            => (string)$user->id,      // REQUIRED
        "email"         => (string)$user->email,   // REQUIRED
        "name"          => (string)$user->name,
        "plan"          => (string)($user->plan ?? ""),
        "authenticated" => true,
    ],
], JSON_UNESCAPED_SLASHES);

/* base64url(payload) . "." . hex HMAC-SHA256 OF THAT STRING. */
$payload64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
$token     = $payload64 . "." . hash_hmac("sha256", $payload64, $secret);

/* Hand it to the widget either way: */
printf(
    '<script async src="https://YOUR-OPSIQ/widget.php?site_key=%s&identity_token=%s"></script>',
    rawurlencode($siteKey),
    rawurlencode($token)
);
// or, if the loader is already on the page:
// echo '<script>window.opsiqConfig = window.opsiqConfig || {}; '
//    . 'window.opsiqConfig.identityToken = ' . json_encode($token) . ';</script>';
🚫
Signez sur le serveur seulement. Un jeton hissé dans le navigateur JavaScript signifie l'expédition du secret du site à chaque visiteur, qui donne à quiconque la possibilité d'imiter n'importe quel client.

Le même contrat, trois surfaces

Chat client sur votre site

sujet client, passé sous identity_token à widget. php. Couvert ci-dessus. Facultatif: avec l'extrait A et un connecteur le chat vérifie déjà les clients eux-mêmes (un numéro de réservation ou de commande avec preuve, ou un code email avant une commande). Sites distants, Codes, C génère le code pour la reconnaissance automatique des clients déjà connectés sur votre site.

Admin chat dans votre moteur de recherche

sujet administrateur, passé àopsiq/embed/admin_widget.php. Même signeur, clé de sujet différente. Voir "Admin widget dans votre backend".

Liens profonds du portail de soutien

Une variante plus stricte: les mêmes revendications plus jti et single_use:true, et a120- la seconde vie, parce que le jeton voyage dans unURLet doit être dépenseable une fois. Ne pas la faire rouler manuellement. Paramètres, Portail de support a un extrait prêt pour votre langue, et la plate-forme la menthe pour vous lorsque votre zone de compte fonctionne sur ce serveur.

Que se passe-t-il si un visiteur efface ses cookies ?+

Ils deviennent anonymes jusqu'à ce qu'ils soient identifiés à nouveau. OpsIQ lie le nouvel enregistrement anonyme au profil client dès qu'un indice ou un jeton arrive.

Pourquoi mon jeton vérifie-t-il le journal des visiteurs, mais pas les questions de compte?+

C'est le niveau1/ Niveau2split. Un indice non signé remplit le journal des visiteurs et rien d'autre. Les réponses au compte nécessitent une signature vérifiée.

Développeur

Connexion au portail: code pour chaque plateforme

Envoyez un client déjà connecté à votre application directement dans votre portail d'assistance, connecté, sans mot de passe. Cette page explique comment fonctionne le retrait, chaque réclamation dans le jeton, la configuration et un itinéraire complet pour chaque plateforme. Paramètres, Portail d'aide imprime le même code avec votre propre adresse portail et clé espace de travail rempli.

Comment ça fonctionne

1
Le client clique sur Support dans votre application

Le lien pointe sur un petit itinéraire sur VOTRE serveur, par exemple /support-portal. Jamais sur un lien qui contient déjà un jeton : un jeon dans une page fuit à travers la source de page, l'historique du navigateur et l'en-tête Referer.

2
Les contrôles de route qui est signé dans

Il lit le client de votre propre session. Un visiteur qui n'est pas connecté est envoyé à votre login d'abord et revient sur le parcours après.

3
L'itinéraire signe un jeton unique

Un JWT standard HS256 signé avec le secret de signature de cet espace de travail, que seul votre serveur détient. Il expire après 120 secondes et peut être utilisé une fois.

4
L'itinéraire redirige vers le portail

À la page du portail, le client est venu de quand le portail en a demandé un (opsiq_portal_return, accepté uniquement à l'intérieur de votre adresse portail), sinon le portail accueil. La réponse porte référent-Politique: sans renvoi et Cache-Control: sans magasin.

5
Le portail vérifie et signe le client dans

La signature, la clé espace de travail, l'expiration et l'identifiant unique sont vérifiés. Le client est trouvé ou créé par email et ses requêtes existantes y sont assorties.

Le jeton, réclamation par réclamation

site_key

Votre clé espace de travail. Un jeton fait pour un autre espace de travailler est refusé même quand il est signé correctement.

iat/exp

Émis et expiration, en secondes. Le token du portail vit 120 secondes: il n'a qu'à survivre à une redirection.

authentifié: vrai

La déclaration de votre application qu'il a vraiment signé cette personne. Requis, au niveau supérieur.

jti + single_use: vrai

Un id aléatoire et le drapeau unique. Le même lien ne peut pas être utilisé deux fois.

plateforme

Une étiquette gratuite pour l'origine du client (php, wordpress, whmcs...) montré dans le profil du client.

client. id et client. email

L'identifiant est l'identificateur de votre propre client; le courriel est la façon dont le portail trouve le client et correspond à leurs demandes.

nom du client / external_id

Le nom d'affichage optionnel, et l'id OpsIQ stocke contre votre plateforme.

Étapes

1
Copier l'itinéraire

Paramètres, Portail de support, Connexion sans couture depuis votre application. Choisissez ce que fonctionne votre application; le code ci-dessous la liste a votre adresse portail et la clé espace de travail rempli, avec des notes numérotées pour cette plate-forme.

2
Le secret est déjà dans le code

La route copiée contient le secret de signature de cet espace de travail, donc il fonctionne comme collé OPSIQ_SITE_SECRET (ou le réglage de votre framework) sur le serveur à la place : cette valeur est utilisée en premier. Ne mettez jamais l'itinéraire dans une page, JavaScript, une application mobile ou un dépôt public: toute personne détenant le secret peut se connecter en tant que client.

3
Lien avec le bouton Support de votre itinéraire

Par exemple https://your-app.com/support-portal.

4
Faites le bouton Connexion du portail utiliser votre application

Portal Studio, page d'ouverture de session, utiliser le login de mon site Web, votre page d ́accès URL: régler le même itinéraire. Le portail ajoute opsiq_portal_return par lui-même et l'itinéraire ramène le client à cette page, signé.

5
Facultatif: signez partout

Paramètres, Portail de support, Déconnectez partout : la sortie de votre application URL, donc déconnecter du portail permet également de déconnectez le client de votre appli.

6
Essai

Générez un lien de test signé sur la même page de paramètres pour vérifier le côté portail seul, puis ouvrez votre itinéraire tout en vous connectant à votre application.

WHMCS n'a pas besoin de code: WHMCS hook from Remote Sites signe déjà les clients dans le portail et les ramène à la page sur laquelle ils étaient.
💡
Le secret de signature est rempli pour vous. Dans Paramètres, Portail de Support, Seamless se connecter à partir de votre application, chaque exemple contient déjà le secret propre de ce site, donc le code fonctionne comme collé: il n'y a rien à copier ou configurer. Les exemples sur cette page montrent opsiq_whsec_YOUR_SITE_SECRET à sa place. Chaque exemple cherche OPSIQ_SITE_SECRET (ou le réglage propre de votre cadre, nommé dans ses notes) sur le serveur d'abord et utilise que quand il est défini, vous pouvez déplacer le secret hors du fichier chaque fois que vous voulez, par exemple pour le faire tourner sans code d'édition. Soit la manière dont le fichier fonctionne sur votre serveur seulement: ne jamais le coller dans une page Web ou un navigateur JavaScript, et ne jamais l'engager dans un dépôt public, parce que quiconque détient le secret peut se connecter comme l'un de vos clients ou du personnel. WHMCS et Botble n'ont besoin de rien de tout cela: WHMCS hameçon arrive avec le secret rempli, et le Botble panneau de connexion le remplit dans le pont.

Routes complètes, plate-forme par plateforme

OpsIQ server (self-hosted)

1

For a self-hosted OpsIQ: the route runs on your own OpsIQ server, so there is no secret to copy. OpsIQ reads this workspace's signing secret itself.

2

Save it as a page on that server, e.g. support-portal.php, and point your "Support" link at it.

3

Replace the body of $currentUser so it returns your signed-in customer (id, email, name), or null for a guest, and /login with your login page.

OpsIQ server (self-hosted)
/* OpsIQ server (self-hosted) — save as e.g. support-portal.php on your OpsIQ
 * server and link your "Support" button to it. OpsIQ reads the workspace's
 * signing secret itself, so there is nothing secret to copy. */

if (!function_exists('opsiq_portal_signed_url_for_site')) {
    require_once '/path/to/opsiq/opsiq/opsiq.portal_identity.php';
}

// 1. WHO IS SIGNED IN — replace the body. Return null for a guest.
$currentUser = static function (): ?array {
    $u = $_SESSION['user'] ?? null;
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
};
$user = $currentUser();
if (!$user) {
    header('Location: /login?return=' . urlencode($_SERVER['REQUEST_URI'] ?? '/'), true, 302);
    exit;
}

// 2. WHERE TO LAND — the portal page they came from, only if it is on the portal.
$portal = 'https://YOUR-OPSIQ/portal/your-workspace';
$back   = preg_replace('/#.*$/', '', (string)($_GET['opsiq_portal_return'] ?? ''));
$target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
    ? $back : $portal;

// 3. MINT a one-time link (120 s) for this workspace.
$url = opsiq_portal_signed_url_for_site($target, 'YOUR_SITE_KEY', [
    'id'    => $user['id'],        // REQUIRED
    'email' => $user['email'],     // REQUIRED
    'name'  => $user['name'] ?? '',
], 120);
if (!$url) {
    http_response_code(503);       // fail closed: never send a customer to a guessed address
    exit('Support portal is not configured yet.');
}

header('Referrer-Policy: no-referrer');   // the token is in the URL
header('Cache-Control: no-store');
header('Location: ' . $url, true, 302);
exit;

PHP (no dependencies)

1

Save the snippet as a page in your app, e.g. support-portal.php.

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment (hosting panel, .env or SetEnv) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Replace the body of $currentUser with your app's signed-in customer, and /login with your login page.

PHP (no dependencies)
/* support-portal.php — a redirect route in your own app.
 * Mint at CLICK time: a token baked into an href leaks through page source,
 * browser history and the Referer header. */

// 1. WHO IS SIGNED IN — replace the body with your app's own session. Return null for a guest.
$currentUser = static function (): ?array {
    $u = $_SESSION['user'] ?? null;            // e.g. ['id' => 7, 'email' => '…', 'name' => '…']
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
};
$user = $currentUser();
if (!$user) {                                  // a guest: sign in first, then come back here
    header('Location: /login?return=' . urlencode($_SERVER['REQUEST_URI'] ?? '/'), true, 302);
    exit;
}

// 2. THE SECRET — server-side only. Fail closed without it.
$secret = (string) (getenv('OPSIQ_SITE_SECRET') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; the environment wins when set
if ($secret === '') { http_response_code(503); exit('Support portal is not configured.'); }

// 3. WHERE TO LAND — the portal page they came from, only if it is on the portal.
$portal = 'https://YOUR-OPSIQ/portal/your-workspace';
$back   = preg_replace('/#.*$/', '', (string)($_GET['opsiq_portal_return'] ?? ''));
$target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
    ? $back : $portal;

// 4. MINT the token (standard HS256 JWT).
$b64 = static function ($v) {
    return rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
};
$now = time();
$signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
    'site_key'      => 'YOUR_SITE_KEY',
    'iat'           => $now,
    'exp'           => $now + 120,                // URL-borne tokens live ~2 minutes
    'authenticated' => true,
    'jti'           => bin2hex(random_bytes(16)),
    'single_use'    => true,                      // one-time link; replay is refused
    'platform'      => 'php',
    'customer'      => [
        'id'          => $user['id'],             // REQUIRED
        'email'       => $user['email'],          // REQUIRED
        'name'        => $user['name'] ?? '',
        'external_id' => (string) $user['id'],
    ],
]);
$token = $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');

// 5. GO. The default is https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
$url = $target . (strpos($target, '?') === false ? '?' : '&')
     . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);
header('Referrer-Policy: no-referrer');       // the token is in the URL
header('Cache-Control: no-store');
header('Location: ' . $url, true, 302);
exit;

Laravel

1

Run: composer require firebase/php-jwt

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET=… in .env with 'opsiq' => ['site_secret' => env('OPSIQ_SITE_SECRET')] in config/services.php on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste the route into routes/web.php. The auth middleware sends guests to your login and back.

Laravel
/* routes/web.php — composer require firebase/php-jwt
 * Link customers to  route('support.portal') */

Route::get('/support-portal', function (\Illuminate\Http\Request $request) {
    $user   = $request->user();                                   // guaranteed by ->middleware('auth')
    $secret = (string) (config('services.opsiq.site_secret') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; config wins when set
    abort_if($secret === '', 503, 'Support portal is not configured.');   // fail closed

    // Where to land: the portal page they came from, only if it is on the portal.
    $portal = 'https://YOUR-OPSIQ/portal/your-workspace';
    $back   = preg_replace('/#.*$/', '', (string) $request->query('opsiq_portal_return', ''));
    $target = ($back === $portal || str_starts_with($back, $portal . '/') || str_starts_with($back, $portal . '?'))
        ? $back : $portal;

    $now   = time();
    $token = \Firebase\JWT\JWT::encode([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 120,
        'authenticated' => true,
        'jti'           => bin2hex(random_bytes(16)),
        'single_use'    => true,
        'platform'      => 'laravel',
        'customer'      => [
            'id'          => $user->id,          // REQUIRED
            'email'       => $user->email,       // REQUIRED
            'name'        => $user->name,
            'external_id' => (string) $user->id,
        ],
    ], $secret, 'HS256');

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    $url = $target . (str_contains($target, '?') ? '&' : '?')
         . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);

    return redirect()->away($url)
        ->header('Referrer-Policy', 'no-referrer')
        ->header('Cache-Control', 'no-store');
})->middleware('auth')->name('support.portal');

WordPress

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, add define('OPSIQ_SITE_SECRET', '…'); to wp-config.php, above "That's all, stop editing", instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Paste the snippet into your theme's functions.php, or a small plugin (Code Snippets works).

3

Create an empty page with the slug support-portal and link your "Support" menu item to it. Guests are sent to wp-login and back.

WordPress
/* functions.php, or a small plugin. Create an empty page with the slug
 * "support-portal" and link customers to it. */

add_action('template_redirect', function () {
    if (!is_page('support-portal')) return;
    if (!is_user_logged_in()) { auth_redirect(); }                 // login, then back here

    $secret = defined('OPSIQ_SITE_SECRET') ? OPSIQ_SITE_SECRET : 'opsiq_whsec_YOUR_SITE_SECRET';   // this site's secret; wp-config.php wins when set
    if ($secret === '') wp_die('Support portal is not configured.', '', ['response' => 503]);   // fail closed

    // Where to land: the portal page they came from, only if it is on the portal.
    $portal = 'https://YOUR-OPSIQ/portal/your-workspace';
    $back   = preg_replace('/#.*$/', '', isset($_GET['opsiq_portal_return']) ? wp_unslash((string) $_GET['opsiq_portal_return']) : '');
    $target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
        ? $back : $portal;

    $user = wp_get_current_user();
    $b64  = static function ($v) {
        return rtrim(strtr(base64_encode(wp_json_encode($v)), '+/', '-_'), '=');
    };
    $now     = time();
    $signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 120,
        'authenticated' => true,
        'jti'           => bin2hex(random_bytes(16)),
        'single_use'    => true,
        'platform'      => 'wordpress',
        'customer'      => [
            'id'          => $user->ID,              // REQUIRED
            'email'       => $user->user_email,      // REQUIRED
            'name'        => $user->display_name,
            'external_id' => (string) $user->ID,
        ],
    ]);
    $token = $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    $url = $target . (strpos($target, '?') === false ? '?' : '&')
         . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);
    nocache_headers();
    header('Cache-Control: no-store');
    header('Referrer-Policy: no-referrer');
    wp_redirect($url, 302);                                       // wp_redirect, not wp_safe_redirect: the portal is another host
    exit;
});

WHMCS

Already using the OpsIQ WHMCS hook from Sites (includes/hooks/opsiq_tracker.php)? It already signs your customers into the portal and brings them back to the page they were on, so you do not need this snippet. Just set Portal Studio → Sign-in page → Your login page URL to your WHMCS client area login. Use the code below only if you are not installing that hook.
1

Save part 1 as opsiq_support.php in your WHMCS root (next to clientarea.php).

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the hook, set $opsiq_site_secret = '…'; in configuration.php instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Save part 2 as includes/hooks/opsiq_support_link.php to add Support to the client-area menu.

WHMCS
/* Two files you own — no OpsIQ module, nothing to keep updated.
 *
 * 1) Save this part as  opsiq_support.php  in your WHMCS root. */

require __DIR__ . '/init.php';

$ca = new WHMCS\ClientArea();
$ca->initPage();
$ca->requireLogin();                                         // login, then back here

$secret = '';
if (is_file(__DIR__ . '/configuration.php')) {
    include __DIR__ . '/configuration.php';                  // defines $opsiq_site_secret
    $secret = isset($opsiq_site_secret) ? (string) $opsiq_site_secret : 'opsiq_whsec_YOUR_SITE_SECRET';   // this site's secret; configuration.php wins when set
}
if ($secret === '') { http_response_code(503); exit('Support portal is not configured.'); }   // fail closed

// Where to land: the portal page they came from, only if it is on the portal.
$portal = 'https://YOUR-OPSIQ/portal/your-workspace';
$back   = preg_replace('/#.*$/', '', (string)($_GET['opsiq_portal_return'] ?? ''));
$target = ($back === $portal || strpos($back, $portal . '/') === 0 || strpos($back, $portal . '?') === 0)
    ? $back : $portal;

$uid    = (int) $ca->getUserID();
$client = localAPI('GetClientsDetails', ['clientid' => $uid]);

$b64 = static function ($v) {
    return rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
};
$now     = time();
$signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
    'site_key'      => 'YOUR_SITE_KEY',
    'iat'           => $now,
    'exp'           => $now + 120,
    'authenticated' => true,
    'jti'           => bin2hex(random_bytes(16)),
    'single_use'    => true,
    'platform'      => 'whmcs',
    'customer'      => [
        'id'          => $uid,                       // REQUIRED
        'email'       => $client['email'] ?? '',     // REQUIRED
        'name'        => trim(($client['firstname'] ?? '') . ' ' . ($client['lastname'] ?? '')),
        'external_id' => (string) $uid,
    ],
]);
$token = $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');

// Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
$url = $target . (strpos($target, '?') === false ? '?' : '&')
     . 'site_key=' . rawurlencode('YOUR_SITE_KEY') . '&identity_token=' . rawurlencode($token);
header('Referrer-Policy: no-referrer');
header('Cache-Control: no-store');
header('Location: ' . $url, true, 302);
exit;

/* 2) And this part as  includes/hooks/opsiq_support_link.php  to put a
 *    Support entry in the client-area navbar:
 *
 *    add_hook('ClientAreaPrimaryNavbar', 1, function ($navbar) {
 *        $navbar->addChild('opsiqSupport', [
 *            'label' => 'Support',
 *            'uri'   => 'opsiq_support.php',
 *            'order' => 60,
 *        ]);
 *    });
 */

Node.js / Express

1

Run: npm i jsonwebtoken

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment (.env with dotenv, or your host's settings) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste the route after your session / passport setup. Change /login if your login page lives elsewhere.

Node.js / Express
// npm i jsonwebtoken
const jwt = require("jsonwebtoken");
const crypto = require("crypto");

const PORTAL = "https://YOUR-OPSIQ/portal/your-workspace";
const onPortal = (u) => u === PORTAL || u.startsWith(PORTAL + "/") || u.startsWith(PORTAL + "?");

app.get("/support-portal", (req, res) => {
  const user = req.user;                                  // set by your session / passport
  if (!user) return res.redirect("/login?next=" + encodeURIComponent(req.originalUrl));

  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!secret) return res.status(503).send("Support portal is not configured.");   // fail closed

  // Where to land: the portal page they came from, only if it is on the portal.
  const back = String(req.query.opsiq_portal_return || "").replace(/#.*$/, "");
  const target = onPortal(back) ? back : PORTAL;

  const token = jwt.sign({
    site_key: "YOUR_SITE_KEY",
    authenticated: true,
    jti: crypto.randomBytes(16).toString("hex"),
    single_use: true,                                     // one-time link
    platform: "node",
    customer: {
      id: user.id,                                        // REQUIRED
      email: user.email,                                  // REQUIRED
      name: user.name,
      external_id: String(user.id),
    },
  }, secret, { algorithm: "HS256", expiresIn: 120 });     // sets iat + exp

  // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
  const url = target + (target.includes("?") ? "&" : "?")
    + "site_key=" + encodeURIComponent("YOUR_SITE_KEY") + "&identity_token=" + encodeURIComponent(token);
  res.set("Referrer-Policy", "no-referrer").set("Cache-Control", "no-store").redirect(302, url);
});

Node.js (no dependencies)

1

No packages needed. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace currentUser() with your app's signed-in customer, then call supportPortal(req, res) for GET /support-portal in your server.

Node.js (no dependencies)
// No packages needed — Node's own crypto is enough.
const crypto = require("crypto");

const PORTAL = "https://YOUR-OPSIQ/portal/your-workspace";
const b64 = (obj) => Buffer.from(JSON.stringify(obj)).toString("base64url");

// 1. WHO IS SIGNED IN — replace with your app's session lookup. Return null for a guest.
function currentUser(req) {
  return req.user || null;                                // { id, email, name }
}

// GET /support-portal
function supportPortal(req, res) {
  const here = new URL(req.url, "http://local");
  const user = currentUser(req);
  if (!user) {                                            // a guest: sign in first, then come back
    res.writeHead(302, { Location: "/login?next=" + encodeURIComponent(req.url) });
    return res.end();
  }
  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!secret) { res.writeHead(503); return res.end("Support portal is not configured."); }

  // Where to land: the portal page they came from, only if it is on the portal.
  const back = (here.searchParams.get("opsiq_portal_return") || "").replace(/#.*$/, "");
  const target = (back === PORTAL || back.startsWith(PORTAL + "/") || back.startsWith(PORTAL + "?")) ? back : PORTAL;

  const now = Math.floor(Date.now() / 1000);
  const signing = b64({ alg: "HS256", typ: "JWT" }) + "." + b64({
    site_key: "YOUR_SITE_KEY",
    iat: now,
    exp: now + 120,
    authenticated: true,
    jti: crypto.randomBytes(16).toString("hex"),
    single_use: true,
    platform: "node",
    customer: { id: user.id, email: user.email, name: user.name, external_id: String(user.id) },
  });
  const token = signing + "." + crypto.createHmac("sha256", secret).update(signing).digest("base64url");

  // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
  const url = target + (target.includes("?") ? "&" : "?")
    + "site_key=" + encodeURIComponent("YOUR_SITE_KEY") + "&identity_token=" + encodeURIComponent(token);
  res.writeHead(302, { Location: url, "Referrer-Policy": "no-referrer", "Cache-Control": "no-store" });
  res.end();
}

Python (Flask / FastAPI)

1

Run: pip install pyjwt (the Flask example also uses flask-login).

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste into the module that creates your app. @login_required sends guests to your login view and back.

Python (Flask / FastAPI)
# pip install pyjwt flask-login
import os, secrets, time, urllib.parse
import jwt
from flask import request, redirect, abort
from flask_login import login_required, current_user

PORTAL = "https://YOUR-OPSIQ/portal/your-workspace"

def portal_link(user, back=""):
    secret = os.environ.get("OPSIQ_SITE_SECRET") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    if not secret:
        abort(503, "Support portal is not configured.")     # fail closed
    back = back.split("#", 1)[0]
    target = back if (back == PORTAL or back.startswith(PORTAL + "/") or back.startswith(PORTAL + "?")) else PORTAL
    now = int(time.time())
    token = jwt.encode({
        "site_key": "YOUR_SITE_KEY",
        "iat": now,
        "exp": now + 120,                                   # URL-borne: ~2 minutes
        "authenticated": True,
        "jti": secrets.token_hex(16),
        "single_use": True,                                 # one-time link
        "platform": "python",
        "customer": {
            "id": user.id,                                  # REQUIRED
            "email": user.email,                            # REQUIRED
            "name": getattr(user, "name", ""),
            "external_id": str(user.id),
        },
    }, secret, algorithm="HS256")
    # Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    return (target + ("&" if "?" in target else "?")
            + "site_key=" + urllib.parse.quote("YOUR_SITE_KEY", safe="")
            + "&identity_token=" + urllib.parse.quote(token, safe=""))

@app.route("/support-portal")
@login_required
def support_portal():
    resp = redirect(portal_link(current_user, request.args.get("opsiq_portal_return", "")), code=302)
    resp.headers["Referrer-Policy"] = "no-referrer"
    resp.headers["Cache-Control"] = "no-store"
    return resp

Django

1

Run: pip install pyjwt

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in settings.py (for example os.environ["OPSIQ_SITE_SECRET"]) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste the view into views.py and add path("support-portal/", views.support_portal) to urls.py. @login_required sends guests to LOGIN_URL and back.

Django
# pip install pyjwt   —   urls.py: path("support-portal/", views.support_portal)
import secrets, time, urllib.parse
import jwt
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect

PORTAL = "https://YOUR-OPSIQ/portal/your-workspace"

@login_required
def support_portal(request):
    secret = getattr(settings, "OPSIQ_SITE_SECRET", "") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; settings win when set
    if not secret:                                       # fail closed
        return HttpResponse("Support portal is not configured.", status=503)

    # Where to land: the portal page they came from, only if it is on the portal.
    back = request.GET.get("opsiq_portal_return", "").split("#", 1)[0]
    target = back if (back == PORTAL or back.startswith(PORTAL + "/") or back.startswith(PORTAL + "?")) else PORTAL

    now = int(time.time())
    token = jwt.encode({
        "site_key": "YOUR_SITE_KEY",
        "iat": now,
        "exp": now + 120,
        "authenticated": True,
        "jti": secrets.token_hex(16),
        "single_use": True,
        "platform": "django",
        "customer": {
            "id": request.user.pk,                        # REQUIRED
            "email": request.user.email,                  # REQUIRED
            "name": request.user.get_full_name(),
            "external_id": str(request.user.pk),
        },
    }, secret, algorithm="HS256")

    # Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    url = (target + ("&" if "?" in target else "?")
           + "site_key=" + urllib.parse.quote("YOUR_SITE_KEY", safe="")
           + "&identity_token=" + urllib.parse.quote(token, safe=""))
    resp = HttpResponseRedirect(url)
    resp["Referrer-Policy"] = "no-referrer"
    resp["Cache-Control"] = "no-store"
    return resp

.NET / C#

1

Run: dotnet add package System.IdentityModel.Tokens.Jwt

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OpsIQ:SiteSecret (user-secrets, the OpsIQ__SiteSecret environment variable or Key Vault) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Paste into Program.cs after app.UseAuthentication(). RequireAuthorization() sends guests to your login and back.

.NET / C#
// dotnet add package System.IdentityModel.Tokens.Jwt   —   Program.cs
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

const string Portal = "https://YOUR-OPSIQ/portal/your-workspace";

app.MapGet("/support-portal", (HttpContext ctx, IConfiguration cfg) =>
{
    var secret = cfg["OpsIQ:SiteSecret"];
    if (string.IsNullOrEmpty(secret)) secret = "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; configuration wins when set
    if (string.IsNullOrEmpty(secret))                     // fail closed
        return Results.StatusCode(503);

    var id    = ctx.User.FindFirstValue(ClaimTypes.NameIdentifier) ?? "";   // REQUIRED
    var email = ctx.User.FindFirstValue(ClaimTypes.Email) ?? "";            // REQUIRED
    var name  = ctx.User.Identity?.Name ?? "";

    // Where to land: the portal page they came from, only if it is on the portal.
    var back = (ctx.Request.Query["opsiq_portal_return"].ToString()).Split('#')[0];
    var target = (back == Portal || back.StartsWith(Portal + "/") || back.StartsWith(Portal + "?")) ? back : Portal;

    var key   = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
    var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
    var now   = DateTimeOffset.UtcNow;
    var payload = new JwtPayload
    {
        { "site_key",      "YOUR_SITE_KEY" },
        { "iat",           now.ToUnixTimeSeconds() },
        { "exp",           now.AddSeconds(120).ToUnixTimeSeconds() },
        { "authenticated", true },
        { "jti",           Guid.NewGuid().ToString("N") },
        { "single_use",    true },
        { "platform",      "dotnet" },
        { "customer", new Dictionary<string, object>
            { { "id", id }, { "email", email }, { "name", name }, { "external_id", id } } },
    };
    var token = new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(new JwtHeader(creds), payload));

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    var url = target + (target.Contains('?') ? "&" : "?")
        + "site_key=" + Uri.EscapeDataString("YOUR_SITE_KEY") + "&identity_token=" + Uri.EscapeDataString(token);
    ctx.Response.Headers["Referrer-Policy"] = "no-referrer";
    ctx.Response.Headers["Cache-Control"] = "no-store";
    return Results.Redirect(url);
}).RequireAuthorization();

Ruby on Rails

1

Add gem "jwt" to the Gemfile and run bundle install.

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment (or Rails credentials) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Save as app/controllers/support_controller.rb and add get "/support-portal", to: "support#portal" to routes.rb. Devise's authenticate_user! sends guests to login and back.

Ruby on Rails
# Gemfile: gem "jwt"   —   routes.rb: get "/support-portal", to: "support#portal"
require "jwt"
require "securerandom"
require "cgi"

class SupportController < ApplicationController
  before_action :authenticate_user!                      # login, then back here

  PORTAL = "https://YOUR-OPSIQ/portal/your-workspace"

  def portal
    secret = ENV["OPSIQ_SITE_SECRET"].presence || "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    return head :service_unavailable if secret.blank?    # fail closed

    # Where to land: the portal page they came from, only if it is on the portal.
    back = params[:opsiq_portal_return].to_s.split("#").first.to_s
    target = (back == PORTAL || back.start_with?(PORTAL + "/", PORTAL + "?")) ? back : PORTAL

    now = Time.now.to_i
    token = JWT.encode({
      site_key:      "YOUR_SITE_KEY",
      iat:           now,
      exp:           now + 120,
      authenticated: true,
      jti:           SecureRandom.hex(16),
      single_use:    true,
      platform:      "rails",
      customer: {
        id:          current_user.id,                    # REQUIRED
        email:       current_user.email,                 # REQUIRED
        name:        current_user.try(:name).to_s,
        external_id: current_user.id.to_s
      }
    }, secret, "HS256")

    # Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    url = target + (target.include?("?") ? "&" : "?") +
          "site_key=#{CGI.escape("YOUR_SITE_KEY")}&identity_token=#{CGI.escape(token)}"
    response.headers["Referrer-Policy"] = "no-referrer"
    response.headers["Cache-Control"] = "no-store"
    redirect_to url, allow_other_host: true
  end
end

Java (Spring Boot)

1

Add io.jsonwebtoken:jjwt-api, jjwt-impl and jjwt-jackson (0.12+).

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set opsiq.site.secret in application.properties (for example from OPSIQ_SITE_SECRET) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Replace currentUser() with your user lookup. With Spring Security the route must be authenticated so guests go to login and back.

Java (Spring Boot)
// io.jsonwebtoken:jjwt-api / jjwt-impl / jjwt-jackson (0.12+)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.time.Instant;
import java.util.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.view.RedirectView;

@Controller
public class SupportPortalController {
    private static final String PORTAL = "https://YOUR-OPSIQ/portal/your-workspace";

    @Value("${opsiq.site.secret:opsiq_whsec_YOUR_SITE_SECRET}")   // this site's secret; opsiq.site.secret wins when set
    private String secret;

    /** WHO IS SIGNED IN — replace with your own lookup: id, email, name. */
    private Map<String, Object> currentUser(Principal principal) {
        return Map.of("id", principal.getName(), "email", principal.getName(), "name", principal.getName());
    }

    @GetMapping("/support-portal")
    public RedirectView supportPortal(Principal principal, HttpServletResponse response,
                                      @RequestParam(name = "opsiq_portal_return", defaultValue = "") String back) {
        if (principal == null) return new RedirectView("/login");               // login, then back here
        if (secret.isEmpty()) throw new ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE);   // fail closed

        // Where to land: the portal page they came from, only if it is on the portal.
        back = back.split("#", 2)[0];
        String target = (back.equals(PORTAL) || back.startsWith(PORTAL + "/") || back.startsWith(PORTAL + "?")) ? back : PORTAL;

        Map<String, Object> user = currentUser(principal);
        Map<String, Object> customer = Map.of(
            "id",          user.get("id"),                 // REQUIRED
            "email",       user.get("email"),              // REQUIRED
            "name",        user.get("name"),
            "external_id", String.valueOf(user.get("id")));

        Instant now = Instant.now();
        String token = Jwts.builder()
            .claim("site_key", "YOUR_SITE_KEY")
            .claim("authenticated", true)
            .claim("single_use", true)                     // one-time link
            .claim("platform", "java")
            .claim("customer", customer)
            .id(UUID.randomUUID().toString())              // jti
            .issuedAt(Date.from(now))
            .expiration(Date.from(now.plusSeconds(120)))
            .signWith(Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)), Jwts.SIG.HS256)
            .compact();

        // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
        String url = target + (target.contains("?") ? "&" : "?")
            + "site_key=" + URLEncoder.encode("YOUR_SITE_KEY", StandardCharsets.UTF_8)
            + "&identity_token=" + URLEncoder.encode(token, StandardCharsets.UTF_8);
        response.setHeader("Referrer-Policy", "no-referrer");
        response.setHeader("Cache-Control", "no-store");
        return new RedirectView(url);
    }
}

Go

1

Run: go get github.com/golang-jwt/jwt/v5

2

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

3

Replace currentUser() with your session lookup and register http.HandleFunc("/support-portal", supportPortal).

Go
// go get github.com/golang-jwt/jwt/v5
package main

import (
    "crypto/rand"
    "encoding/hex"
    "fmt"
    "net/http"
    "net/url"
    "os"
    "strings"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

const portal = "https://YOUR-OPSIQ/portal/your-workspace"

type User struct{ ID, Email, Name string }

// WHO IS SIGNED IN — replace with your session lookup. Return nil for a guest.
func currentUser(r *http.Request) *User { return nil }

func supportPortal(w http.ResponseWriter, r *http.Request) {
    user := currentUser(r)
    if user == nil { // login, then back here
        http.Redirect(w, r, "/login?next="+url.QueryEscape(r.URL.RequestURI()), http.StatusFound)
        return
    }
    secret := os.Getenv("OPSIQ_SITE_SECRET")
    if secret == "" {
        secret = "opsiq_whsec_YOUR_SITE_SECRET" // this site's secret; the environment wins when set
    }
    if secret == "" { // fail closed
        http.Error(w, "Support portal is not configured.", http.StatusServiceUnavailable)
        return
    }

    // Where to land: the portal page they came from, only if it is on the portal.
    back := strings.SplitN(r.URL.Query().Get("opsiq_portal_return"), "#", 2)[0]
    target := portal
    if back == portal || strings.HasPrefix(back, portal+"/") || strings.HasPrefix(back, portal+"?") {
        target = back
    }

    jti := make([]byte, 16)
    rand.Read(jti)
    now := time.Now().Unix()
    token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "site_key":      "YOUR_SITE_KEY",
        "iat":           now,
        "exp":           now + 120,
        "authenticated": true,
        "jti":           hex.EncodeToString(jti),
        "single_use":    true,
        "platform":      "go",
        "customer": map[string]any{
            "id":          user.ID,    // REQUIRED
            "email":       user.Email, // REQUIRED
            "name":        user.Name,
            "external_id": fmt.Sprint(user.ID),
        },
    }).SignedString([]byte(secret))
    if err != nil {
        http.Error(w, "sign failed", http.StatusInternalServerError)
        return
    }

    // Default target: https://YOUR-OPSIQ/portal/your-workspace?site_key=YOUR_SITE_KEY&identity_token=…
    sep := "?"
    if strings.Contains(target, "?") {
        sep = "&"
    }
    w.Header().Set("Referrer-Policy", "no-referrer")
    w.Header().Set("Cache-Control", "no-store")
    http.Redirect(w, r, target+sep+"site_key="+url.QueryEscape("YOUR_SITE_KEY")+"&identity_token="+url.QueryEscape(token), http.StatusFound)
}

Quand quelque chose ne va pas

Le portail s'ouvre, mais est signé

La clé de l'espace de travail ou secret ne correspond pas à cet espace de travail, le jeton est plus ancien que 120 secondes (vérifiez l'horloge du serveur), ou le même lien a été ouvert deux fois. Générer un lien de test signé : si cela fonctionne, comparez les revendications de votre jeton avec l'exemple.

Il atterrit toujours sur le portail maison

L'adresse de retour n'était pas à l'intérieur de votre adresse portail, donc elle a été ignorée dans le but. Comparez-le avec le Portal URL affiché dans Paramètres.

Les clients obtiennent une erreur au lieu de votre connexion

Remplacez /login dans la route par votre page de connexion réelle, et assurez-vous que votre login retourne à l'adresse qu'il a été donné.

Il ne fonctionne que pour certains clients

client. email ou client. id est vide pour eux. Tous les deux sont requis.

Développeur

Chat client: reconnaître les clients connectés

En option. La plupart des sites n'en ont pas besoin : avec l'extrait de chat simple et un connecteur, le chat vérifie les clients eux-mêmes, avec un numéro de réservation ou de commande plus une preuve pour les recherches et un code envoyé par e-mail avant une commande. Ajoutez ceci lorsque vous voulez qu'un client qui est déjà connecté sur votre site soit automatiquement reconnu, avec leur compte entier. WHMCS le fait déjà par son crochet.

Comment ça fonctionne

1
Votre page imprime la balise chat

Pour un client connecté le widget URL porte &identity_token=... signé sur votre serveur ; pour un invité, c'est la balise simple. Rien de secret n'est dans la page : seulement un jeton qui expire.

2
Le chat vérifie le jeton

Signature, clé espace de travail et expiration. Le client est alors connu sur chaque demande de chat, et votre connecteur peut répondre à leurs propres commandes, réservations ou factures.

3
Le chat se rafraîchit avant l'heure est levée

Ça appelle la page qu'il est sur avec ?opsiq_identity_refresh=1&role=client. Votre code répond {"succès":true",identity_token":"..."} pendant que le client est connecté, ou 401 avec {"succès":faux,login_required":true} quand ils ne le sont pas. C'est pourquoi le gestionnaire de rafraîchissement doit courir avant que votre page imprime quoi que ce soit.

Comment il diffère du jeton portail

Durée de vie

Une heure (exp = iat + 3600) au lieu de 120 secondes, parce qu'il chevauche chaque demande de chat au lieu d'une redirection.

Pas de jti ou single_use

Le même jeton est utilisé pour chaque message jusqu'à ce que le rafraîchissement le remplace.

Comme tout le reste.

site_key, iat, exp, authentifié: vrai, plate-forme, et client avec un id et email requis. Même secret, même signature.

💡
L'identité dit QUI le client est. Leurs commandes, réservations ou factures atteignent le chat par un connecteur: celui qui appelle votre plateforme API, ou, lorsque votre plateforme n'a pas API, un connecteur plus son fichier de pont (le constructeur de connecteur en fait un).
💡
Le secret de signature est rempli pour vous. Dans les Sites distants, votre site, Codes, C, chaque exemple contient déjà le secret de ce site, donc le code fonctionne comme collé : il n'y a rien à copier ou configurer. opsiq_whsec_YOUR_SITE_SECRET à sa place. Chaque exemple cherche OPSIQ_SITE_SECRET (ou le réglage propre de votre cadre, nommé dans ses notes) sur le serveur d'abord et utilise que quand il est défini, vous pouvez déplacer le secret hors du fichier chaque fois que vous voulez, par exemple pour le faire tourner sans code d'édition. Soit la manière dont le fichier fonctionne sur votre serveur seulement: ne jamais le coller dans une page Web ou un navigateur JavaScript, et ne jamais l'engager dans un dépôt public, parce que quiconque détient le secret peut se connecter comme l'un de vos clients ou du personnel. WHMCS et Botble n'ont besoin de rien de tout cela: WHMCS hameçon arrive avec le secret rempli, et le Botble panneau de connexion le remplit dans le pont.

Code complet, plate-forme par plateforme

WHMCS

Nothing to add: the WHMCS hook in Option 1 already signs your signed-in clients into the chat, refreshes the token on long visits, and signs staff into Admin Chat. No connector is needed for this.
1

Install the Option 1 hook as includes/hooks/opsiq_tracker.php. Do not also paste the plain chat tag.

2

Optional: add the WHMCS connector under Connectors if you also want the chat to answer about invoices, services and tickets. Identity works without it.

includes/hooks/opsiq_tracker.php
/* WHMCS: no extra code. Option 1 (the All-in-One WHMCS Hook) signs the signed-in
 * client into Client Chat, answers ?opsiq_identity_refresh=1 and signs staff into
 * Admin Chat. No connector is needed for identity. */

Botble (connector bridge)

Nothing to add for bookings: the Botble connector takes bookings as a guest checkout and finds existing bookings by booking number and proof, so guests do not need to sign in. Admins are signed in through the bridge (op=admin_embed).
1

Install the Botble connector under Connectors, copy its bridge file from the connector panel and upload it to public/. The panel fills in OPSIQ_HOST, OPSIQ_SITE_KEY and OPSIQ_SITE_SECRET for you.

2

Botble has no API, so the bridge file is how the chat reads rooms and takes bookings. To also recognise a guest who is already signed in on the hotel site, use the Laravel option with your customer guard.

public/opsiq-botble-bridge.php
/* Botble: no extra code for bookings.
 * The connector books as a guest checkout and finds bookings by booking number + proof.
 * In public/opsiq-botble-bridge.php fill OPSIQ_HOST, OPSIQ_SITE_KEY and OPSIQ_SITE_SECRET.
 * Admins: op=admin_embed */

PHP (no dependencies)

1

Save as opsiq-chat.php. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

At the very top of every page (or your front controller), before any output: require 'opsiq-chat.php'; opsiq_chat_refresh();

3

Just before </body> on every page: <?= opsiq_chat_tag() ?> — it replaces the plain chat tag. Replace opsiq_chat_user() with your signed-in customer.

opsiq-chat.php
<?php
/* opsiq-chat.php — signed-in customers for OpsIQ Client Chat. */

// WHO IS SIGNED IN — replace the body with your app's session. Return null for a guest.
function opsiq_chat_user(): ?array
{
    $u = $_SESSION['user'] ?? null;               // e.g. ['id' => 7, 'email' => '…', 'name' => '…']
    return is_array($u) && !empty($u['id']) && !empty($u['email']) ? $u : null;
}

function opsiq_chat_token(array $u): string
{
    $secret = (string) (getenv('OPSIQ_SITE_SECRET') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; the environment wins when set
    if ($secret === '') return '';                           // fail closed: plain chat, no identity
    $b64 = static fn($v) => rtrim(strtr(base64_encode(json_encode($v, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
    $now = time();
    $signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,                      // the widget refreshes before this
        'authenticated' => true,
        'platform'      => 'php',
        'customer'      => [
            'id'          => $u['id'],                       // REQUIRED
            'email'       => $u['email'],                    // REQUIRED
            'name'        => $u['name'] ?? '',
            'external_id' => (string) $u['id'],
        ],
    ]);
    return $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, $secret, true)), '+/', '-_'), '=');
}

// Call at the top of every page, before any output.
function opsiq_chat_refresh(): void
{
    if (empty($_GET['opsiq_identity_refresh'])) return;
    header('Content-Type: application/json; charset=utf-8');
    header('Cache-Control: no-store');
    $u = opsiq_chat_user();
    $t = $u ? opsiq_chat_token($u) : '';
    if ($t === '') { http_response_code(401); echo json_encode(['success' => false, 'login_required' => true]); exit; }
    echo json_encode(['success' => true, 'role' => 'customer', 'identity_token' => $t]);
    exit;
}

// Print before </body> on every page, instead of the plain chat tag.
function opsiq_chat_tag(): string
{
    $src = 'https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY';
    $u = opsiq_chat_user();
    $t = $u ? opsiq_chat_token($u) : '';
    if ($t !== '') $src .= '&identity_token=' . rawurlencode($t);
    return '<script async src="' . htmlspecialchars($src, ENT_QUOTES) . '" data-opsiq-widget="client-chat"></script>';
}

Laravel

1

Run: composer require firebase/php-jwt. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET=… in .env with 'opsiq' => ['site_secret' => env('OPSIQ_SITE_SECRET')] in config/services.php on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Save the class as app/Support/OpsiqChat.php, and add the small OpsiqChatRefresh middleware from the bottom of the code to the web group, so the widget can refresh its token on any page.

3

In your main Blade layout, just before </body>: {!! \App\Support\OpsiqChat::tag() !!}

app/Support/OpsiqChat.php
<?php
// app/Support/OpsiqChat.php — composer require firebase/php-jwt
namespace App\Support;

use Firebase\JWT\JWT;

final class OpsiqChat
{
    public static function token(): string
    {
        $user = auth()->user();
        $secret = (string) (config('services.opsiq.site_secret') ?: 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; config wins when set
        if (!$user || $secret === '') return '';                 // guest, or not configured
        $now = time();
        return JWT::encode([
            'site_key'      => 'YOUR_SITE_KEY',
            'iat'           => $now,
            'exp'           => $now + 3600,
            'authenticated' => true,
            'platform'      => 'laravel',
            'customer'      => [
                'id'          => $user->id,                      // REQUIRED
                'email'       => $user->email,                   // REQUIRED
                'name'        => $user->name,
                'external_id' => (string) $user->id,
            ],
        ], $secret, 'HS256');
    }

    /** For Blade: {!! \App\Support\OpsiqChat::tag() !!} before </body>. */
    public static function tag(): string
    {
        $src = 'https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY';
        $t = self::token();
        if ($t !== '') $src .= '&identity_token=' . rawurlencode($t);
        return '<script async src="' . e($src) . '" data-opsiq-widget="client-chat"></script>';
    }
}

/* Refresh: the widget asks ?opsiq_identity_refresh=1 on the page it is on.
 * Laravel 11+ — bootstrap/app.php:
 *
 *   ->withMiddleware(function ($middleware) {
 *       $middleware->web(append: \App\Http\Middleware\OpsiqChatRefresh::class);
 *   })
 *
 * app/Http/Middleware/OpsiqChatRefresh.php:
 *
 *   public function handle($request, \Closure $next) {
 *       if (!$request->query('opsiq_identity_refresh')) return $next($request);
 *       $t = \App\Support\OpsiqChat::token();
 *       return $t === ''
 *           ? response()->json(['success' => false, 'login_required' => true], 401)->header('Cache-Control', 'no-store')
 *           : response()->json(['success' => true, 'role' => 'customer', 'identity_token' => $t])->header('Cache-Control', 'no-store');
 *   }
 */

WordPress / WooCommerce

1

This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, add define('OPSIQ_SITE_SECRET', '…'); to wp-config.php instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Paste into your theme's functions.php or a small plugin. It prints the chat itself, so remove the plain chat tag if you added one.

3

For WooCommerce orders in the chat, add the WooCommerce connector under Connectors.

functions.php
/* functions.php or a small plugin — OpsIQ Client Chat with signed-in customers. */

if (!defined('OPSIQ_SITE_SECRET')) define('OPSIQ_SITE_SECRET', 'opsiq_whsec_YOUR_SITE_SECRET');   // this site's secret; wp-config.php wins when set

function opsiq_chat_token(): string {
    if (!is_user_logged_in() || !defined('OPSIQ_SITE_SECRET') || OPSIQ_SITE_SECRET === '') return '';
    $u   = wp_get_current_user();
    $b64 = static fn($v) => rtrim(strtr(base64_encode(wp_json_encode($v)), '+/', '-_'), '=');
    $now = time();
    $signing = $b64(['alg' => 'HS256', 'typ' => 'JWT']) . '.' . $b64([
        'site_key'      => 'YOUR_SITE_KEY',
        'iat'           => $now,
        'exp'           => $now + 3600,
        'authenticated' => true,
        'platform'      => 'wordpress',
        'customer'      => [
            'id'          => $u->ID,                     // REQUIRED
            'email'       => $u->user_email,             // REQUIRED
            'name'        => $u->display_name,
            'external_id' => (string) $u->ID,
        ],
    ]);
    return $signing . '.' . rtrim(strtr(base64_encode(hash_hmac('sha256', $signing, OPSIQ_SITE_SECRET, true)), '+/', '-_'), '=');
}

// Refresh: the widget asks ?opsiq_identity_refresh=1 on the page it is on.
add_action('init', function () {
    if (empty($_GET['opsiq_identity_refresh'])) return;
    nocache_headers();
    $t = opsiq_chat_token();
    if ($t === '') wp_send_json(['success' => false, 'login_required' => true], 401);
    wp_send_json(['success' => true, 'role' => 'customer', 'identity_token' => $t]);
});

// The chat tag, on every front-end page.
add_action('wp_footer', function () {
    $src = 'https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY';
    $t = opsiq_chat_token();
    if ($t !== '') $src .= '&identity_token=' . rawurlencode($t);
    echo '<script async src="' . esc_url($src) . '" data-opsiq-widget="client-chat"></script>';
});

Node.js / Express

1

Run: npm i jsonwebtoken. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

app.use(opsiqChat) after your session / passport middleware. It answers the refresh and sets res.locals.opsiqChatTag.

3

Print res.locals.opsiqChatTag (unescaped) just before </body> in your layout, instead of the plain chat tag.

opsiq-chat.js
// opsiq-chat.js — npm i jsonwebtoken
const jwt = require("jsonwebtoken");

function opsiqChatToken(user) {
  const secret = process.env.OPSIQ_SITE_SECRET || "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; the environment wins when set
  if (!user || !secret) return "";
  return jwt.sign({
    site_key: "YOUR_SITE_KEY",
    authenticated: true,
    platform: "node",
    customer: { id: user.id, email: user.email, name: user.name, external_id: String(user.id) },  // id + email REQUIRED
  }, secret, { algorithm: "HS256", expiresIn: 3600 });     // sets iat + exp
}

// app.use(opsiqChat) — after your session / passport middleware.
function opsiqChat(req, res, next) {
  const token = opsiqChatToken(req.user);
  if (req.query.opsiq_identity_refresh) {                  // the widget refreshing on this page
    res.set("Cache-Control", "no-store");
    return token
      ? res.json({ success: true, role: "customer", identity_token: token })
      : res.status(401).json({ success: false, login_required: true });
  }
  const src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (token ? "&identity_token=" + encodeURIComponent(token) : "");
  res.locals.opsiqChatTag = '<script async src="' + src.replace(/"/g, """) + '" data-opsiq-widget="client-chat"></script>';
  next();
}

module.exports = { opsiqChat };

Python (Flask)

1

Run: pip install pyjwt flask-login. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Call init_opsiq_chat(app) where you create the app. It answers the refresh and gives templates opsiq_chat_tag.

3

In your base template, just before </body>: {{ opsiq_chat_tag }}

opsiq_chat.py
# opsiq_chat.py — pip install pyjwt flask-login
import os, time, urllib.parse
import jwt
from flask import request, jsonify
from flask_login import current_user
from markupsafe import Markup, escape

def opsiq_chat_token():
    secret = os.environ.get("OPSIQ_SITE_SECRET") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    if not secret or not current_user.is_authenticated:
        return ""
    now = int(time.time())
    return jwt.encode({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "python",
        "customer": {"id": current_user.id, "email": current_user.email,       # REQUIRED
                     "name": getattr(current_user, "name", ""), "external_id": str(current_user.id)},
    }, secret, algorithm="HS256")

def init_opsiq_chat(app):
    @app.before_request
    def _opsiq_refresh():
        if request.args.get("opsiq_identity_refresh"):
            t = opsiq_chat_token()
            resp = jsonify({"success": True, "role": "customer", "identity_token": t}) if t \
                else (jsonify({"success": False, "login_required": True}), 401)
            if isinstance(resp, tuple):
                resp[0].headers["Cache-Control"] = "no-store"
            else:
                resp.headers["Cache-Control"] = "no-store"
            return resp

    @app.context_processor
    def _opsiq_tag():
        t = opsiq_chat_token()
        src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + ("&identity_token=" + urllib.parse.quote(t, safe="") if t else "")
        return {"opsiq_chat_tag": Markup('<script async src="%s" data-opsiq-widget="client-chat"></script>' % escape(src))}

Django

1

Run: pip install pyjwt. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in settings.py (for example os.environ["OPSIQ_SITE_SECRET"]) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Add "yourapp.opsiq_chat.OpsiqChatMiddleware" to MIDDLEWARE (after AuthenticationMiddleware) and "yourapp.opsiq_chat.opsiq_chat" to TEMPLATES context_processors.

3

In your base template, just before </body>: {{ opsiq_chat_tag }}

opsiq_chat.py
# yourapp/opsiq_chat.py — pip install pyjwt
import time, urllib.parse
import jwt
from django.conf import settings
from django.http import JsonResponse
from django.utils.html import format_html

def opsiq_chat_token(user):
    secret = getattr(settings, "OPSIQ_SITE_SECRET", "") or "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; settings win when set
    if not secret or not user.is_authenticated:
        return ""
    now = int(time.time())
    return jwt.encode({
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": True, "platform": "django",
        "customer": {"id": user.pk, "email": user.email,             # REQUIRED
                     "name": user.get_full_name(), "external_id": str(user.pk)},
    }, secret, algorithm="HS256")

class OpsiqChatMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        if request.GET.get("opsiq_identity_refresh"):
            t = opsiq_chat_token(request.user)
            resp = (JsonResponse({"success": True, "role": "customer", "identity_token": t}) if t
                    else JsonResponse({"success": False, "login_required": True}, status=401))
            resp["Cache-Control"] = "no-store"
            return resp
        return self.get_response(request)

def opsiq_chat(request):
    t = opsiq_chat_token(request.user)
    src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + ("&identity_token=" + urllib.parse.quote(t, safe="") if t else "")
    return {"opsiq_chat_tag": format_html('<script async src="{}" data-opsiq-widget="client-chat"></script>', src)}

.NET / C#

1

Run: dotnet add package System.IdentityModel.Tokens.Jwt. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OpsIQ:SiteSecret (user-secrets, the OpsIQ__SiteSecret environment variable or Key Vault) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

In Program.cs, after app.UseAuthentication(): app.Use(OpsiqChat.Refresh);

3

In _Layout.cshtml before </body>: @Html.Raw(OpsiqChat.Tag(Context))

OpsiqChat.cs
// OpsiqChat.cs — dotnet add package System.IdentityModel.Tokens.Jwt
using System.IdentityModel.Tokens.Jwt;
using System.Net;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;

public static class OpsiqChat
{
    public static string Token(HttpContext ctx)
    {
        var secret = ctx.RequestServices.GetRequiredService<IConfiguration>()["OpsIQ:SiteSecret"];
        if (string.IsNullOrEmpty(secret)) secret = "opsiq_whsec_YOUR_SITE_SECRET";   // this site's secret; configuration wins when set
        if (string.IsNullOrEmpty(secret) || ctx.User.Identity?.IsAuthenticated != true) return "";
        var id = ctx.User.FindFirstValue(ClaimTypes.NameIdentifier) ?? "";      // REQUIRED
        var email = ctx.User.FindFirstValue(ClaimTypes.Email) ?? "";            // REQUIRED
        var creds = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret)), SecurityAlgorithms.HmacSha256);
        var now = DateTimeOffset.UtcNow;
        var payload = new JwtPayload {
            { "site_key", "YOUR_SITE_KEY" }, { "iat", now.ToUnixTimeSeconds() }, { "exp", now.AddSeconds(3600).ToUnixTimeSeconds() },
            { "authenticated", true }, { "platform", "dotnet" },
            { "customer", new Dictionary<string, object> { { "id", id }, { "email", email }, { "name", ctx.User.Identity?.Name ?? "" }, { "external_id", id } } },
        };
        return new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken(new JwtHeader(creds), payload));
    }

    // app.Use(OpsiqChat.Refresh) — the widget refreshing on the page it is on.
    public static async Task Refresh(HttpContext ctx, Func<Task> next)
    {
        if (string.IsNullOrEmpty(ctx.Request.Query["opsiq_identity_refresh"])) { await next(); return; }
        ctx.Response.Headers["Cache-Control"] = "no-store";
        var t = Token(ctx);
        if (t == "") { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsJsonAsync(new { success = false, login_required = true }); return; }
        await ctx.Response.WriteAsJsonAsync(new { success = true, role = "customer", identity_token = t });
    }

    public static string Tag(HttpContext ctx)
    {
        var t = Token(ctx);
        var src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (t != "" ? "&identity_token=" + Uri.EscapeDataString(t) : "");
        return "<script async src=\"" + WebUtility.HtmlEncode(src) + "\" data-opsiq-widget=\"client-chat\"></script>";
    }
}

Ruby on Rails

1

Add gem "jwt" and run bundle install. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

include OpsiqChat in ApplicationController.

3

In app/views/layouts/application.html.erb before </body>: <%= opsiq_chat_tag %>

app/controllers/concerns/opsiq_chat.rb
# app/controllers/concerns/opsiq_chat.rb — Gemfile: gem "jwt"
require "jwt"
require "cgi"

module OpsiqChat
  extend ActiveSupport::Concern

  included do
    before_action :opsiq_identity_refresh
    helper_method :opsiq_chat_tag
  end

  private

  def opsiq_chat_token
    secret = ENV["OPSIQ_SITE_SECRET"].presence || "opsiq_whsec_YOUR_SITE_SECRET"   # this site's secret; the environment wins when set
    return "" if secret.blank? || !respond_to?(:current_user, true) || current_user.nil?
    now = Time.now.to_i
    JWT.encode({
      site_key: "YOUR_SITE_KEY", iat: now, exp: now + 3600,
      authenticated: true, platform: "rails",
      customer: { id: current_user.id, email: current_user.email,          # REQUIRED
                  name: current_user.try(:name).to_s, external_id: current_user.id.to_s }
    }, secret, "HS256")
  end

  def opsiq_identity_refresh
    return unless params[:opsiq_identity_refresh].present?
    response.headers["Cache-Control"] = "no-store"
    t = opsiq_chat_token
    return render(json: { success: false, login_required: true }, status: :unauthorized) if t.blank?
    render json: { success: true, role: "customer", identity_token: t }
  end

  def opsiq_chat_tag
    t = opsiq_chat_token
    src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (t.present? ? "&identity_token=#{CGI.escape(t)}" : "")
    helpers.tag.script(nil, async: true, src: src, data: { opsiq_widget: "client-chat" })
  end
end

Java (Spring Boot)

1

Add io.jsonwebtoken:jjwt-api, jjwt-impl and jjwt-jackson (0.12+). This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set opsiq.site.secret (for example from OPSIQ_SITE_SECRET) on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace currentUser() with your user lookup. The filter answers the refresh on every page; @ControllerAdvice exposes opsiqChatTag to views.

3

Thymeleaf layout before </body>: <th:block th:utext="${opsiqChatTag}"/>

OpsiqChat.java
// OpsiqChat.java — io.jsonwebtoken:jjwt-api / jjwt-impl / jjwt-jackson (0.12+)
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.*;
import jakarta.servlet.http.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.security.Principal;
import java.time.Instant;
import java.util.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.util.HtmlUtils;

@Component
@ControllerAdvice
public class OpsiqChat implements Filter {
    @Value("${opsiq.site.secret:opsiq_whsec_YOUR_SITE_SECRET}")   // this site's secret; opsiq.site.secret wins when set
    private String secret;

    /** WHO IS SIGNED IN — replace with your lookup: id, email, name. Null for a guest. */
    private Map<String, Object> currentUser(Principal p) {
        return p == null ? null : Map.of("id", p.getName(), "email", p.getName(), "name", p.getName());
    }

    String token(HttpServletRequest req) {
        Map<String, Object> u = currentUser(req.getUserPrincipal());
        if (u == null || secret.isEmpty()) return "";
        Instant now = Instant.now();
        return Jwts.builder()
            .claim("site_key", "YOUR_SITE_KEY").claim("authenticated", true).claim("platform", "java")
            .claim("customer", Map.of("id", u.get("id"), "email", u.get("email"), "name", u.get("name"),
                                      "external_id", String.valueOf(u.get("id"))))          // id + email REQUIRED
            .issuedAt(Date.from(now)).expiration(Date.from(now.plusSeconds(3600)))
            .signWith(Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)), Jwts.SIG.HS256)
            .compact();
    }

    @Override // the widget refreshing on the page it is on
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        if (req.getParameter("opsiq_identity_refresh") == null) { chain.doFilter(request, response); return; }
        HttpServletResponse res = (HttpServletResponse) response;
        res.setHeader("Cache-Control", "no-store");
        res.setContentType("application/json");
        String t = token(req);
        if (t.isEmpty()) { res.setStatus(401); res.getWriter().write("{\"success\":false,\"login_required\":true}"); return; }
        res.getWriter().write("{\"success\":true,\"role\":\"customer\",\"identity_token\":\"" + t + "\"}");
    }

    @ModelAttribute("opsiqChatTag")
    public String tag(HttpServletRequest req) {
        String t = token(req);
        String src = "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY" + (t.isEmpty() ? "" : "&identity_token=" + URLEncoder.encode(t, StandardCharsets.UTF_8));
        return "<script async src=\"" + HtmlUtils.htmlEscape(src) + "\" data-opsiq-widget=\"client-chat\"></script>";
    }
}

Go

1

Run: go get github.com/golang-jwt/jwt/v5. This site's signing secret is already filled in, so the code works as pasted. To keep it out of the file, set OPSIQ_SITE_SECRET in the environment on the server instead: that value is used first. Keep this file on the server and never commit it to a public repository.

2

Replace currentUser() with your session lookup, and wrap your router: http.ListenAndServe(addr, OpsiqChatRefresh(mux)).

3

Pass OpsiqChatTag(r) to your layout template and print it before </body>.

opsiq_chat.go
// opsiq_chat.go — go get github.com/golang-jwt/jwt/v5
package main

import (
    "encoding/json"
    "fmt"
    "html"
    "html/template"
    "net/http"
    "net/url"
    "os"
    "time"

    "github.com/golang-jwt/jwt/v5"
)

type OpsiqUser struct{ ID, Email, Name string }

// WHO IS SIGNED IN — replace with your session lookup. Return nil for a guest.
func currentUser(r *http.Request) *OpsiqUser { return nil }

func opsiqChatToken(r *http.Request) string {
    u, secret := currentUser(r), os.Getenv("OPSIQ_SITE_SECRET")
    if secret == "" {
        secret = "opsiq_whsec_YOUR_SITE_SECRET" // this site's secret; the environment wins when set
    }
    if u == nil || secret == "" {
        return ""
    }
    now := time.Now().Unix()
    t, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
        "site_key": "YOUR_SITE_KEY", "iat": now, "exp": now + 3600,
        "authenticated": true, "platform": "go",
        "customer": map[string]any{"id": u.ID, "email": u.Email, "name": u.Name, "external_id": fmt.Sprint(u.ID)}, // id + email REQUIRED
    }).SignedString([]byte(secret))
    if err != nil {
        return ""
    }
    return t
}

// OpsiqChatRefresh answers the widget's ?opsiq_identity_refresh=1 on any page.
func OpsiqChatRefresh(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Query().Get("opsiq_identity_refresh") == "" {
            next.ServeHTTP(w, r)
            return
        }
        w.Header().Set("Cache-Control", "no-store")
        w.Header().Set("Content-Type", "application/json")
        if t := opsiqChatToken(r); t != "" {
            json.NewEncoder(w).Encode(map[string]any{"success": true, "role": "customer", "identity_token": t})
            return
        }
        w.WriteHeader(http.StatusUnauthorized)
        json.NewEncoder(w).Encode(map[string]any{"success": false, "login_required": true})
    })
}

// OpsiqChatTag is printed before </body> in your layout.
func OpsiqChatTag(r *http.Request) template.HTML {
    src := "https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY"
    if t := opsiqChatToken(r); t != "" {
        src += "&identity_token=" + url.QueryEscape(t)
    }
    return template.HTML(`<script async src="` + html.EscapeString(src) + `" data-opsiq-widget="client-chat"></script>`)
}

Quand quelque chose ne va pas

Le chat traite un client connecté comme un invité

La balise a été imprimée sans identity_token (le secret est manquant sur le serveur, donc le code échoue fermé), ou la clé de l'espace de travail du jeton ou le secret ne correspond pas.

Reconnu au début, puis un invité après environ une heure

Le gestionnaire de rafraîchissement n'est pas atteint : il doit s'exécuter avant toute sortie, sur chaque page où le chat apparaît.

Le chat simple montre deux fois

Enlevez la balise de chat simple de votre modèle : ce code imprime le chat lui-même.

Développeur

Plugins et SDK

OpsIQ provides SDK Paquets et plugins pour les plateformes courantes.

Comment ça fonctionne
Plugins et SDKQuatre paquets: PHP SDK, Node.js SDK, WordPress plugin et WHMCS Module, chacun avec sa commande install.PHPPHP SDKLe compositeur requiert opsiq/sdkJSNode. js SDK- Non, pas de problème.opsiq/sdkGroupe de travail des politiquesWordPress pluginInstallation & connexion en un clicQUANDModule WHMCSAddon pour la facturation + relais de billets
Plugins & SDK
PHP SDK

Paquet Composer: génération de jetons d'identité, assistants d'action API, vérification de signature webhook.

JavaScript SDK

Côté navigateur: suivi, identité, événements personnalisés, contrôle du chat.

WordPress plugin

Injection de widget, identité à partir des sessions utilisateur WP, WooCommerce sync.

Module WHMCS

Intégration complète: widget, relais de billets, identité, IA d'administration.

Shopify extension de thème

Intégration d'application avec identité client automatique.

Démarrage rapide de PHP SDK

Exemple de PHP SDK
composer require opsiq/sdk

use OpsIQ\SDK\Identity;
$token = Identity::createToken(
    siteKey: "site_abc123",
    secret:  "opsiq_whsec_your_secret",
    customer: ["id" => "cust_1001", "email" => "[email protected]", "name" => "Jane"]
);

// Call any catalog action over the action API
$ch = curl_init("https://your-opsiq.com/api/v1.php");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer opq_your_key",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => json_encode([
        "action" => "crm.contacts.list",
        "status" => "lead",
        "limit"  => 25,
    ]),
]);
$contacts = json_decode(curl_exec($ch), true);
Développeur

Enquête API, évènements et automatisation sans connecteur

Survey Studio est conçu pour utiliser les mêmes types de données. API, exécuteur interne, bus d'événements et les opérations de webhook comme le reste de OpsIQ Cela permet aux développeurs d'intégrer de bout en bout sans créer un connecteur emballé.

⚠️
État de mise en œuvre: le catalogue live expose actuellement uniquement platform.get.survey.config et platform.save.survey.config. Les surveys.* et feedback.* Les familles ci-dessous sont le contrat cible approuvé et doivent retourner unknown_action jusqu'à ce que vous soyez enregistré.

Familles cibles d'action

Types, modèles et lancement rapide

surveys.types.*, surveys.templates.* et surveys.quick_launch.* Liste, prévisualiser, instantier et valider les starters complets.

Enquêtes et versions

surveys.create|get|list|update|archive|duplicate Plus de version immuable, validation et actions de publication.

Déploiements et ciblage

surveys.deployments.*, surveys.links.*, surveys.audiences.*, surveys.triggers.* et surveys.variables.*.

Sensibilisation et réponses

surveys.invitations.*, surveys.campaigns.*, surveys.recipients.*, surveys.responses.*, exportations, rédaction et analyses.

Webhooks, importation et exportation

surveys.webhooks.*, surveys.imports.*, feedback.items.*, feedback.analytics.*, feedback.sources.* et feedback.analysis.*.

Flux sans connecteur

1
Créer et publier via General API

Les écritures déclarent les comportements d'autorisation, de risque, de confirmation, d'idempotence et d'exécution à vide.

2
Réceptionnez votre événement d'affaires

Envoyez un événement signé à un webhook entrant, par exemple une annulation de commande ou une étape d'intégration terminée.

3
Mappage dans Actions & Triggers

Choisir unOpsIQGénéralitésAPIdes mesures telles que l'émission d'une invitation au sondage ou la préparation d'un projet de campagne, puis la cartographie des champs à partir de la charge utile de déclenchement vérifiée.

4
S'abonner aux événements de sondage

Fournissez le sous-ensemble documenté du cycle de vie d'une enquête sécurisée* à votre point de terminaison avec signature, filtrage, réessai, journalisation et lecture autorisée.

Cible d’événement canonique

Le catalogue partagé couvrira l’état de publication des enquêtes et des déploiements, les décisions d’audience et de déclenchement, les invitations, ainsi que les événements d’affichage, de démarrage, de réponse partielle, de reprise, d’achèvement et d’abandon

Un connecteur est optionnel et ajoute la découverte de plateforme réutilisable, l'identité vérifiée, les faits, les variables et l'énumération des destinataires. Général API plus Actions & Triggers/webhooks reste le chemin d'intégration complet pour les développeurs qui n'ont pas besoin d'un connecteur empaqueté.
Développeur

API REST

The OpsIQ REST API vous permet d'accéder par programmation à toutes les fonctionnalités de la plateforme.

Comment ça fonctionne
API RESTUn terminal affichant un POST au. OpsIQ API avec un Bearer Liste des tickets ouverts, et la page clé JSON réponse.$ curl -X POST https://your-domain.com/api/v1.php \-H "Authorization: Bearer opq_..."200 OK{ "data": [{ "id": 4192, "ticket_number": "T-4192","subject": "Card declined", "status": "open" },... more tickets ...], "page": 1, "per_page": 50, "has_more": true }
API REST

Format de la demande

Envoyer la clé comme Authorization: Bearer opq_... ou X-OpsIQ-Key: opq_.... Utilisez un en-tête d'authentification, pas les deux.

API format de demande
POST https://your-opsiq-domain.com/api/v1.php
Authorization: Bearer opq_your_api_key
# Alternative header: X-OpsIQ-Key: opq_your_api_key
Content-Type: application/json

{
  "action": "endpoint.name",
  "site_key": "site_abc123"
}

Actions communes

Le API est basé sur l'action: envoyer un action Chaque opération d'administrateur enregistrée JSON a une action nommée stable. POST {"action":"meta.actions"} (aucune clé requise) pour la liste faisant autorité, par installation, le contrat de demande, les métadonnées de risque et l'étendue. platform.routes.* Le pont reste uniquement pour les intégrations plus anciennes.

crm.contacts.list

Liste des contacts CRM (scope crm. read). Paramètres: q, statut, source, tag, score de lead, limite.

crm.contacts.upsert

Résoudre ou créer un contact (scope crm. write). Paramètres: email plus champs, tags, notes.

crm.deals.list

Liste des offres CRM (étendue crm. read). Paramètres: status, stage_id, company_id.

crm.activities.record

Enregistrer un cycle de vie/une activité commerciale pour un contact (scope crm. write) Paramètres: email ou contact_id, event, value, currency.

crm.conversions.record

Enregistrer une conversion (scope crm. write). Paramètres: contact_id ou email, type_conversion, valeur, devise.

crm.events.list

Interroge le flux d'événements CRM (scope crm. read). Paramètres: limit.

tickets.list

Liste des tickets (scope tickets. read). Paramètres: page, par_page, trier, ordre, statut, priorité, department_id, assigned_admin_id.

tickets.get

Un ticket et ses messages (scope tickets. read). Paramètres: id_ticket ou numéro_de_tiquet, include_messages, messages_limit.

tickets.reply

Poster une réponse à un ticket (scope tickets. write). Paramètres: numéro_de_ticket ou id_tiquet, corps, type_auteur, nom_acteur, interne.

tickets.update

Mettre à jour un ticket (scope tickets. write). Paramètres: numéro_de_ticket ou id_du_tiquet, statut, priorité, sujet, identifiant_departement, identifiants_administrateurs assignés.

tickets.open

Ouvre un ticket de support (scope tickets. write). Paramètres: customer_email, customer_name, sujet, corps, priorité.

tickets.bulk

Exécute une opération de file d'attente en bloc (scope tickets. write). Paramètres: operation, ids.

conversations.list

Liste des conversations de chat en direct (scope conversations. read). Paramètres: page, per_page, status, assigned_admin_id, client_email, search.

conversations.get

Une conversation et ses messages (scope conversations. read). Paramètres: conversation_id ou thread_key, include_messages.

conversations.messages

Historique des messages paginés (étendue conversations. read). Paramètres: conversation_id, page, per_page, include_internal.

conversations.send

Envoyer un message dans une conversation (scope conversations. write). Paramètres: conversation_id, message, sender_type, internal.

conversations.update

Attribuer, re-status ou re-titre une conversation (scope conversations. write). Paramètres: conversation_id, status, assigned_admin_id.

Connecteurs. liste /. get /, test

Découvrez quels connecteurs sont installés, ce que chacun peut faire et si ses informations d'identification fonctionnent (scope connectors. read).

automations.actions.list

Les actions que votre générateur d'actions exécutera (scope automations. read).

automations.triggers.list

Ce qui se déclenche et dans quelles conditions (scope automations. read).

automations.runs.list

Historique d'exécution pour le débogage d'une intégration (scope automations. read). Paramètres: status, action_key.

departments.list

Les départements vers lesquels vous pouvez acheminer un ticket (étendue departments. read).

notifications.list

Notifications pour un opérateur (scope notifications. read). Paramètres: admin_id (requis), unread_only.

analytics.export

Une section de rapport sous la forme CSV (étendue analytics. read). Paramètres: section, preset, from, to. Appelez analytics. sections. list pour obtenir des valeurs valides.

Site_intelligence. sites. list /. reports. liste

Sites surveillés et leurs rapports SEO (scope site_intelligence. read).

commerce. products. list / . get

Votre catalogue Store, paged (scope commerce. read). Filtres: actif, catégorie, recherche. .get retourne un produit avec ses variantes.

commerce. orders. list / . get

Commandes de magasin (scope commerce. read). Filtres: statut, paiement_méthode, canal, client_email. order_id ou sa référence ORD-, avec des éléments en ligne. La poignée de contrôle de passerelle en direct n'est jamais retournée.

commerce.refunds.list

Demandes de remboursement et leur état (scope commerce. read).

commerce.quotes.create

Prix d'un article pour un client (scope commerce. write). Source store ou une limace de connecteur. Crée rien: pas de commande, pas de paiement. Voir la section Commerce.

tickets.csat. list / . get / . metrics

Réponses de satisfaction du client en tant que données (lecture de tickets. scope). Filtre par la notation, ticket, agent ou période; .metrics retourne les mêmes chiffres que le tableau de bord.

conversations.ratings.list

Dialoguez les conversations que vos visiteurs ont notées, avec le commentaire, ce qui a motivé la note et l'agent crédité (conversations de champ. read).

knowledge.articles.list

Pagez à travers vos articles du Centre d'aide (scope kb. read).

knowledge.articles.get

Un article du Centre d'aide par id (scope kb. read). Params: article_id.

webhooks.events.list

Chaque événement auquel vous pouvez souscrire un point final webhook, avec sa charge utile. Disponible sur chaque plan, vous pouvez donc construire contre lui avant d'acheter.

files.get

Un lien de téléchargement signé et éphémère pour une pièce jointe (scope files. read). Paramètres: reference, ttl.

security.check

Demander si un IP Une adresse IP ou un e-mail est bloqué ou suspect ici (étendue security.read).IP Le pare-feu, la liste de blocage des spams et le verdict de l'IA de sécurité mis en cache. ip, email.

security.report

Enregistré comme un événement de sécurité, classifié immédiatement par l'IA de sécurité et les administrateurs sont alertés sur les verdicts à haut risque. Paramètres: ip, email, type, raison, source.

Ajouter / Modifier la liste de blocage

Gérer les règles de spam que le pipeline des tickets applique (scope security. write / security. read). Même stockage que la page Tickets "Bloquer l'expéditeur" contrôle. Paramètres: type (email, domaine, ip), valeur, raison, expires_hours.

💡
Il renvoie toutes les actions disponibles sur votre installation avec la portée dont chacune a besoin, de sorte que vous n'avez jamais à deviner ou coder cette liste.

Pagination, filtrage et tri

Chaque action de liste utilise les mêmes paramètres, vous ne les apprenez donc qu'une seule fois.

Page / par page

Numéro de page commençant par 1, et la taille de la page. 50, maximum 200. limite et décalage sont également acceptés si vous les préférez.

tri / ordre

Champ à trier, et asc ou desc (par défaut desc). Chaque action accepte un ensemble fixe de champs de tri. Tout le reste est ignoré plutôt que d'être considéré comme une erreur.

filters

Envoyer des filtres en tant qu'objet, ou passer un filtre comme paramètre de niveau supérieur. Les filtres inconnus sont ignorés.

Ce qui revient

Pour chaque page, utilisez les paramètres items, page, per_page, count, total et has_more.

Demande de liste paginée, filtrée et triée
POST /api/v1.php
Authorization: Bearer opq_your_api_key

{
  "action": "tickets.list",
  "status": "open",
  "priority": "urgent",
  "sort": "created_at",
  "order": "desc",
  "page": 1,
  "per_page": 50
}

Erreurs

Chaque défaillance renvoie la même forme, avec une code Ne pas correspondre sur le fichier lisible par l'homme. error texte, qui peut être reformulé.

Réponse d'erreur
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
Clé_API_manquante / clé_API invalide

Aucune clé n'a été envoyée, ou la clé est incorrecte ou expirée. HTTP 401.

missing_scope

La clé est valide mais n'a pas la portée nécessaire à cette action. HTTP 403.

Clé en lecture seule / action_restricted

La clé est en lecture seule, ou cette action n'est pas dans sa liste d'autorisations. HTTP 403.

unknown_action

Aucune action. Appeler meta. actions pour la liste courante. HTTP 400.

Paramètre manquant / paramètre invalide

Un paramètre requis est absent ou une valeur n'est pas acceptée. HTTP 400.

not_found

L'enregistrement n'existe pas, ou il ne se trouve pas dans l'espace de travail que cette clé peut voir. 404.

plan_feature_locked

Votre plan ne comprend pas la fonctionnalité à laquelle cette action appartient. Le corps nomme le feature, le plan_name en vigueur et upgrade_url. La réessayer n'aide pas ; le plan doit changer. HTTP 402.

license_required

La licence d'installation n'est pas active, donc aucune action ne s'exécutera jusqu'à ce qu'elle soit restaurée. HTTP 402.

selling_paused

Spécifique au commerce : le magasin a vendu désactivé, donc rien ne peut être cité ou commandé. HTTP 400.

rate_limited

La limite horaire de cette clé est épuisée. HTTP 429.

server_error

Quelque chose a échoué de notre côté. Le request_id identifie la tentative si vous devez le signaler. HTTP 500.

Retestages en toute sécurité

Si un temps d'écriture expire, vous ne pouvez pas savoir s'il a atterri. idempotency_key et une répétition du même appel retourne le résultat original au lieu de faire le travail deux fois.

Écrire l'idémpotent
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
Combien de temps cela dure

Une clé est mémorisée pour 24 heures contre la même action et API clé.

Ce que vous obtenez en retour

La réponse originale, plus idempotent_replay: true pour que vous puissiez dire qu'il s'agissait d'une reprise.

Les échecs restent réessayables

Si un appel a échoué, le renvoyer avec la même clé l'exécute à nouveau, ce qui est ce que vous voulez.

Lire

Les lectures ignorent la clé. La répétition d'une lecture est inoffensive.

Testez sans rien changer

Ajouter dry_run: true Votre clé, vos champs d'application et vos paramètres sont tous vérifiés exactement comme d'habitude, puis l'appel s'arrête avant que quoi que ce soit ne soit créé ou modifié.

Essai: vérification des informations d'identification et de la charge utile en toute sécurité
{
  "action": "tickets.update",
  "ticket_id": 4192,
  "status": "closed",
  "dry_run": true
}

{
  "success": true,
  "dry_run": true,
  "would_execute": true,
  "message": "Authorised and validated. No write was performed because dry_run was set."
}
Utilisez dry_run pendant la construction, c'est le moyen le plus rapide de confirmer qu'une clé a les bons scopes et que votre charge utile est correctement formée, sans créer des données de test à nettoyer.

Limites de taux

Limite par clé

Une limite horaire configurable par API clé (par défaut 1000 Définissez-le par touche sous Paramètres, puis cliquez sur API Les clés.

Lorsque dépassé

HTTP 429 avec le code rate_limited, plus un en-tête Retry-After vous indiquant combien de secondes attendre. La limite est réinitialisée au début de l'heure d'horloge suivante.

Savoir où vous en êtes

Chaque réponse porte les valeurs X-RateLimit-Limit, X-Remaining et X-Resets (un horodatage Unix) Regardez Remaining et ralentissez avant de vous épuiser plutôt que d'attendre d'être refusé.

En disant 429 à partir 401

A 429 Cela signifie attendre et réessayer. A 401 signifie que la clé elle-même est incorrecte ou expirée, donc réessayer n'aidera pas tant que vous ne l'aurez pas corrigée.

Garde de brute-force pré-authentification

Essais répétés d'un seul coupIPLes clés valides ne font jamais ce voyage.

Meilleures pratiques

Reculez lorsque le reste est faible, et honorez Retry-After après un 429 au lieu de réessayer immédiatement.

Versions et stabilité

Version actuelle

v1. Chaque réponse porte X-OpsIQ-API- Version et X-OpsIQ-API-Situation pour que vous puissiez confirmer ce à quoi vous parlez.

Comment vous serez averti

Si une version est retirée, les réponses reçoivent des en-têtes standard Deprecation et Sunset, et meta. actions rapporte deprecated et sunset_at Vérifiez ces éléments dans votre monitoring et vous ne serez jamais surpris.

Ce qui ne changera pas

Les noms des actions existantes, leurs paramètres et leurs codes d'erreur. De nouvelles actions et de nouveaux champs optionnels peuvent être ajoutés à tout moment. Ignorez donc les champs que vous ne reconnaissez pas plutôt que de les échouer.

Une intégration complète, du début à la fin

C’est la boucle complète : trouver un travail, le lire, agir sur celui-ci et confirmer ce que vous avez fait.

Flux de travail complet des tickets sur le API
# 1. Discover what this install offers and what each action needs.
POST /api/v1.php
{"action":"meta.actions"}

# 2. Find the urgent open tickets.
POST /api/v1.php
Authorization: Bearer opq_your_api_key
{"action":"tickets.list","status":"open","priority":"urgent","per_page":25}

# 3. Read one, including its conversation history.
{"action":"tickets.get","ticket_id":4192}

# 4. Reply, safely enough to retry if the network drops.
{"action":"tickets.reply","ticket_id":4192,
 "body":"We have issued the refund.","idempotency_key":"reply-4192-attempt-1"}

# 5. Close it.
{"action":"tickets.update","ticket_id":4192,"status":"closed"}

# 6. Page through anything larger: keep going until has_more is false.
{"action":"tickets.list","page":2,"per_page":50}
💡
Tout ce qui précède fonctionne de la même manière pour les conversations : conversations. list, conversations,get, conversation. send et conversations-update suivent le même modèle, les mêmes paramètres et la même forme de réponse.

Exemples plus concrets

Chacun de ces éléments est un morceau complet et exploitable d'une véritable intégration plutôt qu'un fragment.

Pagez chaque disque, en trois langues

La règle est la même partout : continuer à demander la page suivante jusqu'à has_more C'est faux, jamais un total.

Python · page à travers chaque ticket ouvert
import requests

API  = "https://your-opsiq-domain.com/api/v1.php"
HEAD = {"Authorization": "Bearer opq_your_api_key"}

def every(action, **params):
    """Yield every record for a list action, one page at a time."""
    page = 1
    while True:
        r = requests.post(API, headers=HEAD,
                          json={"action": action, "page": page, "per_page": 200, **params},
                          timeout=30)
        r.raise_for_status()
        body = r.json()
        if not body.get("success"):
            raise RuntimeError(f"{body.get('code')}: {body.get('error')}")
        yield from body.get("items", [])
        if not body.get("has_more"):
            return
        page += 1

for ticket in every("tickets.list", status="open"):
    print(ticket["ticket_number"], ticket["subject"])
Node. js · page à travers chaque piste
const API = "https://your-opsiq-domain.com/api/v1.php";
const HEAD = { Authorization: "Bearer opq_your_api_key", "Content-Type": "application/json" };

async function* every(action, params = {}) {
  for (let page = 1; ; page++) {
    const res  = await fetch(API, {
      method: "POST",
      headers: HEAD,
      body: JSON.stringify({ action, page, per_page: 200, ...params }),
    });
    const body = await res.json();
    if (!body.success) throw new Error(`${body.code}: ${body.error}`);
    yield* body.items ?? [];
    if (!body.has_more) return;
  }
}

for await (const contact of every("crm.contacts.list", { status: "lead" })) {
  console.log(contact.email);
}
PHP · page à travers chaque ticket ouvert
<?php
$api = "https://your-opsiq-domain.com/api/v1.php";

function opsiq(string $action, array $params = []): array {
    global $api;
    $ch = curl_init($api);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            "Authorization: Bearer opq_your_api_key",
            "Content-Type: application/json",
        ],
        CURLOPT_POSTFIELDS => json_encode(["action" => $action] + $params),
        CURLOPT_TIMEOUT    => 30,
    ]);
    $body = json_decode((string)curl_exec($ch), true) ?: [];
    curl_close($ch);
    if (empty($body["success"])) {
        throw new RuntimeException(($body["code"] ?? "error") . ": " . ($body["error"] ?? "unknown"));
    }
    return $body;
}

$page = 1;
do {
    $res = opsiq("tickets.list", ["status" => "open", "page" => $page, "per_page" => 200]);
    foreach ($res["items"] as $t) {
        echo $t["ticket_number"], " ", $t["subject"], PHP_EOL;
    }
    $page++;
} while (!empty($res["has_more"]));

Gérer chaque défaillance que API peut retourner

Branche code, jamais sur le libellé de error. Ce packer est le contrat entier en une seule fonction.

Python · un client qui gère chaque code d'erreur correctement
import time, requests

RETRYABLE = {"server_error", "handler_unavailable"}

def call(action, **params):
    for attempt in range(4):
        r = requests.post(API, headers=HEAD, json={"action": action, **params}, timeout=30)
        body = r.json()
        if body.get("success"):
            return body

        code = body.get("code")

        if code == "rate_limited":
            # Honour Retry-After rather than guessing.
            time.sleep(int(r.headers.get("Retry-After", 60)))
            continue

        if code in RETRYABLE:
            time.sleep(2 ** attempt)
            continue

        # Everything below is permanent: retrying cannot fix it.
        if code == "plan_feature_locked":
            raise RuntimeError(f"Plan {body['plan_name']} lacks {body['feature']}: {body['upgrade_url']}")
        if code in ("missing_scope", "read_only_key", "action_restricted"):
            raise RuntimeError(f"This API key cannot do that: {body['error']}")
        if code in ("invalid_api_key", "missing_api_key"):
            raise RuntimeError("The key is wrong or expired; retrying will not help.")
        raise RuntimeError(f"{code}: {body.get('error')} (request_id {body.get('request_id')})")

    raise RuntimeError("Gave up after repeated retries")

Répondez à un mauvais score de satisfaction dans l'heure

Lisez les scores bas, ouvrez un ticket pour chacun, et n'agissez jamais sur le même deux fois.

Fermez la boucle sur les clients malheureux
# 1. Yesterday's detractors.
POST /api/v1.php
{"action":"tickets.csat.list","filters":{"max_rating":2},"days":1,"per_page":100}

# 2. For each one, open a follow-up ticket. The idempotency key is derived
#    from the response id, so re-running the job creates nothing twice.
POST /api/v1.php
{"action":"tickets.open",
 "customer_email":"[email protected]",
 "subject":"Following up on your feedback",
 "body":"We saw your rating and want to put it right.",
 "priority":"high",
 "idempotency_key":"csat-followup-8821"}

# 3. The same shape works for chat: conversations.ratings.list with
#    {"filters":{"max_stars":2},"days":1} returns the comment, what
#    prompted the rating and which agent it is credited to.

Citer un article et agir sur la réponse du marchand

Un refus qui vous dit quoi collecter
POST /api/v1.php
{"action":"commerce.quotes.create","source":"whmcs","item_id":"47","quantity":1}

# The merchant needs more from the customer before it can price this:
{
  "success": false,
  "code": "quote_refused",
  "error": "We need the domain this hosting plan is for.",
  "actionable": true,
  "missing": ["domain"]
}

# Ask the customer for exactly what "missing" names, then quote again.
POST /api/v1.php
{"action":"commerce.quotes.create","source":"whmcs","item_id":"47",
 "fields":{"domain":"example.ng"}}

{
  "success": true,
  "source": "whmcs",
  "quote": {
    "quote_id": "…",
    "totals": { "total": { "amount_minor": 306027, "currency": "NGN" }, "currency": "NGN" },
    "expires_at": "2026-09-05T12:34:56+00:00"
  },
  "ordering": { "creates_order": false, "confirm_via_api": false }
}
⚠️
Afficher le client totals.total La quantité ne multiplie pas toujours le prix unitaire — un hôtel offre une chambre pour trois nuits — de sorte qu'un chiffre que vous calculez vous-même peut différer de ce que le marchand va réellement facturer.

Un récepteur webhook qui est sûr de fonctionner en production

Vérifiez, doublonnez, répondez rapidement, puis faites le travail. Les livraisons réessayent, de sorte que le même événement peut arriver plus d'une fois.

PHP · un récepteur webhook en forme de production
<?php
// (verification exactly as in the Webhooks section, omitted here for brevity)

$event    = json_decode($raw, true);
$name     = $_SERVER["HTTP_X_OPSIQ_EVENT"] ?? ($event["event"] ?? "");
$delivery = $_SERVER["HTTP_X_OPSIQ_DELIVERY"] ?? "";

// 1. Already seen this delivery? Say OK and stop — do not redo the work.
if ($db->alreadyProcessed($delivery)) {
    http_response_code(200);
    exit(json_encode(["ok" => true, "duplicate" => true]));
}

// 2. Answer FAST. Anything slow belongs on your own queue: OpsIQ treats a
//    timeout as a failure and will retry the whole delivery.
$db->markProcessed($delivery);
$queue->push($name, $event);

http_response_code(200);
echo json_encode(["ok" => true]);

// 3. Your worker then routes on the event name.
//    conversation.rated        -> alert the team on a 1 or 2 star rating
//    ticket.created            -> mirror into your own helpdesk
//    crm.deal.won              -> post to #sales-alerts
//    commerce.payment.confirmed-> release the order in your fulfilment system

Plans et prestations

Chaque action appartient à une fonction produit, et votre plan décide quelles sont les fonctionnalités que vous avez. Si votre plan n'inclut pas une fonctionnalité, l'action répond 402 — une fois que votre clé est cochée, un appelant non authentifié n'apprend rien de votre plan, et avant que quelque chose ne soit créé, donc une écriture bloquée ne se passe jamais.

Une action sans fin
{
  "success": false,
  "code": "plan_feature_locked",
  "feature": "commerce",
  "plan_locked": true,
  "plan_name": "Growth",
  "upgrade_url": "https://…",
  "request_id": "req_8f2c1a9d4b7e"
}
Comment le dire à part un problème de permissions

A403Cela signifie que la KEY est trop étroite, qu'elle la réémet avec la bonne portée et qu'il fonctionne.402signifie que le COMPTE n'a pas la fonctionnalité — aucune clé ne peut le débloquer, le plan doit changer.

Ne pas réessayer un 402

Il n'est pas transitoire. upgrade_url à qui appartient le compte au lieu de se retirer et d'essayer de nouveau.

Le champ d'application de l'administration ne le contourne pas

Les champs d'application expriment ce que l'émetteur clé a délégué; le plan exprime ce que le compte acheté. Une clé de champ d'administration obtient toujours un 402 pour une fonctionnalité qui manque au plan.

Découvrez avant d'expédier

Le feature chaque besoin d'action est publié dans le répertoire d'actions ci-dessous et en meta.action, vous pouvez donc vérifier à la construction au lieu de le découvrir dans la production.

La façon la plus rapide de voir exactement où se trouve une clé est meta.me. Il rapporte le plan en vigueur, chaque caractéristique qu'il comporte, et chaque action que cette clé ne peut pas appeler avec la raison de chacune.

méta. me — ce que cette clé peut faire en fait
POST /api/v1.php
Authorization: Bearer opq_your_api_key

{"action":"meta.me"}

{
  "success": true,
  "key": { "name": "Reporting", "scopes": ["tickets.read"], "permissions_mode": "read_only" },
  "plan": { "name": "Growth", "features": { "ticket_system": true, "commerce": false } },
  "capabilities": {
    "available_action_count": 812,
    "blocked_actions": {
      "commerce.orders.list": "plan_locked:commerce",
      "tickets.reply":        "read_only"
    }
  }
}
Appelez meta. me d'abord quand une intégration se comporte différemment entre deux installs. Elle répond "pourquoi cette clé ne peut pas faire cela" dans une requête, sans que personne n'ouvre l'administrateur.

Citation d'un prix

commerce.quotes.create Il ne crée rien — pas de commande, pas de séance de paiement, pas d'actions en attente — donc il est sûr d'appeler pendant qu'un client décide encore.

Citation d'un article
POST /api/v1.php
Authorization: Bearer opq_your_api_key

# Your own Store
{"action":"commerce.quotes.create","source":"store","item_id":"12","quantity":2}

# A connected merchant platform, priced for a known customer
{"action":"commerce.quotes.create","source":"whmcs","item_id":"47",
 "fields":{"domain":"example.ng"},
 "customer":{"connector_customer_id":"1042"}}
Le total des gains du marchand

Pour une plateforme connectée, le total vient de ce marchand et n'est jamais recalculé ici. Quantité ne multiplie pas toujours le prix unitaire — un hôtel cite une chambre pour trois nuits — alors montrez le total que vous avez reçu, pas un que vous aviez travaillé.

Les refus vous disent ce qui manque

Si le marchand a besoin de plus du client, vous obtenez quote_refused avec une missing liste nommant les champs à collecter, et la formulation propre du marchand à montrer.

Commander n'est pas un appel API

Une offre est indicative. La confirmation se produit lorsque le client est — la carte signée dans chat, ou la propre commande du marchand — jamais par cette API. ordering.

Lorsque la vente est interrompue

Si le magasin a vendu éteint, citant des réponses selling_paused plutôt que de payer quelque chose que personne ne peut acheter.

Les autres paramètres

Presque tout ce dont vous avez besoin est un POST à /api/v1.php. Ce sont les exceptions, et ce que chacun est pour.

/api/v1/openapi.php · /api/v1/postman.php · /api/docs/

Le contrat de machine et la référence humaine. Pas de clé nécessaire, donc vous pouvez explorer avant d'en avoir une.

/api/ai_stream.php

Les événements en présence de serveur pour les réponses en direct de chat sont générés. Un flux, pas une action JSON.

/api/writing.php

Le plus ancien paramètre d'écriture de l'IA. Tout ce qu'il fait est également disponible en tant que writing.* actions sur /api/v1.php, où de nouveaux travaux devraient aller.

/api/inbox_copilot.php

Draft, rewrite et triage pour une boîte de réception de ticket intégrée dans votre propre admin.

/api/v1/si/…

Restaurer les sites comme un petit REST API — sites, rampes, problèmes, mots-clés, revenus — pour les pipelines CI qui veulent commencer un ramp après un déploiement et lire le résultat.

/api/connectors.php?slug=&token=

Où une plate-forme connectée POST vous offre ses propres webhooks. Le jeton est frappé lorsque vous activez le connecteur.

/api/integrations/*.php

Le moteur d'intégration : exécuter et confirmer des actions, et ingérer des ventes, des événements d'identité et de voyage. Il utilise son propre type de clé, émis sous API & Webhook builder.

💡
Tous ces derniers obéissent aux mêmes règles de plan que les actions. Une fonctionnalité votre plan n'inclut pas les réponses 402 ici aussi, dans la même forme.

Chaque action, avec la portée dont elle a besoin

Cette liste est générée à partir du catalogue en cours, elle correspond donc toujours à la version que vous utilisez. meta.actions Retourne les mêmes informations que JSON.

2420 named actions: 804 reads, 1616 writes and 69 scopes. Every registered administrator JSON operation has a stable named action. OpenAPI: /api/v1/openapi.php. Postman: /api/v1/postman.php. Contract quality: declared_dynamic: 606; explicit: 63; route_inferred: 1633; source_inferred: 118.

administration (25)

administration.2fa.disable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Disable

administration.2fa.enable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Enable

administration.2fa.recovery.regenerate

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Recovery Regenerate

administration.2fa.setup

Read. Scope: administration.read, admin. Contract: route_inferred. Admin 2fa Setup

administration.2fa.status

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin 2fa Status

administration.ai.train.from.reply

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Ai Train From Reply

administration.brain.cancel

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Brain Cancel

administration.brain.view

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Brain View

administration.chat.access.check

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Access Check

administration.chat.create.ticket.on.behalf

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Create Ticket On Behalf

administration.chat.draft.ticket.from.thread

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Draft Ticket From Thread

administration.conv.delete

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Delete

administration.conv.get

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Get

administration.conv.list

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv List

administration.conv.new

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv New

administration.conv.save

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Save

administration.notification.prefs.get

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Notification Prefs Get

administration.notification.prefs.save

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notification Prefs Save

administration.notifications.list

Read. Scope: administration.read, admin. Contract: route_inferred. Admin Notifications List

administration.notifications.mark.all.read

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notifications Mark All Read

administration.notifications.mark.read

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Mark Read

administration.notifications.pulse

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Pulse

administration.online.list

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Online List

administration.presence.ping

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Presence Ping

administration.realtime.token

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Realtime Token

Analyse (43)

analytics.add.widget

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Add Widget

analytics.analytics.connectors.catalog

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Connectors Catalog

analytics.analytics.data

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Data

analytics.analytics.export

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export

analytics.analytics.export.csv

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export Csv

analytics.analytics.import

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Import

analytics.analytics.report

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Report

analytics.analytics.segments.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Delete

analytics.analytics.segments.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Segments List

analytics.analytics.segments.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Save

analytics.analytics.status

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Status

analytics.clear.all

Write. Scope: analytics.write, admin. Contract: declared_dynamic. Replay Clear All

analytics.compute

Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Compute

analytics.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Create

analytics.create.route.dashboard.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Create

analytics.create.route.report.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Create

analytics.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Delete

analytics.delete.route.dashboard.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Delete

analytics.delete.route.funnels.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Delete

analytics.delete.route.report.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Delete

analytics.events

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Events

analytics.export

Read. Scope: analytics.read, admin. Contract: source_inferred. Analytics Export

analytics.get

Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Get

analytics.layout.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Layout Save

analytics.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Ab Test List

analytics.list.route.dashboard.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Dashboard List

analytics.list.route.funnels.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Funnels List

analytics.list.route.report.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Report List

analytics.remove.widget

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Remove Widget

analytics.rename

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Rename

analytics.results

Read. Scope: analytics.read, admin. Contract: route_inferred. Ab Test Results

analytics.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Save

analytics.save.widgets

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Save Widgets

analytics.scheduled.list

Read. Scope: analytics.read, admin. Contract: explicit. List scheduled analytics reports for an operator Required fields: admin_id.

analytics.sections.list

Read. Scope: analytics.read, admin. Contract: explicit. List analytics report sections and date presets

analytics.send.now

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Send Now

analytics.sessions

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Sessions

analytics.step.visitors

Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Step Visitors

analytics.timeline

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Timeline

analytics.toggle.shared

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Toggle Shared

analytics.update

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Update

analytics.update.route.report.update

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Update

analytics.widget.data

Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Widget Data

automations (6)

automations.actions.list

Read. Scope: automations.read, admin. Contract: explicit. List integration actions

automations.delete

Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Delete

automations.list

Read. Scope: automations.read, admin. Contract: route_inferred. Workflow List

automations.runs.list

Read. Scope: automations.read, admin. Contract: explicit. List automation execution history

automations.save

Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Save

automations.triggers.list

Read. Scope: automations.read, admin. Contract: explicit. List integration triggers

chat (40)

chat.call.start

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Call Start

chat.cobrowse.send

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Cobrowse Send

chat.feedback

Read. Scope: chat.read, admin. Contract: route_inferred. Chat Feedback

chat.feedback.digest

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Feedback Digest

chat.form.delete

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Delete

chat.form.get

Read. Scope: chat.read, admin. Contract: route_inferred. Chat Form Get

chat.form.list

Read. Scope: chat.read, admin. Contract: declared_dynamic. Chat Form List

chat.form.save

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Save

chat.form.set.default

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Set Default

chat.meeting.decide

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Decide

chat.meeting.outcome.set

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Outcome Set

chat.meeting.type.delete

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Delete

chat.meeting.type.save

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Save

chat.meeting.types.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Types List

chat.meetings.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meetings List

chat.online.admins

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Online Admins

chat.permissions.list

Write. Scope: admin. Contract: route_inferred. Chat Permissions List

chat.permissions.revoke

Write. Scope: admin. Contract: route_inferred. Chat Permissions Revoke

chat.permissions.save

Write. Scope: admin. Contract: route_inferred. Chat Permissions Save

chat.permissions.upload.avatar

Write. Scope: admin. Contract: route_inferred. Chat Permissions Upload Avatar

chat.reaction.toggle

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Reaction Toggle

chat.saved_replies.add

Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Add Retry-safe with idempotency_key.

chat.saved_replies.list

Read. Scope: chat.read, admin. Contract: explicit. List workspace and personal saved replies

chat.saved_replies.save

Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Save Retry-safe with idempotency_key.

chat.set.persona

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Set Persona

chat.snooze.clear

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Clear

chat.snooze.set

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Set

chat.transfer.thread

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Transfer Thread

chat.transfer.unread

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Transfer Unread

chat.typing.preview

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Typing Preview

chat.whisper.ai.summary

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Ai Summary

chat.whisper.controls

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Controls

chat.whisper.delete.room

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Delete Room

chat.whisper.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper List

chat.whisper.mentions

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Mentions

chat.whisper.rooms

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Rooms

chat.whisper.save.controls

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Save Controls

chat.whisper.send

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Send

chat.whisper.targets

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Targets

chat.whisper.unread

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Unread

commerce (11)

commerce.analytics.snapshot

Read. Scope: commerce.read, analytics.read, admin. Contract: explicit. Read privacy-safe storefront analytics

commerce.orders.get

Read. Scope: commerce.read, admin. Contract: explicit. Get one Store order with its line items

commerce.orders.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store orders in the bound workspace

commerce.pages.list

Read. Scope: commerce.read, admin. Contract: explicit. List storefront pages and promotional modals

commerce.products.get

Read. Scope: commerce.read, admin. Contract: explicit. Get one Store product with its variants Required fields: product_id.

commerce.products.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store products in the bound workspace

commerce.quotes.create

Write. Scope: commerce.write, admin. Contract: explicit. Quote an item for a customer (creates nothing) Required fields: source, item_id. Retry-safe with idempotency_key.

commerce.readiness.get

Read. Scope: commerce.read, admin. Contract: explicit. Check demo readiness and merchant go-live readiness

commerce.refunds.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store refund requests in the bound workspace

commerce.storefront.catalog.get

Read. Scope: commerce.read, admin. Contract: explicit. Discover Store themes, designs, blocks and promotional shells

commerce.storefront.get

Read. Scope: commerce.read, admin. Contract: explicit. Get the bound workspace storefront configuration

communications (21)

communications.auth.check

Read. Scope: admin. Contract: route_inferred. Email Auth Check

communications.campaign.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Delete

communications.campaign.save

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Save

communications.campaign.send

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Send

communications.campaigns.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Push Campaigns List

communications.drafts.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Delete

communications.drafts.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Drafts List

communications.drafts.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Save

communications.drafts.send

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Send

communications.mailboxes.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Delete

communications.mailboxes.list

Read. Scope: communications.read, admin. Contract: route_inferred. Email Mailboxes List

communications.mailboxes.poll

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Poll

communications.mailboxes.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Save

communications.mailboxes.test

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Test

communications.pipe.regen.token

Write. Scope: communications.write, admin. Contract: declared_dynamic. Email Pipe Regen Token

communications.platform.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Platform List

communications.platform.send

Write. Scope: communications.write, admin. Contract: route_inferred. Email Platform Send

communications.settings.get

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Settings Get

communications.settings.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Settings Save

communications.settings.test

Read. Scope: communications.read, admin. Contract: route_inferred. Email Settings Test

communications.vapid.generate

Write. Scope: communications.write, admin. Contract: declared_dynamic. Push Vapid Generate

connector_builder (11)

connector_builder.export

Read. Scope: connector_builder.read, admin. Contract: explicit. Export a generated connector Required fields: slug.

connector_builder.generate

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Generate a connector package Required fields: spec.

connector_builder.get

Read. Scope: connector_builder.read, admin. Contract: route_inferred. Load a Builder specification Required fields: slug.

connector_builder.import.curl

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import cURL into Connector Builder

connector_builder.import.openapi

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import OpenAPI into Connector Builder

connector_builder.import.postman

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import Postman into Connector Builder

connector_builder.list

Read. Scope: connector_builder.read, admin. Contract: declared_dynamic. List Builder connectors

connector_builder.profiles

Read. Scope: connector_builder.read, connectors.read, admin. Contract: source_inferred. List Connector Builder profiles and capability contracts

connector_builder.test

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Run Builder conformance tests Required fields: slug.

connector_builder.update

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Update a generated connector Required fields: slug, spec.

connector_builder.validate

Read. Scope: connector_builder.read, admin. Contract: route_inferred. Validate a Builder specification Required fields: spec.

connectors (51)

connectors.action

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Action

connectors.backfill

Write. Scope: connectors.write, admin. Contract: route_inferred. Start connector backfill Required fields: slug.

connectors.backfill.route.connectors.backfill

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Backfill

connectors.backfill.status

Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector backfill status Required fields: slug.

connectors.backfill.status.route.connectors.backfill.status

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Backfill Status

connectors.builder.ai.actions

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Actions

connectors.builder.ai.draft

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Draft

connectors.builder.ai.handler

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Handler

connectors.builder.ai.map

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Map

connectors.builder.delete

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Delete

connectors.builder.dry.run

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Dry Run

connectors.builder.generate

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Generate

connectors.builder.import.curl

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Curl

connectors.builder.import.openapi

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Openapi

connectors.builder.import.postman

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Postman

connectors.builder.list

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder List

connectors.builder.load

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Load

connectors.builder.marketplace.apply

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Apply

connectors.builder.marketplace.link

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Link

connectors.builder.marketplace.status

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Marketplace Status

connectors.builder.marketplace.submit

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Submit

connectors.builder.schema

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Schema

connectors.builder.test

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test

connectors.builder.test.action

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test Action

connectors.builder.update

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Update

connectors.builder.validate

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Validate

connectors.contacts.import

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Contacts Import

connectors.contract

Read. Scope: connectors.read, connector_builder.read, admin. Contract: source_inferred. Read the canonical connector capability contract

connectors.customers.sync

Write. Scope: connectors.write, admin. Contract: route_inferred. Synchronize connector customers Required fields: slug.

connectors.disable

Write. Scope: connectors.write, admin. Contract: route_inferred. Disable a connector Required fields: slug.

connectors.disable.route.connectors.disable

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Disable

connectors.email.account.department

Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Department

connectors.email.account.remove

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Email Account Remove

connectors.email.account.routing

Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Routing

connectors.enable

Write. Scope: connectors.write, admin. Contract: route_inferred. Enable a connector Required fields: slug.

connectors.enable.route.connectors.enable

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Enable

connectors.get

Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Get

connectors.get.route.connectors.get

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Get

connectors.install

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Install

connectors.integrity.scan

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connector Integrity Scan

connectors.list

Read. Scope: connectors.read, admin. Contract: explicit. List installed connectors and capabilities

connectors.list.route.connectors.list

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors List

connectors.oauth.start

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Oauth Start

connectors.settings.get

Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector settings Required fields: slug.

connectors.settings.save

Write. Scope: connectors.write, admin. Contract: route_inferred. Save connector settings Required fields: slug, settings.

connectors.shared.oauth.delete

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Shared Oauth Delete

connectors.sync.customers

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Sync Customers

connectors.test

Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Test

connectors.test.route.connectors.test

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Test

connectors.uninstall

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Uninstall

connectors.workflow.recipes

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Workflow Recipes

conversations (38)

conversations.ai.draft

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Draft

conversations.ai.rewrite

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Rewrite

conversations.archive

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Archive

conversations.assign

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Assign

conversations.assignees

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Assignees

conversations.bulk

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Bulk

conversations.clear

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear

conversations.clear.all

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear All

conversations.customer.tickets

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Customer Tickets

conversations.decline

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Decline

conversations.delete

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete

conversations.delete.last

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete Last

conversations.edit.last

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Edit Last

conversations.export

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Export

conversations.forget.visitor

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Forget Visitor

conversations.get

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Get

conversations.history

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat History

conversations.list

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations List

conversations.messages

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Messages

conversations.ratings.list

Read. Scope: conversations.read, admin. Contract: explicit. List rated Client Chat conversations

conversations.resolve

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Resolve

conversations.saved.replies

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Saved Replies

conversations.saved.reply.add

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Add

conversations.saved.reply.ai.generate

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Ai Generate

conversations.saved.reply.delete

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Delete

conversations.saved.reply.save

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Save

conversations.send

Write. Scope: conversations.write, admin. Contract: source_inferred. Conversations Send Retry-safe with idempotency_key.

conversations.send.route.admin.client.chat.send

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Send

conversations.tags.set

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Tags Set

conversations.thread

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Thread

conversations.threads

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Threads

conversations.toggle

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle

conversations.toggle.attachments

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Attachments

conversations.toggle.call.button

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Call Button

conversations.typing

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Typing

conversations.unarchive

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Unarchive

conversations.update

Write. Scope: conversations.write, admin. Contract: explicit. Update a conversation status, assignment or subject Retry-safe with idempotency_key.

conversations.upload

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Upload

CRM (260)

crm.ab.results

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ab Results

crm.access.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Access Set

crm.access_log.list

Read. Scope: admin. Contract: source_inferred. Crm Access Log List

crm.account.health

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health

crm.account.health.board

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health Board

crm.account.health.refresh

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Account Health Refresh

crm.account.plan.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Get

crm.account.plan.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Save

crm.account.plans.due

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plans Due

crm.account.timeline

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Account Timeline

crm.activities.list

Read. Scope: crm.read. Contract: explicit. List CRM contact activities

crm.activities.record

Write. Scope: crm.write. Contract: explicit. Record a CRM contact activity Required fields: contact_id, activity_type. Retry-safe with idempotency_key.

crm.activity.feed

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Activity Feed

crm.agent.toggle

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Agent Toggle

crm.ai.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Get

crm.ai.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Save

crm.ai.policy.simulate

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Simulate

crm.ai.trace

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ai Trace

crm.approval.decide

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Decide

crm.approval.delegate.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Delegate Set

crm.approval.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Approval List

crm.approval.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Get

crm.approval.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Save

crm.approval.settings

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Settings

crm.approve.apply

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Apply

crm.approve.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Approve List

crm.approve.reject

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Reject

crm.approve.update

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Update

crm.ask

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ask

crm.assign.owner

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Assign Owner

crm.assignment.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Assignment Get

crm.assignment.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Assignment Save

crm.attachment.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Delete

crm.attachment.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Attachment List

crm.attachment.upload

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Upload

crm.autobook.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autobook Meeting

crm.autodeal.mode

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autodeal Mode

crm.book.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Book Meeting

crm.booking.link.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Booking Link Save

crm.booking.links.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Booking Links List

crm.build.apply

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Apply

crm.build.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build Get

crm.build.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build List

crm.build.plan

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Plan

crm.build.rollback

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Rollback

crm.bulk

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Bulk

crm.bundle.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Bundle Set

crm.calendar.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Calendar Status

crm.capture.status

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Capture Status

crm.comm.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Get

crm.comm.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Save

crm.command.snapshot

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Command Snapshot

crm.companies.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Companies List

crm.company.hierarchy

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Hierarchy

crm.company.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Company Save

crm.company.set.parent

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Company Set Parent

crm.company.suggest.related

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Suggest Related

crm.connectors.catalog

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Connectors Catalog

crm.consent_log.list

Read. Scope: crm.read. Contract: source_inferred. Crm Consent Log List

crm.contact.churn

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Contact Churn

crm.contact.draft.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Draft Email

crm.contact.enrich

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Enrich

crm.contact.propose.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Propose Email

crm.contacts.detail

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Detail

crm.contacts.erase

Write. Scope: admin. Contract: source_inferred. Crm Contacts Erase Retry-safe with idempotency_key.

crm.contacts.export

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Export

crm.contacts.import.list

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Import List

crm.contacts.import.run

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Import Run Retry-safe with idempotency_key.

crm.contacts.list

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts List

crm.contacts.next_action

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Next Action

crm.contacts.open_chat

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Chat Retry-safe with idempotency_key.

crm.contacts.open_ticket

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Ticket Retry-safe with idempotency_key.

crm.contacts.resync

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Resync Retry-safe with idempotency_key.

crm.contacts.save

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Save Retry-safe with idempotency_key.

crm.contacts.send_email

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Send Email Retry-safe with idempotency_key.

crm.contacts.upsert

Write. Scope: crm.write. Contract: explicit. Crm Contacts Upsert Required fields: email. Retry-safe with idempotency_key.

crm.contract.amend

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Amend

crm.contract.price.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Price Set

crm.contract.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Save

crm.contract.usage

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Usage

crm.contracts.list

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contracts List

crm.conversation.intel

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Conversation Intel

crm.conversions.goals.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Delete Retry-safe with idempotency_key.

crm.conversions.goals.list

Read. Scope: crm.read. Contract: source_inferred. Crm Conversions Goals List

crm.conversions.goals.save

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Save Retry-safe with idempotency_key.

crm.conversions.list

Read. Scope: crm.read. Contract: source_inferred. Crm Conversions List

crm.conversions.record

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Record Retry-safe with idempotency_key.

crm.create.video.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Create Video Meeting

crm.customer.auto.sync

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Customer Auto Sync

crm.customer.auto.sync.status

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Auto Sync Status

crm.customer.emails

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Emails

crm.customer.payments

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Payments

crm.data.steward.bulk.propose

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Bulk Propose

crm.data.steward.inbox

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Data Steward Inbox

crm.data.steward.propose

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Propose

crm.deal.advance

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Advance

crm.deal.coach

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Coach

crm.deal.coach.action

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Coach Action

crm.deal.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Get

crm.deal.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Save

crm.deal.splits.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Deal Splits Get

crm.deal.splits.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Splits Set

crm.deals.advance

Write. Scope: crm.write. Contract: explicit. Advance a CRM deal to another stage Required fields: deal_id, stage_id. Retry-safe with idempotency_key.

crm.deals.create

Write. Scope: crm.write. Contract: explicit. Create a CRM deal Required fields: title. Retry-safe with idempotency_key.

crm.deals.detail

Read. Scope: crm.read. Contract: explicit. Get one CRM deal Required fields: deal_id.

crm.deals.list

Read. Scope: crm.read. Contract: explicit. List CRM deals

crm.deals.list.route.crm.deals.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deals List

crm.deals.update

Write. Scope: crm.write. Contract: explicit. Update a CRM deal Required fields: deal_id. Retry-safe with idempotency_key.

crm.detail

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Detail

crm.draft.outreach

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Draft Outreach

crm.enrich.account

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Enrich Account

crm.erase

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Erase

crm.events.catalog

Read. Scope: crm.read. Contract: explicit. List subscribable CRM domain events

crm.events.list

Read. Scope: crm.read. Contract: explicit. List durable CRM domain events

crm.export

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Export

crm.export.all

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Export All

crm.field.add

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Add

crm.field.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Get

crm.field.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Save

crm.field.remove

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Remove

crm.fields.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Fields List

crm.forecast.board

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forecast Board

crm.forecast.snapshot

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Forecast Snapshot

crm.form.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Form Save

crm.forms.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forms List

crm.health.repair.catalog

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Repair Catalog

crm.health.smoke

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Health Smoke

crm.health.snapshot

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Snapshot

crm.home.persona.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Home Persona Set

crm.identity.rules.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Get

crm.identity.rules.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Save

crm.import.list

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Import List

crm.import.run

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Import Run

crm.inbound.activity

Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Activity

crm.inbound.endpoints.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Delete Retry-safe with idempotency_key.

crm.inbound.endpoints.list

Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Endpoints List

crm.inbound.endpoints.save

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Save Retry-safe with idempotency_key.

crm.inbound.endpoints.test

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Test Retry-safe with idempotency_key.

crm.leaderboard

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Leaderboard

crm.lifecycle.evaluate

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Evaluate Retry-safe with idempotency_key.

crm.lifecycle.rules.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Delete Retry-safe with idempotency_key.

crm.lifecycle.rules.list

Read. Scope: crm.read. Contract: source_inferred. Crm Lifecycle Rules List

crm.lifecycle.rules.save

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Save Retry-safe with idempotency_key.

crm.list

Read. Scope: crm.read, admin. Contract: route_inferred. Contacts List

crm.mailbox.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Mailbox Status

crm.meeting.book

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Book

crm.meeting.cancel

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Cancel

crm.meeting.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Meeting List

crm.meeting.reschedule.accept

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Accept

crm.meeting.reschedule.reject

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Reject

crm.merge

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Merge

crm.message.send

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Message Send

crm.messaging.provider.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Delete

crm.messaging.provider.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Save

crm.messaging.provider.test

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Messaging Provider Test

crm.messaging.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Messaging Status

crm.next.action

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Next Action

crm.object.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Object Save

crm.objects.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Objects List

crm.offline.pull

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Pull

crm.offline.push

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Push

crm.open.chat

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Open Chat

crm.open.ticket

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Open Ticket

crm.outreach.campaigns.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Delete Retry-safe with idempotency_key.

crm.outreach.campaigns.list

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Campaigns List

crm.outreach.campaigns.save

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Save Retry-safe with idempotency_key.

crm.outreach.campaigns.send

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Send Retry-safe with idempotency_key.

crm.outreach.send

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Send Retry-safe with idempotency_key.

crm.outreach.templates.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Delete Retry-safe with idempotency_key.

crm.outreach.templates.list

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates List

crm.outreach.templates.preview

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates Preview

crm.outreach.templates.save

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Save Retry-safe with idempotency_key.

crm.payments.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Payments Status

crm.pipeline.data

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Pipeline Data

crm.price.resolve

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Price Resolve

crm.pricebook.entry.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Entry Set

crm.pricebook.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Save

crm.pricebooks.list

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebooks List

crm.privacy_settings.get

Read. Scope: crm.read. Contract: source_inferred. Crm Privacy Settings Get

crm.privacy_settings.save

Write. Scope: admin. Contract: source_inferred. Crm Privacy Settings Save Retry-safe with idempotency_key.

crm.product.archive

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Product Archive

crm.product.revenue

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Product Revenue

crm.product.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Product Save

crm.products.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Products List

crm.propose.meeting

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Propose Meeting

crm.propose.outreach

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Propose Outreach

crm.prospecting.dashboard

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Prospecting Dashboard

crm.prospecting.icp.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Icp Save

crm.prospecting.import

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Import

crm.prospecting.research

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Research

crm.prospecting.score

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Score

crm.prospecting.sequence

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Sequence

crm.qualification.checklist.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Qualification Checklist Get

crm.qualification.checklist.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Qualification Checklist Save

crm.quota.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quota Save

crm.quote.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quote Get

crm.quote.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quote Save

crm.quotes.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quotes List

crm.record.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Delete

crm.record.fields.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Fields Get

crm.record.fields.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Fields Save

crm.record.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Get

crm.record.history

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record History

crm.record.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Save

crm.record.share.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Set

crm.record.share.unset

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Unset

crm.record.shares

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Shares

crm.records.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Records List

crm.restore.email.consent

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Restore Email Consent

crm.resync.from.platform

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Resync From Platform

crm.retention.catalog

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Retention Catalog

crm.revert

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Revert

crm.runtime.policy.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Get

crm.runtime.policy.remote.wipe

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Remote Wipe

crm.runtime.policy.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Runtime Policy Save

crm.save

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Save

crm.scoring.rule.ai

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Ai

crm.scoring.rule.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Delete

crm.scoring.rule.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Scoring Rule List

crm.scoring.rule.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Save

crm.segments.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Delete Retry-safe with idempotency_key.

crm.segments.list

Read. Scope: crm.read. Contract: source_inferred. Crm Segments List

crm.segments.members

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Members

crm.segments.preview

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Preview

crm.segments.save

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Save Retry-safe with idempotency_key.

crm.segments.suggestions.accept

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Accept Retry-safe with idempotency_key.

crm.segments.suggestions.dismiss

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Dismiss Retry-safe with idempotency_key.

crm.segments.suggestions.list

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Suggestions List

crm.semantic.search

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Semantic Search

crm.send.email

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Send Email

crm.send.email.route.crm.send.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Email

crm.send.for.signature

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send For Signature

crm.send.payment.link

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Payment Link

crm.sequence.action

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sequence Action

crm.sequence.runs

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Sequence Runs

crm.setup.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Setup Status

crm.sharing.rules.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Get

crm.sharing.rules.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Save

crm.subject.registry

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Subject Registry

crm.subscriptions.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Subscriptions List

crm.subscriptions.rollup

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Subscriptions Rollup

crm.subscriptions.sync

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Subscriptions Sync

crm.task.create

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Task Create

crm.tasks.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Tasks List

crm.team.parent.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Parent Set

crm.team.rules.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Rules Set

crm.team.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Save

crm.teams.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Teams List

crm.territory.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Territory Set

crm.video.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Video Status

crm.views.delete

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Delete

crm.views.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Views List

crm.views.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Save

crm.webhooks.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Delete Retry-safe with idempotency_key.

crm.webhooks.list

Read. Scope: crm.read. Contract: explicit. List CRM outbound webhook endpoints and recent deliveries

crm.webhooks.save

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Save Retry-safe with idempotency_key.

crm.webhooks.test

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Test Retry-safe with idempotency_key.

crm.workflows.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Delete Retry-safe with idempotency_key.

crm.workflows.list

Read. Scope: crm.read. Contract: source_inferred. Crm Workflows List

crm.workflows.save

Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Save Retry-safe with idempotency_key.

clients (44)

customers.analyze

Write. Scope: customers.write, journey.write, admin. Contract: route_inferred. Analyze a customer journey with AI Required fields: client_id.

customers.behaviour

Read. Scope: admin. Contract: route_inferred. Cdp Behaviour

customers.behaviour.analyze

Write. Scope: admin. Contract: route_inferred. Cdp Behaviour Analyze

customers.chat.embed.backfill

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Embed Backfill

customers.chat.embed.status

Read. Scope: customers.read, admin. Contract: declared_dynamic. Client Chat Embed Status

customers.chat.faq.ai.generate

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Ai Generate

customers.chat.faq.approve.all

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Approve All

customers.chat.faq.delete

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Delete

customers.chat.faq.delete.all

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Faq Delete All

customers.chat.faq.export

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Faq Export

customers.chat.faq.generate

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Generate

customers.chat.faq.import

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Import

customers.chat.faq.list

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq List

customers.chat.faq.save

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Save

customers.chat.faq.set.help

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Set Help

customers.chat.faq.set.help.all

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Set Help All

customers.chat.faq.status

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Faq Status

customers.chat.grant.upload

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Grant Upload

customers.chat.help.set.slug

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Help Set Slug

customers.chat.knowledge.crawl.step

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Crawl Step

customers.chat.knowledge.delete

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Delete

customers.chat.knowledge.delete.all

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Delete All

customers.chat.knowledge.delete.duplicates

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Delete Duplicates

customers.chat.knowledge.duplicates

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Duplicates

customers.chat.knowledge.export.json

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Knowledge Export Json

customers.chat.knowledge.import.json

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Import Json

customers.chat.knowledge.preview

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Preview

customers.chat.knowledge.recrawl

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Recrawl

customers.chat.knowledge.test.url

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Knowledge Test Url

customers.chat.revoke.upload

Write. Scope: customers.write, admin. Contract: route_inferred. Client Chat Revoke Upload

customers.chat.upload.agent.avatar

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Agent Avatar

customers.chat.upload.ai.avatar

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Ai Avatar

customers.chat.upload.icon

Write. Scope: customers.write, admin. Contract: declared_dynamic. Client Chat Upload Icon

customers.client.analyze

Write. Scope: admin. Contract: route_inferred. Cdp Client Analyze

customers.client.delete

Write. Scope: admin. Contract: route_inferred. Cdp Client Delete

customers.client.export

Write. Scope: admin. Contract: route_inferred. Cdp Client Export

customers.client.journey

Read. Scope: admin. Contract: route_inferred. Cdp Client Journey

customers.client.prepare.outreach

Write. Scope: customers.write, admin. Contract: route_inferred. Cdp Client Prepare Outreach

customers.clients.list

Read. Scope: admin. Contract: route_inferred. Cdp Clients List

customers.detail

Read. Scope: customers.read, admin. Contract: route_inferred. Client Detail

customers.get

Read. Scope: customers.read, crm.read, admin. Contract: route_inferred. Get a customer profile Required fields: client_id.

customers.journey

Read. Scope: customers.read, journey.read, admin. Contract: route_inferred. Get a complete customer journey Required fields: client_id.

customers.list

Read. Scope: customers.read, crm.read, admin. Contract: route_inferred. List known customers

customers.outreach.prepare

Write. Scope: customers.write, crm.write, admin. Contract: route_inferred. Prepare CRM outreach for a customer Required fields: client_id.

departments (1)

departments.list

Read. Scope: departments.read, admin. Contract: source_inferred. Departments List

Email (2)

email.template.send

Write. Scope: email.write, admin. Contract: source_inferred. Send one governed workspace email template Required fields: template, to. Retry-safe with idempotency_key.

email.templates.list

Read. Scope: email.read, admin. Contract: source_inferred. List email templates available to this workspace

engagement (163)

engagement.ab.autowinner

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Autowinner

engagement.ab.bandit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Bandit

engagement.address.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Address Get

engagement.address.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Address Save

engagement.ai.agent

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Agent

engagement.ai.analyze

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Analyze

engagement.ai.compile.profile

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Compile Profile

engagement.ai.copy

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Copy

engagement.ai.critique

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Critique

engagement.ai.decide

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Decide

engagement.ai.design

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Design

engagement.ai.edit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Edit

engagement.ai.generate

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Generate

engagement.ai.ideas

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Ideas

engagement.ai.image

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image

engagement.ai.image.edit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image Edit

engagement.ai.localize

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Localize

engagement.ai.logo

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Logo

engagement.ai.media.jobs

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Media Jobs

engagement.ai.narrative

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Narrative

engagement.ai.responsive

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Responsive

engagement.ai.variants

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Variants

engagement.ai.video.start

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Start

engagement.ai.video.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Status

engagement.approval.decide

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Decide

engagement.approval.request

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Request

engagement.approvals.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Approvals List

engagement.asset.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Delete

engagement.asset.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Upload

engagement.assets.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Assets List

engagement.audience.materialize

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Materialize

engagement.audience.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Save

engagement.audience.test

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Audience Test

engagement.audit.export

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Audit Export

engagement.autoresponder.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Autoresponder Get

engagement.autoresponder.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Autoresponder Save

engagement.bank.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Delete

engagement.bank.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Bank List

engagement.bank.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Save

engagement.bank.used

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Used

engagement.blackouts.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Blackouts Get

engagement.blackouts.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Blackouts Save

engagement.brand.kit.bootstrap

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Bootstrap

engagement.brand.kit.font.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Font Upload

engagement.brand.kit.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Brand Kit Get

engagement.brand.kit.get.route.survey.brand.kit.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Brand Kit Get

engagement.brand.kit.save

Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Brand Kit Save

engagement.brand.kit.save.route.survey.brand.kit.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Brand Kit Save

engagement.campaign.archive

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Archive

engagement.campaign.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Delete

engagement.campaign.duplicate

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Duplicate

engagement.campaign.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Get

engagement.campaign.launch

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Launch

engagement.campaign.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign List

engagement.campaign.pause

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Pause

engagement.campaign.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Preview

engagement.campaign.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Publish

engagement.campaign.rollback

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Rollback

engagement.campaign.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Save

engagement.campaign.save.route.survey.campaign.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Save

engagement.campaign.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Toggle

engagement.campaign.versions

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Versions

engagement.comment.add

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Comment Add

engagement.comments.add

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Add

engagement.comments.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Delete

engagement.comments.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Comments List

engagement.comments.list.route.survey.comments.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Comments List

engagement.comments.resolve

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Resolve

engagement.connectors.catalog

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Connectors Catalog

engagement.coupon.providers

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Coupon Providers

engagement.coupons.clear

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Clear

engagement.coupons.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Coupons Stats

engagement.coupons.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Upload

engagement.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Delete

engagement.delete.route.tour.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Delete

engagement.delivery.analytics

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Analytics

engagement.delivery.dashboard

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Dashboard

engagement.deployment.ab.promote

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Promote

engagement.deployment.ab.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Save

engagement.deployment.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Publish

engagement.deployment.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Save

engagement.deployment.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Status

engagement.detail

Read. Scope: engagement.read, admin. Contract: route_inferred. Campaign Detail

engagement.digest.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Digest Save

engagement.feed.catalog

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Feed Catalog

engagement.feed.items

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Feed Items

engagement.geo.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Geo Preview

engagement.idle.cron.set

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Idle Cron Set

engagement.import.create

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Create

engagement.import.replay

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Replay

engagement.leads.export

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads Export

engagement.leads.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads List

engagement.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Announcements List

engagement.list.route.tours.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Tours List

engagement.module.set.ai.live

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Ai Live

engagement.module.set.custom.html

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Custom Html

engagement.module.set.enabled

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Enabled

engagement.module.status

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Module Status

engagement.onsite.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Onsite Preview

engagement.pause.all

Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Pause All

engagement.presence

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Presence

engagement.preview.share

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Preview Share

engagement.push.draft

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Push Draft

engagement.recipients.issue

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Issue

engagement.recipients.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Recipients List

engagement.recipients.revoke

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Revoke

engagement.response.detail

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Response Detail

engagement.responses.browse

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Responses Browse

engagement.rule.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Delete

engagement.rule.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Save

engagement.rule.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Proactive Rule Stats

engagement.rule.test

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Rule Test

engagement.rule.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Toggle

engagement.rules.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Proactive Rules List

engagement.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Save

engagement.save.route.tour.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Save

engagement.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Stats

engagement.stats.route.tour.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Tour Stats

engagement.studio.a11y

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio A11y

engagement.studio.ai.generate

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Generate

engagement.studio.ai.insights

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Insights

engagement.studio.ai.target

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Target

engagement.studio.archive

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Archive

engagement.studio.assets

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio Assets

engagement.studio.create

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Create

engagement.studio.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Delete

engagement.studio.duplicate

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Duplicate

engagement.studio.event

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Studio Event

engagement.studio.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Get

engagement.studio.governance

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Governance

engagement.studio.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio List

engagement.studio.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview

engagement.studio.preview.link

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview Link

engagement.studio.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Publish

engagement.studio.rename

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Rename

engagement.studio.revert

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Revert

engagement.studio.save.draft

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Draft

engagement.studio.save.targeting

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Targeting

engagement.studio.set.active

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Active

engagement.studio.set.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Status

engagement.studio.template.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Delete

engagement.studio.template.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Save

engagement.studio.tpl.preview

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Tpl Preview

engagement.studio.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Upload

engagement.studio.webhook

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Webhook

engagement.targeting.simulate

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Targeting Simulate

engagement.template.apply

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Apply

engagement.template.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Template List

engagement.template.save.custom

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Save Custom

engagement.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Toggle

engagement.toggle.route.tour.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Toggle

engagement.trigger.set.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Trigger Set Save

engagement.variant.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Delete

engagement.variant.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Variant List

engagement.variant.promote

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Promote

engagement.variant.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Save

engagement.version.compare

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Version Compare

engagement.version.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Version Get

engagement.version.label

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Version Label

engagement.webhook.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Delete

engagement.webhook.replay

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Replay

engagement.webhook.run

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Run

engagement.webhook.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Save

feedback (8)

feedback.analytics

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Analytics

feedback.detractors

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Detractors

feedback.get

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Get

feedback.ingest

Write. Scope: feedback.write, admin. Contract: explicit. Ingest a feedback record or external review

feedback.list

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback List

feedback.overview

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Overview

feedback.sources.list

Read. Scope: feedback.read, admin. Contract: explicit. List Voice of Customer feedback sources

feedback.update

Write. Scope: feedback.write, admin. Contract: source_inferred. Feedback Update Retry-safe with idempotency_key.

files (1)

files.get

Read. Scope: files.read, admin. Contract: source_inferred. Files Get

hr (48)

hr.agent.incident.close

Write. Scope: hr.write, admin. Contract: route_inferred. Close an agent incident — the same act that lifts the suspension it caused Required fields: incident_uuid, resolution.

hr.agent.step

Write. Scope: hr.write, admin. Contract: route_inferred. Run one agent step: gate verdict, execution and outcome reported separately Required fields: run_uuid, agent_key, tool_key, jurisdiction, purpose.

hr.agent.step.status

Read. Scope: hr.read, admin. Contract: route_inferred. What actually happened at a step (permitted, executed, proven, failed, compensated) Required fields: run_uuid, seq.

hr.agent.takeover

Write. Scope: hr.write, admin. Contract: route_inferred. A human takes an agent run; no further agent steps are accepted Required fields: run_uuid.

hr.agent.tool.grant

Write. Scope: hr.write, admin. Contract: route_inferred. Grant an agent a tool for one jurisdiction and purpose, up to a risk ceiling Required fields: agent_key, tool_key, jurisdiction, max_risk, purpose.

hr.agent.tools

Read. Scope: hr.read, admin. Contract: declared_dynamic. List the registered typed tools an agent may use, and open agent incidents

hr.ai.corrections

Write. Scope: hr.write, admin. Contract: declared_dynamic. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing

hr.ai.quality.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception

hr.booking.slots_reconcile

Write. Scope: hr.write, admin. Contract: declared_dynamic. Release booking slots whose claim never became a booked meeting

hr.connectors.certify

Write. Scope: hr.write, admin. Contract: route_inferred. Certify an HR connector (scope sandbox|production; production demands provider-side proof under dual control) Required fields: connector_class, connector_key, scope, evidence, submitted_by.

hr.connectors.health

Read. Scope: hr.read, admin. Contract: route_inferred. One connector account's health: certification level and scope, last reconciliation verdict, failures and webhook backlog Required fields: account_uuid.

hr.decisions.appeals

Write. Scope: hr.write, admin. Contract: route_inferred. File an appeal against an AI decision on a person's behalf; it must be heard by an independent human Required fields: decision_uuid, subject_type, subject_id, grounds.

hr.decisions.explanation

Read. Scope: hr.read, admin. Contract: route_inferred. Plain-language explanation of one AI decision: what was looked at, which policy, and how to appeal Required fields: decision_uuid, audience.

hr.employee.provision

Write. Scope: hr.write, admin. Contract: route_inferred. Provision seatless employee access and send the invitation Required fields: person_uuid.

hr.employee.restore

Write. Scope: hr.write, admin. Contract: route_inferred. Lift an employee access suspension (written reason required) and provision again Required fields: person_uuid, reason.

hr.experience.metrics

Read. Scope: hr.read, admin. Contract: route_inferred. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys

hr.global.readiness

Read. Scope: hr.read, admin. Contract: declared_dynamic. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage

hr.identity.facets

Read. Scope: hr.read, admin. Contract: route_inferred. List a person's identity facets and open conflicts Required fields: person_uuid.

hr.identity.link

Write. Scope: hr.write, admin. Contract: route_inferred. Link an identity facet to a person Required fields: person_uuid, facet_type, facet_key.

hr.interview.room.connect

Write. Scope: hr.write, admin. Contract: route_inferred. Connect the AI to interview media; refuses unless media really reaches the worker Required fields: media_uuid.

hr.interview.room.consent

Write. Scope: hr.write, admin. Contract: route_inferred. Record or withdraw consent for ONE interview purpose (recording, biometric_liveness, transcription) Required fields: media_uuid, purpose, state.

hr.interview.room.pause

Write. Scope: hr.write, admin. Contract: route_inferred. Pause a live interview Required fields: media_uuid.

hr.interview.room.provision

Write. Scope: hr.write, admin. Contract: route_inferred. Provision an interview room (a place to meet — NOT AI participation) Required fields: session_uuid, transport, accommodation_route.

hr.interview.room.state

Read. Scope: hr.read, admin. Contract: route_inferred. Read an interview room, including whether the AI is actually participating Required fields: media_uuid.

hr.interview.room.takeover

Write. Scope: hr.write, admin. Contract: route_inferred. A human takes the interview; the AI cannot speak in it again Required fields: media_uuid, reason.

hr.jurisdiction.capabilities

Read. Scope: hr.read, admin. Contract: route_inferred. What this product may do in one country, per feature, with the law behind each answer Required fields: code.

hr.jurisdiction.change.raise

Write. Scope: hr.write, admin. Contract: route_inferred. Report a change in the law; a high or critical one suspends every lane in that jurisdiction at once Required fields: pack_key, summary, severity.

hr.jurisdiction.coverage

Read. Scope: hr.read, admin. Contract: declared_dynamic. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests

hr.jurisdiction.explain

Read. Scope: hr.read, admin. Contract: route_inferred. Why an action about one person is allowed, reduced or blocked, with the rule and citation Required fields: person_uuid, feature.

hr.jurisdiction.pack.release

Write. Scope: hr.write, admin. Contract: route_inferred. Put a drafted policy pack into effect; refused without a named counsel owner and a cited law Required fields: release_uuid.

hr.learning.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read courses, paths and enrolments

hr.leave.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read leave types and requests

hr.lifecycle.lanes

Read. Scope: hr.read, admin. Contract: declared_dynamic. Every lifecycle lane with its mode, KPIs and whether a live tool path really exists behind it

hr.marketplace.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read HR connector accounts, conflicts and deliveries

hr.org.tree

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read the organisation tree

hr.people.create

Write. Scope: hr.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.

hr.people.get

Read. Scope: hr.read, admin. Contract: route_inferred. Get one HR person Required fields: person_uuid.

hr.people.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List HR people

hr.people.update

Write. Scope: hr.write, admin. Contract: route_inferred. Update an HR person Required fields: person_uuid, display_name, primary_email.

hr.postings.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List job postings

hr.readiness.read

Read. Scope: hr.read, admin. Contract: declared_dynamic. Run the HR release readiness report

hr.release.verify

Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the four HR release gates (schema, manifest, probe, readiness)

hr.requisitions.create

Write. Scope: hr.write, admin. Contract: route_inferred. Create a requisition Required fields: title, openings, justification.

hr.requisitions.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List requisitions

hr.thread.delete

Write. Scope: hr.write, admin. Contract: route_inferred. Delete a workforce conversation; refused while it is under legal hold Required fields: thread_uuid, reason.

hr.thread.legal_hold

Write. Scope: hr.write, admin. Contract: route_inferred. Place or lift a legal hold on a workforce conversation Required fields: thread_uuid, on, reason.

hr.thread.retention

Write. Scope: hr.write, admin. Contract: route_inferred. Set a conversation's retention class (standard|extended|permanent) Required fields: thread_uuid, retention_class.

hr.threads.retention_sweep

Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the conversation retention sweep; legal holds are never swept

intent (6)

intent.clear

Write. Scope: intent.write, admin. Contract: declared_dynamic. Intent Clear

intent.funnel

Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read the intent funnel

intent.funnel.aggregate

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel Aggregate

intent.funnel.route.intent.funnel

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel

intent.summary

Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read intent summaries

intent.summary.route.intent.summary

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Summary

KB (6)

kb.faq.delete

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Delete Retry-safe with idempotency_key.

kb.faq.generate

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Generate Retry-safe with idempotency_key.

kb.faq.import

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Import Retry-safe with idempotency_key.

kb.faq.list

Read. Scope: kb.read, read, admin. Contract: source_inferred. Kb Faq List

kb.faq.save

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Save Retry-safe with idempotency_key.

kb.faq.set_status

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Set Status Retry-safe with idempotency_key.

knowledge (78)

knowledge.analytics.get

Read. Scope: kb.read, admin. Contract: route_inferred. Help Analytics Get

knowledge.analytics.toggle

Write. Scope: kb.write, admin. Contract: route_inferred. Help Analytics Toggle

knowledge.article.ai.refine

Read. Scope: kb.read, admin. Contract: route_inferred. Help Article Ai Refine

knowledge.article.class.bulk

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Class Bulk

knowledge.article.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Delete

knowledge.article.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Publish

knowledge.article.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Save

knowledge.article.set.category

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Category

knowledge.article.set.public

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Public

knowledge.articles.ai.generate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ai Generate

knowledge.articles.bulk.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Bulk Delete

knowledge.articles.count

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Articles Count

knowledge.articles.get

Read. Scope: kb.read, admin. Contract: explicit. Get one Help Center article Required fields: article_id.

knowledge.articles.ids

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ids

knowledge.articles.list

Read. Scope: kb.read, admin. Contract: route_inferred. Help Articles List

knowledge.articles.set.public.all

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Set Public All

knowledge.categories.ai.merge

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Ai Merge

knowledge.categories.bulk.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Categories Bulk Delete

knowledge.categories.list

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Categories List

knowledge.categories.merge.dupes

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Merge Dupes

knowledge.category.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Delete

knowledge.category.get

Read. Scope: kb.read, admin. Contract: route_inferred. Help Category Get

knowledge.category.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Save

knowledge.center.article.image.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Article Image Upload

knowledge.center.favicon.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Favicon Upload

knowledge.center.hero.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Dark Upload

knowledge.center.hero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Upload

knowledge.center.logo.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Dark Upload

knowledge.center.logo.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Upload

knowledge.center.og.image.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Og Image Upload

knowledge.center.settings.get

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Settings Get

knowledge.center.settings.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Settings Save

knowledge.center.subhero.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Dark Upload

knowledge.center.subhero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Upload

knowledge.center.translate.estimate

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Estimate

knowledge.center.translate.run

Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Translate Run

knowledge.center.translate.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Translate Status

knowledge.center.translate.stop

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Stop

knowledge.center.widget.hero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Hero Upload

knowledge.center.widget.icon.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Icon Upload

knowledge.comments.deliver.notifications

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Deliver Notifications

knowledge.comments.moderate

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Moderate

knowledge.comments.moderation.list

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Comments Moderation List

knowledge.import.batches

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Batches

knowledge.import.connectors

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Import Connectors

knowledge.import.csv.preview

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Import Csv Preview

knowledge.import.preview

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Preview

knowledge.import.resync

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Resync

knowledge.import.run

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Run

knowledge.import.undo

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Undo

knowledge.insights.generate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Insights Generate

knowledge.insights.get

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Insights Get

knowledge.mark.reviewed

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Mark Reviewed

knowledge.missed.dismiss

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Dismiss

knowledge.missed.draft.article

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Draft Article

knowledge.missed.list

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Missed List

knowledge.missed.mark.published

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Mark Published

knowledge.missed.refresh

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Missed Refresh

knowledge.organize.descriptions

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Descriptions

knowledge.organize.status

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Status

knowledge.organize.step

Write. Scope: kb.write, admin. Contract: route_inferred. Help Organize Step

knowledge.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Publish

knowledge.reformat.revert

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Reformat Revert

knowledge.reformat.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Reformat Status

knowledge.reformat.step

Write. Scope: kb.write, admin. Contract: route_inferred. Help Reformat Step

knowledge.review.queue

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Review Queue

knowledge.search.gaps

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Search Gaps

knowledge.set.featured

Write. Scope: kb.write, admin. Contract: route_inferred. Help Set Featured

knowledge.set.visibility

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Set Visibility

knowledge.subdomain.allocate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Allocate

knowledge.subdomain.check

Read. Scope: kb.read, admin. Contract: route_inferred. Help Subdomain Check

knowledge.subdomain.release

Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Release

knowledge.taxonomy.organize

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Taxonomy Organize

knowledge.taxonomy.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Taxonomy Status

knowledge.taxonomy.step

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Taxonomy Step

knowledge.widget.categories

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Categories

knowledge.widget.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Widget Publish

knowledge.widget.targets

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Targets

leads (6)

leads.delete

Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Delete a lead Required fields: lead_id.

leads.delete.route.lead.delete

Write. Scope: leads.write, admin. Contract: route_inferred. Lead Delete

leads.list

Read. Scope: leads.read, crm.read, admin. Contract: route_inferred. List leads

leads.stats

Read. Scope: leads.read, analytics.read, admin. Contract: declared_dynamic. Get lead statistics

leads.stats.route.leads.stats

Read. Scope: leads.read, admin. Contract: declared_dynamic. Leads Stats

leads.update

Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Update a lead Required fields: lead_id, status.

méta (4)

meta.action

Read. Scope: none. Contract: explicit. Get one General API action contract Required fields: name.

meta.actions

Read. Scope: none. Contract: explicit. List the complete General API contract

meta.me

Read. Scope: none. Contract: explicit. Describe the authenticated API key and active workspace

meta.scopes

Read. Scope: none. Contract: explicit. List API scopes and the actions protected by each scope

notifications (1)

notifications.list

Read. Scope: notifications.read, admin. Contract: source_inferred. Notifications List

plateforme (926)

platform.add.announcement

Write. Scope: platform.write, admin. Contract: declared_dynamic. Add Announcement

platform.add.kb.article

Write. Scope: platform.write, admin. Contract: route_inferred. Add Kb Article

platform.add.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Add Todo Item

platform.ai.action.lookup

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Action Lookup

platform.ai.anomaly.detect

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Anomaly Detect

platform.ai.brain.add

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Add

platform.ai.brain.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Delete

platform.ai.brain.edit

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Edit

platform.ai.brain.list

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain List

platform.ai.brain.pin

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Pin

platform.ai.brain.status

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Status

platform.ai.chat

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Chat

platform.ai.confidence.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Confidence Stats

platform.ai.context.lookup

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Context Lookup

platform.ai.daily.brief

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief

platform.ai.daily.brief.check

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Daily Brief Check

platform.ai.daily.brief.dismiss

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Daily Brief Dismiss

platform.ai.daily.brief.fetch

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief Fetch

platform.ai.eval.control.summary

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Control Summary

platform.ai.eval.feedback.queue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Feedback Queue

platform.ai.eval.kb.gap.queue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Kb Gap Queue

platform.ai.eval.load

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Load

platform.ai.eval.replay.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Replay History

platform.ai.eval.run

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Run

platform.ai.eval.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Save

platform.ai.eval.score.answer

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Score Answer

platform.ai.eval.simulate

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Eval Simulate

platform.ai.feedback.analysis

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Analysis

platform.ai.feedback.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Stats

platform.ai.history.archive

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Archive

platform.ai.history.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Clear All

platform.ai.history.delete

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Delete

platform.ai.history.export.csv

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Export Csv

platform.ai.history.get

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Get

platform.ai.history.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History List

platform.ai.history.stats

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Stats

platform.ai.insight.clear

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Clear

platform.ai.insight.history

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight History

platform.ai.insight.report.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Report Delete

platform.ai.insight.report.get

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight Report Get

platform.ai.instructions.compress

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Compress

platform.ai.instructions.connector.templates

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Connector Templates

platform.ai.instructions.example

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Example

platform.ai.instructions.load

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Load

platform.ai.instructions.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Instructions Preview

platform.ai.instructions.reset

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Reset

platform.ai.instructions.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Save

platform.ai.page.insights

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Page Insights

platform.ai.popup.regen

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Popup Regen

platform.ai.quality.view

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Quality View

platform.ai.reasoning.chain.get

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Reasoning Chain Get

platform.ai.score.lead

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Score Lead

platform.ai.smart.alerts

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Smart Alerts

platform.ai.spoke

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Spoke

platform.ai.triage.accuracy

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Triage Accuracy

platform.ai.whmcs.chat

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Whmcs Chat

platform.ai.writing

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Writing

platform.api.keys.catalog

Read. Scope: admin. Contract: declared_dynamic. Api Keys Catalog

platform.api.keys.create

Write. Scope: admin. Contract: route_inferred. Api Keys Create

platform.api.keys.delete

Write. Scope: admin. Contract: route_inferred. Api Keys Delete

platform.api.keys.list

Read. Scope: admin. Contract: declared_dynamic. Api Keys List

platform.api.keys.revoke

Write. Scope: admin. Contract: route_inferred. Api Keys Revoke

platform.api.keys.update

Write. Scope: admin. Contract: route_inferred. Api Keys Update

platform.audit.export

Read. Scope: admin. Contract: route_inferred. Audit Export

platform.blocked

Write. Scope: platform.write, admin. Contract: route_inferred. Blocked

platform.campaigns

Read. Scope: platform.read, admin. Contract: declared_dynamic. Campaigns

platform.chart.browsers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Browsers

platform.chart.countries

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Countries

platform.chart.devices

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Devices

platform.chart.hourly

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Hourly

platform.chart.new.returning

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart New Returning

platform.chart.os

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Os

platform.chart.sources

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Sources

platform.chart.visitors

Read. Scope: platform.read, admin. Contract: route_inferred. Chart Visitors

platform.chatbot.flow.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Delete

platform.chatbot.flow.get

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Get

platform.chatbot.flow.save

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Save

platform.chatbot.flow.stats

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Stats

platform.chatbot.flow.test.advance

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Advance

platform.chatbot.flow.test.start

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Start

platform.chatbot.flow.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Toggle

platform.chatbot.flows.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chatbot Flows List

platform.chatbot.node.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Delete

platform.chatbot.node.save

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Save

platform.chatbot.nodes.list

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Nodes List

platform.clear.admin.chat.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Clear Admin Chat History

platform.command.center.view

Read. Scope: platform.read, admin. Contract: declared_dynamic. Command Center View

platform.commerce.actf.execute

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Execute

platform.commerce.actf.policy.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Policy Save

platform.commerce.actf.review

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Review

platform.commerce.actf.simulate

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Simulate

platform.commerce.analytics.report

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report

platform.commerce.analytics.report.email

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report Email

platform.commerce.autonomy.issue

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Autonomy Issue

platform.commerce.autonomy.status

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Autonomy Status

platform.commerce.collections.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Collections Delete

platform.commerce.collections.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Collections Save

platform.commerce.customer.block

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Block

platform.commerce.customer.credit.add

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Credit Add

platform.commerce.customer.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Save

platform.commerce.customers.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Customers List

platform.commerce.digital.codes.import

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Codes Import

platform.commerce.digital.config.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Config Save

platform.commerce.digital.file.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Digital File Upload

platform.commerce.fulfilment.transition

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Fulfilment Transition

platform.commerce.intelligence.economics.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Economics Save

platform.commerce.intelligence.market.price.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Price Save

platform.commerce.intelligence.market.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Save

platform.commerce.kit.apply

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Kit Apply

platform.commerce.kit.preview

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Kit Preview

platform.commerce.kits.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Kits List

platform.commerce.launch.readiness

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Launch Readiness

platform.commerce.menu.ai.build

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menu Ai Build

platform.commerce.menus.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menus Save

platform.commerce.merchandising.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Merchandising Save

platform.commerce.midmarket.operations

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Midmarket Operations

platform.commerce.onboarding.ai.draft

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Ai Draft

platform.commerce.onboarding.apply

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Apply

platform.commerce.option.sets.generate

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Option Sets Generate

platform.commerce.option.sets.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Option Sets Save

platform.commerce.option.templates

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Option Templates

platform.commerce.order.refundable

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Refundable

platform.commerce.order.ship

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Order Ship

platform.commerce.order.shipments

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Shipments

platform.commerce.orders.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Orders List

platform.commerce.orders.transition

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Orders Transition

platform.commerce.page.ai.draft

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Draft

platform.commerce.page.ai.refine

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Refine

platform.commerce.page.render

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Render

platform.commerce.pages.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Pages Delete

platform.commerce.pages.list

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages List

platform.commerce.pages.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages Save

platform.commerce.price.advice

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Price Advice

platform.commerce.products.ai.copy

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Ai Copy

platform.commerce.products.bulk

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Bulk

platform.commerce.products.catalog.meta

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Catalog Meta

platform.commerce.products.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Delete

platform.commerce.products.duplicate

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Duplicate

platform.commerce.products.export.csv

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Export Csv

platform.commerce.products.image.alt.ai

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Image Alt Ai

platform.commerce.products.image.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Delete

platform.commerce.products.image.update

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Image Update

platform.commerce.products.image.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Upload

platform.commerce.products.images.list

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Images List

platform.commerce.products.images.reorder

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Images Reorder

platform.commerce.products.import.csv

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Import Csv

platform.commerce.products.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products List

platform.commerce.products.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Save

platform.commerce.refunds.complete.manual

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Complete Manual

platform.commerce.refunds.request

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Request

platform.commerce.returns.transition

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Returns Transition

platform.commerce.size.charts.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Size Charts Delete

platform.commerce.size.charts.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Size Charts Save

platform.commerce.store.maturity

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Store Maturity

platform.commerce.storefront.brand.import

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Brand Import

platform.commerce.storefront.domain.remove

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Remove

platform.commerce.storefront.domain.set

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Set

platform.commerce.storefront.logo.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Logo Upload

platform.commerce.storefront.page.ai.seo

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Storefront Page Ai Seo

platform.commerce.storefront.slug.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Storefront Slug Save

platform.commerce.supply.chain

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Supply Chain

platform.commerce.variants.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Variants Delete

platform.commerce.variants.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Variants Save

platform.commerce.wallet.topup.refund

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Wallet Topup Refund

platform.commerce.wallet.topups.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Wallet Topups List

platform.complete.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Complete Todo Item

platform.consent.log.list

Read. Scope: platform.read, admin. Contract: route_inferred. Consent Log List

platform.countries

Read. Scope: platform.read, admin. Contract: declared_dynamic. Countries

platform.country.detail

Read. Scope: platform.read, admin. Contract: route_inferred. Country Detail

platform.custom.code.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Approve

platform.custom.code.disable

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Disable

platform.custom.code.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Reject

platform.custom.code.rollback

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Rollback

platform.custom.code.status

Read. Scope: platform.read, admin. Contract: route_inferred. Custom Code Status

platform.delete.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Delete Todo Item

platform.devices

Read. Scope: platform.read, admin. Contract: declared_dynamic. Devices

platform.diag.check.resolutions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Check Resolutions

platform.diag.dismiss

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Dismiss

platform.diag.event.taxonomy

Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Event Taxonomy

platform.diag.identity.restitch

Write. Scope: admin. Contract: declared_dynamic. Diag Identity Restitch

platform.diag.recheck

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Recheck

platform.diag.recheck.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Diag Recheck All

platform.diag.report

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Report

platform.diag.unmute

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Unmute

platform.dismiss.credit.alert

Write. Scope: admin. Contract: route_inferred. Dismiss Credit Alert

platform.domain.knowledge.ai.generate

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Ai Generate

platform.domain.knowledge.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Delete

platform.domain.knowledge.list

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge List

platform.domain.knowledge.save

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Save

platform.domain.knowledge.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Toggle

platform.domain.verify.add

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Add

platform.domain.verify.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Domain Verify List

platform.domain.verify.recheck

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Recheck

platform.domain.verify.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Remove

platform.dynamic.action.dispatch

Write. Scope: platform.write, admin. Contract: route_inferred. Dynamic Action Dispatch

platform.events.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Events Clear All

platform.events.list

Read. Scope: platform.read, admin. Contract: route_inferred. Events List

platform.experiment.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Delete

platform.experiment.results

Read. Scope: platform.read, admin. Contract: route_inferred. Experiment Results

platform.experiment.save

Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Save

platform.experiments.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Experiments Clear All

platform.experiments.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Experiments List

platform.failed.logins.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear All

platform.failed.logins.clear.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear History

platform.failed.logins.journey

Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Journey

platform.failed.logins.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins List

platform.failed.logins.unblock

Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Unblock

platform.feedback.analysis.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Analysis Get

platform.feedback.analysis.run

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Analysis Run

platform.feedback.analytics.all

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics All

platform.feedback.analytics.detractors

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Detractors

platform.feedback.analytics.metrics

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Metrics

platform.feedback.analytics.overview

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Overview

platform.feedback.analytics.segments

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Segments

platform.feedback.analytics.sentiment

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Sentiment

platform.feedback.analytics.themes

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Themes

platform.feedback.analytics.trends

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Trends

platform.feedback.assignees.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Assignees List

platform.feedback.event.outbox.drain

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Event Outbox Drain

platform.feedback.exports.create

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Exports Create

platform.feedback.exports.get

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Exports Get

platform.feedback.external.review.ingest

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback External Review Ingest

platform.feedback.ingest.create

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Ingest Create

platform.feedback.items.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Assign

platform.feedback.items.evidence

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Evidence

platform.feedback.items.follow.up.complete

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Complete

platform.feedback.items.follow.up.set

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Set Required fields: bool.

platform.feedback.items.get

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Get

platform.feedback.items.list

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items List

platform.feedback.items.mark.read

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Mark Read

platform.feedback.items.notes.add

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Notes Add

platform.feedback.items.set.priority

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Priority

platform.feedback.items.set.status

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Status

platform.feedback.items.tags.add

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Add

platform.feedback.items.tags.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Remove

platform.feedback.list

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback List

platform.feedback.reconciliation

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reconciliation

platform.feedback.reports.delete

Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Reports Delete

platform.feedback.reports.email

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Email

platform.feedback.reports.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Get

platform.feedback.reports.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports List

platform.feedback.satisfaction.advice.last

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advice Last

platform.feedback.satisfaction.advise

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advise

platform.feedback.satisfaction.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Overview

platform.feedback.sources.health

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources Health

platform.feedback.sources.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources List

platform.feedback.sources.rebuild

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Rebuild

platform.feedback.sources.replay

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Replay

platform.feedback.stats

Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Stats

platform.fx.refresh.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. Fx Refresh Now

platform.geoip.autodetect

Read. Scope: platform.read, admin. Contract: declared_dynamic. Geoip Autodetect

platform.get.admin.chat.history

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Admin Chat History

platform.get.ai.snapshot

Write. Scope: platform.write, admin. Contract: route_inferred. Get Ai Snapshot

platform.get.campaign.groups

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Campaign Groups

platform.get.client.chat.knowledge.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Client Chat Knowledge Overview

platform.get.kb.categories

Read. Scope: platform.read, admin. Contract: route_inferred. Get Kb Categories

platform.get.live.health.snapshot

Read. Scope: platform.read, admin. Contract: route_inferred. Get Live Health Snapshot

platform.get.pwa.chat.prefs

Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Pwa Chat Prefs

platform.get.servers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Servers

platform.get.survey.config

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Survey Config

platform.get.ticket.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Ticket Options

platform.get.ticket.thread

Read. Scope: platform.read, admin. Contract: route_inferred. Get Ticket Thread

platform.get.todo.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Todo List

platform.get.widget.advanced

Read. Scope: platform.read, admin. Contract: route_inferred. Get Widget Advanced

platform.governance.summary

Read. Scope: platform.read, admin. Contract: route_inferred. Governance Summary

platform.groups.create

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Create

platform.groups.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Delete

platform.groups.list

Write. Scope: platform.write, admin. Contract: route_inferred. Groups List

platform.groups.rename

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Rename

platform.groups.set.primary

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Set Primary

platform.hc.preview.mint

Read. Scope: platform.read, admin. Contract: route_inferred. Hc Preview Mint

platform.hc.template.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Apply

platform.hc.template.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Delete

platform.hc.template.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hc Template Preview

platform.hc.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Save

platform.hc.templates.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Templates List

platform.hc.translation.review.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review Get

platform.hc.translation.review.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review List

platform.hc.translation.review.revert

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Revert

platform.hc.translation.review.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Save

platform.heatmap

Read. Scope: platform.read, admin. Contract: route_inferred. Heatmap

platform.hr.access.grant.manual

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Grant Manual

platform.hr.access.policy.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Access Policy List

platform.hr.access.policy.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Policy Set

platform.hr.access.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Request

platform.hr.access.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Revoke

platform.hr.accommodation.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Accommodation List

platform.hr.accommodation.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Accommodation Resolve

platform.hr.agent.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Assign

platform.hr.agent.compensation.retry

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Compensation Retry

platform.hr.agent.compensation.sweep

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Agent Compensation Sweep

platform.hr.agent.compensations

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Compensations

platform.hr.agent.incident.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Incident Close

platform.hr.agent.register

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Register

platform.hr.agent.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Step

platform.hr.agent.step.status

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Agent Step Status

platform.hr.agent.tool.auth

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Auth

platform.hr.agent.tool.grant

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Grant

platform.hr.agent.tools

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Tools

platform.hr.ai.act.build

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Ai Act Build

platform.hr.ai.act.export

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Export

platform.hr.ai.act.fria.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Fria Record

platform.hr.ai.act.notice.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Notice Publish

platform.hr.ai.act.overseer.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Assign

platform.hr.ai.act.overseer.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Revoke

platform.hr.ai.act.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Overview

platform.hr.ai.metering.export

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Export

platform.hr.ai.metering.overview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Overview

platform.hr.ai.metering.settings.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Metering Settings Save

platform.hr.ai.status

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Status

platform.hr.analytics.ask

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Analytics Ask

platform.hr.analytics.snapshot

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Analytics Snapshot

platform.hr.app.move

Write. Scope: platform.write, admin. Contract: route_inferred. Hr App Move

platform.hr.appeal.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Appeal List

platform.hr.appeal.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Appeal Resolve

platform.hr.application.history

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Application History

platform.hr.application.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Application List

platform.hr.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Assign

platform.hr.auto.offer.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Auto Offer Run

platform.hr.autonomy.lane.demote

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Demote

platform.hr.autonomy.lane.install

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Autonomy Lane Install

platform.hr.autonomy.lane.promote

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Promote

platform.hr.autonomy.lane.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Autonomy Lane Review

platform.hr.autonomy.lane.shadow

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Shadow

platform.hr.autonomy.lanes

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Lanes

platform.hr.autonomy.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Overview

platform.hr.availability.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Availability Save

platform.hr.band.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Approve

platform.hr.band.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Band List

platform.hr.band.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Save

platform.hr.benchmarks.contribute.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Contribute Now

platform.hr.benchmarks.opt.in

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benchmarks Opt In

platform.hr.benchmarks.opt.out

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Opt Out

platform.hr.benchmarks.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Benchmarks Overview

platform.hr.benefit.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Enroll

platform.hr.benefit.plan.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Plan Save

platform.hr.bias.audit.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Bias Audit List

platform.hr.bias.audit.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Bias Audit Run

platform.hr.booking.link.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Booking Link Save

platform.hr.booking.slots.reconcile

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Booking Slots Reconcile

platform.hr.breaker.reset

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Breaker Reset

platform.hr.broadcast.audience.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast Audience Options

platform.hr.broadcast.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast List

platform.hr.broadcast.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Broadcast Preview

platform.hr.broadcast.send

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Broadcast Send

platform.hr.budget.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Budget Set

platform.hr.calibration.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Close

platform.hr.calibration.move

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Move

platform.hr.calibration.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Open

platform.hr.capabilities.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capabilities Get

platform.hr.capability.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Capability Set

platform.hr.capability.trail

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capability Trail

platform.hr.cards.refresh

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Cards Refresh

platform.hr.case.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Assign

platform.hr.case.attachment.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Attachment Add

platform.hr.case.attachment.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Attachment List

platform.hr.case.categories

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case Categories

platform.hr.case.event.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Event Add

platform.hr.case.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Get

platform.hr.case.grant.access

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Grant Access

platform.hr.case.intake.mailbox

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Intake Mailbox

platform.hr.case.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case List

platform.hr.case.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Open

platform.hr.case.route

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Route

platform.hr.case.thread

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Thread

platform.hr.case.tighten

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Tighten

platform.hr.certification.define

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification Define

platform.hr.certification.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification List

platform.hr.certification.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification Record

platform.hr.certification.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification State

platform.hr.certification.types

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Certification Types

platform.hr.check.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Check List

platform.hr.check.manual.result

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Manual Result

platform.hr.check.order

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Order

platform.hr.check.requery

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Requery

platform.hr.check.void

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Void

platform.hr.checkin.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Checkin Record

platform.hr.coach.feedback

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Coach Feedback

platform.hr.coach.me

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Coach Me

platform.hr.coach.receive

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Coach Receive

platform.hr.comp.change.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Approve

platform.hr.comp.change.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Request

platform.hr.compliance.build

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Compliance Build

platform.hr.compliance.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Compliance List

platform.hr.connector.cert.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Revoke

platform.hr.connector.cert.submissions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Connector Cert Submissions

platform.hr.connector.cert.submit

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Submit

platform.hr.connector.certify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Certify

platform.hr.connector.health

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Health

platform.hr.connector.options

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Options

platform.hr.connector.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Revoke

platform.hr.contract.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Contract List

platform.hr.copilot.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Apply

platform.hr.copilot.plan

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Copilot Plan

platform.hr.copilot.recipes

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Copilot Recipes

platform.hr.copilot.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Reject

platform.hr.correction.dataset.build

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Correction Dataset Build

platform.hr.correction.datasets

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Correction Datasets

platform.hr.correction.privacy.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Correction Privacy Review

platform.hr.course.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Enroll

platform.hr.course.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Save

platform.hr.course.skills.tag

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Skills Tag

platform.hr.decision.appeal.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Assign

platform.hr.decision.appeal.file

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal File

platform.hr.decision.appeal.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Resolve

platform.hr.decision.appeals.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decision Appeals List

platform.hr.decision.explanation

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Decision Explanation

platform.hr.decisions.recent

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decisions Recent

platform.hr.directory.visibility.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Directory Visibility Get

platform.hr.directory.visibility.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Directory Visibility Set

platform.hr.discipline.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Decide

platform.hr.discipline.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Propose

platform.hr.document.access.log

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document Access Log

platform.hr.document.deletion.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Deletion Request

platform.hr.document.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Hold

platform.hr.document.intake

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Intake

platform.hr.document.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document List

platform.hr.document.requirement.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Add

platform.hr.document.requirement.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Remove

platform.hr.document.review.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Review Approve

platform.hr.document.reviews

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Document Reviews

platform.hr.dsr.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Dsr List

platform.hr.dsr.transition

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Dsr Transition

platform.hr.email.intake.log

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Email Intake Log

platform.hr.employee.access.events

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Employee Access Events

platform.hr.employee.provision

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Provision

platform.hr.employee.restore

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Restore

platform.hr.employee.suspend

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Suspend

platform.hr.employment.activate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment Activate

platform.hr.employment.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment End

platform.hr.enterprise.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Enterprise Approve

platform.hr.equipment.delivered

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Delivered

platform.hr.equipment.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Request

platform.hr.equipment.returned

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Returned

platform.hr.escrow.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Escrow Resolve

platform.hr.evidence.a11y.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence A11y Record

platform.hr.evidence.attest

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Attest

platform.hr.evidence.dr.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Dr Record

platform.hr.evidence.ledgers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Evidence Ledgers

platform.hr.evidence.load.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Load Record

platform.hr.evidence.owner.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Owner Assign

platform.hr.expense.confirm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Confirm

platform.hr.expense.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Decide

platform.hr.expense.handoff

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Handoff

platform.hr.expense.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Expense Overview

platform.hr.expense.policy.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Policy Save

platform.hr.experience.metrics

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Experience Metrics

platform.hr.expiry.run

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Expiry Run

platform.hr.fairness.cohort.define

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Cohort Define

platform.hr.fairness.cohorts

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Fairness Cohorts

platform.hr.fairness.evaluate

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Evaluate

platform.hr.faq.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Delete

platform.hr.faq.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Draft

platform.hr.faq.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Faq List

platform.hr.faq.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Save

platform.hr.faq.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq State

platform.hr.feedback.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Feedback List

platform.hr.feedback.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Feedback Record

platform.hr.flag.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Flag Set

platform.hr.flags.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Flags Get

platform.hr.frontline.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Frontline Overview

platform.hr.gig.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Decide

platform.hr.gig.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Post

platform.hr.global.readiness

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Global Readiness

platform.hr.goal.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Create

platform.hr.goal.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Draft

platform.hr.goal.update

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Update

platform.hr.grievance.file

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance File

platform.hr.grievance.outcome

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance Outcome

platform.hr.headcount.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Approve

platform.hr.headcount.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Draft

platform.hr.headcount.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Headcount List

platform.hr.hire

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hire

platform.hr.hiring.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hiring Decide

platform.hr.holiday.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Holiday Save

platform.hr.identity.admin.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Admin Options

platform.hr.identity.conflict.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Conflict Resolve

platform.hr.identity.coverage.plan

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Coverage Plan

platform.hr.identity.facets

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Identity Facets

platform.hr.identity.history

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity History

platform.hr.identity.link

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Link

platform.hr.identity.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Revoke

platform.hr.identity.verification.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Verification Record

platform.hr.incident.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Incident List

platform.hr.incident.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Open

platform.hr.incident.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Step

platform.hr.interview.recording.start

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Start

platform.hr.interview.recording.upload

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Upload

platform.hr.interview.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Review

platform.hr.interview.room.answer

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Answer

platform.hr.interview.room.ask

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Ask

platform.hr.interview.room.connect

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Connect

platform.hr.interview.room.consent

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Consent

platform.hr.interview.room.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room End

platform.hr.interview.room.leave

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Leave

platform.hr.interview.room.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Interview Room List

platform.hr.interview.room.observe

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Observe

platform.hr.interview.room.pause

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Pause

platform.hr.interview.room.provision

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Provision

platform.hr.interview.room.reconnect

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Reconnect

platform.hr.interview.room.resume

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Resume

platform.hr.interview.room.state

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room State

platform.hr.interview.room.takeover

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Takeover

platform.hr.interview.schedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Schedule

platform.hr.interview.transcript.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Transcript Correct

platform.hr.investigation.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Close

platform.hr.investigation.finding

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Finding

platform.hr.investigation.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Hold

platform.hr.investigation.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Open

platform.hr.investigation.triage

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Investigation Triage

platform.hr.iplan.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Approve

platform.hr.iplan.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Create

platform.hr.iplan.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Iplan List

platform.hr.iscore.human

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Human

platform.hr.iscore.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Run

platform.hr.isession.attach.meeting

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Attach Meeting

platform.hr.isession.control

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Control

platform.hr.isession.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Isession List

platform.hr.isession.liveness

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Isession Liveness

platform.hr.isession.schedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Schedule

platform.hr.job.arch.analyse

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Job Arch Analyse

platform.hr.job.arch.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Apply

platform.hr.job.arch.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Approve

platform.hr.job.arch.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Job Arch Overview

platform.hr.job.arch.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Propose

platform.hr.job.arch.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Reject

platform.hr.job.family.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Family Save

platform.hr.job.level.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Level Save

platform.hr.job.profile.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Profile Save

platform.hr.job.version.draft.ai

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Draft Ai

platform.hr.job.version.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Publish

platform.hr.job.version.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Save

platform.hr.job.versions

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Job Versions

platform.hr.jurisdiction.capabilities

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Capabilities

platform.hr.jurisdiction.case.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Run

platform.hr.jurisdiction.case.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Save

platform.hr.jurisdiction.change.assess

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Assess

platform.hr.jurisdiction.change.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Close

platform.hr.jurisdiction.change.raise

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Raise

platform.hr.jurisdiction.coverage

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Coverage

platform.hr.jurisdiction.explain

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Explain

platform.hr.jurisdiction.overlay.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Overlay List

platform.hr.jurisdiction.overlay.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Overlay Save

platform.hr.jurisdiction.pack.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Draft

platform.hr.jurisdiction.pack.release

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Release

platform.hr.jurisdiction.pack.withdraw

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Withdraw

platform.hr.jurisdiction.release.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Release List

platform.hr.jurisdiction.rule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Rule Save

platform.hr.jurisdiction.source.declare

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Source Declare

platform.hr.jurisdiction.transfer.declare

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Transfer Declare

platform.hr.kill.flip

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Flip

platform.hr.kill.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Toggle

platform.hr.kiosk.register

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Register

platform.hr.kiosk.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Revoke

platform.hr.knowledge.pack.install

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Install

platform.hr.knowledge.pack.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Remove

platform.hr.knowledge.packs

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Knowledge Packs

platform.hr.leadership.score

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leadership Score

platform.hr.learning.assign.mandatory

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Learning Assign Mandatory

platform.hr.learning.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Learning Overview

platform.hr.leave.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Decide

platform.hr.leave.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leave Overview

platform.hr.leave.policy.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Policy Save

platform.hr.leave.type.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Type Save

platform.hr.letter.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Letter Issue

platform.hr.letter.kinds

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Letter Kinds

platform.hr.letter.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Letter Preview

platform.hr.listening.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Close

platform.hr.listening.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Listening Overview

platform.hr.listening.run.due

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Listening Run Due

platform.hr.listening.schedule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule Save

platform.hr.listening.schedule.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule State

platform.hr.loop.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Approve

platform.hr.loop.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Correct

platform.hr.loop.evaluate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Evaluate

platform.hr.loop.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Loop Overview

platform.hr.loop.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Propose

platform.hr.loop.release

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Release

platform.hr.loop.rollback

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Rollback

platform.hr.loop.snapshot

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Snapshot

platform.hr.marketplace.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Marketplace Overview

platform.hr.meeting.book

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Book

platform.hr.meeting.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Cancel

platform.hr.meeting.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Propose

platform.hr.meeting.reschedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Reschedule

platform.hr.meetings.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Meetings Overview

platform.hr.meetings.reconcile

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Meetings Reconcile

platform.hr.mentor.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Mentor Propose

platform.hr.module.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Module Toggle

platform.hr.new.hire.checkin.state

Read. Scope: platform.read, admin. Contract: route_inferred. Hr New Hire Checkin State

platform.hr.offer.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Approve

platform.hr.offer.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Draft

platform.hr.offer.esign.confirm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Esign Confirm

platform.hr.offer.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Offer List

platform.hr.offer.send

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Send

platform.hr.offer.withdraw

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Withdraw

platform.hr.onboarding.checkins.book

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Checkins Book

platform.hr.onboarding.draft.tasks

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Draft Tasks

platform.hr.onboarding.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Onboarding Overview

platform.hr.onboarding.plan.buddy

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Buddy

platform.hr.onboarding.plan.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Close

platform.hr.onboarding.plan.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Create

platform.hr.onboarding.task.block

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Block

platform.hr.onboarding.task.done

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Done

platform.hr.onboarding.task.skip

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Task Skip

platform.hr.onboarding.task.unblock

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Unblock

platform.hr.onboarding.task.verify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Verify

platform.hr.onboarding.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Template Save

platform.hr.one.on.one.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr One On One List

platform.hr.one.on.one.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr One On One Record

platform.hr.opportunity.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Decide

platform.hr.opportunity.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Post

platform.hr.org.chart

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Chart

platform.hr.org.legal.entities

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Legal Entities

platform.hr.org.legal.entity.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Legal Entity Create

platform.hr.org.location.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Location Create

platform.hr.org.locations

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Locations

platform.hr.org.map.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Org Map Overview

platform.hr.org.map.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Remove

platform.hr.org.map.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Save

platform.hr.org.tree

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Tree

platform.hr.org.unit.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Unit Create

platform.hr.org.unit.move

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Org Unit Move

platform.hr.override.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Override Record

platform.hr.overtime.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Overtime Decide

platform.hr.path.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Enroll

platform.hr.path.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Save

platform.hr.pay.equity.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Pay Equity Overview

platform.hr.pay.gap.evaluate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pay Gap Evaluate

platform.hr.payroll.import

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Import

platform.hr.payroll.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Overview

platform.hr.payroll.provider.exceptions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Provider Exceptions

platform.hr.payroll.reconcile

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Reconcile

platform.hr.payslips.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payslips Issue

platform.hr.people.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr People List

platform.hr.perf.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Perf Overview

platform.hr.person.create

Write. Scope: platform.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.

platform.hr.person.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Get

platform.hr.person.identifier.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Identifier Add

platform.hr.person.identifier.read

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifier Read

platform.hr.person.identifiers

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifiers

platform.hr.person.update

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Update

platform.hr.pilot.outcome.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pilot Outcome Record

platform.hr.pipeline

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pipeline

platform.hr.policy.activate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Activate

platform.hr.policy.compile

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Compile

platform.hr.pool.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Create

platform.hr.pool.member.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Add

platform.hr.pool.member.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Remove

platform.hr.pool.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pool Overview

platform.hr.portal.address

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Portal Address

platform.hr.portal.slug.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Portal Slug Save

platform.hr.position.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Assign

platform.hr.position.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Create

platform.hr.position.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Position Overview

platform.hr.position.profile.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Profile Set

platform.hr.position.reports.to

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Reports To

platform.hr.position.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position State

platform.hr.position.vacate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Vacate

platform.hr.posting.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Close

platform.hr.posting.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Create

platform.hr.posting.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Posting List

platform.hr.posting.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Publish

platform.hr.probation.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Open

platform.hr.probation.review

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Review

platform.hr.profile.address.format

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Address Format

platform.hr.profile.address.write

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Address Write

platform.hr.profile.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Decide

platform.hr.profile.ownership.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Ownership Get

platform.hr.profile.ownership.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Ownership Set

platform.hr.profile.pending

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Pending

platform.hr.profile.photo.clear

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Clear

platform.hr.profile.photo.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Set

platform.hr.profile.reveal

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Reveal

platform.hr.profile.section.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section End

platform.hr.profile.section.write

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section Write

platform.hr.profile.sections

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Sections

platform.hr.pulse.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Close

platform.hr.pulse.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Issue

platform.hr.pulse.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pulse List

platform.hr.pulse.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Open

platform.hr.pulse.results

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Pulse Results

platform.hr.quality.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Overview

platform.hr.quality.sample.draw

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Quality Sample Draw

platform.hr.quality.samples

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Samples

platform.hr.quality.verdict

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Quality Verdict

platform.hr.queue.agent.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Add

platform.hr.queue.agent.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Remove

platform.hr.queue.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Save

platform.hr.readiness.report

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Readiness Report

platform.hr.recognise

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Recognise

platform.hr.relations.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Relations Overview

platform.hr.release.gates

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Release Gates

platform.hr.release.verify

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Release Verify

platform.hr.req.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Create

platform.hr.req.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Req List

platform.hr.req.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Reject

platform.hr.req.transition

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Transition

platform.hr.review.cycle.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Cycle Open

platform.hr.review.include

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Include

platform.hr.review.respond

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Respond

platform.hr.review.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Template Save

platform.hr.rubric.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Approve

platform.hr.rubric.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Create

platform.hr.rubric.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Rubric List

platform.hr.run.replay

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Replay

platform.hr.run.start

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Start

platform.hr.run.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Step

platform.hr.run.takeover

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Takeover

platform.hr.scenario.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Scenario Run

platform.hr.schedule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Schedule Save

platform.hr.screening.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Correct

platform.hr.screening.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Screening List

platform.hr.screening.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Screening Review

platform.hr.screening.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Run

platform.hr.screening.verify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Verify

platform.hr.security.assurance.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Security Assurance Record

platform.hr.service.item.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Service Item Save

platform.hr.servicedesk.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Servicedesk Overview

platform.hr.shadow.compare

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shadow Compare

platform.hr.shift.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Add

platform.hr.shift.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Assign

platform.hr.signature.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Cancel

platform.hr.signature.confirm

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature Confirm

platform.hr.signature.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature List

platform.hr.signature.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Request

platform.hr.signin.design.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Signin Design Get

platform.hr.signin.design.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Signin Design Save

platform.hr.skill.challenge.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Skill Challenge Resolve

platform.hr.skills.infer.sweep

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Sweep

platform.hr.skills.infer.text

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Text

platform.hr.skills.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Skills Overview

platform.hr.skills.taxonomy.adopt

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Skills Taxonomy Adopt

platform.hr.status

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Status

platform.hr.succession.nominate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Nominate

platform.hr.succession.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Open

platform.hr.succession.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Succession Overview

platform.hr.swap.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Approve

platform.hr.swap.decline

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Decline

platform.hr.sync.conflict.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Sync Conflict Resolve

platform.hr.talent.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Talent Overview

platform.hr.thread.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Delete

platform.hr.thread.dm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Dm

platform.hr.thread.legal.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Legal Hold

platform.hr.thread.outreach

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Outreach

platform.hr.thread.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Post

platform.hr.thread.read

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Read

platform.hr.thread.retention

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Retention

platform.hr.thread.search

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Search

platform.hr.threads.inbox

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Threads Inbox

platform.hr.threads.retention.sweep

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Threads Retention Sweep

platform.hr.time.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Time Decide

platform.hr.time.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Time Overview

platform.hr.title.history

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Title History

platform.hr.title.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Title Record

platform.hr.training.requirement.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Training Requirement Save

platform.hr.truth.register

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Truth Register

platform.hr.turnover.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Turnover Run

platform.hr.verifier.verdict

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Verifier Verdict

platform.hr.wb.grant

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Grant

platform.hr.wb.identity

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Identity

platform.hr.wb.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Wb List

platform.hr.wb.read

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Read

platform.hr.wb.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb State

platform.hr.workforce.dashboard

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Workforce Dashboard

platform.inbound.activity.feed

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Activity Feed

platform.inbound.endpoints.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Delete

platform.inbound.endpoints.list

Write. Scope: admin. Contract: route_inferred. Inbound Endpoints List

platform.inbound.endpoints.save

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Save

platform.inbound.endpoints.test

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Test

platform.interrupted

Read. Scope: platform.read, admin. Contract: declared_dynamic. Interrupted

platform.ip.classify

Read. Scope: platform.read, admin. Contract: route_inferred. Ip Classify

platform.js.errors.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Js Errors Clear All

platform.js.errors.list

Read. Scope: platform.read, admin. Contract: route_inferred. Js Errors List

platform.js.issue.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Assign

platform.js.issue.update

Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Update

platform.js.sourcemap.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Delete

platform.js.sourcemap.upload

Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Upload

platform.js.sourcemaps.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Js Sourcemaps List

platform.leads

Read. Scope: platform.read, admin. Contract: route_inferred. Leads

platform.license.delete

Write. Scope: admin. Contract: declared_dynamic. License Delete

platform.license.diagnostics

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Diagnostics

platform.license.force.check

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Force Check

platform.license.preflight

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Preflight

platform.license.save

Write. Scope: admin. Contract: route_inferred. License Save

platform.license.status

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Status

platform.license.verify.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. License Verify Now

platform.lifecycle.evaluate

Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Evaluate

platform.lifecycle.rule.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Delete

platform.lifecycle.rule.list

Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Rule List

platform.lifecycle.rule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Save

platform.list.assignable.sites

Read. Scope: platform.read, admin. Contract: declared_dynamic. List Assignable Sites

platform.list.network.issues

Read. Scope: platform.read, admin. Contract: declared_dynamic. List Network Issues

platform.lookup.client.full

Read. Scope: platform.read, admin. Contract: route_inferred. Lookup Client Full

platform.mark.feedback.read

Write. Scope: platform.write, admin. Contract: route_inferred. Mark Feedback Read

platform.marketplace.local.install

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Install

platform.marketplace.local.uninstall

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Uninstall

platform.marketplace.session.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Marketplace Session Get

platform.marketplace.session.set

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Session Set

platform.media.ready

Read. Scope: platform.read, admin. Contract: route_inferred. Media Ready

platform.message.contact.locale

Write. Scope: platform.write, admin. Contract: route_inferred. Message Contact Locale

platform.message.outbound.convert

Write. Scope: platform.write, admin. Contract: route_inferred. Message Outbound Convert

platform.message.translate

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translate

platform.message.translation.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Delete

platform.message.translation.save

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Save

platform.meta.channels.disconnect

Write. Scope: platform.write, admin. Contract: declared_dynamic. Meta Channels Disconnect

platform.meta.channels.switch.page

Write. Scope: platform.write, admin. Contract: route_inferred. Meta Channels Switch Page

platform.observe

Read. Scope: platform.read, admin. Contract: declared_dynamic. Observe

platform.onboarding.action

Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Action

platform.onboarding.readiness

Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Readiness

platform.open.network.issue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Open Network Issue

platform.open.ticket

Read. Scope: platform.read, admin. Contract: route_inferred. Open Ticket

platform.operator.text.translate

Write. Scope: platform.write, admin. Contract: route_inferred. Operator Text Translate

platform.opsiq.backup.export

Read. Scope: platform.read, admin. Contract: declared_dynamic. Download a full backup in one request (retired)

platform.opsiq.backup.import

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import

platform.opsiq.backup.import.start

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import Start

platform.opsiq.backup.job.start

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Start

platform.opsiq.backup.job.status

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Status

platform.outreach.campaign.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Delete

platform.outreach.campaign.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Campaign List

platform.outreach.campaign.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Save

platform.outreach.campaign.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Send

platform.outreach.compose.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Compose Send

platform.outreach.draft.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Delete

platform.outreach.draft.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Draft List

platform.outreach.draft.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Save

platform.outreach.messages.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Messages Delete

platform.outreach.replies.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Replies List

platform.outreach.reply.ai

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Ai

platform.outreach.reply.mark

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Mark

platform.outreach.reply.pref

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Pref

platform.outreach.reply.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Send

platform.outreach.reply.thread

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Thread

platform.outreach.send.detail

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Send Detail

platform.outreach.send.retry

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Send Retry

platform.outreach.sends.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Sends List

platform.outreach.template.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Delete

platform.outreach.template.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template List

platform.outreach.template.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template Preview

platform.outreach.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Save

platform.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview

platform.overview.hub.view

Read. Scope: platform.read, admin. Contract: route_inferred. Overview Hub View

platform.overview.intelligence.graph

Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview Intelligence Graph

platform.pages

Read. Scope: platform.read, admin. Contract: route_inferred. Pages

platform.paths.data

Read. Scope: platform.read, admin. Contract: route_inferred. Paths Data

platform.pause

Read. Scope: platform.read, admin. Contract: declared_dynamic. Pause

platform.profile.change.password

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Change Password

platform.profile.get

Read. Scope: platform.read, admin. Contract: route_inferred. Profile Get

platform.profile.reward.claim

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim

platform.profile.reward.claim.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim Cancel

platform.profile.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Save

platform.profile.session.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Session Revoke

platform.profile.sessions.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Profile Sessions List

platform.profile.sessions.revoke.others

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Sessions Revoke Others

platform.profile.team.dispute.file

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Team Dispute File

platform.purge

Write. Scope: admin. Contract: route_inferred. Purge

platform.purge.all

Write. Scope: admin. Contract: route_inferred. Purge All

platform.realtime

Read. Scope: platform.read, admin. Contract: route_inferred. Realtime

platform.realtime.test

Write. Scope: platform.write, admin. Contract: route_inferred. Realtime Test

platform.resume

Read. Scope: platform.read, admin. Contract: declared_dynamic. Resume

platform.retention.data

Read. Scope: platform.read, admin. Contract: route_inferred. Retention Data

platform.routes.list

Read. Scope: admin. Contract: source_inferred. List every registered OpsIQ operation

platform.routes.read

Read. Scope: admin. Contract: explicit. Execute a registered read operation Required fields: route.

platform.routes.write

Write. Scope: admin. Contract: explicit. Execute a registered write operation Required fields: route, idempotency_key. Retry-safe with idempotency_key.

platform.run.ai.analysis

Write. Scope: platform.write, admin. Contract: route_inferred. Run Ai Analysis

platform.save.admin.chat.history

Write. Scope: platform.write, admin. Contract: route_inferred. Save Admin Chat History

platform.save.pwa.chat.prefs

Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Pwa Chat Prefs

platform.save.survey.config

Write. Scope: platform.write, admin. Contract: route_inferred. Save Survey Config

platform.save.widget.advanced

Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Widget Advanced

platform.scim.token.issue

Read. Scope: platform.read, admin. Contract: route_inferred. Scim Token Issue

platform.scim.token.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Scim Token List

platform.scim.token.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Scim Token Revoke

platform.segment.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Delete

platform.segment.list

Read. Scope: platform.read, admin. Contract: route_inferred. Segment List

platform.segment.members

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Members

platform.segment.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Preview

platform.segment.save

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Save

platform.segment.suggestion.accept

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Accept

platform.segment.suggestion.dismiss

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Dismiss

platform.segment.suggestion.list

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Suggestion List

platform.send.campaign

Write. Scope: platform.write, admin. Contract: route_inferred. Send Campaign

platform.send.client.email

Write. Scope: platform.write, admin. Contract: route_inferred. Send Client Email

platform.send.ticket.reply

Write. Scope: platform.write, admin. Contract: route_inferred. Send Ticket Reply

platform.service.studio.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Service Studio Get

platform.set.active.site

Write. Scope: platform.write, admin. Contract: route_inferred. Set Active Site

platform.silence

Read. Scope: platform.read, admin. Contract: declared_dynamic. Silence

platform.site.set.group

Write. Scope: platform.write, admin. Contract: route_inferred. Site Set Group

platform.sites.add

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Add

platform.sites.edit

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Edit

platform.sites.list

Write. Scope: platform.write, admin. Contract: route_inferred. Sites List

platform.sites.picker

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Picker

platform.sites.regenerate.secret

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Regenerate Secret

platform.sites.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Remove

platform.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Stats

platform.stepup.verify

Write. Scope: platform.write, admin. Contract: declared_dynamic. Stepup Verify

platform.submit.agent.ai.feedback

Write. Scope: platform.write, admin. Contract: route_inferred. Submit Agent Ai Feedback

platform.submit.triage.feedback

Write. Scope: platform.write, admin. Contract: route_inferred. Submit Triage Feedback

platform.takeover

Read. Scope: platform.read, admin. Contract: declared_dynamic. Takeover

platform.terminate

Read. Scope: platform.read, admin. Contract: route_inferred. Terminate

platform.test.geoip

Read. Scope: platform.read, admin. Contract: route_inferred. Test Geoip

platform.top.pages

Read. Scope: platform.read, admin. Contract: route_inferred. Top Pages

platform.train.client.chat.knowledge

Write. Scope: platform.write, admin. Contract: route_inferred. Train Client Chat Knowledge

platform.triggers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Triggers

platform.trust.evidence.report

Write. Scope: platform.write, admin. Contract: declared_dynamic. Trust Evidence Report

platform.turn.pool.add

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Add

platform.turn.pool.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Turn Pool List

platform.turn.pool.pick.test

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Pick Test

platform.turn.pool.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Remove

platform.turn.pool.update

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Update

platform.update.lead.status

Write. Scope: platform.write, admin. Contract: route_inferred. Update Lead Status

platform.wa.embedded.signup.exchange

Write. Scope: platform.write, admin. Contract: route_inferred. Wa Embedded Signup Exchange

platform.warehouse.export.run

Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Export Run

platform.warehouse.exports.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Exports List

platform.webhook.deliveries.list

Read. Scope: platform.read, admin. Contract: route_inferred. Webhook Deliveries List

platform.webhook.endpoint.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Delete

platform.webhook.endpoint.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Webhook Endpoint List

platform.webhook.endpoint.save

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Save

platform.webhook.endpoint.test

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Test

platform.webhook.redeliver

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Redeliver

platform.weekly.digest.view

Read. Scope: platform.read, admin. Contract: route_inferred. Weekly Digest View

platform.whmcs.op.dispatch

Read. Scope: platform.read, admin. Contract: declared_dynamic. Whmcs Op Dispatch

platform.workspace.custom.domain.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Remove

platform.workspace.custom.domain.set

Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Set

platform.writing.json.knowledge.clear

Write. Scope: platform.write, admin. Contract: declared_dynamic. Writing Json Knowledge Clear

platform.writing.json.knowledge.count

Read. Scope: platform.read, admin. Contract: declared_dynamic. Writing Json Knowledge Count

platform.writing.json.knowledge.import

Write. Scope: platform.write, admin. Contract: route_inferred. Writing Json Knowledge Import

portal_studio (169)

portal_studio.accessibility.evidence.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Accessibility Evidence Save

portal_studio.add

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Add

portal_studio.allocate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Subdomain Allocate

portal_studio.analytics.breakdown

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Breakdown

portal_studio.analytics.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Load

portal_studio.apply.kit

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Apply Kit

portal_studio.apply.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Apply Theme

portal_studio.approval

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Approval

portal_studio.approve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Approve

portal_studio.ask

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Ask

portal_studio.audience.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Delete

portal_studio.audience.explain

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Explain

portal_studio.audience.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience List

portal_studio.audience.preview

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Preview

portal_studio.audience.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Save

portal_studio.brand.generate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Generate

portal_studio.brand.import

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Import

portal_studio.cancel.schedule

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Cancel Schedule

portal_studio.certify

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Certify

portal_studio.check

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Host Check

portal_studio.check.route.portal.subdomain.check

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Subdomain Check

portal_studio.comment.add

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Add

portal_studio.comment.resolve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Resolve

portal_studio.component.package.inspect

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Package Inspect

portal_studio.component.package.install

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Component Package Install

portal_studio.component.validate

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Validate

portal_studio.config

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Handoff Config

portal_studio.data.resolve

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Data Resolve

portal_studio.delete.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Delete Theme

portal_studio.developer.contract

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Developer Contract

portal_studio.discovery.preview

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Discovery Preview

portal_studio.discovery.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Discovery Save

portal_studio.document.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Load

portal_studio.document.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Save

portal_studio.experiment.control

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Control

portal_studio.experiment.results

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiment Results

portal_studio.experiment.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Save

portal_studio.experiments.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiments List

portal_studio.form.archive

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Archive

portal_studio.form.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Form Catalog

portal_studio.form.create

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Create

portal_studio.form.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Delete

portal_studio.form.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Duplicate

portal_studio.form.evaluate

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Evaluate

portal_studio.form.group.apply

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Apply

portal_studio.form.group.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Delete

portal_studio.form.group.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Save

portal_studio.form.publish

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Publish

portal_studio.form.restore

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Restore

portal_studio.form.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Save

portal_studio.form.template

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Template

portal_studio.form.test

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Test

portal_studio.form.version.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Version Restore

portal_studio.history

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design History

portal_studio.identity.discover

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Discover

portal_studio.identity.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Load

portal_studio.identity.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Identity Save

portal_studio.integration.activate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Activate

portal_studio.integration.install

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Install

portal_studio.integration.kill.switch

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Kill Switch

portal_studio.integration.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration List

portal_studio.integration.policy

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration Policy

portal_studio.integration.policy.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Integration Policy Save

portal_studio.integration.preflight

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Preflight

portal_studio.integration.revise

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Revise

portal_studio.integration.rollback

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Rollback

portal_studio.integration.transition

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Transition

portal_studio.journey.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Archive

portal_studio.journey.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Journey Catalog

portal_studio.journey.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Delete

portal_studio.journey.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Duplicate

portal_studio.journey.evaluate

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Journey Evaluate

portal_studio.journey.instantiate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Instantiate

portal_studio.journey.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Restore

portal_studio.journey.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Save

portal_studio.kb.category.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Delete

portal_studio.kb.category.reorder

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Reorder

portal_studio.kb.category.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Category Save

portal_studio.kb.governance

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Governance

portal_studio.kb.governance.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Governance Save

portal_studio.kb.languages

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Languages

portal_studio.kb.languages.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Languages Save

portal_studio.kb.parity

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Parity

portal_studio.kb.search.tuning

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning

portal_studio.kb.search.tuning.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning Save

portal_studio.kb.tree

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Tree

portal_studio.knowledge.summary

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Knowledge Summary

portal_studio.list

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain List

portal_studio.load

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Analytics Load

portal_studio.load.route.portal.design.load

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Load

portal_studio.load.route.portal.form.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Form Load

portal_studio.lock

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Lock

portal_studio.migration.apply

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Apply

portal_studio.migration.approve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Approve

portal_studio.migration.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration List

portal_studio.migration.reconcile

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Reconcile

portal_studio.migration.report

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration Report

portal_studio.migration.rollback

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollback

portal_studio.migration.rollout

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollout

portal_studio.migration.start

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Start

portal_studio.node.add

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Add

portal_studio.node.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Delete

portal_studio.node.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Duplicate

portal_studio.node.move

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Move

portal_studio.node.update

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Update

portal_studio.operations.control

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Control

portal_studio.operations.feed

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Feed

portal_studio.operations.record

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Record

portal_studio.operations.summary

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Summary

portal_studio.org.context

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Context

portal_studio.org.member.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Org Member Save

portal_studio.org.members

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Members

portal_studio.org.requests

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Requests

portal_studio.page.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Archive

portal_studio.page.create

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Create

portal_studio.page.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Delete

portal_studio.page.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Duplicate

portal_studio.page.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Restore

portal_studio.page.update

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Update

portal_studio.parity.accept

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Accept

portal_studio.parity.capture

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Capture

portal_studio.parity.compare

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Compare

portal_studio.parity.create

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Create

portal_studio.parity.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Parity List

portal_studio.personalization.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Delete

portal_studio.personalization.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Personalization List

portal_studio.personalization.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Save

portal_studio.presence

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Presence

portal_studio.preview

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Preview

portal_studio.preview.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Preview Catalog

portal_studio.publish

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Publish

portal_studio.quality

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Quality

portal_studio.redirect.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Delete

portal_studio.redirect.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Save

portal_studio.release.diff

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Release Diff

portal_studio.release.evidence

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Release Evidence

portal_studio.release.history

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Release History

portal_studio.release.publish

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Publish

portal_studio.release.rollback

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Rollback

portal_studio.release.schedule

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule

portal_studio.remove

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Remove

portal_studio.request.changes

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Request Changes

portal_studio.restore.field

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Restore Field

portal_studio.restore.published

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Restore Published

portal_studio.revert

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Design Revert

portal_studio.review

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Review

portal_studio.review.link

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Review Link

portal_studio.rollback

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Rollback

portal_studio.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save

portal_studio.save.route.portal.form.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Form Save

portal_studio.save.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save Theme

portal_studio.saved.section.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Delete

portal_studio.saved.section.instantiate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Instantiate

portal_studio.saved.section.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Save

portal_studio.schedule

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Schedule

portal_studio.schedule.cancel

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule Cancel

portal_studio.scim.config

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Scim Config

portal_studio.service.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Archive

portal_studio.service.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Service Catalog

portal_studio.service.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Duplicate

portal_studio.service.reorder

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Reorder

portal_studio.service.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Restore

portal_studio.service.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Save

portal_studio.service.template

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Template

portal_studio.sign.in.flow.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Sign In Flow Save

portal_studio.signin.methods

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Signin Methods

portal_studio.test.link

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Handoff Test Link

portal_studio.unlock

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Unlock

portal_studio.upload

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Image Upload

sales (14)

sales.ai.insight

Write. Scope: sales.write, admin. Contract: route_inferred. Sales Ai Insight

sales.analyze

Write. Scope: sales.write, analytics.write, admin. Contract: route_inferred. Analyze sales with AI

sales.chart

Write. Scope: sales.write, admin. Contract: route_inferred. Sales Chart

sales.compare

Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. Compare sales periods

sales.compare.route.sales.compare

Read. Scope: sales.read, admin. Contract: route_inferred. Sales Compare

sales.goal.delete

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Delete

sales.goal.list

Read. Scope: sales.read, admin. Contract: route_inferred. Conversion Goal List

sales.goal.save

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Save

sales.list

Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. List sales and conversions

sales.list.route.conversion.list

Read. Scope: sales.read, admin. Contract: route_inferred. Conversion List

sales.record

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Record

sales.stats

Read. Scope: sales.read, analytics.read, admin. Contract: declared_dynamic. Read sales statistics

sales.stats.route.sales.stats

Read. Scope: sales.read, admin. Contract: declared_dynamic. Sales Stats

sales.table

Read. Scope: sales.read, admin. Contract: route_inferred. Sales Table

sécurité (21)

security.ai.analyze

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Analyze

security.ai.ask

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Ask

security.ai.briefs

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Ai Briefs

security.ai.chain.explain

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Chain Explain

security.ai.incident.action

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Incident Action

security.ai.incidents

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Incidents

security.ai.js.triage

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Js Triage

security.ai.policies

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Ai Policies

security.ai.policy.action

Write. Scope: security.write, admin. Contract: route_inferred. Security Ai Policy Action

security.ai.verdicts

Read. Scope: security.read, admin. Contract: route_inferred. Security Ai Verdicts

security.blocklist.add

Write. Scope: security.write, admin. Contract: source_inferred. Add a spam rule (email, domain or IP) to the ticket blocklist Required fields: kind, value. Retry-safe with idempotency_key.

security.blocklist.list

Read. Scope: security.read, admin. Contract: explicit. List the current ticket spam rules

security.chain.reanchor

Write. Scope: security.write, admin. Contract: declared_dynamic. Security Chain Reanchor

security.check

Read. Scope: security.read, admin. Contract: source_inferred. Check an IP or email against the platform blocklists and Security AI verdicts

security.ip

Write. Scope: security.write, admin. Contract: route_inferred. Block Ip

security.ip.route.unblock.ip

Write. Scope: security.write, admin. Contract: route_inferred. Unblock Ip

security.list

Write. Scope: security.write, admin. Contract: route_inferred. Access Log List

security.overview.chains

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Overview Chains

security.overview.data

Read. Scope: security.read, admin. Contract: declared_dynamic. Security Overview Data

security.report

Write. Scope: security.write, admin. Contract: source_inferred. Report abuse a connector observed (spam, login attack, scan, fraud) Retry-safe with idempotency_key.

security.visitor

Write. Scope: security.write, admin. Contract: route_inferred. Block Visitor

sessions (5)

sessions.detail

Read. Scope: sessions.read, admin. Contract: route_inferred. Session Detail

sessions.get

Read. Scope: sessions.read, analytics.read, admin. Contract: route_inferred. Get a session journey Required fields: session_id.

sessions.list

Read. Scope: sessions.read, analytics.read, admin. Contract: route_inferred. List sessions

sessions.merged

Read. Scope: sessions.read, admin. Contract: route_inferred. Sessions Merged

sessions.table

Read. Scope: sessions.read, admin. Contract: route_inferred. Sessions Table

settings (11)

settings.ai.eval.watchtower.config

Write. Scope: settings.write, admin. Contract: declared_dynamic. Ai Eval Watchtower Config

settings.get.client.chat.settings

Read. Scope: settings.read, admin. Contract: route_inferred. Get Client Chat Settings

settings.get.settings

Read. Scope: settings.read, admin. Contract: route_inferred. Get Settings

settings.opsiq.branding.clear

Write. Scope: admin. Contract: route_inferred. Opsiq Branding Clear

settings.opsiq.branding.upload

Write. Scope: admin. Contract: route_inferred. Opsiq Branding Upload

settings.privacy.settings.get

Read. Scope: settings.read, admin. Contract: declared_dynamic. Privacy Settings Get

settings.privacy.settings.save

Write. Scope: settings.write, admin. Contract: route_inferred. Privacy Settings Save

settings.save.ai.settings

Write. Scope: settings.write, admin. Contract: route_inferred. Save Ai Settings

settings.save.chat.widget.settings

Write. Scope: settings.write, admin. Contract: declared_dynamic. Save Chat Widget Settings

settings.save.client.chat.settings

Write. Scope: settings.write, admin. Contract: route_inferred. Save Client Chat Settings

settings.save.settings

Write. Scope: settings.write, admin. Contract: route_inferred. Save Settings

site_intelligence (221)

site_intelligence.action.audit.chain

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Audit Chain

site_intelligence.action.execute

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Execute

site_intelligence.action.preview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Preview

site_intelligence.action.token

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Action Token

site_intelligence.agent.auto.bg

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Bg

site_intelligence.agent.auto.bg.stop

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Bg Stop

site_intelligence.agent.auto.step

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Auto Step

site_intelligence.agent.chat

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Chat

site_intelligence.agent.conn.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Delete

site_intelligence.agent.conn.get

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Get

site_intelligence.agent.conn.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Save

site_intelligence.agent.conn.test

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Conn Test

site_intelligence.agent.coverage

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Coverage

site_intelligence.agent.events

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Events

site_intelligence.agent.hosted.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Apply

site_intelligence.agent.hosted.finalize

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Finalize

site_intelligence.agent.hosted.live.set

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Live Set

site_intelligence.agent.hosted.preview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Preview

site_intelligence.agent.hosted.rollback

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Rollback

site_intelligence.agent.hosted.start

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Start

site_intelligence.agent.hosted.verify

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Hosted Verify

site_intelligence.agent.run.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Delete

site_intelligence.agent.run.finalize

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Finalize

site_intelligence.agent.run.rollback

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Rollback

site_intelligence.agent.run.start

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Start

site_intelligence.agent.run.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Status

site_intelligence.agent.run.verify

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Run Verify

site_intelligence.agent.runs.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Runs List

site_intelligence.agent.set.mode

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Set Mode

site_intelligence.agent.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Status

site_intelligence.agent.step.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Step Apply

site_intelligence.agent.step.skip

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Step Skip

site_intelligence.agent.turn.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Agent Turn Status

site_intelligence.ai.activity

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Activity

site_intelligence.ai.alert.enrich

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Alert Enrich

site_intelligence.ai.alerts

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Alerts

site_intelligence.ai.analyst

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst

site_intelligence.ai.analyst.ask

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Ask

site_intelligence.ai.analyst.email

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Email

site_intelligence.ai.analyst.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Analyst Run

site_intelligence.ai.badges

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Badges

site_intelligence.ai.badges.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Badges Portfolio

site_intelligence.ai.badges.preview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Badges Preview

site_intelligence.ai.bl.plan

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Bl Plan

site_intelligence.ai.bl.plan.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Bl Plan Run

site_intelligence.ai.brief

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Brief

site_intelligence.ai.brief.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Brief Run

site_intelligence.ai.comp.analyse

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Comp Analyse

site_intelligence.ai.comp.analyse.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Comp Analyse Run

site_intelligence.ai.content.get

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Get

site_intelligence.ai.content.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content List

site_intelligence.ai.content.publish

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Publish

site_intelligence.ai.content.write

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Content Write

site_intelligence.ai.daily.digest

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Daily Digest

site_intelligence.ai.discover

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Discover

site_intelligence.ai.fix.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Apply

site_intelligence.ai.fix.apply.bulk

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Apply Bulk

site_intelligence.ai.fix.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Dismiss

site_intelligence.ai.fix.dismiss.bulk

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Dismiss Bulk

site_intelligence.ai.fix.generate

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Generate

site_intelligence.ai.fix.generate.all

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix Generate All

site_intelligence.ai.fix.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Fix List

site_intelligence.ai.kw.coach

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Kw Coach

site_intelligence.ai.kw.coach.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Kw Coach Run

site_intelligence.ai.overview

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Overview

site_intelligence.ai.page.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Page Audit

site_intelligence.ai.page.audit.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Page Audit Run

site_intelligence.ai.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Ai Portfolio

site_intelligence.ai.portfolio.history

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Ai Portfolio History

site_intelligence.ai.portfolio.run

Write. Scope: site_intelligence.write, admin. Contract: declared_dynamic. Si Ai Portfolio Run

site_intelligence.ai.probe

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Probe

site_intelligence.ai.prompt.add

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt Add

site_intelligence.ai.prompt.history

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt History

site_intelligence.ai.prompt.remove

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompt Remove

site_intelligence.ai.prompts

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Prompts

site_intelligence.ai.readiness

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Readiness

site_intelligence.ai.ready

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ai Ready

site_intelligence.alert.resolve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Alert Resolve

site_intelligence.alerts

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Alerts

site_intelligence.alerts.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence alerts

site_intelligence.alerts.resolve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Resolve a Site Intelligence alert Required fields: alert_id.

site_intelligence.analyze

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Analyze

site_intelligence.ask

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ask

site_intelligence.audit.hint

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Audit Hint

site_intelligence.backlink.disavow

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Backlink Disavow

site_intelligence.backlinks

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Backlinks

site_intelligence.backlinks.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List backlinks

site_intelligence.backlinks.refresh

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Backlinks Refresh

site_intelligence.billing.overview

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Billing Overview

site_intelligence.brand.get

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Get

site_intelligence.brand.radar

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Radar

site_intelligence.brand.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Brand Save

site_intelligence.cannibalisation

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Cannibalisation

site_intelligence.compare

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Compare

site_intelligence.competitor.add

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Add

site_intelligence.competitor.refresh

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Refresh

site_intelligence.competitor.remove

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Competitor Remove

site_intelligence.competitors

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Competitors

site_intelligence.competitors.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List competitors

site_intelligence.content.brief

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Brief

site_intelligence.content.decay

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Decay

site_intelligence.content.draft

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Content Draft

site_intelligence.crawl.budget

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Crawl Budget

site_intelligence.crawl.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Crawl List

site_intelligence.crawl.status

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Crawl Status

site_intelligence.crawls.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence crawls

site_intelligence.crawls.status

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Get crawl status

site_intelligence.dashboard

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Read the Site Intelligence dashboard

site_intelligence.dashboard.route.si.dashboard

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Dashboard

site_intelligence.dashboard.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Dashboard Save

site_intelligence.diag.backfill

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Backfill

site_intelligence.diag.compare

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Compare

site_intelligence.diag.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Diag Portfolio

site_intelligence.diag.recs.regen

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Recs Regen

site_intelligence.diag.thresholds

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds

site_intelligence.diag.thresholds.eval

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Eval

site_intelligence.diag.thresholds.history

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds History

site_intelligence.diag.thresholds.profile

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Profile

site_intelligence.diag.thresholds.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diag Thresholds Save

site_intelligence.diagnostics

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Diagnostics

site_intelligence.exec.report

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Exec Report

site_intelligence.export

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Export

site_intelligence.ga4.connect

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Connect

site_intelligence.ga4.list.properties

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 List Properties

site_intelligence.ga4.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Map

site_intelligence.ga4.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Status

site_intelligence.ga4.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Ga4 Sync

site_intelligence.gbp

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp

site_intelligence.gbp.draft.approve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Approve

site_intelligence.gbp.draft.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Dismiss

site_intelligence.gbp.draft.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Draft Sync

site_intelligence.gbp.drafts

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Drafts

site_intelligence.gbp.locations

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Gbp Locations

site_intelligence.gbp.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Map

site_intelligence.gbp.post.draft

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Post Draft

site_intelligence.gbp.post.publish

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Post Publish

site_intelligence.gbp.qa

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa

site_intelligence.gbp.qa.approve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Approve

site_intelligence.gbp.qa.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Dismiss

site_intelligence.gbp.qa.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Qa Sync

site_intelligence.gbp.site.prefs

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Site Prefs

site_intelligence.gbp.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gbp Sync

site_intelligence.google.truth.schedule.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Google Truth Schedule Save

site_intelligence.growth

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Growth

site_intelligence.gsc.connect

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Connect

site_intelligence.gsc.list.properties

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc List Properties

site_intelligence.gsc.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Map

site_intelligence.gsc.opportunities

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Opportunities

site_intelligence.gsc.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Status

site_intelligence.gsc.sync

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Gsc Sync

site_intelligence.image.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Image Audit

site_intelligence.internal.links

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Internal Links

site_intelligence.issue.history

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Issue History

site_intelligence.issues

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Issues

site_intelligence.issues.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence issues

site_intelligence.keyword.add

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Add

site_intelligence.keyword.remove

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Remove

site_intelligence.keyword.research

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Keyword Research

site_intelligence.keywords

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Keywords

site_intelligence.keywords.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List tracked keywords

site_intelligence.local

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local

site_intelligence.local.grid

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local Grid

site_intelligence.local.grid.scan

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Local Grid Scan

site_intelligence.log.ingest

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Log Ingest

site_intelligence.log.summary

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Log Summary

site_intelligence.metadata.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Metadata Audit

site_intelligence.overview

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Overview

site_intelligence.page

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page

site_intelligence.page.experience

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page Experience

site_intelligence.page.optimize

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Page Optimize

site_intelligence.pages

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. Si Pages

site_intelligence.pages.list

Read. Scope: site_intelligence.read, admin. Contract: route_inferred. List Site Intelligence pages

site_intelligence.pagespeed.bridge.status

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Pagespeed Bridge Status

site_intelligence.portfolio.export

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Portfolio Export

site_intelligence.provider.health

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Provider Health

site_intelligence.rank.check

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Rank Check

site_intelligence.rec.action

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Rec Action

site_intelligence.recommendations

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Recommendations

site_intelligence.redirect.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Redirect Audit

site_intelligence.report

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Report

site_intelligence.report.generate

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Report Generate

site_intelligence.reports

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Reports

site_intelligence.reports.list

Read. Scope: site_intelligence.read, admin. Contract: source_inferred. Site Intelligence Reports List

site_intelligence.reset.google.oauth

Write. Scope: site_intelligence.write, admin. Contract: declared_dynamic. Si Reset Google Oauth

site_intelligence.revenue

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Revenue

site_intelligence.revenue.portfolio

Read. Scope: site_intelligence.read, admin. Contract: declared_dynamic. Si Revenue Portfolio

site_intelligence.save.shared.google.oauth

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Save Shared Google Oauth

site_intelligence.scan.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Start a Site Intelligence analysis

site_intelligence.schedule.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Delete

site_intelligence.schedule.run.now

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Run Now

site_intelligence.schedule.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedule Save

site_intelligence.schedules.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schedules List

site_intelligence.schema.audit

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Schema Audit

site_intelligence.server.engineer

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Server Engineer

site_intelligence.settings.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Settings Save

site_intelligence.sites.list

Read. Scope: site_intelligence.read, admin. Contract: explicit. List Site Intelligence monitored sites

site_intelligence.speed

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed

site_intelligence.speed.progress

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed Progress

site_intelligence.speed.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed Run

site_intelligence.speed.v2

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2

site_intelligence.speed.v2.build.task

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Build Task

site_intelligence.speed.v2.collect

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Collect

site_intelligence.speed.v2.read

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Read

site_intelligence.speed.v2.run

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Speed V2 Run

site_intelligence.start.crawl

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Start Crawl

site_intelligence.task.approve

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Approve

site_intelligence.task.assign

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Assign

site_intelligence.task.bulk.apply

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Apply

site_intelligence.task.bulk.assign

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Assign

site_intelligence.task.bulk.deadline

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Deadline

site_intelligence.task.bulk.dismiss

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Bulk Dismiss

site_intelligence.task.deadline

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Deadline

site_intelligence.task.note

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Note

site_intelligence.task.proof

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Proof

site_intelligence.task.reject

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Reject

site_intelligence.task.review

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Task Review

site_intelligence.topical.map

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Topical Map

site_intelligence.webhook.delete

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhook Delete

site_intelligence.webhook.save

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhook Save

site_intelligence.webhooks.list

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Webhooks List

site_intelligence.workflow

Write. Scope: site_intelligence.write, admin. Contract: route_inferred. Si Workflow

statut (6)

status.component.save

Write. Scope: status.write, admin. Contract: declared_dynamic. Status Component Save

status.components.save

Write. Scope: status.write, admin. Contract: explicit. Create or update a public status component Required fields: name. Retry-safe with idempotency_key.

status.incident.create

Write. Scope: status.write, admin. Contract: declared_dynamic. Status Incident Create

status.incident.resolve

Read. Scope: status.read, admin. Contract: route_inferred. Status Incident Resolve

status.incidents.create

Write. Scope: status.write, admin. Contract: explicit. Create a status-page incident Required fields: title. Retry-safe with idempotency_key.

status.incidents.resolve

Write. Scope: status.write, admin. Contract: source_inferred. Status Incidents Resolve Retry-safe with idempotency_key.

enquêtes (22)

surveys.analytics.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Analytics Get

surveys.audiences.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey audiences

surveys.audiences.materialize

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Audiences Materialize Retry-safe with idempotency_key.

surveys.campaigns.create

Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey campaign Required fields: deployment_id. Retry-safe with idempotency_key.

surveys.campaigns.launch

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Campaigns Launch Retry-safe with idempotency_key.

surveys.campaigns.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey campaigns

surveys.deployments.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey deployments

surveys.deployments.set_status

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Deployments Set Status Retry-safe with idempotency_key.

surveys.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Get

surveys.imports.create

Write. Scope: surveys.write, admin. Contract: explicit. Create and run a survey import Required fields: kind. Retry-safe with idempotency_key.

surveys.imports.process

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Imports Process Retry-safe with idempotency_key.

surveys.invitations.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey invitations

surveys.links.create

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Links Create Retry-safe with idempotency_key.

surveys.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey definitions

surveys.responses.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Responses Get

surveys.responses.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey responses

surveys.triggers.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey trigger sets

surveys.types.list

Read. Scope: surveys.read, admin. Contract: explicit. List supported question types and Studio templates

surveys.versions.list

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Versions List

surveys.webhooks.delete

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Webhooks Delete Retry-safe with idempotency_key.

surveys.webhooks.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey webhook subscriptions

surveys.webhooks.save

Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey webhook subscription Required fields: url. Retry-safe with idempotency_key.

équipe (63)

team.delete

Write. Scope: team.write, admin. Contract: route_inferred. Admin Users Delete

team.delete.route.departments.delete

Write. Scope: team.write, admin. Contract: route_inferred. Departments Delete

team.list

Read. Scope: team.read, admin. Contract: route_inferred. Admin Users List

team.list.route.departments.list

Read. Scope: team.read, admin. Contract: declared_dynamic. Departments List

team.perf.activity

Write. Scope: admin. Contract: route_inferred. Team Perf Activity

team.perf.ai.compare

Write. Scope: admin. Contract: route_inferred. Team Perf Ai Compare

team.perf.ai.review

Write. Scope: admin. Contract: route_inferred. Team Perf Ai Review

team.perf.availability

Write. Scope: admin. Contract: route_inferred. Team Perf Availability

team.perf.award.finalize

Write. Scope: admin. Contract: route_inferred. Team Perf Award Finalize

team.perf.award.history

Read. Scope: team.read, admin. Contract: route_inferred. Team Perf Award History

team.perf.award.void

Write. Scope: admin. Contract: route_inferred. Team Perf Award Void

team.perf.claim.pay

Write. Scope: admin. Contract: route_inferred. Team Perf Claim Pay

team.perf.claim.recover

Write. Scope: admin. Contract: route_inferred. Team Perf Claim Recover

team.perf.claim.reject

Write. Scope: admin. Contract: route_inferred. Team Perf Claim Reject

team.perf.clear

Write. Scope: admin. Contract: route_inferred. Team Perf Clear

team.perf.coaching.action.item.add

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Action Item Add

team.perf.coaching.action.item.complete

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Action Item Complete

team.perf.coaching.evidence.pin

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Evidence Pin

team.perf.coaching.evidence.unpin

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Evidence Unpin

team.perf.coaching.session

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session

team.perf.coaching.session.create

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session Create

team.perf.coaching.session.update

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Session Update

team.perf.coaching.sessions

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Sessions

team.perf.coaching.status

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Coaching Status

team.perf.data

Write. Scope: admin. Contract: route_inferred. Team Perf Data

team.perf.heatmap

Write. Scope: admin. Contract: route_inferred. Team Perf Heatmap

team.perf.history

Write. Scope: admin. Contract: route_inferred. Team Perf History

team.perf.pay.all.claims

Write. Scope: admin. Contract: route_inferred. Team Perf Pay All Claims

team.perf.qa.calibration.record

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Calibration Record

team.perf.qa.dispute.resolve

Write. Scope: admin. Contract: route_inferred. Team Perf Qa Dispute Resolve

team.perf.qa.disputes

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Disputes

team.perf.qa.evaluation.submit

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Evaluation Submit

team.perf.qa.overview

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Overview

team.perf.qa.scorecard.publish

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Scorecard Publish

team.perf.qa.scorecard.save

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Qa Scorecard Save

team.perf.quest.record

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Record

team.perf.quest.save

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Save

team.perf.quest.status

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quest Status

team.perf.quests

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Quests

team.perf.recognition

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition

team.perf.recognition.settings.save

Write. Scope: admin. Contract: route_inferred. Team Perf Recognition Settings Save

team.perf.recognition.streak.history

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition Streak History

team.perf.recognition.streaks.record

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Recognition Streaks Record

team.perf.reward.budget.authorize

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Budget Authorize

team.perf.reward.claims

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Claims

team.perf.reward.pay

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Pay

team.perf.reward.payouts

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Payouts

team.perf.reward.period.finalize

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Finalize

team.perf.reward.period.history

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Reward Period History

team.perf.reward.period.preview

Write. Scope: team.write, admin. Contract: route_inferred. Team Perf Reward Period Preview

team.perf.reward.period.reverse

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Reverse

team.perf.reward.period.void

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Period Void

team.perf.reward.save

Write. Scope: admin. Contract: route_inferred. Team Perf Reward Save

team.perf.reward.state

Write. Scope: admin. Contract: route_inferred. Team Perf Reward State

team.perf.trends

Write. Scope: admin. Contract: route_inferred. Team Perf Trends

team.perf.v2.data

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Data

team.perf.v2.export

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Export

team.perf.v2.live

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Live

team.perf.v2.reward.sheet

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Reward Sheet

team.perf.v2.settings

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Settings

team.perf.v2.settings.save

Write. Scope: admin. Contract: route_inferred. Team Perf V2 Settings Save

team.save

Write. Scope: team.write, admin. Contract: route_inferred. Admin Users Save

team.save.route.departments.save

Write. Scope: team.write, admin. Contract: route_inferred. Departments Save

billets (77)

tickets.ai.summary

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Ai Summary

tickets.analytics

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Analytics

tickets.approval.decide

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Approval Decide

tickets.approval.request

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Approval Request

tickets.approvals.pending

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Approvals Pending

tickets.assignment.rule.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Assignment Rule Delete

tickets.assignment.rule.list

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Assignment Rule List

tickets.assignment.rule.save

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Ticket Assignment Rule Save

tickets.assignment_rules.delete

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Assignment Rules Delete Retry-safe with idempotency_key.

tickets.assignment_rules.save

Write. Scope: tickets.write, admin. Contract: explicit. Create or update a ticket assignment rule Required fields: name. Retry-safe with idempotency_key.

tickets.bulk

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Bulk Retry-safe with idempotency_key.

tickets.bulk.route.tickets.bulk

Write. Scope: tickets.write, admin. Contract: route_inferred. Tickets Bulk

tickets.calendar.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Sla Calendar Delete

tickets.calendar.save

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Sla Calendar Save

tickets.claim

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Claim

tickets.csat.get

Read. Scope: tickets.read, admin. Contract: explicit. Get the CSAT response for one ticket Required fields: ticket_id.

tickets.csat.list

Read. Scope: tickets.read, admin. Contract: explicit. List ticket CSAT responses in the bound workspace

tickets.csat.metrics

Read. Scope: tickets.read, admin. Contract: explicit. CSAT metrics for a period (the tickets dashboard numbers)

tickets.embed.load

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Load

tickets.embed.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Save

tickets.embed.secret

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Embed Secret

tickets.field.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Field Save

tickets.follower.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Follower Add

tickets.follower.remove

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Follower Remove

tickets.get

Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets Get

tickets.kb.deflection

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Deflection

tickets.kb.draft

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Kb Draft

tickets.kb.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Kb Save

tickets.kb.version.restore

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Version Restore

tickets.kb.versions

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Kb Versions

tickets.link.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Link Add

tickets.link.remove

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Link Remove

tickets.list

Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets List

tickets.open

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Open Retry-safe with idempotency_key.

tickets.open_guest

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Open Guest Retry-safe with idempotency_key.

tickets.ops.summary

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Ops Summary

tickets.policy.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Sla Policy Delete

tickets.policy.save

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Sla Policy Save

tickets.presence.leave

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Presence Leave

tickets.presence.ping

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Presence Ping

tickets.quick.replies

Write. Scope: tickets.write, admin. Contract: declared_dynamic. Ticket Quick Replies

tickets.quick.reply.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Quick Reply Save

tickets.relations.get

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Relations Get

tickets.reply

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Reply Retry-safe with idempotency_key.

tickets.reply.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Delete

tickets.reply.edit

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Edit

tickets.reply.outbound.convert

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Outbound Convert

tickets.reply.translate

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translate

tickets.reply.translation.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translation Delete

tickets.reply.translation.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Reply Translation Save

tickets.rule.compose

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Rule Compose

tickets.side.ai.draft

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Ai Draft

tickets.side.assign.department

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Assign Department

tickets.side.create

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Create

tickets.side.list

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Side List

tickets.side.mention

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Side Mention

tickets.side.recipients

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket Side Recipients

tickets.side.reply

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Side Reply

tickets.sla.delete

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Sla Delete Retry-safe with idempotency_key.

tickets.sla.save

Write. Scope: tickets.write, admin. Contract: explicit. Create or update an SLA policy Required fields: name. Retry-safe with idempotency_key.

tickets.split

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Split

tickets.split.candidates

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Split Candidates

tickets.tag.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Tag Add

tickets.tag.list

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Tag List

tickets.tag.remove

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Tag Remove

tickets.tags.add

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Tags Add Retry-safe with idempotency_key.

tickets.tags.list

Read. Scope: tickets.read, admin. Contract: source_inferred. Tickets Tags List

tickets.tags.remove

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Tags Remove Retry-safe with idempotency_key.

tickets.update

Write. Scope: tickets.write, admin. Contract: source_inferred. Update a ticket status, priority, subject, department or assignment Retry-safe with idempotency_key.

tickets.view.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket View Delete

tickets.view.list

Read. Scope: tickets.read, admin. Contract: declared_dynamic. Ticket View List

tickets.view.save

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket View Save

tickets.views.delete

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Views Delete Retry-safe with idempotency_key.

tickets.views.save

Write. Scope: tickets.write, admin. Contract: source_inferred. Tickets Views Save Retry-safe with idempotency_key.

tickets.worklog.add

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Worklog Add

tickets.worklog.delete

Write. Scope: tickets.write, admin. Contract: route_inferred. Ticket Worklog Delete

tickets.worklog.list

Read. Scope: tickets.read, admin. Contract: route_inferred. Ticket Worklog List

todos (1)

todos.add

Write. Scope: todos.write, admin. Contract: source_inferred. Todos Add Retry-safe with idempotency_key.

visitors (3)

visitors.block

Write. Scope: visitors.write, security.write, admin. Contract: route_inferred. Block a visitor Required fields: visitor_id.

visitors.list

Read. Scope: visitors.read, analytics.read, admin. Contract: route_inferred. List visitors

visitors.table

Read. Scope: visitors.read, admin. Contract: route_inferred. Visitors Table

les hooks web (1)

webhooks.events.list

Read. Scope: webhooks.read, crm.read, admin. Contract: explicit. List outbound webhook events and their payloads

écrire (6)

writing.analyze

Write. Scope: writing. Contract: source_inferred. Writing Analyze Retry-safe with idempotency_key.

writing.compose

Write. Scope: writing. Contract: source_inferred. Writing Compose Retry-safe with idempotency_key.

writing.reply

Write. Scope: writing. Contract: source_inferred. Writing Reply Retry-safe with idempotency_key.

writing.rewrite

Write. Scope: writing. Contract: source_inferred. Writing Rewrite Retry-safe with idempotency_key.

writing.summarize

Write. Scope: writing. Contract: source_inferred. Writing Summarize Retry-safe with idempotency_key.

writing.translate

Write. Scope: writing. Contract: source_inferred. Writing Translate Retry-safe with idempotency_key.

OpenAPI et Postman sont-ils disponibles?+

Oui. OpenAPI généré 3.0 le document est à /api/v1/openapi.php, la collection Postman générée est à /api/v1/postman.php, et les docs développeurs lisibles par l'homme sont à /api/docs/.

Comment puis-je travailler avec plus d'un espace de travail?+

Envoyez site_key dans le corps de la requête pour choisir un espace de travail. Une clé émise pour un espace reste épinglée à celui-ci. Une clef avec contexte admin peut sélectionner n'importe quel espace qu'elle est autorisée à voir, et elle est refusée pour tous ceux qui ne l'est pas.

Quelles actions peut appeler une touche en lecture seule?+

Toute action marquée comme une lecture. Définissez le mode des permissions sur la clé à read_only et toute écriture est refusée avec read_Only_Key, de sorte qu'une intégration de rapport ne peut rien changer même par erreur.

Pourquoi ai-je reçu not_found pour quelque chose que je peux voir dans l'administration?+

Les enregistrements dans les autres espaces de travail renvoient not_found plutôt qu'une erreur d'autorisation, donc le API ne confirme jamais si quelque chose existe ailleurs.

Développeur

Sécurité API

Un contrat de sécurité pour chaque connecteur et intégration: demanderOpsIQce qu'il sait sur unIPou expéditeur, et de nourrir l'abus que votre propre système voit.

OpsIQ Le monde se défend déjà : IP Le pare-feu bloque les attaquants, le pipeline de tickets filtre le spam et l'IA de sécurité classe les contrevenants et propose des règles de blocage. API Une plateforme de facturation, un portail client ou une application personnalisée peut vérifier un visiteur avant de lui faire confiance et rapporter ce qu'elle a observé afin que l'ensemble de l'installation apprenne à partir de chaque surface.

Ce que vous pouvez faire

Vérifiez avant de faire confiance

security. check répond avec l'état du pare-feu, toute règle de spam correspondant à l'expéditeur et le verdict d'IA mis en cache pour IP. Un appel, une opinion consolidée.

Signaler ce que vous avez vu

security.report enregistre l'observation comme un événement de sécurité, fait classer le IP Les rapports répétés sont regroupés en incidents, exactement comme les attaques : ils ne peuvent pas être traités séparément. OpsIQ Il voit directement.

Règles de partage du spam

security. blocklist. add et security. bloklist. list lisent et écrivent les mêmes règles de spam que la page Tickets, donc un expéditeur bloqué dans un système est bloqué partout.

Signaler un abus à partir d'un connecteur
POST /api/v1.php
Authorization: Bearer opq_your_api_key
Content-Type: application/json

{
  "action": "security.report",
  "ip": "203.0.113.7",
  "kind": "spam",
  "reason": "Sent 40 junk tickets in 10 minutes",
  "source": "whmcs:example.com"
}

Portées et sécurité

security.read

Nécessaire pour security. check et security. blocklist. list. Sécurisé pour donner une intégration de rapports.

security.write

Nécessaire pour security. report et security. blocklist. add Donnez-le uniquement aux systèmes dans lesquels vous voulez alimenter des règles et rapports.

Rien n'est détruit silencieusement

Un expéditeur bloqué se retrouve toujours dans la vue Spam où le ticket peut être lu et restauré.

La plateforme se protège elle-même

Le serveur lui-même IP Ces adresses ne peuvent jamais être bloquées ou signalées via ce. API, de sorte qu'une intégration mal configurée ne peut pas faire tomber la plate-forme.

💡
Créez une clé sous Integrations, puis API Keys et donnez-lui uniquement les champs de sécurité dont elle a besoin. Le contrat complet des requêtes pour chaque action se trouve dans meta. actions et le document OpenAPI.
Mes connecteurs existants l'utilisent-ils automatiquement?+

La synchronisation sortante est déjà automatique: lorsque vous bloquez uneIP, les plates-formes connectées sont racontées par la synchronisation de sécurité du connecteur.APIest la moitié entrante. Pointez votre connecteur ou code personnalisé à ces quatre actions avec une clé portant les champs de sécurité.

Où se trouvent les règles antispam ?+

Le contrôle de blocage d'expéditeur sur la page Tickets, l'IA du spam dans les Paramètres et ce API fonctionnent tous contre la même liste de blocages, donc il y a exactement un endroit où regarder.

Développeur

Événements API

Envoyez des événements personnalisés depuis votre serveur ou site Web vers OpsIQ pour les analyses, les expériences, le déclenchement de CRM et les conditions webhook.

Comment ça fonctionne
Événements APIUn appel track() envoyant un événement demo_booked personnalisé dans OpsIQ, qui alimente les objectifs de conversion, les segments et les déclencheurs.OpsIQ. track("démo_réservée", {valeur: 0, plan: "pro"});Objectifs de conversionSegmentsDéclencheurs & webhooksLe navigateur (OpsIQ.track) ou POST côté serveur /v1/events
Événements API

Événements côté navigateur

Suivi des événements du navigateur
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "button_clicked", {
  button: "signup",
  page: "/pricing",
  variant: "green"
}]);

Événements côté serveur

Côté serveur, enregistrez les activités et conversions par rapport à un contact via l'action API. Utiliser crm.activities.record pour le cycle de vie/l'activité commerciale et crm.conversions.record Il n'y a pas de conversions. events.send Le récepteur de l'événement CRM entrant vit à /v1/inbound.php?t=<token> Pour les systèmes tiers qui poussent des événements.

Activité côté serveur (action API)
POST /api/v1.php
Authorization: Bearer opq_your_key
Content-Type: application/json

{
  "action": "crm.activities.record",
  "site_key": "site_abc123",
  "email": "[email protected]",
  "event": "subscription.upgraded",
  "value": 50,
  "currency": "USD"
}

Convention de dénomination

Notation par points

"order. completed" et non pas "orderCompleted".

Passé

"button. clicked" et non pas "buttons. click".

Soyez spécifique

"pricing. plan_selected" et non pas "user_action".

Développeur

Comment les données circulent à travers OpsIQ

Comprendre le flux de données vous aide à déboguer les intégrations et à optimiser les performances.

Comment ça fonctionne
Comment les données circulentLes données proviennent du widget et de la balise vers. OpsIQ Core (CDP, graphe d'identité, cerveau de l'IA, analyses, CRM) puis via des webhooks et le REST API.Widget& baliseOpsIQ de baseCDP · Graphique d'identitécerveau IAAnalyse · CRMLes accroches de Web sont éteintesAPI REST
Flux de données

Flux de données entrant

1
Widget balise

The JavaScript Le widget envoie des pages vues, clics et messages de chat à. /beacon.php.

2
Ingestion d'événements

Événements stockés dans opsiq_events avec site_key, type d'événement, client et propriétés.

3
Assemblée de session

Le constructeur de sessions regroupe les pages vues en sessions (via cron).

4
Résolution de l'identité

Une fois identifiés, les dossiers anonymes sont liés au profil du client.

5
Connecteur de synchronisation

Les connecteurs extraient des données de plateformes externes et les stockent dans le cache du connecteur.

6
Contexte de l'IA

L'IA assemble le contexte à partir de l'historique des visiteurs, du profil client, des données de connecteur, de la base de connaissances et de l’invite.

Flux de données sortantes

1
Incendies d'événements

Les événements internes se déclenchent (ticket. created, chat. message, order. completed).

2
File d'attente de tâches

Événement placé dans la file d'attente de tâches asynchrones.

3
Envoi de Webhook

Le répartiteur signe le message et l’envoie à tous les points de terminaison abonnés.

4
Réessayer en cas d'échec

Les livraisons échouées ont été réessayées avec un recul exponentiel.

Paramètres

Référence des paramètres

Tout ce qui est indiqué ci-dessous s'applique à l'espace de travail dans lequel vous êtes, afin qu'un seul compte puisse gérer plusieurs marques avec des identités, des comportements de chat et des règles de conservation différents.

Trouver un cadre

Il y a environ six cents contrôles individuels dans les paramètres, répartis sur onze onglets regroupés sous quatre menus. Vous n'êtes pas censé parcourir pour eux.

Paramètres de recherche (Ctrl + K)

Appuyez sur Ctrl + K, ou Commande + K sur un Mac, n'importe où dans la page Paramètres. Tapez des mots simples et appuyez sur Entrée pour accéder directement au contrôle. La recherche tolère les petites fautes de frappe et comprend les mots connexes, donc le planificateur trouve Cron et la confidentialité trouve les contrôles de suivi.

Espace de travail et plan

Général et Licence.

IA et support client

Assistant d'IA, Chat client, OpsIQ Portail de rédaction et de support.

Données et gouvernance

Suivi et confidentialité, autorisations et sécurité.

Système

Configuration de Cron (auto-hébergé uniquement) et Danger Zone.

Sauvegarde

Chaque onglet est sauvegardé séparément avec son propre bouton Sauvegarder. Client Chat et OpsIQ Writing épinglent leur onglet à l'écran, les modifications ne sont pas transférées entre les onglets.

Liens profonds

L'onglet actif est écrit dans l'adresse de la page, donc un onglet peut être mis en favoris ou envoyé à un collègue.

Général: Identité d'entreprise

La carte la plus importante de la page. L’IA lit ces valeurs à chaque réponse, chaque rapport et chaque briefing quotidien.

Nom de l'entreprise

Utilisé dans les rapports d'IA, les briefings quotidiens et le libellé destiné aux clients.

Industrie des affaires

Adapte l’analyse IA, le scoring des prospects, les briefings et les modèles d’enquête. Choisissez parmi hébergement web, e-commerce, SaaS, immobilier, agence, conseil, santé, éducation, finance ou entreprise générale.

Langue du système

La langue affichée à tous ceux qui n'ont pas choisi la leur, chaque agent peut l'annuler dans son profil.

Utiliser la langue du navigateur

Une fois que quelqu'un a choisi une langue, son choix l'emporte et cela ne le remplace jamais. This never overrides it.

Fuseau horaire du système

La zone dans laquelle l'ensemble du système fonctionne: les dates, les rapports, les plannings et le cron en arrière-plan. Utilisez votre fuseau horaire d'opérations, pas vos clients.

Général: GeoIP et suivi

Chemin de la base de données GeoIP2

Détection automatique au premier chargement sur cPanel, Plesk, DirectAdmin, Cloudways, Docker et Linux ou Windows ordinaire. Ajoutez GeoLite2-ASN. mmdb dans le même dossier que celui du fournisseur d'accès Internet du visiteur.

Mode de source géographique

GeoLite2 uniquement, Geo Lite 2 avec une Cloudflare fallback, or Cloudflare only.Cloudflare Les modes nécessitent que le site soit proxy via.Cloudflare, avec les en-têtes de localisation des visiteurs activés pour le détail de la ville et de la région.

Délai d'attente de la session (s)

L'inactivité avant la fin d'une session de visiteur est considérée comme terminée. Par défaut 14400, soit quatre heures.

Intervalle de rafraîchissement en direct (s)

Fréquence de rafraîchissement du flux en direct. Par défaut 30 secondes.

Seuil actif (min)

Durée pendant laquelle un visiteur est considéré comme en direct après le chargement de sa dernière page. Par défaut, 2 minutes.

Conservation des données (jours)

Supprime les enregistrements collectés et générés après cette date : analyse, chat, tickets, commentaires, transactions, télémétrie d’IA, journaux d’intégration et activité CRM. 0 conserve tout pour toujours : paramètres, contenu créé et reçus de consentement ne sont jamais supprimés.

Lorsqu'un chat est supprimé

Choisissez la quantité de conversation supprimée qui reste enregistrée : le disque complet, le disque sans conversation ou la partition seulement. La suppression cache toujours le chat dans la boîte de réception et l'historique du visiteur. Conservation programmée et Oubliez le visiteur toujours effacer complètement quoi que ce soit.

Suivre le trafic des bots

Laissez-le ; il gonfle le nombre de visiteurs et fausse chaque rapport.

Popup de sondage de retour activé

Séparé des sondages de chat sous Chat client, Flux d'assistance. Separate from the chat surveys under Client Chat, Support Flow.

Général: Fonctionnalités AI

Tous sont activés par défaut et enregistrés par espace de travail.

AI Triage sur les billets

Classe chaque ticket par catégorie, priorité et sentiment, et écrit un résumé du fil en haut du ticket.

Résumé du hover AI Triage

Affiche les balises de triage et le résumé dans une info-bulle lorsqu’un agent passe la souris sur une ligne de la liste des tickets.

Copilot (compositeur)

Ajout des boutons Brouillon de réponse IA, Plus chaleureux, Plus court, Plus formel et Apologie sous la zone de réponse du ticket.

Ask-OpsIQ Copilote

Le copilote flottant sur chaque page d'administration sait quel client, facture ou ticket est ouvert.

Matin brief

Lors de la première ouverture du jour, le copilote présente les tickets urgents, les réponses en retard et les chats en attente.

Général: argent, image de marque, sauvegarde

OpsIQ monnaie de base

Chaque montant total dans l'administration est converti en cette devise pour affichage. Les connecteurs stockent leur propre devise source; définissez-la par connecteur.

Taux de FX auto-synchronisés

Actualise les taux toutes les six heures à partir d'un flux public gratuit sans clé API. Vous pouvez ajouter des taux manuels qui remplacent le flux. Avec la synchronisation automatique désactivée, les devises sans un taux manuel ne sont pas converties.

Activer les fonctionnalités Commerce et Facturation

Si vous l'activez, la page Ventes et conversions, les cartes de revenu du tableau de bord et le flux Live Intelligence s'affichent. Lorsqu'elle est désactivée, toutes les surfaces de prix sont masquées et la page Vente quitte le menu.

Vocabulaire du commerce

Enseigne à OpsIQ votre formulation: si vous faites des renouvellements, le mot pour renouveler, ce que vous vendez et comment les acheteurs sont appelés.

Branding et logos

Deux téléchargements, un pour les arrière-plans clairs (barre latérale d'administration) et l'autre pour les sombres (page de connexion). PNG, JPG, WebP ou SVG jusqu'à 3 MB.

Agent de renseignements sur le site, autoriser les cibles SSH privées

L'agent SEO d'implémentation automatique se connecte sur SSH. Les adresses privées, de boucle et réservées sont bloquées par défaut comme mesure anti-SSRF. Activez uniquement pour les installations autohébergées qui doivent atteindre un serveur local.

OpsIQ Sauvegarde / Restauration

Exporte tous les paramètres et OpsIQ-propriétaire de la table plus les fichiers téléchargés.OpsIQ Configuration et enregistrements seulement; il ne touche jamais les clients, factures, tickets, services, domaines, commandes ou transactions.

⚠️
Prenez une sauvegarde avant d'utiliser quoi que ce soit dans Danger Zone. La sauvegardes est dans General et les actions de suppression sont dans Dangers Zone, il est donc facile d'atteindre le bouton de supprimer sans avoir exporté au préalable.
Paramètres

Paramètres: Sécurité et confidentialité

Protection de la connexion d'administrateur, des comptes de votre personnel et des données collectées par OpsIQ La connexion du client au portail de support est configurée séparément.

Protection de connexion

Google reCAPTCHA

Arrête les bots et le bourrage d'informations d'identification lors de la connexion administrateur. Choisissez v3 (invisible, avec score) ou v2 (case à cocher), définissez le seuil de score v3 et fournissez le site et les clés secrètes. Ces mêmes clés sont réutilisées par le formulaire de demande du portail d'assistance.

Verrouillage automatique après échec de connexion

Bloque une adresse après un certain nombre d'échecs dans une fenêtre, pendant un certain numéro d'heures. Vous pouvez personnaliser le message de page verrouillée et afficher une petite distraction sur l'écran d'attente.

Login Durcissement

Politique de mot de passe avec une longueur minimale, rejet des mots de passe trouvés dans les violations connues, verrouillage par compte contre le bourrage d'informations d'identification, deux facteurs obligatoires pour chaque administrateur, saisie à nouveau du mot de passer avant les actions dangereuses et alertes de connexion sur un nouvel appareil.

Authentification unique (OIDC)

Nécessite l'émetteur URL, l'ID client et le secret du client. Les domaines à approvisionnement automatique, un par ligne, créent des utilisateurs automatiquement lors de la première connexion.

Authentification unique (SSO)SAML 2.0)

Pour les fournisseurs qui parlent SAML. OpsIQ Fournit la réponse ACS.URL Vous fournissez l'ID de l'entité IdP, vous connectez URL, optional sign-out URL et X.509 Les champs d'attribut E-mail et Nom ne sont nécessaires que pour les noms d’attributi non standard.

Provisionnement SCIM

Création, mise à jour et désactivation de.OpsIQ des comptes.OpsIQ Fournit le. SCIM Base URL; vous générez des jetons étiquetés ici afin qu'un peut être révoqué sans casser le reste.

Menaces, blocage et collecte

Liste d'autorisations de sortie

Restreint les hôtes externes que ce connecteur d'espace de travail peut appeler. Compagnon du contrôle cible SSH dans General.

Notation des menaces et blocage automatique

Bloque un visiteur lorsque son score de menace dépasse votre seuil. 0 le désactive. Suivez la page Aperçu de la sécurité pendant une semaine avant de choisir un numéro.

Bloquer la page Message

Le message qu'un visiteur bloqué voit, en texte brut ou votre propre écran de blocage personnalisé HTML.

Core Web Vitals de vrais visiteurs

Mesure LCP, INP et CLS à partir de sessions réelles.

Distribution d'événements par lots, sécurisée

Les événements personnalisés sont mis en file d'attente dans le navigateur et diffusés par lots avec des réessais, ce qui réduit les pertes sur les connexions mobiles médiocres.

Balises de suivi signées

Les widgets intégrés réels contiennent un jeton cryptographique rotatif afin que les données de suivi falsifiées puissent être rejetées. Désactivé par défaut. L'activation modifie la façon dont les intégrations s'authentifient, donc testez d'abord.

Alertes de sécurité

Désactivé par défaut, la détection et le blocage s'exécutent indépendamment. Cette carte contrôle si vous êtes informé de l'aide apportée par l'IA et dans quelle mesure.

Activer les alertes de sécurité

Interrupteur principal pour cette carte.

Seuil de vague d’échecs de connexion

Combien de connexions ayant échoué sur une courte période comptent comme une vague qui mérite d'être signalée.

IP Intelligence de réputation

Ajoute un score de menace pour les visiteurs apparaissant dans des flux d'abus publics.

Montre du site

Vérifications horaires de disponibilité et d'expiration TLS, alerte avant l'expinction d'un certificat.

Analyste de sécurité IA et résumés d'incidents IA

Ajoute un verdict explicable à une activité suspecte et regroupe les attaques connexes en un seul incident lisible plutôt qu'en un flux d'événements.

Pilote automatique de politique

Il agit de lui-même, transformant ce qu'il apprend d'un incident en une règle proposée ou appliquée. Laissez tomber jusqu'à ce que vous ayez examiné ses propositions et acceptez avec eux.

Résumé quotidien de sécurité et conseiller hebdomadaire en posture

Un résumé quotidien sur la page Aperçu de sécurité et une liste de contrôle hebdomadaire montrant ce qui est protégé et ce qui reste ouvert.

Expiration automatique des propositions obsolètes

Une règle de bloc proposée sur laquelle vous n'avez jamais agi expire d'elle-même au lieu de s'accumuler.

Replay de la session DOM

Activer la lecture de session DOM

Enregistre les sessions des visiteurs pour la lecture. Lorsque désactivé, la bibliothèque de replay n'est jamais chargée, donc il n'y a pas de coût à le laisser désactiver. Les enregistrements sont échantillonnés et masqués en matière de confidentialité, et sont vus sur la page Session Replay sous Analytics.

Fréquence d'échantillonnage, capture maximale, rétention

Quelle part des sessions enregistrer, combien de temps un seul enregistrement peut durer et combien d'enregistrements sont conservés.

⚠️
Gardez le taux d'échantillonnage et la rétention aussi bas que possible, afin de répondre à votre question, et divulguez-le dans votre avis de confidentialité.
Paramètres

Paramètres: Suivi et confidentialité

Ce que OpsIQ peut collecter, et combien de temps chaque type d'enregistrement survit.

Exclusions

Gammes exclues IPs et CIDR

Adresses jamais suivies, une par ligne, adresses exactes ou plages de CIDR. La façon la plus propre d'exclure votre équipe de vos analyses, car elle couvre tous les utilisateurs à cette adresse plutôt que seulement les administrateurs connectés.

Chemin d'accès URL exclus

Les modèles de page ne sont jamais suivis, un par ligne, les caractères génériques avec un astérisque. Par exemple /admin/* garde tout le back office hors du journal des visiteurs.

Politique de conservation des données

Séparez-le du paramètre de conservation des données global dans Général et de la purge de zone dangereuse.

Journaux d'interaction avec l'IA

La télémétrie de confiance conserve des aperçus courts de la requête et de la réponse. Par défaut, 90 jours. Cette option contient le plus de texte client, alors raccourcissez-le en premier lorsque vous resserrez les paramètres de confidentialité.

Événements d'utilisation de l'IA

Compte par jeton d'appel pour le rapport de coûts. Par défaut 90 jours. Numéros uniquement, pas de contenu du message.

Piste d'audit des actions

Le journal des actions et de la sécurité à l'évidence d'altération. Par défaut 365 jours.

Diagnostic

Enregistrements de l'état du système. Par défaut 30 jours.

Questions sans réponse

Les groupes de questions auxquelles l'IA n'a pas pu répondre. Par défaut 90 jours, passez-les en revue sur la page Questions manquées par l'AI avant qu'elles ne soient expirées.

Chiens de garde et exportations

Alertes d'anomalie métrique

Comparaison quotidienne de la journée d'hier avec la base récente, en vous avertissant lorsqu'une mesure dépasse votre seuil. Par défaut 35 pour cent.

Exportation d'entrepôt

Des vidages nocturnes des sessions, visiteurs, pages vues et tables associées pour votre propre pile de BI, dans un format que vous choisissez, conservés pendant un certain nombre de jours.

Paramètres

Paramètres: Admin AI Assistant

L'assistant flottant que votre personnel utilise dans l'administration, avec un accès en lecture directe aux clients, factures, tickets, serveurs et journaux cron. Un assistant différent de celui qui est face au client sous Client Chat.

Activer le widget d'IA OpsIQ

Affiche le bouton assistant sur chaque page d'administration. Off le cache pour tout le monde.

Mise en page et comportement

Position de coin, largeur du panneau (320 to 600 px), hauteur maximale (400 to 900 px), rayon d'angle (0to 24), la taille de police, et un flou en verre dépoli derrière le panneau.

Afficher les Quick Chips

Boutons de raccourci en un clic sous l'en-tête. La façon la plus rapide pour la plupart des membres du personnel.

Afficher les informations du modèle

Affiche le modèle qui a répondu et combien de temps cela a pris. Utile lors du réglage des coûts, bruit pour une utilisation quotidienne.

Portail d'accès par administrateur

Affiche l'assistant uniquement à un administrateur connecté dont le nom d'utilisateur et l'adresse e-mail correspondent tous deux à un agent OpsIQ affecté à cet espace de travail. Utilisez le bouton Vérifier mon accès avant d'activer ou vous pouvez verrouiller votre propre équipe.

Personne de l'IA

Nom d'affichage, slogan de l'en-tête et message de bienvenue personnalisé affiché à l'ouverture du panneau.

Puces intelligentes à action rapide

Modifiez l'étiquette et l'invite sous-jacente pour chaque raccourci, ajoutez la vôtre ou réinitialisez les valeurs par défaut. L'étiquettes est ce que le personnel voit, l'Invite est ce qu'il reçoit.

Couleurs et formes

Forme de puce (pilule, arrondi, carré), couleurs de puces, thème de carte et forme du lanceur (rond, squircle, carrée), avec un aperçu en direct.

Mémoire de conversation

L'assistant se souvient de l'historique de chaque personne à travers les sessions du navigateur, jusqu'aux messages 120, stockés dans votre propre base de données.

Paramètres

Paramètres: Chat client

Le widget de chat que vos clients utilisent et la plus grande zone des Paramètres Six sous-onglets, avec le commutateur principal et Enregistrer épinglés en haut de l'onglet.

Parcourez les sous-onglets dans l'ordre sur une nouvelle installation: Identité et copie, Apparence, Comportement, Flux de support, Formation aux connaissances.

Identité et copie

Identité de marque

Nom du widget, slogan, nom de l’IA, nom utilisé pour les notifications système et d’inactivité, ainsi que la manière dont apparaissent les noms des agents.

Salutation dans le chat

Deux salutations, une pour tous les visiteurs et une autre pour ceux qui ont été identifiés. Une question déclenche plus de conversations qu’une déclaration.

Découpe-poupée

Le message flottant avant l’ouverture du chat, avec son propre nom, sa taille de police et ses couleurs. L’IA peut écrire les teasers, avec des contrôles pour le nombre à générer, combien d’afficher par visite et l’espace entre eux.

Invites et Handoff

Le script complet : demander un nom et une adresse e-mail, confirmations, demande d’un humain, aucun agent disponible, ticket créé ou annulé, remise en attente… Environ deux douzaines de lignes individuelles dans un panneau rétractable.

Avis d'état et d'inactivité

Trois messages visibles par le client : l’agent ferme la conversation, le visiteur est passé au silence et l’ agent remet les clés à l’IA.

Compositeur et Suggestions

Trois bonnes suggestions détournent plus de tickets qu’une page d’articles, et vous pouvez les utiliser pour créer des questions d’ouverture.

Lanceur, Icône et Avatars

Icône du lanceur, une icône différente en option lorsqu'elle est ouverte, taille du lanceurs et images pour l'agent humain et l'IA.

Apparence

Thème et verre

Mode Thème, un préréglage de couleur premium, intensité et opacité du flou, ainsi que des bascules pour les animations, les lignes de séparation, le masquage de la ligne d'état, le masquer la carte de boîte de message et le masque de bouton de fermeture.

Couleurs principales

Le lanceur, l'en-tête, le panneau d'aide, les liens, les boutons, les notifications système et le composeur, chacun avec une couleur de début et de fin pour les dégradés. Utiliser l'option par défaut du verre ignore ces éléments et conserve la finition transparente.

Panneau, bulles et copeaux

Une trentaine de sélecteurs couvrant le panneau, la bordure, le texte, la zone de saisie et chaque type de bulle (visiteur, IA, agent, saisie, système) ainsi que les puces de suggestion et leur état de survol.

Mise en page et forme

La largeur et la hauteur du panneau, le rayon des coins, la taille de police, la position de l'écran, la forme du lanceur, le style de bulle et si les avatars s'affichent.

Comportement

L'IA répond automatiquement

Désactivé signifie que chaque message attend un humain pour répondre.

Suivi humain et double-texting naturel

Un suivi doux lorsqu'un visiteur se tait, et un deuxième message court optionnel comme une personne en enverrait un. Réglé avec le nombre maximum de suivis par silence, le premier délai, le multiplicateur plus tard, la fenêtre de présence et la fenêtre de séquence maximale.

Réponses à la machine à écrire et rythme de réponse

Si les réponses sont tapées mot par mot, et à quelle vitesse l'assistant répond, par préréglage ou votre propre délai minimum et maximum en millisecondes. Un petit délai est plus humain qu'une réponse instantanée.

Traduction en direct

Chaque agent lit et écrit dans sa propre langue tandis que le visiteur lit la sienne.

Retour à l'IA après que l'agent est inactif

Minutes d'inactivité de l'agent avant que l'IA ne reprend la conversation.

Ouvrir automatiquement le chat

Seconds before the widget opens itself. 0 never opens. Intrusive on mobile; leave at 0 unless tested.

Des réponses plus intelligentes

Planifier à l’avance pour des réponses en une seule fois, réfléchir en profondeur, un modèle séparé optionnel pour les réponses de l’agent, montrer le raisonnement aux visiteurs, tolérer les fautes d’orthographe, la mémoire de longue conversation, restreindre l’assistant à votre entreprise seulement, les prix dans la devise du visiteur et comment apparaissent les liens.

Économie de coûts

Saute la recherche de connaissances pour les salutations telles que bonjour et merci, et limite la réponse la plus longue en jetons.

Langues

Quelles langues le widget prend en charge et comment il choisit une pour un visiteur.

Réponses du compte client

Les réponses sont fournies par le compte d'un client connecté, consultées en direct si nécessaire et chargées uniquement au besoin. En lecture seule dans tous les cas. Le chargement lorsque nécessaire réduit sensiblement les coûts.

Remboursements

Demandes de remboursement assisté où l’assistant recueille les détails et remet le dossier à une personne.

Conversation et Widget

Conserver les conversations passées, continuer un chat sur vos sites connectés, fenêtre glissante, demander aux invités de recevoir un e-mail et laisser votre équipe transformer un chat en ticket.

Caractéristiques du widget

Sélecteur d’émoticônes, pièces jointes avec un mode optionnel de collage uniquement, compréhension des images par IA, icônes intégrées, microphone, bouton « Parlez à l’agent », sons du visiteur, aperçu des pièces attachées, bouton d’appel vocal et isolation de la session.

Boîte de réception, notifications et fenêtre contextuelle d'accueil

La fenêtre contextuelle de bienvenue du visiteur, ainsi que vos alertes d’agents : sons de boîte de réception, notifications sur le bureau, murmure sonore, si les murmures privés bipent et l’intervalle de sondage de la boîte à lettres.

Soutien du flux

Délivrance de l ' aide humaine

Comment les demandes d’une personne sont attribuées, le nombre de secondes qu’un agent doit répondre, si un refus renvoie le chat à l’IA et si l’AI reprend lorsque le délai expire. Configurez ceci avant la mise en ligne ou un visiteur qui demande une personne attend simplement.

Heures de travail

Horaires d'ouverture, fuseau horaire et le message de fermeture. En dehors de ces heures l'IA ne proposera pas un humain. Un calendrier distinct des heures d'affaires du billet sous OpsIQ Writing.

Réponse lorsque l'IA est désactivée

La première réponse à un nouveau message, la réponse quand quelqu'un est déjà dans la file d'attente et le temps avant de répéter.

Formulaire hors ligne

Affiche un formulaire de contact au lieu du chat.

Recherche de tickets et notifications du département

Connaissance du ticket d'IA, de sorte qu'un visiteur citant un numéro de ticket obtient son statut réel et les services vers lesquels l'IA peut être acheminée. Un panneau intégré affiche les destinataires réels pour chaque service, résolus de la même manière que le notifiant les résout.

Centre d'aide dans le widget de chat

Permet aux visiteurs de parcourir les articles publiés sans quitter le chat. Vous choisissez l’emplacement du point d’entrée, l’étiquette et l’icône de la barre inférieure, ainsi que si vous souhaitez proposer un lien vers le centre d’aide complet.

Évaluation de la conversation

Notation en étoiles déclenchée lorsqu’un agent ferme le chat, à la fin d’une transmission ou après une période d’inactivité que vous définissez. Choisissez un ou deux déclencheurs, pas tous.

Sondage post-chat

Un court sondage lorsque le visiteur ferme la discussion, avec votre question, le délai, la règle de synchronisation et un plafond par visite. Les visiteurs peuvent également envoyer ou télécharger la transcription.

Sondage par e-mail post-chat

Un sondage de suivi par e-mail après la fin de la conversation, éventuellement dans la langue du visiteur, avec contrôle sur le délai, l'objet, l’intro, la question, les deux étiquettes de bouton et la ligne de remerciement.

Avis sur les réponses

Les pouces vers le haut et les pouces en bas sur chaque réponse d'IA, alimentant les tableaux de bord de qualité.

Archive de conversation

L'archivage automatique après quelques jours, la résolution automatique au bout de quelques minutes de silence et la suppression des conversations archivées après plusieurs jours.

Formation en connaissance

Ce que l'assistant sait réellement. Rien d'autre dans le chat client n'a autant d'importance.

Formation sur la connaissance du site Web

Crawls votre site afin que l'assistant puisse répondre à partir de celui-ci. Jusqu'à dix liens de départ, une limite de page, une profondeur de lien et des dossiers exclus. Un seul URL peut être testé avant le crawling complet.

Embedures

La clé et le modèle API qui transforment les pages en signification consultable plutôt que des mots-clés correspondants.

Organisateur de connaissances AI

Un clic et l'IA lit chaque FAQ et page explorée et les trie en catégories.

FAQs, réponses vérifiées

Paires de questions et réponses traitées comme la source prioritaire, chacune avec un statut, un poids et une catégorie. Elles sont consultables, importables depuis un fichier JSON, et l’IA peut les rédiger à partir d’une description de votre activité. Lorsque l’assistant se trompe, écrivez une FAQ : elle prime sur les pages explorées, la correction est donc immédiate.

Avancé

Performances et limites

Intervalle de sondage, limite du débit des messages et fenêtre, taille maximale des pièces jointes, tentatives de pièces attachées par fenêtre et extensions de fichier autorisées. La liste d'extensions est un contrôle de sécurité; gardez-la serrée.

Livraison en temps réel

La diffusion de messages instantanés et d’états au lieu du polling, via Pusher, Ably ou Firebase, avec un intervalle de polling de secours.

Notifications push

Alertes d'appareil pour les agents via Pusher Beams ou OneSignal, avec un intérêt pour l'appareil.

Push Web (VAPID)

Poussée par navigateur en utilisant vos propres clés générées sans fournisseur tiers, générées ici et non dans Danger Zone.

Voix, vidéo et partage d'écran

TURN les informations d'identification pour que les appels se connectent à travers des réseaux restrictifs, en utilisant Cloudflare ou vos identifiants Twilio ou votre propre TURN URL, nom d'utilisateur et identifiant.

Flux de travail de boîte de réception

Paramètres de l’espace de travail des agents plutôt que les paramètres du visiteur: SLA de première réponse en quelques minutes, vues de file d’attente enregistrées, raccourcis clavier et palette de commandes, recherche dans la conversation et tickets client dans l’inspecteur.

Canaux de messagerie

WhatsApp, SMS, Facebook Messenger, Instagram, Telegram, X direct messages et LINE, chacun avec son propre commutateur de réponse automatique par IA, ainsi qu’un commutador de politique pour les actions d’IA sur les canaux, un déblocage des réponses et le modèle de réengagement WhatsApp. Chaque canal se retrouve dans la même boîte de réception que le chat Web.

Un aperçu en direct du widget au bas de l'onglet est mis à jour lorsque vous modifiez, utilisez-le plutôt que de recharger votre site Web pour vérifier une modification.
Paramètres

Paramètres : Modèles

Chaque emailOpsIQedit le libellé de tout message, et écris des modèles pour n'importe quoi.OpsIQn'envoie pas déjà.

Un design, de nombreux messages

Le modèle de courriel global est l'emballage : votre logo, l'en-tête, la carte, la typographie et le pied de page, avec un milieu vide. Chaque message OpsIQ envoie est inséré dans ce milieu. Editez l'enveloppe une fois et chaque email change ensemble — les réponses du ticket, les reçus du magasin, le mot de passe réinitialisé, les rappels de réservation, les lettres PeopleOS, et tout ce que vous écrivez vous-même.

Il n'y a aucun moyen d'envoyer un courriel de OpsIQ sans ce wrapper. Il est appliqué au seul point que chaque message quitte, donc un message ajouté plus tard ne peut pas le manquer.

Modifier un message

1
Ouvrir les paramètres, puis les modèles

Les messages sont regroupés par ce qu'ils sont : ticket et portail, Store, connexion et sécurité de compte, réservations, conversations et notifications, rapports, lettres PeopleOS, et les vôtres.

2
Appuyez sur Édition sur celle que vous voulez

Vous obtenez le sujet, un éditeur de texte riche avec une vue HTML vous pouvez passer à live, et un aperçu du courriel terminé exactement comme le destinataire le reçoit — votre emballage inclus.

3
Utiliser les puces variables

Les chips au-dessus de l'éditeur sont les faits qui changent: un numéro de ticket, une référence de commande, un temps de réservation. Cliquez sur un pour le déposer où se trouve le curseur.

4
Enregistrer

Seul ce message est écrit. Laissez un champ vide et il conserve sa formulation intégrée; la pilule sur la ligne vous indique dans quel état il est.

💡
Une variable que vous n'utilisez pas est supprimée lorsque l'email est envoyé, et la ligne sur laquelle il se trouve. C'est pourquoi une réservation sans numéro de téléphone n'envoie jamais "Téléphone:" avec rien après elle.

Écrire votre propre modèle

Utilisez ceci pour un messageOpsIQn'envoie pas déjà: un avis de livraison, un rappel de renouvellement, un pack d'accueil, une clé de licence. Il obtient tout ce qu'un message intégré reçoit — l'éditeur, l'aperçu, les règles du plan et votre conception globale — et votre propre système l'envoie à travers leAPI.

1
Appuyez sur Ajouter un modèle

Le bouton se trouve en haut de la page Modèles et à côté de « Vos propres modèles ».

2
Nomme-le

Le nom devient la référence que votre système envoie, affiché sous le champ que vous tapez — par exemple x_custom_delivery_booked. Il ne peut pas changer après, car quelque chose l'envoie déjà.

3
Dites ce qu'il est pour et quand il est envoyé

Ces deux lignes sont ce que vous et vos collègues lisez sur la page des modèles dans un an. Elles valent trente secondes.

4
Énumérer les parties qui changent

Séparé par des virgules, par exemple: nom, quand, tracking_link. Chacun devient un {{variable}} vous pouvez déposer dans le sujet ou le message, et votre système le remplit au moment de l'envoi.

5
Écrivez le sujet et le message

Les phrases simples sont très bien — les sauts de ligne deviennent des paragraphes. Ecrivez le MESSAGE seulement; le logo, l'en-tête et le pied de page proviennent du modèle global.

6
Crée-le, puis ouvre-le

Il apparaît sous « Vos propres modèles » avec l'éditeur complet et un aperçu en direct, comme chaque message intégré.

⚠️
Write the message, not the whole page. A template that carries its own <html> document is refused, because a whole document would slip past the wrapper and your email would go out with none of your branding on it.

Envoi de votre propre modèle

Deux appels sur le produit API. L'appelant fournit le destinataire et les variables — jamais la formulation et jamais le design, donc une intégration ne peut pas envoyer de courrier non branded dans votre espace de travail ni changer discrètement ce que vous dites à vos clients.

Listez vos modèles et les variables prises
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{ "action": "email.templates.list", "mine": true }
Envoie-le.
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{
  "action": "email.template.send",
  "template": "x_custom_delivery_booked",
  "to": "[email protected]",
  "to_name": "Ada Obi",
  "variables": {
    "name": "Ada",
    "when": "Thursday 11 September, 14:00",
    "tracking_link": "https://track.example.com/AB12"
  }
}
💡
Les noms variables vont SANS appareil dans l'appel API. email. templates. list les remet exactement dans la forme que vous leur transmettez.

Modèles et votre plan

Un message que vous n'avez pas le service pour

Restes listés avec un lien "Voir plans" et aucun éditeur — de sorte que vous pouvez voir ce que OpsIQ enverra, et ce qui le déverrouille.

Vos propres modèles

Choisissez le service auquel un modèle appartient lorsque vous le créez, ou laissez-le sur chaque plan. Un espace de travail sans ce service voit qu'il est listé mais ne peut pas l'éditer ou l'envoyer.

Connexion, sécurité, notifications et le test de courriel

Ne jamais planifier. Être incapable de corriger le libellé d'un mot de passe réinitialiser votre propre administrateur reçu serait le mauvais type de verrouillage.

Questions

Puis-je changer la conception pour un seul message?+

Non, et délibérément. Le design est l'emballage et il est partagé, qui est ce qui garde chaque email reconnaissablement le vôtre. Ce qui est par message est la formulation, le panneau de faits et tous les boutons que vous ajoutez à l'intérieur du message.

Que se passe-t-il dans ma formulation si je presse Reset?+

La réinitialisation apparaît uniquement sur le modèle global, et remplace ce qui est dans l'éditeur par le design intégré. Rien n'est écrit avant d'appuyer sur Enregistrer, vous pouvez ainsi fermer la boîte de dialogue pour changer d'avis.

J'ai supprimé un de mes modèles par erreur.+

La suppression prend deux clics pour exactement cette raison — le premier bras il et vous dit ce qui va arrêter de fonctionner. Si elle est déjà partie, créer à nouveau avec le même nom et la même référence revient; seule la formulation doit être retypé.

Un connecteur ou un add-on peut-il apporter ses propres modèles ?+

Oui, un paquet envoie un_templates.jsondans son propre répertoire, et ses messages apparaissent sous "Modèles Developer" avec le même éditeur, prévisualiser, envelopper et plan. Vos modifications de libellé appartiennent à votre espace de travail et survivent à la mise à jour du paquet.

Paramètres

Paramètres: OpsIQ Écriture

Les tickets répondus par écrit: réponses automatiques, le système de ticket natif, l'escalade, les heures d'ouverture, le routage et les e-mails adressés au client.

Auto-réponse

Afficher les boutons d'écriture OpsIQ

Ajoute les boutons d'aide à l'écriture pour vos agents dans le panneau d'administration.

Activer la réponse automatique aux tickets

Met en file d’attente les nouveaux tickets et répond à ceux-ci après un délai. Commencez par le mettre hors service et passez en revue les brouillons pendant une semaine, puis les remboursements, annulations et modifications d’accès devraient toujours arriver à une personne.

Départements de réponse automatique

Tout ce qui n'est pas répertorié est laissé pour un humain, ce qui constitue la valeur par défaut sécurisée.

Calendrier de délai de réponse (minutes)

Une réponse instantanée est considérée comme un robot, quelques minutes sont considérées comme une équipe rapide et la durée de l'attente peut varier selon les situations.

Nombre maximal de réponses AI par ticket et service

Un plafond par département, par exemple Billing 1 and Support 3. Sans capuchon, un fil confus peut se boucler.

Longueur, statut et identité de la réponse

Le nombre maximum de jetons d’écriture, le statut du ticket après une réponse et après une escalade, ainsi que le compte administrateur auquel les réponses automatiques sont attribuées. Utilisez un compte clairement nommé afin que le personnel puisse distinguer les réponset AI des réponses humaines.

Opérations de ticket natives

Système de tickets natif

Le système de tickets intégré à OpsIQ, pour les installations sans un helpdesk externe.

Pipeline des e-mails entrants vers les tickets natifs

Transforme l'email entrant en tickets.OpsIQfournit le point finalURL, auth token, script path et PHP binaire. Tout ce qui peut poster à ce paramètre peut créer des tickets, donc garder le jeton secret.

Réponse multi-tours, délai et debounce

Si l’IA continue de répondre au fur et à mesure que la conversation se poursuit, et s’il attend une fenêtre silencieuse afin que trois messages rapides reçoivent une réponse considérée. La fenêtre tranquille est le meilleur paramètre unique pour faire en sorte que les réponses automatisées semblent considérées.

Portail de soutien public

Une page client où tout le monde peut soulever et suivre un ticket, avec une ligne de bienvenue optionnelle. Son adresse et son apparence sont configurées dans l'onglet Portail d'assistance.

Format du numéro de billet

Nombre de lettres aléatoires apparaissant dans les numéros de ticket générés.

Envoyez des e-mails à vos clients dans leur propre langue

Les e-mails du personnel ne changent jamais de langue : les notifications, les alertes des départements, les briefings et les rapports planifiés restent dans la langue de votre système.

Remerciements et confirmations

Un accusé de réception fixe sur les nouveaux tickets, ainsi que des messages de confirmation lorsqu’un ticket est ouvert, lorsque des commentaires sont laissés et lorsqu’il est fermé. Chacun d’eux comporte un aperçu en direct. Il existe également une boîte à outils globale pour le modèle d’e-mail et le lien derrière le bouton « Afficher votre ticket ».

filtrage des spams AI

Filtre les tickets provenant d'expéditeurs inconnus, et peut éventuellement déplacer le spam suspect de lui-même. Laissez le mouvement automatique désactivé jusqu'à ce que vous ayez regardé son jugement.

Fermer automatiquement les tickets inactifs

Ferme un ticket après un certain nombre de jours tranquilles. Dites au client dans le message de clôture comment rouvrir.

Heures d'ouverture (calendrier SLA)

Fuseau horaire, heures d'ouverture et de fermeture, jours ouvrables et jours fériés pour les minuteries du premier intervenant et de la résolution.

Attribuer automatiquement de nouveaux tickets

Affectation automatique, en option uniquement aux agents qui sont en ligne, avec des compétences d'agent et une sensibilité de correspondance pour le routage basé sur les compétences.

Suggérer des tickets en double

Repère quand un client ouvre un ticket proche d'un autre qu'il a déjà, avec une sensibilité de correspondance réglable.

Enquête de satisfaction après la clôture

Envoie un sondage par courriel le jour suivant la clôture. Les résultats apparaissent sur la page CSAT.

Avertir le département par courriel

Les destinataires sont les membres de ce service, et non l’adresse de la boîte aux lettres du service, qui est l’ adresse d’arrivée des tickets.

Ce que l'IA peut lire

Accès aux données client AI

Un commutateur principal et des autorisations individuelles en lecture seule pour le résumé du profil client, les factures, les transactions, le solde de crédit, les produits et services, les domaines, les serveurs liés et un aperçu général du compte. Commencez par le résume du profil et ajoutez des catégories au fur et à mesure que les réponses en ont besoin.

Escalade et connaissance

Activer l’escalade des tickets par l’IA

Déplace un ticket vers un service plus approprié avant de répondre. Vous choisissez les services autorisés, le délai de vérification et vous pouvez écrire vos propres instructions d'avis d'escalade. Activez la note d'escalade interne afin que votre équipe puisse voir pourquoi un ticket a été déplacé.

Paramètres de connaissances

Si les réponses utilisent le langage du client, si elles s’appuient sur des liens crawlés et des FAQ, si l’IA lit les images et PDF Les pièces jointes, le mode de réponse à la connaissance, JSON Utilisez les liens crawlés et la FAQ doit être activée, sinon l'IA devinera ce que vous avez écrit.

Arrêter la réponse automatique après une réponse humaine

Une fois que le personnel répond, l'IA cesse de répondre à ce ticket et peut parler par-dessus votre propre agent.

Instructions pour les tickets et e-mails

Des instructions en texte libre qui façonnent le ton et le contenu de chaque réponse, avec un exemple de travail pouvant être chargé.

Importer les connaissances de JSON

Téléchargez ou collez un fichier de connaissances JSON pour l'assistant d'écriture.

Studio de bouton

Un concepteur complet pour le bouton client: style d'affichage, taille, étiquette, icône, forme, largeur minimale, style d’arrière-plan avec couleurs primaires et secondaires, angle de dégradé, bordure, rayon des angles, ombre, typographie, remplissage, animation au repos, mouvement et couleurs du curseur, bague de mise au point, plus une boîte personnalisée CSS pour tout ce que les contrôles ne couvrent pas.

Paramètres

Paramètres: Portail de support

Le site client où les utilisateurs soumettent et suivent des tickets et lisent vos articles d'aide. Cet onglet contrôle la façon dont il est accessible et dont les clients se connectent. Sa conception visuelle est réalisée dans le Studio du portail de support.

Portal Studio ou Embedded Ticket Portal : lequel dois-je choisir?

Ce sont deux produits différents et les gens les mélangent constamment. Ils résolvent des problèmes différents, et il est normal de les exécuter ensemble.

Support Portal Studio : un lieu où vous envoyez des clients

Le Studio conçoit un Site de support complet que OpsIQ héberge pour vousIl a sa propre adresse Web, ou votre propre domaine, et il porte toute l'expérience de libre-service: articles d'aide avec recherche, le formulaire de demande, historique des tickets, connexion client et assistant. Choisissez un modèle, travaillez à travers Thème, Navigation, Mise en page, Connaissances, Pied de page, Marque, Tickets, Assistant, Formulaire et CSS, prévisualiser sur les tailles de bureau, tablette et téléphone, puis publier.

Utilisez-le quand Vous voulez une destination de marque que vous pouvez diriger vers chaque client, et vous préféreriez ne pas construire ou maintenir un espace d'assistance à l'intérieur de votre propre site Web.

Portail de billets embarqués: billets à l'intérieur de votre propre site

L'intégration met Uniquement l'expérience de billet sur une page de votre propre site WebLes clients ouvrent, suivent et répondent aux demandes d'assistance sans jamais quitter vos pages. Votre propre en-tête, navigation et design restent exactement tels qu'ils sont Définissez la mise en page, l'apparence et les règles d’accès dans le constructeur de widgets, prévisualisez le résultat, puis copiez l'extrait intégré sur votre page.

Utilisez-le quand Vous avez déjà un site Web ou une application avec sa propre conception et vous souhaitez que le support se déroule à l'intérieur de celui-ci plutôt que de remettre le client à une adresse différente.

La version courte

Le Studio construit Un endroit où vous envoyez vos clients. L'intégration apporte des billets Où vos clients sont déjà. De nombreuses entreprises utilisent les deux, en incorporant le widget de ticket dans leur zone de compte pour des demandes contextuelles tout en conservant le portail hébergé comme destination libre-service complète avec articles et recherche.

Adresse et accès

Mode d'accès

Que le portail soit ouvert à tous ou restreint aux clients connectés, les portails ouverts reçoivent plus de tickets et plus de spam.

Choix de mise en page

Si le portail et le centre d’aide partagent un héros ou utilisent deux, la navigation et le pied de page apparaissent sur les deux surfaces, ainsi que l’étiquette de section de navigation.

Adresse du portail

Choisissez un nom et OpsIQ affichera le portail résultant ainsi que les adresses de centre d'aide correspondantes. Si vous modifiez ce nom ultérieurement, les liens déjà envoyés seront interrompus.

Votre propre domaine

Serve le portail à partir d'un domaine dont vous êtes propriétaire, tel que support. votredomaine. com.

Portail de tickets intégré

Active le widget déroulant décrit ci-dessus, et ouvre l'éditeur d'intégration où vous choisissez la mise en page, l'apparence et les règles d'accès, prévisualisez le résultat et copiez l'extrait pour votre page. Ce n'est pas le Studio du portail: le Studio conçoit le portail hébergé, ce qui met des tickets dans votre propre site.

Comment les clients se connectent

La connexion du personnel est configurée sous Paramètres, Sécurité. The staff login is configured under Settings, Security.

Méthodes de connexion

Quelles options apparaissent sur la page de connexion. Connecteur et e-mail fonctionnent automatiquement.

Connexion par réseau social

Fournisseurs de comptes consommateurs, chacun ayant besoin d'un identifiant client et d'une adresse secrète, avec l'adresse de redirection fournie par OpsIQ pour s'inscrire auprès de ce fournisseur.

Authentification unique (OIDC)

Connexion du client via un fournisseur d'identité, avec émetteur URL, ID de client, secret et une liste facultative des domaines e-mail autorisés.

Client SAML 2.0

The SAML equivalent. OpsIQ Fournit la réponse ACS.URLVous fournissez l'ID de l'entité IdP, la connexion et la déconnexion URLs, X 509 Noms de certificat et d'attribut facultatif. Turn SAML Dans Méthodes de connexion ou il n'apparaîtra pas.

Connexion transparente depuis votre application

Un lien profond signé donc un client déjà connecté à votre application atterrit dans le portail sans s'identifier à nouveau. OpsIQ fournit le secret de signature, portail URL et la clé de l'espace de travail, un itinéraire complet pour votre langue (PHP, Laravel, WordPress, WHMCS, Node.js, Flask, Django, .NET, Rails, Java, Go, et sur auto-hosted installe le OpsIQ Serveur lui-même), des notes de configuration étape par étape, et un générateur pour un lien de test signé. Utilisez le générateur avant d'écrire n'importe quel code.

Comment fonctionne l'itinéraire

Votre client clique sur un lien de support qui pointe sur le parcours. L'itinéraire trouve le client connecté à votre application (un invité est envoyé à votre connexion et retour), lit le secret de votre serveur, signe un jeton unique qui expire en deux minutes, et redirige vers le portail avec aucun-référeur et aucun-store entêtes de sorte que le jeton n'est pas mis en cache ou divulgué.

Le bouton de connexion du portail

Dans Portal Studio, page de connexion, allumez Utilisez la login de mon site Web et définissez votre page de session URL à la même route. Le portail ajoute opsiq_portal_return (la page sur laquelle le client était sur); l'itinéraire ne l'honore que lorsqu'il est à l'intérieur de votre adresse du portail et ramène le client là-bas, signé.

WHMCS

Rien à écrire: le WHMCS hook from Remote Sites signe déjà les clients dans le portail et gère l'adresse de retour URL à votre WHMCS login de la zone client.

Se déconnecter partout

La déconnexion du portail permet également de déconnecter le client de votre application.

Prise et protection

Champs du formulaire de demande

Chaque champ supplémentaire entraîne une perte de soumissions, alors demandez uniquement ce dont vous avez besoin pour trier les données.

Protection contre le spam et les abus

Un honeypot et une limitation de taux protègent toujours le formulaire public. En plus, vous pouvez bloquer les adresses e-mail jetables, ajouter vos propres domaines bloqués et ajouter un CAPTCHA en utilisant Google reCAPTCHA ou Cloudflare Turnstile.

Analyse du portail

Un résumé en lecture seule de l'activité du portail au cours des trente derniers jours.

Paramètres

Paramètres: Permissions, Licence, Cron et Zone de Danger

Le groupe Système, ainsi que les contrôles d’accès de l’équipe qui décident qui peut voir quel onglet Paramètres.

Accès et autorisations de l'équipe

Permissions par administrateur

Chaque administrateur reçoit un ensemble explicite d'autorisations, qui couvre l'accès à la boîte de réception du chat, les sections des paramètres qu'il peut modifier et ses services. Toute personne ayant le rôle d'administrateur complet dispose toujours de toutes les autorisations.

Licence

Affiche votre permis actuel, ce à quoi il vous donne droit et son statut.

Configuration de Cron

Sur le cloud OpsIQ, les tâches planifiées s'exécutent pour vous et l'onglet est caché. Une ligne de crontab pilote chaque tâche planifiée: réponse automatique aux tickets, routage d'escalade, actualisation du taux de change, interrogation des boîtes aux lettres et synchronisation des connecteurs.

1
Copier la ligne

L'onglet montre la ligne crontab exacte pour votre serveur avec le binaire PHP correct déjà choisi.

2
Ajouter à crontab

Exécutez crontab -e en tant qu'utilisateur exécutant PHP et collez la ligne unique, sur cPanel utilisez l'outil Cron Jobs à la place.

3
Vérifier

Utilisez Exécuter maintenant pour tester immédiatement plutôt que d'attendre, puis cliquez sur Suivant.

Le panneau de pulsation montre la dernière exécution, sa durée et ce qui a été traité pour la file d'attente de réponse automatique ainsi que le sondage par e-mail et connecteur. Il avertit lorsque la dernière opération provient du bouton Web manuel plutôt qu'un vrai cron serveur, et quand une pulsation est devenue obsolète.

Zone de danger

Supprimer toutes les données de suivi

Wipes everything OpsIQ Les paramètres et la configuration du site, les adresses bloquées, tout ce que votre équipe a écrit (base de connaissances, FAQ, traductions, conceptions de portails, définitions d'actions) et les reçus de consentement sont tous conservés.

Purger les données plus anciennes que

Le même balayage limité aux enregistrements plus anciens que 30, 60, 90 ou 180 Pour la conservation continue automatique, utilisez les valeurs de rétention dans Général et Suivi à la place et laissez la tâche planifiée le faire.

🚫
Exportez une sauvegarde depuis Paramètres, Général avant d'utiliser quoi que ce soit dans Danger Zone. Ces actions ne peuvent pas être annulées.
Paramètres

Gérer votre équipe

Invitez les membres de l'équipe et assignez des rôles pour contrôler qui peut accéder à quoi.

Équipe
Équipe & départementsL’écran de l’équipe : un tableau des administrateurs avec contact, badge de rôle (Propriétaire, Full Admin, Agent) et les départements auxquels chacun peut accéder.Équipe & départementsespace de travailÉquipe & départements+ Sauvegarder l'utilisateur adminCONTACTRÔLEDEPARTEMENTSAO[email protected]Ada OwusuPropriétaireToutKM[email protected]Kojo MensahAdmin completToutRT[email protected]Rita TettehAgentFacturationSB[email protected]AgentAppui1TEAMInviter & gérer les administrateurs2ROLESPropriétaire · Administrateur complet · Agent3SCOPEDAccès par département
L'écran de l'équipe réelle : chaque administrateur avec son contact, son rôle et les départements qu'il peut atteindre, agents visés, propriétaires pleins.

Rôles

Propriétaire

Accès complet, y compris la licence, la facturation et la zone de danger. Un par installation.

Admin complet

Accès complet sauf licence et zone de danger. Peut gérer les administrateurs.

Agent

Limité aux services affectés. Tickets, chats et analyse uniquement.

Inviter des membres d'équipe

1
Aller à l'équipe

Accédez à Équipe dans la barre latérale.

2
Cliquez sur Inviter

Entrez l'adresse e-mail du membre de l'équipe.

3
Définir le rôle

Choisissez Propriétaire, Administrateur complet ou Agent.

4
Attribuer des départements

Pour les agents, sélectionnez les départements accessibles.

5
Envoyer une invitation

Ils reçoivent un e-mail avec un lien de configuration.

Paramètres

Performance de l'équipe

L'accès est autorisé, non par rôle : la permission de visionner ouvre la page, la permission d'utiliser la gestion déverrouille les cibles, l'AQ et la lecture du confrère-identifiant, et la permission récompense-financier est ce qui ajoute l'onglet Récompenses. Une direction d'équipe peut être donnée à n'importe lequel de ces éléments sans devenir un administrateur complet.

Performance de l'équipe
Performance de l'équipeL’écran de performances d’équipe : les agents sont classés par une barre de score composite, CSAT et un solde de récompense avec un bouton Payer par ligne.Performance de l'équipeespace de travailPerformance de l'équipeAGENTSCORECSATBALANÇERTRita Tetteh4.8$42PayerSBSam Boateng4.5$28PayerKMKojo Mensah4.2$15PayerAOAda Owusu4.9$51Payer1SCOREDPerformance composite2CSAT & LOADNotes + volume3REWARDSSoldes des agents payeurs
L’écran de performances d’équipe réel: chaque agent a obtenu un score sur le volume et CSAT, avec un solde de récompense que vous pouvez payer par ligne.

Comment la page est organisée

Le rendement d'équipe est de cinq onglets. Chaque réponse à une question différente, et ils sont ordonnés par la façon dont ils ont besoin de vous.

01 Centre de commandement

État de file d'attente en direct, résultats clients par rapport à vos cibles, comment la capacité a été dépensée, situations nécessitant une décision, et l'indice par équipière corrigé des preuves.

02 coéquipiers

Le classement, la reconnaissance (les plus améliorées et les plus striées), les quêtes et le contrôle opt-in pour qui peut voir le classement.

03 Qualité

Cartes de pointage, évaluations enregistrées, entente avec les examinateurs ayant corrigé leur chance, dérive des évaluateurs et différends relatifs aux preuves.

04 Récompenses

Valeur symbolique, demandes de paiement et répartition de la période régie : autoriser un plafond financé, revoir l'aperçu, finaliser.

05 Historique

Comment l'espace de travail a évolué au fil du temps : les métriques de tendance avec un graphique, et une carte thermique 28-jour montrant quand l'équipe travaillait réellement. Chaque carte se cache jusqu'à ce qu'il y ait suffisamment d'historique pour la dessiner.

Non noté n'est pas zéro

Un coéquipier sans volume suffisamment manipulé — ou dont les dimensions portent des preuves additionnent jusqu'à la moitié du poids configuré — est montré comme non-correspondant. Leur score, grade et bande sont vides et leur répartition est cachée. Ceci est délibéré : rendre une mesure absente comme zéro place quelqu'un au bas d'un classement pour avoir une semaine tranquille.

Les deux seuils de preuve font des tâches différentes et il est utile de les garder à part. Minimum géré décide si quelqu'un est noté du tout. La note minimale n'affecte pas la note: elle décide l'admissibilité à la récompense et à la prime. Ainsi, un coéquipier peut être pleinement noté et classé et toujours inéligible pour cette période, parce que trop peu de clients les ont notés.

💡
Chaque figure est portée sur l'espace de travail que vous regardez et la plage de temps que vous choisissez. Un coéquipier travaillant dans deux espaces de travail distincts a un enregistrement indépendant dans chacun d'eux. Deux exceptions méritent d'être connues : un site GROUP est un espace de travail, donc ses domaines membres sont mesurés ensemble; et la vue Tous les sites mesure délibérément tout à la fois.

L'indice de performance

Un composite de cinq dimensions, chacune mesurée par rapport à une cible que vous définissez plutôt qu'à des collègues, puis tiré vers le milieu lorsque la preuve derrière elle est mince. Notez la direction : l'ajustement déplace la figure vers 70, donc un score excellent fin est retiré et un faible score maigre est relevé. Une mauvaise première semaine sur quatre conversations n'est pas non plus un verdict réglé.

Qualité

Satisfaction des clients à la suite de commentaires vérifiés.

Réactivité

Les premiers temps de réponse aux percentiles P50 et P90, par rapport à vos cibles.

Résolution

Temps de résolution et taux de résolution à un toucher.

SLA

Atténuation contre le SLA que vous avez configuré, plus les nombres à risque et violés.

Intendance

Réouvrir et transférer les taux — le travail qui revient.

💡
Les poids sont configurables et relatifs; ils n'ont pas à totaliser 100. Les preuves manquantes ne peuvent que baisser l'indice, jamais le soulever — le poids configuré reste dans le dénominateur.

Capacités et temps de production

L'occupation, le temps productif, résolu par heure productive et la part en ligne de la fenêtre. L'utilisation n'est pas volontairement signalée: il a besoin d'heures programmées comme dénominateur, OpsIQ n'a ni liste ni source de changement, et un dénominateur substitué serait une supposition portant un signe de pourcentage. Il se lit comme indisponible avec cette raison jointe.

⚠️
L'occupation dit comment le temps a été passé, jamais comme il était bien passé, et il ne finance jamais, ne porte pas ou taille un paiement. Un coéquipier sans preuve de la manipulation du temps se lit comme indisponible, jamais aussi zéro.

Assurance qualité

Une carte de pointage est la note des examinateurs de la rubrique des conversations réelles contre. Seule une version publiée peut recevoir une évaluation, et publier une nouvelle version ne réécrit jamais ce qui a déjà été noté. Un examen est preuve d'une conversation, pas un verdict sur une personne.

Accord avec l'examinateur

Reporté comme une statistique corrigée par hasard (Kappa de Cohen et Fleiss), pas un pourcentage d'accord brut. Deux évaluateurs qui passent tout sont d'avis 100% du temps tout en ne portant aucune information.

Dérivation de l'examinateur

Que l'évaluateur note systématiquement plus ou moins que ses collègues sur la même conversation — une comparaison par rapport au reste du groupe, pas une tendance dans le temps. Il faut examiner une interaction de façon indépendante plus d'une fois.

Différends

Un coéquipier peut contester officiellement les preuves enregistrées à leur sujet. Un différend ouvert bloque la finalisation de la période de récompense jusqu'à ce qu'elle soit résolue.

Auto-examen

Un coéquipier ne peut pas se soumettre à une évaluation.

⚠️
Les évaluations classées par AI ne peuvent influencer le salaire tant qu'un calibrage n'est pas publié, montrant que le modèle est suffisamment en accord avec les évaluateurs humains, mesuré par kappa contre un échantillon minimum.

Reconnaissance

Le classement seul a documenté les modes d'échec: jeu métrique, burnout, et public hanting de qui est le dernier. Trois alternatives s'assoient à côté.

Plus amélioré

Mesuré contre le propre record d'un coéquipier, jamais contre ses collègues, avec un rétrécissement donc un petit dénominateur ne peut pas acheter une victoire.

Éparpillements

Les périodes consécutives répondant à une barre fixe et déclarée — cote moyenne, volume manipulé, nombre de cotes et taux de rétroaction négatif, tous les chiffres absolus. Chacun peut tenir une série simultanément, donc il ne crée aucun classement, et un collègue ayant un mois exceptionnel ne peut pas briser le vôtre.

Classement en mode «opt-in»

Off par défaut. Un coéquipier voit toujours son propre index; s'ils voient des collègues est une décision d'espace de travail. Les bandes de pourcentage peuvent être publiées au lieu de positions absolues.

💡
La reconnaissance ne touche jamais l'argent. Une série ne peut pas financer un paiement ou casser un, et la plupart des améliorations n'est pas une catégorie de prix.

Quêtes

Une cible vers laquelle l'équipe travaille, mesurée par rapport à une barre fixe déclarée plutôt que l'un contre l'autre — afin que chacun puisse dégager la même quête dans la même période.

Portée et cadence

Individuel ou en équipe; unique, répétable ou saisonnier avec une fenêtre explicite.

Critères

Conversations gérées, cotes reçues, journées actives, cote moyenne ou taux de rétroaction négatif. Tout est absolu — aucune mesure dont la valeur dépend de ce que les collègues ont fait.

Garde de qualité

Requis sur toute quête avec une cible de volume. Affecter le nombre alors que la qualité tombe sous le plancher retient la quête plutôt que de la compléter, et il est montré comme retenu, pas inachevé.

Répéter les limites

Un plafond par période, entraîné par le critère le plus lent, plus un refroidissement facultatif avant qu'une répétition ne puisse compter.

Recherches en équipe

Les progrès partagés sans attribution par équipe sont publiés, de sorte qu'une quête d'équipe ne peut pas devenir un classement.

Séances d'entraînement

Une séance d'encadrement est un disque, pas une conversation. Il a un entraîneur, un coéquipier étant entraîné, un temps prévu, des points de discussion convenus, et un résumé écrit après. De vrais chats, billets et évaluations d'AQ sont épinglés à elle comme preuve, donc la conversation est ancrée au travail qui s'est réellement passé plutôt qu'à une impression rappelée.

Points à traiter

Convenu avant la session, donc le coéquipier n'est pas en train de se lancer dans une surprise.

Preuves

Chats, tickets et évaluations d'AQ attachés à la session. Une broche stocke une référence — un type et un id — pas une copie, donc elle pointe toujours au live record.OpsIQ ne vérifie pas l'identité avant de l'accepter.

Points à traiter

Chacun d'eux a un propriétaire et une date limite. Un élément qui dépasse sa date est indiqué comme étant en retard — un état dérivé, pas un statut que quelqu'un doit se rappeler de définir.

Note privée

Le coéquipier qui est entraîné ne peut jamais le lire, pas en tant qu'agent, ni en tant que gestionnaire, ni comme propriétaire. Ce chèque court avant chaque autre autorisation et ne peut être dépassé.

Qui peut voir une session

L'entraîneur, le coéquipier et toute personne ayant la permission de gérer les performances de l'équipe. Personne d'autre, y compris les autres coéquipiers du même département.

Vérification des comptes

Chaque création, mise à jour, pin, décrochage et achèvement est enregistré avec ce qui a changé, par qui.

💡
L'entraînement est délibérément séparé de la notation et de l'argent. Une session ne change l'index de personne, ne porte pas une récompense, et n'apparaît pas sur le classement.

Récompenses et récompenses

L'activité enregistrée se convertit en jetons avec une valeur en espèces que vous définissez. Le chemin vers un paiement est délibérément lent et chaque étape est enregistrée.

1
Définir la valeur du jeton

Combien de jetons sont égaux à combien d'argent, et ce que chaque activité vaut.

2
Autoriser le plafond financé

Pour une période civile fermée, un administrateur complet indique le montant maximum qu'il peut payer. L'enregistrement du formulaire de paramètres n'autorise pas un budget et ne peut modifier un plafond qui a déjà été autorisé.

3
Revoir l'aperçu

Les bénéficiaires, les réserves et la raison pour laquelle tout le monde n'est pas admissible.

4
Finalisation

La répartition est enregistrée de façon permanente avec les preuves derrière elle. Une période qui n'a rien attribué ne peut être annulée et ré-exécutée sans équivoque. Celle qui a émis des jetons doit d'abord être inversée : OpsIQ écrit une entrée compensatoire contre chaque portefeuille et ne supprime jamais l'original, donc le registre montre toujours ce qui s'est passé et pourquoi, et seulement alors la période libérée.

⚠️
L'admissibilité exige une rétroaction vérifiée de la clientèle. Les cotes de qualité de l'IA peuvent compléter ce jugement mais ne jamais le remplacer, et un coéquipier indiqué comme non noté n'est pas admissible. Chaque contributeur est plafonné à 25% au-dessus de sa part prévue de la période, de sorte qu'un mois très important ne peut absorber l'ensemble du budget.
💡
Le propriétaire du compte ne prend pas part aux récompenses ou aux récompenses symboliques, sans changement : il autorise le plafond financé et finalise chaque allocation, et il n'y a personne au-dessus d'eux pour approuver ce qu'ils paieraient eux-mêmes. Leur travail est mesuré, noté et classé sur le tableau exactement comme tout autre.

Tous les autres participent par défaut, les chefs d'équipe et les copropriétaires inclus. Pour laisser quelqu'un dehors, ouvrez-les dans Team & Departments et éteindre l'option Prendre part aux récompenses et récompenses. Leur travail est toujours marqué et montré; ils cessent d'être un candidat à partir de ce moment-là, et rien n'est touché.

⚠️
Personne n'approuve l'argent pour lui-même. Parce que les gens qui peuvent prendre part sont aussi les personnes qui peuvent approuver les paiements,OpsIQ refuse un paiement ou un crédit dans votre propre portefeuille, payant votre propre réclamation, finalisant une période pendant laquelle vous seriez payé, et finalisant un prix que vous gagneriez. Un autre administrateur complet ou le propriétaire doit le faire.

Qui peut voir et faire quoi

Voir les performances de l'équipe

Le conseil, l'état en direct, la capacité et la qualité de l'espace de travail.

Gérer les performances de l'équipe

Objectifs et notation, exportations, cartes de pointage et évaluations de l'AQ, coaching, quêtes et lectures qui contiennent des données identifiant les collègues comme l'historique par administrateur et l'histoire des prix.

Voir les finances de récompense d'équipe

Soldes, valeurs en espèces, notes de réclamation et références au paiement — séparément des éléments de preuve du rendement parce qu'il est lié à la paie.

Administrateur complet seulement

Toute mutation monétaire : paiement d'une récompense, paiement ou rejet d'un sinistre, autorisation d'établir un budget, finalisation, annulation ou inversion d'allocation, fixation du taux de jeton à la caisse.

L'utiliser équitablement

L'indice de performance est une preuve de la direction, et non une décision d'emploi automatique. Ouvrez les conversations sources derrière un nombre avant d'agir sur elle, et peser la complexité des cas, les horaires, les congés et les besoins d'accessibilité.

Paramètres

Vos sites (espaces de travail)

Les sites (espaces de travail) vous permettent de gérer plusieurs sites Web à partir d'une installation OpsIQ, chacun disposant de son propre suivi, IA, connecteurs et accès d'équipe.

Sites
Vos sites webL'écran des sites : une liste d'espaces de travail, chacun avec son domaine, son type, son connecteur, son badge d'état et un bouton Ouvrir, ainsi que Add-new-site.Vos sites webespace de travailVos sites web+ Ajouter un nouveau siteSshop.acme.comCommerce électronique · Connecteur ShopifyActifOuvertHhost.acme.comHébergement · Connecteur WHMCSActifOuvertBblog.acme.comContenu · pas de connecteurÉtapesOuvert1MULTI-SITEUn espace de travail par site2ISOLATEDLes données ne se mélangent jamais3PER-SITEParamètres & connecteurs propres
L'écran des Sites réels : chaque site est son propre espace de travail isolé (domaine, connecteur et paramètres), ajouté et ouvert depuis une liste.

Créer un site

1
Aller aux sites connectés

Accédez à Sites connectés.

2
Ajouter un nouveau site

Entrez le nom, le domaine et la description.

3
Copier la clé du site

Chaque site reçoit une clé unique (site_xxx) pour l'extrait de code du widget.

4
Configurer indépendamment

Chaque site a sa propre IA, ses connecteurs et ses paramètres.

Combien de sites puis-je avoir?+

Dépend de votre plan de licence. Vérifiez les détails de votre licence.

Paramètres

Licence et plan

Votre licence OpsIQ contrôle les fonctionnalités, les limites du site et le solde de crédit AI.

Licence
Centre de licencesLe OpsIQ License Center: plan, un badge d'état actif, la clé de licence masquée, un compteur de crédit AI et un bouton Force-remote-check.Centre de licencesespace de travailOpsIQ Centre de licencePlanEntrepriseStatutActifCléOPSIQ-••••-••••-2F9CCrédits d'IA$68 reste à faireForcer le contrôle à distance1PLAN & STATUSActive, en un coup d'œil2KEYHMAC-caché localement3CREDITSBalance & limites de l'IA
Le vrai License Center: votre plan et statut actif, la clé masquée, votre solde de crédit AI et une revérification forcée en un clic.
Clé de licence

Entrez dans Paramètres > Licence. Validé par le serveur de licences OpsIQ.

Heartbeat / validation de licence

OpsIQ Utilisez Forcer la vérification à distance lorsque vous avez besoin d'un résultat immédiat ; Diagnostics identifie les licences qui ont été validées par le client. DNS, HTTPS ou des problèmes d'heure du serveur.

Plan

Détermine la disponibilité et les limites des fonctionnalités.

Limite de site

Nombre maximal d'espaces de travail.

Crédits d'IA

Si vous utilisez Managed AI, votre solde de crédit est affiché ici.

Expiration

Renouvelez avant l'expiration pour éviter une interruption du service.

Que se passe-t-il lorsque ma licence expire?+

Le suivi, les tickets et le CRM continuent. Les fonctionnalités d’IA sont suspendues jusqu’au renouvellement.

Paramètres

Profil, mot de passe et authentification à deux facteurs

Chaque administrateur peut conserver sa propre identité, ses préférences de travail, son mot de passe et l'authentification à deux facteurs.

Écran de produit
Mon profil -La page de profil sépare les détails personnels, la langue/le fuseau horaire, l'avatar/la signature, le mot de passe et l'authentification à deux facteurs.Mon profil -espace de travailPROFILCompletTIMEZONEEurope/Athènes2FAActivéVUE DE L'ESPACE DE TRAVAIL EN DIRECTNom et adresse électroniqueIdentité personnelleÉditerLangue et fuseau horaireDates et interfaceÉditerAvatar et signatureRéponses et présence de l’équipeÉditerMot de passe et 2FAProtection de compteSécurisé1UPDATE PROFILEIdentité et localisation2SECURE LOGINMot de passe et 2FA3SAVEAppliquer à cet administrateur
La page de profil sépare les détails personnels, la langue/le fuseau horaire, l'avatar/la signature, le mot de passe et l'authentification à deux facteurs.

Les paramètres de profil appartiennent à l’administrateur connecté et ne modifient pas la marque de l’espace de travail. Utilisez un mot de passe unique et activez l’authentification à deux facteurs : la modification d’un paramètre d’adresse e-mail ou d’authentification peut nécessiter une nouvelle vérification ou une nouvelle connexion.

Paramètres

Préférences de notification

Les préférences de notification contrôlent les événements opérationnels qui parviennent à un administrateur dans le produit ou par courrier électronique.

Écran de produit
Préférences de notificationLa page de notification fournit des choix par événement dans l'application et par e-mail, ainsi qu'une liste de notifications récentes.Préférences de notificationespace de travailIN-APPActivéÉMAILSélectifUNREAD4VUE DE L'ESPACE DE TRAVAIL EN DIRECTBillet attribuéIn-app et emailActivéLe client a réponduDans l'applicationActivérisque SLAIn-app et emailActivéApprobation de l'AIIn-app et emailActivé1CHOOSE EVENTSSeuls les signaux utiles2CHOOSE CHANNELIn-app ou par e-mail3EXAMENNotifications récentes
La page de notification fournit des choix par événement dans l'application et par e-mail, ainsi qu'une liste de notifications récentes.

Les préférences couvrent l’attribution de tickets, les réponses aux clients, les avertissements SLA, le transfert par chat et les événements d’approbation de l’IA.

Paramètres

Vue d'ensemble de la sécurité

La vue d'ensemble de la sécurité est le premier écran pour l'évaluation des blocages, les attaques de connexion, les sessions de menaces, les tendances de sécurité et l'intégrité des événements.

Écran de produit
Vue d'ensemble de la sécuritéSecurity Overview combine les cartes de risque actuelles, une tendance 14-jour, la liste des attaquants, le flux d'événements et l'état d'intégrité.Vue d'ensemble de la sécuritéespace de travailACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3VUE DE L'ESPACE DE TRAVAIL EN DIRECTAuto-bloqué7-jour total et sourceTendanceLes derniers attaquantsIP, pays et raisonExamenÉvénements de sécuritéRisque et résultat de l'actionAlimentationIntégrité de la chaîne de hachageChaîne d'événements Tamper-evidentValide1READ HEADLINEExposition actuelle2OPEN EVIDENCEAttaquants et événements3ACTEBloquer, enquêter, exporter
Security Overview combine les cartes de risque actuelles, une tendance 14-jour, la liste des attaquants, le flux d'événements et l'état d'intégrité.

Utilisez les cartes de titre pour le triage, puis ouvrez l'onglet Audit, Failed Logins, Blocked. IPs ou JavaScript Page d'erreurs pour le travail au niveau de l'enregistrement. 14 Les sessions à risque élevé doivent être examinées par rapport aux preuves de visiteur, de requête et d'authentification avant qu'un blocage permanent ne soit appliqué.

Paramètres

Journal d'audit à l'évidence de toute manipulation

Le journal d’audit enregistre qui a fait quoi, quand, sur quel objet, à quel niveau de risque et si cela a réussi.

Écran de produit
Audit d'activitéLa page d'audit fournit une activité interrogeable et inviolable avec action, acteur, risque, cible et résultat.Audit d'activitéespace de travailÉVÉNEMENTS18.2kHIGH RISK21INTEGRITYValideVUE DE L'ESPACE DE TRAVAIL EN DIRECTConnecteur activé[email protected] · ShopifySuccèsClé API révoquée[email protected] · clé 19SuccèsLes paramètres ont changé[email protected] AISuccèsPermission refusée[email protected] · exportationBloqué1FILTERAction, risque et acteur2EN CE QUI CONCERNEObjectif et résultat3EXPORTCSV ou JSON
La page d'audit fournit une activité interrogeable et inviolable avec action, acteur, risque, cible et résultat.

Filtrer par action, risque et acteur; exporter CSV ou JSON La chaîne de hachage permet de détecter les lignes d'audit manquantes ou modifiées, mais elle ne remplace pas les sauvegardes protégées et l'accès restreint à la base de données. Traitez les exportations d'audits comme sensibles car elles peuvent identifier des utilisateurs, des enregistrements et des actions de sécurité.

Opérations

Diagnostic

Diagnostics transforme les vérifications de sous-système en résultats d'intégrité clairement définis et en actions suivantes directes.

Écran de produit
DiagnosticLes diagnostics regroupent les vérifications de l’intégrité du widget, de l'IA, des tickets, des intégrations, de la Site Intelligence, des tâches en arrière-plan, de le CRM automatisé, des licences et du stockage.Diagnosticespace de travailSAINE13WARNING2FERMÉS1VUE DE L'ESPACE DE TRAVAIL EN DIRECTWidgetPoints de terminaison Beacon et ChatEn bonne santéTâches de fondCron heartbeat tardifAvertissementCourrielTest sortant a échouéÉchouéConnecteursRegistre et réception des événementsEn bonne santé1REFRESHExécuter les vérifications courantes2OPEN WARNINGLire les preuves3FIX AND RETESTConfirmer la récupération
Les diagnostics regroupent les vérifications de l’intégrité du widget, de l'IA, des tickets, des intégrations, de la Site Intelligence, des tâches en arrière-plan, de le CRM automatisé, des licences et du stockage.

La page vérifie la vitesse du site, le classement/mot-clé/lien de retour/données locales, l’IA et la passerelle d’action, les tickets, les robots d’exploration/audits, l'intégration/l'entrée des événements, les tâches en arrière-plan, les automatismes CRM, la licence, le widget et les services produits associés.

Après un changement, actualisez et confirmez que le sous-système affecté est de nouveau en bon état. Une page verte de diagnostics est nécessaire mais pas suffisante pour le lancement. Remplissez également la liste de contrôle préalable au lancement

Paramètres

Sécurité et accès

OpsIQcomprend plusieurs couches de sécurité pour protéger votre administrateur, vos données etAPIaccès.

Comment ça fonctionne
Sécurité et accèsUn bouclier de sécurité à côté des contrôles activés: deux facteurs, OIDC SSO, SCIM 2.0, OAuth2 PKCE, CSRF/CSP, IP Un pare-feu, des limites de débit et un coffre secret.Deux facteurs (TOTP)SSO OIDCSCIM 2.0OAuth2 PKCECSRF + CSPIP Pare-feuLimites de tauxCoffre-fort des secrets
Sécurité

Caractéristiques de sécurité

Authentification d'administrateur

Email/mot de passe avec 2FA optionnel.

Login verrouillage

Verrouillage temporaire après trop de tentatives infructueuses.

IP blocage

Bloquer les plages IPs ou CIDR d'accéder aux sites suivis.

Notation des menaces

Les visiteurs présentant un risque élevé peuvent être bloqués automatiquement.

Application du HTTPS

Requis pour toutes les connexions. HTTP redirige vers HTTPS.

En-têtes HSTS

La sécurité de transport stricte empêche les attaques de déclassement.

Protection de CSRF

Tous les formulaires d'administration incluent des jetons CSRF.

Protection contre XSS

Toutes les entrées de l'utilisateur sont échappées. Les en-têtes CSP restreignent l'exécution du script.

Protection de SSRF

Les webhooks sortants bloquent les adresses IP privées/internes.

Configuration recommandée

1
Activer la 2FA

Pour tous les comptes d'administrateur.

2
Des mots de passe forts

Minimum 12 caractères, mixte.

3
Examen des comptes

Supprimer l'accès pour les anciens membres de l'équipe.

4
Surveiller les connexions ayant échoué

Vérifiez chaque semaine pour les modèles suspects.

5
Restez à jour

Appliquez rapidement les mises à jour pour les correctifs de sécurité.

Paramètres

Rôles et autorisations

Le contrôle d'accès basé sur les rôles vous permet de contrôler ce que chaque membre de l'équipe peut faire.

Rôles & permissions
Rôles et autorisationsUne matrice de rôle par capacité: le propriétaire a tout; l'administrateur complet manque de facturation et de zone de danger; l’agent n’a que des tickets étendus.Rôles & permissionsespace de travailPARAMÈTRESFACTURATIONDANGERBILLETSPropriétaireAdmin completAgentscoped13 ROLESPropriétaire · Administrateur complet · Agent2GRANULARPar page + par département3DEFAULT-DENYLes itinéraires oubliés bloqués
La matrice de rôle en un coup d'œil: Propriétaire obtient tout, Full Admin tout sauf la facturation et la zone de danger, Agent seulement leurs tickets étendus.

Rôles par défaut

Propriétaire

Tout, y compris la licence, la zone de danger et la gestion des installations.

Admin complet

Tout sauf licence et zone de danger. Peut gérer l'équipe.

Agent

Répondez aux tickets et chats des services affectés, consultez les analyses. Aucun accès de paramètres, d'équipe ou de sécurité.

Puis-je créer des rôles personnalisés?+

Pas actuellement. Trois rôles intégrés et l'affectation de départements offrent un contrôle granulaire.

Paramètres

Bloqué IPs

Gérer les adresses IP bloquées d'accéder à vos sites suivis.

Bloqué IPs
Bloqué IPsLe blocage...IPs Écran: un bloc-an-IP/CIDR forme à côté d'une table Adresses bloquées avec chaque entrée, date, raison et un bouton Débloquer.Bloqué IPsespace de travailBloquer un IP / CIDR203.0.113.0/24Votre raison (facultatif)BlocAdresses bloquées203.0.113.912 · force bruteDébloquer45.12.0.0/1610 · messages indésirablesDébloquer102.89.6.29 · abusDébloquer1BLOQUERIP ou plage CIDR2LISTQui et quand, avec le motif3UNBLOCKEn un clic
Le vrai Blocked IPs écran: bloquer un seul IPou une plage de CIDR, et gérer la liste, chacun avec sa date, raison et un clic déblocage.

Comment bloquer

1
Allez dans Sécurité > Bloqué IPs

2
Ajouter une plage IP ou CIDR

Exemple : 203.0.113.42 ou 203.0.113.0/24

3
Ajouter une raison

Documentez pourquoi: spam, abus, scraping, etc.

Le blocage affectera-t-il les utilisateurs légitimes?+

Si les clients partagent un compte d'entreprise IP ou VPN, bloquant ce IP Utilisez des blocs étroits.

Paramètres

Échec des connexions

Toutes les tentatives de connexion infructueuses à votre OpsIQ admin.

Échec des connexions
Échec des connexionsL'écran des connexions ayant échoué : un tableau de comptes/IPs avec le nombre d'échec, l'heure de la dernière tentative et un bouton Bloquer par ligne.Échec des connexionsespace de travailTentatives de connexion ayant échouéIPFERMÉSDERNIÈREMESURES[email protected] · 41.62.10.47Il y a 2mBloc[email protected] · 102.89.6.23Il y a 18 ansBlocInconnu · 45.12.9.712Il y a 26 ansBloc[email protected] · 88.21.4.921h il y aBloc1WATCHTentatives de connexion ayant échoué2COUNTSPar compte / IP3ACTEBloquer de la rangée
L'écran de connexion réel Failed: chaque compte/IP avec son compte d'échec et sa dernière tentative, bloquez une source de force brute directement à partir de la rangée.

Ce que chaque entrée montre

Date/heure

Quand la tentative a eu lieu.

Courriel

Adresse e-mail utilisée.

IP adresse

Source de la tentative.

Pays

Geographic location.

Raison

Mot de passe incorrect, verrouillé ou non trouvé.

Signes d'avertissement

Plusieurs tentatives, même email

Assurez-vous que l'authentification à deux facteurs est activée.

Plusieurs tentatives, différents emails

Attaque automatisée. Bloquer la source IP.

Pays inhabituels

Si votre équipe est locale, les tentatives étrangères sont probablement des attaques.

Paramètres

analyste de sécurité IA

Une couche d’analyse opt-in sur les pages de sécurité : verdicts, résumés des incidents, un résumé quotidien, une vérification hebdomadaire de la posture, Ask Security et politiques de blocage du jeton 0.

Chaque page de sécurité enregistre ce qui s'est passé, mais la lecture nécessite toujours un jugement. L'analyste de sécurité IA ajoute ce jugement en place et il est conçu pour ne dépenser presque rien : il n'est jamais dans le chemin de connexion ou de balise, les règles déterministes réglent les cas évidents sans appel d'IA, les verdicts sont mis en cache et la meilleure sortie de l'analysateur est une règle déterministe qui s’applique ensuite à perpétuité avec zéro jeton. Paramètres → Sécurité; tous par défaut off.

Ce qu'il ajoute

Chips de verdict + Expliquer

Blocked IPs Les lignes Connexions réussies et Échecs de connexion montrent une puce bénigne / suspecte / hostile avec un score de confiance. Expliquer ouvre le raisonnement, les faits utilisés et les actions Bloquer / Libérer en un clic. 24h, so re-viewing an IPL'accès est gratuit.

Briefs d'incidents

Les événements connexes sont regroupés en un seul incident (vague de connexion, analyse URL, rafale de blocage automatique) avec une chronologie en anglais clair et une étape suivante recommandée.

Résumé quotidien

Un résumé par jour: hier par rapport à votre baseline, les blocages, les incidents et la seule chose à faire. Les jours calmes envoient un all-clear déterministe avec zéro jeton.

Vérification hebdomadaire de la posture

Une checklist de durcissement du lundi (lacunes 2FA, seuil de verrouillage par rapport au volume d’attaque réel, alertes désactivées) avec une sévérité, un effort et une solution exacte par élément.

Demandez à la sécurité

Une boîte de question sur la vue d'ensemble de sécurité qui répond à partir de votre état de sécurité en direct. Les questions profondes du serveur sont transmises au chat de l'ingénieur administrateur plutôt que deviné.

Propositions de politique + pilote automatique

L'analyste propose des règles de bloc concret comme cartes d'approbation / rejet; les règles approuvées s'appliquent à zéro jeton avec un compteur de succès en direct. Le pilote automatique optionnel n'approuve que les règler les plus sûres automatiquement.

Paramètres

Analyste de sécurité IA (security_ai_enabled)

Commutateur maître. Active les puces de verdict, explique et demande la sécurité. Seulement ambigu IPs atteindre le modèle, loté en un seul appel.

Résumés d'incidents (security_ai_incident)

Regroupe les événements en incidents et écrit chaque nouvelle histoire sur le cron de sécurité horaire existant.

Résumé quotidien (security_ai_digest)

Un résumé de sécurité par jour sur la cloche et l'aperçu. Les jours tranquilles ne coûtent rien.

Contrôle hebdomadaire de la posture (security_ai_posture)

La liste de contrôle du durcissement du lundi sur l'aperçu. La liste est entièrement déterministe.

Pilote automatique de politique (security_ai_autopilot)

Permet à l'analyste d'activer ses propositions les plus sûres sans surveillance: blocs réversibles limités dans le temps uniquement, unique IPs ou des fourchettes ne dépassant pas. /24, Jamais partagé/mobile/privé, plafonné 10 par heure, toujours audité et réversible.

💡
Chaque appel est marqué security_ai avec son propre plafond mensuel dans AI Config → Cost Guardrails (jetons par défaut 300k). Si le bouchon est touché, les fonctionnalités dégradent pour des lectures déterministes. Bloquer, lock-out et alertes ne dépendent jamais de ce budget. L'analyste ne peut jamais supprimer les données, modifier les paramètres, toucher le registre d'audit, ou faire une interdiction permanente.
Opérations

Cron et automatisation

OpsIQ utilise un planificateur de produit pour exécuter le sondage par e-mail, l'automatisation des tickets, les agrégats d'analyse, la rétention, les files d'attente IA, le travail CRM, les rapports et les tâches de connecteur.

Écran de produit
Cron et automatisationUne entrée cron produit fournit le battement du cœur; OpsIQ décide quels travaux internes sont dus.Cron et automatisationserveurBATTERIEÀ chaque minuteRUNNERcron/all.phpHEALTHParamètresVUE DE L'ESPACE DE TRAVAIL EN DIRECTCourroie de produits unifiéeopsiq/cron/all.phpRequisFiles d'attente de tickets et e-mailTravail à courte duréeActifAnalyse et rétentionCadence interneProgramméConnecteur abonnésÉvénements cron déclarésDélimité1INSTALL ONE LINEExécutez le planificateur de produits toutes les minutes2CHECK CRON SETUPConfirmer les battements du cœur CLI3USE DIAGNOSTICSEnquêter sur les travaux en retard ou manqués
Une entrée cron produit fournit le battement du cœur; OpsIQ décide quels travaux internes sont dus.

Entrée cron du produit requise

Ajoutez cette ligne unique au crontab pour le même serveur et environnement PHP qui exécute OpsIQ:

OpsIQ Entrée de crontab du produit
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

Remplacer /path/to/opsiq Utilisez le chemin complet de l'interface à ligne de commande PHP lorsque l'hôte en requiert un, par exemple /usr/bin/php8.4.

N'utilisez pas le niveau supérieur /cron.php Pour le travail de produit. Dans ce référentiel, le coureur appartient à un service distinct non-produit en dehors de ce manuel. OpsIQ Le produit runner est opsiq/cron/all.php.

Ce que le planificateur unifié conduit

Files d’attente des tickets et de l’IA

Traite les réponses automatiques, les escalades, les approbations et autres travaux de produits en attente.

Courriel entrant

Les boîtes aux lettres configurées pour les sondages où le sondage est la méthode d'entrée sélectionnée.

Analyses et sessions

Assemble les sessions et actualise les agrégats planifiés lorsqu'ils sont dus.

CRM et engagement

Exécute les tâches de notation, cycle de vie, workflow, campagne et rapport planifié qui sont activées.

Conservation et entretien

Effectue le nettoyage, l'archivage, l’expiration et l'intégrité des travaux.

Connecteurs

Envoie les abonnés cron du connecteur et interroge uniquement pour les connecteurs installés, activés et configurés.

Vérifier le cron

  1. Ouvert Paramètres - Configuration de Cron et confirmez que le produit existe.
  2. Utilisation Courir maintenant Une fois, puis confirmez la mise à jour des battements de cœur d'administration et de sondage.
  3. Vérifier Diagnostic pour un problème de heartbeat tardif, PHP CLI, base de données ou chemin de fichier.
  4. Inspecter /tmp/opsiq-cron.log ou le chemin de journal que vous avez sélectionné lorsqu'une exécution manuelle échoue.

Faites des synchronisations longues par lots et stockez un curseur/point de contrôle afin que la prochaine exécution puisse se poursuivre en toute sécurité.

🚫
Lorsque le cron du produit s'arrête, le travail OpsIQ basé sur le temps s'interrompt ou devient tardif même si les pages d'administration ordinaires peuvent toujours se charger.
Opérations

Opérations de déploiement hébergées

Un déploiement OpsIQ hébergé utilise les mêmes écrans et flux de travail que le produit, tandis que l'opérateur d'hébergement gère la couche serveur. Les procédures commerciales d'inscription, de planification, de facturation et de portail de compte sont en dehors du présent manuel.

Écran de produit
Déploiement hébergéL'opération hébergée change qui maintient l'infrastructure; elle ne change pas la façon dont les clients utilisent OpsIQ.Déploiement hébergéespace de travailPRODUCT UIMême OpsIQINFRASTRUCTUREGéré par l'opérateurWORKSPACE DATAIsoléVUE DE L'ESPACE DE TRAVAIL EN DIRECTExécution d'applicationPHP, serveur web et base de donnéesGéréProduit cronPlanifié par l'opérateur d'hébergementVérifierSauvegardes et mises à jourPolitique et preuves du fournisseurExamenOpsIQ paramètresSites, IA, équipe et connecteursVotre équipe de travail1OPERATE OPSIQ NORMALLYUtilisez la même navigation de produit2VERIFY SERVICE HEALTHUtilisation Diagnostics et preuve d'état3KNOW RESPONSIBILITYSéparation des paramètres du produit et de l'hébergement
L'opération hébergée change qui maintient l'infrastructure; elle ne change pas la façon dont les clients utilisent OpsIQ.

Ce que l'hébergeur gère normalement

  • Serveur Web, PHP runtime, service de base de données, TLS et stockage.
  • Le cron du produit unifié et ses journaux au niveau du serveur.
  • Mises à jour des applications, surveillance de l’infrastructure et processus de sauvegarde défini par le contrat d’hébergement.

Ce qu’un administrateur OpsIQ continue de gérer

  • Installation de sites Web et widgets, paramètres d'IA, connaissances, boîtes aux lettres et workflows de support client.
  • Accès des équipes, départements, contrôles de sécurité, clés API, connecteurs, automatismes et paramètres de rétention des données.
  • Vérification du produit par le biais de diagnostics, d’un journal d’audit, de tests de connecteurs et de vérifications réelles de bout en bout.

Contrôles opérationnels

Ne présumez pas qu'un service géré signifie que chaque intégration de produit est saine. Confirmez les dernières preuves de sauvegarde et la politique de conservation avec l'opérateur d'hébergement, et utilisezOpsIQDiagnostics après les changementsDNS, e-mail, fournisseurs d'IA, sites Web ou connecteurs.

L'intégration commerciale, les abonnements, la facturation et l'administration des comptes clients restent en dehors du manuel OpsIQ.

Opérations

Hébergement en self-catering OpsIQ

A self-hosted OpsIQ Vous êtes responsable de l'environnement d'exécution, de la base de données, du TLS, cron produit, sauvegardes, mises à jour et surveillance.

Écran de produit
Auto-hébergementL'auto-hébergement donne le contrôle de l'infrastructure et rend votre équipe responsable de chaque dépendance d'exploitation.Auto-hébergementserveurPHP8.4+DATABASEMySQL 5.7+SCHEDULERÀ chaque minuteVUE DE L'ESPACE DE TRAVAIL EN DIRECTExtensions d'exécutionjsonRequisExtensions supplémentairesxml, en anglais, OpenSSL, Livre de poche, NouveauRequisBase de données alternativeMariaDB 10.3+ avec InnoDBAppuyéTransportAccès HTTPS et fournisseur sortantVérifier1PREPARE THE SERVERConformité aux exigences d'exécution2INSTALL AND CONFIGUREUtilisez une base de données dédiée et HTTPS3ADD PRODUCT CRONExécutez opsiq/cron/all. php
L'auto-hébergement donne le contrôle de l'infrastructure et rend votre équipe responsable de chaque dépendance d'exploitation.

Contrat minimum de logiciel

PHP

PHP 8.4 ou plus récent. Extensions obligatoires : boucle, pdo_mysql, mbstring, json, xml, ouvre, zip, intl et gd.

Base de données

MySQL 5.7+ ou MariaDB 10.3 Créez une base de données dédiée et un utilisateur d'application le moins privilégié.

Serveur Web

Apache ou Nginx configuré pour le contrôleur frontal OpsIQ, les ressources statiques et les réécritures requises.

HTTPS

Requis pour les sessions d'administration, le trafic de widget, les clés API, les webhooks et les appels au fournisseur.

Accès sortant

Autorisez l’accès DNS et HTTPS aux points de terminaison d’IA, de messagerie électronique, de connecteur et de licence que vous activez réellement.

Accès aux fichiers

Les utilisateurs Web et CLI doivent pouvoir lire les fichiers d'application et écrire uniquement dans les emplacements de stockage/d'exécution documentés.

Cron

Exécutez le planificateur de produits OpsIQ toutes les minutes avec la même configuration d'application et l'accès à la base de données que le processus Web.

Séquence d'installation

  1. Chargez la version à la racine du document prévu et conservez la structure de répertoire fournie.
  2. Créez l'utilisateur de base de données et d'application, puis entrez la base de donnée, le URL canonique et les paramètres de licence.
  3. Exécutez le processus d'installation et créez le premier compte propriétaire.
  4. Activez HTTPS et vérifiez les redirections, les cookies et le chemin public du widget/API.
  5. Ajouter le cron unifié du produit OpsIQ:
Cron de produit auto-hébergé
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
  1. Ouvrez Paramètres - Configuration et diagnostics de Cron; exécutez le planificateur une fois et résolvez toutes les dépendances échouées.
  2. Configurez les procédures de sauvegarde, de restauration des tests, de conservation des journaux et de mise à jour avant d'ajouter des données de production.

Mettre à jour en toute sécurité

  1. Lisez les notes de version et vérifiez les extensions PHP/Firefox requises avant de modifier des fichiers.
  2. Sauvegardez la base de données et les fichiers d'application/configuration, puis prouvez que la sauvegarde peut être restaurée dans un emplacement de test.
  3. Déployez les nouveaux fichiers sans supprimer la configuration spécifique à l'installation ou les données d'exécution.
  4. Exécutez le processus de migration/preflight fourni et vérifiez la connexion, le suivi des widgets, les tickets, l’e-mail, l'IA, les connecteurs et le cron.
  5. Gardez la version précédente et la sauvegarde de base de données disponibles pour la fenêtre de restauration documentée.
🚫
Le dépôt de haut niveau /cron.php Ce n'est pas le. OpsIQ Pointez l'automatisation du produit uniquement à. opsiq/cron/all.php.
⚠️
Ne supprimez pas. schema_cache.json pour des raisons de maintenance courante, mais uniquement lorsque les instructions du produit exigent explicitement une reconstruction du cache schema.
Opérations

Guide de production

Liste de contrôle et meilleures pratiques pour exécuter OpsIQ en production.

Guide de production
Guide de productionUne checklist de mise en ligne: domaine personnalisé et SSL, IA entraînée, connecteurs et cron, sauvegardes et rétention, et rôles d'équipe.Liste de contrôle Go-liveespace de travailAvant de passer en directDomaine personnalisé + SSL configuréUne IA formée sur votre contenuConnecteurs testés · cron en cours d'exécutionSauvegardes planifiées · ensemble de rétentionRôles d'équipe assignés et examinés1GO-LIVEListe de contrôle préalable au lancement2VÉRIFIERDomaine · SSL · sauvegardes3CONFIDENTNavire quand il est vert
Une checklist de mise en ligne pour que rien ne soit manqué: domaine + SSL, IA entraînée, connecteurs et cron testés, sauvegardes et rétention, et rôles d'équipe.

Avant de passer en direct

HTTPS configuré

SSL installé, redirections HTTP, HSTS activé.

Cron en cours d'exécution

Vérifiez via la page de diagnostics.

AI testé

Discutez en tant que client. Vérifiez l'exactitude et le ton.

Widget installé

Sur toutes les pages du site. Vérifier avec le flux en direct.

Sauvegarde configurée

Sauvegardes quotidiennes automatisées de la base de données et des fichiers.

Enregistrement des erreurs

Le journal d'erreurs PHP est activé et surveillé.

Équipe invitée

Tous les membres ont des comptes avec les rôles corrects.

Base de connaissances remplie

Au moins 5-10 Articles.

Quotidiennement: Vérifiez le tableau de bord, effacez la file d'attente des tickets, vérifiez les conversations AI.

Hebdomadaire: Examiner les informations sur l'IA, mettre à jour la base de connaissances, vérifier les performances de l'équipe, examiner la sécurité.

Mensuellement : Examinez les tendances d’analyse, vérifiez les connecteurs, mettez à jour la formation en IA et vérifier les sauvegardes.

Opérations

Liste de contrôle préalable au lancement

Exécutez les sources gates et effectuez des vérifications de produit réelles avant une sortie ou un premier lancement en production. Le fait qu'une commande soit disponible ne prouve pas qu'elle a été validée dans votre environnement.

Écran de produit
Vérification de la libérationLa vue de libération montre les portes requises pour fonctionner; elle ne les pré-étiquette pas comme passées.Vérification de la libérationserveurMontantPHP 8.4SOURCE GATESExécuter localementOUTCOMEFondé sur des preuvesVUE DE L'ESPACE DE TRAVAIL EN DIRECTExtensions requisesVérifiez avant la suitePorteBalayage de la syntaxe PHPTous les fichiers PHP du projetPorteÉvaluation de l'IA et PHPUnitExécuter lorsque des dépendances sont présentesPorteVérifications statiques et de navigateurExécuter lorsque configuréPorte1RUN THE CHECKSCapturez la sortie réelle2FIX EVERY REQUIRED FAILURENe remplacez pas les preuves par des hypothèses3TEST THE PRODUCTVérifiez les parcours réels des utilisateurs
La vue de libération montre les portes requises pour fonctionner; elle ne les pré-étiquette pas comme passées.

Portes de source et de libération

Exécutez les vérifications du dépôt à partir de la racine d'installation et conservez leur sortie complète avec l'enregistrement de version.

Portail primaire de preflight
php tools/preflight.php
Porte de libération prolongée
php tools/release_gate.php

Le preflight vérifie l'environnement d'exécution PHP 8.4 et les extensions requises, effectue un balayage de la syntaxe PHP, exécute le ship gate d'évaluation AI et la suite complète PHPUnit, et exécut des vérifications PHPStan/Node lorsque ces outils sont installés. Le gate étendu comprend également des contrôles smoke, clean-install/schema et navigateur de bout en bout lorsque leur environnement est configuré.

Enregistrez la raison pour laquelle il n'était pas disponible, installez les dépendances manquantes ou exécutez-le dans l'environnement de CI/Staging approprié avant sa publication.

Contrôles de produits

1. Authentification et rôles

Connectez-vous en tant que chaque rôle prévu; vérifiez les pages/actions autorisées et refusées.

2. Widget et suivi

Chargez un vrai site dans un navigateur privé; vérifiez le trafic de balise, le flux en direct, les enregistrements des visiteurs et des sessions.

3. Chat et IA

Poser des questions représentatives; vérifier l'ancrage des connaissances, la sécurité, l'escalade et l'historique de l'IA.

4. Billets

Créez, assignez, répondez, transférez, fermez et rouvrez chaque chemin d'entrée activé.

5. Courriel

Testez la remise sortante et chaque chemin de boîte aux lettres entrante ou webhook configuré.

6. CRM et analyses

Créez un contact/affaire/conversion contrôlé et vérifiez les tableaux de bord, entonnoirs, scores et rapports.

7. Connecteurs

Exécutez des tests de connexion, une lecture, un safe write/dry run et des chemins webhook/polling pour chaque connecteur activé.

8. API Webhooks et webhook

Vérifiez les portées étroites, les limites de débit, les réessais idempotents, les signatures et la gestion des doublons.

9. Cron

Exécutez le planificateur de produit unifié et confirmez tous les battements requis dans Cron Setup/Diagnostics.

10. Sécurité

Vérifiez l'authentification à deux facteurs, les contrôles CSRF/de session, les entrées d'audit, la révocation de clés et l'isolation des espaces de travail.

11. Sauvegarde et restauration

Restaurez une sauvegarde récente dans un environnement de test distinct, puis vérifiez les données et la configuration.

12. Observabilité et retour en arrière

Confirmez les journaux/alertes, conservez les ID de requête et prouvez la procédure de rétablissement.

⚠️
Déployez uniquement après que chaque porte requise et parcours critique ait des preuves actuelles pour la version exacte et l'environnement.
Développeur

Web Push sur des sites tiers

Notifications de poussée du navigateur (y compris OpsIQ Push Campaigns) ont besoin d'un travailleur de service servi de l'ORIGINE DU MÊME comme page.OpsIQ widget charges de votre OpsIQ déploiement, de sorte qu'un site tiers ne peut pas enregistrer OpsIQ's worker directly. Hôte un petit fichier sur le propre domaine du site pour permettre de pousser là-bas. Campagnes livrer par les deux méthodes prises en charge.

Comment ça fonctionne
Pousser sur le WebUne notification push de style OS au-dessus de deux cartes de méthode de livraison: VAPID intégré et Pusher Beams.Votre boutique en ligneVotre panier est en attente · 10% dés aujourd'huimaintenantIntégré (VAPID)Aucun tiersHébergez un fichierPusher PoutresUtilisez votre compteAccueillir le travailleur
Pousser sur le Web

Pourquoi cela est nécessaire

Navigateurs laissez seulement une page enregistrer un travailleur de service de sa propre origine. Le widget charge cross-origin de votre OpsIQ déploiement, donc il ne peut pas installer le travailleur push sur un site client, jusqu'à ce que vous hébergez le travailleur sur l'origine de ce site, le widget saute silencieusement push (pas d'erreur, aucun abonnement). Vous avez deux options ci-dessous;OpsIQ Push Campaigns publie les deux.

Option A · Push Web auto-organisé (VAPID, aucun tiers)

1. Téléchargez le worker depuis votre déploiement OpsIQ: https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. Téléchargez-le sur votre ordinateur Web root Il est donc accessible à https://yoursite.com/opsiq-push-sw.js. Le widget Détecte automatiquement ce chemin sur l'origine de la page et l'enregistre, aucun changement d'extrait nécessaire. (Il utilise une portée étroite, donc il ne remplace jamais un travailleur de service que vous avez déjà exécuté.)

Facultatif: Si vous devez l'héberger sur un chemin non standard, pointez le widget dessus avant l'extrait de code. Il est seulement accepté quand même origine:

Optionnel · seulement si le fichier n'est PAS à la racine web
<script>window.OpsIQ=window.OpsIQ||{};window.OpsIQ.pushSwUrl="/custom/opsiq-push-sw.js";</script>

3. Dans OpsIQ, générer des clés VAPID (Paramètres → Client Chat AI → Avancé → Web Push) Le widget demande ensuite aux visiteurs l’autorisation de notification et les y abonne.

Derrière un CDN/Cloudflare? Assurez-vous /opsiq-push-sw.js retourne HTTP 200 (supprimer le cache si c'était 404 avant que vous n'envoyiez une copie; un cache 404 bloquera l'enregistrement).

Option B · Pusher Faisceaux (fournisseur géré)

1. Dans les paramètres OpsIQ, définissez le fournisseur de push à Pusher Poutres Entrez vos Beams Numéro d'instance et Clé secrète.

2. Hébergez le service worker Beams sur la racine du site en tant que /service-worker.js. Copie https://YOUR-OPSIQ/opsiq/pusher-beams-service-worker.js, ou fusionnez cette ligne dans votre worker root existant:

Travailleur des faisceaux, hôte à https://yoursite.com/service-worker.js
importScripts("https://js.pusher.com/beams/service-worker.js");

3. Le widget charge automatiquement les Beams SDK et abonne chaque visiteur à l'intérêt par site. opsiq-site-<your-site-key>. Aucun autre câblage nécessaire.

Comment les campagnes fonctionnent-elles?

Les campagnes Push publient via les deux Les visiteurs sur le worker VAPID auto-hébergé reçoivent la Web Push chiffrée, et les visiteurs abonnés via des faisceaux Pusher obtiennent la publication de Faisceaux. Chaque visiteur est atteint par celui auquel il s'est abonné. Vous pouvez donc exécuter un VAPI D d'origine commune sur certains sites et des fasceaux d'autres sources sur d'autre sites.

HTTPS est requis pour les service workers et les notifications Web Push (localhost est exempté pour les tests). La boîte de réception du chat administrateur utilise déjà le même mécanisme d’intérêt Beams pour les alertes des opérateurs

Opérations

Dépannage

Problèmes courants et comment les résoudre.

Généralités

Page blanche+

Causes: ancien PHP (nécessite 8.4+), extension manquante, connexion à la base de données a échoué, permissions de fichier incorrectes.

Le tableau de bord affiche des zéros+

Vérifiez: widget installé? Cron en cours d'exécution? plage de dates correcte? IP exclus?

IA

L'IA ne répond pas+

Vérifiez: fournisseur configuré? API clé valide (utiliser la connexion de test)? budget épuisé? configuration d'IA de l'espace de travail correcte?

L’IA donne de mauvaises réponses+

Vérifiez : la base de connaissances est-elle à jour ? L’instruction est-elle claire ? Les recherches du connecteur renvoient-elles les bonnes données ? Réexaminez la conversation dans l’historique IA.

L'IA est lente+

Dépend de: la vitesse du fournisseur API, la taille du contexte (grand KB = plus de jetons = moins rapide), la latence réseau.

Suivi

Widget manquant+

Vérifiez: script dans la source de la page? erreurs JS dans la console? blocage CSP? bloqueur d'annonces?

Pays inconnu+

Utilisez Cloudflare (automatique) ou la base de données MaxMind GeoLite2.

Billets

Les e-mails ne créant pas de tickets+

Vérifiez: boîte aux lettres connectée? Cron en cours d'exécution? IMAP Les paramètres sont corrects?

La réponse automatique ne fonctionne pas+

Vérifiez: activé? Département autorisé? IA configurée? Cron en cours d'exécution?

Connecteurs

La connexion a échoué+

Vérifier: les informations d'identification sont-elles correctes? API Accessible depuis le serveur? Base URL C'est correct?

Connecté mais pas de données+

Vérifiez: API portée de la clé? Webhook sync activé? Cron en cours d'exécution?

Résultats

Pages lentes+

Vérifiez: performances de la base de données (SHOW PROCESSLIST), mémoire PHP (augmentez à 1GB), activer l'opcache, réduisez la période de rétention.

Opérations

Widget ne consignant pas les visites

Utilisez cette vérification ciblée lorsque le widget se charge incorrectement ou que Live Feed reste vide.

Lorsque le Le widget n'enregistre pas les visites, vérifiez la clé du site, chargez la page dans un navigateur privé, vérificez les panneaux Réseau/Console du navigateur pour vérifier si des requêtes de balises ou de widgets ont été bloquées, consultez la politique de sécurité du contenu et les bloqueurs d'annonces, confirmez que le site est actif dans OpsIQ et ouvrez Diagnostics.

Référence

Glossaire

Définitions des termes utilisés dans OpsIQ.

Décision

Quelque chose que l’IA peut faire via un connecteur ou la plateforme.

Agent

Un membre de l’équipe avec un accès limité ou un agent d’IA.

BYOK

Apportez votre propre clé, vous fournissez votre propre clef AI API.

Connecteur

Un plugin intégrant une plateforme externe avec OpsIQ.

CSAT

Score de satisfaction client.

Marché conclu

Une opportunité de revenus dans le CRM.

Département

Une catégorie de ticket pour le routage et le contrôle d'accès.

Escalade

Déplacer un ticket vers un autre service ou de l’IA à l’humain.

GeoIP

Détection de l'emplacement du visiteur à partir de l’adresse IP.

Délivrance

Transférer une conversation de l’IA à l’humain.

Jeton d'identité

Jeton signé identifiant un visiteur du site Web.

Base de connaissances

Articles que l'IA utilise pour répondre aux questions.

Plomb

Un visiteur montrant une intention d'achat.

Score du prospect

0-100 Nombre indiquant la probabilité de conversion.

Étape du cycle de vie

Où un client est: Lead, prospect, client, à risque, churned.

IA gérée

AI fournie dans le cadre de votre plan OpsIQ.

Pipeline

Tableau visuel des étapes de l'opération.

RBAC

Contrôle d'accès basé sur les rôles.

Séance

Une série de pages vues dans une fenêtre d'expiration.

Clé de site

Identifiant unique pour un site Web suivi.

SLA

Accord sur le niveau de service, délais de réponse cibles.

Jeton

Unité de texte d'IA. 4 caractères = 1 token.

Couche de confiance

Système de sécurité contrôlant l’autonomie de l’IA.

Couvertures Web

Rappel HTTP pour les notifications d'événements.

Widget

Code JavaScript incorporé sur votre site Web.

Espace de travail

Un site avec son propre suivi, IA, connecteurs et équipe. Même que "site".

Référence

Obtenir plus d'aide

Si cette documentation ne répond pas à votre question:

Admin IA

Cliquez sur "Ask OpsIQ" dans l'administration. A accès à cette documentation et vos données de plateforme.

Ticket de support

Inclure: ce que vous avez essayé, ce qui s'est passé, ce à quoi vous vous attendiez et les messages d'erreur.

Courriel

Envoyez un e-mail au support avec votre clé de licence et la description du problème.

Conseils pour des demandes de support efficaces

Inclure la page

Quelle page d'administration (URL ou nom).

Inclure le paramètre

Nom exact du réglage et valeur actuelle.

Inclure l'erreur

Message d'erreur exact avec des codes.

Inclure les étapes

Ce que vous avez fait, étape par étape.

Inclure les prévisions par rapport aux chiffres réels

Ce qui devrait se passer par rapport à ce qui s’est réellement passé.

💡
Plus votre demande est spécifique, plus la réponse sera rapide. « Cela ne fonctionne pas » nécessite une enquête. « Cliquer sur Enregistrer dans Configuration de l'IA donne le code d'erreur 502» obtient une réponse directe.