OpsIQ Documentație

Construiește, operează și se extinde OpsIQ.

Aceasta este documentaţia completă pentru OpsIQ. Configurați produsul, rulați suport, configurați AI, gestionați CRM, instalați widget-ul, construiți conectori, apelați REST API, primiți site-uri web, pachete de aplicații pe piață, și să funcționeze de implementare auto-hosted.

Ghid pentru cliențiGhid de administrareGhid de dezvoltareReferință CRMConector SDKRESTAURANT APIAuto-hosted
Domeniul de aplicare

Domeniul de aplicare al prezentului manual

Totul OpsIQ face, într-un singur loc: cum funcționează fiecare ecran, cum să conectați propriile sisteme și cum să construiți pe partea de sus a acestuia. Începe oriunde, secțiunile urmează aceeași ordine ca bara laterală admin.

Domeniul de aplicare
Hartă de documentareManualul este organizat în jurul produsului OpsIQ, urmând aceeași comandă ca bara laterală admin.Hartă de documentareOpsIQ produsAUDIENCEOperatoriCLĂDIREDezvoltatoriRUNAdministratoriVIE VIU AIRPACEFolosește OpsIQEcrane și fluxuri de lucru ale produselorIncludeExtinde OpsIQConectori, APIs și widgetIncludeFuncționează OpsIQSecuritate, cron și implementareIncludeReferințăPachetul, API și contractele de webhookInclude1CHOOSE AUDIENCEOperator sau dezvoltator2FOLLOW THE UISecţiuni oglindă OpsIQ3USE SOURCE TRUTHStarea vine din construcţie
Manualul este organizat în jurul produsului OpsIQ, urmând aceeași comandă ca bara laterală admin.
Portal Studio ghid de teren

Utilizați ghidul dedicat administratorului și dezvoltatorului pentru arhitectura portalului, pagini, componente, previzualizare, Help Center, identitate, SCIM, versiuni reglementate, extensii, migrații și certificare.

Deschide ghidul Portal Studio

Ce e aici?

Rulează produsul

Fiecare ecran din admin: analize, chat live, bilete, CRM, baza de cunoștințe, Site Intelligence, promoții și portalul contului clientului. Ce face fiecare pagină, ce înseamnă numerele, și ce să faci atunci când acestea arată greșit.

Conectează-ţi sistemele

Site-ul widget, e-mail mailboxes, intrare și outbound webhooks, și biblioteca conector pentru platforme cum ar fi Shopify, WooCommerce, WHMCS, Zendesk, Stripe, Slack și Gmail.

Construieşte-ţi propriul tău loc.

Conectorul pentru conectori fără cod, Acţiuni & Declanşator dacă nu aţi folosi deloc conectorii şi REST API cu fiecare acţiune, domeniu de aplicare şi cod de eroare.

Operează-l.

Roluri și permisiuni, securitate, cron, diagnostice, backup-uri, și ambele găzduit și auto-hosted desfășurare.

De unde să încep?

1
Dacă alergi OpsIQ zi de zi

Citiți secțiunile ecranului în ordine laterală. Fiecare se deschide cu ceea ce este pagina pentru, astfel încât să puteți opri de îndată ce aveți ceea ce ai nevoie.

2
Dacă îl administraţi

Adăugaţi Setări, Securitate, Diagnostice, Cron şi Producţie. Acestea sunt secţiunile care decid dacă totul continuă să funcţioneze.

3
Dacă construiţi o integrare

Începeți de la Conectori, apoi Connector Builder, apoi REST API Citiți cele în ordine și veți fi văzut toate modurile OpsIQ pot vorbi cu un alt sistem.

💡
Două lucruri schimbă ceea ce vezi. Permisiunile ascunde pagini rolul dumneavoastră nu poate fi deschis, astfel încât o secțiune descrisă aici poate lipsi din bara laterală. Cereți unui administrator să verifice rolul dvs.. Și conectorii poartă o etichetă de maturitate de producție, Beta, Preview sau șablon; construirea și manifestul său conector sunt autoritatea pe care o aveți, nu această pagină.
Începe de aici.

Ce face OpsIQ pentru afacerea ta

OpsIQ este o platformă de operare completă AI-primul business. Înlocuieste analiza, chat live, helpdesk, CRM, SEO instrumentkit, integrare mijlocie, și platforma dezvoltator cu un singur admin unificat în cazul în care fiecare instrument are același context client. În loc să coase împreună 8-12 separat produse SaaS, instalați OpsIQ o dată și să opereze totul dintr-un singur ecran.

Platforma
OpsIQ platforma unificatăUn creier central AI conectat la chat live, CRM, bilete, Site Intelligence, promoții și analize.Conversaţie livePromotiiCRM AIInformaţii despre site-ul webBileteAnalizeOpsIQCreierul uman1ONE WORKSPACEFiecare instrument într-un admin2SHARED BRAINUn context al clientului3ANYWHERECloud sau auto-găzduit
OpsIQ este o platformă cu un context comun al clienților, fiecare instrument se hrănește și este alimentat de același creier AI.

Totul OpsIQ face · în detaliu

Analize de site-uri web și informații vizitatori

Urmărire în timp real a vizitatorilor

Fiecare încărcare pagină, clic, defilare și eveniment de navigare este capturat în timp real. Vezi cine este pe site-ul dvs. chiar acum, ce pagini sunt vizionarea, cât timp au petrecut, și în cazul în care acestea au venit de la, toate fără cookie-uri terțe părți.

Jurnal de vizitatori și sesiuni

Istoria completă a fiecărui vizitator cu dispozitiv, browser, sistem de operare, țară, oraș, referer, parametrii UTM, pagina de aterizare și rezoluția identității. Sesiuni de grup imagini pagină în călătorii astfel încât să puteți vedea întreaga cale pe care o ia un vizitator.

Repetare sesiune

Redarea în stilul cronologie a sesiunilor de vizitatori capturate. Vezi exact ce au făcut utilizatorii: mișcările mouse-ului, clicuri, suluri, tranziții pagină și formează interacțiuni. Utilizați-l pentru a diagnostica problemele UX, înțelege puncte drop-off, și verifica fluxurile de conversie.

Hrană pentru animale vii

Un flux în timp real de activitate vizitatori așa cum se întâmplă. Vezi vizualizări pagină, chat începe, transmite forma și semnale de intenție actualizarea la fiecare câteva secunde. Filtrare după țară, dispozitiv, sau referer pentru a se concentra pe segmente specifice de trafic.

Pagini de sus

Pagini clasificate de vizite, timp de angajament, rata sarituri, conversie, și activitatea de sprijin. Identificați conținutul cel mai performant și pagini care necesită îmbunătățire.

Informaţii geo

Dezagregari de tara, oras si regiune cu harti. Distributie de dispozitive si browser, analiza surselor de trafic, urmarire referinta motor de cautare, si perspective de penetrare a pietei.

Pâlnie intenţionată

Urmăriți semnale de intenție vizitatorilor (vizite de preț pe pagină, returnări repetate, modele de navigare documentare și interacțiuni de suport) pentru a identifica vizitatorii care sunt susceptibile de a cumpăra, churn sau nevoie de ajutor.

Experimente A/B

Rulați teste împărțite pe site-ul dvs. direct de la OpsIQ. Creați variante, setați alocarea traficului, defini obiectivele de conversie, și măsurați semnificația statistică. Nu este necesar instrument de testare externă.

JavaScript urmărire erori

Capturați client-side JavaScript erori de pe site-ul dvs. automat. Vedeți mesaje de eroare, stiva urme, browsere afectate, număr de frecvență, și care pagini le declanșează. Depanați problemele frontend fără monitorizare separată a erorilor.

Jurnal evenimente

Fiecare eveniment urmărit (vederi de pagini, evenimente personalizate, interacţiuni pe chat, formulare, achiziţii) într-un jurnal filtrabil şi filtrabil cu metadate complete.

Vânzări și transformări

Ordine de cale, venituri, restituiri, reînnoiri de abonamente, și atribuie conversii la surse de trafic, campanii și călătorii vizitatori. Tablouri de bord cu comparație pe perioadă și analiza tendințelor.

Plumburi

Vizitatori cu intenţii mari identificaţi prin modele de comportament. Scorul conduce pe baza vizitelor de pagină, timp la site-ul, frecvenţa de întoarcere, interacţiuni suport şi semnale personalizate. Fluxul duce direct în conducta CRM.

Informaţii de pe site (SEO şi analiza conţinutului)

Crawls site

Crawling automată a întregului site pentru a descoperi pagini, detecta link-uri rupte, găsi meta tag-uri lipsă, verificați imaginea alt text, valida canonical URLs, și harta structura site-ului. Program crawlere pentru a rula zilnic, săptămânal, sau la cerere.

Audit tehnic SEO

Analiza tehnică cuprinzătoare: scoruri de viteză ale paginii, răspuns mobil, Vitals Core Web, starea certificatului SSL, lanțuri de redirecționare, detectarea conţinutului duplicat, analiza adâncimii crawl și validarea structurată a datelor.

Auditul conținutului

Evaluați fiecare pagină pentru calitatea conținutului, numărul de cuvinte, scorul lizibilității, densitatea cuvintelor cheie, structura de direcție, raportul intern/extern de legătură și prospețime. Identificați conținutul subțire, pagini duplicate și lacunele de conținut.

Căutare cu AI

Căutare semantică pe întregul conţinut al site-ului. Pune întrebări în limba naturală despre conţinutul dumneavoastră şi de a lua răspunsuri AI-sinthezed cu referinţe pagina sursă.

Urmărire rang SERP

Monitorizează clasamentul motorului de căutare pentru cuvinte cheie țintă pe Google și alte motoare. Schimbă poziția de urmărire în timp, compară cu concurenții, și a vedea care pagini rang pentru care termeni.

Cercetarea cu cuvinte cheie

Descoperiți oportunități de cuvinte cheie bazate pe conținutul, analiza concurentului și datele privind volumul căutării. Obțineți sugestii pentru noi subiecte de conținut, variații de lung-coada și obiective de optimizare a conținutului.

Analiza de bază

Monitorizează profilul de legătură. Vezi ce site-uri au link-ul către tine, urmăreşte link-urile noi şi pierdute, analizează distribuţia textului ancorei şi identifică oportunităţile de creare a legăturilor.

Rețea SEO locală

Pentru companiile cu locații fizice: vizualizați vizibilitatea căutării locale pe o rețea geografică. Vedeți cum clasamentul variază în funcție de locație, distanța față de afacerea dumneavoastră și intenția de căutare.

Sincronizare profil Google Business

Conectați-vă profilul de afaceri Google la OpsIQ. Sincronizare recenzii, posturi, Q&A, fotografii, și informații de afaceri. Gestionați listarea GBP din interior OpsIQ. Raspunde la comentarii, publica posturi, și de a monitoriza perspective.

Rapoarte programate

Rapoartele SEO automate și rapoartele de analiză generate pe programul (zi, săptămână, lună). Rapoarte includ modificări de clasificare, tendințele traficului, probleme tehnice găsite, și performanța conținutului.

Sprijin acordat de AI

Conversaţia clienţilor AI

AI răspunde la întrebările clienților de pe site-ul dumneavoastră 24/7 folosind baza de cunoștințe, datele platformei conectate (comenzi, conturi, abonamente) și cererile de formare personalizate. Sprijină mai mulți furnizori AI: Claude (Anthropic), GPT- 4o (OpenAI), Gemini (Google) și Grok (xAI).

Asistent AI admin

Un copilot AI în interiorul panoului admin care vă ajută să scrieți răspunsuri la bilete, proiecte de comunicații ale clienților, analiza tendințele suportului, uita-te la datele clienților pe platformele conectate și executa acțiuni prin sistemul conector.

Întărirea cunoștințelor AI

AI este fondat în articolele de bază cunoștințe, intrări FAQ, documentația produsului și datele platformei conectate. Nu halucinează. Ea răspunde din informațiile dumneavoastră reale de afaceri sau escaladează atunci când nu sunt nesigure.

Auto-maniere pentru oameni

Atunci când AI nu poate rezolva o întrebare, detectează frustrare sau clientul cere un om, ea se predă automat echipei dumneavoastră cu context de conversație completă. Decădere/timeout configurabila redirecționați-vă automat la IA.

Se impune formarea AI

Scrieţi instrucţiuni separate pentru AI cu care se confruntă clienţii şi admin-fairing AI. Ton de control, limite, reguli de escaladare, subiecte interzise şi comportament specific afacerii. Configuraţia Per-workspace susţinută.

Istoricul AI și auditul

Fiecare conversație AI este conectată cu detalii complete privind cererea/răspunsul, utilizarea jetoanelor, urmărirea costurilor, furnizorul utilizat și versiunea model. Revizuiți conversațiile pentru a identifica lacunele de formare și îmbunătăți acuratețea AI.

Informaţii AI

Analiza automată a modelelor de conversație AI. Vezi întrebări comune, ratele de rezoluție, frecvența de predare, satisfacția clienților pe subiect și domenii în care AI are nevoie de o formare mai bună.

Configurație AI per-workspace

Fiecare site/spaţiu de lucru conectat poate utiliza propriul furnizor AI, model, temperatură, buget jetoane şi training-uri. O companie SaaS îl poate folosi pe Claude pentru produsul principal şi GPT-4o pentru un brand secundar.

Gestionat AI și BYOK

Două moduri AI: Gestionat AI (inclus în planul dvs., nu API cheie necesară) sau Adu-ţi propria ta cheie (foloseşte-o pe a ta OpenAI/Anthropic/Google/xAI API Cheie pentru controlul complet asupra selecţiei de modele şi costurilor). Ambele sunt de primă clasă, fiecare caracteristică funcţionează cu oricare mod.

Bugete și controale ale costurilor

Setați bugete lunare token, limite per-conversație și alerte de echilibru scăzut. Cheltuieli de cale pe furnizor, per spațiu de lucru, și pe conversație. Prevenirea costurilor fugitive cu plafoane dure.

Bilete și servicii de asistență

Sistemul de bilete native

Full helpdesk cu departamente, priorități (scăzut/mediu / mare / Urgent), statute, SLA urmărire, note interne, răspunsuri la clienți, atașamente fișiere și conversații filetate. Nu este nevoie de ajutor extern.

Triaj AI și răspuns automat

AI triează automat biletele de intrare prin departament și prioritate. Activați automat-replică pentru departamentele sigure. AI proiectează și trimite un răspuns după o întârziere configurabilă (default: 2 minute) astfel încât oamenii să poată interveni primii.

Ingestia de e-mail

Conectați o cutie poștală (Gmail, IMAP sau furnizor specific) pentru a crea automat bilete de la e-mailuri. Răspundeți la emailurile de notificare bilet actualiza firul biletului.

Portalul de bilete înglobat

Am înglobat un portal de bilete cu vedere spre client pe site-ul dvs. Clientii pot trimite bilete, vizualiza istoria lor, raspunsul la bilete deschise, și starea de verificare, toate marcate la design-ul dumneavoastră.

Fuziunea biletelor

Se combină biletele duplicate într-un singur fir. Bilete combinate arată [Merged] pe linia subiectului. Toate istoricul conversației este păstrat în biletul supraviețuitor.

Înapoi la AI

După ce un agent uman preia un bilet, utilizați "Întoarceți-vă la AI" pentru a permite AI relua automat răspunsul pe acel bilet. Util atunci când partea necesară omului este rezolvată, dar clientul are întrebări de urmărire AI poate ocupa.

Copilot inbox

AI-asistent de gestionare a biletelor din perspectiva inbox. Copilotul sugerează răspunsuri, rezumă istoricul conversației, recomandă misiuni prioritare / de plecare, și poate executa acțiuni pe platforme conectate.

chat și suport în timp real

& Citeşte în căsuță

Conversaţia în timp real a clienţilor a fost gestionată de la un inbox unificat. Vezi toate conversaţiile active, identitatea clientului, istoricul conversaţiei şi sugestiile AI. Mai mulţi agenţi pot colabora pe o conversaţie.

Norme proactive privind chat-ul

Declanşează mesajele de chat bazate pe comportamentul vizitatorilor: ora la pagina, specific URL vizitat, defila adâncime, reveni numărați vizita, intenția de ieșire, sau evenimente personalizate. Exemplu: afișați un mesaj de ajutor după 60 secunde pe pagina de preţuri.

Interceptare chat

Un widget chat personalizat încorporat pe site-ul dvs. Susţine AI chatul, live agent chatului, prezentarea biletelor, căutarea bazei de cunoştinţe şi identitatea vizitatorilor. Responsabil, accesibil, şi brandable.

Anchete CSAT

Colecta evaluări satisfacție client după chat și interacțiuni bilete. Proiectare sondaje cu propriile întrebări, scale de rating, și de urmărire prompte. Rezultatele se hrănesc în performanța echipei și perspective AI.

Sondaj e-mail post-chat

După ce se termină un chat, vizitatorii cu un e-mail cunoscut pot primi o scrisoare de marcă cu un rezumat AI a ceea ce s-a manipulat și un singur click "A fost ușor?" Da/Nu. Odată pe fir, linkuri semnate cu utilizare unică, fiecare trimitere autentificată, iar rezultatul aterizează pe pagina Feedback ca semnal propriu lângă stelele in-chat.

Bucla de identitate a feedbackului

Fiecare element de feedback care poartă o persoană le arată: nume, e-mail, un click-prin intermediul pentru călătoria lor completă client și contact CRM, și un singur clic pe Email sau AI-draft răspunsuri la sol în istoria lor reală.

Scrierea AI

Asistent separat de scriere AI pentru compunerea proiectelor de e-mail, răspunsurile la bilete, anunțuri și comunicațiile clienților. Folosește propriul prompt (nu creierul chat) pentru scrierea profesională a afacerii.

A. I. - Prima CRM

Centrul de comandă CRM

Un singur ecran care arată starea dumneavoastră CRM: valoarea conductei, viteza de tranzacţionare, sarcinile viitoare, oferte la risc, activitatea agent şi recomandările AI. Pagina principală CRM este punctul dvs. de pornire zilnic.

Contacte și companii

Gestionați contactele clienților cu profiluri complete: nume, e-mail, telefon, companie, etichete, stadiul ciclului de viață, istoricul conversației, istoria biletelor, istoricul cumpărării și câmpurile personalizate. Contacte de legătură către companii pentru managementul relației B2B.

Oferte și bord de conducte

Placă de tranzacţionare Visual Kanban-stil cu etape personalizabile. Drag se ocupă între etape, valori stabilite, atribui proprietarii, urmări datele apropiate, şi a vedea valoarea conductei la fiecare etapă. Conducte multiple susţinute.

Afacerea AI antrenează

AI analizează fiecare afacere și oferă coaching: semnale de risc (du-te liniștit, concurent menționat, probleme bugetare), recomandări de următoarea cea mai bună acțiune, probabilitatea câștigului, și a sugerat calendarul de urmărire.

Previziuni și rapoarte

Previziunile de venituri bazate pe datele conductei, ratele istorice apropiate și viteza de tranzacționare. Rapoartele includ conducta în funcție de etapă, după sursă, ratele de conversie, dimensiunea medie a contractului și durata ciclului de vânzări.

Agent de prospectare (SDR)

Perspective de AI-alimentate care identifică potențiali clienți din datele vizitatorilor, semnale de plumb și activitatea platformei conectate. Sugerează obiective de informare, proiecte de mesaje inițiale, și scoruri de calitate plumb.

Secvențe de urmărire

Secvenţe de urmărire automatizate în mai multe etape: email, asteptare, e-mail, raspuns la verificare, escaladare. Defineşte secvenţele pentru noi piste, oferte blocate, check-in-uri post-cumpărare şi campanii de reangajare.

Ciclul de viață și menținerea

Urmăriți etapele ciclului de viață al clienților (conducere, perspectivă, client, churred) cu tranziții automate. Agentul de reținere monitorizează semnalele de zgomot și sugerează intervenții.

Agent de administrare a datelor

Agent AI care curăță continuu și îmbogățește datele CRM: deduplicează contactele, umple câmpurile lipsă, validează e-mailuri, standardizează numele companiei, și steagurile înregistrări vechi.

Construieşte-mi CRM

Limba naturala CRM configurare: spune AI cum arata procesul de vanzare si construieste etapele conductei, campurile personalizate, se ocupa cu modele, si regulile automatizarii.

Verificarea stării de sănătate a CRM

Audit automat al calităţii datelor CRM: contacte duplicate, oferte fără paşi următori, conducte vechi, informaţii lipsă şi notarea completă a datelor.

Increderea in formatare

Controlul autonomiei la trei niveluri pentru fiecare agent AI CRM: Autopilot (AI actioneaza independent), copilot (AIA sugereaza, aprobari umane) si manual (AII observa numai). Setati forma pe agent, per tip de actiune, si pe prag de valoare.

Patru agenţi AI

CRM are patru agenți specializați AI: Steward (calitate de date), DST (prospectare), Retenție (prevenire în condiții de siguranță) și Analist (raportare și perspective). Fiecare agent are propriul set de Trust Dial.

Conectori și integrări

Conectori pre-construiți

Conectori gata de utilizare pentru Shopify, WooCommerce, BigCommerce, Magento 2, PrestaShop, OpenCart, osCommerce, Folosit WordPress, WHMCS, Zendesk, Stripe, Amazon SES, PostmarkRetrimite SendGrid, Mailgun, Gmail, IMAP, Slack, și Google Fiecare conector aduce acțiuni AI specifice platformei, cunoștințe și sincronizarea datelor.

Constructor de Conectori

Construiesc conectori personalizați pentru orice platformă, nici un cod, AI-asistat, sau cod complet. Constructorul suportă REST și GraphQL APIs, OAuth fluxul de cod de autorizare, webhook auto-înregistrare cu Stripe și scheme simple de semnătură, paginare (offset, pagină, cursor, și link-header), liste/erroare transforma, context multi-acțiune, și ambalaj pe piață.

Autor conector cu suport AI

ConnectionorBuilderAI vă ajută să construiți conectori: descrieți ce doriți și sugerează acțiuni, scrieri de personalizare a cererii și hărți API răspunsuri. Manipulează automat autentificarea, paginarea și manipularea erorilor.

OAuth debit pentru orice conector

Generic in- app OAuth fluxul de autorizare care funcționează cu orice conector. suport PKCE, managementul de stat al site-ului, reîmprospătare automată jetoane. Conectorii definesc lor OAuth parametri şi OpsIQ Se ocupă de flux.

Autobuze de capacitate (extensie la nivel de platformă)

Conectorii nu doar adaugă acţiuni de platformă. Ei pot alimenta caracteristicile miezului prin intermediul capacităţii "autobuze." Un conector declară o capacitate (calendar, îmbogăţire, esign în CRM; local_listing, rang_date în Intelligence Site; web_analytics în Analytic, payment_ provider in Payments; email_sync in Mailbox; video_meeting in Comms) şi implementează setul său de mici metode; OpsIQ descoperă prin capacitateRegistry și fire-l în UI, Client 360 cronologie, și acțiunile AI. Mai mulți conectori pot oferi aceeași capacitate fără blocare-in. Vezi conectorii/PLATFORM_CONNECTORS.md.

Nivelul preinstalat față de nivelul pieței

Conectorii sunt activi în registru, se menţin în poziţie verticală doar la referinţa fără cheie şi furnizorul cel mai utilizat pe capacitate (de exemplu Google Calendar, Gmail, Googl Business Profile). Conectori de piaţă (marketplace_conectors/) sunt descoperibili dar inerti până când sunt instalaţi, de exemplu Microsoft 365 Calendar, Outlook, DocuSign, Stripe, GA4, SerpApi, Zoom. Fiecare pod suprafeţează o listă a pieţei astfel încât UI şi AI pot determina "install din piaţă" (notificaţi-to-instalare) atunci când o capacitate nu are furnizor pregătit, niciodată un buton spart.

Piaţa conectorilor

Publică conectorii la OpsIQ Conectori de pachet cu profil.json, cunoasterea.json, fluxul de lucru_rețete.json, și arhive semnate. Marketplace suportă conectori gratuite și plătite cu facturare multi-surse.

Semnarea conectorului

Toate conectorii sunt semnate punct de vedere descriptiv pentru verificarea integrității. Semnarea este verificată la timpul instalării. Utilizați instrumentul remiss_all_conectors pentru a re-signa după actualizări.

SmartLookup

Sistem declarativ de potrivire neclară pentru acţiunile conectorului. Defineşte regulile de căutare şi OpsIQ se potrivește cu întrebările utilizatorilor entităților de pe platformă care utilizează algoritmi FuzzyScore și smartRank. Exemplu: find_country("germ") meciuri Germania cu 88.9% încredere.

Contracte de acţiune

Generalul.OpsIQ APIpublică fiecare înregistrareJSONoperaţiune ca o acţiune care poate fi descoperită. Utilizaţi meta.acţiuni pentru contractele live totale şi exacte tastate; pachete conectori declară propriile acţiuni de vânzător prin intermediul ActionExecutor unificat.

Rețete conector

Rețete pre-construite pentru fluxul de lucru care combină mai multe acțiuni conectori în fluxuri comune de lucru. Exemplu: "Când o nouă comandă vine pe Shopify, creați un bilet, actualizați CRM și trimiteți o notificare Slack."

Sincronizare cunoștințe

Conectorii declară subiecte de cunoștințe care se sincronizează cu baza de cunoștințe AI. Articole de ajutor specifice platformei, ghiduri de configurare și pașii de depanare sunt disponibile automat pentru AI fără intrare manuală a cunoștințelor.

Platforma dezvoltatorului

RESTAURANT API

Un nume JSON API acoperă fiecare administrator înregistrat ; JSON operare, cu API-autentificare prin cheie, izolarea spațiului de lucru, domenii de aplicare, limitarea ratei, scrieri idempotente, OpenAPI și un Postman Colecţie de fotografii.

Webhook-uri

Outbound webhooks pentru toate evenimentele majore: comenzi, facturi, abonamente, bilete, chat-uri, piste, înregistrări de utilizator și abandon coș. Livrare Async prin coada de locuri de muncă, retriere exponențială backoff, protecție SSRF, și auto-dezable după 15 Eşecuri consecutive.

Semnare webhook

Fiecare webhook outbound este semnat cu HMAC-SHA256. Verificați semnăturile pe sfârșitul dumneavoastră de primire pentru a asigura autenticitatea webhok. Eveniment stabil_id pentru procesarea idepotent.

Control SDK

JavaScript SDK pentru widget-ul de urmărire cu rezoluţia identităţii, urmărirea personalizată a evenimentului, controlul programatic al chat-ului şi configurarea specifică paginii. Instalează reţete pentru React, Vue, Next.js, WordPress, Shopify, și statică HTML.

Module și SDK-uri

Server-side SDKs și module pentru cadre comune. WordPress modul; WHMCS modul, și generic PHP / biblioteci de integrare Node.js.

Evenimente API

Împingeţi evenimente personalizate în OpsIQ de pe backend-ul dvs.: achiziţii, înscrieri, utilizare a caracteristicilor, erori sau orice eveniment de afaceri. Evenimentele apar în cronologia vizitatorilor şi se alimentează cu analize şi context AI.

Declanşează cartea de bucate

Construi fluxuri de lucru automatizate declanșate de evenimente: bilet nou, chat început, vizitator identificat, etapa de afacere schimbată, sau eveniment personalizat. Declanșează executa acțiuni conector, trimiteți site-uri web, actualizări recorduri, sau notifica echipa ta.

API constructor

Vedere API Configurați criterii de evaluare, cereri de testare, inspecta răspunsurile și depana integrări fără a părăsi OpsIQ.

Echipa şi administraţia

Controlul accesului bazat pe roluri

Trei roluri: Proprietar (acces complet, facturare, zona de pericol), Admin Full (toate operațiunile cu excepția facturii și zonei periculoase) și agent (doar departamente alocate, fără acces la setări). Toate paginile sensibile sunt greu de utilizat.

Tablou de bord pentru performanţa echipei

Proprietar și bord de bord numai admin care arată timpi de rezoluție, distribuție volum de muncă, adâncime mâner, defalcare canal, analiza trendurilor, conformitate SLA, CSAT de agent, ratele de redeschidere, rollup-uri echipa, și ore aglomerate. Actualizate în timp real.

Prezenţa admin şi urmărirea online

În timp real who-is-online widget în navigarea admin. Heartbeat pe bază de detectare a prezenței (60- Ping al doilea, 300-a doua prelungire, automat-prune dupa 120 zile). A se vedea care administratori sunt în prezent active și pe ce pagini.

Setări per spațiu de lucru

Fiecare site conectat (spațiu de lucru) poate avea propria configurare AI, setările conectorilor, departamentele biletelor, branding-ul și regulile operaționale. Implică global cascada la spatii de lucru care nu le suprascrie.

Gestionarea mai multor situri

Gestionați mai multe site-uri de la un OpsIQ admin. Fiecare site are propriul său fragment de urmărire, datele vizitatorilor și configurarea. Comutați între site-urile de navigare admin .

Sistem de șablon e-mail

Șabloane de e-mail bazate pe registru pentru toate comunicațiile automate: notificări de bilete, transcrieri de chat, emailuri de bun venit, resetări parole și alerte de sistem. Editați HTML șabloane cu previzualizare live, jetoane variabile ({{customer_name}}, {{ticket_id}}) și controlul global al aspectului.

Import și export

Importă contacte, bilete și articole de cunoaștere din CSV/JSON. Exporta datele vizitatorilor, rapoartele de analiză și înregistrările CRM. Portabilitatea datelor pentru migrarea între sisteme.

Securitate, conformitate și operațiuni

Întreprinderi SSO

OIDC (OpenID Connect) single sign-on with full runtime: descoperire, autorizare, apelare, verificarea semnăturii JWKS, userinfo, listarea domeniului, furnizarea JIT și polițiștii de stare. SAML suport de configurare.

GDPR și conformitatea datelor

Construit-in DSAR (Data Subiect Access Request) manipularea: exportarea și ștergerea datelor clienților în toate sistemele. Ștergerea datelor la nivel de contact care acoperă sesiunile, biletele, chat-urile, înregistrările CRM și jurnalele de e-mail. Managementul consimțământului și politicile de reținere.

IP blocare și protecție brută

Specific blocului IPs sau variază de la accesarea site-ului dvs. sau admin. Blocare automată după încercări de autentificare eșuate configurabile.IP, timbru de timp, și agent utilizator.

HTS și antetele de securitate

HTTP Securitate stricta transport, Permisiuni-Politice antete, și configurare securizată cookie. Desfășurări auto-hostate pot adăuga antetele CSP prin configurare server.

Întărire a cârligelor web de ieșire

SSRF blocheaza brazdele web pentru private/metadate IP Async de administrare previne obţinerea unor criterii finale lente de blocare a aplicaţiei dumneavoastră. 15 eșecuri consecutive previne deșeurile de resurse pe baza unor criterii finale moarte.

Izolarea spațiului de lucru

Izolarea strictă a datelor între spaţiile de lucru. Vizitatorii, biletele, discuţiile, înregistrările CRM şi conversaţiile AI sunt escortate în spaţiul lor de lucru; scurgerile de date din spaţiu sunt prevenite la nivelul interogării.

Gestionarea ciclului de facturare

Suport pentru ciclurile lunare, trimestriale, semianuale, anuale, bienale şi de facturare pe viaţă. Normalizarea valutei pentru porţile multimonede. Conversia FX la primirea plăţilor pentru raportarea exactă a veniturilor.

Cron și automatizare programată

Sistem de cron încorporat pentru sarcini programate: generarea rapoartelor, curăţarea datelor, reînnoirea abonamentelor, actualizările formării AI, sincronizarea conectorilor şi retările webhook. Diagnosticări medicale cu indicatori de avertizare.

Politici de păstrare a datelor

Configurați cât timp sunt păstrate sesiunile de vizitare, transcrierile chat-ului, istoricul conversațiilor AI și jurnalele evenimentelor. Curățarea automată a datelor în vârstă pentru gestionarea stocării și respectarea politicilor de păstrare.

Diagnostic și sănătate

Tablou de bord de sănătate sistem care arată starea Cron, conectivitatea bazei de date, starea furnizorului AI, sănătatea conectorului, tarifele de livrare a webhook-ului și utilizarea de stocare. Avertismente pentru probleme de configurare și blocaje de performanță.

Cine OpsIQ este pentru

Magazine comerciale electronice

Magazine

Urmări fiecare vizitator de la aterizare pentru a cumpăra. Să AI răspunde "Unde este comanda mea?" folosind live Shopify/WooCommerce/BigCommerce date. Gestionați bilete de sprijin cu AI auto-reply. Rula o conductă de afacere pentru en-gros și B2B piste. Atribuiți venituri la surse de trafic și campanii. Monitorizează abandonul coșului cu fluxuri de lucru de recuperare.

SaaS și companii de software

SaaS

Monitorizează înscrierile de probă și adopția caracteristicilor cu reluare sesiune. Urmărește ce pagini de documentare convertesc. Suport automat cu AI la sol în dumneavoastră API docs. Gestionați veniturile abonamentului și oferte de extindere în CRM. Conectați platforma de facturare (Stripe, WHMCS) pentru urmărirea în timp real a RRM. Utilizați agentul CRM ciclu de viață pentru a detecta și preveni churn.

Agenţii şi liber profesionişti

Agenţie

Oferă analize de alb-eticheta și portaluri de sprijin pentru clienți. Urmăriți mai multe site-uri client de la un admin. Utilizați conducta CRM pentru a gestiona perspectivele și pistele proiectului. Construiți conectori personalizați pentru platformele client folosind Connector Builder. Generați rapoarte SEO cu Site Intelligence. Reseller conectorii pieței ca servicii valoric-add.

Gazduire si infrastructura

Gazduire

Adânc WHMCS integrarea cu 80+ acţiuni AI pentru căutare ordine, management de servicii; DNS, și furnizarea. Auto-replică la întrebări comune de găzduire folosind articole de bază cunoștințe. Urmăriți lista de stare a serverului. Gestionați biletele de suport tehnic cu triaj AI. Utilizați scara ciclu de facturare pentru luni prin planurile de găzduire pe viață.

Întreprinderile cu o capacitate ridicată de sprijin

Sprijin

Deflecție 40-70% Eliminați întrebările repetitive cu ajutorul chat-ului bazat pe inteligență artificială. Direcționați tichetele către departamentul potrivit cu triarea bazată pe IA. Urmăriți performanța echipei cu timpii de rezolvare, conformitatea SLA și CSAT pentru fiecare agent în parte.

Echipe de marketing și SEO

Comercializare

Apartament de informații complete Site: crawl-uri, audituri tehnice SEO, analiza conținutului, urmărirea rangului SERP, cercetare cu cuvinte cheie, monitorizare backlink și grilă locală SEO. Managementul profilului Google Business. Programate rapoarte alb-etichetă pentru clienți. Testare A/B construit în widget urmărire. atribuire campanie pe toate canalele.

Fondatori solo și echipe mici

Startup-uri

Începeți cu doar de urmărire și chat, gratuit pentru a adăuga. Apoi adăugați bilete atunci când obțineți volumul de sprijin. Porniți CRM atunci când începeți să vindeți. Conectați platformele în timp ce le adoptați. OpsIQ solzi de la o persoană care face totul pentru a 50-person operations team with RBAC, departaments, and per-agent performance tracking.

Întreprinderi și mărci multiple

Enterprise

Întreprinderi SSO cu OIDC pentru autentificare centralizata. Izolare multi-spatiul de lucru pentru branduri separate sau divizii. Configuratie AI per-workspace cu diferite furnizori si modele. Dezvoltarea conectorilor personalizati cu distributia pietei. Trasee auditive, GDPR instrumente de conformitate și politici de păstrare a datelor.

Ce? OpsIQ înlocuiește

Google Analytics + Hotjar + Plausibil

Analize complete ale site-ului cu urmărirea vizitatorilor, reluarea sesiunii, clasamente de pagini, inteligență geo, pâlnii de intenție, atribuirea conversiei, evenimente, experimente A/B și urmărire erori JS, toate prietenos cu confidențialitatea, toate într-o singură platformă.

Intercom + Drift + Tidio

AI-puternic de chat client cu cunoștințe la sol, suport AI multi-ofertă, automat-handoff pentru oameni, reguli proactive de chat, istoricul conversației, sondaje CSAT, și crearea de bilete de la chatul.

Zendesk + Freshdesk și Help Scout

Sistem de bilete native cu departamente, priorităţi, SLA, triaj AI, automat-replică cu întârziere configurabilă, ingerare e-mail, ticket înglobat, fuzionarea biletului, copilot inbox, şi Return to AI capacity.

HubSpot + Pipedrive + Salesforce

AI-primul CRM cu patru agenți specializați AI (Steward, DST, Retenție, Analist), Trust Autonomie de control, placă conducte, coaching, prognoză, secvențe, gestionarea ciclului de viață și configurarea limbajului natural CRM.

Ahrefs + SEMrush + Moz

Site-ul de informații cu crawlere automatizate, audituri SEO tehnice, analiza conținutului, căutare AI, urmărire rang SERP, cercetare cuvinte cheie, analiză backlink, grilă SEO locale, și rapoarte programate alb-etichetă.

Zapier + Face + personalizat middleware

Conector SDK cu 25+ conectori pre-construiți, Connector Builder (fără cod/AI-asistat/cod complet); OAuth debit, webhook auto-înregistrare, un catalog mare de definiții ale acțiunii conectorului care devin executabile numai atunci când conectorul relevant este instalat, activat, configurat și validat, SmartLookup, piață și pachete semnate.

Administrator de profil Google Business

Conector GBP complet: management de revizuire, post-publicare, administrare Q&A, uploaduri foto, sincronizarea informațiilor de afaceri, urmărirea perspectivelor și răspunsurile de revizuire AI-alimentate, toate din interior OpsIQ.

Instrumente separate de șablon de e-mail

Șabloane de e-mail cu înregistrare, cu editor vizual, previzualizare live, chipsuri variabile, control global al aspectului și personalizare per-eveniment pentru toate comunicațiile automate.

Tablouri de bord pentru conducerea echipei

Performanță de echipă construită: timpi de rezoluție, volum de muncă, conformitate SLA, CSAT de agent, ratele de redeschidere, ore cele mai aglomerate, urmărire în timp real prezența și defalcate per-departament.

GDPR Instrumente de conformitate

Native DSAR manipularea, ștergerea datelor în toate sistemele, gestionarea consimțământului, politicile de reținere și traseele de audit, construite pe platformă, nu blocate.

Două ediții

Desfășurare găzduită

OpsIQ ruleaza pe infrastructura gestionata. Operatiunea de produs este aceeasi; infrastructura, actualizările si backup-urile sunt gestionate de operatorul de gazduire. Acest manual documenteaza OpsIQ runtime, mai degrabă decât fluxuri de cont comercial sau marketing.

Modul auto-hostat

Instalează OpsIQ pe propriul server pentru control complet asupra datelor, branding-ului, actualizărilor și integrării. Necesită PHP 8.4+, MySQL 5.7+ sau MariaDB 10.3+, HTTPS și OpsIQ Cron unificat. WHMCS integrarea ca un modul addon. suveranitate completă a datelor.

Ordinea de citire recomandată

1
Pornire rapidă

Urmați ghidul de configurare 30- minute pentru a obține urmărire, chat și AI de bază care lucrează pe site-ul dumneavoastră.

2
Tablouri de bord și analize

Aflaţi cum să citiţi datele vizitatorilor, configuraţi reluarea sesiunii, identificaţi pistele şi înţelegeţi tiparele de trafic.

3
Informaţii despre site-uri

Rulați primul crawl SEO, verificați sănătatea tehnică, și setați de urmărire rang SERP pentru cuvintele cheie țintă.

4
Bilete și sprijin

Configurați departamente, configurați automat-reply cu AI, conectați ingestie de e-mail, și instruiți AI pentru a gestiona întrebări comune.

5
CRM

Organizaţi contacte, construiţi-vă conducta, configuraţi agenţii AI, stabiliţi nivelele Trust Dial şi lăsaţi AI să vă antreneze afacerile.

6
Conectori și instrumente de dezvoltare

Conectați platforma de e-commerce/billing, construiți conectori personalizați, configurați proteze web și integrați prin intermediul REST API.

💡
Nou la OpsIQ? Începe cu ghidul rapid Start de mai jos. Puteți avea urmărire și bază AI chat-ul rulează sub 30 minute.
Începe de aici.

Începeţi repede. 30 minute

Urmați acești pași pentru a obține OpsIQ Alergare. Fiecare pas se bazează pe cel anterior. Până la sfârșitul anului, veți avea de urmărire vizitatori, AI chat, și suport de bază bilete.

Configurare
Lista de verificare a început rapidO listă de configurare ghidată care arată instalarea widget-ului, conectarea platformei, formarea AI, echipa invita și du-te-viu, cu un 60 % bara de progres.ÎncepeţisetupInstalează OpsIQ widgetS-a făcut.Conectează o platformă (WHMCS, Shopify...)S-a făcut.Antrenează-ţi AI pe conţinutul tăuS-a făcut.Invită-ţi echipa.Verifică şi du-te în direct.Setare progres3 din 5 · 60%1STEP 1Instalați widget-ul2STEP 2Conectează & trenul AI3STEP 3Invită și du-te live
Calea 30- minute: instalați widgetul, conectați o platformă, instruiți AI-ul, invitați echipa, apoi mergeți în direct.

Configurarea 30 min.

1
Activează-ţi licenţa

Introduceți tasta de licență în admin OpsIQ. Du-te la Setări, introduceți cheia de licență furnizată pentru această instalare și faceți clic pe Activare. Ar trebui să vedeți o insignă verde "Active."

2
Setează-ţi identitatea de afaceri

Du-te la Setări și completează numele de afaceri, industrie, fusul orar, moneda implicită și orele de suport. Aceste informații sunt utilizate de AI atunci când răspundeți întrebărilor clienților și de analize pentru rapoartele timezone-aware.

3
Alege un furnizor AI

Du-te la configurare AI și selectați furnizorul. Opțiuni: Claude (Anthropic), GPT- 4o (OpenAI), Gemini (Google) sau Grok (xAI). Introduceți API cheie dacă utilizați propria ta cheie, sau de a folosi Gestionat AI, dacă este disponibil pe planul dumneavoastră. Faceți clic pe "Test conexiune" pentru a verifica.

4
Instalați widget-ul de urmărire

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
Conectează platforma ta

Dacă utilizaţi Shopify, WooCommerce, WHMCS, sau o altă platformă susținută, du-te la Conectori, găsi platforma ta, introduce acreditările, și faceți clic pe Test Connection. Acest lucru oferă accesul AI pentru a comanda date, profiluri de client, și context de sprijin.

6
Invită-ţi echipa.

Du-te la echipa, faceți clic pe Invita, introduceți e-mail și rolul lor (Owner, Admin Full, sau Agent). Agenții pot accesa doar departamente le atribui. Proprietari și admins complet vedea totul.

Cea mai rapidă cale posibilă (5 minute)

Pas 1: Instalare widget

Copiați fragmentul de pe Site-urile conectate și lipiți-l pe site-ul dumneavoastră. Acest lucru vă oferă urmărirea imediat.

Pas 2: Activați AI

Du-te la configurare AI, alege un furnizor, introduceți cheia, și salva. Al chat este acum activ pe site-ul dumneavoastră.

Gata.

Acum aveți de urmărire vizitatori și AI chat. Puteți adăuga bilete, CRM, și conectori mai târziu.

Ziua 2: Fă-l util

Adaugă cunoștințe

Du-te la baza de cunoștințe și adaugă 5-10 articole despre întrebările cele mai frecvente. AI utilizează aceste pentru a răspunde cu precizie clienților.

Creează departamente

Du-te la bilete și de a crea cel puțin 2 departamente (de exemplu, "Sales" și "Suport"). Atribuiți membrilor echipei pentru fiecare.

Scrieţi-vă prompt AI

Du-te la Al Training și scrie un client AI prompt care descrie afacerea ta, tonul, și regulile de escaladare.

Testează o conversaţie.

Deschideți site-ul într-un browser privat și discuta cu AI ca un client. Verificați dacă răspunsurile sunt corecte și ton este corect.

Săptămâna 1: Construiți-vă operațiunile

Conectează emailul

Setați o cutie poștală (Gmail, IMAP sau un conector furnizor) astfel încât e-mailurile clienților să creeze automat bilete.

Configurarea replicării automate

Activați auto-replicarea biletelor pentru departamentele sigure. Setați o întârziere de 2_min. astfel încât oamenii să poată interveni primii.

Analiza de analiză

Verificați Dashboard zilnic. Uitați-vă la numărul vizitatorilor, rata de salt, pagini de top și vânzări în cazul în care urmărirea este conectată.

Porniți CRM

Deschide AI CRM și permite OpsIQ importarea contactelor de pe platformele conectate. Revizuiți placa conductei.

Luna 1: Optimizează

Istoricul AI recapitulativ

Verificaţi istoricul AI săptămânal. Caută răspunsuri greşite, întrebări ratate şi oportunităţi de a adăuga cunoştinţe.

Adăugați reguli proactive

Creați o regulă: dacă un vizitator este pe pagina de preț pentru 60+ secunde, arată un mesaj de chat întrebând dacă au nevoie de ajutor.

Construiește un conector

Dacă utilizați o platformă care nu are un conector încorporat, folosiți Connector Builder pentru a crea una.

Configurați proteze web

Conectați OpsIQ la instrumentele interne folosind grămezi de internet pentru bilete, chat-uri și evenimente de vânzări.

Pot să sar peste AI şi să folosesc urmărirea?+

Da. Furnizorul AI este opţional. OpsIQ funcţionează ca un analytics pur şi platforma de ticketing fără AI. Puteţi activa AI mai târziu, atunci când sunteţi gata.

Pot să sar peste conectori şi să le adaug mai târziu?+

Da. Conectorii îmbogățesc AI cu date specifice platformei, dar OpsIQ funcționează fără ele. Începeți cu urmărirea și chat-ul, apoi conectați platformele atunci când este necesar.

Dacă nu am încă un site?+

Puteți utiliza în continuare OpsIQ pentru bilete, CRM și colaborarea echipei. Widget de urmărire este opțională. Adăugați-l atunci când site-ul dvs. este gata.

Cum știu dacă widget-ul este instalat corect?+

Vizitați site-ul într-un browser privat / incognito. Apoi verificați OpsIQ Live Feed. Ar trebui să vezi vizita ta apar în interiorul 15 Dacă nu, verificaţi: (1) este fragmentul lipit corect, (2) este cheia site-ului corect, (3) sunt blocante de publicitate sau antete CSP care blochează scenariul.

Începe de aici.

Hartă completă a produsului

OpsIQnu este o caracteristică. Este un administrator operator, un widget site-ul, un strat de suport AI, un sistem de bilet / Helpdesk, un complet CRM cu patru agenți AI, un apartament Site Intelligence, o platformă de conectori cu piață și o suprafață dezvoltatoare. Aici este fiecare componentă pe care o conține.

Administrator operator

Dashboard, live feed, jurnal de vizitatori, sesiuni, reluare sesiune, pagini de top, geo inteligență, pâlnie intenție, evenimente log, experimente A/B, urmărirea erorilor JS, vânzări și conversii, piste, AI CRM (centru de comandă, contacte, companii, oferte, bord conducte, coaching afacere, prognoza, prospectare, secvențe, ciclu de viață, administrator de date, Construiește-mi CRM, CRM config, CMR sănătate, CFM API_), bilete, chat inbox, reguli proactive, sondaje CSAT, proiecte de e-mail, cutii poștale, configurare AI, formare AI, istorie AI, perspective AI, baze de cunoștințe, conectori, Conectator Builder, piață, site-uri conectate, managementul echipei, performanța în echipă, setările, diagnostice, și licență.

Suprafețe orientate spre clienți

Urmărire site-ul widget (analize balize + chat + ticket integrat + cunoștințe de căutare bază), client AI chatul, portal de depunere a biletelor, identitatea vizitatorilor token manipulare, uploaduri fișiere, CSAT sondaj widdget, și cu vedere la client centru de ajutor.

A. I. - Prima CRM

Centrul de comandă, contactele, companiile, tranzacţiile, placa conductei cu drag-and-drop, AI se ocupă de coaching (semnale de risc, următoarea-cele mai bune acţiune, probabilitatea câştigului), prognoza veniturilor, prospectare agent (SDR), secvenţe automatizate de urmărire, ciclul de viaţă şi gestionarea retenţiei, agentul administrator de date (dedate, îmbogăţire, valid), Construi CRM meu (setare limbaj natural), CRM configuraţie, CRM sănătate cec, Trust Dial (Autopilot/Copilot/Manual per agent), patru agenţi specialişti (Steward, DST, Retention, Analyst) şi CRM API cu webhooks.

Suite de informații site

Crawl-uri automate site, audit tehnic SEO (viteza, mobil, core Web Vitals; SSL, redirecționări, date structurate), audit de conținut (contul de cuvinte, lizibilitate, densitatea cuvintelor cheie, structura capetelor), căutare semantică cu AI-alimentată, urmărirea rangului SERP la motoare, cercetare de cuvinte cheie cu scoruri de oportunitate, analiză și monitorizare, vizualizarea locală a rețelei SEO, sincronizarea profilului Google Business (reviews, posturi, Q&A, fotografii, perspective), rapoarte programate (zi/săptămână/lună) și eticheta albă PDF Producţie pentru agenţii.

AI și automatizare

Client AI chat (multi-oferator: Claude, GPT-4o; Gemini, Grok), admin AI assistant, IA knows la soling, auto-handoff cu revert configurabil, per-workspace AI configuration, gestionat AI și BYOK moduri, bugete token și controale de cost, AI istorie de audit traseu, IA perspective analiza, bilet AI triaj, bilet auto-replica cu întârziere, scrierea AI (separat prompt) și admin inbox copilot.

Conectori și integrări

25+ conectori pre-construite (Shopify, WooCommerce, BigCommerce, Magento 2, PrestaShop, OpenCart, osCommerce, Folosit WordPress, WHMCS, Zendesk, Stripe, Amazon SES, PostmarkRetrimite SendGrid, Mailgun, Gmail, IMAP, Slack, Google Business Profile), Constructor de conectori (fără cod/cu ajutorul inteligenței artificiale/codul complet), generic OAuth Flux de lucru cu PKCE, piață de conectori cu distribuție plătită, semnare și verificare a conectorilor, potrivirea fuzzy SmartLookup, un catalog mare de definiții ale acțiunilor HTTP a căror disponibilitate depinde de instalarea, activarea, configurarea și validarea conectorului, sincronizarea cunoștințelor și rețetele fluxului de lucru.

Platforma dezvoltatorului

RESTAURANTAPI(vizitatori, evenimente, bilete, contacte, setări, conectori), OpenAPI spec;API management cheie, outbound webhooks (alinc, semnat, retried, SSRF-păzit, auto-dezable), EvenimenteAPI pentru ingestie de evenimente personalizate, widget SDKcu rezolutia identitatii, declanseaza cartea de bucate, contracte de actiune, conector SDK, ambalaje de piață, SDK-uri pe servere (PHP, Node.js); WordPress modul și WHMCS modul.

Configurări și operațiuni

Identitatea afacerii, configurarea AI per spaţiu de lucru, setările de urmărire, securitatea (HSTS, Permisiuni-Politice, IP blocare, protecţie brută), RBAC (Owner/Full Admin/Agent), managementul echipei şi invitaţiile, bord de performanţă a echipei, urmărirea prezenţei admin, sistemul şablonului de e-mail (redactor registry, vizual, jetoane variabile), proiectant de sondaj, cunoştinţe de domeniu, configurare înglobată de bilete, branding, politicile de păstrare a datelor, gestionarea ciclului de facturare (lunarly through life), normalizarea monedei, import/export, diagnostice, automatizare cron, şi zona periculoasă.

Securitate și conformitate

Întreprinderi SSO (OIDC cu verificarea JWKS, furnizarea JIT); SAML configurația; GDPR/DSAR manipularea (export și ștergere în toate sistemele), ștergerea datelor per contact, gestionarea consimțământului, izolarea spațiului de lucru (stratul de interogare restrictiv) pistele de audit, urmărirea eșuată a autentificării; IP Blocarea, ieşirea de pe webhook SSRF şi politicile de păstrare a datelor.

Puntea furnizorului

Gestionat AI proxied through OpsIQ furnizor URL, Site Intelligence provider calls, licence validation, health reports; PDF redarea, și exporturile de date, toate rutate prin obiectivul furnizor configurat, nu vânzător direct API Apeluri de la serverul dumneavoastră.

Fiecare pagină admin

Tablou de bord

Nucleu

Centrul de comandă zilnic: prezentare generală a traficului, numărare live vizitatori, rezumat al vânzărilor, adâncimea cozii de sprijin, alerte de activitate AI și scurtături rapide.

Hrană pentru animale vii

Analize

Fluxul de vizitatori în timp real: vizualizările paginii, chat-urile încep, transmiteri forma și semnale de intenție actualizate la fiecare câteva secunde cu filtre țară, dispozitiv și referer.

Jurnal vizitatori

Analize

Vizita completă: dispozitiv, browser, OS, țară, oraș, referer, parame UTM, pagina de aterizare, identitate și istoria paginii complet-view.

Sesiuni

Analize

Vedere grupată în călătorie: flux de pagini, timp pe pagină, adâncime defilare, cale de conversie și pagina de ieșire pentru fiecare sesiune vizitator.

Repetare sesiune

Analize

Redarea timpului de evenimente capturate: mișcarea mouse-ului, clicuri, suluri, tranziții pagină și formează interacțiuni pentru diagnosticul UX.

Pagini de sus

Analize

Clasament de performanță a paginii: vizite, timp de angajament, rata de salt, conversii, interacțiuni de sprijin și direcția tendință.

Informaţii geo

Analize

Rapoarte geografice: defalcare țară/oraș cu hărți, distribuție dispozitive, cota de browser, surse de trafic și penetrarea pieței.

Pâlnie intenţionată

Analize

Urmărire intenție comportamentală: vizite de stabilire a prețurilor, frecvența returnării, navigarea doc, interacțiunile suport și semnale personalizate cu probabilitate de conversie.

Jurnal evenimente

Analize

Istoricul evenimentului cautabil: vizualizari pagini, evenimente personalizate, chat-uri, achizitii, transmiteri de formulare cu metadate complete si filtrare.

Experimente A/B

Analize

Testare Split: crearea variantelor, alocarea traficului, definirea obiectivelor, măsurarea importanței și declararea câștigătorilor, toate din interior OpsIQ.

Erori JS

Analize

Capturarea erorilor de pe front: mesaje, urme de stivare, browsere afectate, frecventa, pagini afectate si urmarirea tendintelor.

Vânzări

Vânzări

Tablou de bord privind veniturile: comenzi, reînnoiri, restituiri, atribuire pe sursă, performanță în campanie, comparație pe perioadă și analiză a tendințelor.

Plumburi

Vânzări

Managementul plumbului: punctaj, atribuirea sursei, starea CRM, detalii de contact, semnale comportamentale şi rutarea conductei.

CRM AI

CRM

CRM complet: centru de comandă, contacte, companii, oferte, bord conducte, coaching, prognoza, prospectare, secvenţe, ciclu de viaţă, administrator de date şi sănătate.

Bilete

Sprijin

Suport Inbox: departamente, priorităţi, urmărire SLA, triaj AI, răspuns automat, note interne, ataşamente la fişiere, fuzionare şi managementul statutului.

& Citeşte în căsuță

Sprijin

Conversații live: AI și chat uman, predarea, colaborare, istoricul conversației, identitatea clientului, și CSAT colecție.

Ciorne de e-mail

Sprijin

Managementul e-mailului: intrare prin e- mail la bilete, suport de AI a răspuns compoziţia, selecţie şablon şi configurarea căsuţei poştale.

Configurație AI

AI

Configurare furnizor: selectați Claude/GPT-4o/Gemini/Grok, intra API cheie sau activa administrat AI, model set, temperatura, și bugete token per spațiu de lucru.

Instruirea AI

AI

Prompt authoring: cu care se confruntă clienţii şi admin-faţă de faţă, reguli de escaladare, linii directoare ton, subiecte interzise, şi configuraţia limitelor.

Istoric AI

AI

Audit conversație: jurnale complete de cerere/răspuns, utilizarea jetoanelor, costuri per conversație, furnizor, versiune model și rezultatul rezoluției.

Informaţii AI

AI

Analiza modelelor: întrebări comune, ratele de rezoluție, frecvența de predare, satisfacția pe subiect și identificarea decalajelor în materie de formare.

Baza de cunoștințe

AI

Conţinut de instruire AI: articole, intrări FAQ, documente de produs, cunoştinţe conectori şi intrări personalizate. Căutare semantică şi cuvânt cheie pentru solizare AI.

Conectori

Integrări

Integrare hub: conectori instalaţi, starea de sănătate, inventarul acţiunii, managementul credibil, browser-ul pieţei şi Connector Builder.

Site-uri conectate

Configurări

Managementul site-ului: urmărirea fragmentare, tasta site-ul, configurare widget, setări domeniu, și pe site-uri de izolare a spațiului de lucru.

Echipa

Configurări

Managementul utilizatorilor: invita membrii, atribui roluri (Owner/Full Admin/Agent), seteaza accesul departamentului si administreaza permisiunile.

Performanță în echipă

Configurări

Indicatori de operare: timpii de rezoluție, volumul de muncă, conformitatea SLA, CSAT prin agent, ratele de redeschidere, orele cele mai aglomerate și analiza tendințelor.

Configurări

Configurări

Configurare: identitate de afaceri, configurare AI, urmărire, securitate, branding, reținere, șabloane e-mail, facturare, import/export, diagnostic și zona periculoasă.

Licență

Configurări

Managementul planului: starea licenţei, caracteristicile planului, indicatorii de utilizare, data reînnoirii şi opţiuni de actualizare/reducere.

Începe de aici.

Ghidat la bord

Călătoria la bordul navei transformă o nouă instalare într-un spațiu de lucru funcţional OpsIQ și poate fi lăsată și reluată fără a pierde progresul.

Ecran produs
La bordLa bord arată fiecare zonă de configurare, starea actuală și următoarea acțiune pentru a finaliza.La bordspațiu de lucruPROGRESS60%COMPLETED6UrmătorulControlVIE VIU AIRPACELicențăValidarea licenței de produsGata.Furnizor AISelectează furnizorul și cheia de încercareGata.MarcaIdentitatea și tonul întreprinderilorGata.Site webAdaugă site și instalează widgetÎnainte1COMPLETE BASICSLicență, marcă, AI2CONNECT DATASite și conector3VERIFY LAUNCHEchipa, email, cecuri
La bord arată fiecare zonă de configurare, starea actuală și următoarea acțiune pentru a finaliza.

Secvența recomandată

  1. Licență: validează licența și confirmă că spațiul de lucru este activ.
  2. Furnizor AI: alege furnizorul/modelul, introduceți acreditările și executați testul de conectare. AI poate fi omis dacă spațiul de lucru va utiliza inițial doar analiștii și biletele.
  3. Identitatea afacerii: Setează numele, industria, descrierea, tonul cu care se confruntă clienţii şi detaliile de marcă folosite de către widget şi AI.
  4. Conector: permite cel puțin o platformă externă atunci când OpsIQ are nevoie de comenzi, clienţi, bilete, email sau alte contexte ale platformei.
  5. Site-ul și widget: creați site-ul/spațiul de lucru, copiați tasta site-ului și verificați o vizită privat-browser în Live Feed.
  6. Echipa și rutarea: invita admini / agenţi, crea departamente, set de e-mail rutare şi confirma preferinţele notificare.
  7. Controale în viață: test chat, un bilet, conector sincronizare, cron, outbound e-mail, webhooks și antete de securitate.

Călătoria stochează finalizarea pe spațiu de lucru. Revenirea la Onboarding ar trebui să arate pașii finalizați, mai degrabă decât forțarea o repornire.

Începe de aici.

Navigare și permisiuni de administrare

Bara laterală OpsIQ este conştientă de permisiune. Această hartă explică locul în care trăieşte fiecare zonă operaţională şi de ce o pagină nu poate fi vizibilă fiecărui administrator.

Ecran produs
Navigare OpsIQGrupurile de bară laterală OpsIQ după zona de lucru; legăturile individuale apar doar atunci când rolul curent le poate utiliza.Navigare OpsIQspațiu de lucruGROUPS8PAGINIPermisiune bazată peSEARCHDisponibilVIE VIU AIRPACESprijinBilete, email, CSAT, cunoștințeDeschideCRMContacte, conducte, oferte, prospectareDeschideAutomatizareFluxuri de lucru, reguli, obiectiveDeschideSecuritate și confidențialitatePrezentare generală, audit, consimţământ, blocuriAdministrator1PICK A GROUPPotrivire bara laterală2CHECK ROLEAscuns înseamnă restricţionat.3USE PAGE HELPDeschide secțiunea de potrivire
Grupurile de bară laterală OpsIQ după zona de lucru; legăturile individuale apar doar atunci când rolul curent le poate utiliza.
Sprijin

Bilete, platforma de e-mail a echipei, CSAT, Centrul de Ajutor şi chatbot curge.

CRM

Suprafețele de vânzare zilnice: CRM Home, Centrul de comandă, contacte, conducte, prognoza, ciclul de viață, prospectare, segmente, clasament, aprobări de afacere, administrator de date, instrumente de creștere și fluxul de activitate.

Automatizare

Fluxuri de lucru determinate de evenimente, reguli privind ciclul de viață și obiective de conversie.

Comercializare

Outreach, mesaje proactive, anunțuri, Promotion Studio, Studio de sondaj, campanii de împingere și tururi ghidate.

Analize

Raportează suprafeţele mai întâi

Pagini independente

Site-ul Intelligence, Echipa Performance și Feedback stau în afara grupurilor ca intrări directe.

Integrări

Conectori, acțiuni și declanșatoare, cutii poștale, schițe, setări de e-mail, obiective interne, prosoape web și taste API.

Securitate și confidențialitate

Prezentare generală de securitate, confidențialitate și conformitate, consimțământ cookie-uri, activitate de audit, autentificare eșuată, blocatIPsşiJavaScripterori.

Configurări

Subsecţiuni de bază ale spaţiului de lucru (general, echipă, site-uri, limbi), apoi subsecţiunile colapsabile: Al Brain (Instrucţiuni, configurare, evaluare, istorie), CRM Setup (constructor, câmpuri personalizate, scorul plumbului, sănătate), Data & Health (diagnostică, export) şi Noţiuni Demarare (la bordul navei, ajutor).

Paginile un rol nu poate fi deschis sunt ascunse de bara laterală. Pagini planul curent nu include șederea vizibilă cu o Actualizează tag și deschide un ecran de actualizare în aplicație.

Rutele directe sunt încă verificate pe server. Ascunderea unei legături lateral nu este limita de securitate: fiecare acțiune protejată trebuie să-și treacă permisiunea și verificările spațiului de lucru.

Analize

Hub de analiză

Hubul Analytics aduce suport, chat, AI, vizitatori și agent de raportare într-un spațiu de lucru cu date filtrate cu rezultate exportabile.

Ecran produs
Hub de analizăAnalytics Hub arată o gamă de date, carduri metrice și file pentru Suport, Chat, AI, Vizitator și Performanță agent.Hub de analizăspațiu de lucruBILETE184AI RESOLVE63%CSAT4.7VIE VIU AIRPACESprijinCreat, închis, în așteptare, SLATabDiscutăRezultatele AI/umane și timpul de manipulareTabAIÎncredere, feedback, utilizare jetoaneTabAgentVolum, viteză și satisfacțieTab1CHOOSE DATESPresetare sau personalizare2CHANGE TABSprijin acordat agentului3EXPORTDescărcare CSV
Analytics Hub arată o gamă de date, carduri metrice și file pentru Suport, Chat, AI, Vizitator și Performanță agent.

Filtre și comenzi

  • Folosește un preset sau un obicei de la/la gama, apoi Refresh pentru a reconstrui fiecare carte și grafic pentru aceeași perioadă.
  • Exportă CSV exportă mai degrabă punctul de vedere analitic activ decât o captură de ecran.
  • Scanarea spaţiului de lucru este automată; schimbarea siturilor schimbă setul de date principal.

Ce măsuri fiecare filă

  • Suport: bilete create/închise/pending, primul răspuns, rezoluție, prima rezoluție de contact, SLA și defalcare prioritară/departament/status.
  • Chat: sesiunile au început, rezoluții AI, escaladate, abandon, timp de manipulare, mesaje pe sesiune și AI/uman/toate CSAT.
  • AI: încredere medie, rata de încredere scăzută, acuratețe triaj, feedback-ul, deformarea cunoștințelor, utilizarea jetoanelor/cache-urilor și elementele care necesită revizuire.
  • Vizitator: tendințele traficului și ale implicării pentru perioada selectată.
  • Agent: măsuri de muncă per agent, viteză, închidere și satisfacție.

Utilizați Analytics Hub pentru recenzie cross-team; utilizați vizitatorii dedicați, biletele, CSAT, Istoria AI și Paginile de performanță ale echipei atunci când aveți nevoie de o anchetă la nivel record.

Analize

Tabloul de bord

Dashboard este centrul de comandă zilnic. Acesta arată trafic, vânzări, încărcare suport, activitate AI și indicatori de conversie într-o singură perspectivă. Deschideți-l în fiecare dimineață pentru a înțelege ce sa întâmplat peste noapte și ceea ce are nevoie de atenție astăzi.

Tablou de bord
Tablou de bord pentru prezentare generalăEcranul de prezentare generală condus de un OpsIQ Panou AI Intelligence (cu Daily short, alerte inteligente, prognoza), plăci widget KPI și un widdget de trafic de șapte zile, plus un control de configurare Reset.Prezentare generalăspațiu de lucruOPSIQ INTELEGENŢĂAlege o analiză și OpsIQ scrieScurtă zilnicăAlerte inteligentePreviziuniResetează aranjamentulVIZITATORI AZI2,481+12%VENITURI$8 2k+5%BILETE DESCHIDEŢI143 SLATraficul · ultimele 7 zile1AI-FIRSTOpsIQ Panoul de informații2WIDGETSPlaca KPI pe care o aranjezi3A VOASTRAResetează aranjamentul oricând
Ecranul real de prezentare generală: panoul OpsIQ Intelligence up top (alegeți o analiză și scrie) deasupra widget-urilor KPI pe care le aranjați.

Carduri de bord explicate

Vizitatori vii

Numărul de persoane de pe site-ul dvs. chiar acum. Acest lucru actualizează fiecare 15 secunde (configurabile). Un vizitator este "activ" în cazul în care au încărcat o pagină în cadrul pragului activ (default: 90 secunde).

Vizitatori unici

Câte persoane diferite au vizitat site-ul dumneavoastră în intervalul de date selectate. OpsIQ identifică vizitatorii printr-o combinație de amprente digitale, cookie-uri și (dacă sunt disponibile) identitate autentificată.

Nou vs revenire

Noi vizitatori sunt văzut site-ul dvs. pentru prima dată. Vizitatorii returnării au fost văzuţi înainte. Un raport de întoarcere mare înseamnă conţinutul dumneavoastră aduce oameni înapoi. O rată foarte scăzută de returnare ar putea însemna că nu sunt păstrarea interesului.

Rata de săritură

Procentul de vizitatori care au plecat după vizionarea doar o pagină. O rată de salt mai sus 70% pe paginile de aterizare înseamnă, de obicei, pagina nu este satisface așteptările vizitatorilor, conținut greșit, sarcină lentă, sau experiență slabă în mobil.

Timpul mediu de la pagina

Cât timp vizitatorii petrec pe fiecare pagină în medie. Timpii foarte scurt (în 10 secunde) pe pagini de conținut sugerează că conținutul nu este activ. De foarte multe ori pe paginile de checkout pot indica confuzie.

Amenințări blocate

IPadresa OpsIQ identificate ca potenţial rău intenţionat pe baza scorului ameninţării, a tentativelor de forţă brută sau a blocurilor manuale. IPs lista.

Vânzările de azi / în această săptămână / luna aceasta

Venituri din surse de vânzări conectate (Shopify, WooCommerce, Stripe, etc). În cazul în care vânzările arată zero, verificați dacă conectorul dvs. platformă este conectat și sincronizarea.

Graficul de tendinţă

Un grafic de linie care arată numărul vizitatorilor în intervalul de date selectate. Uită-te pentru modele: piroane de trafic (campanii, menţionări de presă), dips (weekends, vacanţe) şi tendinţe susţinute.

Surse de top

De unde vin vizitatorii: direct, Google, social media, campanii de e-mail, site-uri de trimitere. Utilizați acest lucru pentru a înțelege ce canale de marketing sunt de lucru.

Navigatoare de top

Chrome, Safari, Firefox, Edge şi altele. Dacă un browser are rata de salt neobişnuit de mare, s-ar putea să aveţi o CSS sau JavaScript Problema compatibilității.

Încălzirea pe oră

O grilă care arată activitatea vizitatorilor de oră în zi și zi a săptămânii. Utilizați acest lucru pentru a decide când să programeze schimburi de sprijin, atunci când pentru a trimite anunțurile, și când pentrua rula promoții.

Vizitatori recenti

Ultimii vizitatori cu țară, pagină, dispozitiv și sursă. Utilitar pentru rapid la fața locului-verificări în timpul campaniilor.

Utilizarea filtrului intervalului de date

Faceți clic pe data picker la dreapta de sus a Dashboard. Presets: Astăzi, Ieri, Ultima 7 zile, Ultima 30 zile, Luna trecută, luna trecută, Gama personalizată. Toate cardurile de bord și graficele actualizate atunci când modificați gama. Gama de date este în fusul orar configurat (setat în Setări).

Exemple de lucrări

Investigaţia cu privire la rata de creştere a ratei

Scenariu:
Rata ta de salt a sărit din 45% la 78% Ce s-a întâmplat?
Ce este de făcut:

Verificare: (1) S-a schimbat o anumită pagină de aterizare? Du-te la Top Pages și sortează după rata de salt. (2) A trimis o campanie trafic la pagina greșită? Verificați Sus Surse pentru noi arbitri. (3) Site-ul s-a spart pe mobil? Verificați defalcarea browser-ului pentru rata bounce mobile. (4) Este traficul de roboti? Verificați contorul Ameninţări și detalii vizitatori pentru modele suspecte.

Zero vizitatori pe bord

Scenariu:
Tabloul de bord arată 0 vizitatori live, chiar dacă site-ul dumneavoastră este obtinerea traficului.
Ce este de făcut:

Verificare: (1) Este widget-ul de urmărire instalat? Vizualizați codul sursă site-ul și căutați pentru OpsIQ script. (2) Este corect cheia site-ului? Comparați tasta de date din script cu cheia din Site-urile conectate. (3) Este un CDN sau cache servind o pagină veche fără script? Curățați cache-ul CDN. (4) Este un blocant de anunțuri sau antet CSP blocarea script-ului? Verificați consola browser pentru cereri blocate.

Citind harta de căldură pe oră

Scenariu:
Harta ta arată activitate intensă între orele 10 şi 2 în zilele săptămânii, dar nimic la sfârşit de săptămână.
Ce este de făcut:

Acesta este un model de trafic B2B. Vizitatorii sunt profesioniștii care lucrează navigare în timpul orelor de lucru. Implicații: (1) Personal de sprijin programat pentru orele lucrătoare din timpul săptămânii. (2) Trimite campanii de e-mail marţi-joi dimineaţa. (3Ferestrele de întreţinere din weekend sunt sigure. (4) Luați în considerare oferirea de chat live numai în timpul orelor de vârf.

Traficul de vârf din surse necunoscute

Scenariu:
Vezi un vârf brusc de 500 vizitatori într-o oră de la un arbitru necunoscut.
Ce este de făcut:

Du-te la Vizitatori și filtrează prin fereastra de timp. Verificați: (1) Sunt ei vizitatori reali sau boți? Uită-te la durata sesiunii, pagini vizualizate, și diversitatea browser-ului. (2) Dacă sunt reale, la ce pagină aterizează? (3) Verificaţi arbitrul URL Cineva ar fi putut avea legătură cu tine de la Reddit, Hacker News, sau un blog popular. (4) În cazul în care este vorba de traficul cu roboţi, verificaţi Ameninţările şi luaţi în considerare blocarea IP raza de acțiune.

De ce vizitatorii mei sunt diferiţi faţă de Google Analytics?+

OpsIQ Acesta utilizează amprentele digitale și cookie-urile browserului, în timp ce GA folosește un model de cookies diferit. Filtrarea Bot, ratele de blocare a anunțurilor și ordinea de încărcare a scripturilor pot provoca, de asemenea, diferențe. 10-20% Variaţia e normală.

Pot să înfig tabloul de bord într-un alt instrument?+

Tabloul de bord este proiectat pentru OpsIQ admin. Pentru raportarea externa, folositi REST API pentru a extrage date de analiză și să le afișați în propriul bord sau instrument BI.

Ce înseamnă "amenințare" contra?+

Contează. IP adresa OpsIQ a marcat sau blocat pe baza scorului amenințării, login-uri repetate eșuate sau blocuri manuale. Faceți clic pe contor pentru a vedea detalii și gestiona blocuri.

Analize

Jurnal vizitatori

Jurnalul Vizitatorilor arată fiecare vizită pe site-urile dvs. urmărite. Fiecare rând este o sarcină pagină de la un vizitator. Utilizați-l pentru a investiga comportamentul individual vizitatorilor, găsi traficul campanie, și diagnosticul probleme de urmărire.

Jurnal vizitatori
Jurnal vizitatoriO masă de vizitatori cu un filtru (data, căutare IP/email/oraș, sursă, dispozitiv) și coloane pentru IP/email, locație, sursă, dispozitiv și timp, cu un rând de amenințare marcat.Jurnal vizitatoriyoursite.com7 zileCaută IP, email, oraș...Sursa ▾Dispozitiv ▾IP / EmailLOCALIZARESURSADispozitivCÂND[email protected]Statele Unite ale Americii · New YorkgoogleBirou2m41.62.10.4Marea Britanie · LondradirectMobil6m[email protected]DE · Berlinutm: adsMobil14 m203.0.113.9NG · BucureştireferralBirouthreat1–25 din 3,402Sesiune →1FILTERData · căutare · sursă · dispozitiv2REAL COLUMNSIP/email · locație · dispozitiv · amenințare3DRILL INDeschide sesiunea completă
Adevăratul jurnal al vizitatorilor: filtru după dată, căutare și dispozitiv, apoi citiți fiecare vizită de IP/email, locație, sursă, dispozitiv și timp, amenințări marcate în roșu.

Ce arată fiecare rând

IP adresă

Vizitatorul IP Adresa.Anonimizat daca IP anonimizarea este activată în Setări. Faceţi clic pentru a vedea toate vizitele din acest IP.

Țara și orașul

Detectat de la IP adresa folosind datele GeoIP. Necesită MaxMind GeoLite2 baza de date sau Cloudflare headere geo. Arată "Necunoscut" dacă GeoIP nu este configurat.

Pagina URL

Pagina de vizitator încărcat. Click pentru a vedea complet URL- Lung. URLs sunt trunchiate în vederea mesei.

Sesar

De unde a venit vizitatorul înainte de aterizare pe site-ul dvs. "Director" înseamnă nici un referer (semne de carte, tastat URLs, unele linkuri de aplicație).

Dispozitiv și browser

Tipul dispozitivului vizitator (desktop, mobil, tabletă) și browser-ul (Chrome, Safari, Firefox etc.). Parsed din antetul User-Agent.

Data și ora

Când pagina a fost încărcată, în fusul orar configurat.

Identitatea clientului

Dacă vizitatorul este identificat (prin semn de identitate sau login), apare numele sau e-mailul acestora. În caz contrar, arată ca anonim.

Filtre

Gamă de date

Vizite de filtrare într-o anumită perioadă de timp. Implicit: ultima 7 zile.

Caută

Caută după IP adresa, pagina URL, referer, țară, sau e-mail client.

Sursă

Filtrare prin sursa de trafic: Direct, Organic, Social, Referendal, Plătit, Email.

Dispozitiv

Filtru de birou, mobil, sau tabletă.

Numai nou

Arată doar vizitatorii pentru prima dată care nu au mai fost văzuţi până acum.

Exemple de lucrări

Găsiți vizitatori dintr-o campanie specifică

Scenariu:
Ați lansat o campanie Google Ads cu parametru UTM utm_sursa=google&utm=mediu=cpc&utam_campaign=vara-vânzare. Cum găsiți vizitatorii?
Ce este de făcut:

În jurnalul vizitatorilor, utilizaţi câmpul de căutare şi tastaţi "vară-vânzare."URLs și pagina URLs, astfel încât parametrii UTM se vor potrivi. Puteți filtra de asemenea prin Sursa = Plătit pentru a restrânge în continuare.

Găsiţi un client care a raportat o problemă

Scenariu:
Un client a trimis un e-mail spunând "pagina de checkout a fost spart ieri în jurul valorii de 3pm." Cum vi se pare sesiunea lor?
Ce este de făcut:

Caută după adresa lor de e-mail în jurnalul vizitatorilor. Dacă acestea au fost autentificate, identitatea lor va apărea. Setați intervalul de date la ieri. Uitați pentru vizite pentru a verifica paginile din jur 3pm. Faceți clic pe sesiunea lor pentru a vedea fluxul paginii complete și orice JavaScript erori.

Detectează un hitter sau o racletă

Scenariu:
Ai observat un IP adresa 500+ vizite într-o oră, toate la aceeași pagină.
Ce este de făcut:

Acesta este, probabil, un bot, răzuitor, sau script rupt. Du-te la jurnal Vizitator și de căutare prin care IP Verificaţi: (1) Sunt toate vizitele la aceeaşi pagină? (2) Este agentul utilizator un robot cunoscut? (3) Durata sesiunii este întotdeauna 0 Dacă sunt confirmate ca un robot, du-te la Securitate şi blochează IP.

Jurnal vizitatori vs Sesiuni vs Feed live

Jurnal vizitatori

Încărcături de pagini brute. Un rând pe pagină. Cel mai bun pentru: investigarea paginilor specifice, găsirea traficului din surse specifice, diagnosticarea problemelor de urmărire.

Sesiuni

Grupurile de pagini vizualizează în călătorii. Un rând pe sesiunea de vizită. Cel mai bun pentru: înțelegerea fluxului utilizatorului, durata sesiunii de măsurare, identificarea căilor de conversie.

Hrană pentru animale vii

Activitatea în timp real. Arată vizitatorii în prezent pe site-ul dumneavoastră. Cel mai bun pentru: campanii de monitorizare în curs, spotting vizitatori cu intentii mari, uitam oportunitatile de sprijin.

De ce îmi văd vizitele în jurnal?+

OpsIQ pentru a exclude propriul trafic, adăugați IPadresa persoanei excluse IPs listă în Setări > Urmărire.

De ce un vizitator arată "necunoscut" țară?+

Căutarea GeoIP necesită fie Cloudflare antete geo (automate în cazul utilizării Cloudflare) sau un fișier MaxMind GeoLite2. Verificați Setări > GeoIP Path pentru a asigura existența fișierului de baze de date și este lizibil.

Cât timp sunt păstrate datele vizitatorilor?+

Datele vizitatorilor sunt păstrate pentru perioada de păstrare configurată în Setări (default: 90 zile). După aceea, înregistrările vechi sunt curățate automat de jobul de reținere a cron.

Analize

Sesiuni

Sesiunile grupează mai multe pagini vizualizări de la aceeași persoană într-o singură călătorie. În timp ce jurnalul vizitatorilor arată încărcăturile individuale, sesiunile vă arată cum oamenii se deplasează prin site-ul dvs. de la aterizare la ieșire.

Sesiuni
SesiuniTabelul jurnal sesiune cu IP, țară, dispozitiv, sursă, durată și coloane pagini, precum și un rând de amenințare marcat.Sesiuniyoursite.comȚara (NG)Jurnal sesiuneIP_ (S)ȚARADispozitivSURSADURATAPAGINI41.62.10.4Regatul UnitBirougoogle3m12s6102.89.6.2NGMobildirect1m05s388.21.4.9DEBirouutm: ads7 m 48s11203.0.113.9SUAMobilreferral0m 42s21SESSION LOGCălătorii grupate2COLUMNSȚara · dispozitiv · sursă · durată3THREATSesiuni riscante marcate
Adevăratul jurnal al sesiunii: fiecare călătorie a vizitatorilor ca rând (IP, țară, dispozitiv, sursă, durată și pagini) cu sesiuni riscante marcate în roșu.

Cum funcționează sesiunile

O sesiune începe atunci când un vizitator îşi încarcă prima pagină. Ea continuă pe măsură ce navighează la mai multe pagini. O şedinţă se termină atunci când vizitatorul este inactiv pentru perioada de pauză a sesiunii (default: 30 minute) sau închide browser-ul lor. Aceeaşi persoană se întoarce după timeout creează o nouă sesiune.

Ce arată fiecare sesiune

Prima pagină

Pagina de aterizare, unde vizitatorul a intrat pe site-ul dvs. Acest lucru vă spune ce conținut atrage oamenii.

Ultima pagină

Pagina de ieșire, unde a plecat vizitatorul. Dacă pagina de ieșire este adesea pagina de preț, vizitatorii ar putea fi compararea cu concurenții.

Număr de pagini

Câte pagini a văzut vizitatorul în această sesiune. Mai multe pagini înseamnă de obicei mai mult angajament, dar poate însemna, de asemenea, că vizitatorul este pierdut.

Durată

Timpul total de la prima pagină până la ultima activitate. Sesiunile cu 0 secunde sunt salturi (vedere pe o singură pagină, fără interacțiune).

Sursă

Sursa de trafic pentru această sesiune (Director, Google, social, sesizare etc.).

Țara

Țara detectată de la adresa IP.

Sari

Dacă vizitatorul a plecat după ce a văzut doar o pagină. Sesiunile cu buchete au un indicator roșu.

Conversie

Dacă vizitatorul a finalizat un eveniment de conversie urmărit (achiziție, înscriere, depunere formular) pe parcursul acestei sesiuni.

Filtre

Caută

Caută după IP, e-mail, pagina URL, sau referer în sesiuni.

Tip

Filtrare de noi vizitatori (prima sesiune vreodată) sau Returning vizitatori.

Sursă

Filtrare de sursa de trafic.

Țara

Filtrați pe țări pentru a vedea sesiuni dintr-o anumită regiune.

Amenințări/Amenințare

Filtru pentru a arăta doar sesiunile sarituri sau sesiuni marcate ca amenințări.

Exemple de lucrări

Profilul unui client de mare valoare

Scenariu:
Un client tocmai a făcut o achiziţie mare. Vrei să înţelegi călătoria lor înainte de cumpărare.
Ce este de făcut:

Caută e-mailul lor în sesiuni. Uită-te la toate sesiunile lor: (1) De câte ori au vizitat înainte de a cumpăra? (2) Ce pagini au văzut ei? (3Au folosit chat sau au deschis un bilet?4) Care a fost timpul total de la prima vizită pentru a cumpăra? Acest lucru vă spune călătoria tipic de cumpărare pentru clienții de înaltă valoare.

Detectează login dintr-o locație nouă

Scenariu:
Un client se loghează de obicei din Nigeria, dar vezi o sesiune din Rusia.
Ce este de făcut:

Cauta e-mailul clientului in Sesiuni. Compară țara de sesiuni recente. Dacă o sesiune apare brusc dintr-o țară neobișnuită, ar putea fi călătorie legitimă sau un cont compromis. Verificați: (1) A existat o încercare de autentificare eșuată înainte de cel de succes? (2) IP să-l afişeze pentru revizuire, dacă e suspect.

Care este diferenţa dintre o sesiune şi un vizitator?+

Un vizitator este o persoană (sau un browser). O sesiune este o vizită de la acea persoană. Acelaşi vizitator poate avea mai multe sesiuni în timp. Sesiunile expiră după perioada de timeout.

Cum identifică OpsIQ vizitatorii care se întorc?+

OpsIQ foloseşte o combinaţie de cookie-uri, amprente digitale ale browser-ului şi jetoane de identitate autentificate. Dacă un vizitator îşi curăţă cookies-urile şi nu este conectat, ele vor apărea ca noi vizitatori.

Analize

Hrană pentru animale vii

Live Feed arată vizitatorii în prezent pe site-ul dvs. în timp real. Actualizează automat fiecare 15 secunde (configurabile). Utilizați-l în timpul campaniilor, lansărilor de produs și perioade de sprijin ocupate pentru a vedea ce se întâmplă chiar acum.

Hrană pentru animale vii
Hrană pentru animale viiUn flux de activitate în timp real care arată un live online-vizitor conta și o sursă de acțiuni recente vizitatori pe țară.Hrană pentru animale viiyoursite.com37vizitatori online acumActivitatea în viuAcumUS · vizualizare /pricing2sUK · a început o discuție5sDE · adăugat în coș9sCA · Inscriere completă1RIGHT NOWVezi cine e la faţa locului.2AUTO-REFRESHActualizează fiecare 15s3ACTSari într-o discuţie live
Vezi cine este pe site-ul tău în această secundă și ceea ce fac ei, revigorant automat fiecare 15 secunde.

Cum funcţionează

Live Feed vă analizează serverul la intervalul de reîmprospătare configurat. Fiecare rând arată un vizitator în prezent pe site-ul dumneavoastră: pagina lor curentă, țară, dispozitiv, sursă, durata sesiunii și numărul paginilor. Punctele importante verzi indică o nouă activitate de la ultima împrospătarea. Faceți clic pe orice rândul vizitatorilor pentru a vedea detaliile întregii sesiuni.

Configurări

Intervalul de reîmprospătare

Cât de des actualizările live feed. Implicit: 15 secunde. valori mai mici (5-10s) oferă actualizări mai rapide, dar utilizează mai multe resurse de server. Valori mai mari (30-60s) sunt mai ușor pe server, dar mai puțin în timp real.

Prag activ

Cât timp un vizitator este considerat "activ" după ultima lor încărcare pagină. Implicit: 90 secunde. Dacă un vizitator încarcă o pagină și apoi citește pentru 2 minute fără clic, acestea dispar din feed live după prag.

Buton de pauză

Faceți clic pe Pause pentru a opri auto-refresh. Utilitar atunci când doriți să citiți detalii fără actualizarea listei. Faceți un clic pe Rezume pentru a reporni.

Exemple de lucrări

Spot un plumb fierbinte în timpul unei campanii

Scenariu:
Rulați o lansare de produs. Un vizitator doar vizualizat pagina ta, apoi caracteristici, apoi tarifare, și este acum pe pagina checkout.
Ce este de făcut:

Acesta este un comportament cu intenţie ridicată.1Click pe vizitator pentru a vedea sesiunea lor. (2) În cazul în care încep o discuție, AI va avea contextul lor de călătorie completă. (3) Dacă pleacă fără să cumpere, ei devin o pistă în pagina Leads. (4) Gândiți-vă să creați o regulă proactivă pentru a arăta un mesaj de chat atunci când vizitatorii ajung la checkout.

Prea mulți vizitatori din aceeași IP

Scenariu:
Vezi? 20 vizitatori din aceiaşi IP adresa, toate pe diferite pagini.
Ce este de făcut:

Acest lucru ar putea fi: (1) Un birou cu internet comun. Verificați dacă vizitele arată ca oamenii reali (diferite pagini, durate rezonabile de sesiune). (2Verificați dacă sesiunile sunt foarte scurte (0-1secunde) sau lovirea sistematică a paginilor. (3) Un test de sarcină. Dacă efectuați teste automate, excludeți IP de la urmărire.

De ce arată live feed 0 vizitatorii când site-ul meu are trafic?+

Verificare: (1) Este scriptul widget instalat pe site-ul dvs.? (2) Este corect cheia site-ului? (3) A trecut pragul activ?4) Sunt vizitatorii folosind blocanți agresive de publicitate care blochează scenariul de urmărire?

Pot filtra alimentarea live de țară sau dispozitiv?+

Pentru vizualizările filtrate, utilizați paginile de jurnal sau sesiuni ale vizitatorilor cu opțiunile lor de filtrare. Fluxul live este simplu în mod intenționat pentru monitorizarea în timp real.

Analize

Pagini de sus

Top Pages arată care pagini de pe site-ul dvs. obține cele mai multe trafic. Acesta se clasează paginile prin vizite, angajament, conversie și activitate suport. Utilizați-l pentru a identifica cel mai bun conținut, găsi pagini performante, și descoperi pagini care generează întrebări de sprijin.

Pagini de sus
Pagini de susO listă clasată a paginilor cele mai vizitate cu baruri de vizită orizontale şi contează.Pagini de susyoursite.comPagini vizitate cel mai mult/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKEDPagini vizitate cel mai mult2SIGNALSVizite și conversii3FINDPagini care conduc bilete
Paginile dumneavoastră sunt clasificate în funcție de trafic și angajament, astfel încât să puteți observa conținuturile de top și paginile care generează suport.

Ce arată fiecare pagină

Pagina URL

Calea completă URL sunt grupate pagini similare (de exemplu variante de produs) dacă gruparea este activată.

Vizualizări

Numărul total de ori această pagină a fost încărcat în intervalul de date selectate.

Vizitatori unici

Câte persoane diferite au văzut această pagină (o persoană care vizualizează aceeași pagină de două ori contează ca 1 unic).

Rata de săritură

Procentul de vizitatori care au părăsit site-ul dvs. după vizualizarea numai această pagină. Salt mare pe paginile de aterizare = problemă.

Timp mediu

Cât timp vizitatorii petrec pe această pagină în medie. Foarte scurt = nu lectură. Foart mult timp pe o pagină de formă = confuzie.

Începe discuţia.

Câte conversații de chat au fost începute de la această pagină. Discuție mare începe pe o pagină a produsului înseamnă că descrierea produsului ar putea fi neclară.

Bilete de sprijin

Câte bilete de sprijin au fost create de vizitatorii care au fost pe această pagină. Număr mare de bilete = potențial UX sau problemă de conținut.

Exemple de lucrări

Găsiți pagini care conduc întrebări de suport

Scenariu:
Echipa ta de suport tot primeşte întrebări despre transport.
Ce este de făcut:

Sortare pagini de top prin "Titluri de susţinere" sau "Chat pornește" descendent. Caută produse sau pagini de transport maritim cu număr mare. Pagina cu cele mai multe întrebări de suport are, probabil, informații neclare. Fixați conținutul paginii și monitorizați dacă întrebările de sprijin scad.

Găsiți pagini cu rată ridicată de ieșire

Scenariu:
Vrei să ştii unde pleacă oamenii de pe site-ul tău cel mai des.
Ce este de făcut:

Sortează în funcție de rata de respingere, descrescătoare. Ignoră paginile care sunt puncte naturale de ieșire (paginile de mulțumire, paginile de confirmare). Concentrează-te pe pagini care ar trebui să mențină vizitatorii implicați: paginile produselor, prețurile, caracteristicile. Acestea au nevoie de apeluri mai bune la acțiune sau conținut mai clar.

De ce arată o pagină 0 vizualizări chiar dacă știu că devine trafic?+

Verificare: (1) Este widget-ul de urmărire instalat pe acea pagină specifică? Aplicațiile de o singură pagină nu ar putea concedia vizualizările paginii privind modificările traseului. (2) Este pagina exclusă în setările de urmărire? (3) Este un CDN servind o versiune cache fără scenariul de urmărire?

Analize

Informaţii geo

Geo Intelligence arată de unde vizitatorii vin de la țară, oraș, dispozitiv și sursă. Utilizați-l pentru a înțelege piețele geografice, decide cu privire la sprijinul lingvistic, plan regional marketing, și detecta modele de trafic suspecte.

Geo
Informaţii geoO hartă a locaţiilor vizitatorilor lângă un rang de bar per ţară.Informaţii geoyoursite.comVizitatori după locațieSUARegatul UnitDECANG1MARKETSȚara, orașul, dispozitivul2PLANLimba și regiunile3WATCHTraficul la fața locului
De unde vin vizitatorii dumneavoastră (pe ţară, oraş şi dispozitiv) la pieţe de dimensiuni şi la faţa locului trafic neobişnuit.

Ce vezi

Graficul barourilor din țările de top

Ţările de top clasate după numărul vizitatorilor. Faceţi clic pe o ţară pentru a fora până la datele de nivel oraş.

Gogoaşă de ţară

Dezagregarea vizuală a traficului pe țări.

Tabel complet la țară

Fiecare țară cu vizitatori în perioada selectată, arată numărul de vizitatori, numărarea sesiunii, rata de salt și rata de conversie.

Orașul de foraj în jos

Faceţi clic pe o ţară pentru a vedea care oraşele din această ţară au cei mai mulţi vizitatori.

Cum funcționează detectarea GeoIP

OpsIQ detectează localizarea vizitatorilor în două moduri: (1) Cloudflare Dacă site-ul dvs. este în spatele Cloudflare, detectarea țării este automată și precisă. (2) MaxMind GeoLite2. Descărcați baza de date gratuită și configurați traseul în Setări. Detectarea la nivel local necesită baza de Date GeoLite2-City, nu doar baza de calcul a țării.

VPN și trafic proxy

Vizitatorii care folosesc VPN-uri vor apărea din locaţia serverului VP N, nu din locația lor reală. OpsIQ nu poate și nu ar trebui să încerce să ocolească VPN-uri. Dacă vedeți modele de țară neobișnuite, ia în considerare faptul că 10-20% a vizitatorilor pot utiliza VPN-uri.

Exemple de lucrări

Traficul de țară neașteptat

Scenariu:
Conduci o afacere numai în SUA, dar 30% traficul este din India.
Ce este de făcut:

Verificare: (1) Sunt aceşti vizitatori reali? Uitaţi-vă la durata sesiunii şi pagini vizualizate. Foarte scurte şedinţe cu salturi mari = probabil boţi. (2) Vă găsesc prin Google? Verificați arbitrul. (3) Ar putea fi ei potențiali clienți pe o piață nouă? Dacă traficul este autentic și angajat, ia în considerare adăugarea de prețuri sau conținut specific Indiei.

Decizia privind sprijinul lingvistic

Scenariu:
Vrei să ştii dacă ar trebui să traduci site-ul tău în spaniolă.
Ce este de făcut:

Uită-te la pagina Geo Intelligence. Dacă țările vorbitoare de spaniolă (Spania, Mexic, Columbia, Argentina, etc) reprezintă împreună mai mult decât 10% a traficului cu rate scăzute de salt, traducerea este în valoare de considerare. De asemenea, verificați: vizitatorii din aceste țări converti la prețuri similare pe piața primară?

Planificarea transferului de sprijin regional

Scenariu:
Trebuie să decizi orele de sprijin pentru diferite zone temporale.
Ce este de făcut:

Utilizați harta de căldură pe oră (pe Dashboard) combinată cu Geo Intelligence. Dacă 40% traficul este din Europa și 35% Din SUA, aveți nevoie de acoperire pentru ambele zone temporale. Hărțile arată exact atunci când fiecare regiune este cel mai activ.

Țara cu vizite, dar fără ordine

Scenariu:
Germania arată 500 vizitatori în această lună, dar nu vânzări.
Ce este de făcut:

Investigaţii diagnostice: (1) Sunt ele viguros pe pagina de preț? Poate că prețurile nu este competitiv pentru această piață. (2) Vă expediați în Germania? Verificați dacă pagina de expediere menționează Germania. (3) Este checkout-ul dvs. disponibil în EUR? Neconcordanța valutară cauzează abandonat controale. (4) Sunt aceşti vizitatori dintr-o singură sursă care ar putea fi un trafic cu intenţie redusă?

De ce un vizitator arată "necunoscut" țară?+

GeoIP nu este configurat.Cloudflare(care adaugă headere geo automat) sau descărcațiMaxMind GeoLite2baza de date și setați calea fișierului în Setări > GeoIP Path.

Pot bloca traficul din anumite ţări?+

OpsIQ nu se blochează în funcție de țară. Utilizați serverul web sau Cloudflare regulile firewall pentru blocarea la nivel de țară.OpsIQ se concentrează pe vizibilitate, nu pe controlul accesului la nivelul rețelei.

Analize

Pâlnie intenţionată

Funnel Intent clasifică sesiunile de vizitatori prin ceea ce par să încerce să facă: navigare, cercetare, compara, cumpăra, obține sprijin sau se lasă. Utilizați-l pentru a înțelege echilibrul de intenție pe site-ul dvs. și identifica unde vizitatorii picătură.

Pâlnie intenţionată
Pâlnie intenţionatăO pâlnie de la Browse la Research pentru a compara cu Cumpăra cu numere, plus suport și lăsând chips-uri.Pâlnie intenţionatăyoursite.comNavighează · 8,200Cercetare · 4,100Compară · 1,650Cumpără · 520Suport 6%Lăsând 11%1CLASSIFYCe doresc vizitatorii2STAGESRăsfoiește pentru a cumpăra3FIXGăseşte livrarea.
Sesiuni clasificate prin intentie (praf, cercetare, compara, cumpara) astfel încât să puteți vedea exact unde oamenii picătură.

Categorii de intenție

Navigare

Vizitatori care se uită în jurul valorii de. sesiuni scurte, câteva pagini, nici un scop specific detectat.

Cercetare

Vizitatori care citesc pagini de produs/feture, documente sau conținut blog. Mai mult timp pe pagina, pagini multiple de conținut.

Comparație

Vizitatorii vizionarea de prețuri, compararea planului, sau mesele. De multe ori revenind vizitatorilor.

Cumpărare

Vizitatori pe checkout, coș, sau pagini de înscriere. Intenție ridicată. Acestea sunt oportunitățile de conversie.

Căutarea de sprijin

Vizitatorii pe paginile de ajutor, pagini de contact sau pornirea discuţiei.

BouncingCity in New York USA

Vizitatori care au plecat după o pagină.

Cum să citeşti pâlnia

Interpretarea pâlniei

Scenariu:
1,000 vizitatorii au văzut preţuri. 270 Am deschis discuţia. 92 Am început verificarea. 64 Plătit. 18 a deschis bilete de sprijin.
Ce este de făcut:

Page tarifare este suficient de puternic pentru a crea intenția. Chat este important în calea de cumpărare: 27% de stabilire a prețurilor vizitatorilor se angajează cu chat înainte de cumpărare. Tichetele de sprijin după checkout pot indica activarea sau confuzia de plată. (1) Asigurați-vă că AI chat răspunde la întrebări tarifare bine. (2) Investigaţi 18 bilete de sprijin post-checkout pentru probleme comune.

Filtre de timp

Utilizați filtrul de interval de date pentru a compara modelele de intenție în perioade. De exemplu, compară Black Vineri săptămână cu o săptămână normală. Ar trebui să vedeți un vârf în "Cumpărare" intenția și, eventual, "Susport-seeking," dacă promoțiile create confuzie.

Cum OpsIQ Să clasific intenţia?+

OpsIQ Uită-te la pagină URLs, comportamentul sesiunii și tiparele timpului. Stabilirea prețurilor paginilor de intenție de comparație a semnalului. Pagini Checkout semnal cumparare intenție. Ajutor / contact pages semnal suport intenția. Clasificarea este euristic-based, nu AI-conduse.

Pot personaliza categoriile de intenţie?+

Nu în prezent. Categoriile sunt încorporate pe baza unor modele de comportament web comune. Clasificarea customizata a intentiei este pe foaia de parcurs.

Analize

Pâlnii, reţinere şi căi

Construiesc călătorii personalizate de la pagina sau pașii evenimentului, măsor reţinerea cohortei și descoperă traseele pe care vizitatorii le iau cel mai adesea printr-un site.

Ecran produs
PâlnieUn pâlnie personalizat afișează fiecare pas pagină/eveniment, restul vizitatorilor și procentul de conversie.Pâlniespațiu de lucruSTEPS4CONVERSION28.4%WINDOW72hVIE VIU AIRPACEPrețuri vizualizate1,420 vizitatori100%Plan selectat780 vizitatori54.9%A început verificarea530 vizitatori37.3%Ordinea s-a încheiat403 vizitatori28.4%1DEFINEAlege 2–8 trepte2MĂSURISetează fereastra de conversie3ÎMBUNĂTĂŢIREAGăseşte cea mai mare picătură
Un pâlnie personalizat afișează fiecare pas pagină/eveniment, restul vizitatorilor și procentul de conversie.

Pâlnie

Creați o pâlnie cu numele 2 la 8 Pașii de pagină sau eveniment. Setați fereastra de conversie în ore; un vizitator nu contează decât atunci când pașii comandați au loc în interiorul acelei ferestre. Utilizați picătura între pași pentru a alege unde să inspecteze reluarea, erorile, viteza paginii sau mesageria.

Reţinere

Grupuri de retinere vizitatori în cohorte săptămânale și arată cât de multe revenire. Alege un 6, 8 sau 12 să se mențină definiția cohortei stabilă atunci când se compară eliberările sau campaniile.

Căi

Căile enumeră cele mai frecvente secvenţe de pagini. Alegeţi o lungime a traseului 2 la 5 Pagini pentru a păstra lizibil rezultatul. Utilizați-l pentru a găsi ocoliri neașteptate, ieșiri comune și conținut care precede în mod repetat conversia.

Pâlniile personalizate sunt definiţii analitice, nu automatizări. Pentru a reacţiona la un pas completat, pentru a crea un scop de conversie, segment, trăgaci sau flux de lucru.

Analize

Repetare sesiune

Session Replay vă permite să urmăriți o cronologie a ceea ce un vizitator a făcut pe site-ul dvs.: care elemente au dat clic, cum au defilat, în cazul în care acestea pluteau, și ceea ce au tastat (cu câmpuri sensibile mascate). Utilizați-l pentru a diagnostica problemele UX, verifica rapoartele bug-ului, și înțelege confuzia clientului.

Repetare sesiune
Repetare sesiuneUn replay player care arată un viewport de pagină cu un cursor, un panou de informații sesiune și un epurator cronologie.Repetare sesiuneyoursite.comCumpăraţi acumSESIUNEDurata 3m 12s14 clicuriUS · BirouChrome1241WATCHClick-uri, defilări, taste2MASKEDCâmpuri sensibile ascunse3DIAGNOSEVerificați rapoartele de eroare
Refă exact ce a făcut un vizitator: clicuri, suluri, tastarea (câmpuri sensibile mascate), pe o epuratoare de cronologie.

Găsirea sesiunii corecte

Din pagina sesiunilor, căutați sesiuni cu probleme raportate, numere de pagină mare fără conversie sau sesiuni din partea clienților care au depus bilete de suport. Faceți clic pe pictograma reluare pentru a deschide vizualizarea cronologie.

Ce reluare arată

Calendar

Un bar orizontal care prezintă evenimente în timp. Faceţi clic oriunde pe cronologie pentru a sari la acel moment.

Navigare pagini

Fiecare sarcină de pagină apare ca un segment pe cronologie. Puteți vedea calea exactă a vizitatorului luat.

Click-uri

Evenimentele click sunt prezentate ca puncte pe cronologie și ca elemente de interes pe pagina reconstrucție.

Defilare

Adâncimea de pe defilare este urmărită astfel încât să puteți vedea cât de departe în jos citit vizitator.

Interacţiune formă

Se înregistrează focalizarea câmpului și scrierea evenimentelor. Intrarea textului în parolă și câmpurile sensibile este mascată implicit.

Confidenţialitate şi mascare

Session replay mastile campuri de forma sensibila in mod implicit. Câmpuri parole, intrări card de credit si câmpurile marcate cu date-opsiq Mask nu sunt niciodată înregistrate. Puteți configura reguli suplimentare de mascare în Setări > Urmărire. Dacă politica dumneavoastră de conformitate necesită, puteți dezactiva redarea în întregime.

Diagnosticarea unui checkout rupt

Scenariu:
Un client spune "Am încercat să cumpăr, dar butonul nu a făcut nimic."
Ce este de făcut:

Găsiți sesiunea lor în pagina sesiunilor (căutare prin e-mail). Deschideți reluarea. Urmăriți segmentul de pagină checkout. Uită-te pentru: (1) Au făcut clic pe butonul din dreapta?2) Did a JavaScript eroarea apare? (Verificați pagina de erori JS pentru acel moment.)3A reîncărcat pagina sau a arătat un mesaj de eroare? (4) A fost un câmp necesar gol? Repetarea arată exact ce sa întâmplat.

Cât de mult se păstrează sesiunea de reluare a utilizării?+

Reluaţi datele creşte cu volumul traficului. Utilizaţi setările de retenţie pentru a curăţa automat date vechi replay. Pentru site-uri de mare trafic, ia în considerare o perioadă mai scurtă de reţinere a reluării (de exemplu, 30 zile) pentru a gestiona stocarea.

Pot vizitatorii să nu mai joace?+

Dacă "Respectul nu urmări" este activat în Setări, vizitatorii cu antete DNT nu sunt înregistraţi. De asemenea, puteţi exclude anumite pagini din reluarea în setările de urmărire.

Analize

Jurnal evenimente

Jurnalul Evenimentelor arată fiecare eveniment care OpsIQ a inregistrat: vizualizari pagini, click-uri, starturi de chat, crearea de bilete, vanzari si evenimente personalizate. Foloseste-l pentru a depana integrarea, verifica livrarea webhook, și să înțeleagă secvența de acțiuni.

Jurnal evenimente
Jurnal evenimenteUn jurnal cronologic de evenimente cu insigne de tip color: pageview, chat, vânzare, webhook și personalizat.Jurnal evenimenteyoursite.compageviewUS ·/pricing12:04:01chat.startUK · widget deschis12:04:09vânzare$49.00 · Ordin #104212:05:22webhookCommentpayment.succeeded12:05:23customdemo_booked12:06:101EVERYTHINGFiecare eveniment înregistrat2DEBUGVerifica livrarea de webhook3ORDERVezi secvenţa exactă
O cronologie a tot ce OpsIQ înregistrări (pagini vizualizate, chat-uri, vânzări, webhooks, evenimente personalizate) pentru depanare și audit.

Evenimente de instalare (automate)

⚠️
Acestea sunt events-log nume bază ce OpsIQ înregistrări pe calendarul vizitatorilor pentru analiză, depanare și audit. Acestea sunt un vocabular diferit de afara webhook evenimente la care vă abonați un obiectiv final. Dacă construiți un receptor webhook, utilizați lista în secțiunea Webhooks sau apel webhooks.events.list; abonarea la un nume de la acest tabel nu va livra nimic.

Fiecare rând îţi arată numele. trimite și numele canonicOpsIQ magazine Ambele sunt înregistrate: numele brut pe care l-ai trimis, şi cel canonic pe care îl hărţuieşte, astfel încât un raport scris împotriva taxonomiei canonice continuă să funcţioneze oricare ar fi numele unui dispozitiv de urmărire folosit.

pageview page.viewed

O sarcină de pagină urmărită. Include URL, titlu, referer și timbru temporal. page_view şi view sunt acceptate ca același lucru.

chat_open support.chat_opened

Un vizitator deschide widget-ul de chat.

chat_send support.chat_message_sent

Un vizitator trimite un mesaj de chat. Partea de răspuns este stocată ca support.chat_message_received.

ticket_open support.ticket_created

Un bilet de sprijin este creat. ticket_create este acceptat ca același lucru; răspunsurile și închiderile sunt stocate ca support.ticket_replied şi support.ticket_closed.

form_submit form.submitted

Se prezintă un formular urmărit. submit este acceptat ca același lucru.

purchase commerce.purchase_completed

O achiziţie completă. purchase_success, și aliasurile de vânzare order.completed, sale.completed, payment.completed şi invoice.paid, sunt acceptate toate de la o platformă conectată.

Checkout commerce.checkout_started

Începe verificarea. cart_view, checkout_view, checkout_intent, checkout_abandon, add_to_cart.

login_success identity.signed_in

Un vizitator se semnează. login_failed, stocată ca identity.login_failed; un sistem de blocare este login_lockout_created.

Înscriere conversion.signup

Un vizitator completează o înscriere. lead, stocată ca conversion.lead.

js_error error.js

O eroare JavaScript este capturată pe o pagină urmărită.

💡
Un nume de eveniment pe care îl trimiteți că nu este unul dintre aceste pseudonime este încă înregistrat verbatim . Nimic nu este scăzut. Pur și simplu nu are cartografiere canonică, astfel încât nu va rula în rapoartele bazate pe taxonomie.

Evenimente personalizate

Puteți trimite evenimente personalizate de pe site-ul sau serverul dvs. la OpsIQ. Evenimentele personalizate sunt utile pentru urmărirea acțiunilor specifice afacerii dumneavoastră: clicuri butoane, utilizare caracteristici, piese video, descărcări etc.

JavaScript · eveniment personalizat din browser
// Send a custom event from the browser
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "plan_selected", {
  plan: "pro",
  billing: "annual",
  value: 99
}]);
PHP · înregistrează o activitate de contact pe serverul dumneavoastră
// 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);

Filtrarea evenimentelor

Tipul evenimentului

Filtrare după nume de evenimente specifice: pageview, chat. started, ticket. create etc.

Gamă de date

Arată evenimentele dintr-o anumită perioadă de timp.

Caută

Evenimentul de căutare după cuvinte cheie (URL, e-mail, valori de proprietate eveniment).

Cât timp sunt păstrate evenimentele?+

Evenimentele urmează politica de retenţie stabilită în Setări. Implicit: 90 zile. Evenimentele cu valoare mare (achiziţii, evenimente de securitate) pot fi configurate cu o retenție mai lungă.

Pot folosi evenimentele din experimentele A/B?+

Da. Când creați un experiment, alegeți un eveniment de conversie. Orice eveniment încorporat sau personalizat poate fi folosit ca scop de conversie .

Analize

Experimente A/B

Experimentele vă permit să testați două versiuni ale unei pagini sau caracteristici și să măsurați mai bine ce se realizează. OpsIQ urme impresii, conversii și semnificație statistică.

Experimente A/B
Experimente A/BDouă carduri de varianta compara rata de conversie, cu o insignă câștigător și semnificația pe varianta lider.Experimente A/Byoursite.comVarianta A4.2%Conversie · 1,020 vizualizăriVarianta BCÂȘTIGĂTOR6.8%Conversie · 1,005 vizualizări+62% lift · 96% semnificativ1ÎNCERCAREDouă variante cap-la-cap2MĂSURIConversii & semnificație3DECIDE:Declară un câștigător
Rulați două variante, conversii ceas și semnificație statistică, și declară câștigător.

Cum funcționează experimentele

1
Creează un experiment

Dă-i un nume, definește metric primar (eveniment de conversie), și setați variantele (control și încercare).

2
Rulează-l.

OpsIQ _Atribuie vizitatorilor la variante și urmărește comportamentul lor. Nu schimba experimentul în timp ce rulează.

3
Citiţi rezultatele

După ce sunt colectate suficiente date, verificați nivelul de încredere.95% increderea inseamna ca poti fi 95% Sigur diferenţa e reală, nu întâmplătoare.

Starea de experiment

Proiect

Creat, dar încă nu a început. Puteți edita în continuare variante și indicatori.

Rularea

Atribuirea activă vizitatorilor la variante. Nu edita în timp ce rulează.

Completat

Semnificaţia statistică atinsă sau a fost oprită manual. Rezultatele sunt finale.

Arhivat

Rezultatele au fost revizuite, iar experimentul nu mai este necesar în lista activă.

Cele mai bune practici

Defineşte metric înainte de lansare

Decide ce măsurați înainte de a începe. Alegerea unui indicator după ce vedeți rezultatele introduce prejudecată.

Exclude traficul intern

Adaugă echipa ta IP adresa la lista de excludere astfel încât vizitele personalului să nu se miște rezultatele.

Fugi destul de mult.

Nu opri un experiment după 100 vizitatori. Aveți nevoie de sute sau mii de vizitatori per variantă pentru rezultate fiabile.

Testează o schimbare la un moment dat

Dacă schimbi titlul şi culoarea butonului, nu vei şti ce schimbare a cauzat îmbunătăţirea.

Înregistrează-ţi decizia.

După ce experimentul se termină, notați care variantă a câștigat și de ce ați ales să-l implementați.

De câţi vizitatori am nevoie pentru un experiment valid?+

Aceasta depinde de rata de conversie inițială și dimensiunea efectului pe care doriți să-l detectați. Ca regulă a degetului mare: cel puțin 500 vizitatori per variantă pentru a 20% Pentru efecte mai mici, ai nevoie de mii.

Pot face mai multe experimente în acelaşi timp?+

Da, dar ai grijă. Dacă două experimente afectează aceeași pagină, rezultatele lor pot interacționa. Este mai sigur să se efectueze experimente pe diferite pagini sau caracteristici simultan.

Analize

JavaScript erori

JavaScript Erorile colectează erori de la vizitatorii site-ului dumneavoastră. Un buton spart, un eșec API Apel, sau o resursă lipsă apare aici. Utilizați-l pentru a găsi și repara bug-uri care afectează clienții reali.

Erori JS
JavaScript eroriO listă de erori captate în față cu puncte de severitate, fișier sursă, browser și numărul de apariții.JavaScript eroriyoursite.comErori recenteTipError: nu se poate citi x de nedefinitcheckout.js:42· Chrome×214404 încărcare /assets/app.cssPagina principală · Safari×88Neprinsă (în promisiune) NetworkErrorapi.js:17 Firefox×51Avertisment de deprecare: download eventvînzător. js · Edge×331CAPTUREErori de natură client-side2IMPACTNumără & browserele3FIXBug-uri de fructe
Vizitatori reali lovind suprafata de cod spart aici (mesaj, sursă, browser și cât de des) astfel încât să puteți repara ceea ce contează.

Ce arată fiecare eroare

Mesaj de eroare

Textul JavaScript de eroare (de exemplu, "TipError: Nu se pot citi proprietățile nedefinite").

Pagina URL

Pe care pagină a apărut eroarea.

Navigator și dispozitiv

Care browser și tip dispozitiv a văzut eroarea. Unele erori sunt specifice browder-ului.

Urme stiva

Locaţia codului unde a avut loc eroarea. Faceţi clic pentru a extinde întreaga urmă stiva.

Prima dată văzută.

Când a apărut prima dată această eroare.

Ultima dată văzută.

Când această eroare a avut loc cel mai recent.

Numără

De câte ori a fost înregistrată această eroare.

Sesiuni afectate

Câte sesiuni diferite de vizitatori au experimentat această eroare.

Erori de prioritizare

Nu toate JavaScript Erorile necesită atenţie imediată.1) erori pe pagini critice (checkout, inregistrare, login), (2) erori cu număr mare de sesiuni (3) erori care au apărut recent (posibilă regresie dintr-o modificare de cod), (4) erori pe propriul cod (nu scenarii terțe).

Fixarea unui buton de control rupt

Scenariu:
Pagina JS Errors arată "TipError: Nu se pot citi proprietățile nedefinite (citirea de depunere) " on /checkout, care afectează 45 Sesiuni în această săptămână.
Ce este de făcut:

Acest lucru înseamnă 45 clienții reali nu au putut finaliza checkout. Pași: (1) Deschideți pagina în aceeași combinație de browser/dispozitiv. (2) Deschide consola browser-ului și reproduce eroarea. (3) Verificați urmele stiva pentru a găsi linia exactă de cod. (4) Fixaţi bug-ul, implementaţi şi monitorizaţi numărul de eroare merge la zero.

Are OpsIQ surprinde erorile din scripturile terțe?+

Da. OpsIQ captează tot JavaScript erori de pe pagina, inclusiv erorile din script-uri de analiză, widget-uri chat, și scripturi de publicitate. Filtrare prin URL în urma stiva pentru a se concentra pe propriul cod.

Cum exclud erorile inofensive cunoscute?+

Nu puteţi suprima erorile specifice în OpsIQ, dar puteți filtra lista de pagini URL sau mesaj de eroare. Fixați sau ignorați erorile din extensiile browser-ului (acestea arată adesea ca erori din surse necunoscute).

Vânzări

Vânzări și transformări

Urmărirea vânzărilor conectează magazinul sau platforma de facturare la OpsIQ astfel încât să puteți vedea venituri alături de comportamentul vizitatorilor. Fiecare achiziție este atribuită unei călătorii vizitator, astfel încât știi ce pagini, campanii și canale conduce veniturile.

Vânzări
VânzăriEcranul de vânzări: un total de venituri cu un control al perioadei de timp, o căutare și un tabel recent de achiziții (data, client, platformă, suma, sursa).Vânzăriyoursite.comVENITURI$42,180+18%Tot timpul▾Caută e-mail, IP, ID de comandă...Achiziții recenteDATACOSTOMERPLATFORMĂSumaSURSAJun3[email protected]Shopify$49googleJun3[email protected]WooCommerce$129directJun2[email protected]Stripe$480anunțuri1VENITURIComenzi și reînnoiri2RECENT PURCHASESData · client · suma3ATTRIBUTEDLa sursa de trafic
Real Sales Screen, venituri de sus, apoi Recente Achiziții (data, client, platformă, sumă), fiecare atribuit sursei sale de trafic.

Tablou de bord pentru vânzări

Vânzările de azi

Veniturile din comenzile completate astăzi. Reîmprospătează cu fiecare eveniment nou de comandă de pe platforma conectată.

Săptămâna asta / luna aceasta / total

Venituri agregate pe parcursul perioadei. Rambursările se scad din aceste totaluri.

Graficul de tendinţă

Graficul de linie care arată veniturile zilnice pe intervalul de date selectate. Uita-te pentru piroane (propuneri, campanii) și dips (probleme, sezoniere).

Surse de conversie de top

Care surse de trafic duce la cele mai multe achiziții. Cumpărători "direcți" adesea marcate site-ul dvs.. Cumpărătorii "Google" te-a găsit prin căutare.

Achiziții recente

Cele mai recente comenzi cu e-mail client, suma, moneda, și articole achiziționate.

Achiziții neconfirmate (călătorie cu clienții)

Când tracker-ul vede un vizitator ajunge la o confirmare de cumpărare în browser, dar nici o platformă conectată a raportat că vânzarea încă, călătoria clientului arată un rând Achizition (neconfirmat) cu o insigna chihlimbar. Nu contează ca venituri. Atunci când platforma confirmă vânzarea, achiziția confirmată înlocuiește aceasta.

Reconciliere

Conectorii de vânzări nu depind de un singur webhook. Fiecare semnal de plată trimis de platformă poate deschide vânzarea, iar contractul Connector 2.3 recitește propria listă a vânzărilor completate ale platformei pe orare (default pe oră pentru fiecare spațiu de lucru) astfel încât platforma să nu poată fi livrată niciodată să piardă o vânzare. Operatorii pot să-l ruleze la cerere din linia de comandă cu instrumente/sales_reconcile. php.

Ghiduri de configurare a platformei

Shopify

Du-te la conectori >Shopify Creați o aplicație personalizată în Shopify admin (Setări > Aplicații și canale de vânzare > Dezvoltați aplicații). Loc de aplicare Grant: citiți_comenzi, citiți _clienți, citi_produse. Copiați adminul API token de acces. OpsIQ, introduceți domeniul magazinului (de exemplu, your-store.myshopify.com) și jetonul de acces. Faceți clic pe Test Connection. Dacă aveți succes, activați sincronizarea webhook pentru notificări în timp real ordine.

WooCommerce

Du-te la conectori >WooCommerce În tine. WordPress admin, du-te la WooCommerce> Configurări > Avansat > REST API. Creați o cheie cu permisiune de citire/scriere. Copiați cheia consumatorului și secretul consumatorilor. In OpsIQ, introduceți site-ul dumneavoastră URL, cheie de consum și secret pentru consumatori. Faceți clic pe Test Connection.

BigCommerce

Du-te la Conectori > BigCommerce. În admin dvs. Big Commerce, du-te pentru a Advanced Setări >API Conturi. Creați un V2/V3 API Contul cu domeniu de aplicare citit pentru comenzi, clienți și produse. Copiați jetonul de acces, ID-ul clientului, și API Intră în ea. OpsIQ şi testaţi.

Magento2

Du-te la Connectoare > Magento. În admin dvs. Magento, mergeți la System > Integrari. Creați o nouă integrare cu API acces resurse la Vânzări, Clienți și Catalog. Activați integrarea și copiați jetonul de acces. Introduceți-l în OpsIQ cu baza ta Magento URL.

PrestaShop

Du-te la Conectors > PrestaShop. În admin dvs. PrestaŞhop, du-te pentru a Advanced Parametrii > Webservice. Activaţi serviciul web şi de a crea o nouă cheie. Grant acces la comenzi, clienţi, şi produse. Copiază cheia şi introduceţi-l în OpsIQ cu magazinul dumneavoastră URL.

OpenCart

Du-te la conectori > Opencart. Generează API acreditări de la panoul de admin OpenCart. Introduceți API URL, nume de utilizator și cheie în OpsIQ Conectorul folosește OpenCart's REST API pentru ordine și date privind clienții.

osCommerce

Du-te la Conectori > osCommerce. Configurează accesul bazei de date sau API acreditările așa cum sunt documentate în setările conectorului. integrarea osCommerce necesită de obicei acces direct la baza de date sau un personalizat API modul.

Stripe

Du-te la conectori > StripeRecepţionat Stripe restricţionat API cheie de la Stripe Tablou de bord (Dezvoltare > API Cheile). Cheia are nevoie de acces citit la Clienți, Taxe, Facturi și Abonamente OpsIQ. Configurați obiectivul webhook pentru evenimente în timp real.

Personalizate / alte platforme

Utilizați REST API sau webhooks pentru a trimite evenimente de vânzări de pe orice platformă. Trimite comanda.finalizate evenimente cu e-mail client, sumă, valută, și elemente. Vezi Evenimente API secțiunea pentru formatul de încărcare utilă.

Înţelegerea pâlniei de vânzări

Surse de conversie de top

Shows which channels bring paying customers. If Google brings 1000 visitors and 50 sales, that is a 5% conversion rate. If email brings 200 visitors and 30 sales, that is 15%. Email is more effective per visitor.

Restituiri

Ordinele refinanţate sunt urmărite separat. Ele reduc totalul veniturilor nete. Dacă ratele de restituire sunt ridicate dintr-o sursă specifică, traficul ar putea fi de calitate scăzută.

Gestionarea monedei

OpsIQ stochează moneda și suma tranzacției originale. Întreprinderile multimonede văd veniturile în fiecare monedă. Raportarea normală utilizează cursul de schimb configurat.

Exemple de lucrări

100 vizitatori, zero vânzări

Scenariu:
Pagina ta de preţuri devine 100 vizitatori pe zi, dar zero conversii.
Ce este de făcut:

Investigaţii diagnostice: (1) Utilizați Sesiunea Redarea pe pagina de preț vizitatori. Uitați-vă cum interacționează cu tabelul de tarifare. (2) Verificați Pagini de top pentru rata de preț pagina bounce și timp-la-page. (3) Verificaţi conversaţiile de la vizitatorii paginii de preţ. Ce întrebări pun? (4) Comparați pagina de preț cu concurenții. (5) Încercați un experiment A/B cu diferite modele de stabilire a prețurilor.

Atribuire pentru o campanie de marketing

Scenariu:
Ați trimis o campanie de e-mail cu etichete UTM. Cum măsurați impactul veniturilor sale?
Ce este de făcut:

Du-te la Vânzări și filtru după sursă. Caută parametrul UTM campanie. Veți vedea: (1) Câţi vizitatori au venit din email. (2) Câte persoane s-au convertit în vânzări. (3) Venituri totale atribuite campaniei. (4) Comparați cu aceeași perioadă înainte de campanie.

De ce nu Sales arată zero, chiar dacă magazinul meu are ordine?+

Verificare: (1) Conectorul platformei este conectat și sănătos? Mergeți la Conectori și verificați starea. (2) Este activată sincronizarea webhook? Dacă se utilizează sondaje, funcţionează slujba de cron? (3) Are conectorul dreptul API Pentru lunete? Shopify, aveți nevoie de citire_ordine.

Cum poate OpsIQ atribui o vânzare unui vizitator?+

Când o comandă vine prin conector, OpsIQ se potrivește cu e-mailul clientului unui vizitator cunoscut. Dacă vizitatorul a fost urmărit înainte de cumpărare, vânzarea este atribuită călătoriei lor vizitatorilor, inclusiv sursei de trafic, pagina de aterizare și istoricul sesiunii.

Pot adăuga manual vânzările?+

Puteți trimite evenimente de vânzări prin intermediul REST API sau webhooks din orice sistem. Formatul evenimentului este documentat în Evenimente API Sectiunea.

Comerț

Construiți, lansați și să opereze Storefront nativ

Magazinul Storefront este OpsIQ_

Începeți în marketing → Magazin

1
Alege spațiul de lucru

Confirmaţi site-ul pe care îl configuraţi. Produsele, setările, paginile, comenzile şi analizele sunt izolate în acel spaţiu de lucru.

2
Activează comerțul electronic și magazinul

Setări generale → Ecommerce este autoritatea-mamă. Editura, crearea și plata de comenzi în magazin rămân separate astfel încât să puteți vizualiza un catalog în condiții de siguranță.

3
Publică produse complete

Setați tipul de produs, prețul, moneda, inventarul, variantele/opțiunile, media și îndeplinirea. Previzuați produsele și opțiunile de verificare înainte de publicare.

4
Configurează plata și îndeplinirea

Conectați o poartă de acces sau adăugați transfer bancar, numerar sau contra plată. Bunurile fizice au nevoie de zone de livrare sau colectare; bunurile digitale necesită fișiere sau coduri protejate.

5
Rulează ready-information de lansare

Fixaţi fiecare blocant şi revizuiţi fiecare avertisment, apoi completaţi un ordin de nisip din Magazinul Public.

Starter Despre și conținutul politic

Magazinele noi și modernizate primesc text de pornire editabil pentru Despre noi, Termeni și condiții, Confidențialitate, și Rambursări și returnări Când aceste câmpuri sunt goale, copia comercială existentă nu este niciodată suprascrisă.

  • Înlocuieşte fiecare [Add …] prompt şi PARTEA A Notă înainte de lansare.
  • Folosiți numele legal real, ruta de contact, promisiunile de îndeplinire, regulile de returnare, practicile de date, perioadele de păstrare și piețele servite.
  • Obține consiliere adecvată pentru produsele și țările pe care le serviți. Starter este orientare operațională, nu consultanță juridică.

Proiectare, pagini și promoții

Tema și designul paginii

Alege o temă de culoare curatată și compoziție, apoi tuning tipografie, umple / gradients, forme, lățime, mișcare, hover și comportament lumina/întuneric. Previzualizează desktop-ul și telefonul înainte de salvare.

Despre, Contact, Showcase/Lookbook și Cont

Construi fiecare pagină din blocuri reordonabile. Fiecare bloc are variante de design premium. Păstrați blocurile de luare a cererilor, cum ar fi statisticile, echipa, premii sau citate off până când conținutul lor este adevărat.

Pagini personalizate

Set titlu, melc, erou, SEO și blocuri comandate; previzualizare în timp ce proiecta, apoi publica. Rutele de magazin rezervate, cum ar fi coșul, Checkout, cont și politici nu pot fi reutilizate.

Popup-uri promotionale si panouri laterale

Creați o pagină modală cu cel puțin un bloc. Alegeți design premium, plasarea centru/stânga/dreapta/jos, încărcare/întârziere/ieșire/clic pe declanșator, fundal, mișcare, lățime, cupon și comportament o dată-per-vizitor. Testați aproape, tastatură și dispunerea telefonului.

Meniuri și subsol

Link către pagini, produse, colecții, politici, acțiuni de cont/help/cart, modale live sau externe sigure URLs. Posturi antete suport o scădere /mega-meniu nivel.

Client Chat și ordine sociale

Activați Client Chat de vânzare, apoi alege unde clienții pot cumpăra. Asistentul caută catalogul și solicită serverului un citat obligatoriu; serverul nu modelul ți-a creat cardul semnat de comandă. Confirmarea se întâmplă doar prin intermediul că carte pe web sau interacțiunea verificată pe canalul social.

WhatsApp, Messenger,Instagram, Telegram, LINE, SMS și X utilizați contul canal verificat de furnizor ca identitatea canalului. Emailul este încă colectat pentru chitanțe. Comandarea Conector păstrează contractul universal semnat și total comerciant-autorizație; configurarea magazinului nu modifică acel contract.

Analiza de informații stoc

Revizuiți vizitatori unici, vizualizări ale produselor, adăugari de coșuri, checkout starts/abandons/complemente, conversie, comenzi confirmate, venituri pe monedă, achiziții, dispozitive, țări/orăși, produse de top, recuperare și avertismente de calitate a datelor. Conversia folosește etichetate explicit evenimente publice-Store; totalul valutelor nu sunt niciodată combinate în tăcere. O liniuță înseamnă că gama selectată nu poate răspunde la întrebarea conversiei nu este zero la sută.

GeneralitățiOpsIQ API

Utilizați o cheie de purtător cu commerce.read; analytics.read De asemenea, acordă instantaneu analiza. Spațiul de lucru legat cheie este obligatoriu.

Citeşte în magazin
{ "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 } }

Magazinul obține retururi de configurare în condiții de siguranță publică, URL, meniuri și starea de pornire-review. Catalogul din magazin returnează fiecare temă, proiectare pagină, tip bloc, compoziție bloc și proiectare premium coajă promoție astfel încât constructorii la distanță nu codează niciodată opțiunile. Lista paginilor returnează paginile personalizate și modurile premium. Analizele returnează agregatele fără identitatea clienților. Readiness întoarce controale de lansare a acțiunii. OpenAPI și Postman folosesc aceleași contracte.

Prelansare finală

  1. Desktop si telefon: casa, cautare, produs/variant, cos, validare checkout, cont, urmarire, descarcari, Despre, Contact, politici, Lookbook, pagini, meniuri și fiecare promovare live.
  2. Completați o plată cu cutie de nisip și verifica starea comenzii, primirea, stocul și îndeplinirea.
  3. Plasați o comandă de chat Client și un ordin furnizor-sandbox pe fiecare canal social activat.
  4. Confirmă că aceste evenimente apar sub suprafaţa corectă şi moneda în Magazinul de Informaţii.
⚠️
Textul de politică Starter face un magazin ne-gol, dar nu face copia legală revizuite. Lansarea Readiness păstrează avertisment până când fiecare prompt este înlocuit.
Vânzări

Plumburi

Lead-uri sunt vizitatori sau clienți care arată intenția de cumpărare sau sprijin.OpsIQdetectează automat piste bazate pe comportament: vizite de preț pagină, vizite la domiciliu, interacțiuni de chat, checkout începe, și angajament ridicat. Utilizați pagina Leads pentru a prioritiza follow-up și hrăni dvs.CRM Conductă.

Plumburi
PlumburiEcranul de plumb: o masă care poate fi căutată cu IP/email, locație, dispozitiv, sursă și timp-la-site coloane, și sursa de top și țară.Plumburiyoursite.comCaută IP Oraşul, ţara...Sursa de top: Google · Top country: USIP / EmailLOCALIZAREDispozitivSURSATIMP41.62.10.4Marea Britanie · LondraMobilgoogle4m 12s[email protected]Statele Unite ale Americii · New YorkBiroudirect7 m 02s[email protected]DE · BerlinMobilutm: ads5m 40s203.0.113.9CA · TorontoBirougoogle3m28s1DETECTEDVizitatori cu intenţii mari2TOPSurse-pilot și țări3ENRICHEDIP, locaţie, dispozitiv, timp
Ecranul Lidere reale, vizitatori de mare intenție ca o masă cautabilă (IP/email, locație, dispozitiv, sursă, timp pe site) cu surse de top și țări.

Ce face o pistă

Vizite la pagina de prețuri

Vizitatorii care vizualizează pagina de preț sau planuri sunt în curs de desfășurare în considerare o achiziție.

Vizitele de întoarcere

Vizitatorii care vin înapoi de mai multe ori sunt angajate, dar nu încă convertite.

Interacţiuni de discuţii

Vizitatorii care încep o discuţie caută în mod activ ajutor, fie înainte de cumpărare sau după achiziţionare.

Începe verificarea

Vizitatorii care ajung la pagina de checkout, dar nu completeaza achizitia.

Formulare de prezentare

Vizitatori care prezintă un formular de contact, cerere demo sau formular de înscriere.

Logodna pe o pagină înaltă

Vizitatorii care vizualizează multe pagini cu durata lungă a sesiunii sunt profund cercetatori.

Panou de detaliu pentru plumb

Faceți clic pe orice plumb pentru a vedea profilul lor complet:

Identitate

Nume, e-mail, companie dacă se ştie IP şi locaţia.

Sesiuni

Toate sesiunile din acest plumb cu flux de pagină, durata, și sursa.

Pagini vizualizate

Fiecare pagină pe care au vizitat-o, comandată de o recidivă.

Sursă

Cum te-au găsit: organic, plătit, social, trimitere directă.

Scor de plumb

A0-100 punctaj bazat pe intensitatea comportamentului, recreere, și intenția pagină.

Situația CRM

Dacă această pistă a fost adăugată la CRM ca contact sau afacere.

Vânzare tip

Sugestia generată de AI privind ce trebuie să facă în continuare (de exemplu, "Vizited price 3 times · ia în considerare o implicare proactivă").

Insignă de plumb cu valoare mare

Plumbul cu un scor mai sus 80 obține o insignă "High Value." Acestea sunt perspectivele cele mai fierbinți. Prioritizează-le pentru sensibilizare, chat proactiv, sau intrarea conducte CRM.

Exemple de lucrări

Lucrez la o pistă fierbinte.

Scenariu:
Un lider vizualizat pagina ta de preț 3 ori în 2 zile, a început o discuție întrebând despre planurile de afaceri, dar nu a achiziționat.
Ce este de făcut:

Aceasta este o pistă de mare intenţie.1) Verificați detaliile lor de plumb pentru informații despre companie și rol. (2) Revizuirea transcrierii de chat pentru nevoi specifice și obiecții. (3) Crearea unui acord în CRM cu informațiile colectate. (4) Atribuiți o sarcină de monitorizare pentru un membru al echipei de vânzări. (5) În cazul în care se întorc la pagina de tarifare, regula proactivă a chat-ului poate declanșa un mesaj personalizat.

Conversia anonimă duce la contacte CRM

Scenariu:
Aveți 50 piste anonime cu scoruri mari, dar fără adrese de e-mail.
Ce este de făcut:

Opțiuni: (1) Creați o regulă proactivă care oferă o reducere sau descărcare de resurse în schimbul e-mailului pe pagini cu conținut ridicat. (2) Utilizați widget-ul de chat pentru a cere e-mail atunci când vizitatori anonimi începe o conversație. (3) Adăugați un semn de identitate la paginile de autentificare/înscriere, astfel încât vizitatorii care se întorc să fie identificați automat.

Cum se calculează scorul de plumb?+

Scorul este considerat: recitarea vizitelor (recent = mai mare), frecvența vizitelor, paginile vizualizate (preturi/checkout = superior), durata sesiunii (mai mult = mai ridicat), interacțiunile de chat (angajate = mai mari) și vizitele de întoarcere (sesiuni multiple = mai ridicate).

Pot personaliza regulile de notare?+

Da. În CRM Configurare, puteți adăuga reguli de scorul de lead-scoring care să stimuleze scorul bazat pe cuvinte cheie specifice, evenimente, surse sau modele pagini.

CRM

CRM · începe aici

OpsIQnave un AI-primul complet CRM care surprinde adevărul clientului, curăță date, scoruri conduce, antrenori se ocupă, previziuni venituri, și acționează, cu site-ul de informații, sprijin, bilete, produse și plăți ca un grafic live. Fiecare acțiune AI este sursa, explicabil, reversibil și controlat de aprobare.

CRM AI
CRM AIUn Trust Dial setat pe copilot lângă patru carduri de agent AI: Steward, Prospector, Retention and Analyst.CRM AIspațiu de lucruIncrederea in formatareManualCopilotPilot automatCât de mult face AI pe cont propriuDSSteward.Dedupe, bogat,validează dateleDSTProspectorCaută & scorafaceri noiRTReţinereRata de churn,conduce reînnoiriANAnalistPrognoză &explică numerele1AI-FIRSTPatru agenți specializați2YOU DECIDEÎncredere în autonomie3TRUSTEDSursat & reversibil
Un CRM AI-primul condus de patru agenți specializați, și un Trust Dial care decide cât de mult fac pe cont propriu.

Prezentare generală a paginilor CRM

AI CRM (Centrul de comandă)

Începe de aici.

Ecranul de acasă zilnic: pulsul veniturilor, ce AI a găsit, ceea ce a făcut, coada de aprobare, următoarele mișcări, sănătatea agenților și ROI.

Contacte

Nucleu

Oameni și companii în CRM. Caută, filtrează, înscrie și gestionează profilurile.

Conductă

Nucleu

Tablou de afacere vizual cu etape drag-and-picătură, probabilitatea câștiga, și AI coaching.

Prognoza și rapoartele

Nucleu

Prognoză de nivel de consiliu: angajat, probabil, cel mai bun caz, cu intervale de încredere și urmărirea preciziei.

Ciclul de viață

Nucleu

În cazul în care fiecare client stă: activ, la risc, expansiune gata, reînnoire datorată sau churning.

Construieşte-mi CRM

Configurare

Descrie-ţi CRM Setare în limba engleză.OpsIQgenerează un plan reversibil și îl aplică la aprobare.

CRM Sănătate

Ops

Pagina auto-verifica: schema, agenți, rute, acțiuni AI și date live contează.

Cum? OpsIQ Te ţine în siguranţă.

Cereți înainte de a acționa

Propunerile AI merg la coada de aprobare. Aprobi, editezi sau respingi fiecare dintre ele. Nimic nu se întâmplă fără a spune dumneavoastră.

Niciodată să nu suprascrieți

Când AI sugerează o schimbare, aceasta arată valoarea actuală și valoarea propusă. Datele introduse de om au protecție de proveniență.

Totul este reversibil.

Fiecare acțiune AI este înregistrată în jurnal. Puteți anula orice schimbare cu un singur clic.

Explicabil

Fiecare recomandare AI arată raţionamentul şi sursele de date pe care le-a folosit.

- Nou-nouţ?

1
CRM AI deschis

Click pe AI CRM în navigaţia din stânga. Centrul de Comandă vă arată starea curentă.

2
Verificați CRM Health

Open CRM Health pentru a verifica schema, agenții și rutele sunt gata.

3
Importă contacte

Dacă un conector este activ (Shopify, WHMCS, etc), contactele sunt importate automat. Altfel, import prin intermediul CSV sau creați manual.

4
Creează o conductă

Du-te la Conductă și de a crea prima conductă cu etape (de exemplu, plumb, calificare, propunere, negociere, Won, pierdut).

5
Adaugă prima ta afacere

Creați o afacere de la un contact, setați suma și etapa, și lăsați Deal Coach vă ghideze.

Trebuie să folosesc CRM?+

Nu.CRM este opţională.OpsIQfunctioneaza perfect ca o urmarire + suport + platforma AI fara CRM. Activați-l atunci când sunteți gata pentru a gestiona vânzările și relațiile cu clienții.

Poate CRM lucra fără conectori?+

Da. Puteți crea contacte și oferte manual. Conectorii îmbogățesc CRM cu date de platformă (ordine, abonamente, bilete), dar nu sunt necesare.

Ce este Stratul de încredere?+

Sistemul Trust Layer este sistemul de siguranţă care controlează ce poate face AI. Modul copilot (default): AI propune, aprobarea umană. Modul pilot automat (opt-in): AI acţionează automat asupra operaţiunilor cu risc scăzut şi reversibile.

CRM

Ecranul de pornire AI CRM

Centrul de Comandă este şedinţa zilnică. Deschide-o în fiecare dimineaţă pentru a vedea ce s-a întâmplat, ce trebuie să fie atent şi ce facem în continuare.

Centrul de comandă
Centrul de comandă CRMCRM acasă cu prognoza/Win-rate / Pipeline comutatoare, un KPI previzionat ponderate, și o coadă de propunere AI cu Aprobare și Respingere pe fiecare rând.Centrul de comandă CRMspațiu de lucruPreviziuniRata de câştigConductăForest · This Q74k dolari87%Propuneri AI · aprobă coadaCreează afacere · Acme $24kde la o discuţie cu cumpărătorulAprobareLiber.Mută Nimbus → Propunererăspuns pozitiv detectatAprobareLiber.Sarcina de jurnal · urmărirea Vârfuluinicio activitate în 7 zileAprobareLiber.1TOGGLEPreviziuni · Rata câştigurilor · Conducte2AI PROPOSESTranzacţii, etape, sarcini3YOU DECIDEAprobă sau respinge
Adevăratul Centru de Comandă: comutaţi între Prognoza, rata câştigului şi Conducte, şi lucraţi la coada propunerii AI, aproba sau respingeţi înţelegerile, mutări în scenă şi sarcini pe care le sugerează.

Ce arată Centrul de Comandă

Numerele de azi

Valoarea conductei, oferte câștigate/pierdute, noi piste, oferte active și tendința veniturilor, o imagine a stării actuale.

Ce? OpsIQ găsită

Intuiții de interes comun: oferte blocate, conturi cu risc ridicat, noi oportunități, aspecte legate de calitatea datelor și semnale de piață.

Ce? OpsIQ Da.

Acțiuni AI a luat (în pilot automat) sau propus (în copilot): progrese de etapă, actualizări ale scorului, îmbogățirea contactului și crearea de sarcini.

Are nevoie de aprobare

Coadă de propuneri AI care așteaptă decizia dvs. Fiecare afișează acțiunea propusă, raționamentul și dovezile. Aprobate, editați sau respingeți.

Următoarele mişcări

Lista clasată AI a 10 -lor mai importante lucruri de făcut astăzi: urmărirea unei afaceri fierbinți, verificarea unui cont la risc, cercetarea unui nou plumb etc.

Starea ajutorului

Sănătatea agenților AI: Capture, Data Steward, Deal Intelligence, Deach, DST, Retenție. Verde = funcționare, chihlimbar = are nevoie de atenție, roșu = eroare.

Rezultate

Urmărire ROI: oferte influențate de AI, timp salvat, acuratețea predicțiilor și comparație cu munca manuală CRM.

Fluxul de lucru al instructiunilor de dimineata

1
Citiţi numerele de azi

Verificați starea de sănătate și trendul veniturilor conductei. Sunteți pe drumul cel bun în această lună?

2
Curățați coada de omologare

Revizuiţi fiecare propunere AI. Aprobaţi acţiunile sigure, editaţi acolo unde este necesar, respingeţi sugestiile greşite.

3
Uită-te ce OpsIQ găsită

Citiţi informaţii AI. Există oferte în pericol? Există noi oportunităţi?

4
Lucrează la următoarea listă de mutări

Începe cu prioritatea de top. AI le-a clasat în regim de urgență și impact potențial.

Prinderea după timp liber

Scenariu:
Ai fost plecat o săptămână.
Ce este de făcut:

Deschide centrul de comandă și verifică: (1) "Ce OpsIQ a făcut" arată toate acțiunile AI în timpul absenței dumneavoastră. (2) "Trebuie să se aprobe" arată propuneri care așteaptă revizuirea dumneavoastră. (3) "Ce OpsIQ găsit" scoate în evidenţă elemente urgente. (4) Setează intervalul de date din tabloul de bord pentru perioada de absență pentru a vedea tendința.

CRM

Contacte, companii și acorduri

CRM organizează relaţiile de afaceri în patru obiecte: Contacte (oameni), Companii (organizaţii), Oferte (oportunităţi de răzbunare) şi Sarcini (acţiuni ulterioare).

Obiecte CRM
Obiecte CRMUn record de contact legat de obiecte Companie, Deal și Task într-un grafic conectat.Obiecte CRMspațiu de lucruContactpersoana · email · telefonSocietateaaccountsS-a făcut.oportunităţi de venituriSarcinaMăsuri de urmărire1OBJECTSContacte, companii, oferte2LINKEDUn grafic conectat3TASKSAcțiuni ulterioare anexate
Patru obiecte de bază (contacte, companii, oferte și sarcini) legate într-un grafic al clienților conectat.

Contacte

Ce este un contact

O persoană din CRM. Ar putea fi un client, o perspectivă, un partener, sau un fir. Contactele au un e-mail, nume, companie, etichete, stadiul de viață și scorul de hotness.

Găsirea contactelor

Utilizați bara de căutare pentru a găsi după nume, e-mail, companie, sau tag-uri. Utilizați filtre: stadiul ciclului de viață, scorul plumbului, sursă, țară, ultima dată de activitate, proprietarul atribuit.

Profilul de contact

Faceţi clic pe un contact pentru a vedea profilul lor complet: informaţii personale, companie, oferte, activităţi, bilete, chat-uri, vizite de website, scorul principal, şi AI perspective.

Punctaj de căldură

A0-100 scorul calculat din semnalele de comportament: vizite pe site-uri, email logodna, interacţiuni pe chat, istorie achiziţionare şi recreere. Mai mare = mai fierbinte.

Societăţi

... mai multe bilete...
Legătura între compania de contact

Contactele sunt legate de companii prin e-mail sau misiune manuală. O companie poate avea multe contacte.

Oferte

Ce este o afacere

O oportunitate de venituri. Ofertele au un titlu, suma, conducta, etapa, probabilitatea castigarii, data inchiderii, proprietar atribuit si contacte/companii asociate.

Probabilitatea de câștig

O șansă procentuală de a câștiga afacere. Setați manual sau calculat de AI pe baza datelor dvs. câștig istoric. Drive-uri prognoza ponderată.

Afacerea cu sănătatea

Verde (sănătos), chihlimbar (la risc) sau roșu (instalat). Pe baza de recreere a activității, durata etapei și semnale de angajament.

Sarcini

Ce este o sarcină

O acţiune de urmărire atribuită unei persoane. Sarcinile au un titlu, data scadentă, prioritate, tip (call, e-mail, întâlnire, altele) şi contact/deal legat.

Sarcini generate de AI

AI creează automat sarcini atunci când detectează ceva necesită atenție: urmărirea unei oferte blocate, răspunsul la un cont de risc, cercetarea unui nou plumb.

Găsirea de piste fierbinți

Scenariu:
Doriți să vedeți toate contactele de mare interes din Marea Britanie care nu au fost contactate recent.
Ce este de făcut:

Du-te la Contacte. Filtrare după: scorul de plumb > 80, Ţara = Regatul Unit, Ultima activitate > 7 Astea sunt cele mai fierbinţi piste neglijate, prioritizează acţiunile.

Crearea unei înţelegeri de la un contact

Scenariu:
Un contact şi-a exprimat interesul pentru planul tău de afaceri în timpul unei discuţii.
Ce este de făcut:

Deschide profilul de contact. Faceți clic pe "Afacere Create." Introduceți titlul afacere (de exemplu, "Acme Corp - Enterprise Plan"), suma, conducta, și etapa (ex., "Qualified"). Setați data de închidere și atribuiți-l pentru tine. Deal Coach va începe urmărirea această oportunitate.

CRM

Conducta (taxa de afacere)

Conducta este o placă vizuală în cazul în care oferte se deplasează prin etape de la stânga la dreapta. Drag și picătură carduri pentru a avansa oferte. Fiecare carte arată suma afacere, probabilitatea câștigului, și starea de sănătate.

Conductă
Conducta CRMEcranul conductei cu dealuri deschise, valoare deschisă, statistici ponderate și atuate-vase, un buton nou-deal, o coadă de aprobare AI și placa Lead/Qualiified/Won.Conductăspațiu de lucruOferte deschise23Valoare deschisă128k dolariPreviziuni ponderate74k dolariAtribuite12+ Afacere nouăCoadă de aprobare2 de revizitatLEADERVolt Inc.4k dolariLumină6 mii de dolari.CALIFICARENimbusCity in New York USA30 de mii.Vârf9 mii de dolari.A CÂȘTIGATOrbită48 de mii de dolari.1LIVE STATSValoare deschisă și prognoza ponderată2AI QUEUEAprobarea acordurilor propuse3BOARDTrasee de drag pe etape
Ecranul real al conductei: statistici live (valoare deschisă, prognoză ponderată), coadă de aprobare AI pentru oferte propuse și placa drag-and-drop.

Utilizarea plăcii conductelor

1
Vezi-ţi înţelegerile.

Conducta arată toate tranzacţiile active ca cărţi aranjate în coloane (etape). Fiecare antet coloană indică valoarea totală a tranzacţiilor din acea etapă.

2
Trageți la avans

Trageți o carte la etapa următoare. Probabilitatea câștigului și numără actualizarea instantaneu. Dacă mișcarea nu reușește (eroare de validare), cardul se fixează înapoi la poziția sa inițială.

3
Verificați legitimațiile cardului

Insigna verde = sănătos (activitate recentă, pe drumul cel bun). Amber = la risc (încetinirea, necesită atenție). Roșu = stagnat (nici o activitate pentru prea mult timp).

4
Click pentru detalii

Faceți clic pe un card pentru a deschide panoul de detaliu afacere cu contacte, activități, Deal Coach scurt, și acțiuni rapide.

Coada de omologare

Propunerile AI apar în coada de aprobare din partea de sus a paginii conductei. Fiecare propunere arată ce vrea să facă AI, de ce şi dovezile. Puteţi:

Aprobare

Acţiunea se desfăşoară prin intermediul Planului Trust şi este înregistrată în jurnal.

Editare

Modificați propunerea înainte de aprobare. De exemplu, modificați etapa sugerată sau ajustați suma.

Respins

Refuză propunerea. AI învaţă din respingeri pentru a face sugestii mai bune în viitor.

Probabilitatea de câștig explicată

Probabilitatea câştigului poate fi setată manual sau calculată prin IA. Când AI calculează, foloseşte un model antrenat pe propriile afaceri închise (câştigate şi pierdute). Dacă nu aveţi suficiente date istorice, AI utilizează probabilitatea implicită de etapă. Probabilitatea conduce prognoza ponderată: a $10,000 afacere la 30% Probabilitatea contribuie $3,000 la "probabil" prognoza.

Mutarea unei înţelegeri la Won

Scenariu:
Un client a semnat contractul şi a plătit.
Ce este de făcut:

Trageți carte de afacere la etapa "Won."OpsIQ va: (1) Marcați acordul ca fiind închis-câștigat. (2) Actualizarea prognozei. (3) Adăugați o activitate "Won" la cronologie. (4Dacă este configurat, declanşaţi un eveniment webhook (crm.deal.won). (5) Actualizarea stadiului de contact al ciclului de viață la "Client."

Spotting oferte blocate

Scenariu:
Vrei să găseşti oferte care au fost în aceeaşi etapă prea mult timp.
Ce este de făcut:

Caută insigne roşii (instalate) pe placa conductei. Aceste oferte nu au avut nici o activitate pentru mai mult timp decât pragul de putregai configurat (setat în CRM Configuration > Conducte). Faceţi clic pe fiecare afacere blocat pentru a vedea recomandarea Deal Coach pentru reactivare.

Pot avea mai multe conducte?+

Da. Du-te la CRM Configurație > Conducte pentru a crea conducte suplimentare. Cazuri de utilizare comune: conducte separate pentru noi afaceri vs. reînnoiri, sau pentru diferite produse/servicii.

Ce se întâmplă când trag o afacere la "Lost"?+

Afacerea este marcata ca inchis-pierdut. Vi se va cere un motiv de pierdere. Tranzactia este eliminata din placa activa dar poate fi gasita in filtrul de tranzactii inchise. Contactul ramane in CRM.

CRM

Afacere coaching

Deal Coach analizează fiecare afacere și vă oferă un scurt cu starea de sănătate, semnale de risc, oameni cheie, o listă de calificare, pregătirea întâlnire, și a sugerat acțiuni viitoare. Totul este sursa. Antrenorul arată care bilet, chat, sau activitate fiecare cerere vine de la.

Antrenor de afaceri
Antrenor de afaceriO carte de afacere listat semnale de risc AI-detectate cu surse de probe, pe lângă o recomandare AI și un buton de proiect-email.Antrenor de afacerispațiu de lucruCorp Acme · $24,000Etapa: Propunerea · 60% câștigSEMNALELE DE RISCNiciun răspuns în 10 zileCampionul a tăcut.Concurent menționat în chatSurse: ticket #482 · chat 6/12 · fir de e-mailAl recomandăReangajarea economicăcumpărător cu o recapitulare ROIşi a 7- Plan de zi aproape.Proiectează e-mailul1SIGNALSDe ce o afacere poate aluneca2SOURCEDFiecare cerere citează dovezi3ACŢIUNIUn clic pe pasul următor
Antrenor steaguri de ce o afacere ar putea aluneca (fiecare semnal citează sursa sa) și vă mâinile următoarea mișcare pentru a lua.

Ce-ţi spune antrenorul

Explicație privind sănătatea

De ce afacerea este sănătoasă, în pericol sau blocată. Semnale specifice: zile în fază, ultima dată de contact, frecvența activității, menționează concurentul, modele de obiecții.

Semnale

Categorie: obiecții ridicate, menționează concurentul, discuții de stabilire a prețurilor, indicatori de risc de sprijin, semnale de reînnoire/expansiune. Fiecare semnal leagă sursa sa (transcrierea chat-ului, bilet, e-mail, activitate).

Harta campionilor şi blocanţilor

Cine ajută afacerea (campionul) și care se opune (blocare). Pe baza analizei interacțiunii și a rolurilor de contact.

Lista de verificare a calificărilor

Lista de verificare MEDDICC sau BANT (configurabilă) care indică criteriile de calificare îndeplinite și care lipsesc. Grad: A, B, C, D sau F.

Pregătirea întâlnirii

Înainte de o întâlnire programată, antrenorul generează un scurt: agenda, puncte-cheie pentru a acoperi, întrebări pe care trebuie să le pună, riscuri pentru a aborda și materiale de pregătit.

Plan de răspuns și apelare

Sugerat următorul mesaj sau script de apel bazat pe starea curentă afacere și interacțiuni recente.

Calendarul probelor

Fiecare pretenție antrenorul face link-uri către o sursă: un număr de bilet, chat transcriere ID, data activității sau vizita site-ului.

Cum să utilizați antrenorul

1
Citeşte rezumatul

Deschide orice afacere și defilați la secțiunea Deal Coach. Citiți starea de sănătate și semnalele cheie.

2
Închiderea lacunelor de calificare

Verificați lista de calificare. Dacă "Cumpărător economic" lipsește, planificați să identificați și să angajați titularul bugetului.

3
Acţionaţi pe baza sugestiilor

Antrenorul sugerează acțiuni concrete viitoare. Faceți clic pentru a crea o sarcină, proiecta un e-mail, sau programa o întâlnire, toate rutate prin coada de aprobare.

Pregătirea pentru o întâlnire importantă

Scenariu:
Ai o întâlnire cu un viitor mâine despre o $50,000 S-a făcut.
Ce este de făcut:

Deschideţi afacerea şi citiţi secţiunea "Pregătirea întâlnirii."1) Principalele puncte de discuţie bazate pe interacţiunile recente. (2) Obiecții au ridicat în discuție săptămâna trecută. (3) Concurent au menționat într-un bilet de sprijin. (4) Întrebări pentru a pune despre cronologia lor. (5) Factori de risc pentru a aborda proactiv. Utilizați acest scurt pentru a pregăti o agendă axată pe dovezi.

Înțelegerea motivului pentru care o înțelegere este în pericol

Scenariu:
Conducta arată o insignă roşie pe un acord ai crezut că merge bine.
Ce este de făcut:

Faceți clic pe afacere și citiți Deal Coach Explicație de sănătate. Acesta ar putea spune: "Afacerea a fost în etapa propunerii pentru 22 zile (atenţie: 14 Ultimul contact a fost: 11 Cu câteva zile în urmă. Contactul principal a deschis un bilet de sprijin despre problema migraţiei datelor 5 acum câteva zile (biletul #T-892) Sugestion: a aborda problema migrației și programa un apel follow-up." Acum știi exact ce să stabilească.

CRM

Previziuni și rapoarte

Prognoza de bord cu o gamă defensivă, explicații privind schimbarea la nivel de afacere și urmărirea exactității astfel încât să puteți dovedi și explica numerele.

Previziuni
PreviziuniUn număr trimestrial de prognoză cu benzi Comit, Best-case și Pipeline și o notă de precizie.Previziunispațiu de lucruFORECASTUL · ACEST CURTOR312 de mii.87% la golComiteCel mai bun cazConductăA. I. ponderat prin tranzactionare sanatate si istorie · precizie urmarita in timp1CATEGORIIComite la conductă2AI-WEIGHTEDPrin abordarea sănătății3PROVABLEPrecizie urmărită
Comite, cel mai bun caz și conducta la o privire, AI-ponderate de afacere sănătate, cu precizie urmărită astfel încât să puteți apăra.

Categoriile de prognoze

Comite

Dealuri cu 80% sau probabilitate mai mare de câștig. Acestea sunt cele mai probabile câștigurile tale. Acest lucru ar trebui să fie venitul minim așteptat.

Probabil ponderată cu AI

Toate tranzacţiile deschise ponderate de probabilitatea lor câştigului calculat AI. Aceasta este cea mai realistă predicţie a ceea ce veţi închide.

Cel mai bun caz

Toate tranzacţiile deschise la valoare maximă. Acesta este venitul maxim posibil dacă totul merge perfect ( rareori se întâmplă).

Intervalul de încredere

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

Ce s-a schimbat şi de ce

Prognoza include atribuirea de modificări săptămânale. Când prognoza scade cu $15,000, raportul explică exact care oferte a cauzat schimbarea: "Deal A alunecat la trimestrul următor ($8,000), Deal B lost ($5,000), Deal C a redus valoarea ($2,000)."

Urmărire precisă

PREVIZIONAREA MAPE

Eroarea procentuală absolută medie: cât de departe au fost prognozele istorice. Mai jos este mai bine.15% Înseamnă că previziunile tale sunt de obicei în interiorul 15% rezultate reale.

Calibrarea probabilității câștigului

Scor Brier de măsurare a cât de bine probabilitățile câștiga meciuri reale rezultate. Dacă se ocupă la 70% Probabilitate de fapt câștiga 70% a timpului, calibrarea este bună.

Imagini săptămânale

OpsIQ captează o imagine a prognozei în fiecare săptămână (prin cron). În timp, puteți vedea cum se îmbunătățește acuratețea prognoza.

Rulouri și avertismente

Conversia per etapă

Câte oferte trec de la fiecare etapă la următoarea. 80% trece de la Calificat la propunere, dar numai 20% Treci de la propunere la negociere, propunerile tale ar putea avea nevoie de muncă.

Rata de câștig per sursă

Care surse de plumb produc cele mai multe victorii. Investiţi mai mult în surse cu rată mare.

Performanță per proprietar

Cum fiecare membru al echipei de vânzări este performante: oferte câștigate, valoarea conductei, dimensiunea medie a contractului, rata câștigului.

Avertismente

În cazul în care se utilizează un sistem de reținere pentru copii, acesta trebuie să fie utilizat pentru a verifica dacă este necesar.

Înțelegerea unei scăderi a previziunilor

Scenariu:
Prognoza trimestrială a scăzut de la $180,000 la $155,000 De săptămâna trecută.
Ce este de făcut:

Deschideți pagina de prognoză și verificați "Ce s-a schimbat." Raportul arată: "Afacere ACME Corp ($15,000) s-a mutat la Lost, concurent ales.$8,000) data de închidere a împins la trimestrul următor. Noul acord cu Gamma LLC ($3,000) a adăugat această săptămână." Schimbarea netă este -$20,000 + $3,000 = -$17,000, explicând scaderea de la 180 mii dolari la 163.000 dolari (cu restul $ 8K explicate prin ajustări de probabilitate pe alte oferte).

CRM

Găsirea de noi afaceri

Agent Prospecting vă ajută să găsiți și de cercetare potențiali clienți. Descrie clientul ideal, adăuga companiile țintă, și lăsați cercetarea AI, scorul, și proiect de prim-atingerea.

Perspective
PerspectiveO listă de companii de prospectare AI cu note adecvate, scoruri și un buton de ieșire proiect fiecare.Perspectivespațiu de lucruPerspectivele găsite de agentul DSTNorthwind Ltd.SaaS · 50 Personal · Sprijin pentru angajare88Proiect de informareCobalt Mfg pe PinterestFabricare · 200 personal74Proiect de informareMesa Retail pe PinteresteCommerce · 30 personal69Proiect de informareVega Health pe PinterestAsistenţă medicală · 80 personal63Proiect de informare1FINDConturi țintă ale surselor AI2SCORESe plasează & intenția3DRAFTPrimul-atingut scris pentru tine
Agentul DST găseşte companii ţintă, le înscrie în formă şi proiectează prima informare pentru evaluarea ta.

Configurare unică

1
Descrieţi clientul ideal

Du-te la CRM Configuration > Prospecting. Descrie profilul clientului ideal (ICP): industriile țintă, dimensiunea companiei, titluri de locuri de muncă, focalizare geografică, termeni de potrivire a produsului și scorul minim potrivit. Exemplu: "B2B SaaS companii cu 50-500 angajaţii din SUA/UK, vânzând instrumente de dezvoltator, cu un vicepreşedinte al vânzărilor sau şef al creşterii ca prim contact."

2
Adaugă societăți țintă

Introduceți domenii sau nume ale companiei pe care doriți să le cercetați. Puteți lăsa, de asemenea, AI-ul să sugereze companii bazate pe ICP-ul dumneavoastră.

3
Revizuirea rezultatelor cercetării

AI îmbogățește fiecare companie cu date disponibile: dimensiune, industrie, stiva tech, știri recente, și scor se potrivesc cu explicație.

4
Aprobarea accesului la informații

Pentru companiile de bună calitate, AI proiectează un mesaj personalizat primul-touch. Revizuiți și aprobați în coadă.

Punctaj corespunzător

Fiecare perspectivă devine un0-100 scor de potrivire bazat pe cinci factori:

ICP se potrivește

Cât de bine se potrivește compania profilul clientului ideal (industrie, dimensiune, locație).

Semnale de urgență

Există dovezi că au nevoie de produsul dvs. acum? Postări de locuri de muncă, schimbări tehnologice, plângeri despre concurenți.

Procură buget

Dimensiunea companiei, etapa de finanțare și indicatorii de venituri sugerează disponibilitatea bugetului.

Potrivire produs

Cât de relevant este produsul dumneavoastră pentru afacerea lor bazat pe industrie și tehnologie.

Se potrivesc

Dacă puteți servi în mod eficient acest client (zonul orar, limba, complexitatea).

Cercetarea unei companii ţintă

Scenariu:
Doriți să evaluați dacă acme.com merită urmărit.
Ce este de făcut:

Adaugă acme.com la lista de prospectare. AI întoarce: Scor potrivit 78/100 Motive: B2B SaaS, 120 angajaţi, pe baza SUA, recent angajat un VP de vânzări (semnal de urgenţă), utilizează concurent X ( meci produs). Cumpara semnale: vizitat pagina dvs. preţuri de două ori luna trecută (de urmărire site-ul). Cel mai bun contact: [email protected] (VP de vânzări). Deschizătorul elaborat face trimitere la recentele vizite la pagina de angajare și prețuri.

CRM

Secvențe de urmărire automate

Secvenţe automatizează urmărirea în mai multe etape: un amestec de email, aşteptare, sarcină, apel şi paşi webhook care rulează automat după aprobarea trimiterii iniţiale.

Secvenţe
Secvențe de urmărireUn flux orizontal de secventa: Email, asteptati trei zile, e-mail, apoi o sarcina, cu detectarea raspunsurilor.Secvențe de urmărirespațiu de lucruDupă ce aprobaţi prima trimitere →E-mailIntroducereStai.3 zileE-mailMonitorizareaSarcinaSună-mă.Pașii pot fi e-mail, așteptați, sarcină sau webhook. Un răspuns oprește automat secvența.1AUTOMATEUrmărire în mai multe etape2STEPSEmail · așteptați · sarcină · webhook3YOU APPROVEPrimul trimis e deschis.
Urmărire automată în mai multe etape (email, așteptați, e-mail, sarcina) pe care o aprobați primul și un răspuns se opreşte automat.

Cum funcționează secvențele

1
Creează o secvență

Defineste pasii: email, asteapta 3 zile, e-mail, așteptați 5 zile, sarcina (apel dacă nu răspunde), e-mail. Fiecare pas de email are un șablon puteți personaliza.

2
Înscrie contactele

Adăugaţi contacte la secvenţă. AI poate propune, de asemenea, înscrierea din rezultatele prospectare.

3
Execuție automată

Pașii se execută automat conform programului. Dacă un contact răspunde în orice moment, secvența se întrerupe automat.

4
Rezultatele traseului

Vezi ratele deschise, ratele de răspuns, ratele și de conversie dezabonați pe pas. Utilizați acest lucru pentru a optimiza secvența ta.

Răspunde înţelegere

Atunci când un contact răspunde, AI clasifică răspunsul:

Pozitiv

Secvenţa se opreşte, sarcina e creată pentru urmărire.

Obiectez.

Are preocupări, dar nu respinge. Secventa pauze, sarcina creat cu detalii de obiectie.

Dezabonează

Vrea să nu mai primească mesaje. Contactul este suprimat permanent.

Nu acum.

Interesat, dar sincronizarea este greșită. Secvența pauzele, snooze sarcina creată.

Persoana greşită

Secvenţa se opreşte, contactul e marcat pentru revizuire.

Sprijin

O întrebare de suport, nu un răspuns de vânzări. Secvenţa se opreşte, bilet creat.

Protecţii antispam

Manipularea prin opt-out

Solicitările dezabonare sunt onorate imediat și contactul este suprimat din toate secvențele viitoare.

Send cap

Limita zilnică a spațiului de lucru (default: 1,000 e-mailuri). Prevenește masa trimite care declanșează filtre spam.

Limita per-contact

Maximum 1 mesaj per contact pe zi. Prevenește persoanele individuale copleșitoare.

Manipularea supracapacului

Pașii care depășesc capacul zilnic sunt amânate până în ziua următoare. Ei nu sunt niciodată scăzut sau sărit.

Ce se întâmplă dacă un contact deschide o amendă de sprijin în timpul unei secvențe?+

Secvenţa se întrerupe automat. Suportul are prioritate în faţa acţiunii de informare. Secvența poate fi reluată manual după rezolvarea problemei de suport.

Pot să mă apropii de treptele de încercare A/B?+

Nu direct în secvenţe, dar puteţi crea două secvente cu mesaje diferite şi compara rezultatele lor.

CRM

Instrumente de creștere

O pagină sub CRM care deține motorul de creștere: venituri recurente (MRR/ARR), catalogul de produse, formulare de captură de plumb, linkuri de rezervare și rutarea de plumb. Tot ce scrie aici se află direct în CRM, astfel încât o depunere a formularului sau un apel rezervat este un contact cu istoria, nu un rând într-o foaie de calcul.

Ce trăiește pe pagina

Venituri recurente

Venituri

MRR și ARR proiectate din registrul dvs. de facturare reală. Abonamentele sunt grupate din plăți per platformă, ciclul de facturarea este dedus din lacunele de plată, iar un abonament se pierde atunci când o plată este întârziată trecut 1.5 ori ciclul său. Legătura clienților cu contactele CRM automat atunci când registrul poartă e-mail lor.

Catalog de produse

Catalog

O sursă de adevăr pentru ceea ce vinde. Citațiile trage numele și lista prețul din catalog, și citate acceptate roll up în venituri de produs. Arhiva produselor, ele nu șterge niciodată.

Forme de captură a plumbului

Captură

Fiecare formular devine o pagină găzduită plus un cod iframe integrat pentru propriul site. Depunerea devin contacte, proprietarul primește o notificare, și regulile de rutare atribui plumbul.

Legături de rezervare

Programare

Partajaţi un link, permiteţi perspectivelor alege un slot gratuit. sloturi respecta programul de lucru al organizatorului, fusul orar şi întâlnirile existente. O rezervare creează întâlnirea, e-mailuri perspectiva o confirmare şi notifică organizatorul.

Traseu de plumb

Rutare

Regulile teritoriului rula mai întâi, apoi regulile de teren (jocuri un domeniu cum ar fi țara sau sursa), apoi rotund-robin peste piscina dvs. reprezentant. Acesta trasee CONTACTE ȘI DEALS deopotrivă, indiferent de statutul afacere: o afacere câștigată încă are nevoie de un proprietar pentru atribuirea comisionului, responsabilitatea contului și follow-up, iar în modul de vizibilitate a proprietarului sau echipei un record neproprietar este invizibil pentru toată lumea dar un manager. Înregistrări create prin automatizare (un conector vânzare, chat, un import) nu poartă creator interactiv, astfel încât acestea sunt rutate de aceleași reguli privind crearea mai degrabă decât stânga proprietar. Orice lucru care are deja un proprietar nu este realiocat niciodată.

Creează prima formă

1
Instrumente de creștere deschise

Du-te la CRM, apoi la instrumente de creştere, apoi sectiunea Lead-capture.

2
Spune-i şi alege câmpurile.

Tastați un nume și o listă de câmp separată de virgulă, de exemplu numele, emailul, telefonul, mesajul. E-mailul este întotdeauna necesar.

3
Partajare sau încorporare

Copiați link-ul găzduit pentru a o partaja oriunde, sau copiați codul înglobat și lipiți-l pe orice pagină de site-ul dumneavoastră.

4
Urmăreşte-i cum ajung.

Fiecare depunere este un contact CRM cu un formular. Activitate prezentată, o notificare a proprietarului și rutare automată.

💡
Paginile de captare publică folosesc adresa proprie a spaţiului de lucru. Spaţiile de lucru în cloud utilizează subdomeniu alocat (compania.opsiq.help), astfel încât link-ul rezolvă întotdeauna datele corecte.

Protecții încorporate

Bots vede succesul, nu vezi nimic

Un câmp ascuns de miere aruncă tăcut transmiterile robotului.

Rata limitată

Zece cereri pe oră per IP adresă în toate formularele și rezervările.

Consimţământul rămâne cinstit.

Prezentarea unui formular nu permite acordarea consimțământului de comercializare. Numai o caseta de verificare a consimțământului explicit face.

Fără rezervare dublă.

Un slot este revalidat în funcție de o verificare a disponibilității la momentul rezervării.

De unde provin datele privind veniturile recurente?+

Din același registru comercial pe care le folosește pagina dvs. de vânzări, alimentată de conectori de facturare. Utilizați Re-sincronizare de la facturare după conectarea unei noi platforme.

Pot folosi formularele fără un site?+

Da. Fiecare formular are o pagină găzduită pe propria adresă care funcționează independent, cu sau fără JavaScript_.

CRM

Hub de mesagerie (SMS și WhatsApp)

Un conector, până la douăzeci de porţi. Conectaţi furnizorii de SMS şi WhatsApp pe care îi utilizaţi efectiv, marcaţi unul ca implicit, şi alege oricare dintre ele atunci când texting un contact. Consimţământul este verificat de CRM înainte de orice poartă de acces este contactat.

Aranjează-l.

1
Activează conectorul

Pe pagina Conectorilor, deschideți Hubul de Mesagerie (SMS și WhatsApp) și activați-l.

2
Adaugă un furnizor

În același sertar, sau în CRM Instrumente de creștere, alege o poartă de la dropdown (Twilio, Vonage, Termii, Meta WhatsApp Cloud, Infobip și mai mult), lipi acreditările sale API și conectați. Puteți adăuga mai multe, inclusiv aceeași poarta de acces de două ori cu conturi diferite.

3
Conectează webhook-ul

Fiecare furnizor de intrare arată propriul său webhook URL Lipește-l în raportul de livrare al porții și setările de mesaje pentru a obține statutul de livrare și răspunsuri înapoi în OpsIQ.

4
Trimite de la un contact

Deschide un contact și folosește butonul SMS sau WhatsApp. Dacă mai mult de un furnizor susține canalul, un selector vă permite să alegeți; altfel este utilizat implicit.

Consimţământul e pe primul loc.

Numai acordul acordat

Consimțământul necunoscut nu este consimțământul. Un expeditor refuză dacă nu se acordă în mod explicit acordul SMS. WhatsApp călătorește cu același acord.

Nu-nu-contact câştigă întotdeauna.

Un steag care nu face contact blochează fiecare canal, indiferent ce altceva este setat.

Suprimare onorată

Contactele de pe lista de suprimare nu sunt niciodată trimise.

Refuzurile numesc motivul lor

O trimitere blocată vă spune exact de ce, astfel încât să puteți repara datele în loc de ghicit.

Pentru dezvoltatori: contractul webhook

URL forma

https://your-address/opsiq/cron/messaging_webhook.php?sk=SITE_KEY&e=ENTRY_ID&t=TOKEN. Tokenul per-intrare este mentat atunci când furnizorul este conectat și nu se rotește niciodată la editare.

Formate înțelese

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":"..."}.

Efecte

Rapoartele de livrare ştampilă rândul de informare registru care poartă furnizorul de mesaj ID ca livrate sau sari. Mesajele de intrare se potrivesc cu contactul prin numărul de telefon în interiorul spaţiului de lucru, teren ca un mesaj. Activitate primită, şi marca conversaţia a răspuns.

Modul de eroare

Răspunsul fals sau lipsa unui jeton 403. Încărcăturile utile necunoscute sunt numărate și ignorate, niciodată fatale, astfel încât o poartă de acces configurată greșit nu poate rupe obiectivul final.

Care sunt porţile de acces?+

Twilio, Vonage, Plivo, MessageBird, Sinch, Infobip, Telnyx, ClickSend, Termii, Africa's Talking, BulksMS, Textlocal, Meta WhatsApp Cloud, 360dialog, SMSAPI, Gupshup, Kaleyra, D7 Networks, Hubtel, și un webhook HTTPS personalizat pentru orice altceva.

Acreditările sunt sigure?+

Credențialele sunt stocate criptate în setările conectorului și nu sunt niciodată ecoizate înapoi la browser. Editarea unei intrări cu un secret gol păstrează cel stocat.

Poate AI trimite mesaje?+

Da, prin actiuni inregistrate care necesita confirmarea si executa aceeasi poarta de consimtamant. AI poate lista si furnizorii conectati pentru a explica ce este disponibil.

CRM

Menținerea și creșterea clienților

Managementul ciclului de viață vă ajută să protejați veniturile existente. Fiecare cont primește un scor de risc churn, un scor pentru sănătate, un punctaj de expansiune, și un playbook de succes recomandat.

Ciclul de viață
Placă pentru ciclul de viațăO placă pentru ciclul de viață al clienților (la bord, activ, la risc, reinnoire) cu bare de sănătate pe fiecare card de cont.Ciclul de viațăspațiu de lucruLa bordAcneeSănătate 40SUBSTANŢĂGlobexSănătate 88InitechCity in GermanySănătate 76AT-RISKSoylentCity in GermanySănătate 28A REÎNNOIRIIUmbrareînnoiește în 12dExpansiune + 8k $1STAGESLa bordul unei reînnoiri2SCORED& Expansiune în domeniul sănătății3PLAYBOOKUrmătoarea mutare recomandată
Clienţii trec prin bording, activ, risc şi reînnoire, fiecare punctat pentru sănătate şi extindere cu un playbook.

Placa ciclului de viață

Hartă etapă

Placa vizuala arata unde se afla fiecare cont: Lead, Prospect, Oportunitate, Client, Expansiune, Reînnoirea, La Risc, Brushed.

Conturi de risc

Conturi marcate cu risc ridicat de churn. Fiecare arată driver-ul de sus (spinp suport, inactivitate, eșec de plată) și un joc salva recomandată.

Oportunități de extindere

Conturi care arată semnale de disponibilitatea de a cumpăra mai mult: utilizare ridicată, cereri de caracteristici, anchete de plan.

Reînnoiri datorate

Conturi cu datele de reînnoire viitoare. Sortat după nivelul de risc și valoarea veniturilor.

Cum OpsIQ detectează riscul de criză

Riscul de accident se calculează pe baza mai multor semnale fuzionate:

Semnale CRM

Să ne ocupăm de sănătate, inactivitate, pierderi recente, implicare în declin.

Semnale de suport

Numărătoarea biletelor deschise, volumul biletelor, sentimente negative, escaladare.

Implicarea produselor

Frecvenţă de autentificare, utilizare a caracteristicilor, vizite la pagină; API Sună.

Semnale de facturare

Plăţi eşuate, facturi restante, cereri de reducere a nivelului, vizite la pagina de anulare.

Cărți de redare

Salvează jocul

Pentru conturile cu risc: găsiţi o abordare proactivă, abordaţi îngrijorarea, oferiţi sprijin şi escaladaţi dacă este necesar.

Jocul de reînnoire

Pentru următoarele reînnoiri: confirmarea satisfacției, revizuirea utilizării, valoarea actuală, oferă stimulente dacă este cazul.

Joc de expansiune

Pentru conturile gata de creştere: prezent opţiuni de actualizare, împărtăşeşte poveştile de succes, demonstrează ROI.

Joc de adopție

Pentru a utiliza mai puține conturi: oferă formare, partaja cele mai bune practici, permite caracteristicile pe care nu le folosesc.

Spotting churn înainte de a se întâmpla

Scenariu:
Un client care se loghează zilnic în mod normal nu s-a logat pentru 2 săptămâni, și au deschis 3 bilete de sprijin luna asta.
Ce este de făcut:

Placa Lifecycle marchează acest cont ca fiind "At Risk" cu drivere: inactivitate (14 zile de la ultima autentificare) și Spike suport (3x volumul normal al biletelor). Joc recomandat: apel de informare proactivă pentru a înțelege ce se întâmplă. Există o problemă de produs? Sunt acestea evaluarea concurenților? Intervenția timpurie poate salva contul.

CRM

Păstrarea datelor curate

Agentul Data Steward găsește și rezolvă automat probleme de calitate a datelor: duplicate, câmpuri lipsă, inconsecvențe și înregistrări vechi.

Administratorul de date
Administratorul de dateO listă de probleme legate de calitatea datelor (duplicate, lipsă, vechi, format), fiecare cu o acțiune fixă cu un singur clic.Administratorul de datespațiu de lucruEmisiuni de date găsite de agentul StewardDuplicat[email protected] şi [email protected]CombinăLipsește12 contactele nu au companieÎmbogățireStadionul38 tranzacţii neatinse pentru 90+ zileRevizuireFormatnumerele de telefon în 4 formateRepară tot1CATCHESDupe, goluri, vechi2EXPLAINSDe ce a marcat fiecare3FIXESCu aprobarea ta
Agentul Steward îţi păstrează CRM curat, găsirea duplicatelor, lacunelor, înregistrărilor vechi şi formatelor proaste, fixarea aprobării.

Ce prinde

Contacte duplicate

Înregistrări multiple pentru aceeași persoană (de exemplu, [email protected] şi [email protected]) Administratorul propune fuzionarea acestora.

Date lipsă

Contacte fără e-mail, oferte fără sume, companii fără domenii. Sugerează umplerea din surse disponibile.

Înregistrări nelegate

Oferte fără contacte asociate, contacte fără companii. Propune conectarea pe baza domeniului de email și context.

Inconsistențe

O afacere în etapa "Won" cu 20% probabilitate, un contact marcat "Client" cu nici o afacere, o companie cu industrie neuniform.

Etape greșite

Oferte care se află în aceeași etapă de prea mult timp sau contacte a căror etapă de ciclu de viață nu corespunde activității lor.

Cum să utilizaţi

1
Deschide lista de administratori

Du-te la CRM și găsiți secțiunea Data Steward (sau deschideți-o de la CRD Health).

2
Aprobă dispozitivele de siguranță

Elementele verzi sunt sigure: duplicate clare, date lipsă evidente. Aprobaţi-le în vrac.

3
Revizuiţi restul.

Obiectele de chihlimbar au nevoie de judecata ta: posibile duplicate cu mici diferente, modificari propuse de etapa, legatura intre companii.

Curățarea contactelor duplicate

Scenariu:
Administratorul a găsit "John Smith ([email protected])" și "J. Smith ([email protected])": acelaşi e-mail, nume de afişaj diferite.
Ce este de făcut:

Administratorul propune fuzionarea: țineți înregistrarea cu mai multă activitate, uniți acordurile și activitățile celorlalte înregistrări. Revizuiți propunerea, ajustați numele de afișare supraviețuitor dacă este necesar și aprobați. Ambele înregistrări sunt păstrate în contactul unit.

CRM

Construieşte-mi CRM

Construiește-mi CRM Vă permite să descrieți dvs.CRM Setare în limba engleză.OpsIQgenerează un plan validat, reversibil și aplică-l pe aprobare. Fără codare, fără click de configurare manuală.

Construieşte-mi CRM
Construieşte-mi CRMO descriere în limba naturală pe stânga care produce un plan CRM generat de etape, câmpuri și segmente din dreapta.Construieşte-mi CRMspațiu de lucruDescrie-ţi afacerea.Suntem o agenţie de web-designvânzarea de avans lunar șiproiecte unice către miciafaceri.Construieşte-mi CRMPlan generatStadii: plumb → ÎntreținereTipuri de tranzactii: retinere, proiectCâmp: valoare lunarăSecţiuni: SMB, agenţieSecvență: la bordAprobare și aplicare1DESCRIBEEngleză simplă în2AI PLANSStadii, câmpuri, segmente3APPROVEAplicat · fără codare
Descrieţi-vă afacerea în limba engleză;OpsIQproiectează întregul CRM(etape, câmpuri, segmente) și se aplică la aprobare.

Cum funcţionează

1
Descrie ce vrei.

Tastaţi o descriere simplă-engleză a CRM setup. Exemplu: "Creaţi o conductă de reînnoire cu etape: Upcoming, Contacted, Negociator, Reînnoit, Lost. Scorul conduce mai sus atunci când văd preţuri de două ori."

2
Revizuirea planului

OpsIQ arată o previzualizare a ceea ce va crea: conducte, etape, probabilități de etapă, reguli de notare, regulile ciclului de viață. Revizuiți fiecare element.

3
Aplică

Faceți clic pe Aplicați pentru a executa planul. Fiecare schimbare este înregistrată ca un pachet puteți anula într-un singur click.

4
Întoarce-te dacă este necesar

Dacă ceva nu este în regulă, faceți clic pe Anulați pentru a reveni întregul pachet. CRM se întoarce la starea sa anterioară.

Ce poţi construi

Conducte și etape

Creați conducte numite cu etape personalizate, probabilități implicite și praguri de putregai.

Norme de evaluare

Boost scoruri de plumb bazate pe comportament: "Scor mai mare atunci când văd tarifare," "Score mai mici atunci când vizita pagina carierelor."

Norme privind ciclul de viață

Progresează automat etapele ciclului de viață: "Mutați la SQL atunci când solicită un demo," "Mutaţi la Client atunci când se câştigă afacerea."

Câmpuri personalizate

Adaugă câmpuri la contacte, oferte sau companii: text, număr, dată, selectați, checkbox, URL, email.

Lista de verificare a calificărilor

Defineşte lista de verificare MEDDICC sau BANT împotriva gradelor de antrenor de afacere.

Crearea unei conducte de reînnoire

Scenariu:
Te ocupi de abonamentele SaaS şi ai nevoie de o conductă pentru renaşteri.
Ce este de făcut:

Tip: "Creați o conductă de reînnoire. Stadii: 90 Zilele de ieşire (10%), 60 Zilele de ieşire (25%), contactat (40%), Negociarea (60%), Reînnoit (100%), Churned (0%) Setează pragul de putregai la 14 zile."OpsIQ genereaza planul, il revizuiesti si apasa pe Aplicare. Conducta apare imediat pe pagina ta de conducte.

Dacă descriu ceva ce nu e posibil?+

Constructorul generează doar acțiuni pe care știe cum să le valideze. Dacă cereți ceva în afara capacităților sale (de exemplu, "Integrați-vă cu obiceiul meu API"), acesta va respinge cererea și vă va explica ce poate face în schimb.

Pot anula schimbările?+

Da. Fiecare Build acțiunea mea CRM este capturat ca un pachet reversibil. Du-te la CRM Sănătate > Schimba Istoria pentru a vedea toate pachetele și anula oricare dintre ele.

CRM

Îţi aranjezi CRM-ul în felul tău.

Configuraţia CRM manuală pentru echipe care preferă să facă clic pe peste dactilografiere. Toate setările pe care le poate crea CRM sunt disponibile şi sub formă de câmpuri tradiţionale.

Conducte și etape

Creați, redenumiți, rearanjați și ștergeți conductele și etapele. Setați probabilitatea implicită a câștigului pe etapă. Setaţi pragul de putregai (zile fără activitate înainte ca o afacere să fie marcată "instalată").

Câmpuri personalizate

Adaugă câmpuri la oferte, contacte sau companii. Tipuri de domenii: text, număr, dată, selectați (cădere cu opțiuni predefinite), caseta de verificare, URL, email. Câmpurile personalizate apar pe profilul obiectului și în filtre.

Lista de verificare a calificărilor

Defineşte lista de verificare pe care o foloseşte antrenorul de afacere pentru a evalua oferte. Alege MEDDICC, BANT sau un set personalizat de criterii. Fiecare element poate fi marcat necesar sau opțional.

Norme privind etapa ciclului de viață

Defineşte tranziţiile automate în etapa de viaţă: atunci când un contact îndeplineşte o condiţie (vizurile preţ, prezintă un formular, efectuează achiziţii), stadiul lor de viaţă avansează automat.

Norme de stabilire a scorului de plumb

Crește sau reduce scorurile de plumb pe baza comportamentului. Exemple: "Pagina de prețuri vizionate = +15 puncte," "Descarcated whitepaper = +10 puncte," "Vizited cariere page = -5points." Se poate stabili un număr minim (de exemplu, "trebuie să se vadă cel puțin prețurile 2 ori ").

Vizualizări salvate

Creați combinații de filtre + sort pentru contacte, oferte sau companii. Conectați vizualizările cu echipa dumneavoastră. Setați o vizualizare implicită pe tip obiect.

Adăugarea unei reguli de notare a plumbului

Scenariu:
Vrei ca persoanele care vizualizează pagina de preţuri de două ori sau mai mult să obţină un scor mai mare.
Ce este de făcut:

Du-te la CRM Configuration > Lead Scoring Rules. Faceți clic pe Adăugați regula. Set: Eveniment = "paginview,"URL conţine = "/pricing", Număr minim =2, Creșterea scorului = +20. Salvare. Data viitoare când scorer ruleaza, contacte de potrivire această regulă va primi +20 la scorul lor principal.

CRM

Verificarea stării de sănătate a CRM

CRM Health este o pagină auto-diagnostic care verifică CRM este înființat corect și rulează fără probleme.

Verificarea stării de sănătate
Verificarea stării de sănătate a CRMUn inel de scor pentru sănătate la 92 lângă o listă de verificare a trecerii și a avertizării privind verificările configurației.Verificarea stării de sănătate a CRMspațiu de lucru92SPECIALITATEAStadii de conducte configurateImportare & conexiuneAgenţi AI activaţi!Nicio secvenţă activă de urmărire!12 contactele lipsă ale companiei1AUDITULVerificați configurarea2FLAGSCe lipseşte3SCOREUn număr global
Un audit CRM de o pagină: un scor global al sănătății plus o listă a celor stabilite corect și ceea ce mai necesită atenție.

Ce verifica

Schema

Tabelele de baze de date există și au coloanele corecte. Dacă o migrare a fost omisă, CRM Health va semnala acest lucru.

Agenți AI

Toți agenții CRM (Capture, Data Steward, Deal Intelligence etc.) sunt înregistrați și sănătoși. Verde = funcționare, chihlimbar = are nevoie de atenție, roșu = eroare.

Rute

CRM API trasee și obiectivele AJAX sunt înregistrate și callable.

Acțiuni AI

Catalogul de acţiune CRM este înregistrat în Registrul Acţiunii. Dacă lipsesc acţiuni, CRM Health se autovindecă prin reînregistrarea lor.

Numărul de date în viață

Total contacte, companii, oferte, sarcini, activități și evenimente. Util pentru verificarea importurilor și captarea datelor în curs de desfășurare.

După verificarea setărilor

După prima configurare CRM, deschideți CRM Sănătate și verificați toate verificările sunt verzi. Dacă oricare dintre acestea sunt chihlimbar sau roșu, faceți clic pe elementul pentru o explicație de diagnostic și a sugerat fix.

Cât de des ar trebui să verific CRM Health?+

Verificați după configurarea inițială, după actualizări majore, și ori de câte ori comportamentul CRM pare greșit. CRM Sănătate se vindecă singur multe probleme (cum ar fi înregistrările lipsă de acțiune) doar prin deschiderea paginii.

CRM

Conexiuni CRM pentru dezvoltatori

CRM expune un total public REST API și outbound webhooks astfel încât să se potrivească orice stiva fără exporturi manuale.

API obiective finale

Autentificare

API Cheie (autorizare: Bearer opq_...) cu domeniul de aplicare crm.read sau crm.write. /api/v1.php Cu acțiune și site_key.

Contacte

crm. contacts. list (search + filtru), crm. contacts. detail (prin ID), cr. contacts. upsert (creare sau actualizare), clim. contects. save.

Oferte

crm. deals. list, cmm. deales. detalii, crm. dals. create, crm deals

Activități

crm. activitati. list (timeline for a contact/deal), crm. activities. record (log a new activity).

Evenimente

crm. evenimente. listă (feed de schimbare durabilă cu cursor Since_id), crm. vents. catalog (tipuri de evenimente disponibile pe listă).

Creați un acord prin 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
}

Evenimente de webhook

opsiq.contact.upsert

Concediat atunci când un contact este creat sau actualizat. Acesta este evenimentul de contact la care trebuie să se aboneze; nu există niciun eveniment separat creat.

contact.lifecycle_changed

Concediat atunci când un contact se deplasează într-o etapă diferită a ciclului de viață.

contact.status_changed

Concediat când se schimbă starea de contact.

contact.conversion

Concediat când o conversie este înregistrată împotriva unui contact.

contact.tag_added

Concediat atunci când se adaugă o etichetă la un contact.

contact.erased

Concediat atunci când un contact este șters pentru o cerere de confidențialitate.

crm.deal.created

Concediat când se creează o înţelegere.

crm.deal.stage_changed

Concediat când o afacere se mută într-o altă etapă.

crm.deal.won

Concediat când o afacere este închisă ca și câștigat.

crm.deal.lost

Concediat când o afacere este închisă ca pierdut.

crm.company.created

Concediat când o companie este creată.

crm.task.created

Concediat atunci când este creată o nouă sarcină (manual sau generat de AI).

email.replied

Concediat atunci când un contact răspunde la un e-mail de informare.

email.bounced

Concediat când un e-mail de informare sare.

💡
Sună-mă. webhooks.events.list pentru setul de autoritate pe instalaţia dumneavoastră, cu sarcina utilă a fiecărui eveniment. Acesta este generat din codul de livrare în sine, astfel încât nu poate fi niciodată de acord cu ceea ce ajunge de fapt. Lista completă apare, de asemenea, în secțiunea Webhooks.

Toate evenimentele de webhook sunt HMAC Aboneaza-te la un post de agent.URLîn Setări > Cârlige web, sau sondajcrm.Evenimente.listă cu Since_id pentru o schimbare durabilă a hranei.

Sincronizarea contactelor CRM pe foi Google

Scenariu:
Vrei ca fiecare nou contact CRM să apară într-o foaie Google pentru echipa ta de marketing.
Ce este de făcut:

Configurarea unui abonat webhook pentruopsiq.contact.upsert. Îndreptați-l către o aplicație Google Apps Script sau un webhook ZapierURL. Încărcătura utilă include numele de contact, e-mail, companie, scorul de plumb, și sursă. Script-ul se anexează un rând la Google Sheet pentru fiecare nou contact.

CRM

Segmente

Segmentele economisesc filtre de contact reutilizabile pentru vizualizarea CRM, informare, promoții și alte instrumente de sensibilizare a publicului.

Ecran produs
SegmenteEditorul de segment combină condițiile, arată numărul meciului live și permite operatorului să aleagă un filtru live sau o imagine prinsă.Segmentespațiu de lucruMODTrăieşteLOGICTOATEMATCHES1,248VIE VIU AIRPACEEtapa clientilor= client activRegulaUltima activitateîn 30 zileRegulaȚara= Regatul UnitRegulaIntenție ridicatăcel puțin scor 70Regula1CHOOSE MODELive sau instantaneu2ADD RULESTOATE SAU ORICE3REUSECampanie și CRM
Editorul de segment combină condițiile, arată numărul meciului live și permite operatorului să aleagă un filtru live sau o imagine prinsă.

A segment viu recalculează din datele curente ori de câte ori este utilizat. A imagine de ansamblu îngheaţă lista actuală de membri, care este utilă atunci când un public de informare nu trebuie să se modifice după aprobare.

Alege TOATE atunci când fiecare condiție trebuie să se potrivească sau ALTE INFORMAŢII atunci când o singură condiție este suficient. Revizuiți numărul de live înainte de economisire. Segmentele de sistem pot fi vizibile, dar protejate de editarea obișnuită.

CRM

Punctaj plumb

Regulile de notare a plumbului transformă comportamentul și semnalele de profil într-un scor coerent pe care vânzările și automatizarea îl pot utiliza.

Ecran produs
Punctaj plumbScorul de plumb indică reguli active, fereastra de rulare și se aplică modificarea scorului pozitiv sau negativ.Punctaj plumbspațiu de lucruREGULI12SCORED8,412HOT LEADS286VIE VIU AIRPACEActivitatea de stabilire a prețurilor3+ vizite în 14 zile+20Cumpăr cuvinte cheieconține migrație sau întreprindere+15Riscul de susținereeveniment de plângere în 30 zile-10Sursă sigurăSesizarea partenerilor+121DESCRIBE RULEFolosește limba engleză simplă2REVIEW FIELDSSemnal, fereastră, puncte3RESCOREAplicați în spațiul de lucru
Scorul de plumb indică reguli active, fereastra de rulare și se aplică modificarea scorului pozitiv sau negativ.

Constructorul de reguli AI poate transforma o instrucţiune simplă-engleză într-o regulă structurată. Fiecare regulă trebuie revizuită înainte de activare: confirma activitatea sau cuvântul cheie, numărul minim, fereastra de rulare şi schimbarea scorului.

Regulile pozitive și negative pot coexista. Spațiu de lucru pentru reconcore după modificarea regulilor materiale, astfel încât contactele existente să fie evaluate în cadrul noului model. Scorul poate alimenta segmentele, traseul, prospectarea și condițiile de flux de lucru.

CRM

Clasament de vânzări

Clasamentul compară reprezentanții care utilizează atingerea cotelor, veniturile câștigate, comisionul și conducta deschisă pentru luna selectată.

Ecran produs
Clasament de vânzăriClasamentul lunar îi clasează pe reprezentanţii de vânzări, menţinând în acelaşi timp veniturile câştigate, comisionul şi conducta deschisă vizibile.Clasament de vânzărispațiu de lucruPERIODIulieTEAM QUOTA82%A CÂȘTIGAT184k lire sterlineVIE VIU AIRPACEAmin.104% cotă · £62k câştigat1st- Bine.88% cotă · £51k câștigata douaRita.76% cotă · £43k câștigata treiaDeschide conducta312 mii de lire peste echipăRevizuire1CHOOSE MONTHCompară o perioadă2CHECK QUOTAAtingerea de către reprezentant3COACHFolosește contextul conductei
Clasamentul lunar îi clasează pe reprezentanţii de vânzări, menţinând în acelaşi timp veniturile câştigate, comisionul şi conducta deschisă vizibile.

Atingerea cotei are sens doar atunci când fiecare reprezentant are o cotă curentă și se ocupă de a avea dreptul de proprietar, sumă, monedă și statutul de închidere. Utilizați clasamentul pentru coaching și recunoaștere, nu ca singura măsură de calitate; pereche-l cu abordarea sănătății, activității și precizie prognozată.

CRM

Aprobare de acord

Aprobările de acord necesită ca managerul să fie concediat înainte ca acordurile cu valoare ridicată să poată fi marcate ca fiind câștigate.

Ecran produs
Aprobare de acordPolitica de aprobare definește două praguri valorice, iar coada indică decizii în curs, aprobate și respinse.Aprobare de acordspațiu de lucruPOLICYActivatWAITING6OLDEST3hVIE VIU AIRPACENivel 1Oferte de la £10,000AdministratorNivel 2Oferte de la £50,000SeniorReînnoirea întreprinderilor£72,000 · solicitat de BenÎn aşteptareProiect de migrație£18,500 · solicitat de RitaAprobat1SET THRESHOLDS0 dezactivează un nivel2REQUESTRep depune acordul3DECIDE:Aprobare sau respingere
Politica de aprobare definește două praguri valorice, iar coada indică decizii în curs, aprobate și respinse.

Activează politica și stabilește nivelul 1 și nivel 2 praguri. Un prag de 0 Când un non-manager încearcă să câştige o înţelegere la sau deasupra pragului, OpsIQ creează o cerere de aprobare în loc să schimbe încet scena.

Managerii și administratorii integrali nu sunt blocați de politică. Fiecare decizie ar trebui să păstreze solicitantul, agresorul, timpul și motivul pentru auditabilitate.

CRM

Norme privind ciclul de viață

Regulile ciclului de viață mută automat contactele între etape atunci când datele lor actuale corespund unei condiții salvate.

Ecran produs
Norme privind ciclul de viațăRegulile privind ciclul de viață sunt evaluate cu prioritate; prima regulă care se referă la corelare modifică etapa de contact.Norme privind ciclul de viațăspațiu de lucruSUBSTANŢĂ7RUNSNoapte bună.PRIORITYCel mai mare primulVIE VIU AIRPACEPlumb → Calificatscor ≥ 60 şi activitatea recentăPrioritate 100Calificat → Clientexistă un eveniment de achizițiePrioritate 90Client → RiscNu există activitate pentru 60 zilePrioritate 70Risc → Clientachiziţie sau răspuns nouPrioritate 601PICK STAGESDe la și de la2DEFINE FILTERStilul segmentului JSON3ORDER RULESPrimul meci câştigă.
Regulile privind ciclul de viață sunt evaluate cu prioritate; prima regulă care se referă la corelare modifică etapa de contact.

Fiecare regulă are o etapă sursă, etapa de destinație, steag activ, filtrul de tip prioritate și segment. Treaba programată pentru ciclul de viață evaluează prioritățile mai mari în primul rând și se opreşte după prima potrivire a unui contact.

Regulile ar trebui să fie reciproc de înțeles. Evitați două reguli active care pot muta același contact în direcții opuse pe parcursul aceleiași runde. Testați filtrul împotriva unui segment înainte de activarea acestuia.

CRM

Fluxul de activitate CRM

Fluxul de activitate spaţială combină evenimentele clienţilor şi cele operaţionale astfel încât echipele să poată investiga ce s-a întâmplat fără a deschide fiecare modul.

Ecran produs
Activitatea CRMFluxul de activitate interseaves chat, ticket, e-mail, webhook, conversie și evenimente anomalie cu filtre și paginare.Activitatea CRMspațiu de lucruEVENIMENTE2,804CUSTOMERS1,126ANOMALIES14VIE VIU AIRPACEDiscuția s-a rezolvat[email protected] · AIAcumBiletul a răspunsT-1048 · Facturarea4mEveniment de intraresubscription.upgraded12 mConversieOrdinea #7788 · £14919 m1FILTEREveniment și client2OPEN CONTEXTSari la înregistrare3PAGE RESULTSMenținerea unor anchete limitate
Fluxul de activitate interseaves chat, ticket, e-mail, webhook, conversie și evenimente anomalie cu filtre și paginare.

Filtru de tip eveniment, data, starea contactului sau a clientului (inclusiv clienții plătitori). Fluxul este un model citit al activității înregistrate; nu înlocuiește biletul sursă, conversația, acordul sau înregistrarea conectorilor. Deschideți înregistrarea legată înainte de a lua o acțiune sensibilă.

CRM

Fluxuri de lucru

Fluxurile de lucru răspund unui eveniment și execută o serie ordonată de acțiuni, inclusiv etapele întârziate reluate de cron.

Ecran produs
Fluxuri de lucruO rulare a fluxului de lucru arată declanșarea, acțiunile finalizate, întârzierea în așteptare și pasul următor.Fluxuri de lucruspațiu de lucruSUBSTANŢĂ9RUNNING42EȘUIT1VIE VIU AIRPACEDeclanşatorcontact.createdÎncepePasul 1Trimite e-mail de bun venitGata.ÎntârziereAşteaptă. 2 zileAşteptândPasul 2Creează o sarcină de vânzareÎnainte1CHOOSE TRIGGEREvenimentul începe alergarea2ORDER STEPSAcțiuni și întârzieri3MONITORReluați prin cron
O rulare a fluxului de lucru arată declanșarea, acțiunile finalizate, întârzierea în așteptare și pasul următor.

Creați un flux de lucru prin alegerea declanșatorului, adăugarea de pași în ordine și permițându-l. Întârzierile sunt stocate, nu deținute de o cerere de browser; cron unificat reia fluxurile de muncă datorate ruleaza.

Modelele de început construite includ bun venit după înscriere, post-achiziție mulțumire și confirmare demonstrativă. Clonați un șablon, înlocuiți destinatarii/contentul acestuia, apoi testați cu o înregistrare controlată înainte de activarea la scară largă.

Acțiunile de proiectare care trebuie să fie idepotente. O retrimitere nu trebuie să trimită cereri duplicate în mișcarea banilor sau să creeze înregistrări duplicate.

Sprijin

Bilete

Biletele sunt canalul de sprijin formal. Ei au departamente, priorităţi, ţinte SLA, ataşamente, note interne şi conversaţie completă filetare. Bilete pot sosi de la OpsIQ admin, formular de bilet/înmatriculare, ingestie prin e-mail, escaladare pe chat, conector sau API.

Bilete
Detaliile biletelorUn bilet cu meta sidebar (prioritate, departament, SLA, stare), firul conversatiei, si AI proiect si actiuni de rambursare.Biletulspațiu de lucruT-12345PrioritateRidicatDepartamentulFacturareaSLA3h 12m la stângaStareDeschideAm fost taxat de două ori pentruabonament pe iunie 3.AIConfirmat duplicatultaxa, procesarea restituirilor.Proiectul de răspuns al AIRestituirea1THREADEDConversație completă + note2SLA & ROUTINGPrioritate, dept, cronometre3AI DRAFTRăspunde scris pentru tine
Fiecare bilet are prioritate, departamentul, cronometrul SLA şi firul complet, iar AI poate redacta răspunsul pentru tine.

Cum curge un bilet

1
Biletul ajunge.

Un client trimite un mesaj prin e-mail, escaladarea chat-ului, înglobarea biletului sau adminul creează unul. Biletul primește un ID unic (de exemplu, T-12345).

2
Triaj

AI citește subiectul și corpul, atribuie prioritate (Low / Normal/High/Urgent), sugerează un departament, și detectează sentimente. Acest lucru se întâmplă automat în cazul în care triajul este activat.

3
Răspunde

Un agent deschide biletul, citeste contextul (profil clienti, date de platforma de la conectori, bilete anterioare) si scrie un raspuns. AI poate redacta raspunsul, iar agentul edita inainte de a trimite.

4
Închide

Când problema este rezolvată, agentul închide biletul. Clientul este notificat. Dacă clientul răspunde după închidere, biletul se redeschide automat.

Acțiuni pe bilet

Schimbare departament

Mutați biletul la un alt departament (de exemplu, de la General la Billing). Util atunci când ruta inițială a fost greșit.

Atribuiți agentului

Atribuiți biletul unui membru al echipei specifice. Agentul desemnat vede biletul în vederea lor "Biletele mele."

Adaugă notă internă

Scrie o notă vizibilă numai personalului. Utilizați pentru: constatări de investigație, motive de rambursare, context ingineresc, angajamente anterioare. Note interne nu apar niciodată clienților.

Combină biletele

Combină biletele duplicate de la același client. Subiectul biletului fuzionat primește o etichetă [MERGED]. Toate mesajele de pe ambele bilete sunt păstrate în biletul supraviețuitor.

Răspuns la conservă

Introduceți un șablon de răspuns prescris. Variabile ca: {{customer_name}} şi {{ticket_id}} sunt înlocuite automat.

Al rescrie

Permite AI îmbunătăţi proiectul de răspuns: ajusta ton, scurta / lungime, fixa gramatica, sau traduce. Ai revizui rezultatul înainte de a trimite.

Schimbă prioritatea

Setat la scăzut, Normal, ridicat, sau Urgent. Prioritatea afectează cronometrele SLA și ordine de sortare.

Modificare stare

Setat pentru a deschide, în așteptare, așteaptă pe client, rezolvate, sau închise.

Exemplu lucrat: manipularea unui client nefericit

E-mail client: "Am fost taxat de două ori pentru abonamentul meu"

Scenariu:
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.
Ce este de făcut:

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.

Secții

Creați departamente în Setări > Bilete > Departamente. Departamentele comune: General, Billing, Tehnic, Vânzări, Abuse, Onboarding. Fiecare departament poate avea diferite reguli de auto-replicare, cunoștințe AI și misiuni de echipă.

Răspunsurile la conserve

Creați șabloane reutilizabile de răspuns în Setări > Bilete > Răspunsuri confiscate. Răspunsurile la conserve bune includ:

Exemplu șablon de răspuns la conservă
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}}

Bilete de combinare

Când un client trimite aceeași întrebare de mai multe ori (prin e-mail și chat, sau două emailuri separate), puteți fuziona duplicatele. Du-te la bilet, faceți clic pe Merge, selectați celălalt bilet pentru a fuziona. Biletul supraviețuitor primește toate mesajele de la ambele bilete. Subiectul biletului fuzionat devine o etichetă [MERGED] pentru a indica că a fost combinat.

Platformele conectate urmează unirea. Atunci când biletele sunt, de asemenea, pe o platformă conectată (WHMCS, Zendesk, portalul client SaaS), unirea are loc si acolo: platforma isi contopeste copiile, astfel incat biletul pe care il pastrezi arata primul mesaj si raspunsuri ale biletului fuzionat. Un tichet unit care nu a fost niciodata pe acea platforma are conversatia adaugata la biletul de platforma pastrat ca nota personal privat, niciodata ca raspuns clientul este trimis prin e-mail WHMCS) fuzionează OpsIQ Bilete la fel.

Prioritate și SLA

Scăzut

Întrebări non-urgente, cereri de caracteristici, feedback general. Primul răspuns țintă: 24 ore.

Normal

Întrebări standard de suport. Primul răspuns țintă: 8 ore.

Ridicat

Impactul asupra afacerii clientului. Primul răspuns țintă: 4 ore.

Urgent

Serviciul a căzut, incident de securitate, pierderi de date, eroare de facturare. 1 oră.

SLA cronometrele încep atunci când biletul este creat și se întrerupe atunci când statutul este "Așteptarea pe Client." Dacă ținta SLA este omisă, biletul se evidențiază și opțional escaladat.

Pot clienţii să vadă notiţe interne?+

Niciodata. Notele interne sunt strict personal-doar. Ele nu apar in portalul de bilete pentru clienti, notificări e-mail sau orice suprafata fata de client.

Ce se întâmplă când un bilet închis este răspuns la?+

Biletul se redeschide automat şi revine la coada activă. Echipa este anunţată cu privire la noul răspuns.

Pot bloca un bilet pentru a preveni alte răspunsuri?+

Da. Utilizați opțiunea Lock Thread pentru a preveni atât client și AI de la adăugarea de noi răspunsuri. Utilitar pentru litigii rezolvate sau investigații închise.

Sprijin

Studioul de service: SLA, fluxul de stare și calitate

Camera de control pentru modul în care se comportă operaţiunea dumneavoastră de suport: politici SLA cu scări de escaladare, calendare de afaceri-oră, un flux de stare forţată, setările CSAT şi comutatoarele de caracteristici ale întreprinderii. Deschideţi-o din pagina Bilete (butonul Studio service în bara de operaţii).

Politicile SLA

Fiecare nou bilet devine un prim-replică și un termen limită de rezoluție din politica activă cea mai specifică: departamentul + prioritate bate departamentul, bate prioritatea, bate implicit. Termenele se oprește automat în timp ce un bilet stă în așteptare sau pe așteptare.

Scari de escalație

În loc de o singură acțiune de încălcare, o politică poate defini până la șase pași: de exemplu avertizează destinatarul la 75% al ferestrei, alertează managerii la _100%, reatribuie unui agent numit la ___150%. Fiecare pas se declanșează exact o dată pe tichet.

Programe de lucru și calendare

Cu orele de lucru pe, ceasurile SLA arde numai în timpul de lucru, astfel încât un bilet deschis vineri seara nu este încălcat până sâmbătă. calendare numite (zonă orară, zile, ore, vacanțe) pot fi atașate la politici individuale pentru echipe din diferite regiuni.

Fluxul stării

O matrice din/la care se restricționează ce modificări ale stării pot face administratorii, cu o presetare în stil Zendesk. Automatizarea, e-mailurile primite și răspunsurile la tichetele inițiate de clienți sunt întotdeauna scutite, astfel încât o matrice strictă nu poate bloca niciodată conducta.

Omologare

Agenţii solicită o aprobare pe un bilet (restituiri peste un prag, excepţii de politică). Un aprobator numit sau orice Administrator complet decide cu o notă; solicitanţii nu pot aproba propria cerere. În aşteptarea aprobării suprafaţei ca banner pe inbox.

Relaţiile de bilete

Link tickets as related, duplicy, parinte/copil or blocing; sharp replys out to a new linked ticket (the revers of union, without emailing the client); follow ticketes for in-apping notifications, and optionally CC fower e-mail adress on outbound readsponse.

Inbox și coliziuni în viață

Cu inbox-ul în timp real activat, biletele și răspunsurile noi apar pentru agenți în câteva secunde prin fluxul de notificare existent. Pe un bilet, agenții văd cine altcineva vede și obține un banner de avertizare atunci când un coechipier este deja scris un răspuns. Un buton one-click Reclaaming atribuie biletul la tine.

Traseu al IA

Regulile de rutină se pot potrivi cu semnalele de triaj AI: prioritate, categorie, sentiment și risc de escaladare, plus valorile de câmp personalizat tastat din formularul de cerere portal. Reguli care utilizează aceste condiții rămân inactive până când funcția este activată.

💡
Fiecare întreprindere de oprire a navelor. Pornirea unuia în Studioul de service → Calitate & Automatizare este opt-in; lăsându-le off păstrează comportamentul identic cu înainte de actualizare.
De ce poate un client să redeschidă încă un bilet închis când matricea mea interzice închiderea → deschisă?+

Matricea reglementează doar acțiunile ADMIN. Răspunsurile de origine client, răspunsurile prin e-mail și automatizarea sunt scutite în mod deliberat astfel încât o politică strictă nu poate bloca clienții sau sparge conducta.

Scările SLA înlocuiesc vechea acţiune de încălcare?+

Nu. Politicile salvate cu o singură acțiune de încălcare continuă să funcționeze neschimbat. O scară înlocuiește acțiunea unică numai pe politicile în care definiți pașii.

Sprijin

Biletul se completează automat și se escaladează

Auto-replica permite AI să răspundă automat la bilete noi. Escalation mută biletele către un alt departament atunci când AI detectează nevoile de specialitate. Ambele caracteristici lucrează pe bilete native și bilete create prin e-mail.

Replică automată
Răspuns automat la ticheteUn flux: bilet nou, o întârziere de două minute, AI răspunde din cunoștințe și context, apoi trimis sau salvat ca un proiect.Replică automatăspațiu de lucruCând soseşte un nou biletBilete noiorice sursăÎntârziere2 minAI răspundeKB + contextTrimissau proiectDacă un om răspunde în timpul întârzierii, răspunsul automat este anulat. Intenția poate escalada la un alt departament mai întâi.1DELAYOamenii au prima şansă.2AI REPLIESDin KB + context3OR ESCALATETraseu după intenție
Bilete noi obține o întârziere scurtă (astfel încât oamenii pot sari în), apoi un răspuns AI din cunoștințele dumneavoastră, trimis sau coadă ca un proiect.

Cum funcționează automat-reply

1
Biletul apare

Un nou bilet este creat din orice sursă (email, chat, portal, API).

2
Răspunsul programului

OpsIQ așteaptă întârzierea configurată (default: 2 Acest lucru oferă agenţilor umani şansa de a răspunde primii.

3
Primul răspuns câştigă.

Dacă un agent uman răspunde în timpul întârzierii, răspunsul automat este anulat. În caz contrar, AI generează un răspuns.

4
Generează și trimite

AI citeste biletul, verifica baza de cunostinte, context conector, si istoricul clientilor, apoi scrie un raspuns. Raspunsul este trimis (sau la coada ca proiect pentru revizuire, in functie de setarile).

Cum acţionează escaladarea

1
Configurează departamentele

Setați care departamente pot primi escaladate (de exemplu, Billing poate fi escaladată de la General, Tehnic poate fi crescută de la general).

2
Clasifică biletul.

Înainte de a răspunde automat, AI clasifică intenţia biletului: facturare, tehnică, rambursare, abuz etc.

3
Mutare dacă este necesar

Dacă intenţia biletului se potriveşte cu cea a unui departament de escaladare, biletul este mutat.

4
Generează în voce nouă

Răspunsul este generat prin intermediul cunoștințelor departamentului de destinație și al formării AI.

Referinţă setări

Replică automată activată

Porneşte pentru a activa răspunsul automat AI la bilete.

Departamente autorizate

Care departamente pot primi auto-replici. Începe cu departamentele cu risc scăzut (general, vânzări) înainte de a permite facturarea.

Întârziere

Cât de mult să aștepte înainte de răspunsurile AI (în secunde). Implicit: 120 secunde (2minute). Setat la0pentru răspunsuri instant.

Program de întârziere

Setați opțional întârzieri diferite pentru orele de lucru vs. după ore.

Oprește pe răspunsul admin

Dacă un agent uman răspunde primul, anulați automat-replicat. Implicit: on.

Escaladarea activată

Activați rutarea automată a departamentului bazată pe intenția de bilete.

Departamente de scalare

La care departamente pot fi escaladate biletele.

Starea de scalare

Ce stare trebuie stabilită atunci când se escaladează (de exemplu, Deschis, în așteptare).

Notă de scalare

Dacă să adăugați o notă internă care explică motivul escaladarea.

Bilete create prin e-mail

Biletele create din email (prin sondaj cutie poștală sau livrare MX-piped) urmează aceleași reguli de auto-replicare și escaladare. Răspunsul AI este trimis ca răspuns prin e-mail la client. Proiectele de e- mail merg la coada de schițe pentru revizuire, dacă este configurat.

Al va răspunde automat la întrebările de facturare?+

Doar dacă activați automat-reply pentru departamentul de facturare. Vă recomandăm să începeți cu auto-replica off pentru facturarea și permițându-l numai după ce ați instruit AI cu cunoștințe cuprinzătoare de facturarea si testate în detaliu.

Dacă AI dă un răspuns greşit?+

Dacă un client răspunde că răspunsul a fost greșit, un agent uman ar trebui să intervină. Revizuiți istoricul AI pentru a înțelege de ce AI a dat răspunsul greșit, apoi actualiza baza de cunoștințe sau formarea AI pentru ca aceasta să nu se întâmple din nou.

Pot să revizuiesc auto-replicaţiile înainte de a fi trimise?+

Da. Setează modul de livrare la "Draft" în loc de "Auto-trimite." Proiectele de răspuns automat vor apărea în coada de proiect pentru recenzia umană înainte de a trimite.

Sprijin

Portalul de bilete înglobat

Portalul de tichete înglobate vă permite să adăugați o interfață de gestionare a biletelor la orice site web. Clienții își pot vizualiza biletele, crea altele noi și răspunde, toate fără a intra în admin OpsIQ.

Cum funcţionează
Portalul de bilete înglobatUn portal de suport încorporat într-un site web care arată clientului propriile lor bilete și un buton nou-bilet.yoursite.com/supportCentru de sprijinBilete noiBILETE#1042 · Întrebare de rambursareDeschide#1038 · Ajutor pentru configurareRezolvat#1031 · Copie pe facturăÎn aşteptare1EMBEDAdaugă la orice site2SELF-SERVEClienţii îşi văd biletele.3NO LOGINIdentitate manipulată în siguranță
Portalul de bilete înglobat

Trei arome înglobate

Incorporat

Portalul are toată lăţimea containerului.

widget plutitor

Arată un buton plutitor care deschide portalul de bilete într-un panou. Similar cu un widget chat.

Autentificat

Necesită un semn de identitate semnat. Clienţii văd doar propriile lor bilete.

Instalare

Biletul și chat-ul sunt încorporate
<!-- 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.

Generarea de token-uri de identitate

Pentru modul autentificat, serverul dvs. semnează un jeton de scurtă durată cu secretul site-ului. Acest token spune OpsIQ cine este clientul astfel încât să vadă doar propriile lor bilete. Este un standard HS256 JWT: orice bibliotecă JW T funcționează. Secretul nu merge niciodată într-o pagină.

PHP · generare semn de identitate
<?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, generează un semn de identitate
// 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 });
}

Caracteristici Widget

Lista biletelor

O listă de căutare, filterizată. Un "Asteptare" scoate în evidență biletele echipa a răspuns.

Conversație filetată

Vedere completă de conversație cu text bogat, atașamente și marcaje temporale.

Proiect de economisire automată

Răspunsurile clienților sunt automat salvate, astfel încât acestea să nu-și piardă locul de muncă dacă navighează departe.

Sondaj live

Sondajele widget pentru noi răspunsuri fiecare ~12 secunde.

Rezolva / redeschide

Clienţii pot rezolva sau redeschide propriile bilete cu un singur clic.

Notiţele personalului intern nu sunt niciodată arătate clienţilor în biletul inclus. Aceasta este o limită de securitate dură.
Sprijin

& Citeşte în căsuță

Chat Inbox este locul unde echipa ta gestionează conversații live cu clienții. Acesta arată chat-uri active, conversații atribuite, discuții Al-handled și istorie arhivată.

& Citeşte în căsuță
& Citeşte în căsuțăUn inbox de chat cu trei agenţi: lista conversaţiilor, conversaţia live cu un jeton AI şi un panou de context vizitator/CRM.& Citeşte în căsuțăspațiu de lucruRONJane.Unde este comanda mea?MOMensahCity in Germanyîntrebare privind facturareaRTRita.AI manipulatUnde e comanda mea?Expediere astăzi · UPSAl proiect gataRăspunde...VIZITORJane Doe.SUA · Chrome3 ordine anterioareLTV$480CRMEtapa: Client1UNIFIEDFiecare chat live2CONTEXTVizitator + Panou CRM3AI ASSIST& Rescrie
Un inbox pentru fiecare chat live, lista conversațiilor, firul cu AI proiect pe robinet, și complet vizitator + context CRM.

Gestionarea conversațiilor

Conversații active

Conversaţii în curs de desfăşurare. Punct verde = client este tastarea sau recent activ.

Cu mâner AI

Conversaţiile în cazul în care AI răspunde. Puteţi prelua în orice moment, făcând clic pe "Alătură-te."

Mi-a fost încredinţată mie.

Conversaţii atribuite în mod special ţie.

Aşteptând

Conversaţii în care clientul aşteaptă un răspuns.

Arhiva

Conversații finalizate. Cautabil de cuvânt cheie, data și client.

Handoff de la AI la om

Când preiei o conversaţie de la AI, urmează aceste trei reguli:

1
Salută-l personal.

"Bună, sunt Sarah de la echipa de sprijin."

2
Contextul de referință

Arată-mi că citeşti conversaţia. "Văd că ai întrebat despre starea comenzii."

3
Stabiliţi aşteptări

Spune-i clientului ce se întâmplă în continuare. "Mă uit în acest moment și va avea un răspuns pentru tine în câteva minute."

Comutarea AI on/off per conversație

Utilizaţi AI comuta la partea de sus a fiecărei conversaţii. Când AI este pe, AI generează răspunsuri. Atunci când oprit, numai agenţii umani pot răspunde. Al îşi aminteşte contextul conversaţiei chiar şi atunci când oprite şi înapoi pe.

Modul de plecare / din ore

Configurați orele de lucru în Setări. În afara orelor de activitate, AI poate: (1) Continuaţi să răspundeţi clienţilor (2) Arată un mesaj "departe" și creează un bilet pentru follow-up sau (3) Dezactivați complet chat-ul și arătați formularul de bilet. Alegeți comportamentul care se potrivește modelului dvs. suport.

Manipularea conversațiilor dure

1
Stai calm

Nu se potrivesc cu intensitatea emoţională a clientului. Recunoaşte frustrarea lor fără să fie defensive.

2
Colectează fapte

Înainte de a răspunde, adunați informațiile relevante: detalii privind comanda, starea contului, biletele anterioare.

3
Escalată devreme

Dacă situaţia implică restituiri, ameninţări legale, abuzuri sau securitate, se îndreaptă spre un membru al echipei superioare în loc să încerce să facă faţă situaţiei de unul singur.

Pot avea echipa de chat (agent la agent)?+

Da. Utilizați note interne în cadrul unei conversații pentru a comunica cu alți agenți. Aceste note nu sunt niciodată vizibile pentru client.

Ce se întâmplă când închid o discuţie?+

Conversația se mută la Arhivă. Dacă clientul trimite un mesaj nou mai târziu, este creată o nouă conversație.

Sprijin

Canale de mesagerie

Conectați WhatsApp, Facebook Messenger, Instagram DM, Telegram și LINE astfel încât clienții de mesaje să vă trimită deja ajunge în aceeași inbox ca chat-ul site-ului dvs., răspuns de același asistent AI.

Fiecare canal se comportă identic odată conectat: un mesaj al clientului devine o conversație în chat Inbox, asistentul AI răspunde folosind aceleași cunoștințe și instrucțiuni ca și chatul site-ului dvs., și orice agent poate prelua. Nimic despre AI-ul tău nu are nevoie de configurare pe canal.

Cum arată legătura

Messenger & Instagram Facebook

Un singur click. Deschideți Conectori → Facebook Messenger & Instagram DM, faceți clic pe Conectare, conectați-vă cu contul de Facebook care vă administrează pagina și selectați pagina. Instagrama vine cu ea atunci când pagina are un cont profesional Instagrame conectat.

WhatsApp

Un clic în cazul în care furnizorul dvs. oferă: deschideţi conectorul Messaging Hub şi utilizaţi Connect WhatsApp, apoi urmaţi ghidat de Meta de a alege sau crea numărul dumneavoastră WhatsApp Business. În caz contrar, lipi acreditările din oricare dintre Gaateway-uri 20.

Telegramă

Mesaj @BotFather in Telegram, trimite/newbot,alegeți un nume și un nume de utilizator care se termină în "bot" și lipiți jetonul pe care îl introduceți în conectorul Telegram.OpsIQÎnregistrează webhook-ul pentru tine.

LINE

Creaţi un mesaj API canal la dezvoltatori.line.biz, lipi secretul Canalului și token de acces, apoi copiați webhook URL au fost prezentate în OpsIQ în Linie și să-și schimbe propriile autoreplică off.

SMS

Adăugaţi un furnizor (Twilio, Vonage, Termii şi alţii) în The Messaging Hub cu acreditarea şi numărul expeditorului.

Fiecare conector prezintă propriile instrucțiuni pas cu pas în interiorul sertarului, inclusiv exact ceea ce pentru a copia și unde. Nu aveți nevoie de acreditări dezvoltator pentru opțiunile un-click.

Pornesc un canal

Conectarea unui canal nu-l porneşte. Configurări → Client Chat → Avansat → Canale de mesagerie, comuta pe comutatorul principal și apoi canalul individual. Fiecare canal are propriul său buton de răspuns automat AI, astfel încât să puteți pilota pe unul înainte de a deschide restul.

1
Conectează canalul

În Conectori, folosind instrucțiunile din sertarul conectorului.

2
Testați conexiunea

Faceți clic pe Test. Acesta face un apel real la furnizor și vă spune ce este greșit dacă ceva este.

3
Activează canalele de mesagerie

Configurări→Client Chat→Porneşte întrerupătorul principal, apoi canalul.

4
Trimite-ţi un mesaj.

Dintr-un alt cont, mesaj pagina ta, număr sau bot. Acesta ar trebui să apară în Chat Inbox în câteva secunde și de a obține un răspuns AI.

Răspunde la ferestre

Platformele de mesagerie limitează durata în care o afacere poate răspunde după ce un client scrie. OpsIQ arată timpul rămas pe fiecare conversație și aplică regula pentru tine.

WhatsApp

24 ore de la ultimul mesaj al clientului. După aceea, puteți trimite doar un șablon aprobat, pe care îl configurați în aceeași filă avansată.

Messenger & Instagram

24ore pentru răspunsuri normale; agenții pot răspunde până la7zile mai târziu, sub alocaţia de agent uman a lui Meta.

Telegramă, LINE, SMS

Nu există ferestre cu platformă.

⚠️
Dacă răspunsul nu reușește deoarece fereastra închisă, conversația arată de ce. Aceasta este o regulă a platformei, nu o limită OpsIQ.

Întrebări frecvente

Clienţii văd că un răspuns AI?+

Numai dacă le spui. Răspunsul vine de la pagina ta, numărul sau robot exact ca un răspuns uman ar fi. Instrucțiunile AI controlează tonul și dacă se identifică.

Poate un agent să preia conversaţia?+

Da. Deschide conversația în chat Inbox și faceți clic pe Join. AI se oprește, tastați, iar clientul vede un fir continuu de pe partea lor.

Dacă deconectez un canal?+

Utilizați Deconectați pe conector. Istoria mesajului este păstrat; mesaje noi pur și simplu opri sosirea, iar platforma se spune să nu le mai trimită.

Pot două spaţii de lucru să folosească aceeaşi pagină de Facebook?+

Nu. O pagină aparţine unui spaţiu de lucru la un moment dat. Conectarea acestuia în altă parte îl mută, iar primul spaţiu funcţional nu mai primeşte mesaje, aşa că deconectaţi-vă intenţionat decât să reconectaţi în altă direcţie.

Sprijin

Conversații reale de chat

Aceste exemple arată cum un client bine instruit AI ar trebui să se ocupe de scenarii comune. Utilizați-le pentru a testa formarea AI și identificarea lacunelor.

10 exemple de conversație

1_. Returnarea clientului întreabă despre comandă

Scenariu:
Client: Bună, am plasat o comandă3Acum câteva zile şi nu am primit încă nici o notificare de transport maritim.5523.
Ce este de făcut:

AI ar trebui: (1) Cauta comanda #ORD-5523 prin conector. (2) Raportaţi starea actuală şi informaţiile de urmărire dacă sunt disponibile. (3) În cazul în care ordinul este amânat, se confirmă întârzierea și se furnizează un calendar estimat. (4) NU inventaţi un statut de transport maritim dacă conectorul nu are unul.

2_. Perspectiva întrebând despre tarifare

Scenariu:
Client: Cât costă planul tău de Pro? Oferi facturare anuală?
Ce este de făcut:

AI ar trebui: (1) Răspuns din baza de cunoștințe cu prețuri curente. (2) Explicaţi diferenţa dintre facturarea lunară şi cea anuală. (3) Dacă răspunsul nu este în baza de cunoștințe, spuneți și oferiți-vă să le conectați cu vânzările. (4) NU inventa prețuri care nu se află în baza de cunoștințe.

3_. Restituire a clientului furios

Scenariu:
Client: Acest lucru este ridicol! Produsul dvs. nu funcționează și vreau banii înapoi ACUM.
Ce este de făcut:

AI ar trebui: (1) Recunoaşteţi cu calm frustrarea. (2) Cere numărul de ordine sau e-mailul contului. (3) Explică procesul de rambursare. (4) Crearea unui bilet de sprijin sau escaladarea la un agent uman. (5) NU promite o rambursare, care necesită aprobarea umană.

4_. Dublu caz de facturare margine

Scenariu:
Client: Am fost taxat de două ori luna aceasta. Banca mea arată două taxe de $29.99.
Ce este de făcut:

AI ar trebui: (1) Confirmă îngrijorarea. (2) Colecta detaliile relevante (e-mail, date de taxe). (3) Explică că problemele legate de facturare necesită o revizuire umană. (4) Creați un bilet la departamentul de facturare cu detalii. (5) Stabilește prioritatea către High.

5. Client în mai multe limbi

Scenariu:
Bonjour, je voudrais savoir si vous livrez en France?
Ce este de făcut:

AI ar trebui: (1) Răspundeţi în limba clientului dacă această limbă este acceptată. (2) Răspundeţi la întrebarea despre livrarea către Franţa din baza de cunoştinţe. (3) Dacă limba nu este susținută, răspundeți în limba implicită și menționați care limbi sunt disponibile.

6. Conversație după ore

Scenariu:
Client: Alo, e cineva acolo? Am nevoie de ajutor cu contul meu.
Ce este de făcut:

AI ar trebui: (1) Dacă sunt configurate pentru AI după ore, răspundeți și asistați. (2) Dacă după program creează bilete, spune: "Echipa noastră este în prezent offline. Am creat un bilet de sprijin pentru tine și cineva va urmări în timpul orelor de lucru." (3) Specificați numărul biletului.

7_. Cumpărător de comparaţii pre-achiziţie

Scenariu:
Client: Cum se compară produsul dumneavoastră cu [Competitor X]?
Ce este de făcut:

AI ar trebui: (1) Descrieți punctele forte ale produsului în fapt. (2) Nu vorbi urât concurentul. (3) Dacă există o pagină de comparaţie în baza de cunoştinţe, link-ul la ea. (4) Dacă clientul întreabă despre caracteristicile pe care nu le ai, fii sincer.

8_. Clientul vrea o recomandare

Scenariu:
Client: Am un magazin online mic cu aproximativ 100 comenzi pe lună. Ce plan este potrivit pentru mine?
Ce este de făcut:

AI ar trebui: (1) Pune întrebări clare dacă este necesar (de exemplu, ce caracteristici contează cel mai mult). (2) Recomandă un plan bazat pe baza de cunoștințe. (3) Explicaţi de ce acest plan corespunde nevoilor lor. (4) Menționați că pot începe cu un plan mai mic și o actualizare ulterioară.

9_. Clientul încearcă să obțină o reducere neautorizată

Scenariu:
Client: Am văzut online că vă dau 50% discount. Pot avea unul?
Ce este de făcut:

AI ar trebui: (1) Explică politicos promoțiile actuale, dacă există. (2) NU creați sau promiteți reduceri care nu sunt în baza de cunoștințe. (3Dacă clientul persistă, oferă-le să se conecteze cu echipa de vânzări.

10_. Clientul are nevoie de ajutor cu o caracteristică

Scenariu:
Client: Cum export datele mele? Nu găsesc butonul de export.
Ce este de făcut:

AI ar trebui: (1) Furnizarea de instrucțiuni pas cu pas din baza de cunoștințe. (2) Includeţi traseul paginii exacte şi locaţia butonului. (3) În cazul în care caracteristica necesită un plan specific, menţionaţi acest lucru (4) În cazul în care caracteristica nu există, fiți sinceri și sugerați alternative.

Sprijin

Traiectorie și escaladare de discuții

Când o conversație live are nevoie de o persoană reală, AI răspunde la două întrebări: care echipa deține această conversație și cine ar trebui să fie spus. Ambele sunt configurate în Setări, Client Chat, Suport Flow, sub departamentele de rutare AI.

Alegerea departamentelor pe care AI le poate folosi

Cele două cutii de pe acel panou sunt o listă albă. Departamentele mutate în dreapta sunt singurele AI pot ruta sau deschide biletele inch Orice stânga este invizibil pentru ea, chiar dacă departamentul există și este personal. Începeți să îngust și adăugați departamente ca personalul lor.

💡
În cazul în care nici un departament este activat la toate, OpsIQ se încadrează înapoi la rutare moștenitoare în fiecare departament pe care îl poate găsi. Tratează asta ca o plasă de siguranță, nu o alegere de configurare.

Cine primeşte escaladarea

Aceasta este partea pe care majoritatea oamenilor se așteaptă să configurați și nu au nevoie să. Când AI escaladează un chat, OpsIQ e-mailuri oamenii atașați la acel departament. Te descurci că lista o dată, pe pagina de echipe și departamente, și atât creșterea biletelor și escaladarea chat-ului urmați-o.

Membrii echipei departamentului

Fiecare administrator activ atașat la departamentul primește propria copie. Conturile suspendate și cu handicap sunt omise.

Admin primar

Folosit atunci când nu sunt atașați membri ai echipei, astfel încât o escaladare încă ajunge la cineva.

Nimeni nu e ataşat

Nu este posibil. Panoul de rutare marchează că departamentul în roșu și AI nu spune vizitatorului un om a fost notificat.

⚠️
Adresa de e-mail proprie a unui departament nu este niciodată în mod deliberat folosit ca destinatar. Această adresă este departamentului de intrare bilet de mail, o intrare mail este potrivit împotriva pentru a deschide bilete. O escaladare trimis ar fi înapoi ca un nou bilet, mai degrabă decât ajunge la o persoană.

Departamentul de captură-toate

Exact un departament poartă marca de captură-toate. Acesta primește chat-uri AI nu a putut loc cu încredere, și este o ultimă soluție mai degrabă decât calea normală.

1
Semnale clare câştigă.

Formularea facturii merge la departamentul de facturare, găzduirea și formularea erorilor către una tehnică, cumpărarea textului către vânzări.

2
Clasificatorul AI încearcă să-l facă.

Dacă cuvintele cheie sunt neconcludente, modelul citește conversația și alege din departamentele activate.

3
Apoi, captura-toate

Numai când ambele vin goale nu Catch-toate departamentul primi chat.

4
Paznicul de vânzări.

Dacă tot ce este prins este un departament de vânzări și vizitatorul nu a arătat nici un semnal de cumpărare, OpsIQ caută un suport sau departamentul tehnic în schimb, astfel încât întrebările obișnuite de sprijin nu se acumulează în Vânzări.

Ce i se spune vizitatorilor

Dacă e-mailul de escaladare se stinge, AI spune vizitatorului că echipa a fost notificată. Dacă nu poate ieşi afară, AI-ul spune ceva cinstit şi îi invită să lase mesajul în discuţie în schimb. Nu va pretinde că un om a fost alertat când nu a fost trimis niciun email.

Panoul spune "Nimeni nu trebuie anunţat" pentru un departament.+

Nimeni nu este atașat la ea. Deschideți Echipa și departamentele, atașați cel puțin un admin activ, apoi reîncărcați pagina de setări. Panoul citește live.

Pot escaladarea discuţiilor să meargă altundeva decât echipa?+

Da. O adresă personalizată salvată anterior pentru un departament încă suprascrie lista de echipă. Noile setări ar trebui să atașeze oamenii la departamentul în schimb, astfel încât există un singur loc pentru a menține.

De ce a fost meu catch-toate sărit?+

Verificați dacă este un departament de vânzări. Dacă este, iar vizitatorul nu a arătat nici un semnal de cumpărare, OpsIQ rute către un serviciu de sprijin sau tehnic pe scop.

Sprijin

Cutii poștale și schițe de e-mail

OpsIQ se pot conecta la e-mail căsuțe poștale pentru a crea automat bilete de pe emailul primit și a trimite răspunsuri ca email. De asemenea, oferă răspunsuri AI-drafted pentru recenzie umană.

E-mail
E-mail către biletUn IMAP cutie poștală pe stânga alimentarea e-mailuri primite într-un bilet filetat cu un răspuns AI-drafted pe dreapta.E-mailspațiu de lucru[email protected] · IMAPCerere de rambursare[email protected]Nu pot să mă loghez[email protected]Copie pe factură[email protected]Biletul #1042de la email · FacturareAş dori o rambursare pentruîncărcare duplicată...Proiect de AIRevizuire și răspuns trimis1INGESTIMAP & expediere în2TO TICKETSFire automate3AI DRAFTSRăspunsuri pentru reexaminare
Trageți e-mail peste IMAP (sau de expediere), transforma fiecare într-un bilet filetat, și lăsați AI proiecta răspunsul pentru revizuire.

Conectarea unei căsuţe poştale

Protocolul

IMAP (majoritatea furnizorilor), Gmail API (Google Workspace) sau Microsoft Graph (Outlook) 365).

Configurări necesare

Gazdă, port, criptare (SSL/TLS), nume de utilizator, parolă sau parola aplicației, folder (de obicei INBOX).

Maparea departamentului

Harta cutia poștală la un departament de bilete. E-mailuri la [email protected] crearea de bilete în departamentul "Suport."

Configurare Gmail (pas cu pas)

1
Activează verificarea 2-Pași

Du-te la Contul Google > Securitate > 2-Step Verificare și permiteți acest lucru.

2
Creează o parolă aplicație

Du-te la Contul Google > Securitate > Parolele aplicației. Selectați "Mail" și "Alte (OpsIQ)." Copiere 16- Parola de caracter.

3
Intră. OpsIQ

Du-te la e-mail > Mailboxes > Adăugare. Set gazdă: imap.gmail.com, port: 993, criptare: SSL, nume de utilizator: [email protected] Parola: parola aplicației.

4
Test

Faceți clic pe Test Connection. Dacă de succes, OpsIQ va începe sondaje pentru noi e-mailuri la intervalul configurat.

Outlook 365 configurare

1
Verificați IMAP este activat

În setările Outlook > Mail > Sync e-mail, asigurați-vă că IMAP este activat.

2
Folosește parola aplicației sau auth modern

Dacă MAE este activat, creați o parolă de aplicație. Altfel, utilizați parola dvs. obișnuită.

3
Intră. OpsIQ

Gazda: outlook.office365.com, port: 993, criptare: SSL, nume de utilizator: [email protected].

cPanel configurarea de webmail

1
Caută IMAP setările

În cPanel > Conturi de e-mail, faceți clic pe contul dvs. de email pentru IMAP Setări.

2
Intră. OpsIQ

Gazdă: de obicei mail.yourdomain.com sau numele gazdei serverului, port: 993 (SSL) sau 143 (STARTTLS), nume de utilizator: adresa completă de e-mail.

Proiecte de e-mail AI

Atunci când se stabilește un răspuns automat la modul "Draft," AI generează proiecte de răspuns care apar în coada de proiect. Puteți:

Revizuire

Citiţi proiectul şi verificaţi dacă este exactă.

Editare

Se modifică textul, tonul sau conținutul înainte de a fi trimis.

Trimite

Aproba proiectul și trimite-l ca un răspuns prin e-mail.

Aruncaţi

Se elimină proiectul dacă nu este adecvat.

Trimitere automată

Dacă încrederea este suficient de mare și se activează automat, după o întârziere configurabilă se trimit automat schițe.

De ce nu sunt convertite e-mailurile la bilete?+

Verificare: (1) Este cutia poștală conectată și sănătoasă? Cautați starea verde în e-mail > Mailboxes. (2) Este loc de muncă Cron rulează? Sondaj e-mail necesită cron. (3) Este filtrat sau mutat e-mailul într-un alt dosar decât INBOX?

Pot folosi mai multe cutii poştale?+

Fiecare cutie poştală poate fi cartografiată unui alt departament. [email protected] merge la Suport, [email protected] merge la Billing.

Sprijin

Satisfacția clienților (CSAT)

CSAT măsoară satisfacţia biletelor şi a chat-ului, suprafeţează răspunsuri nefericite şi compară rezultatele AI cu cele umane.

Ecran produs
Satisfacţia clienţilorPagina CSAT combină scorul de cărți, follow-up detractor, comentarii, department și agenții de defalcare, și feedback-ul chat.Satisfacţia clienţilorspațiu de lucruRĂSPUNSURI386AVERAGE4.6POSITIVE91%VIE VIU AIRPACEUrmărire detractor12 răspunsuri evaluate1–2RevizuireAnchete privind bileteleTrimis 24h după închidereAutomatReacție la discuțiiAI 4.5 · Umană 4.7ComparăViziune agentNumăr scor şi răspunsDle antrenor...1WATCH AVERAGETendință de utilizare, nu un scor2FOLLOW DETRACTORSCitiţi comentariul3COMPARE FAIRLYAI și om
Pagina CSAT combină scorul de cărți, follow-up detractor, comentarii, department și agenții de defalcare, și feedback-ul chat.

Anchetele privind biletele sunt programate după închidere (în mod normal 24 Ore mai târziu). Un răspuns pozitiv este un scor de4sau 5. Utilizați coada de detractor pentru scoruri de 1 sau2și citiți biletul/conversația înainte de a contacta clientul.

Reacţiile la discuţii sunt raportate separat pentru conversaţiile cu AI rezolvate şi manipulate de om. Marimile mici ale eşantionului nu trebuie folosite pentru a clasifica agenţi sau modele.

Sprijin

E-mailuri de echipă

Pagina Platformei de Email permite unui operator autorizat să trimită un mesaj o singură dată tuturor agenților activi, agenților selectați sau unui departament și să trimită istoria.

Ecran produs
Platformă de e-mailCompozitorul de e-mail al echipei prezintă publicul, subiectul, mesajul și istoricul de livrare trecut.Platformă de e-mailspațiu de lucruRECIPIENŢII12DELIVERED11EȘUIT1VIE VIU AIRPACEPubliculToți agenții activiSelectatSubiectIulie suport rotaGata.MesajNote de programare și escaladareGata.IstoricEmisiunile anterioare și rezultatulVizualizare1CHOOSE PEOPLEToate, selectate sau echipa2WRITE CLEARLYSubiect și mesaj3REVIEW HISTORYConfirmă rezultatul
Compozitorul de e-mail al echipei prezintă publicul, subiectul, mesajul și istoricul de livrare trecut.

Această pagină este pentru mesajele operaționale interne, nu de marketing client. Alege cel mai mic public corect, nume previzualizare și adrese, apoi trimite. Livrarea utilizează calea de e-mail outbound configurat și înregistrează rezultatul.

Sprijin

Casete poștale, livrare și e-mail de intrare

Configurează cum OpsIQ trimite e-mail, transformă mesajele în bilete și dovedește că domeniul de trimitere este gata.

Ecran produs
Configurări e- mailSetările de e-mail combină rutarea outbound, De la identitate, ingerarea cutiei poștale, controale de livrare și e- mail test.Configurări e- mailspațiu de lucruOUTBOUNDSMTPMAILBOXES3DOMENIULPaseazăVIE VIU AIRPACEConector preferatSMTP _Conector furnizorConfiguratDin identitateSupport <[email protected]>Gata.IMAP căsuța poștală[email protected]· INBOXSondajDivulgareSPF · DKIM · DMARCPasează1CHOOSE OUTBOUNDConector sau SMTP2CONNECT INBOXIMAP sau țeavă3ÎNCERCARETrimite și verifică
Setările de e-mail combină rutarea outbound, De la identitate, ingerarea cutiei poștale, controale de livrare și e- mail test.

E-mail de ieșire

Administratorii completi pot alege conectorul de e-mail preferat; OpsIQ cade înapoi la configurat SMTP Livrare prin poştă, dacă este cazul. Setaţi o confirmare din numele/adresa, trimiteţi un test şi verificaţi 24-cifrele de succes/reuşite.

Cutii poștale

Un IMAP cutia poștală are nevoie de un nume, adresa de e-mail, departamentul țintă, gazdă, port, modul de securitate, numele de utilizator, parola, folder, starea de votare și opțiunea de validare a certificatelor. Sondaj acum pentru a verifica ingerarea înainte de a aștepta cron.

Tuburi instantanee

Pe același server, o conductă de mail poate trece direct mesajul RFC822. Un server de e-mail la distanță poate posta mesajul brut pentru obiectivul de intrare protejat folosind jetonul său. Ambele căi intră în aceeași conducta de deducție, filetare și rutare bilete.

Divulgare

Verificarea SPF/DKIM/DMARC este o dovadă consultativă pentru configurarea din domeniu. O verificare verde nu garantează plasarea în căsuță, dar trebuie să se stabilească un eșec înainte de trimiterea mesajelor de producție.

Sprijin

Suport Portal Studio

Suport Portal Studio designuri și publică experiența de suport cu vedere la client fără a necesita active externe imagine.

Ecran produs
Suport Portal StudioPortal Studio arată o previzualizare receptivă alături de temă, navigare, cunoștințe, bilet, asistent, formă, subsol și CSS controale.Suport Portal Studiospațiu de lucruTEMPLATEModernPREVĂZUTBirouSTATProiectVIE VIU AIRPACETematicăCulori și tipografie de marcăEditareNavigareCunoastere, bilete, asistentEditareFormularul de bileteCâmpuri, rute și copiiEditarePublicăValidarea și face să trăiascăRevizuire1CHOOSE TEMPLATEÎncepeți de la structură2PREVIEW SIZESDesktop către mobil3PUBLISH SAFELYRevizuire apoi eliberare
Portal Studio arată o previzualizare receptivă alături de temă, navigare, cunoștințe, bilet, asistent, formă, subsol și CSS controale.

Utilizați șablonul ca punct de plecare, apoi configurați tema, aspectul, navigarea, căutarea cunoștințelor, formularul biletului, asistentul, subsolul, marca, comportamentul biletelor, personalizat CSS și setările generale. Previzualizați biroul, tableta și mobilul înainte de publicare.

Sprijin

Lipsa de cunoștințe

Coada de cunoștințe-gap colectează întrebări client AI nu a putut răspunde cu încredere, astfel încât echipa poate îmbunătăți acoperirea.

Ecran produs
Lipsa de cunoștințeRândurile cozii de la pauza de decalaj au ratat sau au scăzut încrederea în întrebări și urmări dacă echipa le-a rezolvat.Lipsa de cunoștințespațiu de lucruOPEN GAPS28REPEATED9RESOLVED116VIE VIU AIRPACELimite de migrațieÎntrebat 14 timpiRidicatSuport pentru weekendÎntrebat 8 timpiMediuRestituirea calendaruluiÎntrebat 6 timpiMediuAPI regiuneÎntrebat 3 timpiScăzut1REVIEW QUESTIONA se vedea contextul conversației2CHOOSE FIXArticolul sau prompt3RESOLVEVerificaţi următorul răspuns
Rândurile cozii de la pauza de decalaj au ratat sau au scăzut încrederea în întrebări și urmări dacă echipa le-a rezolvat.

Deschide un decalaj pentru a citi întrebarea originală și conversația din apropiere, apoi alege fixa dreapta: actualizarea unui articol existent, crearea unui nou articol de cunoștințe, adăugați un fapt de afaceri, corect datele conectorului sau instrucțiunile de schimbare. Marchați-l rezolvat numai după o evaluare sau test real întoarce un răspuns acceptabil.

Sprijin

Administrarea paginii de stare

Pagina de administrare a statutului comunică servicii medicale și incidente folosind componente, stări curente și actualizări.

Ecran produs
Administrarea stăriiAdministraţia de Stat enumeră componentele şi incidentele astfel încât operatorii să poată publica informaţii clare, cu data stabilită.Administrarea stăriispațiu de lucruOVERALLOperaționalCOMPONENTE7INCIDENTS1VIE VIU AIRPACESite webOperaționalVerdeAPIPerformanță degradatăPriveşte.Ingestia de e-mailOperaționalVerdeIncidentul curentAPI investigaţia de latenţăDeschide1UPDATE COMPONENTAlege starea clară2POST INCIDENTActualizări cu timbru temporal3RESOLVEÎnchide cu rezumat
Administraţia de Stat enumeră componentele şi incidentele astfel încât operatorii să poată publica informaţii clare, cu data stabilită.

Utilizați statele componente în mod consecvent. Atunci când un incident afectează clienții, publică o notificare inițială, adaugă actualizări cu timbru de timp ca modificări ale faptelor și închideți cu un rezumat concis al rezoluției. Nu utilizați pagina de stare ca jurnal intern de depanare; diagnostice sensibile aparțin în OpsIQ și jurnalele serverului.

AI

Pregăteşte-ţi IA-ul.

Configurația AI este locul unde alegeți furnizorul, modelul și controlul costurilor. OpsIQ susţine mai mulţi furnizori: Claude (Anthropic), GPT- 4o (OpenAI), Gemini (Google) și Grok (xAI). Puteți utiliza propriul dvs. API cheie (BYOK) sau administrat AI, dacă este disponibil în planul dumneavoastră.

Configurați AI
Configurație AIUn panou de setări AI: un sistem managerial / BYOK provider comuta, un selector model și un contor lunar pentru buget-beneficiar.Configurație AIspațiu de lucruConfigurație AIFurnizorAI GestionatCheia dumneavoastră (BYOK)Modelclaude · echilibratBugetul lunar al AI62%1TWO MODESGestionat AI sau BYOK2PICK A MODELViteza vs adâncime3BUDGETSCapse de jeton și controlul costurilor
Alege AI administrat sau propria ta cheie, alege un model pentru viteza vs adâncime, și capac petrece lunar cu un buget jeton.

Alegerea unui furnizor

Claude (Anthropic)

Raţionament puternic, atent cu faptele, bun la urmatoarele instructiuni complexe. Modele: claude-sonnet4-20250514 Claude...3.5 Cel mai bun pentru: conversații de sprijin, întrebări tehnice, analiză detaliată.

GPT-4o (OpenAI)

Cunoștințe generale rapide, creative și bune. Modele: gpt-4o, gpt-4o-mini. Cel mai bun pentru: răspunsuri rapide, scriere creativă, întrebări largi despre cunoaștere.

Gemini (Google)

Bun la întrebări de fapt, suport multi-limbă. Modele:gemini-2.0- Flash,gemini-1.5 Cel mai bun pentru: suport multi-limbă, cautari faptice.

Galben (xAI)

Răspunsuri rapide, concise. Modele: scârţâit-3Cel mai bun pentru: răspunsuri rapide, ton ocazional.

BYOK vs AI administrat

BYOK (Adu-ţi propria ta cheie)

Vă oferiți propria ta cheie API de la furnizor. Plătești direct furnizorul. Control complet asupra selecției și utilizării modelului.

AI Gestionat

AI este furnizat ca parte a dumneavoastră OpsIQ Nu. API Cheia necesară. Utilizarea este măsurată în raport cu soldul de credit AI al planului dumneavoastră.

Configurare pas cu pas

1
Du-te la configurare AI

În OpsIQ admin, naviga la Setări > Configurare AI.

2
Selectează furnizorul

Alege furnizorul AI de la scadere.

3
Intră API cheie

Dacă utilizaţi BYOK, introduceți dumneavoastră API Cheie. Pentru AI administrat, acest lucru este manipulat automat.

4
Alege modelul

Selectaţi modelul specific de utilizat. Modele mai mici sunt mai rapide şi mai ieftine. Modelele mai mari oferă răspunsuri mai bune calitate.

5
Conexiune de încercare

Faceți clic pe "Test Connection" pentru a verifica API Cheia şi modelul funcţionează. Un semn verde înseamnă succes.

6
Salvează

Faceţi clic pe Salvare pentru a activa configuraţia AI.

Controalele costurilor

Bugetul lunar

Setează o cheltuială lunară maximă pe jetoane AI. Când bugetul este atins, AI prezintă degradări graţioase (răspunsuri mai scurte, fără răspuns automat) decât oprirea completă.

Limita de perconversie a jetonului

Jetoane maxime pentru fiecare conversație unică. Impiedica conversațiile fugare de la consumul de credite excesive.

Alertă de echilibru scăzut

Atunci când soldul creditului AI scade sub prag (default: 50,000 tokens), apare un avertisment în admin. Setați acest lucru în configurarea AI.

Configurație per-spațiu de lucru

Configuraţia AI este per-workspace. Dacă gestionaţi mai multe situri, fiecare spaţiu de lucru poate utiliza un alt furnizor, model şi buget. Spaţiul de lucru moşteneşte implicituri globale dacă nu sunt supraîncărcate. Pentru a configura pe spaţiu: trece la spaţiul funcţional, apoi du-te la configurarea AI şi salva setările acolo.

Noţiuni de bază API Chei

Anthropic (Claude)

Du-te la console.anthropic.com > API Chei > Creați cheie. Copiați cheia începând cu "sk-ant."

OpenAI (GPT)

Du-te la platform.openai.com > API Chei > Creați o nouă cheie secretă. Copiați cheia începând cu "sk-."

Google (Gemini)

Du-te la aistudio.google.com > Obține API Cheie. Creați o cheie pentru proiectul dumneavoastră. Copiați cheia.

xAI (Grecia)

Du-te la console.x.ai > API Crează şi copiază-ţi cheia.

Testarea configuraţiei AI

Scenariu:
După introducerea tastei API, faceți clic pe "Test Connection." Ar trebui să vedeți un semn de verificare verde și un răspuns de probă din AI.
Ce este de făcut:

Dacă testul nu reușește: (1) Verificaţi dacă API Cheia este corectă (fără spaţii suplimentare). (2) Verificați dacă contul dvs. a fost facturat cu furnizorul. (3) Verificați dacă numele modelului este valabil. (4) În cazul în care utilizaţi Managemented AI, verificaţi licenţa dumneavoastră este activ.

Care furnizor este cel mai bun?+

Claude este excelent pentru conversații de suport. GPT-4o este rapid și versatil. Gemini se ocupă bine de mai multe limbi. Încercați fiecare dintre acestea și a vedea care produce cele mai bune rezultate pentru cazul dumneavoastră specific de utilizare.

Pot schimba furnizorii mai târziu?+

Da. Schimba furnizorul și API cheie în orice moment. Istoria conversației existente este păstrată. AI va utiliza noul furnizor pentru toate viitoarele conversații.

Ce se întâmplă când rămân fără credite?+

AI degradează graţios: răspunsurile devin mai scurte, pauzele cu replică automată şi adminul prezintă un avertisment de echilibru scăzut. Urmărirea miezului, biletele şi CRM continuă să lucreze fără IA.

AI

Conversaţii mai inteligente şi mai ieftine ale clienţilor

Un set de controale opt-in care face chat-ul clientului dvs. fie mai inteligent (motive pe contul unui client ca un agent uman) sau mai ieftin (trimite AI mai puțin, sau răspunsuri în mai puțini pași). Fiecare control este oprit implicit și independent, cotitură unul pe niciodată nu schimbă orice alt comportament. Cele mai multe live sub Setări > Client Chat > Comportament; câteva sunt pe Setați AI și Train AI dumneavoastră.

Răspunsuri mai inteligente (mod agent)

Un chatbot normal răspunde la o întrebare dintr-o singură căutare. Modul agent asistentul poate efectua mai multe verificări ale conturilor numai pentru citire într-un singur rând și le poate compara, de exemplu: "am bilete deschise și este suficient echilibrul meu pentru următoarea reînnoire?" răspunde într-o singură replică cu matematica făcută. Se angajează doar pentru clienții verificați pe cont sau întrebări de rambursare; orice altceva se execută calea normală de răspuns unic.

Modul agent

Până la câteva lookup-uri numai pentru citire pe rândul său, cross-referenced înainte de a răspunde. Activează atunci când aveți o platformă conectat (WHMCS, Shopify, Stripe, Zendesk, etc.). Off = comportamentul single-lookup de astăzi, neschimbate.

Adâncime de gândire pentru răspunsuri agent

Cât de greu motivele modelului pe turnuri complexe (scăzut/mediu / ridicat). Începeți pe scăzut; cele mai multe întrebări de sprijin sunt tratate bine acolo.

Model agent

Pins un model mai puternic doar pentru agent complexe se transformă, astfel încât chat-ul de zi cu zi rămâne pe un model lumina, ieftin și numai turnurile grele plătesc pentru adâncime.

Plan înainte · răspunsuri cu un singur pasaj (beta)

Un pas de planificare mic decide ce cautari sa trageti si daca baza de cunostinte este necesara, apoi raspunde in apelul principal One în loc de mai multe etape. Un sub-combaterea în modul Agent. Nu poate fi activat dacă nu este pe modul agent. Aceeasi calitate a raspunsului, mai putine apeluri la intrebari multipart.

Conversație și înțelegere

Memorie de lungă conversație (beta)

Menţine un scurt rezumat al mesajelor mai vechi (nume, numere de bilete/facturi, sume, decizii) astfel încât asistentul să rămână consecvent pe chat-uri foarte lungi fără a reseda întreaga transcriere. Cel mai bun pentru suport-greu, fire lungi; perechi cu modul Agent.

Toleranța la tipo

Citește micile tipo ("bilete deschise" mele, "voci neplătite") ca cuvinte destinate astfel încât informațiile corecte să fie găsite în loc de ratat. Lucrează cu fiecare platformă conectată. Off implicit; util pentru mobil-greu chat.

Contextul contului lean

Doar ataşează instantaneu contul clientului atunci când întrebarea este de fapt despre contul lor (balanţ, facturi, bilete, servicii), sărind peste ea pe întrebări generale. Taie costurile fără pierderi de calitate. Asistentul poate aduce în continuare contul live atunci când o turn are nevoie de el.

Economii de costuri

Scapă de căutarea cunoștințelor pentru saluturi (beta)

"Bună," "mulţumesc" şi "ok" nu declanşează o căutare a bazei de cunoştinţe, acele răspunsuri nu-l folosesc niciodată. Orice mesaj cu conţinut real încă caută ca normal.

Cel mai lung răspuns permis (token-uri)

Caps cât de lung poate fi un singur răspuns. Lungimea răspunsului este cea mai scumpă parte a unui apel, astfel încât un capac sensibil (în jurul valorii de 500 pentru suport) este singurul cel mai eficient control al costurilor de chat. Doar reduce limita globală, nu ridică niciodată.

Pe Set up your AI

Adâncime de gândire (chat client & admin)

Cât de mult crede modelul înainte de a răspunde (minimal la mare). Păstrați chat-ul client pe minim / scăzut pentru viteză; rezerva setări mai mari pentru analiză și copilot admin.

Model per IA (per loc de muncă)

Fiecare suprafață AI (chat live, schițe de bilete, rezumate, analiză, admin copilot, promoții, Site Intelligence și mai mult) poate rula pe propriul model. Lumina unde viteza contează, puternic în cazul în care calitatea contează. Blank pe o suprafață = furnizor implicit pentru acel loc de muncă.

Control al costurilor de chat-ul admin

Copilotul admin poate păstra o memorie de lucru delimitată și încărca numai instrumentele necesare unei întrebări (unelte lean) în loc de fiecare unealtă la fiecare pas.

În tren AI-ul tău

Instrucţiuni de comprimat

Instrucţiunile sunt trimise la fiecare pas, astfel încât lungimea lor este un cost recurent. Butonul Compress rescrie un slot pentru a spune acelaşi lucru în mai puţine cuvinte. Refuză rescrierea dacă ar scădea orice {variable} sau regulă, şi raportează ceea ce protejat, aşa că nu schimbă niciodată în tăcere sensul.

"Ce este deja în creier" (i

Arată ce OpsIQ știe deja despre afacerea ta pe slot, astfel încât să puteți șterge orice ai repetat în instrucțiunile tale.

💡
Unde se duc banii? Pentru scurt suport, chat-ul de intrare (Instrucţiuni + date cont + istorie, trimise fiecare turn) costă mai mult decât răspunsul scurt, caching şi context macră ajuta cel mai mult acolo. Pentru conţinut lung generate de producţia domina. Capac răspuns-lungă şi o adâncime de gândire inferioară a plăti pe acolo. Vezi Setaţi AI pentru a păstra Cacheing prompte pe, ceea ce face partea mare repetată a fiecărui turn ieftin.
Se schimbă acestea modul în care chat-ul răspunde deja?+

Nu. Fiecare control este oprit implicit și independent. Pornirea unul pe doar adaugă comportamentul său; oprirea acestuia întoarce chat-ul la exact cum a lucrat înainte.

Ce ordin ar trebui să-i pornesc?+

Rulați chat-ul de zi cu zi pe un model de lumină și pin un model agent mai puternic. Apoi, dacă aveți o platformă conectată, activați modul Agent, apoi Plan înainte, apoi memorie lungă conversație. Apoi se apleca context, săriți-KB-for-salutări, și un capac răspuns. În cele din urmă comprima instrucțiunile dumneavoastră. Urmăriți câteva discuții reale după fiecare schimbare.

Kitul Agent Admin: căutare web, runbooks, misiuni, transfer de fișiere

chat-ul Admin AI este un inginer de lucru, nu doar o cutie cu întrebări. Poate cerceta fix pe web, păstrați o bibliotecă a procedurilor dumneavoastră de operare, patrula serverele pe un program, și muta fișiere. Cele mai multe dintre acestea se conduce prin solicitarea pentru ea în chatul; singurul lucru pe care configurați în față este furnizorul de căutare web pe care îl utilizează, pe pagina Set Up AI.

Căutare pe web

Construit în

Agentul caută pe web documente, mesaje de eroare și informații curente în timp ce funcționează. Din caseta aceasta folosește DuckDuckGo, care nu are nevoie de cheie și nici o configurare.

Cărți de parcurs

În chat

O bibliotecă salvată a procedurilor ("cum facem X aici"). Agentul scrie unul jos după ce cuie un loc de muncă complicat și o urmează data viitoare, astfel încât know-how supraviețuiește sfârșitul chat-ului.

Misiuni

Programat

Patrule programate doar pentru citire. "În fiecare dimineaţă, verificaţi spaţiul discului şi înregistrările de eroare şi spuneţi-mi."

Transfer de fișiere

În chat

Cere un fișier jurnal și obține un link de descărcare privat, sau au un fișier copiat de la un server conectat la altul. Ambele plafonate la 5 MB.

Admin Agent căutare web (on Configurați AI)

Furnizor căutare

Ce agent căutare web folosește. Implicit este DuckDuckGo: keyless, gratuit, funcționează la fiecare instalare. curajos Căutare, Tavily și Serper.dev (Rezultate Google) de obicei, se întorc rezultate mai bune dar fiecare are nevoie de o API cheie de la acel furnizor. În cazul în care un furnizor tastat nu reușește pentru orice motiv (cheie proastă, cota utilizată sus, probleme de rețea), că căutarea cade înapoi la DuckDuckGo automat, astfel încât căutare niciodată nu se întunecă.

Caută API cheie

Cheia pentru furnizorul ales, necesară doar pentru Brave, Tavily sau Serper. Odată salvată este mascată și nu mai apare niciodată pe pagină; lipește-l pe altul nou care să-l înlocuiască. Un furnizor cu cheie devine activ numai atunci când atât furnizorul cât și cheia sa sunt salvate.

Cărți de parcurs

Când agentul tocmai a lucrat printr-un loc de muncă pe care le va dori făcut în același mod din nou, spune "salvați că ca un runbook numit noapte-curățare." De atunci, pe ea vede rulabook după nume în fiecare sesiune, și când vă cere pentru locuri de muncă după nume (sau descrie-l) trage în sus pașii și îi urmează. Puteți să-l întrebați să lista, actualiza sau ștergeți Runbooks oricând.

💡
Un ghid este un ghid, nu o trecere gratuita. Cand agentul urmeaza unul, fiecare pas care ar schimba un server inca trece prin modul permisiunii curente si arata cartile de aprobare obisnuite. O carte de alergare nu poate ocoli niciodata o aprobare.

Misiuni

O misiune este o slujbă recurentă pe care agentul o conduce de unul singur: oră, zi de zi la o oră stabilită sau săptămânal într-o zi setată. Misiunile sunt citite doar prin proiectare. Ei pot citi servere, date și web, dar nu pot schimba nimic; ei investighează și raportează. Când o misiune se termină, constatările aterizează ca o notificare pe clopot admin. Spune "run patrula de dimineață acum" pentru a declanșa unul la cerere, sau cere agentului să lista, pauză sau elimina misiuni.

⚠️
Misiunile ruleaza pe OpsIQ cron, astfel încât trebuie să fie înființat (vezi Cron și automatizare). Un one-off "run it now" de la chat funcționează chiar și între cron rulează pe majoritatea serverelor.

Mutare fișiere

Cereți un fișier ("du-mi jurnalul de eroare de astăzi de pe serverul web") și agentul îl pune în scenă și răspunde cu o legătură privată de descărcare. Link-ul funcționează doar pentru admin-uri semnate și expiră după aproximativ o zi. Fișierele sunt limitate la 5 MB; pentru orice mai mare, cere agentului să comprime sau să-l tapițeze pe server primul.

Agentul poate copia un singur fișier între două servere conectate, din nou până la 5 MB. Scrierea pe destinație este tratată ca orice altă modificare pe care o face: în modul de a cere primiți mai întâi o carte de aprobare, fișierul existent este susținut, iar copie este reversibilă. Pentru siguranță, conținutul fișierului este re-citit din sursă în momentul aplicării copiei, nu se ia de pe chat.

AI

Antrenează-ţi AI

Al Training este locul unde predai OpsIQ Scrieţi îndemnuri care definesc personalitatea, limitele, concentrarea cunoştinţelor şi escaladarea regulilor. Gândiţi-vă la ea ca la un manual de instruire pentru un nou agent de sprijin.

Tren AI
Antrenează-ţi AIUn editor de instrucțiuni AI cu client / Admin file și ton simplu-englez, întotdeauna și niciodată reguli.Antrenează-ţi AIspațiu de lucruClient AIAdmin AIToneCity in California USAPrietenos, concis, niciodată insistent.ÎntotdeaunaOferă o predare umană pentru facturarea disputelor.Niciodată.Promite o rambursare fără să verifici contul.1TWO MANUALSClient & admin AI2PLAIN ENGLISHTone, mereu, niciodată3GROUNDEDPlus baza ta de cunoștințe
Antrenează AI ca pe un nou angajat, manuale de client și admin scrise în limba engleză (ton, întotdeauna, niciodată), la pământ în KB.

Două domenii de formare

Clientul AI prompt

Controlează modul în care AI vorbește cu clienții dumneavoastră în widget chat. Aceasta este cea mai importantă promptă pentru a obține dreptul.

Prompt Admin AI

Controlează modul în care AI ajută echipa de admin în tabloul de bord operator. Acest lucru se ocupă interogări interne și executarea acțiunii.

Scrierea unui client grozav AI prompt

Clientul dvs. AI prompt ar trebui să acopere aceste domenii:

1
Identitate

Cine este AI? Dă-i un nume, rol și personalitate. Exemplu: "Tu ești Luna, o asistentă prietenoasă și cunostintă pentru clientii de la Acme Store."

2
Tone și stil

Cum ar trebui să comunice? Exemplu: "Fii profesionist, dar cald. Folosește limbaj simplu. Evita jargonul. Păstrați răspunsurile concise (2-3 alineatele max)."

3
Limitele cunoașterii

Ce ar trebui să știe și nu știu? Exemplu: "Știi despre produsele noastre, prețurile, politica de transport maritim, și returnare. Nu știi despre produsele concurente sau deciziile interne ale companiei."

4
Norme privind scalarea

Când ar trebui să se predea unui om? Exemplu: "Escalataţi-vă către un agent uman atunci când: clientul cere o rambursare, menţionează acţiuni legale, raportează o problemă de securitate sau pune aceeaşi întrebare de trei ori."

5
Lucruri pe care nu le-am făcut niciodată.

Limitele grele. Exemplu: "Niciodată nu promit restituiri. Niciodată să nu partajați formule interne de tarifare. Nu inventa caracteristici ale produsului care nu există. Niciodată nu da sfaturi medicale, juridice sau financiare."

Exemplul de solicitare

Exemplu client AI prompt · magazin online
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
Exemplu client AI prompt · companie de gazduire
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

Rafinarea prompt în timp

1
Lansare cu elemente de bază

Începeţi cu identitatea, tonul şi limitele cheie. Nu încercaţi să acoperiţi totul în prima zi.

2
Review AI History week-end

Citiţi conversaţiile în care AI a dat răspunsuri greşite sau suboptimi.

3
Actualizează prompt

Adăugați reguli specifice pentru problemele recurente. Exemplu: dacă AI continuă să promită restituiri, adăugați "Nu promite niciodată o rambursare. Spune că va escalada la echipa de facturare."

4
Adaugă cunoștințe

Dacă AI nu poate răspunde la o întrebare, adăugați răspunsul la baza de cunoștințe mai degrabă decât încercarea de a se potrivi totul în prompt.

⚠️
Menține prompt sub 2,000 cuvinte. Implicațiile prea lungi pot confunda AI și crește costurile jetoanelor. Pune informații detaliate în baza de cunoștințe în schimb.
Care este diferenţa dintre baza de cunoştinţe şi cea promptă?+

I. I.-ul defineşte personalitatea, limitele şi regulile. Baza de cunoştinţe oferă informaţii concrete (detalii despre produs, preţuri, politici).

Pot avea diferite solicitări pentru departamente diferite?+

Dacă aveţi nevoie de comportament AI diferit pentru diferite departamente, folosiţi baza de cunoştinţe pentru a furniza informaţii specifice departamentului şi menţiona contextul departamentului în prompt dumneavoastră.

AI

Istoric AI

AI History arată fiecare conversație AI a avut cu clienții și admins. Utilizați-l pentru a audita performanța AI, găsi răspunsuri greșite, și de a identifica lacunele de formare.

Istoric AI
Istoric AIUn jurnal de AI se transformă cu insigne de tip, întrebarea și răspunsul, timpul de răspuns și rezultatul.Istoric AIspațiu de lucruFiecare turnură Al, înregistratăchatÎ: unde e comanda mea?A: expediat astăzi, UPS urmărire...0.9srăspunsbiletProiectul de răspuns pentru T-12345confirmarea restituirii redactată1.4sdraftedadminRezumaţi biletele săptămâna asta.12-returnat rezumat linie2.1sGata.chatÎ: anulează planul meupredat unui om0.7sescalated1EVERY TURNPrompt, răspuns, acțiune2SEARCHABLE& Exportă filtru3OWNER-ONLYTraseul complet de audit
Fiecare turnură AI (chat, ticketrew, administrare acţiune) autentificată cu prompt exact, răspuns, durată şi rezultat.

Ce arată fiecare conversaţie

Data și ora

Când s-a întâmplat conversaţia.

Identitatea clientului

Nume și e-mail dacă se cunoaște, altfel IP şi ţara.

Canal

Conversaţie widget, bilet de auto-reply, e-mail proiect, sau admin AI.

Mesaje

Transcrierea completă a conversației: mesaje ale clienților și răspunsuri AI.

Utilizarea jetoanelor

Câte jetoane conversația consumată. Utilizarea de mare jeton poate indica AI oferă răspunsuri exagerat de verbose sau conversația a mers în cercuri.

Acțiuni întreprinse

Orice actiuni executate in timpul conversatiei AI (a cautat ordinea, bilet creat etc.).

Evaluare

Dacă CSAT este activat, ratingul de satisfacție al clientului pentru această conversație.

Găsirea unor probleme

Caută după cuvânt cheie

Caută subiecte specifice pentru a vedea cum se ocupă AI de ele. Exemplu: căutarea "refund" pentru a verifica dacă IA este în urma politicii dumneavoastră de rambursare.

Filtru după rating

Arată doar conversații de mică calitate pentru a se concentra pe clienții nesatisfăcute.

Filtru după canal

Arată doar biletele de auto-replică pentru a audita răspunsurile automate separat de chat.

Sortează după utilizare jetoane

Conversațiile de mare valoare pot indica probleme: AI răvășind, mergând în cerc sau neavând răspuns la întrebare.

Rutina de audit săptămânal

1
Verificați conversațiile de nivel scăzut

Ce a mers prost? A fost o problemă de cunoaştere, un ton sau un răspuns greşit?

2
Verificați conversațiile de mare valoare

Acestea ar putea indica confuzie.

3
Actualizarea formării

Pentru lacunele de cunoștințe, adăugați articole la Baza de cunoaștere. Pentru probleme de comportament, actualizați prompt AI. Pentru răspunsuri recurente greșite, adăugaţi reguli de corecție explicite.

Găsirea lacunelor de cunoștințe

Scenariu:
Cauti AI History pentru "instalatie" si gasesti conversatiile 15 unde AI a spus: "Nu am instructiuni specifice de instalare pentru acest produs."
Ce este de făcut:

Aceasta înseamnă că baza de cunoștințe lipsește ghidurile de instalare. Creați articole de bază pentru etapele de instalare ale fiecărui produs. După adăugarea lor, testați prin întrebări legate de instalarea AI.

AI

Informaţii AI

AI Insights analizează automat modele de conversație și suprafețe constatări concrete: întrebări comune, tendințe de satisfacție, lacune ale cunoștințelor și modele de escaladare.

Informaţii AI
Intuiții AI (Hub inteligent)The Intelligence Hub: an AI Today's Brief, Smart Alerts, a Score-a-Lead / Analyse-a Page tool, and a 14-Day Traffic Model.Informaţii AIspațiu de lucruBRIEF DE AZITraficul în sus 12%; 3 piste fierbinți;2Afacerile au nevoie de urmărire.Alerte inteligenteErori de verificare înțepatSari pe /pricingNoua pistă fierbinte din SUAVenituri înainte de săptămâna trecutăScor un plumb / Analizați o paginăIP sau URL…Fugi!14-Day Traffic Model1BRIEF DE AZIAI scrie rezumatul de dimineață2SMART ALERTSAnomalii apărute3ON DEMANDScor un plumb · analiza o pagină
Adevărata Hub de Intelligence: un scurt, inteligent Alerte All-scrise astăzi pentru anomalii, la cerere de notare și analiza paginii, precum și modelul de trafic 14_zi.

Ce arată perspicacitatea

Întrebări de top

Cele mai frecvente întrebări. Dacă "Cum resetez parola mea?" este #1, baza de cunoștințe are nevoie de un ghid proeminent de resetare a parolei.

Tendinţe de satisfacţie

Scoruri CSAT în timp. Este satisfacția AI îmbunătățirea sau scăderea? Picături bruște pot indica o schimbare de bază de cunoștințe care a rupt ceva.

Rata de rezoluție

Ce procent de conversaţii rezolvă AI fără intervenţie umană? 70% - E bine. 50% Înseamnă că AI are nevoie de mai mult antrenament.

Motive de scalare

De ce conversaţiile sunt transmise oamenilor. Motive comune: client cerut uman, AI nu a putut răspunde, subiect sensibil, problema facturii.

Lipsa de cunoștințe

Subiectele în care AI spune frecvent "nu ştiu" sau oferă răspunsuri de încredere scăzută.

Durata medie a conversației

Câte mesaje per conversație. Conversații foarte lungi (10+ mesaje) ar putea indica AI nu înțelege întrebarea.

Folosirea unor perspective pentru a îmbunătăţi

Scenariu:
AI Insights arată că 23% de escaladare sunt "Clientul întrebat despre garanție" și AI nu a putut răspunde.
Ce este de făcut:

Acesta este un decalaj clar al cunoaşterii.1) Scrie un articol de garanţie cuprinzător în baza cunoaşterii care acoperă toate condiţiile de garanţii, procesul de revendicare şi excluderile (2) Actualizarea promptă a AI la informațiile de referință privind garanția. (3) Monitorizează Al Insights săptămâna viitoare pentru a vedea dacă creșterea garanției scade.

AI

Administra AI playbook

AI (Cereţi OpsIQ) ajută echipa ta să se descurce OpsIQ din cadrul tabloului de bord admin. Puteți cere să caute date, să explice caracteristicile, să rezume biletele și să execute acțiunile platformei.

Admin AI
Administra AI playbookThe Ask...OpsIQ cutie de comandă cu un card de acțiune al platformei propus AI care arată parametrii și confirmă/anulează.Întreabă OpsIQspațiu de lucruÎntreabă OpsIQSuspendă serviciul pentru contul restant #4821AIAcțiune propusă: suspendare_serviciuCont: #4821 (presupus) $120)platforma: WHMCS · reversibilă · auditatăConfirmăRenunță1ASK ANYTHINGComenzi simple în limba engleză2PROPOSE FIRSTAcţiune arătată înainte de a rula3YOU CONFIRMDomeniul de aplicare și auditat
Spune admin AI ce vrei în limba engleză simplu; propune acțiunea exactă (scoped, reversibil, auditat) și așteaptă confirmarea dumneavoastră.

Ce poate face admin AI

Caută date

Întreabă: "Arată-mi toate biletele de la [email protected]"sau "Care este starea ordinii #ORD-5523?"

Sumarizează

Întrebaţi: "Summarize the last 10 bilete" sau "Care sunt problemele de susţinere în această săptămână?"

Explicaţi caracteristicile

Întreabă: "Cum să configurați auto-replică?" sau "Ce înseamnă cardul de rata bounce?"

Execută acțiunile

Întreabă: "Creaţi un bilet pentru [email protected] Despre facturare sau "Bilet T-12345"

Interogările platformei

Întrebaţi: "Câţi vizitatori am primit ieri?" sau "Care sunt veniturile noastre în această lună?"

Exemplu de conversații

Caut un client.

Scenariu:
Admin întreabă: "Client Găsiți [email protected] şi arată-mi activitatea lor recentă"
Ce este de făcut:

AI se uită în sus clientul peste toate sursele de date conectate: sesiuni de vizitare, bilete, conversații pe chat, comenzi și contacte CRM. Se întoarce un rezumat al activității recente cu link-uri la fiecare element.

Obținerea unui rezumat zilnic

Scenariu:
Admin întreabă: "Ce s-a întâmplat azi?"
Ce este de făcut:

AI rezumă: "Astăzi ai avut 245 vizitatori (sus) 12%), 8Bilete noi (3 rezolvat de AI),2ordine noi totalizare $198, și1escaladarea conversaţiei despre o întârziere a transportului maritim."

Executarea unei acțiuni

Scenariu:
Admin întreabă: "Schimbaţi biletul T-5523 prioritate la Urgent"
Ce este de făcut:

AI confirmă: "Voi schimba biletul T-5523 prioritatea de la Normal la Urgent. Acest lucru va afecta cronometrul SLA. Confirmi?" Confirmați, iar acțiunea este executată.

💡
Admin AI execută doar acţiuni care sunt înregistrate în Registrul Acţiunii. Nu poate inventa acţiunile sau sistemele de acces din afara OpsIQ.
AI

Scenarii AI ale clienților

Această secțiune acoperă scenarii comune AI cu care se confruntă clienții, cu sfaturi de comportament și formare.

Client AI
Scenarii AI ale cliențilorO bibliotecă de întrebări client asociat cu comportamentul AI așteptat și un tag rezultat pentru fiecare.Scenarii AI ale cliențilorspațiu de lucruBiblioteca de scenarii · Comportament AI așteptat"Unde e comanda mea?"Caută ordinul prin conector, dă-i de urmărire.Rezolvare"Vreau o rambursare"Confirmă, niciodată nu promite · mână unui omPredarea"Serviciul s-a terminat?"Stare verificare, raport starea curentăStare"Anulează-mi contul"Confirmă intenţia, apoi ruta către un om.Confirmă1SCENARIOSÎntrebări frecvente2EXPECTEDCum ar trebui să răspundă AI3ÎNCERCAREGăsiți lacune în materie de formare
O bibliotecă de întrebări reale ale clienților și exact cum AI ar trebui să se ocupe fiecare, pentru a testa formarea dumneavoastră și găsi lacune.

Biblioteca scenariilor

Ancheta statutului ordinii

Scenariu:
Client: "Unde este comanda mea #12345?"
Ce este de făcut:

Comportamentul AI preconizat: (1) Caută ordinea prin conectorul platformei. (2) Raportează starea actuală (prelucrare, expediere, livrare). (3) Includeţi numărul de urmărire dacă este disponibil. (4) În cazul în care ordinul este amânat, se confirmă și se furnizează calendarul estimat. (5) Nu inventa niciodată informații de urmărire.

Cerere de resetare a parolei

Scenariu:
Client: "Mi-am uitat parola şi nu mă pot loga"
Ce este de făcut:

Comportamentul AI preconizat: (1) Furnizați pașii de resetare a parolei din baza de cunoștințe. (2) Includeți link-ul de resetare sau calea paginii. (3) Menţionează că e-mailul de resetare poate dura câteva minute. (4) Sugerează verificarea dosarului spam. (5) Dacă clientul încă nu se poate reseta, crește la un om.

Cerere de caracteristici

Scenariu:
Client: "Poți adăuga modul închis la aplicația mobilă?"
Ce este de făcut:

Comportamentul AI preconizat: (1) Le mulţumesc pentru sugestie. (2) Explică modul în care sunt tratate cererile de caracteristici (logate, revizuite, prioritizate). (3) NU promiteţi că această caracteristică va fi construită (4) Dacă există o caracteristică similară, menţionaţi-o.

Disputa privind facturarea

Scenariu:
Client: "Am fost acuzat, dar serviciul meu nu funcţionează"
Ce este de făcut:

Comportamentul AI preconizat: (1Recunoaşteţi frustrarea.2) Verificați dacă este posibil starea serviciului. (3) Escalate la departamentul de facturare cu toate detaliile. (4) NU promiteţi o rambursare. (5) Stabilește prioritatea biletului către High.

Întrebare extratopică

Scenariu:
Client: "Cum este vremea în Londra astăzi?"
Ce este de făcut:

Comportamentul AI preconizat: (1) Redirecționați politicos. "Eu sunt asistentul [compania] și vă pot ajuta cu întrebări despre produsele și serviciile noastre. Pentru informații meteorologice, încercați un serviciu meteo." (2) Întreabă dacă au o întrebare referitoare la produs.

Cum testez comportamentul clientului AI?+

Deschideți site-ul într-un browser privat / incognito și discuta cu AI ca un client. Încercați întrebări comune, cazuri de margine, și scenarii adversariale. Verificați dacă AI urmează regulile dumneavoastră prompte și utilizează conținutul de bază de cunoștințe corect.

AI

Baza de cunoștințe AI

Baza de cunoștințe este o bibliotecă de articole pe care AI le utilizează pentru a răspunde la întrebări. Când un client cere ceva, AI caută baza de cunoștințe pentru articole relevante și le folosește pentru a genera un răspuns precis, la sol.

Baza de cunoștințe
Baza de cunoștințeSurse care se hrănesc într-un magazin de cunoștințe, apoi un AI generând un răspuns la sol, citat.Baza de cunoștințespațiu de lucruSurseCrawl siteArticole de ajutorÎntrebări frecventeDocumente importateCunoștințesemantic + cuvânt cheieAIRăspuns la solcu o sursă citată."Restituirile iau 3–5zile lucrătoare."1INGESTCrawl, FAQ, import2RETRIEVESemantic + cuvânt cheie3GROUNDEDRăspunsuri din conținutul dumneavoastră
Crawl site-ul dvs. și importa documente în baza de cunoștințe; AI recuperează piesele și răspunsurile corecte, la sol și citat.

Cum funcţionează

1
Clientul pune o întrebare.

"Care este politica de returnare?"

2
AI caută baza de cunoștințe

OpsIQ găsește articolul "Return Policy" prin potrivirea cuvintelor cheie și a sensului semantic.

3
AI generează un răspuns

AI citeşte articolul şi scrie un răspuns în limba naturală bazat pe conţinutul articolului.

4
Clientul primeşte un răspuns precis

Răspunsul este bazat pe politica ta reală, nu pe datele de formare generală ale AI.

Crearea unor articole bune

Un subiect pe articol

Scrie un articol separat pentru fiecare subiect: politica de returnare, tarife de transport maritim, configurare cont, resetare parola. Nu combina subiecte nelegate.

Scrie ca un FAQ

Începe cu întrebarea pe care o pun clienții, apoi oferă răspunsul. Acest lucru ajută AI să se potrivească cu întrebările la articole.

Fii specific

"Returnările trebuie să fie inițiate în termen de 30 zile de livrare" este mai bun decât "Avem o politică de returnare."

Include cazuri de margine

Ce zici de returnări internaționale? Dar despre produsele digitale? Ce zici despre produse cumpărate la vânzare? Acoperi excepțiile.

Păstrează curentul.

Revizuirea articole trimestriale. Ștergeți informațiile depășite. Actualizați prețurile, politicile și procedurile atunci când acestea se schimbă.

Articole de pornire ar trebui să scrie

Transportul și livrarea

Costuri de transport maritim, timpi de livrare, urmărire, transport maritim internațional și gestionarea întârzierilor.

Returnări și restituiri

Fereastra de întoarcere, condițiile, procesul, calendarul de rambursare și excepțiile.

Gestionarea conturilor

Resetarea parolei, schimbarea email-ului, ștergerea contului și exportul de date.

Tarife și facturi

Descrierile planului, ciclul de facturare, metodele de plată, facturile și moneda.

Ghiduri de produse

Cum se utilizează fiecare produs sau caracteristică. Instrucţiuni pas cu pas cu capturi de ecran.

Depanare

Probleme și soluții comune. Mesaje de eroare și remedierile lor.

Informații de contact

Orele de afaceri, canalele de sprijin, timpii de răspuns şi căile de escaladare.

Legal și de conformitate

Rezumat privind politica de confidențialitate, termenii și condițiile rezumatului serviciului, GDPR cereri de date.

Cunoștințe privind conectorul

Fiecare conector poate contribui cunostinte la AI. Cand un conector este activat, articolele sale de cunoastere (catalizator produs, intrebari comune, depanare specifica platformei) sunt disponibile automat pentru AI. Puteti comuta cunostintele conectorilor pe sau oprite per conector in setările Conectorului.

Bugetul simbolic

Baza de cunoștințe are un plafon configurabil pentru jetoane (default: 32,000 tokens) care controlează cât de mult context de cunoaștere este trimis la AI per conversație. Dacă baza dumneavoastră de cunoștințe este foarte mare, AI selectează cele mai relevante articole din acest buget. Creșterea plafonului dacă AI nu găsește articole relevante; scăderea acestuia dacă doriți să reduceți costurile jetonului.

Câte articole ar trebui să am?+

Începeţi cu5-10 articole care acoperă întrebările cele mai frecvente. Adăugați mai mult pe măsură ce identifica lacune prin AI Istorie și AI Insights. Majoritatea afacerilor au nevoie 20-50 articole pentru acoperire cuprinzătoare.

Pot importa articole dintr-un alt sistem?+

În prezent, articolele sunt create manual în OpsIQ. Puteți copia conținutul de pastă din FAQ-uri existente, centre de ajutor sau documente.

În ce format trebuie să fie articolele?+

Textul simplu funcționează cel mai bine. AI înțelege limbajul natural mai bine decât structurat HTML sau marca jos. Scrie așa cum ai explica unui client.

AI

Evaluarea AI şi Turnul de veghere

Seturile de evaluare transformă întrebările critice ale clienților în teste repetabile pentru calitatea răspunsului, citații, escaladare și siguranță a acțiunii.

Ecran produs
Evaluarea AIAI Evaluation enumeră cazurile de testare aurii, comportamentul necesar, ultimele rezultate şi turnul de veghe programat.Evaluarea AIspațiu de lucruSETS6CASES84PASS RATE96%VIE VIU AIRPACEPolitica în domeniul transportului maritimCitarea necesarăPaseazăCerere de rambursareConfirmarea umană necesarăPaseazăCreștere a valorii justeAcţiune interzisăPaseazăÎntrebarea privind migrațiaLipsește sursa preconizatăEșec1CREATE CASESIntrarea și regulile de aur2RUN SAFELYRularea uscată sau evaluarea în viață3WATCHProgram zilnic sau săptămânal
AI Evaluation enumeră cazurile de testare aurii, comportamentul necesar, ultimele rezultate şi turnul de veghe programat.

Administratorii complet pot crea seturi de evaluare cu o promptă, etichete sursă așteptate, citări necesare, reguli de confirmare umană, așteptări de escaladare și acțiuni interzise. Rulați un set direct, uscat-run-l, sau reluarea istoric selectat.

Turnul de veghe programe de control zilnic sau săptămânal prin cron și rulează un număr limitat de cazuri (până la opt per permis programat). Revizuire eșecuri alături de furnizor / model, versiune promptă, versiunea cunoașterii, acțiunile propuse și costurile înainte de schimbarea comportamentului producției.

AI

Limbi şi traducere

Limbile gestionează textul tradus cu privire la client și comportamentul utilizat atunci când OpsIQ urmează un limbaj al clientului.

Ecran produs
LimbiPagina Limbi arată limba sursă, limbile traduse, modul de redactare/viață și comportamentul în limbajul clientului.Limbispațiu de lucruSURSAEnglezăLANGUAGES4VIU3VIE VIU AIRPACEFrancezăInterfață și conținutTrăieşteGermanăInterfață și conținutTrăieşteSpaniolăProiect de traducereProiectUrmărește clientulRăspuns în limba detectată- Da.1SET SOURCELimba originală a operatorului2ADD LANGUAGETradu în fundal3PUBLISHProiect sau viu
Pagina Limbi arată limba sursă, limbile traduse, modul de redactare/viață și comportamentul în limbajul clientului.

OpsIQ traduce textul cu ochii pe client intrat de operator. Setați limba sursă corect înainte de a crea traduceri, adăuga limbi țintă, apoi revizuiți proiectele înainte de publicare.

Domeniul de aplicare traducere poate fi doar-proiect sau live. Nu te baza pe traducerea mașină pentru legal, rambursare, securitate sau text de siguranță fără revizuire umană.

Fiecare loc care deține propriile formulări este listat cu numărul său de mesaje: mesajele chat ale clienților, promoțiile, mesajele proactive, fluxurile de chat, tururile ghidate, anunțurile, bule teaser și Sondaje și formulareSuprafaţa de studiu acoperă fiecare sondaj publicat complet: titlu, fiecare întrebare, fiecare opţiune răspuns, butoane, bun venit şi mulţumesc copie, pagina crom şi pagini de rezultat. Cheile sunt legate de ID-ul de întrebare şi valoarea opţiunii, astfel reordonarea întrebări sau opţiuni nu pierde niciodată o traducere, şi reformulând un mesaj re-translate doar că mesajul. Sondaje live publicate sunt oferite implicit; se alătură proiectelor atunci când lărgiţi domeniul de aplicare.

Sondajul post-chat de e-mail urmează limba în care vizitatorul a discutat efectiv, cu condiția ca limba pe care o oferiți aici; altfel utilizează limbajul sistemului. Cele șase câmpuri editabile sunt traduse și pe această pagină, iar comportamentul are propriul comutator în setările Client Chat.

Mesaje de bilete și portal acoperă tipul de operator de text fix o dată și fiecare client primește apoi în acea limbă: confirmarea biletului, confirmările deschise, închise și feedback-ul, autooffurile pe departament și linia de bun venit portal. (Răspunsul automat AI nu are nevoie de nimic din toate acestea, ea răspunde deja în limba clientului.) Cu Clientii de e-mail in limba lor activat în OpsIQ Scrisul, e-mailul de bilete rezolvă limba destinatarului în această ordine: limba pe care au ales-o în portal sau Centrul de Ajutor (cărtat pe bilet), localizarea pe înregistrarea lor de contact, apoi limba în care au scris-o, detectată la nivel local prin gama de scripturi și cuvinte marker, fără apel extern. Numai limbile selectate pe pagina Limbi sunt folosite vreodată, astfel încât funcția este inertă până când se adaugă limbi străine. HTML E-mail ambalaj nu este tradus în mod deliberat: acesta este marca, nu proza. Personal cu care se confruntă e-mail (notificări, alerte departamentale, scurt analist, rapoarte programate, săptămânal digera) utilizează întotdeauna limba de sistem.

PeopleOS HR

PeopleOS: sistemul de operare al forței de muncă reglementate

Rulați ciclul de viață al angajaților de la rechiziție până la offboarding cu autoservire mobilă, fluxuri de lucru bazate pe dovezi, integrări tastate și controlul uman asupra deciziilor sensibile.

Hartă interactivă a sistemului
Centrul de comandă peopleOS pentru ciclul de viațăUn tablou de bord peopleOS tridimensional care leagă recrutarea, angajații, salariile, învățarea și conducerea AI.Centrul de comandă PeopleOSVENIT VIUOAMENI248ROLE DESCHIDE12POTRIVIT CONTROLULUI15 / 15VIAŢĂRecrutareAngajareCresteRecompensaTranzițieO ÎNREGISTRAREIdentitate + dovezi privind ocuparea forței de muncăCONTROLUL UMANRecurs, corecție, preluareDOVEDEAZA-ORezultatele și dovezile de eliberare
PeopleOS păstrează ciclul de viață, controale și dovezi pe un singur record reglementat.

Administratori

Funcționează

Gestionarea persoanelor, organizarea, recrutarea, la bord, documente, concediu, reconcilierea salariilor, beneficii, performanță, învățare, relații cu angajații, analize și guvernanță.

Angajaţi şi manageri

Autoservire

Utilizați un portal mobil pentru înregistrări private, cereri, documente, la bord, timp, explicații cu plată, învățare, informații și drepturi ale companiei.

Dezvoltatori

Extinde

Foloseşte curatorul hr.* acțiuni și revizuirea platform.hr.* operaţiuni printr-un contract, plus clase de conectori tastat. Indexul generat în secţiunea PeopleOS API listează fiecare dintre acestea cu domeniul său de aplicare.

⚠️
PeopleOS nu este un registru de salarii, consilier juridic, birou de verificare a antecedentelor sau furnizor de identitate. Sistemele externe certificate păstrează aceste responsabilități. Un control tehnic verde nu creează niciodată aprobare juridică sau dovezi furnizate.

Obținerea PeopleOS HR

PeopleOS HR este inclus în planul Enterprise. În fiecare alt plan plătit este un plus-on: proprietarul contului deschide Cont → Add-ons & Tokens, alege un nivel PeopleOS HR și fie începe procesul gratuit sau îl adaugă direct. Nivelurile diferă în câte persoane și cât de mult recrutare, interviu și activitate AI care le transportă. Prețurile și limitele sunt stabilite pe cont, nu scrise în produs, astfel încât a se vedea nivelurile actuale pe pagina de prețuriCe face modulul, suprafata dupa suprafata, este pe Pagina de produse PeopleOS HR.

Cine poate adăuga

Un plan gratuit nu-l poate adăuga, iar un plan plătit care este încă în propriul său proces trebuie să aştepte până la încheierea procesului.

Procesul liber

Procesul se desfășoară pe nivelul ales. Când se termină fără o achiziție, dreptul este eliminat și nu se percepe nimic. Nimic nu se șterge: înregistrările sunt din nou acolo în momentul adăugării add-on.

Atunci când nu este deținut

PeopleOS HR nu apare în bara laterală, paleta de comandă, Setări sau ajutorul în aplicație. Un link direct la o pagină HR oferă add-on în loc de pagina.

Atingerea unui plafon de nivel

Când se atinge o limită de nivel, pagina oferă următorul nivel. Editarea sau eliminarea ceea ce există deja nu este blocată.

Instalații auto-hostate

Dreptul de călătorie în licenţă. Adăugaţi adăugare pe dumneavoastră OpsIQ contul şi instalaţia îl preia la următoarea verificare a licenţei.

Configurarea primei săptămâni

Tot ce este dedesubt este un ecran real; nimic de aici nu are nevoie de un dezvoltator.

1
Porneşte modulul

Deschide PeopleOS→HR AcasãSteagul începe cu comutatorul principal. PeopleOS HR: cu ea nu pagina HR sau suprafata angajatului este accesibila. Pornirea unui comutator este o confirmare de doua clicuri; inchiderea unuia este un singur click. Comutarea AI-ului sub el (redactare ajutor, screening aplicatie, asistenti autonomi, interviuri AI, trimitere automata a ofertei, verificare identitate) se va opri pana cand decideti dumneavoastra.

2
Lasă copilotul de configurare să facă configurația

Deschide PeopleOS → Setare copilot şi să spuneţi ce doriţi în limba simplă: o politică de concediu cu zilele sale şi preaviz, sărbătorile publice pentru o ţară, o categorie de caz cu ei SLA, un plafon de cheltuieli, un şablon la bord, un puls lunar. Veţi primi planul înapoi cu ceea ce a înţeles şi ceea ce presupune. Nimic nu se execută până când confirmaţi; un pas mediu-risc are nevoie de o a doua persoană; fiecare run lasă o chitanţă.

3
Nume portalul angajatului

Deschide PeopleOS→Linia frontului→Proiectare de sign-in. Pe un auto-hosted instala portalul trăiește la /hr/<address>; Adresa portalului redenumește imediat și link-uri vechi de sign-in continua să lucreze pentru că adresa veche înainte. Pe nor portalul este /hr pe gazda ta de spațiu de lucru și nu are nevoie de adresă.

4
Publică site-ul carierei tale

Deschide PeopleOS→RecrutareFiecare postare pe care o publicaţi de la o rechiziţie aprobată apare pe pagina carierelor publice; link-ul Deschide pagina de cariere publice În vârful Recrutării arată exact ce vede un candidat.

5
Înregistrează un chioșc pentru dispozitive partajate

Deschide PeopleOS→Linia frontului→Chioșcuri şi alege Înregistrează un chioşc. Jetoanele dispozitivului sunt afișate o dată; deschideți pagina de chioșc pe tabletă sau PC (este /kiosk pe portalul gazdă) și lipi-l. Oamenii ceas în cu e-mail lor de lucru și PIN, sau cu codul insigna scurt-viata din portalul lor. Revocarea un chioșc oprește dispozitivul la o dată.

6
Decide ce pot face angajaţii pentru ei înşişi.

Deschide Configurări→RRFiecare putere de autoservire (înregistrări, cereri, documente, concediu, explicaţii cu plată etc.) este setată fiecărui angajat, managerilor sau unei echipe şi echipelor aflate sub ea. Orice schimbare înregistrează cine a făcut-o şi de ce, iar o putere pe care o opreşti îi explică angajaţilor în loc să lipsească în tăcere.

7
Adăugați oameni și dați-le acces

- Da. PeopleOS→Oameni crearea persoanei, a locului de muncă și a managerului acestora. Furnizarea accesului portal numai o dată persoana are un e-mail valid și o relație de angajare intenționată; invitația iese din același ecran și la bord începe din călătoria pe care ați înființat-o.

Ciclul de viaţă

Planifică și recrutează

Creați rechiziții aprobate, publica locuri de muncă, primi aplicații prin intermediul re-query-safe webhooks, revizuire structura, interviuri program, decizii record, oferte de emisiune și închiriere.

Alăturaţi-vă şi dispoziţii

Construirea de dovezi la bordul navelor, colectarea versiunii corecte a documentului, echipamente pentru cerere, șabloane de acces aprobate și furnizarea de acces fără locuri portal.

Munca şi creşterea

Concediul de funcționare, orarele, explicațiile privind plata, beneficiile, cheltuielile, obiectivele, feedback-ul, recenziile, învățarea, competențele, oportunitățile interne, succesiunea și analiza forței de muncă.

Sprijin și protecție

Oferă sprijin privat HR, cazuri de relaţii cu angajaţii reglementate, documente juridice, cereri de date, corecţie, explicaţie, recurs şi evaluare independentă a oamenilor.

Schimbare și concediu

Utilizarea modificărilor efective ale ocupării forței de muncă, revocarea accesului, recuperarea echipamentelor, reconcilierea furnizorilor externi, aplicarea păstrării și păstrarea dovezilor necesare.

Accesul și identitatea

O persoană canonică deţine înregistrări de angajare şi facete verificate de identitate externă. Email-ul este datele de contact mutabile, niciodată cheia permanentă de identitate. Citirile portalului sunt auto-scopecate; vizualizările managerului şi administratorului necesită permisiuni explicite. API strat de sfere pe partea superioară a permiselor de traseu şi nu le ocolesc niciodată.

Adaugă un nou lucrător

Scenariu:
Creați persoana, atribuiți locuri de muncă și manager, oferind acces la portal, apoi deschideți călătoria la bord.
Ce este de făcut:

Utilizați dry-run și idempotență pentru API scrie. Confirmați persoana are un e-mail valid și relația de muncă preconizată înainte de a trimite acces.

Rezolvați o identitate duplicată

Scenariu:
Două sisteme externe identifică același lucrător în mod diferit.
Ce este de făcut:

Legați ambele fețe verificate la persoana canonică și rezolvați conflictul în mod explicit. Nu fuzionați înregistrările doar pentru că două valori de e-mail mutabile se potrivesc.

PeopleOS HR

Fluxuri de lucru HR și Portalul Angajaților

Cum este operat fiecare zonă peopleOS majoră și ce văd angajații după sign-in.

Persoane și organizații

Menținerea persoanei canonice, a locului de muncă, a tipului de lucrător, managerului, echipei, locației, competențelor, documentelor și structurii organizației cu date efective.

Recrutare și oferte

Treceți de la rechiziție aprobată la postare, aplicare, dovezi structurate, interviu, decizie, ofertă și închiriere cu cazare și căi de atac.

La bord și documente

Atribuiți pașii comandați specifici proprietarului; colectați, revizuiți, semnați, expirați, țineți și ștergeți documentele cu versiunea și dovezile de acces.

Timp, concediu și programare

Definirea tipurilor de concediu susţinut prin politici, solduri, cereri, aprobări, sărbători, disponibilitate, evenimente calendaristice şi reconciliere.

Plata, beneficiile și cheltuielile

Explicaţi salariile, evenimentele de muncă aprobate manual către statul de plată, reconciliaţi excepţiile, gestionaţi beneficiile eligibile şi guvernaţi rambursările.

Performanță și creștere

Operați obiective, check-in-uri, feedback, recenzii, calibrare, învățare, competențe, mentorat, oportunități interne și succesiune.

Serviciul și relațiile HR

Oferă angajaților sprijin privat în timp ce păstrează plângere, disciplină, denunțător și dovezi sigilate caz în limitele permise dedicate.

Analiză și planificare

Utilizarea măsurilor privind forța de muncă, planurile de numărare a capetelor de joc, indicatorii de referință și indicatorii de experiență derivate din înregistrări; niciodată să nu se considere rezultatele lipsă ca fiind succes.

Harta portalului angajatilor

Prezentare generală

Are nevoie de atenţia ta, schimbări de la ultima vizită, cereri deschise, evenimente viitoare, progres la bord şi anunţuri.

Profil și înregistrări

Ocuparea forței de muncă, înregistrări verificate, documente, permisiuni, cereri de confidențialitate și cereri de corecție.

Suport și sarcini HR

Conversatii private, cereri, actiuni care necesita sarcinile angajatului si ale companiei prezentate separat.

Primele tale zile

Proba-susţinută la bord cronologie cu proprietarul, starea datorată, finalizarea şi munca blocată.

Timpul şi plecarea

Balanțe, cereri de concediu, disponibilitate, calendare și consecințe.

Competenţe şi creştere

Învăţare, dovezi de îndemânare, obiective, feedback, mentorat şi oportunităţi interne.

Salariul meu, explicat

Compensație în limba simplă și informații privind reconcilierea salariilor pe care angajatul le poate vedea.

Societatea

Directorul și organigrama limitată la informațiile pe care colegii le-au ales sau politica le permite să le partajeze.

Drepturi și decizii

Explicaţii, apeluri, consimţământ, corecţie, acces şi ştergere a cererilor.

💡
Portalul este mobil-primul. Cardul de cont ramane accesibil, navigare si continut defilarii independent pe ecrane largi, iar supraplafoanele de navigatie mobile mai degrabă decât împingerea sau acoperirea paginii. Copia explicatoare lunga apartine in componenta utila tip instrument sau dezvaluire.

Secvența de operare sigură

1
Configurează politica și permisiunile

Setează competenţa, rolurile, căile de aprobare, păstrarea, consimţământul şi comenzile caracteristicilor înainte de încărcarea înregistrărilor live.

2
Conectează furnizorii externi

Instalați pachetul semnat corespunzător, introduceți acreditările celor mai puțin importante și treceți prin conexiuni și teste de conformitate.

3
Fugi în nisip sau umbră

Exercițiu flux de lucru complet cu date deterministe și compara dovezile preconizate înainte de a permite executarea real-furnizor.

4
Eliberare sub dublă comandă

Un revizor autorizat diferit examinează dovezile privind furnizorul, securitatea, confidențialitatea, legalitatea, corectitudinea și accesibilitatea.

PeopleOS HR

AI, corectitudine, controale video și juridice

PeopleOS tratează automatizarea ca pe o cale de instrument guvernată: permisiunea politică, încercarea de executare, rezultatul furnizorilor și dovada sunt fapte separate.

Controlul AI și al agenților

Fiecare agent foloseste instrumente de inregistrat cu un scop, jurisdictie, clasa de risc si autonomie maxima. Preluarea umana, intrerupatoare de circuite, incidente si schimbari de jurisdictie opri executarea. Corectiile pot forma un set de date propus dar nu se antreneaza nimic pana cand o persoana autorizata diferita nu termina revizuirea confidentialitatii.

Corectitudine

Defineşte cohortele, regulile minime ale eşantionului, indicatorii, identitatea evaluatorului şi o evaluare eliberată legal. Datele lipsă rămân lipsă; nu sunt niciodată transformate într-un permis de trecere.

Explicații și căi de atac

Construiţi explicaţii din decizia sigilată şi dovezi politice. Trimiteţi apeluri către un om independent şi păstraţi dovezile de rezultat.

Jurisdicții

Pachete de politici ale țărilor care eliberează doar cu un proprietar legal responsabil, citat surse juridice și teste de trecere.

Actul UE privind AI

Menține inventarul sistemului, clasa de risc, evaluarea impactului drepturilor fundamentale, anunțurile, supraveghetorii, contorizarea și dovezile.

Limitele de screening video

Dispoziţia nu înseamnă participare

hr.interview.room.provision creează o locaţie de întâlnire. hr.interview.room.connect poate dovedi că mass-media a ajuns la lucrător.

Consimțământ specific scopului

Înregistrarea, transcrierea şi viuitudinea biometrică sunt alegeri separate. Retragerea se aplică scopului selectat.

Fără analiză a aspectului

Contractul video nu are nici un domeniu sau metodă de emoție, atenție, atractivitate, rasă, handicap sau inferență aspect.

Trasee umane și text

Un revizor poate prelua permanent sesiunea, iar o rută de cazare text rămâne disponibilă.

Reţinere şi ştergere

Conectorul raportează transport criptat, politica de păstrare activă și referințe media furnizor, și trebuie să sprijine ștergerea verificabilă.

Cameră creată, AI absent

Scenariu:
Există o cameră zoom URL, dar podul media nu a livrat audio/video lucrătorului interviu.
Ce este de făcut:

Arată întâlnirea ca fiind prevăzută și participarea AI ca fals. Păstrați la dispoziție căile de interviu uman și de cazare text.

Apelul spune că a trecut un cec.

Scenariu:
O verificare a trecutului, un raport de la webhook semnat.
Ce este de făcut:

Înregistrați apelul ca un indiciu, apoi interogați furnizorul. Numai răspunsul de stare autentificat poate actualiza verificarea.

🚫
O evaluare tehnica a accesibilitatii poate fi inregistrata de evaluatorul sau, dar atestatul WCAG necesita o persoana separata. Dovada furnizorului, eliberarea legala si dovada corectitudinii solicita si proprietarii lor reali.
PeopleOS HR

PeopleOS API și dezvoltarea conectorului

Foloseşte-l pe general API pentru operațiunile de HR reglementate și contractele cu conectori tastati pentru sisteme externe autorizate.

General API surse de adevăr

TrimiteJSONla POST /api/v1.php. Descoperiți suprafața de rulare prin meta.actions, OpenAPI la /api/v1/openapi.php, și Postman la /api/v1/postman.phpIndexul generat de mai jos poartă numărul exact de curatate hr.* acțiuni și revizuiri platform.hr.* Operaţiuni în această clădire, deci nimic de pe pagina asta nu e scris manual.

Listaţi oamenii
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}'
Uscat-run un scris
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}'

Utilizare hr.read sau hr.write Numai dacă este necesar. Traseul de administrare țintă încă verifică propria permisiune. Scrie necesită o cheie stabilă idempotență; scrieri cu risc ridicat necesită confirmare. Eșecuri tranzitorii de remetrie, cu aceeași cheie și cerere starea de recuperare după un temporizator incert.

Fiecare acțiune ore curatate

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.

Persoane, organizare și identitate (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.

Rechiziții și postări (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.

Părăsește, învață și piața conectorului (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.

Certificarea și sănătatea conectorului (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.

Camerele de interviu (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.

Agenți și benzi de ciclu de viață (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.

Competența (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.

Decizii și recursuri (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.

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

Conversaţii şi reţinere a forţei de muncă (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.

Readyness și eliberare (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).

Clase de conectori

Recrutare

hr_job_board, hr_background_check, hr_identity_verification, hr_assessment şi hr_tax_right_to_work.

Angajarea și îmbarcarea

hr_esignature, hr_calendar, hr_video şi hr_equipment_it.

Operațiuni de forță de muncă

hr_payroll, hr_benefits, hr_learning, hr_expense_payment, hr_directory şi hr_data_warehouse.

Comunicare

hr_messaging este doar trimitere. Contractul nu conține nici o metodă de citire a mesajelor angajaților.

Criteriile de evaluare a furnizorului Gateway

PeopleOS HR Furnizor Gateway 1.0
GET    /v1/hr/health
POST   /v1/hr/job-postings
PATCH  /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/job-postings/{provider_ref}/close
GET    /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/background-checks
GET    /v1/hr/background-checks/{provider_ref}
POST   /v1/hr/identity-verifications
GET    /v1/hr/identity-verifications/{provider_ref}
DELETE /v1/hr/identity-subjects/{subject_ref}
POST   /v1/hr/payroll/worker-events
GET    /v1/hr/payroll/state?cursor=...
GET    /v1/hr/payroll/exceptions
POST   /v1/hr/equipment/requests
POST   /v1/hr/access/requests
GET    /v1/hr/provisioning/requests/{request_ref}
POST   /v1/hr/provisioning/requests/{request_ref}/revoke

Poarta necesită HTTPS, blochează țintele nesigure/private, pinii validați DNS rezultate, nu urmează redirecționări, limitează dimensiunea răspunsului, necesită JSON, poartă idempotență deterministă, și suportă timp marcat HMAC în ambele direcții. Webhooks sunt întotdeauna indicii urmate de furnizor re-query.

Ușile de webhook care se închid

Trei uşi publice primesc apeluri de la furnizori: POST /opsiq/ajax_api.php?ajax=hr_connector_webhook (câmpuri) connector_class, connector_key, topic), ?ajax=hr_esign_webhook (connector_key, offer_uuid, provider_ref) și ?ajax=hr_check_webhook (check_uuid) Fiecare verifica corpul prin conectorul certificat, arde livrarea astfel încât o reluare moare, și înregistrează doar un în așteptare re-query; răspunsul propriu furnizorului schimbă înregistrarea. Fiecare refuz este același răspuns generic pe scop. PeopleOS nu oferă evenimente de webhook afară astăzi: webhooks.events.list este autoritatea și numele care nu sunt incluse în hr Familia, deci sondaj hr.* citire sau utilizare hr.connectors.health.

Referințe detaliate

Manual complet PeopleOS

Citit doc/contracts/PEOPLEOS_HR.md într-o instalație auto-hosted pentru fiecare operator, API, conector, webhook și regula de lansare.

Contractul dezvoltatorului Gateway

Pachetul de piață conține README.md, DEVELOPER.md, connector_contract.json, hr_profile.json şi un document semnat.

PeopleOS HR

Pregătirea pentru testare și producție

O cerere de lansare este calculată pe baza dovezilor. Disponibilitatea pachetelor, certificarea furnizorului, aprobarea juridică, evaluarea corectitudinii și atestarea accesibilității sunt separate în mod deliberat.

1
Codul și contractele de validare

Rulați sintaxa PHP, HR PHPUnit, ruta /APIParitate, controale OpenAPI/Postman, manifest de pachete șiJSONValidarea schemei.

2
Exercițiu de lucru complet

Recrutare testare, revizuire AI, interviu/video, la bord, semnături, concediu, salarizare, portal, notificări, modaluri și căi de eșec conector.

3
UI receptiv la încercare și accesibil

Drive desktop, tablete și formate telefonice; tastatură, focalizare, etichete, contrast, reflux, vârfuri de instrumente, dialoguri, notificare defilare și navigare independentă.

4
Colectarea de probe externe

Utilizați excursii reale furnizor și ștergere, eliberare de politici legale, date reprezentative de echitate și un atestat independent WCAG uman.

5
Eliberare sub dublă comandă

Un revizor diferit de cel care depune cererea aprobă conectorul și eliberează probe. Revocare sau schimbare-ucidere a unui conector în cazul în care dovada sa expiră.

Ce înseamnă fiecare rezultat

Pachet semnat

Dosarele nu s-au schimbat de la semnarea pachetului autorizat. Nu demonstrează că un cont terț funcționează.

Sandbox trecut

Comportamentul determinant și tranzițiile de stat sunt conforme. Nu demonstrează un furnizor real, termenul de ședere sau ștergere.

Conector de producție certificat

Un cont specific al spațiului de lucru a trecut de cele cinci obligații de tip furnizor aflate sub control dublu.

Raportul tehnic WCAG

Există dovezi automate și evaluate pentru suprafețe numite. Nu este atestat de persoana a doua.

Lansare gata

Toate porțile necesare sunt verzi în același timp și nu există dovezi expirate, revocate, lipsă sau contrazise de sănătatea vie.

⚠️
Nu creați niciodată un dosar de verificare legală, corectă sau independentă doar pentru a șterge poarta. Înregistrați blocantul și proprietarul în schimb. Vederea disponibilitatea este valoroasă tocmai pentru că refuză cererile nesusținute.
De ce este instalat un conector, dar încă indisponibil?+

Instalarea dovedește prezența pachetului. Activați-l, salvați acreditări reale cel mai puțin privilegiate, trece testul de conectare, apoi acordați domeniul de producție al contului PeopleOS potrivire folosind dovezi reale furnizor și un revizor diferit.

De ce nu a schimbat un webhook recordul?+

Apelul poate fi valabil, dar numai un indiciu. Verificați inbox webhook, criteriul de stare furnizor și rezultatul reconcilierii. PeopleOS schimba starea autoritate doar după re-query.

În cazul în care este complet RR citibile de mașină API?+

Call meta.actions și filtru pentru h. și platforma.hr.; sau de utilizare/api/v1/openapi.phpşi/api/v1/postman.php.Ele sunt generate din același registru de rulare.

Sprijin

Centru de ajutor

Centrul de Ajutor este un site de ajutor auto-servire construit din articolele pe care le publicați. Clienții îl pot citi și căuta pe propria pagină publică, iar chiar în interiorul widgetului de chat, astfel încât să poată găsi răspunsuri proprii înainte ca ei să deschidă vreodată o conversație. Totul vine din baza dumneavoastră de cunoștințe, astfel același conținut care fundamentează AI-ul dvs., de asemenea, alimentează ajutorul public.

Unde o văd clienţii tăi

Pagina sa publică

Un loc curat, de ajutor cautabil la /help.php. Clientii naviga pe categorii, cauta si deschide orice articol. Poti sa-i dai numele tau propriu si stilul tau.

În interiorul widget-ului chat

Un link de ajutor în widget chat astfel încât clienții pot căuta articolele fără a părăsi chatul. Dacă încă mai au nevoie de o persoană, acestea sunt la un robinet distanță de la pornirea unei conversații.

Porneşte-l.

1
Deschide pagina de ajutor

Du-te la Config, then Help Center în admin și porniți Activează Centrul de Ajutor Public.

2
Dă-i un nume şi uită-te.

Setează numele Centrului de Ajutor, care arată în antet și fila browser-ului, și alege un stil vizual. Puteți opri navigarea de sus pentru o pagină curată fără meniu.

3
Publică unele articole

Nimic nu se vede până când nu publici articole.

Publică articole la Centrul de Ajutor

Articole trăiesc în baza de cunoștințe. Un articol apare în Centrul de ajutor odată ce este publicat și marcat public. Există câteva modalități de a face acest lucru:

Publică un articol

Deschide articolul, marchează-l publicat şi deschide opţiunea de a-l arăta în Centrul de Ajutor.

Publică totul odată.

Utilizaţi Editează toate buton pentru a apăsa întregul set publicat la Centrul de Ajutor într-un singur clic, în loc să le facă unul câte unul.

Transformați Întrebări frecvente în articole

Deja au întrebări frecvente? Utilizare Publică tot ce vrei să ajuţi să-i transforme în articole de ajutor, astfel încât acestea stau alături de orice altceva.

Importă o bază de cunoștințe existentă

Mutarea de la un alt birou de ajutor? Importă KB butonul de pe tabul Articole aduce o bază de cunoștințe existente în pentru tine. Aveți trei moduri să-l punctați la conținutul dumneavoastră:

Lipește un URL

Dă-i adresa centrului de ajutor curent. Dacă recunoaște platforma (de exemplu, Zendesk) citește exact categoria copac de pe acea platformă. Altfel se târăște site-ul și reconstruiește structura din pagini, importând doar articole reale și sărind peste login, tarifarea, și paginile de contact.

Alege o aplicație conectată

Dacă o platformă este deja conectată la acest spaţiu de lucru şi are o bază de cunoştinţe, apare într-o scădere sub Import dintr-o aplicație conectată. Selectaţi-l şi importaţi, nu URL sau parola necesară. Aplicaţia este listată doar după ce este conectată şi configurată.

Încărcați un CSV

Nu există site-ul live la punctul de la? Încărcați o foaie de calcul cu title, category, și body Coloane. Parent / Child în coloana de categorie pentru construirea categoriilor cuibate.

Indiferent cum alegi, primeşti un previzualizarea întâi: articolele pe care le-a găsit, grupate în funcție de categorie, fiecare cu o cutie de checkbox astfel încât să puteți renunța la orice nu doriți. Nimic nu este salvat până când faceți clic pe Import. După aceea puteți Desfă întregul import într-un singur clic, sau Re-sinc a URL sau import conectat-app mai târziu pentru a trage în articole noi și modificate.

💡
Dezvoltatori: orice conector poate face publicitate bazei sale de cunoștințe la această scădere prin declararea unei kb_capabilities blocheaza-l settings.json (tip kb_source, cu un adapter şi a base_template) Vezi secțiunea Conectori și referința la conectorul platformei.

Organizaţi cu AI

Un centru de ajutor ordonat este ușor de navigat și mai ușor de căutat. Organizaţi cu AI butonul face curat pentru tine. Într-un singur clic se citește articolele publicate, sortați-le în categorii sensibile, și adaugă etichete. Acesta creează o categorie atunci când are nevoie de unul, refolosirea unei categorii care deja se potrivește, și sare peste tot ce ați organizat deja, astfel încât să puteți rula din nou oricand adaugati articole noi. Să se organizeze AI în subcategorii în Setări Help Center și poate fi fișier articole sub cuib Parent / Child categorii, care este la îndemână imediat după importul unei baze de cunoștințe care a avut subsecțiuni.

💡
Categoriile oferă clienților o modalitate de a naviga, și etichete ascute căutarea pe atât pagina publică cât și în widget. Puteți redenumi sau muta lucrurile după aceea. AI vă oferă un punct de pornire puternic, nu o configurare sunteți blocat cu.

Centrul de ajutor din interiorul widget-ul dvs. chat

Puteți arăta centrul de ajutor chiar în interiorul widget chat astfel încât oamenii să caute răspunsuri înainte de a vă mesaj. În setările dvs. de chast widdget, alege unde apare link-ul de ajutor:

În antet

O pictogramă de ajutor mic în partea de sus a widget.

La fund

Un link text sub caseta de mesaje, de exemplu "Centrul de ajutor pentru navigare." Puteți schimba formularea.

Ambele locuri

Arată-l în antet și la partea de jos pentru cea mai mare vizibilitate.

Link-ul de ajutor are propriul control al culorii sub setările de aspect widget. Lăsați-l pe Niciuna pentru a se potrivi culoarea lansator, sau alege un Solid culoare sau a Gradient. Întreaga experiență de ajutor urmează tema widget, astfel încât întotdeauna arată ca o parte a brand-ului.

Pune-ţi centrul de ajutor pe propria adresă web

Din cutie, centrul de ajutor are deja o adresă curată, partajabilă (de exemplu /help/your-help-center) Puteți merge un pas mai departe și să-l servească sub dvs. domeniu propriu, astfel încât clienții și motoarele de căutare-l văd ca parte a brand-ului dvs., de exemplu yourdomain.com/help sau help.yourdomain.com. Totul continuă să lucreze pe domeniul dumneavoastră: link-uri, imagini, căutare și ratingurile articolului.

Sub site-ul dumneavoastră principal

În Config, apoi Help Center, deschide Încorporează tab și găsiți "Arată centrul de ajutor pe propria adresă web." Alege configurare (Cloudflare, Nginx sau Apache), copiați blocul gata-made, și lipi în site-ul dumneavoastră. Fiecare opțiune are o Ghid de configurare buton de lângă ea cu pașii exacti.

Pe un subdomeniu

Preferă help.yourdomain.com? Același panou are o opțiune subdomeniu. Pe Cloudflare un subdomen este cel mai fiabil traseu, și vă oferă o adresă curată cu nimic după aceasta.

💡
Folosind Cloudflare? Acesta rulează doar Worker-ul său pe o adresă care este proxy prin Cloudflare Domeniul dvs. principal indică adesea direct către site-ul tău, astfel încât o regulă plasată pe domeniul principal nu poate face nimic în liniște. Modul de încredere este un subdomeniu proxy precum help.yourdomain.comGhidul de configurare vă plimbă prin cel DNS record și ruta.
Bine pentru SEO. Odată ce centrul de ajutor este pe domeniul tău, motoarele de căutare indexează articolele sub marca ta. Fiecare pagină declară adresa corectă și harta site-ului le enumeră, astfel încât același articol nu este niciodată indexat de două ori.
💡
Folosind link-ul de ajutor în widget prea? În setările "Deschideți în centru de ajutor," set Unde merge legătura la Domeniul tău de centru de ajutor și introduceți aceeași adresă. Apoi, aceste link-uri articol deschis pe domeniul dvs., de asemenea, nu pe adresa OpsIQ _.

Vezi cum se descurcă tot centrul tău de ajutor.

Dincolo de voturile unui singur articol, Centrul de Ajutor are propriul său analiză. Comutați-l pe în Setări Help Center și se înregistrează în liniște modul în care oamenii folosesc ajutorul dumneavoastră: articolele cele mai vizionate, ceea ce caută, și căutările care au venit înapoi gol (o listă gata de a scrie), de lucru țară vizitator și dispozitiv pe cont propriu, astfel încât nu are nevoie de widget-ul de chat instalat pentru a raporta. Fiecare număr este afișat pentru Ambele locuri de ajutor apare, pagina publică și ajutorul în-widget, precum și combinate, astfel încât să puteți vedea cât de mult fiecare este de fapt folosit.

💡
Analytics rămâne oprit până când îl porniți, și puteți avea vizitatori IP adrese anonimizate. Nimic nu este înregistrat înainte de a opta în.

Alege ce apare pe fiecare parte a paginii

Fiecare secţiune a Centrului de Ajutor (categoriile de pe pagina principală, articolele populare, lista cu articole de pe o pagină şi altele) are propria regulă simplă. Pentru fiecare dintre ele puteţi să-l arătaţi sau ascundeţi şi să-i arătaţi toate elemente, a număr de set, the ultima, sau numai cele pe care le caracteristică Când o regulă acoperă lista, clienţii primesc încă o legătură "Arată tot," aşa că nimic nu e cu adevărat imposibil de atins.

De asemenea, decideți cum arată voturile utile: ascuns, un raport prietenos ca "12 din 14 a găsit acest lucru util, sau simplu degetele de la picioare contează. Un set minim-voturi oprește un articol nou-nouț care arată un ciudat "0din0".

A se vedea articolele care funcționează

Fiecare articol arată un A fost de ajutor? prompt. Fiecare da sau nu este numărat pe articol, astfel încât să puteți vedea dintr-o privire care articole răspunde bine la întrebări și care au nevoie de o rescriere. Voturi repetate din același vizitator sunt ignorate, astfel că numărul rămâne cinstit.

Text și etichete

Puteți schimba rubricile și etichetele de pe Centrul de ajutor pentru a se potrivi vocea ta. Lăsați orice câmp gol și cade înapoi la un implicit sensibil, astfel încât să editați doar textul pe care doriți de fapt să-l modificați.

Centrul de Ajutor împarte o bibliotecă cu AI-ul tău. Fiecare articol pe care îl publici aici este același conținut pe care AI îl folosește pentru a răspunde la chat-uri și bilete, astfel încât îmbunătățirea unuia îmbunătățește celălalt.

Întrebări frecvente

Trebuie să scriu un conţinut separat pentru Centrul de Ajutor?+

Nu. Este construit din aceleași articole de bază cunoștințe pe care AI le folosește deja. Publică un articol o dată și poate servi atât.

Pot păstra nişte articole interne?+

Da, doar articolele pe care le publicaţi şi marcaţi apar în Centrul de Ajutor.

Clienţii vor mai putea ajunge la o persoană?+

Da. Widgetul ajută la conectarea stă un robinet departe de a începe o conversație, astfel încât auto-servire nu prinde pe nimeni.

Creștere și SEO

Site Intelligence (Suite SEO)

Site Intelligence este OpsIQ_ built-in SEO și suita de căutare. Acesta se târăște site-ul dvs. ca un motor de căutare, piese în cazul în care rang, cercetare cuvinte cheie, ceasuri backlink-uri și concurenți, scanează prezența hărții locale, verifică viteza paginii, și transformă totul în rapoarte pregătite de client, cu un analist AI care explică ce să stabilească și poate elabora remedieri. Este o caracteristică premium; atunci când este activată ca informații site-ului în bara laterală. Datele fiecărui domeniu rămâne separat, crawlere, clasamente și rapoarte nu se amestecă niciodată între domenii.

Informaţii despre site-uri
Tablou de bord pentru informații despre site-ulUn tablou SEO care arată un scor site-sănătate, rang de urmărire cuvinte cheie și o tendință de trafic.Informaţii despre site-uriyoursite.com86SITE-UL DE SĂNĂTATE3 probleme criticeUrmărire rang cuvânt cheieAi ajutordesk#3Chat live cu fete#7CRM pentru agenții#12Clicuri organice1CrawlGăsește probleme tehnice2TRACKRanks, cuvinte cheie, linkuri de întoarcere3AI ANALISTExplicații și remedieri
Prezentarea site-ului Intelligence: un scor de sănătate site-ul de la cel mai recent crawl, live keyword rang tracking, o tendință organic-clicuri, și bucla trei pas: crawlere, pistă, lăsați AI proiecta remedieri.

Obținerea de informații despre site

Site-ul de informații face parte din planurile care o transportă. Pe un plan care nu, funcționează exact ca PeopleOS HR: proprietarul contului deschide Cont → Add-ons & Tokens, alege un nivel Site Intelligence și începe procesul gratuit sau îl adaugă pur și simplu. Un plan liber, sau un plan plătit încă în cadrul propriului său proces de plan, nu-l poate adăuga. Până când este deținut suita este ascunsă din bara laterală și o legătură directă oferă add-on; atunci când se ajunge la pagina de plafon oferă următorul nivel; atunci cand un proces se termină fără achiziție dreptul este eliminat și nimic nu este taxat. Tiers și prețurile trăiesc pe cont, astfel încât a se vedea nivelurile curente pe nivelul pagina de prețuri.

Rulează o crawl · începe aici

Un crawl este OpsIQ vizitand paginile tale asa cum ar face un motor de cautare, pentru a gasi probleme tehnice: linkuri rupte, titluri lipsa, continut subtire, pagini lente, probleme de indexare.

1
Începeţi să vă târâţi

Pe scurt, faceți clic pentru a începe un crawl. OpsIQ coadă și funcționează prin paginile în fundal; un indicator de stare arată progresul.

2
Citiţi rapoartele.

Când se termină, deschideți problemele și lista de pagini. Fiecare problemă este grupată în funcție de severitate astfel încât să abordați cele mai mari victorii primul.

3
Lasă AI-ul să ajute.

Analistul AI produce un scurt de limbaj clar despre ce este greşit şi de ce contează, şi poate genera sugestii care să vă ajute să faceţi o analiză înainte de a aplica.

Ce urme de informații site-ul

Crawls & Site Health

Scanează paginile pentru probleme tehnice SEO și enumeră fiecare pagină cu problemele sale. Re-run oricând, sau programați-l.

Urmărire rank

Adaugă cuvintele cheie la care ţii; OpsIQ verifică unde se află site-ul dvs. şi se deplasează în timp.

Cercetarea cu cuvinte cheie

Descoperiți idei noi de cuvinte cheie pentru a viza, cu antrenorul cuvânt-cheie AI pentru a ajuta la prioritate.

Conexiuni

Vezi cine link-uri la tine, reîmprospăta lista, și dezavoare link-urile pe care nu doriți asociat cu site-ul dumneavoastră.

Concurenți

Adăugaţi domenii concurente şi comparaţi vizibilitatea dumneavoastră cu a lor, cu o analiză concurent AI.

Grilă locală (map)

Scanarea locală-listare vizibilitate pe o rețea geografică pentru a vedea unde apari pe hartă, plus Google Business Profil instrumente.

Viteza paginii

Rulați pagini-viteză controale astfel încât să puteți fixa pagini lente care rănesc clasamente și conversii.

Conținut AI

Generează slipuri de conținut și schițe destinate cuvintelor cheie pe care le vizează.

Rapoarte

Construieşte rapoarte tipografice, gata pentru clienţi, despre tot ce se află mai sus.

Conectează Google pentru date exacte

Doi conectori Google transformă estimările în numere reale:

Consolă căutare Google

Caută

Trageți întrebările exacte, clicuri și impresii Rapoarte Google pentru site-ul dvs., harta proprietatea ta, precum și oportunități de clasificare a suprafeței direct din datele proprii ale Googlor.

Google Analytics 4

Trafic

Adu datele de trafic și de angajament alături de datele SEO, astfel încât rapoartele arată vizibilitate și comportament împreună.

Reîmprospătează și raportează alb-etichetă programată

Nu trebuie să rulați totul manual. Reîmprospătează programat re-run crawlere, controale rang, verificări de cuvinte cheie, backlink refreshes, scanări locale și generarea de rapoarte pe o cadență (zi sau săptămână în funcție de plan și volum). Acestea rula prin OpsIQ cron, a se vedea Cron și secțiunea automatizare. Rapoarte generate export ca documente tipografice, client-gata: agențiile trimite fiecare client un curent regulat SEO, și pentru că datele fiecărui domeniu este separat, fiecare client vede doar propria lor.

Unele caracteristici ale site-ului Intelligence apelează furnizorii externi de date și AI prin OpsIQ Dacă o reîmprospătare nu funcţionează, confirmaţi OpsIQ Cron rulează (vezi Cron și automatizare).
Trebuie să adaug ceva pe site-ul meu pentru urmărirea SEO?+

Crawl-uri, urmărire rang, cercetare cuvinte cheie și link-uri de lucru fără a atinge site-ul dvs.. Pentru trafic și date de căutare exacte, conectați Google Căutare Console și GA4.

Pot urmări mai multe domenii?+

Da. Adăugaţi fiecare domeniu separat; lor crawlere, clasamente şi rapoarte se menţin complet izolate unul de altul.

Cât de des ar trebui să mă târăsc?+

Săptămânal este o multime pentru majoritatea site-urilor; crawl la cerere după un conținut mare sau schimbare de structură. Setați un program astfel încât să nu uitați niciodată.

Creștere și SEO

Auto-implicare (agent SEO)

Auto-Implement este partea de Site Intelligence care aplică efectiv remedierile crawl și analist AI recomandă, în loc să vă sfătuiască doar pe tine. Agentul lucrează strict din ceea ce site-ul Intelgence deja găsit (nu poate inventa o schimbare) și merge fiecare fix prin aceeași buclă sigură: un previzualizare uscată, aprobarea dvs. per pas, scrie live, un instantaneu automat, și o re-crawl care dovedește că numărul de open-issue a mers în jos. Este o funcție Managed-Al-doar; se pare ca acțiunea Auto-Inmplement (rocket) în cadrul secțiunii Site Informații, și este oprit până când îl porniți.

Implementare automată
Agent SEO de completare automatăUn flux care arată recomandat SEO Remedieri care se deplasează prin previzualizare, aprobare și un live scriere, cu o dovadă-it re-crawl.Implementare automatăyoursite.comFixări recomandateAdd missing <title>aprobatFix roboți. txtaprobatTrimite harta site-ului.xmlreexaminarePREVIZIUNE DRY-RUN (DIF)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>AprobareSariDOVEDEAZA-L - RE-CRAWLAspecte deschise 124Capcană salvată1PREVĂZUTDiff la fiecare fix2APROBĂ & SCRIESSH sau găzduit API3DOVEZI ȘI ÎNREGISTRAREARe-rulare + instantaneu
Cum se desfăşoară o sesiune: agentul enumeră remedierile pe care site-ul de informaţii le-a recomandat deja, arată un diff pentru fiecare, aplică cele pe care le aprobaţi SSH sau o gazdă API, fotografii înainte de fiecare scriere, și re-crawls pentru a dovedi numărul deschis-problemă scăzut.

Ce se poate schimba

Agentul aplică doar vreodată remedieri pe care Serviciul de Informații (sau analistul AI) le-a recomandat deja pentru acest domeniu.

Configurație server

Harta site-ului.xml, roboți.txt, și redirecționarea, regulile canonic și antet în .htaccess (Apache / LiteSpeed) sau configurația nginx.

Lanțurile de redirecționare

Se prăbușește un lanț de redirecționare multi-hop până la un singur hop direct la final URL, în interiorul aceluiași bloc . htaccess gestionat, astfel încât viteza și valoarea de legătură nu mai scurgeri prin hamei suplimentar.

Page <head>

Titluri lipsă sau slab pagini, meta descrieri, etichete canonice și blocuri structurate de date (schema).

WordPress SEO

Yoast, Rank Math și SEOPRESS titluri & meta, și imagine alt text, aplicate prin WP-CLI pe SSH calea sau REST API pe drumul găzduit.

WordPress date structurate

Adaugă JSON- LD (schema) la pagini care lipsesc. SSH calea un mic ajutor gestionat (un plugin must-use) imprima marca, astfel încât acesta funcționează cu sau fără un plugin SEO; pe calea găzduită plugin-ul dvs. SEO o poartă.

Legături interne

Adaugă o legătură internă relevantă în interiorul actualului WordPress conţinut pentru a salva pagini orfane şi conectaţi posturi conexe. Un link pe pagină, niciodată în interiorul unui titlu, un link existent sau o scurtătură de cod, şi întotdeauna aprobat de tine primul.

Conţinutul pe o pagină subţire rescrie

Proiecte de conținut complet de înlocuire pentru pagini subțiri (pornit de o opțiune crawl, vezi mai jos). Fiecare proiect este revizuit și aprobat de tine înainte ca orice publică, iar conținutul vechi este păstrat astfel încât să poată fi restaurat.

Cache-ul paginii (WordPress)

Pornește cache-ul paginii Cache Total W3 atunci când crawl găsește probleme de viteză și că plugin-ul este instalat, astfel încât paginile servesc mai repede.

Shopify SEO

Produse și colecții titluri SEO & descrieri, pagină și articol de blog SEO, plus 301 redirecționări, prin intermediul Shopify Admin API.

Webflow SEO

Pe pagina SEO titlu și meta descriere prin intermediul Webflow Date API v2.

Pregătiţi automat remedierile (două opţiuni de crawl)

Site-ul Intelligence Configurați panoul pentru un domeniu (setări de crawl) are două opțiuni care decid cât de mult se aliniază agentul pentru tine înainte de timp. Ambele sunt oprite implicit și ambele utiliza credit AI, astfel încât să le comutați doar atunci când doriți ca munca făcută pentru tine.

Fixări AI auto-prepare după fiecare crawl

Fiecare crawl scrie, de asemenea, conţinutul fix beton (titluuri, meta descrieri, alt text, schema, redirecționări) pentru ceea ce a găsit, astfel încât remedierile sunt gata să revizuiască şi să aplice momentul în care se termină crawler în loc de a fi generate mai târziu la cerere.

Conţinutul AI rescrie (pagini mici)

Agentul poate proiecta conținutul complet de înlocuire pentru pagini subțiri. Nimic nu este niciodată publicat pe cont propriu: fiecare proiect apare ca o schimbare vă revizuiți cot la cot și aproba sau respinge, conținutul anterior este păstrat astfel încât acesta este reversibil, și se limitează la câteva pagini per trecere. Folosește credit AI pe proiect.

💡
Ambele opțiuni doar pregătește și proiectează munca. Fiecare schimbare încă mai trece prin aceeași aprobare per pas, instantaneu și rollback ca orice altă fix, astfel încât transformarea lor pe nu pune nimic viu de la sine.

Două moduri în care se conectează

SSH / SFTP cale

Autogestionate

Pentru site-uri de pe propriul server, agentul se conectează peste SSH/SFTP folosind acreditările pe care le stocați, editează serverul config și pagini fișiere direct, și rulează WP-CLI pentru WordPress. Cel mai bun atunci când aveți acces coajă și doriți controlul complet al fișierelor.

Gazduit...API cale (nu SSH)

Fără coajă

Pentru platforme care nu permit SSH, agentul lucrează în întregime printr-un oficial API conector; WordPress (Rest + parole de aplicare); Webflow (Date API v2) şi Shopify (Admin API). Nimic nu este instalat pe gazda.

💡
Wix și Squarespace nu au SEO-write public API, așa că pe aceste platforme Auto-Implement rulează în modul consultativ: vă arată schimbarea exactă de a face (titlul precis, meta sau setarea) pentru tine să se aplice cu mâna. Orice altceva este doar citit și sigur.

Porneşte conectorii.

Agentul ajunge la fiecare platformă printr-un conector:

Construit în

Shopify şi WordPress navă conector cu OpsIQ, doar le permiteți sub Conectori și adăugați acreditările magazin / site-ul.

De la magazin

Webflow, Wix și Squarespace instalează de la Connectoare → Marketplace, apoi conectează-te în același mod.

Cum se desfăşoară o sesiune

1
Alegeţi remedierile

Deschide Auto-Implement (rocket) din secțiunea Site Intelligence. Acesta enumeră problemele site-ului de informații deja descoperit că poate fixa pe acest domeniu.

2
Previzualizează fiecare modificare

Pentru fiecare fix agentul arată un diff uscat-run (exact ceea ce va scrie) înainte de orice atinge site-ul live.

3
Aprobare pas cu pas

Sunteți de acord (sau săriți) fiecare schimbare individual. Nimic nu se aplică fără acordul explicit pe care pas.

4
Scrie, apoi poze

La aprobare, agentul face schimbarea live peste SSH sau gazda API şi salvează o fotografie mai întâi, astfel încât orice schimbare poate fi rulat înapoi.

5
Dovedeşte-o, trăieşte

Deoarece se aplică fiecare schimbare agentul imediat re-verifică că pagina exactă și arată un per pas

Siguranţă şi facturare

Numai SEO

Agentul poate face doar ceea ce Site Intelligence recomandat pentru acest domeniu. Nu poate face modificări arbitrare la site-ul sau serverul dumneavoastră.

Omologarea pe etape

Fiecare scriere este previzualizată ca un diff și aplicată numai după ce aprobați acest pas specific.

Captură de & rollback

O fotografie este salvată înainte de fiecare scriere, astfel încât orice schimbare poate fi returnată.

Dovadă vie per pas

Fiecare pagină schimbată este reverificat imediat ce este scris și primește un

Conținutul nu este niciodată auto-publicat

Link-urile interne și rescrierile de conținut pe pagini subțiri sunt un impact mai mare, astfel încât acestea vă sunt întotdeauna afișate pentru aprobare și nu se aplică niciodată automat, indiferent de modul în care executați.

Numai IA administrat

Auto-implicarea ruleaza pe AI administrat; este blocat atunci cand un spatiu de lucru foloseste propriile taste (BYOK_).

Facturarea

AI tokens proiect de lege în mod normal ca le utilizați, plus o taxă plată pe utilizare per sesiune Auto-Implement, ambele extrase din același credit Managed-AI.

Auto-implicarea este dezactivată implicit. Activați-l pe pagina de configurare AI (Cartea automată) și asigurați-vă că conectorul pentru platforma dumneavoastră este conectat primul.
Se schimbă ceva fără să întrebi?+

Nu. Fiecare schimbare este previzualizat ca un diff de rulare uscat și aplicat numai după ce aprobați că pasul exact. Un instantaneu este salvat înainte de fiecare scrie, astfel încât să puteți rola înapoi.

Am nevoie SSH Acces?+

Nu pe WordPress, Shopify sau Webflow Cei care lucrează prin intermediul lor oficial APIs fără acces la scoică. SSH este doar una dintre cele două căi, utilizate atunci când doriți agentul pentru a edita serverul config și fișiere direct pe propriul server.

De unde ştiu că a funcţionat?+

După aplicarea remedierilor aprobate agentul re-crawls site-ul și arată numărul de open-issue înainte și după, astfel încât să puteți confirma remediile reduse problemele.

Va rescrie sau publica conţinutul paginii pe cont propriu?+

Nu. Rescrierile continutului AI sunt oprite pana cand le pornesti in optiunile crawl, ele se limiteaza la cateva pagini subtiri pe trecere, si fiecare proiect va este aratat pentru aprobare unul cu altul inainte de orice publica. Continutul anterior este pastrat, astfel incat o rescriere poate fi mereu returnata.

Pot să-l folosesc cu propriile mele chei AI?+

Nu. Auto-Implement este administrat numai AI și este blocat sub BYOK_. Acesta facturile AI jetoane în mod normal plus o taxă plat pe utilizare pe sesiune, de la același credit Managed-AI.

Creștere și implicare

Studioul de sondaj

Studioul este spatiul de lucru pentru crearea unor sondaje editabile care pot fi livrate ca o pagina bogata independenta, widget site-ul sau inline. Produsul actual ofera si linkuri gazduite, previzualitati semnate, invitatii private, partajarea QR, navigarea raspunsului si analiza scanata. Site-ul widdgetul este una din optiunile de livrare; nu este definitia unui studiu.

⚠️
Limita actuală împotriva țintei: experienta de creare si previzualizare a primei, Connector Builder survey capacitatea, și de sine stă la dispoziţie registrul furnizorului / limita de sănătate. Studioul Survey are nevoie încă de arhitectura independentă multi-locuire, sondaj semnat-token Identity Gateway, cablare ţintitoare/variabilă, flux de trimitere CRM Outreach şi tastat surveys.* API.

Creează un sondaj

1
Alege cum vor reacţiona oamenii.

Actualul expert oferă pagina Standalone & link, widget Website și Inline integrate. Fluxul țintă aprobat începe cu tip sondaj și adaugă mai târziu e-mail CRM, privat-link și de implementare QR ca alegeri de primă clasă.

2
Alege scopul

Pick NPS, CSAT, CES, feedback produs, post-achiziție, anulare, la bord, site-ul, eveniment, webinar, suport, plumb / demonstra, proces, marturie, cercetare, angajat, admisie sau feedback general.

3
Utilizați un șablon complet sau Start gol

Catalogul curent are startere editabile gata grupate după scop. Alegerea unui șablon creează un proiect copiat: schimbarea sondajului nu schimbă starter-ul sau alt studiu.

4
Personalizare sau revizuire rapidă

Personalizarea deschide fiecare întrebare, design, comportament și control al livrării. Revizuirea rapidă deschide același proiect la verificarea finală a clientului-view. Nimic nu publică sau trimite automat.

Alegeri de livrare și comportamentul prezent

& Link pagină independentă

O pagină de marcă receptivă cu propriile sale URL. Utilizați invitații private și expirare atunci când fiecare destinatar are nevoie de un link controlat. Puncte de partajare QR la această experiență găzduită.

Interceptare site-ul web

Canalul moștenitor migrat. Acesta poate utiliza pagina, geografie, dispozitiv, vizitator, data, eșantionare, răcire, vizita și regulile de cote. Este încă susținută de moștenit pod activ-widget în timp ce arhitectura de desfășurare este construit.

Incorporat

Un studiu de răspuns plasat în interiorul unei pagini, portal, produs sau centru de ajutor. Nu necesită Studio de Promotion.

E-mail

Astăzi Studioul poate genera invitații HTML și link-uri private. Trimiterea de la un capăt la altul a contactelor/segmentelor CRM, cu consimțământul, suprimarea, programarea, rejudecarea și corelarea răspunsului, este ținta aprobată pentru integrarea CRM Outreach.

Proiectare și previzualizare a întreprinderilor

Paginile de sondaj au teme și familii de localizare a paginilor, controale receptive, o copie de bun venit și completă, precum și un proiect semnat previzualizare. Previzualizarea designer este complet sub editor, nu o linie laterală îngustă. Folosește timpul real găzduit într-un cadru cu nisip și suportă desktop, tablete și lățimi de telefon; trafic preview nu scrie răspunsuri sau analize.

💡
Studioul este independent de Promotion Studio. Ţinta pe timp de rulare, identitatea, activele, redarea şi analiza trebuie să fie în proprietatea unui studiu. Conţinutul promoţional poate fi reutilizat doar printr-un exemplar/import explicit care creează date ale sondajului detaşat; mai târziu ediţiile Promoţiei nu trebuie să aibă efect.

Produsul complet sub formă de hârtie

Desfășurări independente

Trăieşte

Un sondaj poate avea pagina, widget-ul, înglobat, e-mail CRM, link-uri private și QR desfasurate separat, fiecare cu propriul stat, design, audiență și analiză. Fiecare studiu poate fi oprit, dezactivat sau șters.

CRM Outreach și campanii

Trăieşte

Construieste un public verificat din segmentele CRM si Conectori Capabili de Survey, congeleaza-l intr-o versiune imuabila, emite o invitatie semnata fiecare, si trimite prin conectorul e-mail cu pinted outbound cu per-invitație dovada de livrare.

Kit de teren și validare

Trăieşte

Sliders, alegerea imaginii, upload file, signature, address, phone, headings and boged text, with min/max length, email/URL/setări numere, text de eroare personalizat și prefill per întrebare URL parametrii.

Logica, formule, rezultate

Trăieşte

AND/OR grupuri de condiție, regulile sucursalei, un motor formula sigur peste răspunsuri, și benzi scor care poartă propria lor pagină de rezultat: un test marcat terenuri pe verdictul său.

Limbaj, chioşc, prefill

Trăieşte

O scădere a limbii vizitatorilor listarea numai limbi cu traduceri reale, modul chiosk pentru tablete comune (ţinte mai mari, auto-resetare, nici redirecţionări), un constructor de link prefill, şi editabil securizat-badge şi text Footer.

Versiunea A/B de testare

Trăieşte

Publică o versiune de challenger pe orice implementare cu un drum divizat. Vizitatorii sunt repartizați litic, răspunsurile sunt ștampilate cu versiunea de fapt servită, iar tabelul compară arată răspunsuri, finalizare și scor mediu per versiune. Promovați câștigătorul într-un singur click.

Digerare săptămânală

Trăieşte

Un e-mail săptămânal cu ultimele 7 zile de studiu KPI, cele mai aglomerate sondaje, pulsul Feedback și ultima informare AI, trimise prin conectorul blocat outbound. Configurați-l în centrul de livrare, Automatizare.

Guvernanță

Trăieşte

Lista de acces per-supraveghere restricţionează cine poate edita, publica sau şterge un sondaj. Publicarea aprobării (patru ochi) necesită un al doilea admin pentru a elibera proiectul exact; editarea resetează aprobarea. Proiecte de linkuri de acţiune permite unui revizor să vadă proiectul real fără logare în.

Platforma dezvoltatorului

Trăieşte

Contract de conectare 2.2, sondaje dactilografiate. * și feedback-ul.* acțiuni privind api/v1, canonic survey.* evenimente, durabil semnat site-uri web cu formate de releu Slack și Google Sheels, și un singur răspuns PDF export.

Creștere și implicare

Analizele de analiză și Feedback sunt produse diferite

Sondaj Analytics explică modul în care un sondaj se ajunge la oameni și performante. Feedback explică ceea ce clienții au spus în toate sursele permise și ceea ce afacerea ar trebui să facă despre aceasta. Cele două produse se leagă unul de altul, dar nu partajează sau suprascrie adevărul analitic.

Analize de analiză

Intrat din sondajul individual in Studio Survey, nu de navigare la nivel global. Acesta măsoară eligibilitatea, expunerea, declanșarea comportamentului, începe, finalizarea, abandonarea, întrebări și frecare ramură, calendarul, implementarea/campaign / versiune rezultate și fiabilitatea runtime.

Prezentare generală și Inbox

O transmisie cronologică permisiune-conştientă pentru răspunsurile complete ale sondajului, feedbackul widget moștenit, chat și bilet CSAT, feedback-ul răspuns la bilete, ratingurile de răspunsuri client AI, voturile utile bazate pe cunoștințe și sursele externe/custom aprobate.

Analiza feedbackului

Analizaza cumpararea intelesului clientului: tendinte metrice originale, subiecte/teme, sentiment, emotie, intentie, urgenta, cereri, reclamatii, laude, segmente de calatorie/produs/service/team, detractatori si rezultate inchise.

Proprietatea datelor

Răspunsurile sondajului rămân autorizate în depozitul de probe. Feedback stochează o referință sursă reconstrucabilă și semnale derivate, apoi încărcăturile permise la cerere. Un răspuns complet al anchetei devine cel mai mult un element Feed-back.

⚠️
Pagina curentă Feedback încă mai are un browser de răspuns Sondaj și o inbox separat widget moștenire, iar totalul său AI nu utilizează încă modelul complet normalizat sursă. ORIENTAREA / Inbox / Analytics / Surse & sănătate este ținta de implementare.

NPS, CSAT, CES, stele, degete mari și de ajutor trebuie să păstreze întotdeauna metoda lor originală, scară, eșantion, fereastră data și numitor. Ele nu trebuie niciodată combinate într-o singură medie inexplicabilă.

Creștere și SEO

Studiou de promovare

Studioul de Promotie transforma site-ul intr-un motor de conversie. Design pop-up-uri, bannere, slide-in-uri , bare de top / fund, preluare full-screen, blocuri linia si chiar redirectionari bazate pe tara, apoi arata mesajul potrivit pentru a vizita dreptul la momentul potrivit. Totul este livrat prin intermediul OpsIQ widget deja pe site-ului dvs., astfel încât nu există nimic suplimentar pentru a instala. Tu de proiectare și salva campaniile oricând; ei arată doar o dată ce le Publish şi studioul este pornit pentru spaţiul dumneavoastră de lucru.

Studiou de promovare
Promovare Studio designerUn designer de campanie vizuală cu o paleta blocuri, un pop-up pe pânză, și un panou de direcționare.Studio de promovare - DesignerBLOCĂRIxBine ai venit, {first_name}!Du-te 15% Din prima comandă.SAVE15Pretindeţi că cuponul meuŢINTIUNEȚaraStatele Unite ale Americii, CADeclanşatorIntenția de ieșireA/B divizat50 / 50Publică1PROIECTAREBlocuri de dragare pe panza2ŢINTĂŢară, pagină, public3MĂSURICâştigător A/B + perspicacitate AI
Designerul vizual: o paleta de blocuri pe stânga, campania ta pe pânză (aici se află un cupon personalizat pop-up folosind un jeton {first_name}), iar ținta + panoul public din dreapta.

Imaginea de ansamblu

Campania

Ce?

O promovare: pop-up, banner, bar, slide-in, full-screen, bloc inline sau geo-redirect. Fiecare are un scop: vânzări, plumb, înscrieri, chat, sondaj, anunț.

& Versiuni de proiectare

Cum

Construiești aspectul în editorul vizual. Fiecare salvare creează o nouă versiune, astfel încât să puteți rula întotdeauna înapoi. Nimic nu este vreodată pierdut.

Ţinta

Cine?

Cine vede: țară, pagină, dispozitiv, sursa de trafic, întoarce vs nou, program, și (cu un conector) clienții dumneavoastră logat-in.

Declanșatoare

Când

Când apare: instantaneu, pe termen lung, pe sul, pe ieşire în intenţie, când este inactiv, pe un clic, după paginile N sau din activitatea de chat / ticket.

Analize

Rezultate

Impresii live, clic-prin intermediul, conversii, o pâlnie drop-off, țară / pagină / dispozitiv se împarte, câștigători A/B și o înțelegere AI.

Lansați prima promovare în 5 pași

1
Începeți de la un șablon sau un martor

Open Promotion Studio și faceți clic pe noua campanie, sau alege un design gata făcut din galeria șabloane. Un proiect se deschide în designer.

2
Proiectează-l.

Trageți în blocuri, rubrici, text, butoane, imagini, insigne, statistici, numărătoare inversă, forme, cupoane, videoclipuri, ratinguri, rotiri. Culori stil, gradienți și efecte 3D cu slider-urile. Preview Desktop / Tabletă / Mobile, și de a folosi Mutare gratuit pentru a plasa orice oriunde.

3
Personalizează-l.

Tip jetoane ca {first_name}, {country} sau {company} În timpul spectacolului, devin valorile reale ale vizitatorilor.

4
Declanşator ţintă

Alege cine o vede (ţară, pagină, dispozitiv, public) şi când trage (întârziere, defilare, ieşire intenţionată). Lasă o regulă goală pentru toată lumea.

5
Verificați, apoi publicați

Faceți clic pe Verificați pentru o scanare rapidă înainte de lansare, apoi Publish. Acesta merge live în câteva secunde și începe colectarea de analize.

Blocuri pe care le puteți construi

Conţinut

Nucleu

Rubrica, paragraful, lista, citatul, imaginea, pictograma, insigna, stat, separator și distanțier, elementele de bază ale oricărui mesaj.

Apel la acțiune

Nucleu

Butoni cu acţiuni reale: deschide un link, începe o discuţie, crea un bilet, copia un cupon, sau sari la o pagină.

& Captură de urgență

Primă

Numărătoare inversă, formulare (email / telefon / text), relevă cupoane și înglobări video.

& Reacție Gamified

Primă

Roți cu rotire la câștig, cărți de zgârieturi, rating NPS / stele și pâlnii multi-pasi.

Efectele & aranjamentului

Primă

Columne, bare de progres, social parts, bickers de dovezi sociale, da / nici două etape, teste, și efecte 3D, înclinare, strălucire, paralax, sticlorfism.

Arsene de personalizare

Tastaţi oricare dintre acestea în rubrici, paragrafe, butoane, insigne, statistici, liste sau citate. Acestea sunt înlocuite cu detaliile live ale vizitatorilor în momentul în care se prezintă promovarea (întotdeauna curăţate pentru siguranţă):

Jetoane disponibile
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)

Trimitere la țintă

Țara și locația

Arată numai în (sau ascunde de) țările alese, orașele sau fusurile temporale prin GeoIP. Mare pentru oferte specifice regiunii sau un geo-redirect.

Pagini & URLs

Limita la anumite pagini folosind egal / starts-with / contine / regex, si excludeti si paginile.

Dispozitiv

Desktop, tabletă sau mobilă, de exemplu o bară subțire pe mobil, un modal pe birou.

Tipul de vizitator

Nou, revenind, cunoscut (în CRM) sau anonim; segmente CRM, stadiul ciclului de viață, scorul de plumb sau limbajul browser-ului.

Sursa traficului

De UTM (utm_source, utm _campaign) sau de site-ul de referință, de exemplu, numai vizitatori dintr-o anumită reclamă.

& Frecvență program

Data inceperii/terminalului, timpul-zilei ferestrelor si cat de des o persoana poate vedea (pe sesiune, pe zi, dupa ce se inchid / click / converti).

A/B, împărțite în trafic

Arată unui procent de vizitatori și rulează variante cap-la-cap; aceeași persoană vede întotdeauna aceeași variantă.

Audiențe (loged-in)

Cu un conector activat, țintă de stat cont live, de exemplu clienții cu facturi neplătite sau abonați activi.

Declanșatoare

Alege cum apare promovarea: Imediat, dupa o intirziere, pe adancime de defilare, la iesire-intenta, cand este inactiv, pe un click al unui element, dupã un numãr de pagini vizualizate, pe forma-abandon sau din activitatea chat / bilet. Dezvoltatorii pot trage unul din propriul cod cu window.OpsIQPromo.fire('event').

Clienți conectați la țintă (conectori)

Aceasta este ceea ce face OpsIQ promoții speciale: conectați o platformă ca WHMCS (sau orice conector care sprijină publicul) și studioul poate viza vizitatorii prin starea contului lor live.

1
Activează un conector de audiență

În cadrul Conectorilor, permiteți unei persoane care expune faptele audienței (WHMCS nu este scos din cutie). Clienții sunt recunoscuți în siguranță atunci când sunt conectați pe platforma respectivă; OpsIQ nu are încredere într-un e-mail tastat.

2
Adăugați o regulă de audiență

În campania de Targeting > Publicul, necesită logat-in și adaugă reguli cum ar fi facturile neplătite (> 1, abonamentul este datorat în trecut sau creditul contului > 0.

3
Personalizează cu datele lor

Utilizați jetoane, cum ar fi {first_name} sau {balance_due}. Un memento "Ai o factură restante" se scrie.

Ţinta publicului este de siguranţă: dacă conectorul nu poate confirma un fapt (sau vizitatorul nu este conectat), promovarea pur şi simplu nu apare, astfel încât o ofertă orientată spre facturare nu ajunge niciodată la persoana greşită. Construirea propriului conector? Vezi "Promovarea audienţei" de mai jos.

Comerțul conectat (superputerea studioului)

Carduri de produs din magazinul dvs.

Date în direct

Un bloc de produse trage elemente reale (nume, preț, prețul de vânzare, imagine, link) direct din WHMCS, WooCommerce, Shopify sau OpsIQ Tick "Păstrați proaspete" și cardul actualizează prețul de pe platformă în fiecare oră în timp ce a fost publicat.

Cupoane furnizate în magazin

Cupoane

Un bloc de cupoane poate crea codul real de reducere în magazinul dumneavoastră în momentul publicării, astfel încât codul un vizitator dezvăluie întotdeauna funcționează la checkout.

Venituri din ordine și adevăr

Atribuție

Ordinele reale de pe platformele dvs. sunt egalate cu campaniile din oră în oră (prin codul cuponului folosit sau prin e-mailul liderului), astfel încât veniturile pe care le vedeți provin din vânzări efective, nu estimări.

Adevărata dovadă socială

Încredere

Ticălosul rezistent la socializare poate conduce cu comenzi recente autentice ("Ada a ordonat Starter Plan · 2h acum"), prenume și articol numai, nu e-mailuri sau sume.

Experimente și călătorii

Variante A/B & automat-winner

Împărțirea traficului prin variante de proiectare; permiteți studioului să promoveze automat câștigătorul statistic, sau traficul manual către optimistul bandit care transferă vizitatorii spre ceea ce transformă ca dovezi vine.

Înălțare de susținere

Rezerva o felie de vizitatori care nu văd nimic, astfel încât să puteți dovedi campania în sine cauzează lift.

Variante segment

Diferite conținut pe public în cadrul campaniei SAME (vizitatori mobili, cărucioare mari, clienți returnați), fiecare segment primește propria versiune.

Experimente de declanșare

Variantele pot, de asemenea, să încerce CÂND trebuie să apară: imediat vs întârziat vs în intenţie de ieşire, măsurat cap la cap.

Călătorii (lanț)

Ţinta prin ceea ce a făcut cineva cu o altă campanie ("a văzut campania A dar nu s-a convertit") pentru a construi secvenţe de promovare în mai multe etape.

Tease

O mică pilulă vizitatori se pot redeschide după închiderea campaniei, astfel încât un pop-up închis nu este niciodată plecat pentru totdeauna.

Stii ce s-a intamplat

Click pe caldura

Proiectant

În designer, comutaţi mapa pentru a picta clicuri reale vizitatori peste fiecare bloc al designului.

Pâlnie de pas

Pâlnie

Campaniile multi-step arată exact unde cad oamenii, ecran cu ecran.

Compară campaniile

Studio

Pune până la patru campanii cot la cot (impresionări, clicuri, conversii), cea mai bună valoare evidențiată.

& Digeră povestea săptămânală

AI

În fiecare luni, un digerat aterizează în notificările dumneavoastră; butonul 📖 Poveste săptămânală scrie un rezumat simplu cu pașii următori ori de câte ori doriți unul.

Lucrul confortabil

Copilot AI & idei

Discutați cu copilotul de proiectare pentru a edita panza ("faceți titlul urgent, adăugați o numărătoare inversă"), obțineți idei de campanie din datele dumneavoastră de trafic, traduceți o campanie pe țară sau fixați automat un scor mic de design.

Importul de mărci Kit

O comandă citește site-ul dvs. și propune culorile reale de brand și fonturi; salvați și fiecare picker conduce cu ei.

Pâlnii multi-creier

Blocurile de trepte se pot realiza pe ecran: tab-uri pentru fiecare ecran, adăugați sau reordonați ecrane și previzualizarea urmează.

Versiuni numite & prezenţă

Nume versiuni importante ("Lansare candidat"), restaura oricare dintre ele, și a vedea un avertisment atunci când un coechipier este editarea aceeași campanie.

Conductoare și conductoare de bandă pentru dispozitive

Vezi desktop, tabletă și mobil cot la cot într-o singură vedere; comutați conducătorii pixeli pentru plasarea precisă.

& Canale de pagini găzduite

Fiecare campanie poate fi, de asemenea, o pagină independentă găzduită pentru bio-uri și coduri QR, o secvență de picurare e-mail pentru piste capturate, sau un proiect de web-push un clic.

Siguranța întreprinderilor

Publică ferestre de înghețare (perioade de schimbare-înghețare), un comutator pauză de urgență, aprobări, traseu de audit și versiune rollback.

Trebuie să adaug cod pe site-ul meu?+

Nu. Promotiile sunt livrate de acelasi OpsIQ widget pe care deja l-ati instalat. Proiectare, publicare, facut.

Vor vedea vizitatorii acelaşi pop-up de peste si peste?+

Nu. Setează capacele de frecvenţă (pe sesiune / pe zi, sau opreşte după ce cineva se închide, face clicuri sau converteşte). Se aplică implicite sensibile.

Cine poate publica?+

Editura, pauza, arhivarea și rularea înapoi sunt limitate la proprietarii de spațiu de lucru și administratorii complet. Orice membru al echipei poate crea și proiecta proiecte.

Creștere și SEO

Proiectant promoție

Promotion Designer este un editor de bloc receptiv pentru construirea, revizuirea, versiune și publicarea unei experiențe de campanie.

Ecran produs
Proiectant promoțieDesignerul combină o pânză live, previzualizare dispozitiv, blocuri, variabile de personalizare, comentarii și istoria versiunii.Proiectant promoțiespațiu de lucruVIEWPORTBirouVERSIUNEv12STATProiectVIE VIU AIRPACEErou blocSediul principal, media și CTAEditareBloc de ofertăReduceri și termeneEditarePersonalizareVariabile de contact și campanieGata.Verificarea lansăriiObservații și validareRevizuire1BUILD BLOCKSEditează aranjamentul live2PREVĂZUTDesktop, tabletă, mobilă3PUBLISHVersiuneat de presă
Designerul combină o pânză live, previzualizare dispozitiv, blocuri, variabile de personalizare, comentarii și istoria versiunii.

Utilizați blocuri pentru a compune experiența, previzualizare fiecare viewport și introduce variabile de personalizare aprobate. Comentariile de revizuire și AI-media proveniență înainte de lansare. Salvarea creează versiuni astfel încât un proiect anterior poate fi inspectat sau restaurat.

Creștere și SEO

Modele de promovare

Modelele oferă o galerie de start pentru campaniile promoţionale.

Ecran produs
Modele de promovareGaleria de șablon filtrează machetele premium și aplică culorile mărcii de spațiu de lucru atunci când un model devine o schiță.Modele de promovarespațiu de lucruCATEGORIAConversieRESULTS24BrandCity in New York USAAplicatVIE VIU AIRPACEOferta de ieșireModal cu caracter urgent și CTAPrevizualizareNoi vizitatori bine aţi venitLista de beneficii și bannerPrevizualizareLansarea produsuluiErou, dovada şi numărătoarea inversăPrevizualizareCerere de feedbackSondaj compact promptPrevizualizare1FILTERCategorie și căutare2PREVĂZUTInspectează întregul proiect3USECreează un proiect de marcă
Galeria de șablon filtrează machetele premium și aplică culorile mărcii de spațiu de lucru atunci când un model devine o schiță.

Cauta sau filtreaza dupa categorii, încarcă rezultate suplimentare, previzualizare experienta completa, apoi alege Folosește șablonulNoua campanie rămâne un proiect și poate fi schimbat în Promotion Designer înainte de publicare.

Creștere și SEO

Analize de promovare

Promovarea analizei conectează impresiile și clicurile la conversii, contextul publicului, rezultatele acțiunii conectorului și învățarea campaniei.

Ecran produs
Analize de promovareAnalizele de promovare arată performanța principală, publicul și declanșează defecțiunile, conduce rezultatele acțiunii de export și conector.Analize de promovarespațiu de lucruIMPRESSIONS42.8kCTR6.4%CONVERSIONS814VIE VIU AIRPACEȚaraRegatul Unit · 31%DefalcarePagina/pricing · 22%DefalcareDeclanşatorIntenția de ieșire · 44%DefalcareAcţiune conectorCupon creat · 97% succesRezultatul1MĂSURIImpresii la conversie2SLICEPagina, țara, dispozitivul3LEARNAplică intuiția
Analizele de promovare arată performanța principală, publicul și declanșează defecțiunile, conduce rezultatele acțiunii de export și conector.

Citiți impresii, clic-prin rata și conversii împreună. Break rezultate în jos de țară, pagină, declanșator și dispozitiv; export captate conduce atunci când este necesar. Rezultatele acțiunii Connector arată dacă promoția promisă follow-up a fugit de fapt. Intuiție AI și rezumatele de învățare ar trebui să fie tratate ca ipoteze pentru a valida, nu dovada automată.

Creștere și SEO

Anunțuri

Anunturile publica un mesaj in zona de notificare widget cu tinta, programare si apel la actiune.

Ecran produs
AnunțuriEditorul de anunţuri include conţinut, CTA, public, segment, regula paginii, date active şi stil vizual.Anunțurispațiu de lucruSUBSTANŢĂ3AUDIENCESegmentSCHEMAIulie 22–29VIE VIU AIRPACETitluÎntreținerea planificatăGata.ConţinutMesaj MarkdownGata.CTACitiți actualizareaOpționalRegulaPagini de tarifare · clienți activiȚintă1WRITETitlu și Markdown2ŢINTĂPublicul, segment, pagină3SCHEMAFereastra activă
Editorul de anunţuri include conţinut, CTA, public, segment, regula paginii, date active şi stil vizual.

Alegeţi toţi vizitatorii, vizitatorii sau noii vizitatori; îngustaţi opțional publicul cu o regulă a segmentului de contact şi paginilor. Setaţi activ-de la/activ-la date şi un steag activ. Premium stil premium şi culori schimba prezentarea dar nu înlocuiţi conţinutul clar.

Creștere și SEO

Impinge campanii

Campaniile de împingere trimit notificări browser vizitatorilor abonați după ce au părăsit site-ul.

Ecran produs
Impinge campaniiCompozitorul impinge arata inscrieri, continut, media, actiuni, reguli tinta si stat de programare.Impinge campaniispațiu de lucruSUBSCRIBERS8,214TRIMIS31.6kCLICK RATE5.8%VIE VIU AIRPACETitluCăruciorul tău aşteaptă.Gata.CorpÎntoarce-te astăzi pentru livrare gratuităGata.CTACosul deschisGata.ProgramTrimite acum sau programatProiect1PREPARE PUSHTitlu, corp, pictogramă2ŢINTĂPublicul, segment, pagină3SENDAcum, program sau schiță
Compozitorul impinge arata inscrieri, continut, media, actiuni, reguli tinta si stat de programare.

Configurați mai întâi tastele de împingere Web sub setările de împinge web. O campanie poate include titlul, corpul, pictograma, imaginea eroului, insigna, CTA și până la două butoane de acțiune; o notificare persistentă rămâne până când vizitatorul interacționează.

Ţinta după public, segment de contact opţional şi regula paginii. Salvaţi un proiect, programaţi-l sau trimiteţi imediat. Utilizaţi abonamentul şi faceţi clic pe indicatori pentru a judeca ajunge. HTTPS şi un lucrător de servicii găzduit corect sunt necesare pe site-uri integrate terţe părţi; vezi Web Push pe siteuri terţe.

Creștere și SEO

Mesaje proactive

Mesajele proactive ajung automat în momentul în care comportamentul unui vizitator corespunde unei reguli, înainte de a cere. Construiți fiecare ca regulă cu trei părți: ce se întâmplă, când ar trebui să tragă și cât de des. Totul este livrat prin intermediul OpsIQ widget deja pe site-ul dumneavoastră.

Proactiv
Mesaje proactiveUn compozitor de reguli proactive în trei părți: alege o acțiune (chat, banner, tur, împinge, e-mail), adaugă condiții și setați o răcire a frecvenței.Mesaje proactivespațiu de lucru1 AcţiuneMesaj de chatBannerCity in GermanyTurÎmpingeE-mail2 · Condițiipage = /pricingora de la pagina > 20sse întoarce3 · FrecvenţaO dată pe sesiuneStare1ACŢIUNIchat, banner, e-mail, împinge...2CONDITIONSPagina, timpul, scorul, revenirea3FRECVENȚAConsolare per vizitator
Fiecare regulă proactivă este de trei opțiuni: ce se întâmplă (chat, banner, tur, împinge, e-mail, webhook), atunci când (condiții) și cât de des (cooldown).

Cele trei părţi ale unei reguli

1
Ce ar trebui să se întâmple (acţiune)

Arată un chat bubble sau pe pagina banner, începe un tur ghidat, trimite o împingere web sau e-mail, atribui la un departament, sau foc un webhook. Jetoane ca {{visitor_name}} şi {{page_title}} să devină valori reale.

2
Când ar trebui să tragă (condiții)

Îngust care declanşează: pagina /URL, timp pe pagină, adâncime defilare, scorul plumb, revenind vs nou, inactiv. Fără condiţii, regulile se aprinde pentru fiecare vizitator. Adăugaţi cel puţin unul pentru a-l viza. Condiţiile se combină cu ŞI.

3
Cât de des (frecvenţă)

Setați o răcire astfel încât aceeași persoană nu este deranjată, de exemplu o dată pe sesiune sau o dată/zi. Fiecare regulă are un statut on-off.

⚠️
Comutarea spaţiului de lucru "Run time/idle reguli oră de zi" permite acţiunilor server-side (email, împinge, webhook, atribui) foc pe un program pentru contacte cunoscute care nu sunt în prezent pe pagina, astfel încât să puteţi "email light hot leads" automat. Are nevoie de un OpsIQ Las-o baltă dacă vrei să trăieşti pe pagini.
Va trage pentru toată lumea?+

Doar dacă nu adăugați condiții. Adăugați cel puțin o condiție (pagina, scorul de plumb, revenind...) pentru a viza vizitatorii potriviți.

Ce legătură au acestea cu fluxurile şi tururile?+

Ele lucrează împreună: o regulă proactivă poate începe un tur ghidat, iar un Chatbot Flow poate fi declanșat de o regulă pro-activă. Începe cu o singură regulă chat-message, apoi strat pe celelalte.

Creștere și SEO

Fluxuri de chatbot

Chatbot Flows script ramificare conversații în interiorul widget-ul de chat (salutări, răspunsuri cuvinte cheie, căi ghidate) cu nici un cod. Un flux este un set de pași conectați (nods): vă pune o întrebare, vizitatorul alege o opțiune, iar fluxul le trimite pe ramura de potrivire. Numai fluxuri active rula pe site-ul dvs..

Cum funcţionează
Fluxuri de chatbotO pânză de curgere: un nod de salut se ramifică în trei butoane de opţiune, fiecare ducând la un pas următor, caută ordine sau mână pe mâna unui om.SalutăriCu ce vă pot ajuta?Urmăreşte-mi ordinul.Întrebare privind facturareaVorbeşte cu un om.Caută ordinea→ Agent umanDeclanşatoare: Salutare · Cuvant cheie · Manual · Detalii after-detalii · On-chat-end
Fluxuri de chatbot

Debit vs AI · când să utilizați care

Folosește un debit

Când calea este previzibilă și doriți să fie identică de fiecare dată: pașii de rezervare, un vrăjitor returnează, un "care plan?" Alegeți, colectarea unui e-mail înainte de handoff. Fluxuri nu improvizează niciodată.

Foloseşte AI

Când întrebările sunt deschise, "lucrează acest lucru cu configurarea mea?" Clientul Chat AI răspunde din cunoștințele tale instruite. Un flux poate preda AI (sau un om) în orice pas.

Declanșatoare

Salutări

Rulează ca mesaj de deschidere atunci când un vizitator deschide prima chat.

Cuvânt cheie

Rulează atunci când vizitatorul tastează un cuvânt pe care l-ai listat (de exemplu, rambursare, tarifare, anulare).

După detalii / După întârziere

Începe odată ce datele de contact sunt partajate, sau un timp stabilit în conversație.

La sfârșitul chat-ului / Proactiv

Rulează ca chat-ul se încheie în sus (de exemplu, un rating), sau este început de o regulă Proactive Mesaj.

Construieste unul din patru pasi

1
Creează fluxul

Faceți clic pe New Flow, nume-l, alege un tip de declanșare (și cuvinte cheie dacă cuvântul cheie), salva. Acesta începe oprit.

2
Deschide panza.

Faceți clic pe Editare Canvas. Constructorul vizual unde adăugați pași (mesaje, întrebări cu butoane, ramuri) și conectați-le.

3
Adaugă ramuri și o mână-off

Pentru fiecare alegere, trageţi o ramură la pasul următor. Sfârşiţi cărări prin rezolvarea, predarea AI-ului sau transferarea către un om.

4
Activează

Click Activare. Fluxul merge live în widget-ul imediat. Dezactivează oricând fără a pierde design-ul.

Fluxurile înlocuiesc AI-ul?+

Nu, ei fug cot la cot. Foloseste fluxurile pentru căi previzibile și AI pentru întrebări deschise; un flux poate întotdeauna să se predea la oricare dintre ele.

Creștere și SEO

Tururi ghidate

Tururile ghidate sunt pas cu pas, care se deplasează în punctul din pagina dvs. cu bule de vorbire și un reflector, ghidând un vizitator prin intermediul la bord sau o nouă caracteristică. Acestea sunt pe deplin tematice și construite într-un proiectant vizual cu o previzualizare live. Un tur rulează numai atunci când este marcat Active.

Cum funcţionează
Tururi ghidateO pagină redusă cu un inel de reflector în jurul unui buton Add-deal și o bulă de vorbire tematice lectură pas 1 din 4 cu un buton Next.+ Adaugă afacerePASUL 1 DIN 4Creați prima afacereClick aici pentru a adăuga o afacere la conducta.Următor →
Tururi ghidate

Cum se construieşte un tur

Etape

Fiecare pas vizează un element și arată o bulă cu textul. Adăugați la fel de multe opriri ca nevoile de mers pe jos prin intermediul și comanda-le.

Premețe și tematică

Începeţi de la o preset sau proiectare a bulei proprii (coloraţii, gradienţi, reflectoare) cu un avanpremieră live pe dreapta.

Declanşator

Legați opțional o regulă proactivă astfel încât turul să înceapă automat atunci când regula se aprinde (de exemplu, prima vizită a vizitatorilor care s-a întors la bord).

Comută activ

Un tur este eligibil pentru a rula numai în timp ce Active este bifat. Nu scoateți-l să-l jos fără a șterge.

Construieste unul din patru pasi

1
Un nou tur

Faceți clic pe Noul Ghid de Tour, nume-l, și opțional link-ul o regulă proactivă astfel încât să înceapă automat.

2
Adaugă pași

Adăugați fiecare oprire: alegeți elementul pe care îl indică și scrieți textul cu bule. Reordonați până când calea curge.

3
Proiectează-l.

Alegeţi o preset sau stil bula singur. Previzual live arată exact ceea ce vizitatorii văd.

4
Activează

Tick Active and salve. Turul poate rula acum, pe propriul său declanșator, sau a început de o regulă Proactive Message.

Cum începe tururile?+

Pe propriul lor declanşator, sau prin intermediul unei reguli Proactive Mesaj "tur ghidat," astfel încât să decideţi care vizitatori văd ce tur şi când.

Creștere și SEO

Obiective de conversie

Obiectivele de conversie transforma o activitate la care ţii (un eveniment inbound webhook, un mesaj de chat, o rezoluţie a biletelor) într-o convertire înregistrată cu atribuirea completă. Când activitatea se aprinde, OpsIQ logează o conversie împotriva contactului şi îl leagă înapoi la campaniile, segmentele şi sursele care au dus acolo.

Cum funcţionează
Obiective de conversieUn flux de goluri: un eveniment webhook reusit. reușită devine o conversie înregistrată "achiziție" în valoare de $49, atribuită sursei și campaniei sale, cu jetoane preset rapid-start deasupra.Pornire rapidăStripe achiziţionareRezervare demoÎnscriere Newsletterpayment.succeededwebhook de intrareConversie"Achiziție" · $49Atribuitsursă · campanie
Obiective de conversie

Defineşte un obiectiv în trei paşi

1
Alege activitatea de declanșare

Faceți clic pe noul scop de conversie. Alege tipul de activitate care contează ca o conversie, sau de a folosi un preset rapid-start, cumpărare Stripe, Demo rezervat, Inscriere Newsletter sau Abonare început.

2
Numeste-l si stabileste o valoare

Dați conversiei un nume (achiziție, demo_rezervat, înscriere) și opțional o valoare fixă și o fereastră de atribuire.

3
Salvează

Salvează și activează. De atunci înainte, ori de câte ori activitatea se aprinde, OpsIQ înregistrează o conversie împotriva contactului cu atribuirea la atingerile precedente.

Obiectivele sunt deja conectate în webhooks de intrare: orice scop al cărui declanșator se potrivește cu un eveniment de tip Ibound incendii automat în momentul în care evenimentul aterizează. Utilizați pagina Inbound Webhooks pentru a conecta Stripe, Calendly sau orice sistem care poate POST JSON.
Ce poate fi o conversie?+

Orice activitate înregistrată: un eveniment webhook (plată. succes), o captură de e-mail chat, o rezoluție a biletelor, orice pe linia timpului de contact.

Analize

Tablouri de bord personalizate

Dashboard-urile personalizate vă permit să construiți propria vedere asupra indicatorilor care contează, în loc de a se baza doar pe prezentarea standard. Adăugați widget-uri pe care doriți, trageți și redimensionați-le în aspectul pe care îl place, salvați-l, și partajați-l cu echipa ta.

Tablouri de bord personalizate
Tablouri de bord personalizateUn constructor de bord cu KPI și plăci widget grafic, o zonă de picatura dărâmat, și un buton Add-widget.Tablouri de bord personalizatespațiu de lucruTabloul meu de bord+ Adăugați widgetVIZITORI2,481VENITURI$8 2kTRAFICTrageți un widget aiciPAGINILE TOP/pricing/docs/signup1ADD WIDGETSAlege & diagramele2ARRANGEGlisați și redimensionați3ÎMPĂRTĂȘEŞTECu echipa ta
Construiți-vă propria placă: adăugați KPI, grafic și lista widget-uri, trageți și redimensionați-le în aspectul pe care doriți, apoi partajați-l cu echipa.

Construieşte unul din trei paşi

1
Adaugă widget-uri

Faceți clic pe Adăugați Widget și alege metric sau graficul pe care doriți să urmăriți. Repetați pentru tot ce doriți de pe bord.

2
Aranjează aranjamentul

Trageți widget-uri pentru a repozitiona și trageți marginile lor pentru a readimensiona. KPIs peste partea de sus, diagrame mai jos. Orice citește cel mai bine.

3
Salvează & partajarea

Salvați bord și partajați-l cu echipa ta astfel încât toată lumea se uită la aceleași numere.

Păstrați plăci separate pentru locuri de muncă separate (un bord "zilnic cu vedere" cu numere live, și un consiliu "review lunar" cu diagrame trend) astfel încât fiecare rămâne concentrat.
Creștere și SEO

Campanii de ieșire

Outreach este OpsIQ's1:1și motor de e-mail în vrac: compune un mesaj personalizat sau rulează o campanie pe un segment CRM, cu detectarea răspunsului, control al timpului de trimitere, urmărire deschisă/clic, un pixel de urmărire și un-click unsubscribe. Este consimțământ-Gated și CAN-SPAM / CASL conform.

OutreachCity in Germany
Campanii de ieșireEcranul Outreach cu Compozitor/Campaignes/Templys/Replices tabs și un tabel de campanie care arată trimise, open-rate și răspuns-rat.OutreachCity in Germanyspațiu de lucruCampanieCompostorȘabloaneRăspunsuriCampaignTRIMISDeschideRĂSPUNSURILENewsletter iunie1,20048%7%Urmărire în cadrul procesului34062%14%Câştig înapoi82039%5%Răspunde detectarea auto-oprește urmările · un-click dezabonează pe fiecare trimitere11:1 & BULKCompune sau campanie2TRACKEDDeschide, click-uri, raspunsuri3COMPLIANTDezabonează-te construit în
Motorul Outreach: trimite1:1sau de a rula campanii la un segment, se deschide și răspunde cale, și să rămână conforme cu built-in unsubscribe și detectarea răspunsului.

Cele patru file

Compostor

Scrie un text personalizat1:1e-mail cu {tokens} de la contact şi CRM.

Campanie

Trimiteţi pe un segment CRM, programat sau acum, cu capace şi control timp de trimitere.

Șabloane

Modele de mesaje reutilizabile pentru informare repetată.

Răspunsuri

Răspundeţi la înregistrările de detectare şi auto-oprește urmările către oricine răspunde.

Cum se desfăşoară o campanie

1
Alege un public

Alege un segment CRM (sau încarcă o listă). Suprimarea și consimțământul se aplică automat.

2
Compoziție

Scrie mesajul cu jetoane de personalizare; previzualizare împotriva unui contact real.

3
& Trimite program

Trimite acum sau la cel mai bun moment. Se deschide o înregistrare pixeli de urmărire; clicuri și răspunsuri sunt atribuite.

Outreach este consimțământ- și suprimare-gatat, include un un singur click dezabonați pe fiecare trimitere, și urmează CAN-SPAM / CASL. Răspunsuri opri automat mai multe follow-up-uri.
Analize

Rapoarte programate

Programate Rapoarte e-mail un set metric ales pentru beneficiarii aleși pe un program (zi, săptămână sau lună) ca o imprimare, alb-etichetă PDF Setați-l o dată și raportul aterizează în inboxes automat prin intermediul OpsIQ Cron.

Rapoarte programate
Rapoarte programateEcranul de rapoarte programate: un tabel de rapoarte cu programul lor, destinatari și ultima dată trimis, plus un buton Save-report.Rapoarte programatespațiu de lucruRapoarte programate+ Salvează raportulRAPORTSCHEMARECIPIENŢIIUltimul trimisTrafic săptămânalLuni 9:00[email protected]Acum 2 aniRaportul clientului SEOLunar[email protected]Jun1Rezumatul vânzărilorZilnic[email protected]todayLivrată sub formă de etichetă albă PDF prin intermediul OpsIQ cron1AUTOMATEDZilnic · săptămânal · lunar2ALB-LABELPDF pentru clienți3RECIPIENŢIIEmailat la timp
Setează un raport o dată (setmetric, interval, calendar, destinatari) și OpsIQ e-mailuri un alb-etichetă PDF automat pe cadenta ta.

Aranjează un raport

1
Alege ce să trimiţi

Alege setul metric (trafic, SEO, vânzări, suport...) și o gamă de date.

2
Setează programul și destinatarii

Zilnic, săptămânal sau lunar, la un moment dat alegi unul sau mai mulți destinatari de e-mail.

3
Salvează

Salvați și activați. Raportul generează și e-mailuri se pe program, nici un pas manual.

💡
Rapoartele programate trec prin OpsIQ cron, dacă un raport nu ajunge, confirmă cron rulează (vezi Cron și automatizare).
Confidențialitate

Confidențialitate și conformitate

Pagina de confidențialitate și conformitate este singurul loc în care se poate arăta un auditor pe care îl manipulați cu responsabilitatea datelor personale: registrul de consimțământ, jurnalul de acces al adminului, politica de ședere și păstrare a datelor și o imagine gata de tipărit DPA, într-o singură vizualizare în tab. Numai administratorii complet pot deschide.

Confidențialitate și conformitate
Confidențialitate și conformitateEcranul de confidențialitate și conformitate: file pentru registrul de consimțământ, jurnalul de acces, rezidenta și DPA, cu un tabel de consimţământ al granturilor și revocă pe canal.Confidențialitate și conformitatespațiu de lucruRegistrul consimţământuluiJurnal de accesRezidențăDPAContactCHANELACŢIUNIDATA[email protected]e-mailAcordatJun12[email protected]pushRevocatJun10[email protected]marketingAcordatJun9Dovada cautabila a fiecarei consimtamant si revocarea, prin canal1LEDGER CONSENTDovada fiecărei subvenţii2ACCESS LOGCine a atins datele3DPAȘablon tiparit
Un ecran pregătit de auditor: un registru de consimțământ care poate fi căutat (grants/revoca pe canal), un jurnal de acces al celui ce a atins date, setări de ședere/reținere și un DPA_ printable.

Cele patru file

Registrul consimţământului

O înregistrare căutătoare a fiecărui acord de grant și revocă, prin contact, canal (email, împinge, SMS, în widget), acțiune, sursă și dată. Dovada dvs. un contact convenit (sau retras).

Jurnal de acces

Cine din echipa ta a vizualizat, editat, exportat, șters sau trimis un mesaj cu datele unui contact, cu administratorul, contactul, acțiunea, motivul declarat și IP. Exact ceea ce solicită un regulator.

Residență și reținere

Declaraţi unde se află datele acestui spaţiu de lucru, stabiliţi câte zile sunt păstrate rândurile de activitate (0 = pentru totdeauna), și să înregistreze controlorul de date și DPO.

DPA șablon

Un addendum de procesare a datelor printabile care completeaza controlorul, adresa, DPO, rezidenta si retentie. Printa sau salva ca PDF.

Confidenţialitate & Conformitate perechi cu studioul de consimţământ Cookie (care colectează acordul) şi pagina Export (care produce copia datelor pentru o DSAR). Vezi, de asemenea, Cron şi automatizare pentru curăţarea retenţiei nocturne.
Conectori

Conectează platformele

Conectori conectați OpsIQ platformelor externe: magazine de e-commerce, sisteme de facturare, procesoare de plată, furnizori de email și personalizate APIs. Odată conectat, AI poate căuta comenzile, datele clienților, abonamente, și mai mult, și să ia măsuri cu aprobarea dumneavoastră.

Cum funcţionează
Conectori hubOpsIQ nucleu conectat la WHMCS, Shopify, Stripe, WooCommerce, SendGrid și Google Business Profile, fiecare prezentând un statut conectat.WHMCSShopifyStripeWooCommerceSendGridGoogle BPOpsIQCORE1PLUG IN25+ conectori pre-construiți2AI CONTEXTDate reale privind platforma3ACTIONSAdoptat cu aprobarea dumneavoastră
Conectori

Nave cuOpsIQ

Acestea sunt prezente în momentul în care instalați și au nevoie doar de acreditările lor.

WHMCS

Facturarea

Facturi de gazduire web: clienti, servicii, bilete, facturi, domenii, servere.

Shopify

Comerțul electronic

E-commerce: comenzi, clienti, produse, inventar, plati, webhooks.

WooCommerce

Comerțul electronic

WordPress e-commerce: comenzi, clienți, produse, cupoane, transport maritim.

WordPress

SMC

Conținut și utilizatori pe un site WordPress.

Piață

Plăți

Plăţi şi punct de vânzare: comenzi, clienţi, catalog.

osCommerce

Comerțul electronic

Legacy e-commerce: comenzi, clienti, produse.

BotbleHotel

Pod

Un hotel Botble CMS prin intermediul semnatOpsIQPunte. Implementarea de referință pentru o platformă cu nrAPI.

Zendesk City in Germany

Sprijin

Helpdesk: bilete, utilizatori, organizații, comentarii.

Profilul de afaceri Google

Comercializare

Afaceri locale: recenzii, postări, Q&A, perspective. Folosește OAuth_.

Calendar Google

Productivitatea

Calendare și evenimente. Folosește OAuth.

GmailşiIMAP

E-mail

Cutii poștale: intrare și ieșire e-mail, sincronizarea adresei.

SendGrid

E-mail

E-mail livrare: trimite e-mailuri și gestiona șabloane.

Mailgun

E-mail

Livrare email: trimite e-mailuri prin Mailgun.

Slack, Telegramă, LINE, X DM

Mesagerie

Canale de mesagerie pentru conversaţii în interior şi exterior.

Meta canale

Mesagerie

Facebook Messenger, Instagram DM şi WhatsApp.

Informaţii despre site (GA4, Search Console)

Analize

Analize și date de căutare pentru suita SEO.

Îmbogățirea site-ului și CRM import

CRM

Îmbogățirea companiei și importul în vrac al clienților.

Disponibil de pe piață

Acestea sunt pachete publicate, nu parte a instalaţiei. Instalaţi unul din Conectori, Marketplace şi este copiat în dosarul conectorilor live, după care se comportă exact ca cele de mai sus.

Stripe

Piață

Plăţi: taxe, clienţi, facturi, abonamente, plăţi, dispute.

BigCommerce

Piață

E-commerce: comenzi, clienti, produse, categorii, branduri.

Magento2

Piață

E-commerce: comenzi, clienti, produse, categorii, inventar.

PrestaShop

Piață

E-commerce: comenzi, clienti, produse, reguli de carucior, transportatori.

OpenCart

Piață

E-commerce: comenzi, clienti, produse, categorii.

Amazon SES, PostmarkRetrimite

Piață

Livrare prin e-mail tranzacţională.

Jira, liniar

Piață

Problema și de urmărire a proiectului.

Zoom, Calendar Microsoft, Outlook Mail

Piață

Întâlniri, calendare şi poştă.

DocuSign, Apollo, Serpapi,Google Analytics

Piață

Date privind semnătura, prospectarea, căutarea și analiza.

Webflow, Wix, Squarespace

Piață

Platforme de site-uri web.

💡
Lista conectorilor se mișcă ca pachete sunt publicate. Lista de autoritate pentru instalarea TU este pagina Connectoare: ceea ce este listat acolo este ceea ce a descoperit timpul de funcționare, iar fila Marketplace arată ceea ce puteți adăuga.

Instalarea unui conector

1
Du-te la Conectori

Navighează către Conectori în bara laterală admin.

2
Găsește conectorul

Răsfoiește lista sau caută. Conectorii sunt grupate pe categorii.

3
Activează

Faceți clic pe conector și comutați Activați.

4
Introduceți acreditările

Completați câmpurile necesare: API cheie, URL, jetoane, etc. Fiecare conector are cerințe specifice documentate în panoul său de setări.

5
Conexiune de încercare

Faceți clic pe "Test Connection." Un rezultat verde înseamnă că conectorul poate ajunge la platforma externă. Un rezultat roșu arată eroarea.

6
Configurează caracteristicile

Alegeţi ce funcţii să activaţi: sincronizarea cunoştinţelor, sincronizarea webhook-ului, acţiunile AI. Nu toţi conectorii suportă toate caracteristicile.

Ce conectori îţi dau

Context AI

AI poate căuta date despre clienți, comenzi, abonamente și mai multe prin conector. Când un client vorbește, AI are date reale de platformă de referință.

Context AI (autori de conexiune)

Contextul conectorului dvs. Provider alimentează biletul-IA un rezumat al contului numai pentru citire al proprietarului de bilete. Rezolvați clientul prin customer_id atunci când este cunoscut; în caz contrar, pe biletele de auto-replică, unde steagul CTX customer_trust_email Este adevărat, uite contul de customer_email Platformele la distanță expun un /context/customer-by-email Obiectivul și conectorul o numește. Aceasta este ceea ce face ca AI citat un echilibru / factura real în loc de a spunecustomer_sections, customer_allow_credit) și să rămână strict citit-doar, niciodată nu emite secrete.

Dosarul clienţilor (autori de conexiune)

Identitatea conectorului dvs. Provider alimentează trei controale universale ale biletelor: lookupCustomerById() (carte de client), lookupCustomerServices() (tabelul produsului/serviciilor) și listCustomers($query,$limit): "Caută client sau tip e-mail" picker pe forma de Compoziție nativă-Nou Ticket. Rânduri de returnare a {id, external_id, name, email, company, phone, platform, platform_label}. Regula de la distanță: dacă clienţii dumneavoastră trăiesc într-o altă bază de date sau serviciu, aduceţi-i peste platforma dvs.API în cadrul acestor metode, nu citiți niciodată direct tabelele celuilalt sistem (în OpsIQ DB sunt deţinătorii de locuri goale, motiv pentru care o citire locală returnează un culegător gol). Poartă calea distanţă pe configurat API URL; păstrați o citire locală doar ca un pas înapoi de aceeași DB.

Bilete e-mail, detecţie şi rutare (autori conectaţi)

Când e-mailul de intrare devine un bilet nativ, OpsIQ detectează expeditorul prin apelare lookupCustomerById(0, ['email'=>$sender]) pe fiecare conector; primul meci "proprietar" al clientului și platform glonţul este ştampilat pe ticket.created eveniment _pipe_owner_platform (gol = oaspete). Deci, un WHMCS- e-mail client deschide un bilet în WHMCS (WHMCS numerotare, oglindită ca una), în timp ce un expeditor necunoscut rămâne un oaspete nativ. Dacă conectorul tău oglindeşte biletele native pe propria platformă, al tău ticket.created Manipulatorul trebuie să se ocupe de asta: if (array_key_exists('_pipe_owner_platform',$payload) && $payload['_pipe_owner_platform'] !== '<your-slug>') return;Cheia este absenta pe bilete non-piped (chat/manual/AI), astfel încât cele oglindă ca înainte. Per-departament de control trăiește sub Team & Departamente → Bilete deschise prin e-mail (Oricine / Clienți numai / Off).

Acțiuni

AI poate efectua acţiuni prin intermediul conectorului: crearea de bilete, actualizarea ordinelor, anularea abonamentelor, toate cu aprobarea dumneavoastră prin Trust Layer.

Cunoștințe

Conectorii contribuie la AI cu articole de cunoaștere specifice platformei. Shopify conectorul adaugă depanarea comerțului electronic; WHMCS Conectorul adaugă cunoștințe de găzduire.

Importul bazei de cunoștințe (autori de conexiuni)

Dacă platforma dvs. găzduiește o bază de cunoștințe, declarați un kb_capabilities bloc în settings.json (tip kb_source) și conectorul apare în editorul Help Center Importă KB → Import dintr-o aplicație conectată dropdown ori de câte ori este activat și configurat în spațiul de lucru. Este declarativ, nici o metodă pentru a implementa: numele unui built-in adapter (zendesk pentru Centrul de ajutorare a copacului exact API, sau crawl pentru orice site KB) și a base_template cum ar fi https://{subdomain}.zendesk.com, care OpsIQ se umple din setările stocate ale conectorului. Acreditațiile nu părăsesc niciodată serverul; browserul trimite doar melcul conector. Pentru a susține o nouă platformă, adăugați un opsiq_kb_<platform>_manifest() adaptor și referință după nume. connectors/PLATFORM_CONNECTORS.md §5.

Webhook-uri

Unii conectori înregistrează site-uri web cu platforma externă pentru notificări în timp real (ordine noi, actualizări ale biletelor etc.).

Urmărirea vânzărilor

Conectorii din comerțul electronic furnizează date privind veniturile în tabloul de bord al vânzărilor pentru atribuire și analiză.

💡
Conectorii sunt workspace-scoped. Fiecare spaţiu de lucru poate avea conectori diferiţi cu diferite acreditări. A WHMCS spațiul de lucru utilizează WHMCS conector; a Shopify spațiul de lucru utilizează Shopify Conector.
Pot folosi mai mulţi conectori deodată?+

Poţi să-l iei.Shopifypentru comenzi șiStripepentru plăţi în acelaşi spaţiu de lucru. AI fuzionează datele de la toţi conectorii activaţi.

Dacă platforma mea nu e listată?+

Utilizați Connector Builder pentru a crea un conector personalizat pentru orice platformă cu o REST API. Sau verificați Marketplace pentru conectori de comunitate-construit.

Conectorii funcționează cu auto-hosted OpsIQ?+

Conectorii lucrează identic în cloud şi în ediţii auto-hostate.

Conectori

Contract de vânzare și facturare conector

Fiecare conector de comerț utilizează același contract de eveniment neutru-platformă. WHMCS este implementarea de referință, dar SaaS Bridge, magazine, furnizori de plăți, conectori pe piață și pachete Connector Builder trebuie să respecte aceleași reguli.

Ce trebuie să publice fiecare conector de comerţ

Un registru cu autoritate

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.

Identitatea sursei stabile

platforma este melcul de înregistrare conector, cum ar fi whmcs, shopify sau opsiq_saas. trafic_source conține atribuirea de achiziții verificate atunci când sunt furnizate; în caz contrar, utilizați același glonț ca rezervare. identificatorii magazinului, nu afișarea etichetelor. OpsIQ rezolvă numele de conector prietenos în UI.

Idempotență

Eveniment_id trebuie să fie determinist. Hartă cel puțin un ordin imuabil_ref, factura_reph sau abonament_reef astfel încât retările webhook și backfills actualizează același eveniment în loc de a crea vânzări duplicate. service_reff identifică produsul sau instanța de serviciu afectată atunci când există unul.

Ștampila de timp a sursei

afteed_at este timpul de plată sau economic-eveniment raportat de platforma sursă. Nu înlocuiți datele istorice de plată cu ora importului.

Banii și FX

Trimiteți suma sursă și o monedă ISO de trei litere validă. Dacă setarea conectorului permite OpsIQ Conversia FX, raportarea convertește în moneda de raportare a spațiului de lucru; altfel rapoartele păstrează moneda magazinului sau platformei de facturare. Codul conectorului nu trebuie să codifice o monedă de raportare sau un curs de schimb.

Ciclul de viață bazat pe dovezi

Utilizați noi, reînnoire, actualizare, rambursare, credit sau necunoscut. Clasifică din motive de facturare, abonament sau relație de serviciu, tip linie-post, sau un alt câmp sursă autoritate. O achiziție repetată de către același client nu este automat o reînnoire.

Limitele vânzărilor

Numai noi plătite pozitive, reînnoirea, actualizarea sau chitanțe comerciale legal necunoscute aparțin în vânzări & Conversii. Rambursările sunt raportate prin rambursare și analiza net-revenue. Creditul contului, top-up-uri portofel, topup-urile jetoane și fonduri de addend rămâne evenimente de facturare-pensier și nu conta ca vânzări, conversie, volum de comandă, sau venituri din vânzări.

CRM rămâne separat

CRM reprezintă activitatea de conducte și de tranzacționare. Acestea nu sunt vânzări comerciale-platformă decât dacă o platformă conectată de facturare sau magazin emite ordinul sau factura plătită realizată prin acest contract.

Fiecare semnal de plată deschide rândul

Nu depinde de un nume al evenimentului. Atunci când platforma trimite mai multe confirmări ale unei plăți (factura plătită, comandă plătită, tranzacție adăugată, plată finalizată), oricare dintre ele poate deschide rândul de registru odată ce platforma confirmă vânzarea este plătită; amprenta de vânzare se prăbușește frații într-un singur rând.

Reconciliere programată (contract 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.

Proiecții derive

opsiq_conversii și rezumate de bord sunt proiecții de compatibilitate reconstruite din registru. Conectorii nu trebuie să trateze o proiecție ca sursă financiară a adevărului. Revizuirile contractului pot re-evalua rânduri derivate fără ștergerea istoricului de facturare suport.

Limita platformei la distanță

Un conector de la distanţă îşi citeşte platforma prin intermediul configurat autentificat API. Nu trebuie să depindă niciodată de mesele din baza de date a aceluiaşi server. Site-ul exact autentificat al domeniului_cheie este furnizat de ConnectorRegistry şi trebuie aplicat fiecărei liste de scris şi reîmprospătare. Spaţiul de lucru sau domeniul de aplicare al grupului se agregă doar în timp citit; nu trebuie să extindă niciodată proprietatea asupra evenimentelor stocate.

Exemplu canonic cu plată-eveniment

Eveniment normalizat de comerț
{
  "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"
}

Maparea conectorului

Atunci când vânzările și facturarea sunt activate în Connector Builder, suma hărții, moneda, starea sursei și data sursei, plus cel puțin o comandă, factură sau referință de abonament. Harta ciclului de viață_tip atunci când API expune dovezi privind ciclul de viață autorizat. Vânzările generateIngest trece fiecare rând prin același ComerțEvenimentNominalizator de regizare utilizat de conectorii built-in și piață.

⚠️
Creditele și fondurile Add sunt reținute intenționat pentru istoricul facturilor, contextul de echilibru al clienților și analiza registrului. Excluderea lor din vânzări nu le șterge; aceasta împiedică doar să umfle performanța comerțului.

tipul de ciclu de viață_tip decide ce devine o afacere CRM

lifecycle_type nu este o etichetă de analiză.OpsIQciteste pentru a decide daca o vanzare intra in CRM Conductă, astfel încât fiecare conector de vânzări este de a face o decizie conducta fie că intenționează sau nu.

nou

Deschide o afacere cu câştiguri închise (nouă afacere).

reînnoire, actualizare

Înregistrat ca venituri recurente. Nici o afacere de afaceri noi

rambursare, credit

Nu deschide niciodata un acord, in orice mod. Banii returnati unui client nu este o victorie.

omis/necunoscut

Vânzarea este înregistrată, dar nu ajunge niciodată la conductă.

O vânzare, un rând de registru: identitatea este Vânzarea, nu evenimentul

Nu se potrivesc pe event_id şi să te introduci. event_id is platform:eventName:externalId, care răspunde „am procesat deja această livrare” și nu poate răspuse „am înregistrat deja această vânzare”. O platformă care anunță o plată de două ori — ca invoice.paid şi din nou ca payment.completed bază de mentă două id-uri și aterizează aceiași bani de două ori, cu nimic de ciocnit și nimic de avertizat.

💡
Găsite pe instalaţia de referinţă: şase facturi cu trei rânduri de registru fiecare, din trei căi de cod folosind trei scheme diferite de evenimente_id. Toate transportate 0.00 aşa că nici un total privit greşit, şi orice proces ulterior restaurarea sumelor reale ar fi numărat o plată de trei ori.

Sună la scrierea comună în schimb. Core calculează identitatea de afaceri vânzaresale_fingerprint), meciuri un rând existent pe ea, păstrează originalul event_id la actualizare și filtre la coloane reale:

Singura modalitate de a scrie registrul de vânzări
\OpsIQ\Commerce\CommerceEventContract::upsertSaleRow('opsiq_sales_events', $row);
Aceeaşi vânzare, multe evenimente

factura. paid, plata. completat și de vânzare. completate pentru o acțiune pe factură o amprentă și actualizați un rând.

Rambursările rămân separate

Banii care ies sunt un fapt diferit de banii ce vin. O rambursare a facturii îşi păstrează propria identitate, astfel încât nu poate suprascrie plata pe care o anulează.

Nu are referinţă, nu are amprente.

Un rând care nu poartă nici un ordin, factură, abonament sau de referință serviciu devine nici o amprentă la toate, astfel încât două rânduri fără legătură nu se ciocnesc niciodată doar pentru că ambele lipsesc un ID.

Prioritatea de referință

factura_ref, apoi comanda_reef, apoi abonament_reph, apoi service_reff

Registrul este doar de completare: niciodată nu rescrie o vânzare

O rambursare, o anulare sau o corecție este a nou datat. Nu mutați niciodată rândul corectează. Rescrierea unei plăți într-o rambursare arata ordonat și rupe trei lucruri dintr-o dată:

Distruge veniturile brute.

Vânzările brute și rata de restituire încetează să mai fie seppa

Se înregistrează inversarea în perioada greșită

Rescrierea rând ianuarie restabilește în tăcere o perioadă închisă.

Se rupe pista de audit

O înregistrare a registrului înregistrează ce s-a întâmplat la un moment dat. Corectările sunt contra-entries, care este modul în care dubla intrare contabilă a lucrat timp de cinci secole.

Deci un conector raportează inversarea, în loc să o aplice: întoarce-te refunded_at şi refund_amount alături de vânzarea propria ciclu de viață, și lăsați apelantului scrie restituirea ca propriul său rând datat când sa întâmplat restituirea. Cele două nu se pot ciocni, deoarece amprenta de vânzare separă o întoarcere de la o vânzare.

💡
Același principiu se aplică și sumelor. Nu "reparați" o sumă stocată la valoarea curentă a platformei: o factură decontată din creditul contului înregistrată legal 0 la ora plății, iar banii au fost deja înregistrați când clientul a depășit valoarea nominală. Restaurarea valorii nominale o numără de două ori.

Contractul de clasificare

OpsIQ decide ciclul de viață o dată, in \OpsIQ\Commerce\SaleLifecycleClassifierUn conector declară numai care dintre propria platformă cuvinte înseamnă ce, prin punerea în aplicare \OpsIQ\Connectors\SalesLifecycleConnectorInterface::salesLifecycleVocabulary()Nu re-implica raţionamentul.

Declararea vocabularului, delegarea deciziei
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,
]);
💡
Precedarea este fixă și împărtășită: explicită, apoi rambursată/anulată, apoi creditul, apoi upgrade-ul, atunci este_ordine, apoi recurentă, după care achiziție, apoi necunoscută. Upgrade stă deasupra verificării comenzii deoarece platformele ridică o comandă de update; se repetă mai jos pentru că prima factură a unui nou abonament poartă un tip de linie recurentă. Pe o vânzare ambiguu non-order clasament clasificarea se bazează pe venituri și departe de conductă.

Declară platforma

Acesta este eșecul care costă cel mai mult și arată cel mai puțin greșit. Conectorul WHMCS ['hosting','addon','domain'] O listă care se citeşte ca fiind completă. WHMCS nu emite o listă goală Domain tip pentru linii de domenii reale; emite DomainRegister, DomainRenew, DomainTransfer, PromoHosting, PromoDomain, DomainAddon* şi UpgradeToţi au trecut de listă. unknown: 1,288 facturi, trei ani, nici o eroare și nici o linie de jurnal.

Fiecare client nou importă istoria lor printr-un conector de umplere, astfel încât un bug de clasificare nu afectează un spațiu de lucru prefix Aşa că un frate pe care nimeni nu l-a văzut încă se clasifică la rudele sale în loc să dispară.

💡
Un control practic: conta cât de multe dintre propriile rânduri teren pe necunoscut. Un conector de vânzări sănătos clasifică aproape totul. Un flux constant de necunoscut este aproape niciodată date nu aveți

Repararea istoricului importat

Fiecare expediatOpsIQConectorul de vânzări implementează acest lucru — 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() folosind orice per înregistrare aduce conectorul deja are. tools/crm_backfill_sales_lifecycle.php apoi reparaţii dvs. de pocs importate istorie cu nici un cod per-conector: uscat rula implicit, se susţine şi verifică numărătoarea rând înainte de a scrie, reversibil printr-un registru neuniform, şi nu scrie o citire eşuat ca răspuns.

💡
Dacă conectorul nu poate reciti înregistrările din trecut
💡
Referințe detaliate ale pachetelor rămân disponibile în conectori/CONNECTOR_EVENTS. md și conectorii/PLATFORM_CONNECTORS. mD în distribuția de surse auto-hostate.
Conectori

Contractul de călătorie

Journey Intelligence acceptă un plic de evenimente neutru-platform din widget browser, conectori built-in, SaaS Bridge, pachete de piață și ieșire Connector. Numele specifice platformei sunt traduse la margine; pâlnie, atribuire și Site-ul Codul de informații consumă doar evenimente canonice.

Limita de izolare și încredere

Cheie de interes exact

Fiecare eveniment este legat de site-ul_cheie autentificat domeniu. Un conector trebuie să ia această cheie din ConnectorRegistry sau obiectivul său autentificat, niciodată de la un organism cerere neîncredere. Domenii păstrează înregistrări separate; un grup de domenii este doar o citire timp agregat.

Identitatea idempotentă

Eveniment_id este necesar pentru conectori și trebuie să fie determinist pentru același eveniment nativ. Returi, slipuri web și fildere actualizează un eveniment mai degrabă decât duplicat o călătorie sau vânzare.

Denumire nativă plus canonică

Păstrați sursa_event_name pentru dovezi și depanare, apoi harta la eveniment_namel_canonical. Analiza miezului nu trebuie să se ramifice pe un melc conector.

Dovezile serverului câştigă

Observarea browser-ului poate porni sau infer o călătorie. Evenimentele de conectare autentificate confirmă înscrierea, autentificarea, plata, cumpărarea, reînnoirea, restituirea și alte rezultate terminale. O corelare validă site-ul-bound token este cel mai puternic uni; un jeton invalid este respins și ID-urile sale încorporate nu sunt de încredere.

Confidențialitate

Trimite numai identificatori și câmpuri necesare pentru călătoria declarată. Respectați consimțământul, mascarea și setările de reținere. Nu plasați niciodată în proprietăți acreditările, datele cardului, secretele de autentificare sau organismele private de mesaje.

Plicul canonic

Pachetul de evenimente călătorie
{
  "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"}
}

Componomie canonică

Folosiți cel mai îngust nume sincer. Familiile sprijinite includ evenimente de angajament / CTA; înscrieri cont, login, MFA și resetare parolă; etape de plumb și formă; produse, coș, checkout, plată, cumpărare, abonament, reînnoire și rambursare; impresii de promovare și conversie; centre de ajutor, chat și evenimente de bilete; evenimente de securitate; și evenimente personalizate namespaced. account.signup.succeeded, account.login.succeeded, lead.form.succeeded, commerce.payment.succeeded, commerce.purchase.completed, commerce.subscription.renewed şi commerce.refund.completed.

Inferior de navigare, confirmare și abandon

Widgetul poate lucra fără conector prin observarea structurii paginii, prin acțiuni forma, rezultatele DOM și jurnalul de călătorie al vizitatorilor. Această dovadă rămâne în mod explicit clasificate așa cum a fost observat sau dedus. Un conector adaugă confirmarea serverului autoritate și o poate corela cu aceeași încercare browser-ul. Abandonarea este stocată pentru prima dată ca un candidat; ea devine abandonată numai după fereastra inactivității stabilită în UI și doar atunci când nu există recuperare ulterioară sau succes.

Atribuirea și veniturile

Atribution preferă un semn de corelare semnat valabil, apoi o călătorie exactă, încercare, sesiune sau referință comercială, atunci graficul de identitate aprobat, și în cele din urmă un meci comportamental limitat. Vânzările neîncheiate rămân neatribuite. Multi-touch Greutățile registru trebuie să totalizeze 1. Site Intelligence a atribuit venituri citește acest registru; credite, portofel top-up-uri, token top-ups și Adăuga fonduri nu sunt niciodată de cumpărare conversii. Connenor FX comportamentul rămâne controlat prin acel set conector.

⚠️
Modelul de atribuire, ferestrele cu vedere înapoi, manipularea directă a traficului, încrederea minimă, definiţiile abandonului şi pâlniei sunt politica UI. Codul Conector nu trebuie să le codifice în mod hard-cod.

Manifestul conectorului și constructorul

Declarația de călătorie a conectorului
{
  "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"
    }
  }]
}

Declaraţi doar capacităţile pachetului cu adevărat oferă. Conector Constructor validează cartografierea şi generează acelaşi adaptor neutru-platformă utilizat de pachetele de prima parte. Ingestia de călătorie acceptă un eveniment sau un lot limitat de 100 prin intermediul obiectivului de integrare autentificat generat.

💡
Registrul comercial rămâne sursa financiară a adevărului. Comerţul-la-curte pod publică rezultate confirmate server şi reconciliază atribuirea după dezvoltarea de registre idepotente existente, astfel încât o plată nu devine niciodată două vânzări.
Conectori

Cum acţiunile AI funcţionează

Fiecare conector declară un set de acţiuni: lucruri pe care AI le poate face prin platforma externă. Acţiunile sunt puntea dintre "AI spune" şi "IA face."

Acțiuni AI
Cum acţiunile AI funcţioneazăO cerere de client cartografiată pe un card de acțiune de tip ștergere, apoi o listă de verificare: permisiune verificată, confirmați, API apelat.Cum acţiunile AI funcţioneazăspațiu de lucru"Anulează-mi abonamentul"clientAIcancel_subscriptiondeleteconfirmarea necesarăParams: abon_id (din context)TIPURI DE ACŢIUNIreadscriedeletePermisiune & rol verificatConfirmaţi acţiunea.API numit · rezultatul raportat1DECLAREDFiecare conector enumeră acțiunile2GATEDPermisiune + confirmare3THEN RUNAPI apel, rezultat înapoi
O cerere devine o acțiune declarată (scrierea/scrierea / ștergerea) care este verificată, confirmată, apoi executată și raportată.

Ciclul de viață al acțiunii

1
Clientul cere ceva.

"Anulează-mi abonamentul." AI identifică acest lucru necesită acțiunea "cancel_subscription."

2
AI verifică permisiunile

Este permisă această acțiune? Este activată? Are utilizatorul curent rolul corect?

3
AI adună parametrii

Acţiunea are nevoie de un ID al abonamentului. AI-ul îl verifică din contextul clientului sau întreabă clientul.

4
Confirmare

Pentru acțiuni distructive sau de impact ridicat, AI cere confirmarea înainte de executare.

5
Execuția

Acțiunea solicită platforma externă API.

6
Rezultat

AI raportează rezultatul clientului.

Tipuri de acţiune

Acțiuni de citire

Caută date fără să schimbi nimic. Exemple: liste_comenzi, get_client. Sigur, nu este nevoie de confirmare.

Scrie acțiuni

Creați sau modificați date. Exemple: creare_ticket, actualizare_order. Poate necesita confirmare.

Șterge acțiunile

Elimină datele. Exemple: anulează_subscriere. Întotdeauna necesită confirmare.

Acțiuni HTTP

Declarat în acţiuni.json generic API apelurile definite în mod declarativ.

Etichetele capacității

Domeniul de acţiune facultativ per-acţiune "capabilitate."json, o etichetă de clasă conector-neutral (de exemplu "bilete" pentru un bilet citit/uitat, "ticket_create" pentru deschiderea unui bilet).OpsIQ poarta întreaga clasă uniform peste fiecare conector: biletele se citește picătură din AI atunci când operatorul oprește sensibilizarea AI Ticket, și crearea de bilete este rezervat pentru OpsIQ Compozitorul propriu (deci instrumentul de creare al conectorului nu îl poate copia). Declaraţi-l şi conectorul dvs. se conformează.OpsIQ Connector Builder îl expune ca o scădere capacitate pe acțiune.

Acțiuni de cod

Implementat în PHP în clasa conector. Control complet asupra logicii.

Definiție acțiune exemplu
{
  "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" }
    }
  }
}
Conectori

Construiește un conector

Connector Builder vă permite să creați un conector complet pentru orice platformă cu o REST API. Nu este necesară codificarea pentru conectorii de bază.

Construiește un conector
Constructor de ConectoriUn formular de conector fără cod: nume, tip aut, bază URL, cartografiere acțiune, încercare cu trecere și buton de publicare.Constructor de Conectorispațiu de lucruConstructor de ConectoriNumePlatforma meaAuthOAuth 2.0(PKCE)Baza URLhttps://api.example.com/v2AcțiuneGET/customers → lista_cliențiTestul a trecutConector pachet1NO-CODENume, auth, bază URL2ANY APICheie, Bearer, Basic, HMAC,. OAuth3PUBLISHInto /connectors/<slug>/
Îndreptați constructorul către orice REST API Set auth, base URL şi acţiuni, testaţi-l şi publicaţi un conector de lucru.

Furnizor complet API acoperire

Fiecare generat API Conectorul poate expune separat nativ API Citit și nativ API Acţiuni scrise. Acţiunile curatate rămân preferate; acţiunile native acoperă obiectivele furnizorilor adăugaţi mai târziu. JSON, forma; XML, corpuri brute și multiparte, paginație delimitată;API- antete de inversare și idempotență în timp ce păstrarea acreditărilor în interiorul setărilor conectorului spațiu de lucru.

⚠️
Pachetele de piață sunt obținute din /marketplace_connectors precum și în pachet /connectors. Creşteţi versiunea pachetului, regeneraţi contractul şi documentaţia, efectuaţi teste de conformitate, apoi re-semnaţi şi publicaţi noua versiune Marketplace.

Expert Connector Builder

Vrăjitorul are şase paşi, arătaţi ca file peste partea de sus. Puteţi sări între ei liber şi Salvează proiectul În subsol îţi păstrează munca în orice moment.

1
Identitate și profil

Nume, melc, descriere și pictogramă, apoi alege un profil de contract: Standard API, Comert, Helpdesk, Mailbox, Site Intelligence, SaaS Bridge, Local PHP Platform, sau Platformă fără API atunci când platforma nu servește nimic apelabil și OpsIQ trebuie să instaleze un pod. Profilul selectează un punct de pornire complet; puteți ajusta în continuare capacitățile individuale.

2
Auth

Alege modelul de autentificare utilizat de platformă și completează câmpurile sale. Introduceți aici și acreditările reale ale testelor: acestea sunt folosite pentru testul de conectare la următoarea etapă, și nu sunt stocate după ce publicați.

3
Test

Introduceți API bază URL și un obiectiv de verificare, apoi executați un test de conexiune live folosind acreditările din etapa 2Fa asta inainte sa definesti orice actiuni, daca auth sau baza URL este greșit, fiecare acțiune pe care o scrieți după aceea ar eșua din același motiv și v-ar fi depanarea lucru greșit.

4
Acțiuni

Defineşte fiecare operaţiune: nume, metodă HTTP, cale de evaluare, parametri, cartografiere a câmpului de răspuns şi setările de fiabilitate descrise mai jos. Puteţi rula fiecare acţiune individual împotriva live API din această etapă.

5
Declanșatoare

Harta evenimentelor webhook pe care platforma ta trimite OpsIQ evenimente, astfel încât lucrurile care se întâmplă pe platforma ta pot începe să lucreze în OpsIQ.

6
Revizuirea, contractul de întreprindere și publicarea

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

⚠️
Editura NU ruleaza suita de conformance. Publica doar validează forma vrăjitorului și emite avertismente care nu blochează. Apartamentul complet

Ce publicaţie nu vă arată formularul

Cinci comportamente ale celor care se ocupă de generator nu sunt un gândac; toate acestea vă vor costa o după-amiază dacă îi întâlniţi accidental.

O întrebare decide trecerea prin: nu platforma servi un API?

Răspunde în pas.1prin alegerea modului de acces la date (sau a "Platform with noAPI" profile).APImodul declară native_api and emits the <slug>_api_call passthrough. Bridge mode declares platform_bridge în loc de STRIPS native_api chiar dacă un spectrometru mai vechi îl purta, astfel încât manifestul, clasa generată și documentele de expertiză nu pot fi de acord. ai_brain_aware se adaugă în orice mod.

TĂCEREA înseamnă "are un API"

Constructorul urmează răspunsul dumneavoastră; nu funcționează adevărul pentru sine, și implicit atunci când nimic nu se spune esteAPI- Deci nu...APIplatforma trebuie să spunACTUAL, astfel încât să alegeţi "Platforma cu nr.API" profil, set de date acces la pod sau căpușe 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.

Încercarea de conectare este implicită pentru GET/ping

Dacă laşi calea de verificare goală, Constructorul scrie: /ping în conectorul generat și în profil.jsonAproape nici o platformă reală nu servește acest traseu, astfel încât Test Connection nu reușește cu HTTP404pe fiecare instalare și citește ca un client configurare greșită, mai degrabă decât un defect pachet. Setați o cale de verificare care platforma dvs. răspunde efectiv. Pentru un conector pod, punctul-l la propriul obiectiv diagnostic

Republicarea încă vă suprascrie ediţiile de mână

Capabilitățile urmează acum răspunsul de acces la date, astfel încât acestea să nu mai drift. Orice altceva generat încă face: edita ContextProvider. php sau orice alt fișier emis și următoarea publicare îl înlocuiește. Singura excepție protejată este fișierul pod

Republicarea șterge fișierele

Un-tick o capacitate și următoarea publica elimină fișierul său furnizor. Hand-edits la orice fișier generatopsiq- Constructor.jsonEl este Cel ce nu va mai fi dintre cei care îl vor stăpâni.

eliberare_status este întotdeauna previzualizare

Vrăjitorul nu are control pentru ea. Un pachet menit să navă ca producţie trebuie să fi eliberat_status schimbat de mână în setările.json

Semnătura dovedeşte integritate, nu origine.

Pachetele constructorului sunt semnate cu cheia simetrică proprie a acestei instalaţii. Aceasta detectează manipularea. Nu dovedeşte cine a scris pachetul, iar orice instalare care deţine aceeaşi cheie poate produce aceeaşi semnătură. Trataţi un pachet semnat local ca auto-semnat.

Coliziunile de la sol sunt verificate doar într-un singur copac.

Editura refuză un melc care există deja sub/connectors/.Nu se uită la/marketplace_connectors/,Astfel încât un pachet de prim partid autorizat manual cu același glonț poate sfârși umbrit.

💡
Vrăjitorul nu are un pas de cunoaștere-autoring. Un fișier de cunoștințe care descrie platforma dumneavoastră este generat pentru tine din numele, descrierea, tipul auth și acțiunile pe care le-ați definit, și este încărcat în AI atunci când conectorul este activat.

Definirea unei acțiuni (pasul 4)

Fiecare acțiune are următoarele setări. Sunt necesare doar primele patru; restul de control care pot rula și cât de atent.

Cheie de acțiune și etichetă

Cheia este ceea ce AI numeşte, eticheta este ceeace citeşte un om. Cheile sunt numite spaţiate automat cu melcul conectorului, astfel încât doi conectori pot avea amândoi o "list_ordine" fără ciocnire.

Metoda HTTP

GET, Post, Pune, Patch sau Delete.

URL cale

Adapostit la bază URL Foloseşte-l. {name} pentru titularii de locuri, de exemplu /opportunities/{id}/stage

Parametrii

Pentru fiecare parametru, alegeți și unde merge: corp, cale, interogare sau antet. Un parametru de cale umple a {placeholder}; un parametru de interogare este anexat la URL.

Maparea răspunsului

Spune care este câmpul din răspunsul JSON ce înseamnă, care este numele clientului, care e e-mailul, care reprezintă totalul comenzii. Aceasta este ceea ce permite AI să citească datele platformei tale mai degrabă decât să ghicească la acesta.

Cine o poate folosi

Echipa ta (admin AI), clienti inregistrati (chat clientilor), atat, cat si asistentul de scris. Actiunile clientilor se executa doar pentru clientul semnat-in, iar campurile de identitate sunt blocate automat pentru ei astfel incat un client nu poate intreba despre altul.

Necesită confirmarea

Un om trebuie să aprobe înainte de a începe acţiunea.

Destructiv

Marchează acțiunea ca ștergere sau schimbare a stării. Folosit pentru a avertiza înainte de a rula.

Permisiunea necesară

Administratorul trebuie să dețină această permisiune pentru AI de a rula acțiunea în numele lor; administratorii complet trece întotdeauna. Alege din gestion_integrații, gestiona_generale, administra_billing, gestiona _sales_bridge, gestionas_cunoaștere, gestionare_apărare, administrare_comportament, gestionarea_permissions, gestionați_dangerzone, răspuns_to_chats, escale_to'ticket, send_agent_email sau nici unul, însemnând orice admin autentificat.

Descriere / Aluzie AI

Opțional, dar merită scris. Ea spune AI atunci când pentru a ajunge la această acțiune, de exemplu "Folosiți acest lucru atunci când admin cere să schimbe o etapă de afacere." Un indiciu bun este diferența dintre o acțiune AI folosește corect și unul ignoră.

Capacitatea

Tag-ul opțional clasa, fie bilete (un bilet citit sau cautare) sau ticket_create (deschide un bilet). Tagging permite OpsIQ poarta întreaga clasă la o dată, de exemplu, bilet ascuns citește atunci când un operator transformă sensibilizarea AI bilet.

Calea listei

Opțional. Pentru obiectivele care returnează o listă, calea punctată către matrice, de exemplu date sau date. posturi

Eroare cale

Opțional. Un câmp de corp a cărui prezență înseamnă apelul eșuat, de exemplu eroare.mesaj, util pentru APIs care returnează HTTP 200 pe eșec.

Rulează-l.

Fiecare acţiune poate fi condusă împotriva celor vii API din acest pas, astfel încât să puteți repara o cale greșită sau nume de câmp înainte ca altcineva să-l folosească.

⚠️
Acțiunile de scriere sunt protejate implicit. Orice acțiune care utilizează POST, PUT, PATT sau DELETE începe să necesite permisiunea de administrare_integrare şi confirmarea umană înainte de a rula. Acest lucru este deliberat. O acțiune nouă scrie nu se închide, mai degrabă decât să lase AI schimba datele nesupravegheate. Puteți schimba atât pe acțiune, dar le schimba cu bună știință.
💡
Pentru a fi apelabil de la chat client, o acțiune trebuie să fie citit-doar: lăsați atât confirmarea Necesită și Destructiv neticked. O acțiune un client poate declanșa care schimbă starea nu este ceva ce vrăjitorul vă va permite să nava din accident.

Primirea de site-uri web (pas 5)

Pasul Triggers vă oferă un webhook URL pentru a vă înregistra pe platformă şi verifica fiecare cerere care ajunge la ea.

Antet semnătură

Antet semne platforma cu, de exemplu X-Hub-Signature 256.

Algoritmul semnăturii

HMAC-SHA1, HMA-Sha256 sau HMAS-SHA512.

Schema de semnătură

Simplu, un hex simplu sau baza64 digera. Sau stil Stripe, t=... v1 =... format folosit de Stripe și mai multe platforme care copiat-o.

Prefix semnătură

Opțional. Unele platforme prefix digera, de exemplu Sha256 =. Lăsați-l gol în cazul în care a ta nu.

Hărți de evenimente

Harta fiecare eveniment platforma ta trimite pe OpsIQ eveniment ar trebui să ridice.

Înregistrarea automată a webhook-ului

Dacă platforma dumneavoastră are o API pentru gestionarea propriilor sale site-uri web, nu trebuie să înregistreze URL Deschide cu mâna. Înregistrează automat acest webhook pe activ şi punctaţi-l la două dintre acţiunile definite în etape 4:

Acţiune de creare-webhook

Apelat atunci când un admin permite conectorul. Vă dau numele parametrului care poartă URL, opțional cel care poartă lista de evenimente, și calea în răspunsul care deține ID-ul noului webhook lui.

Acţiune de ştergere- webhook

Apelat atunci când conectorul este dezactivat, folosind ID-ul capturat mai sus, astfel încât dezactivarea conectorului, de asemenea, oprește platforma ta trimiterea la un obiectiv mort.

Capabilități pe care le puteți activa

Profilele și capacitățile sunt definite de contractul Connector 2.2. Capacitățile generate și declarative sunt emise direct; capacitățile întreprinderii generează un EnterpriseExtension.php schele cu cabluri de ciclu de viaţă.

Acțiuni

Operaţiuni AI poate rula pe platforma ta: lista comenzi, găsi un client, emite o rambursare.

Declanșatoare

Primește prosoape web de pe platforma ta și transformă-le în evenimente OpsIQ.

Bilete AI

Al Triage și răspunsul Copilot pe biletele care rămân pe platforma ta. Alege obiectivul care returnează un bilet cu răspunsurile sale și harta câmpurile; OpsIQ citește firul prin ea.

Casetă poștală și contacte

Arată e-mailul unui client pe cronologia lor, trimite de la o afacere, și sincronizează cartea ta de adrese în OpsIQ CRM.

Importul clienților

Paginați lista de clienți și importați fiecare ca contact OpsIQ. Iată ce rulează butonul Import.

Context

Împingeţi datele în direct de pe platforma dumneavoastră în fiecare conversaţie AI.

Identitate

Lucrați care dintre clienții dvs. este un vizitator, și arată profilul lor și achiziții pe un bilet.

Vânzări și facturare

Evenimentele privind veniturile provenite din furaje și cifrele RMR în OpsIQ borduri.

Bilete de intrare

Transformați bilete și e-mailuri platforma dvs. oferă prin webhook în OpsIQ fire suport.

Răspunsurile în afara legii

Post OpsIQ personalul răspunde înapoi la platforma pe care a pornit firul.

Utilizatori de sincronizare

Importaţi conturile personalului dumneavoastră în OpsIQ Admin utilizatori.

Sincronizează departamentele

Importați departamentele de sprijin în OpsIQ.

Ţinta promo şi hrana pentru animale

Să Promotion Studio țintă pe fapte știi despre o persoană, și să facă produsele reale în interiorul unei promoții.

Furnizor Studio Survey

Expuneți date de cercetare verificate de server, variabile scăpate și limitat CRM Outreach pagini destinatar printr-un SurveyProvider. php dedicat. Acest lucru nu reutilizează perioada de aplicare Promotion.

Nativ IP blocare

Când? OpsIQ blochează o IP, apela propriul bloc platforma API Astfel încât blocul este aplicat acolo.

Evenimente de securitate

Recepţionat blocat.IP semnale de amenințare din OpsIQ.

Cunoștințe privind platforma pentru AI

Fiecare conector pe care îl construiți nave o scurtă referință descrie ce este platforma și acțiunile sale fac. OpsIQ admin AI citește-l ori de câte ori conectorul dumneavoastră este activat, astfel încât înțelege platforma mai degrabă decât doar văzând o listă de nume de acțiune. Acest lucru este generat pentru tine.

API trecere prin

Conectorul dumneavoastră primeşte întotdeauna un apel general pentru a putea atinge un obiectiv AI pentru care nu aţi definit o acţiune tipată. Utilizaţi acţiuni tastate unde puteţi; aceasta este trapa de evacuare.

Contract de conectare canonică 2.2 referință

Versiunea contractului: 2.4 · 57 capabilities · 8 profiles.

Profile conector

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ăți canonice

acțiuni

Universal actions. Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: actions.json.

declanșatoare

Inbound event triggers. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Package files: actions.json.

webhookComment

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.

context

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.

identitate

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.

facturare

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.

comerț

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.

locale

Local search/location data. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

Seo

SEO data and actions. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

site_intelligence

Site Intelligence provider. Capability version: 1.0. Mode: declarative. Runtime methods: siteIntelligenceProviders. Interfaces: OpsIQ\Connectors\SiteIntelligenceConnectorInterface.

analiză

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.

⚠️
Specificaţiile constructorului rămân sursa de autoritate. Pune reguli de afaceri specifice platformei în punctele de extensie generate; ciclul de viaţă al pachetului, cozile, lucrătorii, migraţiile şi testele de conformitate rămân gestionate de Constructor.

Setări de fiabilitate pe fiecare acțiune

Reîncercări

De câte ori să retrimiți un apel eșuat, cu o copie de rezervă care dublează fiecare încercare. Numai timeouts, 429s și 5xx erori sunt rejudecate; un 4xx este vina cererii tale și repetarea ar arde doar limita ratei.

Limita ratei

Un plafon pe minut pentru această acțiune, astfel încât un declanșator ocupat nu poate ciocan platforma ta. Lăsați-l la 0 pentru nici o limită.

Timp de așteptare

Cât timp să aştepţi platforma ta înainte de a renunţa.

Confirmare

Necesită un om să aprobe înainte de a începe acţiunea.

Tipuri de autentificare

Pas 2 Alege-l pe cel care se potriveşte cu platforma ta. API documentaţie, generatorul emite clientul HTTP potrivit pentru ea.

API cheie în antet

O cheie statică trimisă ca antet fix, de exemplu X-API Dai numele antetului şi eticheta pe care ar trebui să o arate formularul admin.API se așteaptă cheia ca parametru de interogare în schimb, utilizați antetele personalizate sau un conector cu cod complet.

Bearer token

Token sent as Authorization: Bearer <token>. Common for modern APIs.

Aut de bază

Numele de utilizator și parola, baza64-codat în antetul Autorizare. Alegeți etichetele ambele domenii arată pe formularul admin.

Semnat HMAC

O cheie publică plus un secret, cu organismul de cerere semnat. Vă dau antetul semnătură, antetul cheii și antetul timbrul temporal pe platforma dumneavoastră așteaptă.

OAuth 2.0 (acreditari client)

Server-to-server, fără interacțiune cu utilizatorul și nicio redirecționare. Dați jetonul URL și un domeniu de aplicare opțional; adminul furnizează un ID al clientului și un secret. Utilizați acest lucru atunci când platforma emite acreditările unei aplicații mai degrabă decât unei persoane.

OAuth 2.0 (Butonul de contact)

Fluxul de autorizare-cod cu PKCE, pentru Stripe, Shopify Aplicaţii în stil Slack şi QuickBooks.URL, jetonul URL și domeniul de aplicare. După publicare, admin clicuri Conectați-vă pe conector, autorizează pe platforma dumneavoastră, și OpsIQ stocheaza jetoanele de reîmprospătare si menta la cerere. Redirectionarea URI pentru a vă înregistra în OAuth Aplicația este afișată pe pagina de setări a conectorului.

Antete personalizate

O formă liberă JSON harta antetului pentru orice model de mai sus nu acoperă, de exemplu {"X-API-Key":{api_key}""X-Tenant":{tenant_id}"}. Fiecare titular devine un câmp pe formularul admin.

💡
PKCE se aplică doar fluxului de buton Connect. Fluxul de credibilități client nu are redirecționare și nici o etapă a utilizatorului, astfel încât PKCE nu i se aplică.

Stiluri de paginare

Dezactivează

Utilizeaza parametrii offset si limita. Exemplu: ?offset=100& Limită =50.

Pagina

Folosește numărul paginii. Exemplu: ?page=3&per_page=50.

Cursor

Folosește un semn de cursor din răspunsul anterior.

Antet legătură

Folosește antetul de răspuns Link cu rel="next."

Avansat: cod personalizat PHP

conector. php RETURNS un exemplu. Nu declară o clasă numită pentru care să vâneze OpsIQ. Numele metodelor de mai jos sunt cele pe care ConnectorInterface le cere; a obține unul greșit este un fatal la sarcină, nu un avertisment.

conector. php
<?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.

Bilete în oglindă în sistemul de bilete nativ

Când platforma ta deţine un bilet, oglindeşte-l în OpsIQ de la conectorul dvs., folosind ingerarea biletului de ajutor conector moștenesc (creați pentru un nou bilet, adăugați-răspuns pentru follow-up-uri). Emit și abonați-vă la evenimentele universale bilete în conector subscribers() metoda; ticket.created, ticket.replied, ticket.updated, ticket.deleted. Auto-reply, escaladare, SLA și CSAT toate cârlig aceleași evenimente, astfel încât să le moștenească fără cod suplimentar.

Dacă te descurci ticket.deletedŞi tu te descurci cu contopirea. Un bilet fuzionat de ștergere poartă merged_into și nu este trimis la un conector care declară ticket_merge; unirea ajunge o dată ca ticket.merged În schimb, astfel încât să puteți fuziona pe platforma dumneavoastră mai degrabă decât închide biletul fuzionat acolo. Capacitatea de fuzionare a biletelor (contract 2.4).

Spune cine a scris mesajul de deschidere

Un bilet este întotdeauna pentru clientul, dar mesajul de deschidere poate fi scris de personal: un agent care deschide un bilet în numele clientului sau ajunge la o abordare proactivă. Fiecare birou de ajutor sprijină acest lucru, astfel încât face parte din universal ticket.created contract, mai degrabă decât ceva fiecare conector rezolvă privat.

author_type

client (default) sau administrator. Omit-l și clientul este asumat.

author_id

Id-ul personalului atunci când autor_type=admin. Niciodată ID-ul clientului.

author_name

Agent sau nume de afişaj al departamentului.

author_email

Adresa agentului. Niciodata cel client. Un mesaj de personal sub e-mailul clientului este o eroare de raportare si audit.

Nu e cosmetic. Consumatorii citesc author_type pentru a decide al cui este rândul. O deschidere scrisa de personal raportat ca client lasă auto-reply eligibile pentru a răspunde la un mesaj propriul agent scris, și face ecoul platformei dumneavoastră de care deschiderea arata ca un mesaj client proaspăt, care apoi aterizează ca un duplicat și răstoarnă biletul răspunsHarta semnalul platformei pe ea în conectorul dvs. normalizator de evenimenteNiciodată în rândul consumatorilor.

Blocare centralizată

Atunci când un agent blochează un expeditor, care se aplică peste fiecare canal imediat (e-mail, chat, portal, widget și fiecare conector twin) deoarece blocul este aplicat central, înainte ca orice conector vede mesajul. Conectorul moștenește prin a nu face nimic. Nu există nici o lucrare de intrare pentru a implementa și nici un mod de a obține greșit.

Jumătatea opţională este: în afara: spune platforma un client a fost blocat aici. Implementați-l numai în cazul în care platforma dumneavoastră poate exprima ceva echivalent.

Capacități ()

Trebuie să includă bloc_registraţie ŞI clasa trebuie să pună în aplicare BlockRegistryInterface. Steagul este o cerere; interfaţa este garanţia. Registrul necesită ambele.

blockSender($b)

Primește tipul (email|domain|ip), valoarea, motivul, admin_id-ul, expires_at, site_key. Întoarce [rezult?, detail?, remote_ref?].

unblockSender($b)

Aceeaşi încărcătură, inversată.

isSenderBlocked($b)

Pentru reconciliere, astfel încât derivă este raportat mai degrabă decât descoperit de către un client. Returnează [rezultat, blocat?].

Valorile rezultatului

Bine.

Aplicat pe platforma ta. Include-l pe distanta_ref atunci cand ai un ID care merita inregistrat.

noop

Deja în starea solicitată.

unsupported

Platforma ta nu are un concept echivalent.

eșuat

Puteai s-o faci şi a mers prost. Include detalii; aterizează în pista de audit.

Refuzul este un răspuns corect. Multe platforme nu au conceptul de "blocare a acestui expeditor" și oferă doar suspendarea contului, care încetează facturarea, loginurile și serviciile în loc să sprijine doar mail-ul. Mapping "un agent blocat o adresă spam" pe "închide contul clientului" ar permite unui bloc greșit să încheie serviciile unui client plătitor. Dacă aceasta este singura pârghie pe care o aveți, returnați unsupported şi las-o baltă.

Declinarea acoperă și cazul în care platforma pot face acest lucru, dar nu vă va lăsa. Verificați pentru o API, nu o caracteristică: un pârghie care există doar în admin platforma lui UI este o maneta conectorul dumneavoastră nu are.

Exemplu lucrat · Zendesk (punerea în aplicare de referință)

Citit connectors/zendesk/connector.php alongside this. It is short, and every branch below is a decision you will face too.

e-mail → ok

Pune /api/v2/users/{id} cu suspendare=adevărat. Noile cereri de utilizare a unui terminal suspendat deviază către bilete suspendate în loc să deschidă una, cu adevărat aceeași idee ca blocarea unui expeditor, și se oprește fără facturare deoarece utilizatorii finali Zendesk nu au nici unul. Returnează ID-ul utilizatorului ca la distanță_ref.

domeniu → nesuportat

Zendesk poate suspenda un întreg domeniu, dar numai prin suspendarea: cuvântul cheie în blocklist-ul Admin Center textarea, și nu API scrie că câmpul. Caracteristica există; pârghia nu.

ip → nesusţinut

Fără nivel de bilete IP Block există.

Adresa necunoscută → noop

Zendesk nu poate pre-suspenda o adresă pe care n-a văzut-o niciodată. Nimic de făcut nu este un eșec, iar blocul local încă opreşte biletul.

agent sau admin → nesusţinut

REFUZAT. Personalul care se suspend ar bloca un coleg din biroul de asistenţă. O adresă a personalului care ajunge la o listă de blocklist este mult mai probabil să fie o greşeală decât o instrucţiune, verifica rolul înainte de a acţiona pe ea.

Acest ultim rând este cel care merită copiat. Contractul nu vă poate opri să cartografiați un bloc pe ceva distructiv, astfel încât fiecare conector trebuie să decidă pentru sine ceea ce va refuza. Refuzând cu voce tare, cu o detail Un operator poate citi, bate ascultarea.

Raportează sincer. Observaţi cât de puţine rânduri sunt. ok. Acesta este rezultatul corect, nu un decalaj: un bloc de domenii încă funcționează (este aplicat în miez în momentul în care este scris); pur și simplu nu poate fi oglindit spre exterior. Returnare ok pentru ceva ce nu ai făcut i-ar spune unui operator blocul a ajuns pe platforma ta atunci când nu a plecat OpsIQ.

Reguli

Blocul local câştigă întotdeauna.

Este scris înainte de a fi chemat și stă în picioare orice te întorci. Nu poți împiedica un operator blocarea cineva.

Nu arunca niciodată

O aruncare este tratată ca nesusținut și înregistrat. Returnarea a eșuat cu un detaliu în schimb, astfel încât motivul supraviețuiește.

Fiţi idepotent

Acelaşi bloc poate fi anunţat de mai multe ori.

Întoarce-te repede.

Fan-out este sincronizat cu clic pe operator. Queue lucru lent, mai degrabă decât ținerea cererii deschise.

Nu suna înapoi

Nu re-blocare în OpsIQ de la handler. Registrul sare conectorul originar, dar un al doilea hop ar bucla.

Fiecare anunţ este scris opsiq_block_registry_log (operație, natură, valoare, motiv, admin, origine, conector melc, rezultat, detaliu și timbru de timp) astfel încât un operator poate vedea un bloc a sosit de pe platforma dumneavoastră mai degrabă decât de la un agent, și ceea ce fiecare conector a făcut despre ea.

Împinge corect atașamentele

Mână attachments array pentru a crea()/addReply(). Fiecare element poartă fișierul într-una din cele trei forme:

content_b64

Baza64 a octeților de fișiere RAW, utilizați pentru fișierele din spatele auth (cele mai multe cazuri). OpsIQ decodează și re-hostează fișierul pentru tine. Forma cea mai portabilă.

url / sursa_url

A public https URL (ex. un conținut Zendesk_url). Trebuie să fie https; trece o verificare SSRF / permis înainte de a fi stocat.

stored_path

O referinţă de fişier stocată pe care aţi scris-o deja (ceea ce produce compozitorul nativ).

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 numai nume de fișier (nu octeți), astfel încât modelul de intrare fiabil este: citiți octeti în cazul în care codul dumneavoastră rulează deja (în interiorul platformei, sau din webhook sarcina utilă), baza64 le, și le expediați ca content_b64 la eveniment.

Outbound (OpsIQ → platforma dumneavoastră). Când un agent ataşează un dosar, ticket.replied sarcina utilă vă oferă fișierele răspunsului ca stored_path elemente în cadrul OpsIQ magazin de fișiere. Citiți-le și împingeți în propriul format al platformei dumneavoastră, și verificați docuri platforma, problema codării: WHMCS Vreau. base64_encode(json_encode([[name,data]])) (JSON, nu serializat); Zendesk încarcă bytes brute la /uploads.json pentru un semn apoi seturi comment.uploads; Gmail trimite un RFC multipart/mixt-822 mesaj de bază64url-codat în raw; Amazon SES inbound attachments need the S3 receive action (the SNS path caps at 150 KB).

Platforme la distanță: API + webhook, niciodată mese ale unei aplicații

Dacă platforma este o aplicație sau bază de date separată (un site-ul SaaS, o telecomandă WHMCS, un DB diferit pe același server); nu scrie niciodată mesele direct: o bază de date încrucișate scrie terenuri pe orice conexiune este activă și în tăcere ratează rândurile reale. în afara = apelare REST semnat platforma API (replica, stare, departament, ștergeri); în intrare = platforma Posts un webhook semnat, dvs. handleWebhook() verifică şi trage potrivirea ticket.* eveniment. Pentru a opri o buclă oglindă, tag-ul cu care împingeți un marker de origine (ex. mirror_origin:'opsiq'); platforma o ecou pe webhook și mâner-ul de intrare sare propriile ecouri. Verificați OpsIQEvents::isMirroredEvent() în vârful fiecărui handler.

Starea oglinzii, prioritate & departament

Un răspuns mută automat starea, a Agent Răspuns → answered, a client Răspuns → customer_reply; oglinda in acelasi mod. Pentru modificari explicite aboneaza-te la ticket.updated şi citeşte payload['changes'] (de exemplu: {status:'closed'}).

Stare: OpsIQ Setul canonic este open, customer_reply, answered, in_progress, pending, closed. Păstrați o hartă mică cu două sensuri la vocabularul platformei, și asigurați-vă că coloana dvs. acceptă de fapt valorile pe care le scrie (un ENUM lipsa unei valori scade în tăcere la gol de unele baze de date). Departamentul: • OpsIQ Id departament este lipsit de sens pe partea ta, Nu-l trimite niciodată.Trimite descriptorul (.name, email şi slug) și rezolva împotriva propriilor departamente prin e-mail → nume → melc, așa că a Departamentul de facturare în loc de generaleDeclanşează ambele ticket.escalated şi a department_id modificări ale ticket.updated.

💡
Stare / prioritate / subiect / departament / șterge oglinda este poarta de per-conector comutatoare (mirror_status_changes, oglinda_priority_changes, oglindă_subiect_schimbări, oglindă _departament_modificări, oglindă OpsIQ\Connectors\MirrorOptions ajutor. Incorporați blocul în setările dumneavoastră.json şi fiecare conector din oglindă de bilete citeşte comutaţiile identice.

Link un bilet la un produs / serviciu

Dacă clientul a ales un produs specific la deschiderea biletului, ştampilaţi un indiciu astfel încât agentul să vadă un card de servicii concentrat (cu un singur clic "vizualizează alte produse" pentru restul).

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 cod de serviciu al platformei, de exemplu WHMCS S396 (serviciu)396) / D11 (domeniul11). OpsIQ se descompune opțional de tip-scrisoare + ID și se potrivește cu lista de servicii, cu un dispozitiv de pază de tip astfel încât un cod de domeniu nu se potriveşte niciodată unui produs al aceluiași id. Expuneți o potrivire ref pe fiecare serviciu pentru un meci exact.

related_domain

Un nume de domeniu; potrivit ca un substring împotriva detaliilor / domeniilor fiecărui serviciu.

💡
Construiți lista de atașamente o dată, în forma de mai sus și OpsIQ se ocupă de restul: găzduit URLs sunt trecute prin și conținutul de bază64 este stocat și re-hosted pentru tine. Nu aveți nevoie să scrieți per-platformă manipulare fișiere.
⚠️
Cheile de acțiune sunt litere, cifre și accente. Constructorul acceptă3la80caractere și, de asemenea, permite puncte; magazinul de acțiune acceptă2la100caractere fără puncte, așa că păstrați la litere, cifre și accente și vă satisface ambele. Adăugarea unei acțiuni creează nici un traseu AJAX, astfel încât nu există nimic pentru a regenera

Lasă-l pe AI să-ţi construiască.

Nu trebuie să completați șase pași în mână. Descrieți conectorul cu propriile cuvinte și OpsIQ_'s AI proiectează întreaga specificație, trece prin același validator pe care îl folosește vrăjitorul și vă arată planul înainte ca orice lucru să fie scris pe disc. Există două locuri pentru a face acest lucru, iar acestea produc același pachet.

În vrăjitor

Deschide Conectori→+ Adaugă conector→Construiește conectorulPe trepte.1Vei vedea. ✨ Construieşte-mi-oTastaţi ce conector este pentru platforma, ceea ceOpsIQar trebui să citească și ceea ce ar trebui sa scrie, și cine îl foloseșteAPIroot dacă îl știi, și apăsați-l. Vrăjitorul umple fiecare pas din proiect, și vă revizuiți și editați exact ca și cum l-ați fi tastat.6același panou apare ca ✨ Refini cu AI, astfel încât să puteți cere o schimbare ("de asemenea, citi facturile") în loc de editarea câmpurilor.

ÎntrebandOpsIQ

Deschideţi Întreabă OpsIQ copilot oriunde în admin și spune ceea ce vrei. Nu aveți nevoie pentru a numi o acțiune sau știu vrăjitor există.

1
Cere-o.

De exemplu: "Construieşte-mi un conector pentru Trello. Ar trebui să-mi listeze plăcile şi listele, să citească cărţi şi să creeze o carte pe o placă. Trello foloseşte o cheie API cheie plus jeton."Copilotul răspunde într-o propoziţie şi arată un Proiectează acest conector Mesajul tău este scurt, aşa că pune platforma, citirile şi scrierile în ea.

2
Confirmă proiectul

Nimic nu este scris încă. Copilotul proiectează caietul de sarcini, validează-l, și răspunde cu planul: ceea ce face conectorul, acțiunile pe care le va expune (scrise marcate), ipotezele făcute, și întrebările pe care încă trebuie să răspundă24ore.

3
Spune "construieşte-o"

Copilotul arată un Construiește 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
Introduceți acreditările și permiteți

Noul conector este publicat, dar NU este activat și nu are secrete. Deschideți setările sale, introduceți tasta API _apăsaţi Test, atunci ActiveazăPână o faci, nu face nimic.

💡
Ambele cărți au nevoie de click-ul tău. Pasul de proiect nu scrie nimic; pasul de construcție este marcat distructive și întotdeauna cere. AI nu poate publica un conector, permite unul sau introduceți o acreditare pe cont propriu.

Ce este AI și nu are voie să facă

Validatorul este peretele.

O specificație redactată trece exact prin aceeași validare () a butonului de publicare al vrăjitorului. Dacă nu trece, AI este dat erorile și încearcă din nou, până la trei ori, iar apoi refuză în propriile cuvinte ale validatorului. Un proiect care nu reușește niciodată să devină un pachet.

Nu scrie nici o acreditare.

Proiectul de nume modelul de autentificare și câmpurile de setări; niciodată nu inventează o cheie, jeton sau secret. Le completați ulterior pe pagina de setări a conectorului.

Răspunde cu întrebări, nu presupuneri.

Orice nu ar putea ști

Un obiectiv inventat nu reuşeşte cu voce tare

AI este spus să nu inventeze căi, dar nici un model este perfect. O cale greșită publică ca o acțiune care nu reușește testul său live pe pasul Acțiuni sau prima dată când rulează

Pachetul este obişnuit

Ceea ce produce este un pachet Constructor normal: aceleasi fisiere generate, acelasi contract, aceeasi semnatura, editabila in vrajitor, demontabila din pagina Connectors. Nu exista nici o separata "Conector AI" tip.

Modelul tău face redactarea

Calitatea urmează modelul pe care l-ați configurat în Setări → AI. Un model mic, ieftin proiectează un conector corect dar simplu și pune mai multe întrebări; un model mai puternic obține mai mult din obiectivele de prima dată. Schimbă-l sub configurația AI; nimic altceva nu trebuie să se schimbe.

⚠️
Copilotul poate executa doar acţiuni pe care această instalare le-a înregistrat efectiv. Dacă acţiunile Connector Builder lipsesc manage_connectors În loc să ofere o carte, copilotul spune mai degrabă decât să dea greş când faceți clic.
Conectori

Vânzarea prin chat: harta de rol comercială

Un conector care poate vinde o platformă de magazin, un sistem de rezervare, o poartă de plată OpsIQRoluri de comerţ canonic. Declaraţi-o şi conectorul apare sub Setări → Client Chat → Vânzarea prin chat automat; opri declararea și dispare. Nu există nici o listă pentru a înregistra pe.

Fișierul: commerce_roles.json

Declarația trăiește în propriul fișier la rădăcina pachetului prezența dosarului este cerereaNu poate trăi în connector_contract.json: acel fișier este regenerat de uneltele de ambalare și schema sa respinge chei necunoscute, astfel încât un bloc cu adaos mână ar eșua validarea și apoi să fie suprascris.

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"
    }
  }
}

Regulile, și de ce există fiecare

Rolurile sunt un vocabular închis

OpsIQ niciodată nu deduce un rol dintr-un nume de acțiune. Un rol care nu este declarat nu există

Operaţiunea trebuie să fie una dintre acţiunile tale.

Fiecare operaţiune cartografiată trebuie să existe în actions.jsonO scriere declară o capacitate care nu poate rula, și se suprafeţe la un client ca "Eu pot verifica că pentru tine" urmat de nimic.

Un rol de citire nu indică niciodată o operaţiune distructivă

Citiți roluri (catalog, disponibilitate, citez, căutare comandă) trebuie să cartografieze operațiunile care nu schimbă nimic pe platforma dumneavoastră.

Un rol de scriere nu se referă niciodată la o operațiune generică de înregistrare

Cartografiere order_create la un tabel brut introduce record.create, db.insert, recordCreate, orice ortografie, orice perturbă

Un rol scris declară o operațiune de recuperare

Un look-up idepotent care răspunde "a făcut pământul meu scrie?" Cea mai periculoasă pauză este cea după platforma dvs. poate fi creat deja comanda; fără o căutare de recuperare, singurele opțiuni sunt să reîncercați orb sau să-l pierdeți.

Rolurile de plată cu care se confruntă furnizorul au trei obligații suplimentare

Un pachet care discută direct cu un prestator de plată trebuie să declare, de asemenea, payment_profile (curente, țări, metode și mediu ا Un mediu neevaluat este modul în care o integrare test ia o plată live), webhook_verify (schema reală de semnătură a furnizorului; se refuză un compar generic secret) și event_map (Events provider on canonical ones). Un conector comercial care implementează doar record_payment primește deja dovezi de plată canonică verificate; nu trebuie să pretindă că este poarta.

Declararea modului în care clienții pot comanda de la un magazin conectat

Un conector de comerciant și un conector pentru calea de plată sunt contracte diferite. Comandare client magazin conectat, alege modul cel mai profund platforma poate dovedi. Alegerea este ambalată în interiorul semnat commerce_roles.json; Magazin și Client Chat-l recitiți la momentul execuției. Îndepărtarea unui rol sau dezactivare / dezinstalarea conectorului invalidează, prin urmare, o propunere anterioară făcută în loc de a lăsa în urmă o autoritate stală.

catalog_only

Hărți catalog_search sau catalog_get. OpsIQ pot căuta și explica produsele, dar nu poate arăta un ordin executabil sau confirmarea de verificare. Fiecare pachet rămâne la această situație de neplată până când propriile sale cotații tastat și acțiuni de checkout / comandă trec mai profund contract și certificare Marketplace; niciodată nu infer suport tranzacțional dintr-un nume platformă.

platform_checkout

De asemenea, hărți quote şi platform_checkout. Acţiunea comerciantului nu OpsIQ core checkout_url, checkout_reference și citatul canonic. URL trebuie să fie HTTPS, numele său de gazdă trebuie să se potrivească customer_ordering.checkout_hosts sau gazda HTTPS derivată din checkout_host_setting, și citatul poate trăi pentru cel mult15minute. Un produs permalink, coș asamblat localURLsau să se întoarcăURLnu este o capacitate de verificare eliberată de comerciant.

direct_order

De asemenea, hărți quote, order_create şi order_get, cu order_create.recoveryCore reîmprospătează citatul imediat înainte de execuție, furnizează cheia idepotency, și cere operațiunea de recuperare după fiecare rezultat necunoscut înainte de orice rejudecare. payment_flow=opsiq_gateway, trebuie să-l harta suplimentar record_payment cu o operațiune de recuperare/redare a datelor. OpsIQ verifică activ tranzacția de acces, se potrivește valorii, monedei, comerciantului și referinței comenzii, scrie o dată trimiterea furnizorului, apoi citește factura comercială / comanda înapoi. A mark_invoice_paid comutația statutului este respinsă deoarece nu conține dovezi de plată. Acțiunea crea trebuie să invoce propria logică a pieței, a stocurilor și a comenzilor; se refuză baza de date brută.

Verificarea identității și ce poate schimba operatorul

Când OpsIQ deţine plata, clientul trebuie să ajungă la chat email_otp înainte de crearea unui ordinOpsIQe- mail a6- cod de cifre și cere pentru ea. Acest lucru nu este ceva un conector optează din; acesta este etajul de asigurare nucleul de execuție solicită order_create.

Singura excepţie şi cine o controlează

Un operator poate accepta o adresă neverificată NUMAI în cazul în care conectorul declară fulfilment_presence: customer_presentUn oaspete al hotelului trebuie să sosească, aşa că o adresă greşită direcţionează greşit o chitanţă şi camera este încă acolo. remote_delivery În cazul în care se utilizează o metodă de testare, trebuie să fie luate în considerare toate informațiile relevante. minimum_assurance sau reversibility: irreversible De asemenea, elimină capacitatea operatorului de a sări peste ea.

Cât timp durează codul

Treizeci de minute în mod implicit, operator-configurabil5minute până la24Clientul vede o numărătoare inversă în direct. ei proprii fus orar, nu a operatorului. Un cod expirat spune atât de clar și oferă unul nou mai degrabă decât raportarea unui cod invalid

Ce trebuie să furnizeze clientul: client_fields

Numele și e-mailul sunt întotdeauna necesare și sunt colectate în primul rând. address, phone şi company as required sau optional pentru a se potrivi afacerii: un magazin pe care navele colete declară adresa necesară; un hotel declară că telefonul este necesar, deoarece un oaspete nu poate apela are nici un contact de rezervare. Asistentul le cere în conversație înainte de a cita și OpsIQ refuza sa plaseze o comanda care nu are un camp necesar. Constructorul scrie harta normalizata, inclus de baza, astfel incat contractul pe disc este explicit.

Atunci când contul este creat: @ info

at_order (default) permite scrierea ordinului să creeze un cont de cumpărător pentru prima dată. before_quote atunci când prețul platformei per contWHMCSImpozite pe client proprii profil și cotații în moneda clientuluiOpsIQcreează contul prin intermediul dumneavoastră customer_create acţiune imediat ce câmpurile necesare sunt cunoscute, apoi cere cotaţia pentru acel cont, astfel încât cardul de confirmare poartă totalul va factura de fapt. Necesită account_flow: connector_signup.

Asistentul aduce, nu citeste: client_tools

Cu Create Comenzi on, asistentul nu citește un catalog lipit. Acesta numește trei instrumente commerce_catalog_search (o cerere de informații goală este o prezentare generală a familiilor de produse; rezultatele care depășesc limita sunt enumerate după nume); commerce_catalog_get pentru un singur element în întregime; și commerce_quote, care menteaza serverul de confirmare semnat-side prin aceiasi pereti calea conectorului a avut întotdeauna. Un instrument pe verb, conector ca parametru, astfel încât un magazin cu șase conectori devine trei instrumente mai degrabă decât optsprezece. client_tools restrânge implicitul; absent înseamnă fiecare cartografiat și catalog_only Conectorul nu citează niciodată. Confirmarea nu este niciodată un instrument: butonul cardului de pe web, exact CONFIRM Comanda pe un canal, şi nimic din ce spune un model nu cheltuie bani.

Ce elemente catalog ar trebui să transporte

id, name, un client-sigur summary, a category sau familia de produse (acesta este modul în care un cuvânt al clientului descoperă un element al cărui nume este un cod); currency, unit_amount_minor, available, și input_schema Desemnare câmpurile o nevoie de ordine. Caută scoruri cuvintele clientului împotriva numelui, familiei, ciclu și rezumat.

Refuză cu un motiv pe care clientul poate acționa

Returnează {"success":false,"error":"…","missing":["domain"],"retryable":true} atunci când o valoare este greșită sau lipsește. missing sau retryable ajunge la client verbatim; un eșec gol rămâne generic, astfel încât nimic nu scurgeri interne.

Moneda Geo și oprirea de urgență

Atunci când operatorul se transformă pe moneda Geo (Client Chat → Comportament), clientul citește prețurile în propria monedă pe fiecare suprafață Pauză toate vânzările (Setings → Commerce) este comutatorul de ucidere: catalog, citate și caut-up-uri rămâne deschis; propunerea și confirmarea opri pe fiecare canal.

Când vânzarea prin chat nu se comportă

Negustorul nu a putut fi contactat.

Sigiliul pachetului este rupt: un fișier a fost editat după semnare. Re-publicați pachetul. O copie instalată pe piață nu este niciodată editată în loc; actualizați-l de la panoul pieței.

Comandarea este oprit pentru acest magazin chiar acum

Setările sunt pornite.→Comerț→Pauză pentru vânzare.

Comandarea nu este disponibilă pe acest canal încă

Canalul nu este bifat sub locul unde clienții pot cumpăra. Serverul de nume de canal.

Asistentul descrie un articol, dar nu apare nici o carte

Instrumentul citat refuzat. Fiecare apel este autentificat ca [opsiq][commerce][client_tool] cu motivul: un element id greșit, un câmp elementul nu declară, un domeniu luat, sau comerciantului comerciale propriul refuz. Citiți jurnalul înainte de a avea încredere în parafrazoare asistenti.

Asistentul spune că nu poate vedea produsele.

Pagina aparţine unui alt spaţiu de lucru. Fiecare widget web aparţine unei singure spaţii de lucru, iar conectorul magazinului trebuie activat acolo.

Un răspuns conservat în loc de un răspuns

Spune-mi un pic mai mult despre ceea ce aveți nevoie de înseamnă că furnizorul AI se autointitulează eșuat; AI Istoria arată eroarea exactă sub care rândul său, și instrumentele nu au fost niciodată atinse.

Un conector de editare nu apare în chat

Muncitorul reciclează pe cod schimba într-un minut, dar o conversaţie reia ultima carte. Începe o nouă conversaţie pentru a testa.

Un vizitator nigerian vede dolari, deşi moneda Geo este pe

Verifică dacă geo-IPbaza de date este configurată (Client Chat→Geo) și că moneda de vizitare are o rată FX; cu nici o ratăOpsIQarată preţul magazinului mai degrabă decât un număr greşit.

Total este singura cifră care mută bani

Un citat poartă unit_amount_minor, quantity şi total_amount_minor, și este tentant să trateze al treilea ca derivat din primele două. Nu este, și presupunând că este deja a costat un client bani reali.

quantity este ceea ce CUSTOMER a ales o cameră, o licență, o politică. Multiplicatorul poate fi cevaOpsIQnu vede niciodata: nopti, locuri, cicluri de facturare, distanta, greutate, nivele. Un hotel citează o cameră pentru trei nopți ca cantitate1, unitate105,000, total315,000. OpsIQunitatea înmulțită cu cantitatea la prețul unui card de confirmare, a arătat un oaspete105,000, și apoi a încărcat315,000Faptul că ne-am înţeles la o cifră şi am fost taxat pe alta este cel mai rău lucru pe care acest contract îl poate face.

Regula

total_amount_minor este singura cifră OpsIQ arată, semne, taxe și reconciliază. unit_amount_minor este un detaliu de afișare pe linie. În cazul în care totalul dvs. nu este exact ceea ce doriți încărcat, citatul dumneavoastră este greșitOpsIQnu-l va corecta, deoarece un total care a fost ajustat în mod util este una pe care nu ai fost de acord să o onorezi.

Ce înseamnă asta pentru acţiunea ta de citat?

Returnează cifra all-in. Aplicați propriile nopți, niveluri, reduceri, impozite și taxe înainte de a răspunde. Dacă linia ta nu reconciliazăOpsIQtratează totul ca pe o singură linie la preţul său real, în loc să inventeze o decădere care nu se împacă cu nimic.

Şase răspunsuri care fac ca acest contract să se potrivească oricărei industrii

Declaraţia de mai sus a început ca declaraţie un magazin: cumpăraţi un lucru, plăti acum, este al tău, puteţi anula. Fiecare dintre aceste patru este o presupunere unele afaceri reale nu împărtăşeşte. O bancă în mişcare bani nu se poate anula-l. Un asigurător nu poate spune "confirmat" până când un subscrier a căutat. Un comerciant facturile după aceea. O clinica facturi cineva care nu este pacientul. Fără nici un fel să spun acest lucru, aceste întreprinderi fie în mod eronat propriul lor proces la propriii clienţi sau nu pot conecta deloc.

Deci un conector tranzacţional răspunde la încă şase întrebări. Fiecare implicit la citirea strictă Nu spune nimic este întotdeauna sigur și niciodată permisiv, pentru că a spune nimic nu este ceea ce un autor face atunci când nu au luat în considerare întrebarea.

transaction_kind

purchase, booking, subscription, bill_payment, transfer, application, top_up, renewal. Vocabular, mai degrabă decât comportament: decide cuvântul citește clientul dumneavoastră. Apelarea unui transfer bancar un "ordin" face asistent sunet ca nu înțelege afacerea ea vorbește pentru, și nici o cantitate de sanitare corecte recuperează din care. Implicit la purchase.

decision_mode

immediate sau deferredAlege. deferred pentru orice merge la subscriere, evaluare de credit, referințe, admitere sau un comitet. OpsIQ apoi spune depuse Mai degrabă decât confirmat, și mâinile peste referirea de a cere despre ea. Spune cineva cererea lor este confirmată în timp ce se află cu un om este cel mai dăunător lucru pe care un asistent de chat poate face pentru o afacere reglementată, și este comportamentul implicit al fiecărui flux în formă de vânzare cu amănuntul. Implicit immediate.

payment_timing

on_confirmation, deposit_then_balance, invoice_later sau no_payment. Aceasta decide dacăOpsIQdeschide o pagină de plăți deloc, astfel încât nu poate fi dedus din payment_flow Asta spune care Ia banii, aici scrie dacă și când. Lucrați factura după aceea, și aplicații care nu costă nimic pentru a depune, se încheie la confirmarea în loc de a ajunge la o listă poarta care este goală sau greșită.

reversibility

reversible sau irreversibleCel mai important lucru pe care un conector financiar spune. O cameră poate fi eliberată și o parcelă se poate întoarce; un transfer completat nu poate irreversible forțe automate cancellation_flow la none și interzice orice setare a operatorului de la omite verificarea identității, Orice altceva spune această declaraţie. Două domenii care nu sunt de acord nu este un stat pentru a rezolva la termen prin oricare dintre acestea se citește primul. Implicit reversible.

cancellation_flow

none, platform_only sau connector_cancel. Rolurile de anulare deja a existat cu nici o regulă despre cine ar putea ajunge la ele, și cele două presupuneri greșite nu în direcții opuse: ghici deschis și un mesaj de chat anulează o rezervare plătită cu nici un comision citat; ghici închis și un client care vrea să anuleze este spus la telefon. connector_cancel necesită în plus cancellation_quote şi order_cancel cu o recuperare bază OpsIQ nu anulează niciodată înainte de a spune cât costă. Implicit la none.

fulfilment_presence

customer_present sau remote_delivery. Dacă o adresă de e-mail neverificată poate costa pe oricine orice. Un oaspete al hotelului trebuie să sosească, astfel încât o adresă greșită direcționează greșit o chitanță și camera este încă acolo; un colet postat, un server furnizat sau un link de descărcare lasă doar pe puterea acelei adrese. Aceasta este ceea ce face un operator, și este declarat de tine mai degrabă decât ales de ei remote_delivery.

minimum_assurance şi disclosure (opțional)

minimum_assurance Te lasă să ceri mai mult dovada de identitate decât OpsIQ impune, niciodată mai puțin disclosure este textul indicat înainte butonul de confirmare, pentru o rată, un comision sau un drept de răcire trebuie să prezinte; fără aceasta, întreprinderile reglementate introduc sub formă de formulare necesară într-un nume de produs.

notify_flow

platform_automatic, platform_triggered sau none- Când? OpsIQ ia plata propria ta checkout nu ruleaza, astfel încât orice ar fi de obicei e-mailuri nu trage. Înregistrarea marcajelor de plată ordinul plătit; aceasta obligă nici o platformă să spună nimănui. platform_triggered necesită order_notify rol cu o recuperare, și OpsIQ cere numai după ce plata de citire-back dovedește banii este înregistrată. Declaring none face ca confirmarea OpsIQ-side să fie obligatorie, pentru că altfel un client plătitor nu aude nimic. Implicit la none.

Acelaşi contract, nouă întreprinderi neasociate

Nici unul dintre acestea nu au fost proiectate în jurul valorii. Fiecare este contractul răspunde sincer pentru o industrie diferită, cu OpsIQ știind nimic despre oricare dintre ele.

Un contract, nouă industrii
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
Eveniment plătit furnizat platformelor

După ce plata nativă pe Storefront este verificată și angajată în mod activ, OpsIQ emite payment.completed cu order_id, payment_id/provider_ref, gateway, exact amount_minor, ISO currency, client, elemente linie, canal și paid_atUn conector comercial trebuie să continue această dovadă prin intermediul record_payment și citiți-l înapoi; un conector de control găzduit consumă propriul eveniment plătit cu autoritate și nu trebuie să primească o copie a unui formular de plată.

AI este un promotor, nu o sursă de autoritate

Modelul poate selecta un produs declarat și cantitate, dar nu poate alege un nume de operațiune, ment a checkout URL sau crea starea comerciantului din text. Clientul primește o carte semnată exactă și trebuie să apăsați butonul său de confirmare. Această confirmare este legată de spațiul de lucru, conectorul, elementul, cantitatea, cotația, moneda, firul și expirarea.

Clienţii sociali păstrează acelaşi flux fără a fi nevoie de un e-mail

WhatsApp, Messenger,Instagram, Telegram, LINE, SMS și X utilizează contul canal verificat de furnizor ca identitatea clientului. Propunerea este semnată la acel cont canal și confirmarea încă mai trece prin aceeași cotație proaspătă, stoc, idempotență, controale de plată și recuperare. Un client social folosește exact acțiunea de confirmare o singură dată făcută în conversația lor; proza obișnuită cum ar fi

Istoricul comenzii urmează o legătură de identitate exactă, niciodată un e-mail ghici

Ordinele native sunt indexate de o identitate opacă a canalului, astfel încât AI poate răspunde ? Unde este comanda mea? . Fără să ceară un număr de e-mail sau de comandă. Pentru istoricul magazinului conectat, conectați identitatea canalului la spațiul de lucru CRM/registrul client și implementa căutarea cu autoritate în conector. Furnizorii de context clienți primesc acel link stocat; ei nu trebuie să aleagă un cont dintr-un nume de afișare sau un email tastat în chat. Cu un ordin de potrivire răspunsurile AI direct; cu mai multe se rezumă meciurile și întreabă care dintre ele; cu nici unul nu spune că nu există nicio legătură între istorie.

Faceți ca sarcina utilă să fie universală: câmpurile tastate și o identitate deținută de server

Core nu conține WHMCS, hotel, SaaS, magazin, bancă, produs, traseu sau sucursală vânzător. parameters sunt formularul client și schema de sloturi AI. Un conector de rezervare poate declara datele și oaspeții; un conector pentru facturare poate să declare un ciclu; un viitor conector al întreprinderii își poate declara propriile câmpuri sigure. OpsIQ sanitizeaza controalele primitive și trimite valorile colectate numai la acțiunea conectorului cartografiat.

Acțiune de citat tipată
{
  "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"}]}
  ]
}

Pentru clients_only, set customer_ordering.identity_parameter la parametrul de actiune care primeste ID-ul clientului extern. Acest camp nu este niciodata aratat unui client si orice valoare furnizata de apelant este eliminat; OpsIQ injecteaza doar ID dintr-un link verificat conector. Checkout-ul o lasa goala. Un e-mail tipat este dovada pentru un cautare declarata, nu o login si nu autoritatea de achizitionare.

Domenii grupate: contul de client semnat și configurarea conectorului aparțin spațiului de lucru portal principal grup. Cu toate acestea, jetonul de identitate trebuie să fie semnat pentru site-ul membru exact care înglobează widget-ul, folosind că membrul webhook secret. OpsIQ verifică că suprafața mai întâi și numai apoi rezolvă comerțul și clientul legat prin grupul primar. Nu înlocuiți niciodată tasta site-ului cu cheia primară și nu copia secretul primar la un site membru.

Plicuri canonice conectorul trebuie să se întoarcă

Catalog
{
  "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"}
  }]}
}
Citat
{
  "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"
  }
}

Răspunsul de verificare a platformei repetă citatul canonic valabil și adaugă un HTTPS checkout_url. Core reîmprospătează cotația la confirmare și compară moneda, selecție totală și stabilă exact. Conectorul traduce răspunsul platformei sale în aceste plicuri; nucleu nu traduce câmpurile vânzătorului sau construiește comerciant URL.

Faceți disponibil un portal de operare construit în magazinul nativ și discutați

Capacitatea de plată nu pune o poartă în fața clienților. Activați Poarta de plată a depozitului nativ bloc în Connector Builder. Acesta adaugă un contract versiuni explicite, crearea de checkout hărți și căutarea activă a plăților, și permite listarea domeniilor de control-out găzduit furnizor. Odată ce conectorul este instalat, activat și selectat în cadrul setări comerciale, aceeași poartă apare în Magazinul public, Store modal, Checkout-chat client-și checout autonom. Nici un slug furnizor nu este hardcoded.

Contractul de acces la magazinele native
{
  "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"]
    }
  }
}
Ieșire canonală de control

Hartile de actiune ale caselor de verificare checkout_url şi când furnizorul are unul, session_id. URL trebuie să fie HTTPS, nu conține acreditări și se potrivește cu o gazdă autorizată.

Rezultatul stării canonice

Acțiunea de stare efectuează un nou furnizor API căutarea și hărți paid ca un boolean adevărat, amount_minor ca număr întreg, currency ca cod ISO din trei litere; și provider_ref. O întoarcere URL, sir de interogare, sarcina utilă client, sau conectat-supplied

Contractul de rambursare facultativă

Dacă poarta de acces acceptă rambursările, harta payment_refund şi acţiunea de recuperare. Restituirea creaţiei revine strict accepted şi completed Booleans plus provider_ref; recuperare efectuează un control și returnări furnizor statusFără ambele acţiuni, OpsIQ nu face publicitate rambursărilor conectorului.

Cine a confirmat ordinul?

Conectorul nu scrie niciodată unOpsIQStarea comenzii.OpsIQcompară exact suma returnată și moneda și înregistrează referința furnizorului; numai atunci nucleul efectuează tranziția verificată de furnizor. Transferul bancar manual rămâne singurul flux pe care un agent numit îl poate aproba.

În Connector Builder, căpușă comerț, harta rolurilor și configurarea acestora Comandare client magazin conectat, Poarta de plată a depozitului nativ, sau ambele atunci când conectorul oferă cu adevărat ambele contracte. Vrăjitorul validează declarația și scrie commerce_roles.json. Editura încă mai utilizează procesul normal de revizuire a pieței și semnătură; acest contract nu ocolește verificarea pachetului sau face un conector neinstalabil. Verificați orice pachet manual cu php tools/verify_commerce_contracts.php.
💡
Transporturile sunt http pentru o distanță API sau bridge pentru o operațiune numită pe un pod desfășurat (a se vedea NO-APIRolurile de mai jos sunt agnostice în domeniul transporturilor; timpul de desfăşurare are nevoie doar de transportul declarat astfel încât să poată transforma-para un pod.
Conectori

Vânzarea prin chat FĂRĂ conector: Acţiuni şi declanşări

Contractul comercial de mai sus nu necesită un pachet conector. Dacă platforma dumneavoastră este propria dvs.API, un sistem pe care nimeni nu-l transportă cu o conectori pentru . Puteți ajunge la aceeași mașină de vânzare cu cele două instrumente pe care le utilizați deja pentru a integra orice altceva: acțiuni personalizate (obiectivele dvs. HTTP, definite pe pagina acțiunilor) și Triggers (acțiuni online). Acelaşi contract, același card, aceeași asigurare de identitate, același nucleu de plată, aceleași chitanțe. Singurul lucru lipsește este pachetul, deoarece nu există niciun cod terț de semnat.

Cum se potriveşte împreună

Construiți o acțiune personalizată pe rol comercial AII & Automatizare → Acțiuni cu URL, antet aut și parametri. Apoi salvați o declarație care hărți roluri pentru aceste acțiuni. Din acel moment magazinul apare în chat exact ca un conector-backed unul: AI citează din a citez acţiune, cardul de confirmare redă, clientul verifică e-mailul lor, ordinea apeluri nucleu a dispune acțiuni cu o cheie de idempotență; OpsIQ ia plata prin intermediul porților de acces ale spațiului de lucru; și a nimic despre experienţa clientului nu spune "custom."

Declarația

Salvează acest JSON ca setare a spațiului de lucru commerce_custom_integration (Setări→setări avansate sau prin intermediul setărilor RESTAPI). Este aceeași formă ca și un pachet commerce_roles.json Nodul comercial, cu action Denumire ID-uri de acțiune personalizate:

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"
  }
}

În cele din urmă, adăugați custom_commerce conectorilor abilitați pentru vânzarea sub Setări→Client Chat→Se vinde prin chat. Admiterea este re-verificat pe fiecare cerere, și refuză cu motive numite mai degrabă decât ascuns în tăcere magazinul: un rol modul tău necesită ca hărțile la nimic, un rol scris fără o acțiune de recuperare (§15.7 ا a scrie al cărui rezultat nu poate fi cerut din nou este refuzat), o acțiune care a fost ștersă sau dezactivată de când ai salvat.

Ce trebuie să facă fiecare acțiune

Returnează plicul conectorului

Răspunde {"success": true, "data": { ... }} sau {"success": false, "error": "a sentence a customer may read"}. Acțiunea ta calea de succes a răspunsului Ar trebui să arate spre plic.

Citat: totalul total, în unități minore

Returnează quote_id, product_name, quantity, unit_amount_minor, total_amount_minor, currency, selection, selection_summary, expires_atTotul în secțiunea "totalul tău este singura cifră care mută banii" de mai sus se aplică verbatim: impozite, taxe și multiplicatori intrați în total, pentru că totalul dvs. este ceea ce este semnat, afișat și taxat.

Creare ordine: onora cheia idempotență

Primeşti idempotency_key, semnat total_minor şi currency, verificat customer_email, și propriile parametri de cotare. Păstrați cheia cu comanda; dacă ați creat deja o comandă pentru ea, returnați această comandă în loc de un al doilea unul. Verificați banii reference platforma ta recunoaşte.

Recuperare: răspundeţi la o singură scrisoare

order_by_key primește cheia idempotenței și răspunsuri {"found": true, "order": {...}} sau {"found": false}. găsit: fals este o promisiuneOpsIQpoate rejudeca scrierea pe puterea de ea. Un feed stare sau o listă recente comenzi nu este un răspuns despre o singură scriere.

Plata inregistrarii: propria cale de decontare

Primește tranzacția de acces id ca cheie idempotency plus referința comenzii, după ce OpsIQ a verificat în mod activ suma și moneda cu poarta. Marchează comanda plătită prin platforma ta platform_notified: true dacă platforma ta trimite e-mailuri clientului însuşi.

Intrările pe card provin din parametrii de acțiune

Orice parametru declarat pe acțiunea QUOTE (dincolo de parametrul de identitate) pe care AI nu l-a colectat este redat pe cardul de confirmare ca intrare pe care clientul o completează

Declanşatoare: auzi propriile vânzări

Două evenimente au luat foc la autobuzul de eveniment comun, astfel încât telecomanda şi automatizarea dumneavoastră să audă fiecare vânzare a chat-ului oriunde ar fi executat:

commerce.order.created

În momentul în care ordinul aterizează pe partea comerciantului, înainte de plata custom_commerce), suma, moneda, e-mail client, id fir.

commerce.payment.confirmed

Exact o dată pe comandă, atunci când poarta verifică în mod activ plata. Acesta merge aceeași afirmație care previne chitanțe duplicate, astfel încât nu poate dubla-foc webhook.

Când să absolviţi la un conector

Integrarea personalizată este configurarea spaţiului de lucru: serveşte magazinul tău, pe spaţiul de lucru. Momentul în care vrei să distribui integrarea

Conectori

Conectați o platformă care are NO API (modelul podului)

O multime de platforme reale nava nu RESTAPIUn hotel CMS, un sistem vechi de facturare, o unealtă internă.OpsIQconector pentru unul: conectorul navighează un singur fișier PHP pe care operatorul îl introduce în propriul lor webroot public, iar acel fișier esteAPIAceastă pagină este întregul model, cu regulile care fac sigur pentru a rula și motivul din spatele fiecărei reguli.

Forma ei

Un conector normal îi spune altcuiva API_. Un contor de pod aduce propria sa. Nimic altceva nu se schimbă: aceleași acțiuni, aceiași furnizori context, același contract de identitate, aceeași structură a pachetului.

1
Scrieți un fișier 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
Operatorul îl copiază în webroot-ul lor.

Lângă indexul propriu al platformei. php. Nu se modifică niciun cod de platformă, nu se instalează nici un modul, nimic care să mențină pe platforma upgrade-uri.

3
Panoul conectorului le dă fişierul

Setările dumneavoastră.json declară webhook_help. snippet_template. Pagina conectorului îl redă ca pe un fișier copiabil cu setările lor live deja substituite, așa că nu există nimic care să-și poată da mâna.

4
OpsIQ îl numește server-la-server

Client.php trimite cereri GET cu cheia comună într-un X-Opsiq-Bridge-Keyheader.BazaURLSetarea este rădăcina site-ului platformei.

Conector Builder poate genera acest lucru pentru tine acum. Alegeți "Platformă fără API" profilului (sau setează accesul la date pentru bridge) şi emite fişierul de bridge, fragmentul corespunzător al panoului şi acţiunile tastate care citesc şi scriu prin el — pentru un Laravel Aplicația citește.env, pentru. WordPress Modul Bridge fixează autentificarea la wp-config.php, sau cu datele de conectare pe care le inserați pentru orice altceva. OpsIQ bridge protocol: conectorul generează în siguranţă api_key atunci când este activat, trimite ca X-Opsiq-Bridge-Key, și leagă aceeași valoare salvată în OPSIQ_BRIDGE_KEY în fișierul copiabil. Hand-autor numai atunci când platforma ta nu este nici una dintre acestea, sau atunci când aveți nevoie de comportament podul generat nu acoperă. Un pod scris manual este sigur de la vrăjitor: acesta suprascrie doar un fișier pod care poartă propriul marker.
💡
Totul de pe această pagină este afișat în PHP împotrivaMySQL, deoarece aceasta este implementarea de referinta si singura combinatie pe care conducta de ambalare o sustine in totalitate. Modelul in sine este agnosticul limbajului si agnostic-motor: vezi "Podul in alte limbi si alte baze de date" pentru poarta din Node, Python, Go, Ruby, .NET si Java, interogarea introspectieiPostgreSQL, SQLServer,SQLiteşi Oracolul,MongoDBechivalent

Modelul de securitate, și de ce fiecare regulă este acolo

Acest fișier se află într-un webroot public în spatele unei chei comune. Că un singur fapt conduce fiecare regulă de mai jos. Nu relaxați nici unul dintre ei pentru a face podul simplu.

Apelantul nu furnizează niciodatăSQL

Nu este o clauză Where, nu un fragment de ordin BY, nu o "doar această dată" parametru de interogare brută. Apelantul numește un tabel, o coloană și o valoare; fișierul construiește declarația. Momentul în care un apelant poate contribuiSQLtext, o cheie comună devine execuția arbitrară a bazei de date.

Numele tabelului și ale coloanei sunt validate pe baza informațiilor_schemei

Identificatorii nu pot fi legați ca parametri, astfel încât acestea trebuie să fie verificate în schimb. Citiți lista de tabele reale și coloane pentru această bază de date și refuza nimic nu pe ea. Un identificator care nu este un obiect real al acestei scheme atunci nu poate ajunge la o interogare deloc . Care este ceea ce face sigur pentru a expune fiecare tabel.

Fiecare valoare este un parametru legat

Fără excepţie, inclusiv valori în interiorul unei căutări. Identificatorii validaţi plus valorile limită sunt perechea care face suprafaţa totală şi suprafaţa de injectare zero.

Citirile sunt universale, scrierile sunt permise

Asta e regula pe care oamenii vor să o sară.

Coloanele secrete sunt redactate pe baza citirii şi a refuzului scrisului

Potrivire pe coloana Nume: parola, amintiți-vă_token, secret, api_key, privat_key , sare , token. Înlocuiți valoarea cu un titular de loc la ieșire. Refuzați scrierea în întregime pe drum în

Ştergerea este un singur rând, prin cheia principală

Niciodata o stergere in vrac, niciodata un sters prin filtru. O eliminare in vrac este modul în care moare o baza de date. Dacă cineva are cu adevărat nevoie de unul, ei pot face acest lucru în platforma.

Citirile sunt captate pe rând

Clamp parametrul limită cu un plafon greu. O interogare fugar nu trebuie să fie în măsură să arunce baza de date printr-un mesaj de chat.

Eşec închis până când cheia este setată

Un pod neconfigurat răspunde 403 la tot. Un pod care este util înainte de a fi configurat este un pod care a fost util unui străin.

Comparație cheie constantă, cheie într-un antet

Hash_equals, never ==. Cheia merge în X-Opsiq-Bridge-Key, nu șirul de interogare, așa că rămâne din jurnalele de acces, busteni proxy și antete Referer.

Doar GET

O metodă, o formă, nimic de contrabandă într-un corp. Tot ceea ce face podul este expresibil ca un GET cu parametrii validați, și OpsIQ este singurul apelant.

Citire universală, scrie-listă de permis

Aceasta este regula care se argumentează cu, deci aici este raţionamentul în întregime. Asistentul ar trebui să fie capabil de a vedea întreaga platformă: asta este ceea ce face util, şi o citire nu poate distruge nimic. Scrie sunt diferite. Acest fişier stă într-o broasca publică în spatele ONE shared cheie. Dacă această cheie scurgeri, o suprafaţă scrie fără restricţii face scurgerea echivalentă cu controlul complet baza de date

⚠️
Cardul de omologare OpsIQ poarta AI, nu cheia. Acţiunea admin Permite pe o acţiune distructivă este un control asupra asistentului. Nu este un controlul asupra celui care deţine cheia podului. Acestea sunt două ameninţări diferite, iar lista permisivă este răspunsul la a doua.
Butonul cu care se confruntă operatorul, de pe podul Botble
/* ── WRITE ALLOW-LIST — which tables the assistant may CHANGE here.
 *
 * READS are unrestricted: the assistant can see every table in the platform.
 * WRITES are limited to this list, because this file sits in a PUBLIC webroot
 * behind ONE shared key — an allow-list means that even a leaked key cannot
 * reach a table you never enabled (no new admin users, no emptied bookings).
 *
 * Comma-separated table names. Add tables as you need them — e.g. append
 * ',pages,posts' to let the assistant edit site content. Set it to '*' to
 * allow every table, deliberately. Empty falls back to the hotel defaults. ── */
const OPSIQ_WRITE_TABLES = 'ht_bookings,ht_booking_rooms,ht_booking_addresses,ht_rooms,ht_room_types,ht_customers,customers';

Două detalii din cecul de mai jos sunt ușor de greșit. Numele mesei ajunge deja RESOLVED, care transportă prefixul mesei instalației, în timp ce un operator scrie lista permis neprefixat pentru că este ceea ce ar fi natural de tip. Comparați ambele moduri sau o instalare prestabilită nu permite nimic și fiecare pauze scris. Și refuzul trebuie să se explice, deoarece persoana care citește este un admin într-o fereastră de chat, nu un dezvoltator cu o urmă stiva.

Verificarea listei permise, verbatim de la market_connectionors/botble/bridge/opsiq-Broble-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);
};

Poarta, în întregime

Patru verificări, în această ordine, înainte ca ceva să atingă datele. Copiaţi ordinul şi cecurile.

Cele patru controale ale porţii, în ordine.
<?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. */

Validarea identificatorilor împotriva_schemei de informații

Aceasta este piesa care transformă "asistentul poate ajunge la orice masă" din nesăbuită în seif. Rezolvați numele de masă al apelantului împotriva schemei reale, tolera un prefix lipsă sau suplimentar de masă, și reveniți nul pentru orice altceva. Totul în aval apoi funcționează cu un nume care există probabil.

Validarea şi redactarea identificatorului, verbatim de pe podul Botble
/** Real tables in THIS database — the allow-list, straight from the DB. */
$allTables = static function () use ($pdo, $db): array {
    static $cache = null;
    if ($cache !== null) return $cache;
    $st = $pdo->prepare('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ? ORDER BY TABLE_NAME');
    $st->execute([$db]);
    return $cache = array_map('strval', $st->fetchAll(PDO::FETCH_COLUMN));
};

/** Resolve a caller-supplied table name to a REAL one, or null. */
$resolveTable = static function (string $name) use ($allTables, $prefix): ?string {
    $name = trim($name);
    if ($name === '' || !preg_match('/^[A-Za-z0-9_]+$/', $name)) return null;
    $tables = $allTables();
    foreach ($tables as $t) if (strcasecmp($t, $name) === 0) return $t;
    /* Tolerate a missing or extra table prefix. */
    foreach ($tables as $t) {
        if (strcasecmp($t, $prefix . $name) === 0) return $t;
        if ($prefix !== '' && strcasecmp($prefix . $t, $name) === 0) return $t;
    }
    return null;
};

/** Column introspection: table => [column => true]. Cached per request. */
function opsiq_bridge_columns(PDO $pdo, string $db, string $table): array
{
    static $cache = [];
    if (isset($cache[$table])) return $cache[$table];
    $stmt = $pdo->prepare('SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?');
    $stmt->execute([$db, $table]);
    $cols = [];
    foreach ($stmt->fetchAll(PDO::FETCH_COLUMN) as $c) $cols[strtolower((string)$c)] = true;
    return $cache[$table] = $cols;
}

/** Columns whose VALUES must never leave the platform. */
$secretCol = static function (string $c): bool {
    return (bool)preg_match('/(^|_)(password|remember_token|secret|api_key|private_key|salt|token)($|_)/i', $c);
};
/** Columns a write may never touch — auth material. */
$writeBanned = static function (string $c): bool {
    return (bool)preg_match('/(^|_)(password|remember_token)($|_)/i', $c);
};
/** Strip secret values from a row before it leaves the server. */
$redact = static function (array $row) use ($secretCol): array {
    foreach ($row as $k => $v) if ($secretCol((string)$k)) $row[$k] = '[redacted]';
    return $row;
};

O operaţiune de citire şi o operaţiuni de scris, complete

Se verifică coloana filtrantă în funcție de lista reală a coloanei și apoi se interpolează ca identificator; valoarea sa este legată. Limita este fixată. Rândurile sunt redactate pe cale de ieșire. Actualizarea refuză cheia primară și orice coloană aut, iar timbrele actualizate_at atunci când tabelul are una.

Citește orice tabel
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,
    ]]);
}
Scrie un rând
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)),
    ]]);
}

Diferenţe de schemă în supravieţuire

Versiuni Platforma diferă. Columnele se mișcă, se redenumit, sau sunt absente. Un pod care presupune o schema funcționează pe o singură instalare. Introspect și să se adapteze în schimb: selectați doar coloanele care există aici, tolera prefixul de masă, și încercați ortografie plauzibile ale unei referințe.

Toleranta schema, de la podul 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));
💡
Da podului un op=diag care raportează numai

Erori uniforme și capcana de enumerare

O formă pentru orice

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.

Negăsit și fără meci trebuie să fie identice

Pe o suprafata de cautare, o referinta care nu exista si o referintă a cărei dovadă nu se potrivesc trebuie să producă răspunsul SAME. Răspunsurile diferite transforma podul într-un oracol care confirmă ce referinte sunt reale, care este un export gratuit lista clientilor pentru oricine pacient.

Nu dezvălui niciodată motivul unui vizitator.

Podul poate fi precis cuOpsIQCeea ce ajunge la un vizitator este decis deOpsIQ, într-un singur refuz fix.

Fișierul copiabil din panoul conectorului

Operatorul nu deschide depozitul.OpsIQCopia aia vine din setări.json, și trebuie să fie același program ca pod /*.php.

Setări.jsonIntrarea panoului pentru un conector de pod
{
  "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.

Legături de fragment supravieţuiesc regenerării

Declara fiecare misiune secretă generată explicit. Instrumentul de sincronizare reconstruiește copia panoului de pe pod expediate și apoi restaurează OPSIQ_BRIDGE_KEY = {{setting:api_key}} fără aceasta, un upgrade poate copia cu fidelitate fișierul pachet fără cheie și elimina în tăcere detailabilul operatorului locator. Connector Builder emite această legătură automat pentru pachetele de pod generate.

Alți deținători de locaţii sunt substituiţi pe servere

Independent de asta,{webhook_url}, {webhook_path}, {webhook_secret}, {site_key}, {base_url}şi{slug}sunt completate înainte ca panoul să vadă fragmentul.

webhook_help poate fi un obiect sau o listă

O listă vă oferă mai multe fragmente într-un singur panou, de exemplu un fișier pod și un cârlig separat releu.

🚫
Nu menţineţi fragmentul manual. Fişierul pod şi copia panoului sunt două copii ale unui program, şi ei vor drifting . Un pod a fost actualizat şi copia sa panou nu a fost, astfel încât oricine care reinstalat şi copiate din panoul instalat podul vechi şi pierdut în tăcere fiecare capacitate nouă. Nimic detectat: conformare trecut, semnături trecute, teste trecute.
Păstrați cele două copii identice
# 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 ar trebui să expună podul?

Operaţiuni conturate şi o suprafaţă universală de date, împreună. Cele modelate se întorc cu răspunsuri ordonate, construite în scop la întrebările pe care oamenii le pun; cele universale acoperă orice altceva astfel încât asistentul să nu fie blocat niciodată.

Citiri conturate

statistici, lista de obiecte principale cu filtre, un obiect cu rândurile sale aferente, catalogul a ceea ce este vândut, căutarea clienților cu istorie. Acestea dau AI un răspuns bun într-un apel în loc de cinci.

Shaped scrie

Cele două sau trei modificări de stat care contează

Comerțul cu tipuri de vehicule

Pentru o platformă de vânzare expune catalogul, cotație, checkout/order și operațiuni de plată-dovezi, apoi harta le în commerce_roles.json cu transport: bridge. Nu cartografiați niciodată un rol de comerț scrie la record universal. creează/actualizează suprafața.

Descoperire universală

tabele (cu număr de rând) și descrie (coloane, tipuri, cheie primară, plus steaguri lizibile și scriebile pe coloană). Acesta este modul în care asistentul învață o platformă nu a anticipat.

Citire și scriere universală

interogare, înregistrare. get, record. create, înregistrare update, înregistrare, ștergere. Fiecare dintre ele validate așa cum se arată mai sus.

Identitatea, înainte de poarta cheii

Sondele de identitate sunt numite de către ADMIN'S BROWSER, aceeași origine, astfel încât acestea nu pot trimite un antet personalizat. Autentificarea lor este sesiunea platformei în sine. Pune-le înaintea porții cheie, țineți-le departe de toate datele înregistrate, și niciodată să nu le întoarcă un secret. Vezi pagina de identitate conector.

Diagnostice

op=diag, structure only, masked.

Harta de rol a comerţului cu poduri
{
  "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"
    }
  }
}
💡
Secvenţa şi autoritatea de control a rolului canonic; operaţiunea pod păstrează sarcina utilă proprie a platformei. Un hotel poate necesita sosirea, plecarea şi oaspeţii, WHMCS pot solicita un client existent sau o înscriere deţinută de conectori, iar platforma SaaS poate necesita un ciclu de facturare. Core nu codifică niciodată aceste câmpuri. Podul trebuie să invoce serviciile de afaceri ale platformei astfel încât acţiunile, taxele, facturile, corespondenţele de confirmare şi cârligele să fie toate funcţionate.
⚠️
record_payment nu este o scurtătură cu plată. Acceptați doar dovada furnizorului verificat de server: comanda exactă, comerciant, suma, moneda ISO, referință furnizor, timbrul temporizat nou și cheia idepotență verificate. Persistă prin plata / factura platformei API, apoi returnează un ordin autorizat sau read-back pe factură. Un rezultat necunoscut trebuie să ruleze recuperarea înainte de orice retriere.
💡
Dacă platforma ta răspunde la întrebări, trimite un pod fără operaţiuni de scriere şi întreaga clasă de risc de a scrie dispare. Adaugă scrie când cineva cere pentru ele.

Lista de verificare înainte de a trimite un pod

Podul refuză totul fără chei.

Testați-l. Redenumiți constanta pentru a goli și confirma fiecare op răspunsuri 403.

O cheie greşită este refuzată în timp constant

Hash_equals, și cheia citită doar de antet.

Un nume de masă inventat este refuzat

Şi un nume de masă real cu prefix greşit încă se rezolvă.

O coloană de parole nu apare niciodată într-o citire

Şi o scrisoare care spune că unul este refuzat cu o explicaţie.

Se refuză o scrisoare către o masă din afara listei de permise

Cu mesajul care spune operatorului cum să-l lărgească.

Fragmentul de panou se potriveşte cu fişierul podului

php tools/sync_connectionor_bridge_snippets. php raportează acest lucru în etape.

Reînnoirea conectorului nu este suficientă

Dacă pachetul dumneavoastră transportă un fișier de punte, un operator care modernizează conectorul trebuie să redetașeze, de asemenea, fișierul în broasca web. Spuneți așa în corpul panoului și în HADELOG-ul dvs., fiecare versiune.

Conectori

Stimularea cadrului propriu al platformei de pe un pod

Un pod care citeste numai poate vorbi SQL. Un pod ce creeaza lucruri pe platforma (o comanda, o rezervare, o factura platita) trebuie sa treaca prin stratul de aplicare al platformei, si bootingul ca strat fara cap este locul unde traieste fiecare esec subtil in acest model. Totul a fost invatat calea grea pe o integrare live, fiecare regula impotriva unui defect real care nu a produs nici o eroare oriunde.

Un rând în baza de date nu este un ordin

INSERTS brute creează un record umbră

Rândul apare, admin-l listează, și încă nu este o înregistrare platforma crede că a creat: nici un număr de referință nativ, nici cârlige model, nici evenimente, nici factura, nici e-mail client, nici o legătură cu clientul de lucru. Clientul citează o referință platforma niciodată emis la personalul care nu se poate găsi. Creați prin intermediul serviciului propriu al platformei; dacă expune doar un serviciu post-plată, crea graficul pe care îl așteaptă și predați la cusătură aceasta definește.

Niciodată nu reimplica numerotarea platformei

Două probe dintr-un format de referință fac să pară ușor de reprodus, și reproducerea este aceeași umbră-scrie un nivel în jos: ziua platforma schimbă schema sa, fiecare dintre înregistrările dumneavoastră este greșit și nimic nu vă avertizează. Apelați generatorul său (reflecția ajunge la unul non-static), și citiți valoarea stocată înapoi mai degrabă decât încredere ceea ce ați trimis.

Coloanele platformei păstrează semnificațiile platformei

Înainte de a stoca ceva de-al tău într-o coloană platformă, găsi fiecare cititor. O coloană numită ca un slot liber poate fi portantă: pe integrarea de referință, transaction_id S-a dovedit a fi semnul pe care clientul l-a trimis prin e-mailul "vizualizaţi rezervarea" se rezolvă prin: o potenţială digerare stocată acolo în linişte a spart fiecare legătură de oaspeţi. Păstraţi evidenţa într-o masă de bridge: UNIQUE (operare, idempotency_key) este garda de reluare, constrângere refuză geamăn concomitent, iar căutarea de recuperare citește același tabel crea scris. Creați că tabelul ÎNAINTE de a începeTransaction: MySQL DDL comite implicit o tranzacție deschisă.

Evenimente, ascultători și capcana de dublu-email

Citiți sursa serviciului înainte de expedierea evenimentelor sale

Dacă serviciul de platformă pe care îl sunați deja expediază evenimentul, expedierea-l chiar dvs. trimite clientului două e-mailuri de confirmare și generează două facturi. Dacă nimic nu este ascultat, trimiterea nu trimite nici unul. Nici eșecul nu ridică o eroare. Reflectați metoda, feliați liniile sursă, și citiți ce face de fapt: un nume-based ghicire și chiar un regex peste organism atât a primit acest greșit înainte ca sursa să-l stabilit.

Obține ascultătorii () ascunde adevărul; obține RawAscultatori() spune-l

Laravel Înfășoară ascultătorii clasei în închideri, deci getListeners () raportează [email protected] getRawListeners() numește clasele reale. Nu trimiteți niciodată un eveniment ale cărui ascultători nu le puteți numi.

Dacă Quee nu înseamnă "fugi mai târziu"

Cu coada=sinc (implicit pe o mulțime de instalaţii de producţie) un ascultător coadă ruleaza INLINE în cererea dvs. punte. Contextul boot-ului ESTE contextul redă: fiecare înregistrare sau URL defect în terenurile dumneavoastră de boot în inbox clientului. Verificați config('queue.default') înainte de raționamentul cu privire la cazul în care se execută ceva, și căutați în locuri de muncă /failed_jobs înainte de a presupune că un lucrător a fost implicat.

Garda se retrage cu statul propriu al platformei

Un serviciu care expediază necondiționat trebuie să fie numit exact o dată. Markerul care nu poate pluti este statul de înregistrare al platformei (doar apelul în timp ce înregistrarea este încă în curs), nu un "trimis" paralel steag al dumneavoastră, care poate fi de acord cu ea.

Bocancul fără cap nu este boot-ul web

Înregistrează ce registre de boot web

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.

PIN FIECAREURLrădăcină, nu doar router-ul

Punctele de cerere capturate la script-ul dvs. pod, astfel încât ruta(), url() și active() generează site.com/publică/opsiq-bridge.php/checkout/TOKEN: link client prin intermediul unui JSON Obiectivul final. forceRootUrl(config('app.url') repară generatorul; discul de stocare are propria rădăcină, astfel încât logo-ul e-mailat rămâne rupt până la sisteme de fișiere.discuri.public.url este setat prea (se rezolvă leneș, astfel încât setarea la lucrările de boot, și numai atunci când gol sau script-relativ: un operator CDN URL nu este a ta pentru a suprascrie).

Comite înainte de a preda

Serviciile platformei citite prin propria conexiune și nu pot vedea tranzacția deschisă. Apelat înainte de comitere, un serviciu post-plată găsește nici o plată finalizată, lasă în liniște recordul neplătit, și încă trage evenimentele sale, astfel încât clientul este trimis prin e-mail despre o înregistrare platforma crede că este neplătit. Comite graficul, apoi apel.

Regulile de onestitate

Fără umbră de rezervă

Dacă calea nativă este inaccesibilă, refuzați cu o eroare retriabilă ÎNAINTE de orice mișcarea banilor. Nu inventați niciodată o referință, nu updatați niciodată un statut pentru a face o jumătate integrată înregistrare uite terminat. O plată verificată a cărei procesare nativă nu a reușit să se reconcilieze ca needs_attention: banii este real, statul este sincer "plătit, încă neprocesat."

Raportaţi faptele, nu declaraţia dvs.

"Serviciul a fugit" și "clientul a fost spus" sunt fapte diferite: integrarea de referință a trimis un e-mail complet cu fiecare domeniu gol în timp ce run-flag-ul a declarat adevărat. Returnați-le separat (prelucrare finalizată, notificare încercată), păstrați un apel pe platform_notified care forţează OpsIQ confirmarea de rezervă ori de câte ori platforma nu a procesat, și niciodată să pretindă livrarea: o inbox nu este observabilă de la un server.

Măsoară, apoi scrie.

Nava o sondă de capabilități numai pentru citire în pod: existența clasei, semnăturile metodei, felii sursă ale metodelor pe care intenționează să le sun, ascultătorii brute, șoferul cozii și (când se poate răspunde la o întrebare prin apelarea unei funcții inofensive) apelul live însuși. Cinci teorii despre un e-mail gol au murit împotriva măsurătorilor înainte ca sursa să o stabilească. O rundă de sonde costă o copie a fișierului; o scriere greșită pe o platformă live costă un client.

Conectori

Podul în alte limbi și alte baze de date

Modelul podului nu este un model PHP.OpsIQapeluri este un obiectiv HTTP, astfel încât fișierul poate fi Node, Python, Go, Ruby, .NET sau Java, și magazinul din spatele acestuia poate fi oriceSQLmotorul sauMongoDB. Ceea ce este în formă de PHP este conducta de ambalare, și că constrângere decide cum podul ajunge la operator. Citiți prima secțiune de livrare: este partea care surprinde oamenii.

Ceea ce conectorul necesită de fapt

Acesta este întregul contract.

Transporturi

O cerere pentru fiecare apel, niciun cadavru sau altă metodă.

Autentificare

Un secret comun în X-Opsiq-Bridge-Key cerere antet, comparativ în timp constant. Nu un parametru de interogare, nu un cookie, nu Auth Basic.

Parametrii

Sfoara de interogare. op denumirea suprafeței; do Spune-mi cum se numeşte operaţiunea, restul sunt argumentele acelei operaţiuni.

Răspuns

JSON. {"success":true,"data":{...}} sau {"success":false,"error":"snake_case_reason"}. Aplicație tip conținut/json, și fără cache.

Coduri de stare

200cu succes.403cheie neconfigurată sau greșită;404nu a fost găsită,405metoda greșită;400argument negativ;501nesusţinută de această schemă.

Asta e tot.

Nu există cadru, nu runtime, nu OpsIQ biblioteca de pe partea ta. Dacă poate servi asta, acesta poate fi un pod.

Livrare: ce poate trăi în pod/, și ceea ce nu trebuie

Pachetul semnat acoperă o listă fixă de extensii de fișiere, și un fișier în afara acestei liste este lăsat afară din ZIP. Un pod într-o limbă lista nu se referă prin urmare, nu poate nava în interiorul pachetului26August2026un fișier în bridge/ că pachebotul va cădea este o eroare de conformitate, astfel încât pachetul refuză să treacă mai degrabă decât instalarea cu nici un pod în ea.

Cum este tratat un pod/ dosar la timpul de construire
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 și JavaScript

Navele de fișiere în ZIP semnat, și verificatorul fragment deține dvs. de panou copie octet-identic la ea, oricare dintre cele două este. Verificarea drifturi citește fiecare fișier în pod /, nu doar PHP cele, astfel încât un pod modernizat cu o copie a panoului vechi nu se construiește în orice limbă.

Orice altceva

Fragmentul panoul este text simplu, fără nici o idee ce limbă deține, astfel încât funcționează pentru orice stiva. Pune întregul program în webhook_help. snippet_template, nume fișierul în fragment_filename, și nu lăsați o copie în pod / bază de conformitate va refuza pachetul mai degrabă decât să-l expedieze gol. Spune clar în webhook_helpe. body că operatorul copia acest fișier, mai degrabă, decât obținerea din pachet.

Dacă aveţi nevoie de o altă limbă în pachet

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.

💡
Nume fișier în webhook_help.snippet_filename ori de câte ori pachetul dumneavoastră va avea mai mult de un pod. Acesta este modul în care verificatorul știe care pod o copie a panoului aparține; fără ea, o pereche ambiguă este raportată ca un avertisment de conformitate și că fragmentul este lăsat neverificat.
⚠️
Punctul de verificare derivă este că un fișier pod și copia acestuia panou sunt două copii ale unui program și va diferenția. Regenerează mai degrabă decât mână-edit: php tools/sync_connector_bridge_snippets.php --apply, apoi re-semna pachetul.

Poarta, în şase limbi.

Aceleaşi patru verificări în aceeaşi ordine peste tot: eşuaţi închise fără cheie, o metodă, comparaţie constantă-timp cheie de antet, apoi conectaţi. Singura capcană reală este compararea, şi este o capcană diferită în fiecare limbă.

⚠️
Compară SHA-256digeră cele două chei mai degrabă decât tastele ei înşişi. Este corect în fiecare limbă, şi se detaşează faptul că mai multe comparatori constant-timp fie arunca sau scurgeri pe o lungime necorelat calendarul NodeSafeEqual ridică un RangeError atunci când tamponurile diferă în lungime, care transformă o cheie greşită într-o500în loc de403.
Node. js
// 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
# 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)
Du-te, Ruby, . NET și Java
// 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)));
}

Validarea elementelor de identificare ale fiecărui motor din baza de date

Proprietatea de siguranţă nu se schimbă: un nume de tabel sau coloană pe care apelantul furnizat trebuie verificat în funcţie de schema reală înainte de a fi interpolată, şi fiecare valoare trebuie să fie un parametru legat. Doar interogarea introspecţiei, caracterul citator şi clauza paging diferă.

MySQLşiMariaDB

Tabele: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?. Columne: același împotriva information_schema.COLUMNS cu AND TABLE_NAME = ?Citează cu spatele, dublează orice backtick interior. LIMIT n OFFSET m.

PostgreSQL

Aceleaşi informaţii_schema vizualizări, nume de caz inferior, WHERE table_schema = $1 (de obicei publicCitează cu citate duble, dublând orice dublu citat din interior. LIMIT n OFFSET m. Urmăriți regula pliere: un identificator necotat este pliat pentru a reduce cazul, astfel încât să comparați caz-insensibil atunci când rezolvați un nume.

SQLServer

Aceeași imagine a informațiilor_SCHEMA. Citează cu paranteze pătrate, dublează orice suport de închidere din interior. Paginare are nevoie de un ordin BY: ORDER BY [id] DESC OFFSET @o ROWS FETCH NEXT @n ROWS ONLY.

SQLite

Tabele: SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'Coloană: SELECT name FROM pragma_table_info(?) Folosiţi această formă de masă, pentru că este goală PRAGMA table_info(x) declarația nu poate lua un parametru legat și invitarea interpolarea stringului există exact gaura pe care încercați să o închideți. Citați cu citate duble. Pagina cu LIMIT n OFFSET m.

OracleCity in New York USA

Tabele: SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = :owner; coloane din ALL_TAB_COLUMNS. Citează cu citate duble, și amintiți-vă un identificator necitat pliază la cazul UPER, opusul PostgreSQL. Pagina cu OFFSET :o ROWS FETCH NEXT :n ROWS ONLY la 12c şi mai târziu.

MongoDB

Nu SQL, deci nu există identificatori de reclasificare și parametri

Interogarea introspecţiei per motor
-- 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;
💡
Rezolvați, apoi utilizați numele RESOLVED. Nu trece ortografie apelantului prin interogare chiar și după verificarea ei

MongoDB: aceleași reguli, fărăSQL

Nu există nici o linie de interogare pentru injectarea în, astfel încât oamenii presupun că nu este nimic de păzit. Există: documentul filtru. Passing apelant-supplied JSON direct în find() permite unui apelant să trimită {"$ne": null} sau {"$gt": ""} unde te aşteptai la o valoare şi să alegi în linişte fiecare document.

MongoDBDe colectare-listă de permis, scalar-forțat filtru, proiecție ca reacție
// 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();
Numele de colectare provin din ListColections

Aceasta este informaţia_schema. Rezolva ortografia apelantului împotriva ei şi de a folosi numele rezolvat.

Forţează fiecare valoare de filtrare la o scalară

Un String () sau un număr (în jurul acestuia) este întreaga apărare împotriva injecției operatorului. Un document în care vă așteptați ca o valoare să fie echivalentul NoSQL al unui citat rătăcit.

Proiecţia este regula de redactare.

Excludeţi câmpurile în formă de secretă din proiecţie, astfel încât acestea să nu părăsească serverul, mai degrabă decât le şterge de la rezultat după aceea.

Șterge șederea unui singur document de _id

Ștergeți unul cu un _id rezolvat. Nu ștergețiMuly, și niciodată un filtru apelantului influențat.

Scrie șederea pe lista de permise

Același raționament ca și SQL: numele colecțiilor pe care le poate atinge un scris, și refuza restul cu o explicație.

Obiectivul de identificare în alte limbi

Sonda de identitate este cealaltă jumătate a podului, și este HTTP prea. Blocul de semnare este identic în fiecare limbă: baza64url sarcina utilă,HMAC- SHA256 că șir de caractere, se alăture cu un punct.

Nu scrieți manual acest lucru de la zero. Setări, Suport Portal poartă o rută gata pentru fiecare limbă pentru portal (o singură dată, două minute jetoane). Site-uri distanță, site-ul dvs., Coduri, C. Recunoașteți logat-in clienții poartă automat versiunea chat pe limba (un token oră plus mâner reîmprospătare). Ia indicatorul din aroma care se potrivește stivă dumneavoastră.
Ce să schimbi când îl reutilizezi?

Aceste fragmente ment un jeton PORTAL, care este în mod deliberat mai strict: poartă jti și single_use:adevărat și trăiește despre120secunde pentru că se deplasează într-oURLUn jeton de identitate pod sau widget nu poartă nici una dintre acestea și utilizează un exp mai lung, minute la ore.

Ce rămâne la fel

site_key, iat, exp și un top-level autentificat:true, plus un admin sau subiect client cu un ID și un nume de utilizator sau e-mail. Aceleași afirmații, aceeași semnătură, același secret.

Ambele forme de jetoane verifica

Un JWT din trei părţi a semnat HS256 lucrări, la fel şi sarcina utilă cu două părţi 64url plus hex HMAC că PHP de referință emite. Utilizați oricare dintre bibliotecile lingvistice face natural ? o bibliotecă JWT este, de obicei calea mai scurtă în afara PHP.

Niciodată nu menţiona în browser

Adevărat în fiecare limbă. Semnarea client-side înseamnă trimiterea site-ul secret pentru fiecare vizitator.

Alegerea, sincer

Platforma este PHP

Scrie podul în PHP. Acesta se află în pachet, este verificat în derivă, și poate porni propriul cadru al platformei pentru a citi o sesiune live pentru sonda de identitate. Nimic altceva nu vă oferă toate trei.

Platforma este Node

Un . Js punte nave, semne și este drifturi verificate exact ca unul PHP. Nimic nu se renunță.

Platforma este Python, Ruby, Go, . NET sau Java

Livrează prin fragmentul panoului și spune așa în corpul panou; nu lăsați fișierul în pod/, unde conformarea va refuza pachetul. Conectorul este altfel complet normal: acțiuni, furnizori de context, identitatea și căutarea clienților toate funcționează la fel, pentru că nici unul dintre ei nu le pasă ce răspunde apelului HTTP.

Nu poţi executa un proces pe platforma gazdă

Apoi modelul podului nu este instrumentul potrivit. Există un pod pentru a ajunge la o platformă din interiorul propriei gazde. Dacă îl puteți atinge doar de afară, scrieți un conector obișnuit API împotriva oricărei suprafețe pe care o expune.

⚠️
Încă o constrângere care merită să fie planificată: o sondă de identitate trebuie să citească sesiunea de autentificare a platformei, ceea ce înseamnă că de obicei rulează în cadrul procesului propriu al platformei sau cel puțin pe gazda sa cu acces la magazinul său de sesiuni. Un pod scris într-o limbă diferită de platforma poate servi datele confortabil și se poate lupta încă pentru a răspunde op=admin_identity. Dacă este cazul dumneavoastră, trimiteți puntea de date în limba dvs. și sonda de identitate în platforma lui.
Conectori

Oferă asistentului ambele jumătăți: acțiuni și context

Acesta este singurul lucru cel mai frecvent care lipsește de la un conector care "lucrează dar este inutil." Acţiuni lasa lucrurile AI DO. Secţiunile contextului lasă să știe lucruri. Un conector are nevoie atât, și cele mai multe întrebări pe care le cere un admin sunt răspunse prin context, niciodată printr-o acţiune. Un Conector cu acţiuni perfecte şi nici un furnizor de context nu va raporta sincer că nu poate vedea nimic.

Cele două jumătăţi

Acţiuni

Declarat în acţiuni.jsonsau returnat prin înregistrareAcțiuni(). Modelul alege unul, completează parametrii săi șiOpsIQacțiunile sunt pentru verbe: anula această rezervare, deschide acel bilet, schimba acest statut.

Secţiuni de fundal

Adunat de un ContextProvider înainte de a rula modelul. "Câte comenzi în această lună," "care sunt cei mai noi clienți" ," ce vindem" toate rezolva printr-un aspect contextual, și nu atingeți o acțiune la toate.

⚠️
Simptomul unui furnizor lipsă: asistentul răspunde "Nu a activat conectorul furnizat această secțiune context" în timp ce conector este instalat, activat și trece testul de conectare. Nimic nu este logat, nimic erori. Acest mesaj înseamnă că nici un furnizor nu a susținut secțiunea.

Vocabularul universal al secţiunii

OpsIQ solicită secţiuni cu nume generic. Treaba ta este să decizi ce înseamnă fiecare pe platforma ta şi să răspunzi la ea. O rezervare de hotel ESTE comanda hotelului; o cameră ESTE ceea ce vinde hotelul. Harta, nu inventaţi.

comenzi / ordine_în curs

Indiferent de o tranzacție este pe platforma ta: comenzi, rezervări, rezervările, locurile de muncă, transporturile. în așteptare_comenzi este aceeași listă filtrată la cele neterminate.

clienti

Lista clienţilor.

products

Ce vinde platforma: produse, camere, planuri, servicii.

facturare

Venituri şi sume în formă de bani, plus conturi de stat.

bilete, servicii, domenii, servere, activitate

Utilizaţi aceste atunci când platforma dumneavoastră le are cu adevărat. Nu forţa o cartografiere

Orice altceva platforma ta are

Un furnizor care declară secțiuni (): ["licențe,""nave") le-a fuzionat pe cele din lista de permise a căutării universale, astfel încât căutarea specifică platformei să devină disponibilă fără modificări de bază.

Greșeala care costă o zi

Un furnizor de context TREBUIE să implementeze interfața. Registrul-tip verifică, astfel încât o clasă care doar LookS dreapta este omis

ContextProvider. php — contractul, din pachetul de referință Botble
use OpsIQ\Platform\ContextProviderInterface;

/* MUST implement ContextProviderInterface: ContextRegistry::collectAll()
 * type-checks it, so a provider that merely LOOKS right is skipped and every
 * section answers "No enabled connector supplied this context section" — the
 * exact symptom, with no error anywhere. */
final class ContextProvider implements ContextProviderInterface
{
    public function slug(): string  { return 'yourplatform_context'; }
    public function label(): string { return 'Your Platform (orders, customers, products)'; }
    public function priority(): int { return 30; }   // lower renders earlier

    /** ADMIN only. The guest surface has its own provider and its own rules. */
    public function surfaces(): array { return ['admin']; }

    /** The universal section names this connector can answer. */
    public function sections(): array
    {
        return ['orders', 'pending_orders', 'clients', 'products', 'billing'];
    }

    public function isAvailable(): bool
    {
        try {
            $s = \OpsIQ\Connectors\ConnectorRegistry::getSettings('yourplatform') ?: [];
            return trim((string)($s['base_url'] ?? '')) !== '' && trim((string)($s['api_key'] ?? '')) !== '';
        } catch (\Throwable $e) {
            return false;
        }
    }

    public function build(array $ctx): string
    {
        $section = strtolower(trim((string)($ctx['section'] ?? '')));
        $limit   = max(3, min(50, (int)($ctx['limit'] ?? 20)));
        $query   = trim((string)($ctx['query'] ?? ''));
        try {
            switch ($section) {
                case 'orders':
                case 'pending_orders': return $this->orders($limit, $query, $section === 'pending_orders');
                case 'clients':        return $this->customers($limit, $query);
                case 'products':       return $this->products($limit);
                case 'billing':        return $this->billing();
            }
        } catch (\Throwable $e) {
            return '';   // a provider must NEVER break prompt assembly
        }
        return '';
    }
}
Înregistrează-l de pe conector

Implement ContextConnectorInterface și returnați furnizorii din contextProviders(). Clasa conectorului poate implementa, de asemenea, ContextProvinderInterface direct și poate fi înregistrată ca ea însăși.

Returnează textul simplu, nuJSON

clad() întoarce un bloc de text care este concatenat în prompt. Scrieți-l pentru un cititor: o direcție, apoi o linie pe rând.

Întoarce-te, nu arunca.

Prinde propriile excepții. Un furnizor care aruncă este autentificat și sărit, dar returnarea "" este contractul.

Constructorul nu poate scrie secţiuni () pentru dumneavoastră

ContextProvider. php secțiuni de nave [): array {întoarce []; } și vrăjitorul nu are nici un câmp pentru ea. Completați-l cu mâna

⚠️
Spune adevaratul TOTAL, nu numarul de randuri pe care le-ai trimis. O pagina nu este un total. Un furnizor care listeaza douazeci de rinduri fara sa spuna acest lucru devine asistentul cu incredere raspunde "Aveti20rezervări" atunci când platforma deține669Un cont ieftin şi o linie explicită "TOTAL la dosar:669(această listă arată cel mai nou20doar)"
Un bloc de secţiuni care nu poate fi numărat greşit
$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);

Nume acțiunile tale astfel OpsIQ pot spune citiri din scrieri

OpsIQ Clasifică o acţiune prin cuvintele menţionate în acţiunea sa_id şi este conservatoare intenţionat: orice nu poate recunoaşte este tratat ca un scris şi cere un card de aprobare. Obţine verbul corect şi o citire doar rulează.

1
este_distructiv sau necesită_confirmare câștigă

Dacă oricare dintre acestea este setat, acțiunea are întotdeauna nevoie de aprobare. Declară-le sincer

2
Un cuvânt scris oriunde în ID-ul face un scrie

adăugați, creați, deschideți, actualizați, editați, modificați, modifica, ștergeți, eliminați, distrugeți, anulați, restituiți, suspendați, terminați, activați, aprobați, respingeți, trimiteți, marcați, resetați, capturați, nudați, închideți, atribuiți, revocați, acordați, setați, setaţi, comutați, permiteți, dezactivați, emiteți, generați, aplicați, taxați, plătiți, furnizați, reînnoiți, modernizați, fuzionați, mutați, transferați, escalade, pavilion, înregistrați, sincronizați, împingeți, importați, executați, declanșați, porniți, opriți, reporniți și încă câteva.

3
Apoi un cuvânt citit îl face să fie citit

a lua, lista, căutare, găsi, vizualizare, spectacol, aduce, număra, cauta, descrie, citi, export, previzualizare, test, ping, starea, rezumat, detalii, recent, istorie, verifica, jurnal, statistici, indicatori, imagine de ansamblu, venituri, defalcare, raport, analiză, echilibru, utilizare, cota, instantaneu, perspective, furaje, proiect, triaj, clasificare, sugerează.

4
Apoi, metoda HTTP decide

GET, cap și opțiuni sunt citite.

5
Altfel e o scrisoare.

Nerecunoscut înseamnă aprobarea necesară.

⚠️
Scrie cuvintele sunt verificate ÎNAINTE de a citi cuvinte, astfel încât un nume mixt cum ar fi get_and_sync_orders este clasificat ca un scris. Alege un verb, pune-l pe primul loc, și păstrați-l curat: lista_ordine, get _client, căutare_rezervari, anulare_booking, set_ordere_status.

Declară nativ_api doar dacă platforma are cu adevărat una

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.

Constructorul decide asta din răspunsul tău la date.

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.

Pachetele manuale trebuie să-l facă bine.

Dacă vă scrie manifestul, declaraţi exact unul dintre nativ_api sau platforma_bridge. Conformance tratează platforma_punte ca trapă de evacuare un conector pod este de aşteptat să aibă, şi Constructorul refuză o spec care pretinde platforma_pod pe un conec API _.

Păstrați Ai_api_reference. md sincer, fie un fel

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.

Învaţă-l pe admin creier despre platforma ta.

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 este această platformă, cum sunt modelate datele sale, ce obiecte se numesc şi ce ciudatenii ar face altfel asistentul să ghicească. Scrie-o pentru un coleg competent care nu a văzut niciodată platforma.

ai_api_reference.md

Suprafaţa canibilă. Pentru un conector de pod, aceasta este operaţiunea ta şi vocabularul cu parametrii lor, nu o masă a obiectivului REST.

Bugetul

Aproximativ.6,000caractere păstrate per conector și despre24,000caractere pentru întregul bloc pe fiecare conector activat. Peste capacul per-conector fișierul dvs. este trunchiat; să fie concis înainte de trunchiator este.

Previziunile

Aceste fişiere sunt diferenţa dintre asistentul care foloseşte uneltele de masă universale şi răspunde din secţiunea greşită pentru că nimic nu i-a spus vreodată că acele unelte există.

💡
Ambele fișiere trebuie să fie în pachetul INSTALLED, nu doar arborele sursă. Acestea sunt fișiere de pachet obișnuite, astfel încât acestea sunt acoperite de semnătura și expediate în ZIP
Conectori

Identitate printr-un conector: admin, client, portal

Un contract de semnare serveşte trei suprafeţe. Treaba conectorului este să transforme "care este conectat pe platformă" într-un jeton semnatOpsIQpoate verifica, și apoi să prezinte subiectul verificat înOpsIQConectorul nu autentifică pe nimeni platforma, iar semnătura poartă această afirmaţie.

Cele trei suprafeţe, un semn

Admin

Un subiect admin. widget-ul se încarcă în interiorul panoului de administrare al platformei și fiecare membru al personalului este potrivit cu propriul lor agent OpsIQ. Plimbare completă pe pagina de control admin .

Client

Un subiect de client. Aceasta este ceea ce permite un client logat-in obține contul WHOLE în loc de o căutare anonimă: fiecare comandă, detalii complete, și orice acțiune de autoservire pe care le permiteți.

Portal

Aceleaşi pretenţii plus jti şi single_use, cu120- A doua viaţă, pentru că semnul călătoreşte într-oURLși trebuie să fie cheltuibile o singură dată. Nu manual rola asta: Setări, Suport Portal poartă un fragment gata pe limbă, iar platforma îl menteaza pentru tine atunci când zona de cont rulează pe acest server.

Contractul privind sarcina utilă

Acestea sunt cererile de verificare a verificatorilor. Nimic aici nu este opțional, indiferent de un exemplu parțial în altă parte ar putea sugera.

site_key

Nivelul superior. Trebuie să egaleze tasta site-ului de cerere, sau jetonul este refuzat.

iat și exp

Nivel de top, unix secunde. Exp trebuie să fie în viitor și după iat. Un semn mai mult decât aproximativ un minut în viitor este refuzat. Păstrați viața scurtă

autentificat: adevărat

Susţine că un om adevărat este conectat.

platforma

Nivel superior. Un scurt melc de denumire a originii. Recomandat, și permite furnizorului de identitate un conector spune propriile jetoane de la o altă platformă lui.

admin sau client

Un obiect care numeşte subiectul. Trebuie să aibă un id ne-gol, şi un nume de utilizator sau un e-mail

Minting, verbatim de la podul Botble
$payload = [
    'site_key'      => $cfgSiteKey,
    'iat'           => time(),
    'exp'           => time() + 6 * 3600,
    'authenticated' => true,
    'platform'      => 'yourplatform',
    /* 'admin' or 'customer' — OpsIQ stamps the matching session identity
     * from whichever key is present. */
    $opsiqSubject   => $subjectPayload,
];
$payload64     = rtrim(strtr(base64_encode(json_encode($payload, JSON_UNESCAPED_SLASHES)), '+/', '-_'), '=');
$identityToken = $payload64 . '.' . hash_hmac('sha256', $payload64, $cfgSecret);

Cei doi verificatori, și eșecul pe care îl cauzează

OpsIQ are doi verificatori simbolici, şi nu erau identici. Ştiind că asta te salvează o după-amiază, pentru că simptomul nu seamănă cu cauza.

Widget admin are propriul verificator

opsiq/embed/admin_ajax. php poartă un verificator local care acceptă steagul autentificat în oricare poziție. Lista de conversații, istorie și necitite toate trec prin ea, astfel încât acestea să se autentifice bine.

Verificatorul partajat este mai strict

opsiq/include/client_identity_token_verify.php stă în spatele chat stream și miezul AJAXAPIDin punct de vedere istoric, era nevoie de steagul de la nivelul TOP.

Simptomatologia

Istoria și conversațiile funcționează. Fiecare turn de chat răspunde "Admin login necesar." Se citește exact ca un bug sesiune și nu este: jetonul lipsește steagul de nivel superior.

Ce face miezul curent

Acum acceptă steagul la nivelul superior OR în interiorul subiectului, astfel încât contractul este uniform. Corzile mai vechi citesc doar nivelul de sus. Emite forma canonică și pachetul funcționează pe fiecare versiune.

Acest lucru este verificat automat acum. Orice fișier din pachetul dvs. care ments token-uri de identitate este scanat static împotriva contractului, și o sarcină utilă platforma ar refuza nu respectă fișierul exact și linia. Rulați-l singur: instrumente php / verify_identity_contracts. php.

Clientii inregistrati in chat

Trebuie să fie adevărat două lucruri. Core trebuie să ştampilaţi clientul verificat, şi conectorul dvs. trebuie să-l prezinte.

1
Podul sau obiectivul dumneavoastră menteaza un jeton client

Acelaşi signer ca şi administratorul, cu un subiect de client. Citiţi clientul din sesiunea proprie a platformei. Dacă platforma dumneavoastră semnează clienţii pe o altă gardă de la admins, citiţi garda dorită şi nu se încadrează înapoi peste subiecte

2
Core verifică şi ştampilează

Pe un token valabil, marcile de bază subiectul verificat în sesiune. Furnizorul dumneavoastră citește o identitate dovedită; nu autentifică niciodată.

3
Identitatea dvs. Provider o prezintă

Detectează clienţii () întoarceOpsIQTrebuie să-l pună în aplicare.OpsIQ\Platform\IdentityProviderInterface, sau registrul o sare în tăcere peste ea ا aceeași capcană ca furnizorul de context.

4
Acţiunile dumneavoastră cu vedere la client acceptă un client_id

Şi... OpsIQ Se blochează la identitatea verificată înainte de execuție. Modelul nu-l poate furniza.

IdentityProvider. php ? Citeşte identitatea dovedită, prezintă-o în OpsIQ's shape
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;
    }
}

Acțiuni cu vedere la client: două încuietori, ambele necesare

Modelul nu trebuie să aleagă niciodată datele pe care le citeşte. OpsIQ aplică că pe partea sa, și platforma ta trebuie să-l aplice pe de altă parte prea. O blocare este un bug departe de o scurgere; două încuietori sunt un contract.

Blochează1 — OpsIQsuprascrie parametrii de identitate

Înainte de a se executa o acțiune client-chat, OpsIQ înlocuiește fiecare parametru în formă de identitate cu identitatea vizitatorilor verificați: client_id, clientid, user_id. userid, client_ID, cont_id; ID verificat; client_identificator, client _identifier, contabil_identificator ia-o ca șir; e-mail, client/email, clienți_email_ user_e-mail ia emailul verificat. Orice model propus este eliminat.

Blocați 2

Ia ID-ul ați fost dat și adăugați-l la clauza în cazul în care fiecare citire și fiecare scrie pe această suprafață. Nu încredere niciodată în referință în cererea pe cont propriu. Un client semnat-in cere despre comanda altcuiva trebuie să vină înapoi gol, nu interzis.

Nume parametrii astfel încât blocare 1 pot găsi

Spune-i client_id, nu cust sau ref. Un parametru OpsIQ nu recunoaște este un parametru pe care nu îl poate bloca.

⚠️
Oferiţi clientului semnat suprafaţa proprie operaţiunile sale, separate de cele admin, chiar şi atunci când SQL Două suprafeţe cu reguli diferite rămân oneste; o suprafaţă cu un steag devine o scurgere în ziua când cineva editează ramura greşită.

Cablare de pagină zero: sonda declarată prin conector

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.

setările.json setarea sondei
{
  "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."
}
Sonda este numită de către browser

Aceeaşi origine, astfel încât nu poate transporta un antet personalizat. Autentificarea sa este sesiunea de platformă. Pune-l înHEAD a porţii de bridge-cheie, păstrați-l departe de datele înregistrate, și se întoarce nimic la toate pentru un vizitator logat-out.

Răspunde unei forme fixe.

{"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} — and {"success":false,"authenticated":false,"error":"..."} when nobody is signed in.

Nu există un secret de lungă durată în sursa paginii

Doar semnul semnat, expirat.

Implementarea completă a obiectivului pentru Laravel,WordPress, WHMCS, Symfony și simplu PHP, plus specificul greu-won Laravel și ordinea de depanare, sunt pe pagina admin widget. Acestea sunt același cod pentru un subiect client: schimba garda pe care le citiți și tasta subiect semnați.

Conectori

Editura: editarea dosarului nu este publicare

Cel mai frecvent mod de a pierde o după-amiază este de a edita un conector sub piata_conectoare /, reinstalați-l, și găsiți nimic schimbat. Instalații nu citesc acel dosar. Ei trageți un ZIP semnat din catalogul pieței. Editarea este secvența care pune modificările în acel ZIP.

De ce editatul nu a făcut nimic

marketplace_connectors/<slug>/ is the SOURCE

Nu e nimic care să-ţi permită.

Catalogul deţine un ZIP semnat

O instalare descărcări care ZIP, verifică semnătura, și o despachetează. Până când reconstruiești ZIP-ul, fiecare instalație păstrează obținerea pachetului vechi.

Constructorul Connector publică în altă parte

It writes into /connectors/<slug>/ on this install. That is a local connector, not a marketplace release. The two paths do not overlap.

Secvența de eliberare

1
Bumpă versiunea în DOUĂ fișiere

Setări.jsonși conector_contract.json. Conformance le compară și nu reușește în cazul în care glonțul, versiunea sau setul de capabilități nu sunt de acord. Adăugați o intrare HADHLOG.md în timp ce sunteți acolo este un fișier necesar.

2
Re-sincronizează fragmentul de pe pod

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
Re-remiză fiecare pachet

php instrumente/resign_all_connectionors. php

4
Exportă cheia de semnare, apoi sămânţă

Semănătorul semnează fiecare pachet în timp ce construieşte ZIP-ul şi se execută într-un context în care cheia nu poate fi citită din setările

5
Reînchiriază fişierul podului, dacă trimiţi unul.

Reînnoirea conectorului actualizează pachetul. NU atinge copia care stă în broasca web a operatorului. Spune-le, în panou și în jurnalul de schimbare.

Întreaga eliberare, în ordine
# 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
⚠️
De ce exportul nu este opţional: scenograful caută cheia în OPSIQ_CONNECTOR_SIGNING_KEY primul şi conectorul_signing_key setarea a doua. Semănătorul rulează pe saaS boottrap şi unelte/semn_conector.php cizme nimic, astfel încât în ambele setările cititor nu existăOpsIQşi poate găsi cheia de unul singur.

Ce nave de fapt

Numai fișierele pe care le acoperă semnătura

ZIP este construit din lista de fișiere a semnatarului, astfel încât un fișier rătăcit stând în dosarul dvs. pachet nu este expediat. Asta este deliberat: un fișier nesemnat folosit pentru a merge cu clienții.

Extensii acoperite

php,json, js,css, md, txt,html, sh, svg, png, jpg, jpeg, gif, webp, ico, yml, yamljsoneste exclus din hașișuri și apoi adăugat la ZIP, astfel încât instalaţiile să poată verifica.

Orice altceva este raportat ca ne-ambalat

Semănătorul de nume fiecare fișier pe care l-a lăsat în urmă. Citiți această listă. Un fișier pecare vă așteptați să îl trimiteți apărând acolo înseamnă o extensie greșită sau o locație greșită

Editarea oricărui fișier acoperit rupe sigiliul

Inclusiv un dosar Markdown.

Fișiere necesare într-un pachet distribuibil

connector.php

Trebuie să returnăm o instanţă de ConnectorInterface.

settings.json

Manifest: melc, nume, versiune, manifest_versiune, compatibilitate, capabilități, conector_contract_versiunea, setările.

connector_contract.json

Contractul de citire automată. Setul său de melc, versiune și capacitate trebuie să fie identic cu setările.json.

README. md, DEVELOPER. mD, Changelog. m d

Toate trei sunt verificate pentru existenţă şi dimensiuni minime. DEVELOPER. md are nevoie de conţinut real, nu un ciot.

Un fișier pe capacitate declarată

Fiecare capacitate de nume fișierul se așteaptă

Nimic care să arate ca un crez.

Conformance scanează cele trei fișiere Markdown pentru valori secrete și chei private, și nu reușește pe un hit.

Verifică înainte să-l trimiţi.

Apartamentul de conformare completă este același cu cel al unei instalări. Acesta verifică manifestul împotriva contractului canonic, care rulează și capacitățile manifeste sunt de acord, că fiecare capacitate declarată are fișierul său și metodele sale, contractul de identitate-token în fiecare fișier Minting, meciul pod-snippet, igiena de control-uploadlist, acțiunea unică și siguranța confirmării, precum și semnătura pachetului.

Rulați toate patru înainte de fiecare eliberare
# 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 eșec este de așteptat și nu este o problemă: verificarea semnăturii pachetului raportează un avertisment în timp ce sunteți încă editare. Acesta șterge momentul în care re-semnați. Fiecare alt eșec este unul real.
Conectori

Conectorul și referința ciclului de viață

Acesta este contractul la nivel de sursă pentru construirea unui conector care OpsIQ pot descoperi, configura, valida, activa, executa, testa, semna si distribui.

Referință pentru dezvoltator
Pachetul ConectorUn pachet conector are o implementare și manifest necesare conector, cu acțiuni opționale, rețete, cunoștințe, active și metadate de semnătură.Pachetul ConectordeveloperMANIFESTv1VIAŢĂGestionatSPAŢIA DE LUCRUDomeniul de aplicareVIE VIU AIRPACEconnector.phpClasa / fabrica conectorNecesarsettings.jsonSchema de manifest și setăriNecesaractions.jsonDefiniții de acțiuneOpționalsignature.jsonMetadate privind semnătura pachetuluiEliberare1DECLAREManifest și capacități2IMPLEMENTCiclul de viață și furnizorii3VALIDATTest, semn, pachet
Un pachet conector are o implementare și manifest necesare conector, cu acțiuni opționale, rețete, cunoștințe, active și metadate de semnătură.

Ambalaj minim

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

Contract de manifest

settings.json folosește versiunea manifest 1. Validatorul se așteaptă la un glonț, nume, versiune, manifest_versiune, compatibilitate, descriere și capacități. Compatibilitatea declară opsiq_min şi opsiq_max. Starea de eliberare este una dintre producția, beta, previzualizare sau șablon; capacitatea de maturitate utilizează niveluri L1

Interfață conector central

  • Identitate și configurare: slug(), name(), description(), capabilities(), settingsSchema(), testConnection().
  • Ciclul de viață: onEnable() şi onDisable(). Dezactivarea trebuie să fie nedistructivă; purjarea datelor este o operațiune separată deliberată.
  • Intrare/sync: handleWebhook(), poll(), backfill(). Poll se ocupă de lucrări incrementale; Backfill importuri istorie și trebuie să fie sigur pentru a repeta.
  • Suport: pushReply() în cazul în care platforma acceptă răspunsuri.
  • Acțiuni: registerActions() furnizează contracte de acţiune executabile.
  • Securitate: securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

Baza abstractă oferă, de asemenea, opţional backfill-ul în buclă, listarea clienţilor, descoperirea/crearea e-mail-contului, abonaţi, admin/customer detection, facturare/context/identity providers, respondent extraction, retrying HTTP calls; JSON- acces la cărare, clasament neclar şi ajutoare pentru paginaţie.

Capabilități și autentificare

Numele de capabilități acceptate includ acțiuni, declanșatoare, context, identitate, vânzări, facturare, intrare_ticket, outbound_reply, sincronizare_utilizatori, sincronizarea_departamente, securitate_evenimente, client_import, security_native_block, promo_audience, promo _feed, e-mail_box, nativ_api, ai_brain_aware și ai_tickets. Constructorul oferă API cheie, purtător, bază, HMAC,OAuth 2acreditarea clienților;OAuth 2codul autorizației și modelele de autentificare personalizate.

Ciclul de viață al registrului

  1. Descoperirea încarcă pachetul și validează manifestul său.
  2. Configurarea este stocată pe spațiu de lucru; secretele sunt criptate.
  3. Încercarea de conectare dovedește acreditări fără a permite conectorul.
  4. Activează apelurile onEnable(), sincronizează definițiile de acțiune și poate începe umplerea inițială.
  5. Execuția Polling/Webhook/Abscriber poartă întotdeauna context de spațiu de lucru.
  6. Dezactivează apelurile onDisable() și încetează activitatea fără a șterge datele importate.
  7. Purjarea este o operaţiune explicită separată.

Norme de corectare

  • Utilizați tasta de lucru spațiu / site în fiecare citire, scrie, cheie cache, cheia de deduplicare și căutare webhook.
  • Face backfill, webhook ingestie și scrie acțiuni idepotent. Înregistrați un ID extern / ID eveniment ori de câte ori platforma oferă unul.
  • Pentru sisteme la distanță, utilizați-le API; nu presupune niciodată că tabelele lor de baze de date există în OpsIQ Conexiune.
  • Return structurat, client-sigur erori. Niciodată nu expune secrete, urme de furnizor brut sau un alt spațiu de lucru .
  • Declara doar capacitățile pachetul pune în aplicare efectiv. actions.json catalogul nu face posibilă o acțiune până când conectorul este instalat, activat, configurat și conexiunea acestuia este valabilă.

Testarea și eliberarea

Rulați scame PHP, validarea manifestului, testele de conectare, testele schema de acțiune, încercările de semnătură/reluare a webhook-ului, teste de workspace-izolare, testele backfill-repeat, testele cu conexiune dezactivată și testele de eșec/retry. Un pachet de piață ar trebui să fie semnat și verificat apoi, să includă configurarea/permisiile/documentația Webbhook și să precizeze statutul său real de eliberare. Tile conector și manifest sunt semnalul de disponibilitate autoritar.

Conectori

Rețete conector

Rețete pas cu pas pentru setările de conectori comun.

Rețete
Rețetă conectorRețeta de configurare Shopify ca listă de verificare: crearea aplicației, a domeniului de aplicare al grantului, past token și testare, activarea site-urilor web, plasarea unei comenzi de test.Rețetă conectorShopifyRețetă · Shopify cu prosoape webCreează o aplicație personalizată în Shopify adminLunete de finanţare: citire_comenzi, citire_clienţi...Domeniu magazin paste + jeton, click TestActivează sincronizarea webhook (comenzi auto-register)Se introduce un ordin de încercare → apare în Vânzările 30s1STEP BY STEPRețete pentru pastă de copiere2REAL PLATFORMSShopify · WHMCS · Stripe· GBP3VERIFICAȚIOrdinea de încercare arată în 30s
Fiecare rețetă este o listă de verificare pe care o urmați sus în jos, aici, Shopify cu webhooks în timp real pentru comandă, verificate printr-un ordin de testare.

Rețetă: Shopify cu prosoape web în timp real

Scenariu:
Gol: Conectare Shopify cu sincronizare automată și GDPR conformare.
Ce este de făcut:

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.

Rețetă: WHMCS integrare

Scenariu:
Gol: Conectare WHMCS astfel încât AI să poată căuta clienţi, servicii, bilete şi facturi.
Ce este de făcut:

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.

Rețetă: Stripe plăți

Scenariu:
Scopul: Urmăriți plățile Stripe și lăsați AI să caute tranzacții.
Ce este de făcut:

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.

Rețetă: Profilul de afaceri Google

Scenariu:
Scopul: Conectați GBP pentru gestionarea revizuirii, posturi și perspective.
Ce este de făcut:

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.

Conectori

Extindeți informațiile CRM & Site

OpsIQ Subsistemele sunt deschise pentru extensie. Un conector poate conecta o nouă capacitate în CRM sau Site Intelligence fără modificări la OpsIQ nucleu, prin registrul de capabilitati al platformei (\OpsIQ\Platform\CapabilitateRegistry). Declara capacitatea, implementa setul său de metodă mică, nava conectorul,OpsIQ Descoperiți-l și fire în UI, Clientul 360 cronologie și prompte de instalare.

Extinde CRM & SI
Capacități de platformăUn conector din autobuzele de alimentare stânga (CRM, Site Intelligence, Analytics) descoperit de capacitatea Registry.Capacități de platformăspațiu de lucruConectoruldeclară capacitățileCRMcalendar · îmbogăţire · esign · plăţi · cutie poştalăInformaţii despre site-uri_listare · rang_dateAnalizeweb_analytics · raport & ingerareCapabilityRegistrydescoperă & fire linia timpului UI +1DECLARECapabiletăţi, nu editări de bază2PLUG INCRM · SI · Autobuze de analiză3AUTO-WIREDUI, cronologie, prompte
Un conector declară capabilități (calendar, îmbogățire, date rang, analiză...) și OpsIQ le fire auto în CRM și Site Intelligence, fără modificări de bază.

Capacități de declarare

Declarativ (setări.json)

Adaugă o <domain>_capabilities Array, cel mai bun pentru conectori fără cod/loc de piață. Domenii: crm, site_intelligence.

Cod (conector. php)

Implementează crmCapabilities() / siCapabilities() Revenind aceiaşi descriptori.

A se indica furnizorul de calendar CRM (setări.json)

Scenariu:
Scop: faceți să apară un conector calendar în panoul de întâlnire CRM.
Ce este de făcut:

"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]

Declară un furnizor de informații site-ului (setări.json)

Scenariu:
Scopul: alimentarea datelor locale-listare în Site Intelligence.
Ce este de făcut:

"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]

Autobuze de capacitate și suprafața lor metodei

chrm / calendar

createEvent($settings,$params) → {success, event_id,html_link,meet_link}; listEvents; freeBusy- Condus de...OpsIQ\CRM\CalendarBridge.

CRM / îmbogăţire

enrich($settings,$params) → {succes, trasee}. Condus de \OpsIQ\CRM\EnrichmentBridge (de asemenea, rulează automat pe companie crea atunci când un furnizor este conectat).

CRM / Esign

sendForSignature($settings,$params) → {success,envelope_id,sign_url}. Propulsat de \OpsIQ\CRM\EsignBridge.

site_inteligență / listare locală

listLocations, listReviews, getInsights. Nave prin intermediul conectorului Google Business Profile.

site_inteligență / rang_date

keywordRanks($settings,$params) → {success,ranks}.OpsIQ\Site Intelligence\RankDataBridge. Nave: Conector SerpApi.

analize / web_analize

report($settings,$params) (sincronizare/export) + ingest($settings,$events) (import). Condus de \OpsIQ\Analitics\WebAnalyticsBridge. Google Analytics (GA4) Conector. Date API pentru rapoarte, Protocolul de masurare pentru import. Analytics este deschis pentru conectori precum CRM + Site Intelligence (domeniul analytics / analytics_capabilities).

plăți/prestator_plăți

listPayments, customerPayments, createPaymentLink- Condus de...OpsIQ\Payments\PaysBridge. Arată plățile unui client pe cronologia CRM + trimite un link de plată pe o afacere. Nave:StripeConector de plăți. Domeniu payments / payments_capabilities.

Casetă poștală / e-mail_sync

listMessages + sendMessage- Condus de...OpsIQ\Mailbox\ MailboxBridge. E-mailurile clientului 360 cronologie + trimite e-mail de la un acord. Navele: Gmail + Outlook/Microsoft 365 Conectori. Domeniu mailbox / mailbox_capabilities.

Partajat OAuth app + ONE redirecționare

Toate conectorii Google împărtășesc o aplicație prin \OpsIQ\OAuth\ShareGoogleApp. Set google_oauth_client_id/_secret o dată și calendar, Analytics, Business Profile + Gmail toate lucrările (per-conector "(opțional) " câmpurile sunt suprascrieri). Ei împărtășesc, de asemenea, One redirecționare URI, <site>/connectors.php?oauth=callback (fără melc per-conector), deoarece Google expune nr. API să adauge URI redirecționate la o aplicație; OpsIQ recuperează conectorul de la semnat OAuth state nonce. Înregistrează că single URI o dată și fiecare conector Google (prezent + viitor) autorizează cu nici un alt Console configurare. Return SharedGoogleApp::resolve(...)S redirect_uri de la dvs. oauthParams()Microsoft Conectori face la fel prin \OpsIQ\OAuth\SharedMicrosoftApp (microsoft_oauth_*).

Butoanele de import sunt gated de capacitate

- Nu. Importă (reîmprospătare istorică) și Clienți de import butoanele arată NUMAI pentru conectori care le implementează efectiv, detectate prin reflexie, astfel încât nu există nici un steag de declarat. backfill() sau backfillChunk() pentru a câștiga butonul Import; suprascrie listCustomers() (return {email, prenume, ...} pagini) pentru a câştiga clienţi Import. AbstractConnector nu-op și butonul rămâne ascuns, astfel încât UI nu oferă un import un conector nu poate efectua.

AI peste autobuze

Agentul CRM propune și cărți întâlniri off semnale de afacere (\OpsIQ\CRM\MeetingProposer → CalendarBridge), și auto-îmbunătățește conturi noi,

Biletul de vizită pentru clienţi (fetchTicket())

Două niveluri, fără modificări de bază

Când un vizitator face referinţe la numărul biletului în chat-ul clientului ("Care este starea lui T-000123?"), OpsIQ o rezolvă în două niveluri. Nivelul 1 citeste impartirea OpsIQ magazin de bilete, fiecare conector cu inbound_ticket Oglindeşte biletele acolo, aşa că biletele sincronizate funcţionează pentru toţi conectorii cu cod zero per-conector. Nivelul 2 este o rezervă vie pentru biletele vechi care nu au fost niciodată oglindite: nucleul numește un OPTIONAL fetchTicket() pe fiecare conector activat care îl implementează. duck-typed (descoperit de method_exists(), cum ar fi contextProviders()/audienceCatalog()), deci semnat ConnectorInterface este neatins și conectori care nu au nevoie de ea (surse e-mail / chat care creează bilete nativ) pur și simplu omite.

⚠️
Proprietatea este obligatorie şi a ta trebuie aplicată. fetchTicket() primește identitatea de vizitator VERIFIFICAT în $ctx (client_id + client_email, aceeași identitate verificată pe care clientul o folosește chat AI). Rezolvați clientul platformei de la acea identitate și interogați NUMAI biletele clientului, apoi reverificați proprietatea asupra înregistrării detaliilor. Returnare null privind orice dor, nepotrivire sau eroare, niciodată datele unui alt client. null Degradează graţios la "nu am putut găsi biletul."
conector.php, contractul de preluare a biletelor () [referință: conectori/whmcs și conectori/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
    }
}

Cum o utilizează platforma

Descoperire

CapabilityRegistry::providers($domain,$type) listează furnizorii cu statut instalat/reperat/ready (filesystem-based; DB numai pentru steagul activat).

Selecţie

CapabilityRegistry::active($domain,$type) returneaza primul furnizor gata cu conectorul sau încărcat și setările. Podurile numesc acest lucru în loc de melci hardcoding.

Anunță-te la instalare

În cazul în care o caracteristică are nevoie de o capacitate care nu este conectată încă, UI arată un singur clic pe Connect/Install prompt, niciodată un control mort.

Ghid complet

Vezi? connectors/PLATFORM_CONNECTORS.md (CRM + Site Intelligence) și connectors/CRM_CONNECTORS.md în pachet.

Conectori

Self-service Lookups & Restituiri (build your conector for client chat)

Clienţii pot întreba clientul despre contul lor propriu ("restaurantul meu," "comenzile mele," "a răspuns la biletul meu de călătorie" şi, dacă afacerea permite acest lucru, poate solicita restituiri. Toate acestea sunt alimentate prin declaraţiile conectorului TĂU: nu OpsIQ modificări de bază, nici o platformă hardcoding. AI-ul vă solicită căutarea ca instrumente native (nu poate inventa una), identitatea este blocată server-side pentru client verificat, iar rezultatele sunt reduse automat pentru AI.

Declararea unui control al clientului

În actions.json, o acțiune numai citire devine apelabil cu clientii cu TOATE TREI: "scope":"client", "requires_confirmation":false, "is_destructive":falseFoloseşte-te. "scope":"both" atunci când aceeași căutare ar trebui să fie, de asemenea, apelabil de către echipa ta în AI admin. vocabularul complet este admin, client, both şi system (system nu ajunge nici AIAPIși doar rute webhook). Orice altceva este respins pur și simplu: validarea pachetului nu reușește și acțiunea nu se instalează. writing domeniul de aplicare admin Set de acțiune.

Regula identităţii (obligatoriu)

Nume parametrul de identitate din setul standard. Blocat la ID numeric verificat: client_id, clientid, customer_id, user_id, userid, account_id- Blocat la acel ID ca un șir de caractere: client_identifier, customer_identifier, account_identifier. Blocat la e-mail verificat: email, client_email, customer_email, user_email. OpsIQ se blochează și se umple automat de la clientul cu auto-controlul pe platformă; AI nu vede sau alege identitatea. Un nume nestandardizat nu reușește închis (negat, niciodată scurs).

Ce trebuie să rămână admin-numai

Orice nu este sub incidenţa acestei identităţi:order_id/ticket_id Numai), liste la nivel de magazin, căutări în text liber. Acestea sunt scurgeri client-cross pe orice platformă. "scope":"admin".

Modelarea rezultatului (tastele purtătoare de răspuns)

Rezultatele căutării sunt tăiate structural înainte de a ajunge la AI: cheile în formă de secretă sunt retrase, siruri lungi și liste sunt plafonate, câmpurile goale sunt prunjite, iar o hartă plană mai largă decât capacul cheie păstrează sale mai întâi cheile de răspuns, bani (credit, balance, amount, total, due, paid), identitate (email, *name, phone, company), stat (status, active, expir*, renew*), date, plan/produs/domeniu/serviciu/abonare/ordine/factură/campuri de tichet, monedă, număr și stats/summary/totals, înainte de orice scaune rămase merge la alte chei cea mai mică valoare-primul. Ghid practic: numele câmpurile cu acel vocabular standard și returnați domeniile care răspund la întrebarea clientului mai degrabă decât o brută100-fundare platforma cheie; un câmp numit în afara vocabularului concurează pentru scaunele rămase și poate fi demontat din încărcăturile utile foarte mari.

Rambursări · ce conectorul dvs. oferă

Două operațiuni brute, fără politică: (1) o verificare a plăţilor care poate fi filtrată prin identitate şi referinţă la tranzacţie (API trebuie ȘI filtrele), de exemplu whmcs_get_transactions; (2) o acțiune de executare a restituirii (scope:"admin", requires_confirmation:true, is_destructive:true, niciodată expuse clienților), de exemplu whmcs_refund_order. Afacerea alege ambele chei în Setări → Client Chat; OpsIQ reverifică serverul de plată, aplică caseta politică a afacerii (cu plafon valoric, fereastră de vârstă, limită lunară), probleme din interiorul cutiei, și fișiere un bilet de revizuire pentru orice altceva.

Constructor fără cod

Editorul de acțiune Connector Builder are aceleași controale: setați "Cine îl poate folosi" clienților conectați, lăsați ambele checkbox-uri scrise off și utilizați un nume standard al parametrului de identitate.

Implementarea de referință

Inscrierile "Client Autoservire" in connectors/whmcs/actions.json, woocommerce/actions.json, oscommerce/actions.json; contract integral in connectors/README.md §8.1–8.2 şi ConnectorInterface::registerActions().

Conectori

Căutarea oaspeţilor

Hoteluri, curieri și multe platforme comerciale servesc clienților care dețin o referință dar nu au login: un oaspete cu confirmarea rezervării, un destinatar cu numărul de urmărire. guest_lookup capacitate (Connector Contract, mod: generat) permite conectorului dvs. să servească acei vizitatori în chat-ul client AIOpsIQmodificări de bază, nici o platformă hardcoding. Conectorul dumneavoastră declară CE dovedește dreptul și care câmpurile sunt vizibile;OpsIQaplică comutatoarele, acceleraţia şi uniforma neagă.

Modelul de încredere

Referință + dovadă, niciodată identitate

Vizitatorul furnizează referinţa de înregistrare (matched by the regex you declare) plus dovada pe care o alegi . În mod normal, e-mail-ul din dosar. Acţiunea ta de preluare preia înregistrarea SEVER-SIDE prin trimitere; OpsIQ_'s generated provider compares the proof against the FETCHED record. Intrarea vizitatorilor nu este niciodată de încredere, şi nici o identitate verificată este creată: meciul dă dreptul vizitatorului la câmpurile permise de un singur record, nimic altceva.

Negare uniformă (fără oracol de enumerare)

Nu a fost găsit și dovada-proof produce un răspuns identic. AI este instruit în mod explicit să nu confirme niciodată dacă există o referință și niciodată să inventeze detalii de înregistrare. Încercările sunt limitate rata pe conversație + IP pe bază de miez înainte ca conectorul dumneavoastră să fie consultat vreodată.

Double opt-in, ambele implicit OFF

Nimic nu servește oaspeților până când afacerea permite atât comutatoarele: controlul de spațiu de lucru în Setări→Securitatea→"Căutări de înregistrare ale clienţilor în chat" (permission-gated şi întotdeauna cu parola confirmată, chiar şi atunci când este opţional pas-up) şi conectorul propriu guest_lookup_enabled Setările se comută. Instalarea sau activarea unui conector singur nu deschide niciodată suprafața oaspetelui.

Suprafaţa dedicată oaspeţilor

Furnizorul generat înregistrează pe guest suprafață context admin şi customer. Furnizorii de context existent nu sunt niciodată consultaţi pentru vizitatori anonimi, iar furnizorul invitat nu este consultat niciodată pentru cei conectaţi. Ctx-ul primit poartă mesajul de chat, id-ul firului şi e-mailul pre-chat al vizitatorului (neverificat) ca un candidat la probe

Declararea în constructor

1
Defineşte acţiunea de strângere

În etapa Acțiunilor, adăugați o acțiune unică de citire care returnează ONE record prin trimiterea sa (de exemplu: GET /bookings/{booking_number}) și harta câmpurilor de răspuns cu pseudonime: stare, sosire, plecare, cameră_tip, client_email...

2
Tick "Căutarea oaspeţilor"

Pe etapa de capacitate, activați guest_lookupApare un panou dedicat: alege acțiunea de preluare, numește parametrul de referință, dă modelul de referință (un corp regex cum ar fi \bBK-[0-9]{4,10}\b), numeşte înregistrarea ("rezervare"), şi alege dovada de e-mail pe înregistrare (recomandat) sau nici unul (referinţă numai, pentru status-doar curier urmărire).

3
Permiteți să se înregistreze câmpurile vizibile

Tick exact câmpurile pe care le poate vedea un oaspete. Restul este DROPPED

4
Publică și activează

Constructorul emite GuestLookupProvider.php bază canonică împietrită de implementare, identice pentru fiecare pachet generat guest_lookup_enabled comutați la setările conectorului. Afacerea brațele cele două întrerupătoare și chat-ul AI începe să ofere căutarea atunci când un vizitator întreabă despre tipul de înregistrare.

Norme contractuale

Numai câmpuri în formă de stare

Gândiți-vă "ce ar fi un curier de imprimare pe pagina publică de urmărire": starea, datele, categoria cameră sau serviciu, contează. Numele, datele de contact, adresele de stradă, datele privind plata și notele de text liber nu au loc într-o chat anonimă

AI răspunde NUMAI din bloc

Furnizorul generat se încheie cu o instrucțiuni de a răspunde doar din câmpurile enumerate și de a oferi un bilet pentru orice altceva. Detaliile nu în lista de autorizare este "nu este disponibil în chat"

Monitorizarea continuă să funcționeze

Furnizorul re-se retrage de referinţă din mesajele recente ale vizitatorilor în aceeaşi conversaţie, aşa că "şi când este check-out?" funcţionează fără a retipări referinţa. Referinţa şi e-mailul de probă sunt amintite pe firul de chat ca CANDIDATES, astfel încât follow-up-urile nu re-ask. Acestea sunt doar candidaţii: fiecare turn încă re-fettează server-side înregistrare şi re-compare dovada înainte de eliberarea unui singur câmp.

Pachete manuale

Un pachet de piaţă poate trimite propria sa GuestLookupProvider.php implementing ContextProviderInterface cu surfaces(): ['guest']Urmați contractul șablonului generat exact guest_lookup in capabilities. Conformance verifică suprafața de oaspeți și scanează lista de permis pentru PII.

💡
Căutarea oaspeților sunt contexte doar pentru citire pentru chat AI. Ei nu execută niciodată acțiuni, nu creează identități și nu debloca calea de acțiune a clientului self-service deasupra
Conectori

Promovarea ţintirii publicului (promo_audienţă)

Lasa Promotion Studio sa tinte campaniile clientilor LIVE si starea de facturare de pe platforma TA: "are o factura neplatita," "ordin in asteptare," "subscriere anulata." Orice conector (preinstalat, piata sau unul pe care il construiesti) se alatura implementarii a doua metode mici. OpsIQ modificări de bază, nu platforma hardcoding: conectorul apare ca o platformă în studio Targeting fila cu propria scădere a faptelor, și mai mulți conectori pot fi activate cot la cot.

Public promo
Promovarea ţintirii publiculuiO identitate verificată a trecut la un public conector Flags apel de producere a faptelor care conduc o regulă de direcționare, cu o notă închisă eșuați.Promovarea ţintirii publiculuispațiu de lucruAutentificareidentitatea verificatăPublic Flags ()conectorul dumneavoastrăFAPTELEunpaid_invoices = 2RULA_Voturi neplătite ≥ 1Campania aratăInchise: client necunoscut sau orice eroare → campania ramane ascunsa.1TWO METHODSaudiențăCatalog + Steaguri2LIVE STATENeplătite, în curs de desfășurare, starea3FAIL-SAFENu arată niciodată persoanei greşite
Conectorul răspunde în direct facturarea faptelor pentru vizitatorul înregistrat; studioul ţinteşte pe ele şi nu reuşeşte să închidă astfel încât o ofertă de facturare să nu ajungă niciodată la persoana greşită.

Cum funcţionează

1
Declaraţi faptele

Implementează publiculCatalogul () pe clasa conectorului. Returnează o etichetă și lista de chei la care platforma ta poate răspunde. Fiecare cheie apare în studio dropdown sub numele platformei tale.

2
Răspuns pentru 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
Gata.

Activează conectorul. Promotion Studio Targeting tab-ul crește o secțiune "Client & facturare" listarea platformei; admins construi reguli ca "neplătite_voci > 1"; fiecare fapt devine de asemenea o variabilă de personalizare, cum ar fi {unpaid_invoices}.

conector. php, contractul de promovare_publicitate complet
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'],
    ];
}

Norme contractuale

Reclamă capacitatea

Adaugă 'promo_audience' la conectorul dumneavoastră capabilities() array astfel încât platforma și piața să-l lista ca fiind capabil de public (descoperire funcționează, de asemenea, din prezența metodei, dar declararea este semnalul curat). Preinstalat connectors/whmcs Conectorul este implementarea completă de referință.

Denumire cheie

Lowercase sarpe_case, 2-60 chars, potrivire ^[a-z0-9_]+$. Tipuri: număr, text, bool. Cheile nedeclarate returnate de publicFlags() sunt încă utilizabile în reguli, dar declara tot ce sprijin astfel încât admins pot vedea.

Identitatea este verificată

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.

Eșec închis · întotdeauna

În orice greşeală (API în jos, clientul nu a găsit, timeout) întoarce []. O regulă al cărui fapt lipsește face campania NU arată. Un proiect de lege-țintă popup nu trebuie să ajungă la persoana greșită; OpsIQ aplică acest lucru în matcher regulă prea.

Performanță

PublicFlags () este numit cel mult o dată pentru fiecare conector pe vizualizarea paginii, și DOAR atunci când o campanie publicată folosește de fapt regulile platformei. Vizitatorii anonimi te costă zero apeluri. 1-2 API apeluri; OpsIQ Memorează în cadrul cererii.

Operatorii au fost asigurați gratuit

Admins combina cheile cu = , !=, >, > >, <, <=, conține, este setat, este gol, vă doar valorile de aprovizionare.

Arsene de personalizare

Fiecare fapt se dublează ca o variabilă în copie campanie: {unpaid_invoices}, {client_status}, plus built-in-uri {first_name} şi {client_email} Valorile sunt curăţate înainte de redare.

Conectori fără cod de piață

Fapte automate

Declarativ (JSON-doar) conectorii pietei obtin promo_audienta gratuita: daca conectorul dumneavoastra declara clienti/utilizatori, facturi, comenzi sau resurse de abonamente; OpsIQ derivă client_status, neplătite_facturi, suma_dause, asteptare_ordine, active_abonamente și abonament_statu din acțiunile de căutare existente. Niciun cod la toate.

Catalog personalizat (setări.json)

Adăugaţi un obiect de audienţă_capabilităţi · {"etichetă": "Platforma mea," "chei": [{"cheie": "deschis_carte," "eticheta": "Căruţe deschise," "tip": "număr"} ]}, pentru a controla exact ce fapte (şi etichete) apar în picătura studioului.

Testarea furnizorului

1
Activează conectorul

Conectori > conectorul > Activați. Apoi deschideți fila de direcționare a oricărei campanii. Platforma dumneavoastră trebuie să apară la "Client & facturare (conectoare) ."

2
Construieşte o regulă

Adăugați: Platforma dvs. · o cheie · >= · 1 și setați "Doar clienții conectați". Salvați și publicați.

3
Verificaţi ambele direcţii.

Intraţi pe platforma dvs. ca un client care se potriveşte cu regula (popup trebuie să arate) şi ca unul care nu (popu trebuie să rămână ascuns). Vizitatorii logat-out nu se potrivesc niciodată reguli logate-in.

Trage o campanie din propriul cod (declanşator de la custom)

De ce?

Dincolo de declansatorii built-in (întârziere, pergament, iesire în intentie, inactiv, click, paginile vizualizate, activitate chat / bilet), puteti trage o campanie oriunde în site-ul sau conector front-end, după un pas de checkout cu succes, atunci când un coș este abandonat, atunci cand SPA schimba ruta, etc.

Cum

Setează declanşatorul campaniei Personalizat cu un nume de eveniment (de exemplu, checkout_failed), apoi sunați la cârligul global de pe pagina dumneavoastră:

site-ul / conectorul din față 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');
💡
Tragând un eveniment nu ocolește niciodată de direcționare sau frecvență. Acesta eliberează doar
Ghidul complet cum să-utilizați (proiectare, blocuri, analiză, A/B, publicare) trăiește în cadrul Centrului de Ajutor In-app sub Activează → Studio de promovare. Capacitatea de aici este descoperită automat din orice conector ENABLED în conectori / sau pe piață_conectoare /. Nu există nimic pentru a înregistra. Navați cele două metode, iar studioul face restul.
Conectori

Capacitatea conectorului de control (contract 2.2)

- Nu. survey capacitatea permite oricărei platforme să furnizeze adaptoare verificate de identitate a clienților, fapte ale publicului, variabile sigure și candidații destinatari la Studioul Survey. Este independent de promo_audience și nu oferă un conector de proprietate a sondajelor, răspunsurilor, analizelor sau e-mail livrare.

💡
Starea de implementare. Autorizarea este completă și utilizabilă astăzi: Contract de conectare 2.2, SurveyConnectorInterface, panoul dedicat Constructorului, generat SurveyProvider.php, metadatele pachetelor și izolarea conformanței tuturor navelor. Consumul nu este încă conectat: SurveyConnectorRegistry este implementat și testat, dar nici un sistem de control al timpului de funcționare nu îl numește încă, astfel încât sănătatea furnizorului să nu fie la suprafață în admin UI și niciun pachet de conector publicat declară capacitatea. Emiterea Gateway-ului de identitate, țintire și integrare variabilă, materializarea CRM Outreach și primele cartografieri ale furnizorilor expediate rămân faze separate. Construiți împotriva acestui contract acum; așteptați ca timpul de desfășurare să înceapă consumul într-o versiune ulterioară.

Responsabilități ale furnizorilor

Catalogul publicului și fapte

Declararea faptelor canonice și a valorilor de soluționare doar pentru un subiect verificat, legat prin spațiul de lucru. Faptele tipice includ comanda_conte, ultima_order_status, anulat_ordine_contele, clientul_creat_at, activ_subscription_conta, trecut_due_facture_cont și open_ticket_cont.

Catalog și valori variabile

Declara client, cont, comanda, abonament și variabile de sprijin cu tip, sensibilitate și context permis. Copie sondaj necesită rezervări și ieșire-context evadare.

Paginare destinatară

Candidaţii opțional enumeraţi pentru CRM Outreach cu ID-uri externe stabile, pagini delimitate, cursoare deterministe şi metadate legate de consimţământ. Sondajul îngheaţă publicul ales înainte ca cineva să trimită.

Identitate

Acceptaţi identitatea numai din poarta de identitate a sondajului după semnătura simbolică, expirarea, scopul, conectorul şi verificarea spaţiului de lucru. E-mailurile, ID-urile, etichetele sau datele de facturare nu sunt niciodată autorizate.

Sănătatea în timpul perioadei de funcționare

SondajConnectorRegistry este conceput pentru a raporta furnizori compatibili, blocați și indisponibili fără a expune setările, căile, identitățile brute sau mesajele de excepție, iar un furnizor blocat nu poate fi invocat. Suprafața de raportare nu este încă expusă în admin UI: astăzi un furnizor înfundat este pur și simplu inert.

Norme închise în caz de faliment

Cheile declarate, tipurile greșite, valorile supradimensionate, neconcordanțele subiectului, temporizările conectorilor și identitățile necunoscute sunt respinse. O regulă de direcționare care are nevoie de un fapt indisponibil nu se potrivește. Paginile primitive sunt limitate și auditate. Valorile sensibile nu apar niciodată în previzualizare publică sau jurnale.

Poarta de lansare a constructorului

Contract 2.2 nave de acces la registrul capacităților, interfață, panou de cartografiere a sondajelor, generat SurveyProvider.php, versiunea de capabilitate, README / echipamente de referință și conformare pentru dezvoltator. Comerț, helpdesk, SaaS pod și profiluri locale PHP includ; standard API conectori optează în. Poarta statică respinge un furnizor sondaj care numește un namespace Promotion, masă sau capacitate.

💡
Copia de la Promotie este numai import: Constructorul poate traduce cartografii compatibile de promovare o dată, salvați o copie completă și proveniență record. Ștergerea sau schimbarea cartografierii Promoție nu trebuie să schimbe comportamentul sondajului.
Conectori

Capacitatea de răspuns (contract 2.2)

- Nu. reply_feedback capacitatea de a reflecta ratingurile proprii per-reply ale unei platforme în OpsIQ. O stea un client dă un răspuns personalului din interior WHMCS Zona client aterizează pe răspunsul SAME în OpsIQ fir de admin, cu același cip, credit de agent, intrare pagina Feedback și calcul Team & Performance ca un rating dat pe o OpsIQ Un singur depozit, un cip, o singură conductă; conectorul se traduce doar.

Cel care scrie calea

Sunt exact două căi de intrare şi un singur adevăr. OpsIQ bilete portal scrie nativ. Tichete platforma curge prin conector, și de bază aterizează fiecare eveniment prin intermediul ReplyFeedback::recordMirrored(): aceleasi coloane, regula numai pentru personal, semantica cu un singur rating-per-replex, timbrul spatial si vocea clientului indexand utilizarile de scris ale portalului. Un conector nu scrie niciodata randuri de feedback in sine.

Conform (patru fișiere, apoi re-semnează)

1
connector_contract.json

Adăugați capacitățile. reply_feedback entry: version 1.0, the ReplyFeedbackConnectorInterface, metods replyFéedbackCatalog și pullReplyFeneedback, implică inbound_ticket.

2
settings.json

Adaugă răspuns_feedback la lista de capacități. Aceasta este ceea ce detectează conectorul.

3
spec.json

Declaraţi răspunsul_feedback. modes (poll şi/sau webhook) şi scala de rating a platformei. Aceasta este ceea ce citeşte poarta de conformare.

4
Clasa de timp de execuție

Implementarea interfeței, lista de răspuns_feedback în capacități(), apoi re-semna pachetul.

Responsabilități ale furnizorilor

Catalog

Moduri de raportare, scala de rating propriu a platformei (core normalizeaza la nativ 1-5), şi orice jetoane de reacţie. Catalogul trebuie să fie de acord cu specificaţii.json.

Trage traducerea

pullReplyFeedback returnează evenimente canonice: platforma ticket id, platforma răspuns ID, rating, reacție/comentariu opțional, timp depus și un eveniment stabil_id. Ea citește și traduce. Nu scrie niciodată.

Idempotență

Eveniment_id este stabil pe feedback STATE, astfel încât un eveniment reluat este un no-op și o suprascriere de rating schimbat (ultimele victorii, cum ar fi portalul).

Disciplina cursorului

Paginile sunt delimitate și deterministe; un cursor care nu avansează încheie cursa. Se scurge istoric ca o fereastră de rulare, niciodată o tragere gigantică.

Siguranţa sondelor

Fără configurare, returnaţi o pagină completă goală în loc să aruncaţi. Sondele alergător de conformare cu argumente goale.

Rezoluţia închisă în caz contrar

Core rezolvă fiecare eveniment la un răspuns local de marker oglindă bilet oglinda deja timbre (<slug>:<ticket>:reply:<reply>) Un eveniment care nu poate fi rezolvat este abandonat, niciodată ghicit; feedback-ul se atașează doar la răspunsurile personalului; și creditul agentului vine întotdeauna de la autorul actual al răspunsului. Rating-ul scrie nu schimbă niciodată autorul. Acesta este motivul pentru care capacitatea necesită inbound_ticket sau ticket_mirror.

Exemplu de lucru: WHMCS

WHMCS stochează ratingurile steai client-zona per-reply în tblticketreplies.rating. WHMCS Conectorul declară modul de sondaj cu un 1-5 scara, navele a ticket_reply_ratings Releu comanda în fișierul său pod, și traduce fiecare rând într-un eveniment ale cărui ID-uri se potrivesc cu whmcs:<ticket>:reply:<reply> markers its ticket oglinda deja timbre. După modernizarea conectorului, re-copie fișierul pod la serverul WHMCS astfel încât noua comandă există acolo.

💡
Contract de dezvoltare completă cu interfața, forme de evenimente, norme de normalizare și lista de verificare a conformității: doc/contracts/TICKET_REPLY_FEEDBACK_CAPABILITY.md în OpsIQ pachet. Acceptare: rata de un răspuns în interiorul platformei, așteptați pentru sondajul pe oră, și același răspuns în OpsIQ arată cipul, pagina Feedback îl enumeră şi un eveniment reluat nu schimbă nimic.
Conectori

Capacitatea de fuzionare a biletelor (contract 2.4)

- Nu. ticket_merge capacitatea face ca un bilet să fuzioneze în OpsIQ o fuziune pe fiecare platformă de bilete conectată. Biletul de platformă păstrat primește mesajele biletelor fuzionate, începând cu mesajul de deschidere al fiecărui bilet fuzionat, în loc ca biletul de platformă fuzionat să fie închis doar.

De ce există

O unire în OpsIQ mută fiecare mesaj al biletelor fuzionate în biletul păstrat și elimină biletele fuzionate. Înainte de contract 2.4 numai un conector auzit ticket.deleted pentru fiecare bilet fuzionat. WHMCS A închis biletul şi l-a păstrat WHMCS biletul nu a primit niciodată ceea ce clientul a scris prima dată: subiectul a arătat [MERGED] și conținutul lipsea.

Ce nucleu trimite

ticket. reglată (o dată per fuzionare)

ticket_id, ticket_number, subiect și external_ref a biletului KEPT; native_table (opsiq_tickets); site_key; surse, cele mai vechi bilete fuzionate în primul rând, fiecare cu ticket_id, ticket_number, subiect; external_ref, client_name, client_email, created_at şi mesaje [{reply_id, author_type, author_name, created_at, organism}]; merged_by; merged_at. Mesajele sunt conversația client-vizibil, capturat înainte de mutare. Note interne nu sunt niciodată incluse.

biletul. eliminat (per bilet fuzionat)

Încă mai trage, acum cu merged_into {ticket_id, ticket_number, external_ref}. Central nu-l livra la un conector care declară ticket_merge; alți consumatori pot deosebi unirea de la o ștergere.

Cârlige web de ieșire

ticket. reglată este un eveniment livrabil. Un obiectiv SaaS webhook subscris la bilet. eliminate primește, de asemenea, bilet. orged, astfel încât o integrare construit înainte de 2.4 aude fuziunea.

Ce face conectorul tău

Declarare

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.

Combiază nativ când poţi

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.

În caz contrar, adăugați o notă privată

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.

Raportează ce nu a fuzionat

Return {ok, mode, fuzionat, remarcat, neînţeleasă, eroare}. Fiecare copie unificată pe care nu o puteţi îmbina merge în afara limitelor, iar nucleul vă aplică manipularea normală de ştergere (închidere sau ştergeţi cu mirror_deletes) la exact cele. Modul de returnare fără suport numai atunci când platforma nu are fuziune şi nici o notă privată. Un transport sau o defecţiune aut este ok=fals cu motivul; acesta este înregistrat în Diagnostics.

Onorează-ţi comploturile.

Aceleaşi setări cu oglinzi care poartă cealaltă poartă de oglindă a biletului.

Combină care începe pe platforma ta

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.

Implementarea navelor

WHMCS

CombineTicket (tichete = bilete păstrate, fuzionate = bilete fuzionate) atunci când ambele sunt în WHMCS; AddTicketNote cu transcrierea altfel OpsIQ copii atunci când personalul fuziona în WHMCS.

Zendesk City in Germany

POST /api/v2/tickets/{id}/merge.json cu comentarii de fuziune privată (până la cinci bilete pe apel), plus transcrierea ca un comentariu privat privind biletul păstrat, deoarece Zendesk închide biletele fuzionate fără a muta comentariile lor.

OpsIQ Podul SaaS

POST /v1/tickets/{id}/merge cu source_ids, care mută răspunsurile portalului și atașamentele; un răspuns intern poartă transcrierea pentru biletele care nu au fost niciodată pe portal. A /manage fuzionarea OpsIQ copii.

Constructor de Conectori

ticket_merge este derivat, nu ticăie niciodată: un pachet generat îl declară atunci când leagă biletul de platformă pe care îl creează (un bilet.creat abonat cu link-ul pe), manere ticket.eliminat sau declara ticket_mirrorPe treptele biletelor, dedesubt Combină, alege acţiunea de fuziune a platformei (map union.target_remote_idŞi uneşte-te.source_remote_ids sau să fuzionăm.source_remote_id) și o acțiune de notă privată (notă de subsol.remote_id și note.body). Fuziunile generateBilete () folosesc ambele. Cu nici unul, Constructorul avertizează că mesajele unui bilet fuzionat nu vor ajunge pe platformă.

💡
Contract integral: doc/contracts/CONNECTOR_CONTRACT.md, secțiunea Ticket fuzionează. Acceptare: fuziona două bilete în OpsIQ care există atât pe platformă, apoi deschide biletul păstrat de pe platforma. Primul mesaj biletului fuzionat este acolo.
Conectori

Piaţa conectorilor

Marketplace vă permite să descoperiți, instalați și publicați conectori construiți de comunitate.

Piață
Piaţa conectorilorO reţea de carduri conectori comunitari cu categorii, instalează butoane şi rating stele.Piaţa conectorilorspațiu de lucruConectori de căutare...CalendlyCity in New York USAProgramareInstalează★ 4.8HubSpotCRMInstalează★ 4.6MailchimpE-mailInstalează★ 4.7QuickBooksContabilitateInstalează★ 4.5TwilioSMSInstalează★ 4.9NoţiuneDocuriInstalează★ 4.41DISCOVERConectori comunitari2INSTALAREUn click3PUBLISHSemnează & trimite-l pe al tău
Navighează conectorii comunităţii, instalează într-un singur click sau semnează şi publică propriile niveluri preinstalate şi pieţii care pot fi căutate.

Găsirea și instalarea conectorilor

1
Răsfoiește

Du-te la Conectori > Marketplace. Caută după nume, categorie sau platformă.

2
Revizuire

Verificați descrierea, acțiunile sprijinite și ratingurile.

3
Instalează

Click Install. Pachetul conector descarcă și instalează în market_connectionors/.

4
Configurează

Activați-l în Conectori, introduceți API acreditări și test.

Editarea unui conector

1
Construire și încercare

Utilizați Connector Builder. Verificați toate acțiunile de lucru.

2
Ambalaj

Generează profilul.json, actiuni.json, cunoasterea.json, și fișiere PHP.

3
Semnează

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
Trimite

Încărcaţi prin fluxul de prezentare a pieţei pentru revizuire.

Două niveluri de conectori

Conectori/

Rădăcina descoperirii în timp util. Totul aici este live: conectorii care nava cu OpsIQ, orice instalat de pe piață, și tot ce Connector Builder publică pe această instalare.

market_connectioners/

Editura SURSE pentru pachetele de piață de prim-party. Nu este o rădăcină descoperire: nimic aici nu este viu până când acesta este ambalat, semnat, însămânțat în catalog și instalat, moment în care o copie aterizează în conectori /.

💡
Un pachet pe care l-ați creat sub marketplace_connectors/ nu este copia care rulează — instalarea îl copiază în connectors/, și numai acea copie este descoperită la execuție. Stripe, BigCommerce, Magento 2, PrestaShop, OpenCart, Amazon SES, Postmark și Resend sunt toate pachete marketplace: instalați unul înainte de a vă aștepta să-l găsiți în Connectors.
Dezvoltator

API și constructor de webhook

ă API și Webhook Builder vă permite să creați personalizat API obiective și ascultători webhook în interiorul OpsIQ fără a scrie PHP brut.

API constructor
API și constructor de webhookUn constructor care alege un tip de declanșare (inbound webhook, program, eveniment, manual) care se conectează într-o acțiune configurabilă.API & constructor webhookspațiu de lucruDECLINATORWebhook de intrareProgram (cor)OpsIQ evenimentManualAcțiuneHartă câmpuri primite →crearea biletului / notificarea/ apelul APISalvează obiectivul1DECLARATORIWebhook · program · eveniment · manual2NO RAW PHPConstruită în UI3ACŢIUNICâmpuri de hartă, apoi fugi
Construiește obiective fără PHP brut: alege un declanșator (inbound webhook, program, eveniment sau manual), apoi harta câmpuri la o acțiune.

Declanșatoare

Eveniment

Fugi când se întâmplă ceva. OpsIQ, sau atunci când un sistem extern postează un eveniment de potrivire la webhook URL Scrie numele evenimentului, de exemplu ticket.creed.

Program

Utilizați unul dintre evenimentele de interval built-in ca numele evenimentului: cron. minut, cron . oră sau cron zilnic. Ecranul Acţiuni şi Triggers are butoane pentru acestea, astfel încât nu trebuie să le reţineţi.

Frază

Rulați atunci când un admin cere AI pentru ea în limba simplă. Adăugați fraza care ar trebui să se potrivească, de exemplu găsi client.

Webhook de intrare

Un sistem extern trimite un POST HTTP către dumneavoastră OpsIQ webhookComment URL Orice declanşator care să-l asculte pe acel eveniment se aprinde.

Doar că uneori: condiţii

Un declanșator de eveniment poate transporta condiții, astfel încât rulează numai atunci când datele primite se potrivesc. Fără condiții se execută de fiecare dată când evenimentul trage.

Câmp

O cale către datele evenimentului. Utilizați un punct pentru valorile cuibărite, de exemplu client. email.

Meciul este egal cu toate sau orice

Alege dacă fiecare regulă trebuie să se potrivească sau doar una dintre ele.

Teste text

egali, nu egali , conține , nu conține . , începe cu , este unul dintre , Nu este una din . Potrivire ignora capitale .

Testele numărului

mai mare decât cel puțin, mai mică decât majoritatea. Numerele scrise ca text se compară în continuare corect.

Testele de prezență

este prezent, lipsește, este gol, nu este gol.

Doar pagina inginerului de gardă pentru bilete urgente

Scenariu:
Bilete de eveniment. create, cu o singură regulă: prioritatea este egală cu urgenţa.
Ce este de făcut:

Acţiunea se execută pentru bilete de urgenţă şi este omis pentru orice altceva. Nu filtrarea necesară la sfârşitul dumneavoastră.

💡
Dacă laşi regulile necompletate, declanşatorul funcţionează pe fiecare eveniment care se potriveşte, ceea ce este acelaşi comportament ca înainte de a exista condiţii.

Acțiuni

Trimite un webhook

Trimite HTTP POST la un URL cu o sarcină utilă personalizată.

Creează bilet

Creați un bilet de sprijin cu departamentul specificat, subiect și mesaj.

Trimite email

Trimite un e-mail cu șablon personalizat.

Actualizează înregistrarea

Actualizează un client, bilet sau dosar CRM.

Acţiune conector de funcţionare

Execută o acțiune înregistrată de la un conector activat cu permisiunea și regulile sale de confirmare a conectorului.

Fugi! OpsIQ Generalități API acţiune

Caută catalogul complet numit General API. Câmpuri, lunete, permisiuni, confirmare, idepotență și suport pentru sert-run provin din contractul de acțiune live; fluxul de lucru execută în interiorul spațiului său de lucru salvat și contextul administrator.

Trimite furnizorul-nativ API cerere

Utilizați un conector nativ API Citește sau confirmat nativ API Scrieți acțiunea atunci când obiectivul furnizorului nu are nicio acțiune curatată. Credențialele rămân în interiorul conectorului și sunt acceptate doar căi relative de furnizor.

Constructorul de acțiuni și declanșatoare, /api/v1.php, OpenAPI și Postman Utilizați același ActionContractRegistry, astfel încât o acțiune selectabilă să nu poată deriva din documentația runtime.
Dezvoltator

Declanşează cartea de bucate

Rețete gata de utilizare pentru declanșarea automatizărilor comune.

Cum funcţionează
Declanşează cartea de bucateUn flux de rețetă: un uptime. down webhook trece un filtru de producție, apoi fanii afară pentru a crea un bilet urgent și să notifice Slack.uptime.downMonitor webhookdacă prodfilterCreează un bilet urgentAnunță Slack #ops
Declanşează cartea de bucate

Auto-creare bilet de monitorizare

Scenariu:
Sistemul de monitorizare trimite Post atunci când serverul se duce în jos.
Ce este de făcut:

Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket · Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent

Slack notificare la comenzi mari

Scenariu:
Slack mesaj de fiecare dată când un client plasează o comandă peste $100.
Ce este de făcut:

Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details

E-mailuri digerate săptămânal

Scenariu:
E-mail rezumat la management în fiecare luni, la ora 9:00.
Ce este de făcut:

Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API

Bilete vechi de scalat

Scenariu:
Dacă un bilet nu are răspuns pentru ore 24, atribuie echipei de plumb.
Ce este de făcut:

Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note

Dezvoltator

Construirea primei tale acţiuni

Acest pas prin creează o acțiune simplă conector de la zero.

Acțiuni de construcție
Construirea unei acțiuniUn formular de definiție a acțiunii: name lookup_order, o cerere GET la /orders/{id}, un parametru id tastat și o trecere 200 Test.Acțiune nouăspațiu de lucruAcțiune nouăNumelookup_orderCerereGET/orders/{id}Parameleid · șir200 · comandă găsită1DEFINEDenumire, metodă, obiectiv2PARAMSIdentificați intrările3ÎNCERCARELive 200 rezultat
Construi o acțiune de la zero. Numiți-l, setați metoda și obiectivul, declara parame tastate, și testați-l la un live 200_.

Două tipuri de acţiune

Înainte de a începe, decideţi care dintre ele aveţi nevoie. Ambele sunt configurate în acelaşi ecran.

Apelați un API

Acțiunea trimite o cerere HTTP pe platforma dumneavoastră. Alegeți acest lucru atunci când OpsIQ trebuie să ajungă şi de a face ceva pe partea ta.

Rulează o acțiune conector

Acţiunea rulează ceva ce un conector instalat deja oferă. Alege acest lucru atunci când munca este deja disponibilă şi vrei doar să-l declanşeze. Tu alegi acţiunea conectorului dintr-o listă, astfel încât nu există nimic pentru a sârmă în sus.

A doua opțiune este cum refolosiți tot ce pot face deja conectorii dvs. fără a construi din nou oricare dintre ele: citiți un fir de bilet, căutați în sus un client, importați contacte și așa mai departe. Alegeți acțiunea conectorului din dropdown și sunteți gata.
1
Planifică acțiunea

Exemplu: "Lookup_product." Caută un produs după nume, preț de returnare, stoc și descriere.

2
Defineşte în acţiuni.json

Adaugă definiția acțiunii:

acţiuni.json — forma reala manifest
{
  "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" }
      ]
    }
  ]
}
⚠️
Trei lucruri care fac o acțiune nu reușesc să se înregistreze la toate. acţiune_id este REquiRED și trebuie să fie2la100caractere de litere mici, cifre și reliefuri . O intrare fără unul este respins pe deplin. Manifestul este un obiect cu o "acțiuni" LISTA, nu o hartă tastată prin nume de acțiune. Și cartografierea răspunsului este "returnări" cu trasee DOTTED (date.id), nu JSONPath ($.data.id)
3
Încercarea cu rularea în stare uscată

În etapa de revizuire Connector Constructor, apăsați Run uscat. Acesta rulează lista completă de conformitate cu pachetul și, atunci când ați furnizat acreditări, face un test real de conectare. Nu utilizează date de probă.

4
Verificați utilizarea AI

Întreabă admin AI: "Uite în sus produs Widget Pro." AI ar trebui să găsească și să execute acțiunea.

⚠️
Adăugând o acțiune la acțiuni.jsonNU crează o rută AJAX, deci nu este nimic de regenerat. Acţiunile Conectorului sunt sincronizate înOpsIQatunci când conectorul este activat sau setările sale sunt salvate: re-salvați conectorului și apare noua acțiune. instrumente/gen_route_registry.php acoperă expedierea admin AJAX și nu are niciun efect asupra acțiunilor conectorilor.
Dezvoltator

Obiectivele de evaluare a evenimentelor legate de intrare

Criteriile de intrare acceptă semnătura JSON dintr-un alt sistem și transformă-l în activitate de contact deduplicată care poate alimenta cronologia, notarea și fluxurile de lucru.

Ecran produs
Obiectivele finale de intrareFiecare sursă de intrare are propria sa URL, secretă, cartografiere și rezultat recent al activității.Obiectivele finale de intrarespațiu de lucruSURSE5ACCEPTED12.4kREJECTED18VIE VIU AIRPACEPlatforma de facturareevenimente de abonamentSănătosAplicație produsevenimente de înscriere și utilizareSănătosID-ul evenimentuluiprovider_event_idDeduplicareSemnăturaX-OpsIQ-Inbound-SignatureHMAC1CREATE SOURCEURL și secret2MAP PAYLOADE-mail, eveniment și ID3VERIFICAȚIHMAC apoi ingerează
Fiecare sursă de intrare are propria sa URL, secretă, cartografiere și rezultat recent al activității.

Creați o sursă pentru fiecare sistem de trimitere. OpsIQ generează o URL/token şi secret. JSON cu Content-Type: application/json și să semneze corpul brut exact folosind HMAC-SHA256:

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

Harta JSON căi pentru e-mailul de contact, numele evenimentului și ID-ul opțional al evenimentului. ID- ul evenimentului este cheia preferată a deducției. Activitatea acceptată intră în cronologia de contact și poate afecta punctajul plumbului, segmentele, regulile ciclului de viață și fluxurile de lucru.

Refuză semnăturile invalide înainte de a analiza datele de afaceri. Rotește un secret prin actualizarea ambelor părți într-o fereastră controlată; nu loga secretul.

Dezvoltator

Operațiuni de webhook în afara zonei

Administraţia webhook outbound creează abonamente semnate, teste finale şi monitorizează livrarea asincronă şi retry health.

Ecran produs
Cârlige web de ieșirePagina web afişată în afara paginii lista obiectivelor HTTPS, abonamente la evenimente, sănătate de livrare şi un test semnat cu un singur clic.Cârlige web de ieșirespațiu de lucruENDPOINTS7SUCCESS99.2%RETRAGEREA4VIE VIU AIRPACEOglindă CRMContact.* şi afacere.*SănătosAutobuz de sprijinBiletul.* şi discuţia.*SănătosDepozit de date*RetriereLivrarea testuluiÎncărcătură utilă a eșantionului semnatăGata.1SUBSCRIBEHTTPS URL și evenimente2AUTHENTICATESemnătura HMAC3OBSERVEFeroviar și retries de livrare
Pagina web afişată în afara paginii lista obiectivelor HTTPS, abonamente la evenimente, sănătate de livrare şi un test semnat cu un singur clic.

Administratorii complet crea un obiectiv HTTPS, alege evenimente specifice sau wildcard, stoca secretul în condiții de siguranță și trimiteți un test.OpsIQsemnează sarcina utilă brută cu HMAC-SHA256:

X-OpsIQ-Signature: sha256=<hex hmac>

Verificați semnătura înainte de deserializarea sau acțiunea. Livrarea este asincronă și rejudecată automat după aproximativ 1minut, 5 minute; 30 minute;2ore şi 12 ore. Utilizați calea ferată de livrare recent pentru a inspecta starea, codul de răspuns și numărul încercărilor.

Receptorul trebuie să fie idepotent deoarece orice sistem asincronic poate retransmite. Returnați un răspuns 2xx numai după acceptarea durabilă.

Dezvoltator

Webhook-uri

Cârligele web lasă sistemele externe să anunţe OpsIQ când se întâmplă ceva,OpsIQ să notifice sistemele externe atunci când se întâmplă ceva intern (extern).

Webhook-uri
Cârlige web de ieșireEcranul de propoziții web: un tabel cu criterii de evaluare cu nume, evenimente subscrise, puncte recente privind starea livrării și un buton de încercare a trimiterilor.Cârlige web de ieșirespațiu de lucruPuncte finale+ Salvează obiectivul finalNUMELEEVENIMENTEDEVIERISlack #sales-alerts - Aplicații Androidhttps://hooks.slack.com/…crm.deal.won, ordineTestOglindă CRMhttps://api.acme.com/hookcontact.*, ticket. createdTestZapierhttps://hooks.zapier.com/…chat.startedTest1ENDPOINTSNume, evenimente, URL2SIGNEDHMAC + rejudecată automată3SEND TESTVerificați livrările
Ecranul real de pe outbound-webhooks: fiecare criteriu cu evenimentele sale, sănătatea de livrare recentă și un test de trimitere, semnat și retried.

Cârlige web de ieșire

Abonaţi

Du-te la Setări > Cârlige Web. Adăugați un obiectiv URL și selectați evenimente pentru a primi.

Evenimente

Abonare la evenimente specifice, sau ["*"] pentru tot. Lista completă pentru instalarea dumneavoastră este mai jos, și webhooks.events.list returnează-l ca JSON.

Retririe

Livrări eșuate retry cu exponențial de rezervă. După 15 eșecuri consecutive, obiectivul este dezactivat automat.

Semnare

Fiecare livrare este semnată. X-OpsIQ-Signature carries v2=<hex>, și sirul de caractere semnat este version.timestamp.delivery_id.body Nu numai corpul. Verificați întotdeauna, și să reconstruiască întotdeauna sir exact. Vezi exemplele de mai jos.

Protecția SSRF

OpsIQ nu va trimite la privat/intern IPs (127.x, 10.x, 172.16.x, 192.168.x, 169.254.169.254).

Livrarea Async

Webhooks sunt livrate prin coada de locuri de muncă, nu blocarea OpsIQ operaţiuni.

ID-ul evenimentului stabil

Fiecare eveniment are un eveniment unic_id care rămâne același peste retries pentru deduplicare.

Ce ajunge cu fiecare livrare

X-OpsIQ-Event

Numele evenimentului, de exemplu ticket.created.

X-OpsIQ-Delivery

Id de livrare. Acesta rămâne la fel pe toate retries

X-OpsIQ-Timestamp

Unix secunde la ora de semnare.

X-OpsIQ-Signature

Semnătura ca v2=<hex>Împărţit pe =: partea stângă este versiunea, partea dreaptă este valoarea pe care o comparați.

X-OpsIQ-Signature-Version

Sistemul în curs de utilizare, în prezent v2. Citeste-l de pe antet mai degrabă decât greu codare, și codul continuă să funcționeze în cazul în care un v3 este vreodată adăugat.

⚠️
Sirul semnat este version.timestamp.delivery_id.body, nu corpul brut pe cont propriu. Hashing numai organismul este singurul motiv cel mai comun o verificare eșuează

Verificarea unei livrări

PHP · verifică un OpsIQ webhook
<?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 · verifică 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 });
});

Fiecare eveniment pe care îl poate trimite această instalare

Generate din clădirea de rulare, astfel încât să se potrivească întotdeauna versiunea pe care sunteți.

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 returnează această listă cu JSON, astfel încât codul nu trebuie să-l hard cod.

analiză (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.

comerț (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.

e-mail (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.

plată (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.

securitate (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.

bilet (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.

Cum testez site-uri web la nivel local?+

Utilizați ngrok pentru a expune serverul local. Setați obiectivul webhook la Ngrok URL.

Dacă obiectivul meu e temporar scăzut?+

OpsIQ Dacă obiectivul final se recuperează în interiorul ferestrei de rejudecare, nu se pierd evenimente.

Dezvoltator

Chei API

API cheile autentifică cererile la OpsIQ RESTAURANT API Fiecare cheie are permisiuni.

Chei API
Chei APIEcranul de taste API: un panou de emisiune cu nivel de acces și cipuri de domeniu, alături de o listă a cheilor mascate existente cu butoane revocabile.Chei APIspațiu de lucruEmite o cheieAccesNumai citireLimitatDomeniul de aplicarecontacts.readtickets.readevents.writeEmite cheiaCheile tale.Integrarea Zapieropq_••••4f2aRevocareAplicație mobilăopq_••••91c7RevocareExportul de analizăopq_••••2db0Revocare1SCOPEDNumai citire sau restricționate2PER-ACTIONAlegeţi domeniul de aplicare exact3REVOCABLERotește oricând
Ecranul real API taste: emite o cheie de acces, numai-citire sau restricționată prin alegerea unor domenii exacte și revocă orice cheie oricând.

Crearea unui API cheie

1
Setări > API Chei

Navighează la API management cheie.

2
Faceți clic pe crea tasta

Dă-i un nume descriptiv.

3
Alegeți domeniul de aplicare

Da cheia doar ceea ce are nevoie. Domeniul de aplicare vin în citiți și scrie perechi pe zonă, astfel încât o integrare raportare poate fi acordată citește și nimic altceva.

Domeniul de aplicare disponibil

Alege cel mai îngust set care face treaba. admin satisface toate domeniile de aplicare de mai jos, astfel încât să-l utilizați numai atunci când aveți nevoie cu adevărat acces larg.

crm. read / crm. write

Contacte, companii, oferte, activități, segmente, de informare, conversii, ciclu de viață și CRM webhooks.

tickets. read / ticket. write

Lista și citit biletele și mesajele lor; răspunde, actualizează, deschide și rulează operațiuni în vrac coadă.

conversații. read / conversations. write

Citiți live-chat conversații și istoricul mesajelor; trimite mesaje, atribuie și schimba statutul.

kb. read / kb scriere

Intrările de bază ale cunoştinţelor.

chat. read / chate. write

Șabloane de răspuns salvate.

connectors.read

Vezi ce conectori sunt instalate, ce pot face şi să-şi testeze acreditările.

automations.read

Vezi acţiunile tale, declanşările şi istoricul lor.

departments.read

Departamente disponibile pentru rutare.

notifications.read

Notificări pentru un operator numit.

analytics.read

Raportează secțiuni, CSV exporturi și definiții programate ale raportului.

site_intelligence.read

Site-uri monitorizate și rapoartele SEO lor.

files.read

Linkuri de descărcare semnate pentru atașamente.

status.write

Componentele paginii de stare și incidente.

scriere

Asistenţi de scriere AI: proiectare, sinteză, traducere, rescrie, compune, analiza.

admin

Totul, inclusiv un număr mic de acțiuni sensibile care în mod deliberat nu pot fi accesate prin orice domeniu restrâns: ștergerea unui contact, schimbarea setărilor de confidențialitate și citirea jurnalului de acces.

💡
Apelați meta. acțiuni cu cheia pentru a vedea exact ce acțiuni se poate rula pe instalația dumneavoastră. Asta este întotdeauna mai fiabil decât lucrul de pe o listă.

Niveluri de acces

Toate

Cheia poate numi orice permite domeniul său de aplicare.

Numai citire

Fiecare scriere este refuzata, indiferent de domeniul de aplicare spune. Cea mai sigura alegere pentru raportare, borduri si orice altceva care nu ar trebui sa schimbe datele.

Limitat

Enumeraţi acţiunile exacte pe care le poate apela cheia. Orice altceva este refuzat, chiar şi într-un domeniu de aplicare permis.

4
Copiază cheia

Afişat o dată. Începe cu "opq_" depozitează-l în siguranţă.

🚫
Niciodată să nu împarţi API chei în codul public, client-side JavaScript, sau controlul versiunii. Utilizați variabile de mediu.
Dezvoltator

Conectează site-ul tău

ă OpsIQ widget este un JavaScript fragment adăugați pe site-ul dvs. pentru urmărire, AI chat, crearea de bilete și identificarea clienților.

Cum funcţionează
Conectează site-ul tăuUn script de o linie pe stânga și, pe dreapta, o pagină web cu OpsIQ Bubble chat apare în colț.<!-- paste before </body> --><script src="https://cdn.opsiq.io/w.js" data-site="ws_8a2f" async></script>
Conectează site-ul tău

Instalare de bază

Fragment de bază pentru widget
<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.

Atribuții de configurare

data-site-key

Necesar. Cheia site-ului dvs. de la Site-uri conectate.

data-mode

Opțional. "chat" (default), "tichete" sau "ambele."

data-position

Opțional. "jos-drept" (default) sau "josit-stanga."

data-color

Cod hex de culoare primară.

data-greeting

Mesaj de salut iniţial.

data-language

Opţional. Limbajul UI: "en," "es," "fr," "de," "pt", "ar" etc.

data-identity-token

Token de identitate semnată generat de server.

Suport SPA

Urmărirea manuală a traseului 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,
}]);

Reguli CSP

Reguli CSP pentru widget
script-src 'self' https://your-opsiq-domain.com;
connect-src 'self' https://your-opsiq-domain.com;
frame-src https://your-opsiq-domain.com;
Are widget încetini site-ul meu?+

Nu. Sub 15 KB gzipped, încarcă asinc după conținutul paginii.

Pot personaliza aspectul?+

Utilizați culoarea de date pentru culoarea primară. Suport de contact pentru opțiunile CSS suprascrie.

Dezvoltator

Rețete de instalare a widget-ului

Ghiduri de instalare specifice platformei.

Cum funcţionează
Rețete de instalare a widget-uluiPlatformă de instalare carduri pentru WordPress, Shopify şi Google Tag Manager, fiecare spunând în cazul în care pentru a adăuga widget.WPWordPressInstalează modulul, introduceCheia site-ului, salva.MagazinShopifyLipeşte fragmentul întemă.lichid înainte /body.GTMAdministrator tagPersonalizat HTML tag, toate paginile.
Instalează rețete

WordPress

Scenariu:
Adaugă la toate paginile unui site WordPress.
Ce este de făcut:

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

Scenariu:
Adaugă la Shopify magazin.
Ce este de făcut:

Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.

React / Next. js

Scenariu:
Adaugă la o aplicație React sau Next. js.
Ce este de făcut:

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

Scenariu:
Adaugă la WHMCS zona client.
Ce este de făcut:

Setare > Setări generale > Altele > Conţinutul Global Footer. Lipiţi fragmentul. Sau editaţi foster- ul şablonului. tpl.

Google Tag Manager

Scenariu:
Adaugă prin GTM.
Ce este de făcut:

Creați personalizat HTML tag, lipește fragmentul. Trigger: Toate paginile. Publish.

Dezvoltator

widget admin în backend (un contract, orice platformă)

Încorporează OpsIQ admin asistent bază de date admin, ticket inbox și AI Writing în interiorul propria platformă panoul administrativ, astfel încât echipa ta nu lasă niciodată instrumentele lor. Ca identitatea vizitatorilor și portal SSO, Acesta este un contract generic implementat în ~15 linii ale codului serverului platformei dvs Zendesk, Intercom şi utilizarea discursului pentru SSO. Nu există nici un plugin per-platform pentru a aștepta: orice stiva care poate calcula o HMAC Pot face asta azi.

Pasul 1

De la Site-uri la distanță→site-ul→Coduri, copiați linia de încărcare și adăugați-o la paginile panoului admin (includeți, șablonul de aspect sau o casetă custom-JS numai pentru administrator):

Linia unică înglobată
<script async src="https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=SITE_KEY&identity_token=TOKEN_FROM_STEP_2"></script>

Pas2Spune-iOpsIQcare este autentificat (semnat de un serv)

Doar aplicaţia ta ştie ce administrator este semnat în

PHP · semneaza identitatea admin din sesiunea dumneavoastra
<?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.
Acces pe administrator automat

Fiecare admin care se loghează în platforma ta este egalat individual:OpsIQPoarta de acces per admin rezolvă numele de utilizator al jetonului + e-mail împotriva unuiaOpsIQagent (Pagină de echipă; utilizaţi lista agentului "match e-mailuri" atunci când platforma email-uri diferă) şi aplicaţi spaţiu de lucru, departament şi inbox permisiuni. nou membru al personalului = adăugaţi agentul înOpsIQ; nicio modificare înglobată.

Rolurile merg de-a lungul

Oricare ar fi rolul string platforma ta trimite este afișat peOpsIQpartea pentru atribuirea; autorizația vine întotdeauna de laOpsIQÎnregistrare agent, niciodată de la rolul afirmat.

De ce nu ne-ai citit cookie-ul de conectare?

Browser-ul nu trimite niciodată cookie admin la o altă origine

Nu există mod partajat pe site-ul dvs.

Off the OpsIQ gazdă nu există nici un mod nesemnat sau partajat-login: încărcătorul rămâne ascuns până când ajunge un simbol de admin semnat.... valoarea în Încărcător Coduri este o cheie widget care identifică doar site-ul; nu poate semna pe nimeni inch

- Nu. authenticated pavilion

Acest steag este afirmaţia serverului dvs. că un om este cu adevărat conectat, şi OpsIQ refuză orice jeton fără ea. "authenticated" => true beside site_key/iat/exp, NU numai în interiorul admin obiect. curent OpsIQ acceptă în oricare poziție, dar mai vechi lansări citiți doar nivelul de sus și eșecul este înșelătoare: lista conversație, istorie și necitite toate autentifica bine în timp ce fiecare chat rândul său, răspunsuri "Admin login necesar"Dacă vezi exact acea ruptură, verifică steagul mai întâi.

Igienă jetoane

Autentifică-te doar pe server, niciodată în browserJavaScript. Păstrați scurt Exp (ministre la ore);OpsIQrespinge jetoanele expirate și viitoare, iar semnătura leagă semnul de tasta site-ului.

Implementarea de referință

ăWHMCSmodul face acest lucru automat de laWHMCSsesiune admin; conectorul Botble hotelului bridge fişier nu-l din sesiunea Laravel (op=admin_identity). Ambele sunt doar acest contract în dialect platforma lor de copiere care citește cel mai apropiat stivă.

Cablajul paginii zero (sonda declarată prin conectare)

CândOpsIQconectorul stochează obiectivul de identitate în admin_identity_probe_url setarea, linia de încărcare PLAIN este tot ce admin pagini nevoie: widget descoperă sonda de la conector, o numește cu tasta site-ul + jeton widdget, și autentifică fiecare admin automat. Pagina poate suprascrie încă cu un data-identity-endpoint atribut sau window.OpsIQAdminIdentityEndpoint.

💡
Secretul de semnare este completat pentru tine. În Site-uri Remote, site-ul dvs., Coduri, Opţiune 3, Conectaţi-vă în personalul dumneavoastră, fiecare exemplu conţine deja propriul secret al acestui site, astfel încât codul funcţionează ca lipit: nu există nimic de copiat sau configurat. Exemplele din acest spectacol pagină opsiq_whsec_YOUR_SITE_SECRET Fiecare exemplu îl caută. OPSIQ_SITE_SECRET (sau propria setare a cadrului, numită în notele sale) pe server mai întâi și folosește că atunci când este setat, astfel încât să puteți muta secretul din fișier ori de câte ori doriți, de exemplu, pentru a-l roti fără cod de editare. Fie modul în care fișierul rulează doar pe server: nu lipi într-o pagină web sau browser JavaScript, și niciodată nu-l angajeze într-un depozit public, pentru că oricine deține secretul poate semna în ca oricare dintre clienții sau personalul dumneavoastră. WHMCS şi Botble să nu fie nevoie de nimic din toate acestea: WHMCS cârligul ajunge cu secretul completat în, și Botble Panou conector umple în pod.

Cod complet, platformă după platformă

Fiecare exemplu printează eticheta Admin Chat numai pentru un membru al personalului semnat, cu semnul semnat adăugat, și răspunde la reîmprospătarea widget-ului (?opsiq_identity_refresh=1&role=admin) cu {"success":true,"identity_token":"…"} sau 401. Site-uri de la distanță, site-ul dvs., Coduri, Opțiune 3, Semnați în personalul dumneavoastră amprentează același cod cu tasta site-ului și secrete completate.

⚠️
Token-ul admin este forma din două părți: baza64url (payload), un punct, apoi hex HMAC-SHA256 din acel text de bază64url. Acesta nu este un JWT, și un JwT este refuzat. Admin obiect are nevoie de id și e-mail, iar Exp trebuie să fie în interiorul 24 ore.

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>`)
}

Punerea în aplicare a obiectivului de identitate privind Laravel (note câștigătoare)

Dacă platforma dumneavoastră este Laravel (Botble, Bagisto, aplicații personalizate) și obiectivul dvs. este un fișier independent care cizme cadrul pentru a citi admin logat-in, trei specificuri vă va salva ore

Legaţi cererea ÎNAINTE de a prinde bootstrap

Furnizorii dumneavoastră de servicii pot rezolva request din container în timpul boot-ului. propriul ciclu de viață Laravel leagă cererea capturat primul lucru înăuntru Kernel::handle() În oglindă ordinea: $app->instance('request', Request::capture()) Înainte $kernel->bootstrap(), sau te "Clasa țintă [cerere] nu există".

Prefixul pentru prăjituri este:HMAC- Keyed

Prefixele moderne ale plăcii Laravel prefixează valorile cookie cu o HMAC calculate CU CHEIE APP (CookieValuePrefix) — o suprafață plană sha1(name."v2") Nu se potriveşte niciodată. CookieValuePrefix::validate($name, $decrypted, $keys), cu o rezervă structurală (40 hex chars + | pe poziţie40) Tell: a session id than40chars (81= prefix încă atașat) și o sesiune care se încarcă numai cu _token În ea.

Unde locuieste loginul

Ştampila auth este login_<guard>_<sha1(guard class)> Pentru garda web implicită: 'login_web_' . sha1(Illuminate\Auth\SessionGuard::class)Scanează orice. login_* Cheia numerică ca rezervă pentru gărzile personalizate.

Depanează ca podul.

Navă a debug=1 modul care denumeste EPISOD-ul defect si exceptia ? Un orb prinde-toate a facut o implementare live nediagnosticabila. Podul Botble (din v1.0.7_) este referinta: markeri pas la nucleu/bind/bootstrap/decrypt/session/auth/db.

Laravel · obiectiv complet de identitate (copie, setați cele două constante, făcut)
<?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]);
}

Același obiectiv pe alte stive

Doar "cine este logat în?" se schimbă linia ? Blocul de semnare este identic peste tot. Semnează pe server, niciodată înJavaScript.

WordPress · WHMCS· Symfony · PHP simplu
<?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]);

Atunci când nu funcționează

Widget nu apare niciodată, consola spune "semnul de identitate admin este necesar"

Criteriul final de evaluare a fost nu identity_token. Deschideți obiectivul URL direct în browserul admin logat cu &debug=1 Pe Laravel acesta este aproape întotdeauna elementul de cerere-obligatoriu sau cookie-prefix mai sus.

Istoria şi conversaţiile funcţionează, dar fiecare turn de chat spune "Admin login necesar"

Clasic de divizare. jetonul este lipsește TOP-LEVEL authenticated pavilion bază widget-ul lui acceptă jetonul, verificator comun în spatele fluxului de chat refuză. "authenticated" => true beside exp.

"admin neprevăzut în OpsIQ" (HTTP 401)

Token-ul verificat, dar numele de utilizator + e-mail meci nr OpsIQ Adăugaţi agentul OpsIQ → Echipa, sau adăugați e-mail platforma la lista de meciuri agent atunci când diferă de lor OpsIQ E-mail.

Totul 403s din browser dar funcționează cu bucle

Un zbor înainte de CORS respinge unul dintre antetele dumneavoastră cerere. OPTIONS și ecou originea solicitantă, sau pur și simplu evita antetele personalizate

A funcţionat ieri, nu azi.

Verificat exp: jetoanele sunt scurte de proiectare. Widget re-sonde automat, astfel încât aceasta înseamnă, de obicei, că obiectivul a încetat să mai vadă sesiunea

💡
widget-ul admin redă ascunse până la identificarea rezolvă, și fiecare chat/inbox / apel de date este aplicat server-side împotriva potrivireOpsIQAgent indiferent de orice pagină afirmă. Tokenul deschide UI; permisiuni vin întotdeauna de laOpsIQ.
Dezvoltator

Identitatea vizitatorilor

Identitatea conectează vizitatori anonimi la clienţi cunoscuţi OpsIQ link-uri de navigare istorie, chat-uri, și bilete la profilul clientului.

Cum funcţionează
Identitatea vizitatorilorUn flux: un utilizator se loghează pe site-ul dvs., emiteţi un semn de identitate semnat şi OpsIQ unifică sesiunile lor, chat-urile şi biletele într-un singur profil.Jurnalele utilizatoruluipe site-ul dvs.SemnatIDENTIUNE_TOken (HMAC)Un singur profilsessions+ chat-uri+ bilete
Identitatea vizitatorilor

Două nivele de identitate, şi când fiecare este suficient

Nivel 1

Spune-i widgetului cine este vizitator cu o simplăJavaScriptobiect. Acesta completează e-mail și ID client pe jurnalul vizitatorilor, astfel încât tabloul de bord arată semnat în trafic și sesiuni se alăture. Este un HINT: oricine poate edita în browser-ul lor, așa căOpsIQnu emite niciodată date de cont despre puterea ei.

Nivel 2

Serverul dumneavoastră semnează un jeton de scurtă durată cu site-ul webhook secret. OpsIQ verifică semnătura și numai atunci tratează persoana ca pe un client dovedit. Acesta este nivelul care debloca răspunsurile contului în chat-uri clienți și cauta conectori. Utilizați-l pentru orice străin nu trebuie să vadă.

⚠️
Nivel1este o comoditate de afișare. nivel2este autentificare. Dacă o întrebare poate fi răspuns doar pentru titularul real de cont, aveți nevoie de nivel2.
💡
Nu trebuie să scrie nivel 2 manual: Site-uri la distanță → site-ul → Coduri → C. Clienții înregistrați generează codul de semnare și handler-ul de reîmprospătare pentru PHP; WordPress, Laravel, Node.js, Python, Django, .NET, Rails, Java and Go WHMCS cârlig și Botble podul conectorului deja semnează clienţii. Identitatea spune cine este clientul; comenzile sau rezervările lor ajung la chat printr-un conector (cu un fişier pod numai atunci când platforma nu are API).

Nivel 1

Setați obiectul ÎNAINTE de scriptul widget, sau identificați apelul () mai târziu după ce aplicația dumneavoastră știe cine este semnat în. Ambele formulare sunt citite; utilizați oricare dintre acestea se potrivește paginii dvs..

JavaScript· cele doua forme acceptate
<!-- 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.

Nivel 2

Exact același contract simbolic ca widget admin, cu un customer subiect în loc de admin unul. Semnați pe serverul dvs. și dați-l widgetului. Două detalii decid dacă verifică, și ambele sunt ușor de înțeles greșit:

ă HMAC acoperă șirul BASE64URL, nuJSON

Semnează $payload64, nu $payload. Semnarea brut JSON produce un simbol care arata bine si este respins de fiecare data cu o nepotrivire semnatura.

bază64url, necăptușit

Tradu +/ la -_ şi să dezbrace = Padding. Baza de bază simplă64 se întâmplă să supraviețuiască astăzi; baza64url este contractul și este ceea ce fiecare OpsIQ verificator și conector de referință emite.

Autentificat merge la nivelul TOP

În afară de site_key, iat şi exp. Este afirmația dumneavoastră că un om real este conectat în, și OpsIQ refuză jetonul fără ea.

client. id este obligatoriu

Un jeton care transportă doar un e-mail verifică ca o semnătură și apoi este scăzut în tăcere. Trimite întotdeauna un ID.

Ţine-l scurt.

Semnul e o afirmaţie a şedinţei, nu un certificat de stocat.

PHP - semneaza un simbol de identitate al clientului (acest cod verifica exact)
<?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>';
🚫
Semnează numai pe server. Un jeton mentat în browser JavaScript inseamna ca trimite site-ul secret pentru fiecare vizitator, care le da oricui capacitatea de a se preface orice client.

Acelaşi contract, trei suprafeţe.

Conversaţii cu clienţii pe site-ul dumneavoastră

subiect client, trecut ca identity_token la widget. php. Acoperit mai sus. Opțional: cu fragment A și un conector chat verifică deja clienții în sine (o rezervare sau numărul de ordine cu dovada, sau un cod trimis prin e-mail înainte de o comandă). Site-uri distanță, coduri, C generează codul pentru recunoașterea automată a clienților deja autentificate pe site-ul dvs..

Admin chat în interiorul suportului

admin subiect, trecut la opsiq/embed/admin_widget. php. Acelaşi signer, tasta subiect diferit. Vezi "Admin widget în spate."

Sprijiniţi portalul de legături profunde

O variantă mai strictă: aceleași afirmații plus jti și single_use:true, and a120- A doua viaţă, pentru că semnul călătoreşte într-oURLși trebuie să fie cheltuibile o dată. Nu-l mână rola. Setări, Suport Portal are un fragment gata pentru limba ta, iar platforma menteaza-l pentru tine atunci când zona contului ruleaza pe acest server.

Dacă un vizitator eliberează prăjiturile?+

Ei devin anonimi până când sunt identificaţi din nou. OpsIQ leagă noua înregistrare anonimă de profilul clientului în momentul în care apare un indiciu sau un jeton.

De ce token-ul meu verifică pentru registrul vizitatorilor, dar nu pentru întrebări de cont?+

Acesta este nivelul1/ Nivel2Un indiciu nesemnat completează jurnalul vizitatorilor și nimic altceva. Răspunsurile contului au nevoie de o semnătură verificată.

Dezvoltator

Semnare portal: cod pentru fiecare platformă

Trimite un client care este deja semnat în aplicația dvs. direct în portalul de sprijin, semnat în, fără a doua parolă. Această pagină explică modul în care funcționează handoff-ul, fiecare cerere din jeton, configurarea, și o rută completă pentru fiecare platformă. Setări, Suport Portal printează același cod cu adresa portalului propriu și tasta spațiu de lucru completat.

Cum funcţionează

1
Clientul face click pe Suport în aplicația dumneavoastră

Punctele de legătură pe o rută mică de pe serverul TĂU, de exemplu /support-portal. Niciodată la un link care conține deja un jeton: un simbol într-o pagină se scurge prin sursa paginii, istoricul browserului și antetul Referer.

2
Ruta verifică cine este semnat în

Se citeşte clientul din propria sesiune. Un vizitator care nu este semnat este trimis la login-ul dumneavoastră mai întâi şi se întoarce pe traseu după aceea.

3
Traseul semnează un semn o singură dată

Un standard HS256 JWT semnat cu acest spaţiu de lucru's signing secret, care numai serverul dvs. deţine. Expiră după 120 secunde şi poate fi folosit o dată.

4
Traseul redirecţionează către portal

La pagina portalului clientul a venit de la atunci când portalul cerut pentru unul (opsiq_portal_return, acceptat numai în interiorul adresei portal), altfel portalul acasă. Răspunsul poartă Sesser-Policy: nu-referer și Cache-Control: no-store.

5
Portalul verifică și semnează clientul în

Semnătura, cheia de lucru spaţiul, expirarea şi ID-ul unic sunt verificate. Clientul este găsit sau creat prin e-mail şi cererile lor existente sunt potrivite cu ele.

În acest caz, se poate concluziona că nu există nicio dovadă de lipsă a capacității de producție.

site_key

Cheia ta de spaţiu de lucru, un simbol făcut pentru alt spaţiu este refuzat chiar şi atunci când este semnat corect.

iat / exp

Emisie la și de expirare, în câteva secunde. Jetonul portalului trăiește 120 secunde: trebuie doar să supraviețuiască unei singure redirecționări.

autentificat: adevărat

Declaraţia aplicaţiei dvs. că a semnat cu adevărat această persoană în. Necesar, la nivel superior.

jti + single_use: Adevărat

O identificare aleatorie şi un steag unic. Aceeaşi legătură nu poate fi folosită de două ori.

platforma

O etichetă gratuită pentru locul de unde a venit clientul (php, wordpress, whmcs...). Afisat in profilul clientului.

client. id și client. email

Ambele necesare. Id-ul este propriul client al aplicației; e-mailul este modul în care portalul găsește clientul și se potrivește cu cererile lor.

client. name / external_id

Numele de afișare opțional, și id OpsIQ magazine pe platforma ta.

Configurare

1
Copiază ruta

Setări, suport Portal, fără sudură semn-in din aplicația ta. Alege ce aplicație ruleaza pe; codul de mai jos lista are adresa portalului și tasta spațiu de lucru completat, cu note numerotate pentru acea platformă.

2
Secretul este deja în cod

Traseul copiat conţine secretul de semnare al acestui spaţiu de lucru, aşa că funcţionează ca lipit OPSIQ_SITE_SECRET (sau setarea cadrului dumneavoastră) pe server în schimb: această valoare este utilizată mai întâi. Nu puneți niciodată traseul într-o pagină, JavaScript, o aplicație mobilă sau un depozit public: oricine deține secretul poate semna ca orice client.

3
Link butonul de sprijin la traseu

De exemplu https://your-app.com/support-portal.

4
Faceți ca butonul de conectare al portalului să utilizeze aplicația dvs.

Portal Studio, Sign-in page, Foloseste loginul site-ului meu, Pagina ta de autentificare URL: Setează-l pe aceeaşi rută opsiq_portal_return de la sine și ruta aduce clientul înapoi la acea pagină, semnat în.

5
Opţional: semnaţi peste tot

Setări, portal de sprijin, Semnați peste tot: sign-out aplicația dvs. URL, astfel încât semnarea din portalul semnează, de asemenea, clientul din aplicația dumneavoastră.

6
Test

Generați un link de testare semnat pe aceeași pagină setări pentru a verifica numai partea portalului, apoi deschideți traseul în timp ce semnat la aplicația.

WHMCS nu are nevoie de cod: WHMCS cârlig de la Site-uri Remote deja semne clienti in portal si le aduce inapoi la pagina au fost pe.
💡
Secretul de semnare este completat pentru tine. În Setări, Suport Portal, Semnare fără sudură din aplicația dumneavoastră, fiecare exemplu conține deja propriul secret al acestui site, astfel încât codul funcționează ca lipit: nu există nimic de copiat sau configurat. Exemplele din această pagină arată opsiq_whsec_YOUR_SITE_SECRET Fiecare exemplu îl caută. OPSIQ_SITE_SECRET (sau propria setare a cadrului, numită în notele sale) pe server mai întâi și folosește că atunci când este setat, astfel încât să puteți muta secretul din fișier ori de câte ori doriți, de exemplu, pentru a-l roti fără cod de editare. Fie modul în care fișierul rulează doar pe server: nu lipi într-o pagină web sau browser JavaScript, și niciodată nu-l angajeze într-un depozit public, pentru că oricine deține secretul poate semna în ca oricare dintre clienții sau personalul dumneavoastră. WHMCS şi Botble să nu fie nevoie de nimic din toate acestea: WHMCS cârligul ajunge cu secretul completat în, și Botble Panou conector umple în pod.

Rute complete, platformă după platformă

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)
}

Când ceva nu e în regulă

Portalul se deschide, dar a semnat afară

Cheia secretă sau de lucru nu se potrivește cu acest spațiu de lucru, jetonul este mai vechi decât 120 secunde (verificați ceasul serverului), sau aceeași legătură a fost deschisă de două ori. Generați un link de testare semnat: dacă funcționează, comparați cererile jetonului cu exemplul.

Mereu aterizează pe portalul de acasă.

Adresa de retur nu a fost în interiorul adresei portalului, așa că a fost ignorată intenționat. Comparați-l cu Portalul URL afișat în Setări.

Oaspeții primesc o eroare în loc de autentificare

Înlocuiește /login pe traseu cu pagina ta de logare reală și asigură-te că loginul tău revine la adresa dată.

Funcţionează doar pentru unii clienţi.

client. email sau client. id este gol pentru ei. Ambele sunt necesare.

Dezvoltator

chat-ul client: recunoaşteţi clienţii înregistraţi

Opțional. Majoritatea site-urilor nu au nevoie de acest lucru: cu fragmentul simplu chat și un conector, chatul verifică clienții înșiși, cu o rezervare sau număr de ordine plus dovada pentru cautari si un cod trimis prin e-mail înainte de comandă. Adăugați acest lucru atunci când doriți ca un client care este deja conectat pe site-ul dvs. recunoscut automat, cu tot contul lor. WHMCS deja face asta prin cârligul său. Site-uri la distanță, site-urile dumneavoastră, coduri, C imprima același cod cu tasta site-ului completat în.

Cum funcţionează

1
Pagina ta a tipărit eticheta de chat

Pentru un client semnat-in widget URL poartă &identity_token= ... semnat pe serverul dvs.; pentru un oaspete este eticheta simplu. Nimic secret nu este în pagină: doar un simbol care expiră.

2
Convorbirile confirmă semnul

Semnătură, tasta de lucru și expirare. Clientul este apoi cunoscut pe fiecare cerere de chat, iar conectorul poate răspunde despre comenzile lor proprii, rezervări sau facturi.

3
Discuţia se împrospătează înainte de ora asta.

Sună la pagina cu care e pornit?opsiq_identity_refresh=1&role=client. Codul tău răspunde {"success":adevărat,"identity_token""" ..."} în timp ce clientul este semnat, sau 401 cu {"succes": fals,"login_required":Adevărat" atunci când nu sunt. De aceea, handler-ul de reîmprospătare trebuie să ruleze înainte de pagina ta imprima nimic.

Cum diferă de semnul portalului

Durata de viaţă

O oră (exp = iat + 3600) în loc de 120 secunde, pentru că merge fiecare cerere de chat în loc de o redirecționare.

Nu jti sau single_use

Acelaşi simbol este folosit pentru fiecare mesaj până când reîmprospătarea îl înlocuieşte.

La fel şi restul.

site_key, iat, exp, autentificat: adevarat, platforma si client cu un ID necesar si e-mail. Același secret, aceeași semnătură.

💡
Identitatea spune OMS clientul este. Ordinele, rezervările sau facturile lor ajung la chat printr-un conector: unul care numește platforma dvs API, sau, atunci când platforma nu are API, un conector plus fişierul pod (conectorul construieşte unul).
💡
Secretul de semnare este completat pentru tine. În Site-uri Remote, site-ul dvs., Coduri, C, fiecare exemplu conține deja propriul secret al acestui site, astfel încât codul funcționează ca lipit: nu există nimic de copiat sau configurați. Exemplele din această pagină arată opsiq_whsec_YOUR_SITE_SECRET Fiecare exemplu îl caută. OPSIQ_SITE_SECRET (sau propria setare a cadrului, numită în notele sale) pe server mai întâi și folosește că atunci când este setat, astfel încât să puteți muta secretul din fișier ori de câte ori doriți, de exemplu, pentru a-l roti fără cod de editare. Fie modul în care fișierul rulează doar pe server: nu lipi într-o pagină web sau browser JavaScript, și niciodată nu-l angajeze într-un depozit public, pentru că oricine deține secretul poate semna în ca oricare dintre clienții sau personalul dumneavoastră. WHMCS şi Botble să nu fie nevoie de nimic din toate acestea: WHMCS cârligul ajunge cu secretul completat în, și Botble Panou conector umple în pod.

Cod complet, platformă după platformă

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>`)
}

Când ceva nu e în regulă

Discuţia tratează un client înregistrat ca oaspete

Eticheta a fost tipărită fără identity_token (secretul lipsește pe server, astfel încât codul nu este închis), sau tasta de spațiu de lucru sau secretul jetonului nu se potrivește.

Recunoscut la inceput, apoi un oaspete dupa aproximativ o ora

Manipulatorul de reîmprospătare nu este atins: trebuie să ruleze înainte de orice ieșire, pe fiecare pagină apare chat-ul.

Discuţia simplă arată de două ori.

Eliminați eticheta de chat simplu din șablon: acest cod imprima chatul în sine.

Dezvoltator

Module și SDK-uri

OpsIQ oferă SDK pachete și module pentru platforme comune.

Cum funcţionează
Module și SDK-uriPatru pachete: PHP SDK, Node.js SDK, WordPress modul și WHMCS modul, fiecare cu comanda de instalare.PHPPHPSDKCompozitor necesită opsiq/sdkJSNode.jsSDKnpm i @opsiq/sdkWPModul WordPressInstalează & conectează- un clicWHWHMCS modulAddam pentru facturare + releu de bilete
Module & SDK
PHPSDK

Pachetul compozitorului: generarea de imagini, acțiune API ajutor, verificarea semnăturii webhook.

JavaScript SDK

Browser-side: urmărire, identitate, evenimente personalizate, control chat.

Modul WordPress

Injecție Widget, identitate din sesiunile de utilizator WP, WooCommerce sincronizare.

WHMCS modul

Integrare completa: widget, releu de bilete, identitate, admin AI.

Shopify extensia tematicii

Aplicație înglobată cu identitatea automată a clientului.

PHP SDK pornire rapidă

Exemplu 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);
Dezvoltator

Sondaj API, evenimente și automatizare fără conectori

Studioul Survey este conceput pentru a utiliza același tip de General API, executor intern, autobuz de evenimente și operațiuni webhook ca restul OpsIQ Acest lucru permite dezvoltatorilor să se integreze la sfârșit fără a construi un conector ambalat.

⚠️
Starea implementării: catalogul live expune doar în prezent platform.get.survey.config şi platform.save.survey.config- Ce? surveys.* şi feedback.* familiile de mai jos sunt contractul-ţintă aprobat şi trebuie să se întoarcă unknown_action până când este înregistrat.

Familii țintă

Tipuri, șabloane și lansare rapidă

surveys.types.*, surveys.templates.* şi surveys.quick_launch.* lista, previzualizare, instanție și valida startere complete.

Sondaje și versiuni

surveys.create|get|list|update|archive|duplicate plus versiunea imuabilă, validarea și publicarea acțiunilor.

Desfășurări și ținte

surveys.deployments.*, surveys.links.*, surveys.audiences.*, surveys.triggers.* şi surveys.variables.*.

Abordare și răspunsuri

surveys.invitations.*, surveys.campaigns.*, surveys.recipients.*, surveys.responses.*, exporturi, redactie si analiza.

Cârlige web, import și feedback

surveys.webhooks.*, surveys.imports.*, feedback.items.*, feedback.analytics.*, feedback.sources.* şi feedback.analysis.*.

Debit fără conector

1
Creați și publicați prin intermediul General API

Utilizați sondaje tastat.* acțiuni cu o cheie de lucru-pinned. Scrie declara permisiunea, riscul, confirmarea, idempotență și comportamentul uscat-run.

2
Primiți evenimentul de afaceri

Trimite un eveniment semnat la o webhook intrare, de exemplu, o anulare a comenzii sau completat pas la bord. Redă protecția deduplicează ID-ul evenimentului.

3
Hartă în acțiuni și declanșări

Alegeți un OpsIQ Generalități API acțiuni precum emiterea unei invitații de anchetă sau pregătirea unei campanii, apoi cartografierea câmpurilor din sarcina utilă declanșatoare verificată.

4
Abonare la evenimente de cercetare

Livrează setul documentat de securitate a afacerii.* ciclu de viață la obiectivul dumneavoastră cu semnătură, filtru, retry, log și replay autorizat.

Obiectivul evenimentului canonic

Catalogul comun va acoperi Sondaj / implementare publica decizii de stat, public si declansare, invitatii, remix/start/parial/resumare/complet/abandon, reactie de redactie, starea campaniei si esecuri de livrare. Concentrarea in volum mare, timpul de derulare si intrebare se mentin in Studiu Analytics daca nu este documentat explicit pentru fan-out.

Un conector este opțional. Acesta adaugă descoperirea platformei reutilizabile, identitatea verificată, faptele, variabilele și enumerarea destinatarului. General API plus Acțiuni & Declanșări/webhooks rămâne calea de integrare completă pentru dezvoltatori care nu au nevoie de un conector ambalat.
Dezvoltator

RESTAURANT API

ă OpsIQ RESTAURANT API vă permite să accesați programatic toate caracteristicile platformei.

Cum funcţionează
RESTAURANT APIUn terminal care afișează un POST către OpsIQ API cu un Bearer Cheie, listarea tichetelor deschise și paginarea JSON Răspuns.$ curl -X POST https://your-domain.com/api/v1.php \-H "Authorization: Bearer opq_..."200 Bine.{ "data": [{ "id": 4192, "ticket_number": "T-4192","subject": "Card declined", "status": "open" },... more tickets ...], "page": 1, "per_page": 50, "has_more": true }
RESTAURANT API

Format cerere

Trimite cheia ca Authorization: Bearer opq_... sau X-OpsIQ-Key: opq_...Foloseşte un antet de autentificare, nu ambele.

API format cerere
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"
}

Acțiuni comune

API este bazat pe acțiune: trimite un action numele în organism. Fiecare administrator înregistrat JSON operaţiunea are o acţiune stabilă numită POST. {"action":"meta.actions"} (nu este necesară o cheie) pentru lista de cereri, contracte de cerere, metadate de risc și domeniu de aplicare. platform.routes.* Podul rămâne doar pentru integrările mai vechi.

crm.contacts.list

Lista de contacte CRM (Clm. read microscopic). Params: q, status, source, tag, lead score, limit.

crm.contacts.upsert

Rezolva-sau-creează un contact (scope crm. write). Params: e-mail plus câmpuri, etichete, note.

crm.deals.list

Listă CRM oferte (CRM. read microscopic). Params: status, stage_id, company_id.

crm.activities.record

Înregistrați o activitate de viață/afacere pentru un contact (scop crm. write). Params: e-mail sau contact_id, eveniment, valoare, monedă.

crm.conversions.record

Înregistrați o conversie (scope crm. write). Params: contact_id sau e-mail, convertire_type, valoare, monedă.

crm.events.list

Sondați fluxul de evenimente CRM (scope crm. read). Parametri: limită.

tickets.list

Parametrii: pagina, per_pagina, sortare, ordine, status, prioritate, department_id, assigned_admin_id (numit si "ticket_list"), client_email, cautare.

tickets.get

Un bilet și mesajele sale (bilete de telescop. read). Params: ticket_id sau tickett_number, includ_messages, messages_limit.

tickets.reply

Postează un răspuns la un bilet (bilete de telescop. write). Params: ticket_id sau ticket@number, body, autor_type, author_name, intern.

tickets.update

Actualizează un bilet (bilete de telescop. write). Params: ticket_id sau ticket _number, status, priority, subiect, departament_id, asigned_admin_id.

tickets.open

Deschide un bilet de suport (bilete de telescop. write). Params: client_email, client_name, subiect, corp, prioritate.

tickets.bulk

Rulați o operație în vrac coadă (bilete de telescop. write). Params: operare, ID-uri.

conversations.list

Listă de conversații live-chat (conversații sscop. read). Params: page, per_page, status, asigned_admin_id, client_email, căutare.

conversations.get

O conversație și mesajele sale (conversații de microscop. read). Params: conversation_id or tread_key, includ_mesaje.

conversations.messages

Istoricul mesajelor paged (conversații de microscop. read). Params: conversation_id, page, per_page, include_intern.

conversations.send

Trimite un mesaj într-o conversație (conversații de microscop. write). Params: conversation_id, messenger_type, intern.

conversations.update

Asignează, re-status sau re-titlează o conversație (conversații de telescop. write). Params: conversation_id, status, asigned_admin_id , subiect.

Conectori. list / . get / . test

Vezi ce conectori sunt instalate, ce pot face fiecare și dacă autorii săi funcționează (conectorii de telescop. read).

automations.actions.list

Acțiunile pe care le va desfășura constructorul acțiunilor (automatizări. read).

automations.triggers.list

Ce va trage și în ce condiții (automatizări. read)

automations.runs.list

Istoric de execuție pentru depanarea unei integrări (automatizări. read)scope. Params: status, action_key.

departments.list

Departamente puteți ruta un bilet la (domenii de supraveghere. read).

notifications.list

Notificări pentru un singur operator (Notificări de la microscop. read). Params: admin_id (necesar), necitit_doar.

analytics.export

O secțiune de raport ca CSV (scope analytics. read). Parametri: section, preset, from, to Apelați analytics. sections. list pentru valori valide.

site_inteligence. sites. list / . reports. list

Site-uri monitorizate și rapoartele SEO ale acestora (site-ul de cercetare_inteligență. read).

comert. products. list / . get

Catalogul Magazinului, paginat (scope commerce. read). Filtrari: activ, categorie, căutare. .get returnează un produs cu variantele sale.

comerț. comenzi. listă / . get

Prezintă comenzi (scope commerce. read). Filtrari: stare, plată_metodă, canal, client_email. Adu unul după order_id sau de referință ORD-, cu elemente linie. Mânerul checkout poarta live nu este returnat niciodată.

commerce.refunds.list

Restituirea cererilor și a statului lor (comerț de scop. read).

commerce.quotes.create

Pret un element pentru un client (scope comert. write). Sursa store sau un melc conector. Creează nimic: nici o comandă, nici o plată. Vezi secțiunea Comerț.

Bilete.csat.list /.get /.metrics

Raspunsuri de satisfactie a clientilor ca date (bilete scrutin. read). Filtrare prin rating, tichet, agent sau perioada; .metrics returnează aceleaşi numere pe care le arată tabloul de bord.

conversations.ratings.list

Conversațiile de chat au evaluat vizitatorii, cu comentariul, ceea ce a determinat ratingul și agentul creditat (conversații telescopice. read).

knowledge.articles.list

Paginaţi prin intermediul articolelor de la Centrul de Ajutor (pâinea-scop).

knowledge.articles.get

Un articol de ajutor Center de id (scop kb. read). Params: article_id.

webhooks.events.list

Fiecare eveniment puteți abona un obiectiv webhook la, cu sarcina sa utilă. Disponibil pe fiecare plan, astfel încât să puteți construi împotriva acestuia înainte de a cumpăra.

files.get

Un link de descărcare semnat pe o perioadă scurtă de timp pentru un atașament (fișiere de telescop. read). Params: referință, ttl.

security.check

Întreabă dacă o IP sau e-mail este blocat sau suspect aici (scop de securitate.read). Combine IP Firewall, lista de bilete spam şi verdictul privind securitatea AI. ip, e-mail.

security.report

Raportaţi abuzarea sistemului dvs. observat (scop de securitate. write). Înregistrat ca un eveniment de securitate, clasificat de AI de securitate imediat, şi adminii sunt alertaţi pe verdicte cu risc ridicat. Params: ip, e-mail, fel, motiv, sursă.

Securitate. Blocklist. add / . list

Gestionați regulile de spam pe care le aplică conducta de bilete (scopul de securitate. write / security. read). Acelaşi magazin ca pagina de bilete "Block expeditor." Params: fel (email, domeniu, ip_), valoare, motiv, expiră_oră.

💡
meta. acţiuni este întotdeauna autoritate. Se întoarce fiecare acţiune disponibile pe instala dvs. cu domeniul de aplicare fiecare are nevoie, astfel încât să nu trebuie să ghicească sau hard-code această listă.

Paging, filtrare și sortare

Fiecare acțiune listă utilizează aceiași parametri, așa că le învețe o dată.

pagină / pe_page

Numărul paginii care începe la 1, și dimensiunea paginii. Implicit 50, maximum 200. limita si offset sunt de asemenea acceptate daca le preferi.

sortează / comandă

Câmpul de sortare și asc sau desc (default desc). Fiecare acțiune acceptă un set fix de câmpuri de sortare; orice altceva este ignorat mai degrabă decât eroare.

filters

Trimite filtre ca obiect, sau trece un filtru ca parametru de nivel superior. Filtrele necunoscute sunt ignorate.

Ce se întoarce

elemente, pagină, per_page, numărare, total și has_more. Păstrați paginile solicitate până când_mai mult este fals.

Cerere de listă paginile, filtrate și sortate
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
}

Erori

Fiecare esec revine la aceeasi forma, cu un stabil code Nu se potrivesc pe om-citit error text, care poate fi reformulat.

Răspunsul în caz de eroare
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
Lipsește_api_key / invalid_apit_key

Nu a fost trimis nici o cheie, sau cheia este greșită sau expirat. HTTP 401.

missing_scope

Cheia este valabilă, dar nu are domeniul de aplicare această acțiune necesită. HTTP 403_.

citeste_doar_cheie / acțiune_restricționată

Cheia este doar citire, sau această acțiune nu se află în lista sa de permis. HTTP 403.

unknown_action

Nu există o astfel de acțiune. Apel meta. acțiuni pentru lista curentă. HTTP 400.

Parometru lipsă /_parametru invalid

Un parametru necesar este absent, sau o valoare nu este acceptată. HTTP 400_.

not_found

Înregistrarea nu există sau nu este în spațiul de lucru pe care această cheie îl poate vedea. HTTP 404.

plan_feature_locked

Planul dvs. nu include caracteristica de care aparţine această acţiune. feature, the plan_name în vigoare și upgrade_url. Retrandamentul nu va ajuta; planul trebuie să se schimbe. HTTP 402.

license_required

Licența instalației nu este activă, deci nicio acțiune nu va fi efectuată până când nu va reveni la normal. HTTP 402.

selling_paused

Specific comerţului: magazinul a fost închis, astfel încât nimic nu poate fi citat sau comandat. HTTP 400.

rate_limited

Limita orară pentru această cheie este utilizată în sus. HTTP 429.

server_error

Ceva nu a reușit de partea noastră. Cererea_id identifică încercarea dacă trebuie să-l raporteze. HTTP 500.

Retensiuni sigure

Dacă un scris ori nu se poate spune dacă a aterizat. idempotency_key şi o repetare a aceluiaşi apel returnează rezultatul original în loc să facă munca de două ori.

Scriere de către un reprezentant
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
Cât timp durează

O cheie este amintită pentru 24 ore împotriva aceleiaşi acţiuni şi API Cheia.

Ce primeşti înapoi

Răspunsul original, plus idepotent_replay: adevărat astfel încât să puteți spune că a fost o reluare.

Eşecurile rămân rejudecabile

Dacă un apel a eșuat, trimiterea lui din nou cu aceeași cheie o conduce din nou, ceea ce este ceea ce vrei.

Citiri

Citirile ignoră cheia. Repetarea unei citiri este inofensivă.

Test fără a schimba nimic

Adaugă dry_run: true Cheia, luneta şi parametrii sunt verificaţi exact ca de obicei, apoi apelul se opreşte înainte să fie creat sau schimbat ceva.

Rula uscată: verificați în siguranță acreditările și încărcătura utilă
{
  "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."
}
Utilizați se usuce_run în timp ce sunteți construirea. Este cea mai rapidă modalitate de a confirma o cheie are luneta dreapta și sarcina utilă este modelat corect, fără a crea date de testare pe care apoi trebuie să curățați.

Limitele ratei

Limita per cheie

O limită orară configurabilă per API Cheie (default) 1000 cereri pe oră). Setați-l per cheie sub Setări;API Cheile.

Atunci când este depășit

HTTP 429 cu rata de cod_limitată, plus un antet Retry-După vă spune câte secunde să așteptați. Limita se resetează în partea de sus a ceasului următor oră.

Ştiind unde stai

Fiecare răspuns poartă X-RateLimit-Limit, X-ratLimit - Remaining și X-rateLimit (un timbru unix). Uită-te Rămînând și încetini înainte de a alerga afară mai degrabă decât să aștepte pentru a fi refuzat.

Telling 429 de la 401

A 429 înseamnă să aştepţi şi să încerci din nou. 401 înseamnă că cheia în sine este greșită sau expirată, astfel încât rejudecarea nu va ajuta până când reparați cheia.

Garda brută pre-autiană

Încercări repetate de esec-aut de la o IP sunt accelerate separat. Taste valide nu se abat niciodată acest lucru.

Cele mai bune practici

Retrage-te când Rămășița se micșorează, și onorează retrieria după un 429 în loc să încerci imediat.

Variante și stabilitate

Versiunea curentă

V1. Fiecare răspuns poartă X-OpsIQ-API- Versiunile şi X...OpsIQ-API- Status ca să poţi confirma cu ce vorbeşti.

Cum vei fi avertizat

Dacă o versiune este vreodată retras, răspunsurile câștiga antetele standard Deprecare și Sunset, și meta. acțiuni rapoarte depreciate și apus_at. Verificați cele din monitorizarea ta și nu vei fi niciodată surprins.

Ce nu se va schimba

Numele de acțiune existente, parametrii lor și codurile lor de eroare. Se pot adăuga în orice moment noi acțiuni și noi câmpuri opționale, astfel încât să se ignore câmpurile pe care nu le recunoașteți decât să le dați greș.

O integrare completă, începe să se termine

Aceasta este întreaga buclă: găsiți de lucru, citiți-l, acționați pe ea și confirmați ce ați făcut.

Fluxul complet de lucru bilet peste 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}
💡
Toate cele de mai sus funcționează în același mod pentru conversații: conversations. list, conversations. get, conversation. send și conversations, update urmează modelul identic, parametrii și forma răspunsului.

Exemple mai multe de lucru

Fiecare dintre acestea este o bucată completă, runnable de o integrare reală mai degrabă decât un fragment.

Page prin fiecare înregistrare, în trei limbi

Regula este aceeaşi peste tot: să continui să ceri pagina următoare până când has_more Nu ghici un total.

Python · pagina prin fiecare bilet deschis
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 · pagina prin fiecare plumb
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 · pagina prin fiecare bilet deschis
<?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"]));

Manipulați fiecare eșec API poate reveni

Ramură pe code, niciodată pe formularea errorAcest ambalaj este tot contractul într-o singură funcţie.

Python · un client care se ocupă corect de fiecare cod de eroare
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ăspunde la un scor de satisfacţie într-o oră

Citiți scorurile mici, deschideți un bilet pentru fiecare, și nu acționează pe aceeași de două ori.

Închide bucla asupra clienților nefericiți
# 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.

Citează un articol şi acţionează după răspunsul negustorului.

Un refuz care îţi spune ce să aduni.
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 }
}
⚠️
Arată-i clientului totals.total exact ca returnat. Cantitatea nu întotdeauna multiplica prețul unității

Un receptor webhook care este sigur pentru a rula în producție

Verificați, de-duplicate, răspunde rapid, apoi face munca. Livrări retry, astfel încât același eveniment poate ajunge mai mult decât o dată.

PHP · un receptor de webhook în formă de producție
<?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

Planuri și drepturi

Fiecare acțiune aparține unei caracteristici de produs, iar planul decide ce caracteristici aveți. Dacă planul dvs. nu include o caracteristică, acțiunea răspunde 402 După ce cheia ta este verificată, astfel încât un apelant neautenticat nu află nimic despre planul tău, și înainte de a se crea ceva, așa că o scriere blocată nu se întâmplă niciodată pe jumătate.

O acțiune cu blocare plan
{
  "success": false,
  "code": "plan_feature_locked",
  "feature": "commerce",
  "plan_locked": true,
  "plan_name": "Growth",
  "upgrade_url": "https://…",
  "request_id": "req_8f2c1a9d4b7e"
}
Cum să-l spui în afară de o problemă permisiuni

A403înseamnă că KEY este prea îngustă. Reemiteți-l cu domeniul de aplicare dreapta și funcționează. A402înseamnă că contul nu are caracteristica "nicio cheie nu o poate debloca," planul trebuie să se schimbe.

Nu retrimite un 402

Nu este tranzitorie. upgrade_url oricui deţine contul în loc să se retragă şi să încerce din nou.

Domeniul de aplicare admin nu ocolește

Domeniul de aplicare exprimă ceea ce emitentul-cheie delegat; planul exprimă ceeace a cumpărat contul. O cheie cu domină încă mai primește un 402 pentru o caracteristică care nu este disponibilă în plan.

Află înainte să pleci.

- Nu. feature fiecare acțiune necesită este publicată în directorul de acțiune de mai jos și în meta.action, astfel încât să puteți verifica la construirea timpului mai degrabă decât descoperirea în producție.

Cea mai rapidă cale de a vedea exact unde se află o cheie meta.meRaportează planul în vigoare, fiecare caracteristică pe care o poartă şi orice acţiune pe care această cheie nu poate să o facă cu motivul pentru fiecare.

meta. me
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"
    }
  }
}
Sună meta. me mai întâi atunci când o integrare se comportă diferit între două instalaţii. Ea răspunde "de ce nu poate această cheie să nu facă asta" într-o singură cerere, fără ca cineva să deschidă admin.

Citez un preţ.

commerce.quotes.create preţuri un element pentru un client. Acesta nu creează nimic

Citează un element
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"}}
Negustorul câştigă în totalitate.

Pentru o platformă conectată, totalul vine de la acel comerciant și nu este niciodată recalculat aici. Cantitatea nu multiplică întotdeauna prețul unitar

Refuzurile îţi spun ce lipseşte.

Dacă comerciantul are nevoie de mai mult de la client, primeşti quote_refused cu missing lista de nume câmpurile pentru a colecta, și propria formulare comerciantului să arate.

Comanda nu este unAPISună

Un citat este indicativ. Confirmarea se întâmplă în cazul în care clientul esteAPIRăspunsul spune aşa în ordering.

Când vânzarea este oprită

Dacă magazinul a fost închis, citând răspunsuri selling_paused Mai degrabă decât să pretuiesti ceva ce nimeni nu poate cumpăra.

Celelalte obiective finale

Aproape tot ce ai nevoie este un Post /api/v1.phpAcestea sunt excepţiile şi pentru ce este fiecare.

/api/v1/openapi.php · /api/v1/postman.php · /api/docs/

Contractul cu maşina şi referinţa umană. Nu este nevoie de cheie, aşa că puteţi explora înainte să aveţi una.

/api/ai_stream.php

Server-trimis evenimente pentru live chat răspunsuri ca acestea sunt generate. Un flux, nu un JSON acțiune.

/api/writing.php

Obiectivul de mai vechi AI-scriere. Tot ceea ce face este, de asemenea, disponibil ca writing.* acțiuni pe /api/v1.php, care este locul unde ar trebui să se desfășoare noi activități.

/api/inbox_copilot.php

Proiect, rescrie și triaj pentru un bilet inbox încorporat în propriul admin.

/api/v1/si/…

Site-ul de informații ca un mic REST API

/api/connectors.php?slug=&token=

În cazul în care o platformă conectată POST propriile sale site-uri web pentru tine. Jetoane este mentat atunci când activați conectorul.

/api/integrations/*.php

Motorul de integrare: rulați și confirmați acțiunile, și ingera vânzări, identitatea și evenimente de călătorie. Acesta utilizează propriul tip cheie, emise în conformitate cu API Constructor & Webhook.

💡
Toate acestea respectă aceleași reguli ale planului ca și acțiunile. O caracteristică a planului nu include răspunsuri 402 aici, în aceeași formă.

Fiecare acţiune, cu domeniul de aplicare de care are nevoie

Această listă este generată din catalogul de funcționare, astfel încât se potrivește întotdeauna versiunea pe care sunteți. meta.actions returnează aceleași informații ca și 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

analiză (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

comerț (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.

clienţi (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

e-mail (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.

Meta (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

platforma (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

securitate (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

stare (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.

sondaje (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.

echipă (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

bilete (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

Cârlige web (1)

webhooks.events.list

Read. Scope: webhooks.read, crm.read, admin. Contract: explicit. List outbound webhook events and their payloads

scriere (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.

Sunt OpenAPI și Postman disponibile?+

Da. Generat OpenAPI 3.0 documentul este la /api/v1/openapi.php, Colecţia de poştaş generată este la /api/v1/postman.php, şi documentele dezvoltatorului care poate fi citit de om sunt la /api/docs/.

Cum lucrez cu mai mult de un spaţiu de lucru?+

Trimite site_cheie în organismul de cerere pentru a alege un spațiu de lucru. O cheie emisă pentru o ședere spațiu de muncă fixat la ea; o cheie cu context admin poate selecta orice spațiu de munca este permis să vadă, și este refuzat pentru orice nu este.

Care sunt acţiunile care pot fi doar un apel cheie?+

Orice acțiune marcată ca o citire. Setați modul permisiuni pe tasta pentru a citi_doar și fiecare scrie este refuzat cu citire_only_key, astfel încât o integrare de raportare nu poate schimba nimic chiar din greșeală.

De ce nu am fost găsită pentru ceva ce pot vedea în admin?+

Cheia este telescopul unui spațiu de lucru. Înregistrările din alte spații de lucru nu se mai întorc_găsite decât o eroare permisivă, astfel încât API nu confirmă niciodată dacă există ceva în altă parte.

Dezvoltator

Securitatea API

Un contract de securitate pentru fiecare conector și integrare: întrebați OpsIQ ce stie despre un IP sau expeditor, și să se hrănească înapoi abuzul propriul sistem vede.

OpsIQ deja se apără: IP firewall-ul blochează atacatorii, conductele de bilete filtrează spamul şi securitatea AI clasifică infractorii şi propune reguli de blocare. API deschide acea inteligență pentru alte sisteme. O platformă de facturare, un portal client sau o aplicație personalizată poate verifica un vizitator înainte de a avea încredere în ea și să raporteze ceea ce a observat astfel încât întreaga instalare să învețe de la fiecare suprafață.

Ce poţi face

Verificați înainte de încredere

securitate. check raspunsuri cu starea firewall, orice regula spam se potriveste expeditorului, si verdictul AI cache pentru IP. Un apel, un aviz consolidat.

Raportează ce ai văzut.

Security.Raport înregistrează observarea ca un eveniment de securitate, are AI securitate clasifica IP Imediat, şi alertează adminii când verdictul se întoarce cu un risc ridicat. OpsIQ Vede direct.

Regulile de partajare a spamului

securitate. blokelist. add și de securitate. blocklist. listă citiți și scrie aceleași reguli spam pagina biletele folosește, astfel încât un expeditor blocat într-un singur sistem este blocat peste tot.

Raportarea abuzurilor de la un conector
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"
}

Domeniul de aplicare și siguranța

security.read

Necesită securitate, verificare şi securitate. listă de blocaje.

security.write

Necesită securitate. raport şi securitate. Blocklist. add. Dă-l doar sistemelor pe care le vrei regulile de hrănire și rapoartele în.

Nimic nu este distrus în tăcere

Un expeditor cu lista blocklist încă aterizează în vedere spam unde biletul poate fi citit și restaurat.

Platforma se protejează

Propriul server IP Aceste adrese nu pot fi niciodată blocate, listate sau raportate prin acest. API, astfel încât o integrare configurată greșit nu poate lua platforma în jos.

💡
Mentă o cheie sub Integrari, apoi API Chei, și da-i doar domeniile de securitate de care are nevoie. Contractul complet cerere pentru fiecare acțiune este în meta. acțiuni și documentul OpenAPI.
Conectorii mei existenţi folosesc asta automat?+

Sincronizarea outbound este deja automată: atunci când blocați un IP, platforme conectate sunt spuse prin sincronizarea de securitate conector. API este jumătatea de intrare. Îndreptați conectorul sau codul personalizat la aceste patru acțiuni cu o cheie care poartă domeniul de aplicare al securității.

Unde locuiesc regulile spamului?+

Un magazin. Pagina de bilete Sender Block, AI spam în Setări, și acest API toate lucra împotriva aceleiași liste blocklist, astfel încât există exact un loc pentru a căuta.

Dezvoltator

Evenimente API

Trimite evenimente personalizate de pe server sau site-ul dvs. la OpsIQ pentru analize, experimente, declanșatoare CRM și condiții webhook.

Cum funcţionează
Evenimente APIUn apel de a trimite un eveniment personalizat demo_booked în OpsIQ, care alimentează obiectivele de conversie, segmente și declanșatoare.OpsIQ.track("demo_rezervat," {valoare: 0, plan: "pro"});Obiective de conversieSegmenteDeclanșează & șanțuri webNavigator (OpsIQ.track) sau server-side POST /v1/events
Evenimente API

Evenimente de tip browser-side

Urmărirea evenimentului browser-ului
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "button_clicked", {
  button: "signup",
  page: "/pricing",
  variant: "green"
}]);

Evenimente de tip server-side

Server-side, înregistrează activităţi şi conversii împotriva unui contact prin acţiune API. Utilizare crm.activities.record pentru ciclul de viață/activitatea întreprinderilor și crm.conversions.record Nu există nici o events.send acţiune; receptorul de evenimente CRM în curs de intrare trăieşte la /v1/inbound.php?t=<token> pentru sisteme terţe care împing evenimentele.

Activitatea serverului (acţiune 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"
}

Convenţia privind mentalizarea

Notare punct

"ordine. Completat" nu "order completed."

La trecut

"buton. clic" nu "butoane. click."

Fii specific

"pretting. plan_selectat" nu "user_action."

Dezvoltator

Cum curge datele prin OpsIQ

Înțelegerea fluxului de date vă ajută să depanați integrările și optimizați performanța.

Cum funcţionează
Cum se colectează dateleDatele curg de la widget și far în OpsIQ nucleu (CDP, graficul de identitate, creierul AI, analiza, CRM) apoi prin intermediul webhooks și REST API.Control& FarOpsIQ nucleuCDP · graficul identităţiiAl creieranaliză · CRMCârlige web afarăRESTAURANT API
Fluxul de date

Fluxul de date de intrare

1
Semnal de control

ă JavaScript widget trimite vizualizări de pagină, clicuri și mesaje de chat către /beacon.php.

2
Ingestia de evenimente

Evenimente stocate în opsiq_evenimente cu site-ul_key, tipul de eveniment, client și proprietăți.

3
Sesiunea de asamblare

Grupurile de constructori de sesiuni îşi fac o imagine în şedinţe (prin cron).

4
Rezolvarea identității

Atunci când sunt identificate, înregistrările anonime sunt legate de profilul clientului.

5
Sincronizare conector

Conectorii extrag datele de pe platformele externe și depozitează în cache-ul conectorului.

6
Context AI

AI asambleaza context din: istoricul vizitatorilor, profilul clientilor, datele conectorului, KB si prompt.

Fluxul de date în afara zonei

1
Focuri de evenimente

Incendii interne (ticket. create, chat. mesaj, order. completed).

2
Coada de locuri de muncă

Evenimentul a fost plasat în coada de lucru async.

3
Dispecerat prin webhook

Dispeceratul semnează şi trimite la toate criteriile de evaluare abonate.

4
Retrieri privind eșecul

Livrările eşuate au fost recuperate cu o retragere exponenţială.

Configurări

Referinţă setări

Setări este centrul de control pentru un spațiu de lucru. Tot ce se află mai jos este telescopul la spațiul de lucru în care vă aflați, astfel încât un cont poate rula mai multe mărci cu identități diferite, comportamente de chat și reguli de reținere.

Găsirea unui cadru

Există aproximativ șase sute de comenzi individuale în Setări, răspândite pe unsprezece file grupate sub patru meniuri, dar nu trebuie să le căutați.

Configurări căutare (Ctrl + K)

Apăsați Ctrl + K, sau Cmd + K pe Mac, oriunde pe pagina Setări. Tastați în cuvinte simple și apăsați Enter pentru a sări direct la control. Căutare tolerează mici tipare și înțelege cuvintele legate, astfel încât programatorul găsește Cron și confidențialitatea găsește controalele de urmărire. Acesta arată doar setările rolul tău poate deschide.

Spațiu de lucru și plan

General şi licenţă.

AI și asistență pentru clienți

Admin AI Assistant, Client Chat, OpsIQ Portal de scriere și suport.

Date și guvernanță

Urmărire şi confidenţialitate, permisiuni şi securitate.

Sistem

Cron Setup (numai cu auto-hosted) și Danger Zone.

Salvare

Fiecare filă salvează pe cont propriu cu propriul buton Save. Client Chat și OpsIQ Scrierea pin lor la ecran. Salvați înainte de comutarea filelor; modificările nu sunt efectuate peste.

Legături profunde

Fila activă este scrisă în adresa paginii, astfel încât o filă poate fi marcată sau trimisă unui coleg.

General: Identitatea în afaceri

Cel mai important card de pe pagina. AI citește aceste valori pe fiecare răspuns, raport și scurt zi de zi.

Denumirea comercială

Utilizat în rapoarte AI, brichete zilnice și formularea cu care se confruntă clienții. Se potrivește cu subsol site-ul dvs..

Industria afacerilor

Analiza AI a marinarilor, scoruri de plumb, brichete și preset-uri sondaj. Alegeți din webhosting, e-commerce, SaaS, imobiliare, agenție, consultanță, asistență medicală, educație, finanțe sau afaceri generale.

Limbajul sistemului

Limbajul arătat oricui nu şi-a ales propriul lor nume. Fiecare agent poate să-l depăşească în profilul său.

Folosește limbajul browser-ului

Afișează pagina de sign-in în limba vizitatorilor. Odată ce cineva alege o limbă acolo, alegerea lor câștigă și acest lucru nu o suprascrie niciodată.

Timpul de funcționare al sistemului

Zona în care rulează întregul sistem: date, rapoarte, programe și cron de fundal. Utilizați fusul orar al operațiunilor dumneavoastră, nu clienții.

General: GeoIP și Urmărire

Calea de baze de date GeoIP2

Calea completă către GeoLite2-City. mmdb. Detectări automate la prima încărcare pe cPanel, Plesk, DirectAdmin, Cloudways, Docker și simplu Linux sau Windows. Adăugați GeoLite2-ASN. mmddb în același dosar pentru furnizorul de internet vizitator.

Mod sursă Geo

Numai GeoLite2, GeoLite2 cu un Cloudflare Retragere sau Cloudflare Doar.Cloudflare modurile necesare site-ului pentru a fi preocupat prin Cloudflare, cu antete locatie vizitator activate pentru detalii oras si regiune.

Timeout (s) sesiune

Inactivitatea înainte ca o sesiune de vizitatori să fie considerată terminată. Implicit 14400, adică patru ore.

Interval (e) de actualizare în viață

Cât de des se împrospătează alimentarea cu hrană vie. Implicit 30 secunde.

Prag activ (min)

Cât timp un vizitator contează ca live după ultima lor încărcare pagină. Implicit 2 minute. Acesta este Live Feed drop-off, nu lungimea sesiunii.

Reţinerea datelor (zile)

Șterge înregistrările colectate și generate de această vârstă: analize, chat, bilete, feedback, tranzacții, telemetrie AI, jurnale de integrare și activitate CRM. 0 păstrează totul pentru totdeauna. Setări, conținut autentificat și chitanțe de consimțământ nu sunt niciodată eliminate.

Când un chat este șters

Alege cât de mult dintr-o conversație ștersă rămâne pe înregistrare: recordul complet, înregistrarea fără conversație, sau doar scor. Ștergerea ascunde întotdeauna chat-ul din inbox și istoria vizitatorilor. Menținerea programată și Uitați vizitatorul ștergeți întotdeauna în întregime indiferent de acest lucru.

Traficul de boturi

Se numără crawlere ca vizitatori. Lasa off; se umfla de vizitator contează și freacă fiecare raport.

Sondaj de feedback popup activat

Arată widget-ul feedback-ului la nivel de site pentru vizitatori. Separat de sondajele de chat în cadrul Client Chat, Suport Flow.

Generalități: Caracteristici AI

Comutatoare de master pentru fiecare suprafaţă AI. Toate implicit la on şi salvaţi per spaţiu de lucru.

Triaj AI pe bilete

Clasifică fiecare bilet pe categorii, prioritate și sentimente, și scrie un rezumat al firului în partea de sus a biletului.

Sumarul de zbor al triajului AI

Arată etichetele triage și rezumat într-un sfat de instrumente atunci când un agent planează un rând în lista de bilete. Necesită Triaj AI.

Copilot inbox (composator)

Adaugă Draft AI răspuns, cald, scurt, mai formal și butoane apologetice sub caseta de răspuns bilet. Nimic nu trimite fără agent.

Întreabă...OpsIQ Copilot

Copilotul plutitor de pe pagina de internet este disponibil în fiecare pagină. Ştie care client, factură sau bilet este deschis.

Dimineaţa scurtă.

La prima deschidere în fiecare zi copilot prezinta bilete urgente, raspunsuri restante si chat-uri de asteptare. Duminica produce o saptamana in revista.

General: bani, branding, backup

OpsIQ moneda de bază

Fiecare bani total în admin este convertit în această monedă pentru afișare. Conectorii stochează propria lor monedă sursă; setați că pe conector.

Ratele FX Auto-sinc

Reîmprospătează ratele la fiecare șase ore de un feed public gratuit cu tasta API. Puteți adăuga rate manuale care suprascrie alimentarea. Cu auto-sincronizare off, valutele fără o rată manuală sunt lăsate neconvertite.

Activează caracteristicile de comerț și facturare

Nave oprite. Pornind de pe dezvăluie pagina de vânzări și conversii, cardurile de venituri bord și live Intelligence Feed. Cu ea off, fiecare suprafață de preț este ascunsă și pagina de vânzare lasă meniul.

Vocabularul comercial

Învață OpsIQ formularea ta: dacă faci reînnoiri, cuvântul pentru reînnoire, ceea ce vinzi și cum se numesc cumpărătorii.

Marcare și logo-uri

Două upload-uri, una pentru fundalurile luminoase (admin sidebar) și una pentru întuneric (sign-in page). PNG, JPG, WebP sau SVG până la 3 MB.

Agent de informații site-ul, permite privat SSH obiective

Agentul SEO Auto-Implement se conectează peste SSH. Adresele private, loopback și rezervate sunt blocate implicit ca măsură anti-SSRF. Activați numai pe instalaţiile auto-hostate care trebuie să ajungă la un server local.

OpsIQ Backup / Restaurează

Exportă fiecare setare și OpsIQ Restaurare înlocuieşte OpsIQ configuratie si inregistrari numai; nu atinge niciodata clientii, facturile, biletele, serviciile, domeniile, comenzile sau tranzactiile.

⚠️
Ia o copie de rezervă înainte de a utiliza nimic în Zona Pericol. Backup trăiește în general și acțiunile ștergere trăiesc în zona pericol, astfel încât este ușor să ajungă la butonul șterge fără a fi exportate mai întâi.
Configurări

Configurări: Securitate

Protecţia pentru sign-in admin, conturile personalului şi datele OpsIQ colectează. Semnarea clienţilor pentru portalul suport este configurată separat.

Protecția de sign-in

Utilizarea Google reCAPTCHA

Oprește boți și acreditare umplutura pe admin sign-in. Alege v3 (invizibil, marcat) sau v2 (checkbox), setați pragul de scor V3, și furniza site-ul și tastele secrete. Aceste chei sunt reutilizate prin formularul de cerere portal de sprijin.

Login automat-Lockout eșuat

Blochează o adresă după un număr de eșecuri într-o fereastră, pentru o serie de ore. Puteți personaliza mesajul blocat pagină și să arate o mică distragere a atenției pe ecranul de așteptare.

Autentificare înăsprire

Politica parolei cu o lungime minimă, respingerea parolelor găsite în încălcări cunoscute, blocare per cont împotriva umpluturii credibile, doi factori obligatorii pentru fiecare admin, reintrarea parolei înainte de acțiuni periculoase și alerte noi de sign-in dispozitiv.

Un singur semn-on (OIDC)

Emitentul de personal URL, ID-ul clientului și secretul client. Domenii auto-procurare, unul pe linie, creează automat utilizatorii la primul sign-in.

Semnare unică (SAML 2.0)

Pentru furnizorii care vorbesc SAML. OpsIQ furnizează răspunsul ACS URL și ID-ul entității SP; vă furnizează ID- ul entității IdP, sign-in URL, opțională de plecare URL şi X.509 Certificatul de semnare. Câmpurile atributelor de e-mail și nume sunt necesare doar pentru numele de atribute nestandardizate.

Provisionare SCIM

Crearea, actualizarea și dezactivarea directorului OpsIQ conturi.OpsIQ furnizează SCIM bază URL; generați jetoane etichetate aici, astfel încât unul poate fi revocat fără a rupe restul.

Amenințări, blocaje și colectare

Lista de permisie pentru ieșirea din ieșire

Restrictii care gazduiesc extern acest conectori spatiu de lucru pot apela. Companion la SSH control tinta in general.

Amenințări și auto-blocare

Blochează un vizitator odată ce scorul lor de amenințare trece pragul. 0 Urmăriţi pagina de securitate pentru o săptămână înainte de a alege un număr.

Blochează mesajul paginii

Mesajul pe care un vizitator blocat îl vede, ca text simplu sau propriul tău obicei HTML ecran de bloc.

Semne vitale de bază Web de la vizitatori reali

Măsuri LCP, INP și CLS de la sesiuni reale.

Livrare de evenimente în loturi, rejudecată

Evenimente personalizate stau la coadă în browser și livrează în loturi cu retries, reducând pierderea pe conexiuni mobile slabe.

Pachete de urmărire semnate

Widget-uri reale transporta un jeton rotativ de bioacumulare astfel încât datele de urmărire falsificat pot fi respinse. Off implicit; permite modificări cum înglobează autentificare, astfel încât testul mai întâi.

Alerte de securitate

Detecţia şi blocarea se execută indiferent de. Acest card controlează dacă vi se spune, şi cât de mult AI ajută.

Activează alertele de securitate

Comutator principal pentru această carte.

Prag de undă de logare eșuat

Câte semne au eşuat într-o perioadă scurtă de timp ca un val care merită alertat.

IP informaţii despre reputaţie

Adaugă un scor de amenințare pentru vizitatorii care apar în furaje abuz public.

Ceasul site-ului

Timpul de actualizare și TLS verificările de expirare, alertarea înainte ca certificatul să expire.

Analist de securitate AI și brief-uri de incidente AI

Adaugă un verdict explicativ la activitatea suspectă, iar grupurile au raportat atacuri într-un singur incident lizibil mai degrabă decât un flux de evenimente.

Pilot automat de politică

Acţionează pe cont propriu, transformând ceea ce învaţă dintr-un incident într-o regulă propusă sau aplicată. Lasă-te până când îi revezi propunerile şi eşti de acord cu ele.

Digerare de securitate zilnică și consilier săptămânal postură

O recapitulare zilnică pe pagina de securitate Prezentare generală, și o listă săptămânală de întărire care arată ce este protejat și ceea ce este încă deschis.

Propuneri vechi de explorare automată

O regulă de bloc propusă pe care nu a acționat la expiră de la sine în loc de acumularea.

Redare sesiune DOM

Activează reluarea sesiunii DOM

Înregistrează sesiuni de vizitatori pentru redare. Când off biblioteca reluare nu este niciodată încărcat, astfel încât nu există nici un cost să-l lase oprit. Înregistrările sunt eșantionate și privatity-masked, și sunt vizionați pe pagina Sesiune Redare sub Analytics.

Rata de eșantionare, captură maximă, reținere

Ce parte de sesiuni pentru a înregistra, cât timp o singură înregistrare poate rula, și câte zile înregistrări sunt păstrate.

⚠️
Reluare sesiune înregistrări reali oameni folosind site-ul dvs.. Păstrați rata de probă și reținerea la fel de scăzut ca va raspunde în continuare la întrebarea dumneavoastră, și să-l dezvăluie în notificarea dvs
Configurări

Configurări: Urmărire și confidențialitate

Ce OpsIQ poate colecta, și cât timp fiecare tip de înregistrare supraviețuiește.

Excluderi

Excludet IPs şi Range-uri CIDR

Adresele nu au fost niciodată urmărite, una pe linie, adrese exacte sau intervale CIDR. Cea mai curată modalitate de a-ţi ţine echipa departe de analiza ta, pentru că acoperă pe toată lumea la acea adresă, mai degrabă decât doar admins semnate.

Excludere URL căi

Modelele paginii nu au fost niciodată urmărite, una pe linie, wildcard-uri cu asterisc. De exemplu /admin/* păstrează întregul birou din spate departe de registrul vizitatorilor.

Politica de păstrare a datelor

Auto-purificare per-subsistem în zile. Separat de setarea generală a reţinerii datelor în general şi de curăţarea zonei periculoase.

Jurnalele de interacţiune AI

Temetrie de încredere care deține scurt previzualizări ale interogării și răspunsului. Implicit 90 zile. Acest lucru deține textul cel mai client, astfel scurtați-l în primul rând atunci când strângeți confidențialitatea.

Evenimente de utilizare AI

Tokenul pentru apelurile individuale contează pentru raportarea costurilor. Implicit 90 zile. Numai numere, fără conținut mesaj.

Traseul auditului acțiunii

Acţiunea de evitare şi jurnalul de securitate. Implicit 365 Ţine-o aşa de lungă, e urma ta.

Diagnostice

Dosare de sănătate ale sistemului. Implicit 30 zile.

Întrebări fără răspuns

Clustere de întrebări AI nu a putut răspunde. Implicit 90 zile. Lucrați prin ele la întrebările pagina pierdută AI înainte de expirarea acestora.

Câini de pază și exporturi

Alerte de anomalie metrică

Comparație zilnică a ieri față de valoarea inițială recentă, alertand atunci când un metric se mișcă mai mult decât pragul. Implicit 35 %. Off în mod implicit.

Export de depozit

Sesiuni de noapte, vizitatori, pagini și mese aferente pentru propriul stack BI, într-un format pe care îl alegeți, păstrate pentru un număr de zile. Off implicit.

Configurări

Configurări: Asistent AI admin

Asistentul plutitor folosi personalul dumneavoastră în interiorul admin, cu acces live citit la clienţi, facturi, bilete, servere şi jurnalele Cron. Un asistent diferit de client-faţă de unul sub Client Chat.

Activează OpsIQ Control AIComment

Arată butonul asistent pe fiecare pagină admin.

Aranjament și comportament

Poziția colțului, lățimea panoului (320 la 600 px), înălțimea maximă (400 la 900 px), raza de colț (0la 24), dimensiunea fontului, și o sticlă înghețată neclară în spatele panoului.

Arată chips-uri rapide

Butoni scurtătură de un clic sub antet. Cel mai rapid mod în pentru majoritatea personalului.

Arată informațiile modelului

Afişează ce model a răspuns şi cât timp a durat. Util în timp ce tuning cost, zgomot pentru utilizarea de zi cu zi.

Poarta de acces per-admin

Afișează doar asistentul unui administrator de sign-in al cărui nume de utilizator și e-mail ambele se potrivesc cu un agent OpsIQ atribuit acestui spațiu de lucru. Proprietarii întotdeauna trec. Utilizați butonul meu de acces Check înainte de a permite sau puteți bloca propria echipă afară.

Al Persona

Afișează numele, antetul și un mesaj personalizat de bun venit afișat atunci când panoul se deschide.

Chipsuri inteligente pentru acţiune rapidă

Editați eticheta și pe baza prompt pentru fiecare scurtătură, adăugați propria ta, sau resetare la implicits. Eticheta este ceea ce personalul vede, prompt este ceea Ce AI primește.

Culori și formă

Forma Chip (pilă, rotunjită, pătrată), culorile chipului, tema de card și forma lansatorului (rotund, scuturat, pătrat), cu o previzualizare live.

Memorie conversație

Asistentul își amintește fiecare persoană istorie pe sesiunile de browser, până la 120 mesaje stocate în propria bază de date. Ștergeți-o pentru a o porni din nou.

Configurări

Configurări: Client Chat

Conversaţia pe care o folosesc clienţii dumneavoastră şi cea mai mare zonă de Setări. Şase sub-tabe, cu comutatorul principal şi Salvaţi fixat în partea superioară a filei.

Lucrați prin sub-taburi în ordine pe o nouă instalare: Identitate și Copiere, Apariție, Comportament, Suport Flow, Cunoștințe Training. Avansat este infrastructura și poate aștepta.

Identitate și copie

Identitatea mărcii

Numele de control, tagline, numele AI, numele folosit pentru sistemul și anunțuri inactive, precum și modul în care apar numele agentului. Agent Nume Sursa decide între nume reale, un nume personalizat sau o etichetă de echipă.

Salutări în discuţie

Două salutări, una pentru toţi vizitatorii şi una pentru vizitatori identificaţi. O întrebare începe mai multe conversaţii decât o declaraţie.

Teaser Popup

Mesajul plutitor înainte de chat este deschis, cu numele său propriu, dimensiunea fontului și culorile. AI poate scrie tachinatoare, cu controale pentru cât de multe să genereze, câte să arate pe o vizită și decalajul dintre ele.

Prompts și Handoff

Script-ul complet: cere un nume și e-mail, confirmări, solicitând un om, nu agenți disponibile, bilet creat sau anulat, handoff în curs de desfășurare. Aproximativ două duzini de linii individuale într-un panou colapsabil.

Starea și notițele de eroare

Trei mesaje cu clienti vizibili: agentul inchide chat-ul, vizitatorul a plecat linistit, si agent mainile înapoi la AI. Evitati formularea interna cum ar fi rezolvat sau triaged.

Compozitor şi sugestii

Interlocutor de intrare, eticheta de taste-la-un om, și întrebările de deschidere sugerate. Trei sugestii bune deviază mai multe bilete decât o pagină de articole.

Lansator, pictogramă și avatare

Pictograma lansatorului, o pictogramă opțională diferită atunci când este deschis, dimensiunea lansatorului și imagini pentru agentul uman și AI.

Aspect

Tematică și sticlă

Modul tematic, o preset de culoare premium, intensitate neclară și opacitate, plus comutații pentru animații, linii separatoare, ascunderea rândului de stare, ascunde cartea cutiei de mesaje și ascunde butonul de închidere. Începeți cu un set prestabilit; setează zeci de culori simultan.

Culori principale

Lansator, antet, panou de ajutor, link-uri, butoane, notificări de sistem și compozitor, fiecare cu un început și culoare finală pentru gradient. O opțiune din sticlă implicită utilizare ignoră acestea și păstrează finisajul transparent.

Panou, bule și chips-uri

Aproximativ treizeci de culegători care acoperă panoul, frontiera, textul, zona de intrare și fiecare tip de balon (vizitor, AI, agent, dactilografiere, sistem) plus chips-uri de sugestie și starea lor hover. Deschideți doar acest lucru pentru potrivirea exactă a mărcii, și verifica contrastul pe text bubble.

Aranjament și formă

Lăţimea şi înălţimea panoului, raza colţului, dimensiunea fontului, poziţia ecranului, forma lansatorului, stilul bulelor şi dacă apar avatare. Testaţi lăţimea pe un telefon.

Comportament

Al răspunde automat

Comutatorul principal pentru răspunsurile AI. Off înseamnă fiecare mesaj așteaptă un om.

Urmăriri umane și text dublu natural

O urmărire blândă atunci când un vizitator merge liniștit, și un mesaj scurt opţional de-al doilea modul în care o persoană ar trimite unul. Tuned cu maxim follow-up-uri pe tăcere, prima întârziere, multiplicator ulterior, fereastra de prezență și fereastra secvență maximă. Poate fi limitată la ore de afaceri, și suprimate după o simplă mulțumire.

Răspunsul la scrierea de tip și ritmul răspunsului

Fie că răspunsurile tasta cuvânt cu cuvânt, și cât de repede răspunde asistentul, prin presetat sau propria întârziere minimă și maximă în milisecunde. O mică întârziere citește ca mai mult om decât un răspuns instant.

Traducere în direct

Fiecare agent citeşte şi scrie în limba sa, iar vizitatorul le citeşte pe ale lor.

Dă-i înapoi lui AI după ce agentul nu mai e în stare de funcţionare.

Procesele-verbale ale inactivităţii agentului înainte ca AI să reia conversaţia.

Deschideți chat-ul automat

Cu câteva secunde înainte ca widget-ul să se deschidă.0nu se deschide niciodată. Intrusiv pe mobil; lăsați la0dacă nu este testat.

Răspunsuri mai inteligente

Planificarea în viitor pentru răspunsuri cu un singur pas, profunzimea gândirii, un model separat opțional pentru răspunsurile agentului, arătând raționament vizitatorilor, tolerarea de ortografie greșită, memorie lungă conversație, limitarea asistentului la afacerea numai, prețurile în moneda vizitatorului, și cum apar link-uri. Doar vorbesc despre afacerea ta ar trebui să fie pe aproape toată lumea.

Economii de costuri

Skips cunoștințe căutare de saluturi, cum ar fi hi și mulțumiri, și se referă la cel mai lung răspuns în jetoane. Trims cost fără a schimba calitatea răspunsului pe întrebări reale.

Limbi

Care limbi widget suportă și modul în care alege unul pentru un vizitator.

Răspunsuri la contul de clienți

Răspunsurile dintr-un cont propriu semnat în client, privit opțional live, și încărcat opțional numai atunci când este necesar. Read-numai în toate cazurile; sarcina-când este necesară reduce costurile.

Restituiri

Solicitări de rambursare asistate în cazul în care asistentul adună detalii și mâini la o persoană. Nu completează o restituire în sine.

Conversaţie şi control

Păstrarea conversațiilor trecute, continuarea unei chat-uri pe site-urile conectate, fereastra glisabilă, solicitarea oaspeților pentru un e-mail, și permițându-vă echipa transforma o discuție într-un bilet.

Caracteristici Widget

Ataşament Emoji cu un mod opţional de a lipi numai, înţelegere imagine AI, iconiţe în linie, microfon, buton de vorbit-la-agent, sunete vizitator, previzualizare de ataşament, buton vocal-call şi izolare sesiune. Înţelegerea imaginii AI este ceea ce permite unui vizitator să îşi lipească o captură de eroare şi să obţină un răspuns util.

Admin Inbox, Notificari si Bun venit Popup

Vizitatorul a primit un semnal de bun venit, plus alertele agenţilor dumneavoastră: sunete inbox, notificări de birou, şoapte, dacă şopteşte bip-ul privat şi intervalul de sondaj inbox.

Flux de sprijin

Mandat uman

Cum sunt atribuite cererile pentru o persoană, secundele pe care un agent trebuie să răspundă, dacă declinul întoarce chat-ul la AI, și dacă AI se reia atunci când expiră termenul. Configurați acest lucru înainte de a merge live sau un vizitator care cere un om pur și simplu așteaptă.

Ore de lucru

Timp de deschidere, fusul orar și mesajul cu ore închise. În afara acestor ore AI nu va oferi un om. Un program separat de programul de afaceri bilete sub OpsIQ Scris.

Răspunde când AI este oprit

Primul răspuns la un mesaj nou, răspunsul când cineva este deja în coada de așteptare, și cât timp înainte de a repeta.

Forma offline

Arată un formular de contact în loc de chat.

Lookup bilete și notificări departament

Biletul AI conştientizează, astfel încât un vizitator care citează numărul unui bilet primeşte statutul său real şi pe care departamentele AI îl pot îndrepta spre. Un panou integrat arată beneficiarii reali pentru fiecare departament, a rezolvat acelaşi mod în care notificatorul le rezolvă, astfel că puteţi vedea înainte ca un client să facă asta, un departament nu alertează pe nimeni.

Ajutor centru în chat widget

Permite vizitatorilor să navigheze articole publicate fără a părăsi chat-ul. Alegeţi unde apare punctul de intrare, eticheta de jos bar şi pictograma, şi dacă să ofere un link către centrul complet de ajutor. Off implicit.

Evaluare conversație

Star rating a declanșat atunci când un agent închide chat-ul, atunci când se termină o predare, sau după o perioadă de inactivitate pe care le setați. Alege unul sau două declanșatoare, nu toate dintre ele.

Studiu post-chat

Un scurt sondaj atunci când vizitatorul închide chat-ul, cu întrebarea ta, întârziere, regula de sincronizare și un capac pentru fiecare vizită. Vizitatorii pot, de asemenea, e-mail sau descărca transcrierea. O întrebare devine răspuns; trei nu.

Sondaj prin e-mail post-chat

Un studiu de urmărire prin e-mail după încheierea conversației, opțional în limba vizitator discutată în, cu control asupra întârzierii, subiect, intro, întrebare, atât etichete butoane și linia de mulțumire.

Răspunde Feedback

Degetele mari şi degetele în jos pe fiecare răspuns AI, hrănind bordurile de calitate.

Arhiva conversației

Auto-arhivă după zile, auto-rezolva după minute de tăcere, și șterge conversațiile arhivate după zile. O reținere loc trei este stabilit, alături de General și urmărire.

Instruire în cunoștințe

Ceea ce asistentul ştie, nimic altceva din Client Chat nu contează atât de mult.

Formarea cunoştinţelor site-ului

Crawls site-ul dvs., astfel încât asistentul poate răspunde de la ea. Până la zece link-uri de pornire, o limită pagină, o adâncime link, și folderele excluse. Un singur URL pot fi testate înainte de crawl complet. Excludeți checkout, cont și trasee admin.

Emiteri

ă API cheie și model care transforma paginile în sens cautabil, mai degrabă decât cuvinte cheie meciuri.

Organizator de cunoştinţe AI

Un clic și AI citește fiecare FAQ și târât pagină și le sortează în categorii.

Întrebări frecvente, Răspunsuri verificate

Intrebari si raspunsuri perechi tratate ca fiind cea mai mare sursa de prioritate, fiecare cu un statut, greutate si categorie. Cautabila, importabila din JSON, iar AI le poate scrie dintr-o descriere a afacerii tale. Cand asistentul greseste ceva, scrie un FAQ: este in afara paginilor tarat, asa ca fix-ul este imediat.

Avansat

Performanță și limite

Intervalul de polling, limita ratei mesajului și fereastra, dimensiunea maximă a atașamentului, încercările de atașare per fereastră și extensiile de fişiere permise. Lista de extensii este un control al securității; păstrați-l strâns.

Livrare în timp real

Mesaj instant și de livrare a statutului în loc de votare, prin Pusher, Ably sau Firebase, cu un interval de sondaje de rezervă. Polling este bine pentru majoritatea site-urilor.

Impinge notificări

Semnalări de dispozitiv pentru agenți prin intermediul Telefoanelor Pusher sau OneSignal, cu un interes dispozitiv.

Împinge web (VAPID)

Browser împinge folosind propriile taste generate cu nici un furnizor tert. Generat aici, nu în Zona Pericolului.

Voce, video și ecran de partajare

TURN acreditări astfel încât apelurile să se conecteze prin rețele restrictive, folosind Cloudflare sau Acreditari Twilio sau propria TURN URL, nume de utilizator și credibilitate.

Flux de lucru inbox

Setări de spațiu de lucru agent mai degrabă decât setări vizitator: primul răspuns SLA în minute, vedere la coadă salvată, comenzi rapide tastatură și paleta de comandă, căutare în conversație, și biletele clienților în inspector.

Canale de mesagerie

WhatsApp, SMS, Facebook Messenger, Instagram, Telegram şi X mesaje directe şi LINE, fiecare cu propriul său comutator de răspuns automat AI, plus un întrerupător de politică pentru acţiuni AI pe canale, un răspuns debounce şi şablonul de re-angajare WhatsApp. Fiecare canal aterizează în aceeaşi inbox ca şi chat-ul web.

O versiune live Widget Preview în partea de jos a actualizărilor filei pe măsură ce editați. Utilizați-l în loc să reîncărcați site-ul pentru a verifica o schimbare.
Configurări

Configurări: șabloane

Fiecare emailOpsIQtrimite, și un design care le cadru toate. Editați formularea oricărui mesaj, și scrie șabloane ale tale pentru oriceOpsIQnu trimite deja.

Un design, multe mesaje

- Nu. șablon de e-mail global Este învelișul: logo-ul tău, antetul, cartea de vizită, tipografia și subsolul, cu un spațiu gol la mijloc. OpsIQ Editați învelișul o singură dată și toate e-mailurile se vor schimba împreună - răspunsurile la tichete, chitanțele din magazin, resetarea parolei, memento-urile de rezervare, mesajele de confirmare a rezervării, etc. PeopleOS Scrisori, şi orice ai scrie tu însuţi.

Nu există nici o modalitate de a trimite un e-mail din OpsIQ fără acest ambalaj. Acesta este aplicat la singurul punct fiecare mesaj lasă prin, astfel încât un mesaj adăugat mai târziu nu poate lipsi.

Editare un mesaj

1
Deschide configurările, apoi șabloane

Mesajele sunt grupate după cum sunt: bilete și portal, Magazin, sign-in și securitatea contului, rezervări, conversații și notificări, rapoarte, PeopleOS scrisori, și propria ta.

2
Apăsați Editare pe cel pe care doriți

Primești subiectul, un editor bogat cu o imagine HTML puteți trece la live și o previzualizare a e-mailului terminat exact așa cum primește destinatarul

3
Utilizați chips-urile variabile

Cipurile de deasupra editorului sunt faptele care se schimbă: un număr de bilet, o referinţă la comandă, un timp de rezervare. Faceţi clic pe unul pentru a-l arunca unde este cursorul.

4
Salvează

Doar acel mesaj este scris. Lăsați un câmp gol și păstrează formularea încorporat-in; pastila de pe rând vă spune care stare este în.

💡
O variabilă pe care nu o utilizați este eliminată atunci când e-mailul este trimis, și așa este linia pe care se află. De aceea o rezervare fără număr de telefon nu trimite niciodată "Phone" cu nimic după ea.

Scrie-ţi propriul şablon

Utilizați acest lucru pentru un mesajOpsIQnu trimite deja: o notificare de livrare, un memento de reînnoire, un pachet de bun venit, o cheie de licență. Acesta devine tot ce un mesaj încorporat devineAPI.

1
Apăsați Șablon Adaugă

Butonul se află în partea de sus a paginii șabloane și din nou lângă "Senalele proprii."

2
Spune-o.

Numele devine referinta pe care sistemul dvs. o trimite, afisat sub campul in timp ce tastati

3
Spune pentru ce este şi când este trimis

Aceste două linii sunt ceea ce tu și colegii tăi citiți pe pagina șabloane de peste un an. Acestea valorează treizeci de secunde.

4
Enumeră părțile care se schimbă

Separat de exemplu: nume, atunci când, urmărire_link. Fiecare devine un {{variable}} puteți să treceți în subiect sau mesaj, iar sistemul dvs. îl umple la timp.

5
Scrie subiectul și mesajul

Fraza simplă sunt fine

6
Creaţi-l, apoi deschideţi-I.

Apare la "Sablourile tale" cu editorul complet și o previzualizare live, la fel ca orice mesaj încorporat.

⚠️
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.

Trimiterea șablonului propriu

Două apeluri pe produs API_. Apelantul furnizează destinatarului și variabilele

Listați șabloane și variabilele pe care fiecare le ia
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{ "action": "email.templates.list", "mine": true }
Trimite-l.
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"
  }
}
💡
Nume variabile merge FĂRĂ bretele în API apel. e-mail. templates. list le mâinile înapoi în exact forma pe care le trece inch

Șabloane și planul dumneavoastră

Un mesaj pentru care nu ai serviciul

Rămâne listat cu un link "See plans" și nici un editorOpsIQar trimite, și ceea ce îl deschide.

Șabloane proprii

Alegeţi serviciul un şablon aparţine atunci când îl creaţi, sau lăsaţi-l pe fiecare plan. Un spaţiu de lucru fără ca acest serviciu să-l vadă listat dar nu poate edita sau trimite.

Semnare, securitate, notificări și încercare prin e-mail

Nu am putut repara formularea unei parole resetate pe care adminii tăi o primesc ar fi un fel greşit de blocare.

Întrebări

Pot schimba design-ul doar pentru un mesaj?+

Nu, și în mod deliberat. Designul este ambalajul și este partajat, care este ceea ce păstrează fiecare e-mail recunoscut ca fiind al tău. Ceea ce este per-mesaj este formularea, panoul de fapte și orice butoane pe care le adăugați în mesaj.

Ce se întâmplă cu formularea mea dacă apăs Reset?+

Resetarea apare doar pe șablonul global, și înlocuiește ceea ce este în editor cu designul încorporat. Nimic nu este scris până când apăsați Salvați, astfel încât să puteți închide dialogul pentru a vă schimba mintea.

Am şters unul din şabloane din greşeală.+

Îndepărtarea are două click-uri pentru exact acest motiv

Poate un conector sau o adăugare să-și aducă propriile șabloane?+

Da. Un pachet de nave un e-mail_templates.json în propriul său director, iar mesajele sale apar la "Developer șabloane" cu același editor, previzualizare, ambalaj și poarta planului. Edițiile dumneavoastră de redactare aparțin spațiului de lucru și supraviețui actualizarea pachetului.

Configurări

Configurări: OpsIQ Scriere

Biletele au răspuns în scris: răspunsuri automate, sistemul de bilete nativ, escaladarea, orele de afaceri, rutarea și e-mailurile cu care se confruntă clientul.

Replică automată

Arată OpsIQ Scrierea butoanelor

Adaugă butoanele de scriere ajutor pentru agenții dumneavoastră în admin.

Activează automat răspunsul la bilet

Locuri noi bilete și răspunsuri și răspunde la acestea după o întârziere. Începe cu ea off și revizuiți proiectele pentru o săptămână. Rambursări, anulări și modificări de acces ar trebui să ajungă întotdeauna la o persoană.

Departamente de automatizare

Ceea ce departamentul auto-reply poate răspunde în. Orice nu este listat este lăsat pentru un om, care este implicit sigur.

Răspunde programul de întârziere (minime)

Cât timp să aștepte înainte de răspunsul automat trimite. Un răspuns instant citește ca un robot; câteva minute citește ca o echipă rapidă.

Max AI raspunde pe bilet de departament

Un capac per-departament, de exemplu Billing 1 și sprijin 3Fără capac, un fir confuz poate să se rotească.

Răspunde lungimea, starea și identitatea

Token-uri de scriere maximă, statutul biletului după un răspuns și după o escaladare, și care admin cont răspunsurile automate sunt atribuite. Utilizați un cont clar numit astfel încât personalul poate spune răspunsuri AI de la cele umane.

Operațiuni native de bilete

Sistemul de bilete native

Sistemul de bilete construit în OpsIQ, pentru instalaţii fără un helpdesk extern.

E-mailul de intrare prin conducte în biletele native

Transformă e-mailul în bilete. OpsIQ furnizează obiectivul final URL Tot ce poate posta la acest obiectiv poate crea bilete, aşa că păstrează semnul secret.

Raspunsuri multi-turn si intarziere si debuunce

Dacă AI continuă să răspundă în timp ce conversația continuă, și dacă așteaptă o fereastră liniștită astfel încât trei mesaje rapide obține un răspuns considerat. Fereastra liniștit este cel mai bun cadru unic pentru a face răspunsurile automate simt luate în considerare.

Portalul de sprijin public

O pagină cu vedere la client în cazul în care oricine poate ridica și urmări un bilet, cu o linie opțională de bun venit. Adresa sa și aspectul sunt configurate în fila suport Portal.

Formatul numărului de bilete

Câte litere aleatorii apar în numerele de bilete generate.

Clientii de e-mail in limba lor

Emailurile de bilete urmează limba clienţilor. E-mailul personalului nu schimbă niciodată limba: notificări, alerte departamentale, şedinţe şi rapoarte programate rămân în limbajul sistemului dumneavoastră.

Recunoasteri si confirmări

O confirmare fixă pe bilete noi, plus mesaje de confirmare atunci când este deschis un bilet, atunci când feedback-ul este lăsat și când un bilet este închis, fiecare cu o previzualizare live. Există, de asemenea, un ambalaj șablon de e-mail global și link-ul din spatele vizualiza butonul biletului.

Setarea spamului AI

Ecrane bilete de la expeditori necunoscute, și poate muta opțional suspecte spam pe cont propriu. Lăsați mișcarea automată off până când ați urmărit judecata sa.

Bilete de inactivare auto-închidere

Închide un bilet după mai multe zile liniştite. Spune-i clientului din mesajul de închidere cum să redeschidă.

Ore de lucru ( calendar SLA)

Timpul de timp, ora deschiderii și a închiderii, zile lucrătoare și sărbători pentru cronometre primul-reply și rezoluție. Un program separat de ore de lucru sub Client Chat.

Atribuiți bilete noi

Atribuire automată, opțional numai pentru agenții care sunt on-line, cu abilități de agent și o sensibilitate meci pentru rutarea bazate pe competențe.

Sugerez bilete duplicate

Punctele de vedere atunci când un client deschide un bilet aproape de unul pe care deja îl au, cu o sensibilitate reglabilă la meciuri.

Sondaj de satisfacţie după închidere

Email-uri un sondaj o zi după închidere. Rezultatele apar pe pagina CSAT.

Anunţă departamentul prin e-mail.

E-mailuri departamentul atunci când un nou bilet ajunge. Primitorii sunt membrii acestui departament, nu adresa de e-mail Departamentul, care este biletele de intrare adresa ajunge pe.

Ce poate citi AI

Accesul la datele clientului AI

Un comutator master plus permisiuni individuale de citire pentru rezumatul profilului clientului, facturi, tranzactii, balanta creditului, produse si servicii, domenii, servere legate si o prezentare de ansamblu a contului la nivel inalt. Incepeti cu rezumatul profilului si adaugati categorii ca raspunsurile au nevoie de ele.

Escaladarea și cunoașterea

Activează escaladarea biletelor AI

Mută un bilet la un departament mai bine adaptat înainte de a răspunde. Alegeți departamentele permise, întârzierea verificării și puteți scrie propriile instrucțiuni de escaladare. Porniți nota de ierarhizare internă astfel încât echipa dumneavoastră poate vedea de ce s-a mutat un bilet.

Configurări de cunoștințe

Dacă răspunsurile folosesc limba clientului, dacă se bazează pe link-uri târâte și întrebări frecvente, indiferent dacă AI citește imagine și PDF Ataşamente, modul de răspuns al cunoştinţelor, indiferent dacă sunt importate JSON Cunoștințele sunt folosite și dacă pot apărea legături sursă. Folosiți link-uri târâte și Întrebări frecvente ar trebui să fie pe, sau AI ghicește.

Opriți automat răspunsul după răspunsul uman

Odată ce personalul răspunde, AI nu mai răspunde la biletul ăla.

Tichet și instrucțiuni de e-mail

Instrucţiuni de text liber modelarea ton şi conţinut pentru fiecare răspuns, cu un exemplu lucrat. Fiţi specifici despre ceea ce AI nu trebuie să facă niciodată.

Importă JSON cunoștințe

Încărcați sau lipiți un fișier JSON cunoștințe pentru asistentul scris.

Studioul de nasturi

Un designer complet pentru butonul orientat spre client: stil afisaj, dimensiune, eticheta, pictograma, forma, latime minima, stilul de fundal cu culori primare si secundare, unghi gradient, granita, raza coltului, umbra, dactilografie, padding, animatie inactiva, miscare si culori, precum si inelul focal, plus un personalizat CSS cutie pentru orice control nu acoperă.

Configurări

Configurări: Portal de sprijin

Site-ul cu vedere la clienti unde oamenii ridica si urmaresc biletele si citesc articolele de ajutor. Aceasta fila controleaza modul in care este atinsa si cum se conecteaza clientii; designul vizual al acestuia se face in Studioul Portal Suport.

Portal Studio sau Portalul de bilete Embedded: pe care o vreau?

Acestea sunt două produse diferite și oamenii le amestecă în mod constant. Rezolvă diferite probleme, şi să fugim împreună e normal.

Suport Portal Studio: un loc unde trimiteți clienți

Studioul proiectează un site-ul complet de sprijin care OpsIQ gazde pentru tine. Are propria adresă web, sau propriul domeniu, și poartă întreaga experiență de self-service: articole de ajutor cu căutare, formularul de cerere, istoricul biletelor, sign-in client și asistentul. Alege un șablon, lucru prin Tema, Navigare, Layout, Cunoștințe, Footer, Brand, Bilete, Asistent, Formular și CSS_, previzual la birou, dimensiuni tabletă și telefon, apoi publică.

Utilizaţi-l când vrei o destinatie marcata poti sa indrepti fiecare client spre, si preferi sa nu construiesti sau sa mentii o zona de suport in interiorul propriului site.

Portalul de bilete înglobat: biletele în interiorul site-ului dumneavoastră

¶ Încorporat pune numai experiența biletului pe o pagină a site-ului dumneavoastră. Clientii deschis, urmări și să răspundă la cererile de sprijin fără a părăsi vreodată paginile tale, și antetul propriu, navigare și design rămâne exact așa cum sunt. Setați aspectul, aspectul și regulile de acces în constructorul widget, previzualiza rezultatul, apoi copia fragmentului încorporat în pagina ta.

Utilizaţi-l când aveți deja un site web sau o aplicație cu propriul design și doriți ca sprijinul să se întâmple în interiorul acestuia, mai degrabă decât predarea clientului la o altă adresă.

Versiunea scurtă

Studioul construieşte un loc unde trimiteţi clienţii. Incorporarea aduce bilete unde sunt deja clienţii dvs.Multe afaceri rula atât, înglobarea widget bilet în zona lor de cont pentru cereri in-context păstrând portalul găzduit ca destinație completă self-service cu articole și căutare. Acestea sunt comutatoare independente.

Adresa și accesul

Modul de acces

Fie că portalul este deschis oricui sau limitat la clienţi conectaţi. Deschide portaluri obţine mai multe bilete şi spam-ul.

Opțiuni de tipare

Fie că portalul și centrul de ajutor împărtășesc un erou sau folosesc doi, care navigare și footper apar pe ambele suprafețe, precum și eticheta secțiune de navigație.

Adresa portalului

Clienţii adresei folosesc. Alege un nume şi OpsIQ arată portalul rezultat și potrivire adrese centru de ajutor. Schimbarea acestuia mai târziu rupe link-uri pe care le-ați trimis deja.

Domeniul tău

Servește portalul dintr-un domeniu pe care îl dețineți, cum ar fi suport. domain. com.

Portalul de bilete încorporat

Comută widget-ul drop-in descris mai sus, și deschide constructorul de încrustare unde alegi regulile de aspect, aspect și acces, previzualizarea rezultatului și copiarea fragmentului pentru pagina ta. Acesta nu este Studio Portal: Studioul proiectează portalul găzduit, acest lucru pune biletele în interiorul site-ului propriu. Ambele pot fi pe o dată.

Cum se conectează clienții

Acestea sunt opţiunile de sign-in ale clienţilor. Semnarea personalului este configurată în Setări, Securitate.

Metode de identificare

Care opțiuni apar pe pagina de sign-in. Conector și e-mail-in de lucru automat.

Semnarea socială

Furnizorii de conturi de consum, fiecare având nevoie de un ID al clientului și secret, cu adresa redirecționată furnizată de către OpsIQ pentru a se înregistra la furnizorul respectiv.

Semnare unică (OIDC)

Înregistrare client prin intermediul unui furnizor de identitate, cu emitentul URL, ID-ul clientului, secret și o listă opțională a domeniului de e-mail permis.

Client SAML 2.0

ă SAML Echivalent. OpsIQ furnizează răspunsul ACS URLși ID-ul entității SP; vă furnizează ID- ul entității IdP, sign-in și signout URLs, X.509 denumirea certificatului și a atributelor opționale.SAML în metodele Sign-in sau nu va apărea.

Semnare fără sudură din aplicația dumneavoastră

O legătură profundă semnată astfel încât un client deja semnat în la terenurile dumneavoastră de aplicare în portal fără a semna din nou. OpsIQ furnizează secretul de semnare, portal URL și tasta workspace, o rută completă pentru limba dumneavoastră (PHP, Laravel, WordPress, WHMCS, Node.js, Flask, Django, .NET, Rails, Java, Go, și pe auto-hosted instalează OpsIQ server în sine), note de configurare pas cu pas, și un generator pentru un link de testare semnat. Utilizați generatorul înainte de a scrie orice cod.

Cum funcţionează ruta

Clientul dumneavoastră face clic pe un link de sprijin care puncte la traseu. Traseul găsește clientul semnat în aplicația (un oaspete este trimis la login și înapoi), citește secretul de pe server, semnează un jeton o singură dată care expiră în două minute, și redirecționează către portal cu antete fără referință și fără magazin astfel încât jetonul nu este cached sau scurgeri.

Butonul propriu al portalului Sign in

În Portal Studio, Pagina de conectare, activați Folosiți login-ul site-ului meu și setați pagina dvs. de autentificare URL Portalul adaugă acelaşi traseu opsiq_portal_return (pagina pe care clientul a fost pe); traseul o onorează doar atunci când este în interiorul adresei portalului dumneavoastră și aduce clientul înapoi acolo, semnat.

WHMCS

Nimic de scris: WHMCS cârlig de la Site-uri Remote semnează deja clienții în portal și se ocupă de adresa de întoarcere. Setați pagina dvs. de autentificare URL pentru a dumneavoastră WHMCS Autentificare zonă client.

Semnează peste tot.

De asemenea, semnarea din portal semnează clientul din aplicația dumneavoastră.

Intrarea și protecția

Câmpuri de formulare cerere

Care câmpurile structurate formularul de cerere colectează. Fiecare câmp suplimentar pierde transmiteri, astfel încât să ceară doar pentru ceea ce aveți nevoie pentru triaj.

Protecția împotriva crupelor și abuzurilor

Un pot de miere și limitarea ratei proteja întotdeauna forma publică. Pe partea de sus puteți bloca adrese de e-mail de unică folosință, adăugați propriile domenii blocate, și adăugați un CAPTCHA folosind Google reCAPTCHA sau Cloudflare Turnstile. reCAPTCHA reutilizeaza cheile deja stabilite sub Setări, Securitate; Cheile turnstile sunt introduse aici.

Analize portal

Un rezumat al activităţii portalului în ultimele 30 de zile.

Configurări

Setări: Permisiuni, Licență, Cron și Zona Pericolului

Grupul Sistem, plus controlul accesului echipei care decide cine poate vedea ce filă de Setări.

Accesul în echipă și permisiuni

Per-admin permisiuni

Fiecare administrator primește un set explicit de permisiuni care acoperă accesul la chat inbox, pe care secțiunile Setări le pot edita și departamentele lor. Oricine are rolul de Administrator complet are întotdeauna permisiunea. Permisiunile setări decid ce file vede o persoană, astfel încât să acorde cel mai îngust set care îi permite să lucreze.

Licență

Arată permisul curent, ceea ce vă dă dreptul la și statutul său.

Cron Setare

Doar instalate auto-hosted. Pe OpsIQ nor sarcinile programate rulați pentru tine și fila este ascunsă. O linie de drive-uri crontab fiecare sarcină programată: bilet automat-reply, rutarea escaladare, reîmprospătarea cursului de schimb, sondaje cu căsuța poștală și sincronizare conector.

1
Copiază linia

Fila arată linia crontab exactă pentru serverul dvs. cu binar PHP corect deja ales.

2
Adăugaţi-l la crontab

Run crontab -e ca utilizatorul care rulează PHP și lipi singura linie. Pe cPanel utilizați instrumentul Cron Jobs în schimb.

3
Verificare

În câteva minute, tigla bătăilor inimii se aprinde.

Panoul de bătaie a inimii arată ultima cursă, durata și ceea ce a fost procesat atât pentru coada de răspuns automat cât și pentru sondajul de e-mail și conector. Acesta avertizează atunci când ultimul run a venit de pe butonul web manual mai degrabă decât un cron server real, iar atunci când o bataie a plecat vechi.

Zonă periculoasă

Șterge toate datele de urmărire

Şterge tot OpsIQ colectat sau generat. Ticăieţi ce să includă şi tastaţi fraza de confirmare exact. Setări şi configurarea site-ului, adrese blocate, tot ceea ce echipa dvs. a scris (baza de cunoştinţe, Întrebări frecvente, traduceri, desene portal, definiţii de acţiune) şi chitanţe de consimţământ sunt toate conservate.

Purjează date mai vechi decât

Aceeași verificare limitată la înregistrări mai vechi decât 30, 60, 90 sau 180 zile, sau un an. Pentru reţinere automată de rulare utilizaţi valorile de retenţie în general şi urmărire în schimb şi lăsaţi sarcina programată să o facă.

🚫
Exportaţi o copie de rezervă din Setări, General înainte de a utiliza nimic în Zona Pericol. Aceste acţiuni nu pot fi desfăcute.
Configurări

Gestionarea echipei tale

Invită membrii echipei şi atribuie roluri controlului care poate accesa ce.

Echipa
Echipa & departamenteleEcranul echipei: un tabel de admini cu contact, insigna de rol (Owner, Full Admin, Agent) și departamentele fiecare poate accesa.Echipa & departamentelespațiu de lucruEchipa & departamentele+ Salvează utilizatorul adminContactROLDEPARTAMENTEAO[email protected]Ada OwusuProprietarToateKM[email protected]Kojo MensahCity in New York USAAdmin completToateRT[email protected]Rita Tetteh pe PinterestAgentFacturareaSB[email protected]AgentSprijin1TEAMInvită & administrează adminii2ROLESProprietar · Admin complet · Agent3SCOPEDAccesul la fiecare departament
Ecranul echipei: fiecare administrator cu contact, rol şi departamente pe care le pot ajunge, agenţi supravegheaţi, proprietari complet.

Roluri

Proprietar

Acces complet, inclusiv licenţă, facturare şi zona de pericol.

Admin complet

Acces complet, cu excepţia licenţei şi zonei periculoase.

Agent

Doar bilete, chat-uri şi analize.

Invitarea membrilor echipei

1
Du-te la echipa

Navighează către echipa din bara laterală.

2
Faceți clic pe Invitație

Introduceți e-mailul membrilor echipei.

3
Stabilește rolul

Alege Proprietar, Administrare completă sau agent.

4
Atribuiți departamente

Pentru agenți, selectați departamente accesibile.

5
Trimite invitaţia

Primesc un e-mail cu link de configurare.

Configurări

Performanță în echipă

Cum se realizează echipa de sprijin. Accesul este permis, nu prin rol: permisiunea de vizualizare deschide pagina, permiterea de a gestiona debloca țintele, QA și colegul-identificare citește, iar permisiunea recompensei-financiare este ceea ce adaugă fila Recompense. O echipă de plumb poate fi dat oricare dintre acestea fără a deveni un administrator complet.

Performanță în echipă
Performanță în echipăEcranul de performanţă a echipei: agenţi clasaţi pe un scor compus, CSAT şi un sold al recompensei cu un buton Pay pe rând.Performanță în echipăspațiu de lucruPerformanță în echipăAgentSCORECSATBALANŢARTRita Tetteh pe Pinterest4.8$42Plătiţi.SBFilme cu Sam Boateng4.5$28Plătiţi.KMKojo MensahCity in New York USA4.2$15Plătiţi.AOAda Owusu4.9$51Plătiţi.1SCOREDPerformanță compozită2CSAT & LOADRatinguri + volum3REWARDSSolduri ale agenților plătitori
Ecranul de performanţă al echipei: fiecare agent a marcat pe volum şi CSAT, cu un sold al recompensei pe care îl puteţi plăti pe rând.

Cum este organizată pagina

Fiecare răspunde la o întrebare diferită, și sunt comandate de cât de urgent au nevoie de tine.

01 Centrul de comandă

Stat coadă în direct, rezultate ale clienților împotriva țintelor tale, modul în care capacitatea a fost cheltuită, situații care necesită o decizie și indicele per-amator ajustat dovezi.

02 Colegii de echipă

Clasamentul, recunoașterea (cele mai îmbunătățite și dungi), căutările, precum și controlul opt-in pentru cine poate vedea clasament.

03 Calitatea

Bilete de bord, evaluări înregistrate, acord de revizuire corectat în funcție de șanse, abateri ale revizorului și litigii privind dovezile.

04 Recompense

Valoarea simbolică, cererile de plată și alocarea pe termen reglementat: autorizarea unui plafon finanțat, revizuirea previzualizarei, finalizarea.

05 Istoric

Cum s-a mutat spațiul de lucru în timp: indicatori ai tendinței cu un grafic și o imagine a căldurilor de acoperire 28_zi, care arată când echipa lucra efectiv. Fiecare carte se ascunde singură până când există suficient istoric pentru a-l desena.

Nemarcat nu este zero

Un coechipier fără un volum suficient de manipulat - sau ale cărui dimensiuni care poartă dovezi se adaugă la mai puțin de jumătate din greutatea configurată - este afișat ca Nescorat. Scorul, rangul și banda acestuia sunt goale, iar defalcarea lor este ascunsă. Acest lucru este deliberat: redarea unei măsurători absente ca zero pune pe cineva în partea de jos a unui clasament pentru o săptămână liniștită. Pragurile de dovezi sunt configurabile per spațiu de lucru în Obiective și scoring.

Cele două praguri de probă fac diferite locuri de muncă și este în valoare de a le menține separat. Minimul manipulat decide dacă cineva este marcat la toate. Ratinguri minime nu afectează scorul: se decide acordarea și recompensa eligibilitatea. Deci, un coechipier poate fi înscris pe deplin și clasat și să fie încă neeligibil pentru acea perioadă, deoarece prea puțini clienți le-a evaluat.

💡
Fiecare cifră este în raza de acţiune a spaţiului de lucru pe care îl vizualizaţi şi intervalul de timp pe care-l alegeţi. Un coechipier care lucrează în două spaţii separate are un record independent în fiecare. Două excepţii merită să fie cunoscute: un site GROUP este un spaţiu de lucru, astfel încât domeniile sale membre sunt măsurate împreună; iar All-sites văd totul în mod deliberat masoara totul dintr-o dată.

Indicele de performanță

Un compozit de cinci dimensiuni, fiecare măsurat în raport cu o țintă pe care ați stabilit-o mai degrabă decât împotriva colegilor, apoi tras spre mijloc atunci când dovezile din spatele ei este subțire. Observați direcția: ajustarea se deplasează cifra către 70, astfel încât un scor excelent subțire este tras în jos și un scor slab este trasă în sus. O primă săptămână proastă pe patru conversații nu este nici un verdict stabilit. Ca dovezi acumulează cifra ajustată convergențe pe cel brut.

Calitate

Satisfacţia clienţilor din feedback-ul verificat. Suplimentat cu rezultatele scorului QA acolo unde acestea există şi sunt reglementate.

Responsabilitate

Prima dată când răspundeţi la P50 şi P90 percentile, contra ţintelor.

Rezoluția

Timpul de rezoluție și rata de soluționare a unei singure atingeri.

SLA

Atingerea împotriva SLA pe care le configurat, plus la risc și contele încălcate.

Administrare

Redeschide și ratele de transfer

💡
Greutatea este configurabilă și relativă; nu trebuie să totalizeze 100_. Dovezile lipsă pot reduce doar indexul, niciodată să nu-l ridice

Capacitate și timp de producție

Ocupaţia, timpul de producţie, soluţionate pe oră productivă şi cota online a ferestrei. Utilizarea nu este în mod deliberat raportată: are nevoie de ore programate ca numitor; OpsIQ nu are lista sau sursa de schimbare, iar un numitor înlocuit ar fi o presupunere care poartă un semn procentual. Se citește ca indisponibil cu acest motiv atașat.

⚠️
Ocupaţia spune cum a fost petrecut timpul, niciodată cât de bine a fost cheltuit şi nu a finanţat, porţi sau dimensiuni o plată. Un coechipier fără probe cu timp de lucru arată că nu este disponibil, niciodată ca zero.

Asigurarea calității

Un scorercard este recenzorii rubrici scor conversații reale împotriva. Numai o versiune publicată poate primi o evaluare, și publicarea unei noi versiuni nu rescrie ceea ce a fost deja marcat. O revizuire este dovada despre o singură conversație, nu un verdict pe o persoană.

Acordul de revizuire

Raportat ca o statistică corectată cu șanse (Chen's and Fleiss' Kappa), nu un procent de acord brut. Doi revizori care trec totul sunt de acord 100% al timpului în timp ce transportă nici o informație.

Derivare revizor

Fie că un recenzor înscrie sistematic mai greu sau mai moale decât colegii lor pe aceeași conversație

Litigii

Un coechipier poate contesta oficial dovezile înregistrate despre ele. O dispută deschisă blochează finalizarea perioadei de recompensă până când este rezolvată.

Autorevizuire

Un coechipier nu poate face o evaluare a lor înşişi.

⚠️
Evaluările de nivel IA nu pot influenţa salariul până când se publică o calibrare care să arate că modelul este suficient de aproape de revizorii umani, măsuraţi cu kappa în raport cu un eşantion minim. O poartă deschisă înseamnă că modelul e de acord cu oamenii suficient de strâns pentru a conta

Recunoașterea

Clasamentul singur are moduri de eșec documentate: jocuri metrice, Burnout și rușine publică a celui care este ultimul. Trei alternative stau alături de ea.

Cele mai îmbunătăţite

Măsurat împotriva propriului record al coechipier, niciodată împotriva colegilor, cu mic număr de nume nu poate cumpăra o victorie.

Dungi

Perioadele de consecuție care îndeplinesc un rating fix, declarat bar

Clasament de optare

Off implicit. Un coechipier vede întotdeauna propriul index; dacă văd colegii este o decizie de spațiu de lucru. Trupele de procente pot fi publicate în loc de poziții absolute.

💡
Recunoaşterea nu atinge niciodată banii. O serie de bani nu poate finanţa un câştig sau o spargere, iar cele mai îmbunătăţite nu sunt categoria de premii.

Quest-uri

O țintă spre care lucrează echipa, măsurată mai degrabă împotriva unui bar declarat fix decât împotriva celuilalt

Domeniul de aplicare și cadența

Individual sau echipă; one-off, repetable, sau sezoniere cu o fereastră explicită.

Criterii

Conversaţii manipulate, ratinguri primite, zile active, rating mediu, sau rata de feedback negativ. Toate absolute

Paza de calitate

Necesar pentru orice căutare cu o țintă de volum. Lovind numărul în timp ce calitatea cade sub podea reține căutarea mai degrabă decât completarea acesteia, și se arată ca reținut, nu neterminate.

Repetă limitele

Un plafon pe perioadă, condus de criteriul cel mai lent, plus o răcire opțională înainte ca o repetare să poată fi luată în considerare.

Căutări în echipă

Progresul comun cu nicio atribuire per-amator publicat, astfel încât o căutare de echipă nu poate deveni un clasament.

Sesiuni de coaching

O sesiune de coaching este un record, nu o chat. Ea are un antrenor, un coechipier fiind antrenat, un timp programat, puncte de discuţie convenite, şi un rezumat scris după aceea. Discuţii reale, bilete şi evaluări QA sunt fixate la ea ca dovadă, astfel încât conversaţia este ancorat pentru a lucra care sa întâmplat mai degrabă decât să-şi amintească impresia.

Puncte de discuţie

De acord înainte de sesiune, astfel încât colegul nu este mers pe jos într-o surpriză.

Dovezile confiscate

Chaturi, bilete şi evaluări QA ataşate sesiunii. Un pin stochează o referinţă de tip şi un id nu este o copie, astfel încât întotdeauna indică la înregistrare live. OpsIQ nu verifică ID-ul înainte de a accepta aceasta.

Elemente de acțiune

Fiecare cu un proprietar și o dată scadentă. Un element trecut data sa este afișat ca restante

Notă privată

Coechipierul fiind antrenat nu poate citi niciodată . Nu ca un agent, nu ca un manager, nu în calitate de proprietar. Acest cec rulează înainte de orice altă permisiune și nu pot fi depășite.

Cine poate vedea o sesiune

Antrenorul, coechipierul şi oricine cu permisiunea echipei de conducere.

Audit

Fiecare crea, actualizare, pin, desfacere și finalizare este înregistrată cu ceea ce sa schimbat, de către cine.

💡
Coaching este în mod deliberat separat de notare și de bani. O sesiune nu schimbă indexul nimănui, nu poartă o recompensă, și nu apare pe clasament.

Recompense și premii

Activitatea înregistrată se transformă în jetoane cu o valoare în numerar pe care ați stabilit-o. Calea către o plată este în mod deliberat lentă și fiecare pas este înregistrat.

1
Setează valoarea jetonului

Câte jetoane sunt egale cu câţi bani şi cât valorează fiecare activitate.

2
Acreditează plafonul finanțat

Pentru o perioadă calendaristică închisă, un administrator complet precizează jetoanele maxime pe care le poate plăti. Salvarea formularului de setări nu autorizează un buget și nu poate modifica plafonul care a fost deja autorizat.

3
Revizuiţi previzualizarea

Primitorii, rezerva şi motivul pentru care oricine nu poate fi acceptat.

4
Finalizează

Alocarea este înregistrată permanent cu dovezile din spatele ei. O perioadă care nu poate fi anulată și re-run pur și simplu. Unul care a emis jetoane trebuie să fie inversat mai întâi: OpsIQ scrie o intrare compensatorie împotriva fiecărui portofel și niciodată nu șterge originalul, astfel încât registrul încă arată ce sa întâmplat și de ce, și numai atunci este eliberat perioada. Reversia refuză dacă cineva deja a încasat mai mult decât suma fiind recuperate, și nume care și de cât de mult.

⚠️
Eligibilitatea necesită feedback-ul verificat al clientului. Scorul calității AI poate completa această judecată, dar niciodată să nu o înlocuiască, iar un coechipier demonstrat ca Neescortat nu este eligibil. Fiecare contribuitor este plafonat la 25% peste cota preconizată a perioadei, astfel încât o lună foarte mare nu poate absorbi întregul buget.
💡
Proprietarul contului nu participă la premii sau recompense simbolice, fără niciun schimb: autorizează plafonul finanţat şi finalizează fiecare alocare şi nimeni nu este deasupra lor pentru a aproba ceea ce ar plăti ei înşişi. Munca lor este măsurată, marcat şi clasat pe bord exact ca oricine altcineva.

Toţi ceilalţi participă în mod implicit, echipa conduce şi coproprietari incluse. Pentru a lăsa pe cineva afară, deschide-le în Team & Departamente şi opriţi partea Takes la opţiunea de premii şi recompense. Munca lor este încă marcat şi arătat; ei nu mai fi un candidat din acel punct pe, şi nimic deja finalizat este atins.

⚠️
Nimeni nu aprobă bani pentru sine. Pentru că oamenii care pot lua parte sunt, de asemenea, persoanele care pot aproba plățile, OpsIQ refuză plata sau creditul în propriul portofel, plătindu-ți propria cerere, finalizand o perioadă în care vei fi plătit și definitivând un premiu pe care îl vei câștiga. Un alt administrator complet sau proprietarul trebuie să o facă. Plătiți toate creanțele sare peste propria ta și raportează ca sarit, nu a eșuat.

Cine poate vedea şi face ce

Vizualizează performanța echipei

Consiliul, starea în direct, capacitatea și calitatea de ansamblu pentru spațiul de lucru.

Gestionează performanța echipei

Obiective și scoruri, exporturi, scorecard-uri QA și evaluări, coaching, quest-uri, precum și lecturi care transportă date de identificare coleg, cum ar fi istoria pe-admin și istoricul premiilor.

Vezi echipa recompensa financiara

Conturi, valori în numerar, bonuri de cerere și referințe la plată

Numai administrator complet

Fiecare mutație monetară: plata unei recompense, plata sau respingerea unei creanțe, autorizarea unui buget, finalizarea, anularea sau inversarea unei alocări și stabilirea ratei jetoanelor la numerar. Acestea nu pot fi delegate prin acordarea unei autorizații.

Folosind-o corect

Indicele de performanţă este dovada managementului, nu o decizie automată de angajare. Deschideţi conversaţiile sursă în spatele unui număr înainte de a acţiona pe ea, şi cântăreşte complexitatea cazului, orare, concediu şi nevoile de accesibilitate. O singură săptămână dificilă nu arată nimic ca un model susţinut.

Configurări

Site-urile dumneavoastră (spații de lucru)

Site-uri (spații de lucru) vă permit să gestionați mai multe site-uri web de la o instalare OpsIQ. Fiecare are propria urmărire, AI, conectori și acces în echipă.

Site-uri
Site-urile dumneavoastrăEcranul site-urilor: o listă de spaţii de lucru, fiecare cu domeniul său, tip, conector, insignă de stare şi un buton deschis, plus Adăugaţi-new-site.Site-urile dumneavoastrăspațiu de lucruSite-urile dumneavoastră+ Adăugați un nou siteSshop.acme.comConector eCommerce · ShopifyActivDeschideHhost.acme.comGazduire · WHMCS conectorActivDeschideBblog.acme.comConținut · fără conectorConfigurareDeschide1MULTI-SITEUn spațiu de lucru pe sit2ISOLATEDDatele nu se amestecă niciodată3PER-SITESetări proprii & conectori
Ecranul real al Site-urilor: fiecare site este propriul său spațiu de lucru izolat (domeniul propriu, conector și setările), adăugat și deschis dintr-o singură listă.

Crearea unui site

1
Du-te la site-uri conectate

Navighează către Site-uri conectate.

2
Adaugă un nou site

Introduceți numele, domeniul și descrierea.

3
Copiază tasta site-ului

Fiecare site primește o cheie unică (site_xx) pentru fragmentul widget.

4
Configurează independent

Fiecare site are propriile AI, conectori și setări.

Câte site-uri pot avea?+

Depinde de planul de licenţă. Verificaţi detaliile licenţei.

Configurări

Licență și plan

OpsIQ caracteristicile controlului licenţei, limitele site-ului şi soldul creditului AI.

Licență
Centrul de licenţăă OpsIQ Centrul de licenţă: plan, insignă de stare activă, tasta de înmatriculare mascată, un contor de credit AI şi un buton de verificare Force-remote.Centrul de licenţăspațiu de lucruOpsIQ Centrul de licenţăPlanBusinessStareActivCheieOPSIQ-••••-••••-2F9CCredite AI$68 stângaVerificarea la distanță a forței1PLAN & STATUSActiv, dintr-o privire2KEYHMAC-cache local3CREDITSEchilibrul AI și limitele
Adevăratul Centru de Licenţă: planul şi statutul activ, cheia mascată, soldul tău al creditului AI şi o reverificare a forţei cu un clic.
Cheia licenţei

Introduceți în Setări > Licență. Validată împotriva serverului de licență OpsIQ.

Inima/validarea licenţei

OpsIQ în mod normal, citește cache-ul licenței locale semnate și reîmprospătează validarea atunci când este necesar. DNS, HTTPS sau probleme de timp ale serverului.

Plan

Determină disponibilitatea și limitele caracteristicilor.

Limitare a sitului

Numărul maxim de spații de lucru.

Credite AI

Dacă utilizaţi Managemented AI, soldul dvs. de credit este afişat aici.

Expirarea

Reînnoiți înainte de expirare pentru a evita întreruperea serviciului.

Ce se întâmplă când îmi expiră licenţa?+

Urmărirea, biletele și CRM continuă. AI oferă o pauză până la reînnoire. Datele sunt păstrate.

Configurări

Profil, parolă și autentificarea a doi factori

Fiecare administrator își poate menține propria identitate, preferințe de lucru, parolă și autentificare cu doi factori.

Ecran produs
Profilul meuPagina de profil separă detaliile personale, limba/timpul, avatarul/semnătura, parola și autentificarea celor doi factori.Profilul meuspațiu de lucruPROFILCompletatTIMEZONEEuropa/Ateni2FAActivatVIE VIU AIRPACENume și e-mailIdentitatea personalăEditareLimba și fusul orarDate și interfațăEditareAvatar și semnăturăRăspunsuri și prezența echipeiEditareParolă și 2FAProtecția contuluiSigur1UPDATE PROFILEIdentitate și localizare2SECURE LOGINParolă și 2FA3SAVEAplicați la acest admin
Pagina de profil separă detaliile personale, limba/timpul, avatarul/semnătura, parola și autentificarea celor doi factori.

Setările de profil aparţin administratorului semnat şi nu schimbă brandul spaţiului de lucru. Utilizaţi o parolă unică şi permite autentificarea a doi factori. Schimbarea unui e-mail sau setare de autentificare poate necesita reverificare sau un nou sign-in.

Configurări

Preferințele notificării

Controlul preferințelor de notificare care se realizează prin intermediul unui administrator în produs sau e-mail.

Ecran produs
Preferințele notificăriiPagina de notificare oferă opţiuni pentru fiecare eveniment în aplicaţie şi e-mail, plus o listă recentă de notificări.Preferințele notificăriispațiu de lucruIN-APP- Da.E-mailSelectivăUNREAD4VIE VIU AIRPACEBiletul alocatÎn aplicație și email- Da.Clientul a răspunsÎn aplicație- Da.Riscul de SLAÎn aplicație și email- Da.Aprobarea AIÎn aplicație și email- Da.1CHOOSE EVENTSNumai semnale utile2CHOOSE CHANNELÎn aplicație sau e-mail3REEXAMINAREANotificări recente
Pagina de notificare oferă opţiuni pentru fiecare eveniment în aplicaţie şi e-mail, plus o listă recentă de notificări.

Preferințele acoperă atribuirea biletelor, răspunsurile clienților, avertismentele SLA, chat-off și evenimente de aprobare AI. Păstrați semnale operaționale urgente activate undeva; închiderea e-mailului nu închide în mod necesar notificarea în aplicație.

Configurări

Prezentare generală privind securitatea

Prezentare generală de securitate este primul ecran pentru evaluarea blocurilor, a atacurilor de conectare, sesiunilor de amenințare, tendințele de securitate și integritatea evenimentelor.

Ecran produs
Prezentare generală privind securitateaPrezentare generală de securitate combină cardurile de risc actuale, o tendință 14_zi, lista atacatorilor, feed-ul evenimentului și starea integrității.Prezentare generală privind securitateaspațiu de lucruACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3VIE VIU AIRPACEBlocat automat7- totalul zilei și sursaTendințăUltimii atacatoriIP, țară și motivRevizuireEvenimente de securitateRezultatul riscului și al acțiuniiHrană pentru animaleIntegritatea hash-lanțLanțul de evenimente Tamper-evidentValabil1READ HEADLINEExpunerea curentă2OPEN EVIDENCEAtacatori și evenimente3ACTBloc, investigaţii, export
Prezentare generală de securitate combină cardurile de risc actuale, o tendință 14_zi, lista atacatorilor, feed-ul evenimentului și starea integrității.

Utilizați cărțile de titlu pentru triaj, apoi deschide auditul asociat, Loginuri eșuate, blocat IPs sau JavaScript Pagina de erori pentru munca la nivel de înregistrare. 14 Tendinta zilei este mai utila decat un singur varf. Sesiunile de mare amenintare ar trebui investigate impotriva vizitatorilor, solicitarii si autentificarilor inainte de aplicarea unui bloc permanent.

Configurări

Jurnal de audit Tamper-evident

Jurnalul de audit înregistrează cine a făcut ce, când, la care obiect, la ce nivel de risc și dacă acesta a reușit.

Ecran produs
Auditul activitățiiPagina de audit oferă activitate de căutare-perfect cu acțiune, actor, risc, țintă și rezultat.Auditul activitățiispațiu de lucruEVENIMENTE18.2kHIGH RISK21INTEGRITYValabilVIE VIU AIRPACEConector activat[email protected] · ShopifySuccesAPI cheie revocată[email protected] · cheie 19SuccesConfigurările s-au schimbat[email protected] · AISuccesPermisiune respinsă[email protected] · exporturiBlocat1FILTERAcţiune, risc şi actor2INSPECTȚintă și rezultat3EXPORTCSV sau JSON
Pagina de audit oferă activitate de căutare-perfect cu acțiune, actor, risc, țintă și rezultat.

Filtrare prin acțiune, risc și actor; export CSV sau JSON pentru o investigație. Lanțul hash ajută la detectarea rândurilor de audit lipsă sau modificate, dar nu înlocuiește copiile de rezervă protejate și accesul limitat la baze de date. Tratează exporturile de audit ca fiind sensibile deoarece acestea pot identifica utilizatorii, înregistrările și acțiunile de securitate.

Operațiuni

Diagnostice

Diagnosticul transformă verificările subsistemului în rezultate de sănătate simple și acțiuni directe.

Ecran produs
DiagnosticeDiagnostice grupuri controale de sănătate pentru widget, AI, bilete, integrări, Site Intelligence, sarcini de fundal, CRM automatizare, licențiere și stocare.Diagnosticespațiu de lucruSPECIALITATEA13WARNING2EȘUIT1VIE VIU AIRPACEControlObiective finale Beacon și chatSănătosSarcini de fondBătăile inimii cron târziuAvertismentE-mailÎncercarea de ieșire a eșuatEșuatConectoriRegistrul și aportul de evenimenteSănătos1REFRESHExecută verificările curente2OPEN WARNINGCitiți dovezile3FIX AND RETESTConfirmă recuperarea
Diagnostice grupuri controale de sănătate pentru widget, AI, bilete, integrări, Site Intelligence, sarcini de fundal, CRM automatizare, licențiere și stocare.

Pagina verifică viteza site-ului, rang/cuvinte cheie/backlink/local data, AI și poarta de acțiune, bilete, crawler / audituri, integrare / participare eveniment, sarcini de fundal, automatizări CRM, licență, widget și servicii conexe de produse. Acesta raportează în mod intenționat cauze citite de operator mai degrabă decât expunerea secrete brute.

După o schimbare, Reîmprospătați și confirmați că subsistemul afectat revine sănătos. O pagină de diagnosticare verde este necesară dar nu suficientă pentru lansare; completați și lista de verificare Prelansare.

Configurări

Securitate și acces

OpsIQ include mai multe straturi de securitate pentru a proteja admin, date și API Acces.

Cum funcţionează
Securitate și accesUn scut de securitate alături de controalele activate: doi factori, OIDC SSO, SCIM 2.0, OAuth2 PKCE, CSRF/CSP IP Firewall, limite de viteză și un seif secret.Două elemente (TOTP)OIDC SSOSCIM 2.0OAuth2 PKCECSRF + CSPIPfirewallLimitele rateiSecretele seifului
Securitatea

Caracteristici de securitate

Autentificare admin

E-mail/paşaport cu 2FA opţional.

Blocare autentificare

Blocare temporară după prea multe încercări eșuate.

IP blocarea

Bloc IPs sau CIDR variază de la accesarea site-urilor urmărite.

Punctaj de ameninţare

Scoruri de ameninţare bazate pe comportament. Vizitatorii cu mare pericol pot fi blocaţi automat.

Aplicarea HTTPS

Necesar pentru toate conexiunile. HTTP redirecţionează către HTTPS.

Antete HTS

Strict-Transport-Securitate previne atacurile de reducere.

Protecția CSRF

Toate formularele de admin includ jetoane CSRF.

Protecţia XSS

Toate intrările de utilizator este scăpat. antetele CSP restricționează executarea script-ului.

Protecția SSRF

Adresele web de ieșire blochează private/interne IP adrese.

Configurare recomandată

1
Activează 2FA

Pentru toate conturile admin.

2
Parolele puternice

Caractere minime 12 amestecate.

3
Conturi de examinare

Elimina accesul pentru foştii membri ai echipei.

4
Monitorizează loginurile eșuate

Verificaţi săptămânal dacă sunt modele suspecte.

5
Păstrați actualizarea

Aplicați actualizările prompte pentru plasturii de securitate.

Configurări

Roluri și permisiuni

Controlul accesului bazat pe rol vă permite să controlați ce poate face fiecare membru al echipei.

Roluri și permisiuni
Roluri și permisiuniO matrice de rol cu capacitate: Proprietarul are totul; Administraţia completă nu are facturare şi zona periculoasă; Agentul a pus doar biletele la vedere.Roluri și permisiunispațiu de lucruSEMINȚEFACTURAREAPERICOLBILETEProprietarAdmin completAgentscoped13 ROLESProprietar · Admin complet · Agent2GRANULARPe pagină + pe departament3DEFAULT-DENYRutele uitate blocate
Matricea de rol dintr-o privire: Proprietarul primește totul, Admin complet totul în afară de facturare și zona de pericol, agent numai biletele lor cu lunetă.

Roluri implicite

Proprietar

Totul, inclusiv licenţa, zona de pericol şi managementul instalaţiilor.

Admin complet

Totul, cu excepţia licenţei şi a zonei periculoase.

Agent

Răspundeţi la biletele de plecare şi chat, vizualizaţi analiza. Fără setări, echipă sau acces la securitate.

Pot crea roluri personalizate?+

Trei roluri încorporate plus atribuirea de departamente oferă control granular.

Configurări

Blocat IPs

Gestionați IP adresele blocate de la accesarea site-urilor urmărite.

Blocat IPs
Blocat IPsBlocatul...IPs Ecranul: un bloc-un...IP/CIDR formă lângă un tabel Addresses blocate cu fiecare intrare, dată, motiv și un buton Unblock.Blocat IPsspațiu de lucruBlochează un IP /CIDR203.0.113.0/24Motivul (opțional)BlocAdrese blocate203.0.113.9Jun 12 · forța brutăDeblocare45.12.0.0/16Jun 10· spamDeblocare102.89.6.2Jun 9 · abuzDeblocare1BLOCIP sau gama CIDR2LISTCine & când, cu motiv3UNBLOCKUn click
Adevăratul Blocat IPs ecran: bloc un singur IPs au o gamă CIDR și gestionează lista, fiecare cu data, motivul și un singur click de deblocare.

Cum se blochează

1
Du-te la securitate > blocat IPs

2
Adaugă un interval IP sau CIDR

Exemplu: 203.0.113.42 sau 203.0.113.0/24

3
Adaugă un motiv

Document de ce: spam, abuz, răzuire etc.

Va afecta blocarea utilizatorilor legitimi?+

În cazul în care clienții împart o societate IP sau VPN, blocând IP Foloseşte blocuri înguste.

Configurări

Autentificări eșuate

Toate încercările de conectare nereușite la dumneavoastră OpsIQ Admin.

Autentificări eșuate
Autentificări eșuateEcranul de logări eșuate: un tabel de conturi/IPs cu un număr de eșec, timp de ultima încercare, și un buton Block pe rând.Autentificări eșuatespațiu de lucruÎncercări de autentificare eșuateCont / IPEȘUITUltimulACŢIUNI[email protected] · 41.62.10.47Acum 2 mBloc[email protected] · 102.89.6.23Acum 18 mBlocnecunoscut · 45.12.9.712Acum 26 mBloc[email protected] · 88.21.4.921h acumBloc1WATCHÎncercări de autentificare eșuate2COUNTSPe cont / IP3ACTBloc de la rând
Ecranul real de autentificare eșuată: fiecare cont/IP cu eşecul său şi ultima încercare, blocaţi o sursă de forţă brută direct din rând.

Ce arată fiecare intrare

Data/ora

Când a avut loc tentativa.

E-mail

Adresa de e-mail utilizată.

IP adresă

Sursa tentativei.

Țara

Locaţie geografică.

Motivul

Parola greşită, blocată sau nu.

Semne de avertizare

Multe încercări, acelaşi e-mail

Ghicește parola. Asigurați-vă că 2FA este activat.

Multe încercări, diferite e-mailuri

Atac automat. Blochează sursa IP.

Ţări neobişnuite

Dacă echipa ta e locală, încercările străine sunt probabil atacuri.

Configurări

Analist de securitate AI

Un strat de analist opt-in peste paginile de securitate: verdicte, scurte incidente, un diger zilnic, o verificare postura săptămânal, Ask Security, și 0-token politici block. Ea nu rulează în calea cererii vizitatorilor.

Fiecare pagină de securitate înregistrează ce s-a întâmplat, dar citirea ei încă mai ia decizii. Analistul de securitate AI adaugă că judecata în loc, și este construit pentru a cheltui aproape nimic: nu stă niciodată pe calea baliza sau login, regulile deterministe rezolva cazurile evidente fără apel AI, verdictele sunt cached, iar cea mai bună ieșire analistului este o regulă determinantă care apoi aplică pentru totdeauna la zero jetoane. Configurări → Securitate; toate implicit off.

Ce adaugă

Cipuri de Verdict + Explicați

Blocat IPs și Rândurile Loginuri eșuate arată un cip benign / suspect/ ostil cu scor de încredere. Explică deschide raționamentul, faptele utilizate și one-click Block / Acțiuni de lansare. Cached 24h, deci re-vizionarea o IPeste liber.

Slipuri de incidente

Evenimentele asociate se grupează într-un incident (val de logare, scanare URL, spargere automată) cu o linie temporală simplă-engleză și un pas următor recomandat. Atacurile în curs se împăturesc în același incident.

Digerare zilnică

O recapitulare pe zi: ieri faţă de baza ta, blocuri, incidente şi un singur lucru de făcut. Zilele liniştite trimit o deterministă liberă la zero jetoane.

Verificarea posturei săptămânale

O listă de verificare luni întărire (2FA lacune, prag de blocare față de volumul real atac, alerte off) cu o severitate, efort și fix exact per element.

Întreabă securitatea.

O cutie de întrebări pe Scannerul de securitate care răspunde din starea ta de securitate live. Întrebări server profund sunt transmise admin inginerului chat mai degrabă decât ghicite.

Propuneri de politică + pilot automat

Analistul propune reguli concrete de bloc ca carduri Aprob / Resping; normele aprobate aplică la zero jetoane cu un contor live lovit. Autopilot opțional aprobă doar cele mai sigure reguli automat.

Configurări

Analist de securitate AI (security_ai_enabled)

Master switch. Activează cipuri verdict, Explicați, și întrebați de securitate. Numai ambiguu IPs ajunge la modelul, adunat într-un singur apel.

Scurturi incidente (security_ai_incidente)

Clusterează evenimentele în incidente şi scrie fiecare poveste nouă.

Digerare zilnică (securitate_ai_digest)

O recapitulare a securităţii pe zi la clopoţel şi la prezentarea generală.

Verificarea posturei săptămânale (securitate_ai_postură)

Lista de verificare este complet deterministă.

Pilot automat de politică (securitate_ai_autopilot)

Permite analistului să-şi activeze cele mai sigure propuneri nesupravegheate: doar blocuri reversibile limitate în timp, unice IPs sau intervale nu mai mari de /24, niciodată partajate/mobile/private, plafonate 10 pe oră, întotdeauna auditată şi de neatins.

💡
Fiecare apel este etichetat de securitate_ai cu propriul capac lunar în AI Config → Cost Guardrails (default 300k jetoane). Dacă capacul este lovit, caracteristicile se degradează la citiri deterministe. Blocarea, blocare și alerte nu depind niciodată de acest buget. Analistul nu poate șterge date, modifica setările, atinge registrul de audit sau face o interdicție permanentă.
Operațiuni

Cron și automatizare

OpsIQutilizează un programator de produse pentru a rula sondaje de e-mail, automatizarea biletelor, rulaje analitice, retenţie, cozi AI;CRM munca, rapoarte și locuri de muncă conector.

Ecran produs
Cron și automatizareUn produs de intrare Cron furnizează bătăile inimii; OpsIQ decide ce locuri de muncă interne sunt datorate.Cron și automatizareserverInima bateFiecare minutRUNNERcron/all.phpHEALTHConfigurăriVIE VIU AIRPACERulator de produse unificatopsiq/cron/all.phpNecesarCozi de bilete și e-mailLucrări scurte programateActivAnalize și reţinereCadență internăProgramatAbonati conectoriEvenimentele de Cron declarateDomeniul de aplicare1INSTALL ONE LINERulați programatorul de produse în fiecare minut2CHECK CRON SETUPConfirmaţi bătăile inimii CLM3USE DIAGNOSTICSInvestigarea muncii întârziate sau eșuate
Un produs de intrare Cron furnizează bătăile inimii; OpsIQ decide ce locuri de muncă interne sunt datorate.

Intrarea necesară în cron

Adăugați această linie unică la crontab pentru același server și mediu PHP care rulează OpsIQ:

OpsIQ intrare crontab produs
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

Înlocuiește /path/to/opsiq cu radacina de instalare. Utilizați calea PHP CLI completă atunci când gazda necesită una, de exemplu /usr/bin/php8.4.

Nu utilizaţi nivelul superior /cron.php pentru lucrări de produs. În acest depozit că alergător aparține unui serviciu separat non-produs în afara acestui manual. OpsIQ produs runner este opsiq/cron/all.php.

Ce unitate unificat programator

Cozi bilete și AI

Procese datorate automat-replică, escaladarea, aprobări și alte lucrări de produs la coadă.

E-mail de intrare

Sondajele configurate cutiile poştale unde sondajul este metoda de admisie selectată.

Analize și sesiuni

Adună sesiuni și reîmprospătează agregatele programate atunci când acestea sunt datorate.

CRM și angajament

Rulează scoruri, ciclu de viață, fluxul de lucru, campanie și sarcini programate-raport care sunt activate.

Reţinere şi întreţinere

Efectuează lucrări de curăţare, arhivă, expirare şi integritate.

Conectori

Dispeceratul conectorilor abonați și sondaje numai pentru conectori instalați, activați și configurați.

Verificaţi cron

  1. Deschide Configurări - Configurare cron şi confirmă că există alergătorul de produse.
  2. Utilizare Fugi acum. Odată, apoi confirma admin și sondaj bate inima actualizare.
  3. Verificat Diagnostice pentru bătăile inimii tardive, CLI PHP, baza de date sau problema fişier-pat.
  4. Inspectează /tmp/opsiq-cron.log sau calea log pe care ați selectat-o atunci când o rulare manuală nu reușește.

Menţineţi mâner conectori scurt, idepotent şi spaţiu de lucru-scoped. Sincronizări lungi serie şi stoca un cursor / punct de verificare astfel încât următoarea rulare poate continua în condiţii de siguranţă.

🚫
Când produsul se opreşte, timpul bazat pe OpsIQ se oprește sau devine târziu chiar dacă paginile administrative obișnuite pot încă să se încarce.
Operațiuni

Operațiuni de desfășurare găzduite

O implementare găzduită OpsIQ utilizează aceleași ecrane de produs și fluxuri de lucru în timp ce operatorul gazdă gestionează stratul serverului. Înscrierea comercială, planurile, facturarea și procedurile de cont-portal sunt în afara acestui manual.

Ecran produs
Desfășurare găzduităSchimbările de operare găzduite care mențin infrastructura; nu schimbă modul în care clienții utilizează OpsIQ.Desfășurare găzduităspațiu de lucruPRODUCT UILa fel. OpsIQINFRASTRUCTUREOperator administratWORKSPACE DATAIzolatVIE VIU AIRPACETimpul de aplicarePHP, server web și baze de dateGestionatCron produsProgramat de operatorul gazdăVerificareBackup-uri și actualizăriPolitica furnizorilor și dovezileRevizuireOpsIQ setăriSite-uri, AI, echipa și conectoriEchipa ta1OPERATE OPSIQ NORMALLYUtilizați aceeași navigație a produselor2VERIFY SERVICE HEALTHUtilizați diagnosticele și dovezile de stare3KNOW RESPONSIBILITYSetări separate de la lucrările de găzduire
Schimbările de operare găzduite care mențin infrastructura; nu schimbă modul în care clienții utilizează OpsIQ.

Ce gestionează operatorul de găzduire în mod normal

  • Server web, PHP runtime, servicii de baze de date, TLS și stocare.
  • Cronul de produs unificat și jurnalele sale la nivel de server.
  • Actualizările de aplicații, monitorizarea infrastructurii și procesul de rezervă definit prin acordul de găzduire.

Ce... OpsIQ administratorul încă mai administrează

  • Site-uri web și instalare widget, setări AI, cunoștințe, cutii poștale și fluxuri de lucru pentru client.
  • Acces echipa, departamente, controale de securitate, API taste, conectori, automatizări și setările de păstrare a datelor.
  • Verificarea produsului prin Diagnostics, jurnalul de audit, testele conectorilor și verificările reale la sfârșit.

Controale operaționale

Nu presupuneți că un serviciu gestionat înseamnă fiecare integrare a produselor este sănătoasă. Confirmați cele mai recente dovezi de rezervă și politica de reținere cu operatorul gazdă, precum și utilizarea OpsIQ Diagnosticare după modificări la DNS, e-mail, furnizori AI, site-uri web sau conectori.

Această secțiune se referă numai la operațiunile de produse. Comerciale la bordul navei, abonamente, facturare și administrarea contului de clienți rămân în afara manualului OpsIQ.

Operațiuni

Auto-hosting OpsIQ

Un auto-hosted OpsIQ instalarea ruleaza pe infrastructura pe care o controlati. Sunteti responsabil pentru timpul de rulare, baza de date; TLS, Cron produs, copii de rezervă, actualizări și monitorizare.

Ecran produs
Auto-prezentareAuto-hosting oferă controlul infrastructurii și face echipa ta responsabilă pentru fiecare dependență de operare.Auto-prezentareserverPHP8.4+DATABASEMySQL 5.7+SCHEDULERFiecare minutVIE VIU AIRPACEExtensii de timp de execuțieCurl, pdo_mysql, mbstring, jsonNecesarExtensii suplimentarexml, în limba engleză, OpenSSL, FolositNecesarAlternativă de baze de dateMariaDB 10.3+ cu InnoDBSuportatTransporturiHTTPS și accesul furnizorilor de servicii externeVerificare1PREPARE THE SERVERCerințe privind timpul de execuție al meciului2INSTALL AND CONFIGUREUtilizați o bază de date dedicată și HTTPS3ADD PRODUCT CRONRulează opsiq/cron/all. php
Auto-hosting oferă controlul infrastructurii și face echipa ta responsabilă pentru fiecare dependență de operare.

Contract minim de software

PHP

PHP 8.4 sau mai nou. Extensii necesare: buclă, pdo_mysql, mbstring, json, xml, openssl, zip, intl și gd.

Baza de date

MySQL 5.7+ sau MariaDB 10.3+ folosind InnoDB. Creați o bază de date dedicată și utilizator de aplicații cel mai puțin privilegiat.

Server web

Apache sau Nginx configurate pentru controlerul frontal OpsIQ, activele statice și rescrierile necesare.

HTTPS

Necesar pentru sesiunile de admin, traficul widget, API taste, webhooks și apelurile furnizorului.

Accesul în afara zonei de acces

Permite DNS și acces HTTPS la AI, e-mail, conector și criteriile de licență pe care le permiteți efectiv.

Acces fișier

Utilizatorii web și CLI trebuie să poată citi fișiere de aplicații și să scrie numai în locațiile documentate pentru timp/de stocare.

Cron

Rulați OpsIQ programatorul de produse în fiecare minut cu aceeași configurație de aplicație și acces la baza de date ca procesul web.

Secvența de instalare

  1. Încărcați eliberarea la rădăcina documentului avut în vedere și păstrați structura directoare furnizate.
  2. Creați baza de date și utilizatorul aplicației, apoi introduceți baza noastră de date, canonică URL și setările licenței.
  3. Rulați fluxul de instalare/setare și creați primul cont proprietar.
  4. Activează HTTPS și verifică redirecționările, cookie-urile și widget-ul public/API căi.
  5. Adaugă unificat OpsIQ Cron produs:
Produs auto-hostat
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
  1. Setări deschise - Cron Setup și Diagnostics; executați programatorul o dată și rezolva fiecare dependență eșuată.
  2. Configurați procedurile de rezervă, restabiliți testarea, ținerea jurnalului și actualizarea înainte de adăugarea datelor de producție.

Actualizare în condiții de siguranță

  1. Citiți notele de lansare și verificați PHP/extensii necesare înainte de a schimba fișierele.
  2. Înapoiază baza de date și fișierele aplicație/configurare, apoi demonstrează că backup-ul poate fi restaurat într-o locație de testare.
  3. Desfășoară noile fișiere fără a șterge configurația specifică instalației sau datele privind timpul de funcționare.
  4. Rulați procesul de migrare/prezburare furnizat și verificați login, urmărire widget, bilete, e-mail, AI, conectori și cron.
  5. Păstrați la dispoziție eliberarea anterioară și baza de date pentru fereastra documentată rollback.
🚫
Depozitarul de nivel superior /cron.php nu este OpsIQ Programator de produse. Automatizare punct numai la opsiq/Cron/all.php
⚠️
Nu ștergeți . schema_cache.json ca întreținere de rutină. Scoateți-l numai atunci când instrucțiunile produsului necesită în mod explicit o schemă-cache reconstrui.
Operațiuni

Ghid de producție

Lista de verificare și cele mai bune practici pentru rularea OpsIQ în producție.

Ghid de producție
Ghid de producțieO listă de verificare go-live: domeniu personalizat și SSL, AI antrenat, conectori și cron, backup-uri și reținere, și rolurile echipei.Lista de verificare în directspațiu de lucruÎnainte să pleci în directDomeniul personalizat + SSL configuratAI antrenat pe conținutul dumneavoastrăConectori testați · rulare cronSet de rezervă programat · reținereRoluri de echipă atribuite & revizuite1GO-LIVELista de verificare prealabilă la lansare2VERIFICAȚIDomeniu · SSL · copii de rezervă3CONFIDENTNavă când este verde
O listă de verificare go-live astfel încât să nu se piardă nimic: domeniu + SSL_, AI instruit, conectori testate și cron, backup-uri și reținere, și rolurile echipei.

Înainte de a merge live

HTTPS configurat

SSL instalat, redirecționări HTTP, activate HTS.

Cron rulează

Verificaţi prin intermediul paginii diagnostice.

AI testat

chat ca un client. Verificați acuratețea și tonul.

Widget instalat

Pe toate paginile site-ului. Verificați cu live Feed.

Configurat backup

Baza de date zilnică automată şi fişierele de rezervă.

Eroare la logare

Jurnal de eroare PHP activat și monitorizat.

Echipa invitată

Toţi membrii au conturi cu roluri corecte.

Baza de cunoștințe populată

Cel puţin. 5-10 articole.

Zilnic: Verificați bord, coada de bilete clare, la fața locului verifica conversații AI.

Săptămânal: Revizuire AI Insights, actualizare KB, verificare performanta echipei, revizuire de securitate.

Lunar: Analiza tendintelor de analiza, conectori de audit, actualizarea antrenamentului AI, verificarea backup-urilor.

Operațiuni

Lista de verificare prealabilă la lansare

Rulați porțile sursă și verificați produsul real complet înainte de o lansare sau prima lansare de producție. O comandă fiind disponibilă nu este dovada că a trecut în mediul dumneavoastră.

Ecran produs
Verificarea eliberăriiVederea de lansare arată că este necesară rularea porților; nu le etichetează înainte de trecerea lor.Verificarea eliberăriiserverRUNTIMEPHP8.4SOURCE GATESRulează localOUTCOMEPe baza dovezilorVIE VIU AIRPACEExtensii necesareVerificați înainte de suităPoartăPHP syntaxa rampăToate fișierele PHP ale proiectuluiPoartăEvaluarea AI și PHPUnitRulați atunci când dependențele sunt prezentePoartăControale statice și de navigareExecută când este configuratPoartă1RUN THE CHECKSCapturarea producției reale2FIX EVERY REQUIRED FAILURENu înlocuiți probele cu ipoteze3TEST THE PRODUCTVerificați călătoriile reale ale utilizatorilor
Vederea de lansare arată că este necesară rularea porților; nu le etichetează înainte de trecerea lor.

Surse și porți de eliberare

Rulați verificările depozitului de la rădăcina instalației și păstrați-le ieșire completă cu înregistrarea de lansare.

Poarta principală de prezburătoare
php tools/preflight.php
Poarta extinsă de eliberare
php tools/release_gate.php

Prezbiterul verifică PHP 8.4 runtime și extensii necesare, efectuează o verificare a sintaxei PHP, rulează poarta de evaluare a navei AI și suita completă PHPUnit și verifică PHPStan/Node atunci când sunt instalate aceste instrumente. Poarta extinsă include, de asemenea, fum, curat-instalare /schema și browser-ul la sfârșit atunci când mediul lor este configurat.

O verificare omisă nu este un permis. Înregistrați de ce a fost indisponibil, instalați dependența lipsă sau executați-l în mediul corect CI / stivare înainte de eliberare.

Controalele produselor

1. Autentificare și roluri

Semnează ca fiecare rol avut în vedere; verifică paginile/acţiunile permise şi refuzate.

2. Widget și urmărire

Încarcă un site real într-un browser privat; verifică traficul de balize, live Feed, vizitatori și înregistrări sesiuni.

3. chat și AI

Pune întrebări reprezentative; verifică fundamentarea cunoștințelor, siguranța, escaladarea și istoricul AI.

4. Bilete

Creați, atribuiți, răspundeți, escaladați, închideți și redeschideți prin fiecare cale de admisie activată.

5. E-mail

Test de livrare outbound și fiecare cutie poștală de intrare configurată sau cale webhook.

6. CRM și analize

Creați un contact controlat/deal/conversie și verificați bordurile de bord, pâlniile, scorul și rapoartele.

7. Conectori

Rulați teste de conexiune, o citire, un seif scrie / se usucă run și căi webhook/polling pentru fiecare conector activat.

8. API și cârlige web

Verificați domeniul de aplicare îngust, limitele ratei, retușările idepotente, semnăturile și manipularea duplicatelor.

9. Cron

Rulați programatorul unificat de produse și confirma toate bătăile inimii necesare în Cron Setup / Diagnosticii.

10- Paza.

Verificați 2FA, CSRF/controlul sesiunii, intrările de audit, revocarea cheilor și izolarea spațiului de lucru.

11. Backup și restaurează

Restaurarea unei rezerve de curent într-un mediu separat de testare și verificarea datelor și a configurației.

12. Observabilitate și răsturnare

Confirmă jurnalele/alertele, păstrează ID-urile de cerere și dovedește procedura de răsturnare.

⚠️
Desfăşuraţi-vă numai după fiecare poartă necesară şi călătorie critică de afaceri are dovezi actuale pentru eliberarea exactă şi mediu.
Dezvoltator

Împinge pe site-uri terțe

Notificări de împingere a browser-ului (inclusiv OpsIQ Campanie de împingere) au nevoie de un lucrător serviciu servit din aceeași origine ca pagina.OpsIQ widget sarcini de la dumneavoastră OpsIQ implementarea, astfel încât un site terţ nu se poate înregistra OpsIQ Un mic fisier pe domeniul propriu al site-ului pentru a permite împingerea acolo. Campaniile livreaza prin ambele metode acceptate.

Cum funcţionează
Împinge webO notificare de împingere în stil OS peste două carduri de livrare: Built-in VAPID și Pusher Beams.Magazinul tău.Coșul dumneavoastră așteaptă · 10% off astăziAcumConstruit (VAPID)Nicio parte terțăGazduieste un singur fisierPusher GrinzileUtilizaţi contulGazduieste muncitorul
Împinge web

De ce este necesar acest lucru

Browser-ul permite doar o pagină să înregistreze un lucrător de serviciu de la propria origine.OpsIQ implementarea, astfel încât nu poate instala lucrătorul împinge pe un site de clienți, până când nu găzduiți lucrătorul de la originea acelui site, widget-ul sări în tăcere împinge (nici o eroare, nici un abonament). Aveți două opțiuni mai jos;OpsIQ Presează campaniile să le publice pe amândouă.

Opțiunea A · Push Web Auto-hosted (VAPID, nicio parte terță)

1. Descărcaţi lucrătorul din OpsIQ detaşare: https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. Încarcă-l pe tine. rădăcină web Deci, este accesibil la https://yoursite.com/opsiq-push-sw.js- Widget-ul. Detectează automat această cale pe propria origine a paginii și o înregistrează, nu este necesară nicio schimbare de fragmentare. (Acesta utilizează un domeniu de aplicare îngust, astfel încât să nu înlocuiască niciodată un lucrător de serviciu pe care îl executați deja.)

Opțional: dacă trebuie să-l găzduiască pe o cale non-standard, punctul widget la ea înainte Fragmentul. Este acceptat doar atunci când aceeași origine:

Opţional · numai dacă fişierul NU este la rădăcina web
<script>window.OpsIQ=window.OpsIQ||{};window.OpsIQ.pushSwUrl="/custom/opsiq-push-sw.js";</script>

3. În OpsIQ, generați taste VAPID (Setări → Client Chat AI → Advanced → Web Push). Widgetul cere apoi vizitatorilor permisiunea de notificare și le abonează.

În spatele unui CDN/Cloudflare Asigură-te că /opsiq-push-sw.js returnează HTTP 200 (purge cache-ul dacă a fost 404 înainte de a încărca; o cache 404 va bloca înregistrarea).

Opțiunea B · Pusher Beams (furnizor gestionat)

1. În OpsIQ setările setați furnizorul împinge la Pusher Grinzile şi intraţi în grinzile voastre ID-ul Tribunalului şi Cheie secretă.

2. Gazduiti lucrătorul de serviciu Beams pe radacina site-ului ca /service-worker.js- Recepţionat. https://YOUR-OPSIQ/opsiq/pusher-beams-service-worker.js, sau să unească această linie în lucrătorul dumneavoastră rădăcină existent:

Lucrator de grinzi, gazda la https://yoursite.com/service-worker.js
importScripts("https://js.pusher.com/beams/service-worker.js");

3. Widget încarcă automat Beams SDK și abonează fiecare vizitator la interesul pe site opsiq-site-<your-site-key>Nu mai e nevoie de alte cabluri.

Cum se desfăşoară campaniile

Presează campaniile publicate prin Ambele metode simultane: vizitatorii lucrătorului VAPID auto-hosted obține criptat Web Push, iar vizitatorii abonați prin Pusher Beams primesc publicarea Telefoanelor. Fiecare vizitator este contactat prin intermediul oricui se abonează la, astfel încât să puteți rula VAPId de aceeași origine pe unele site-uri și grinzi cross-origine pe alții.

HTTPS este necesar pentru lucrătorii de servicii și Web Push (host local este scutit pentru testare). Inboxul chat admin utilizează deja același mecanism de interes pentru apelurile operatorului.

Operațiuni

Depanare

Probleme comune și cum să le repare.

Generalități

Pagină albă+

Verificați jurnalele de eroare PHP. Cauze: vechi PHP (nevoie 8.4+), extensia lipsă, conexiunea DB a eșuat, permisiuni greșite ale fișierelor.

Tabloul de bord arată zerouri+

Verificare: widget instalat? Cron funcționare? Gama de date corectă? IP exclus?

AI

AI nu răspunde.+

Verificați: furnizor configurat? API cheie validă (utilizați conexiunea de testare)? Buget epuizat? Workspace AI configurează corect?

AI oferă răspunsuri greşite+

Verificați: baza de cunoștințe până la data? Prompt clar? Conector cautari returnarea datelor corecte? Review conversație în AI Istorie.

AI este lent+

Depinde de: provider API viteza, dimensiunea contextului (mai multe jetoane KB = mai lent), latența rețelei. Încercați un model mai rapid.

Urmărire

Lipsește un dispozitiv+

Verificați: script în sursa de pagină? Erorile JS în consolă? Blocare CSP? Blocant Ad?

Țara necunoscută+

GeoIP nu este configurat. Utilizați Cloudflare (automat) sau MaxMind GeoLite2.

Bilete

E-mailuri care nu creează bilete+

Verificați: căsuța poștală conectată? Cron rulează? Parola aplicației a fost schimbată? IMAP setările corecte?

Autoreplică nefuncţionează+

Verificare: activat? Departament permis? AI configurat? Cron ruleaza? Uman a raspuns primul?

Conectori

Conexiune eșuată+

Verificare: acreditări corecte? Cheia expirat? API accesibil de la server? Baza URL Corect?

Conectat, dar fără date+

Verificați: API lunetă cheie? Sincronizare web activat? Cron rulează?

Performanță

Pagini lente+

Verificare: performanta bazei de date (Show PROCESSIST), memorie PHP (creştere la 1GB), activa opcache, reduce perioada de retenţie.

Operațiuni

Vizite fără logare

Utilizați această verificare concentrată atunci când widget-ul se încarcă incorect sau Live Feed rămâne gol.

Când widget nu este de logare vizite, verifica tasta site-ului, încărcați pagina într-un browser privat, verificați rețeaua de navigare / panouri consolă pentru cereri blocate baliza sau widget, revizuiți Content-Security-Politicos și blocanți ad, confirma site-ul este activ în OpsIQ O bulă vizibilă de chat nu dovedeşte că farul de analiză a fost acceptat.

Referință

Glosar

Definiții pentru termenii utilizați pe întreg parcursul OpsIQ.

Acțiune

Ceva ce AI poate face printr-un conector sau platforma.

Agent

Un membru al echipei cu acces limitat, sau un agent AI.

BYOK

Adu-ţi propria cheie, îţi vei oferi propria ta cheie AI API.

Conector

Un modul de integrare a unei platforme externe cu OpsIQ.

CSAT

Scorul satisfacţiei clienţilor.

S-a făcut.

O oportunitate de venituri în CRM.

Departamentul

O categorie de bilete pentru rutare și control al accesului.

Escaladare

Mutarea unui bilet la un alt departament sau de la AI la om.

GeoIP

Detectarea locației vizitatorilor de la adresa IP.

Predarea

Transfer o conversaţie de la AI la om.

Token de identitate

Semnat semn de identificare a unui vizitator al site-ului.

Baza de cunoștințe

Articolele folosite de AI pentru a răspunde la întrebări.

Plumb

Un vizitator care arată intenţia de a cumpăra.

Scor de plumb

0-100 numărul care indică probabilitatea de conversie.

Etapa ciclului de viață

În cazul în care un client este: plumb, Prospect, Client, La risc, Churned.

AI Gestionat

AI oferit ca parte a dvs. OpsIQ plan.

Conductă

Tabloul vizual al etapelor de afacere.

RBAC

Controlul accesului bazat pe roluri.

Sesiune

O serie de vizualizări pe pagini într-o fereastră timeout.

Cheie site-ul

Identificator unic pentru un site web urmărit.

SLA

Acord la nivel de serviciu, timpi-ţintă de răspuns.

Jeton

Unitatea de text AI. 4 caractere = 1 Token.

Stratul de încredere

Sistemul de siguranţă controlează autonomia AI.

WebhookComment

Chemare HTTP pentru notificări de evenimente.

Control

JavaScript cod încorporat pe site-ul dumneavoastră.

Spațiu de lucru

Un site cu propria urmărire, AI, conectori şi echipă.

Referință

Mai adu ajutor.

Dacă această documentație nu răspunde la întrebarea dumneavoastră:

Admin AI

Faceți clic pe "Ask OpsIQ" în admin. Are acces la această documentație și datele platformei dumneavoastră.

Biletul de sprijin

Include: ce ai încercat, ce s-a întâmplat, ce te aşteptai şi orice mesaj de eroare.

E-mail

Suport e-mail cu tasta de licență și emite descrierea.

Sfaturi pentru cereri de sprijin eficiente

Include pagina

Care pagina de admin (URL sau numele).

Include setarea

Setare exactă nume și valoare curentă.

Include eroarea

Mesaj de eroare exact cu coduri.

Includeți pașii

Ce ai făcut, pas cu pas.

Includerea preconizată comparativ cu cea reală

Ce ar trebui să se întâmple vs ce sa întâmplat.

💡
Cu cât cererea dumneavoastră este mai specifică, cu atât răspunsul este mai rapid. "Nu funcționează" necesită anchetă. "Faceți clic pe Salvare pe configurare AI oferă codul de eroare 502" primește un răspuns direct.