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 de l ' administrateurGuide du développeurRéférence CRMSDK de connecteurAPI RESTAuto-hébergé
Portée

Portée de ce 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 de produits et flux de travailInclusExtension OpsIQConnecteurs, APIs et widgetInclusOpération OpsIQSécurité, cron et déploiementInclusRéférencePackage, API et contrats webhookInclus1CHOOSE AUDIENCEOpérateur ou développeur2FOLLOW THE UIMiroir des 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 pratique de Portal Studio

Utilisez le guide d ' administrateur et de développeur dédié à l &apos. architecture du portail, aux pages, composants, aperçu, centre d " aide &quot, identités, SCIM, versions régies, extensions, migrations et certification.

Ouvrir le guide de Portal Studio

Ce qui est ici.

Exécutez 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.

Opérez-le.

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

Par où commencer?

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

Lire les sections de l ' écran dans l " &quot, ordre de la barre latérale. Chaque page s &apos, ouvre avec ce à quoi elle sert, vous pouvez donc arrêter dès que vous avez ce dont vous avez besoin.

2
Si vous l ' administrez

Ajouter Paramètres, Sécurité, Diagnostics, Cron et Production. Ce sont les sections qui décident si tout le reste continue à fonctionner.

3
Si vous construisez une intégration

Commencez par les connecteurs, puis le Constructeur de connecteurs et le RESTAPIet les webhooks. Lisez ceux dans l'ordre et vous aurez vu tous les moyensOpsIQpeut parler à un autre système.

💡
Deux choses changent ce que vous voyez. Les permissions masquent les pages que votre rôle ne peut pas ouvrir, de sorte qu'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

OpsIQest une plate-forme d'exploitation d'entreprise IA-premier complète. Il remplace votre analytique, chat en direct, helpdesk,CRM, SEO boîte à outils, intergiciel d'intégration et plate-forme développeur avec un seul administrateur unifié où chaque outil partage le même contexte client.8-12produits SaaS séparés, vous installezOpsIQune fois et actionnez tout à partir d'un écran.

La plateforme
OpsIQ plateforme unifiéeUn cerveau central d ' intelligence artificielle connecté au chat en direct, au CRM, aux tickets, à l &apos.Chat en directPromotionsCRM AISite Internet d ' IntelBilletsAnalytiqueOpsIQCERVEAU IA1ONE WORKSPACETous les outils dans un seul administrateur2SHARED 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 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 appareil, navigateur, système d ' exploitation, pays, ville, référent, paramètres UTM, page de destination et résolution d " identité. Les sessions regroupent les vues de pages en parcours afin que vous puissiez voir l &apos); ensemble du 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 conversation, les soumissions de formulaires et les signaux d &apos); 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.

Les pages principales

Pages classées par visites, temps d ' engagement, taux de rebond, conversions et activités d " assistance. Identifiez votre contenu le plus performant et les pages qui ont besoin d & #160;ê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 fractionnement sur votre site Web directement à partir de OpsIQ. Créez des variantes, définissez l ' allocation du trafic, les objectifs de conversion et mesurez la signification statistique. Aucun outil de test externe n &apos); est nécessaire.

JavaScript suivi des erreurs

Capturez automatiquement les erreurs JavaScript côté client de votre site web. Voir les messages d ' erreur, traces de pile, navigateurs affectés, comptes de fréquence et pages qui les déclenchent. Déboguer les problèmes frontaux sans surveillance séparée des erreurs.

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 à forte intention identifiés par des modèles de comportement. Score les prospects en fonction des visites de page, du temps passé sur le site, de la fréquence de retour, des interactions avec l ' assistance et des signaux personnalisés. Feed leads directly into the CRM pipeline.

Site Intelligence (SEO et analyse de contenu)

Crawl de site

Crawling automatisé de l ' ensemble de votre site Web pour découvrir des pages, détecter les liens brisés, trouver les balises méta manquantes, vérifier le texte alternatif d &apos. images, valider les URLs canoniques et cartographier la structure de votre Site. Planification des crawls à exécuter quotidiennement, hebdomadairement ou sur demande.

Audit SEO technique

Analyse technique complète : scores de vitesse des pages, réactivité mobile, Core Web Vitals, statut du certificat SSL, chaînes de redirection, détection de contenu en double, analyse de profondeur d ' exploration et validation des données structurées.

Audit du 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 interne/externe et la fraîcheur.

Recherche par IA

Posez des questions en langage naturel sur votre contenu et obtenez des réponses synthétisées par l ' IA avec référence aux pages sources.

Suivi du classement SERP

Surveillez le classement de vos moteurs de recherche pour les 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 des liens de retour

Surveillez votre profil de liens entrants. Voyez quels sites vous renvoient, suivez les nouveaux liens et ceux qui ont disparu, analysez la distribution des textes d ' ancrage et identifiez les opportunités de création de lien.

Grille SEO locale

Pour les entreprises ayant des emplacements physiques : visualisez votre visibilité de recherche locale sur une grille géographique. Voyez comment vos classements varient selon l ' emplacement, la distance par rapport à votre entreprise et l " intention de recherche &quot.

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 surveillez 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.

Soutien par l ' IA

Le chat client IA

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

Assistant IA de l ' administrateur

Un copilote d ' intelligence artificielle dans votre panneau d " administration qui vous aide à rédiger des réponses aux tickets, à élaborer les communications avec vos clients, à analyser les tendances de l &apos. assistance, à rechercher les données client sur toutes les plateformes connectées et à exécuter des actions via le système de connexion.

L ' IA est ancrée dans la connaissance

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.

Transmission automatique aux humains

Lorsque l ' IA ne peut pas résoudre une question, détecte un problème ou que le client demande à être aidé par un humain, elle passe automatiquement la main à votre équipe avec tout le contexte de la conversation.

Des instructions d ' entraînement à l &apos. i. a.

Écrivez des invites d ' instructions distinctes pour l &apos. IA face au client et l " &quot, IA face à l & ; administrateur. Contrôlez le ton, les limites, les règles d ; escalade, les sujets interdits et le comportement propre à l ; entreprise.

Histoire et audit de l ' IA

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

Des idées d ' IA.

Analyse automatisée des modèles de conversation d ' IA. Voir les questions courantes, le taux de résolution, la fréquence de transmission, la satisfaction client par sujet et les domaines où l &apos); &apos.

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 et instructions de formation. Une entreprise SaaS peut utiliser Claude pour le produit principal et GPT-4o pour une marque secondaire.

IA gérée 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.

Les budgets et les contrôles des coûts de l ' IA

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

Tickets et helpdesk

Système de tickets natif

Service d'assistance complet avec les départements, priorités (faible/moyen/haut/urgent), états, suivi SLA, notes internes, réponses des clients, pièces jointes de fichiers et conversations threaded. Pas de service d'aide externe nécessaire.

Triage par IA et réponse automatique.

L'IA trie automatiquement les tickets entrants par département et priorité. Activez la réponse automatique pour les 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 de courriels

Connectez une boîte aux lettres (Gmail, IMAP ou fournisseur spécifique) pour créer automatiquement des tickets à partir d ' e-mails entrants. Les réponses aux e-mailings de notification de ticket mettent à jour le fil du ticket.

Intégrer le 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.

Fusionner les tickets

Fusionner les tickets en double dans un seul fil. Les tickets fusionnés affichent [Fusionné] sur la ligne d ' objet. Tout l &apos, historique de conversation est conservé dans le ticket restant.

Retour à l ' IA

Après qu ' un agent humain a pris en charge un ticket, utilisez « Retour à l &apos. IA » pour laisser l " &quot. IA 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 & eacute; IA peut traiter.

Boîte de réception du copilote

Le copilote suggère des réponses, résume l ' historique de la conversation, recommande les tâches prioritaires/de département 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 &apos: identité du client, historique des conversations et suggestions d " &quot); AI. Plusieurs agents peuvent collaborer sur une conversation.

Règles de chat proactives

Déclencher des messages de chat basés sur le comportement du visiteur : temps passé sur la page, spécifique URL visité, profondeur de défilement, nombre de visites de retour, intention de sortie ou événements personnalisés. Exemple: afficher un message d ' aide après 60 secondes sur la page des prix.

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 &apos); identité du visiteur. Responsive, accessible et personnalisables.

Enquêtes CSAT

Collectez les notes de satisfaction des clients après les interactions par chat et ticket. Concevez des sondages avec vos propres questions, échelles d ' évaluation et invites de suivi.

Sondage par courriel après le chat

Après la fin d ' une conversation, les visiteurs ayant un adresse électronique connue peuvent recevoir un courrier personnalisé avec un résumé de l &apos. IA des questions traitées et le choix en un clic « Est-ce que c &apos); était facile? » Oui/Non. Une fois par fil de discussion, des liens à usage unique signés, chaque message envoyé est consigné et le résultat apparaît sur la page Rétroaction sous forme de signal distinct à côté des étoiles dans la conversation.

Boucle d ' identité de retour

Chaque élément de retour d ' information qui concerne une personne lui montre : son nom, son adresse électronique, un lien vers le parcours client complet et les contacts CRM, ainsi qu &apos. des réponses en un clic par e-mail ou par IA fondées sur son historique réel.

Écrire l ' IA

Un assistant de rédaction IA séparé pour composer des brouillons d ' e-mail, des réponses aux tickets, des annonces et des communications avec les clients. Utilise sa propre invite (et non le cerveau du chat) pour la rédactions professionnelle.

CRM axé sur l’IA

Centre de Commande CRM

Un seul écran affichant l ' état complet de votre CRM : valeur du pipeline, vitesse des transactions, tâches à venir, transactions à risque, activité des agents et recommandations d &apos. La page d " accueil du CRM est votre point de départ quotidien.

Contacts et sociétés

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

Conseil des affaires et du pipeline

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

L ' IA entraîne les négociations.

L ' IA analyse chaque transaction et fournit des conseils : signaux de risque (départ silencieux, concurrents mentionnés, préoccupations budgétaires), recommandations sur la meilleure action à entreprendre, probabilité de gagner et calendrier suggéré pour le suivi.

Prévisions et rapports

Prévision des revenus basée sur les données du pipeline, l ' historique des taux de clôture et la vitesse d &apos. Les rapports comprennent le pipeline par étape, par propriétaire, par source, les taux d " emploi, la taille moyenne des transactions et la durée du cycle de vente.

Agent prospecteur (DTS)

La prospection basée sur l ' intelligence artificielle identifie les clients potentiels à partir des données de vos visiteurs, des signaux d &apos. et de l " &quot, suggère des cibles de communication, élabore des messages initiaux et note la qualité des contacts.

Séquences de suivi

Séquences de suivi automatisées en plusieurs étapes : envoyer un e-mail, attendre, envoyer, vérifier la réponse, faire évoluer. Définissez des séquences pour les nouveaux prospects, les affaires bloquées, les contrôles après 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 gestion des données

Un agent d ' intelligence artificielle qui nettoie et enrichit continuellement vos données CRM : il déduplique les contacts, remplit les champs manquants, valide les courriels, normalise les noms des entreprises et signale les dossiers obsolètes.

Construire mon CRM

Configuration CRM en langage naturel : indiquez à l ' IA à quoi ressemble votre processus de vente et elle crée les étapes du pipeline, des champs personnalisés, des modèles d &apos.

Vérification de la santé du CRM

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

Composez en toute confiance

Contrôle de l ' autonomie à trois niveaux pour chaque agent d &apos.. CRM AI: Pilote automatique (l &apos, IA agit indépendamment), Copilote (l, IA suggère, l &, homme approuve) et Manuel (l, IA observe uniquement).

Quatre agents d ' IA

Le CRM utilise 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).

Connecteurs et intégrations

Connecteurs prédéfinis

Connecteurs prêts à l ' emploi pour Shopify, WooCommerce, BigCommerce, Magento 2, PrestaShop, OpenCart, osCommerce WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Postmark, Resend, SendGrid, Mailgun, Gmail, IMAP, Slack et Google Business Profile. Chaque connecteur apporte des actions d ' IA spécifiques à la plate-forme, des connaissances et une synchronisation de 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 connecteurs 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. Il gère automatiquement l ' authentification, la pagination et le traitement des erreurs.

OAuth flux pour n ' importe quel connecteur

Générique in-app OAuth support PKCE, gestion de l ' état du site, mise à jour automatique des jetons. Les connecteurs définissent leurs propres OAuth paramètres et OpsIQ 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 niveau de marché

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 du 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. Utilisez l " &quot, outil resign_all_connectors &quot); pour resigner après les mises à jour.

SmartLookup

Système déclaratif de correspondance floue pour les actions du connecteur. Définir des règles de recherche et OpsIQ fait correspondre les requêtes des utilisateurs aux entités de la plate-forme en utilisant les algorithmes fuzzyScore et smartRank. Exemple : find_country("germ") fait coïncider Allemagne avec 88.9% la 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 d ' entreprise communs. Exemple : « Lorsqu &apos, une nouvelle commande arrive sur Shopify, créer un ticket, mettre à jour le CRM et envoyer une notification Slack. »

Synchronisation des connaissances

Les connecteurs déclarent des sujets de connaissance qui se synchronisent avec la base de connaître d ' IA. Les articles d " aide propres à une plate-forme, les guides d & installation et les étapes de dépannage sont automatiquement disponibles pour l &apos); AI sans saisie manuelle des connaissances.

Plateforme de développement

API REST

Un nom.JSON API couvre tous les administrateurs enregistrés.JSON opération, avecAPI-authentification par clé, isolation de l ' espace de travail, portées, 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, prospects, inscriptions d ' utilisateurs et abandon de panier. Livraison asynchrone via la file d " &quot); ordres de tâches, réessai exponentiel, protection SSRF et désactivation automatique après des échecs consécutifs de 15.

Signature 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 pour le widget de suivi avec résolution d ' identité, suivi personnalisé des événements, contrôle par programme du chat et configuration spécifique à la page. Installer les recettes pour React, Vue, Next.js, WordPress, Shopify et statique. HTML.

Plugins et SDK

SDKs et plugins côté serveur pour les frameworks communs. WordPress plugin, WHMCS module, et des bibliothèques d ' intégration PHP/Node.js génériques.

É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 professionnel. Les évéments apparaissent sur la timeline du visiteur et sont alimentés par le contexte analytique et d ' IA.

Livre de cuisine Triggers

Créez des workflows automatisés déclenchés par des événements: nouveau ticket, chat lancé, visiteur identifié, étape de transaction modifiée ou évéement personnalisé. Les déclencheurs exécutent des actions de connecteur, envoient des webhooks, mettent à jour les enregistrements ou notifient votre équipe.

Constructeur API

VisuelAPIConfigurer les paramètres, les demandes de test, inspecter les réponses et les intégrations de débogage sans quitterOpsIQ.

É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 (seuls les départements assignés, aucun accès aux paramètres).

Tableau de bord des performances d ' équipe

Tableau de bord réservé aux propriétaires et aux administrateurs complets montrant les temps de résolution, la distribution des charges de travail, la profondeur du traitement, la ventilation des canaux, l ' analyse des tendances, la conformité au contrat d &apos. niveaux de service (SLA), le CSAT par agent, les taux de réouverture, les regroupements d " équipes et les heures les plus occupées.

Présence de l ' administrateur et suivi en ligne

Widget qui est en ligne en temps réel dans la navigation d ' administration. Détection de présence basée sur le rythme cardiaque (60-second ping, 300-second extension, auto-taille 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 départements de tickets, son image de marque et ses règles opérationnelles.

Gestion multi-sites

Gérer plusieurs sites Web à partir d ' un seul. OpsIQ admin. Chaque site a son propre extrait de suivi, ses données de visiteur et sa configuration. Basculez entre les sites à partir de la navigation d ' administration.

Système de modèles d ' e-mail

Modèles d'e-mails axés sur le registre pour toutes les communications automatisées : notifications de ticket, transcriptions de chat, courriels 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.

Importer et exporter

Importer des contacts, tickets et articles de connaissances depuis CSV/JSON. Exporter les données des visiteurs, rapports d ' analyse et enregistrements CRM. Portabilité des données pour la migration entre systèmes.

Sécurité, conformité et opérations

Entreprise SSO

OIDC (OpenID Connect) authentification unique avec temps d ' exécution complet : découverte, autorisation, rappel, vérification de la signature JWKS, informations utilisateur, liste des domaines autorisés, approvisionnement JIT et gardes d " &quot. SAML Configuration support.

GDPR et conformité des données

Gestion intégrée des demandes d ' accès aux données (DSAR) : exportation et suppression des données client sur tous les systèmes. Effacement des données au niveau du contact, y compris sessions, tickets, chats, enregistrements CRM et journaux de messagerie électronique.

IP blocage et protection contre la force brute

Spécifique au bloc IPs ou s ' étend de l &apos, à accéder à votre site ou à l " &quot. Verrouillage automatique après des tentatives de connexion ayant échoué.IP, horodatage et agent utilisateur.

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

HTTP Strict Transport Security, en-têtes Permissions-Policy et configuration sécurisée des cookies. Les déploiements auto-hébergés peuvent ajouter des en-tèmes CSP via la configuration du serveur.

Durcissement du webhook sortant

SSRF garde bloque webhooks à privé/metadataIPgammes. La livraison d'Async empêche les paramètres lents de bloquer votre application.15des défaillances consécutives empêchent le gaspillage de ressources sur des points morts.

Isolation de l ' espace de travail

Isolation stricte des données entre les espaces de travail. Les visiteurs, les tickets, les chats, les enregistrements CRM et les conversations d ' IA sont intégrés à leur espace de travail respectif.

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 FX 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, mise à jour de l &apos..

Politiques de conservation des données

Configurez la durée de conservation des sessions visiteurs, transcriptions de chat, historique des conversations IA et 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 ' état du système montrant l &apos. état cron, la connectivité à la base de données, le statut du fournisseur d " &quot); IA, l &quot: santé des connecteurs, les taux de livraison webhook et l & utilisation du stockage. Avertissements pour les problèmes de configuration et les goulets d &amp.

A qui s ' adresse OpsIQ

Magasins de commerce électronique

Magasins

Suivez chaque visiteur de l ' atterrissage à l " &quot, achat. Laissez l & ; IA répondre &quot: &quot. Où est ma commande? &quot); en utilisant des données en temps réel Shopify/WooCommerce/BigCommerce. Gérez les tickets d &apos, assistance avec une réponse automatique par IA. Exécutez un pipeline d &quot

Entreprises de logiciels et SaaS

SaaS

Surveiller les inscriptions d ' essai et l &apos, adoption des fonctionnalités avec le replay de session. Suivre quelles pages de documentation sont converties. Automatiser le support grâce à une IA ancrée dans votre système API Gérez les revenus d ' abonnement et les offres d ’ expansion dans le CRM. Connectez votre plateforme de facturation (Stripe, WHMCS Utilisez l ' agent du cycle de vie CRM pour détecter et prévenir les départs.

Agences et indépendants

Agence

Offrez des analyses en marque blanche et des portails d ' assistance aux clients. Suivez les prospects sur plusieurs sites clients à partir d " un seul administrateur. Utilisez le pipeline CRM pour gérer les prospectes et les projets potentiels. Créez des connecteurs personnalisés pour les plateformes client à l &apos, aide du Connector Builder. Générez des rapports SEO de marque avec Site Intelligence. Revendrez des connecteur de marché comme services à valeur ajoutée.

Hébergement et infrastructure

Hébergement

Profonde WHMCS intégration avec 80+ Actions d ' IA pour la recherche de commandes, gestion des services, DNS Répondez automatiquement aux questions d ' hébergement courantes en utilisant les articles de la base de connaissances. Suivez le comportement des pages de statut du serveur. Gérez les tickets de support technique grâce au triage par IA. Utilisez l &apos, échelle de cycle de facturation pour les plans d " hébergement mensuels et à vie.

Les entreprises qui ont besoin de beaucoup d ' aide,

Soutien

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 de marketing et SEO

Commercialisation

Suite complète de Site Intelligence: crawls, audits SEO techniques, analyse du contenu, suivi des classements 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. Attribution de campagne sur tous les canaux.

Fondateurs solitaires 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 avec OIDC pour une authentification centralisée. Isolation de plusieurs espaces de travail pour des marques ou divisions distinctes. Configuration d ' IA par espace de travail avec différents fournisseurs et modèles. Développement de connecteurs personnalisés avec distribution sur le marché. GDPR outils de conformité et des politiques de conservation des données.

Ce que OpsIQ remplace

Google Analytics + 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.

Interphone + Drift + Tidio

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

Zendesk + Freshdesk

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 tickets, fusion de tickets et fonctionnalité Retour à l &apos.

HubSpot + Pipedrive + Salesforce

CRM d ' abord basé sur l &apos, IA avec quatre agents spécialisés en IA (Steward, SDR, Retention, Analyst), contrôle de l " autonomie Trust Dial &quot.

Ahrefs + SEMrush + Moz

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

Zapier + Make + intergiciel personnalisé

Connecteur SDK avec 25+ connecteurs prédéfinis, Connector Builder (sans code/AI-assisted/full-code), OAuth flux, enregistrement automatique de webhook, un grand catalogue de définitions d ' action de connecteur qui ne deviennent exécutables que lorsque le connecteur correspondant est installé, activé, configuré et validé, SmartLookup, marketplace et paquets 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 ' e-mail séparés

Modèles de courrier électronique basés sur le registre avec éditeur visuel, aperçu en direct, puces variables, contrôle global de la mise en page 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 accords de niveaux de service (SLA), CSAT par agent, taux de réouverture, heures les plus occupées, suivi des présences en temps réel et analyses par département.

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 s ' exécute sur une infrastructure gérée. Le fonctionnement du produit est le même : l &apos, infrastructure, les mises à jour et les sauvegardes sont prises en charge par l " &quot, opérateur d &apos. hébergement. Ce manuel documente le temps de fonctionnement de _OpsIQ plutôt que les flux marketing ou commerciaux des comptes.

Module auto-hébergé

Installer OpsIQ sur votre propre serveur pour un contrôle total des données, de l ' image de 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é complète sur les données.

Ordre de lecture recommandé

1
Démarrage rapide

Suivez le guide de configuration en 30 minutes pour obtenir un suivi, une conversation et l ' IA de base 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

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

4
Tickets et support

Mettez en place des départements, configurez les réponses automatiques avec l ' IA, connectez la gestion de courrier électronique 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 confiance et laissez l &apos..

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 via le REST API.

💡
Nouveau dans OpsIQ? Commencez avec le guide de démarrage rapide ci-dessous. Vous pouvez avoir un suivi et une conversation IA basique en cours d ' exécution sous 30 minutes.
Commencez ici

Démarrage rapide dans 30 minutes

Suivez ces étapes pour faire fonctionner OpsIQ. Chaque étape se base sur la précédente. À la fin, vous aurez le suivi des visiteurs, un chat IA et une assistance de ticket basique.

Étapes
Liste de contrôle du démarrage rapideUne liste de contrôle d ' installation guidée montrant l &apos. installation des widgets, la connexion à la plateforme, la formation en IA, les invitations aux équipes et le lancement, avec une barre de progression de 60 pour cent.CommencezsetupInstaller le widget OpsIQFAITConnectez la plate-forme (WHMCS, Shopify...)FAITEntraînez votre IA sur vos contenusFAITInvitez votre équipeVérifiez et passez en directProgrès de la configuration3 des 5 · 60%1STEP 1Installer le widget2STEP 2Connecter et entraîner l & IA3STEP 3Inviter à & passer en direct
Le chemin 30-minute: installer le widget, connecter une plateforme, entraîner votre IA, inviter l ' équipe, puis passer en direct.

La configuration 30-minute

1
Activer votre licence

Entrez votre clé de licence dans le champ OpsIQ admin. Allez dans Paramètres, entrez la clé de licence fournie pour cette installation et cliquez sur Activer. Vous devriez voir un badge vert « Actif ».

2
Définissez votre identité professionnelle

Allez dans Paramètres et remplissez le nom de votre entreprise, l ' industrie, le fuseau horaire, la monnaie par défaut et les heures d &apos. Ces informations sont utilisées par l " &quot); IA pour répondre aux questions des clients et par les analyses pour établir des rapports tenant compte du fuseaux horaires.

3
Choisissez un fournisseur d ' IA

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

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, allez dans Connecteurs, trouvez votre plateforme, entrez les informations d &apos; identification et cliquez sur Tester la connexion. Cela donne à l &apos: IA un accès aux données de commande, aux profils clients et au contexte du support technique.

6
Invitez votre équipe

Allez dans Équipe, cliquez sur Inviter, entrez leur adresse e-mail et leur rôle (Propriétaire, Administrateur complet ou Agent). Les agents ne peuvent accéder qu &apos; aux services auxquels vous les avez affectés. Les propriétaires et les administrateurs complets voient tout.

Le chemin le plus rapide possible (5 minutes)

Étape 1: Installer le widget

Copiez l &apos; extrait de Connected Sites et collez-le sur votre site Web. Vous obtenez ainsi un suivi immédiat.

Étape 2: Activer l &apos; IA

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

Fait

Vous disposez maintenant du suivi des visiteurs et d &apos; un chat IA. Vous pourrez ajouter des tickets, CRM et connecteurs plus tard.

Jour 2: Rendre utile

Ajouter des connaissances

Accédez à la base de connaissances et ajoutez 5-10 des articles sur vos questions les plus fréquentes. L &apos; IA s &apos, en sert pour répondre aux 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 »). Attribuez des membres de l &apos; équipe à chacun.

Écrivez votre invite d &apos; IA

Allez à la formation IA et écrivez une invite d &apos; IA client qui décrit votre entreprise, le ton de votre communication et les règles d &quot; &quot.

Tester une conversation

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

Semaine 1: Construire vos opérations

Connecter un courrier électronique

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

Activer la réponse automatique aux tickets pour les services sécurisés. Définir un délai de 2minutes afin que des humains puissent intervenir en premier.

Examen des statistiques

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

Commencez votre CRM

Ouvrez AI CRM et laissez OpsIQ importer les contacts de vos plateformes connectées. Regardez le tableau des pipelines.

Mois 1: Optimiser

Revoir l &apos; histoire de l &quot; &quot.

Vérifiez l &apos; historique de l &quot; &quot. Recherchez les mauvaises réponses, les questions manquées et les occasions d &apos); ajouter des connaissances.

Ajouter des règles proactives

Créer une règle : si un visiteur est sur la page de tarification pendant plus de 60 secondes, afficher un message de chat lui demandant s &apos; il a besoin d &apos.

Construisez un connecteur

Si vous utilisez une plateforme qui n &apos; a pas de connecteur intégré, utilisez le Générateur de connecteurs pour en créer un.

Configurer les 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 &apos; IA avec des données spécifiques à la plate-forme, mais OpsIQ fonctionne sans eux. Commencez par le suivi et le chat, puis connectez les plates-formes au besoin.

Que faire si je n &apos; ai pas encore de site Web?+

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

Comment savoir si le widget est installé correctement ?+

Visitez votre site web dans un navigateur privé/incognito. Puis cochez OpsIQ Flux en direct. Votre visite devrait apparaître dans 15 Si ce n &apos; est pas le cas : (1) est l &apos; extrait collé correctement, (2) si la clé du site est correcte, (3) sont des bloqueurs de publicité ou des en-têtes CSP bloquant le script.

Commencez ici

Carte complète du produit

OpsIQ n &apos; est pas une seule fonctionnalité. Il s &apos, agit d &apos: un administrateur opérateur, un widget de site Web, une couche de support IA, un système de tickets/helpdesk, un CRM complet avec quatre agents IA, une suite Site Intelligence, une plateforme connecteur avec marketplace et une surface développeur.

Opérateur admin

Tableau de bord, flux en direct, journal des visiteurs, sessions, lecture de la session, pages principales, géo-intelligence, entonnoir d &apos; intention, journal d &quot; é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 pour les offres de services, prévisions, recherche, séquences, cycle de vie, gestionnaire de données, créer mon CRM, configuration du CRM, santé du CRM) API), tickets, boîte de réception du chat, règles proactives, enquêtes CSAT, brouillons d &apos; e-mails, boîtiers électroniques, configuration IA, formation IA, historique IA, informations sur IA, base de connaissances, connecteurs, Connector Builder, marketplace, sites connectés, gestion d &quot; &lt; &gt; équipe, performances de l &apos); équipe, paramètres, diagnostic et licence.

Surfaces face au client.

Widget de suivi du site Web (balise d &apos; analyse + chat + intégration de tickets + recherche dans la base de connaissances), chat client IA, portail de soumission des tickets, gestion des jetons d &quot; &quot. identité des visiteurs, téléchargement de fichiers, widget d &amp; enquête CSAT et centre d &lt; &lt. aide destiné aux clients.

CRM axé sur l’IA

Centre de commande, contacts, entreprises, offres, tableau de pipeline avec glisser-déposer, coaching d &apos; offres par IA (signaux de risque, meilleure action suivante, probabilité de victoire), 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 responsable des données (désurveillance, enrichissement, validation), Build my CRM (configuration en langage naturel), configuration CRM, vérification de l &apos. é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 d &apos; intelligence de site

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 des en-têtes), recherche sémantique alimentée par l &apos; IA, suivi du classement SERP sur tous les moteurs, recherche de mots clés avec notation d &apos. opportunités, analyse et surveillance des liens externes, visualisation locale de la grille SEO, synchronisation du profil Google Business (avis, publications, questions/réponses, photos, informations), rapports planifiés (quotidiens/hebdomadaires/mensuels) et marque blanche. PDF pour les agences.

IA et automatisation

Chat client AI (multi-fournisseur: Claude, GPT-4o,Gemini, Grok), assistant d'administration de l'IA, mise à la terre des connaissances de l 'intelligence artificielle, auto-handoff avec retour configurable, configuration de chaque espace de travail, gestion d'IA et BYOK les modes, les budgets jetons et le contrôle des coûts, la piste d'audit historique de l'IA, l'analyse des informations sur l'intelligence artificielle, le triage de ticket AI, la réponse automatique du ticket avec retard, l ́écriture de l ́intelligence artificielle (invite séparée) et le copilote de boîte de réception d ́administration.

Connecteurs et intégrations

25+ connecteurs prédéfinis (Shopify, WooCommerce, BigCommerce, Magento2, PrestaShop, OpenCart, osCommerce WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Postmark, Resend, SendGrid, Mailgun, Gmail, IMAP, Slack, Google Business Profile), Connector Builder (no-code/AI-assisted/full code), générique OAuth flux avec PKCE, marché de connecteurs avec distribution payante, signature et vérification des connecteurs, correspondance floue SmartLookup, un grand catalogue de définitions d &apos; actions HTTP dont la disponibilité dépend de l &apos. 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 (asynchrone, signé, réessayé, protégé par SSRF, désactivation automatique), ÉvénementsAPI pour l ’ ingestion d ’ événements personnalisés, widget SDKavec résolution d &apos; identité, livre de recettes des déclencheurs, contrats d ’ action, connecteur SDK, emballage de marché, SDK côté serveur (PHP, Node.js), WordPress plugin, et WHMCS module.

Paramètres et opérations

Identité d &apos; entreprise, configuration de l &apos. I. 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 &quot; équipes, tableau de bord des performances de l ;équipe, suivi de la présence de l&apos; administrateur, système de modèles d &amp;e-mail (guidé par le registre, éditeur visuel, puces variables), concepteur de sondages, connaissance du domaine, configurations d ;intégration de tickets, image de marque, politiques de conservation des données, gestion du cycle de facturation (mensuelle à vie), normalisation de la monnaie, importation/exportation, diagnostics, automatisation cron et zone dangereuse.

Sécurité et conformité

Entreprise SSO (OIDC avec vérification JWKS, provisionnement JIT), SAML configuration, GDPR/DSAR gestion (exportation et suppression sur tous les systèmes), effacement des données par contact, gestion du consentement, isolation de l &apos; espace de travail (étendue stricte de la couche de requête), pistes d &apos. IP blocage, webhook sortant SSRF guard et politiques de conservation des données.

Pont 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 &apos; administration

Tableau de bord

Noyau

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

Flux en direct

Analytique

Flux de visiteurs en temps réel : pages vues, chats lancés, formulaires soumis et signaux d &apos; 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 &apos; exploitation, pays, ville, référent, paramètres UTM, page de renvoi, identité et historique complet des pages vues.

Séances

Analytique

Vue groupée par parcours : flux de page, temps sur la page, profondeur du défilement, chemin de conversion et page de sortie pour chaque session de 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 &apos; expérience utilisateur.

Les pages principales

Analytique

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

Géo-intelligence.

Analytique

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

Entonnoir d'intention

Analytique

Suivi des intentions comportementales : 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 JS

Analytique

Capture d &apos; erreurs de l &apos, interface : messages, traces des piles, 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 : notation, attribution de la source, statut CRM, coordonnées, signaux comportementaux et routage du pipeline.

CRM AI

CRM

CRM complet : centre de commande, contacts, entreprises, offres, conseil d &apos; administration des pipelines, coaching, prévisions, prospection, séquences, cycle de vie, gestionnaire de données et santé.

Billets

Soutien

Prise en charge de la boîte de réception : départements, priorités, suivi des accords de niveau de service (SLA), triage par IA, réponse automatique, notes internes, pièces jointes, fusion et gestion du statut.

Boîte de réception du chat

Soutien

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

Brouillons d'e-mails

Soutien

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

Configuration de l &apos; IA

IA

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

Entraînement à l &apos; IA

IA

Prompt authoring: invites destinées aux clients et aux administrateurs, règles d &apos; escalade, directives de ton, sujets interdits et configuration des limites.

L &apos; histoire de l &apos. I.

IA

Audit de la 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.

Des idées d &apos; IA.

IA

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

Base de connaissances

IA

Contenu de formation sur l &apos; IA : articles, FAQ, documentation produit, connaissances sur les connecteurs et entrées personnalisées. Recherche sémantique et par mots-clés pour la mise au point de l &quot; &quot);

Connecteurs

Intégrations

Hub d &apos; intégration: connecteurs installés, statut de santé, inventaire des actions, gestion des informations d &quot; &quot.

Sites connectés

Paramètres

Gestion du site : extrait de suivi, clé du site, configuration des widgets, paramètres de domaine et isolation de l &apos; espace de travail par site.

Équipe

Paramètres

Gestion des utilisateurs : inviter les membres, assigner des rôles (propriétaire/administrateur complet/agent), définir l &apos; accès au service et gérer les autorisations.

Performance de l &apos; é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 les plus occupées et analyse des tendances.

Paramètres

Paramètres

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

Licence

Paramètres

Gestion des plans : statut de la licence, caractéristiques du plan, indicateurs d &apos; utilisation, date de renouvellement et options de mise à niveau/rétrogradation.

Commencez ici

Initiation guidée

Le processus d &apos; intégration transforme une nouvelle installation en espace de travail OpsIQ fonctionnel et peut être quitté puis repris sans perte de progression.

Ecran du produit
IntégrationOnboarding affiche chaque zone de configuration, son état actuel et la prochaine action à effectuer.Intégrationespace de travailPROGRESS60%COMPLETED6SUIVANTWidgetVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTLicenceValider la licence du produitFaitFournisseur d &apos; IASélectionner le fournisseur et la clé de testFaitMarqueIdentité et ton de l &apos; 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 &apos; espace de travail est actif.
  2. Fournisseur d &apos; IA : choisissez le fournisseur/modèle, entrez les informations d &apos; identification et exécutez le test de connexion. L &apos); l &apos: intervention artificielle peut être ignorée si l &quot; &quot. espace de travail utilisera initialement uniquement des analyses et des tickets.
  3. Identité professionnelle : définir le nom, l &apos; industrie, la description, le ton client et les détails de marque utilisés par le widget et l &quot; &quot.
  4. Connecteur : activer au moins une plateforme externe lorsque OpsIQ a besoin de commandes, clients, tickets, courriels ou d &apos; autres contextes de plateformes.
  5. Site et widget: créer le site/espace de travail, copier la clé du site et vérifier 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 ligne : test chat, a ticket, connector sync, cron, outbound email, webhooks et security headers.

Le parcours stocke les étapes terminées par espace de travail. Revenir à Onboarding devrait afficher les étape terminées plutôt que forcer un redémarrage.

Commencez ici

Navigation et autorisations d &apos; administrateur

La barre latérale OpsIQ est sensible aux permissions. Cette carte explique où se trouve chaque zone opérationnelle et pourquoi une page peut ne pas être visible par tous les administrateurs.

Ecran du produit
OpsIQ Page d ’accueilLa barre latérale regroupe OpsIQ par espace de travail; les liens individuels n &apos; apparaissent que lorsque le rôle actuel peut les utiliser.OpsIQ Page d ’accueilespace de travailGROUPS8PAGEBasé sur les permissionsSEARCHDisponibleVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTSoutienTickets, courriels, CSAT, connaissanceOuvertCRMContacts, pipelines, marchés, prospectionOuvertAutomatisationFlux de travail, règles, objectifsOuvertSécurité et confidentialitéAperçu, vérification, consentement, blocsAdministrateur1PICK A GROUPRespecter la barre latérale2CHECK ROLECaché signifie restreint.3USE PAGE HELPOuvrir la section correspondante
La barre latérale regroupe OpsIQ par espace de travail; les liens individuels n &apos; apparaissent que lorsque le rôle actuel peut les utiliser.
Soutien

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.

Les itinéraires directs sont toujours vérifiés côté serveur. Cacher un lien de barre latérale n &apos; est pas une mesure de sécurité : chaque action protégée doit passer ses vérifications d &apos, autorisations et espace de travail.

Analytique

Centre d &apos; analyse

Le hub Analytics rassemble l &apos; assistance, le chat, l &quot; &quot. l &amp; iac, les rapports sur les visiteurs et les agents dans un espace de travail filtré par date avec des résultats exportables.

Ecran du produit
Centre d &apos; analyseLe Hub d &apos; analyse affiche une plage de dates, des cartes et onglets de mesure pour les performances du support, du chat, de l &apos.Centre d &apos; analyseespace de travailTIQUETS184AI RESOLVE63%CSAT4.7VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTSoutienCréé, fermé, en attente, SLATabulationChatRésultats IA/humains et temps de traitementTabulationIAConfiance, retour d &apos; information, utilisation de jetonsTabulationAgentVolume, vitesse et satisfactionTabulation1CHOOSE DATESPrédéfini ou personnalisé2CHANGE TABSoutien à l &apos; agent3EXPORTTélécharger CSV
Le Hub d &apos; analyse affiche une plage de dates, des cartes et onglets de mesure pour les performances du support, du chat, de l &apos.

Filtres et contrôles

  • Utiliser un préréglage ou personnalisé de/à puis Actualiser pour reconstruire chaque carte et graphique pour la même période.
  • Exporter CSV exporte la vue analytique active plutôt qu &apos; une capture d &apos.
  • La définition de l &apos; espace de travail est automatique : changer de site modifie 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 du temps de premier contact, SLA et priorité/service/état.
  • Clavardage : sessions démarrées, résolutions d &apos; IA, escalades, abandons, temps de traitement, messages par session et CSAT AI/humain/tous.
  • 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 : tendances du trafic et de l &apos; engagement pour la période sélectionnée.
  • Agent : par agent, la vitesse, la clôture et les mesures de satisfaction.

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

Analytique

Le tableau de bord

Le tableau de bord est votre centre de commande quotidien. Il affiche le trafic, les ventes, la charge d &apos; assistance, l &apos); activité de l &quot; IA et les indicateurs de conversion en une seule vue. Ouvrez-le chaque matin pour comprendre ce qui s &apos.

Tableau de bord
Tableau de bordL &apos; écran Aperçu est dirigé par un panneau d &apos. OpsIQ Intelligence AI (avec résumé journalier, alertes intelligentes, prévision), des tuiles de widget KPI et un widget du trafic sur sept jours, plus une commande de mise en page Réinitialiser.Aperçuespace de travailOPSIQINTELLIGENCEChoisissez une analyse et OpsIQ l &apos; écriraRésumé quotidienAlertes intelligentesPrévisionsRéinitialiser la dispositionVISITES AUJOURD &apos; HUI2,481+12%REVENUS$8.2k+5%OUVERT143 SLATrafic · derniers 7 jours1AI-FIRSTOpsIQ Panneau Intelligence2WIDGETSLes tuiles KPI que vous arrangez3À vousRéinitialiser la disposition à 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.

Explication des cartes du tableau de bord

Visiteurs en direct

Le nombre de personnes sur votre site en ce moment. Ceci est mis à jour tous les 15 secondes (configurable). Un visiteur est « actif » s &apos; il a chargé une page dans le seuil d ’activité (par défaut : 90 secondes).

Visiteurs uniques

Nombre de personnes ayant visité votre site web au cours de la période sélectionnée. OpsIQ identifie les visiteurs par une combinaison d &apos; empreintes digitales du navigateur, de témoins et (si disponible) d &quot; &quot); identité authentifiée &quot: &quot.

Nouveau vs retour

Les nouveaux visiteurs voient votre site pour la première fois. Les visiteurs qui reviennent ont déjà été vus auparavant. Un taux de retour élevé signifie que votre contenu attire les gens. Un très faible taux peut signifier que vous ne conservez pas l &apos; intérêt.

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

Le temps que les visiteurs passent en moyenne sur chaque page. Des temps très courts (moins de 10 secondes) sur les pages de contenu suggèrent que le contenu n &apos; est pas intéressant. De très longs temps sur les sites de paiement peuvent indiquer une certaine confusion.

Menaces bloquées

IPadresse que OpsIQ identifié comme potentiellement malveillant basé sur le score de menace, les tentatives de force brute, ou des blocs manuels. IPs liste.

Les ventes aujourd &apos; hui / cette semaine / ce mois-ci

Revenus provenant de sources de vente connectées (Shopify, WooCommerce, Stripe, etc.). Si les ventes montrent zéro, vérifiez que votre connecteur de plate-forme est connecté et synchronisé.

Graphique de tendance

Un graphique linéaire montrant le nombre de visiteurs sur la période sélectionnée. Recherchez des modèles: pics de trafic (campagnes, mentions dans la presse), baisses (week-ends, jours fériés) et tendances soutenues.

Sources principales

D &apos; où viennent vos visiteurs : direct, Google, médias sociaux, campagnes d &apos. e-mail, sites de renvoi. Utilisez ces données pour comprendre quels canaux marketing fonctionnent.

Navigateurs

Chrome , Safari , Firefox , Edge , et d'autres . Si un navigateur a exceptionnellement haut taux de rebond , vous pourriez avoir unCSSouJavaScriptproblème de compatibilité.

Carte de chaleur horaire

Une grille montrant l &apos; activité des visiteurs par heure du jour et jour de la semaine. Utilisez-la pour décider quand planifier les quarts d &apos, envoyer des annonces et faire des promotions.

Visiteurs récents

Les derniers visiteurs avec pays, page, appareil et source. Utile pour des vérifications rapides au hasard pendant les campagnes.

Utiliser le 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 travail

Enquête sur le taux de rebond

Scénario :
Votre taux de rebond est passé de. 45% à 78% cette semaine. Qu &apos; est-il arrivé?
Que faire :

Vérifiez : (1) Une page d &apos; accueil 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 sources principales 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. (4) S &apos; agit-il de trafic de robots? Vérifiez le compteur des menaces et les détails du visiteur pour détecter tout comportement suspect.

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 le script. (2) La clé du site est-elle correcte? Comparez la clé data-site dans le script avec celle de Connected Sites. (3) Est-ce qu &apos; un CDN ou cache sert 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 :

Ceci est un modèle de trafic B2B. Vos visiteurs sont des professionnels qui naviguent pendant les heures ouvrables. Implications : (1) Planifier le personnel de soutien pour les heures d &apos; ouverture en semaine. (2) Envoyer des campagnes par courriel du mardi au jeudi matin. (3) Les fenêtres de maintenance du week-end sont en sécurité. (4) Envisagez d &apos; offrir le chat en direct uniquement pendant les heures de pointe.

Pic de trafic provenant d &apos; une source inconnue

Scénario :
Vous voyez une augmentation soudaine des visiteurs 500 en une heure à partir d &apos; 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 compteur de visiteurs diffère-t-il de Google Analytics?+

OpsIQ Il utilise l &apos; empreinte digitale du navigateur et les cookies, tandis que Google Analytics utilise un modèle de cookie différent. Le filtrage des robots, le taux de blocage des publicités et l &quot; &quot); ordre de chargement des scripts peuvent également causer 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 pourOpsIQadmin. Pour les rapports externes, utilisez le RESTAPIpour tirer des données analytiques et les afficher dans votre propre tableau de bord ou outil BI.

Que signifie le compteur « menaces »?+

Ça compte.IPadresse queOpsIQa signalé ou bloqué en fonction du pointage de la menace, des connexions répétées échouées, ou des blocs manuels. Cliquez sur le compteur pour voir les détails et gérer les blocs.

Analytique

Journal des visiteurs

Le journal des visiteurs montre chaque visite de vos sites web suivis. Chaque ligne représente un chargement de page par 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/mail, emplacement, source et périphírique, ainsi qu &apos; une ligne signalant les menaces.Journal des visiteursyoursite.com7 joursRechercher IP, e-mail, ville…Source ▾Périphérique ▾IP / EMAILEMPLACEMENTSOURCEDISPOSITIFQUAND[email protected]États-Unis · New YorkgoogleBureau2 m41.62.10.4Royaume-Uni · LondresdirectMobile6 millions[email protected]FR · Parisutm:adsMobile14 m203.0.113.9FR · LagosreferralBureauthreat1–25 de 3,402Séance →1FILTERDate · rechercher · source · dispositif2REAL COLUMNSIP/e-mail · emplacement · 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

Adresse IP

Le visiteur IP Adresse IP anonymisée 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 du.IP adresse IP utilisant les données GeoIP. Nécessite la base de données MaxMind GeoLite2 ou Cloudflare En-têtes géographiques. Affiche « Inconnu » si GeoIP n &apos; est pas configuré.

PageURL

La page que le visiteur a chargée. Cliquez pour voir la fiche complète URLLongue. URLs sont tronqués dans la vue de tableau.

Référent

D &apos; où le visiteur est venu avant d &apos, atterri sur votre site. « Direct » signifie sans renvoi (signets, saisie URLs, certains liens vers des applications).

Appareil et navigateur

Le type d ' appareil du visiteur (ordinateur de bureau, mobile, tablette) et son navigateur (Chrome, Safari, Firefox, etc.). Analysé à partir de l '); user-agent header.

Date et heure

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

Identité du client

Si le visiteur est identifié (via un jeton d &apos; identité ou une connexion), son nom ou son adresse électronique apparaît. Sinon, il s &apos); est affiché comme anonyme.

Filtres

Intervalle de dates

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

Recherche

Recherche par IP adresse, page URL, le pays ou l &apos; adresse électronique du client.

Source

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

Appareil

Filtrer par Bureau, Mobile ou Tablette.

Nouveau seulement

Afficher uniquement les visiteurs qui ne l &apos; ont jamais vu auparavant.

Exemples de travail

Trouver les visiteurs d &apos; 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 trouver ces visiteurs?
Que faire :

Dans le journal des visiteurs, utilisez le champ de recherche et tapez « summer-sale ». La recherche vérifie la référence URLs et page URLs Vous pouvez également filtrer par Source = Payé pour affiner davantage.

Trouver 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 15 heures. » Comment retrouvez-vous sa session?
Que faire :

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

Détecter un coup de boucle ou un grattage

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

Ceci est probablement un robot, un scraper ou un script cassé. Allez dans le journal des visiteurs et recherchez par IP. Vérifiez: (1) Toutes les visites sont-elles sur la même page? (2) L &apos; agent utilisateur est-il un robot connu? (3) La durée de la session est-elle 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

Chargement de pages brutes. Une ligne par page vue. Idéal pour : examiner des pages spécifiques, trouver du trafic provenant de sources spécifiées, diagnostiquer les problèmes de suivi.

Séances

Groupe les pages vues en parcours. 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

Activité en temps réel. Affiche les visiteurs actuellement sur votre site. Idéal pour : surveiller les campagnes en cours, repérer les visiteur à forte intention, observer les opportunités de soutien.

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

OpsIQ Pour exclure votre propre trafic, ajoutez vos IPadresse aux exclus. IPs 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 &apos; accès GeoIP pour vous assurer que le fichier 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 conservation configurée dans les paramètres (par défaut: 90 jours). Après cela, les anciens enregistrements sont automatiquement nettoyés par le travail de rétention cron.

Analytique

Séances

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

Séances
SéancesLa table du journal de session avec IP, les colonnes pays, périphérique, source, durée et pages, ainsi qu &apos; une ligne de menace signalée.Séancesyoursite.comPays (NG)Journal de sessionIP(S)PaysDISPOSITIFSOURCEDURÉEPAGE41.62.10.4Royaume-UniBureaugoogle3m 12s6102.89.6.2NPMobiledirect1m 05s388.21.4.9FRBureauutm:ads7m 48s11203.0.113.9États-UnisMobilereferral42s21SESSION LOGVoyages groupés2COLUMNSPays · 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 &apos; un visiteur charge sa première page. Elle se poursuit à mesure qu &apos, ils naviguent vers d &apos); autres pages. Une session prend fin lorsque le visiteur est inactif pendant la période de délai d &quot; &quot: expiration de la session (par défaut : 30 minutes) ou ferme son navigateur. La même personne qui revient après l &apos. expiration du délai crée une nouvelle session.

Ce que chaque session 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

Nombre de pages vues par le visiteur au cours de cette session. Plus il y a de pages, plus l &apos; engagement est élevé, mais cela peut aussi signifier que le visiteurs se perd.

Durée

Temps total entre le chargement de la première page et la dernière activité. Les sessions avec 0 secondes sont des rebonds (vue d &apos; 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.

Rebond

Indique si le visiteur a quitté la page après n &apos; avoir vu qu &apos. Les sessions rebondies ont un indicateur rouge.

Conversion

Indique si le visiteur a complété un événement de conversion suivi (achat, inscription, envoi d &apos; un formulaire) au cours de cette session.

Filtres

Recherche

Recherche par IP, email, page URL, ou référent au sein des 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 &apos; une région spécifique.

Menaces/Rebondissements

Filtre pour n &apos; afficher que les sessions rebondies ou signalées comme menaces.

Exemples de travail

Profiler un client de grande valeur

Scénario :
Un client vient de faire un gros achat. Vous voulez comprendre son parcours avant d &apos; acheter.
Que faire :

Recherchez leur e-mail dans Sessions. Regardez toutes leurs sessions: (1) Combien de fois ont-ils visité avant d'acheter?2) Quelles pages ont-ils vues? (3Ont-ils utilisé le chat ou ouvert un ticket? (4) Quel était le temps total de la première visite à l'achat? Cela vous indique le voyage d'achat typique pour les clients de haute valeur.

Détecter la connexion à partir d &apos; un nouvel emplacement

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

Recherchez l &apos; adresse électronique du client dans Sessions. Comparez le pays des sessions récentes. Si une session apparaît soudainement depuis un pays inhabituel, il pourrait s &apos); est légitime ou un compte compromis. Vérifiez : (1) Y a-t-il eu une tentative de connexion infructueuse avant la réussite? (2) Est-ce que le IP modifier au cours de la même session? Signalez-le pour révision si suspect.

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

Un visiteur est une personne (ou un navigateur). Une session est 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 &apos; attente.

Comment OpsIQ identifie-t-il les visiteurs qui reviennent?+

OpsIQ utilise une combinaison de cookies, d &apos; empreintes digitales du navigateur et de jetons d &quot; &quot. Si un visiteur efface ses cookies et n &apos); est pas connecté, il apparaîtra comme un nouveau visiteur.

Analytique

Flux en direct

Le flux en direct montre les visiteurs actuellement sur votre site web 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 &apos; assistance chargées pour voir ce qui se passe en ce moment même.

Flux en direct
Flux en directUn flux d &apos; activité en temps réel montrant le nombre de visiteurs en ligne et un flux des actions récentes des visiteurs par pays.Flux en directyoursite.com37visiteurs en ligne maintenantActivité en directmaintenantUS · visualisation /pricing2sFrance · a commencé une conversation5sAjouté au panier9sCA · inscription terminée1RIGHT NOWVoir qui est sur le site2AUTO-REFRESHMet à jour tous les 15s3ACTEAccéder au 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 &apos; intervalle de rafraîchissement configuré. Chaque ligne montre un visiteur actuellement sur votre site : sa page courante, son pays, son périphérique, sa source, la durée de sa session et le nombre de pages. La mise en surbrillance verte indique une nouvelle activité depuis la dernière actualisation. Cliquez sur n &apos); a ligne d &apos.

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) donne des mises à jour plus rapides mais utilise davantage de ressources du serveur.30-60s) sont plus faciles sur le serveur mais moins en temps réel.

Seuil actif

Durée pendant laquelle un visiteur est considéré comme « actif » après le chargement de sa dernière page. Par défaut : 90 Si un visiteur charge une page et la lit pendant 10 secondes, 2 minutes sans cliquer, ils disparaissent du flux en direct après le seuil.

Bouton de pause

Cliquez sur Pause pour arrêter l &apos; actualisation automatique. Utile lorsque vous souhaitez lire les détails sans mettre à jour la liste. Cliquez Sur Reprendre pour redémarrer.

Exemples de travail

Repérer un lead intéressant pendant une campagne

Scénario :
Vous lancez un produit. Un visiteur vient de consulter votre page d &apos; accueil, puis les caractéristiques et la tarification, et se trouve maintenant sur la page de paiement.
Que faire :

C &apos; est un comportement de haute intention. Dans le Live Feed : (1) Cliquez sur le visiteur pour voir sa session. (2) S &apos; ils commencent une conversation, l ’ IA aura le contexte complet de leur voyage. (3S &apos; ils partent sans acheter, ils deviennent un prospect sur la page des prospects.4) Pensez à créer une règle proactive pour afficher un message de chat lorsque les visiteurs arrivent au paiement.

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 des 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 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 montre tous les visiteurs actifs. Pour des vues filtrées, utilisez le journal des visiteurs ou la page Sessions avec leurs options de filtrage. Le flux est intentionnellement simple pour une surveillance en temps réel.

Analytique

Les pages principales

Top Pages indique les pages de votre site Web qui reçoivent le plus de trafic. Il classe les pages en fonction des visites, de l &apos; engagement, des conversions et de l activité d &apos); assistance. Utilisez-le pour identifier votre meilleur contenu, trouver les pages peu performantes et découvrir les pages générant des questions d &quot; &quot.

Les pages principales
Les pages principalesUne liste classée des pages les plus visitées avec des barres de visite horizontales et un compteur.Les pages principalesyoursite.comPages les plus visitées/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKEDPages les plus visitées2SIGNALSVisites & conversions3FINDPages qui génèrent des tickets
Vos pages classées par trafic et engagement, de sorte que vous puissiez repérer le meilleur contenu et les pages qui génèrent du soutien.

Ce que chaque page montre

PageURL

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

Vues

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

Visiteurs uniques

Combien de personnes différentes ont vu cette page (une personne qui voit la même page deux fois compte comme 1 unique).

Taux de rebond

Pourcentage de visiteurs qui ont quitté votre site après avoir seulement vu cette page. Un taux élevé de rebond sur les pages d &apos; accueil = problème. Un niveau élevé sur les « merci » = normal.

Temps moyen

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

Le chat commence

Nombre de conversations de clavardage démarrées à partir de cette page. Un nombre élevé de discussions sur une page produit signifie que la description du produit peut être peu claire.

Tickets de soutien

Nombre de tickets d &apos; assistance créés par les visiteurs qui ont accédé à cette page. Nombre élevé de tickets = problème potentiel d &quot; &quot, expérience utilisateur ou contenu.

Exemples de travail

Trouver des pages qui soulèvent des questions de support

Scénario :
Votre équipe de support continue à recevoir des questions sur l &apos; expédition. Quelle page est en panne?
Que faire :

Trier les pages principales par « Tickets d &apos; assistance » ou « Démarrage du chat » en ordre décroissant. Recherchez les pages de produits ou d &quot; &quot, livraison avec un nombre élevé. La page avec le plus de questions d &amp; ; assistance a probablement des informations peu claires. Corrigez le contenu de la page et vérifiez si les questions d ; &apos); &apos.

Trouver des pages avec un taux de sortie élevé

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

Trier par taux de rebond décroissant. Ignorer les pages qui sont naturellement des points de sortie (pages de remerciement, pages de confirmation). Se concentrer sur les pages destinées à maintenir l &apos; engagement des visiteurs : pages produit, prix, fonctionnalités. Ces dernières ont besoin d &apos); un meilleur appel à l &quot; &quot. action ou d &quot, un contenu plus clair.

Pourquoi une page affiche-t-elle 0 vues alors que je sais qu &apos; 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 &apos; itinéraire. (2) La page est-elle exclue des paramètres de suivi? (3) Un CDN sert-il une version mise en cache sans le script de suivi?

Analytique

Géo-intelligence.

La fonctionnalité Geo Intelligence vous indique d &apos; où viennent vos visiteurs, par pays, ville, périphérique et source. Utilisez-la pour comprendre vos marchés géographiques, décider de la prise en charge des langues, planifier le marketing régional et détecter les schémas de trafic suspects.

Géo
Géo-intelligence.Une carte des lieux visités à côté d &apos; un classement par pays.Géo-intelligence.yoursite.comVisiteurs par emplacementÉtats-UnisRoyaume-UniFRPaysNP1MARKETSPays, ville, appareil2PLANLangue et 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

Les pays les plus visités par nombre de visiteurs. Cliquez sur un pays pour afficher les données au niveau des villes.

Country beignet

Répartition visuelle du trafic par pays. Passez la souris pour voir 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 &apos; accès, le taux de rebond et le taix de conversion.

Détail de la ville

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 travail

Trafic de pays inattendu

Scénario :
Vous dirigez une entreprise aux États-Unis seulement, mais 30% 90 % du trafic vient d &apos; Inde.
Que faire :

Vérifiez : (1) Sont-ce de vrais visiteurs? Regardez la durée des sessions et les pages consultées. Sessions très courtes avec un taux élevé de rebond = robots probables. (2) Est-ce qu &apos; ils vous trouvent sur Google? Vérifiez le référent. (3Pourraient-ils être des clients potentiels dans un nouveau marché? Si le trafic est authentique et engagé, envisagez d &apos; ajouter une tarification ou du contenu spécifique à l &apos); Inde.

Décider du support linguistique

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

Regardez la page de Géo Intelligence. Si les pays hispanophones (Espagne, Mexique, Colombie, Argentine, etc) représentent ensemble plus que 10% de votre trafic avec des taux de rebond faibles, il vaut la peine d &apos; envisager une traduction. Vérifiez également si les visiteurs de ces pays convertissent à des taUX similaires à ceux de votre marché principal?

Planification des rotations de soutien régional

Scénario :
Vous devez décider des heures de travail de l &apos; équipe d &apos.
Que faire :

Utilisez la carte de chaleur horaire (sur le tableau de bord) combinée avec Geo Intelligence. Si 40% la moitié de votre trafic provient d &apos; Europe et 35% des États-Unis, vous avez besoin d &apos; une couverture pour les deux fuseaux horaires. La carte thermique montre exactement quand chaque région est la plus active.

Pays avec des visites mais pas de commandes

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

Enquêter : (1Est-ce qu &apos; ils rebondissent sur la page des prix? Peut-être que vos prix ne sont pas compétitifs pour ce marché.2) Est-ce que vous livrez en Allemagne? Vérifiez si votre page de livraison mentionne l &apos; Allemagne. (3) Est-ce que votre paiement est disponible en EUR? Le décalage de devises provoque des paiements abandonnés. (4) Ces visiteurs proviennent-ils d &apos; une seule source qui pourrait être un trafic à faible intention?

Pourquoi un visiteur affiche-t-il le pays « inconnu »?+

GeoIP n &apos; est pas configuré. 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 d &apos, accès au fichier dans Paramètres > Chemin GeoIP.

Puis-je bloquer le trafic de certains pays?+

OpsIQ ne bloque pas par pays. Utilisez votre serveur web ou Cloudflare des règles de pare-feu pour le blocage basé sur les pays.OpsIQ se concentre sur la visibilité, pas le contrôle d &apos; accès au niveau du réseau.

Analytique

Entonnoir d'intention

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

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

Catégories d &apos; intention

Navigation

Des visiteurs regardent autour d &apos; eux, de courtes sessions, 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 plus long sur la page, plusieurs pages de contenu.

Comparaison

Visiteurs consultant les prix, la comparaison des plans ou les tableaux de fonctionnalités.

Acheter

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

Recherche d &apos; aide

Les visiteurs des pages d &apos; aide, des pages de contact ou qui démarrent une conversation. Ils ont besoin d &quot; &quot);

Rebondissement

Les visiteurs qui quittent après une page. Faible engagement.

Comment lire l &apos; entonnoir?

Interpréter votre entonnoir

Scénario :
1,000 Pricing. 270 chat ouvert. 92 a commencé le paiement. 64 payés. 18 ont ouvert des tickets de support.
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 &apos; intention?+

OpsIQ regarde la page URLs, le comportement de session et les modèles temporels. Les pages des prix indiquent l &apos; intention de comparaison.

Puis-je personnaliser les catégories d &apos; intention?+

Pas pour le moment. Les catégories sont intégrées en fonction des modèles de comportement web courants. La classification personnalisée est sur la feuille de route.

Analytique

Entonnoirs, rétention et cheminement

Créez des parcours personnalisés à partir d &apos; étapes de page ou d &quot; événements, mesurez la rétention de cohortes et découvrez les chemins que les visiteurs empruntent le plus souvent sur un site.

Ecran du 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 &apos; ESPACE DE TRAVAIL EN DIRECTPrix consulté1,420 visiteurs100%Plan sélectionné780 visiteurs54.9%Démarrage de la sortie530 visiteurs37.3%Ordre terminé403 visiteurs28.4%1DEFINEChoisir 2–8 étapes2MESURESDéfinir la fenêtre de conversion3AMÉLIORERTrouvez 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 page ou étapes d &apos; événement. Définissez la fenêtre de conversion en heures; un visiteur n &apos, est compté que 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 la page ou la messagerie.

Rétention

La rétention regroupe les visiteurs en cohortes hebdomadaires et montre combien d &apos; entre eux retournent. 6, 8 ou 12 gardez la définition de cohorte stable lorsque vous comparez des versions 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.

Les entonnoirs personnalisés sont des définitions analytiques, pas des automatismes. 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 lecture de session vous permet d &apos; observer 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 la page, l &apos. où il est passé avec le curseur et ce qu &apos, il a tapé (les champs sensibles étant masqués). Utilisez-la pour diagnostiquer les problèmes d &quot; &quot); expérience utilisateur &quot, vérifier les rapports de bogues et comprendre la confusion des clients.

Relecture de session
Relecture de sessionUn lecteur de replay affichant une fenêtre de page avec un curseur, un panneau d &apos; information sur la session et un sélecteur de chronologie.Relecture de sessionyoursite.comAcheter maintenantSESSIONDurée : 12s14 clicsUS · BureauChrome 1241WATCHCliquer, faire défiler, taper2MASKEDChamps sensibles masqué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 ayant déposé des tickets d &apos; assistance. Cliquez sur l &apos); icône Replay pour ouvrir la vue chronologique.

Ce que montre la répétition

Ligne du temps

Une barre horizontale montrant les événements au fil du temps. Cliquez n &apos; importe où sur la ligne de temps pour sauter à ce moment.

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 &apos; où le visiteur a lu.

Interaction de formulaire

Le focus et les événements de saisie sont enregistrés. La saisie de texte dans les champs sensibles et mots de passe est masquée par défaut.

Vie privée et masquage

La lecture de la session masque les champs sensibles des formulaires par défaut. Les champs de mot de passe, les saisies de carte de crédit et les champ étiqueté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 politique de conformité l &apos; exige, vous pouvez désactiver complètement la lecture.

Diagnostiquer une sortie cassée

Scénario :
Un client dit : « J &apos; ai essayé d &apos, acheter mais le bouton ne fait rien. »
Que faire :

Trouver leur session dans la page Sessions (recherche par courriel). Ouvrir le replay. Regardez le segment de la page de paiement. Chercher : (1) Ont-ils cliqué sur le bon bouton? (2) A fait un JavaScript s &apos; est produite? (Consultez la page Erreurs JS pour cette période.)3) La page s &apos; est-elle rechargeée ou a-t-elle affiché un message d &apos, erreur? (4) Un champ obligatoire était vide? Le replay montre exactement ce qui s &apos; est passé.

Combien de mémoire la lecture de session utilise-t-elle?+

Les données de lecture augmentent avec le volume du trafic. Utilisez les paramètres de conservation pour nettoyer automatiquement les anciennes données de la lecture. Pour les sites à fort trafic, envisagez une période de conservations plus courte (par exemple, 30 jours) pour gérer le stockage.

Les visiteurs peuvent-ils refuser la rediffusion?+

Si « Respecter Do Not Track » est activé 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 du suivi.

Analytique

Journal des événements

Le journal des événements montre tous les évéements que OpsIQ a enregistrés: vues de page, clics, démarrages de chat, créations de tickets, ventes et évéments personnalisés. Utilisez-le pour déboguer les intégrations, vérifier la livraison des webhook et comprendre la séquence d &apos; actions.

Journal des événements
Journal des événementsUn journal chronologique des événements avec des badges de type codés par couleur: pageview, chat, sale, webhook et custom.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 webhook3ORDERVoyez 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.

sortie 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

A JavaScript l'erreur 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 propres à votre entreprise: clics sur des boutons, 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 &apos; événement

Filtrer par noms d &apos; événements spécifiques: pageview, chat. started, ticket. created, etc.

Intervalle de dates

Afficher les événements d &apos; une période de temps donnée.

Recherche

Recherche des données d &apos; événement par mot-clé (URL, courriel, valeurs de propriété d &quot; &quot.

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

Les événements suivent la politique de conservation définie dans les paramètres. Par défaut: 90 jours. Les activités à forte valeur ajoutée (achats, évéements de sécurité) peuvent être configurées 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

Analytique

Expériences A/B

Les expériences vous permettent de tester deux versions d &apos; une page ou d &quot; une fonctionnalité et de déterminer celle qui fonctionne le mieux. OpsIQ suit les impressions, les conversions et la 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 BGAGNANT6.8%conversion · 1,005 vues+62% ascenseur · 96% significatif1ESSAIDeux variantes en face à face.2MESURESConversions et 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 métrique principale (événement de conversion) et définisseZ les variantes (contrôle et test).

2
Lancez-le

OpsIQ assigne de façon aléatoire les visiteurs à des variantes et suit leur comportement. Ne modifiez pas l &apos; expérience pendant qu &apos, elle est en cours d &apos.

3
Lisez les résultats

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

État de l &apos; expérience

Brouillon

Créé mais pas encore lancé. Vous pouvez toujours modifier les variantes et les métriques.

Exécution

Attribution active des visiteurs aux variantes. Ne pas modifier pendant l &apos; 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 &apos; expérience n &apos. est plus nécessaire dans la liste active.

Meilleures pratiques

Définissez vos mesures avant le lancement

Décidez ce que vous mesurez avant de commencer. Choisir une métrique après avoir vu les résultats introduit un biais.

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.

Exécutez assez longtemps

N &apos; arrêtez pas une expérience après 100 visiteurs. 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 &apos; amélioration.

Enregistrez votre décision

Après la fin de l &apos; expérience, 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 faire 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 &apos; exécuter des expériences sur différentes pages ou fonctionnalités simultanément.

Analytique

Erreurs JavaScript

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 JS
Erreurs JavaScriptUne liste des erreurs de l &apos; interface capturées avec les points de gravité, le fichier source, le navigateur et le nombre d &apos.Erreurs JavaScriptyoursite.comErreurs récentesTypeError : impossible de lire x d &apos; un type non définicheckout. js:42 · Chrome×214404 chargement /assets/app.cssIndex · Safari×88Non capturé (dans la promesse) NetworkErrorapi.js:17· Firefox×51Avertissement de dépréciation: événement unloadvendor. js · Edge×331CAPTUREErreurs côté client2IMPACTCompte & navigateurs3CORRECTIONÉcrasez les 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 montre

Message d &apos; erreur

Le texte d &apos; erreur JavaScript (par exemple, « TypeError: Cannot read properties of undefined »).

PageURL

La page sur laquelle l &apos; erreur s &apos.

Navigateur et appareil

Le navigateur et le type d &apos; appareil qui ont vu l &apos. Certaines erreurs sont propres au navigateur.

Trace de pile

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

Première vue

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

Dernière vue

Quand cette erreur s &apos; est produite pour la dernière fois.

Nombre

Nombre de fois que cette erreur a été enregistrée.

Sessions affectées

Combien de sessions différentes ont rencontré cette erreur.

Priorisation 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 &apos; un changement de code), (4) des erreurs sur votre propre code (pas de scripts tiers).

Réparation d &apos; 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 &apos; ont pas pu terminer la commande. Étapes : (1) Ouvrez la page dans le même navigateur/appareil. (2) Ouvrez la console du navigateur et reproduisez l &apos; erreur. (3) Vérifiez la trace de pile pour trouver la ligne exacte du code. (4) Corriger le bogue, déployer et surveiller le nombre d &apos; erreurs allant à zéro.

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

Oui, OpsIQ capture tous JavaScript erreurs sur la page, y compris les erreurs provenant des scripts d &apos; analyse, des widgets de chat et les scripts publicitaires. URL dans la trace de pile pour vous concentrer sur votre propre code.

Comment puis-je exclure les erreurs connues comme inoffensives?+

Vous ne pouvez pas supprimer des erreurs spécifiques dans OpsIQ mais vous pouvez filtrer la liste par page. URL Corriger ou ignorer les erreurs provenant des extensions du navigateur (elles apparaissent souvent comme étant issues 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 d &apos; un visiteur, ce qui vous permet de savoir quelles pages, campagnes et canaux sont responsables des recettes.

Ventes
VentesL &apos; écran des ventes : un total de revenus avec une commande Période historique, une recherche et un tableau Achats récents (date, client, plateforme, montant, source).Ventesyoursite.comREVENUS$42,180+18%Tout le temps ▾Recherche par courriel, IP, ID de commande…Achats récentsDATECLIENTPLATFORMEMONETÉSOURCEJuin 3[email protected]Shopify$49googleJuin 3[email protected]WooCommerce$129directJuin 2[email protected]Stripe$480publicités1REVENUSCommandes et renouvellements2RECENT PURCHASESDate · client · montant3ATTRIBUTEDVers la source du 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 '.

Revenu des commandes passées aujourd &apos; hui. Actualisé à chaque nouvelle commande de votre plateforme connectée.

Cette semaine / ce mois-ci / au total

Revenu agrégé sur la période. Les remboursements sont soustraits de ces totaux.

Graphique de tendance

Graphique linéaire montrant les revenus quotidiens sur la période sélectionnée. Recherchez les pics (promotions, campagnes) et les creux (problèmes, saisonnière).

Sources de conversion

Quelles sources de trafic mènent au plus grand nombre d &apos; achats. Les acheteurs « directs » ont souvent mis votre site en favoris. Les clients « Google » vous ont trouvé par le biais des recherches.

Achats récents

Les dernières commandes avec l &apos; adresse électronique 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

Accéder aux connecteurs >Shopify Créez une application personnalisée dans votre langue.Shopify admin (Paramètres > Applications et canaux de vente > Développer des applications). Champ d &apos; application : read_orders, read_customers, read _products. Copier le fichier Admin API Jeton d &apos; accès. OpsIQ, entrez votre domaine de magasin (par ex. ) your-store.myshopify.com) et le jeton d &apos; 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

Accéder aux connecteurs >WooCommerce Dans votre. WordPress admin, allez à WooCommerce Paramètres avancés API. Créer une clé avec permission de lecture/écriture. Copier la clé du consommateur et le secret du consommteur. Dans OpsIQ, entrez votre site URL, la clé de consommateur et le secret du consommateur. Cliquez sur Tester la connexion.

BigCommerce

Allez dans Connecteurs > BigCommerce. Dans votre administrateur BigCommerce, allez dans Paramètres avancés >API Comptes. Créer un compte V2/V3 API Compte avec portée en lecture pour les commandes, clients et produits. Copiez le jeton d &apos; accès, l &apos);API Entrez-les. OpsIQ et tester.

Magento 2

Accédez à Connecteurs > Magento. Dans votre administrateur Magento, accédez à Système > Intégrations. Créez une nouvelle intégration avec API Activez l &apos; intégration et copiez le jeton d &apos. Entrez-le dans la boîte de dialogue OpsIQ avec votre base Magento. URL.

PrestaShop

Accédez à Connecteurs > PrestaShop. Dans votre administrateur Prestashop, accédez à Paramètres avancés > Webservice. Activez le webservice et créez une nouvelle clé. Autorisez l &apos; accès aux commandes, clients et produits. Copiez la clé et saisissez-la dans OpsIQ avec votre magasin. URL.

OpenCart

Allez dans Connecteurs > OpenCart. Générer API Entrez les identifiants de votre panneau d ' administration OpenCart.API URL, nom d ' utilisateur et mot de passe OpsIQ. Le connecteur utilise OpenCart's REST API pour les commandes et les données des clients.

osCommerce

Allez dans Connecteurs > osCommerce. Configurez l &apos; accès à la base de données ou API L &apos; intégration d &apos, osCommerce nécessite généralement un accès direct à la base de données ou une connexion personnalisée.API module.

Stripe

Allez dans Connecteurs > Stripe. Copiez votre Stripe restreint.API clé à partir du 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. Configurez le point de terminaison webhook pour les événements en temps réel.

Personnalisé / autres plateformes

Utilisez le REST API ou webhooks pour envoyer des événements de vente à partir de n &apos; importe quelle plateforme. Envoyer les ordres terminés avec l &apos, adresse électronique du client, le montant, la devise et les articles.API section pour le format de la charge utile.

Comprendre votre entonnoir de ventes

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. Elles réduisent vos revenus nets totaux. Si les taux de remboursement sont élevés d &apos; une source particulière, le trafic peut être de faible qualité.

Gestion de la monnaie

OpsIQ stocke la devise et le montant originaux de la transaction. Les entreprises multidevises voient les revenus dans chaque devise. Le reporting normalisé utilise le taux de change configuré.

Exemples de travail

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. (2Combien ont été convertis en ventes?3) Revenu total attribué à la campagne. (4) Comparé à la même période avant la campagne.

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

Vérifiez : (1) Le connecteur de plateforme est-il connecté et en bon état? Allez dans Connecteurs et vérifiez l &apos; état. (2) La synchronisation webhook est-elle activée? Si vous utilisez le polling, la tâche cron s &apos; exécute-t-elle? (3Le 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 &apos; une commande est passée via le connecteur, OpsIQ fait correspondre l &apos. adresse électronique du client à un visiteur connu. Si le visiteur a été suivi avant l &quot; &quot, la vente est attribuée au parcours de son visiteur, y compris la source de trafic, la page d &apos, accueil et l &amp; historique des sessions.

Puis-je ajouter manuellement des ventes?+

Vous pouvez envoyer des événements de vente via le REST.API ou webhooks de n &apos; importe quel système. Le format des événements est documenté dans la section É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.

WhatsAppMessager,Instagram, Telegram, LINE, SMS et X utilisent le compte de canal vérifié par le fournisseur comme identité de canal. Email est toujours recueilli pour les reçus. Commande de connecteur conserve son contrat universel signé et le total marchand-autorisant; 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 &apos; écran Leads : un tableau interrogeable avec les colonnes IP/email, localisation, dispositif, source et temps passé sur le site, ainsi que la principale source et le pays.Plombsyoursite.comRecherche IP, ville, pays…Source principale: google · Pays principal: USIP / EMAILEMPLACEMENTDISPOSITIFSOURCETEMPS41.62.10.4Royaume-Uni · LondresMobilegoogle4m 12s[email protected]États-Unis · New YorkBureaudirect7m 02s[email protected]FR · ParisMobileutm:ads5m 40s203.0.113.9CA · TorontoBureaugoogle3m 28s1DETECTEDDes visiteurs très intentionnels.2TOPSources et pays de l & énergie3ENRICHEDIP, emplacement, périphérique, 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.

Qu &apos; est-ce qui fait un lead

Prix 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 clavardage

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

Démarrage de l &apos; extraction

Les visiteurs qui atteignent la page de paiement mais ne terminent pas l &apos; achat.

Soumissions de formulaire

Les visiteurs qui soumettent un formulaire de contact, une demande de démonstration ou un formulaires d &apos; 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 des détails du lead

Cliquez sur n &apos; importe quel contact pour voir son profil complet :

Identité

Nom, adresse électronique 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 vues

Chaque page qu &apos; ils ont visitée, classée par récente.

Source

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

Score de la tête

A0-100 score basé sur l &apos; intensité du comportement, la récence et l &quot; &quot.

Statut CRM

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

Conseil de vente

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

Badge de prospect à haute valeur ajoutée

Les prospects dont le score est supérieur à 80 obtiennent un badge « Valeur élevée ». Ce sont vos meilleurs prospects. Priorisez-les pour la communication, le chat proactif ou l &apos; entrée dans votre pipeline CRM.

Exemples de travail

Travailler sur une piste

Scénario :
Un prospect a consulté votre page de prix. 3 fois dans 2 jours, a commencé une conversation pour demander des plans d &apos; entreprise, mais n &apos.
Que faire :

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

Convertir des prospects 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 &apos; une ressource en échange de courriels sur des 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 &apos; 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 = élevée), les pages vues (prix/caisse = supérieur), la durée de session (plus longue = supérieure), les interactions sur le chat (engagées = susceptibles d &apos; être plus importantes) et les visites répétées (sessions multiples = principales).

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

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

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
Aperçu de l &apos; IA CRMUn Trust Dial mis en place pour le Copilot à côté de quatre cartes d &apos; agent IA : Steward, Prospector, Retention et Analyst.CRM AIespace de travailComposez en toute confianceManuelCopilotePilote automatiqueCombien l &apos; IA peut-elle faire par elle-même?DSÀ la rechercheDéduire, enrichir,valider les donnéesDTSProspecteurTrouver et marquernouvelles affairesRTRétentionLe décrochage des clients,renouvellements de permisNONAnalystePrévisionsexpliquer les nombres1AI-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 &apos; accueil quotidien : pulsation des revenus, ce que l &apos. I. a trouvé, ce qu &apos, il a fait, file d &quot; approbation, prochains mouvements, santé de l &quot); agent et retour sur investissement.

Personnes à contacter

Noyau

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

Pipeline

Noyau

Tableau de jeu visuel avec des étapes glisser-déposer, probabilité de gagner et entraînement par IA.

Prévisions et rapports

Noyau

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

Cycle de vie

Noyau

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

Construire mon CRM

Configuration

Décrivez votre configuration CRM en anglais clair. OpsIQ génère un plan réversible et l &apos; applique à son approbation.

CRM Santé

Oups.

Page d &apos; autocontrôle : schéma, agents, itinéraires, actions de l &apos. IA et comptage des données en temps réel.

Comment OpsIQ vous protège

Demander avant d &apos; agir.

Les propositions d &apos; IA sont mises en file d &quot; &quot. Vous pouvez approuver, modifier ou rejeter chacune d &amp; e; elles. Rien ne se passe sans votre avis.

Ne jamais écraser

Lorsque l &apos; IA suggère un changement, elle affiche la valeur actuelle et la valeur proposée.

Tout est réversible.

Chaque action de l &apos; IA est enregistrée dans le journal. Vous pouvez annuler n &apos, quelconque modification en un seul clic.

Explicable.

Chaque recommandation d &apos; IA montre son raisonnement et les sources de données qu &apos, il 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 l &apos; état du 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, Qualified, Proposal, Negotiation, Won, Lost).

5
Ajouter votre première offre

Créez une offre à partir d &apos; un contact, définissez le montant et l &apos. étape de la transaction et laissez Deal Coach vous guider.

Dois-je utiliser le CRM ?+

Non. Le CRM est optionnel. OpsIQ fonctionne parfaitement comme une plateforme de suivi + support + IA sans le CRM. Activez-le lorsque vous êtes prêt à gérer les ventes et les relations clients.

Le CRM peut-il fonctionner sans connecteurs?+

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

Qu &apos; est-ce que la couche de confiance?+

La couche de confiance est le système de sécurité qui contrôle ce que l &apos; IA peut faire. Mode copilote (par défaut) : L &apos,IA propose, l &quot; homme approuve. Mode pilote automatique (optionnel): L &quot,IA agit automatiquement sur les opérations réversibles à faible risque.

CRM

L'écran d'accueil de l'IA CRM

Le Centre de Commandement est votre briefing quotidien. Ouvrez-le tous les matins pour voir ce qui s &apos; est passé, ce qui nécessite votre attention et ce que vous devez faire ensuite.

Centre de commande
Centre de Commande CRMLa page d &apos; accueil du CRM avec les bascules Prévisions/Taux de réussite/Pipeline, un KPI pondéré des prévisions et une file d &quot; &quot.Centre de Commande CRMespace de travailPrévisionsTaux de victoirePipelinePrévisions · Cette Q74k $87%Propositions d &apos; IA · approuver la fileCréer une offre · Acme $24kd &apos; une conversation avec l &apos, acheteurApprouverRejeterDéplacer Nimbus → Propositionréponse positive détectéeApprouverRejeterJournal de tâche · suivi Peakaucune activité depuis 7 joursApprouverRejeter1TOGGLEPrévisions · Taux de victoire · Pipeline2AI PROPOSESTravaux, é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'étape 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 &apos; 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 &apos; IA a prises (dans le pilote automatique) ou proposées (dant le copilote): avancées de phase, mises à jour des scores, enrichissement des contacts et création de tâches.

Nécessite l &apos; approbation

File d &apos; attente de propositions IA en attente d &quot; &quot. Chacune montre l &apos, action proposée, le raisonnement et les preuves. Approuver, modifier ou rejeter.

Prochains mouvements

La liste des. 10 les choses les plus importantes à faire aujourd &apos; hui : suivre une affaire chaude, vérifier un compte à risque, rechercher un nouveau prospect, etc.

Statut de l &apos; aide

Santé des agents d &apos; IA : capture, gestionnaire de données, renseignements sur les transactions, coach des transactions, DRS, rétention. vert = en cours, jaune = nécessite attention, rouge = erreur.

Résultats

Suivi du retour sur investissement : transactions influencées par l &apos; IA, gain de temps, précision des prévisions et comparaison avec le travail manuel du CRM.

Le flux de travail du briefing matinal

1
Lisez les chiffres d ' aujourd ', hui

Vérifiez l &apos; état du pipeline et la tendance des recettes. Êtes-vous sur la bonne voie ce mois-ci?

2
Effacer la file d &apos; attente des approbations

Passer en revue chaque proposition d &apos; IA. Approuver les actions sûres, modifier si nécessaire et rejeter les mauvaises suggestions.

3
Vérifiez ce que OpsIQ a trouvé

Lisez les informations de l &apos; IA. Y a-t-il des risques? De nouvelles opportunités?

4
Travailler la liste des prochains déplacements

Commencez par la priorité absolue. L &apos; IA les a classées en fonction de leur urgence et de leur impact potentiel.

Rappeler après un temps d &apos; arrêt

Scénario :
Vous étiez absent pendant une semaine. Qu &apos; est-il arrivé pendant votre absence?
Que faire :

Ouvrez le Centre de commande et vérifiez : (1) "Qu &apos; est-ce que OpsIQ fait" montre toutes les actions de l &apos; IA pendant votre absence. (2) « Besoin d &apos; approbation » indique les propositions en attente de votre examen. (3) "Qu &apos; est-ce que OpsIQ trouvé" met en évidence les éléments urgents. (4) Définissez la plage de dates du tableau de bord à votre période d &apos; absence pour voir la tendance.

CRM

Contacts, entreprises et affaires

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

Objets CRM
Objets CRMUn enregistrement de contact lié aux objets Société, Affaire et Tâche dans un graphique connecté.Objets CRMespace de travailPersonne à contacterpersonne · courriel · téléphoneSociétéaccountsMarché concluune opportunité de revenus.Tâchesuivi1OBJECTSContacts, entreprises, affaires2LINKEDUn graphique connecté3TASKSSuivants joints
Quatre objets de base (contacts, entreprises, transactions et tâches) liés à un seul graphique client connecté.

Personnes à contacter

Qu &apos; est-ce qu &apos...

Une personne dans votre CRM. Il peut s &apos; agir d &apos, un client, un prospect, un partenaire ou une piste. Les contacts ont un adresse e-mail, un nom, une société, des balises, une étape du cycle de vie et un score de popularité.

Recherche de contacts

Utilisez la barre de recherche pour trouver par nom, courriel, société ou étiquettes. Utilisez les filtres suivants: étape du cycle de vie, score des prospects, 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 analyses d &apos; IA.

Score de chaleur

A0-100 Le score est calculé à partir de signaux comportementaux : visites du site Web, engagement par e-mail, interactions sur le chat, historique d &apos; achat et actualité.

Sociétés

... plus de billets...
Lien entre contact et entreprise

Les contacts sont liés aux entreprises par domaine de messagerie ou par affectation manuelle. Une entreprise peut avoir plusieurs contacts.

Offres

Qu &apos; est-ce qu &apos, un accord

Les offres ont un titre, une somme, un pipeline, une étape, la probabilité de gagner, une date de clôture, le propriétaire assigné et les contacts/société associés.

Probabilité de gagner

Un pourcentage de chances de gagner la partie. Défini manuellement ou calculé par l &apos; IA en fonction des données historiques sur vos victoires. Conduit les prévisions pondérées.

Traiter la santé

Vert (en bonne santé), jaune-automne (à risque) ou rouge (au point mort). Basé sur la récente activité, la durée de l &apos; étape et les signaux d &apos.

Tâches

Qu &apos; est-ce qu &apos, une tâche

Une action de suivi assignée à une personne. Les tâches ont un titre, une date d &apos; échéance, une priorité, un type (appel, courrier électronique, réunion, autre) et un contact/affaire lié.

Des tâches générées par l &apos; IA

L &apos; IA crée automatiquement des tâches lorsqu &apos, il détecte quelque chose qui nécessite une attention particulière : suivre un accord bloqué, répondre à un compte en danger, rechercher un nouveau prospect.

Trouver des prospects intéressants.

Scénario :
Vous voulez voir tous les contacts au Royaume-Uni qui ont un score élevé et n &apos; 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éer une offre à partir d &apos; un contact

Scénario :
Un contact vient de manifester son intérêt pour votre plan d &apos; entreprise au cours d &quot; &quot.
Que faire :

Ouvrez le profil du contact. Cliquez sur « Créer une offre ». Entrez le titre de l &apos; offre (par exemple, « Acme Corp - Enterprise Plan »), le montant, la filière et l &quot; &quot); étape (par ex., « Qualifié &quot. &quot? »). Définissez la date de clôture et assignez-la à vous-même. Le coach des offres commencera à suivre cette opportunité.

CRM

Le pipeline (votre tableau de transactions)

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 dans les offre. Chaque carte montre le montant de la offre, la probabilité de gagner et l &apos; état de santé.

Pipeline
Pipeline CRML &apos; écran du pipeline avec les statistiques des offres ouvertes, de la valeur ouverte, des prévisions pondérées et des offre- attribuées, un bouton Nouvelle offre, une file d &apos. approbation par IA et le tableau Lead/Qualified/Won.Pipelineespace de travailOuvrir des affaires23Valeur ouverte128.000 $Prévision pondérée74k $Offres attribuées12+ Nouveau contratApprouver la file d'attente2 à réviserPOUVOIRVolt Inc.4000 $Lumière6000 dollarsQUALIFIÉNimbus30 000 dollarsPic9 000 $GAGNÉOrbite48k $1LIVE STATSPrévisions pondérées et valeur ouverte2AI QUEUEApprouver les transactions proposées3BOARDFaites glisser les offres par étape
L &apos; écran du pipeline réel : statistiques en direct (valeur ouverte, prévision pondérée), file d &apos. approbation par IA pour les offres proposées et tableau de bord glisser-déposer.

Utiliser le tableau de pipeline

1
Voir vos offres

Le pipeline affiche toutes les distributions actives sous forme de cartes disposées en colonnes (étapes). Chaque en-tête de colonne montre la valeur totale des distributions 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 revient à sa position d &apos; origine.

3
Badges de cartes à cocher

Badge vert = en bonne santé (activité récente, sur la bonne voie). Jaune = à risque (ralentissement, attention nécessaire). Rouge = au point mort (pas d &apos; activité depuis trop longtemps).

4
Cliquez pour les détails

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

La file d &apos; attente pour l &apos. approbation

Les propositions d &apos; IA apparaissent dans la file d &quot; &quot. approbation en haut de la page du pipeline. Chaque proposition montre ce que l &apos, IA veut faire, pourquoi et les preuves. Vous pouvez :

Approuver

Accepter la proposition telle quelle. L &apos; action est exécutée par le biais de la couche de confiance et enregistrée dans le journal.

Éditer

Modifier la proposition avant d &apos; approuver. Par exemple, modifier l &apos); &apos:

Rejeter

Refuser la proposition. L &apos; IA apprend des rejets pour faire de meilleures suggestions à l &apos, avenir.

Explication de la probabilité de gagner

La probabilité de gagner peut être définie manuellement ou calculée par l &apos; IA. Lorsque l ’ IA 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 &quot; &lt; &gt; utilisera la probabilité par défaut du stade. La prévision pondérée est basée sur cette probabilité : a $10,000 deal at 30% la probabilité contribue. $3,000 à la prévision "probable".

Déplacer une transaction vers Won

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

Faites glisser la carte jusqu &apos; au stade « gagné ». OpsIQ Je vais: (1) Marquer l &apos; affaire comme close-won. (2) Mettre à jour les prévisions. (3) Ajouter une activité « gagnée » à la chronologie. (4) Si configuré, déclenche un évènement webhook (crm.deal.won). (5) Mettre à jour l &apos; étape du cycle de vie du contact sur « Client ».

Repérer les affaires bloquées

Scénario :
Vous voulez trouver des affaires qui ont été au même stade pendant trop longtemps.
Que faire :

Recherchez les badges rouges (bloqués) sur le tableau des pipelines. Ces offres n ' ont pas eu d ', activité depuis plus longtemps que le seuil de pourriture configuré (défini dans Configuration CRM > Pipelines). Cliquez sur chaque offre bloquée pour voir la recommandation du coach de vente concernant sa réactivation.

Puis-je avoir plusieurs pipelines?+

Oui. Allez dans Configuration CRM > Pipelines pour créer des pipelines supplémentaires. Cas d &apos; utilisation courants: pipelines distincts pour les nouvelles affaires par rapport aux renouvellements, ou pour différents produits/services.

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

L &apos; affaire est marquée comme étant fermée-perdue. Vous serez invité à indiquer la raison de la perte. L &quot; &quot, affaire sera supprimée du tableau actif mais pourra être retrouvée dans le filtre des affaires fermées. Le contact restera dans le CRM.

CRM

Coaching de négociation

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.

Le coach de la distribution
Le coach de la distributionUne carte d &apos; offre énumérant les signaux de risque détectés par l &apos, IA avec des sources de preuves, à côté d &quot; &quot. une recommandation d &amp; AI et un bouton pour envoyer un brouillon par courrier électronique.Le coach de la distributionespace 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 de courrielsL &apos; IA recommande :Rétablir l'économieacheteur avec un récapitulatif ROIet un plan de clôture de 7jours.Rédigez l'e-mail1SIGNALSPourquoi un accord pourrait échouer2SOURCEDChaque affirmation cite des preuves.3ActionÉ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 l &apos; entraîneur vous dit

Explication de la santé

Pourquoi l &apos; affaire est-elle en bonne santé, à risque ou au point mort? Signaux spécifiques: jours d &apos. étape, date du dernier contact, fréquence des activités, mentions de concurrents, schémas d &quot; objection &quot.

Signaux

Classés en: objections soulevées, mentions de concurrents, discussions sur les prix, indicateurs de risque d &apos; assistance, signaux de renouvellement/expansion. Chaque signal renvoie à sa source (transcription du chat, ticket, courriel, activité).

Carte des champions et des bloquants

Qui aide à l &apos; accord (le champion) et qui résiste (le bloquant), sur la base de l &quot; &quot. analyse des interactions et des rôles de contact.

Liste de contrôle des qualifications

Liste de contrôle MEDDICC ou BANT (configurable) montrant les critères de qualification satisfaits et ceux qui sont manquants. Note : A, B, C, D ou F.

Préparation de la réunion

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

Plans de réponse et d &apos; appel

Message ou script d &apos; appel suivant suggéré en fonction de l &apos. état actuel du contrat et des interactions récentes.

Chronologie des preuves

Chaque demande que le coach fait est liée à une source : un numéro de ticket, l &apos; ID d &apos. transcription du chat, la date de l &quot; &quot); activité ou la visite du site Web.

Comment utiliser l &apos; entraîneur?

1
Lisez le brief.

Ouvrez n &apos; importe quelle transaction et accédez à la section Coach de transaction. Lisez l &apos, état d &apos. santé et les signaux clés.

2
Combler les écarts de qualification

Vérifiez la liste de contrôle des qualifications. Si « Acheteur économique » est manquant, planifiez pour identifier et engager le détenteur 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.

Se préparer pour une grande réunion

Scénario :
Vous avez une réunion avec un prospect demain à propos d &apos; un. $50,000 d &apos; accord.
Que faire :

Ouvrez le contrat 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 &apos; ils ont soulevées dans le chat la semaine dernière. (3) Concurrent qu &apos; ils ont mentionné dans un ticket de soutien. (4) Questions à poser sur leur chronologie. (5) Facteurs de risque à traiter proactivement. Utilisez ce brief pour préparer un programme ciblé, basé sur des données probantes.

Comprendre pourquoi une transaction est à risque

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

Cliquez sur la transaction et lisez l &apos; explication de santé du coach des transactions. Elle pourrait indiquer : « Cette transaction a été au stade de proposition pendant 22 jours (seuil: ) 14). Dernier contact a été. 11 Le contact principal a ouvert un ticket d &apos; assistance concernant les problèmes de migration des données. 5 il y a 2 jours (ticket #T-892 Suggestion : adressez-vous au problème de la migration et planifiez un appel de suivi. » Maintenant, vous savez exactement ce qu &apos; il faut réparer.

CRM

Prévisions et rapports

Prévisions de qualité avec une gamme défendable, des explications sur les changements au niveau de l &apos; accord 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 &apos; exactitude.Prévisionsespace de travailPRÉVISIONS · CE TRIMESTRE$ 312k87% vers le butEnvoyerLe meilleur scénarioPipelinePondérée par l &apos; IA en fonction de la santé et de l &quot; &quot.1CATÉGORIESEnvoyer au pipeline2AI-WEIGHTEDPar la 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 80% ou plus. Ce sont vos gains les plus probables. Cela devrait être votre revenu minimum attendu.

Probablement pondéré par l &apos; IA

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

Le meilleur scénario

Toutes les transactions ouvertes à pleine valeur. C &apos; est le revenu maximal possible si tout se passe parfaitement (ce qui arrive rarement).

Intervalle de confiance

Année 80% Exemple : "Vous fermez probablement entre $45,000 et $72,000 ce trimestre."

Qu &apos; est-ce qui a changé et pourquoi?

Les prévisions incluent l &apos; attribution des changements d &apos. $15,000, le rapport explique exactement les transactions qui ont causé ce changement : « La transaction A a été reportée au prochain trimestre ($8,000), Deal B lost ($5,000), Deal C réduit en valeur ($2,000)."

Suivi de la 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 la probabilité de gagner

Le score de Brier qui mesure à quel point les probabilités de gagner correspondent aux résultats réels.70% la probabilité de gagner réellement.70% la plupart du temps, l &apos; étalonnage est bon.

Instantanés hebdomadaires

OpsIQ capture un instantané de vos prévisions chaque semaine (via cron). Au fil du temps, vous pouvez voir comment la précision de vos prediction s &apos; améliore.

Annonces et avertissements

Conversion par étape

Combien de transactions passent de chaque étape à la suivante 80% passer de Qualified à Proposition mais seulement 20% passer de la Proposition à la Négociation, vos propositions pourraient avoir besoin de travail.

Taux de victoire par source

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

Performance par propriétaire

Comment chaque membre de l &apos; équipe commerciale se comporte-t-il : transactions gagnées, valeur du pipeline, taille moyenne des transactions, taux de réussite.

Avertissements

Le sandbagging (probabilités irréalistes), le surengagement (probability unrealistically high) et l &apos; engagement à risque (accords à forte probabilité montrant des signes de blocage).

Comprendre une baisse des prévisions

Scénario :
Vos prévisions trimestrielles ont chuté de. $180,000 à $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 &apos; agent de prospection vous aide à trouver et à rechercher des clients potentiels. Décrivez votre client idéal, ajoutez les entreprises cibles et laissez l &apos: IA effectuer des recherches, noter et rédiger une communication immédiate.

Prospection
ProspectionUne liste des entreprises potentielles trouvées par l &apos; IA avec des notes d &apos, scores et un bouton de prospection pour chacune.Prospectionespace de travailLes perspectives trouvées par l &apos; agent DTSNorthwind Ltd.SaaS · 50 personnel · soutien à l &apos; embauche88Projet de communicationCobalt MfgFabrication · 200 personnel74Projet de communicationMesa RetailCommerce électronique · 30 staff69Projet de communicationVega SantéSoins de santé · 80 personnel63Projet de communication1FINDLes sources d &apos; IA ciblent les comptes.2ScoreFit & intention ranked3DRAFTLe premier contact écrit pour vous
L &apos; agent SDR trouve les entreprises cibles, leur attribue une note et rédige le premier projet de communication pour votre examen.

Configuration unique

1
Décrivez votre client idéal

Accédez à Configuration CRM > Prospection. Décrivez votre profil client idéal (ICP) : industries cibles, taille de l &apos; entreprise, titre du poste, orientation géographique, termes correspondant aux produits et score minimum d &apos. Exemple : « Sociétés SaaS B2B avec 50-500 employés aux États-Unis/au Royaume-Uni, vendant des outils de développement, avec un vice-président des ventes ou le responsable de la croissance comme contact principal. »

2
Ajouter des sociétés cibles

Entrez les domaines ou noms d &apos; entreprises que vous souhaitez rechercher. Vous pouvez également laisser l &apos, intelligence artificielle suggérer des sociétés en fonction de votre ICP.

3
Révision des résultats de la recherche

L &apos; IA enrichit chaque entreprise des données disponibles : taille, secteur d &apos.., technologie utilisée, actualités récentes et score de compatibilité avec explication.

4
Approuver la diffusion

Pour les entreprises qui s &apos; y prêtent, l &apos. IA rédige un message personnalisé à la première visite : il est examiné et approuvé dans la file d &apos,.

Ajustement du score

Chaque prospect reçoit un score d &apos; adéquation de 0 à _100 basé sur cinq facteurs :

Ajustement ICP

La mesure dans laquelle l &apos; entreprise correspond à votre profil de client idéal (secteur, taille, localisation).

Signaux d &apos; urgence

Y a-t-il des preuves qu &apos; ils ont besoin de votre produit maintenant? Des offres d &apos, changements technologiques, plaintes contre les concurrents.

Proximatif budgétaire

La taille de l &apos; entreprise, le stade du financement et les indicateurs des recettes suggèrent la disponibilité budgétaire.

Correspondance de produit

La pertinence de votre produit pour leur entreprise en fonction de l &apos; industrie et de la technologie.

Ajustement de l'aide

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

Recherchez une entreprise cible.

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

Ajouter acme.com à la liste de prospection. L &apos; IA renvoie : Fit score 78/100 Raisons : B2B SaaS, 120 employés, basé aux États-Unis, a récemment embauché un vice-président des ventes (signal d &apos; urgence), utilise le concurrent X (correspondance de produits). Signaux d &quot; achat : visité votre page de prix deux fois le mois dernier (à partir du suivi du site Web). [email protected] (VP des ventes). L &apos; aperçu fait référence aux visites récentes de la page d &apos.

CRM

Séquences de suivi automatiques

Les séquences automatisent le suivi en plusieurs étapes : un mélange d &apos; e-mails, d &quot; &quot. attente, de tâches, d appels et d &amp; webhook qui s &apos); exécutent automatiquement après que vous avez approuvé l &apos. 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 des réponses.Séquences de suiviespace de travailAprès avoir approuvé le premier envoi →E-mailIntroductionAttendre3 joursE-mailSuiviTâcheAppelLes étapes peuvent être email, attente, tâche ou webhook. Une réponse stoppe automatiquement la séquence.1AUTOMATESuivi en plusieurs étapes2STEPSE-mail · attente · tâche · webhook3YOU APPROVELe premier envoi est bloqué
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 : courriel, attente3jours, e-mail, attendre5jours, tâche (appeler si aucune réponse), email. Chaque étape de l'email a un modèle que vous pouvez personnaliser.

2
Enregistrer les contacts

Ajouter des contacts à la séquence. L &apos; IA peut également proposer une inscription à partir de résultats de prospection.

3
Exécution automatique

Les étapes s &apos; exécutent automatiquement selon un calendrier. Si un contact répond à n &apos, quelconque moment, la séquence est mise en pause automatiquement.

4
Suivre les résultats

Voir les taux d &apos; ouverture, de réponse, de conversion et de désabonnement par étape. Utilisez cette fonction pour optimiser votre séquence.

Répondre compréhension

Lorsqu &apos; un contact répond, l &apos. i. classe la réponse :

Positif

Intéressé, veut parler. La séquence s &apos; arrête, la tâche est créée pour suivi.

Objection

A des préoccupations mais ne rejette pas. La séquence s &apos; interrompt, la tâche est créée avec les détails de l &apos); objection;.

Se désinscrire

Veut arrêter de recevoir des messages. Le contact est supprimé définitivement.

Pas maintenant

Intéressé mais le timing est incorrect. La séquence s &apos; interrompt, la tâche de rappel a été créée.

La mauvaise personne.

Pas le bon contact. La séquence s &apos; arrête, le contact est marqué pour examen.

Soutien

Une question d &apos; assistance, pas une réponse commerciale. La séquence s &apos); est interrompue et un ticket créé.

Protections anti-pourriel

Gestion des désabonnements

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

Limite d &apos; envoi journalier

Limite quotidienne au niveau de l &apos; espace de travail (par défaut : courriers électroniques 1,000). Empêche les envois massifs qui déclenchent des filtres anti-pourriel.

Limite par contact

Nombre maximum de messages 1 par contact et par jour. Empêche d &apos; encombrer les personnes individuelles.

Gestion des sur-caps

Les étapes qui dépassent le plafond quotidien sont reportées au lendemain. Elles ne sont jamais abandonnées ou ignorées.

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

La séquence est automatiquement mise en pause. Le support a la priorité sur l &apos; étendue. La séquestration peut être reprise manuellement une fois le problème de support résolu.

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

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), le catalogue des produits, les formulaires de capture de prospects, les liens de réservation et l &apos; acheminement des prospects. Tout ici s &apos); é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 groupés à partir de paiements par plateforme, le cycle de facturation est déduit des écarts de paiement, et un abonnement devient caduque lorsqu'un paiement est en retard1.5Les clients se connectent à CRM contacts automatiquement lorsque le grand livre porte leur email.

Catalogue de produits

Catalogue

Une seule source de vérité pour ce que vous vendez. Les citations tirent le nom et le prix du catalogue, et les citations acceptées s &apos; accumulent dans les recettes par produit.

Formulaires de capture de prospects

Capturer

Chaque formulaire reçoit une page hébergée ainsi qu &apos; un code d &apos. 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

Planification

Partager un lien, laisser les prospects choisir une place libre. Les places respectent les heures de travail de l &apos; organisateur, le fuseau horaire et les réunions existantes. Une réservation crée la réunion, envoie au prospect une confirmation par courrier électronique et informe l &quot; &quot); a l &amp; #160; organisateurs.

Routage des prospects

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éez votre premier formulaire

1
Outils de croissance ouverte

Allez dans CRM, puis Outils de croissance, et ensuite la section Formulaires de capture des prospects.

2
Nommez-le et choisissez des champs.

Tapez un nom et une liste de champs séparés par des virgules, par exemple nom, courriel, téléphone, message. Le courrier électronique est toujours requis.

3
Partager ou intégrer

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

4
Regardez les prospects arriver.

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

💡
Les pages de capture publiques utilisent l ' adresse propre à votre espace de travail. Les espaces de travail en nuage utilisent leur sous-domaine attribué (company.opsiq. help), afin que le lien résolve toujours les bonnes données.

Protections intégrées

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

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

Taux limité

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

Le consentement reste honnête.

L &apos; envoi d &apos, un formulaire ne donne pas le consentement à la commercialisation. Seule une case à cocher explicite l &apos.

Pas de double réservation

Un emplacement est re-validé par rapport à une nouvelle vérification de disponibilité au moment de la réservation.

D &apos; où viennent les données sur les revenus récurrents?+

Depuis le même grand livre commercial que votre page de ventes utilise, alimenté par des connecteurs de facturation. Utilisez Re-synchroniser à partir de 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 à partir du menu déroulant (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
Câblez le webhook

Chaque entrée de fournisseur affiche son propre webhookURLColler dans le rapport de livraison de la passerelle et les paramètres de messagerie entrants pour obtenir l'état de livraison et les réponsesOpsIQ.

4
Envoyer depuis un contact

Ouvrez un contact et utilisez le bouton SMS ou WhatsApp. Si plusieurs fournisseurs 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 consentement inconnu n &apos; est pas un consentement. L &apos, envoi refuse à moins que le consentement SMS soit explicitement accordé.

Ne pas contacter gagne toujours.

Un drapeau de non-contact bloque tous les canaux, peu importe ce qui est défini.

Suppression honorée

Les contacts de la liste d &apos; exclusion ne sont jamais contactés.

Les refus donnent leur raison.

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

Pour les développeurs : le contrat webhook

Forme URL

https://your-address/opsiq/cron/messaging_webhook.php?sk=SITE_KEY&e=ENTRY_ID&t=TOKEN. Le jeton par entrée est créé lorsque le fournisseur est connecté et ne tourne jamais lors de l &apos; é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 rapports de livraison marquent la ligne du grand livre d &apos; outreach qui contient l &apos. id. message du fournisseur comme livrée ou rebondie. Les messages entrants correspondent au contact par numéro de téléphone dans l &quot; &quot, atterrissent en tant qu &apos, activité message. received et marquent le dialogue répondu.

Mode d &apos; échec

Les réponses de jeton incorrectes ou manquantes 403. Les charges utiles inconnues sont comptées et ignorées, jamais fatales, donc 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 informations d &apos; identification sont-elles sûres?+

Les informations d &apos; 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 &quot; &quot, une entrée avec un secret vide conserve celui qui a été enregistré.

L &apos; IA peut-elle envoyer des messages?+

Oui, par le biais d &apos; actions enregistrées qui nécessitent une confirmation et exécutent la même passerelle de consentement.

CRM

Garder et développer les clients

La gestion du cycle de vie vous aide à protéger les revenus existants. Chaque compte reçoit un score de risque de déperdition, un score d &apos; état de santé, un pointage d &quot; expansion &quot); et un guide recommandé pour réussir.

Cycle de vie
Tableau 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é 28RENOUVELLEMENTOmbrerenouvelle dans 12dexpansion +8000 dollars1STAGESAccès au renouvellement2SCOREDSanté et expansion3PLAYBOOKProchaine action 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 du cycle de vie

Plan de scène

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

Comptes à risque

Comptes marqués avec un risque de désabonnement élevé. Chacun montre le principal facteur (pique d &apos; assistance, inactivité, échec du paiement) et une sauvegarde recommandée.

Possibilités d &apos; expansion

Les comptes qui montrent des signes de volonté d &apos; acheter davantage : forte consommation, demandes de fonctionnalités, demande de forfaits.

Renouvellements à venir

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

Comment OpsIQ détecte le risque de churn

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

Signaux CRM

Traiter la santé, l &apos; inactivité, les pertes récentes et le déclin de l &quot; &quot.

Soutenir les signaux

Nombre de tickets ouverts, pics du volume des tickets, sentiment négatif, escalade.

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 pages d &apos; annulation.

Livres de jeu

Sauver la lecture

Pour les comptes à risque : contacter de manière proactive, répondre aux préoccupations, offrir un soutien et faire évoluer la situation si nécessaire.

Jeu de renouvellement

Pour les prochains renouvellements : confirmer la satisfaction, examiner l &apos; utilisation, présenter la valeur, offrir une incitation si nécessaire.

Jeu d &apos; 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 &apos; adoption

Pour les comptes sous-utilisés : offrez une formation, partagez les meilleures pratiques, activez les fonctionnalités qu &apos; ils n &apos.

Repérer le décrochage avant qu &apos; il ne se produise

Scénario :
Un client qui se connecte normalement tous les jours ne s &apos; est pas connecté depuis. 2 et ils ont ouvert. 3 des tickets de soutien ce mois-ci.
Que faire :

Le tableau de bord du cycle de vie marque ce compte comme « à risque » avec les pilotes suivants : inactivité (14 jours depuis la dernière connexion) et le pic de support (3x Le jeu recommandé: appel de proximité proactif pour comprendre ce qui se passe. Y a-t-il un problème avec le produit? Est-ce qu &apos; ils évaluent les concurrents?

CRM

Gardez vos données propres

L &apos; 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 que l &apos; agent Steward a trouvésDupliquer[email protected] et [email protected]FusionnerManquant12 contacts n &apos; ont pas d &apos.EnrichirObsolète38des marchés non couverts pour90+ joursRévisionPrésentationnuméros de téléphone dans les formats 4Réparer tout1CATCHESDupes, lacunes, vieillissement2EXPLAINSPourquoi a-t-il 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 &apos; il attrape

Contacts en double

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

Données manquantes

Contacts sans adresse électronique, offres sans montants, sociétés sans domaine. Suggère de remplir à partir des sources disponibles.

Enregistrements non liés

Offres sans contacts associés, contacts sans sociétés. Propose des liens basés sur le domaine de messagerie et le contexte.

Incohérences

Une transaction au stade « Gagné » avec une probabilité de 20%, un contact marqué « Client » sans transactions, une entreprise dont l &apos; industrie n &apos.

Les mauvaises étapes

Les affaires qui ont été au même stade depuis trop longtemps ou les contacts dont l &apos; étape du cycle de vie ne correspond pas à leur activité.

Comment utiliser

1
Ouvrir la liste des stewards

Allez dans CRM et trouvez la section Data Steward (ou ouvrez-la depuis CRM Health).

2
Approuver les correctifs sécurisés

Les éléments verts sont sûrs : supprimer les doublons, données manquantes évidentes. Approuver en masse.

3
Revoir le reste

Les éléments ambre ont besoin de votre jugement : doublons possibles avec des différences mineures, changements d &apos; étape proposés, liens vers les sociétés.

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 :

L &apos; intendance propose de fusionner les deux dossiers. Gardez l &apos, mais ajoutez plus d &apos: activités et fusionnez les autres dossiers avec leurs affaires et activité. Examinez la proposition, ajustez le nom affiché si nécessaire, puis approuvez. L &quot; &quot, historique des deux dossier est conservé dans le contact fusionné.

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 &apos; il applique à l &apos); approbation. Pas de codage, pas de clics sur la configuration manuelle.

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 webdesign.vendre des cartes de fidélité mensuelles etdes projets ponctuels aux petitsdes entreprises.Construire mon CRMPlan généréÉtapes : Plomb → RétentionTypes de transaction : retenue, projetChamp : valeur mensuelleSegments : PME, agenceSéquence : onboardingApprouver et appliquer1DESCRIBEEn anglais simple.2AI 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.

Entrez une description en anglais clair de votre configuration CRM. Exemple: « Créer un pipeline de renouvellement avec des étapes: Prochain, Contacté, Négociation, Renouvelé, Perdu. Le score des leads est plus élevé lorsqu &apos; ils consultent les prix deux fois. »

2
Examiner le plan

OpsIQ montre un aperçu de ce qu &apos; il va créer: pipeline, étapes, probabilités d &apos.

3
Appliquer

Cliquez sur Appliquer pour exécuter le plan. Chaque modification est enregistrée sous forme de groupe que vous pouvez annuler en un seul clic.

4
Retour en arrière si nécessaire

Si quelque chose ne va pas, cliquez sur Annuler pour rétablir l &apos; ensemble du paquet. Votre CRM revient à son état précédent.

Ce que vous pouvez construire

Pipelines et étapes

Créer 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é quand ils voient la tarification », « Scores inférieur quand ils visitent la page carrières. »

Règles du cycle de vie

Avance automatiquement les étapes du cycle de vie : « Déplacer vers SQL lorsqu &apos; ils demandent une démo », « Déplacement vers le client lorsque l &apos.

Champs personnalisés

Ajouter des champs aux contacts, offres ou sociétés : texte, numéro, date, sélectionner, case à cocher, URL, courriel.

Liste de contrôle des qualifications

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

Configuration d &apos; un pipeline de renouvellement

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

Type : "Créer un pipeline de renouvellement. Étapes : 90 Journées hors saison (10%), 60 Journées hors saison (25%), Contact (40%), Négociation (60%), Renouvelé (100%), Churn (0%). Définissez le seuil de pourriture à. 14 jours."OpsIQ génére le plan, vous l &apos; examinez et cliquez sur Appliquer. Le pipeline apparaît immédiatement sur votre page Pipeline.

Et si je décrivais quelque chose qui n &apos; est pas possible?+

Le constructeur ne génère que les actions qu &apos; il sait valider. Si vous demandez quelque chose qui n &apos, est pas dans ses capacités (par exemple, « Intégrer avec mon API personnalisé »), il rejettera la requête et expliquera ce qu &quot; &quot, il peut faire à la place.

Puis-je annuler les modifications?+

Oui. Chaque action de Build My CRM est capturée comme un lot réversible. Allez dans l &apos; onglet Santé du CRM > Historique des modifications pour voir tous les lots et en annuler n &apos, identiquement.

CRM

Mettre en place votre CRM à votre façon

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

Pipelines et étapes

Créer, renommer, réorganiser et supprimer des pipelines et des étapes. Définir la probabilité de victoire par défaut par étape. Définissez le seuil de pourriture (jours sans activité avant qu &apos; une transaction ne soit marquée comme « bloquée »).

Champs personnalisés

Ajouter des champs aux offres, contacts ou sociétés. Types de champs : texte, nombre, date, sélection (liste déroulante avec options prédéfinies), case à cocher, URL, courriel. Les champs personnalisés apparaissent sur le profil d &apos; objet et dans les filtres.

Liste de contrôle des qualifications

Définir la liste de contrôle que l &apos; entraîneur d &apos. offres utilise pour évaluer les offres. Choisissez MEDDICC, BANT ou un ensemble personnalisé de critères. Chaque élément peut être marqué comme requis ou facultatif.

Règles de la phase du cycle de vie

Définir des transitions automatiques d &apos; étape : lorsqu &apos, un contact remplit une condition (consulte les prix, soumet un formulaire, effectue un achat), son stade de cycle de vie avance automatiquement.

Les règles du lead-scoring

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

Vues enregistrées

Créez des combinaisons filtre + tri nommées pour les contacts, les affaires ou les entreprises. Partagez les vues avec votre équipe. Définissez une vue par défaut par type d &apos; objet.

Ajouter une règle de notation des leads

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

Allez à CRM Configuration > Règles de cotation du plomb. Cliquez sur Ajouter une règle. Set: Event = "pageview",URLcontient = "/pricing", nombre minimal =2, Augmentation du score = +20. Enregistrer. La prochaine fois que le scoreur tourne, les contacts correspondant à cette règle obtiendront +20à leur score d'avance.

CRM

CRM Health checkup

CRM Health est une page d &apos; autodiagnostic qui vérifie que votre système de gestion des relations clientèle est configuré correctement et fonctionne sans problème.

Vérification de santé
Vérification de la santé du CRMUn score de santé à 92 à côté d &apos; une liste des vérifications de configuration réussies et des avertissements.Vérification de la santé du CRMespace de travail92SAINEÉtapes du pipeline configuréesConnecteur lié & importéAgents d &apos; IA activés!Aucune séquence de suivi active!12 contacts company missing1VÉRIFICATIONVérifie votre configuration2FLAGSCe qui manque3ScoreUn nombre global
Un audit CRM d &apos; une page : un score global de santé plus une liste des éléments correctement configurés et de ceux qui nécessitent encore une attention particulière.

Ce qu &apos; il vérifie

Schéma

Les tables de base de données existent et ont les colonnes correctes. Si une migration a été manquée, CRM Health l &apos; indiquera.

Agents d &apos; IA

Tous les agents CRM (Capture, Data Steward, Deal Intelligence, etc.) sont enregistrés et en bonne santé. Vert = fonctionnement, jaune = nécessite attention, rouge = erreur.

Itinéraires

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

Les actions de l &apos; IA

Le catalogue d &apos; actions CRM est enregistré dans le registre des actions. Si les actions sont manquantes, la santé du CRM se répare automatiquement en les réenregistrant.

Comptage des 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 la configuration

Après la première configuration CRM, ouvrez CRM Health et vérifiez que tous les contrôles sont verts. Si un des contrôles sont ambre ou rouge, cliquez sur l'élément pour une explication diagnostique et de corriger suggéré.

À quelle fréquence dois-je vérifier l &apos; état de mon CRM?+

Vérifiez après la configuration initiale, après les mises à jour majeures et chaque fois que le comportement du CRM semble incorrect. La santé de CRM corrige automatiquement de nombreux problèmes (comme l &apos; absence d &apos); enregistrements d &quot; &quot: action) simplement en ouvrant la page.

CRM

Connexions CRM pour les développeurs

Le CRM expose un REST public complet API et des webhooks sortants de sorte qu &apos; il s &apos..

API points de terminaison

Authentification

API clé (Autorisation: porteur opq_...) avec le champ d &apos; application crm.read ou clm.write. POST to /api/v1.php avec action et site_key.

Personnes à contacter

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

Offres

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

Activités

crm. activities. list (calendrier d &apos; un contact/d &apos, crm-activities-record (enregistrement d &quot; une nouvelle activité).

Événements

crm. events. list (flux de changement permanent avec le curseur since_id), crm. events. catalog (liste des types d &apos; é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 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

Ils sont licenciés quand une transaction passe à un stade différent.

crm.deal.won

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

crm.deal.lost

Déclenchée lorsqu &apos; 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 &apos; une nouvelle tâche est créée (manuellement ou par 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 webhook sont signés par HMAC et réessayés en cas d &apos; échec. Souscrivez à un URL dans Paramètres > Webhooks, ou interrogez crm. events. list avec since_id pour obtenir un flux de modification durable.

Synchronisation des contacts CRM avec Google Sheets

Scénario :
Vous voulez 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 &apos; autres outils adaptés à l &apos.

Ecran du produit
SegmentsL &apos; éditeur de segments combine les conditions, affiche le nombre de correspondances en direct et permet à l &apos. opérateur de choisir un filtre en direct ou une capture d &apos: s épinglée.Segmentsespace de travailModeEn directLOGICTOUSMATCHES1,248VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTLe stade du clientest égal à Client actifRègleDernière activitédans les 30 joursRèglePaysest égal au Royaume-UniRègleHaute intentionscore au moins 70Règle1CHOOSE MODEEn direct ou instantané2ADD RULESALL ou ANY3REUSECampagnes et CRM
L &apos; éditeur de segments combine les conditions, affiche le nombre de correspondances en direct et permet à l &apos. opérateur de choisir un filtre en direct ou une capture d &apos: s épinglée.

A segment en direct recalcule à partir des données courantes chaque fois qu &apos; il est utilisé. instantané épinglé fige la liste des membres actuelle, ce qui est utile lorsqu &apos; une audience de diffusion ne doit pas changer après approbation.

Choisir TOUS où chaque condition doit correspondre ou N &apos; IMPORTE QUEL quand une condition est suffisante. Vérifiez le compte en direct avant d &apos; enregistrer. Les segments système peuvent être visibles mais protégés de l &apos, édition ordinaire.

CRM

Le lead scoring

Les règles de notation des prospects transforment les signaux comportementaux et profilés en un score cohérent que les ventes et l &apos; automatisation peuvent utiliser.

Ecran du produit
Le lead scoringLe score de lead montre les règles actives, la fenêtre déroulante et le changement de score positif ou négatif que chaque règle applique.Le lead scoringespace de travailRÈGLES12SCORED8,412HOT LEADS286VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTActivité de tarification3+ visites en 14 jours+20Acheter un mot-clécontient la migration ou l &apos; entreprise+15Soutenir le risqueévénement de plainte dans 30 jours-10Source fiableparrain de partenaire+121DESCRIBE RULEUtilisez l &apos; anglais courant2REVIEW FIELDSSigne, fenêtre, points3RESCOREAppliquer à l &apos; espace de travail
Le score de lead montre les règles actives, la fenêtre déroulante et le changement de score positif ou négatif que chaque règle applique.

Le générateur de règles d &apos; IA peut transformer une instruction en anglais clair en une règle structurée. Chaque règle doit toujours être examinée avant son activation: confirmer l &apos, activité ou mot-clé, compte minimum, fenêtre déroulante et changement de score.

Les règles positives et négatives peuvent coexister. Utiliser Espace de travail Rescore Les scores peuvent alimenter les segments, le routage, la prospection et les conditions de flux de travail.

CRM

Tableau des ventes

Le classement compare les représentants en utilisant l &apos; atteinte des quotas, le revenu gagné, la commission et le pipeline ouvert pour le mois sélectionné.

Ecran du produit
Tableau des ventesLe classement mensuel classe les représentants commerciaux tout en gardant visibles le chiffre d &apos; affaires gagné, la commission et le pipeline ouvert.Tableau des ventesespace de travailPERIODJuilletTEAM QUOTA82%GAGNÉ184kVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTAmina104% quota · 62 000 livres gagnées1erBonjour88% quota · £51k gagné2e@ item: inlistboxC'est vrai.76% quota · £43k gagné3e@ item: inlistboxOuvrir le pipeline£312k à travers le teamRévision1CHOOSE 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 &apos; affaires gagné, la commission et le pipeline ouvert.

L &apos; atteinte du quota n &apos, est significative que lorsque chaque représentant a un quota actuel et les offres ont le propriétaire correct, le montant, la devise et l &apos. Utilisez le tableau des résultats pour l &quot; encadrement et la reconnaissance, pas comme seule mesure de qualité ; associez-le à la santé de l &amp; e offre, à l &lt; &lt. activité et à la précision des prévisions.

CRM

Approbation des transactions

Les approbations des transactions nécessitent la signature du gestionnaire avant que les transactions de grande valeur puissent être marquées comme gagnées.

Ecran du produit
Approbation des transactionsLa politique d &apos; approbation définit deux seuils de valeur et la file d &quot; &quot. affiche les décisions en attente, approuvées et rejetées.Approbation des transactionsespace de travailPOLICYActivéWAITING6OLDEST3hVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTNiveau 1Offres de £10,000GestionnaireNiveau 2Offres de £50,000AînésRenouvellement d &apos; entreprise£72,000 · demandé par BenEn attenteProjet de migration£18,500 · demandé par RitaApprouvé1SET THRESHOLDS0 désactive un niveau2REQUESTLe représentant soumet l &apos; accord.3DÉCIDEApprouver ou rejeter
La politique d &apos; approbation définit deux seuils de valeur et la file d &quot; &quot. affiche les décisions en attente, approuvées et rejetées.

Activer la stratégie et définir le niveau : 1 et niveau 2 Un seuil de 0 désactive ce niveau. Quand un non-manager tente de gagner une transaction à ou au-dessus du seuil, OpsIQ crée une demande d &apos; approbation au lieu de changer silencieusement le stade.

Les gestionnaires et les administrateurs complets ne sont pas bloqués par la politique. Chaque décision doit conserver le demandeur, l &apos; approbateur, l heure et la raison pour être vérifiable.

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.

Ecran du produit
Règles du cycle de vieLes règles de cycle de vie sont évaluées par priorité ; la première règle correspondante change le stade du contact.Règles du cycle de vieespace de travailActif7RUNSChaque nuitPRIORITYLe plus haut d &apos; abordVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTLead → Qualifiéscore ≥ 60 et activité récentePriorité 100Qualifié → Clientl &apos; événement d &apos. achat existePriorité 90Client → En dangeraucune activité depuis 60 joursPriorité 70À risque → Clientnouvel achat ou réponsePriorité 601PICK STAGESDe et à2DEFINE FILTERStyle de segment JSON3ORDER RULESLe premier match gagne
Les règles de cycle de vie sont évaluées par priorité ; la première règle correspondante change le stade du contact.

Chaque règle a une étape source, une étapes de destination, un drapeau actif, une priorité et un filtre de style segment. La tâche du cycle de vie planifiée évalue les priorités plus élevées en premier et s &apos; arrête après la première correspondance pour un contact.

Les règles doivent être mutuellement compréhensibles. Évitez deux règles actives qui peuvent déplacer le même contact dans des directions opposées pendant la même exécution. Testez le filtre sur un segment avant de l &apos; activer.

CRM

Flux d &apos; activité CRM

Le flux d &apos; activité de l &apos, espace de travail combine les événements clients et opérationnels afin que les équipes puissent enquêter sur ce qui s &apos. est passé sans avoir à ouvrir chaque module.

Ecran du produit
Activité CRMLe flux d &apos; activités intercale les échanges de messagerie instantanée, les tickets, les courriels, les webhook, les conversions et les anomalies avec des filtres et une pagination.Activité CRMespace de travailÉVÉNEMENTS2,804CUSTOMERS1,126ANOMALIES14VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTConversation résolue[email protected]MaintenantTicket a réponduT-1048 · Facturation4 mÉvénement entrantsubscription.upgraded12 mConversionOrdre #7788 · £14919 m1FILTERÉvénement et client2OPEN CONTEXTAller à l &apos; enregistrement3PAGE RESULTSGardez les enquêtes limitées.
Le flux d &apos; activités intercale les échanges de messagerie instantanée, les tickets, les courriels, les webhook, les conversions et les anomalies avec des filtres et une pagination.

Filtrer par type d &apos; événement, date, contact ou statut client (y compris les clients payants). Le flux est un modèle en lecture de l &apos. activité enregistrée ; il ne remplace pas le ticket source, la conversation, l &quot; &quot); offre ou l &lt; &lt. enregistrement connecteur. Ouvrez l &gt; enregistrement lié avant de prendre une action sensible.

CRM

Flux de travail

Les flux de travail répondent à un événement et exécutent une série ordonnée d &apos; actions, y compris des étapes retardées reprises par cron.

Ecran du produit
Flux de travailUn workflow exécuté affiche son déclencheur, les actions terminées, le temps d &apos; attente et l &apos. étape suivante.Flux de travailespace de travailActif9RUNNING42ÉCHEC1VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTDéclencheurcontact.createdCommencerÉtape 1Envoyer un courriel de bienvenueFaitDélaiAttendez 2 joursEn attenteÉtape 2Créer une tâche de venteSuivant1CHOOSE TRIGGERÉvénement démarre l &apos; exécution2ORDER STEPSActions et retards3MONITORReprendre via cron
Un workflow exécuté affiche son déclencheur, les actions terminées, le temps d &apos; attente et l &apos. étape suivante.

Créer un flux de travail en choisissant le déclencheur, en ajoutant les étapes dans l &apos; ordre et en l &quot; &quot. Les retards sont stockés, pas retenus par une requête du navigateur ; le cron unifié reprend lorsque le flux de travaux s &apos);

Les modèles de démarrage intégrés incluent les messages d &apos; accueil après l &apos, un message de remerciement après l ’achat et une 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.

Concevoir des actions idempotentes. Une réessai ne doit pas envoyer de demandes en double pour déplacer de l &apos; argent ou créer des enregistrements en doublon.

Soutien

Billets

Les tickets sont votre canal de support formel. Ils ont des départements, des priorités, des objectifs SLA, des pièces jointes, des notes internes et un fil de conversation complet. OpsIQ admin, ticket form/embed, email ingestion, chat escalation, connector, or API.

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 &apos; ébauche et de remboursement.Billetespace de travailC-12345PrioritéÉlevéDépartementFacturationSLA3hStatutOuvertJ &apos; ai été facturé deux fois pour monabonnement le 3juin.IAConfirmé le doublonfrais, traitement des remboursements.AI brouillon de réponseRemboursement1THREADEDConversation complète + notes2SLA & ROUTINGPriorité, dépt., minuterie3AI 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 circule-t-il?

1
Le billet arrive.

Un client envoie un message par courrier électronique, une escalade de chat, un ticket intégré ou l &apos; administrateur en crée un. Le ticket obtient un identifiant unique (par exemple T-12345).

2
Triage

L &apos; IA lit le sujet et le corps, assigne la priorité (faible/normale/haute/urgente), suggère un département et détecte l &apos. Ceci se fait automatiquement si le triage est activé.

3
Répondre

Un agent ouvre le ticket, lit le contexte (profil du client, données de la plateforme des connecteurs, tickets précédents) et écrit une réponse. L &apos; IA peut rédiger la réponse et l &apos); agent modifie avant d &apos.

4
Fermer

Lorsque le problème est résolu, l &apos; agent ferme le ticket. Le client en est informé. Si ce dernier répond après la fermeture, le ticket se rouvre automatiquement.

Actions par ticket

Changer de département

Déplacer le ticket vers un autre département (par exemple, de Général à Facturation). Utile lorsque l &apos; acheminement initial était erroné.

Affecter à un agent

Attribuer le ticket à un membre spécifique de l &apos; équipe. L &apos, agent affecté voit le ticket dans sa vue « Mes tickets ».

Ajouter une note interne

Écrire une note visible uniquement par le personnel. Utilisez pour : les résultats d &apos; enquête, les raisons de remboursement, le contexte technique, les engagements antérieurs. Les notes internes n &apos); s jamais affichées aux clients.

Fusionner les tickets

Combiner les tickets en double provenant du même client. L &apos; objet du ticket fusionné obtient une balise [MERGED]. 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 par IA

Laissez l &apos; intelligence artificielle améliorer votre brouillon de réponse en ajustant le ton, en raccourcissant/allongeant, en corrigeant la grammaire ou en traduisant.

Changer la priorité

Définir sur Faible, Normale, Élevée ou Urgente. La priorité affecte les minuteries SLA et l &apos; ordre de tri.

Changer le 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 : « J &apos; ai été facturé deux fois pour mon abonnement »

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. Les département : Général, Facturation, Technique, Ventes, Abus, Onboarding. Chaque département peut avoir différentes règles de réponse automatique, connaissances en IA et affectations d &apos; équipe.

Réponses en conserve

Créez des modèles de réponse réutilisables dans Paramètres > Tickets > Réponse prédéfinie. Les bonnes réponses prédéterminées comprennent:

Exemple de modèle de réponse préconfiguré
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 tickets

Lorsqu &apos; un client envoie la même question plusieurs fois (par courrier électronique et par messagerie instantanée, ou deux courriers séparés), vous pouvez fusionner les doublons. Allez sur le ticket, cliquez sur Fusionner, puis sélectionnez l &apos); autre ticket à fusionners. Le ticket restant obtient tous les messages des deux tickets. L &apos: objet du ticket fusionné reçoit une balise [MERGED] pour indiquer qu &apos. 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 standards de support. Première réponse prévue: 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 &apos; arrêtent lorsque l &apos. &quot; &quot, en attente du client &quot. Si la cible SLA n &apos, est pas atteinte, le ticket sera mis en surbrillance et éventuellement renvoyé à un niveau supérieur.

Les clients peuvent-ils voir les notes internes?+

Jamais. Les notes internes sont strictement réservées au personnel. Elles n &apos; apparaissent pas dans le portail de tickets client, les notifications par courrier électronique ou toute autre interface destinée aux clients.

Que se passe-t-il lorsqu &apos; un ticket fermé reçoit une réponse?+

Le ticket se rouvre automatiquement et retourne à la file d &apos; attente active. L &apos, équipe est informée de la nouvelle réponse.

Puis-je verrouiller un ticket pour empêcher d &apos; autres réponses?+

Oui. Utilisez l &apos; option Verrouiller le fil pour empêcher à la fois le client et l &quot; &quot, IA d &apos, ajouter de nouvelles réponses. Utile pour les litiges résolus ou les enquêtes closes.

Soutien

Service Studio : SLA, flux d &apos; état et qualité

La salle de contrôle pour la façon dont votre opération de soutien se comporte:SLA les politiques avec des échelles d'escalade, des calendriers des heures d'affaires, un flux de statut CSAT les paramètres et la fonctionnalité d'entreprise switchs. Ouvrez-la depuis la page Tickets (le bouton Service Studio dans la barre des opérations).

Politiques 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. Les échéances sont automatiquement suspendues tant qu &apos; un ticket est en attente ou en attentes.

Des échelles d &apos; 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 &apos; 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 &apos; est donc pas violé par le samedi. Des calendriers nommés (fuseau horaire, jours, heures, vacances) peuvent être attachés à des politiques individuelles pour les équipes dans différentes régions.

Flux de statut

Une matrice de/vers qui restreint les changements d &apos; état que les administrateurs peuvent effectuer, avec un paramètre prédéfini de style Zendesk. L &apos. automatisation, le courrier entrant et les réponses aux tickets émanant du client sont toujours exemptés, donc une matrice stricte ne peut jamais engorger le pipeline.

Approbations

Les agents demandent la signature d &apos; un ticket (remboursements au-delà d &quot; un seuil, exceptions de politique). Un approbateur nommé ou tout administrateur complet décide avec une note ; les requérants ne peuvent jamais approuver leur propre demande. Les approbations en attente apparaissent sous forme de bannière dans la boîte de réception.

Relations de tickets

Lier les tickets comme liés, en double, parent/enfant ou bloqués ; diviser les réponses vers un nouveau ticket lié (l &apos; inverse de la fusion, sans envoyer d &apos. une notification par courrier électronique au client); suivre les tickets pour recevoir des notifications dans l &apos, application et éventuellement envoyer une copie aux 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 &apos; autre est en train de consulter et reçoivent une bannière d &quot; &quot); avertissement lorsqu &apos: un collègue écrit déjà une réponse. Un bouton Réclamer en un clic vous assigne le ticket.

Routage sensible à l &apos; IA

Les règles de routage peuvent correspondre aux signaux de triage d &apos; IA : priorité, catégorie, sentiment et risque d &quot; escalade &quot. En outre, les valeurs des champs personnalisés saisies dans le formulaire de demande du portail sont prises en compte.

💡
Chaque commutateur d &apos; entreprise est livré désactivé. En activant un dans Service Studio → Qualité et automatisation, vous acceptez de le faire ; en le laissant désactiver, le comportement reste identique à celui d &quot; &quot); avant la mise à niveau.
Pourquoi un client peut-il encore rouvrir un ticket fermé alors que ma matrice interdit le closing → open?+

Les réponses émanant du client, les réponses par courrier électronique et l &apos; automatisation sont délibérément exemptées de sorte qu &apos. une politique stricte ne puisse jamais exclure des clients ou interrompre le pipeline.

Les échelles SLA remplacent-elles l &apos; action de violation?+

Non. Les politiques enregistrées avec une action de violation unique restent inchangées. Une échelle remplace l &apos; action unique uniquement sur les politiques où vous définissez des étapes.

Soutien

Réponse automatique et escalade des tickets

La réponse automatique permet à l &apos; IA de répondre aux nouveaux tickets automatiquement. L &apos, escalade déplace les tickets vers un autre service lorsque l &quot; &quot); AI détecte des besoins spécialisés. Les deux fonctionnalités fonctionnent sur les tickets natifs et les tickets créés par courrier électronique.

Réponse automatique
Réponse automatique aux ticketsUn flux : nouveau ticket, un délai de deux minutes, réponse d &apos; IA à partir des connaissances et du contexte, puis envoi ou enregistrement sous forme de brouillon.Réponse automatiqueespace de travailQuand un nouveau ticket arriveNouveau tickettoute sourceDélai2 minL &apos; IA répond.KB + contexteEnvoyéou brouillonSi un humain répond pendant le délai, la réponse automatique est annulée. Intent peut d &apos; abord passer à un autre service.1DELAYLes humains ont la première chance.2AI REPLIESDe KB + contexte3OR ESCALATEItinéraire 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
Un billet apparaît.

Un nouveau ticket est créé à partir de n &apos; importe quelle source (courriel, chat, portail, API).

2
Planifier la réponse

OpsIQ attend le délai configuré (par défaut : ) 2 Cela donne aux agents humains une chance 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 &apos; IA génère une réponse.

4
Générer et envoyer

L &apos; IA lit le ticket, vérifie la base de connaissances, le contexte du connecteur et l &apos. historique client, puis rédige une réponse qui est envoyée (ou mise en file d &apos: attente sous forme de brouillon pour examen, selon les paramètres).

Comment fonctionne l &apos; escalade?

1
Configurer les départements

Définir 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 &apos; IA classe le ticket en fonction de son intention : facturation, technique, remboursement, abus, etc.

3
Déplacer si nécessaire

Si l &apos; intention du ticket correspond à un service d &apos, le ticket est déplacé. Une note interne explique pourquoi.

4
Générer une nouvelle voix

La réponse est générée en utilisant les connaissances du département de destination et la formation à l ' IA.

Référence des paramètres

Réponse automatique activée

Commutateur principal. Activez pour activer la réponse automatique de l &apos; IA aux tickets.

Départements autorisés

Définir les départements pouvant recevoir des réponses automatiques. Commencez par les départnements à faible risque (général, vente) avant d &apos; activer la facturation.

Délai

Le temps d &apos; attente avant que l &apos. IA ne réponde (en secondes). Par défaut : 120 secondes (2Régler sur0pour des réponses instantanées.

Planification du délai

Définir éventuellement des délais différents pour les heures ouvrables et après les heures.

Arrêter sur la réponse de l &apos; administrateur

Si un agent humain répond en premier, annuler la réponse automatique. Par défaut : activé.

Escalade activée

Activer le routage automatique du département en fonction de l &apos; intention des tickets.

Départements d &apos; escalade

Quels départements les tickets peuvent être transmis.

Escalation

Quel statut définir lors de l &apos; escalade (par exemple, Ouvert, En attente).

Note d &apos; escalade

Indique s &apos; il faut ajouter une note interne expliquant la raison de l &apos.

Tickets créés par e-mail

Les tickets créés à partir d &apos; un courrier électronique (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 &quot; &quot. La réponse AI est envoyée sous forme de courriel au client. Les brouillons sont placés dans la file des brouillon pour examen si cela est configuré.

L &apos; IA répondra-t-elle automatiquement aux questions de facturation?+

Nous vous recommandons de désactiver la réponse automatique pour la facturation et de l &apos; activer uniquement après avoir formé l &quot; &quot. IA &quot, avec des connaissances approfondies en matière de facturation, et effectué des tests minutieux.

Et si l &apos; IA donne une mauvaise réponse?+

Si un client répond en disant que la réponse était fausse, un agent humain devrait intervenir. Revoir l &apos; historique de l &quot; &quot,IA pour comprendre pourquoi l &amp; ;IA a donné la mauvaise réponse, puis mettre à jour la base de connaissances ou la formation de l&apos; IA pour éviter qu &apos); il se reproduise.

Puis-je vérifier les réponses automatiques avant qu &apos; elles ne soient envoyées?+

Oui. Définissez le mode de livraison 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.

Soutien

Intégrer le 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égrer le portail des billetsUn portail de support intégré à un site web montrant au client ses propres tickets et un bouton pour créer un nouveau ticket.yoursite.com/supportCentre d &apos; assistanceNouveau ticketVOS BILLETS#1042 · Question de remboursementOuvert#1038 · Aide à la configurationRésolu#1031 · Copie de la factureEn attente1EMBEDAjouter à n &apos; importe quel site2SELF-SERVELes clients voient leurs billets.3NO LOGINIdentité gérée en toute sécurité
Intégrer le portail des billets

Trois saveurs intégrées

Intégration en ligne

Affiche le portail de ticket dans un div sur votre page. Le portail prend la largeur complète de son conteneur.

Widget flottant

Affiche un bouton flottant qui ouvre le portail de tickets dans un panneau. Similaire à un widget de clavardage.

Authentifié

Nécessite un jeton d &apos; 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 &apos; 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 });
}

Fonctionnalités du widget

Liste des billets

Une liste filtrée par statut et interrogeable. Un « En attente » met en surbrillance les tickets auxquels l &apos; équipe a répondu.

Conversation en fil

Vue complète de la conversation avec texte enrichi, pièces jointes et horodatages.

Brouillon d &apos; enregistrement automatique

Les brouillons de réponse du client sont automatiquement enregistrés afin qu &apos; il ne perde pas son travail s &apos.

Sondage en direct

Le widget recherche 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 &apos; insertion de ticket. Il s &apos, y a une limite stricte de sécurité.
Soutien

Boîte de réception du chat

La boîte de réception du chat est l &apos; endroit où votre équipe gère les conversations en direct avec les clients. Elle affiche les discussions actives, les conversationes assignées, les discussiones gérées par une IA et l &quot; &quot); historique archivé.

Boîte de réception du chat
Boîte de réception du chatUne boîte de réception à trois volets pour le chat avec l &apos; agent : liste des conversations, conversation en direct avec une puce d &apos.. brouillon d &quot; IA et un volet contextuel visiteur/CRM.Boîte de réception du chatespace de travailJD- Oui.Où est ma commande?PaysLe coup de foudrequestion de facturationRTC'est vrai.L &apos; IA s &apos,Où est ma commande ?Expédié aujourd'hui · UPSBrouillons prêts pour l &apos; IARépondre…VISITEURJane Doe.FR · Chrome3 commandes passéesLTV $480CRMÉtape : Client1UNIFIEDChaque chat en direct2CONTEXTPanneau Visiteur + CRM3AI ASSISTBrouillon et 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.

Gérer les conversations

Conversations actives

Conversations en cours. Point vert = le client est en train de taper ou a été récemment actif.

Géré par l &apos; IA.

Conversations auxquelles l &apos; IA répond. Vous pouvez prendre la relève à tout moment en cliquant sur « Rejoindre ».

M &apos; a été assignée

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.

Transmission de l &apos; IA à l &quot; &quot.

Lorsque vous prenez le relais d &apos; une conversation de l &apos, IA, suivez ces trois règles :

1
Saluter personnellement

Présentez-vous par votre nom. « Salut, je suis Sarah de l &apos; équipe d &apos); assistance. »

2
Contexte de référence

Montrez que vous avez lu la conversation. « Je vois que vous m &apos; avez demandé le statut de votre commande. »

3
Définir les attentes

Dites au client ce qui se passe ensuite : « Je suis en train d &apos; examiner cette question et j &apos, ai une réponse pour vous dans quelques minutes. »

Activer/désactiver l &apos; IA par conversation

Utilisez le bouton AI en haut de chaque conversation. Lorsque l &apos; IA est activée, elle génère des réponses. Lorsqu &apos); est désactivée, seuls les agents humains peuvent répondre. L &apos.

Mode absent / hors heures

Configurez les heures d &apos; ouverture dans Paramètres. En dehors des horaires, l &apos);1) Continuer à répondre aux clients, (2) Afficher un message « absent » et créer un ticket pour suivi, ou (3) Désactiver complètement le chat et afficher le formulaire de ticket. Choisissez le comportement qui correspond à votre modèle d &apos; 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
Escalade précoce

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 &apos; équipe plutôt que d &apos.

Puis-je avoir un chat d &apos; équipe (agent à agent)?+

Oui. Utilisez des notes internes dans une conversation pour communiquer avec d &apos; autres agents. Ces notes ne sont jamais visibles par le client.

Que se passe-t-il lorsque je ferme une conversation?+

La conversation est déplacée vers l &apos; archive. Si le client envoie un nouveau message plus tard, une nouvelle conversation est créée.

Soutien

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

Messagerie Facebook &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 Messagage 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 l'une des passerelles 20.

Télégramme

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

Ajoutez 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.

Messagerie & 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.

Télégramme, 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.

Soutien

De vraies conversations de clavardage.

Ces exemples montrent comment une IA client bien entraînée devrait gérer des scénarios courants. Utilisez-les pour tester votre formation en IA et identifier les lacunes.

10 exemples de conversation

1. Client de retour s &apos; interrogeant sur sa commande

Scénario :
Client : Bonjour, j ' ai passé une commande.3J ' ai passé commande il y a 3 jours et je n '..5523.
Que faire :

L &apos; IA devrait :1) Recherchez l &apos; ordre #ORD-5523 par le connecteur. (2) Signaler le statut actuel et les informations de suivi si disponibles. (3) Si l &apos; ordre est retardé, reconnaissez le retard et donnez une estimation du délai. (4) N &apos; inventez PAS un statut d &apos, expédition si le connecteur n &apos.

2. Demande de prospect sur les prix

Scénario :
Client : Combien coûte votre forfait Pro? Proposez-vous une facturation annuelle?
Que faire :

L &apos; IA devrait :1) Répondre à partir de la base de connaissances avec les prix actuels. (2) Expliquez la différence entre facturation mensuelle et annuelle. (3Si la réponse n &apos; est pas dans la base de connaissances, dites-le et proposez de les mettre en relation avec des vendeurs.4) N &apos; inventez pas de prix qui ne figurent pas dans la base de données.

3. Client en colère exigeant un remboursement

Scénario :
Client : C &apos; est ridicule! Votre produit ne fonctionne pas et je veux que mon argent me soit remboursé 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 &apos; ai été débité deux fois ce mois-ci. Ma banque affiche deux frais de $29.99.
Que faire :

L &apos; IA devrait :1) Reconnaître l &apos; inquiétude. (2) Recueillir les détails pertinents (email, dates des accusations).3Expliquez que les problèmes de facturation nécessitent une révision humaine. (4) Créer un ticket de service de facturation avec les détails. (5) Définir la priorité sur Haute.

5. Client multilingue

Scénario :
Client: Bonjour, je voudrais savoir si vous livrez en France?
Que faire :

L ' IA devrait :1) Répondre dans la langue du client si cette langue est supportée. (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épondre dans la langue par défaut et mentionner les langues disponibles.

6. Conversation après les heures de travail

Scénario :
Client : Bonjour, y a-t-il quelqu &apos; un là-bas? J &apos. ai besoin d &apos, aide pour mon compte.
Que faire :

L &apos; IA devrait :1) Si configuré pour l &apos; IA après les heures de travail, 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 &apos; ai créé un ticket pour vous et une personne fera le suivi pendant les heures ouvrables. » (3) Indiquez le numéro du ticket.

7. Acheteur comparatif avant achat

Scénario :
Client : Comment votre produit se compare-t-il à celui de [concurrent X]?
Que faire :

L ' IA devrait :1) Décrivez les points forts de votre produit factuellement. (2) Ne calomniez pas le concurrent. (3) S ' il y a une page de comparaison dans la base de données, 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 &apos; exploite une petite boutique en ligne avec environ 100 commandes par mois. Quel est le meilleur plan pour moi?
Que faire :

L &apos; IA devrait :1) Posez des questions de clarification si nécessaire (par exemple, quelles sont les caractéristiques les plus importantes).2Recommander un plan basé sur la base de connaissances.3) Expliquez pourquoi ce plan répond à leurs besoins. (4) Mentionnez qu &apos; ils peuvent commencer avec un forfait plus petit et le mettre à niveau ultérieurement.

9. Client essayant d &apos; obtenir une remise non autorisée

Scénario :
Client : J &apos; ai vu en ligne que vous accordiez des remises pour les 50%.
Que faire :

L &apos; IA devrait :1) Expliquez poliment les promotions en cours s &apos; il y en a. (2) NE PAS créer ou promettre des réductions qui ne sont pas dans la base de connaissances. (3) Si le client persiste, proposez de le mettre en relation avec l &apos; équipe commerciale.

10. Le client a besoin d &apos; aide pour une fonctionnalité

Scénario :
Client : Comment puis-je exporter mes données? Je ne trouve pas le bouton d ' exportation.
Que faire :

L &apos; IA devrait :1) Fournir des instructions étape par étape à partir de la base de connaissances. (2) Inclure le chemin exact de la page et l &apos; emplacement du bouton. (3) Si la fonctionnalité nécessite un plan particulier, mentionnez-le. (4) Si la fonctionnalité n &apos; existe pas, soyez honnête et suggérez des alternatives.

Soutien

Routage et escalade des conversations

Lorsqu &apos; un chat en direct nécessite une personne réelle, l &apos. I. 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 &apos, sous les départements de routage de l &quot; &quot.

Choisir les départements que l &apos; 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 que l &apos; IA peut acheminer ou dans lesquels elle peut ouvrir des tickets. Tout ce qui est laissé sur la gauche lui est invisible, même si le département existe et qu &apos); il a du personnel. Commencez par affiner et ajoutez des département à mesure que vous leur donnez du personnel

💡
Si aucun département n &apos; est activé, OpsIQ revient au routage hérité dans tous les départements qu &apos. Il s &apos, y a lieu de considérer cela comme un filet de sécurité et non pas comme une option de configuration.

Qui reçoit l &apos; escalade

C &apos; est la partie que la plupart des gens s &apos.. attend de configurer et n &apos, ont pas besoin de le faire. Lorsque l &apos: IA fait passer un chat en escalade, OpsIQ envoie un courrier électronique aux personnes attachées à ce service. Vous gérez cette liste une fois, sur la page Équipe et services, et les deux escales de ticket et de chat suivent.

Membres de l &apos; é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 &apos; équipe n &apos, est attaché, donc une escalade atteint toujours quelqu &apos.

Personne n &apos; est attaché.

La livraison n &apos; est pas possible. Le panneau de routage marque ce service en rouge et l &apos, IA ne dit pas au visiteur qu &apos: un humain a été notifié.

⚠️
L &apos; adresse électronique d &apos, un département n &apos. est délibérément jamais utilisée comme destinataire. Cette adresse est la boîte aux lettres des tickets entrants du département, celle avec laquelle les messages entrants sont comparés pour ouvrir des tickets. Une escalade envoyée à cette adresse serait redirigée en tant que nouveau ticket plutôt qu &apos:

Le département de la prise en charge globale.

Un seul département est le plus efficace : il reçoit les conversations que l &apos; IA ne peut pas classer avec certitude et c &apos, est un dernier recours plutôt qu &apos.

1
Des signaux clairs gagnent.

Les formulations de facturation vont au département de la facturation, les formulations d &apos; hébergement et d &quot; &quot. erreurs à un service technique, et les formulation d &amp; achat aux ventes.

2
Le classificateur 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 &apos; est que lorsque les deux sont vides que le service de capture reçoit la conversation.

4
Le vendeur

Si le catch-all est un service de vente et que le visiteur n &apos; a pas montré de signe d &apos, OpsIQ cherche à la place un service technique ou de support, afin que les questions ordinaires ne s &apos.

Ce que l &apos; on dit au visiteur

Si le courriel d &apos; escalade est envoyé, l &apos. IA dit au visiteur que l &quot; &quot); équipe a été notifiée. &quot. S &apos: il ne peut pas être envoyé, l ; IA dit quelque chose de honnête et les invite à laisser le message dans la conversation à la place. Il ne prétendra pas qu &apos, un humain a été alerté quand aucun courriel n &apos? a été envoyé.

Le panneau indique « Personne à avertir » pour un département+

Personne n &apos; y est associé. Ouvrez Équipe et départements, associez au moins un administrateur actif, puis rechargez la page des paramètres. Le panneau affiche les données en direct.

Les escalades de chat peuvent-elles aller ailleurs que dans l &apos; équipe?+

Oui. Une adresse personnalisée précédemment enregistrée pour un département remplace toujours la liste d &apos; équipes. Les nouvelles configurations devraient associer les personnes au département à la place, de sorte qu &apos); il y a un seul endroit à maintenir.

Pourquoi mon énoncé a-t-il été omis?+

Vérifiez s &apos; il s &quot; &apos. agit d &apos, un service commercial. Si c &apos: est le cas et que le visiteur n &apos); a montré aucun signe d &quot, OpsIQ achemine délibérément l &apos? utilisateur vers un service technique ou de support.

Soutien

Boîtes aux lettres et brouillons

OpsIQ peut se connecter aux boîtes mail pour créer automatiquement des tickets à partir de courrier entrant et envoyer les réponses par courriel. Il fournit également des réponses rédigées par IA pour examen humain.

E-mail
Envoyer un courriel au ticketUne boîte aux lettres IMAP sur la gauche alimentant les e-mails entrants dans un ticket avec une réponse rédigée par l &apos; IA à droite.E-mailespace de travail[email protected] · IMAPDemande de remboursement[email protected]Impossible de se connecter[email protected]Copie de facture[email protected]Billet #1042par courrier électronique · FacturationJe voudrais un remboursement pour lecharge en double…Brouillon AIRéviser et envoyer une réponse1INGESTIMAP & transfert dans2TO TICKETSFilé automatiquement3AI DRAFTSRéponses pour examen
Recevez des e-mails via IMAP (ou en les transférant), transformez chacun d &apos; eux en ticket et laissez l &apos. IA rédiger une réponse pour examen.

Connecter une boîte aux lettres

Protocole

IMAP (la plupart des fournisseurs), Gmail API (Google Workspace), ou Microsoft Graph (Outlook ) 365).

Paramètres requis

Hôte, port, chiffrement (SSL/TLS), nom d &apos; utilisateur, mot de passe ou mot de passer d &quot; &quot. application, dossier (généralement INBOX).

Mapping de département

Mapper la boîte aux lettres à un service de tickets. Les courriels envoyés à [email protected] créent des tickets dans le service « Support ».

Configuration de Gmail (étape par étape)

1
Activer la vérification 2-Step

Allez dans Compte Google > Sécurité > Vérification en 2étapes et activez-la.

2
Créer un mot de passe d &apos; 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 OpsIQ

Allez dans E-mail > Boîtes aux lettres > Ajouter. Définir l &apos; hôte : imap.gmail.com, port: 993, chiffrement: SSL, nom d &apos; utilisateur: [email protected], password: le mot de passe d &apos; application.

4
Essai

Cliquez sur Tester la connexion. Si cela réussit, OpsIQ commencera à rechercher de nouveaux courriels à l &apos; intervalle configuré.

Configuration d &apos; Outlook 365

1
Vérifiez que IMAP est activé

Dans les paramètres d &apos; Outlook > Courrier > Synchroniser le courrier, assurez-vous que IMAP est activé.

2
Utiliser le mot de passe d &apos; application ou l &apos, authentification moderne

Si MFA est activé, créez un mot de passe d &apos; application. Sinon, utilisez votre mot de passer habituel.

3
Entrez OpsIQ

Hôte : outlook.office365.com, port: 993, chiffrement : SSL, nom d'utilisateur: [email protected].

Configuration du webmail cPanel

1
Trouver les paramètres IMAP

En cPanel > Comptes de messagerie, cliquez sur votre compte de courrier électronique pour IMAP paramètres.

2
Entrez OpsIQ

Hébergeur: usually mail.yourdomain.com ou votre nom d &apos; hôte du serveur, port: 993 (SSL) ou 143 (STARTTLS), nom d &apos; utilisateur : adresse électronique complète.

Brouillons de courriels d &apos; IA

Lorsque la réponse automatique est réglée sur le mode « Brouillon », l &apos; IA génère des brouillons de réponse qui apparaissent dans la file d &apos.

Révision

Lisez le brouillon et vérifiez l &apos; exactitude.

Éditer

Modifier le texte, la tonalité ou le contenu avant d &apos; envoyer.

Envoyer

Approuver le brouillon et l &apos; envoyer en réponse à un courrier électronique.

Ignorer

Supprimer le brouillon s &apos; il n &apos.

Envoyer automatiquement

Si la confiance est suffisamment élevée et que l &apos; envoi automatique est activé, les brouillons sont envoyés automatiquement après un délai configurable.

Pourquoi les courriels ne sont-ils pas convertis en tickets?+

Vérifiez : (1) La boîte aux lettres est-elle connectée et en bon état? Recherchez le statut vert dans E-mail > Boîtes aux Lettres. (2) Est-ce que le travail cron est en cours d &apos; exécution? Le sondage par courrier électronique nécessite cron. (3) Le courrier électronique est-il filtré ou déplacé vers un dossier autre que la boîte de réception?

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 à l &apos; appui, [email protected] va à la facturation.

Soutien

Satisfaction de la clientèle (CSAT)

CSAT mesure la satisfaction des tickets et du chat, fait ressortir les réponses mécontentes et compare l &apos; IA aux résultats humains.

Ecran du produit
Satisfaction du clientLa page CSAT combine des fiches de score, le suivi des détracteurs, les commentaires, la répartition entre département et agent, et les retours sur chat.Satisfaction du clientespace de travailRÉPONSES386AVERAGE4.6POSITIVE91%VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTSuivi des détracteurs12 réponses évaluées.1–2RévisionEnquêtes sur les billetsEnvoyé 24h après la fermetureAutomatiqueCommentaires sur le chatAI 4.5 Humain 4.7ComparerVue de l &apos; agentNote et nombre de réponsesEntraîneur1WATCH AVERAGEUtiliser la tendance, pas un score2FOLLOW DETRACTORSLire le commentaire3COMPARE FAIRLYL &apos; IA et l &apos, homme
La page CSAT combine des fiches de score, le suivi des détracteurs, les commentaires, la répartition entre département et agent, et les retours sur chat.

Les enquêtes sur les billets sont programmées après la fermeture (normalement : 24 Une réponse positive correspond à un score de 10 points.4ou 5. Utilisez la file d &apos; attente des détracteurs pour les scores de1ou2et lisez le ticket/conversation avant de contacter le client.

Les commentaires sur les conversations sont rapportés séparément pour les conversation résolues par l &apos; IA et celles gérées par des humains.

Soutien

Diffusion de courriels d &apos; équipe

La page de la plateforme d &apos; envoi d &quot; Email Platform &quot, permet à un opérateur autorisé d &amp; rsquo; envoyer un message unique à tous les agents actifs, aux agents sélectionnés ou à un service et de consulter l &apos.

Ecran du produit
Plateforme de courrier électroniqueLe compositeur de courriel d &apos; équipe affiche le public, l &apos. objet, le message et l &quot; &quot. historique des livraisons passées.Plateforme de courrier électroniqueespace de travailDestinataires12DELIVERED11ÉCHEC1VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTAuditoireTous les agents actifsSélectionnéSujetRota de soutien de juilletPrêtMessageNotes de planification et d &apos; escaladePrêtHistoriqueDiffusions précédentes et résultatVoir1CHOOSE PEOPLETout, sélectionné ou équipe2WRITE CLEARLYSujet et message3REVIEW HISTORYConfirmer le résultat
Le compositeur de courriel d &apos; équipe affiche le public, l &apos. objet, le message et l &quot; &quot. historique des livraisons passées.

Cette page est destinée aux messages opérationnels internes, pas au marketing client. Choisissez le plus petit public correct, prévisualisez les noms et adresses, puis envoyez. La livraison utilise le chemin de courrier sortant configuré et enregistre le résultat.

Soutien

Boîtes aux lettres, livraison et courrier entrant

Configurez comment OpsIQ envoie les courriels, transforme les messages entrants en tickets et prouve que le domaine d &apos; envoi est prêt.

Ecran du produit
Paramètres de courrier électroniqueLes paramètres de messagerie combinent le routage sortant, l &apos; identité du destinataire, la saisie des boîtes aux lettres, les vérifications de délivrabilité et les messages test.Paramètres de courrier électroniqueespace de travailSORTANTSMTPMAILBOXES3DOMAINEPasserVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTConnecteur préféréSMTP / connecteur fournisseurConfiguréDe l &apos; identitéSupport <[email protected]>PrêtBoîte aux lettres IMAP[email protected] · BOÎTE A RECEVOIRSondageLivrabilitéFPS · DKIM · DMARCPasser1CHOOSE OUTBOUNDConnecteur ou SMTP2CONNECT INBOXIMAP ou pipe3ESSAIEnvoyer et vérifier
Les paramètres de messagerie combinent le routage sortant, l &apos; identité du destinataire, la saisie des boîtes aux lettres, les vérifications de délivrabilité et les messages test.

Courrier sortant

Les administrateurs complets peuvent choisir le connecteur de messagerie préféré ; OpsIQ revient à la configuration. SMTP/mail delivery when appropriate. Set a recognizable From name/address, send a test and check the 24-métriques de succès/échec horaires.

Boîtes aux lettres

Une boîte aux lettres IMAP a besoin d &apos; un nom, une adresse électronique, le service cible, l &apos. hôte, port, mode de sécurité, nom d &quot; &quot); utilisateur, mot de passe, dossier, état de sondage et choix de validation du certificat. Utiliser Sondage maintenant pour vérifier l &apos; ingestion avant d &apos. attendre le cron.

Pipeline instantanée

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 d &apos; arrivée protégé en utilisant son jeton. Les deux chemins entrent dans le même pipeline pour la déduplication, les threads et l &apos); &apos.

Livrabilité

La vérification SPF/DKIM/DMARC est une preuve consultative pour le domaine De configuré. Une coche verte ne garantit pas l &apos; placement dans la boîte de réception, mais un échec doit être corrigé avant d &apos); envoyer des messages en production.

Soutien

Studio du portail de support

Support Portal Studio conçoit et publie l &apos; expérience d &apos, assistance clientèle sans avoir besoin de ressources image externes.

Ecran du produit
Studio du portail de supportPortal Studio affiche un aperçu réactif avec les contrôles thème, navigation, connaissances, ticket, assistant, formulaire, pied de page et CSS.Studio du portail de supportespace de travailTEMPLATEModerneAPERÇUBureauETATBrouillonVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTThèmeCouleurs et typographie de marqueÉditerNavigationConnaissances, billets, assistantÉditerFormulaire de ticketChamps, routage et copieÉditerPublierValider et mettre en ligneRévision1CHOOSE TEMPLATECommencer par la structure2PREVIEW SIZESDu bureau 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 &apos; assistant, le pied de page, l ’ image de marque, le comportement du ticket et les paramètres personnalisés. CSS Prévisualisez votre bureau, tablette et mobile avant de publier.

Soutien

Les lacunes de connaissances

La file d &apos; attente des lacunes de connaissance recueille les questions auxquelles l &apos, IA ne pouvait pas répondre avec confiance afin que l &quot; &quot.

Ecran du produit
Les lacunes de connaissancesLa file d &apos; attente des écarts classe les questions manquées ou à faible confiance et suit si l &apos. équipe les a résolues.Les lacunes de connaissancesespace de travailOPEN GAPS28REPEATED9RESOLVED116VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTLimites de migrationDemandé 14 foisÉlevéSoutien du week-endDemandé 8 foisMoyenTemps de remboursementDemandé 6 foisMoyenAPI régionDemandé 3 foisBas1REVIEW QUESTIONVoir le contexte de la conversation2CHOOSE FIXArticle ou incitation3RESOLVEVérifier la réponse suivante
La file d &apos; attente des écarts classe les questions manquées ou à faible confiance et suit si l &apos. équipe les a résolues.

Ouvrez un espace pour lire la question originale et la conversation à proximité, puis choisissez le bon correctif : mettre à jour un article existant, créer un nouvel article de connaissances, ajouter une information commerciale, corriger les données du connecteur ou modifier les instructions d &apos; escalade. Marquez-le comme résolu seulement après qu &apos); une évaluation ou un test réel renvoie une réponse acceptable.

Soutien

Administration de la page d &apos; état

La page d &apos; administration de l &apos. état communique les incidents et la santé du service en utilisant des composants, des états actuels et des mises à jour.

Ecran du produit
Administration du statutL &apos; administration de l &apos, état liste 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 &apos; ESPACE DE TRAVAIL EN DIRECTSite webOpérationnelVertAPIPerformances dégradéesRegarderIngestion de courrielsOpérationnelVertIncident actuelAPI enquête de latenceOuvert1UPDATE COMPONENTChoisir un état effacé2POST INCIDENTMises à jour horodatées3RESOLVEFermer avec le résumé
L &apos; administration de l &apos, état liste les composants et les incidents afin que les opérateurs puissent publier des informations claires sur le service horodaté.

Utilisez les états des composants de manière cohérente. Lorsqu &apos; un incident affecte les clients, publiez une notification initiale, ajoutez des mises à jour horodatées au fur et à mesure que les faits changent, et fermez avec un résumé concis de la résolution. N &apos); utilisez pas la page statut comme journal de débogage interne; les diagnostics sensibles appartiennent aux journaux du serveur et de OpsIQ.

IA

Configurez votre IA.

La configuration de l &apos; intelligence artificielle consiste à choisir le fournisseur, le modèle et les contrôles des coûts. OpsIQ supporte plusieurs fournisseurs: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), et Grok (xAI). Vous pouvez utiliser votre propre API clé (BYOK) ou l &apos; IA gérée si elle est disponible dans votre forfait.

Mettre en place l &apos; IA
Configuration de l'IAUn panneau de paramètres d &apos; IA : un basculeur Managed-AI / BYOK provider, un sélecteur de modèles et un compteur mensuel du budget des jetons.Configuration de l'IAespace de travailConfiguration de l'IAFournisseurAI géréVotre clé (BYOK)Modèleclaude · équilibréBudget mensuel de l &apos; IA62%1TWO MODESIA gérée ou BYOK2PICK A MODELVitesse contre profondeur3BUDGETSLimites de jetons et contrôle des coûts
Choisissez l &apos; IA gérée ou votre propre clé, choisissez un modèle pour la vitesse par rapport à la profondeur et limitez les dépenses mensuelles avec un budget symbolique.

Choisir un fournisseur

(Anthropic_)

Raisonnable, prudent avec les faits, bon à suivre des instructions complexes. Modèles : claude-sonnet-4-20250514, claude-3.5-sonnet. Idéal pour : les conversations d &apos; assistance, les questions techniques, l &apos); 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 pour les questions factuelles, support multilingue. Modèles:gemini-2.0-flash,gemini-1.5-pro. Idéal pour : support multilingue, recherches factuelles.

Jaune (xAI)

Réponse rapide et concise. 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 fournissez votre propre clé API auprès du fournisseur. Vous payez le fournisseur directement. Contrôle total sur la sélection et l &apos; utilisation des modèles.

AI géré

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 de l &apos; IA

Dans l &apos; administration de OpsIQ, accédez à Paramètres > Configuration d &apos.

2
Sélectionner un fournisseur

Choisissez votre fournisseur d &apos; IA dans la liste déroulante.

3
Entrez la clé API

Si vous utilisez BYOK, entrez votre API clé. Pour l &apos; IA gérée, cela est géré automatiquement.

4
Choisir un modèle

Sélectionnez le modèle spécifique à utiliser. Les plus petits modèles sont plus rapides et moins chers. Les modèles plus grands donnent des réponses de meilleure qualité.

5
Test de connexion

Cliquez sur « Test de connexion » pour vérifier que la clé et le modèle API fonctionnent. Une coche verte signifie un succès.

6
Enregistrer

Cliquez sur Enregistrer pour activer votre configuration d &apos; IA.

Contrôle des coûts

Budget mensuel

Définir un montant mensuel maximum pour les jetons d &apos; IA. Lorsque le budget est atteint, l &apos); &apos. ; IA dégrade gracieusement (réponses plus courtes, pas de réponse automatique) plutôt que de s &apos:

Limite de token par conversation

Nombre maximum de jetons par conversation. Empêche les conversations débordantes d &apos; utiliser trop de crédits.

Alerte de solde faible

Lorsque votre solde de crédits IA tombe en dessous du seuil (par défaut: 50,000 jetons), un avertissement apparaît dans l &apos; administration. Définissez-le dans la configuration IA.

Configuration par espace de travail

La configuration de l &apos; IA est par espace de travail. Si vous gérez plusieurs sites, chaque espace de travaux peut utiliser un fournisseur, un modèle et un budget différents. L &apos: espace de Travail hérite des valeurs globales par défaut à moins qu &apos); il soit remplacé. Pour configurer par espace: basculez vers l &quot; &quot, puis allez dans Configuration de l&apos; AI et enregistrez les paramètres là-bas.

Obtenir les clés API

Anthropic (Claude)

Aller à console.anthropic.com > API Touches > Créer une clé. Copiez la clé commençant par « sk-ant- ».

OpenAI (GPT)

Aller à platform.openai.com > API Touches > Créer une nouvelle clé secrète. Copiez la clé commençant par « sk- ».

Google (Gemini)

Aller à aistudio.google.com Obtenir API Clé. Créez une clé pour votre projet. Copiez la clé.

xAI (Grec)

Aller à console.x.ai > API Clés. Créez et copiez votre clé.

Tester votre configuration d &apos; IA

Scénario :
Après avoir entré votre clé API, cliquez sur « Test de connexion ». Vous devriez voir une coche verte et un exemple de réponse de l &apos; IA.
Que faire :

Si le test échoue : (1) Vérifiez que le API la clé est correcte (pas d &apos; espaces supplémentaires).2) Vérifiez que votre compte est bien facturé par le 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 est le meilleur fournisseur?+

Il n &apos; existe pas de meilleur fournisseur. Claude est excellent pour les conversations d &apos, 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 &quot; &quot.

Puis-je changer de fournisseur plus tard?+

Oui. Changez le fournisseur et la clé API à tout moment. L &apos; historique des conversations existantes est conservé. L ’ IA utilisera le nouveau fournisseur pour toutes les futures conversations.

Que se passe-t-il quand je suis à court de crédits?+

L'IA se dégrade gracieusement : les réponses deviennent plus courtes, les pauses de réponse automatique, et l'administrateur affiche un avertissement à faible solde.CRM continuer à travailler 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 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 agent

Jusqu ' à quelques recherches en lecture seule par tour, croisées avant de répondre. Activer lorsque vous avez une plate-forme connectée (WHMCS, Shopify, Stripe, Zendesk, etc.). Désactivé = comportement de recherche unique actuel, inchangé.

La profondeur de réflexion pour les réponses des agents

La difficulté du modèle à raisonner sur des virages complexes (faible/moyen/élevé). Commencez par Faible ; la plupart des questions de support sont bien traitées là.

Modèle d &apos; agent

Utilise un modèle plus puissant pour les tours complexes de l &apos; agent, afin que le chat quotidien reste sur un modèle léger et bon marché et que seuls les toures difficiles paient pour la profondeur. Vide = votre modèle normal de chat client.

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 et 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 &apos; assistant reste cohérent sur les très longues conversations sans renvoyer la transcription entière. Idéal pour les longs fils d &apos); association avec le mode Agent.

Tolérance à la typo

Lit les petites fautes de frappe (« mes tickets ouverts », « factures non payées ») comme des mots réels afin que l &apos; information appropriée soit trouvée au lieu d &apos. être manquée. Fonctionne avec toutes les plateformes connectées. Désactivé par défaut ; utile pour le chat sur mobile.

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.

Économies 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 (jetons)

Limite la durée d &apos; une réponse unique. La longueur de la réponse est la partie la plus coûteuse d &quot; &quot, donc un plafond raisonnable (environ 500 pour le support) est le contrôle des coûts du chat le plus efficace. Il ne fait que réduire votre limite globale et ne l &apos, augmente jamais.

Sur Configurez votre IA

Réflexion approfondie (client et administrateur)

Combien de temps le modèle réfléchit avant de répondre (minimum à élevé). Gardez la conversation client sur minimal/bas pour plus de vitesse; réservez des paramètres supérieurs pour l &apos; 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ôle des coûts de chat d &apos; 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.

Sur l &apos; entraînement de votre IA

Instructions de compression

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 avez répété 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 la conversation exactement comme elle fonctionnait avant.

Dans quel ordre devrais-je les allumer?+

Exécutez le chat quotidien sur un modèle léger et épinglez un modèle d &apos; agent plus puissant. Ensuite, si vous avez une plate-forme connectée, activez le mode Agent, puis Planifiez à l &apos); avant, puis la mémoire de longue conversation. Puis réduisez le contexte, ignorez les KB pour les salutations et ajoutez une majuscule dans la réponse. Pour finir, compressez vos instructions. Regardez quelques vraies discussions après chaque changement.

Le kit Admin Agent: recherche sur le web, runbooks, missions, transfert de fichiers

Le chat de l &apos; IA d &apos, administrateur est un ingénieur en activité, pas seulement une boîte à questions. Il peut rechercher des correctifs sur le Web, garder une bibliothèque de vos procédures d &quot; &quot, 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 &quot: abord est le fournisseur de recherche web qu &apos. il utilise, sur la page Configurer votre IA.

Recherche sur le Web

Intégré

L &apos; agent recherche sur le Web des documents, des messages d &apos. erreurs et les informations actuelles pendant qu &apos, il fonctionne. Il utilise DuckDuckGo dès sa sortie de la boîte, ce qui ne nécessite ni clé ni configuration.

Livres d'exécution

Dans le chat

Une bibliothèque enregistrée de vos procédures (« comment faire X ici »). L &apos; agent en écrit une après avoir réussi un travail difficile et la suit 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 &apos; espace disque et les journaux d &apos); erreurs et faites-le moi savoir. » Les résultats arrivent sur votre cloche d &quot; &quot.

Transfert de fichiers

Dans le chat

Demander un fichier journal et obtenir un lien de téléchargement privé, ou faire copier un fichier d &apos; un serveur connecté à un autre. Les deux sont limités à 5 MB.

Recherche web de l &apos; agent d &apos. administration (sur Configurer votre IA)

Fournisseur de recherche

Ce que l &apos; agent de recherche sur le Web utilise. Par défaut, c ’est DuckDuckGo: sans clé, gratuit, fonctionne avec toutes les installations. Brave Search, Tavily et Serper.dev (Résultats Google) donnent généralement de meilleurs résultats mais chacun a besoin d &apos; un. API Si un fournisseur de clé échoue pour une raison quelconque (mauvaises clés, quota utilisé, problèmes réseau), cette recherche revient automatiquement à DuckDuckGo, donc la recherche n &apos; 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 &apos; affiche plus sur la page; collez-en une nouvelle pour la remplacer. Un fournisseur avec clé n &apos); est actif que lorsque le fournisseur et sa clé sont sauvegardés.

Livres d'exécution

Lorsque l &apos; 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. Vous pouvez lui demander de lister, mettre à jour ou supprimer des runbooks à tout moment.

💡
Un runbook est un guide, pas une passe libre. Lorsque l &apos; agent en suit un, chaque étape qui modifierait un serveur passe toujours par votre mode d &apos); autorisation actuel et affiche les cartes d &quot; &quot: approbation habituelles. Un runbooks ne peut jamais contourner une approbations.

Missions

Une mission est une tâche récurrente que l &apos; agent exécute seul : toutes les heures, tous les jours à une heure donnée 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 apparaissent sous forme de notification sur votre sonnette d &apos); &apos. Dites « lancez la patrouille du matin maintenant » pour déclencher une mission à la demande, ou demandez à l &quot; &quot.

⚠️
Les missions s &apos; exécutent à partir du cron OpsIQ, il faut donc le paramétrer (voir Cron et automatisation). Un « run it now » unique depuis la messagerie fonctionne même entre les exékutions de cron sur la plupart des serveurs.

Déplacer des fichiers

Demandez un fichier (« get me today ' s error log from the web server ») et l '. agent le met en attente et 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 d '); a l " ". agent de le compresser ou de le couper sur le serveur au préalable.

L &apos; agent peut également copier un seul fichier entre deux serveurs connectés, toujours jusqu &apos. 5 MB. L &quot; &quot); &apos: &quot. l &apos, &quot,. L écriture sur la destination est traitée comme toute autre modification qu &apos? il effectue : en mode demande, vous obtenez d &apos; abord une carte d &quot: &apos); &quot? approbation, le fichier existant est sauvegardé et la copie est réversible. Pour des raisons de sécurité, le contenu du fichier est relu à partir de la source au moment où la copie s &apos؛ applique, pas prise du chat.

IA

Entraînez votre IA

L &apos; entraînement de l &apos... est le moment où vous apprenez à OpsIQ comment se comporter. Vous écrivez des instructions qui définissent la personnalité, les limites, le centre de connaissance et les règles d &apos: escalade. Pensez-y comme si vous écriviez un manuel de formation pour un nouvel agent du service clientèle.

Entraîner l &apos; IA
Entraînez votre IAUn éditeur d &apos; instructions IA avec des onglets Client/Administrateur et un ton clair en anglais, toujours et jamais de règles.Entraînez votre IAespace de travailL &apos; IA du clientAdministrateur IATonAmical, concis, jamais intrusif.ToujoursOffrir un intermédiaire humain pour les litiges de facturation.JamaisPromettre un remboursement sans vérifier le compte.1TWO MANUALSIA client et administrateur2PLAIN 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 de formation

Demande de l &apos; 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 pour obtenir juste.

Invite de l &apos; IA administrateur

Contrôle la façon dont l &apos; IA assiste votre équipe d &apos. administration dans le tableau de bord opérateur. Ceci gère les requêtes internes et l &quot; &quot, exécution des actions.

Écrire une excellente IA pour le client

Votre message d &apos; IA client devrait couvrir ces domaines:

1
Identité

Qui est l &apos; IA? 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

Comment doit-il communiquer? Exemple : « Soyez professionnel mais chaleureux. Utilisez un langage simple. Évitez le jargon. Gardez les réponses concises (2-3 paragraphes max)."

3
Les frontières de la connaissance

Qu &apos; est-ce qu &apos, il devrait savoir et ne pas savoir? Exemple : « Vous connaissez nos produits, nos prix, notre politique de livraison et de retour. Vous NE connaissez PAS les produits concurrents ou les décisions internes de l &apos. entreprise. »

4
Règles d &apos; escalade

Exemple : « Passer à 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
Des choses que vous ne devriez 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 &apos; existent pas. Ne donner aucun conseil médical, juridique ou financier. »

Exemples d &apos; 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

Affiner votre message au fil du temps

1
Démarrer avec les bases

Commencez par l &apos; identité, le ton et les limites de la tonalité. N &apos); n essayez pas de tout couvrir dès le premier jour.

2
Revue hebdomadaire de l &apos; histoire de l ’ IA

Lisez les conversations où l &apos; IA a donné des réponses erronées ou insuffisantes.

3
Mettre à jour le message

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 &apos; IA ne peut pas répondre à une question, ajoutez la réponse dans la base de connaissances plutôt que d &apos.

⚠️
Gardez votre prompt sous les mots 2,000. Des prompts trop longs peuvent confondre l &apos; IA et augmenter le coût des jetons. Mettez plutôt des informations détaillées dans la base de connaissances.
Quelle est la différence entre l &apos; invite et la base de connaissances?+

L &apos; invite définit la personnalité, les limites et les règles. La base de connaissances fournit des informations factuelles (détails du produit, prix, politiques).

Puis-je avoir des invites différentes pour les différents départements?+

L &apos; invite est par espace de travail. Si vous avez besoin d &apos, une IA différente pour différents départements, utilisez la base de connaissances pour fournir des informations spécifiques au département et mentionnez le contexte du département dans votre invite.

IA

L &apos; histoire de l &apos. I.

L &apos; historique de l &apos, IA montre toutes les conversations que l &quot; &quot. AI a eues avec des clients et des administrateurs. Utilisez-le pour vérifier la performance de l, IA, trouver de mauvaises réponses et identifier les lacunes en matière de formation.

L &apos; histoire de l &apos. I.
L &apos; histoire de l &apos. I.Un journal de l &apos; IA tourne avec des badges de type, la question et la réponse, le temps de réponse et le résultat.L &apos; histoire de l &apos. I.espace de travailChaque tour de l &apos; IA, enregistréchatQ: où est ma commande?A: expédié aujourd'hui, suivi UPS...0.9srépondubilletProjet de réponse pour T-12345Rédaction de l &apos; accusé de réception du remboursement1.4sdraftedadministrateurRésumer les billets de cette semaine12-ligne de résumé retournée2.1sfaitchatQ : annuler mon abonnementremis à un humain.0.7sescalated1EVERY TURNInvite, réponse, action2SEARCHABLEFiltrer et exporter3OWNER-ONLYPiste d &apos; 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 connus, sinon IP et le pays.

Canal

Widget de chat, réponse automatique aux tickets, brouillon d &apos; e-mail ou IA d &quot; &quot.

Messages

Transcription complète de la conversation : messages des clients et réponses d &apos; IA.

Utilisation des jetons

Nombre de jetons consommés par la conversation. Une utilisation élevée des jetons peut indiquer que l &apos; IA donne des réponses trop détaillées ou que la conversation tourne en rond.

Actions prises

Toutes les actions exécutées par l &apos; IA pendant la conversation (recherche d &apos, ordre, création de ticket, etc.).

Évaluation

Si CSAT est activé, l ' évaluation de la satisfaction du client pour cette conversation.

Trouver des problèmes

Recherche par mot-clé

Recherchez des sujets spécifiques pour voir comment l &apos; IA les traite. Exemple: recherchez « remboursement » pour vérifier si l &quot; &quot,IA suit votre politique de remboursements.

Filtrer par note

Afficher uniquement les conversations mal notées pour se concentrer sur les clients insatisfaits.

Filtrer par canal

Afficher uniquement les réponses automatiques aux tickets pour vérifier les réponset automatisées séparément du chat.

Trier par utilisation de jeton

Les conversations à haut niveau peuvent indiquer des problèmes : l &apos; IA vagabonde, tourne en rond ou ne répond pas à la question.

Routine d &apos; audit hebdomadaire

1
Vérifier les conversations mal notées

Qu &apos; est-ce qui n &apos, a pas fonctionné? S &apos. il s &apos: y avait un manque de connaissances, une erreur de ton ou une mauvaise réponse?

2
Vérifier les conversations à haut niveau de sécurité

Ces réponses peuvent indiquer une confusion. L &apos; IA se répétait-elle? A-t-elle échoué à comprendre la question?

3
Mise à jour de la formation

Pour les lacunes de connaissance, ajoutez des articles à la base de connaître. Pour les problèmes de comportement, mettez à jour l &apos; invite d &apos); IA. Pour des réponses erronées récurrentes, ajouter des règles explicites de correction.

Trouver des lacunes dans les connaissances

Scénario :
Vous recherchez dans l &apos; historique de l &quot; &quot,installation &quot. &quot: 15 des conversations où l &lt; &lt,I don &apos,t have specific installation instructions for this product. &gt; &gt.
Que faire :

Cela signifie que votre base de connaissances ne contient pas les guides d &apos; installation. Créez des articles pour chaque étape d &quot; &quot, après les avoir ajoutés, testez en posant les questions à l &apos, IA sur l &quot.

IA

Des idées d &apos; IA.

L &apos; IA Insights analyse automatiquement les schémas 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 &apos.

Des idées d &apos; IA.
Intelligence HubThe Intelligence Hub : un résumé de l ' AI du jour, des alertes intelligentes, un outil Score-a-Lead/Analyse-a -Page et une 14-Graphique du trafic journalier.Des idées d &apos; IA.espace de travailBRIEF D ' AUJOURD '.Le trafic augmente. 12%; 3 des pistes d &apos; affaires intéressantes ;2les accords ont besoin d &apos; un suivi.Alertes intelligentesErreurs de sortie en pointillésRebond sur /pricingNouvelle piste chaude des États-UnisRevenu en avance sur la semaine dernièreÉvaluer un prospect / Analyser une pageIP ou URL…Exécuter14-Jour trafic1BRIEF D ' AUJOURD '.L &apos; IA rédige le sommaire du matin.2SMART ALERTSDes anomalies ont été découvertes.3ON DEMANDMarquer un lead · analyser une page
Le véritable centre d ' information : un résumé du jour écrit par une IA, des alertes intelligentes pour les anomalies, le notation de prospects à la demande et l '. analyse de page, et le schéma de trafic 14-jour.

Ce que les données montrent

Questions 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 &apos; un guide de réinitalisation du mot de passer 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 pourcentage de conversations l'IA résout-elle sans intervention humaine? 70% C'est bien 50% signifie que l'IA a besoin de plus de formation.

Raisons de l &apos; escalade

Les raisons les plus courantes sont : le client a demandé à être contacté par un humain, l &apos; IA n &apos.

Les lacunes de 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

Nombre de messages par conversation. Des conversations très longues (10+ messages) peuvent indiquer que l &apos; 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 &apos; IA n &apos.
Que faire :

C &apos; est là un écart de connaissances manifeste.1) Rédiger un article complet sur la garantie dans la Base de Connaissances, couvrant tous les termes de la Garantie, le processus de réclamation et les exclusions.2) Mettre à jour l &apos; invite de l &quot; &lt; &gt; pour faire référence aux informations sur la garantie. (3) Surveillez AI Insights la semaine prochaine pour voir si les escalades de garantie diminuent.

IA

Manuel d &apos; administration de l &apos.

L &apos; IA Admin (Posez OpsIQ) aide votre équipe à gérer OpsIQ Vous pouvez lui demander de rechercher des données, d &apos; expliquer les fonctionnalités, de résumer les tickets et d &quot; exécuter des actions sur la plate-forme.

Administrateur IA
Manuel d &apos; administration de l &apos.La boîte de commande Ask-OpsIQ avec une carte d &apos; action proposée par l &apos. I. 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 · vérifiéConfirmerAnnuler1ASK ANYTHINGCommandes en anglais clair2PROPOSE FIRSTAction affichée avant son exécution3YOU CONFIRMAudité et étendu
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 &apos; IA d &apos, administrateur peut faire

Recherchez des données

Demander : « Afficher tous les billets de [email protected]" ou "Quel est le statut de la commande #ORD-5523?"

Résumer

Demandez : « Résumez les derniers 10 ou « Quels sont les principaux problèmes de support cette semaine? »

Expliquer les caractéristiques

Demandez : « Comment puis-je paramétrer une réponse automatique? » ou « Que signifie la carte du taux de rebond?

Exécuter des actions

Demandez : « Créer un ticket pour [email protected] à propos de la facturation » ou « Fermer le ticket 12345"

Requêtes de plateforme

Demandez : « Combien de visiteurs avons-nous eu hier? » ou « Quels sont nos revenus ce mois-ci?

Exemples de conversations

Recherche d &apos; un client

Scénario :
L &apos; administrateur demande : « Trouver le client [email protected] et me montrer son activité récente »
Que faire :

L &apos; IA recherche le client dans toutes les sources de données connectées : sessions des visiteurs, tickets, conversations par chat, commandes et contacts CRM. Elle renvoie un résumé de l &apos); activité récente avec des liens vers chaque élément.

Obtenir un résumé quotidien

Scénario :
L &apos; administrateur demande : « Qu &apos, est-ce qui s &apos.
Que faire :

L &apos; AI résume : 245 visiteurs (up 12%), 8nouveaux billets (3 résolue par l &apos; AI),2nouvelles commandes totalisant : $198, et1chat escalade au sujet d &apos; un retard de livraison."

Exécuter une action

Scénario :
Admin demande: "Changer la priorité du ticket T-5523 à Urgent"
Que faire :

L &apos; IA confirme : « Je vais changer la priorité du ticket T-5523 de Normal à Urgent. Cela affectera le minuteur SLA. Confirmer? » Vous confirmez, et l &apos); action est exécutée.

💡
L &apos; IA d &apos. administration n &apos, exécute que les actions enregistrées dans le registre des actions. Elle ne peut pas inventer d &quot; &quot. actions ou accéder à des systèmes en dehors du OpsIQ.
IA

Scénarios d &apos; IA client.

Cette section couvre les scénarios d &apos; IA courants avec le comportement attendu et des conseils de formation.

L &apos; IA du client
Scénarios d &apos; IA client.Une bibliothèque de questions des clients associées au comportement attendu de l &apos; IA et une étiquette de résultat pour chacune d &apos.Scénarios d &apos; IA client.espace de travailBibliothèque de scénarios · comportement d'IA attendu« Où est ma commande? »Recherchez l &apos; ordre via le connecteur, donnez un suiviRésoudre"Je veux un remboursement"Reconnaissez, ne promettez jamais · la main à un humainDélivrance« Le service est-il en panne? »Vérifier l &apos; état, signaler le statut actuelStatut« Annuler mon compte »Confirmer l &apos; intention, puis acheminer vers un humainConfirmer1SCENARIOSQuestions fréquentes2EXPECTEDComment l &apos; IA devrait-elle répondre?3ESSAITrouver les 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 d &apos; état de la commande

Scénario :
Client : « Où est ma commande #12345? »
Que faire :

Comportement attendu de l &apos; IA : (1) Recherchez l &apos; ordre à travers le connecteur de plateforme. (2) Signaler le statut actuel (traitement, expédition, livraison). (3) Inclure le numéro de suivi si disponible. (4) Si l &apos; ordre est retardé, accusez réception et donnez une estimation du délai. (5) N &apos; inventez jamais de données de suivi.

Demande de réinitialisation du mot de passe

Scénario :
Client : « J &apos; ai oublié mon mot de passe et je ne peux pas me connecter »
Que faire :

Comportement attendu de l &apos; IA : (1) Fournir 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 de la page. (3) Mentionnez que l &apos; e-mail 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 &apos; application mobile? »
Que faire :

Comportement attendu de l &apos; IA : (1) Je les remercie pour leur suggestion. (2) Expliquer comment les demandes de fonctionnalité sont traitées (enregistrées, revues, hiérarchisées).3) Ne promettez pas que la fonctionnalité sera construite. (4) Si une caractéristique similaire existe, mentionnez-la.

Litige de facturation

Scénario :
Client : « J &apos; ai été facturé mais mon service ne fonctionne pas »
Que faire :

Comportement attendu de l &apos; IA : (1) Reconnaître la frustration. (2) Vérifiez l &apos; état du service si possible. (3) Passer au service de facturation avec 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 &apos; hui? »
Que faire :

Comportement attendu de l &apos; IA : (1) Redirigez poliment. "Je suis votre assistant de support [de l &apos; entreprise] et je peux vous aider avec des questions sur nos produits et services.2) Demandez s &apos; ils ont une question sur un produit.

Comment puis-je tester le comportement de l &apos; IA client?+

Ouvrez votre site web dans un navigateur privé/incognito et discutez avec l &apos; IA en tant que client. Essayez des questions courantes, des cas extrêmes et des scénarios contradictoires. Vérifiez que l &quot; &quot); s &apos.. :

IA

Base de connaissances IA

La base de connaissances est une bibliothèque d &apos; articles que l &apos, IA utilise pour répondre aux questions. Lorsqu &apos: un client pose une question, l &quot; &quot, IA 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 produit une réponse cité et fondée.Base de connaissancesespace de travailSourcesCrawl de site webArticles d &apos; aideFAQDocuments importésConnaissancemot-clé sémantiqueIARéponse motivéeavec une source citée."Les remboursements prennent 3–5jours ouvrables."1INGESTCrawl, FAQ, importation2RETRIEVEMots-clés sémantiques3GROUNDEDRéponses de votre contenu
Parcourez votre site et importez des documents dans la base de connaissances; l &apos; IA récupère les bons éléments et réponses, étayées et citées.

Comment ça fonctionne

1
Le client pose une question.

"Quelle est votre politique de retour?"

2
L &apos; IA recherche dans la base de connaissances

OpsIQ trouve l &apos; article « Politique de retour » en faisant correspondre les mots-clés et la signification sémantique.

3
L &apos; IA génère une réponse

L &apos; IA lit l &apos, article et écrit une réponse en langage naturel basée sur le contenu de l &quot; &quot.

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 d ' entraînement de l '..

Créer de bons articles

Un sujet par article

Écrivez un article distinct pour chaque sujet : politique de retour, tarifs d &apos; expédition, configuration du compte, réinitialisation du mot de passe. Ne combinez pas des sujets sans rapport entre eux.

Écrivez comme une FAQ

Commencez par la question que les clients posent, puis donnez-leur une réponse. Cela aide l &apos; IA à faire correspondre les questions aux articles.

Soyez précis

« Les retours doivent être effectués dans les 30 jours suivant la livraison » est préférable à « Nous avons une politique de retour. »

Inclure les majuscules

Qu &apos; en est-il des retours internationaux, des produits numériques et des articles achetés à la vente?

Gardez-le à jour

Supprimer les informations obsolètes. Mettre à jour les prix, politiques et procédures lorsqu &apos; ils changent.

Articles de démarrage que vous devriez écrire

Expédition et livraison

Coûts d &apos; expédition, délais de livraison, suivi, envoi international et retards de manutention.

Retours et remboursements

Fenêtre de retour, conditions, processus, calendrier de remboursement et exceptions.

Gestion des comptes

Réinitialisation du mot de passe, changement d &apos; adresse électronique, suppression du 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 &apos; écran.

Dépannage

Problèmes courants et solutions. Messages d &apos; erreur et leurs correctifs.

Informations de contact

Heures d &apos; ouverture, canaux de soutien, délais de réponse et voies d &quot; escalade &quot.

Juridique et conformité

Résumé de la politique de confidentialité, résumé des conditions d &apos; utilisation, demandes de données GDPR.

Connaissances sur les connecteurs

Chaque connecteur peut apporter des connaissances à l &apos; IA. Lorsqu &apos, un connecteur est activé, ses articles de connaissance (catalogue de produits, questions courantes, dépannage spécifique à la plate-forme) sont automatiquement disponibles pour l &quot; &quot. 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 a un plafond configurable (par défaut: 32,000 tokens) qui contrôle la quantité de contexte de connaître envoyé à l &apos; IA par conversation. Si votre base de données est très grande, l &quot; &quot); AI sélectionne les articles les plus pertinents dans ce budget. Augmentez le plafond si l &lt; &lt. IA ne trouve pas d &apos. articles pertinents; diminuez-le si vous voulez réduire les coûts des jetons.

Combien d &apos; articles devrais-je avoir?+

Commencez par5-10 Ajoutez-en d &apos; autres à mesure que vous identifiez les lacunes grâce aux fonctions Historique et Aperçu. La plupart des entreprises ont besoin : 20-50 articles pour une couverture complète.

Puis-je importer des articles d &apos; un autre système?+

Actuellement, les articles sont créés manuellement dans OpsIQ. Vous pouvez copier-coller le contenu de FAQ existantes, centres d &apos; aide ou documents.

Dans quel format les articles doivent-ils être?+

Le texte brut fonctionne mieux. L &apos; IA comprend le langage naturel mieux que les HTML ou les marqueurs structurés. Écrivez comme vous expliqueriez à un client.

IA

Évaluation de l &apos; IA et Watchtower

Les ensembles d &apos; évaluation transforment les questions critiques des clients en tests répétables pour la qualité de réponse, les citations, l &apos.

Ecran du produit
Évaluation de l &apos; IAL &apos; évaluation de l &apos, IA répertorie les cas d &apos. tests en or, les comportements requis, les derniers résultats et les exécutions prévues du programme Watchtower.Évaluation de l &apos; IAespace de travailSETS6CASES84PASS RATE96%VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTPolitique de livraisonCitation requisePasserDemande de remboursementConfirmation humaine requisePasserRevendication non prise en chargeAction interditePasserQuestion de migrationSource attendue manquanteFichiers1CREATE CASESInput et règles d &apos; or2RUN SAFELYEssai ou évaluation en direct3WATCHPlanifier quotidiennement ou hebdomadairement
L &apos; évaluation de l &apos, IA répertorie les cas d &apos. tests en or, les comportements requis, les derniers résultats et les exécutions prévues du programme Watchtower.

Les administrateurs complets peuvent créer des ensembles d &apos; évaluation avec une invite, les étiquettes de source attendues, les citations requises, les règles de confirmation humaine, les attentes en matière d &quot; &quot.

La Tour de Garde planifie des vérifications quotidiennes ou hebdomadaires via cron et exécute un nombre limité de cas (jusqu &apos; à huit par passage programmé). 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.

Ecran du produit
LanguesLa page Langues affiche la langue source, les langues traduites, l &apos; état brouillon/en cours et le comportement de la langue du client.Languesespace de travailSOURCEAnglaisLANGUAGES4VIVRE3VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTFrançaisInterface et contenuEn directAllemandInterface et contenuEn directEspagnolBrouillon de traductionBrouillonSuivre le clientRépondre dans la langue détectéeActivé1SET SOURCELangue de l &apos; opérateur original2ADD LANGUAGETraduire en arrière-plan3PUBLISHBrouillon ou en direct
La page Langues affiche la langue source, les langues traduites, l &apos; état brouillon/en cours 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 &apos; interface du widget contrôle ses boutons, ses étiquettes et le texte système.

La portée de la traduction peut être brouillon uniquement ou en direct. Ne vous fiez pas à la tradition automatique pour les textes juridiques, de remboursement, de sécurité ou de sûreté sans révision humaine.

Chaque endroit qui contient votre propre formulation est listé avec son nombre de messages : les messages de chat client, promotions, messages proactifs, flux de chat, visites guidées, annonces, bulles teasers et Sondages et formulaires. La surface du sondage couvre chaque sondage publié complètement: titre, toutes les questions, toutes options de réponses, boutons, copie de bienvenue et de remerciement, page chrome et pages des résultats. Les clés sont liées à l &apos; ID de la question et à la valeur de l &quot; &quot); option, donc le réarrangement des questions ou des options ne perd jamais une traduction, et le reformulation d &apos. un message re-traduit seulement ce message.

Le sondage par courriel après le chat suit la langue dans laquelle le visiteur a réellement discuté, à condition que cette langue soit celle que vous proposez ici; sinon il utilise votre langue système. Ses six champs modifiables sont traduits sur cette page aussi, et ce comportement a son propre commutateur dans les paramètres du Chat client.

Tickets et messages 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.) Envoyer des courriels aux 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.* les opérations par le biais d'un contrat, plus les classes de connecteurs dactylographiés API La section énumère chacun d'entre eux 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 des ressources humaines

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 PersonnesOS→En première ligne→Conception de l'ouverture d'une session. 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 Personnes en poste → 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 PersonnesOS→En 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é PersonnesOS → 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

Utiliser le général API pour les opérations de RH régies et les contrats de connecteurs dactylographiés pour des 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 Portail des fournisseurs de ressources humaines 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.

Soutien

Centre d &apos; aide

Votre centre d &apos; aide est un site d &quot; &quot,aide en libre-service construit à partir des articles que vous publiez. Les clients peuvent le lire et y faire des recherches sur sa propre page publique, ainsi qu &apos,à l &apos:intérieur du widget de chat, afin de trouver les réponses par eux-mêmes avant même d &amp; ouvrir une conversation. Tout ce qui s &apos. 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 &apos; aide propre et consultable à /help.php. Les clients parcourent les articles par catégorie, recherchent et ouvrent n &apos; importe quel article. Vous pouvez lui donner votre propre nom et style.

À l &apos; intérieur du widget de discussion

Un lien d &apos; aide dans le widget de discussion afin que les clients puissent rechercher vos articles sans quitter la conversation. S &apos, ils ont encore besoin d &quot; une personne, ils sont à un clic du début d &amp; #160; d &rsquo; une conversation.

Allumez-le

1
Ouvrir la page du Centre d &apos; aide

Aller à Config, then Help Center dans votre compte administrateur et activez Activer le centre d &apos; aide public.

2
Donnez-lui un nom et une apparence.

Définissez le nom du Centre d &apos; aide, qui apparaît dans l &apos. en-tête et dans l ’ onglet du navigateur, puis choisissez un style visuel. Vous pouvez désactiver la navigation supérieure pour une page propre sans menu.

3
Publier des articles

Rien ne se voit tant que vous n &apos; y publiez pas d &apos. La prochaine partie explique comment.

Publier des articles dans le centre d &apos; aide

Les articles sont stockés dans votre base de connaissances. Un article apparaît dans le Centre d &apos; aide une fois qu &apos, il a été publié et marqué comme public. Il existe plusieurs façons de procéder :

Publier un article

Ouvrez l &apos; article, marquez-le comme publié et activez l ’ option pour l &quot; &quot.

Tout publier en une fois

Utilisez Tout publier bouton pour pousser l &apos; ensemble de vos publications vers le Centre d &apos. aide en un seul clic, au lieu de les faire une à la fois.

Transformez les FAQ en articles

Vous avez déjà des FAQ? Utiliser Publier tout à l &apos; aide pour les transformer en articles d &apos; aide afin qu &apos, ils soient à côté de tout le reste.

Importer une base de connaissances existante

Vous venez d &apos; un autre centre d &quot; assistance? Importer des Ko le bouton dans l &apos; onglet Articles vous permet d &apos. accéder à une base de connaissances existante. Vous avez trois façons de la pointer vers votre contenu :

Coller un URL

Donnez-lui l &apos; adresse de votre centre d &apos, aide actuel. S &apos: il reconnaît la plateforme (par exemple Zendesk), il lit l &quot; &quot, arbre des catégories exacte de cette plateforme. Sinon, il explore le site et reconstruit la structure à partir des pages, en n &apos. important que les articles réels et en sautant les pages de connexion, de prix et de contact.

Choisir une application connectée

Si une plateforme est déjà connectée à cet espace de travail et qu &apos; elle contient une base de connaissances, celle-ci apparaît dans un menu déroulant sous Importer à partir d &apos; une application connectée. Sélectionnez-la et importez, aucun mot de passe ou URL n &apos; est nécessaire. L &apos); application n &quot; est répertoriée qu &apos. 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 colonnes. Parent / Child dans la colonne de catégorie pour créer des catégories imbriquées.

Quel que soit le chemin choisi, vous obtenez un aperçu d &apos; abord: les articles 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 &apos; est enregistré tant que vous ne cliquez pas sur Importer. Vous pouvez ensuite Annuler l &apos; importation entière en un seul clic, ou Resynchroniser un URL ou une importation connectée-app plus tard pour tirer dans les articles nouveaux et modifiés.

💡
Développeurs : tout connecteur peut annoncer sa base de connaissances à ce menu déroulant en déclarant un kb_capabilities bloc de son settings.json (type kb_source, avec un adapter et un base_templateVoir la section Connecteurs et la référence de connecteur-plateforme.

Organiser avec l &apos; IA

Un centre d &apos; aide bien rangé est facile à parcourir et plus facile à rechercher. Organiser avec l &apos; IA Le bouton fait le ménage pour vous. En un seul 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 l &apos; exécuter à nouveau chaque fois que vous ajoutez de nouveaux articles. Activer Laissez l &apos; IA organiser les sous-catégories. dans les paramètres du Centre d &apos; aide et il peut aussi classer des articles sous Parent / Child catégories, ce qui est pratique juste après avoir importé une base de connaissances qui avait des sous-sections.

💡
Les catégories permettent aux clients de naviguer, et les balises affinent la recherche sur la page publique et dans le widget. Vous pouvez renommer ou déplacer des éléments par la suite. L &apos; IA vous donne un bon point de départ, pas une configuration avec laquelle vous êtes coincé.

Le Centre d &apos; aide dans votre widget de chat

Vous pouvez afficher le Centre d &apos; aide directement dans le widget de chat afin que les gens puissent rechercher des réponses avant de vous envoyer un message. Dans les paramètres du widget de tchat, choisissez où apparaîtra le lien d &quot; &quot); Aide :

Dans l &apos; en-tête

Une petite icône d &apos; aide en haut du widget.

En bas,

Un lien sous la boîte de message, par exemple « Parcourir le centre d &apos; aide ». Vous pouvez modifier le libellé.

Les deux endroits

Afficher dans l &apos; en-tête et au bas pour une meilleure visibilité.

Le lien d &apos; aide a sa propre couleur sous les paramètres de l &apos. Laissez-le activé Aucun pour correspondre à votre couleur de lanceur, ou choisissez un Solide couleur ou un Dégradé. L &apos; ensemble de l &apos, aide suit le thème du widget, il ressemble donc toujours à une partie de votre marque.

Mettez votre centre d &apos; aide sur votre propre adresse web

Votre centre d &apos; 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. son 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.com. Tout continue de fonctionner sur votre domaine: liens, images, recherche et évaluation des articles.

Sous votre site principal

Et Configuration, puis Centre d &apos; aide, ouvrez le Intégrer 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 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.

💡
Vous utilisez Cloudflare? Il n &apos; exécute son Worker que sur une adresse qui est un proxy via _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. La méthode la plus fiable consiste à utiliser un sous-domaine proxy comme 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.
💡
Vous utilisez également le lien d ' aide dans le widget? Dans les paramètres du widget de clavardage « Ouvrir dans le centre d " aide », définissez Où va le lien? à Votre propre domaine de centre d &apos; aide et entrez la même adresse. Ensuite, ces liens d &apos; article s &apos: ouvrent sur votre domaine aussi, pas sur l &apos. OpsIQ adresse.

Voyez comment votre centre d &apos; aide se porte.

Au-delà des votes sur un seul article, le Centre d &apos; aide a 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 où votre aide apparaît, la page publique et l &apos; aide dans le widget, ainsi que combinées, de sorte que vous pouvez voir à quel point chacune est réellement utilisée.

💡
L &apos; analyse reste désactivée jusqu &apos, à ce que vous l &apos. activez et vous pouvez faire anonymiser les adresses IP des visiteurs. Rien n &apos: est enregistré avant votre acceptation.

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 éléments, un définir le nombre, le dernier, ou seulement ceux que vous Caractéristique Quand une règle termine une liste, les clients reçoivent toujours un lien « Afficher tout », donc rien n &apos; est vraiment hors de portée.

Vous décidez également de l &apos; apparence des votes utiles : cachés, un rapport amical comme "12 de 14 Un paramètre de vote minimum empêche un tout nouvel article d &apos; afficher une "0sur0".

Voir quels articles fonctionnent

Chaque article montre un Cela vous a-t-il été utile? Chaque oui ou non est compté par article, de sorte que vous pouvez voir en un coup d &apos; œil quels articles répondent bien aux questions et ceux qui ont besoin d &quot; &quot. Les votes répétés du même visiteur sont ignorés, donc le décompte reste honnête.

Texte et étiquettes

Vous pouvez modifier les titres et étiquettes du Centre d &apos; aide pour qu &apos. ils correspondent à votre voix. Laissez n &apos, y compris les champs vides, et il revient à une valeur par défaut raisonnable, de sorte que vous ne modifiez que le libellé que vous voulez réellement changer.

Le Centre d &apos; aide partage une bibliothèque avec votre IA. Chaque article que vous publiez ici est le même contenu que l &apos,IA utilise pour répondre aux conversations et aux tickets, donc améliorer l &quot; &quot,un améliore l &amp; #160;autre.

Questions fréquentes

Dois-je écrire un contenu distinct pour le Centre d &apos; aide?+

Non, il est construit à partir des mêmes articles de la base de connaissances que l &apos; 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 &apos; aide. Tout ce qui n &apos, est pas publié en reste à l &apos.

Les clients pourront-ils toujours joindre une personne?+

Oui. Le lien d &apos; aide du widget est à portée de main pour 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 &apos; état du site, le suivi des mots-clés et une tendance du trafic.Intelligence du siteyoursite.com86SANTÉ DU SITE3 problèmes critiquesSuivi du classement des mots-clésA. Service d ' assistance#3chat en direct#7CRM pour les agences#12Clics organiques.1CRAWLTrouve des problèmes techniques2DÉPLACEMENTClassements, mots-clés, liens de retour3ANALYSTE D &apos; INTELLIGENCE ARTIFICIELLEExplique et élabore 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 un OpsIQ qui visite 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 &apos; indexation.

1
Commencer à ramper

Dans l &apos; aperçu, cliquez pour lancer une recherche. OpsIQ met en file d &apos); elle parcourt vos pages en arrière-plan et un indicateur de progression indique son avancement.

2
Lisez les rapports.

Quand il est terminé, ouvrez les problèmes et la liste des pages. Chaque problème est regroupé par gravité afin que vous puissiez aborder les plus grands succès en premier.

3
Laissez l &apos; 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 &apos; entraîneur AI pour les mots-clefs qui vous aidera à hiérarchiser.

Liens retour

Voir qui vous renvoie vers votre site, actualiser la liste et refuser les liens que vous ne souhaitez pas associer à votre site.

Concurrents

Ajoutez les domaines concurrents et comparez votre visibilité avec celle des autres, grâce à une analyse de la concurrence par IA.

Grille locale (carte)

Analysez la visibilité des annonces locales sur une grille géographique pour voir où vous apparaissez sur la carte, ainsi que les outils de profil d &apos; entreprise Google.

Vitesse de la page

Exécutez des vérifications de vitesse de page afin que vous puissiez corriger les pages lentes qui nuisent aux classements et aux conversions.

Contenu IA

Générer des résumés de contenu et des brouillons ciblant les mots-clés que vous ciblez.

Rapports

Créez des rapports imprimables et prêts à l &apos; emploi pour tous les éléments ci-dessus.

Connectez-vous à 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 exactes, les clics et les impressions que Google rapporte pour votre site, cartographiez votre propriété et découvrez des opportunités de classement directement à partir des propres données de Google.

Google Analytics 4

Trafic

Apportez vos données de trafic et d'engagement aux côtés de vos données SEO, afin que les rapports montrent 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?+

Les crawls, le suivi des classements, la recherche de mots-clés et les backlinks fonctionnent sans toucher à votre site. Pour obtenir des données exactes sur le trafic et les recherches, connectez Google Search Console et GA4.

Puis-je suivre plus d &apos; un domaine?+

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; crawl à la demande après un grand changement de contenu ou de structure. Définissez une planification afin que vous n &apos; oubliiez jamais.

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é.

Auto-exécution
Agent SEO d &apos; auto-implémentationUn flux montrant les correctifs SEO recommandés passant par l &apos; aperçu, l &quot; &quot. approbation et une écriture en direct, avec un re-crawl de preuve.Auto-exécutionyoursite.comCorrections recommandéesAdd missing <title>approuvéRéparer le fichier robots. txtapprouvéSoumettre le sitemap.xmlExamenAVEC DRY-RUN (DIFF)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>ApprouverNavirePROUVEZ-LE - RE-CRAWLProblèmes ouverts 124Instantané enregistré1APERÇUFaire un essai de diff pour chaque correction2APPROUVER ET ÉCRIRESSH ou hébergé. API3TEST & ROLLBACKRe-crawl + instantané
Comment fonctionne une session : l &apos; agent liste les correctifs déjà recommandés par Site Intelligence, affiche un diff de test pour chacun, applique ceux que vous avez approuvés. SSH ou un hébergeur. API, des instantanés avant chaque écriture et re-crawls pour prouver que le nombre de problèmes ouverts a chuté.

Ce qu &apos; il peut changer

L &apos; agent n &apos, appliquera que les correctifs déjà recommandés par Site Intelligence (ou l &apos. analyste de l &quot; &quot); IA pour ce domaine.

Configuration du serveur

sitemap.xml, robots. txt et redirection, règles canoniques et d &apos; en-tête dans. htaccess (Apache/LiteSpeed) ou la configuration nginx.

Rediriger les chaînes

Réduit une chaîne de redirection multi-sauts à un seul saut direct vers le URL final, dans le même bloc géré. htaccess, afin que la vitesse et la valeur du lien cessent de fuir par les sauts supplémentaires.

Page <head>

Titres de page manquants ou faibles, méta descriptions, balises canoniques et blocs de données structurées (schema).

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

Ajouts JSON-LD (schema) pour les pages qui n &apos; en ont pas. SSH path un petit assistant géré (un plugin à utiliser obligatoirement) imprime le balisage pour qu &apos; il fonctionne avec ou sans un plugin SEO ; sur le chemin hébergé, c &apos.-à-d. votre plugin SEO le transporte.

Liens internes

Ajoute un lien interne pertinent à l &apos; intérieur du contenu existant de la page WordPress pour récupérer les pages orphelines et relier des articles connexes. Un lien par page, jamais dans un en-tête, un liens existant ou un shortcode, et toujours approuvé par vous d &apos); abord.

Réécriture de contenus en page mince

Brouille le contenu de remplacement complet pour les pages minces (activé par une option d &apos; exploration, voir ci-dessous). Chaque brouillon est examiné et approuvé par vous avant toute publication, et l &apos. ancien contenu est conservé afin qu &apos); il puisse être restauré.

Cache de page (WordPress)

Active le cache de page W3 Total Cache lorsque l &apos; exploration détecte des problèmes de vitesse et que ce module est installé, afin d &apos. accélérer la diffusion des pages.

Shopify SEO

Titres et descriptions SEO de produits et collections, référencement des pages et articles de blog, plus 301 redirects, through the Shopify Administrateur API.

Webflow SEO

Par page SEO titre et méta description à travers le. Webflow Données API v2.

Préparer les correctifs automatiquement (deux options de recherche)

Le panneau Configurer l &apos; intelligence du site pour un domaine (ses paramètres d &apos, &apos.. ) a deux options qui décident combien l &quot; &quot, agent s &apos: aligne à votre place à l &amp; avant-temps. Les deux sont désactivés par défaut et utilisent tous les deux le crédit de l &lt; &lt, donc vous ne les activez que lorsque vous voulez faire ce travail pour vous.

Préparer automatiquement les correctifs de l &apos; IA après chaque recherche

Chaque crawl écrit également le contenu concret de la correction (titres, méta descriptions, texte alternatif, schéma, redirections) pour ce qu &apos; il a trouvé, afin que les corrections soient prêtes à être examinées et appliquées au moment où l &apos..

Réécriture du contenu par IA (pages minces)

L &apos; agent peut élaborer un projet de remplacement complet pour les pages minces. Rien n &apos, 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 &apos); il soit réversible, et il est limité à quelques pages par passage. Utilise des crédits d &apos. IA par projet.

💡
Les deux options ne font que préparer et brouiller le travail. Chaque modification passe toujours par la même approbation étape par étape, instantanée et annulée comme n &apos; importe quelle autre correction, donc les activer ne met jamais rien en ligne de lui-même.

Il se connecte de deux façons.

SSH / SFTP chemin

Auto-géré.

Pour les sites sur votre propre serveur, l'agent se connecteSSH/SFTPen utilisant les identifiants que vous stockez, modifie directement la configuration du serveur et les fichiers de page, et exécute WP-CLI pourWordPress. Meilleur lorsque vous avez accès shell et que vous voulez un contrôle complet des fichiers.

Hébergé-API chemin (non SSH)

Pas de shell

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 public SEO- écrireAPI, donc sur ces plates-formes Auto-Implement fonctionne en mode consultatif: il vous montre le changement exact à faire (le titre précis, méta ou réglage) pour que vous appliquez à la main. Tout le reste est en lecture seule et sûre.

Activer les connecteurs

L &apos; agent accède à chaque plateforme par un connecteur :

Intégré

Shopify et WordPress connectique navire avec OpsIQ, il suffit de les activer sous Connecteurs et d'ajouter les identifiants du magasin / site.

Du marché

Webflow, Wix et Squarespace s &apos; installent depuis Connecteurs → Marketplace, puis se connectent de la même manière.

Comment une session fonctionne

1
Choisissez les solutions

Ouvrez l &apos; application automatique (rocket) dans la section Site Intelligence. Elle répertorie les problèmes que Site Intelligence a déjà trouvés et qu &apos, il peut corriger sur ce domaine.

2
Aperçu de 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 &apos; est appliqué sans votre autorisation explicite à cette étape.

4
Il écrit, puis prend des clichés

Après approbation, l &apos; agent fait le changement en direct. SSH ou l &apos; hôte. API et sauvegarde d &apos; abord un instantané, afin que tout changement puisse être annulé.

5
Prouvez-le, vivez

Au fur et à mesure qu &apos; il applique chaque modification, l &apos. agent vérifie immédiatement la page exacte et affiche un verdict étape par étape indiquant que le problème a été résolu. Vous pouvez donc voir chaque correctif apparaître sur la page active au fur età mesure de son application.

Sécurité & facturation

SEO uniquement

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 comme une différence et appliquée seulement après que vous ayez approuvé cette étape spécifique.

Instantané et retour en arrière

Un instantané est sauvegardé avant chaque écriture, de sorte que toute modification peut être annulée.

Preuve en direct étape par étape

Chaque page modifiée est vérifiée à nouveau au moment où elle est écrite et reçoit un verdict « corrigé en direct », de sorte qu &apos; une correction est confirmée par rapport à la page active immédiatement, pas seulement dans le dernier re-crawl.

Le contenu n &apos; 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 montrés pour approbation et ne sont jamais appliqués automatiquement, quel que soit le mode utilisé.

Géré par IA seulement

Auto-Implement fonctionne sur Managed AI ; il est bloqué lorsqu &apos; 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.

L &apos; implémentation automatique est désactivée par défaut. Activez-la sur la page de configuration d &apos, AI (carte Implémentation Automatique) et assurez-vous que le connecteur pour votre plateforme est connecté en premier lieu.
Cela change-t-il quelque chose sans demander?+

Non. Chaque modification est prévisualisée comme une comparaison à sec et appliquée seulement après que vous ayez approuvé cette étape exacte. Un instantané est sauvegardé avant chaque écriture afin de pouvoir revenir en arrière.

Ai-je besoin d &apos; 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 savoir si ça a marché?+

Après avoir appliqué les correctifs approuvés, l &apos; agent re-crawl 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 &apos; il réécrira ou publiera le contenu de la page par lui-même?+

Non. Les réécritures de contenu par IA sont désactivées jusqu &apos; à ce que vous les activiez dans les options d &apos, 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 &apos; utiliser avec mes propres clés d &apos,I. A?+

Non. Auto-Implement est uniquement pour Managed-AI et est bloqué sous BYOK. Il facture les jetons AI normalement plus une redevance forfaitaire par session, à partir du même crédit Managed -AI.

Croissance et engagement

Studio de sondage

Survey Studio est l &apos; espace de travail pour la création d &apos.. éditable des sondages qui peuvent être livrés comme une page autonome riche, un widget du site Web ou en ligne incorporé. Le produit actuel fournit également des liens hébergés, aperçus signés de brouillons, invitations privées, partage QR, navigation des réponses et analyses dans le cadre du sondage. Le widget du Site Web est un choix de livraison; il n &apos: s pas la définition d &quot; &quot.

⚠️
Limite courant-contre-cible : l &apos; expérience de création et d &apos, aperçu premium Connector Builder survey Survey Studio a encore besoin de l &apos; architecture indépendante multidéploiement, du jeton signé Survey Identity Gateway, du câblage cible/variable, du flux d &apos. envoi CRM Outreach et des données tapées surveys.* API.

Créer un sondage

1
Choisissez comment les gens vont le prendre.

L &apos; assistant actuel propose des pages et liens autonomes, un widget de site Web et une intégration en ligne. Le flux cible approuvé commence par le type d &apos); enquête et ajoute plus tard les déploiements CRM par courrier électronique, lien privé et QR comme choix de première classe.

2
Choisissez le but

Choisissez NPS, CSAT, CES, commentaires sur les produits, après-achat, annulation, onboarding, site Web, événement, webinaire, support, lead/démo, essai, témoignage, recherche, employé, accueil ou commentaire général.

3
Utiliser un modèle complet ou Commencer en blanc

Le catalogue actuel contient des démarreurs prêts à être modifiés, regroupés par objet. Choisir un modèle crée une version préliminaire copiée : modifier votre sondage ne change pas le démarreur ou un autre sondage.

4
Personnaliser ou Révision rapide

Personnaliser ouvre chaque question, conception, comportement et contrôle de livraison. Révision rapide ouvre le même brouillon lors du dernier contrôle client-vue. Rien ne se publie ou n &apos; est envoyé automatiquement.

Choix de livraison et comportement présent.

Page autonome et lien

Une page personnalisée réactive avec son propre URL. Utilisez des invitations privées et une date d &apos; expiration lorsque chaque destinataire a besoin d &quot; &quot, un lien contrôlé.

Widget du site Web

Le canal hérité migré. Il peut utiliser des règles de page, géographiques, d &apos; appareil, de visiteur, de date, d&apos; é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 &apos); architecture du déploiement est construite.

Intégration en ligne

Un sondage réactif placé dans une page, un portail, un produit ou un centre d &apos; aide. Il ne nécessite pas Promotion Studio.

E-mail

Aujourd &apos; hui, le Studio peut générer des invitations. HTML L &apos; envoi de bout en bout à partir des contacts/segments CRM, avec consentement, suppression, planification, réessai et corrélation des réponses, est la cible approuvée pour l &apos: intégration dans CRM Outreach.

Conception et aperçu d &apos; entreprise

Les pages de sondage ont des thèmes et familles de mise en page appartenant à Survey, des contrôles réactifs, une copie d &apos; accueil et de complétion, ainsi qu &apos. un aperçu du brouillon signé. L &apos: aperçu de concepteur est pleine largeur sous l &apos, éditeur, pas un rail latéral étroit. Il utilise le temps d &quot; &quot); exécution hébergé réel dans un cadre sandboxed et prend en charge les largeurs de bureau, tablette et téléphone ; le trafic d &amp; aperçu n &apos

💡
Le ciblage, l &apos; identité, les ressources, le rendu et les analyses en temps d &apos. 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 distinctes du sondage ; les modifications ultérieures apportées à Promotion ne doivent pas avoir d &quot; effet.

La forme complète produit

Déploiements indépendants

En direct

Un sondage peut avoir des versions séparées de la page, widget, intégrer, CRM e-mail, lien privé et QR déploiements, chacun avec son propre état, design, public et analyse. Chaque enquête peut être mis en pause, 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 dans une version immuable, émettez une invitation signée chacune et envoyez par le biais du connecteur d &apos; e-mail sortant épinglé avec preuve de livraison pour chaque invitation.

Kit de terrain et validation

En direct

Sliders, choix d &apos; image, téléchargement de fichiers, signature, adresse, téléphone, en-têtes et texte riche, avec longueur min/max, préréglages email/URL/numéro, texte d &quot; &quot. erreur personnalisé et paramètres URL préremplissage par question.

Logique, formules, résultats

En direct

Groupes conditionnels ET/OU, règles de branchement, moteur de formule sûre sur les réponses et bandes de score qui portent leur propre page de résultat : un questionnaire noté atterrit sur son verdict.

Langue, kiosque, préremplissage

En direct

Une liste déroulante des langues visitées ne répertoriant que les langues avec de vraies traductions, un mode kiosque pour les tablettes partagées (cibles plus grandes, réinitialisation automatique, pas de redirection), un générateur de liens préremplissage et un badge sécurisé modifiable ainsi qu &apos; un texte de pied de page.

Test de la version A/B

En direct

Publiez une version challenger sur n &apos; importe quel déploiement avec un partage du trafic. Les visiteurs sont assignés de manière collant, les réponses sont étiquetées avec la version réellement servie et le tableau de comparaison montre les réponse, l &apos); achèvement et le score moyen par version. Promouvoir le gagnant en un seul clic.

Résumé hebdomadaire

En direct

Un e-mail hebdomadaire avec les derniers 7 jours d &apos; indicateurs de performance clés, les enquêtes les plus occupées, l &apos. impulsion des commentaires et le dernier briefing sur l &quot; &quot. IA, envoyé via le connecteur sortant épinglé. Configurez-le dans Centre de livraison, Automation.

Gouvernance

En direct

Les listes d &apos; accès par sondage limitent les personnes pouvant modifier, publier ou supprimer un sondage. L &apos: approbation de publication (quatre yeux) nécessite qu &apos); un deuxième administrateur pour libérer le brouillon exact; l &apos. édition réinitialise l &quot; &quot. approbations.

Plateforme de développement

En direct

Contrat de connexion 2.2, des enquêtes tapées* et des actions de retour d &apos; information* sur : api/v1, événements d &apos; enquête canoniques.*, webhooks signés durables avec les formats de relais Slack et Google Sheets, et une réponse. PDF exportation.

Croissance et engagement

L &apos; analyse des sondages et le retour d &apos, informations sont deux produits différents.

Les données d &apos; analyse des sondages expliquent comment un sondage lui-même atteint les personnes et fonctionne. Le retour d &quot; information explique ce que les clients ont dit à travers toutes les sources autorisées et ce que l &apos, entreprise devrait faire à ce sujet.

Analyse des enquêtes

Entrer à partir du sondage individuel dans Survey Studio, pas de la navigation globale. Il mesure l &apos; éligibilité, l &quot; &quot: exposition, comportement déclencheur, débuts, achèvement, abandon, question et branche friction, timing, déploiement/ campagne/ résultats de version et fiabilité en cours d &apos); exécution.

Aperçu des commentaires et boîte de réception

Un flux chronologique avec permission pour les réponses aux sondages complétées, les commentaires sur les widgets existants, le chat et les CSAT de tickets, les retours sur la réponse des tickets, l &apos; évaluation des réponses d &apos.

Analyse des retours

Analyse la signification du client: tendances de mesures originales, sujets/thèmes, sentiment, émotion, intention, urgence, demandes, plaintes, louanges, segments parcours/produit/service/équipe, détracteurs et résultats en boucle fermée.

Propriété des données

Les réponses aux sondages restent autorisées dans le stockage des sondages. Feedback stocke une référence source reconstructible et les signaux dérivés, puis charge les preuves autorisées sur demande. Une réponse à un sondage complète devient au plus un élément de Feedback.

⚠️
La page de commentaires actuelle a toujours un navigateur de réponses au sondage et une boîte de réception héritée séparée, et ses totaux d &apos; IA n &apos.. ne sont pas encore conformes au modèle source normalisé complet. Le design Aperçu / Boîte de Réception / Analyses / Sources et santé est la cible de mise en œuvre.

NPS, CSAT, CES, les étoiles, les notes et l &apos; utilité doivent toujours conserver leur méthode originale, leur échelle, leur exemple, leur fenêtre de date et leur dénominateur.

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 Promotion StudioUn concepteur de campagne visuelle avec une palette de blocs, un pop-up sur la toile et un panneau de ciblage.Promotion Studio - ConcepteurBLOCSxBienvenue, {first_name}!Obtenez 15 % de réduction sur votre première commandeSAVE15Réclamer mon couponCiblagePaysÉtats-Unis, CalifornieDéclencheurIntention de sortieDivision A/B50 / 50Publier1CONCEPTIONFaites glisser les blocs sur la toile2CIBLEPays, page, public3MESURESGagnant A/B + AI
Le concepteur visuel : une palette de blocs à gauche, votre campagne sur la toile (ici un coupon personnalisé en utilisant un token {first_name}), et le panneau ciblage + publication à droite.

La vue d'ensemble

Campagne

Qu &apos; est-ce que

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 & 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, en retard, au défilement, à l &apos; intention de quitter, lorsque le site est inactif, sur un clic, après N pages ou depuis une conversation/un ticket.

Analytique

Résultats

Impressions en direct, clics, conversions, entonnoir de décrochage, répartition pays/page/appareil, gagnants A/B et analyse d &apos; IA.

Lancez votre première promotion en 5 étapes

1
Commencer à partir d &apos; un modèle ou d &quot; &quot.

Ouvrez Promotion Studio et cliquez sur Nouvelle campagne, ou choisissez un design prêt à l &apos; 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 de l ' exposition, ils deviennent les valeurs réelles du visiteur.

4
Cible et déclencheur

Choisissez qui le voit (pays, page, appareil, public) et quand il se déclenche (délai, défilement, intention de sortie). Laissez 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.

Des blocs que vous pouvez construire

Contenu

Noyau

En-tête, paragraphe, liste, citation, image, icône, badge, stat, diviseur et espaceur, les éléments constitutifs de tout message.

Appel à l &apos; action

Noyau

Des boutons avec de vraies actions : ouvrir un lien, démarrer une conversation, créer un ticket, copier un coupon ou sauter à une page.

Urgence et capture

Prime

Compte à rebours, formulaires (e-mail / téléphone / texte), révélations de coupon et intégration vidéo.

& Rétroaction ludique

Prime

Roues à gagner, cartes à gratter, NPS / évaluations par étoiles et entonnoirs multi-étapes.

Mise en page et 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. Ils sont remplacés par les détails en direct du visiteur au moment où la promotion s '); est affichée (toujours nettoyés pour des raisons 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 & emplacement

Afficher uniquement dans (ou masquer de) les pays, villes ou fuseaux horaires sélectionnés via GeoIP. Idéal pour des offres spécifiques à une région ou une géo-redirection.

Pages et URLs

Limiter à certaines pages en utilisant equals / starts-with / contains / regex, et exclure les pages aussi.

Appareil

Bureau, tablette ou mobile, p. ex. une barre mince sur mobile, un mode de travail sur bureau.

Type de visiteur

Nouveau, de retour, 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.

Planification et fréquence

Dates de début/fin, fenêtres d &apos; heure et fréquence à laquelle une personne peut la voir (par session, par jour, après qu &apos. ils ont fermé / cliqué / converti).

Division du trafic A/B

Afficher à un pourcentage de visiteurs et exécuter des variantes en tête-à-tête ; la même personne voit toujours la même variante.

Audiences (connecté)

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, à l &apos; intention de sortie, en mode inactive, au clic d &apos. un élément, après avoir consulté un certain nombre de pages, lors de l &quot; &quot); abandon du formulaire ou par l &amp; #160; activité de chat/ticket. Les développeurs peuvent en déclencher une depuis leur propre code avec window.OpsIQPromo.fire('event').

Cibler les clients connectés (connecteurs)

C'est ce qui faitOpsIQpromotions spéciales: connecter une plateforme commeWHMCS(ou n'importe quel connecteur qui supporte le public) et le studio peut cibler les visiteurs par leur état de compte en direct.

1
Activer un connecteur d &apos; 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 &apos; audience

Dans la campagne Ciblage > Audience, exiger une connexion et ajouter des règles comme les factures impayées >= 1, l ' abonnement est en retard ou le compte est crédité > 0.

3
Personnaliser avec leurs données

Utilisez des jetons tels que. {first_name} ou {balance_due}. Un rappel "Vous avez une facture en retard" s &apos; écrit automatiquement.

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 de votre magasin

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 coupons peut créer le vrai code de réduction dans votre magasin au moment où vous publiez, donc le code révélé par un visiteur fonctionne toujours à la caisse.

Les revenus de l &apos; 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 et 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 l &apos; augmentation.

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 aussi tester QUAND apparaître : immédiate vs retardée vs intention de sortie, mesurée en tête-à-tête.

Voyages (chaîne)

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 une fenêtre après avoir fermé la campagne, donc une fenêtrage fermée ne disparaît jamais pour toujours.

Savoir ce qui s &apos; est passé

Carte de chaleur des clics

Concepteur

Dans le concepteur, activez la carte thermique pour peindre les clics réels des visiteurs sur chaque bloc de votre conception.

Entonnoir d'étapes

Entonnoirs

Les campagnes en plusieurs é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.

Article hebdomadaire & résumé

IA

Chaque lundi, un résumé apparaît 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.

Copilote et idées d & IA

Discutez avec le copilote de conception pour modifier la toile (« rendre 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.

Importation de Brand Kit

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 et présence

Nommez les versions importantes (« Lancement candidat »), restaurez-les et recevez un avertissement lorsqu &apos; un collègue modifie la même campagne.

Bande de dispositifs et règles

Voir le bureau, la tablette et le mobile côte à côte dans une vue; basculer les règles de pixel pour un placement précis.

Page et canaux hébergés

Chaque campagne peut aussi être une page hébergée autonome pour les bios et les codes QR, un envoi d &apos; e-mails pour capter des prospects ou un brouillon web poussé en un clic.

Sécurité de l &apos; entreprise

Publier des fenêtres de gel (périodes de gel des modifications), un commutateur d &apos; urgence pour tout mettre en pause, les approbations, la piste d &quot; &quot.

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 &apos; est fait.

Les visiteurs verront-ils la même fenêtre à plusieurs reprises?+

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?+

La publication, la mise en pause, l &apos; archivage et le retour à l &quot; &quot. sont limités aux propriétaires d &apos. espaces de travail et aux administrateurs complets. Tout membre de l &amp; equipe peut créer et concevoir des brouillons.

Croissance & SEO

Concepteur de promotion

Promotion Designer est un éditeur de blocs réactif pour la création, l &apos; examen, le contrôle des versions et la publication d &apos.

Ecran du produit
Concepteur de promotionLe concepteur combine une toile en direct, des aperçus d &apos; appareils, des blocs, variables de personnalisation, commentaires et historique des versions.Concepteur de promotionespace de travailVIEWPORTBureauVersionv12ETATBrouillonVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTBloc hérosTitre, médias et CTAÉditerBloc d &apos; offreRéduction et délaiÉditerPersonnalisationVariables de contact et de campagnePrêtLancement de la vérificationCommentaires et validationRévision1BUILD BLOCKSModifier la mise en page active2APERÇUBureau, tablette, mobile3PUBLISHVersion
Le concepteur combine une toile en direct, des aperçus d &apos; appareils, des blocs, variables de personnalisation, commentaires et historique des versions.

Utilisez des blocs pour composer l &apos; expérience, prévisualiser chaque fenêtre prise en charge et insérer les variables de personnalisation approuvées. Examinez les commentaires et la provenance des médias d &apos); 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.

Ecran du produit
Modèles de promotionLa galerie de modèles filtre les mises en page premium et applique les couleurs de marque d &apos; espace de travail lorsqu &apos.Modèles de promotionespace de travailCATÉGORIEConversionRESULTS24GRANDEAppliquéVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTQuitter l &apos; offreModal avec urgence et CTAAperçuBienvenue au nouveau visiteurBannière et liste des avantagesAperçuLancement du produitHéros, preuve et compte à reboursAperçuDemande de commentairesInvite de sondage compacteAperçu1FILTERCatégorie et recherche2APERÇUInspecter 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 &apos; espace de travail lorsqu &apos.

Recherche ou filtre par catégorie, charge des résultats supplémentaires, prévisualise l &apos; expérience complète, puis choisit Utiliser un modèle. La nouvelle campagne reste un brouillon et peut être modifiée dans Promotion Designer avant publication.

Croissance & SEO

Analyse de la promotion

L &apos; analyse promotionnelle relie les impressions et les clics aux conversions, au contexte de l &apos. audience, aux résultats des actions connexes et à l &quot; &quot. apprentissage de la campagne.

Ecran du produit
Analyse de la promotionL &apos; analyse des promotions montre la performance des titres, l &apos.Analyse de la promotionespace de travailIMPRESSIONS42.8kCTR6.4%CONVERSIONS814VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTPaysRoyaume-Uni · 31%DécompositionPage/pricing · 22%DécompositionDéclencheurTentative de sortie · 44%DécompositionAction de connecteurCoupon créé · 97% successRésultat1MESURESImpressions à la conversion2SLICEPage, pays, dispositif3LEARNAppliquer la connaissance
L &apos; analyse des promotions montre la performance des titres, l &apos.

Les résultats sont ventilés par pays, page, déclencheur et appareil. Exportez les prospects capturés si nécessaire. Les résultat de l ' action du connecteur indiquent si le suivi promis pour la promotion a été effectivement effectué.

Croissance & SEO

Annonces

Les annonces publient un message dans la zone de notification du widget avec des options de ciblage, de planification et d &apos; appel à l &apos.

Ecran du produit
AnnoncesL &apos; éditeur d &apos, annonces comprend le contenu, l &apos. appel à l &quot; &quot, audience, segment, règle de page, dates actives et style visuel.Annoncesespace de travailActif3AUDIENCESegmentCALENDRIERJuil 22–29VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTTitreMaintenance planifiéePrêtContenuMessage MarkdownPrêtCTALire la mise à jourFacultatifRèglePages de prix · clients actifsCible1WRITETitre et Markdown2CIBLEPublic, segment, page3CALENDRIERFenêtre active
L &apos; éditeur d &apos, annonces comprend le contenu, l &apos. appel à l &quot; &quot, audience, segment, règle de page, dates actives et style visuel.

Choisissez tous les visiteurs, les visiteur connectés ou les nouveaux visiteurs; vous pouvez éventuellement restreindre l &apos; audience avec un segment de contact et une règle de page. Définissez des dates actives à partir/jusqu &apos); actif-à et un drapeau actif. Les préréglages de style Premium et les couleurs changent la présentation mais ne remplacent pas le contenu clair.

Croissance & SEO

Campagnes push

Les campagnes push envoient des notifications de navigateur aux visiteurs abonnés après qu &apos; ils aient quitté le site.

Ecran du produit
Campagnes pushLe compositeur de push affiche la portée d &apos; abonnement, le contenu, les médias, les actions, les règles cibles et l &apos. état du programme.Campagnes pushespace de travailSUBSCRIBERS8,214ENVOYÉ31.6kCLICK RATE5.8%VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTTitreVotre panier vous attendPrêtCorpsRetournez aujourd &apos; hui pour une livraison gratuitePrêtCTAOuvrir le panierPrêtPlanificationEnvoyer maintenant ou planifiéBrouillon1PREPARE PUSHTitre, corps, icône2CIBLEPublic, segment, page3SENDMaintenant, programmer ou brouillon
Le compositeur de push affiche la portée d &apos; abonnement, le contenu, les médias, les actions, les règles cibles et l &apos. état du programme.

Configurez d &apos; abord les clés Web Push dans les paramètres de Web Push. Une campagne peut inclure un titre, le corps, une icône, une image du héros, un badge, un appel à l &apos); action et jusqu &apos: à deux boutons d &quot; &quot.

Cibler par audience, segment de contact facultatif et règle de page. Enregistrer un brouillon, le planifier ou l &apos; envoyer immédiatement. Utiliser les métriques d &apos); abonnement et clic pour juger la portée. HTTPS et un service worker correctement hébergé sont requis sur les sites tiers incorporés; voir Web Push sur les Sites tiers.

Croissance & SEO

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
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.Messages proactifsespace de travail1 ActionMessage de clavardageBannièreVisitePousserE-mail2 Conditionspage = /pricingtemps sur la page > 20sretour3 FréquenceUne fois par sessionStatut1ActionChat, bannière, e-mail, push...2CONDITIONSPage, temps, score, retour3FRÉQUENCETemps de recharge par visiteur
Chaque règle proactive est composée de trois choix : ce qui se passe (chat, bannière, visite guidée, push, courriel, webhook), quand (conditions) et à quelle fréquence (relâchement).

Les trois parties d &apos; une règle

1
Ce qui devrait se passer (action)

Afficher une bulle de chat ou une bannière sur la page, démarrer un tour guidé, envoyer un web push ou un e-mail, assigner à un département, ou déclencher un webhook. {{visitor_name}} et {{page_title}} deviennent 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
À quelle 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 &apos; il va brûler pour tout le monde?+

Ajoutez au moins une condition (page, lead score, retour…) pour cibler les bons visiteurs.

Comment cela se rapporte-t-il aux flux et aux circuits?+

Ils fonctionnent ensemble : une règle proactive peut déclencher un tour guidé, et un flux de chatbot peut être décLENCHE par une règle Proactive. Commencez avec une seule règle de messagerie instantanée, puis superposez les autres.

Croissance & SEO

Le chatbot s &apos; écoule

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
Le chatbot s &apos; écouleUne 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.SalutationBonjour! Comment puis-je vous aider?Suivre ma commandeQuestion de facturationParlez à un humain.Recherchez l &apos; ordre→ Agent humainDéclencheurs : Salutation · Mot-clé · Manuel · Après les détails · Fin du chat
Le chatbot s &apos; écoule

Flux par rapport à l'IA · quand utiliser

Utilisez 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 &apos; 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 &apos; exécute comme message d &apos. ouverture lorsqu &apos, un visiteur ouvre le chat pour la première fois.

Mot-clé

S &apos; 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 délai

Démarre une fois que les coordonnées du contact sont partagées, ou à un moment donné de la conversation.

À la fin du chat / Proactif

S &apos; 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éez un flux

Cliquez sur Nouveau flux, donnez-lui un nom, choisissez un type de déclencheur (et des mots clés si Mot clé), enregistrez. Il commence à être désactivé.

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 &apos; étape suivante. Terminer les chemins en résolvant, en remettant à l &quot; &quot); IA ou en transférant à un humain.

4
Activez-le

Cliquez sur Activer. Le flux est immédiatement actif dans votre widget. Désactivez-le à tout moment sans perdre le design.

Les flux remplacent-ils l &apos; 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 &apos; intégration ou une nouvelle fonctionnalité. Elles sont entièrement thématiques et construites dans un concepteur visuel avec un aperçu en direct. Une visite ne s &apos); exécute que lorsqu &apos.

Comment ça fonctionne
Visites guidéesUne page grisée avec un anneau de projecteurs autour d &apos; un bouton Ajouter une offre et une bulle thématique lisant Étape. 1 de 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-elle construite?

Étapes

Chaque étape cible un élément et affiche une bulle avec votre texte. Ajoutez autant d &apos; arrêts que nécessaire pour la visite guidée, puis ordonnez-les.

Préréglages du & 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 afin que la visite démarre automatiquement lorsque cette règle est activée (par exemple, lors de la première visite du tableau de bord d ' un visiteur récurrent).

Activer le basculement

Une visite ne peut être exécutée que si Active est coché. Décochez-la pour la supprimer sans la suppression.

Construisez-en un en quatre étapes.

1
Nouvelle visite guidée

Cliquez sur Nouvelle visite guidée, donnez-lui un nom et éventuellement liez une règle proactive pour qu &apos; elle démarre automatiquement.

2
Ajouter des étapes

Ajouter chaque arrêt : choisissez l &apos; élément auquel il pointe et écrivez le texte de la bulle. Réorganiser jusqu &apos, à ce que le chemin coule.

3
Concevez-le

Choisissez un paramètre prédéfini ou stylez vous-même la bulle. L &apos; 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 commencent les visites?+

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 &apos; objectifs : un évènement webhook payment. succeeded devient une conversion enregistrée « achat » d &quot; &quot, d &lt; valeur de $49&gt;, attribuée à sa source et à sa campagne, avec des jetons prédéfinis pour le démarrage rapide ci-dessus.Démarrage rapideAchat StripeDémo réservéeInscription à la newsletterpayment.succeededwebhook entrantConversion"achat" · $49Attribuésource · campagne
Objectifs de conversion

Définissez un objectif en trois étapes.

1
Choisissez l &apos; activité déclencheuse

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é, inscription) et éventuellement une valeur fixe et une fenêtre d &apos; attribution.

3
Enregistrer

Enregistrer et activer. À partir de là, chaque fois que l &apos; activité se déclenche, OpsIQ enregistre une conversion par rapport au contact avec attribution aux touches précédentes.

Les objectifs sont déjà câblés dans les webhooks entrants : tout objectif dont le déclencheur correspond au type d ' un événement entrant se déclencha automatiquement au moment où l '. Utilisez la page Webhooks arrivants pour connecter Stripe, Calendly ou n ', autre système capable de POSTER JSON.
Qu &apos; est-ce qu &apos, une 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 de créer votre propre vue des mesures qui comptent, au lieu de vous fier uniquement à l &apos; aperçu standard. Ajoutez les widgets que vous souhaitez, faites-les glisser et redimensionnez-les dans la disposition souhaitée, 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 KPI et des tuiles de widgets graphiques, une zone de dépôt en pointillés, et un bouton Ajouter-widget.Tableaux de bord personnalisésespace de travailMon tableau de bord+ Ajouter un widgetVISITES2,481REVENUS$8.2kTRAFICFaites glisser le widget iciPage d &apos; accueil/pricing/docs/signup1ADD WIDGETSChoisir les métriques et les graphiques2ARRANGEFaites glisser et redimensionnez3PARTAGEAvec votre équipe
Créez votre propre tableau de bord : ajoutez des KPI, des widgets de diagramme et de liste, faites-les glisser et redimensionnez-les dans la disposition souhaitée, puis partagez-le avec l &apos; équipe.

Construisez-en un en trois étapes.

1
Ajouter un widget

Cliquez sur Ajouter un widget et choisissez la mesure ou le graphique que vous souhaitez suivre. Répétez pour tout ce que vous voulez sur le 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 regarde 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

L &apos; outreach est OpsIQ's1:1Moteur d &apos; envoi de courriers électroniques personnalisés et en vrac : composez un message personnalisé ou lancez une campagne à l &apos, adresse d &quot; un segment CRM, avec détection des réponses, contrôle du temps d &amp; eacute;chantillonnage, suivi des ouvertures/clics, pixel de traçage et désabonnement en un clic.

Sensibilisation
Campagnes de sensibilisationL &apos; écran Outreach avec les onglets Composer/Campaigns/Templates/Replies et un tableau de campagne indiquant le taux d &apos.Sensibilisationespace de travailCampagnesCompositeurModèlesRéponsesCAMPAGNEENVOYÉOUVERTRépondreBulletin de juin1,20048%7%Suivi du 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 de diffusion : envoyer1:1ou exécutez des campagnes pour un segment, suivez les ouvertures et les réponses, et restez conforme avec la désinscription intégrée et la détection de réponse.

Les quatre onglets

Compositeur

Écrivez un message personnalisé.1:1envoyer un courriel avec {tokens} du contact et du CRM.

Campagnes

Envoyer à un segment CRM, planifié ou immédiatement, avec des plafonds et le contrôle de l &apos; heure d &apos.

Modèles

Modèles de messages réutilisables pour des campagnes répétées.

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 une campagne se déroule-t-elle?

1
Choisissez un public

Choisissez un segment CRM (ou téléchargez une liste). La suppression et le consentement sont appliqués automatiquement.

2
Composez

Rédiger le message avec des jetons de personnalisation; prévisualiser contre un vrai contact.

3
Planifier et envoyer

Envoyer maintenant ou au meilleur moment. Un fichier de pixels de suivi s &apos; ouvre ; les clics et 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 &apos; écran des rapports planifiés : un tableau des rapport avec leur calendrier, les destinataires et l &apos. date de dernier envoi, plus le bouton Enregistrer le rapport.Rapports planifiésespace de travailvisualHtml+ Sauvegarder le rapportRAPPORTCALENDRIERDestinatairesDERNIÈRE ENVOYÉETrafic hebdomadaireMon9:00[email protected]2 joursRapport client SEOMensuel[email protected]Juin 1Résumé des ventesQuotidien[email protected]todayLivré sous marque blanche. PDF via le OpsIQ chron1AUTOMATEDQuotidien · hebdomadaire · mensuel2LABEL BLANCPDF aux clients3DestinatairesEnvoyé par courriel selon 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.

Configurer un rapport

1
Choisissez ce que vous voulez envoyer

Choisissez le jeu métrique (trafic, SEO, ventes, support...) et une plage de dates.

2
Définir les & destinataires de la planification

Tous les jours, chaque semaine ou chaque mois, à l &apos; 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 &apos; écran Vie privée et conformité : onglets pour le registre des consentements, le journal d &apos. accès, la résidence et DPA, avec un tableau du registre de consentement des accords et des révocation par canal.Confidentialité et conformitéespace de travailRegistre de consentementJournal d &apos; accèsRésidenceDPAContactCANALActionDATE[email protected]courrielAccordéJuin 12[email protected]pushRévoquéJuin 10[email protected]marketingAccordéJuin 9Preuve consultable de chaque accord et révocation de consentement, par canal1ESSAI DE DÉLAISPreuve de chaque subvention2ACCESS LOGQui a touché aux données?3DPAModèle imprimable
Un écran prêt pour l &apos; auditeur : un registre de consentement consultable (accords/révocation par canal), un journal d &apos, accès indiquant qui a touché les données, des 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 &apos; 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 et maintien

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 des données et DPO.

Modèle DPA

Un Addendum de traitement des données imprimable qui remplit 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 la 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
ConnecteursOpsIQ noyau connecté à. WHMCS, Shopify, Stripe WooCommerce, SendGrid et Google Business Profile, chacun affichant un statut de connexion.WHMCSShopifyStripeWooCommerceSendGridGoogle BPOpsIQCORE1PLUG IN25+ connecteurs prédéfinis2AI CONTEXTDonnées de la plateforme réelle3ACTIONSTerminé 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 de l &apos; 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

Le commerce électronique classique: commandes, clients, produits.

Hôtel Bottle

Pont

Un site d'hôtel Bottle CMS à travers la signatureOpsIQLa mise en œuvre de la référence pour une plate-forme sansAPI.

Zendesk

Soutien

Helpdesk : tickets, utilisateurs, organisations, commentaires.

Profil d &apos; entreprise Google

Commercialisation

Entreprises locales : avis, publications, questions et réponses, informations. Utilise OAuth.

Calendrier Google

Productivité

Calendriers et événements. Utilisations OAuth.

GmailetIMAP

E-mail

Boîtes aux lettres : courrier entrant et sortant, synchro-book.

SendGrid

E-mail

Envoi de courriels : envoyez des courriels et gérez des modèles.

Paramétrage

E-mail

Envoi de courriels : envoyer des courriel via Mailgun.

Slack, Télégramme, 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.

DocuSignSerpApi,. 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.

Installer un connecteur

1
Accéder aux connecteurs

Accédez à Connecteurs dans la barre d &apos; administration.

2
Trouver le connecteur

Parcourir la liste ou effectuer une recherche. Les connecteurs sont regroupés par catégories.

3
Activez-le

Cliquez sur le connecteur et activez/désactivez Activer.

4
Entrez les informations d &apos; identification

Veuillez remplir les champs requis : API clé, URL, jetons, etc. Chaque connecteur a des exigences spécifiques documentées dans son panneau de paramètres.

5
Test de connexion

Cliquez sur « Test de connexion ». Un résultat vert signifie que le connecteur peut atteindre la plateforme externe. Un rouge indique l &apos; erreur.

6
Configurer les fonctionnalités

Choisissez les fonctionnalités à activer : synchronisation des connaissances, synchronization webhook, actions IA. Tous les connecteurs ne supportent pas toutes les fonctions.

Ce que les connecteurs vous donnent

Contexte de l &apos; IA

L &apos; IA peut consulter les données des clients, les commandes, les abonnements et plus encore par le biais du connecteur. Lorsqu &apos); un client discute, l &apos, IA dispose de données réelles sur la plateforme pour se référer.

Contexte IA (auteurs du connecteur)

Le ContextProvider de votre connecteur fournit à l ' IA-ticket un résumé en lecture seule du compte du propriétaire du ticket. 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 &apos; expéditeur du ticket vérifié). /context/customer-by-email C ' est ce qui fait que l ', IA cite un solde/facture réel au lieu de dire « s '. v. p. vous connecter ».customer_sections, customer_allow_credit) et rester strictement en lecture seule, ne jamais émettre de secrets.

Répertoire client (auteurs du connecteur)

L ' IdentityProvider de votre connecteur alimente trois recherches universelles de tickets : lookupCustomerById() (carte client), lookupCustomerServices() (tableau produit/service), 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 distante : 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)

Quand un courriel entrant devient un ticket natif, OpsIQ détecte l &apos; expéditeur en appelant lookupCustomerById(0, ['email'=>$sender]) sur chaque connecteur; la première correspondance « possède » le client et son platform La limace est estampillée sur le ticket.created événement comme _pipe_owner_platform (vide = invité).WHMCS-l &apos; e-mail du client ouvre un ticket dans :WHMCS (WHMCS numérotation, en miroir comme un), tandis qu &apos; un expéditeur inconnu reste un invité natif. Si votre connecteur reflète 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.

Connaissance

Les connecteurs contribuent à l &apos; IA avec des articles de connaissances propres à la plateforme. Shopify connecteur ajoute le dépannage du commerce électronique; WHMCS connecteur ajoute des connaissances d &apos; 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 bloc settings.json (type kb_source) et votre connecteur apparaît dans l ' éditeur du Centre d '. Importer KB → Importer à partir d &apos; 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 &apos; 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 trace du connecteur (slug). Pour prendre en charge une nouvelle plate-forme, ajoutez un opsiq_kb_<platform>_manifest() et faites-y référence par son nom. Référence complète connectors/PLATFORM_CONNECTORS.md §5.

Webhooks

Certains connecteurs enregistrent des webhooks avec la plateforme externe pour les notifications d &apos; é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 sur le chiffre d &apos; affaires dans le tableau de bord des ventes pour l &apos. attribution et analyse.

💡
Les connecteurs ont une portée d &apos; espace de travail. Chaque espace peut avoir différents connecteurs activés avec différentes informations d &quot; &quot,.WHMCS espace de travail utilise le.WHMCS connecteur; un Shopify espace de travail utilise le.Shopify connecteur.
Puis-je utiliser plusieurs connecteurs en même temps?+

Oui. Vous pouvez avoir Shopify pour les commandes et Stripe pour les paiements dans le même espace de travail. L &apos; IA fusionne les données de tous les connecteurs activés.

Que faire si ma plateforme n &apos; est pas répertoriée?+

Utilisez le Connector Builder pour créer un connecteur personnalisé pour n &apos; 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 auto-hébergé?+

Oui. Les connecteurs fonctionnent de la même manière dans les éditions cloud et auto-hébergées.

Connecteurs

Contrat de connexion pour les ventes et la facturation

Chaque connecteur de commerce utilise le même contrat d &apos; événements neutre par rapport à la plate-forme. WHMCS est l &apos, implémentation de référence, mais SaaS Bridge, 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 de commerce doit publier

Un seul registre 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 plateforme est le log de registre du connecteur, tel que. whmcs, shopify ou opsiq_saas. traffic_source contient une attribution d &apos; acquisition vérifiée si elle est fournie, sinon utiliser le même slug que la solution de secours. Stocker les identifiants, pas afficher les étiquettes. OpsIQ résout le nom du connecteur convivial dans l &apos; interface utilisateur.

Idempotence

event_id doit être déterministe. Map 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 &apos; instance du produit ou du service affecté lorsqu &apos); il existe.

Horodatage source

occurred_at est l &apos; heure du paiement ou de l &quot; &quot.

Monnaie et devises

Envoyer le montant source et une devise ISO valide à trois lettres. Si le paramètre du connecteur active la conversion OpsIQ FX, les rapports sont convertis dans la devise de l &apos; 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 devis ou un taux de change.

Un cycle de vie basé sur des preuves.

Utilisez nouveau, renouvellement, mise à niveau, remboursement, crédit ou inconnu. Classez par raison de facturation, abonnement ou relation de service, type d &apos; élément en ligne ou autre champ faisant autorité. Un achat répété par le même client n &apos); s pas automatiquement un renouvellement.

Limite de vente

Les remboursements sont signalés par l &apos; analyse des remboursés et du chiffre d &apos, économies nettes. Le crédit de compte, les recharges 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 commande ou revenus de vente.

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

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 &apos; historique de facturation sous-jacent.

Bordure de plate-forme distante

Un connecteur distant lit sa plateforme via le API authentifié configuré. Il ne doit jamais dépendre des tables de base de données du même serveur. La clé site_key exacte authentifiée par domaine est fournie par ConnectorRegistry et doit être appliquée à chaque écriture et remplissage de registre. L &apos; espace de travail ou la portée d &apos, un groupe n &apos: s &apos. agrégation en lecture seulement; il ne doit pas élargir la propriété des événements stockés.

Exemple canonique d &apos; événement payant

Événement de commerce 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"
}

Connecteur Builder

Lorsque la fonctionnalité Ventes et facturation est activée dans le générateur de connecteurs, mapper le montant, la devise, l &apos; état source et la date source, ainsi qu &apos. au moins une commande, une facture ou une référence d &apos: abonnement. Mapper 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 les connecteur de marché.

⚠️
Les crédits et les fonds d &apos; ajout sont intentionnellement conservés pour l &apos. historique de facturation, le contexte du solde client et l &quot; &quot. analyse du grand livre. Exclure ces éléments des ventes ne les supprime pas, mais empêche seulement qu &apos: 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 brut de vente et de remboursement cesse d'être séparable — et le taux de remboursement 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 d'audit

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.
💡
Des références détaillées de paquets restent disponibles dans connectors/CONNECTOR_EVENTS. md et connectors /PLATFORM_CONNECtors. md dans les distributions sources auto-hébergées.
Connecteurs

Contrat d &apos; événement de voyage

Journey Intelligence accepte une enveloppe d &apos; événements 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 Connector Builder.

Isolation et limite de confiance

Clé de domaine pair exacte

Chaque événement est lié à la clé site_key du domaine authentifiée. Un connecteur doit prendre cette clé de ConnectorRegistry ou de son point d &apos; arrivée authentivisé, jamais d &quot; &quot); un corps de requête non approuvé. Les domaines conservent des enregistrements séparés; un groupe de domaine n &apos. est qu &apos:

Identité impuissante

event_id est requis pour les connecteurs et doit être déterministe pour le même événement natif. Les réessais, les webhooks et les remplissages de mémoire mettent à jour un évéement plutôt que de dupliquer un parcours ou une vente.

Nom natif et canonique

Conserver source_event_name pour les preuves et le dépannage, puis le mapper à event_name_canonical. L &apos; analyse de base ne doit jamais se brancher sur un slug connecteur.

La preuve du serveur l &apos; emporte.

L &apos; observation du navigateur peut démarrer ou inférer un parcours. Les événements de connecteur authentifiés confirment l &apos, inscription, connexion, paiement, achat, renouvellement, remboursement et autres résultats terminaux. Un jeton de corrélation lié au site valide est la jointure la plus forte; un jeton invalide est rejeté et ses ID incorporés ne sont pas approuvés.

Confidentialité

Envoyer uniquement les identifiants et champs nécessaires pour le voyage déclaré. Respecter les paramètres de consentement, de masquage et de conservation. Ne jamais placer d &apos; informations d &quot; &quot); accès, données de carte, secrets d &amp; authentification ou corps privés de message dans les propriétés.

Enveloppe canonique

Enveloppe d &apos; é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

Utilisez le nom le plus fidèle possible. Les familles prises en charge incluent les événements de page d &apos; engagement/CTA, l &apos); inscription au compte, connexion, MFA et réinitialisation du mot de passe, étapes de prospection et de formulaire, produit, panier, paiement, achat, souscription, renouvellement et remboursement, impressions et conversions de promotion, évéments de centre d &quot; &quot, chat et tickets, activités de sécurité et activité personnalisée dans un espace 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 des parcours des visiteurs. Ces preuves restent explicitement classées comme observées ou inférées. Un connecteur ajoute une confirmation faisant autorité du serveur et peut la corréler à la même tentative de navigateur. L &apos; abandon est d &apos); abord stocké comme un candidat; il devient abandonné seulement après la fenêtre d &quot; &quot: inactivité définie dans l &apos. interface utilisateur et seulement quand aucune récupération ultérieure ou succès n &apos, existe.

Attribution et revenus

L &apos; attribution privilégie un jeton de corrélation signé valide, puis une référence exacte au parcours, à la tentative, à l &apos. session ou au commerce, puis le graphique d &apos: identité acceptée et enfin une correspondance comportementale limitée. Les ventes non associées restent sans attribution. Les pondérations du grand livre multi-touch doivent totaliser 1. Le revenu attribué par Site Intelligence lit ce grand livre; les crédits, les rechargements de portefeuille, les réapprovisionnements en jetons et les ajouts de fonds ne sont jamais des conversions d &quot; &quot); achat.

⚠️
Le modèle d &apos; attribution, les fenêtres de rétroaction, la gestion du trafic direct, le niveau minimum de confiance, le délai d &quot; &quot. abandonment et les définitions des entonnoirs sont des politiques relatives à l &apos. interface utilisateur.

Connecteur manifeste et constructeur

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"
    }
  }]
}

Déclarer uniquement les capacités que le package fournit réellement. Connector Builder valide la cartographie et génère le même adaptateur neutre par rapport à la plateforme utilisé par les paquets de première partie. L &apos; ingestion du voyage accepte un événement ou un lot limité de 100 via le point d &apos, &quot; &quot, &apos.

💡
Le pont commerce-à-voyage publie les résultats confirmés par le serveur et réconcilie l &apos; attribution après la mise à niveau du grand livre idempotent existant, de sorte qu &apos. un paiement ne devient jamais deux ventes.
Connecteurs

Comment fonctionnent les actions de l &apos; IA

Chaque connecteur déclare un ensemble d &apos; actions : des choses que l &apos,IA peut faire à travers la plate-forme externe. Les actions sont le pont entre ce que dit l &quot; &quot,IA et ce qu &apos. AI fait. &quot.

Les actions de l &apos; IA
Comment fonctionnent les actions de l &apos; IAUne demande client mappée à une carte d &apos; action de type suppression, puis une liste de contrôle : autorisation vérifiée, vous confirmez, API appelé.Comment fonctionnent les actions de l &apos; IAespace de travail"Annuler mon abonnement"clientIAcancel_subscriptiondeleteconfirmer requisparams: subscription_id (à partir du contexte)TYPES D &apos; ACTIONreadécriredeletePermission & rôle vérifiéVous confirmez l &apos; action.API appelé · résultat signalé1DECLAREDChaque connecteur liste les actions2GATEDPermission + confirmer3THEN RUNAPI appel, résultat retourné
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 d &apos; une action

1
Le client demande quelque chose.

« Annuler mon abonnement ». L &apos; IA identifie que cela nécessite l &apos, action « annuler_abonnement ».

2
L &apos; IA vérifie les autorisations.

Cette action est-elle autorisée? Est-elle activée. L &apos; utilisateur actuel a-t-il le bon rôle?

3
L &apos; IA rassemble des paramètres.

L &apos; action nécessite un identifiant d &apos, abonnement. L &quot; &quot: IA le recherche dans le contexte du client ou demande au client.

4
Confirmation

Pour les actions destructrices ou à fort impact, l &apos; IA demande confirmation avant d &apos.

5
Exécution

L &apos; action appelle la plateforme externe API.

6
Résultat

L &apos; IA rapporte le résultat au client.

Types d &apos; action

Lire les actions

Recherche des données sans rien changer. Exemples : list_orders, 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

Supprimer 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.

Balises 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 de code

Implémenté en PHP dans la classe connecteur. Contrôle total sur la logique.

Exemple de définition d &apos; 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 &apos; importe quelle plateforme avec une interface REST API. Aucun code requis pour les connecteurs basiques.

Construisez un connecteur
Constructeur de connecteursUn formulaire de connecteur sans code: nom, type d &apos; authentification, base URL, un mappage d &quot; &quot. 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_clientsLe test a réussiConnecteur de paquet1NO-CODENom, auth, base URL2ANY APIClé, porteur, basique, 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 connecteur peut exposer séparément Native API Read and Native API Écrire des actions. Les actions sélectionnées restent préférées; les actions natives couvrent les points de terminaison du fournisseur ajoutés plus tard. Le runtime prend en charge REST, GraphQL, JSON, forme, XML, corps bruts et multipartites, pagination limitée,API-version headers and idempotency while keeping credentials inside the workspace connector settings.

⚠️
Les paquets Marketplace proviennent de/marketplace_connectorsainsi qu'en paquets/connectors.Augmenter la version du paquet, régénérer le contrat et la documentation, exécuter des tests de conformité, puis resigner et publier la nouvelle version Marketplace.

Assistant de création de connecteur

L &apos; assistant comporte six étapes, représentées par des onglets en haut. Vous pouvez sauter librement entre elles et Enregistrer le brouillon 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 &apos; authentification utilisé par la plateforme et remplissez les champs correspondants. Entrez également ici vos identifiants de test : ils seront utilisés pour tester la connexion à l &apos, étape suivante, et ne seront pas stockés après votre 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 de point final, 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

Mapper les évènements webhook que votre plateforme envoie.OpsIQ événements, de sorte que les choses qui se passent sur votre plate-forme peuvent commencer à fonctionner dans OpsIQ.

6
Réviser, signer des contrats et publier

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.

💡
L &apos; assistant ne comporte pas d &apos. un étape de création des connaissances. Un fichier de connaissance décrivant votre plateforme est généré pour vous à partir du nom, de la description, du type d &quot; &quot); auth &quot: &quot, et des actions que vous avez définies, et il est chargé dans l &apos, IA lorsque le connecteur est activé.

Définir une action (étape 4)

Chaque action a les paramètres suivants. Seuls les quatre premiers sont requis ; le reste contrôle qui peut l &apos; exécuter et avec quel soin.

Taste et étiquette d &apos; action

La clé est ce que l &apos; IA appelle, et l &quot; &quot. l &amp; #160; étiquette est ce qu &apos); un humain lit. Les clés sont automatiquement associées à votre lien de connexion, donc deux connecteurs peuvent avoir tous les deux une liste d &apos.

Méthode HTTP

GET, POST, PUT, PATCH ou DELETE.

Chemin URL

Ajouté à 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.

Mapping de réponse

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 &apos; utiliser?

Votre équipe (IA d &apos; administration), les clients connectés (chat client), les deux, ou l &apos. Les actions du client ne s &apos, exécutent que pour le client connecté et les champs d &quot; &quot, identité sont verrouillés automatiquement afin qu &apos: un client ne puisse pas poser de questions sur un autre.

Nécessite confirmation

Un humain doit approuver avant que l &apos; action ne s &apos..

Destructif.

Marque l &apos; action comme supprimant ou modifiant son état. Utilisé pour avertir avant de l &quot; &quot, exécuter.

Autorisation 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 / Astuce IA

Facultatif, mais il vaut la peine d &apos; être écrit. Il indique à l &apos); IA quand utiliser cette action, par exemple « Utiliser lorsque l &quot; &quot: admin demande de changer une étape du règlement ». Un bon indice est la différence entre une action que l &amp; AI utilise correctement et celle qu &apos.

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

Facultatif. Pour les points de fin qui renvoient une liste, le chemin pointillé vers le tableau, par exemple data ou data. items

Chemin d &apos; 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.

Lancez-le

Chaque action peut être exécutée contre le API en direct à partir de cette étape, afin que vous puissiez corriger un mauvais chemin ou nom de champ avant que quelqu &apos; un d &apos.

⚠️
Les actions d &apos; écriture sont protégées par défaut. Toute action utilisant POST, PUT, PATCH ou DELETE nécessite au départ l &apos); la permission manage_integrations 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 &apos; un client peut déclencher qui change également d &apos); &apos.

Réception de webhooks (étape 5)

L &apos; étape Triggers vous donne un webhook URL pour vous inscrire sur votre plateforme, et vérifie chaque requête qui lui parvient.

En-tête de signature

L &apos; 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.

Schéma 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

Facultatif. Certaines plateformes préfixent le résumé, par exemple sha256=. Laissez-le vide si la vôtre ne l &apos; est pas.

Mappage des événements

Mapper chaque événement que votre plateforme envoie sur l &apos; évéement OpsIQ qu &apos.

Enregistrement automatique du webhook

Si votre plateforme a unAPIpour gérer ses propres webhooks, vous n'avez pas à enregistrer leURLà la main. Enregistrer automatiquement ce webhook à l &apos; activation et pointez-le sur deux des actions que vous avez définies à l &apos; étape 4:

Action Créer-webhook

Appelé quand un administrateur active le connecteur. 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 ' id du nouveau webhook.

Action Delete-webhook

Appelé lorsque le connecteur est désactivé, en utilisant l &apos; identifiant ci-dessus. La désactiver arrête donc également votre plateforme d &apos); 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 en cours d &apos; exécution.

Actions

Les opérations que l &apos; IA peut exécuter sur votre plateforme : liste des commandes, recherche d &apos. un client, émission d &quot; un remboursement.

Déclencheurs

Recevoir des webhooks de votre plateforme et les transformer en événements OpsIQ.

Billets d &apos; IA

Triage par IA et co-pilote de réponse sur les tickets qui restent sur votre plateforme. Choisissez le point final qui renvoie un ticket avec ses réponses et mappez les champs ; OpsIQ lit le fil à travers lui.

Boîte aux lettres et contacts

Affichez le courrier d &apos; un client sur sa chronologie, envoyez-le à partir d &quot; &quot. et synchronisez votre carnet d &amp; #160; adresses dans le CRM de OpsIQ.

Importation de clients

Parcourez votre liste de clients et importez-les en tant que contacts OpsIQ. C &apos; est ce que fait le bouton Importer.

Contexte

Insérez les données en direct de votre plateforme dans chaque conversation d &apos; 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 entrants

Transformez les tickets et e-mails que votre plateforme livre par webhook en OpsIQ support threads.

Réponse sortante

Le staff de OpsIQ répond à la plateforme sur laquelle le fil a été créé.

Synchroniser les utilisateurs

Importer vos comptes personnels dans les utilisateurs OpsIQ admin.

Synchroniser les départements

Importer 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 présentez vos produits réels dans une promotion.

Fournisseur de Survey Studio

Exposer les faits de l &apos; enquête vérifiés par le serveur, les variables échappées et les pages des destinataires CRM Outreach délimitées à travers un fichier SurveyProvider. php dédié.

Blocage natif IP

Quand OpsIQ blocs an IP, appelez le bloc propre à votre plate-forme. API Le blocus est donc appliqué là aussi.

Événements de sécurité

Reçoit bloqué-IPles signaux de menace émis parOpsIQ.

La connaissance de la plateforme pour l &apos; IA

Chaque connecteur que vous construisez contient une courte référence décrivant ce qu &apos; est votre plateforme et ses actions. OpsIQ admin AI le lit chaque fois que votre connecteur est activé, donc il comprend votre plateforme plutôt que de simplement voir une liste des noms d &apos; actions. Cette action est générée pour vous.

API passe

Votre connecteur reçoit toujours un appel à but général afin que l &apos; IA puisse atteindre un point final pour lequel vous n &apos. utilisez pas d &apos, action tapé. Utilisez des actions tapé où possible; c &apos: est le hayon d &quot; &quot.

Référence du contrat de connecteur canonique 2.2

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.

locaux

Local search/location data. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

ceci

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 d &apos; affaires spécifiques à la plate-forme dans les points d &quot; extension &quot, le cycle de vie du paquet, les files d &amp; accueil, les travailleurs, les migrations et les tests de conformité restent gérés par le constructeur.

Paramètres de fiabilité pour chaque action

Réessayer

Nombre de fois pour réessayer un appel échoué, avec une mise en attente qui double chaque tentative. Seuls les délais d'attente, 429s et les erreurs 5xx sont réessayées; une erreur 4xx est la faute de votre demande et la répéter ne ferait que brûler votre limite de débit.

Limite de taux

Un plafond par minute pour cette action, afin qu &apos; un déclencheur occupé ne puisse pas marteler votre plateforme. Laissez-le à 0 pour aucune limite.

Temps limite

Combien de temps attendre votre plateforme avant d &apos; abandonner.

Confirmation

Exiger qu &apos; un humain approuve l &apos. action avant de l &quot; &quot, exécuter cette dernière. Utilisez-le pour tout ce qui est destructeur.

Types d &apos; 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.

clé API dans l &apos; en-tête

Une clé statique envoyée comme en-tête fixe, par exemple X-API-Key. Vous donnez le nom de l &apos; en-tème et la mention que doit afficher le formulaire administrateur. Ceci envoie la clé uniquement sous forme d &apos); si votre _API attend la cle comme paramètre de requête à la place, utilisez des en-têtes personnalisés ou un connecteur de code complet.

Jeton porteur

Token sent as Authorization: Bearer <token>. Common for modern APIs.

Authentification de base

Nom d &apos; utilisateur et mot de passe, encodés en base64 dans l &apos. Vous choisissez les étiquettes des deux champs affichés sur le formulaire d &quot; &quot.

Signé par HMAC

Une clé publique plus un secret, avec le corps de la requête signé. Vous fournissez l &apos; en-tête de signature, l &quot; &quot); en-tème de clé et l &amp; ; en - tête d &apos: horodatage attendu par votre plateforme.

OAuth 2.0 (informations d &apos; identification du client)

Serveur à serveur, sans interaction utilisateur et sans redirection. Vous donnez le jeton URL et une portée facultative; l &apos; administrateur fournit un identifiant client et un secret. Utilisez cette option lorsque votre plateforme émet des informations d &apos); authentication à une application plutôt qu &apos.

OAuth 2.0 (Bouton de connexion)

Le flux de code d'autorisation avec PKCE, pour Stripe, Shopify, Slack et des applications de style QuickBooks. Vous donnez l'autorisation URL, le jeton URL et la portée. Après publication, l'administrateur clique sur Connecter sur le connecteur, autorise sur votre plateforme, et OpsIQ stocke les jetons de rafraîchissement et d'accès à la menthe sur demande URI pour s'inscrire à votre OAuth app est affiché sur la page de paramètres du connecteur.

En-têtes personnalisés

Une forme libre. JSON pour tout ce que les modèles ci-dessus ne couvrent pas, par exemple {"X-API-Clé":"{api_key}","X-Tenant:"{tenant_id}"}. Chaque espace réservé devient un champ sur le formulaire d &apos; administration.

💡
PKCE s &apos; applique uniquement au flux du bouton Connecter. Le flux des informations d &apos, identification client n &apos: a pas de redirection et aucune étape utilisateur, donc PKCE ne s &quot; &quot, applique pas à lui.

Styles de pagination

Décalage

Utilise les paramètres offset et limit. Exemple :?offset=100&limit=50.

Page

Utilise le numéro de page. Exemple :?page=3par page=50.

Curseur

Utilise un jeton de curseur de la réponse précédente.

En-tête du lien

Utilise l &apos; 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.

Les tickets sont mis en miroir dans le système de ticket natif

Lorsque votre plateforme possède un ticket, reflétez-le dans OpsIQ à partir de votre connecteur en utilisant l ' assistant d '. ingestion des 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.deleted. Réponse automatique, escalade,SLA et CSAT tous accrocher les mêmes événements, donc vous les héritez 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 &apos; ouverture

Un billet est toujours pour le client, mais le message d &apos; ouverture peut être écrit par personnel: un agent qui ouvre un ticket pour le compte du client, ou qui s'adresse à lui de manière proactive. ticket.created 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 &apos; identifiant du personnel lorsque type_auteur=admin. Jamais l &apos, id client.

author_name

Nom d &apos; affichage de l &apos. agent ou département. 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 &apos; est pas cosmétique. Les consommateurs lisent. author_type Une ouverture écrite par le personnel est rapportée comme 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. Mapper le signal de votre plateforme sur celui-ci dans la normaliser, jamais dans les consommateurs.

Blocage centralisé

Quand un agent bloque un expéditeur, cela s &apos; 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 &apos; un client a été bloqué ici. Implémentez-le seulement si votre plate-forme peut exprimer quelque chose d &apos, é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)

Reçoit type (email|domaine|ip), valeur, raison, admin_id, expires_at, site_key. Renvoie [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 la réconciliation, de sorte que la dérive est signalée plutôt que découverte par un client. Retourne [résultat, bloqué?].

Valeurs de résultat

Très bien.

Appliqué sur votre plate-forme. Inclure remote_ref quand vous avez un identifiant qui mérite d &apos; être enregistré.

noop

Déjà dans l &apos; état demandé.

unsupported

Votre plateforme n &apos; a pas de concept équivalent.

échoué

Vous auriez pu le faire et vous être trompé. Incluez les détails ; ils se retrouvent dans la piste d &apos; audit.

Décliner est la bonne réponse. De nombreuses plateformes n ' ont pas de concept de « blocage de l ', expéditeur » et offrent uniquement la suspension du COMPTE, qui arrête la facturation, les connexions et les services plutôt que simplement le courrier d '. En associant « un agent a bloqué une adresse spam » à « fermer le compte de ce client », on pourrait mettre fin aux services d " ". unsupported et laissez-le tranquille.

Le refus couvre aussi le cas où la plateforme peut mais ne vous le laissera pas faire. Vérifiez API, pas une fonctionnalité: un levier qui n ' existe que dans l '. interface d ', administrateur 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.

courriel → 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 via le mot-clé suspend: dans la zone de texte de liste de blocage du Centre d &apos; administration et aucun API n &apos. écrit ce champ. La fonctionnalité existe, mais pas le levier.

ip → non pris en charge

Aucun bloc de niveau ticket IP n &apos; existe.

adresse inconnue → noop

Zendesk ne peut pas pré-suspendre une adresse qu &apos; il n &apos, a jamais vue. Rien ne faire n &quot; est pas un échec et 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 &apos; ê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 &apos); il refusera. detail un opérateur peut lire, battre l &apos; 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 quelque chose que vous n &apos; avez pas fait, cela indiquerait à un opérateur que le bloc a atteint votre plate-forme alors qu &apos. il n ’ a jamais quitté OpsIQ.

Règles

Le bloc local gagne toujours.

Il est écrit AVANT que vous soyez appelé et reste en place quoi que vous renvoyiez. Vous ne pouvez pas empêcher un opérateur de bloquer quelqu &apos; un.

Ne jamais jeter

Un lancement est traité comme non pris en charge et enregistré. Retour échoué avec un détail à la place afin que la raison survive.

Soyez idempotent.

Le même bloc peut être annoncé plus d &apos; une fois.

Retour rapide

Le déploiement est synchrone avec le clic de l &apos; opérateur. La file d &apos, attente ralentit les travaux plutôt que de maintenir la demande ouverte.

Ne pas rappeler

Ne jamais rebloquer dans OpsIQ depuis votre gestionnaire. Le registre ignore le connecteur d &apos; origine, mais un deuxième saut serait en boucle.

Chaque annonce est écrite pour 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

La main sur le coeur attachments array to create()/addReply(). Chaque élément porte le fichier sous l &apos; 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 un content_url Zendesk). Doit être https; passe une vérification SSRF / allowlist avant d &apos; ê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 &apos; événement.

Sortant (OpsIQ → votre plateforme). Lorsqu &apos; un agent joint un fichier, ticket.replied la charge utile vous donne les fichiers de réponse comme 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, non sérialisé); 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 distincte (un SaaS hébergé, un WHMCS distant, une DB différente sur le même serveur), n &apos; é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, statut, 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 &apos; origine (par ex. mirror_origin:'opsiq'); la plateforme l &apos; échoit sur le webhook et votre gestionnaire entrant ignore ses propres échos. Check OpsIQEvents::isMirroredEvent() au sommet de chaque manipulateur.

État du miroir, priorité et département

Une réponse déplace automatiquement le statut, agent répondre → answered, a client répondre → customer_reply; refléter cela de la même manière. Pour des modifications explicites, abonnez-vous à ticket.updated et lire payload['changes'] (par ex. {status:'closed'}).

Statut : L ' ensemble canonique de OpsIQ est open, customer_reply, answered, in_progress, pending, closed. Gardez 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 manquant une valeur est silencieusement abandonné à vide par certaines bases de données). Département : des OpsIQ département id est sans sens de votre côté, ne jamais l &apos; envoyer.. Envoyer le descripteur (name, email et slug) et résoudre le problème avec vos propres services par e-mail → nom → slug, de sorte que « Département de facturation » se retrouve dans votre Le service de facturation au lieu général. Déclenchement sur les deux ticket.escalated et un department_id changement dans ticket.updated.

💡
La mise en miroir de l &apos; état/priorité/sujet/département/suppression est contrôlée par des commutateurs per-connector (mirror_status_changes, mirror_priority_changes, Mirror_subject_change, Mirror Department Changes, Mirror Deletes) lus à travers le partage OpsIQ\Connectors\MirrorOptions helper. Intégrez ce bloc dans vos paramètres.json et chaque connecteur ticket-miroir lit les commutateurs de façon identique.

Lier un ticket à un produit / service

Si le client a choisi un produit spécifique lors de l &apos; ouverture du ticket, ajoutez une note pour que l &quot; &quot. l agent voit une carte de service ciblée (avec un mode « voir d &apos); autres produits &quot, en un clic pour le reste). Passez n &apos.

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 ex. WHMCS S396 396 Domaine11). OpsIQ décompose le type-lettre + id optionnel et fait correspondre votre liste de services, avec une protection de type afin qu &apos; un code de domaine ne corresponde jamais à un produit du même id. Expose une référence correspondante sur chaque service pour une correspondance exacte.

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 hébergé URLs sont passés et le contenu base64 est stocké et ré-hébergé pour vous. Vous n &apos; avez jamais besoin d &apos, écrire de gestionnaire de fichiers par plateforme.
⚠️
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 est un détail d'affichage sur la ligne. 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é utilement 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, exactement 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 and X use the provider-verified channel account as the customer identity. The proposal is signed to that channel account and confirmation still runs through the same fresh quote, stock, idempotency, payment and recovery controls. A social customer uses the exact one-time confirmation action rendered in their conversation; ordinary prose such as “yes” is never order authority.

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 de l'opérateur, depuis le pont Bottle
/* ── 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, 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 de l'identificateur, mot à mot du pont Bottle
/** 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.

Les é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 propre à 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 appartenant au 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 le propre calque d'application de la plateforme, et le démarrage de 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 de 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 pas 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.

Politique des transports

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 questionnement. 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 de 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.

ContexteProvider. php — le contrat, du paquet de référence Bottle
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 qu'il faut en modifier un après avoir signé.
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.

Minting, mot à mot du pont Bottle
$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 en 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

Paquet de connecteur et référence du cycle de vie

Ceci est le contrat de niveau source pour la construction d &apos; 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 CYCLEGestionnéESPACE DE TRAVAILDélimitéVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTconnector.phpClasse de connecteur / usineObligatoiresettings.jsonSchéma de manifeste et paramètresObligatoireactions.jsonDéfinitions d &apos; actionFacultatifsignature.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.

Paquet 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, nom, version, manifest_version, compatibilité, description et capacités. opsiq_min et opsiq_max. Le statut de la publication est l &apos; un des production, bêta, prévisualiser ou modèle; la maturité des capacités utilise les niveaux L1-L6. Les paquets hérités peuvent être normalisés avec des avertissements, mais un nouveau paquet devrait passer sans avertissant.

Interface du connecteur principal

  • 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 séparée et intentionnelle.
  • Entrant/synchronisation: handleWebhook(), poll(), backfill(). Poll gère le travail incrémental; backfill importe l &apos; historique et doit être sûr à répéter.
  • Support : pushReply() où la plateforme accepte les réponses.
  • Actions : registerActions() fournit des contrats d &apos; action exécutables.
  • Sécurité : securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

La base abstraite offre également en option un remplissage de rechange, la liste des clients, la découverte/création de comptes e-mail, les abonnés, la détection d &apos; administrateur/client, les fournisseurs de facturation/contexte/identité, l &apos. extraction de réponses, le réessai des appels HTTP, l accès aux chemins JSON, le classement flou et les assistants de pagination.

Capacités et authentification

Les noms des fonctionnalités prises en charge incluent actions, déclencheurs, contexte, identité, ventes, facturation, inbound_ticket, outbound_reply, sync_users, sync_departments, événements_sécurité, customer_import, security_native_block, promo_audience, promotion_feed, email_mailbox, native_api, ai_brain_aware et ai_tickets. API clé, porteur, de base, HMAC,OAuth 2les informations d &apos; identification du client,OAuth 2code d &apos; autorisation et des modèles d &quot; &quot.

Cycle de vie du registre

  1. Discovery 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 &apos; identification sans activer le connecteur.
  4. Activer les appels onEnable(), synchronise les définitions d &apos; action et peut démarrer le remplissage initial.
  5. L &apos; exécution de polling/webhook/abonné porte toujours le contexte de l &apos.
  6. Désactiver les appels onDisable() et arrête l &apos; activité sans supprimer les données importées.
  7. La purge est une opération explicite distincte.

Règles de correction

  • Utilisez la clé workspace/site dans chaque lecture, écriture, cache, déduplication et recherche webhook.
  • Enregistrer un ID externe/un ID d &apos; é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éclarer uniquement les capacités que le paquet implémente réellement. actions.json catalogue ne rend pas une action utilisable tant que le connecteur n &apos; est pas installé, activé, configuré et sa connexion valide.

Test et publication

Exécutez PHP lint, manifest validation, tests de connexion, tests d &apos; action schématique, tests webhook signature/replay, tests workspace-isolation, backfill-repeat tests, disabled-connector tests et failure/retry tests. Un paquet marketplace doit alors être signé et vérifié, inclure la documentation setup/permissions/webhook, et indiquer son statut de sortie réel. La tuile du connecteur et le manifeste sont les signaux faisant autorité pour déterminer sa disponibilité.

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 portées, 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 &apos. autorisation : read_orders, read_customers…Coller le domaine de stockage + jeton, cliquez sur TestActiver la synchronisation Webhook (enregistrement automatique des commandes)Passer une commande d &apos; essai → apparaît dans les ventes en 30s1STEP BY STEPRecettes copier-coller2REAL PLATFORMSShopify · WHMCS · Stripe3VÉRIFIERL &apos; ordre de test est indiqué 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 : ConnecterShopifyavec synchronisation automatique des commandes et GDPR respect des dispositions.
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 : Intégration de WHMCS

Scénario :
Objectif : Connecter WHMCS pour que l &apos; 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 &apos; 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: Google Business Profile

Scénario :
Objectif : Connecter GBP pour la gestion des commentaires, 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 et l & intelligence du site

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 des capacitésCRMcalendrier · enrichissement · esign · paiements · boîte aux lettresIntelligence du site_liste locale · rank_dataAnalytiqueweb_analytics · rapport & ingestCapabilityRegistryle découvre et câble l & interface utilisateur + la timeline1DECLARECapacités, pas de modifications fondamentales2PLUG INCRM · SI · Bus d &apos; 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éclaratif (settings.json)

Ajouter un <domain>_capabilities tableau, le meilleur pour les connecteurs sans code/marché. crm, site_intelligence.

En code (connector. php)

Mise en œuvre crmCapabilities() / siCapabilities() renvoyant 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 de listes 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 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 &apos; exécute également automatiquement sur la création d &apos);

crm/esign

sendForSignature($settings,$params) → {success,envelope_id,sign_url}. Propulsé par \OpsIQ\CRM\EsignBridge.

_intelligence du site /_liste locale

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 un connecteur SerpApi.

analyses / 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 seul URI une fois et chaque connecteur Google (présent + futur) autorise sans autre configuration de la console. Retour SharedGoogleApp::resolve(...),S redirect_uri de votre oauthParams(); ne jamais coder en dur une redirection per-slug. Les connecteurs Microsoft font la même chose via \OpsIQ\OAuth\SharedMicrosoftApp (microsoft_oauth_*).

Les boutons d &apos; importation sont limités par les capacités

Le Importer (remplissage historique) et Importer des clients 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 obtenir le bouton Importer ; surcharger listCustomers() (return {email, first_name, …} pages) pour gagner des clients d &apos; importation. AbstractConnector no-op et le bouton reste caché, donc l &apos; interface utilisateur n &apos. offre jamais une importation qu &apos: un connecteur ne peut pas effectuer.

L &apos; IA dans 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 le statut du T-000123?"), OpsIQ le résout en deux niveaux. Niveau 1 lit la billetterie partagée OpsIQ, chaque connecteur avec inbound_ticket les tickets y sont en miroir, donc les tickets synchronisés fonctionnent pour TOUS les connecteurs avec zéro code par connecteur. Niveau 2 est une solution de secours pour les VIEUX tickets qui n &apos; ont jamais été mis en miroir : le noyau appelle un OPTIONNEL fetchTicket() sur chaque connecteur activé qui l &apos; implémente. duck-typed (découvert par method_exists(), comme contextProviders()/audienceCatalog()), donc le signé ConnectorInterface est intacte et les connecteurs qui n ' en ont pas besoin (sources de messagerie/chat créant des tickets nativement) l '.

⚠️
La propriété est obligatoire et vous devez l &apos; appliquer. fetchTicket() reçoit l &apos; 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 &apos; utilise-t-elle?

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 &apos; 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.

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 », « l'assistance 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 changement de cœur OpsIQ, pas de codage dur de la plate-forme. L'IA appelle vos recherche comme outils natifs (il ne peut en inventer un), l'identité est verrouillée côté serveur au client vérifié, et les résultats sont automatiquement triés pour l'AI.

Déclarer une recherche client

Dans votre actions.json, une action en lecture seule devient appelable par le client avec TOUS LES TROIS: "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 &apos; 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_email. OpsIQ verrouille et remplit automatiquement le nom du client connecté vérifié par la plateforme; l &apos; IA ne voit ni ne choisit jamais d &apos, identité. Un nom non standard échoue à être fermé (refusé, jamais divulgué).

Ce qui doit rester réservé aux administrateurs

Tout ce qui n &apos; est pas couvert par 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 vérification de paiement lisible filtrable par identité ET une référence de transaction (votre API doit ET les filtres), par ex. whmcs_get_transactions; (2) un remboursement exécuter l &apos; action (scope:"admin", requires_confirmation:true, is_destructive:true, jamais exposé au client), par exemple whmcs_refund_orderL &apos; entreprise choisit les deux clés dans Paramètres → Chat client ; OpsIQ revérifie le serveur de paiement, applique la case politique de l &apos. entreprise (montant maximum, fenêtre d &apos, âge, limite mensuelle), émet des questions à l &quot; &quot, et dépose un ticket de révision pour tout le reste.

Routage par département selon le destinataire

L ' éditeur d ', action du Connector Builder a les mêmes contrôles: définissez « Qui peut l '. utiliser? » sur Clients connectés, laissez les deux cases à cocher décochées et utilisez un nom de paramètre d " identité ".

Implémentations de référence

Les entrées « Self-Service client » 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'e-mail sur l'album. Votre action de recherche récupère l' enregistrement SERVER-SIDE par référence; OpsIQ produit fournisseur compare la preuve avec l'inscription 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 à ce seul document dans les champs licenciés, 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'id thread et le courriel de pré-chat affirmé (non vérifié) du visiteur 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 &apos; audience promotionnelle (promo_audience)

Laissez les campagnes cible de Promotion Studio par le 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 créez) se joint en mettant en œuvre deux petites méthodes. Non OpsIQ changement de cœur, 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.

Promouvoir le public
Cibler le public de la promotionUne identité vérifiée passée à un appel connecteur audienceFlags produisant des faits qui entraînent une règle de ciblage, avec une note d &apos; échec.Cibler le public de la promotionespace de travailConnectéidentité vérifiéeaudienceFlags ()votre connecteurFAITSunpaid_invoices = 2RÈGLEfactures_impayées ≥ 1La campagne montreFails closed: client inconnu ou toute erreur → la campagne reste cachée.1TWO METHODSpublicCatalogue + drapeaux2LIVE STATENon payé, en attente, statut3FAIL-SAFENe jamais montrer à 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é apparaît 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

Activer le connecteur. L & onglet Promotion Studio Targeting crée une section « Clients et facturation » répertoriant votre plateforme ; les administrateurs peuvent créer des règles telles que « unpaid_invoices >= 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' à votre connecteur capabilities() afin que la plateforme et le marché l &apos; indiquent comme étant capable d &apos, audience (la découverte fonctionne également à partir de la présence de méthodes, mais leur déclaration est un signal propre). connectors/whmcs connecteur est l &apos; implémentation de référence complète.

Nommage des clés

Petites lettres snake_case, caractères 2-_60, correspondant à ^[a-z0-9_]+$. Types: nombre, texte, bool. 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 prenez en charge afin que les administrateurs puissent le voir.

L &apos; 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

Sur n &apos; importe quelle erreur (API down, client not found, timeout) retourne []. Une règle dont le fait est manquant ne permet pas d &apos; afficher la campagne. OpsIQ applique cela dans le correspondeur de règles aussi.

Performances

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 mémoise dans la requête.

Les opérateurs sont 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 en tant que variable dans le texte de la campagne : {unpaid_invoices}, {client_status}, plus les composants intégrés. {first_name} et {client_email}. Les valeurs sont nettoyées avant le rendu.

Connecteurs de marché sans code

Faits automatiques

Déclarative (JSON-only) marketplace connectors get promo_audience for FREE: if your connector declares customers/users, invoices, orders or subscriptions resources, OpsIQ dérive customer_status, unpaid_invoices, amount_due, pending_orders, active_subscriptions et subscription_status de vos actions de recherche existantes. Pas de code du tout.

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 les faits (et les étiquettes) qui apparaissent dans le menu déroulant du studio.

Tester 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

Ajouter : Votre plateforme · une clé · >= · 1 et définir « Clients connectés uniquement ». Enregistrer et publier.

3
Vérifier 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 cachée). Les visiteurs déconnectés ne correspondent jamais aux règles de connexion.

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 &apos; événement (par ex. checkout_failed), puis appelez le crochet global depuis votre page:

votre site / connecteur front-end JS
// 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 &apos; utilisation complet (conception, blocs, analyses, A/B, publication) se trouve dans le centre d &quot; &quot. aide de l &apos); Engager → 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 &apos; enquête (Contract 2.2)

Le survey La capacité de Survey Studio à fournir des adaptateurs d &apos; identité client vérifiés, des données sur l &apos. audience, des variables sûres et des candidats destinataires permet à toute plateforme de fournir promo_audience et ne donne pas à un connecteur la propriété des sondages, réponses, analyses ou livraison de courriel.

💡
État de la mise en oeuvre. La création est terminée et utilisable aujourd &apos; 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 &apos; isolement de conformité sont tous envoyés. La consommation n &apos: SurveyConnectorRegistry Le service Survey Identity Gateway est implémenté et testé, mais aucun runtime de sondage ne l &apos; appelle encore, donc la santé du fournisseur n &apos.., n &quot; est pas visible dans l &quot, interface utilisateur d &apos, administration et aucun paquet de connecteur publié ne déclare cette fonctionnalité. L &apos: émission de jetons signés pour le service Survey identity gateway, ciblage et intégration des variables, matérialisation de CRM Outreach et les premiers mappages de fournisseurs expédiés restent des phases distinctes.

Responsabilités du fournisseur

Catalogue d &apos; audience et faits

Déclarer les faits canoniques tapés et résoudre les valeurs uniquement pour un sujet lié à l &apos; espace de travail vérifié par le serveur. Les faits typiques incluent order_count, last_order_status, cancelled_order _count, customer_created_at, active_subscription_count et past_due_invoice_count.

Catalogue de variables et valeurs

Déclarer les variables client, compte, commande, abonnement et support avec le type, la sensibilité et le contexte autorisé. La copie de l &apos; enquête nécessite des solutions de secours et une échappée du contexte de sortie.

Pager le destinataire

Énumérez éventuellement les candidats pour la CRM Outreach avec des ID externes stables, des pages limitées, des curseurs déterministes et des métadonnées liées au consentement. Survey gèle l &apos; audience choisie avant tout envoi.

Identité

Accepter l &apos; identité uniquement à partir de la passerelle d &apos. enquête après signature du jeton, expiration, objet, connecteur et vérification de l &quot; &quot. espace de travail. Le courrier électronique fourni par le navigateur, les ID, les balises ou les données de facturation ne font jamais autorité.

Santé de l &apos; exécution

SurveyConnectorRegistry est conçu pour signaler les fournisseurs compatibles, bloqués et indisponibles sans exposer les paramètres, chemins d &apos; accès, identités brutes ou messages d &quot; exception &quot. Un fournisseur bloqué ne peut jamais être invoqué. La surface de rapport n &apos); est pas encore visible dans l &apos: interface utilisateur d &amp; ; administrateur : aujourd &apos. un fournisseur bloquer est simplement inerte.

Règles de fail-closed

Les clés non déclarées, les types incorrects, les valeurs surdimensionnées, les sujets incompatibles, les délais d &apos; 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. Les pages destinataires sont limitées et vérifiées. Les valeurs sensibles n &apos); s jamais apparaître dans l &apos: preview ou dans les journaux publics.

Porte de libération du constructeur

Contrat 2.2 expédie l &apos; entrée de registre des capacités, interface, panneau de cartographie d &apos. SurveyProvider.php, version de capacité, README/référence du développeur et dispositifs de conformité. Les profils PHP commerciaux, d &apos; assistance, SaaS Bridge et locaux l &apos); les connecteurs standard API optent pour cette option. La porte statique rejette un fournisseur de sondage qui appelle un espace de noms, une table ou une fonctionnalité Promotion.

💡
La copie de la promotion est importable uniquement : le constructeur peut traduire les mappages de promotion compatibles une fois, sauvegarder une copie complète appartenant à l &apos; enquête et enregistrer la provenance.
Connecteurs

Capacité de réponse (Contract 2.2)

Le reply_feedback la capacité d ' une plate-forme de refléter ses propres cotes par réponse en OpsIQ. Une étoile un client donne une réponse du personnel à l ' intérieur WHMCS L ' espace client atterrit sur la MÊME réponse dans le.OpsIQ fil d ' administration, avec la même puce, le crédit de l '. agent, la page de rétroaction et le calcul des équipes et des performances comme une note donnée sur un OpsIQ Un stockage, une puce, un pipeline ; le connecteur ne fait que traduire.

Le seul chemin d &apos; écriture

Il y a exactement deux chemins d &apos; entrée et une vérité. Les tickets de portail OpsIQ écrivent nativement. Les billets de plateforme passent par le connecteur, et les dépôts du noyau atteignent chaque événement via ReplyFeedback::recordMirrored(): les mêmes colonnes, règle du personnel, une évaluation par réponse des dernières années, sémantique, timbre espace de travail et indexation de la voix du client l'écriture du portail utilise. Un connecteur n'écrit jamais les lignes de rétroaction elle-même.

Conforme (quatre fichiers, puis signer à nouveau)

1
connector_contract.json

Ajouter l &apos; 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 &apos; exécution

Implémenter l &apos; interface, lister reply_feedback dans capabilities(), puis signer à nouveau le paquet.

Responsabilités du fournisseur

Catalogue

Déclarer les modes, l ' échelle de notation propre à la plate-forme (le noyau normalise au natif ) 1-5), et tous les jetons de réaction. Le catalogue doit être conforme aux spécifications.json.

Tirez la traduction

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 &apos; a pas d &apos. op et une cote modifiée l &apos: écrase (dernières victoires, comme le portail).

Discipline du curseur

Les pages sont limitées et déterministes ; un curseur qui n &apos; avance pas met fin à l &apos. Le remplissage historique se vide comme une fenêtre roulante, jamais d &apos: a tirage 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 du ticket a déjà estampillé (<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 : WHMCS

WHMCS stocke les notes par réponse dans la zone client tblticketreplies.ratingLe. WHMCS connecteur déclare le mode de sondage avec un 1-5 à l &apos; échelle, les navires ticket_reply_ratings relay command dans son fichier de pont, et traduit chaque ligne en un événement dont les ids correspondent aux whmcs:<ticket>:reply:<reply> marqueurs son miroir de ticket est déjà tamponné. Après avoir mis à niveau le connecteur, recopiez le fichier du pont sur le serveur WHMCS afin que la nouvelle commande y existe.

💡
Contrat complet du développeur avec l &apos; interface, les formes d &apos. événements, les règles de normalisation et la liste de vérification de conformité: doc/contracts/TICKET_REPLY_FEEDBACK_CAPABILITY.md dans le paquet OpsIQ. Acceptation: évaluer une réponse à l &apos; intérieur de la plate-forme, attendre le sondage horaire, et la même réponse dans _OpsIQ montre la puce, la page Feedback la 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 Fusion, 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, installer et publier des connecteurs créés par la communauté.

Marché
Marché des connecteursUne grille de cartes de connexion communautaire avec des catégories, des boutons d &apos; installation et des notes en étoiles.Marché des connecteursespace de travailRecherche de connecteurs…CalendrierPlanificationInstaller★ 4.8HubSpotCRMInstaller★ 4.6Chimpanzé du courrierE-mailInstaller★ 4.7QuickBooksComptabilitéInstaller★ 4.5TwilioSMSInstaller★ 4.9NotionDocumentsInstaller★ 4.41DISCOVERConnecteurs communautaires2INSTALLATIONUn clic3PUBLISHSigner et soumettre 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

Allez dans Connecteurs > Marketplace. Recherche par nom, catégorie ou plateforme.

2
Révision

Vérifiez la description, les actions prises en charge et les évaluations.

3
Installer

Cliquez sur Installer. Le package de connecteur est téléchargé et installé dans marketplace_connectors/.

4
Configurer

Activez-le dans Connecteurs, entrez les informations d &apos; 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 des 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écharger via le flux de soumission du marché pour examen.

Deux niveaux de connecteurs

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

Le API et Webhook Builder vous permet de créer des hooks personnalisés.API des points de terminaison et des auditeurs webhook à l &apos; intérieur. OpsIQ sans écrire de PHP brut.

Constructeur API
API et constructeur de webhookUn constructeur qui choisit un type de déclencheur (webhook entrant, planification, événement, manuel) qui alimente une action configurable.API & constructeur de webhookespace de travailDÉCLENCHEURWebhook entrantPlanification (cron)OpsIQ événementManuelDécisionCarte des champs entrants →créer un ticket / notifier / appeler APIEnregistrer le point final1DÉCLENCHEURSWebhook · planning · event · manual2NO RAW PHPIntégré dans l &apos; interface utilisateur3ActionMapper 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. OpsIQ ou quand un système externe affiche un événement correspondant à votre webhook. URL. Tapez le nom de l &apos; événement, par exemple ticket.created.

Planification

Utilisez l &apos; un des événements à intervalles prédéfinis comme nom d &apos. évéement: cron. minutely, cron. hourly ou cron. daily. L &apos, écran Actions et Déclencheurs a des boutons pour ces derniers, vous n &apos); y avez donc pas besoin de les mémoriser.

Phrase

Exécuter quand un administrateur demande à l &apos; IA de le faire en langage clair. Ajouter la phrase qui doit correspondre, par exemple trouver client.

Webhook entrant

Un système externe envoie un HTTP POST à votre. OpsIQ webhook URL avec un nom d &apos; événement. Tout déclencheur à l &apos, écoute de cet évéement se déclenchait.

Exécutez-le seulement de temps en temps : conditions

Un déclencheur d &apos; événement peut contenir des conditions, de sorte qu &apos. il ne s &apos: exécute que lorsque les données entrantes correspondent. Sans condition, il s &quot; &quot); est exécuté chaque fois que l &apos, évéement se déclenchait.

Champ

Un chemin vers les données de l &apos; événement. Utilisez un point pour les valeurs imbriquées, par exemple client. email.

Représentez tout ou n &apos; importe quoi

Choisissez si toutes les règles doivent correspondre, ou seulement une d &apos; entre elles.

Tests de texte

égale, n &apos; est pas égale à, contient, ne contient pas, commence par, est l &apos..., n., n est pas un des. La correspondance ignore les majuscules.

Tests de nombre

plus grand que, au moins, inférieur à, au maximum. Les nombres écrits en tant que texte sont toujours comparés correctement.

Tests de présence

est présent, est absent, est vide, n &apos; est pas vide.

Seul l &apos; ingénieur de garde est appelé pour les tickets urgents.

Scénario :
Event ticket. created, avec une règle : priorité égale urgente.
Que faire :

L &apos; action s &apos. exécute pour les tickets urgents et est ignorée pour tout le reste. Aucun filtrage n &apos, est nécessaire de votre part.

💡
Si vous laissez les règles vides, le déclencheur s &apos; exécute sur chaque événement correspondant, ce qui est le même comportement qu &apos.

Actions

Envoyer un webhook

Envoyer HTTP POST à un URL externe avec une charge utile personnalisée.

Créer un ticket

Créer un ticket d &apos; assistance avec le département, l &apos. objet et le message spécifiés.

Envoyer un courriel

Envoyer un courriel avec un modèle personnalisé.

Mettre à jour l &apos; enregistrement

Mettre à jour un enregistrement client, ticket ou CRM.

Exécuter l &apos; action du connecteur

Exécute une action enregistrée à partir d &apos; un connecteur activé avec ses règles de confirmation et d &quot; &quot.

Exécuter OpsIQ Général API action

Recherchez dans le catalogue complet nommé Général API. Les champs, les étendues, les autorisations, la confirmation, l &apos; idempotence et la prise en charge de l &quot; &quot); Le flux de travail s &apos. exécute à l &amp; intérieur de son espace de travail enregistré et du contexte administrateur.

Envoyer une requête API native du fournisseur

Utiliser un connecteur Native API Read or confirmed Native _API Write action when the provider endpoint has no curated action. Credentials remain inside the connector and only relative provider paths are accepted.

Le constructeur 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 d &apos; exécution.
Développeur

Livre de cuisine Triggers

Des recettes d &apos; action-déclenchement prêtes à l &apos, usage pour les automatismes courants.

Comment ça fonctionne
Livre de cuisine TriggersUn flux de recette : un webhook uptime. down passe par un filtre de production, puis s &apos; étend pour créer un ticket urgent et avertir Slack.uptime.downsurveiller le webhooksi produitfilterCréer un ticket urgentNotifier Slack #ops
Livre de cuisine 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 :
Slack message chaque fois qu &apos; 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

E-mail de synthèse hebdomadaire

Scénario :
Résumé par courriel à 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

Évaluer les tickets obsolètes

Scénario :
Si un ticket n &apos; a pas de réponse pendant 24 heures, assigner au chef d &apos.
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.

Construire des actions
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.Action nouvelleespace de travailAction nouvelleNomlookup_orderDemandeGET/orders/{id}Paramètresid · chaîne200 · commande trouvée1DEFINENom, méthode, point final2PARAMSEntrées saisies3ESSAIRésultat 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 &apos; action.

Avant de commencer, décidez lequel vous avez besoin. Les deux sont configurés dans le même écran.

Appeler un API externe

L &apos; action envoie une requête HTTP à votre plateforme. Choisissez cette option lorsque OpsIQ doit vous contacter et faire quelque chose de votre côté.

Exécuter une action de connecteur

L &apos; action exécute quelque chose qu &apos, 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 &apos: action du connecteur dans une liste, donc il n &apos); y a rien à brancher.

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, rechercher un client, importer des contacts, etc. Choisissez l &apos; action du connecteur dans la liste déroulante et vous avez terminé.
1
Planifier l &apos; action

Exemple : "lookup_product". Cherchez un produit par son nom, son prix de retour, son stock et sa description.

2
Définir en actions.json

Ajouter une définition d &apos; 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
Test avec un essai à vide

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 &apos; utilisation de l &quot; &quot.

Demander à l &apos; IA administrateur : « Recherchez le produit Widget Pro. » L &apos,IA devrait trouver et exécuter l &quot; &quot.

⚠️
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 fin d &apos; événement entrant

Les points de terminaison entrants acceptent JSON signé d &apos; un autre système et le transforment en une activité de contact dédupliquée pouvant alimenter les calendriers, la notation et les flux de travail.

Ecran du produit
Points de terminaison entrantsChaque source entrante a son propre URL, secret, mapping et résultat d &apos; activité récente.Points de terminaison entrantsespace de travailSOURCES5ACCEPTED12.4kREJECTED18VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTPlateforme de facturationévénements d &apos; abonnementEn bonne santé.Application de produitévénements d &apos; inscription et d &quot; &quot.En bonne santé.ID de l &apos; événementprovider_event_idDéduplicationsignatureX-OpsIQ-Inbound-SignatureHMAC1CREATE SOURCEURL et secret2MAP PAYLOADE-mail, événement et ID3VÉRIFIERHMAC puis ingère
Chaque source entrante a son propre URL, secret, mapping et résultat d &apos; activité récente.

Créer une source par système d &apos; envoi. OpsIQ génère un URL/token et secret. Send JSON avec Content-Type: application/json et signez le corps brut exact en utilisant HMAC-SHA256 :

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

Mapper les chemins JSON pour le courriel du contact, le nom de l événement et l &quot; &quot. ID d &apos); évéement facultatif. L &apos. ID de l&apos; évélement 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, règles de cycle de vie et flux de travail.

Rejeter les signatures non valides avant d &apos; analyser les données professionnelles. Faire pivoter 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 webhook sortantes

L &apos; administration des webhook sortants crée des abonnements signés, teste les points de terminaison et surveille la livraison asynchrone et l &apos.

Ecran du produit
Webhooks sortantsLa page webhook sortante liste les points de terminaison HTTPS, les abonnements aux événements, l &apos; état de livraison et un test signé en un clic.Webhooks sortantsespace de travailENDPOINTS7SUCCESS99.2%RENFORCEMENT4VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTMiroir CRMcontact.* et affaire.*En bonne santé.Bus de soutienet de chat.*En bonne santé.Entrepôt de données*RéessayerLivraison de testSignéPrêt1SUBSCRIBEHTTPS URL et les évènements2AUTHENTICATESignature HMAC3OBSERVERail de livraison et réessais
La page webhook sortante liste les points de terminaison HTTPS, les abonnements aux événements, l &apos; état de 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>

Vérifier la signature avant de désérieliser ou d &apos; agir. La livraison est asynchrone et refait automatiquement une nouvelle tentative après environ 1minute,5minutes,30minutes,2heures et12heures. Utilisez le rail de livraison récente pour inspecter l &apos; état, le code de réponse et le nombre de tentatives.

Votre récepteur doit être idempotent car tout système asynchrone peut retransmettre. Retourner 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 &apos; avertir les systèmes extérieurs lorsque quelque chose arrive en interne (outbound).

Webhooks
Webhooks sortantsL &apos; écran des webhooks sortants : une table de points d &apos, avec le nom, les événements abonnés, les points récents d &quot; &quot.Webhooks sortantsespace de travailPoints de fin+ Sauvegarder le point finalNOMÉVÉNEMENTSLIVRAISONSlack #sales-alerteshttps://hooks.slack.com/…crm. deal. won, commandeEssaiMiroir CRMhttps://api.acme.com/hookcontact.*, 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

Abonnement

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.

Essayer à nouveau

Les livraisons échouées sont réessayées avec un retour en arrière exponentiel. Après 15 échecs consécutifs, le point de terminaison 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 SSRF

OpsIQ ne sera pas envoyé à 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 &apos; attente des tâches, sans bloquer les opérations OpsIQ.

ID d &apos; événement stable

Chaque événement a 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.

courriel (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 retentit avec un retour en arrière exponentiel. Si votre point de terminaison se rétablit dans la fenêtre de réessai, aucun événement n &apos; est perdu.

Développeur

Clés API

API clés authentifient les requêtes à l &apos;. OpsIQ REST API. Chaque clé a des autorisations de portée.

Clés API
Clés APIL &apos; écran des clés API: un panneau d &apos, avec les niveaux d &quot; accès et les puces de portée, à côté d &amp; une liste des clé 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 délivranceVos clésIntégration Zapieropq_••••4f2aRévoquerApplication mobileopq_••••91c7RévoquerExportation d &apos; analysesopq_••••2db0Révoquer1SCOPEDEn lecture seule ou restreint2PER-ACTIONChoisir la portée exacte3REVOCABLEFaire 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 &apos; 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

Donnez à la clé seulement ce dont elle a besoin. Les portées sont fournies en paires de lecture et d &apos; écriture par zone, donc une intégration de rapport peut être accordée aux lectures et rien d &quot; &quot);

Portées disponibles

Choisissez l &apos; ensemble le plus étroit qui fait le travail. admin satisfait à tous les critères ci-dessous, alors n &apos; utilisez-le que si vous avez réellement besoin d &apos.

crm. read / crm. write

Contacts, entreprises, offres, activités, segments, outreach, conversions, cycle de vie et webhooks CRM.

tickets. read / tickets. write

Liste et lisez les tickets et leurs messages; répondez, mettez à jour, ouvrez et exécutez des opérations de file d &apos; attente en bloc.

conversations. read / conversations. write

Lire les conversations en direct et l &apos; historique des messages, envoyer des messages et modifier leur statut.

kb. read / kb. write

Entrées de la base de connaissances.

chat. read / chat. write

Modèles de réponse enregistrés.

connectors.read

Voir quels connecteurs sont installés, ce qu &apos; ils peuvent faire et tester leurs informations d &apos.

automations.read

Voir vos actions, déclencheurs et leur historique d &apos; 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

Surveillance des sites et de leurs rapports SEO.

files.read

Liens de téléchargement signés pour les pièces jointes.

status.write

Composants et incidents de la page d &apos; état.

écrire

Aides à l &apos; écriture par IA: rédiger, résumer, traduire, réécrire, composer, analyser.

administrateur

Tout, y compris un petit nombre d &apos; 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 &apos; il peut exécuter sur votre installation. C &apos, est toujours plus fiable que de travailler à partir d &apos. une liste.

Niveaux d &apos; accès

Tout

La clé peut appeler tout ce que sa portée permet.

Lecture seule

Toute écriture est refusée, peu importe ce que les champs disent. Le choix le plus sûr pour les rapports, tableaux de bord et tout ce qui ne devrait jamais changer les données.

Restreint

Vous listez les actions exactes que la touche peut appeler. Tout le reste est refusé, même dans une portée autorisée.

4
Copier la clé

Affichée une fois. Commence par « opq_ ». Stockez-la en toute sécurité.

🚫
Ne jamais partager API clés dans le code public, côté client JavaScript, ou contrôle de version. Utilisez les variables d &apos; environnement.
Développeur

Connectez votre site web

Le OpsIQ Le widget est un JavaScript Un extrait de code que vous ajoutez à votre site Web pour le suivi, l &apos; IA-chat, la création de tickets et l &quot; &lt; &gt; identification des clients.

Comment ça fonctionne
Connectez votre site webUne balise de script d &apos; une ligne à gauche et, à droite, une page web avec la bulle de discussion 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 de base
<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. « en bas à droite » (par défaut) ou « en dessous à gauche ».

data-color

Optionnel. Code hexadécimal de couleur primaire.

data-greeting

Facultatif. Message de bienvenue initial.

data-language

Facultatif. Langue de l &apos; interface utilisateur : « en », « es »,« fr »,»de »,“pt ”etc.

data-identity-token

Facultatif. Jeton d &apos; identité signé généré par le serveur.

Soutien SPA

Suivi manuel de l &apos; 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 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 Web?+

Non. Sous 15 KB gzipped, chargement asynchrone après le contenu de la page.

Puis-je personnaliser l &apos; apparence?+

Utilisez data-color pour la couleur primaire. Contactez le support technique pour les options de remplacement CSS.

Développeur

Recettes d &apos; installation de widgets

Guides d &apos; installation spécifiques à la plateforme.

Comment ça fonctionne
Recettes d &apos; installation de widgetsPlate-forme d &apos; installation de cartes pour WordPress, Shopify et Google Tag Manager, chacun indiquant où ajouter le widget.Groupe de travail des politiquesWordPressInstaller le plugin, entrezvotre clé de site, sauvegardez.MagasinShopifyColler l &apos; 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 &apos; 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 Shopify store.
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 :

Configuration > Paramètres généraux > Autre > Contenu du pied de page global. Collez l &apos; extrait ou modifiez votre fichier modèle footer. tpl.

Google Tag Manager

Scénario :
Ajouter via GTM.
Que faire :

Créer une balise personnalisée HTML, coller l &apos; 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 $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

L &apos; identité relie les visiteurs anonymes aux clients connus. Lorsqu &apos, il est identifié, OpsIQ établit un lien entre l &apos: historique de navigation, discussions et tickets et le profil du client.

Comment ça fonctionne
Identité du visiteurUn flux : un utilisateur se connecte sur votre site, vous émettez un jeton d &apos; identité signé et OpsIQ unifie ses sessions, discussions et tickets en un seul profil.L &apos; utilisateur se connectesur votre siteToken signéidentité_jeton (HMAC)Un seul profilsessionsChats+ billets
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 les 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 appariées.

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 + utilisation_unique: 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

Affichage optionnel du nom, 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 fournit 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 composeur nécessite opsiq/sdkJSNodeJS SDK- Non, pas de problème.opsiq/sdkGroupe de travail des politiquesPlugin WordPressInstaller et se connecter en un clicQUANDModule WHMCSModule complémentaire pour la facturation + le relais de billets
Plugins & SDK
PHP SDK

Paquet composeur: génération de jeton d &apos; identité, assistants d &quot; &quot. API &quot, vérification de signature webhook.

JavaScript SDK

Côté navigateur : suivi, identité, évènements personnalisés, contrôle du chat.

Plugin WordPress

Injection de widget, identité à partir des sessions utilisateur WP, synchronisation WooCommerce.

Module WHMCS

Intégration complète: widget, relais de tickets, identité, IA d &apos; administration.

Extension de thème Shopify

Intégration d &apos; une application avec identification automatique du client.

Démarrage rapide PHP SDK

Exemple 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 le même type généralAPI, l'exécuteur interne, le bus événementiel et les opérations webhook comme le reste deOpsIQ. Cela permet aux développeurs d'intégrer fin à fin sans construire un connecteur emballé.

⚠️
État de mise en oeuvre: le catalogue actif n &apos; expose actuellement que platform.get.survey.config et platform.save.survey.configLe surveys.* et feedback.* les familles ci-dessous sont le contrat cible approuvé et doivent retourner unknown_action jusqu &apos; à ce qu &apos, ils soient enregistrés.

Cibler les familles d &apos; actions

Types, modèles et lancement rapide

surveys.types.*, surveys.templates.* et surveys.quick_launch.* liste, prévisualiser, instantier et valider les démarreurs complets.

Sondages et versions

surveys.create|get|list|update|archive|duplicate plus des actions de version, validation et publication immuables.

Déploiements et ciblage

surveys.deployments.*, surveys.links.*, surveys.audiences.*, surveys.triggers.* et surveys.variables.*.

Outreach et réponses

surveys.invitations.*, surveys.campaigns.*, surveys.recipients.*, surveys.responses.*, exportations, rédaction et analyses.

Webhooks, importation et retour

surveys.webhooks.*, surveys.imports.*, feedback.items.*, feedback.analytics.*, feedback.sources.* et feedback.analysis.*.

Flux sans connecteur

1
Créer et publier via General API

Utiliser les actions de sondages tapés.* avec une clé épinglée à l &apos; espace de travail. Les écritures déclarent le comportement d &apos, autorisation, risque, confirmation, idempotence et exécution à vide.

2
Recevez votre événement professionnel

Envoyer un événement signé à un webhook entrant, par exemple une annulation de commande ou une étape d &apos; accueil terminée. La protection contre la relecture déduplique l &apos); ID de l &quot; &quot.

3
Mappé dans Actions et Déclencheurs

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 &apos; abonner aux événements de sondage

Livrez le sous-ensemble de cycle de vie d &apos; enquête* documenté et sécurisé à votre point final avec signature, filtre, réessai, journalisation et lecture autorisée.

Cible d &apos; événement canonique

Le catalogue partagé couvrira l &apos; état de publication du sondage/déploiement, les décisions relatives à l &quot; &quot. à l &amp; au public et aux déclencheurs, les invitations, le rendu/le lancement/la reprise partielle/complète/abandonné, la rédaction des réponses, l &lt; &lt);état de la campagne et les échecs de diffusion.

Un connecteur est facultatif. Il ajoute la découverte de plateforme réutilisable, l &apos; identité vérifiée, les faits, les variables et l &quot; &quot); énumération des destinataires. Général API plus Actions &amp; Triggers/webhooks reste le chemin d &apos. intégration complet pour les développeurs qui n &apos:
Développeur

API REST

Le OpsIQ REST API vous permet d &apos; accéder par programme à toutes les fonctionnalités de la plateforme.

Comment ça fonctionne
API RESTUn terminal affichant un POST au. OpsIQ API avec une clé du porteur, la liste des billets ouverts et le numéro de page 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é sous Authorization: Bearer opq_... ou X-OpsIQ-Key: opq_.... Utiliser un en-tête d &apos; 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 &apos; action: envoyer un action nom dans le corps. Chaque opération d &apos; 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 &apos; étendue. platform.routes.* bridge reste uniquement pour les intégrations plus anciennes.

crm.contacts.list

Liste des contacts CRM (étendue crm. read). Paramètres : q, statut, source, balise, score de prospection, limite.

crm.contacts.upsert

Résoudre ou créer un contact (portée crm. write). Paramètres : courriel plus champs, balises, notes.

crm.deals.list

Liste des offres CRM (étendue crm. read). Paramètres : status, stage_id, company_id (ID de l &apos; étape), owner_admin_id(ID de la personne responsable), pipeline_id et limit.

crm.activities.record

Enregistrer une activité de cycle de vie/d &apos; affaires pour un contact (portée crm. write). Paramètres: email ou contact_id, événement, valeur, monnaie.

crm.conversions.record

Enregistrer une conversion (scope crm. write). Paramètres : contact_id ou email, conversion_type, valeur, devise.

crm.events.list

Interroge le flux d &apos; événements CRM (portée crm. read). Paramètres: limit.

tickets.list

Liste des tickets (scope tickets. read). Paramètres : page, per_page, trier, ordre, statut, priorité, department_id, assigned_admin_id (ID d &apos; administrateur assigné), client_email, rechercher.

tickets.get

Un ticket et ses messages (étendue tickets. read). Paramètres : id_ticket ou numéro_de_tiquet, include_messages, messages_limit.

tickets.reply

Publier une réponse à un ticket (scope tickets. write). Paramètres : id_ticket ou numéro_de_tiquet, corps, type_auteur, nom_acteur, interne.

tickets.update

Mettre à jour un ticket (scope tickets. write). Paramètres : ticket_id ou ticket_number, status, priority, subject, department_id, assigned_admin_id.

tickets.open

Ouvrir un ticket de support (scope tickets. write). Paramètres : customer_email, customer_name, subject, body, priority.

tickets.bulk

Exécute une opération de file d &apos; 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 (étendue conversations. read). Paramètres : conversation_id ou thread_key, include_messages.

conversations.messages

Historique des messages paginés (portée 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

Assigner, re-status ou re-titre une conversation (scope conversations. write). Paramètres: conversation_id, status, assigned_admin_id.

connectors. list /. get /,test

Voir quels connecteurs sont installés, ce que chacun peut faire et si ses identifiants fonctionnent (scope connectors. read).

automations.actions.list

Les actions que votre générateur d &apos; 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 &apos; exécution pour le débogage d &quot; &quot. Paramètres : status, action_key.

departments.list

Départements vers lesquels vous pouvez acheminer un ticket (scope 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 comme CSV (scope analytics. read). Paramètres: section, preset, from, to. Appelez analytics. sections. list pour 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 à courte durée pour une pièce jointe (scope files. read). Paramètres : reference, ttl.

security.check

Demandez si un IP ou e-mail est bloqué ou suspect ici (étendue security.read). Combine les IP le pare-feu, la liste de blocage du courrier indésirable et le verdict de l &apos; IA de sécurité en cache. Paramètres : ip, email.

security.report

Signaler un abus observé sur votre système (scope security. write). Enregistré comme un événement de sécurité, classifié immédiatement par l &apos; IA de sécurité et les administrateurs sont avertis des verdicts à haut risque. Paramètres : ip, courriel, type, raison, source.

security. blocklist. add /. list

Gérer les règles de spam que le pipeline des tickets applique (scope security. write / security. read). Stocker comme la page Tickets « Bloquer l &apos; expéditeur ». Paramètres : type (email, domaine, ip), valeur, raison, expires_hours.

💡
meta. actions fait toujours autorité. Il renvoie toutes les actions disponibles sur votre installation avec la portée dont chacune a besoin, de sorte que vous n &apos; avez jamais à deviner ou coder cette liste.

Pagination, filtrage et tri

Chaque action de liste utilise les mêmes paramètres, donc vous ne les apprenez qu &apos; une fois.

page / par_page

Numéro de page commençant par 1, et la taille de la page. Par défaut 50, maximum 200. limit et offset sont également acceptés si vous les préférez.

trier / ordonner

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 &apos; être considéré comme une erreur.

filters

Envoyer les filtres en tant qu &apos; objet, ou passer un filtre comme paramètre de niveau supérieur. Les filtres inconnus sont ignorés.

Ce qui revient

items, page, per_page, count, total et has_more. Continuez à demander des pages jusqu &apos; à ce que has_ more soit faux.

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 échec renvoie la même forme, avec une stabilité code ne correspond pas à la page lisible par l &apos; homme error texte, qui peut être reformulé.

Réponse d &apos; erreur
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
missing_api_key / invalid_api-key

Aucune clé n &apos; a été envoyée, ou la clé est incorrecte ou expirée. HTTP 401.

missing_scope

La clé est valide mais manque de la portée nécessaire à cette action. HTTP 403.

clé_en_lecture_seule / action_restreinte

La clé est en lecture seule, ou cette action n &apos; est pas dans sa liste d &apos. HTTP 403.

unknown_action

Aucune action. Appelez meta. actions pour la liste courante. HTTP 400.

paramètre_manquant / paramètre _invalide

Un paramètre requis est absent, ou une valeur n &apos; est pas acceptée. HTTP 400.

not_found

L &apos; enregistrement n &apos. existe pas ou ne se trouve pas dans l &apos, espace de travail que cette clé peut voir. HTTP 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 pour 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.

Re-essais sécurisés

Si un temps d &apos; attente est dépassé, vous ne pouvez pas savoir s &apos.. Envoyer une idempotency_key et une répétition du même appel retourne le résultat original au lieu de faire le travail deux fois.

Impossible d &apos; écrire
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
Combien de temps ça dure?

Une touche 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 &apos; il s &apos...

Les échecs restent réessayables

Seules les écritures réussies sont mémorisées. Si un appel a échoué, le renvoyer avec la même touche l &apos; exécute à nouveau, ce qui est ce que vous voulez.

Lire

Les lectures ignorent la clé. La répétition d &apos; une lecture est inoffensive.

Tester sans rien changer

Ajouter dry_run: true Votre clé, vos champs d &apos; application et vos paramètres sont tous vérifiés comme à l &apos. habitude, puis l &quot; &quot. appel s &apos: arrête avant que quoi que ce soit ne soit créé ou modifié.

Essai : vérifier les informations d &apos; identification et 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 &apos; est le moyen le plus rapide de confirmer qu &apos, une clé ait les bonnes portées et que votre charge utile soit correctement formée, sans créer des données de test à nettoyer ensuite.

Limites de débit

Limite par touche

Une limite horaire configurable par heure API clé (par défaut 1000 Réglez-le par touche sous Paramètres,API Les clés.

Lorsque dépassé

HTTP 429 avec code rate_limited, plus un en-tête Retry-After vous indiquant le nombre de secondes à attendre. La limite est réinitialisée au début de l &apos; heure suivante.

Savoir où vous en êtes

Chaque réponse porte les informations X-RateLimit-Limit, X- RateLimiter-Remaining et X- RateLimitter-Reset (un horodatage Unix). Surveillez Remaining et ralentissez avant de vous épuiser plutôt que d &apos; attendre d &quot; &quot.

En disant429à partir401

A429Ça veut dire attendre et essayer à nouveau.401signifie que la clé elle-même est incorrecte ou expirée, donc le réessayer n'aidera pas jusqu'à ce que vous fixiez la clé.

Protection contre la force brute avant l &apos; authentification

Essais répétés d'un seul coupIPLes clés valides ne font jamais ce voyage.

Meilleure pratique

Retraite lorsque le reste est faible, et honore 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-Statut afin que vous puissiez confirmer à qui vous parlez.

Comment serez-vous prévenus

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 surveillance et vous ne serez jamais surpris.

Ce qui ne changera pas

Les noms des actions existantes, leurs paramètres et leurs codes d &apos; erreur. De nouvelles actions et de nouveaux champs facultatifs peuvent être ajoutés à tout moment, donc ignorez les champs que vous ne reconnaissez pas plutôt que de les échouer.

Une intégration complète, du début à la fin

C &apos; 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 d &apos; exécution, 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

courriel (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

h (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 &apos; un espace de travail?+

Envoyer 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 clé avec contexte admin peut sélectionner n &apos; importe quel espace qu &apos, il est autorisé à voir et est refusée pour tous ceux qui ne l &apos.

Quelles actions peut appeler une touche en lecture seule?+

Toute action marquée comme lecture. Définissez le mode des permissions sur la clé à read_only et chaque écriture est refusée avec read_Only_Key, de sorte qu &apos; une intégration de rapport ne puisse rien changer même par erreur.

Pourquoi est-ce que j &apos; ai not_found pour quelque chose que je peux voir dans l &apos..+

La clé est limitée à un espace de travail. Les enregistrements dans d &apos; autres espaces de travail renvoient not_found plutôt qu &apos, une erreur de permission, donc le API ne confirme jamais si quelque chose existe ailleurs.

Développeur

Sécurité API

Un seul contrat de sécurité pour chaque connecteur et intégration : demandez OpsIQ ce qu &apos; il sait sur un. IP ou de l &apos; expéditeur, et répercutez les abus que votre propre système voit.

OpsIQ se défend déjà : le IP Le pare-feu bloque les attaquants, le pipeline des tickets filtre le spam et l &apos; IA de sécurité classe les contrevenants et propose des règles de blocage. API Une plate-forme de facturation, un portail client ou une application personnalisée peut vérifier un visiteur avant de lui faire confiance et rapporter ce qu &apos; elle a observé afin que toute l &apos); installation apprenne de chaque surface.

Ce que vous pouvez faire

Vérifier avant de faire confiance

security. check répond avec l &apos; état du pare-feu, toute règle de spam correspondant à l &quot; &quot); expéditeur et le verdict d &apos. IA mis en cache pour le message IP. Un appel, une opinion consolidée.

Signaler ce que vous avez vu

security.report enregistre l &apos; observation comme un événement de sécurité, et demande à l &quot; &lt; &gt; Security AI de classer le IP Les rapports répétés se regroupent en incidents, exactement comme les attaques. OpsIQ il voit directement.

Partager les règles de 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 ailleurs.

Signaler un abus d &apos; 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ée 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 &apos; est détruit silencieusement.

Un expéditeur bloqué apparaît toujours dans la vue Spam où le ticket peut être lu et restauré.

La plateforme se protège elle-même.

Propre du serveur IP Les adresses ne peuvent jamais être bloquées, sur la liste de blocage ou signalées via ce. API, de sorte qu ' une intégration mal configurée ne puisse pas faire tomber la plateforme.

💡
Créez une clé sous Intégrations, puis Clés API 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 &apos; utilisent-ils automatiquement?+

La synchronisation sortante est déjà automatique: lorsque vous bloquez un IP, les plates-formes connectées sont indiquées par la synchronisation de sécurité du connecteur. API est la moitié entrante. Pointez votre connecteur ou code personnalisé sur ces quatre actions avec une clé portant les champs de sécurité.

Où sont les règles du spam?+

Un magasin. Le contrôle de l &apos; expéditeur bloqué sur la page Tickets, le spam AI dans les Paramètres et ce API fonctionnent tous contre la même liste de blocage, 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("demo_booked", {valeur: 0, plan: "pro"});Objectifs de conversionSegmentsDéclencheurs et webhooksNavigateur (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, enregistrer les activités et conversions d &apos; un contact par l &apos. action API. Utiliser crm.activities.record pour le cycle de vie/activité commerciale et crm.conversions.record Il n &apos; y a pas de events.send action; le récepteur d &apos; événement CRM entrant vit à /v1/inbound.php?t=<token> pour des systèmes tiers qui poussent les événements à l &apos; intérieur.

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 nommage

Notation par points

"order. completed" pas "orderCompleted".

Passé

"button. clicked" pas "buttons. click".

Soyez précis

"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 la performance.

Comment ça fonctionne
Comment les données circulent-elles?Flux de données depuis le widget et la balise versOpsIQnoyau (CDP, graphe d'identité, cerveau de l'IA, analyse,CRM) puis par webhooks et le RESTAPI.Widget& baliseOpsIQ cœurGraphique d &apos; identitécerveau IAAnalyse · CRMWebhooks sortantsAPI REST
Flux de données

Flux de données entrant

1
Widget balise

Le JavaScript Le widget envoie des pages vues, des clics et des messages de chat à /beacon.php.

2
Ingestion d &apos; événements

Événements stockés dans opsiq_events avec site_key, type d &apos; événement, client et propriétés.

3
Assemblage de session

Le générateur de sessions regroupe les pages vues en sessions (via cron).

4
Résolution d &apos; identité

Une fois identifiés, les dossiers anonymes sont liés au profil du client.

5
Synchronisation de connecteur

Les connecteurs tirent des données de plateformes externes et les stockent dans le cache du connecteur.

6
Contexte de l &apos; IA

L &apos; IA assemble le contexte à partir de l &apos, historique des visiteurs, profil client, données du connecteur, KB et prompt.

Flux de données sortantes

1
Événements

Évènements internes (ticket. created, chat. message, order. completed).

2
File d &apos; attente des tâches

Événement placé dans la file d &apos; attente des tâches asynchrones.

3
Envoi de Webhook

Le répartiteur signe et envoie à tous les points de terminaison abonnés.

4
Réessayer en cas d &apos; échec

Les livraisons avortées ont été réessayées avec un recul exponentiel.

Paramètres

Référence des paramètres

Les paramètres sont le centre de contrôle d &apos; un espace de travail. Tout ce qui suit est spécifique à l &apos, espace de travaux dans lequel vous êtes, donc un compte peut exécuter plusieurs marques avec différentes identités, comportements de clavardage et règles de conservation.

Trouver un paramètre

Il y a environ six cents contrôles individuels dans Paramètres, répartis sur onze onglets regroupés sous quatre menus. Vous n &apos; êtes pas censé les parcourir.

Paramètres de recherche (Ctrl + K)

Appuyez sur Ctrl + K, ou Commande + K sur un Mac, n &apos; 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. Il ne montre que les paramètres auxquels votre rôle peut accéders.

Espace de travail et plan

Général et Licence.

IA et soutien à la clientèle

Assistant d &apos; IA, chat client, OpsIQ Portail de rédaction et de soutien.

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 enregistré séparément avec son propre bouton Enregistrer. Client Chat et OpsIQ Writing épinglent leur onglet à l &apos; écran. Enregistrez avant de changer d &apos, onglets : les modifications ne sont pas transférées.

Liens profonds

L &apos; onglet actif est écrit dans l &apos, adresse de la page, afin qu &apos. un onglet puisse être mis en favoris ou envoyé à un collègue.

Général: Identité d &apos; entreprise

La carte la plus importante de la page. L &apos; IA lit ces valeurs sur chaque réponse, rapport et brief quotidien.

Nom de l &apos; entreprise

Utilisé dans les rapports d &apos; IA, les notes quotidiennes et le libellé destiné aux clients.

Industrie des affaires

Choisissez parmi l &apos; hébergement Web, le commerce électronique, les services en tant que service (SaaS), l &quot; &quot. immobilier, les agences, le conseil, la santé, l &amp; enseignement, la finance ou les affaires générales.

Langue du système

La langue affichée à tous ceux qui n &apos; ont pas choisi la leur. Chaque agent peut l &apos, outrepasser dans son profil.

Utiliser la langue du navigateur

Affiche la page de connexion dans la langue du visiteur. Une fois que quelqu &apos; un a choisi une langue, son choix l &apos); est pris en compte et n &apos. ; est jamais remplacé par cette option.

Fuseau horaire du système

La zone dans laquelle le système entier fonctionne : dates, rapports, planning et cron en arrière-plan. Utilisez votre fuseau horaire d &apos; exploitation, pas celui de vos clients.

Général: GeoIP et suivi

Chemin de la base de données GeoIP2

Chemin complet vers GeoLite2-City. mmdb. Détection automatique au premier chargement sur cPanel, Plesk, DirectAdmin, Cloudways, Docker et Linux ou Windows ordinaire. Ajouter GeoLit2-ASN. mmbd dans le même dossier pour le fournisseur d &apos; accès à Internet du visiteur.

Mode source géographique

GeoLite2 uniquement, Geo Lite2 avec Cloudflare de secours, ou Cloudflare seulement.Cloudflare les modes nécessitent que le site soit proxy à travers.Cloudflare, avec les en-têtes d &apos; emplacement des visiteurs activés pour la ville et la région.

Délai d &apos; attente de la session (s)

L &apos; inactivité avant la fin d &apos. une session de visiteur est considérée comme terminée. Par défaut 14400, soit quatre heures.

Intervalle d &apos; actualisation en direct (s)

Fréquence d &apos; actualisation 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. C &apos; est la durée du flux en direct, pas la durées de session.

Conservation des données (jours)

Supprime les enregistrements collectés et générés après cette période : analyse, chat, tickets, commentaires, transactions, télémétrie d &apos; IA, journaux d &quot; &quot. intégration et activité CRM. 0 conserve tout pour toujours. Les paramètres, le contenu créé et les reçus de consentement ne sont jamais supprimés.

Quand une conversation est supprimée

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

Compte les robots comme des visiteurs. Laissez cette option active, cela gonfle le nombre de visiteurs et déforme chaque rapport.

Enquête de retour activée

Affiche le widget de commentaires du site aux visiteurs. Séparé des sondages de chat sous Chat client, Flux d &apos; assistance.

Général : Fonctionnalités de l &apos; IA

Commutateurs principaux pour chaque surface d'IA. Tous sont activés par défaut et enregistrés par espace de travail.

Triage par IA 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é de l &apos; opération survolée AI Triage

Affiche les balises de triage et le résumé dans une info-bulle lorsqu &apos; un agent passe la souris sur une ligne de la liste des tickets. Requiert AI Triage.

Copilot (composer)

Ajoute les boutons Brouillon de réponse IA, Plus chaude, Courte, Formelle et Apologie sous la boîte de réponse du ticket. Rien n &apos; est envoyé sans l &apos); agent.

Demandez-moi...OpsIQ Copilote

Le copilote flottant conscient de la page sur chaque page d &apos; administration. Il sait quel client, facture ou ticket est ouvert.

Bref du matin

Chaque jour, à la première ouverture du compte, le copilote présente les tickets urgents, les réponses en retard et les conversations en attente.

Général: argent, marque, sauvegarde

OpsIQ devise de base

Chaque montant total dans l &apos; administration est converti en cette devise pour affichage. Les connecteurs stockent leur propre devise source, définissez-la par connecteur.

Synchroniser automatiquement les taux FX

Actualise les taux toutes les six heures à partir d &apos; un flux public gratuit sans clé API. Vous pouvez ajouter des taux manuels qui remplacent le flux. Si la synchronisation automatique est désactivée, les devises sans taux manuel ne sont pas converties.

Activer les fonctionnalités Commerce et Facturation

En l &apos; activant, la page Ventes et conversions, les cartes de revenu du tableau de bord et le flux d &apos. information en direct sont affichés. Si cette option est désactivée, toutes les surfaces des 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.

Marque et logos

Deux téléchargements, un pour les arrière-plans clairs (barre latérale d &apos; administration) et l &apos. autre pour les sombres (page de connexion). PNG, JPG, WebP ou SVG jusqu &apos: 3 MB.

Agent de renseignements sur le site, autoriser les cibles privées SSH

L &apos; agent SEO d &apos, 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. N &apos: activer que pour les installations autohébergées qui doivent atteindre un serveur local.

OpsIQ Sauvegarde / Restauration

Exporte tous les paramètres et la table appartenant à OpsIQ ainsi que les fichiers téléchargés. Restaurer remplace uniquement la configuration et les enregistrements de _OpsIQ; il ne touche jamais les clients, factures, tickets, services, domaines, commandes ou transactions.

⚠️
Faites une sauvegarde avant d &apos; utiliser quoi que ce soit dans Danger Zone. La sauvegardes est stockée dans General et les actions de suppression sont stockées dans Dangers Zone, il est donc facile d &quot; &quot); s accéder au bouton Supprimer sans avoir exporté au préalable.
Paramètres

Paramètres: Sécurité

Protection pour la connexion d &apos; administrateur, les comptes de votre personnel et les données collectées par OpsIQ. La connexion du client au portail d &quot; &quot); support &quot: &quot. est configurée séparément.

Protection de connexion

Google reCAPTCHA

Arrête les robots et le bourrage d &apos; informations lors de la connexion administrateur. Choisissez v3 (invisible, marqué) ou v2 (case à cocher), définissez le seuil de score v3, puis 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 &quot; &quot); assistance &quot.

Verrouillage automatique en cas d &apos; échec de connexion

Bloque une adresse après un certain nombre de pannes dans une fenêtre, pendant un certain temps. Vous pouvez personnaliser le message verrouillé et afficher une petite distraction d'écran d'attente.

Durcissement de connexion

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 &apos; informations d &quot; accès, double facteur obligatoire pour chaque administrateur, saisie à nouveau du mot de passer avant toute action dangereuse et alertes lors de la connexion sur un nouvel appareil.

Authentification unique (OIDC)

Connexion du personnel via votre fournisseur d &apos; identité. Nécessite l &apos, émetteur URL, ID client et secret client. Les domaines à approvisionnement automatique, un par ligne, créent les utilisateurs automatiquement lors de la première connexion.

Authentification unique (SAML 2.0)

Pour les fournisseurs qui parlent. SAML. OpsIQ fournit la réponse ACS.URL et ID de l &apos; entité SP ; vous fournissez le IdP entity ID, connectez-vous URL, déconnexion facultative URL et X.509 certificat de signature. Les champs d &apos; attribut courriel et nom ne sont nécessaires que pour les noms d ’ attributs non standard.

Provisionnement SCIM

Création, mise à jour et désactivation de OpsIQ comptes.OpsIQ fournit le SCIM base URL; vous générez ici des jetons étiquetés afin qu &apos; un soit révoqué sans casser le reste.

Menaces, blocage et collecte

Liste d &apos; autorisation de sortie

Restreint les hôtes externes que ce connecteur d &apos; espace de travail peut appeler. Compagnon du contrôle cible SSH dans Général.

Notation des menaces et blocage automatique

Bloque un visiteur dès que son score de menace dépasse votre seuil. 0 le désactive. Regardez la page Aperçu de sécurité pendant une semaine avant de choisir un nombre.

Message de page bloquée

Le message qu &apos; un visiteur bloqué voit, en texte brut ou dans votre propre écran de blocage personnalisé HTML.

Core Web Vitals de vrais visiteurs

Mesure LCP, INP et CLS à partir de sessions réelles.

Livraison d &apos; événements par lots et sans risque de réessai

Les événements personnalisés sont mis en file d &apos; attente dans le navigateur et envoyés par lots avec réessais, ce qui réduit les pertes sur les connexions mobiles de mauvaise qualité.

Balises de suivi signées

Les widgets intégrés véritables contiennent un jeton cryptographique tournant afin que les données de suivi falsifiées puissent être rejetées. Désactivé par défaut; l &apos; activation modifie la manière dont les widgets sont authentifiés, donc testez d &apos);

Alertes de sécurité

Désactivé par défaut. La détection et le blocage s &apos; exécutent indépendamment. Cette carte contrôle si vous êtes informé, et dans quelle mesure l &apos); est assistée par l &quot; &quot.

Activer les alertes de sécurité

Commutateur principal pour cette carte.

Seuil de vague d &apos; échec de connexion

Combien de connexions ayant échoué sur une courte période comptent comme une vague qui mérite d &apos; être signalée.

IP l &apos; intelligence de la réputation

Ajoute un score de menace pour les visiteurs apparaissant dans des flux d &apos; abus publics.

Observation du site

Vérifications de disponibilité horaires et d &apos; expiration TLS, alerte avant l &apos.

Analyste de sécurité IA et résumé d &apos; incidents IA

Ajoute un verdict explicable à une activité suspecte, et regroupe les attaques connexes en un seul incident lisible plutôt qu &apos; en un flux d &apos.

Pilote automatique de politique

Il agit de lui-même, transformant ce qu &apos; il apprend d &apos. à partir d &quot; un incident en une règle proposée ou appliquée. Arrêtez jusqu &apos: a que vous ayez examiné ses propositions et soyez d &amp; ; accord avec elles.

Résumé quotidien de sécurité et conseiller hebdomadaire de posture

Un résumé quotidien sur la page Aperçu de sécurité, et une liste hebdomadaire de contrôle du durcissement 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 &apos; avez jamais agi expire d &apos.

Rejouer 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 &apos; est jamais chargée, donc il n &quot; y a pas de coût à le laisser désactiver. Les enregistrements sont échantillonnés et masqués en vue de la confidentialité, et sont vus sur la page Replay Session sous Analyses.

Taux d &apos; échantillonnage, capture maximale, conservation

Quelle part des sessions enregistrer, combien de temps un seul enregistrement peut durer et combien d &apos; heures les enregistrements sont conservés.

⚠️
La lecture de session enregistre les vraies personnes qui utilisent votre site. Gardez le taux d &apos; échantillonnage et la rétention aussi bas que possible pour 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 &apos; enregistrement est conservé.

Exclusions

Plages IPs et CIDR exclues

Adresses jamais suivies, une par ligne, adresses exactes ou plages CIDR. La façon la plus propre de garder votre propre équipe hors de vos analyses, car elle couvre tout le monde à cette adresse plutôt que seulement les administrateurs connectés.

Chemin d &apos; accès exclus URL

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

Nettoyage automatique par sous-système en jours. Séparé du paramètre de conservation des données global dans Général et du nettoyage de la zone dangereuse.

Journals d &apos; interaction avec l &apos. I.

Télémétrie de confiance contenant des aperçus courts de la requête et de la réponse. Par défaut 90 jours. Cela contient le texte du client, donc raccourcissez-le en premier lorsque vous resserrez la confidentialité.

Événements d &apos; utilisation de l &apos. i.

Compte par jeton d &apos; appel pour les rapports de coût. Par défaut 90 jours. Numéros seulement, pas de contenu du message.

Piste d &apos; audit des actions

Le journal des actions et de la sécurité à l &apos; évidence. Par défaut, il est conservé pendant 365 jours. Il doit être conservé le plus longtemps possible pour servir de piste d &apos);

Diagnostic

Enregistrements de l &apos; état du système. Par défaut, 30 jours.

Questions sans réponse

Groupes de questions auxquelles l &apos; IA n &apos. 90 jours par défaut. Travaillez sur ces questions sur la page Questions manquées par l &quot; &quot, avant qu &apos: elles expirent.

Les chiens de garde et les exportations

Alertes d &apos; anomalie métrique

Comparaison quotidienne d &apos; hier avec la base récente, alerte lorsqu &apos. une mesure dépasse votre seuil. Par défaut 35 pour cent. Désactivé par défauts.

Exportation d'entrepôt

Des vidages nocturnes des sessions, visiteurs, pages vues et tables associées pour votre propre pile BI, dans un format de votre choix, conservés pendant un certain nombre de jours. Désactivé par défaut.

Paramètres

Paramètres: Assistant d &apos; administration

L &apos; assistant flottant que votre personnel utilise dans l &apos, avec un accès en lecture directe aux clients, factures, tickets, serveurs et journaux cron. Un assistant différent de celui qui est destiné au client sous le chat client.

Activer le widget OpsIQ AI

Affiche le bouton assistant sur chaque page d &apos; administration. Désactivé le cache pour tout le monde.

Mise en page et comportement

Position du coin, largeur du panneau (320 à 600 px), max height (400 à 900 px), rayon d &apos; angle (0à 24), la taille de la police, et un flou en verre dépoli derrière le panneau.

Afficher les jetons rapides

Boutons de raccourci en un clic sous l &apos; en-tête. Le moyen le plus rapide pour la plupart des membres du personnel.

Afficher les informations sur le modèle

Affiche le modèle qui a répondu et combien de temps cela a pris. Utile pour régler les coûts, bruit pour un usage quotidien.

Passerelle d &apos; accès par administrateur

Ne montre l &apos; assistant qu &apos. à un administrateur connecté dont le nom d &apos, utilisateur et l &quot; &quot, adresse électronique correspondent tous deux à un agent OpsIQ assigné à cet espace de travail. Les propriétaires passent toujours. Utilisez le bouton Vérifier mon accès avant d &quot. activer ou vous pouvez verrouiller votre propre équipe.

Personne de l'IA

Nom d &apos; affichage, en-tête et message de bienvenue personnalisé à l &apos. ouvrir lorsque le panneau s &apos: ouvre.

Puces intelligentes à action rapide

Modifier l &apos; étiquette et l &quot; &quot.

Couleurs et formes

Forme de jeton (pilule, arrondi, carré), couleurs des jetons, thème de carte et forme du lanceur (rond, squircle, carrée), avec un aperçu en direct.

Mémoire de conversation

L &apos; assistant se souvient de l &apos, historique de chaque personne à travers les sessions du navigateur, jusqu &apos. aux messages 120, stockés dans votre propre base de données. Effacer pour recommencer.

Paramètres

Paramètres: Client de clavardage

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 &apos; onglet.

Parcourez les sous-onglets dans l &apos; ordre sur une nouvelle installation : Identité et copie, Apparence, Comportement, Flux de support, Formation aux connaissances. Avancé est l &quot; &quot); infrastructure et peut attendre.

Identité et copie

Identité de marque

Nom du widget, slogan, nom de l &apos; IA, le nom utilisé pour les notifications système et d &apos. inactivité, et comment apparaissent les noms des agents. La source du nom de la personne décide entre les vrais noms, un nom personnalisé ou une étiquette d &quot; &quot.

Salutation en cours de conversation

Deux salutations, une pour tous les visiteurs et l &apos; autre pour ceux qui ont été identifiés.

Découpe-poupée

Le message flottant avant l &apos; ouverture du chat, avec son propre nom, sa taille de police et ses couleurs. L &apos: IA peut écrire les teasers, en contrôlant le nombre à générer, le nombre d &apos); afficher par visite et l &quot; &quot.

Invites et Handoff

Le script complet : demander un nom et une adresse e-mail, confirmations, demande d &apos; un humain, aucun agent disponible, ticket créé ou annulé, transfert en attente. Environ deux douzaines de lignes individuelles dans un panneau rétractable.

Notifications d &apos; état et d &quot; &quot.

Trois messages visibles par le client : l &apos; agent ferme la conversation, le visiteur se tait et l &quot; &quot. Évitez les formulations internes telles que résolue ou triée.

Compositeur et suggestions

Un espace réservé pour la saisie, l &apos; étiquette du bouton « parler à un humain » et les questions d &apos. Trois bonnes suggestions détournent plus de tickets qu &apos: une page d &quot; articles &quot.

Lanceur, icône et avatars

Icône du lanceur, une icône différente en option lorsqu &apos; elle est ouverte, taille du lanceurs et images pour l &apos. agent humain et l &quot; &quot. IA.

Apparence

Thème et verre

Mode Thème, un préréglage de couleur premium, l &apos; intensité et l &quot; &quot. opacité du flou, ainsi que des bascules pour les animations, les lignes séparatrices, le masquage de la ligne d &apos. état, le masquer de la carte de boîte à messages et le masque de bouton de fermeture. Commencez par un préremplissage qui définit des dizaines de couleurs en même temps.

Couleurs principales

Lanceur, en-tête, panneau d &apos; aide, liens, boutons, notifications système et compositeur, chacun avec une couleur de début et de fin pour les dégradés. L &apos); option utiliser le verre par défaut ignore ces éléments et conserve la finition transparente.

Panneau, bulles et éclats

Environ trente sélecteurs couvrant le panneau, la bordure, le texte, la zone de saisie et chaque type de bulle (visiteur, IA, agent, frappe, système) plus les puces de suggestion et leur état de survol. Ouvrez-les uniquement pour une correspondance exacte avec votre marque, et vérifiez le contraste du texte des bulles.

Mise en page et forme

Largeur et hauteur du panneau, rayon des angles, taille de la police, position à l &apos; écran, forme du lanceur, style de bulle et affichage ou non des avatars. Testez la largeur sur un téléphone.

Comportement

L &apos; IA répond automatiquement.

Interrupteur principal pour les réponses de l &apos; IA. Désactivé signifie que chaque message attend une réponse humaine.

Les suivis humains et les double-textes naturels

Un suivi doux lorsqu &apos; un visiteur se tait, et un deuxième message court facultatif comme une personne en enverrait. Réglé avec le nombre maximum de suivis par silence, le délai pour la première fois, le multiplicateur plus tard, la fenêtre de présence et la fenêtre de séquence maximale. Peut être limité aux heures ouvrables, et supprimé après un simple remerciement.

Réponses à la machine à écrire et rythme de réponse

Indique si les réponses sont tapées mot par mot, et à quelle vitesse l &apos; assistant répond, selon un délai prédéfini ou votre propre délai minimum et maximum en millisecondes. Un petit délai est plus humain qu &apos); une réponse instantanée.

Traduction en direct

Chaque agent lit et écrit dans sa propre langue tandis que le visiteur lit la sienne.

Remise à l &apos; IA après inactivité de l &quot; &quot.

Minutes d &apos; inactivité de l &apos, agent avant que l &quot; &quot. IA reprend la conversation.

Ouvrir automatiquement le chat

Les secondes avant que le widget ne s &apos; ouvre. 0 n &apos,ouvre jamais. Intrusif sur mobile; laissez à _0 sauf si testé.

Des réponses plus intelligentes

Planifier à l &apos; avance les réponses en une seule fois, réfléchir en profondeur, un modèle séparé facultatif pour les réponse de l &quot; &quot. agent, montrer le raisonnement aux visiteurs, tolérer les fautes d &apos); orthographe, mémoriser les longues conversations, limiter l &amp; adjoint à votre entreprise seulement, les prix dans la monnaie du visiteur et comment apparaissent les liens.

Économies de coûts

Ignore la recherche de connaissances pour les salutations telles que bonjour et merci, et limite la réponse la plus longue en jetons. Réduit le coût sans changer la qualité des réponses sur les vraies questions.

Langues

Les langues que le widget prend en charge et comment il choisit une pour un visiteur.

Réponses du compte client

Réponses d &apos; un compte client connecté, éventuellement recherchées en direct et éventuellement chargées seulement 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ées où l &apos; 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 vous envoyer un e-mail et laisser votre équipe transformer un chat en ticket.

Caractéristiques du widget

Sélecteur d &apos; émoticônes, pièces jointes avec un mode optionnel de collage seulement, compréhension des images par IA, icônes intégrées, microphone, bouton parler à l &apos. agent, sons du visiteur, aperçu des pièces attachées, bouton d &quot; &quot); appel vocal et isolation de la session. La compréhensibilité des images est ce qui permet au visiteur de coller une capture d &amp; eacute;cran d &lt; &lt. erreur et d &gt; obtenir une réponse utile.

Boîte de réception, notifications et fenêtre contextuelle d &apos; accueil

La fenêtre contextuelle de bienvenue du visiteur, ainsi que vos alertes d &apos; agents : sons de boîte de réception, notifications sur le bureau, murmure sonore, si les murmures privés bipent et l &apos. intervalle de sondage dans la boîte à lettres.

Flux de soutien

Transmission humaine

Comment les demandes d &apos; une personne sont attribuées, le nombre de secondes qu &apos. un agent doit répondre, si le refus renvoie la conversation à l &apos, IA et si l &quot; &quot); AI reprend lorsque le délai expire. Configurez ceci avant de passer en direct ou un visiteur qui demande pour un humain attend simplement.

Heures de travail

Heures d &apos; ouverture, fuseau horaire et message de fermeture. En dehors de ces heures l &apos); IA n &apos: offre pas un humain. Un calendrier distinct des heures d &quot; activité du ticket sous OpsIQ Writing.

Réponses lorsque l &apos; IA est désactivée

La première réponse à un nouveau message, la réponse quand quelqu &apos; un est déjà dans la file d &apos. et le délai 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

La prise de conscience des tickets par l &apos; IA, afin qu &apos. un visiteur citant un numéro de ticket en obtient le statut réel et les départements vers lesquels l &quot; &quot); il peut être acheminé. Un panneau intégré montre les véritables destinataires pour chaque service, réglés de la même manière que le notifiant les résout, vous pouvez donc voir avant qu &quot. un client qu &amp; #160;un service n &apos: alerte personne.

Centre d &apos; aide dans le widget de chat

Permet aux visiteurs de parcourir les articles publiés sans quitter le chat. Vous choisissez où apparaît le point d &apos; entrée, l &apos); icône et la barre inférieure, et si vous souhaitez offrir un lien vers le centre d &quot; &quot. Désactivé par défaut.

Évaluation de la conversation

Notation en étoiles déclenchée lorsqu &apos; un agent ferme le chat, quand une transmission se termine ou après une période d &apos. Choisissez un ou deux déclencheurs, pas tous.

Sondage post-chat

Un court sondage lorsque le visiteur ferme la discussion, avec votre question, délai, règle de temps et un plafond par visite. Les visiteurs peuvent également envoyer ou télécharger la transcription. Une question est répondue; trois ne le sont pas.

Sondage par courriel après le chat

Un sondage de suivi par courriel après la fin de la conversation, éventuellement dans la langue du visiteur qui a discuté, avec contrôle sur le délai, l &apos; objet, l ’ introduction, la question, les deux boutons et la ligne de remerciement.

Répondre

Des pouces vers le haut et vers le bas sur chaque réponse d &apos; IA, alimentant les tableaux de bord de qualité.

Archive de conversation

Archiver automatiquement après quelques jours, résoudre automatiquement les conversations archivées après des minutes de silence et supprimer ces dernières après plusieurs jours. Une troisième place est réservée à la conservation, aux côtés de Général et Suivi.

Formation en connaissances

Ce que l &apos; assistant sait réellement. Rien d &apos, autre dans le clavardage client n &apos.

Formation sur les connaissances du site Web

Parcourt votre site afin que l &apos; assistant puisse y répondre. Jusqu &apos, à 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 parcours complet. Exclure les chemins d &apos: commande, compte et administrateur.

Intégration

La clé et le modèle API qui transforment les pages en mots-clés de recherche plutôt que des mots-clefs.

Organisateur de connaissances IA

Un clic et l &apos; IA lit chaque FAQ et page explorée et les trie en catégories.

FAQ, réponses vérifiées

Les paires de questions et réponses sont traitées comme la source à priorité maximale, chacune avec un statut, un poids et une catégorie. Recherchable, importable depuis JSON, et l &apos; IA peut les écrire à partir d &apos); une description de votre entreprise. Lorsque l &quot; &quot: assistant obtient quelque chose qui ne va pas, écrivez une FAQ : elle surclasse les pages explorées, donc le correctif est immédiat.

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èce jointe par fenêtre et extensions de fichier autorisées. La liste d &apos; extensions est un contrôle de sécurité ; gardez-la stricte.

Livraison en temps réel

Messagerie instantanée et livraison de statut au lieu d &apos; interrogation, via Pusher, Ably ou Firebase, avec un intervalle de rechange. L &apos: Intervention est acceptable pour la plupart des sites.

Notifications push

Alertes de périphérique pour les agents via Pusher Beams ou OneSignal, avec un intérêt de péliphérique.

Push Web (VAPID)

Pousser le navigateur en utilisant vos propres clés générées sans fournisseur tiers. Généré ici, pas dans Danger Zone.

Partage de la voix, de la vidéo et de l &apos; écran

TURN les identifiants 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 &apos; utilisateur et identifiant.

Flux de travail de la boîte de réception

Paramètres de l &apos; espace de travail des agents plutôt que les paramètres du visiteur : accord de niveau de service (SLA) pour la première réponse en quelques minutes, vues enregistrées de files d &apos. attente, raccourcis clavier et palette de commandes, recherche dans la conversation et tickets clients dans l &quot; &quot. inspecteur.

Chaînes de messagerie

WhatsApp, SMS, Facebook Messenger, Instagram, Telegram, X direct messages et LINE, chacun avec son propre commutateur de réponse automatique par IA, plus un commutador de politique pour les actions d &apos; IA sur les canaux, une fonction de déblocage des réponses et le modèle de réengagement WhatsApp.

Un aperçu en direct du widget au bas de l &apos; onglet est mis à jour lorsque vous modifiez. Utilisez-le plutôt que de recharger votre site Web pour vérifier un changement.
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 de magasin, le mot de passe réinitialisant, 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

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 à l'heure d'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 ni 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 auxquels on répond par écrit : réponses automatiques, système de ticket natif, escalade, heures d &apos; ouverture, routage et courriels adressés au client.

Réponse automatique

Afficher OpsIQ Boutons d &apos; écriture

Ajoute les boutons d &apos; aide à l &apos. écriture pour vos agents dans le panneau d &quot; &quot, admin.

Activer la réponse automatique aux tickets

Met en file d &apos; attente les nouveaux tickets et répond à ceux-ci après un délai. Commencez par le désactiver et examinez les brouillons pendant une semaine. Les remboursements, annulations et modifications d &quot; &quot); accès devraient toujours être envoyés à une personne.

Départements de réponse automatique

Les départements auxquels la réponse automatique peut répondre. Tout ce qui n &apos; est pas répertorié est laissé pour un humain, ce qui est le paramètre par défaut sécurisé.

Programme de retard de réponse (minutes)

Le temps d &apos; attente avant l &apos. envoi de la réponse automatique. Une réponse instantanée est lue comme un robot ; quelques minutes sont lues comme une équipe rapide.

Réponses IA maximales par ticket et par département

Un plafond par département, par exemple la facturation1et d ' appui3. Sans bouchon, un fil confus peut se boucler.

Longueur, statut et identité de la réponse

Nombre maximum de jetons d &apos; écriture, statut du ticket après une réponse et après un escalade, et compte administrateur auquel les réponses automatiques sont attribuées. Utilisez un compte clairement nommé pour que le personnel puisse distinguer les réponse de l &apos); IA 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 service d &apos; assistance 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éponses à plusieurs tours, retard et décompression

Indique si l &apos; IA continue de répondre pendant que la conversation se poursuit, et s &apos. 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 destinée au client où tout le monde peut soulever et suivre un ticket, avec une ligne de bienvenue facultative. Son adresse et son apparence sont configurées dans l &apos; onglet Portail d &apos: assistance.

Format du numéro de billet

Nombre de lettres aléatoires apparaissant dans les numéros de ticket générés.

Envoyer des courriels aux 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, plus des messages de confirmation lorsqu &apos; un ticket est ouvert, lorsque des commentaires sont laissés et quand un ticket a été fermé, chacun avec un aperçu en direct. Il existe également un modèle d &apos); e-mail global et le lien derrière le bouton afficher votre ticket.

Filtrage des spams par IA

Filtre les tickets provenant d &apos; expéditeurs inconnus et peut éventuellement déplacer lui-même les courriers indésirables suspectés. Laissez le déplacement automatique désactivé jusqu &apos, à ce que vous ayez observé son jugement.

Fermer automatiquement les tickets inactifs

Ferme un ticket après un certain nombre de jours tranquilles. Indiquer au client dans le message de fermeture comment rouvrir.

Heures d &apos; ouverture (calendrier SLA)

Fuseau horaire, heures d &apos; ouverture et de fermeture, jours ouvrables et vacances pour les minuteries de première réponse et de résolution. Un calendrier distinct des Heures de travail sous le chat client.

Attribuer automatiquement de nouveaux tickets

Assignation automatique, en option uniquement aux agents qui sont en ligne, avec des compétences d &apos; 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 &apos; un autre qu &apos, avec une sensibilité de correspondance réglable.

Enquête de satisfaction après la fermeture

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

Envoie un e-mail au département lorsqu &apos; un nouveau ticket arrive. Les destinataires sont les membres de ce département, et non l &apos); adresse de la boîte aux lettres du département qui est celle sur laquelle les tickets arrivent.

Ce que l &apos; IA peut lire

Accès aux données client d &apos; IA

Un commutateur principal plus des permissions 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 du compte de haut niveau. 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 &apos; escalade des tickets 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 &apos; escalade. Activez la note interne d &quot; &quot); escalade &quot: } afin que votre équipe puisse voir pourquoi un ticket a été déplacé.

Paramètres de connaissance

Si les réponses utilisent le langage du client, s &apos; ils se basent sur des liens parcourus et des questions fréquemment posées, PDF pièces jointes, le mode de réponse aux connaissances, importé ou non JSON Utiliser des liens crawlés et les FAQ devraient être activées, sinon l &apos; intelligence artificielle se contente de deviner.

Arrêter la réponse automatique après une réponse humaine

Une fois que le personnel répond, l &apos; IA cesse de répondre à ce ticket. Sans cela, l ’IA peut parler par-dessus votre propre agent.

Instructions de billet et courriel

Des instructions en texte libre façonnant le ton et le contenu de chaque réponse, avec un exemple fonctionnel chargeable. Soyez précis sur ce que l &apos; IA ne doit jamais faire.

Importer les connaissances de JSON

Télécharger ou coller un fichier de connaissances JSON pour l &apos; assistant d &apos.

Studio des boutons

Un concepteur complet pour le bouton client : style d &apos; 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 en mode inactive, mouvement du curseur et couleurs, et anneau 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 soutien

Le site client où les utilisateurs soumettent et suivent des tickets et lisent vos articles d &apos; aide. Cet onglet contrôle la manière dont il est accessible et dont les clients se connectent ; sa conception visuelle est réalisée dans le Support Portal Studio.

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 utiliser 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 &apos; expérience de libre-service: articles d &apos. aide avec recherche, le formulaire de demande, historique des tickets, connexion client et assistant. Choisissez un modèle, passez par Thème, Navigation, Mise en page, Connaissances, Pied de page, Marque, Tickets, Assistant, Formulaire et CSS, prévisualisez sur ordinateur, tablette et téléphone, puis publiez.

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 &apos; assistance sur votre propre site Web.

Portail de billets embarqués: billets à l'intérieur de votre propre site

L &apos; intégration met en place seulement l &apos; expérience du billet sur une page de votre propre site web,Les clients ouvrent, suivent et répondent aux demandes d &apos; assistance sans jamais quitter vos pages. Votre propre en-tête, votre navigation et votre design restent exactement les mêmes. Définissez la mise en page, l &apos: apparence et les règles d accès dans le générateur de widgets, prévisualisez le résultat, puis copiez l &quot; &quot); extrait incorporé &quot.

Utilisez-le quand vous avez déjà un site web ou une application avec sa propre conception, et vous voulez que le support se passe à l &apos; 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 des clients. L &apos; insertion apporte des tickets 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 &apos; accès

Si le portail est ouvert à tous ou restreint aux clients connectés. Les portails ouverts reçoivent plus de tickets et plus de spam.

Options de mise en page

Si le portail et le centre d &apos; aide partagent un héros ou en utilisent deux, quel navigateur et pied de page apparaissent sur les deux surfaces, et l &apos. étiquette de la section de navigation.

Adresse du portail

L &apos; adresse utilisée par les clients. Choisissez un nom et OpsIQ affichera le portail résultant ainsi que les adresses correspondantes du centre d &apos, aide. Si vous changez ce nom plus tard, les liens déjà envoyés seront supprimés.

Votre propre domaine

Serve le portail à partir d &apos; un domaine qui vous appartient, tel que support. votredomaine. com.

Portail de tickets intégré

Active le widget déroulant décrit ci-dessus et ouvre l &apos; outil d &apos. intégration où vous pouvez choisir la disposition, l &quot; &quot); apparence et les règles d &quot. accès, prévisualiser le résultat et copier l &amp; e fragment pour votre page. Ce n &apos: est pas le Studio du portail: le Studio conçoit le portail hébergé, ce qui place des tickets dans votre propre site. Les deux peuvent être activés à la fois.

Comment les clients se connectent-ils?

Voici les options de connexion pour vos clients. La connexion du personnel est configurée sous Paramètres, Sécurité.

Méthodes de connexion

Quelles options apparaissent sur la page de connexion. La connexion au connecteur et à l &apos; adresse électronique fonctionne automatiquement.

Connexion sociale

Fournisseurs de comptes consommateurs, chacun ayant besoin d &apos; un identifiant client et d &quot; &quot. secret, avec l &apos. adresse de redirection fournie par OpsIQ pour s &apos); inscrire auprès de ce fournisseur.

Authentification unique (OIDC)

Connexion client via un fournisseur d &apos; identité, avec émetteur URL, ID du client, secret et une liste facultative de domaines e-mail autorisés.

Client SAML 2.0

Le SAML équivalent. OpsIQ fournit la réponse ACS.URLet ID de l &apos; entité SP ; vous fournissez les identifiants IdP, de connexion et de déconnexion des entités URLs X.509 noms de certificat et d &apos; attribut facultatifs.SAML dans Méthodes de connexion ou il n &apos; 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

Se déconnecter du portail signifie aussi que le client se déconnecte de votre application.

Prise et protection

Champs du formulaire de demande

Les champs structurés que le formulaire de demande recueille. Chaque champ supplémentaire perd des soumissions, alors ne demandez que ce dont vous avez besoin pour trier.

Protection contre les spams 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. reCaptcha réutilise les clés déjà définies sous Paramètres, Sécurité; Les clés du tourniquet sont saisies ici.

Analyse du portail

Un résumé en lecture seule de l &apos; activité du portail au cours des trente derniers jours.

Paramètres

Paramètres : Permissions, Licences, Cron et Zone de danger

Le groupe Système, plus les contrôles d &apos; accès de l &apos. équipe qui décident qui peut voir quel onglet Paramètres.

Accès et autorisations de l &apos; équipe

Permissions par administrateur

Chaque administrateur reçoit un ensemble explicite de permissions qui couvre l &apos; accès à la boîte de réception du chat, les sections des paramètres qu &apos. ils peuvent modifier et leurs départements. Toute personne ayant le rôle d &apos: Administrateur complet dispose toujours de toutes les permissions. Les permissions relatives aux paramètres déterminent quels onglets une personne peut voir, accordez donc l &quot; &quot); &gt; l &lt; ensemble le plus restreint qui lui permet de travailler.

Licence

Affiche votre licence actuelle, ce qu &apos; elle vous donne droit à faire et son statut.

Configuration de Cron

Installations auto-hébergées uniquement. Sur le nuage OpsIQ, les tâches planifiées s &apos; exécutent pour vous et l &apos); onglet est caché. Une ligne de crontab pilote chaque tâche planifiée: réponse automatique aux tickets, routage d &apos. escalade, actualisation du taux de change, sondage des boîtes aux lettres et synchronisation des connecteurs.

1
Copier la ligne

L &apos; onglet affiche la ligne crontab exacte pour votre serveur avec le binaire PHP correct déjà sélectionné.

2
Ajouter à crontab

Exécutez crontab -e en tant qu &apos; utilisateur exécutant PHP et collez la seule ligne. Sur cPanel, utilisez l &apos); outil Cron Jobs à la place.

3
Vérifier

Dans une minute, les tuiles de battement du cœur s &apos; allumeront. Utilisez Exécuter maintenant pour tester immédiatement plutôt que d &apos); attendre.

Le panneau des pulsations montre la dernière exécution, sa durée et ce qui a été traité pour les files d &apos; attente de réponse automatique ainsi que le sondage par courrier électronique et connecteur. Il avertit lorsque la dernière opération provient du bouton Web manuel plutôt qu &apos); un vrai cron du serveur, et quand une pulsation est devenue obsolète.

Zone de danger

Supprimer toutes les données de suivi

Efface tout ce que OpsIQ a collecté ou généré. Vous cochez les éléments à inclure et tapez exactement la phrase de confirmation. Les paramètres et la configuration du site, les adresses bloquées, tout ce qui a été écrit par votre équipe (base de connaissances, FAQ, traductions, conceptions de portails, définitions d &apos; actions) et les reçus de consentement sont tous conservés.

Supprimer les données plus anciennes que

Le même balayage s &apos; est limité aux enregistrements plus anciens que. 30, 60, 90 ou 180 jours, ou un an. Pour une conservation automatique continue utilisez les valeurs de rétention dans Général et Suivi à la place et laissez la tâche planifiée le faire.

🚫
Exporter une sauvegarde depuis Paramètres, Général avant d &apos; 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 &apos; équipe et assignez des rôles pour contrôler qui peut accéder à quoi.

Équipe
Équipe et départementsL &apos; écran de l &apos, équipe : un tableau des administrateurs avec contact, badge du rôle (propriétaire, administrateur complet, agent) et les services auxquels chacun peut accéder.Équipe et départementsespace de travailÉquipe et départements+ Sauvegarder l &apos; utilisateur administrateurContactRôleDÉPARTEMENTSAO[email protected]Ada OwusuPropriétaireToutKM[email protected]Kojo MensahAdministrateur completToutRT[email protected]Rita Tetteh.AgentFacturationSB[email protected]AgentSoutien1TEAMInviter et 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.

Administrateur complet

Accès complet sauf licence et zone de danger. Peut gérer les administrateurs.

Agent

Limité aux départements assignés. Tickets, chats et analyses uniquement.

Inviter des membres de l &apos; équipe

1
Aller à l &apos; équipe

Accédez à Équipe dans la barre latérale.

2
Cliquez sur Inviter

Entrez l &apos; adresse électronique du membre de l &quot; &quot.

3
Définir le rôle

Choisissez Propriétaire, Administrateur complet ou Agent.

4
Attribuer des départements

Pour Agents, sélectionnez les départements accessibles.

5
Envoyer une invitation

Ils reçoivent un courriel avec un lien de configuration.

Paramètres

Performance de l &apos; é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 &apos; équipe
Performance de l &apos; équipeL &apos; écran de performances d &apos, é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 &apos; équipeespace de travailPerformance de l &apos; équipeAgentScoreCSATBalanceRTRita Tetteh.4.8$42PayerSBSam Boateng.4.5$28PayerKMKojo Mensah4.2$15PayerAOAda Owusu4.9$51Payer1SCOREDPerformances composites2CSAT & LOADNotes + volume3REWARDSSoldes des agents de paiement
L &apos; écran de performances réelles des équipes : chaque agent est noté en fonction du volume et du CSAT, avec un solde de récompenses que vous pouvez payer par rangée.

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. 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 &apos; une seule installation OpsIQ. Chacun a son propre suivi, IA, connecteurs et accès aux équipes.

Sites
Vos sitesL &apos; écran des sites : une liste d &apos, espaces de travail, chacun avec son domaine, son type, son connecteur, son badge d &quot; &quot.Vos sitesespace de travailVos sites+ 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 jamais.3PER-SITEParamètres et connecteurs personnalisés
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, domaine et description.

3
Copier la clé du site

Chaque site reçoit une clé unique (site_xxx) pour l &apos; 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 d &apos; IA.

Licence
Centre de licenceLe OpsIQ License Center: plan, un badge d &apos; état actif, la clé de licence masquée, un compteur de crédits IA et un bouton Forcer le contrôle à distance.Centre de licenceespace de travailOpsIQ Centre de licencesPlanAffairesStatutActifCléOPSIQ-••••-••••-2F9CCrédits d &apos; IA$68 resteForcer la vérification à distance1PLAN & STATUSActif, en un coup d &apos; oeil2KEYHMAC-caché localement3CREDITSBalance et limites de l & IA
Le vrai centre de licences : votre plan et statut actif, la clé masquée, votre solde de crédit d &apos; IA et une revérification forcée en un clic.
Clé de licence

Entrez dans Paramètres > Licence. Validé par le serveur de licence OpsIQ.

Licence heartbeat / validation

OpsIQ normally reads its signed local license cache and refreshes validation when required. Use Force remote check when you need an immediate result; Diagnostics identifies DNS, HTTPS ou des problèmes de serveur-temps.

Plan

Détermine la disponibilité et les limites des fonctionnalités.

Limite du site

Nombre maximal d &apos; espaces de travail.

Crédits d &apos; IA

Si vous utilisez l &apos; IA gérée, votre solde de crédit est affiché ici.

Expiration

Renouveler avant l &apos; 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 &apos; IA sont suspendues jusqu &apos); les données sont conservées.

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 &apos; authentification à deux facteurs.

Ecran du produit
Mon profilLa page de profil sépare les détails personnels, la langue/le fuseau horaire, l &apos; avatar/la signature, le mot de passe et l &quot; &quot.Mon profilespace de travailPROFILCompletTIMEZONEEurope/Athènes2FAActivéVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTNom et adresse électroniqueIdentité personnelleÉditerLangue et fuseau horaireDates et interfaceÉditerAvatar et signatureRéponses et présence de l &apos; équipeÉditerMot de passe et 2FAProtection du compteSécurisé1UPDATE PROFILEIdentité et paramètres régionaux2SECURE LOGINMot de passe et 2FA3SAVEAppliquer à cet administrateur
La page de profil sépare les détails personnels, la langue/le fuseau horaire, l &apos; avatar/la signature, le mot de passe et l &quot; &quot.

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. Modifier un paramètre d'authentificateur ou d'adresse e-mail 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 atteignent un administrateur dans le produit ou par courrier électronique.

Ecran du produit
Préférences de notificationLa page de notification fournit des choix par événement dans l &apos; application et par courrier électronique, ainsi qu &apos. une liste récente de notifications.Préférences de notificationespace de travailIN-APPActivéÉMAILSélectifUNREAD4VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTTicket assignéDans l &apos; application et par courrielActivéLe client a répondu :Dans l &apos; applicationActivérisque SLADans l &apos; application et par courrielActivéL &apos; approbation de l &apos. I.Dans l &apos; application et par courrielActivé1CHOOSE EVENTSSeulement des signaux utiles2CHOOSE CHANNELDans l &apos; application ou par courriel3EXAMENNotifications récentes
La page de notification fournit des choix par événement dans l &apos; application et par courrier électronique, ainsi qu &apos. une liste récente de notifications.

Les préférences couvrent l &apos; affectation des tickets, les réponses aux clients, les avertissements SLA, la transmission de chat et les événements d &apos.

Paramètres

Aperçu de la sécurité

L &apos; aperçu de la sécurité est le premier écran pour l &apos. évaluer les blocages, les attaques de connexion, les sessions menaçantes, les tendances en matière de sécurité et l &quot; &quot); intégrité des événements &quot.

Ecran du produit
Aperçu de la sécuritéAperçu de la sécurité combine les cartes des risques actuels, une tendance 14-jour, liste d &apos; attaquants, flux d &quot; &quot.Aperçu de la sécuritéespace de travailACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTBloqué automatiquement7-jour total et sourceTendanceLes derniers attaquantsIP, pays et raisonRévisionÉvénements de sécuritéRisque et résultat de l &apos; actionFluxIntégrité de la chaîne de hachageChaîne d &apos; événements inviolableValide1READ HEADLINEExposition actuelle2OPEN EVIDENCEAttaquants et événements3ACTEBloquer, enquêter, exporter
Aperçu de la sécurité combine les cartes des risques actuels, une tendance 14-jour, liste d &apos; attaquants, flux d &quot; &quot.

Utilisez les cartes d &apos; en-tête pour trier, puis ouvrez la section correspondante Audit, Failed Logins, Blocked. IPs ou JavaScript Page d &apos; erreurs pour le travail au niveau des enregistrements. 14 La tendance de -day est plus utile qu &apos; un seul pic. Les sessions à risque élevé devraient être examinées par rapport aux preuves concernant les visiteurs, les requêtes et l &apos: authentification avant d &apos); un blocage permanent soit appliqué.

Paramètres

Journal d &apos; audit anti-falsification

Le journal d &apos; audit indique qui a fait quoi, quand, sur quel objet, à quel niveau de risque et si cela a réussi.

Ecran du produit
Audit d &apos; activitéLa page d &apos; audit fournit des activités interrogeables et inviolables avec action, acteur, risque, cible et résultat.Audit d &apos; activitéespace de travailÉVÉNEMENTS18.2kHIGH RISK21INTEGRITYValideVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTConnecteur activé[email protected] · ShopifySuccèsLa clé API a été révoquée[email protected] · clé 19SuccèsParamètres modifiés[email protected]SuccèsAutorisation refusée[email protected] · exportationBloqué1FILTERAction, risque et acteur2EN CE QUI CONCERNEObjectif et résultat3EXPORTCSV ou JSON
La page d &apos; audit fournit des activités interrogeables et inviolables avec action, acteur, risque, cible et résultat.

Filtrer par action, risque et acteur; exporterCSVouJSONLa chaîne de hachage aide à 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 aux bases de données. Traiter les exportations d'auditeurs comme sensibles parce qu'ils peuvent identifier les utilisateurs, les dossiers et les mesures de sécurité.

Opérations

Diagnostic

Les diagnostics transforment les contrôles du sous-système en résultats de santé clairement exprimés et en actions directes.

Ecran du produit
DiagnosticLes diagnostics regroupent les vérifications de santé pour le widget, l &apos; IA, les tickets, les intégrations, la gestion des sites, les tâches en arrière-plan, l ’ automatisation du CRM, les licences et le stockage.Diagnosticespace de travailSAINE13WARNING2ÉCHEC1VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTWidgetPoints de terminaison des balises et du chatEn bonne santé.Tâches en arrière-planLe battement de coeur de Cron est retardéAvertissementE-mailTest sortant a échouééchecConnecteursRegistre et saisie des événementsEn bonne santé.1REFRESHExécuter les vérifications en cours2OPEN WARNINGLire les preuves3FIX AND RETESTConfirmer la récupération
Les diagnostics regroupent les vérifications de santé pour le widget, l &apos; IA, les tickets, les intégrations, la gestion des sites, les tâches en arrière-plan, l ’ automatisation du CRM, les licences et le stockage.

La page vérifie la vitesse du site, le classement/mot-clé/lien de retour/données locales, l &apos; IA et les passerelles d &apos. action, les tickets, les robots d &quot; exploration/audits, l intégration/l accueil des événements, les tâches en arrière-plan, les automatismes CRM, les licences, le widget et les services produits connexes.

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; complétez également la liste de contrôle avant démarrage.

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 une coffre-fort secret.Deux facteurs (TOTP)SSO OIDCSCIM 2.0OAuth2 PKCECSRF + CSPPare-feu IPLimites de débitCoffre-fort secret
Sécurité

Caractéristiques de sécurité

Authentification d &apos; administrateur

E-mail/mot de passe avec 2FA facultatif.

Verrouillage de connexion

Verrouillage temporaire après trop de tentatives infructueuses.

IP bloqué

Bloquer l &apos; accès aux sites suivis par les plages IPs ou CIDR.

Notation des menaces

Les visiteurs à haut risque peuvent être bloqués automatiquement.

Application du protocole 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 CSRF

Tous les formulaires d &apos; administration incluent des jetons CSRF.

Protection XSS

Toutes les entrées utilisateur sont échappées. Les en-têtes CSP restreignent l &apos; exécution des scripts.

Protection SSRF

Les webhooks sortants bloquent les adresses privées/internes IP.

Configuration recommandée

1
Activer l &apos; authentification à deux facteurs

Pour tous les comptes administrateurs.

2
Mot de passe fort

Minimum 12 caractères, mixte.

3
Réviser les comptes

Supprimer l &apos; accès des anciens membres de l &quot; &quot.

4
Surveiller les connexions ayant échoué

Vérifiez toutes les semaines pour des tendances suspectes.

5
Restez à jour

Appliquer rapidement les mises à jour pour les correctifs de sécurité.

Paramètres

Rôles et autorisations

Le contrôle d &apos; accès basé sur les rôles vous permet de contrôler ce que chaque membre de l &apos. équipe peut faire.

Rôles et autorisations
Rôles et autorisationsUne matrice de rôle par capacité: le propriétaire a tout; l &apos; administrateur complet n &apos. manque la facturation et la zone dangereuse; l ’ agent ne possède que des tickets à portée limitée.Rôles et autorisationsespace de travailPARAMÈTRESFACTURATIONDANGERTIQUETSPropriétaireAdministrateur completAgentscoped13 ROLESPropriétaire · Administrateur complet · Agent2GRANULARPar page + par département3DEFAULT-DENYLes itinéraires oubliés sont bloqués
La matrice de rôles en un coup d &apos; œil: le propriétaire obtient tout, l &apos. administrateur complet tout sauf la facturation et les zones dangereuses, l. agent seulement ses tickets dans leur champ d &quot; application &quot.

Rôles par défaut

Propriétaire

Tout, y compris la licence, les zones dangereuses et la gestion des installations.

Administrateur complet

Tout sauf licence et zone de danger. Peut gérer une équipe.

Agent

Répondez aux tickets et chats des services affectés, consultez les statistiques. Aucun accès aux paramètres, à l &apos; équipe ou à la sécurité.

Puis-je créer des rôles personnalisés?+

Pas pour le moment. Trois rôles intégrés plus l &apos; affectation de départements donnent un contrôle granulaire.

Paramètres

Bloqué IPs

Gérer les adresses IP bloquées pour accéder à vos sites suivis.

Bloqué IPs
Bloqué IPsLe blocage —IPs écran: un bloc-IP/CIDR forme à côté d &apos; 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/24Raison (facultatif)BloquerAdresses bloquées203.0.113.9Jun 12 · force bruteDébloquer45.12.0.0/16Juin 10 · SpamDébloquer102.89.6.2juin 9 · abusDébloquer1BLOQUERIP ou plage CIDR2LISTQui et quand, avec raison3UNBLOCKUn 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 une entreprise,IP ou VPN, bloquant ce IP bloque tout le monde sur elle. Utilisez des blocs étroits.

Paramètres

Échec de connexion

Toutes les tentatives de connexion infructueuses à votre OpsIQ admin.

Échec de connexion
Échec de connexionL &apos; écran des connexions ayant échoué : une table de comptes/IPs avec le nombre d &apos, l &apos.Échec de connexionespace de travailTentatives de connexion ayant échouéCompte IPÉCHECDERNIÈREAction[email protected] · 41.62.10.47il y a 2mBloquer[email protected] · 102.89.6.2318 minutesBloquerinconnu · 45.12.9.712Il y a 26mBloquer[email protected] · 88.21.4.921h il y aBloquer1WATCHTentatives de connexion ayant échoué2COUNTSPar compte / IP3ACTEBloquer la ligne
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.

E-mail

Adresse e-mail utilisée.

Adresse IP

Source de la tentative.

Pays

Emplacement géographique.

Raison

Mot de passe incorrect, verrouillé ou non trouvé.

Signes d &apos; avertissement.

Plusieurs tentatives, même courriel

Devinettes de mot de passe. Assurez-vous que 2FA est activé.

Plusieurs tentatives, différents courriels

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 &apos; 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, Demander à la sécurité et politiques de blocage du jeton 0. Elle ne s &apos); exécute jamais dans le chemin de demande du visiteur.

Chaque page de sécurité enregistre ce qui s'est passé, mais la lecture prend encore du jugement. L'analyste de sécurité AI ajoute que le jugement en place, et il est construit pour dépenser presque rien : il ne se trouve jamais dans le chemin de balise ou de connexion, règles déterministes règle les cas évidents sans appel AI, verdicts sont mis en cache, et la meilleure sortie de l'analyste est une règle déterministe qui applique alors à jamais à zéro jetons. Paramètres → Sécurité; tous désactivés par défaut.

Ce qu &apos; il ajoute

Chips de verdict + Expliquer

Bloqué IPs et les lignes de connexions échouées 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. Caché 24h, donc revoir un.IPest gratuit.

Briefs d'incidents

Les événements associés sont regroupés en un seul incident (vague de connexion, analyse URL, blocage automatique) avec une chronologie en anglais clair et une étape suivante recommandée. Les attaques en cours se réunissent dans le même incident.

Résumé quotidien

Un résumé par jour : hier contre votre baseline, les blocages, les incidents et la seule chose à faire. Les jours calmes envoient un all-clear déterministe à zéro jeton.

Vérification hebdomadaire de la posture

Une checklist de durcissement du lundi (lacunes d &apos; authentification à deux facteurs, seuil de verrouillage par rapport au volume réel des attaques, alertes désactivées) avec une sévérité, un effort et une solution exacte pour chaque élément.

Demandez à la sécurité

Une boîte de question sur l &apos; aperçu de la sécurité qui répond à partir de votre état de sécurité en temps réel. Les questions profondes du serveur sont transmises au chat d &apos, ingénieur administrateur plutôt que deviné.

Des propositions de politiques + pilote automatique

L &apos; analyste propose des règles de blocage concrètes sous forme de cartes Approuver/Rejeter ; les règles approuvées sont appliquées à zéro jeton avec un compteur de succès en direct. Le pilote automatique optionnel n &apos, approuve que les règlen 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 &apos; incidents (security_ai_incidents)

Regroupe les événements en incidents et écrit chaque nouvelle histoire. S &apos; exécute 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 &apos; aperçu. Les jours tranquilles ne coûtent rien.

Vérification hebdomadaire de la posture (security_ai_posture)

Liste de contrôle du durcissement du lundi sur l &apos; aperçu. La liste de contrôle est entièrement déterministe.

Politique de pilotage automatique (security_ai_autopilot)

Permet à l ’ analyste d ’ activer ses propositions les plus sûres sans surveillance: blocs réversibles limités dans le temps seulement, unique IPs ou des plages ne dépassant pas : /24, jamais partagé/mobile/privé, plafonné 10 par heure, toujours vérifié 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 les lectures déterministes. Bloquer, lock-out et alertes ne dépendent jamais de ce budget. L'analyste ne peut jamais supprimer des 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 des sondages par e-mail, l &apos; automatisation des tickets, les agrégats d &apos. analyses, la rétention, les files d &quot; attente IA, le travail CRM, les rapports et les tâches de connexion.

Ecran du produit
Cron et automatisationUne entrée cron produit fournit le battement du cœur; OpsIQ décide quels travaux internes sont dus.Cron et automatisationserveurBATTERIEChaque minuteRUNNERcron/all.phpHEALTHParamètresVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTExécutable unifié du produitopsiq/cron/all.phpObligatoireFiles de tickets et d &apos; e-mailTravail à court termeActifAnalyse et rétentionCadence interneProgramméAbonnés au connecteurÉvénements cron déclarésDélimité1INSTALL ONE LINEExécuter le planificateur de produit toutes les minutes2CHECK CRON SETUPConfirmer les battements du cœur de l &apos; interface utilisateur3USE DIAGNOSTICSEnquêter sur les travaux en retard ou échoués
Une entrée cron produit fournit le battement du cœur; OpsIQ décide quels travaux internes sont dus.

Entrée cron produit requise

Ajouter cette seule ligne au crontab pour le même serveur et l &apos; environnement PHP qui exécute OpsIQ:

Entrée crontab du produit OpsIQ
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

Remplacer /path/to/opsiq avec la racine d &apos; installation. Utilisez le chemin complet de l &apos,ILB PHP lorsque l &quot; &quot,hôte en requiert un, par exemple /usr/bin/php8.4.

N &apos; utilisez pas le niveau supérieur /cron.php pour le travail sur les produits. Dans ce dépôt, le runner appartient à un service distinct non produit en dehors de ce manuel. Le runner du produit OpsIQ est opsiq/cron/all.php.

Ce que le planificateur unifié conduit

Ticket et files d &apos; attente IA

Traite les réponses automatiques, escalades, approbations et autres travaux de produits en attente.

E-mail entrant

Les boîtes aux lettres configurées pour les sondages où le sondage est la méthode d &apos; entrée sélectionnée.

Analyses et sessions

Assemble les sessions et actualise les agrégats planifiés lorsqu &apos; ils sont dus.

CRM et engagement

Exécute les tâches de notation, cycle de vie, flux de travail, campagne et rapport planifié qui sont activées.

Rétention et entretien

Effectue le nettoyage, l'archivage, l ́expiration et l'intégrité du travail.

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 confirmer que le produit existe.
  2. Utilisation Exécutez maintenant une fois, puis confirmez la mise à jour des battements de cœur d &apos; 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 du journal que vous avez sélectionné lorsqu &apos; un exécution manuelle échoue.

Gardez les gestionnaires de connecteurs courts, idempotents et limités à l &apos; espace de travail. Synchronisez par lots les longues synchronisations et stockez un curseur/point de contrôle pour que la prochaine exécution puisse continuer en toute sécurité.

🚫
Lorsque le cron du produit s &apos; arrête, les tâches OpsIQ basées sur l &apos. temps s &quot; &quot. arrêtent ou sont retardées même si les pages d &apos: administration ordinaires peuvent encore 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 &apos; opérateur d &apos. hébergement gère la couche serveur. Les procédures commerciales d &quot; inscription, plans, facturation et portail de compte sont en dehors du cadre de ce manuel.

Ecran du produit
Déploiement hébergéL &apos; opération hébergée change qui maintient l &apos. infrastructure, elle ne change pas la façon dont les clients utilisent OpsIQ.Déploiement hébergéespace de travailPRODUCT UIMême chose OpsIQINFRASTRUCTUREGéré par l &apos; opérateurWORKSPACE DATAIsoléVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTTemps d &apos; exécution de l &apos. applicationPHP, serveur web et base de donnéesGestionnéProduit cronPlanifié par l &apos; opérateur d &apos..VérifierSauvegardes et mises à jourPolitique et preuves du fournisseurRévisionParamètres OpsIQSites, IA, équipe et connecteursVotre équipe1OPERATE OPSIQ NORMALLYUtiliser la même navigation de produit2VERIFY SERVICE HEALTHUtiliser les diagnostics et la preuve d &apos; état3KNOW RESPONSIBILITYSéparer les paramètres du produit de l &apos; hébergement
L &apos; opération hébergée change qui maintient l &apos. infrastructure, elle ne change pas la façon dont les clients utilisent OpsIQ.

Ce que l &apos; opérateur d &apos, hébergement gère normalement

  • Serveur web, runtime PHP, service de base de données, TLS et stockage.
  • Le produit unifié cron et ses journaux au niveau du serveur.
  • Mises à jour des applications, surveillance de l &apos; infrastructure et processus de sauvegarde défini par le contrat d &apos.

Ce qu &apos; un administrateur OpsIQ gère encore

  • Installation de sites Web et d &apos; outils, paramètres d &quot; &quot.
  • Accès des équipes, départements, contrôles de sécurité, clés API, connecteurs, automatismes et paramètres de conservation des données.
  • Vérification du produit par le biais de diagnostics, du journal d &apos; audit, des tests de connecteurs et de vérifications réelles de bout en bout.

Vérifications opérationnelles

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.

Cette section couvre uniquement les opérations du produit. L &apos; accueil commercial, les abonnements, la facturation et l &apos); administration des comptes clients restent en dehors du manuel OpsIQ.

Opérations

Auto-hébergement OpsIQ

Un auto-accueilléOpsIQinstallation fonctionne sur l'infrastructure que vous contrôlez. Vous êtes responsable de l'exécution, base de données,TLS, cron produit, sauvegardes, mises à jour et surveillance.

Ecran du produit
Auto-hébergementL &apos; auto-hébergement donne à votre équipe le contrôle de l &apos, infrastructure et la responsabilité de chaque dépendance d &apos.Auto-hébergementserveurPHP8.4+DATABASEMySQL 5.7+SCHEDULERChaque minuteVUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTExtensions d &apos; exécutionboucle, pdo_mysql, mbstring, jsonObligatoireExtensions supplémentairesxml, openSSL, zip, intl, gdObligatoireAlternative de base de donnéesMariaDB 10.3+ avec InnoDBPris en chargePolitique des transportsAccès HTTPS et fournisseur sortantVérifier1PREPARE THE SERVERConforme aux exigences d &apos; exécution2INSTALL AND CONFIGUREUtiliser une base de données dédiée et HTTPS3ADD PRODUCT CRONExécuter opsiq/cron/all. php
L &apos; auto-hébergement donne à votre équipe le contrôle de l &apos, infrastructure et la responsabilité de chaque dépendance d &apos.

Contrat minimum logiciel

PHP

PHP 8.4 ou plus récent. Extensions requises: curl, pdo_mysql, mbstring, json, xml, openssl, zip, intl et gd.

Base de données

MySQL 5.7 ou MariaDB 10.3+ en utilisant InnoDB. Créer une base de données dédiée et un utilisateur d &apos; application moins privilégié.

Serveur Web

Apache ou Nginx configuré pour le contrôleur frontal OpsIQ, les ressources statiques et les réécritures requises.

HTTPS

Nécessaire pour les sessions d &apos; administration, le trafic des widgets, les clés API, les webhooks et les appels de fournisseur.

Accès sortant

Autoriser l &apos; accès DNS et HTTPS aux points de terminaison d &apos.., courrier électronique, connecteur et licence que vous avez effectivement activés.

Accès aux fichiers

Les utilisateurs du Web et de l &apos; interface à ligne de commande doivent pouvoir lire les fichiers d &apos. application et écrire uniquement dans les emplacements d. exécution/stockage documentés.

Cron

Exécutez le planificateur de produit OpsIQ toutes les minutes avec la même configuration d &apos; application et l &apos. accès à la base de données que le processus web.

Séquence d &apos; installation

  1. Télécharger la version à la racine du document souhaité et préserver la structure de répertoire fournie.
  2. Créer la base de données et l &apos; utilisateur de l &quot; &quot, puis entrer les paramètres de base de donnée, canonique URL et licence.
  3. Exécutez le processus d &apos; installation et créez le premier compte propriétaire.
  4. Activer HTTPS et vérifier les redirections, les cookies et le chemin public du widget/API.
  5. Ajouter le cron produit unifié OpsIQ:
Produit auto-hébergé cron
* * * * * 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 ayant échoué.
  2. Configurez la sauvegarde, restaurez les tests, conservez le journal et mettez à jour les procédures avant d &apos; ajouter des données de production.

Mise à jour en toute sécurité

  1. Lisez les notes de version et vérifiez les extensions PHP requises avant de modifier des fichiers.
  2. Sauvegardez la base de données et les fichiers d &apos; application/configuration, puis prouvez que la sauvegarde peut être restaurée dans un emplacement de test.
  3. Déployer les nouveaux fichiers sans supprimer la configuration spécifique à l &apos; installation ou les données d &apos.
  4. Exécutez le processus de migration/preflight fourni et vérifiez la connexion, le suivi des widgets, les tickets, l &apos; 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 référentiel de haut niveau. /cron.php n &apos; est pas le OpsIQ pointer l &apos; automatisation des produits uniquement à opsiq/cron/all.php
⚠️
Ne supprimez pas. schema_cache.json comme maintenance de routine. Supprimez-le uniquement lorsque les instructions du produit exigent explicitement une reconstruction du cache de schéma.
Opérations

Guide de production

Liste de contrôle et meilleures pratiques pour exécuter OpsIQ en production.

Guide de production
Guide de productionUne liste de contrôle pour la mise en service : domaine personnalisé et SSL, IA entraînée, connecteurs et cron, sauvegardes et rétention, et rôles d &apos; équipe.Liste de contrôle Go-liveespace de travailAvant de passer en directDomaine personnalisé + SSL configuréL &apos; IA est entraînée sur votre contenu.Connecteurs testés · cron en cours d &apos; exécutionSauvegardes planifiées · durée de conservation définieRôles d & équipe assignés et examinés1GO-LIVEListe de contrôle avant le démarrage2VÉRIFIERDomaine · SSL · sauvegardes3CONFIDENTLe navire quand il est vert
Une liste de contrôle 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 &apos; équipe.

Avant de passer en direct

HTTPS configuré

SSL installé, redirections HTTP, HSTS activé.

Cron en cours

Vérifier via la page de diagnostics.

Testé par l &apos; IA

Discuter en tant que client. Vérifier l &apos; 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 bases de données et de fichiers.

Journalisation des erreurs

Le journal des 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 &apos; attente des tickets, vérifiez les conversations avec l &apos.

Hebdomadaire : Examen des informations sur l &apos; IA, mise à jour de la base de données, vérification des performances de l &quot; &quot.

Mensuellement : Examiner les tendances d &apos; analyse, vérifier les connecteurs, mettre à jour la formation en IA et vérifiere les sauvegardes.

Opérations

Liste de contrôle avant le démarrage

Exécutez les sources et effectuez des vérifications de produit avant une sortie ou un premier lancement en production. Le fait qu &apos; une commande soit disponible ne prouve pas qu &quot; &quot, elle a été acceptée dans votre environnement.

Ecran du produit
Vérification de la versionLa vue de la version montre les portes requises pour s &apos; exécuter, elle ne les pré-étiquette pas comme passées.Vérification de la versionserveurMontantPHP 8.4SOURCE GATESExécuter localementOUTCOMEBasé sur des preuves.VUE DE L &apos; ESPACE DE TRAVAIL EN DIRECTExtensions requisesVérifier avant de suivrePorteBalayage de la syntaxe PHPTous les fichiers PHP du projetPorteÉvaluation de l &apos; IA et PHPUnitExécuter lorsque des dépendances sont présentesPorteVérifications statiques et du navigateurExécuter une fois configuréPorte1RUN THE CHECKSCapturer la sortie réelle2FIX EVERY REQUIRED FAILURENe remplacez pas les preuves par des hypothèses.3TEST THE PRODUCTVérifier les parcours réels des utilisateurs
La vue de la version montre les portes requises pour s &apos; exécuter, elle ne les pré-étiquette pas comme passées.

Portes source et sortie

Exécutez les vérifications du dépôt à partir de la racine d &apos; installation et conservez leur sortie complète avec l &apos.

Porte de pré-vol primaire
php tools/preflight.php
Porte de libération étendue
php tools/release_gate.php

Le preflight vérifie le runtime PHP 8.4 et les extensions requises, effectue un balayage de la syntaxe PHP, exécute l &apos; évaluation du ship gate d &apos. IA et la suite complète PHPUnit, et exécut des vérifications PHPStan/Node lorsque ces outils sont installés.

Une vérification ignorée n &apos; est pas une réussite. Enregistrez pourquoi elle était indisponible, installez la dépendance manquante ou exécutez-la dans le bon environnement CI/staging avant de la publier.

Vérifications du produit

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

Charger un vrai site dans un navigateur privé; vérifier le trafic des balises, les flux en direct, les enregistrements de visiteur et de session.

3. Chat et IA

Poser des questions représentatives ; vérifier l &apos; ancrage de la connaissance, la sécurité, l &quot; &quot.

4. Billets

Créer, assigner, répondre, faire passer en priorité, fermer et rouvrir à travers chaque chemin d &apos; admission activé.

5. E-mail

Testez la livraison sortante et chaque chemin de boîte aux lettres ou webhook entrant configuré.

6. CRM et analyses

Créez un contact/une offre/conversion contrôlés et vérifiez les tableaux de bord, entonnoirs, scores et rapports.

7. Connecteurs

Exécuter des tests de connexion, un en lecture, un exécution sécurisée en écriture/à sec et les chemins webhook/polling pour chaque connecteur activé.

8. API et des webhooks.

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 2FA, les contrôles CSRF/session, les entrées d &apos; audit, la révocation des clés et l &apos.

11. Sauvegarde et restauration

Restaurer une sauvegarde actuelle dans un environnement de test séparé et vérifier les données et la configuration.

12. Observabilité et retour en arrière

Confirmer les journaux/alertes, préserver les ID de requête et prouver la procédure d &apos; annulation.

⚠️
Déployer uniquement après que chaque porte requise et parcours critique pour l &apos; entreprise ait des preuves actuelles de la version exacte et de l &quot; &quot.
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 type OS au-dessus de deux cartes de méthode de livraison : VAPID et Pusher Beams intégrés.Votre magasinVotre panier est en attente · 10% dés aujourd'huimaintenantIntégré (VAPID)Aucun tiersHéberger un fichierPoutre de pousséeUtilisez votre compteHébergez le travailleur
Pousser sur le Web

Pourquoi cela est-il 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écharger le worker depuis votre déploiement OpsIQ: https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. Téléchargez-le sur votre ordinateur. racine web 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 &apos; 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 alors aux visiteurs l &apos; autorisation de recevoir les notifications et s &apos.

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 · Pousser les faisceaux (fournisseur géré)

1. Dans les paramètres OpsIQ définissez le fournisseur de push à Poutre de poussée et entrez dans vos rayons. ID de l &apos; instance et Clé secrète.

2. Héberger le service worker Beams sur la racine du site comme /service-worker.jsCopie 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. C ' est tout. 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 sont publiées par les deux Les visiteurs sur le worker VAPID auto-hébergé reçoivent la Web Push chiffrée, et les visiteurs abonnés via Pusher Beams obtiennent les Beams publiés. Chaque visiteur est atteint par celui auquel il s &apos; est abonné, de sorte que vous pouvez exécuter des VAPIDS d &apos); origine commune sur certains sites et des Beams à plusieurs sources sur d &quot; &quot.

HTTPS requis pour les service workers et Web Push (localhost est exempté des tests). La boîte de réception du chat d &apos; administration utilise déjà le même mécanisme Beams pour les alertes opérateurs.

Opérations

Dépannage

Problèmes courants et comment les résoudre.

Général

Page vierge+

Vérifiez les journaux d &apos; erreur PHP. Causes : vieux PHP (nécessite 8.4+), extension manquante, connexion à la base de données a échoué, permissions incorrectes pour le fichier.

Le tableau de bord affiche des zéros+

Vérifiez : widget installé? Cron en cours d &apos; exécution? Intervalle de dates correct? IP exclu?

IA

L &apos; IA ne répond pas.+

Vérifiez : fournisseur configuré? Clé API valide (utilisez Test de connexion)? Budget épuisé? Configuration correcte de l &apos; IA dans l &quot; &quot.

L &apos; IA donne de mauvaises réponses.+

Vérifiez : la base de connaissances est-elle à jour? Invite effacée? Les recherches du connecteur renvoient les données correctes? Examinez la conversation dans l &apos; historique d &apos.

L &apos; IA est lente+

Dépend de : la vitesse du fournisseur API, la taille du contexte (plus gros le Ko = plus de jetons = moins rapide), la latence réseau. Essayez un modèle plus rapide.

Suivi

Widget manquant+

Vérifiez : script dans le code source de la page? Erreurs JS dans la console? Blocage CSP? Blocker d &apos; annonces publicitaires?

Pays inconnu+

GeoIP non configuré. Utilisez Cloudflare (automatique) ou la base de données MaxMind GeoLite2.

Billets

Les courriels ne créent pas de tickets+

Vérifiez : boîte aux lettres connectée? Cron en cours d &apos; exécution? Mot de passe de l &apos. application modifié? Paramètres IMAP corrects?

La réponse automatique ne fonctionne pas+

Vérifier : activé? Département autorisé ; IA configurée ; Cron en cours d &apos; exécution ; Un humain a répondu le premier?

Connecteurs

Connexion échouée+

Vérifier : les informations d &apos; identification sont correctes? Clé expirée? API accessible depuis le serveur? Base URL correct?

Connecté mais pas de données+

Vérifiez : les portées des clés API? La synchronisation Webhook est-elle activée? Cron en cours d &apos; exécution?

Performances

Pages lentes+

Vérifiez : performances de la base de données (SHOW PROCESSLIST), mémoire PHP (augmenter à 1GB), activez opcache, réduisez la période de rétention.

Opérations

Le widget n &apos; enregistre pas les visites

Utilisez cette vérification focalisée lorsque le widget se charge incorrectement ou que le flux en direct reste vide.

Quand le widget n &apos; 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 balises ou des requêtes de widgets ont été bloquées, passez en revue Content-Security-Policy et les bloqueurs d &apos; annonces, confirmez que le site est actif dans OpsIQ, puis ouvrez Diagnostics. Une bulle de chat visible ne prouve pas par elle-même que la balise analytique a été acceptée.

Référence

Glossaire

Définitions des termes utilisés dans OpsIQ.

Décision

Quelque chose que l &apos; IA peut faire à travers un connecteur ou la plateforme.

Agent

Un membre d &apos; équipe avec un accès limité ou un agent de l &apos, IA.

BYOK

Apportez votre propre clé, vous fournissez votre propre clef AI API.

Connecteur

Un module intégrant une plateforme externe avec OpsIQ.

CSAT

Notation 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 &apos; accès.

Escalade

Transférer un ticket vers un autre service ou de l &apos; IA à un humain.

GeoIP

Détection de l &apos; emplacement du visiteur à partir de l IP.

Délivrance

Transférer une conversation de l &apos; IA à un humain.

Jeton d &apos; identité

Jeton signé identifiant un visiteur du site web.

Base de connaissances

Des articles que l &apos; IA utilise pour répondre aux questions.

Plomb

Un visiteur qui montre une intention d &apos; achat.

Score de la tête

0-100 nombre indiquant la probabilité de conversion.

Étape du cycle de vie

Où se trouve un client : Lead, Prospect, Client, À risque, Déçu.

AI géré

L &apos; IA est fournie dans le cadre de votre plan OpsIQ.

Pipeline

Tableau visuel des étapes de la transaction.

RBAC

Contrôle d &apos; accès basé sur les rôles.

Séance

Une série de vues de page dans une fenêtre d &apos; expiration.

Clé du 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 AI.4caractères =1Jeton.

Couche de confiance

Un système de sécurité contrôlant l &apos; autonomie de l &quot; &quot..

Couvertures Web

Rappel HTTP pour les notifications d &apos; é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 &apos; aide

Si cette documentation ne répond pas à votre question :

Administrateur IA

Cliquez sur « Demander à OpsIQ» dans l &apos; administration. A accès à cette documentation et aux données de votre plateforme.

Ticket de soutien

Inclure : ce que vous avez essayé, ce qui s &apos; est passé, ce à quoi vous vous attendiez et tous les messages d &apos.

E-mail

Envoyez un e-mail au support avec votre clé de licence et la description du problème.

Conseils pour des demandes d &apos; assistance efficaces

Inclure la page

Quelle page d &apos; administration (URL ou nom).

Inclure le paramètre

Nom exact du paramètre et valeur actuelle.

Inclure l &apos; erreur

Message d &apos; erreur exact avec codes.

Inclure les étapes

Ce que vous avez fait, pas à pas.

Inclure attendu vs réel

Ce qui devrait arriver et ce qui est arrivé.

💡
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 &apos; IA donne le code d &apos); erreur 502» obtient une réponse directe.