OpsIQ Documentatie

Bouwen, opereren en verlengen OpsIQ.

Dit is de volledige documentatie voor OpsIQ. Stel het product in, voer ondersteuning uit, configureer AI, beheer CRM, installeer de widget, bouw connectoren, bel de REST API, ontvangen webhooks, pakket marktplaats apps, en het bedienen van self-hosted implementaties.

KlantgidsBeheerdershandleidingOntwikkelhulplijnCRM-referentieConnector SDK_REST API_Zelfontvangst
Toepassingsgebied

Toepassingsgebied van dit handboek

Alles OpsIQ doet, op één plaats: hoe elk scherm werkt, hoe je je eigen systemen kunt verbinden en hoe er bovenop te bouwen. Begin overal, de secties volgen dezelfde volgorde als de admin zijbalk.

Toepassingsgebied
DocumentatiekaartHet handboek is georganiseerd rond het OpsIQ product, volgens dezelfde volgorde als de admin zijbalk.DocumentatiekaartOpsIQ productAUDIENCEExploitantenBUILDOntwikkelaarsRUNBeheerdersLEVENDE WERKSPACE-ZICHTGebruik OpsIQProductschermen en -workflowsInclusiefUitbreiden van OpsIQVerbindingen, APIs en widgetInclusiefBedienen OpsIQVeiligheid, cron en inzetInclusiefRubrieknummerPakket, API en webhook contractenInclusief1CHOOSE AUDIENCEOperator of ontwikkelaar2FOLLOW THE UISecties spiegelen OpsIQ3USE SOURCE TRUTHStatus komt van build
Het handboek is georganiseerd rond het OpsIQ product, volgens dezelfde volgorde als de admin zijbalk.
Portal Studio veldgids

Gebruik de speciale beheerder en ontwikkelaar gids voor Portal architectuur, pagina's, componenten, preview, Help Center, identiteit, SCIM, geregeerde releases, uitbreidingen, migraties en certificering.

Open de gids voor portalstudio's

Wat zit hier in?

Het product uitvoeren

Elk scherm in de admin: analytics, live chat, tickets, CRM, knowledge base, Site Intelligence, promoties en het klantenaccount portal. Wat elke pagina doet, wat de nummers betekenen, en wat te doen als ze er verkeerd uitzien.

Sluit uw systemen aan

De website widget, e-mail mailboxen, inkomende en uitgaande webhooks, en de connector bibliotheek voor platforms zoals Shopify, WooCommerce, WHMCS, Zendesk, Stripe, Slack en Gmail.

Bouw je eigen

De Connector Builder voor no-code connectors, Acties & Triggers als u liever helemaal geen connectoren gebruikt en de REST API met elke actie, scope en fout code.

Bedien het.

Rol en permissies, beveiliging, cron, diagnoses, back-ups, en zowel gehoste als zelf-gehoste implementatie.

Waar moet u beginnen?

1
Als je dag tot dag OpsIQ uitvoert

Lees de schermsecties in zijbalkvolgorde. Elke opent met waar de pagina voor is, zodat u kunt stoppen zodra u hebt wat u nodig heeft.

2
Als u dit middel toedient

Voeg Instellingen, Beveiliging, Diagnostics, Cron en Productie toe. Dit zijn de secties die beslissen of al het andere blijft werken.

3
Als u een integratie opbouwt

Begin bij Connectors, dan de Connector Builder, vervolgens de REST API en webhooks. Lees deze in volgorde en je zult hebben gezien elke manier OpsIQ kan praten met een ander systeem.

💡
Twee dingen veranderen wat je ziet. Toestemmingen verbergen pagina's die jouw rol niet kan openen, dus een sectie die hier beschreven wordt ontbreekt misschien in je zijbalk. Vraag aan de beheerder om je rol te controleren. En connectors dragen een volwassen label van Productie, Beta, Preview of Template; het draaiende bouw en zijn verbindings manifest zijn de autoriteit waarop u hebt, niet deze pagina.
Begin hier

Wat OpsIQ doet voor uw bedrijf

OpsIQ Het is een complete AI-eerste zakelijke besturingsplatform. Het vervangt uw analyse, live chat, helpdesk, CRM, SEO toolkit, integratie middleware en ontwikkelaar platform met één uniforme admin waar elk hulpmiddel dezelfde klantcontext deelt. In plaats van stiksels samen te voegen 8-12 aparte SaaS producten, installeert u OpsIQ één keer en alles vanuit een scherm bedienen.

Het platform
OpsIQ _geünificeerde platformEen centrale AI-hersenen verbonden met live chat, CRM, tickets, Site Intelligence, promoties en analyses.Live chat met vriendenBevorderingAI CRM-oplossingenWebsite van IntelTicketsAnalyseOpsIQ_AI BRAIN1ONE WORKSPACEElk gereedschap in één beheerder2SHARED BRAINEen klantcontext3ANYWHERECloud of zelf-gehost
OpsIQ is een platform met één gedeelde klantcontext, elke tool feeds, en wordt aangedreven door dezelfde AI-hersenen.

Alles OpsIQ doet · in detail

Website analyse en bezoekersinformatie

Real-time bezoekers volgen

Elke pagina laden, klikken, scrollen en navigatie evenement wordt vastgelegd in real time. Zie wie er op uw site nu is, welke pagina's ze bekijken, hoe lang ze besteden, en waar ze vandaan kwamen, allemaal zonder cookies van derden.

Bezoekerslogboek en sessies

Volledige geschiedenis van elke bezoeker met apparaat, browser, besturingssysteem, land, stad, referrer, UTM parameters, landingspagina en identiteit resolutie. Sessions groep paginaweergaven in reizen zodat u kunt zien het hele pad dat een bezoeker neemt.

Sessie-herhaling

Tijdlijn-stijl afspelen van gevangen bezoekerssessies. Zie precies wat gebruikers deden: muisbewegingen, klikken, scrollen, paginatransities en vormen interacties. Gebruik het om UX problemen te diagnostiseren, drop-off punten begrijpen, en conversiestromen verifiëren.

Levende diervoeders

Een real-time stroom van bezoekersactiviteit als het gebeurt. Zie paginaweergaven, chat begint, formulier inzendingen en intentie signalen updaten om de paar seconden. Filter op land, apparaat of referrer om zich te concentreren op specifieke verkeer segmenten.

Toppagina's

Pagina's gerangschikt door bezoeken, verlovingstijden, bounce rate, conversies en ondersteuning activiteit. Identificeer uw best presterende inhoud en pagina's die verbetering nodig hebben.

Geo-intelligence

Land, stad en regio storingen met kaarten. Apparaat en browser distributie, verkeer bron analyse, zoekmachine referentie tracking, en marktpenetratie inzichten.

Intent trechter

Volg bezoekersintentiesignalen (prijskaartjes voor paginabezoeken, herhaalde retourneren, documentatie-browsepatronen en ondersteuningsinteracties) om bezoekers te identificeren die waarschijnlijk zullen kopen, karnen of hulp nodig hebben.

A/B experimenten

Voer split tests op uw website rechtstreeks uit OpsIQ. Maak varianten, stel verkeer allocatie in, definieer conversiedoelstellingen en meet statistische betekenis. Geen externe testtool nodig.

JavaScript foutopsporing

CliŽnt-side JavaScript fouten automatisch op uw website. Zie foutmeldingen, stack sporen, getroffen browsers, frequentie telt, en welke pagina's hen activeren. Debug frontend problemen zonder aparte fout monitoring.

Gebeurtenissenlog

Elke tracked event (paginaweergaven, aangepaste gebeurtenissen, chat interacties, formulier inzendingen, aankopen) in een doorzoekbare, filterbare log met volledige metagegevens.

Verkoop en omrekening

Track orders, inkomsten, terugbetalingen, abonnementsvernieuwingen en attribuut conversies naar verkeersbronnen, campagnes, en bezoekers reizen. Inkomsten dashboards met periode vergelijking en trend analyse.

Lood

Hoogbegaafde bezoekers geïdentificeerd door gedragspatronen. Score leads gebaseerd op paginabezoeken, tijd ter plaatse, retourfrequentie, ondersteuning interacties en aangepaste signalen. Feed leidt rechtstreeks naar de CRM-pijpleiding.

Site Intelligence (SEO- en contentanalyse)

Kruiptochten op de site

Geautomatiseerd kruipen van uw hele website om pagina's te ontdekken, gebroken links detecteren, ontbrekende meta-tags vinden, afbeelding alt tekst controleren, canonieke valideren URLs, en map uw site structuur. Plan kruipt dagelijks, wekelijks of op verzoek te lopen.

Technische SEO-audit

Uitgebreide technische analyse: paginasnelheidsscores, mobiele responsiviteit, Core Web Vitals, SSL certificaatstatus, redirect chains, dubbele content detectie, kruipdiepte analyse en gestructureerde data validatie.

Inhoudscontrole

Evaluatie van elke pagina voor inhoud kwaliteit, woord tellen, leesbaarheid score, trefwoord dichtheid, kopstructuur, interne/externe koppeling verhouding en versheid. Identificeer dunne inhoud, duplicaten pagina's en inhoud gaten.

AI-aangedreven zoekopdracht

Semantic zoeken over uw hele site inhoud. Stel natuurlijke taal vragen over uw inhoud en krijg AI-synthesized antwoorden met bronpagina referenties.

SERP-volgorde

Controleer uw zoekmachine rangschikkingen voor doel trefwoorden in Google en andere motoren. Track positie verandert mettertijd, vergelijk met concurrenten, en zie welke pagina's rangeren voor welke voorwaarden.

Onderzoek naar sleutelwoorden

Ontdek zoekwoord mogelijkheden op basis van uw inhoud, concurrent analyse en zoek volume data. Krijg suggesties voor nieuwe content onderwerpen, lange-tail variaties, en de inhoud optimalisatie doelen.

Backlink-analyse

Monitor uw inkomende linkprofiel. Zie welke sites naar u verwijzen, spoor nieuwe en verloren links op, analyseer de verdeling van ankerteksten en bepaal de mogelijkheden voor het maken van verbindingen.

Lokale SEO-raster

Voor bedrijven met fysieke locaties: visualiseer uw lokale zoekzicht over een geografisch raster. Zie hoe uw rankings variëren naar locatie, afstand van uw bedrijf en zoekdoel.

Synchronisatie van Google Business-profiel

Sluit uw Google Business-profiel aan OpsIQ. Synchroniseer reviews, berichten, Q&A, foto's en zakelijke informatie. Beheer uw GBP-vermelding van binnenuit OpsIQ. Reageer op beoordelingen, publiceer berichten en volg inzichten.

Geplande verslagen

Geautomatiseerde SEO- en analyserapporten gegenereerd op uw schema (dagelijks, wekelijks, maandelijks). Rapporten omvatten rangschikking wijzigingen, verkeerstrends, technische problemen gevonden, en content prestaties. White label output beschikbaar voor agentschappen.

Ondersteuning met AI-aangedreven

Klanten-AI chat

AI beantwoordt vragen van klanten op uw website 24/7 met behulp van uw kennisbasis, aangesloten platformgegevens (orders, accounts, abonnementen) en aangepaste training prompts. Ondersteunt meerdere AI providers: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google) en Grok.

Assistent van de beheerder AI

Een AI copiloot in uw admin panel die u helpt met het schrijven van ticket antwoorden, het ontwerpen van klantcommunicatie, analyseren ondersteuning trends, opzoeken van klantgegevens over verbonden platforms en uitvoeren acties via de connector systeem.

AI kennis gronding

De AI is gebaseerd op uw kennisbase artikelen, veelgestelde vragen, productdocumentatie en verbonden platformgegevens. Het hallucineert niet. Het antwoordt van uw actuele zakelijke informatie of escaleert wanneer het onzeker is.

Auto-handoff aan mensen

Wanneer de AI een vraag niet kan oplossen, frustratie detecteert of de klant vraagt om een mens, geeft het automatisch over aan uw team met volledige conversatie context. Configureerbare achteruitgang/timeout auto-revert terug naar AI.

AI trainingsprompts

Schrijf aparte instructieprompts voor klantgerichte AI en admin-georiënteerde AI. Controletoon, grenzen, escalatieregels, verboden onderwerpen en bedrijfsspecifiek gedrag. Per werkruimte configuratie ondersteund.

AI geschiedenis en audit

Elk AI gesprek is geregistreerd met volledige aanvraag/antwoord details, token gebruik, kosten volgen, provider gebruikt en modelversie. Bekijk gesprekken om training gaten te identificeren en verbeteren van de AI nauwkeurigheid.

AI inzichten

Geautomatiseerde analyse van AI gesprekspatronen. Zie veelvoorkomende vragen, resolutiesnelheden, overdrachtsfrequentie, klanttevredenheid per onderwerp en gebieden waar de AI betere training nodig heeft.

Per-werkruimte AI configuratie

Elke aangesloten site/werkruimte kan gebruik maken van zijn eigen AI provider, model, temperatuur, token budget en training prompts. Een SaaS bedrijf kan Claude gebruiken voor het hoofdproduct en GPT-4o voor een secundair merk.

Beheerde AI en BYOK

Twee AI-modi: Managed AI (inbegrepen in uw plan, nee API sleutel nodig) of Breng uw eigen sleutel (gebruik uw eigen OpenAI/Anthropic/Google/xAI API toets voor volledige controle over modelselectie en kosten). Beide zijn eersteklas, elke functie werkt met een van beide modus.

Begrotingen en kostencontroles voor AI-tekens

Stel maandelijkse token budgetten, per-gesprek grenzen en laag-evenwicht waarschuwingen. Track uitgaven per provider, per werkplek, en per gesprek. Voorkom weggelopen kosten met harde plafonds.

Kaartjes en helpdesk

Inheems ticketsysteem

Volledige helpdesk met afdelingen, prioriteiten (laag/medium/hoog/dringend), statussen, SLA-tracking, interne notities, klant antwoorden, bestand bijlagen en draadloos gesprekken. Geen externe help desk nodig.

AI-triage en automatisch antwoord

AI triaget automatisch inkomende tickets per afdeling en prioriteit. Schakel automatisch antwoord op veilige afdelingen in. De AI stelt voor en stuurt een reactie na een configureerbare vertraging (standaard: 2 minuten) zodat mensen eerst kunnen ingrijpen.

E-mail inname

Sluit een mailbox (Gmail, IMAP, of provider-specifiek) automatisch aan om tickets te maken vanuit binnenkomende e-mails. Reageert op ticketmeldingen update de ticket thread.

Ticketportaal ingesloten

Neem een klantgerichte ticketportal op uw website in. Klanten kunnen kaartjes indienen, hun geschiedenis bekijken, antwoorden op open tickets en de status controleren die naar uw ontwerp is gebrandmerkt.

Ticket samenvoegen

Koppel tickets samen tot één draad. Samengevoegde ticketjes tonen [samengevoegd] op de onderwerpregel. Alle gespreksgeschiedenis wordt bewaard in het overlevende ticket.

Terug naar AI

Nadat een menselijke agent een ticket heeft overgenomen, gebruik je "Return to AI" om de AI automatisch te laten reageren op dat ticket. Handig wanneer het menselijk vereiste deel is opgelost maar de klant heeft vervolgvragen die de KI kan afhandelen.

Inbox-copiloot

AI-ondersteund ticketbeheer vanuit de inboxweergave. De copiloot stelt antwoorden voor, vat conversatiegeschiedenis samen, beveelt prioriteit/afdelingsopdrachten aan en kan acties uitvoeren op verbonden platforms.

Chat en real-time ondersteuning

Chat-inbox

Real-time chat van klanten beheerd vanuit een uniforme inbox. Bekijk alle actieve gesprekken, klantidentiteit, gespreksgeschiedenis en AI suggesties. Meerdere agenten kunnen samenwerken aan een gesprek.

Proactieve chatregels

Trigger chat berichten op basis van bezoekersgedrag: tijd op pagina, specifiek URL bezochte, scrolldiepte, terugkomstbezoek, exit intentie of aangepaste gebeurtenissen. Voorbeeld: een hulpbericht tonen na 60 seconden op de prijspagina.

Chat-widget

Een aanpasbare chat widget ingebed op uw website. Ondersteunt AI-chat, live agent chat, ticket indiening, kennis base zoeken en bezoeker identiteit. Responsief, toegankelijk en brandbaar.

CSAT-enquêtes

Verzamel klanttevredenheidsbeoordelingen na chat- en ticketinteracties. Ontwerp enquêtes met uw eigen vragen, waarderingsschalen en vervolgprompts. Resultaten voeden zich tot teamprestaties en AI inzichten.

Post-chat email enquête

Nadat een chat is afgelopen, kunnen bezoekers met een bekende e-mail één gebranded mail ontvangen met een AI-samenvatting van wat er werd afgehandeld en een one-click "Was het makkelijk?" Ja/Nee. Eenmaal per thread, ondertekende links voor eenmalig gebruik, elke verzending wordt gelogd en het resultaat belandt op de Feedbackpagina als zijn eigen signaal naast de in-chat sterren.

Reageer identiteitslus

Elk feedback-item dat een persoon draagt toont ze: naam, e-mail, een click-through naar hun volledige customer journey en CRM contact, en één-klik E-mail of AI-ontwerp antwoorden gebaseerd op de werkelijke geschiedenis.

AI-schrijven

Aparte AI schrijfassistent voor het samenstellen van e-mail ontwerpen, ticket antwoorden, aankondigingen en klantencommunicatie. Gebruikt zijn eigen prompt (niet de chat hersenen) voor professionele zakelijke schrijven.

AI-Eerste CRM

CRM-opdrachtcentrum

Een enkel scherm met je CRM-status: waarde van de pijpleiding, transactiesnelheid, taken die komen, risico-deals, agentactiviteit en AI aanbevelingen. De CRM startpagina is je dagelijkse startpunt.

Contacten en bedrijven

Beheer klantcontacten met volledige profielen: naam, e-mail, telefoon, bedrijf, tags, levensloopfase, gespreksgeschiedenis, ticket geschiedenis, aankoopgeschiedenis en aangepaste velden. Link contactpersonen naar bedrijven voor B2B relatiebeheer.

Deals en pijpleidingplank

Visual Kanban-stijl deal board met aanpasbare stadia. Sleep transacties tussen fasen, stel waarden in, toewijzen eigenaren, volgen close data en zie pijplijn waarde in elke fase. Meerdere pijpleidingen ondersteund.

AI deal coaching

De AI analyseert elke deal en biedt coaching: risicosignalen (verdwenen stille, concurrent vermelde, budgetproblemen), aanbevelingen voor volgende beste-actie, kans op winst, en voorgestelde follow-up timing.

Voorspelling en verslagen

De inkomstenprognoses op basis van pijpleidinggegevens, historische nauwe tarieven en transactiesnelheid. Rapporten omvatten pijplijn per fase, per eigenaar, per bron, conversiepercentages, gemiddelde deal grootte en verkoop cyclus lengte.

Prospectief (SDR)

AI-aangedreven prospectie die potentiële klanten identificeert van uw bezoekersgegevens, loodsignalen en verbonden platformactiviteit. Stelt bereik doelen voor, stelt eerste berichten voor en scoort leadkwaliteit.

Follow-upsequenties

Automatische multi-step follow-up sequenties: e-mail, wacht, e-mailadres, controleer reactie, escaleren. Definieer reeksen voor nieuwe leads, gestalde deals, post-koopcheck-ins en herintreding campagnes.

Levenscyclus en bewaring

Volg de levenscyclusfasen van klanten (lead, prospect, customer, karned) met automatische overgangen. De bewaaragent controleert op signalen en stelt interventies voor.

Data-beheerder

AI agent die continu uw CRM-gegevens reinigt en verrijkt: dedupliceert contacten, vult ontbrekende velden, valideert e-mails, standaardiseert bedrijfsnamen en vlaggen oude records.

Bouw mijn CRM

Natuurlijke taal CRM configuratie: vertel de AI hoe uw verkoopproces eruit ziet en het bouwt uw pijplijn stadia, aangepaste velden, deal templates, en automatiseringsregels.

CRM-gezondheidscontrole

Geautomatiseerde controle van uw CRM-gegevenskwaliteit: dupliceer contacten, deals zonder volgende stappen, oude pijpleidingen, ontbrekende contactgegevens en gegevensincompleet scoren.

Vertrouwen

Drie niveaus autonomieregeling voor elke CRM AI agent: Autopilot (AI werkt onafhankelijk), Copilot, en Manual (AI observeert alleen). Stel de wijzerplaat per agent in, per actietype, en per transactiewaardedrempel.

Vier AI-agenten

De CRM heeft vier gespecialiseerde AI-agenten: Steward (datakwaliteit), SDR (prospecting), Retention (churn prevention) en Analyst (reporting and insights). Elke agent heeft zijn eigen Trust Dial setting.

Connectoren en integraties

Voorbouwconnectoren

Klaar voor gebruik stekkers Shopify, WooCommerce BigCommerce, Magento 2, PrestaShop, OpenCart, osCommerce, WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Poststempel, Verzenden, SendGrid, Mailgun, Gmail, IMAP, Slack en Google Business Profile. Elke connector brengt platformspecifieke AI acties, kennis en data synchroniseren.

Connector Bouwer

Bouw aangepaste connectoren voor elk platform, geen code, AI-ondersteund of volledige code. De bouwer ondersteunt REST en GraphQL APIs, OAuth autorisatie code flow, webhook auto-registratie met Stripe en eenvoudige handtekening schema's, paginatie (offset, pagina, cursor, en link-header), lijst / error transformeert, multi-action context, en marktverpakking.

AI-ondersteunde connector auteur

De ConnectorBuilderAI helpt u connectors te bouwen: beschrijf wat u wilt en het stelt acties voor, schrijft verzoekverwerkers en kaarten API Reageert. Behandelt authenticatie, paginatie en foutafhandeling automatisch.

OAuth stroom voor elke aansluiting

Algemeen in-app OAuth autorisatie flow die werkt met elke connector. PKCE ondersteuning, site-scoped state management, automatische token te vernieuwen. Connectoren definiëren hun OAuth parameters en OpsIQ regelt de stroom.

Capaciteitsbussen (platformbreedverlengstuk)

Connectoren voegen niet alleen platformacties toe. Ze kunnen kernfuncties aansturen door middel van "bussen." Een connector verklaart een mogelijkheid (kalender, verrijking, esign in CRM; local_listing, rang_data in Site Intelligence; web_analytics in Analytic's; payment_provider in Payments; email_sync in Mailbox; video_meeting in Comms) en implementeert de kleine methodeset;OpsIQontdekt het via CapabilityRegistry en draden in de UI, de Klant360tijdlijn, en de AI acties. Verschillende aansluitingen kunnen dezelfde mogelijkheid zonder vergrendeling bieden. Zie connectors/PLATFORM_CONNECTORS.md.

Voorgeïnstalleerd vs marktsegment

Connectoren leven in een van twee niveaus. Voorgeïnstalleerde connectoren (connectors/) zijn register-actief uit de doos, gehouden lean aan slechts de keyless referentie en de meest gebruikte provider per mogelijkheid (bijv. Google Calendar, Gmail, Googl Business Profile). Marketplace connectors (marketplace_connectors /) worden ontdekt maar inert totdat geïnstalleerd, bijvoorbeeld Microsoft 365 Kalender, Outlook, DocuSign, Stripe, GA4, SerpApi, Zoom. Elke brug oppervlakken een marktlijst zodat de UI en de AI kunnen prompten "installeren vanaf de marktplaats" (notify-to-install) wanneer een functie niet klaar is voor provider, nooit een gebroken knop.

Marktplaats connector

Publiceer uw connectoren naar de OpsIQ marktplaats. Pakketconnectoren met profiel.json, kennis.json, workflow_recepten.json Marktplaats ondersteunt gratis en betaalde connectoren met multi-source facturen.

Ondertekening van de connector

Alle connectoren zijn cryptografisch ondertekend voor integriteitscontrole. De ondertekening wordt gecontroleerd bij installatietijd. Gebruik het gereedschap 'afsluit_all_connectors' om na updates opnieuw te ondertekenen.

SmartLookup

Declarative fuzzy-matching systeem voor connector acties. Definieer opzoekregels en OpsIQ past gebruikersqueries aan platform entiteiten met behulp van fuzzyScore en smartRank algoritmes. Voorbeeld: find_country("germ") komt overeen Duitsland met 88.9% vertrouwen.

Actiecontracten

De generaalOpsIQ APIpubliceert elke geregistreerdeJSONgebruik meta.actions voor de live totale en exacte getypte contracten; connector pakketten verklaren hun eigen verkoopacties via de uniforme ActionExecutor.

Connectorrecepten

Vooraf gebouwde workflow recepten die meerdere connector acties combineren tot gemeenschappelijke business workstromen. Voorbeeld: "Wanneer een nieuwe orde komt op Shopify, maak een ticket aan, update de CRM en stuur een Slack notificatie."

Kennissynchronisatie

Connectors verklaren kennisonderwerpen die synchroniseren met de AI-kennisbasis. Platformspecifieke helpartikelen, setuphandleidingen en stappen voor probleemoplossing zijn automatisch beschikbaar voor de KI zonder handmatige kennisinvoer.

Ontwikkelaarsplatform

REST API_

Een naam JSON API bestrijkt elke geregistreerde beheerder JSON werking, metAPI-key authenticatie, werkruimte isolatie, scopes, snelheid beperkend, idempotent schrijft, OpenAPI en een gegenereerde Postman collectie.

Webhooks

Outbound webhooks voor alle belangrijke evenementen: bestellingen, facturen, abonnementen, tickets, chats, leads, gebruikersregistraties en kar verlaten. Async levering via de wachtrij van het werk, exponentiële backoff retry, SSRF bescherming, en auto-uitschakelen na 15 opeenvolgende mislukkingen.

Webhook ondertekening

Elke uitgaande webhook is ondertekend met HMAC-SHA256. Controleer handtekeningen op uw ontvangende kant om de authenticiteit van webhaak te garanderen. Stabiel event_id voor idempotent processing.

Widget SDK

JavaScript SDK voor de tracking widget met identiteitsresolutie, aangepaste event tracing, programmamatische chat control en pagina-specifieke configuratie. Installeer recepten voor React, Vue, Next.js, WordPress, Shopify, en statische HTML.

Plugins en SDK's

Server-side SDK's en plugins voor gemeenschappelijke kaders. WordPress plugin WHMCS module, en generieke PHP/Node.js integratie bibliotheken.

Evenementen API_

Push aangepaste gebeurtenissen in OpsIQ vanaf uw backend: aankopen, aanmeldingen, gebruik van functies, fouten of een zakelijke gebeurtenis. Gebeurtenissen verschijnen in de bezoekerstijdlijn en voeren zich naar analytics en AI context.

Triggers kookboek

Bouw automatische workflows die worden geactiveerd door gebeurtenissen: nieuw ticket, chat gestart, bezoeker geïdentificeerd, deal stage gewijzigd of aangepaste gebeurtenis. Triggers uitvoeren van connector acties, verzenden webhooks, bijwerken records, of uw team op de hoogte te stellen.

API _bouwer

Visueel API en webhook bouwer binnen de admin. Configureren van eindpunten, testverzoeken, inspecteren reacties, en debug integraties zonder weg te gaan OpsIQ.

Team en administratie

Rol-gebaseerde toegangscontrole

Drie rollen: Eigenaar (volledige toegang, facturering, gevarenzone), Full Admin (alle operaties behalve rekening en gevaar zone) en Agent (alleen toegewezen afdelingen, geen instellingen toegang). Alle gevoelige pagina's zijn moeilijk te verbinden door rol.

Team-prestatiedashboard

Eigenaar en volledige Admin-alleen dashboard met resolutietijden, werklastverdeling, handle diepte, kanaalafbraak, trendanalyse, SLA compliance, CSAT door agent, heropening tarieven, team rollups, en drukste uren. Bijgewerkt in real time.

Beheerder aanwezigheid en online tracking

Real-time who-is-online widget in de admin navigatie. Heartbeat gebaseerde aanwezigheid detectie (60- tweede ping, 300-second extension, auto-prune na 120 dagen). Zie welke beheerders momenteel actief zijn en op welke pagina's.

Per werkplekinstellingen

Elke verbonden site (werkruimte) kan zijn eigen AI configuratie, connector instellingen, ticket afdelingen, branding en operationele regels hebben. Global standaards cascade naar werkruimten die ze niet overschrijven.

Beheer van meerdere locaties

Beheer meerdere websites van één OpsIQ admin. Elke site heeft zijn eigen tracking knipsel, bezoeker gegevens en configuratie. Wissel tussen de sites uit de admin navigatie.

E-mailsjabloonsysteem

Registergestuurde e-mailsjablonen voor alle geautomatiseerde communicatie: ticketmeldingen, chattranscripts, welkom e-mailadressen, wachtwoordherinneringen en systeemwaarschuwingen. Bewerken HTML sjablonen met live preview, variabele spaanders ({{customer_name}}, {{ticket_id}}) en de algemene lay-out controle.

Invoer en uitvoer

Importeer contacten, tickets en kennisartikelen van CSV/JSON. Gegevens van bezoekers exporteren, analyses en CRM-records. Gegevensportabiliteit voor migratie tussen systemen.

Beveiliging, naleving en operaties

Onderneming SSO

OIDC (OpenID Connect) single sign-on met volledige runtime: ontdekking, autorisatie, callback, JWKS handtekening verificatie, userinfo, domein allow-listing, JIT provisioning en status bewakers. SAML configuratieondersteuning.

GDPR en naleving van de gegevens

Ingebouwde DSAR (Data Subject Access Request) verwerking: exporteren en verwijderen van klantgegevens over alle systemen. Contact-niveau gegevens wissen betrekking op sessies, tickets, chats, CRM records, en e-mail logs. Toestemming beheer en bewaring beleid.

IP _- blokkering en bescherming tegen brute kracht

Blokspecifiek IPs of varieert van toegang tot uw site of admin. Automatische vergrendeling na configureerbare mislukte aanmeldpogingen. Fout bij aanmelden met IP, tijdstempel en gebruiker agent.

HSTS en beveiligingskoppen

HTTP Strict Transport Security, Permissions-Policy headers en veilige cookieconfiguratie. Zelfgehoste implementaties kunnen CSP-headers toevoegen via de configuratie van de server.

Uitgaande webhook verharding

SSRF bewaker blokkeert webhooks naar private/metadata IP Async levering voorkomt dat trage eindpunten uw toepassing blokkeren. Automatisch uitschakelen na 15 opeenvolgende mislukkingen voorkomen verspilling van hulpbronnen bij dode eindpunten.

Werkruimte-isolatie

Strikte data-isolatie tussen werkruimten. Bezoekers, tickets, chats, CRM-records en AI-conversaties zijn in hun werkruimte gescopeerd. Cross-workspace datalekken worden voorkomen op de zoeklaag.

Factureringscyclusbeheer

Ondersteuning voor maandelijkse, kwartaal-, halfjaarlijkse, jaarlijkse, tweejaarlijkse en levenslange facturering cycli. Valuta normalisatie voor multi-currency gateways. FX conversie op betaling ontvangst voor nauwkeurige rapportage van inkomsten.

Cron en geplande automatisering

Ingebouwd cron systeem voor geplande taken: rapportage generatie, gegevens opruimen, abonnement vernieuwings-, AI training updates, connector syncs en webhook retrieves. Gezondheidsdiagnostiek met waarschuwingsindicatoren.

Beleid inzake gegevensbewaring

Configureer hoe lang bezoeksessies, chat-transcripties, AI gesprek geschiedenis en event logs worden bewaard. Automatische opruiming van verouderde gegevens om opslag te beheren en voldoen aan het bewaarbeleid.

Diagnostica en gezondheid

Systeemgezondheidsdashboard met cron status, database connectiviteit, AI provider status, connector gezondheid, webhook leveringssnelheden en opslaggebruik. Waarschuwingen voor configuratie problemen en prestatieknelpunten.

Wie OpsIQ is voor

E-handelswinkels

Opslag

Volg elke bezoeker van landing tot aankoop. Laat AI antwoorden "Waar is mijn bestelling?" met behulp van live Shopify/WooCommerce/BigCommerce data. Beheer support tickets met AI auto-reply. Voer een deal pipeline voor groothandel en B2B leads. Eigen inkomsten aan verkeersbronnen en campagnes toe te schrijven. Monitor kar verlaten met herstel workflows.

SaaS en softwarebedrijven

SaaS

Monitor trial signups en functie adoptie met sessie replay. Track welke documentatie pagina's converteren. Automatiseer ondersteuning met AI geaard in uw API docs. Beheer de omzet van abonnementen en uitbreidingen in het CRM. Sluit uw facturatieplatform aan (Stripe, WHMCS) voor real-time MRR tracking. Gebruik de CRM lifecycle agent om te detecteren en te voorkomen dat churn.

Agentschappen en freelancers

Agentschap

Biedt white label analytics en ondersteuning portals aan klanten. Track leads over meerdere client sites van een admin. Gebruik de CRM pipeline om prospects en project leads te beheren. Bouw aangepaste connectors voor client platformen met behulp van de Connector Builder. Genereer merk SEO rapporten met Site Intelligence. Verkoop marktplaats connectoren als waarde-add diensten.

Hosting en infrastructuur

Hosting

Diep WHMCS integratie met 80+ AI acties voor order opzoeken, service management, DNS, en provisioning. Auto-reply to common hosting vragen met behulp van kennisbase artikelen. Track server status pagina engagement. Manage technische support tickets met AI triage. Gebruik de facturatie cyclusladder voor maandelijkse via levenslange hostingen plannen.

Steun aan zwaarlijvige bedrijven

Steun

Ombuigen 40-70% van repetitieve vragen met AI chat gegrond in uw kennisbasis. Route tickets naar de juiste afdeling met KI triage. Track team prestaties met resolutie tijden, SLA compliance en CSAT door agent. Gebruik het schrijven van AI voor professionele antwoorden opstellen. Monitor ondersteuning trends met ALI inzichten.

Marketing- en SEO-teams

In de handel brengen

Volledige Site Intelligence suite: kruipt, technische SEO audits, content analyse, SERP rang volgen, keyword onderzoek, backlink monitoring en lokale SEO-netwerk. Google Business Profiel management. Geplande white label rapporten voor klanten. A / B testen ingebouwd in de tracking widget. campagne toeschrijving over alle kanalen.

Solo-oprichters en kleine teams

Opstarten

Begin met gewoon tracking en chat, gratis toe te voegen. Voeg vervolgens tickets toe wanneer je ondersteuning volume krijgt. Zet de CRM aan als u begint te verkopen. Verbind platformen terwijl u ze adopteert. OpsIQ schalen van één persoon doen alles om een 50-persoon operations team met RBAC, afdelingen en per-agent prestaties tracking.

Onderneming en multimerk

Enterprise

Onderneming SSO metOIDCMulti-workspace isolatie voor afzonderlijke merken of divisies. Per-werkruimte AI configuratie met verschillende providers en modellen. Aangepaste connector ontwikkeling met marktdistributie. Audit trails,GDPR nalevingsinstrumenten en beleidsmaatregelen voor gegevensopslag.

Wat? OpsIQ vervangt

Google Analytics + Hotjar + Plausibel

Volledige website analytics met bezoekers volgen, sessie replay, pagina rangschikking, geo intelligentie, intentie trechters, conversie attributie, gebeurtenissen, A/B experimenten en JS fout bijhouden, alle privacy-vriendelijk, allemaal in één platform.

Intercom + Drift + Tidio

AI-aangedreven klantchat met kennisgronding, multi-provider AI ondersteuning, auto-handoff aan mensen, proactieve chatregels, gespreksgeschiedenis, CSAT enquêtes en ticketcreatie van chat.

Zendesk + Freshdesk en Help Scout

Inheems ticketsysteem met afdelingen, prioriteiten, SLA, AI triage, automatisch antwoord met configureerbare vertraging, e-mailinname, kaartje insluiten, het samenvoegen van kaarten, copiloot inbox en Return to AI mogelijkheden.

HubSpot + Pipedrive + Salesforce

AI-eerste CRM met vier gespecialiseerde AI agenten (Steward, SDR, Retention, Analyst), Trust Dial autonomie controle, pipeline board, deal coaching, voorspelling, sequences, lifecycle management en natuurlijke taal CRM configuratie.

Ahrefs + SEMrush + Moz

Site Intelligence met automatische kruipen, technische SEO audits, content analyse, AI zoekopdracht, SERP rang volgen, keyword onderzoek, backlink analyse, lokale SEO-netwerk en geplande white label rapporten.

Zapier + Make + aangepaste middleware

Connector SDK met 25+ voorgebouwde connectoren, Connector Builder (geen code/AI-ondersteund/volledige code), OAuth flow, webhook auto-registration, een grote catalogus van connector actie definities die alleen uitvoerbaar worden wanneer de relevante connecter is geïnstalleerd, ingeschakeld, geconfigureerd en gevalideerd, SmartLookup, marktplaats, en ondertekend pakketten.

Google Business Profielmanager

Volledige GBP-connector: review management, post publishing, Q&A management, foto-uploads, bedrijfsinfo synchronisatie, inzichten volgen en AI-aangedreven beoordeling antwoorden, allemaal van binnenuit OpsIQ.

Aparte e-mail template tools

Register-gestuurde email templates met visuele editor, live preview, variabele chips, globale layout controle en per-event aanpassing voor alle geautomatiseerde communicatie.

Dashboards voor teambeheer

Ingebouwde teamprestaties: resolutietijden, werklast, SLA compliance, CSAT per agent, heropeningspercentages, drukste uren, real-time aanwezigheidstracking en storingen per afdeling.

GDPR compliance-instrumenten

Inheems DSAR behandeling, gegevenswissing over alle systemen, toestemmingsbeheer, bewaarbeleid en audit trails, ingebouwd in het platform, niet vastgeschroefd.

Twee edities

Gehoste inzet

OpsIQ wordt uitgevoerd op beheerde infrastructuur. Productbewerking is hetzelfde; infrastructuur, updates en back-ups worden behandeld door de hosting exploitant. Dit handboek documenteert het OpsIQ runtime in plaats van marketing- of commerciële rekeningstromen.

Zelf-hosted module

Installeren OpsIQ op uw eigen server voor volledige controle over data, branding, updates en integraties. 8.4+, MySQL 5.7+ of MariaDB 10.3+, HTTPS en de OpsIQ Eendrachtige cron. Steunen WHMCS integratie als een addon module. Volledige data soevereiniteit.

Aanbevolen leesvolgorde

1
Snel starten

Volg de 30-minuten setup gids om tracking, chat en basis AI te krijgen die aan uw website werkt.

2
Dashboard en analyse

Leer hoe je de bezoekersgegevens leest, sessie-herspeling opzet, leads identificeert en verkeerspatronen begrijpt.

3
Site Intelligence (SITE)

Voer uw eerste SEO crawl, controleer je technische gezondheid en zet SERP rang tracking voor uw doel zoekwoorden.

4
Tickets en ondersteuning

Stel afdelingen in, configureer automatisch antwoord met AI, sluit e-mail inname aan en train uw AI om veel voorkomende vragen te behandelen.

5
CRM

Organiseer contacten, bouw je pijplijn, configureer de AI-agenten, stel Trust Dial niveaus in en laat AI jouw aanbiedingen coachen.

6
Connectoren en ontwikkelaarsgereedschappen

Sluit uw e-commerce/facturering platform aan, bouw aangepaste connectoren, stel webhooks in en integreer via het REST API.

💡
Nieuw bij OpsIQ? Beginnen met de Quick Start gids hieronder. U kunt het volgen en basis AI chat lopen onder 30 minuten.
Begin hier

Snel starten in 30 minuten

Volg deze stappen om OpsIQ draaiende te krijgen. Elke stap bouwt voort op de vorige. Tegen het einde, zal u bezoeker volgen, AI chat en basis ticket ondersteuning hebben.

Instellen
SnelstartchecklistEen begeleide setup-checklist met widget installatie, platform verbinding, AI training, team uitnodiging en go-live, met een 60 % voortgangsbalk.BeginnensetupInstalleer de OpsIQ widgetKLAAREen platform verbinden (WHMCS, Shopify...)KLAARTrain uw AI op uw inhoudKLAARNodig je team uitControleer en ga liveVoortgang instellen3 van 5 · 60%1STEP 1Het widget installeren2STEP 2& Trein AI verbinden3STEP 3Uitnodigen & live gaan
Het 30-minuut pad: installeer het widget, sluit een platform aan, train je AI, nodig het team uit en ga dan live.

De 30-minuten setup

1
Activeer je licentie

Voer uw licentiesleutel in de OpsIQ admin. Ga naar Instellingen, voer de licentiesleutel die voor deze installatie is opgegeven in en klik op Activeren. U moet een groene "Active" badge zien.

2
Stel uw bedrijfsidentiteit in

Ga naar Instellingen en vul uw bedrijfsnaam, industrie, tijdzone, standaard valuta en supporturen in. Deze informatie wordt door de AI gebruikt bij het beantwoorden van vragen van klanten en door analyses voor timezone-aware rapporten.

3
Kies een AI provider

Ga naar AI Configuratie en kies uw provider. Opties: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), of Grok (xAI). API toets als u uw eigen sleutel gebruikt, of gebruik Managed AI indien beschikbaar op uw plan. Klik op "Test verbinding" om te verifiëren.

4
Het volgwidget installeren

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
Verbind uw platform

Als u Shopify, WooCommerce, WHMCS, of een ander ondersteund platform, ga naar Connectors, vind uw platform, voer referenties in en klik op Test Connection. Dit geeft de AI toegang tot bestelgegevens, klantprofielen en ondersteuning context.

6
Nodig je team uit

Ga naar Team, klik op Uitnodigen, voer hun e-mail en rol (Eerwaarde, Full Admin, of Agent). Agenten kunnen alleen toegang krijgen tot afdelingen die u hen toewijst. Eigenaren en volledige beheerders zien alles.

Het snelst mogelijke pad (5 minuten)

Stap 1: Installeer widget

Kopieer het knipsel van Connected Sites en plak het op uw website. Dit geeft u direct tracking.

Stap 2: AI inschakelen

Ga naar AI Configuration, kies een provider, voer uw sleutel in en sla op. AI chat is nu actief op uw website.

Klaar

U heeft nu bezoeker tracking en AI chat. U kunt later tickets, CRM en connectors toevoegen.

Dag 2: Maak het nuttig

Kennis toevoegen

Ga naar kennisbasis en voeg toe 5-10 artikelen over uw meest voorkomende vragen. De AI gebruikt deze om klanten nauwkeurig te beantwoorden.

Afdelingen aanmaken

Ga naar Tickets en maak op zijn minst 2 afdelingen (bv. "Sales" en "Support"). Geef teamleden aan elk van hen.

Schrijf uw AI-prompt

Ga naar AI Training en schrijf een Customer AI prompt die uw bedrijf, toon, en escalatie regels beschrijft.

Een gesprek testen

Open uw website in een privé-browser en praat met de AI als klant. Controleer of antwoorden accuraat zijn en toon klopt.

Week 1: Bouw uw bewerkingen

E-mail verbinden

Een mailbox (Gmail, IMAP of een providerconnector) instellen zodat klanten e-mails automatisch tickets maken.

Automatisch antwoord instellen

Schakel automatisch antwoord op tickets in voor veilige afdelingen. Stel een 2-minuut vertraging in zodat mensen eerst kunnen ingrijpen.

Evaluatieanalyses

Check Dashboard dagelijks. Kijk naar bezoekersaantal, bounce rate, top pagina's en verkoop als tracking is aangesloten.

Start je CRM

AI openen CRM en laatOpsIQimporteer contacten van uw aangesloten platforms. Bekijk het pijpleidingbord.

Maand 1: Optimaliseren

Beoordeling van de AI-geschiedenis

Controleer AI Geschiedenis wekelijks. Kijk voor verkeerde antwoorden, gemiste vragen en mogelijkheden om kennis toe te voegen.

Proactieve regels toevoegen

Maak een regel: als een bezoeker op de prijslijst voor 60+ seconden staat, toon dan een chatbericht waarin wordt gevraagd of ze hulp nodig hebben.

Bouw een connector

Als u een platform gebruikt dat geen ingebouwde connector heeft, gebruik dan de Connector Builder om er één te maken.

Webhooks instellen

Verbinden OpsIQ naar uw interne tools met behulp van uitgaande webhooks voor ticket, chat en sales evenementen.

Mag ik de AI overslaan en gewoon tracking gebruiken?+

Ja. De AI provider is optioneel. OpsIQ werkt als een pure analytics en ticketing platform zonder AI. U kunt AI later inschakelen wanneer u klaar bent.

Kan ik de connectoren overslaan en ze later toevoegen?+

Ja. Connectoren verrijken de AI met platformspecifieke gegevens, maar OpsIQ Werkt zonder hen. Beginnen met tracking en chat, vervolgens verbinden platforms wanneer nodig.

Wat als ik nog geen website heb?+

U kunt nog steeds OpsIQ gebruiken voor tickets, CRM en teamsamenwerking. Het tracking-widget is optioneel. Voeg het toe als uw website klaar is.

Hoe weet ik of het widget correct is geïnstalleerd?+

Bezoek uw website in een privé/incognito browser. Check dan OpsIQ Live Feed. Je zou je bezoek binnen moeten zien verschijnen 15 seconden. Zo niet, controleer: (1) is het knipsel correct geplakt, (2) is de site sleutel correct, (3) zijn advertentieblokkers of CSP-headers die het script blokkeren.

Begin hier

Complete productkaart

OpsIQ is geen functie. Het is een beheerder admin, een website widget, een AI-ondersteuning laag, een ticket / helpdesk systeem, een volledige CRM met vier AI agenten, een Site Intelligence suite, een aansluiting platform met marktplaats, en een ontwikkelaar oppervlak. Hier is elk onderdeel dat het bevat.

Exploitantbeheerder

Dashboard, live feed, bezoekerslog, sessies, session replay, toppagina's, geo intelligence, intent trechter, events log, A/B experimenten, JS fouttracking, sales en conversies, leads, AI CRM (command center, contactpersonen, bedrijven, deals, pipeline board, deal coaching, dead coachen, prognose, prospectie, sequences, lifecycle, data steward, Build my CRM, CRM config, CRC health, Chroom API_), tickets, chat-inbox, proactieve regels, CSAT enquêtes, email concepts, mailboxen, KI configuratie, ALI training, OI geschiedenis, Ali inzichten, kennisbasis, connectoren, processoren, marktplaats, verbonden sites, teambeheer, teamprestaties, instellingen, diagnoses en licentie.

Klantgericht oppervlak

Website tracking widget (analytics baken + chat + ticket ingesloten + kennisbasis zoeken), client AI chat, ticket indiening portal, bezoeker identiteit token behandeling, bestand uploads, CSAT enquête widge en klantgerichte helpcenter.

AI-Eerste CRM

Commandocentrum, contacten, bedrijven, deals, pipelineboard met drag-and-drop, AI-deal coaching (risicosignalen, next-best-action, winst waarschijnlijkheid), inkomstenvoorspelling, prospectieve agent (SDR), geautomatiseerd follow-up sequenties, levenscyclus en beheer van gegevensbeheer (afgerond, verrijken, valideren), Build my CRM (natuurlijke taalopstelling), CRM configuratie, CRM gezondheidscontrole, Trust Dial (Autopilot/Copilot / Manual per agent), vier gespecialiseerde agenten (Steward, SDR, Retention, Analyst) en CRM API met webhooks.

Site Intelligence Suite

Geautomatiseerde site crawls, technische SEO audit (speed, mobile, Core Web Vitals; SSL, redirects, gestructureerde gegevens), inhoud audit (woorden tellen, leesbaarheid, sleutelwoord dichtheid, kopstructuur), AI-aangedreven semantische zoekopdracht, SERP rang volgen over motoren, keyword onderzoek met kans scoren, backlink analyse en monitoring, lokale SEO rastervisualisatie, Google Business Profile sync (reviews, berichten, vragen en antwoorden, foto's, inzichten), geplande rapporten (dagelijks/wekelijks/maandelijks) en white-label PDF output voor agentschappen.

AI en automatisering

Klant AI chat (multi-provider: Claude, GPT-4o, Gemini, Grok), admin AI-assistent, AI kennis gronding, auto-handoff met configureerbare terugschakeling, per werkruimte AI configuratie, managed AI en BYOK modi, token budgetten en kosten controles, AI geschiedenis audit trail, KI inzichten analyse, ticket AI triage, kaartje automatisch antwoord met vertraging, schrijven van AI (aparte prompt), en admin inbox copilot.

Connectoren en integraties

25+ voorgebouwde connectoren (Shopify, WooCommerce BigCommerce, Magento2, PrestaShop, OpenCart, osCommerce, WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Poststempel, Verzenden, SendGrid, Mailgun, Gmail, IMAP, Slack, Google Business Profile), Connector Builder (no-code/AI-assisted/full-code), generiek OAuth stroom met PKCE, connector marktplaats met betaalde distributie, schakelaar ondertekening en verificatie, SmartLookup fuzzy matching, een grote catalogus van HTTP actie definities waarvan de beschikbaarheid afhankelijk is van installatie van de connecter, enablement, configuratie en validatie, kennissynchronisatie en workflow recepten.

Ontwikkelaarsplatform

RESTAPI(bezoekers, evenementen, tickets, contacten, instellingen, connectoren), OpenAPI spec,API key management, uitgaande webhooks (async, ondertekend, opnieuw opgevraagd, SSRF-bewaakt, auto-disable), evenementenAPI voor aangepaste gebeurtenis-inname, widget SDKmet identiteitsresolutie, triggers kookboek, actie contracten, connector SDK, marketplace verpakkingen, SDK's aan de serverzijde (PHP, Node.js), WordPress plugin, en WHMCS module.

Instellingen en bewerkingen

Bedrijfsidentiteit, AI-configuratie per werkplek, trackinginstellingen, beveiliging (HSTS, Permissies-politie, IP blokkeren, brute-force bescherming), RBAC (Owner/Full Admin/Agent), team management en uitnodigingen, team prestaties dashboard, admin aanwezigheid volgen, e-mail template systeem (registry-driven, visuele editor, variabele chips), enquête ontwerper, domeinkennis, ticket inbed configuratie, branding, gegevensretentie beleid, facturatie cyclus beheer (maandelijks door de levensduur), valuta normalisatie, import / export, diagnoses, cron automatisering, en gevaar zone.

Veiligheid en naleving

Onderneming SSO (OIDC met JWKS verificatie, JIT provisioning), SAML configuratie, GDPR/DSAR behandeling (exporteren en verwijderen over alle systemen), gegevenswissing per contact, toestemmingsbeheer, werkruimte-isolatie (strikte query-layer scoping), audit trails, mislukte login tracking, IP blokkeren, uitgaande webhook SSRF bewaker, en gegevensopslag beleid.

Brug van de aanbieder

Beheerde AI door middel van OpsIQ provider URL, Site Intelligence provider belt, licentievalidatie, gezondheidsverslagen, PDF rendering, en data export, alle gerouteerd via de geconfigureerde provider eindpunt, niet directe leverancier API oproepen van uw server.

Elke admin pagina

Dashboard

Kern

Dagelijks commandocentrum: verkeersoverzicht, aantal bezoekers live, samenvatting van de verkoop, ondersteuning wachtrijdiepte, AI activiteit waarschuwingen en sneltoetsen.

Levende diervoeders

Analyse

Real-time bezoekersstroom: paginaweergaven, chat begint, formulier inzendingen en intentiesignalen updaten om de paar seconden met land, apparaat en referrer filters.

Bezoekerslogboek

Analyse

Volledige bezoek records: apparaat, browser, OS, land, stad, referrer, UTM params, landingspagina, identiteit en volledige pagina-view geschiedenis.

Sessies

Analyse

Journey-gegroepeerde weergave: pagina flow, tijd op de pagina, scrolldiepte, conversie pad en exit pagina voor elke bezoeker sessie.

Sessie-herhaling

Analyse

Tijdlijn afspelen van gevangen gebeurtenissen: muisbeweging, klikken, scrollen, pagina overgangen en vorm interacties voor UX diagnose.

Toppagina's

Analyse

Paginaprestaties rangschikking: bezoeken, verlovingstijden, bounce rate, conversies, ondersteuning interacties en trend richting.

Geo-intelligence

Analyse

Geografische rapporten: land/stad uitsplitsing met kaarten, apparaat distributie, browser aandeel, verkeersbronnen en marktpenetratie.

Intent trechter

Analyse

Gedragsgebonden intent tracking: prijsbezoeken, retourfrequentie, doc browsen, ondersteuning interacties en aangepaste signalen met conversie waarschijnlijkheid.

Gebeurtenissenlog

Analyse

Zoekenable event geschiedenis: paginaweergaven, aangepaste evenementen, chats, aankopen, formulier inzendingen met volledige metagegevens en filtering.

A/B experimenten

Analyse

Splittesting: maak varianten, allocatie verkeer, definieer doelen, meet betekenis en verklaar winnaars van binnenuit OpsIQ.

JS-fouten

Analyse

Frontend fout vastleggen: berichten, stack sporen, getroffen browsers, frequentie, beïnvloed pagina's en trend tracking.

Verkoop

Verkoop

Inkomsten dashboard: bestellingen, vernieuwingen, terugbetalingen, toeschrijving per bron, campagneprestaties, periodevergelijking en trendanalyse.

Lood

Verkoop

Lead management: scoren, bron toeschrijving, CRM status, contactgegevens, gedragssignalen en pijpleiding routering.

AI CRM-oplossingen

CRM

Volledige CRM: commandocentrum, contacten, bedrijven, deals, pipeline board, coaching, voorspelling, prospectie, opeenvolgingen, levenscyclus, data steward en gezondheid.

Tickets

Steun

Ondersteuningspostvak: afdelingen, prioriteiten, SLA-tracking, AI triage, auto-reply, interne notities, bestandsbijlagen, samenvoegen en statusbeheer.

Chat-inbox

Steun

Live conversaties: AI en menselijke chat, overdracht, samenwerking, gespreksgeschiedenis, klantidentiteit en CSAT collectie.

E-mailconcepten

Steun

E-mailbeheer: inkomende mail naar tickets, AI-geassisteerde antwoordsamenstelling, sjabloonselectie en postbusconfiguratie.

AI-configuratie

AI

Provider setup: kies Claude/GPT-4o Gemini Grok, voer in. API sleutel of in staat te stellen beheerde AI, set model, temperatuur en token budgetten per werkplek.

AI-opleiding

AI

Prompt auteur: klantgerichte en admin-georiënteerde prompts, escalatieregels, toonrichtlijnen, verboden onderwerpen en grensconfiguratie.

AI geschiedenis

AI

Conversatie audit: volledige aanvraag / reactie logs, token gebruik, kosten per gesprek, provider, modelversie en resolutie resultaat.

AI inzichten

AI

Patroonanalyse: gemeenschappelijke vragen, resolutiepercentages, overdrachtsfrequentie, tevredenheid per onderwerp en identificatie van de opleidingskloof.

Kennisbasis

AI

AI training inhoud: artikelen, veelgestelde vragen ingangen, product docs, connector kennis en aangepaste vermeldingen. Semantische en zoekwoord zoeken naar AI aarding.

Connectoren

Integraties

Integratiehub: geïnstalleerde connectoren, gezondheidstoestand, actie inventaris, credential management, markt browser en Connector Builder.

Aangesloten sites

Instellingen

Site management: het bijhouden van knipsel, site key, widget configuratie, domeininstellingen en per-site werkruimte isolatie.

Team

Instellingen

Gebruikersbeheer: uitnodigen leden, toewijzen van rollen (Eeuwige/Volledige Admin/Agent), instellen afdeling toegang en het beheren van machtigingen.

Teamprestaties

Instellingen

Ops metrics: resolutietijden, werklast, SLA compliance, CSAT per agent, heropening van tarieven, drukste uren en trendanalyse.

Instellingen

Instellingen

Configuratie: zakelijke identiteit, AI setup, tracking, beveiliging, branding, bewaring, e-mailsjablonen, facturering, import/export, diagnose en gevaar zone.

Licentie

Instellingen

Planbeheer: licentiestatus, kenmerken van het plan, gebruiksstatistieken, verlengingsdatum en upgrade/downgradeopties.

Begin hier

Begeleid aan boord

De onboarding reis maakt van een nieuwe installatie een werkende OpsIQ werkruimte en kan worden verlaten en hervat zonder dat vooruitgang verloren gaat.

Productscherm
Aan boordOnboarding toont elk setup gebied, de huidige staat en de volgende actie om te voltooien.Aan boordwerkbladPROGRESS60%COMPLETED6VolgendeWidgetLEVENDE WERKSPACE-ZICHTLicentieValideren van de productlicentieKlaarAI-aanbiederSelecteer provider en testsleutelKlaarMerkBedrijfsidentiteit en -toonKlaarWebsiteVoeg site toe en installeer widgetVolgende1COMPLETE BASICSLicentie, merk, AI2CONNECT DATAPlaats en aansluiting3VERIFY LAUNCHTeam, e-mail, controles
Onboarding toont elk setup gebied, de huidige staat en de volgende actie om te voltooien.

Aanbevolen reeks

  1. Licentie: de licentie valideren en bevestigen dat de werkruimte actief is.
  2. AI-aanbieder: Kies de provider/model, voer de referenties in en voer de verbindingstest uit. AI kan worden overgeslagen als de werkruimte eerst alleen analytics en tickets gebruikt.
  3. Bedrijfsidentiteit: de naam, industrie, beschrijving, klantgerichte toon en merkgegevens die door het widget en AI worden gebruikt.
  4. Verbinding: ten minste één extern platform inschakelen wanneer OpsIQ orders, klanten, tickets, e-mail of andere platform context nodig heeft.
  5. Site en widget: Maak de site/werkruimte, kopieer de sleutel van de site en verifieer een privé-browserbezoek in Live Feed.
  6. Team en routering: Nodig admins/agents uit, maak afdelingen aan, stel e-mailrouting in en bevestig de voorkeuren voor meldingen.
  7. Controles in de go-live: testchat, een ticket, connector sync, cron, uitgaande e-mail, webhooks en beveiligingsheaders.

De reis slaat voltooiing per werkruimte op. Teruggaan naar Onboarding moet voltooide stappen tonen in plaats van een herstart forceren.

Begin hier

Beheerdersnavigatie en -rechten

De OpsIQ zijbalk is permissie-bewust. Deze kaart legt uit waar elk operationeel gebied woont en waarom een pagina mogelijk niet zichtbaar is voor elke beheerder.

Productscherm
OpsIQ navigatieDe zijbalkgroepen OpsIQ per werkgebied; individuele links verschijnen alleen wanneer de huidige rol ze kan gebruiken.OpsIQ navigatiewerkbladGROUPS8PAGINA'SToestemming gebaseerdSEARCHBeschikbaarLEVENDE WERKSPACE-ZICHTSteunTickets, e-mail, CSAT, kennisOpenenCRMContacten, pijpleiding, deals, prospectieOpenenAutomatiseringWerkstromen, regels, doelstellingenOpenenBeveiliging en privacyOverzicht, audit, toestemming, blokkenBeheerder1PICK A GROUPPas het zijpaneel aan2CHECK ROLEVerborgen betekent beperkt3USE PAGE HELPDe overeenkomende sectie openen
De zijbalkgroepen OpsIQ per werkgebied; individuele links verschijnen alleen wanneer de huidige rol ze kan gebruiken.
Steun

Tickets, het e-mailplatform van het team, CSAT, het Helpcentrum en chatbotstromen.

CRM

De dagelijkse verkoopoppervlaktes: CRM Home, Command Center, contacten, pijpleiding, prognose, levenscyclus, prospectie, segmenten, leaderboard, deal approvals, data steward, groeitools en de activiteitstroom.

Automatisering

Event-gedreven workflows, levenscyclusregels en conversiedoelstellingen.

In de handel brengen

Outreach, proactieve berichten, aankondigingen, Promotie Studio, Survey Studium, push campagnes en rondleidingen.

Analyse

Rapporteer oppervlakken eerste . . Analytics Hub, AI inzichten, verkoop, klanten, leads, trechters, A/B testen, sessie replay, aangepaste dashboards en geplande rapporten . Met de ruwe bezoeker, session, pagina, aardrijkskunde en event logs in een Raw Data sub-sectie.

Standalone pagina's

Site Intelligence, Team Performance en Feedback zitten buiten de groepen als directe inzendingen.

Integraties

Connectors, acties en triggers, mailboxen, concepts, e-mailinstellingen, inkomende eindpunten, uitgaande webhooks en API sleutels.

Beveiliging en privacy

Beveiligingsoverzicht, privacy en compliance, toestemming voor cookies, auditactiviteiten, mislukte aanmeldingen, geblokkeerdIPsenJavaScriptfouten.

Instellingen

Basisprincipes van de werkplek (algemeen, team, sites, talen), vervolgens inklapbare subsecties: AI Brain (instructies, configuratie, evaluatie, geschiedenis), CRM-instellingen (bouwer, aangepaste velden, lead scoren, gezondheid), Data & Health (diagnose, export) en Aan de slag (aan boord gaan, hulp).

Pagina's die een rol niet kunnen openen zijn verborgen in de zijbalk. Pagina ' s het huidige plan bevat geen zichtbaar blijven met een Upgrade tag en open een in-app upgrade scherm.

Directe routes worden nog steeds aan de server-kant gecontroleerd. Een zijbalkverbinding verbergen is niet de veiligheidsgrens: elke beschermde actie moet zijn toestemming en werkbladcontroles passeren.

Analyse

Analytics-hub

De Analytics-hub brengt ondersteuning, chat, AI, bezoeker en agent rapportage in één door datum gefilterde werkruimte met exporteerbare resultaten.

Productscherm
Analytics-hubAnalytics Hub toont een datumbereik, metrische kaarten en tabbladen voor Support, Chat, AI, Visitor and Agent prestaties.Analytics-hubwerkbladTICKETS184AI RESOLVE63%CSAT4.7LEVENDE WERKSPACE-ZICHTSteunAangemaakt, gesloten, in behandeling, SLATabbladGesprekAI/menselijke resultaten en tijd van het hanterenTabbladAIVertrouwen, feedback, tokengebruikTabbladAgentVolume, snelheid en tevredenheidTabblad1CHOOSE DATESVoorinstelling of aangepaste2CHANGE TABOndersteuning van agent3EXPORTDownloaden CSV
Analytics Hub toont een datumbereik, metrische kaarten en tabbladen voor Support, Chat, AI, Visitor and Agent prestaties.

Filters en bedieningsorganen

  • Gebruik een voorinstelling of een aangepaste van/tot bereik, dan vernieuwen om elke kaart en grafiek voor dezelfde periode opnieuw te bouwen.
  • Exporteren CSV exporteert het actieve analytische beeld in plaats van een screenshot.
  • Werkruimte zoeken is automatisch; het wijzigen van sites verandert de onderliggende dataset.

Wat elk tabblad meet

  • Steun: tickets aangemaakt/gesloten/uitgegeven, eerste antwoord, resolutie, first-contact resolutie, SLA en prioriteit/afdeling/status uitsplitsingen.
  • Chatten: sessies begonnen, AI resoluties, escalaties, verlatenheid, tijd van de behandeling, berichten per sessie en AI/human/all CSAT.
  • AI: gemiddeld vertrouwen, lage betrouwbaarheidsgraad, triage-nauwkeurigheid, feedback, kennisverlegging, token/cachegebruik en de items die moeten worden beoordeeld.
  • Bezoeker: trends in verkeer en betrokkenheid voor de geselecteerde periode.
  • Agent: per-agent werklast, snelheid, sluiting en tevredenheidsmaatregelen.

Gebruik Analytics Hub voor cross-team review; gebruik de speciale bezoekers, tickets, CSAT, AI Geschiedenis en Team Performance pagina's wanneer u een record-level onderzoek nodig hebt.

Analyse

Het Dashboard

Het Dashboard is uw dagelijkse commandocentrum. Het toont verkeer, verkoop, ondersteuning lading, AI activiteit en conversie indicatoren in één uitzicht. Open het elke ochtend om te begrijpen wat er gebeurde vannacht en wat vandaag de dag aandacht nodig heeft.

Dashboard
Overzicht dashboardHet Overzicht scherm geleid door een OpsIQ Intelligence AI-paneel (met Dagelijkse brief, Smart waarschuwingen, Voorspelling), KPI widget tegels en een zevendaagse verkeerswidget, plus een Reset layout control.OverzichtwerkbladOPSIQ INTELLIGENTIEKies een analyse en OpsIQ schrijft hetDagelijkse briefingSlimme waarschuwingenVoorspellingOpmaak resettenBEZOEKEN VANDAAG2,481+12%ONTVANGSTEN$8.2k+5%Open Tickets voor143 SLAVerkeer · laatste 7 dagen1AI-FIRSTOpsIQ Intelligentiepanel2WIDGETSKPI-tegels die u regelt3JOUWOpmaak op elk moment resetten
Het echte overzichtsscherm: de OpsIQ Intelligentiepaneel bovenaan (pick een analyse en het schrijft) boven de KPI widgets die je zelf regelt.

Dashboardkaarten uitgelegd

Levende bezoekers

Het aantal mensen op uw website nu. Dit update elke 15 seconden (configureerbaar). Een bezoeker is "actief" als ze een pagina binnen de actieve drempel hebben geladen (standaard: 90 seconden).

Unieke bezoekers

Hoeveel verschillende mensen uw website bezochten in het geselecteerde datumbereik. OpsIQ identificeert bezoekers door een combinatie van browser vingerafdruk, cookies en (indien beschikbaar) geauthentiseerde identiteit.

Nieuw vs terugkomst

Nieuwe bezoekers zien uw site voor de eerste keer. Terugkeer van bezoekers zijn eerder gezien. Een hoge terugkeer ratio betekent dat je inhoud brengt mensen terug. Een zeer lage terugkeer verhouding kan betekenen dat u niet behoud van interesse.

Stuiterpercentage

Het percentage bezoekers dat na het bekijken van slechts één pagina is vertrokken. Een bounce rate boven 70% op landing pages betekent meestal niet dat de pagina voldoet aan verwachtingen van bezoekers, verkeerde inhoud, trage belasting of slechte mobiele ervaring.

Gemiddelde tijd op pagina

Hoe lang bezoekers gemiddeld op elke pagina doorbrengen. Zeer korte tijden (onder 10 seconden) op de inhoud pagina's suggereren dat de inhoud niet boeiend is. Zeer lange tijden op afrekenpagina's kan wijzen op verwarring.

Bedreigingen geblokkeerd

IPadresseert dat OpsIQ geïdentificeerd als potentieel kwaadaardig op basis van dreiging scoren, brute kracht pogingen, of handmatige blokken. Klik om de geblokkeerd te zien IPs lijst.

Verkoop vandaag / deze week / deze maand

Inkomsten uit verbonden verkoopbronnen (Shopify, WooCommerce, Stripe, enz.). Als de verkoop nul toont, controleer dan of uw platformconnector is aangesloten en synchroniseren.

Trend grafiek 2

Een lijngrafiek met bezoekerstelling over het geselecteerde datumbereik. Zoek naar patronen: verkeerspieken (campaigns, persvermeldingen), dips (weekends, vakanties) en aanhoudende trends.

Topbronnen

Waar uw bezoekers vandaan komen: direct, Google, social media, e-mailcampagnes, referral sites. Gebruik dit om te begrijpen welke marketingkanalen werken.

Bovenste browsers

Chrome, Safari, Firefox, Rand en anderen. Als een browser heeft ongewoon hoge bounce rate, zou je een CSS of JavaScript compatibiliteitsprobleem.

Uurlijke warmtekaart

Een raster met bezoekersactiviteit per uur van de dag en dag van de week. Gebruik dit om te bepalen wanneer ondersteuningsverschuivingen gepland worden, wanneer aankondigingen verzonden moeten worden en wanneer promoties uitgevoerd moeten worden.

Recente bezoekers

De laatste bezoekers met land, pagina, apparaat en bron. Handig voor snelle spot-checks tijdens campagnes.

Het datumbereikfilter gebruiken

Klik op de datumkiezer rechtsboven in het Dashboard. Voorinstellingen: Vandaag, gisteren, laatst 7 Dagen, Laatste 30 dagen, Deze maand, Vorige maand, Aangepast bereik. Alle dashboardkaarten en grafieken worden bijgewerkt wanneer u het bereik wijzigt. Het datumbereik bevindt zich in uw geconfigureerde tijdzone (in Instellingen).

Bewerkte voorbeelden

Onderzoek naar de piek van het botsvermogen

Scenario:
Je bounce rate sprong deze week van 45% naar 78%.
Wat te doen:

Controle: (1) Is een specifieke landingspagina veranderd? Ga naar de Top Pagina's en sorteren op bounce rate. (2) Heeft een campagne verkeer naar de verkeerde pagina gestuurd? Controleer Top Bronnen voor nieuwe referrers. (3) Heeft de site gebroken op mobiel? Controleer browser-uitval voor mobiele bounce rate. (4) Is het bot verkeer? Controleer de Bedreigingen teller en bezoeker details op verdachte patronen.

Nul bezoekers op dashboard

Scenario:
Het dashboard toont 0 live bezoekers, ook al krijgt uw website verkeer.
Wat te doen:

Controle: (1) Is het volgwidget geïnstalleerd? Bekijk uw website broncode en zoek naar de OpsIQ script. (2) Is de site sleutel correct? Vergelijk de data-site-toets in het script met de sleutel in Connected Sites. (3) Is een CDN of cache die een oude pagina bedient zonder het script? Wis je CDN-cache. (4) Is een ad blocker of CSP header het script blokkeren? Controleer de browser console op geblokkeerde verzoeken.

Het uur-heatmap lezen

Scenario:
Je hittekaart toont zware activiteit tussen 10:00-2pm op weekdagen maar niets in het weekend.
Wat te doen:

Dit is een B2B verkeerspatroon. Uw bezoekers werken professionals surfen tijdens de openingstijden.1) Plan het ondersteunend personeel voor werkdagen van de week. (2) Stuur e-mail campagnes dinsdag-donderdag ochtend. (3) De weekendonderhoudsramen zijn veilig. (4) Overweeg het aanbieden van live chat alleen tijdens de spitsuren.

Verkeerspiek van onbekende bron

Scenario:
Je ziet een plotselinge piek van 500 bezoekers binnen een uur van een onbekende referrer.
Wat te doen:

Ga naar Bezoekers en filter tegen de tijd. Controleer: (1) Zijn ze echte bezoekers of bots? Kijk naar de duur van de sessie, bekeken pagina's en browser diversiteit. (2) Indien echt, op welke pagina landen ze? (3) Controleer de verwijzing URL. Iemand zou kunnen hebben gelinkt aan u van Reddit, Hacker News of een populaire blog. (4) Als het bot verkeer, controleer bedreigingen en overwegen blokkeren van de IP Afstand.

Waarom verschilt mijn bezoeker van Google Analytics?+

OpsIQ Het telt bezoekers anders. Het maakt gebruik van browser vingerafdruk en cookies, terwijl GA een ander cookiemodel gebruikt. Botfiltering, ad blockersnelheden en script laden kunnen ook verschillen veroorzaken. A 10-20% De variatie is normaal.

Kan ik het dashboard in een ander gereedschap plaatsen?+

Het dashboard is ontworpen voor de OpsIQ admin. Gebruik voor externe rapportage het REST API om analytics gegevens te trekken en weer te geven in uw eigen dashboard of BI tool.

Wat betekent de "dreigingen" tegen?+

Het telt. IP adresseert dat OpsIQ heeft gemarkeerd of geblokkeerd op basis van dreiging scoren, herhaalde mislukte logins, of handmatige blokken. Klik op de teller om details te zien en blokken beheren.

Analyse

Bezoekerslogboek

Het bezoekerslog toont elk bezoek aan uw getraceerde websites. Elke rij is een pagina laden van één bezoeker. Gebruik het om individuele bezoekersgedrag te onderzoeken, campagne verkeer te vinden en tracking problemen diagnosticeren.

Bezoekerslogboek
BezoekerslogboekEen bezoekerstafel met een filterbalk (datum, zoeken IP/email/city, source, device) en kolommen voor IP/email, locatie, bron, apparaat en tijd, met een gemarkeerde dreigingsrij.Bezoekerslogboekyoursite.com7 dagenZoeken IP, e-mail, stad...Bron ▾Apparaat ▾IP / E-mailPLAATSBRONTOESTELLENWANNEER[email protected]_VS · New YorkgoogleBureaublad2m41.62.10.4UK · LondendirectMobiel6m[email protected]DE - Berlijnutm:advertentiesMobiel14m203.0.113.9NG · EindhovenreferralBureaubladthreat1–25 van 3,402Sessie →1FILTERDatum · zoeken · bron · apparaat2REAL COLUMNSIP/email · locatie · apparaat · dreiging3DRILL INVolledige sessie openen
Het echte bezoekerslogboek: filter op datum, zoekopdracht en apparaat, lees dan elk bezoek door IP/email, locatie, bron, apparaat en tijd, bedreigingen gemarkeerd in rood.

Wat elke rij laat zien

IP adres

De bezoeker IP adres. Geanonimiseerd indien IP anonimisering is ingeschakeld in Instellingen. Klik om alle bezoeken van deze te zien IP.

Land en stad

Gedetecteerd van deIP adres met GeoIP-gegevens. Vereist MaxMind GeoLite2-database of Cloudflare geo-headers. Laat "Onbekend" zien als GeoIP niet is geconfigureerd.

Pagina URL

De pagina die de bezoeker geladen heeft. Klik om het volledige te zien URL. Lang URLs zijn afgekapt in de tabelweergave.

Verwijzer

Waar de bezoeker vandaan kwam voordat hij op uw site landde. "Direct" betekent geen verwijzing (bookmarks, getypt URLs, sommige app links).

Apparaat en browser

De bezoeker apparaat type (desktop, mobiel, tablet) en browser (Chrome, Safari, Firefox, enz.). Ontleed van de User-Agent header.

Datum en tijd

Toen de pagina geladen was, in uw geconfigureerde tijdzone.

Identiteit van de klant

Als de bezoeker geïdentificeerd wordt (via identiteits- of aanmeldingsteken), dan verschijnt hun naam of e-mail. Anders wordt het anoniem weergegeven.

Filters

Datumbereik

Filter bezoeken aan een bepaalde tijdsperiode. Standaard: laatste 7 dagen.

Zoeken

Zoeken op IP adres, bladzijde URL, referrer, country of customer email.

Bron

Filter op verkeersbron: Direct, Organisch, Sociaal, Referral, Betaald, E-mail.

Apparaat

Filter op bureaublad, Mobile of Tablet.

Alleen nieuw

Laat alleen eerste bezoekers zien die nog nooit eerder gezien zijn.

Bewerkte voorbeelden

Bezoekers vinden van een specifieke campagne

Scenario:
U startte een campagne van Google Ads met UTM parameter utm_source=google&utm_medium=cpc&ut m_campaign=zomer-verkoop. Hoe vindt u deze bezoekers?
Wat te doen:

Gebruik in het bezoekerslogboek het zoekveld en typ "zomer-sale" (zomerverkoop).URLs en pagina URLs, zodat UTM parameters zullen overeenkomen. U kunt ook filteren op Source = Betaald om verder te beperken.

Zoek een klant die een probleem gemeld

Scenario:
Een klant e-mailde dat "uw checkout pagina was gebroken gisteren rond 15:00 uur." Hoe vind je hun sessie?
Wat te doen:

Zoek op hun e-mailadres in het bezoekerslogboek. Als ze zijn ingelogd, zal hun identiteit verschijnen. Stel de datumbereik in naar gisteren. Kijk voor bezoeken aan checkout pagina's rond 15u. Klik op hun sessie om de volledige pagina stroom en eventuele JavaScript fouten te zien.

Een loop-hitter of schraper detecteren

Scenario:
U merkt een IP adres heeft 500+ bezoeken in een uur, allemaal op dezelfde pagina.
Wat te doen:

Dit is waarschijnlijk een bot, schraper of gebroken script. Ga naar het bezoekerslogboek en zoek op die IP Controle: (1) Zijn alle bezoeken aan dezelfde pagina? (2Is de gebruiker een bekende bot? (3) Is de sessieduur altijd 0 Als het bevestigd is als een bot, ga dan naar Beveiliging en blokkeer de IP.

Bezoekerslog vs Sessions vs Live-feed

Bezoekerslogboek

Een rij per paginaweergave. Beste voor: het onderzoeken van specifieke pagina's, het vinden van verkeer uit specifieke bronnen, het diagnostiseren tracking problemen.

Sessies

Groepen paginaweergaven in reizen. Eén rij per bezoeksessie. Beste voor: het begrijpen van de gebruikersstroom, het meten van sessieduur, het identificeren van conversiepaden.

Levende diervoeders

Real-time activiteit. Toont bezoekers op dit moment op uw site. Beste voor: monitoring campagnes in uitvoering, het spotten van high-intent bezoekers, kijken naar ondersteuning mogelijkheden.

Waarom zie ik mijn eigen bezoeken in het logboek?+

OpsIQ Volgt alle bezoeken standaard. Om uw eigen verkeer uit te sluiten, voeg IPadres van de uitgeslotenen IPs lijst in Instellingen > Tracking.

Waarom toont een bezoeker "Onbekend" land?+

GeoIP opzoeken vereist ofwel Cloudflare geo-headers (automatisch indien gebruik Cloudflare) of een MaxMind GeoLite2-databasebestand. Controleer Instellingen > GeoIP-pad om te garanderen dat het databasebestand bestaat en leesbaar is.

Hoe lang worden bezoekersgegevens bewaard?+

Bezoekersgegevens worden bewaard voor de bewaarperiode die is ingesteld in Instellingen (standaard: 90 Na dat, oude records worden automatisch opgeruimd door de cron retentie baan.

Analyse

Sessies

Sessions groeperen meerdere pagina's van dezelfde persoon in een enkele reis. Terwijl het bezoekerslogboek individuele paginaladingen toont, tonen sessies je hoe mensen zich verplaatsen via uw website van landing naar exit.

Sessies
SessiesDe Sessie Log tabel met IP, land, apparaat, bron, duur en pagina's kolommen, en een gemarkeerde dreiging rij.Sessiesyoursite.comLand (NG)SessielogIP(S)LANDTOESTELLENBRONDUURPAGINA'S41.62.10.4Verenigd KoninkrijkBureaubladgoogle3m 12s6102.89.6.2NGMobieldirect1m 05s388.21.4.9NLBureaubladutm:advertenties7m 48s11203.0.113.9VSMobielreferral0m 42s21SESSION LOGGegroepeerde reizen2COLUMNSLand · apparaat · bron · duur3THREATRisicovolle sessies gemarkeerd
Het echte Session Log: elke bezoeker reis als een rij (IP, land, apparaat, bron, duur en pagina's) met riskante sessies gemarkeerd in het rood.

Hoe sessies werken

Een sessie begint wanneer een bezoeker zijn eerste pagina laadt. Het gaat door als ze naar meer pagina's navigeren. Een pauze eindigt wanneer de bezoeker inactief is voor de sessie timeout periode (standaard: 30 minuten) of sluit hun browser. Dezelfde persoon die terugkeert na de timeout maakt een nieuwe sessie aan.

Wat elke sessie laat zien

Eerste pagina

De landingspagina, waar de bezoeker uw site heeft ingevoerd. Hier staat welke inhoud mensen aantrekt.

Laatste pagina

De exit pagina, waar de bezoeker links. Als de exit-pagina is vaak de prijslijst pagina, bezoekers kunnen vergelijken u met concurrenten.

Aantal pagina's

Hoeveel pagina's de bezoeker in deze sessie bekeken heeft. Meer pagina' s betekenen meestal meer betrokkenheid, maar het kan ook betekenen dat de bezoekster verloren gaat.

Duur

Totale tijd vanaf eerste pagina laden tot laatste activiteit. Sessions met 0 seconden zijn bounces (enkele pagina weergave, geen verdere interactie).

Bron

De verkeersbron voor deze sessie (Direct, Google, social, referral, etc.).

Land

Gedetecteerd land van het IP -adres van de bezoeker.

Bounce

Of de bezoeker na het bekijken van slechts één pagina is vertrokken. Gebounced sessies hebben een rode indicator.

Omrekening

Of de bezoeker tijdens deze sessie een getraceerde conversie-evenement (aankoop, aanmelding, formulierindiening) heeft voltooid.

Filters

Zoeken

Zoeken op IP, e-mail, bladzijde URL, of referrer binnen de sessies.

Type

Filter op nieuwe bezoekers (eerste sessie ooit) of Returning bezoekers.

Bron

Filter op verkeersbron.

Land

Filter op land om sessies uit een bepaalde regio te zien.

Bedreigingen/Gebogen

Filter om alleen stuiterde sessies of sessie's te tonen die als bedreigingen worden gemarkeerd.

Bewerkte voorbeelden

Profiel een hoogwaardige klant

Scenario:
Een klant heeft net een grote aankoop gedaan. U wilt hun reis begrijpen voordat u koopt.
Wat te doen:

Zoek naar hun e-mail in Sessions. Bekijk al hun sessies: (1Hoe vaak hebben ze bezocht voordat ze kochten? (2Welke pagina's hebben ze bekeken? (3) Hebben ze met chat of een ticket geopend? (4) Wat was de totale tijd vanaf het eerste bezoek aan aankoop? Dit vertelt u de typische koopreis voor hoogwaardige klanten.

Aanmelden detecteren vanaf een nieuwe locatie

Scenario:
Een klant logt meestal in vanuit Nigeria maar je ziet een sessie uit Rusland.
Wat te doen:

Zoek naar de klant e-mail in Sessions. Vergelijk het land van recente sessies. Als een sessie plotseling verschijnt uit een ongewoon land, kan het legitieme reizen of een gecompromitteerd account zijn. Controleer: (1) Was er een mislukte inlogpoging voor de succesvolle? (2De Voorzitter. - Het debat is gesloten. IP wijzigen binnen dezelfde sessie? Markeren voor herziening als verdacht.

Wat is het verschil tussen een sessie en een bezoeker?+

Een bezoeker is een persoon (of browser). Een sessie is één bezoek van die persoon. Dezelfde bezoeker kan veel sessies in de loop der tijd hebben. Sessies verlopen na de timeout periode.

Hoe identificeert OpsIQ terugkerende bezoekers?+

OpsIQ gebruikt een combinatie van cookies, vingerafdrukken van browser en geauthentiseerde identiteitstekens. Als een bezoeker zijn cookie leegmaakt en niet is ingelogd, zullen ze verschijnen als nieuwe bezoeker.

Analyse

Levende diervoeders

De Live Feed toont bezoekers die momenteel in real time op uw website staan. Het update automatisch elke 15 seconden (configureerbaar). Gebruik het tijdens campagnes, productlanceringen en drukke ondersteuningsperioden om te zien wat er nu gebeurt.

Levende diervoeders
Levende diervoedersEen real-time activiteit stream toont een live online bezoeker tellen en een feed van recente bezoekers acties per land.Levende diervoedersyoursite.com37bezoekers nu onlineLevende activiteitnuUS · bekijken /pricing2sUK · een chat gestart5sDE · toegevoegd aan winkelwagen9sCA · voltooid aanmelden1RIGHT NOWKijk wie er ter plaatse is.2AUTO-REFRESHElke 15s3AKTESpring in een live chat
Kijk wie er op je site is en wat ze doen, elke 15 seconden automatisch vernieuwen.

Hoe het werkt

De Live Feed polls van uw server op de ingestelde refresh-interval. Elke rij toont een bezoeker die momenteel op uw site: hun huidige pagina, land, apparaat, bron, sessieduur en pagina's tellen. Groene hoogtepunten geven nieuwe activiteit aan sinds de laatste verversing. Klik op elke bezoekersrij om alle sessiegegevens te zien.

Instellingen

interval vernieuwen

Hoe vaak de live-feed updates. Standaard: 15 seconden. Lagere waarden (5-10s) geven snellere updates maar gebruiken meer server resources. Hogere waarden (30-60s) zijn gemakkelijker op de server, maar minder real-time.

Actieve drempel

Hoe lang een bezoeker wordt beschouwd als "actief" na hun laatste pagina laden. Standaard: 90 seconden. Als een bezoeker laadt een pagina en dan leest voor 2 minuten zonder te klikken, verdwijnen ze uit de live-feed na de drempel.

Pauzeerknop

Klik op pauze om automatisch te stoppen met vernieuwen. Nuttig wanneer u details wilt lezen zonder de lijst bij te werken. Klik opnieuw starten.

Bewerkte voorbeelden

Spot een hot lead tijdens een campagne

Scenario:
U voert een product lancering. Een bezoeker heeft net bekeken uw homepage, dan functies, vervolgens prijzen, en is nu op de kassa pagina.
Wat te doen:

Dit is hoog-intent gedrag. In de Live Feed: (1Klik op de bezoeker om hun sessie te zien. (2) Als ze een gesprek beginnen, zal de AI hun volledige reis context hebben. (3) Als ze vertrekken zonder te kopen, worden ze een hoofdrol in de Leads pagina. (4) Overweeg het maken van een proactieve regel om een chatbericht te tonen wanneer bezoekers de kassa bereiken.

Te veel bezoekers van dezelfde IP

Scenario:
Zie je wel? 20 bezoekers van dezelfde IP adres, allemaal op verschillende pagina's.
Wat te doen:

Dit zou kunnen zijn: (1) Een kantoor met gedeeld internet. Controleer of de bezoeken lijken op echte mensen (verschillende pagina's, redelijke sessieduur). (2) Een bot of schraper. Controleer of de sessies erg kort zijn (0-1seconden) of systematisch pagina's raken. (3) Een belastingstest. Als u automatische tests uitvoert, sluit de IP Van het volgen.

Waarom wordt de live-feed getoond 0 bezoekers wanneer mijn site verkeer heeft?+

Controle: (1) Is het widget-script geïnstalleerd op uw site? (2) Is de site sleutel correct? (3) Is de actieve drempel overschreden? (4) Gebruiken bezoekers agressieve advertentieblokkers die het volgscript blokkeren?

Kan ik de live feed filteren per land of apparaat?+

De live-feed toont alle actieve bezoekers. Voor gefilterde weergaven, gebruik de pagina's Visitor Log of Sessions met hun filteropties. De livece is opzettelijk eenvoudig voor real-time monitoring.

Analyse

Toppagina's

Top Pages toont welke pagina's op uw website het meeste verkeer krijgen. Het rangschikt pagina' s door bezoeken, betrokkenheid, conversies en ondersteuning activiteit. Gebruik deze om uw beste inhoud te identificeren, onderpresterende pagina'S vinden en pagina'n ontdekken die ondersteunende vragen genereren.

Toppagina's
Toppagina'sEen lijst van de meest bezochte pagina's met horizontale bezoekbalken en telt.Toppagina'syoursite.comMeest bezochte pagina's/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKEDMeest bezochte pagina's2SIGNALSBezoeken & conversies3FINDPagina's die tickets besturen
Uw pagina's gerangschikt op verkeer en betrokkenheid, zodat u topinhoud en pagina' s die ondersteuning genereren kunt spotten.

Wat elke pagina laat zien

Pagina URL

Het volledige URL pad. Soortgelijke pagina's (bijv. productvarianten) worden gegroepeerd als groeperen is ingeschakeld.

Weergaven

Totaal aantal keren dat deze pagina werd geladen in het geselecteerde datumbereik.

Unieke bezoekers

Hoeveel verschillende mensen bekeken deze pagina (een persoon die dezelfde pagina twee keer bekijkt telt als 1 uniek).

Stuiterpercentage

Percentage bezoekers die uw site verlieten na het bekijken van alleen deze pagina. Hoge stuiter op landing pagina's = probleem. Hoge bounce op "dank u" pagina' s = normaal.

Gemiddelde tijd

Hoe lang bezoekers gemiddeld op deze pagina doorbrengen. Zeer kort = niet lezen. Zeer lang op een formulierpagina = verwarring.

Chat begint

Hoeveel chatgesprekken zijn er gestart vanaf deze pagina. Hoge chat begint op een productpagina betekent dat de productomschrijving misschien onduidelijk is.

Ondersteuningstickets

Hoeveel support tickets zijn er gemaakt door bezoekers die op deze pagina stonden. Hoog aantal kaarten = potentieel UX of inhoudsprobleem.

Bewerkte voorbeelden

Zoek pagina's die ondersteuningvragen aansturen

Scenario:
Uw support team blijft vragen krijgen over verzending. Welke pagina is falen?
Wat te doen:

Sorteer Top Pagina's door "Support tickets" of "Chat starts" aflopend. Zoek naar product- of verzendpagina's met hoge aantallen. De pagina met de meeste ondersteuning vragen heeft waarschijnlijk onduidelijke informatie. Fix de pagina inhoud en controleer of support vragen verminderen.

Pagina's zoeken met een hoge exitsnelheid

Scenario:
U wilt weten waar mensen uw site het vaakst verlaten.
Wat te doen:

Sorteer op bounce tarief aflopend. Negeer pagina's die natuurlijk exit punten (dank u pagina' s, bevestiging pagina'S). Focus op pagina'es die bezoekers moeten houden betrokken: productpagina's, prijzen, functies. Deze hebben betere call-to-action of duidelijker inhoud nodig.

Waarom toont een pagina 0 weergaven, hoewel ik weet dat het verkeer krijgt?+

Controle: (1) Is het volgwidget geïnstalleerd op die specifieke pagina? Single-page apps kunnen geen schermweergaven branden over routewijzigingen. (2) Is de pagina uitgesloten bij het volgen van instellingen? (3) Is een CDN die een gecachede versie bedient zonder het volgscript?

Analyse

Geo-intelligence

Geo Intelligence toont waar uw bezoekers vandaan komen per land, stad, apparaat en bron. Gebruik het om uw geografische markten te begrijpen, taalondersteuning te bepalen, regionale marketing plannen en verdachte verkeerspatronen op te sporen.

Geo
Geo-intelligenceEen kaart van de bezoekerslocaties naast een per-country bar rangschikking.Geo-intelligenceyoursite.comBezoekers per locatieVSVerenigd KoninkrijkNLNLNG1MARKETSLand, stad, apparaat2PLANTaalgebieden3WATCHVerkeerd verkeer
Waar uw bezoekers komen van (per land, stad en apparaat) om de grootte markten en spot ongewone verkeer.

Wat je ziet.

Toplanden bar grafiek

De toplanden gerangschikt op bezoekersaantal. Klik een land om te boren naar de stad-niveau gegevens.

Country donut

Visuele verdeling van het verkeer naar land.

Tabel voor het gehele land

Elk land met bezoekers in de geselecteerde periode, toont bezoeker tellen, sessie tellen, bounce rate en conversiepercentage.

Stadsoefeningen

Klik op een land om te zien welke steden in dat land het meest bezoekers hebben.

Hoe werkt GeoIP detectie?

OpsIQ Detecteert de locatie van bezoekers op twee manieren: (1) Cloudflare geo headers. Als uw site achter is Cloudflare, landdetectie is automatisch en nauwkeurig. (2) MaxMind GeoLite2-database. Download de gratis database en configureer het pad in Instellingen. Stadsdetectie vereist de GeoLite2-City-databases, niet alleen de Country database.

VPN- en proxyverkeer

Bezoekers die VPN's gebruiken, lijken te komen van de locatie van de VPN-server, niet hun echte locatie. Dit is door ontwerp. OpsIQ kan en moet niet proberen om VPN's te omzeilen. Als u ongewone land patronen, overwegen dat 10-20% van bezoekers kunnen gebruik maken van VPN's.

Bewerkte voorbeelden

Onverwacht landverkeer

Scenario:
Je runt een bedrijf alleen in de VS, maar 30% Het verkeer komt uit India.
Wat te doen:

Controle: (1) Zijn deze echte bezoekers? Kijk naar de duur van de sessie en pagina's bekeken. Zeer korte sessies met hoge bounce = waarschijnlijke bots (2) Vinden ze je via Google? Controleer de referrer. (3) Zouden zij potentiële klanten op een nieuwe markt kunnen zijn? Als het verkeer echt en actief is, overwegen India-specifieke prijzen of inhoud toe te voegen.

Beslissen over taalondersteuning

Scenario:
U wilt weten of u uw site in het Spaans moet vertalen.
Wat te doen:

Kijk op de Geo Intelligence pagina. Als Spaanstalige landen (Spanje, Mexico, Colombia, Argentinië, enz.) samen vertegenwoordigen meer dan 10% van uw verkeer met lage bounce tarieven, vertaling is het overwegen waard. Ook controleren: zetten bezoekers uit deze landen om tegen vergelijkbare tarieven aan uw primaire markt?

Regionale ondersteuning ploegenplanning

Scenario:
U moet de uren van het supportteam bepalen voor verschillende tijdzones.
Wat te doen:

Gebruik de uurlijkse heatmap (op Dashboard) in combinatie met Geo Intelligence. Als 40% Het grootste deel van uw verkeer komt uit Europa en 35% De heatmap toont precies wanneer elke regio het meest actief is, zodat u kunt zien wanneer de dienst beschikbaar is.

Land met bezoeken maar geen orders

Scenario:
Duitsland toont deze maand 500 bezoekers, maar nul verkopen.
Wat te doen:

Onderzoek: (1) Zijn ze stuiteren op de prijspagina? Misschien is uw prijzen niet concurrerend voor die markt. (2) Verzendt u naar Duitsland? Controleer of uw verzendpagina Duitsland vermeldt. (3) Is uw kassa beschikbaar in EUR? Valutaverschil veroorzaakt verlaten kassa's. (4) Zijn deze bezoekers uit één enkele bron die misschien een laag intent verkeer is?

Waarom toont een bezoeker "Onbekend" land?+

GeoIP is niet geconfigureerd.Cloudflare(die automatisch geo headers toevoegt) of deMaxMind GeoLite2database en stel het bestandspad in Instellingen > GeoIP Pad.

Kan ik het verkeer vanuit bepaalde landen blokkeren?+

OpsIQ niet per land blokkeren. Gebruik uw webserver of Cloudflare firewall regels voor landgebonden blokkering.OpsIQ richt zich op zichtbaarheid, geen toegangscontrole op netwerkniveau.

Analyse

Intent trechter

De Intent Funnel classificeert bezoekerssessies door wat ze lijken te proberen: surfen, onderzoeken, vergelijken, kopen, krijgen ondersteuning of vertrekken. Gebruik het om de balans van intentie op uw site te begrijpen en te identificeren waar bezoekers afleveren.

Intent trechter
Intent trechterEen trechter van Browse naar Research om te vergelijken met kopen met counts, plus ondersteuning en het verlaten van chips.Intent trechteryoursite.comBlader · 8,200Onderzoek · 4,100Vergelijk · 1,650Kopen · 520Ondersteuning 6%11%_ verlaten1CLASSIFYWat bezoekers willen2STAGESBladeren om te kopen3FIXZoek de afleverlocatie
Sessions geclassificeerd op intentie (browse, research, compare, buy) zodat je precies kunt zien waar mensen afleveren.

Intent categorieën

Bladeren

Bezoekers die terloops rondkijken. Korte sessies, paar pagina's, geen specifiek doel gedetecteerd.

Onderzoek

Bezoekers lezen product/materiaal pagina's, docs of blog inhoud. Langere tijd op de pagina, meerdere content pagina' s.

Vergelijken

Bezoekers bekijken prijzen, plan vergelijking of functie tabellen. Vaak terugkerende bezoekers.

Kopen

Bezoekers bij de kassa, winkelwagen of aanmelding pagina's. Hoge intentie. Dit zijn uw conversie mogelijkheden.

Ondersteuning zoeken

Bezoekers op helppagina's, contact pagina's of het starten van chat. Ze hebben hulp nodig.

Stuiteren

Bezoekers die vertrokken na een pagina. Lage betrokkenheid.

Hoe de trechter te lezen

Tolken van je trechter

Scenario:
1,000 bezoekers bekeken Prijzen. 270 Open het gesprek. 92 begon met de kassa. 64 betaald. 18 Open support tickets.
Wat te doen:

Prijzen pagina is sterk genoeg om intentie te creëren. Chat is belangrijk in het kooptraject: 27% van prijzen bezoekers aangaan met chat voordat u koopt. Ondersteuning tickets na de kassa kan wijzen op activering of betaling verwarring. Actie: (1) Zorg ervoor dat AI chat beantwoordt prijsvragen goed. (2) Onderzoek 18 post-checkout support tickets voor veel voorkomende problemen.

Tijdfilters

Gebruik het datumbereik filter om intent patronen te vergelijken over perioden. Bijvoorbeeld, vergelijk Black Friday week met een normale week. Je moet zien dat er een piek is in "Koop" intentie en mogelijk "Support-zoeken" als je promoties verwarring veroorzaakten.

Hoe classificeert OpsIQ intentie?+

OpsIQ kijkt op pagina URLs, session gedrag en tijdpatronen. Prijzen pagina's signaal vergelijking intentie. Afrekenen pagina ' s geven het kopen van intent. Help / contact pagina 's signaal ondersteuning bedoeling. De classificatie is heuristisch-gebaseerd, niet AI-gedreven.

Kan ik de intent categorieën aanpassen?+

Momenteel niet. De categorieën zijn ingebouwd op basis van gemeenschappelijke webgedragspatronen. Custom intent classificatie staat op de routekaart.

Analyse

Graandieren, retentie en paden

Bouw aangepaste reizen vanaf pagina of evenement stappen, meten cohort retentie en ontdek de paden bezoekers het meest via een site.

Productscherm
TrechtersEen aangepaste trechter toont elke pagina/event stap, de resterende bezoekers en het conversiepercentage.TrechterswerkbladSTEPS4CONVERSION28.4%WINDOW72hLEVENDE WERKSPACE-ZICHTPrijslijst1,420 bezoekers100%Plan geselecteerd780 bezoekers54.9%Afrekenen gestart530 bezoekers37.3%Bevel voltooid403 bezoekers28.4%1DEFINEKies 2–8 stappen2MAATREGELConversievenster instellen3VERBETERINGZoek de grootste druppel
Een aangepaste trechter toont elke pagina/event stap, de resterende bezoekers en het conversiepercentage.

Trechters

Maak een genoemde trechter met 2 tot 8 pagina of gebeurtenis stappen. Stel het conversie venster in uren; een bezoeker telt alleen wanneer de bestelde stappen plaatsvinden binnen dat venster. Gebruik de druppel tussen stappen om te kiezen waar u replay, fouten, pagina snelheid of berichten inspecteren.

Bewaring

Bewaring groepen bezoekers in wekelijkse cohorten en laat zien hoeveel terugkeer. Kies een 6, 8 of 12 weekhorizon. Houd de cohortdefinitie stabiel bij het vergelijken van releases of campagnes.

Paden

Paden geven de meest voorkomende paginasequenties. Kies een padlengte van 2 tot 5 pagina's om het resultaat leesbaar te houden. Gebruik het om onverwachte omwegen, gemeenschappelijke uitgangen en inhoud te vinden die herhaaldelijk voorafgaat aan conversie.

Custom trechters zijn analytische definities, geen automatiseringen. Om te reageren op een voltooide stap, maak je een conversiedoel, segment, trigger of workflow.

Analyse

Sessie-herhaling

Sessie Replay laat je een tijdlijn zien van wat een bezoeker op je site deed: welke elementen ze klikten, hoe ze scrolden, waar ze zweefden en wat ze typte (met gevoelige velden gemaskeerd). Gebruik het om UX problemen te diagnostiseren, foutmeldingen te verifiëren en verwarring bij de klant te begrijpen.

Sessie-herhaling
Sessie-herhalingEen replay-speler met een paginaweergaveport met een cursor, een sessie infopaneel en een tijdlijn scrubber.Sessie-herhalingyoursite.comKoop nuZITTINGDuur 3m 12s14 klikkenUS · BureaubladChrome 1241WATCHKliks, scroll, type2MASKEDGevoelige velden verborgen3DIAGNOSEControleer bugrapporten
Herspeel precies wat een bezoeker deed: klikken, scrollen, typen (gevoelige velden gemaskerd), op een tijdlijn scrubber.

De juiste sessie vinden

Vanaf de Sessions pagina, kijk voor sessies met gerapporteerde problemen, hoge pagina telt zonder conversie, of sessie van klanten die ondersteuning tickets ingediend. Klik op het replay pictogram om de tijdlijnweergave te openen.

Wat replay toont

Tijdslijn

Een horizontale balk die gebeurtenissen in de loop van de tijd toont. Klik overal op de tijdlijn om naar dat moment te springen.

Paginanavigatie

Elke pagina wordt weergegeven als een segment op de tijdlijn. U kunt het exacte pad zien dat de bezoeker nam.

Klikt

Klik op gebeurtenissen worden weergegeven als punten op de tijdlijn en als hoogtepunten op de pagina reconstructie.

Schuiven

Scrolldiepte wordt gevolgd zodat je kunt zien hoe ver beneden de bezoeker leest.

Vorminteractie

Veldfocus en typegebeurtenissen worden geregistreerd. Tekstinvoer in wachtwoord en gevoelige velden wordt standaard gemaskeerd.

Privacy en maskeren

Sessie replay maskert standaard gevoelige formuliervelden. Wachtwoordvelden, creditcardinvoeren en velden gemarkeerd met data-opsiq-mask worden nooit opgenomen. U kunt extra masking regels instellen in Instellingen > Tracking. Als uw nalevingsbeleid het vereist, kunt u de herhaling volledig uitschakelen.

Diagnose van een kapotte checkout

Scenario:
Een klant zegt: "Ik probeerde te kopen maar de knop deed niets."
Wat te doen:

Zoek hun sessie in de Sessions pagina (zoek via e-mail). Open het replay. Bekijk het afrekenpagina segment. Kijk naar: (1Klikten ze op de juiste knop?2Deed een JavaScript fout opgetreden? (Controleer de JS Errors pagina voor die tijd.) (3) Heeft de pagina een foutmelding herladen of getoond (?4) Was een verplicht veld leeg? De herhaling toont precies wat er gebeurd is.

Hoeveel opslagruimte gebruikt sessie-replay?+

Herspeelgegevens groeien met het verkeersvolume. Gebruik retentieinstellingen om oude replay-data automatisch op te ruimen. Voor high-traffic sites, overwegen een kortere replays bewaarperiode (bijv. 30 dagen) voor het beheren van opslag.

Kunnen bezoekers zich afmelden voor replay?+

Als "Respect Do Not Track" is ingeschakeld in Instellingen, worden bezoekers met DNT-headers niet opgenomen. U kunt ook specifieke pagina's uitsluiten van herhalingen in de trackinginstellingen.

Analyse

Gebeurtenissenlog

Het Evenementenlogboek toont elke gebeurtenis die OpsIQ heeft opgenomen: paginaweergaven, klikken, chatstarts, ticketcreaties, verkoop en aangepaste evenementen. Gebruik het om integraties te debuggen, webhook-levering te verifiëren en de volgorde van acties te begrijpen.

Gebeurtenissenlog
GebeurtenissenlogEen chronologisch event log met kleur gecodeerde type badges: pageview, chat, sale, webhook en op maat.Gebeurtenissenlogyoursite.compageviewUS · /pricing12:04:01chat.startUK · widget geopend12:04:09verkoop$49.00 · bestelling #104212:05:22webhookpayment.succeeded12:05:23customdemo_booked12:06:101EVERYTHINGElke geregistreerde gebeurtenis2DEBUGVerifiëren van webhook levering3ORDERZie de exacte volgorde
Een tijdlijn van alles OpsIQ records (pagina's, chats, sales, webhooks, aangepaste evenementen) voor debuggen en audit.

Ingebouwde gebeurtenissen (automatisch)

⚠️
Dit zijn events-log namen . what OpsIQ records op de bezoeker tijdlijn voor analytics, debugging en audit. Ze zijn een andere woordenschat dan het uitgaande webhook events waar je een eindpunt op inschrijft. Als je een webhook ontvanger aan het bouwen bent, gebruik dan de lijst in de Webhaaks sectie of bel webhooks.events.list; het abonneren op een naam uit deze tabel levert niets af.

Elke rij toont de naam die u verzenden en de canonieke naam OpsIQ opslag Beide zijn opgenomen: de rauwe naam die je stuurde, en de canonieke waar het naartoe in kaart brengt, dus een rapport geschreven tegen de canonische taxonomie blijft werken welke alias ook gebruikt wordt.

pageview page.viewed

Een tracked pagina laadt. Bevat URL, titel, referrer en tijdstempel. page_view en view worden geaccepteerd als hetzelfde.

chat_open support.chat_opened

Een bezoeker opent de chat widget.

chat_send support.chat_message_sent

Een bezoeker stuurt een chatbericht. De antwoordzijde wordt opgeslagen als support.chat_message_received.

ticket_open support.ticket_created

Er wordt een support ticket aangemaakt. ticket_create wordt aanvaard als hetzelfde; antwoorden en sluitingen worden opgeslagen als support.ticket_replied en support.ticket_closed.

form_submit form.submitted

Een getraceerd formulier wordt ingediend. submit wordt als hetzelfde geaccepteerd.

purchase commerce.purchase_completed

Een aankoop is compleet. purchase_success, en de verkoop aliassen order.completed, sale.completed, payment.completed en invoice.paid, worden allemaal geaccepteerd vanaf een aangesloten platform.

kassa commerce.checkout_started

Afrekenen begint. cart_view, checkout_view, checkout_intent, checkout_abandon, add_to_cart.

login_success identity.signed_in

Een bezoeker meldt zich. login_failed, opgeslagen als identity.login_failed; een afsluiting is login_lockout_created.

aanmelden conversion.signup

Een bezoeker maakt een aanmelding af. lead, opgeslagen als conversion.lead.

js_error error.js

Een JavaScript -fout wordt vastgelegd op een tracked pagina.

💡
Een gebeurtenis naam die u verzendt dat niet een van deze aliassen is nog steeds geregistreerd v ent . Er wordt niets gedropt. Het heeft gewoon geen canonieke mapping, dus het zal niet oprollen in de taxonomie-gebaseerde rapporten.

Aangepaste gebeurtenissen

U kunt aangepaste gebeurtenissen van uw website of server naar OpsIQ sturen. Aangepaste evenementen zijn nuttig voor het volgen van acties die specifiek zijn voor uw bedrijf: klikken op de knop, gebruik van functies, video's, downloads enz.

JavaScript · aangepaste gebeurtenis van 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 · neemt een contact activiteit op van uw server
// 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);

Filteren van gebeurtenissen

Gebeurtenistype

Filteren op specifieke namen van evenementen: pageview, chat. started, ticket. created, etc.

Datumbereik

Evenementen uit een bepaalde periode tonen.

Zoeken

Zoek gebeurtenissengegevens op trefwoord (URL, e-mail, gebeurtenis eigenschappen).

Hoe lang worden de gebeurtenissen gehouden?+

Gebeurtenissen volgen het bewaarbeleid dat is ingesteld in Instellingen. Standaard: 90 dagen. Hoge waarde gebeurtenissen (aankopen, beveiligingsgebeurtenissen) kunnen worden geconfigureerd met langere bewaring.

Kan ik events gebruiken in A/B experimenten?+

Ja. Bij het maken van een experiment kiest u voor een conversie-evenement. Elke ingebouwde of aangepaste gebeurtenis kan worden gebruikt als conversiedoel.

Analyse

A/B experimenten

Experimenten laten je twee versies van een pagina of functie testen en meten welke beter presteert. OpsIQ spoort indrukken, conversies en statistische betekenis.

A/B experimenten
A/B experimentenTwee variant kaarten vergelijken conversie tarieven, met een winnaar badge en betekenis op de toonaangevende variant.A/B experimentenyoursite.comOptie A4.2%conversie · 1,020 weergavenOptie BWINNAAR6.8%conversie · 1,005 weergaven+62% Een lift · 96% significant1TESTTwee varianten van kop tot hoofd2MAATREGELOmzettingen & betekenis3BESLUITEen winnaar aanwijzen
Voer twee varianten uit, bekijk conversies en statistische betekenis, en verklaar de winnaar.

Hoe experimenten werken

1
Een experiment maken

Geef het een naam, definieer je primaire metriek (conversie gebeurtenis), en stel de varianten in (controle en test).

2
Doe het.

OpsIQ willekeurig wijst bezoekers aan varianten en volgt hun gedrag. Verander het experiment niet terwijl het draait.

3
Lees de resultaten

Nadat er voldoende gegevens zijn verzameld, controleer het betrouwbaarheidsniveau.95% vertrouwen betekent dat je 95% Het verschil is echt, niet toevallig.

Experimentele toestanden

Ontwerp

Aangemaakt maar nog niet gestart. U kunt nog steeds varianten en metrics bewerken.

Uitvoeren

Actieve bezoekers toewijzen aan varianten. Bewerken tijdens het draaien niet.

Voltooid

De statistische betekenis bereikt of handmatig gestopt.

Gearchiveerd

De resultaten zijn geëvalueerd en het experiment is niet langer nodig in de actieve lijst.

Beste praktijken

Definieer uw metriek voordat u start

Beslis wat je meet voordat je begint. Kies een metriek na het zien van resultaten introduceert bias.

Binnenlands verkeer uitsluiten

Voeg de IP _-adressen van uw team toe aan de uitsluitingslijst zodat personeelsbezoeken geen foutieve resultaten opleveren.

Ren lang genoeg

Stop niet met een experiment na 100 bezoekers. U hebt honderden of duizenden bezoekers per variant nodig voor betrouwbare resultaten.

Test één verandering tegelijk

Als u de kop EN de kleur van de knop, zult u niet weten welke verandering veroorzaakt de verbetering.

Neem je beslissing op.

Na het experiment eindigt, let op welke variant won en waarom je ervoor koos om het te implementeren.

Hoeveel bezoekers heb ik nodig voor een geldig experiment?+

Het hangt af van de convertorsnelheid en de effectgrootte die u wilt detecteren. Als vuistregel: ten minste 500 bezoekers per variant voor een 20% Voor kleinere effecten heb je duizenden nodig.

Kan ik meerdere experimenten tegelijk uitvoeren?+

Als twee experimenten dezelfde pagina beïnvloeden, kunnen de resultaten van deze experimenten interageren. Het is veiliger om gelijktijdig experimenten uit te voeren op verschillende pagina's of functies.

Analyse

JavaScript fouten

JavaScript Fouten verzamelen client-side fouten van uw website bezoekers. Een kapotte knop, een mislukt API call, of een ontbrekende bron verschijnt hier. Gebruik het om bugs te vinden en repareren die invloed hebben op echte klanten.

JS-fouten
JavaScript foutenEen lijst van vastgelegde front-end fouten met ernst punten, bronbestand, browser en voorkomen telt.JavaScript foutenyoursite.comRecente foutenTypefout: kan x van ongedefinieerde waarde niet lezencheckout. js:42 · Chrome×214404 laden /assets/app.cssAlgemene index · Safari×88Netwerk niet gevangen (in belofte)api js:17 · Firefox×51Waarschuwing voor deprecatie: ontladen gebeurtenissvendor. js · Rand×331CAPTUREClient-side fouten2IMPACTTellen & browsers3FIXPluk echte bugs
Echte bezoekers raken gebroken code oppervlak hier (bericht, bron, browser en hoe vaak) zodat je kunt oplossen wat belangrijk is.

Wat elke fout laat zien

Foutmelding

De JavaScript fouttekst (bv. "Typefout: kan eigenschappen van ongedefinieerde niet lezen").

Pagina URL

Welke pagina de fout deed zich voor op.

Browser en apparaat

Welke browser en apparaat type zag de fout. Sommige fouten zijn browse-specifiek.

Stacktrace

De codelocatie waar de fout zich heeft voorgedaan. Klik om het volledige stackspoor uit te breiden.

Voor het eerst gezien

Toen deze fout voor het eerst verscheen.

Laatst gezien

Toen deze fout het laatst voorkwam.

Aantal

Hoe vaak deze fout is geregistreerd.

Betrokken sessies

Hoeveel verschillende bezoekersessies ervoeren deze fout.

Fouten prioriteren

Niet alles JavaScript fouten onmiddellijk aandacht nodig hebben. Prioriteren door: (1) fouten op kritieke pagina's (afrekenen, aanmelden, inloggen), (2) fouten met hoge sessie telt, (3) fouten die onlangs zijn opgetreden (mogelijke regressie van een codewijziging), (4) fouten op uw eigen code (geen scripts van derden).

Een kapotte checkout-knop maken

Scenario:
De pagina JS Fouten toont "TypeFout: Kan eigenschappen van ongedefinieerde (lezen submit) niet lezen" op /checkout, van invloed 45 sessies deze week.
Wat te doen:

Dit betekent 45 echte klanten kon niet voltooien kassa. Stappen: (1) Open de pagina in dezelfde browser/apparaatcombinatie. (2) Open browserconsole en reproduceer de fout. (3) Controleer de stack trace om de exacte regel van code te vinden. (4) Repareer de bug, zet uit en volg het foutaantal op naar nul.

Neemt OpsIQ fouten op van scripts van derden?+

Ja. OpsIQ vangt alle JavaScript fouten op de pagina, inclusief fouten van analytics scripts, chat-widgets en advertentiescripts. Filter op URL in de stack trace om te focussen op uw eigen code.

Hoe kan ik bekende onschuldige fouten uitsluiten?+

U kunt geen specifieke fouten in OpsIQ, maar je kunt de lijst filteren op pagina URL of foutmelding. Fix of negeren fouten uit browser-extensies (ze vaak weergegeven als fouten van onbekende bronnen).

Verkoop

Verkoop en omrekening

Sales Tracking verbindt uw winkel of facturatieplatform met OpsIQ zodat u inkomsten naast bezoekgedrag kunt zien. Elke aankoop wordt toegeschreven aan een reis van bezoekers, zodat u weet welke pagina's, campagnes en kanalen de omzet drijven.

Verkoop
VerkoopHet verkoopscherm: een omzettotaal met een All-time controle, een zoekopdracht en een tabel van recente aankopen (datum, klant, platform, bedrag, bron).Verkoopyoursite.comONTVANGSTEN$42,180+18%Altijd ▾E-mail zoeken, IP, Order ID...Recente aankopenDATUMKLEURPLATFORMBEDRAGBRONJun 3_[email protected]_Shopify_$49googleJun 3_[email protected]WooCommerce$129directJun 2_[email protected]Stripe$480advertenties1ONTVANGSTENBevelen & vernieuwing2RECENT PURCHASESDatum · klant · bedrag3ATTRIBUTEDNaar de verkeersbron
Het echte verkoopscherm, omzet boven, dan recente aankopen (datum, klant, platform, bedrag), elk toegeschreven aan zijn verkeersbron.

Verkoop dashboard

Verkoop van vandaag

Inkomsten uit bestellingen die vandaag zijn voltooid. Vernieuwt bij elke nieuwe bestelling evenement van uw aangesloten platform.

Deze week / deze maand / totaal

De ontvangsten over de periode worden in mindering gebracht op deze bedragen.

Trend grafiek 2

Lijn grafiek met dagelijkse inkomsten over de geselecteerde datum bereik. Zoek naar pieken (promoties, campagnes) en dips (issues, seizoensgebonden).

Top converteren bronnen

Welke verkeersbronnen leiden tot de meeste aankopen. "Directe" kopers vaak bladwijzers uw site. "Google" kopers vond u door zoekopdracht.

Recente aankopen

De nieuwste bestellingen met e-mail, bedrag, valuta en items gekocht.

Onbevestigde aankopen (reis van de klant)

Wanneer de tracker een bezoeker ziet bereiken een aankoopbevestiging in de browser, maar geen aangesloten platform heeft gemeld dat verkoop nog niet, de klant reis toont een Aankoop (onbevestigde) rij met een amber badge. Het telt nooit als inkomsten. Als het platform bevestigt de verkoop, de bevestigde aankoop vervangt het.

Verzoening

Sales connectors zijn niet afhankelijk van één enkele webhook. Elk betaalsignaal dat het platform verzendt kan de verkoop openen, en Connector Contract 2.3 herleest de eigen lijst van het platform met voltooide verkopen op een schema (standaard uur-per-werkruimte) zodat een webhook die nooit geleverd is, geen verkoop kan verliezen. Exploitanten kunnen deze uitvoeren vanaf de commandoregel met tools/sales_reconcile.php.

Platform-opstellingshandleidingen

Shopify_

Ga naar Connectoren >Shopify. Maak een aangepaste app in uw Shopify admin (Instellingen > Apps en verkoopkanalen > Ontwikkelen van apps). Scopen toekennen: lees_orders, read_customers, Read_products. Kopieer de Admin API Toegangspenning. OpsIQ, voer uw winkel domein (bijv., your-store.myshopify.com) en het access token. Klik op Test Connection. Indien succesvol, schakel webhook-synchronisatie in voor real-time ordermeldingen.

WooCommerce

Ga naar Connectoren >WooCommerce. In uw WordPress admin, ga naar WooCommerce> Instellingen > Geavanceerd > REST API. Maak een sleutel aan met Lees/Schrijf toestemming. Kopieer de consumentensleutel en het consumentengeheim. OpsIQ, voer uw site URL, consumentensleutel en consumentengeheim. Klik Test Connection.

BigCommerce

Ga naar Connectors > BigCommerce. Ga in uw Big Commerce admin naar Geavanceerde Instellingen >API Accounts. Maak een V2/V3 aan API Account met gelezen toepassingsgebied voor bestellingen, klanten en producten. Kopieer de toegangs token, client ID, en API pad. Voer ze in OpsIQ en test.

Magento 2

Ga naar Connectors > Magento. Ga in uw Magentor admin naar Systeem > Integraties. Maak een nieuwe integratie met API toegang tot bronnen van Sales, Klanten en Catalogus. Activeer de integratie en kopieer het toegangs token. Voer dit in OpsIQ met uw Magento basis URL.

PrestaShop

Ga naar Connectors > PrestaShop. Ga in uw Prestashop admin naar Advanced Parameters > Webservice. Schakel de webservice in en maak een nieuwe sleutel aan. Geef toegang tot bestellingen, klanten en producten. Kopieer de sleutel en voer deze in OpsIQ bij uw winkel URL.

OpenCart

Ga naar Connectoren > OpenCart. Genereren API referenties van uw OpenCart admin-paneel. Voer de API URL, gebruikersnaam en sleutel in OpsIQ. De connector gebruikt OpenCart's REST API voor order- en klantgegevens.

osCommerce

Ga naar Connectors > osCommerce. Configureer database toegang of API referenties zoals gedocumenteerd in de connectorinstellingen. osCommerce integratie vereist meestal directe database toegang of een aangepaste API module.

Stripe

Ga naar Connectors > Stripe. Kopieer je Stripe s niet beperkt API sleutel van het Stripe Dashboard (Developers >API De sleutel heeft leestoegang nodig voor klanten, kosten, facturen en abonnementen. OpsIQ. Configureer webhook eindpunt voor real-time gebeurtenissen.

Aangepaste / andere platforms

Gebruik de REST API of webhooks om sales events te versturen vanaf elk platform. Verzend order. completed events met klant e-mail, bedrag, valuta en items. Zie het gedeelte Evenementen API_ voor het laadvermogen formaat.

Begrijpen van uw verkooptrechter

Top converteren bronnen

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.

Bedrag van de restitutie

Gerefinancierde bestellingen worden apart bijgehouden. Ze verminderen uw netto-inkomsten totaal. Als de restitutietarieven zijn hoog van een specifieke bron, het verkeer kan laag kwaliteit.

Valutaafhandeling

OpsIQ slaat de oorspronkelijke transactie valuta en bedrag. Multi-currency bedrijven zien inkomsten in elke valuta. Genormaliseerde rapportage maakt gebruik van de geconfigureerde wisselkoers.

Bewerkte voorbeelden

100 bezoekers, nul verkoop

Scenario:
Uw prijslijst krijgt 100 bezoekers per dag, maar nul conversies.
Wat te doen:

Onderzoek: (1) Gebruik Sessie Replay op de prijsstelling pagina bezoekers. Bekijk hoe ze omgaan met de prijstabel. (2) Check Top Pagina's voor de prijsstelling pagina bounce rate en time-on-page. (3) Check Chat conversaties van prijsvragen pagina bezoekers. Welke vragen stellen ze? (4) Vergelijk uw prijspagina met concurrenten. (5) Probeer een A/B experiment met verschillende prijsindelingen.

Naamgeving voor een marketingcampagne

Scenario:
U hebt een e-mailcampagne met UTM tags gestuurd. Hoe meet u de impact van uw inkomsten?
Wat te doen:

Ga naar Sales en filter per bron. Zoek naar de campagne UTM parameter. Zie: (1) Hoeveel bezoekers kwamen uit de e-mail. (2) Hoeveel zijn er omgezet in verkoop? (3) Totale aan de campagne toegerekende inkomsten (4) Vergelijk met dezelfde periode vóór de campagne.

Waarom laat Sales nul zien, ook al heeft mijn winkel orders?+

Controle: (1) Is de platformconnector aangesloten en gezond? Ga naar Connectors en controleer de status. (2) Is webhook sync ingeschakeld? Als u peilingen gebruikt, is de cron job actief? (3) Heeft de stekker het recht API Scopes? Shopify, je hebt lees_orders nodig.

Hoe attribuut OpsIQ een verkoop aan een bezoeker?+

Wanneer een bestelling via de connector binnenkomt, komt OpsIQ overeen met de klant e-mail aan een bekende bezoeker. Als de bezoeker werd gevolgd voordat de aankoop, wordt de verkoop toegeschreven aan hun bezoekers reis, inclusief de verkeersbron, landing pagina en sessie geschiedenis.

Kan ik handmatig verkopen toevoegen?+

U kunt verkoopgebeurtenissen verzenden via de REST API of webhooks van elk systeem. Het evenementformaat is gedocumenteerd in het gedeelte Evenementen API_.

Handel

Bouw, start en gebruik de native Storefront

De Storefront is OpsIQ_... de oorspronkelijke winkel voor producten, pagina's, lookbooks, promotionele panelen, kassa, klantenaccounts en AI-ondersteunde verkopen in Client Chat en ondersteunde sociale kanalen.

Beginnen in marketing → Storefront

1
Werkblad kiezen

Bevestig de site die u aan het configureren bent. Producten, instellingen, pagina's, bestellingen en analyses zijn geïsoleerd in dat werkblad.

2
E-commerce en Storefront inschakelen

Algemene instellingen → Ecommerce is de moederautoriteit. Storefront publiceren, orde maken en betalingen blijven gescheiden zodat u een catalogus veilig kunt bekijken.

3
Volledige producten publiceren

Stel producttype, prijs, valuta, inventaris, varianten/opties, media en vervulling. Bekijk het product en kassa keuzes voordat u publiceert.

4
Betaling en nakoming configureren

Sluit een gateway aan of voeg bankoverschrijving, contant geld of tegenbetaling toe. Fysieke goederen hebben leveringszones of -verzameling nodig; digitale goederen moeten beveiligd zijn met bestanden of codes.

5
Start gereedheid

Repareer elke blokker en bekijk iedere waarschuwing, vul dan een sandbox bestelling uit de openbare winkel.

Starter Over en beleidsinhoud

Nieuwe en opgewaardeerde winkels ontvangen bewerkbare starter tekst voor Over ons, Algemene voorwaarden, Privacy, en Bedrag van de restitutie en terugzending Als die velden leeg zijn, wordt een bestaand exemplaar nooit overschreven.

  • Vervang elke [Add …] prompt en de STARTERPARTNERS bericht voor lancering.
  • Gebruik de echte wettelijke naam, contactroute, beloftes voor nakoming, terugkeerregels, gegevenspraktijken, bewaartermijnen en markten die worden gebruikt.
  • Advies verkrijgen dat past bij de producten en landen die u bedient. De starter is operationele begeleiding, niet juridisch advies.

Ontwerp, pagina's en promoties

Thema en paginaontwerp

Kies een samengesteld kleurthema en samenstelling, dan typografie instellen, vult/gradients, vormen, breedte, beweging, zweefbeweging en licht/donker gedrag. Preview desktop en telefoon voordat u opslaat.

Over, Contact, Showcase/Lookbook en Account

Bouw elke pagina van herordenbare blokken. Elk blok heeft premium ontwerp varianten. Houd claim-making blokken zoals statistieken, team, awards of citaten uit totdat hun inhoud waar is.

Aangepaste pagina's

Titel, nagels, helden, SEO en bestelde blokken; preview tijdens concept, vervolgens publiceren. Gereserveerde store routes zoals kar, kassa, rekening en beleid kunnen niet worden hergebruikt.

Promotionele popups en zijpanelen

Maak een modale pagina met ten minste één blok. Kies premium ontwerp, centrum/links/rechts/onderaan plaatsing, laden/vertraging/uittrekken/klik op trigger, achtergrond, beweging, breedte, coupon en eenmaal-per-bezoeker gedrag. Test sluiten, toetsenbord en telefoonopmaak.

Menu's en voetteksten

Link naar pagina's, producten, collecties, beleidsmaatregelen, account/help/cart acties, live modi of veilige externe URLs. Header items ondersteunen één dropdown / mega-menu niveau.

Client Chat en sociale bestellingen

Activeer Client Chat verkopen, kies dan waar klanten kunnen kopen. De assistent zoekt de catalogus en vraagt de server om een gezaghebbende offerte; de serveer niet het model creëert de ondertekende orderkaart. Bevestiging gebeurt alleen via die kaart op het web of de geverifieerde interactie op het sociale kanaal.

WhatsAppBoodschapper,Instagram, Telegram, LINE, SMS en X gebruik maken van de provider-geverifieerde kanaalaccount als het kanaal identiteit. E-mail wordt nog steeds verzameld voor ontvangstbewijzen. Connector bestellen houdt zijn ondertekende universele contract en merchant-authoritatief totaal; Storefront configuratie verandert niet dat contract.

Analyse van de opslaginformatie

Bekijk unieke bezoekers, productviews, cart toevoegingen, checkout starts/afleveringen/aanvullingen, conversie, bevestigde bestellingen, inkomsten per valuta, aankoop, apparaten, landen/steden, topproducten, herstel en data-kwaliteit waarschuwingen. Conversie maakt gebruik van expliciet getagged public-Store evenementen; valuta totalen worden nooit stilletjes gecombineerd. Een streepje betekent dat de geselecteerde bereik kan niet beantwoorden aan de conversie vraag ? niet nul procent.

Algemeen OpsIQ API

Gebruik een sleutel aan de drager met commerce.read; analytics.read De sleutel is een gezaghebbende werkruimte.

Getypte storefront leest
{ "action": "commerce.storefront.get" }
{ "action": "commerce.storefront.catalog.get" }
{ "action": "commerce.pages.list", "kind": "modal", "status": "live" }
{ "action": "commerce.analytics.snapshot", "range_days": 30 }
{ "action": "commerce.readiness.get" }
{ "action": "commerce.products.list", "filters": { "active": true } }

Storefront krijgt publieke-veilige configuratie, URL, menu's en starter-review staat. Store front catalogus geeft elk thema, pagina ontwerp, blok type, bloksamenstelling en premium promotie shell zodat remote bouwers nooit hard coderen de keuzes. Pagina's lijst geeft aangepaste pagina's terug en premiemodales. Analytics geeft aggregaten zonder identiteit van klanten. Readyness geeft actieerbare lancering controles terug. OpenAPI en Postman gebruiken dezelfde contracten.

Eindvoor-lancering drive-through

  1. Desktop en telefoon: thuis, zoeken, product/variant, winkelwagen, kassavalidatie, account, tracking, downloads, Over, Contact, beleid, lookbook, pagina's, menu's en elke live promotie.
  2. Vul één sandbox betaling en controleer de status van bestelling, ontvangst, voorraad en vervulling.
  3. Plaats één Client Chat-order en een provider-sandbox bestelling op elk ingeschakeld sociaal kanaal.
  4. Bevestig dat deze gebeurtenissen verschijnen onder het juiste oppervlak en valuta in Store Intelligence.
⚠️
Starter beleid tekst maakt een winkel niet leeg, maar het maakt de juridische kopie niet herzien. Lancering Readyss houdt waarschuwing totdat elke prompt wordt vervangen.
Verkoop

Lood

Leads zijn bezoekers of klanten die koop- of ondersteuningsintentie tonen. OpsIQ detecteert automatisch leads op basis van gedrag: prijsvragen paginabezoeken, terugzendingen, chat interacties, kassa start en hoge betrokkenheid. Gebruik de Leads pagina om de follow-up te prioriteren en voer uw CRM pijplijn.

Lood
LoodHet Leads scherm: een doorzoekbare tabel met IP/email, locatie, apparaat, bron en tijd-on-site kolommen, en topbron en land.Loodyoursite.comZoeken IP, stad, land...Top bron: Google · Top land: VSIP / E-mailPLAATSTOESTELLENBRONTIJD41.62.10.4UK · LondenMobielgoogle4m 12s[email protected]_VS · New YorkBureaubladdirect7m 02s[email protected]DE - BerlijnMobielutm:advertenties5m 40s203.0.113.9CA · TorontoBureaubladgoogle3m 28s1DETECTEDBezoekers met een hoge intensiteit2TOPLoodbronnen & landen3ENRICHEDIP, locatie, apparaat, tijd
Het echte Leads scherm, high-intent bezoekers als een doorzoekbare tabel (IP/email, locatie, apparaat, bron, tijd ter plaatse) met topbronnen en landen.

Wat maakt een aanwijzing

Prijsvragen

Bezoekers die uw prijs- of plannenpagina bekijken overwegen actief een aankoop.

Terugkeerbezoeken

Bezoekers die meerdere keren terugkomen zijn bezig maar nog niet bekeerd.

Chatinteracties

Bezoekers die een chat starten zoeken actief hulp, hetzij voor aankoop of na aankoop.

Afrekenen begint

Bezoekers die de kassapagina bereiken maar niet de aankoop voltooien.

Formulieren

Bezoekers die een contactformulier, demo verzoek of aanmeldingsformulier indienen.

Verloving op de hoge pagina

Bezoekers die veel pagina's met lange sessieduur bekijken zijn diep onderzoekend.

Voornaamste detailpaneel

Klik op een aanwijzing om hun volledige profiel te zien:

Identiteit

Naam, e-mail, bedrijf indien bekend. Anonieme leads tonen IP en locatie.

Sessies

Alle sessies van deze lead met paginaflow, duur en bron.

Bekeken pagina's

Elke pagina die ze bezochten, besteld door de recentie.

Bron

Hoe ze je vonden: organisch, betaald, sociaal, verwijzing, direct.

Loodscore

A0-100 score op basis van gedrag intensiteit, recency en pagina intentie.

CRM-status

Of dit spoor is toegevoegd aan de CRM als contact of transactie.

Verkooptip

AI-gegenereerde suggestie over wat te doen volgende (bijv., "Bezochte prijs 3 tijden · overwegen proactieve reikwijdte").

Hoogwaardige loodinsigne

Leads met een score boven 80 krijgen een "High Value" badge. Dit zijn uw heetste vooruitzichten. Prioriteer ze voor het bereiken, proactieve chat of CRM-pijpleidinginvoer.

Bewerkte voorbeelden

Een heet lood gebruiken

Scenario:
Een lead bekeken uw prijs pagina 3 tijden in 2 dagen, begon een gesprek vragen over enterprise plannen, maar heeft niet gekocht.
Wat te doen:

Dit is een hoge intent lead.1) Controleer hun hoofdgegevens voor bedrijfs- en rolinformatie. (2) Bekijk de chat transcript voor specifieke behoeften en bezwaren. (3) Maak een deal in het CRM met de verzamelde informatie. (4) Geef een vervolgtaak voor een verkoopteamlid. (5) Als ze terugkeren naar de pagina prijzen, kan de proactieve chat regel een gepersonaliseerd bericht veroorzaken.

Het omzetten van anonieme leidt tot CRM-contacten

Scenario:
Dat heb je 50 anonieme leads met hoge scores maar geen e-mailadressen.
Wat te doen:

Opties: (1) Maak een proactieve regel die biedt een korting of resource download in ruil voor e-mail op high-intent pagina's. (2) Gebruik de chat widget om te vragen naar e-mail wanneer anonieme bezoekers een gesprek starten. (3) Voeg een identiteitsteken toe aan uw login/aanmeldingspagina's zodat terugkerende bezoekers automatisch worden geïdentificeerd.

Hoe wordt de lead score berekend?+

De score is: recency van bezoeken (recent = hoger), frequentie van bezoeken, bekeken pagina's (prijs/afrekenen = hoger) sessieduur (langer = hoger); chatinteracties (versterkte = hoger).

Kan ik de regels voor het scoren van lood aanpassen?+

Ja. In CRM Configuratie kunt u lead-scoring regels toevoegen die de score versterken op basis van specifieke zoekwoorden, gebeurtenissen, bronnen of paginapatronen.

CRM

Uw CRM · start hier

OpsIQeen volledige AI-eerste schip CRM dat de waarheid van de klant, reinigt gegevens, scores leads, coaches deals, prognoses inkomsten en handelingen, met website intelligentie, ondersteuning, tickets, producten en betalingen als een levende grafiek. Elke AI actie is bron, verklarend, omkeerbaar en goedkeuring-gecontroleerde.

AI CRM-oplossingen
AI CRM overzichtEen Trust Dial op Copilot naast vier AI agent kaarten: Steward, Prospector, Retentie en Analyst.AI CRM-oplossingenwerkbladVertrouwenHandleidingCopilootAutopilootHoeveel de AI doet op zichzelfDSStewardDedupe, verrijken.valideer gegevensSDRProspecteur& Score zoekennieuwe contractenNT1BewaringSpot karn,aandrijvingsvernieuwingenAANAnalistVoorspelling &getallen uitleggen1AI-FIRSTVier gespecialiseerde personen2YOU DECIDEOnafhankelijkheid vertrouwen3TRUSTEDBron & omkeerbaar
Een AI-eerste CRM, uitgevoerd door vier specialisten en een Trust Dial die bepaalt hoeveel ze zelf doen.

Overzicht van CRM-pagina's

AI CRM (commandocentrum)

Begin hier

Uw dagelijkse thuisscherm: omzet puls, wat AI vond, wat het deed, goedkeuring wachtrij, volgende zetten, agent gezondheid en ROI.

Contacten

Kern

Mensen en bedrijven in uw CRM. Zoek, filter, partituur en beheer profielen.

Pijpleiding

Kern

Visual deal board met drag-and-drop stadia, win waarschijnlijkheid en AI coaching.

Voorspelling en verslagen

Kern

Voorspelling van de raad: vastgelegd, waarschijnlijk het beste geval, met betrouwbaarheidsintervallen en nauwkeurigheidsmeting.

Levenscyclus

Kern

Waar elke klant staat: actief, risicovol, uitzetting gereed, vernieuwing verschuldigd of karnen.

Bouw mijn CRM

Configureren

Beschrijf uw CRM-instellingen in gewoon Engels. OpsIQ genereert een omkeerbaar plan en past het toe op goedkeuring.

CRM-gezondheid

Ops.

Zelfcontrole pagina: schema, agenten, routes, AI acties en live data telt.

Hoe OpsIQ Houdt je veilig

Vraag het voordat je handelt.

AI voorstellen gaan naar de goedkeuring wachtrij. U keurt, bewerken of verwerpen elk. Niets gebeurt zonder uw toestemming.

Nooit overschrijven

Wanneer AI een verandering voorstelt, toont het de huidige waarde en de voorgestelde waarde. Menselijke ingevoerde gegevens hebben herkomstbescherming.

Alles is omkeerbaar.

Elke AI actie wordt opgenomen in het journaal. U kunt elke wijziging ongedaan maken met één klik.

Uitlegbaar

Elke AI aanbeveling toont zijn redenering en de gegevensbronnen die het gebruikte. Geen zwarte doos.

Gloednieuw?

1
AI CRM openen

Klik op AI CRM in de linker navigatie. Het commandocentrum toont uw huidige status.

2
CRM-gezondheid controleren

Open CRM Health om het schema, agenten en routes te verifiëren.

3
Contacten importeren

Als een connector actief is (Shopify, WHMCS, enz.), contacten worden automatisch geïmporteerd. Anders importeren via CSV of handmatig aanmaken.

4
Een pijpleiding aanmaken

Ga naar Pipeline en maak uw eerste pijpleiding met stadia (bijv., Lead, Qualified, Proposal, Negotiation, Won, Lost).

5
Voeg je eerste deal toe

Maak een deal van een contact, stel het bedrag en podium in, en laat de Deal Coach u begeleiden.

Moet ik de CRM gebruiken?+

Nee, de CRM is facultatief.OpsIQwerkt perfect als een tracking + ondersteuning + AI platform zonder de CRM. Schakel het in wanneer u klaar bent om verkoop en klantrelaties te beheren.

Kan de CRM werken zonder connectoren?+

Ja. U kunt handmatig contacten en transacties maken. Connectoren verrijken de CRM met platformgegevens (orders, abonnementen, tickets) maar zijn niet vereist.

Wat is de Trust Layer?+

De Trust Layer is het veiligheidssysteem dat bepaalt wat de AI kan doen. Copilot mode (standaard): AI stelt voor, mens keurt. Autopiloot modus (opt-in): KI werkt automatisch op laag risico, omkeerbare operaties.

CRM

Het AI CRM-homescreen

Het commandocentrum is uw dagelijkse briefing. Open het elke ochtend om te zien wat er gebeurd is, wat aandacht nodig heeft en wat we nu moeten doen.

Commandocentrum
CRM-opdrachtcentrumDe CRM-home met Forecast/Win-rate/Pipeline schakelt, een gewogen-vooruitgestelde KPI en een AI-voorstel wachtrij met goedkeuring en afwijzing op elke rij.CRM-opdrachtcentrumwerkbladVoorspellingWinpercentagePijpleidingVOORAFGAANDE • DIT V74k87%AI-voorstellen · goedkeuren wachtrijMaak deal · Acme $24kvan een gesprek met de koperGoedkeuringIngeruktNimbus verplaatsen → Voorstelpositief antwoord gedetecteerdGoedkeuringIngeruktLogtaak · follow-up Peakgeen activiteit in 7 dagenGoedkeuringIngerukt1TOGGLEVoorspelling · Winsnelheid · Pijpleiding2AI PROPOSESDeals, stadia, taken3YOU DECIDEGoedkeuring of verwerping
Het echte commandocentrum: schakel tussen Forecast, Win rate en Pipeline, en werk de AI voorstel wachtrij, goedkeuren of verwerpen van de aanbiedingen, podiumbewegingen en taken die het suggereert.

Wat het commandocentrum laat zien

De cijfers van vandaag

Pijplijn waarde, deals won / verloren, nieuwe leads, actieve aanbiedingen en omzet trend, een momentopname van uw huidige staat.

Wat OpsIQ gevonden

AI-ontdekte inzichten: gestalde deals, risicorekeningen, nieuwe kansen, datakwaliteitsproblemen en marktsignalen.

Wat OpsIQ deed

Acties die de AI heeft ondernomen (in Autopiloot) of voorgesteld (in Copilot): etappevooruitgang, score-updates, contactverrijking en taakaanmaak.

Goedkeuring nodig

Wachtrij van AI voorstellen wachtend op uw beslissing. Elk toont de voorgestelde actie, redenering en bewijs. goedkeuring, bewerken of verwerpen.

Volgende zetten

AI-gerangschikte lijst van de 10 belangrijkste dingen die we vandaag moeten doen: een hot deal volgen, een risicorekening controleren, onderzoek naar een nieuwe aanwijzing, enz.

Hulpstatus

Gezondheid van AI-agenten: gevangenneming, Data Steward, Deal Intelligence, Deals Coach, SDR, Bewaring. Groen = hardlopen, amber = heeft aandacht nodig, rood = fout.

Resultaten

ROI tracking: deals beïnvloed door AI, tijd bespaard, nauwkeurigheid van voorspellingen en vergelijking met handmatig CRM werk.

Werkschema voor de ochtendvoorlichting

1
Lees de cijfers van vandaag

Controleer de trend van pijpleiding gezondheid en inkomsten. Ben je op schema deze maand?

2
De goedkeuringslijst wissen

Bekijk elk AI-voorstel. hecht zijn goedkeuring aan veilige acties, bewerkt waar nodig, verwerpt slechte suggesties.

3
Controleer wat OpsIQ gevonden heeft

Lees AI inzichten. Zijn er deals in gevaar? Zijn er nieuwe kansen?

4
De volgende lijst van zetten werken

De AI heeft deze gerangschikt naar urgentie en mogelijke impact.

Inhaalslag na vrije tijd

Scenario:
Wat is er gebeurd toen je weg was?
Wat te doen:

Open het commandocentrum en controleer: (1) "Wat OpsIQ did" toont alle AI acties tijdens uw afwezigheid. (2) "Needs approval" toont voorstellen wachten op uw beoordeling. (3) "Wat OpsIQ De Commissie is van mening dat de Europese Raad in december een gemeenschappelijk standpunt heeft ingenomen.4) Stel het dashboard datumbereik in op uw afwezigheidsperiode om de trend te zien.

CRM

Contacten, bedrijven en deals

De CRM organiseert uw zakelijke relaties in vier objecten: Contacten (mensen), Bedrijven (organisaties), Deals (inkomstenkansen) en Taken (follow-upacties).

CRM-objecten
CRM-objectenEen Contact record gekoppeld aan Bedrijf, Deal en Taak objecten in een verbonden grafiek.CRM-objectenwerkbladContactpersoonpersoon · e-mail · telefoonOndernemingaccountsAfgesprokeninkomstenmogelijkheidTaakvervolgactie1OBJECTSContacten, bedrijven, deals2LINKEDEén verbonden grafiek3TASKSAangesloten follow-ups
Vier kernobjecten (contacten, bedrijven, deals en taken) gekoppeld aan één verbonden klantgrafiek.

Contacten

Wat is een contact

Een persoon in uw CRM. Ze kunnen een klant, een prospect zijn, een partner of een aanwijzing. Contacten hebben een e-mail, naam, bedrijf, tags, lifecycle fase en hotness score.

Contacten vinden

Gebruik de zoekbalk om op naam, e-mail, bedrijf of tags te vinden. Gebruik filters: levenscyclusfase, lead score, bron, land, laatste activiteitsdatum, toegewezen eigenaar.

Contactprofiel

Klik op een contact om hun volledige profiel te zien: persoonlijke info, bedrijf, aanbiedingen, activiteiten, tickets, chats, websitebezoeken, leadscore en AI inzichten.

Hittescores

A0-100 score berekend op basis van gedragssignalen: websitebezoeken, e-mail engagement, chat interacties, aankoopgeschiedenis en recency. Hoger = warmer.

Ondernemingen

... meer kaartjes...
Contact-bedrijf koppeling

Contacten zijn gekoppeld aan bedrijven via e-maildomein of handmatige opdracht. Eén bedrijf kan vele contacten hebben.

Aanbiedingen

Wat is een deal?

Een inkomstenmogelijkheid. Deals hebben een titel, bedrag, pijpleiding, podium, win waarschijnlijkheid, close date, toegewezen eigenaar en bijbehorende contacten / bedrijf.

Win waarschijnlijkheid

Een percentage kans op het winnen van de deal. Stel handmatig of berekend door AI op basis van uw historische winst gegevens. Drives de gewogen prognose.

Gezondheid van de handel

Groen (gezond), amberkleurig (risico), of rood (geïnstalleerd). Gebaseerd op activiteit requentie, faseduur en betrokkenheid signalen.

Taken

Wat is een taak?

Een vervolgactie toegewezen aan een persoon. Taken hebben een titel, vervaldatum, prioriteit, type (gesprek, e-mail, vergadering, andere), en verbonden contact/deal.

AI-gegenereerde taken

De AI creëert automatisch taken wanneer het iets ontdekt dat aandacht nodig heeft: een gestagneerde deal volgen, reageren op een risicorekening en onderzoek een nieuwe aanwijzing.

Hot leads vinden

Scenario:
U wilt alle topcontacten in het Verenigd Koninkrijk zien die onlangs niet zijn benaderd.
Wat te doen:

Ga naar contacten. Filter op: Lead score > 80, Land = Verenigd Koninkrijk, laatste activiteit > 7 Dit zijn je meest verwaarloosde aanwijzingen, prioriteit geven aan de reikwijdte.

Een deal maken vanuit een contact

Scenario:
Een contact toonde zojuist interesse in uw ondernemingsplan tijdens een gesprek.
Wat te doen:

Open het contactprofiel. Klik op "Create deal." Voer de titel van de deal in (bijv., "Acme Corp - Enterprise Plan"), bedrag, pijpleiding en podium (bijv: "Kwalificatie"). Stel de sluitingsdatum in en wijs deze toe aan jezelf. De Deal Coach zal beginnen met het volgen van deze mogelijkheid.

CRM

De pijpleiding (uw deal board)

De Pipeline is een visueel bord waar deals bewegen door stadia van links naar rechts. Sleep en drop kaarten om aanbiedingen te vooraf. Elke kaart toont het bedrag van de transactie, win waarschijnlijkheid, en gezondheidstoestand.

Pijpleiding
CRM-pijpleidingHet pijpleidingscherm met Open-deals, Openwaarde, Gewogen-forecast en Attriblied-deals statistieken, een New-deale knop, een AI CERTIFICATION wachtrij, en de Lead/Qualified / Won board.PijpleidingwerkbladOpen deals23Open waarde$128kGewogen prognose74kGeattributendeals12+ Nieuwe overeenkomstAanvaardingswachtrij2 om te bekijkenLOODVolt Inc$4kVuur$6kGESCHILLICEERDENimbus$30kPiek€9kwonOmloop48.000 dollar1LIVE STATSOpen waarde & gewogen prognose2AI QUEUEVoorgestelde deals goedkeuren3BOARDDeals per fase slepen
Het echte pijpleidingscherm: live statistieken (open waarde, gewogen prognose), een AI Capproval wachtrij voor voorgestelde transacties en het drag-and-drop board.

Gebruik van het pijpleidingbord

1
Bekijk uw deals

De pijpleiding toont alle actieve deals als kaarten gerangschikt in kolommen (fasen). Elke kolom header toont de totale waarde van transacties in die fase.

2
Sleep naar vooruit

Sleep een kaart naar de volgende fase. De win-kans en telt direct update. Als het verplaatsen mislukt (validatiefout), dan knapt de kaart terug naar zijn oorspronkelijke positie.

3
Controleer kaartbadges

Groene badge = gezond (recente activiteit, op het spoor). Amber = in gevaar (vertraagd, heeft aandacht nodig). Rood = gestikt (geen activiteit voor te lang).

4
Klik voor details

Klik op een kaart om het deal detail panel te openen met contacten, activiteiten, Deal Coach korte en snelle acties.

De goedkeuringslijst

AI voorstellen verschijnen in de goedkeuring wachtrij aan de bovenkant van de pijpleiding pagina. Elk voorstel toont wat de AI wil doen, waarom en het bewijs. U kunt:

Goedkeuring

Accepteer het voorstel als-is. De actie loopt via de Trust Layer en wordt opgenomen in het journaal.

Bewerken

Wijzig het voorstel voordat u het goedkeurt. Verander bijvoorbeeld de voorgestelde fase of pas het bedrag aan.

Weigeren

De AI leert van afwijzingen om in de toekomst betere suggesties te doen.

Win waarschijnlijkheid uitgelegd

Win waarschijnlijkheid kan handmatig worden ingesteld of berekend door AI. Wanneer AI berekent, het gebruikt een model getraind op uw eigen gesloten deals (won en verloren). Als je niet genoeg historische gegevens hebt, de AI maakt gebruik van de fase standaard waarschijnlijkheid. De kans drijft de gewogen prognose: a $10,000 deal op 30% waarschijnlijkheidsbijdrage $3,000 naar de "waarschijnlijke" prognose.

Een deal naar Won verplaatsen

Scenario:
Een klant heeft het contract getekend en betaald.
Wat te doen:

Sleep de kaart naar het "Won" podium. OpsIQ zal: (1) Markeer de overeenkomst als gesloten-won. (2) Bijwerken van de prognose (3) Voeg een "Won" activiteit toe aan de tijdlijn. (4) Indien geconfigureerd, activeer een webhook event (crm.deal.won).5) Update de contactlevenscyclusfase naar "Klant."

Vastgelopen deals spotten

Scenario:
Je wilt deals vinden die al te lang in dezelfde fase zitten.
Wat te doen:

Zoek naar rode (geïnstalleerde) badges op het pijpleidingbord. Deze deals hebben geen activiteit langer dan de geconfigureerde rotting drempel (in CRM Configuratie > Pijpleidingen ingesteld). Klik elke gestalde transactie om de aanbeveling van de Deal Coach voor reactivering te zien.

Mag ik meerdere pijpleidingen?+

Ja. Ga naar CRM Configuratie > Pijpleidingen om extra pijpleidingen te creëren. Gemeenschappelijke gebruiks gevallen: afzonderlijke pijpleidingen voor nieuwe bedrijven vs. vernieuwingen, of voor verschillende producten/diensten.

Wat gebeurt er als ik een deal naar "Lost" sleep?+

De deal is gemarkeerd als gesloten-verloren. U wordt gevraagd om een verliesreden. De overeenkomst wordt verwijderd van het actieve bord maar kan worden gevonden in het filter gesloten transacties. Het contact blijft in CRM staan.

CRM

Deal coaching -

De Deal Coach analyseert elke deal en geeft u een korte met gezondheidstoestand, risicosignalen, sleutelfiguren, een kwalificatie-checklist, vergadering voorbereiding, en voorgestelde volgende acties. Alles is afkomstig van. De coach toont welke tickets, chat of activiteit elke claim komt uit.

Deal coach -
Deal coach -Een dealkaart met AI-gedetecteerde risicosignalen met bewijsbronnen, naast een AI aanbeveling en een concept-email knop.Deal coach -werkbladAcme Corp · $24,000Fase: Voorstel · 60% winnenRISICOSIGNALENGeen antwoord in 10 dagenKampioen werd stilIn chat vermelde concurrentBronnen: ticket #482 · chat 6/12 · e-mail threadAI beveeltDe economische heroplevingkoper met een ROI-recapen een 7-dag sluiten plan.E-mail opstellen1SIGNALSWaarom een deal kan mislukken2SOURCEDElke claim citeert bewijs.3ACTIEEen-klik volgende stap
De coach wijst waarom een deal zou kunnen slippen (elk signaal citeert zijn bron) en geeft u de volgende stap te nemen.

Wat de coach je vertelt.

Gezondheidsverklaring

Waarom de overeenkomst gezond is, risico loopt of vastzit. Specifieke signalen: dagen in fase, laatste contactdatum, activiteitsfrequentie, concurrent vermeldt, bezwaren patronen.

Signalen

Gecategoriseerd in: bezwaren geuit, concurrent vermeldt, prijsbesprekingen, ondersteuning risico-indicatoren, vernieuwing / expansie signalen. Elk signaal links naar de bron (chat transcript, ticket, email, activiteit).

Kampioen en blocker kaart

Wie helpt de zaak (kampioen) en wie verzet zich (blokker). Gebaseerd op interactie analyse en contactrollen.

Kwalificatiechecklist

MEDDICC of BANT-checklist (configureerbaar) die aangeeft aan welke kwalificatiecriteria is voldaan en waaraan niet wordt voldaan.

Bijeenkomst voorbereiden

Vóór een geplande vergadering genereert de coach een korte agenda, belangrijke punten om te behandelen, vragen te stellen, risico's aan te pakken en materiaal voor te bereiden.

Plannen voor antwoorden en oproepen

Stelde volgende bericht of oproepscript voor gebaseerd op de huidige deal status en recente interacties.

Tijdslijn bewijs

Elke claim die de coach maakt links naar een bron: een ticketnummer, chat transcript ID, activiteitsdatum of websitebezoek.

Hoe gebruik je de coach?

1
Lees het briefje

Open elke deal en scroll naar de Deal Coach sectie. Lees de gezondheidstoestand en belangrijke signalen.

2
Nauwe kwalificatieverschillen

Controleer de kwalificatie-checklist. Als "Economische Koper" ontbreekt, plan om te identificeren en betrekken van de begroting houder.

3
Akte betreffende de suggesties

De coach stelt concrete volgende acties voor. Klik om een taak aan te maken, een e-mail op te stellen of een bijeenkomst in te plannen die allemaal door de goedkeuringswachtrij wordt geleid.

Voorbereiding op een grote vergadering

Scenario:
Je hebt morgen een afspraak met een vooruitzicht over een $50,000 -deal.
Wat te doen:

Open de deal en lees het gedeelte Meeting Prep. Het toont: (1) Belangrijkste gesprekspunten op basis van recente interacties. (2) Bezwaar dat ze vorige week in gesprek kwamen. (3) Concurrent noemden ze in een support ticket. (4) Vragen over hun tijdlijn. (5) Risicofactoren om proactief aan te pakken. Gebruik deze brief voor het opstellen van een gerichte, op feiten gebaseerde agenda.

Begrijpen waarom een deal in gevaar is

Scenario:
De pijpleiding toont een rode badge op een deal waarvan je dacht dat het goed ging.
Wat te doen:

Klik op de deal en lees de Deal Coach gezondheid verklaring. Het zou kunnen zeggen: "Deze overeenkomst is in het voorstel stadium voor 22 dagen (drempel: 14) Het laatste contact was 11 Het primaire contact opende een support ticket over data migratie problemen 5 dagen geleden (ticket #T-892). Suggestie: aanpak van de migratiezorg en plan een follow-up gesprek." Nu weet je precies wat te repareren.

CRM

Voorspelling en verslagen

Voorspelling op bestuursniveau met een verdedigbaar bereik, deal-level wijziging uitleg en nauwkeurigheidstracking zodat u uw nummers kunt bewijzen en uitleggen.

Voorspelling
VoorspellingEen kwartaalvoorspellingsnummer met Commit, Best-case en Pipeline banden en een nauwkeurigheidsnota.VoorspellingwerkbladVOORAFGAANDE VRAAG311k87% naar doelCommitBeste gevalPijpleidingAI-gewogen door deal gezondheid en geschiedenis · nauwkeurigheid gevolgd in de tijd1CATEGORIEËNToepassen aan pijpleiding2AI-WEIGHTEDGezondheid3PROVABLENauwkeurigheid gevolgd
Commit, best-case en pijplijn in een oogopslag, AI-gewogen door deal gezondheid, met nauwkeurigheid gevolgd zodat u het kunt verdedigen.

Prognosecategorieën

Toegewezen

Afspraken met 80% Dit is uw meest waarschijnlijke winst. Dit moet de minimale verwachte inkomsten zijn.

AI-gewogen waarschijnlijk

Alle open deals gewogen door hun AI-berekende kans op winst. Dit is de meest realistische voorspelling van wat je gaat sluiten.

Beste geval

Alle open deals tegen volledige waarde. Dit is het maximaal mogelijke inkomen als alles perfect gaat (het doet het zelden).

Betrouwbaarheidsinterval

Een 80% waarschijnlijkheidsband toont het realistische bereik. Voorbeeld: "Je zult waarschijnlijk sluiten tussen $45,000 en $72,000 Dit kwartje."

Wat is er veranderd en waarom?

De prognose omvat week-over-week verandering attributie. Wanneer uw voorspelling daalt door $15,000, legt het rapport precies uit welke transacties de verandering veroorzaakt: "Deal A gleed naar volgend kwartaal ($8,000), Deal B verloren ($5,000), Deal C verminderd in waarde ($2,000)."

Nauwkeurigheidsvolgsysteem

Voorspelling

Gemiddelde Absolute Percentage Fout: hoe ver van uw voorspellingen zijn historisch geweest. Lager is beter. Een MAPE van 15% betekent dat uw voorspellingen zijn meestal binnen 15% van de werkelijke resultaten.

Recenseer waarschijnlijkheid

Brier score meten hoe goed waarschijnlijkheden te winnen overeenkomen met de werkelijke resultaten.70% waarschijnlijkheid wint eigenlijk 70% van de tijd, kalibratie is goed.

Wekelijkse snapshots

OpsIQ legt elke week een momentopname vast van uw prognose (via cron). Na verloop van tijd kunt u zien hoe de nauwkeurigheid van uw voorspelling verbetert.

Oprollen en waarschuwingen

Omzetting per fase

Hoeveel deals gaan van elke fase naar de volgende 80% pass van gekwalificeerd naar voorstel maar alleen 20% Ga van voorstel naar onderhandeling, uw voorstellen kunnen werk nodig hebben.

Per bron winpercentage

Welke lead bronnen het meeste winnen. Investeer meer in hoog-win-snelheid bronnen.

Per-eigenaar prestaties

Hoe elk verkoopteamlid presteert: deals gewonnen, pijpleiding waarde, gemiddelde deal grootte, winst rate.

Waarschuwingen

Zandzak (onvermijdelijk lage waarschijnlijkheden), overslaan (onbetrouwbaar hoog) en begaan-at-risk (high-probability deals tonen stal signalen).

Begrijpen van een verwachte daling

Scenario:
Je kwartaalvoorspelling daalde van $180,000 naar $155,000 sinds vorige week.
Wat te doen:

Open de pagina Voorspelling en controleer "Wat veranderd." Het rapport toont: "Acme Corp deal ($15,000) verhuisd naar Lost, gekozen concurrent. Beta Inc deal ($8,000) sluitingsdatum geduwd naar volgend kwartaal. Nieuwe deal met Gamma LLC ($3,000) deze week toegevoegd." De netto verandering is -$20,000 + $3,000 = -$17,000, het verklaren van de daling van $180K naar $163K (met de resterende $8K verklaard door kansspelen aanpassingen op andere aanbiedingen).

CRM

Nieuwe contracten vinden

De Prospecting Agent helpt u bij het vinden en onderzoeken van potentiële klanten. Beschrijf uw ideale klant, voeg doelbedrijven toe, en laat de AI onderzoek, score en ontwerp eerste-touch bereik.

Prospectie
ProspectieEen lijst van AI-gevonden prospect bedrijven met fit notes, scores en een ontwerp-outreach button elk.ProspectiewerkbladVooruitzichten van de SDR-agentNorthwind Ltd.SaaS · 50 personeel · aanwervingsondersteuning88Ontwerp-vergaderzaalKobalt MfgIndustrie · 200 personeel74Ontwerp-vergaderzaalMesa Retail op PinteresteCommerce · 30 personeel69Ontwerp-vergaderzaalVega Health BVGezondheidszorg · 80 personeel63Ontwerp-vergaderzaal1FINDAI bronnen doelrekeningen2SCORE& Intent-ranking3DRAFTEerste aanraking voor u geschreven
De SDR agent vindt doelbedrijven, scoort ze op fit en stelt de first-touch outreach voor uw review.

Eenmalige installatie

1
Beschrijf uw ideale klant

Ga naar CRM Configuration > Prospecting. Beschrijf uw ideale klantenprofiel (ICP): doelindustrieën, bedrijfsgroottes, functietitels, geografische focus, product-match voorwaarden en minimale fit score. Voorbeeld: "B2B SaaS bedrijven met 50-500 medewerkers in de VS/VK, verkoop van ontwikkelaarstools, met een VP of Sales of Head of Growth als het primaire contact."

2
Doelbedrijven toevoegen

Voer bedrijfsdomeinen of namen in die u wilt onderzoeken. U kunt ook bedrijven laten voorstellen op basis van uw ISP.

3
Evaluatie van de onderzoeksresultaten

De AI verrijkt elk bedrijf met beschikbare gegevens: grootte, industrie, tech stack, recent nieuws en fit score met uitleg.

4
Afstemmingsbereik

Voor goede bedrijven stelt de AI een gepersonaliseerde first-touch bericht op. Beoordeel en keur het goed in de wachtrij.

Past bij scoren

Elk vooruitzicht krijgt een0-100 fit score gebaseerd op vijf factoren:

ICP-geschikt

Hoe goed het bedrijf past bij uw ideale klantenprofiel (industrie, grootte, locatie).

Spoedsignalen

Is er bewijs dat ze uw product nu nodig hebben? Vacatures, technische veranderingen, klachten over concurrenten.

Budget-proxy

De omvang van het bedrijf, de financieringsfase en de inkomsten-indicatoren suggereren begroting beschikbaar.

Productmatch

Hoe relevant uw product is voor hun bedrijf op basis van industrie en technologie.

Ondersteuning past

Of u deze klant effectief kunt bedienen (tijdzone, taal, complexiteit).

Onderzoek naar een doelbedrijf

Scenario:
U wilt beoordelen of acme.com de moeite waard is om na te gaan.
Wat te doen:

Toevoegen acme.com naar de opsporingslijst. De AI geeft: Fit score 78/100 Redenen: B2B SaaS, 120 medewerkers, in de VS gevestigd, onlangs een VP of Sales (noodsignaal) ingehuurd, gebruikt concurrent X (productmatch). Kopen signalen: bezocht uw prijs pagina twee keer vorige maand (van website tracking). Beste contact: [email protected] (VP of Sales). Opgeschreven opener verwijst naar hun recente verhuur en prijzen pagina bezoeken.

CRM

Automatische vervolgsequenties

Gevolgen Automatiseren multi-step follow-up: een mix van e-mail, wacht, taak, oproep en webhook stappen die automatisch worden uitgevoerd nadat u de eerste verzenden goedkeuren.

Gevolgen
Follow-upsequentiesEen horizontale sequentiestroom: E-mail, wacht drie dagen, e-mail en vervolgens een taak met antwoorddetectie.Follow-upsequentieswerkbladNadat u de eerste verzenden → goed te keurenE-mailInleidingWacht.3 dagenE-mailOpvolgingTaakOproepStappen kunnen e-mail, wacht, taak of webhook zijn. Een antwoord stopt automatisch de volgorde.1AUTOMATEMeerstappen-vervolging2STEPSE-mail · wacht · taak · webhook3YOU APPROVEEerste verzending is afgesloten
Geautomatiseerde multi-step follow-up (email, wacht, e-mail, taak) die u eerst goedkeurt en een antwoord stopt automatisch.

Hoe sequenties werken

1
Een reeks aanmaken

Definieer de stappen: e-mail, wacht 3 dagen, e-mail, wacht 5 dagen, taak (oproep als geen antwoord), e-mail. Elke stap heeft een sjabloon die u kunt aanpassen.

2
Contacten inschrijven

Voeg contacten toe aan de volgorde. De AI kan ook voorstellen inschrijving van prospectie resultaten.

3
Automatische uitvoering

Stappen draaien automatisch volgens schema. Als een contact op enig moment reageert, pauzeert de volgorde automatisch.

4
Trackresultaten

Zie de open tarieven, repliekspercentages, conversiepercentages en afmelden per stap. Gebruik dit om uw volgorde te optimaliseren.

Begrijpen wat je bedoelt

Wanneer een contactpersoon antwoordt, classificeert de AI het antwoord:

Positief

Geïnteresseerd, wil praten.

Bezwaar

Heeft zorgen maar niet verwerpen. Sequence pauzes, taak gemaakt met bezwaar details.

Abonnement opzeggen

Wil stoppen met het ontvangen van berichten. Contact wordt permanent onderdrukt.

Niet nu.

Geïnteresseerd maar timing is verkeerd. Sequentie pauzes, sluimer taak gemaakt.

Verkeerde persoon

Niet het juiste contact, de volgorde stopt en contact wordt gemarkeerd voor beoordeling.

Steun

Een support vraag, geen verkoop antwoord. Sequentie pauzeert, ticket gemaakt.

Spamwerende middelen

Opt-outbehandeling

Abonnementsverzoeken worden onmiddellijk gehonoreerd en het contact wordt onderdrukt van alle toekomstige sequenties.

Dagelijkse verzenddop

Werkruimte-niveau dagelijkse limiet (standaard: 1,000 emails). Voorkomt massa stuurt die trigger spam filters.

Per-contactlimiet

Maximum 1 bericht per contact per dag. Voorkomt overweldigende individuele mensen.

Behandeling met overcap

Stappen die de dagelijkse dop overschrijden worden uitgesteld tot de volgende dag. Ze worden nooit gedropt of overgeslagen.

Wat gebeurt er als een contact tijdens een reeks een support ticket opent?+

De volgorde pauzeert automatisch. Ondersteuning heeft voorrang boven reikwijdte. De reeks kan handmatig worden hervat nadat het ondersteuningsprobleem is opgelost.

Kan ik A/B testsequentie stappen?+

Niet direct binnen de sequenties, maar je kunt twee reeksen maken met verschillende berichten en hun resultaten vergelijken.

CRM

Groeiinstrumenten

Een pagina onder CRM die de groeimotor bevat: terugkerende inkomsten (MRR/ARR), de productcatalogus, lood-vangst formulieren, boeking links en lead routing. Alles hier schrijft rechtstreeks in het CRM, dus een formulier indienen of een geboekte oproep is een contact met geschiedenis, niet een rij in een spreadsheet.

Wat op de pagina leeft

Terugkerende ontvangsten

Ontvangsten

MRR en ARR geprojecteerd vanuit uw echte facturatie grootboek. Abonnementen worden gegroepeerd per platform, de factuurcyclus wordt afgeleid uit betalingstekorten, en een abonnement vervalt wanneer een betaling is te laat voorbij 1.5 maal zijn cyclus. Klanten koppelen aan CRM-contacten automatisch als het grootboek hun email draagt.

Productcatalogus

Catalogus

Een bron van waarheid voor wat je verkoopt. Quotes trekken de naam en lijst prijs uit de catalogus, en geaccepteerde citaten roll up in omzet per product. Producten archief, ze nooit verwijderen.

Lood-vangstvormen

Opname

Elk formulier krijgt een gehoste pagina plus een iframe embed code voor uw eigen site. Inzendingen worden contacten, de eigenaar krijgt een melding en uw routering regels toewijzen van de lead.

Boeking links

Planning

Deel een link, laat prospects kiezen voor een gratis slot. Slots respecteren de werkuren van de organisator, tijdzone en bestaande vergaderingen. Een boeking maakt de vergadering, e-mailt het vooruitzicht een bevestiging en stelt de organisator in kennis.

Loodleiding

Routering

Territory regels draaien eerst, dan veldregels (match een veld zoals land of bron), vervolgens ronde-robin over uw rep pool. Het routeert CONTACTS EN DEALS gelijk, ongeacht de overeenkomst status: een won deal nog steeds heeft een eigenaar voor commissie toeschrijving, rekening verantwoordelijkheid en follow-up, en in eigenaar of team zichtbaarheid modus is een oneigendom record onzichtbaar voor iedereen behalve een manager. Records gemaakt door automatisering (een connector verkoop, chat, een import) dragen geen interactieve creator, dus ze worden geleid door dezelfde regels op het creëren in plaats van verlaten eigenaar. Alles wat al een eigenaar heeft wordt nooit opnieuw toegewezen.

Maak uw eerste formulier

1
Open groeitools

Ga naar CRM, dan Groei Gereedschappen, vervolgens de Lead-capture vormen sectie.

2
Noem het en kies velden

Typ een naam en een komma-gescheiden veldlijst, bijvoorbeeld naam, email, telefoon, bericht. E-mail is altijd vereist.

3
Delen of insluiten

Kopieer de gehoste link om het overal te delen, of kopieer de inbed code en plak deze op elke pagina van uw website.

4
Horloge aanwijzingen arriveren

Elke indiening is een CRM-contact met een formulier. ingediende activiteit, een eigenaar notificatie en automatische routering.

💡
Publiek vastleggen pagina's gebruiken het eigen adres van uw werkruimte. Cloud werkruimten gebruiken hun toegewezen subdomein (company.opsiq. help), dus de link lost altijd de juiste gegevens op.

Ingebouwde beschermingsmiddelen

Bots zien succes, je ziet niets

Een verborgen honingpot veld gooit stilletjes bot inzendingen weg.

Percentage beperkt

Tien inzendingen per uur IP adres tussen formulieren en boekingen.

Toestemming blijft eerlijk

Het indienen van een formulier verleent geen toestemming voor marketing. Alleen een uitdrukkelijke toestemmingscontrolevakje doet dat.

Geen dubbele boeking

Een slot wordt opnieuw gevalideerd tegen een nieuwe beschikbaarheidscontrole op het moment van boeking.

Waar komen de terugkerende inkomstengegevens vandaan?+

Vanuit hetzelfde handelsboek gebruikt uw Sales pagina, gevoed door facturatie connectoren. Gebruik Re-sync van facturen na het aansluiten van een nieuw platform.

Kan ik de formulieren zonder website gebruiken?+

Ja. Elk formulier heeft een gehoste pagina op uw eigen adres die standalone werkt, met of zonder JavaScript.

CRM

Messaging Hub (SMS en WhatsApp)

Eén connector, tot twintig gateways. Sluit de SMS- en WhatsApp-providers die u daadwerkelijk gebruikt aan, markeer er één als standaard, en kies een van hen bij het sms'en van een contact. Toestemming wordt gecontroleerd door de CRM voordat enige gategateway wordt gecontacteerd.

Zet het op.

1
De connector inschakelen

Op de Connectors pagina, open Messaging Hub (SMS en WhatsApp) en schakel het in.

2
Een provider toevoegen

In dezelfde lade, of in CRM Growth Tools, kies een gateway uit de dropdown (Twilio, Vonage, Termii, Meta WhatsApp Cloud, Infobip en meer), plak zijn API referenties en verbinding. U kunt meerdere toevoegen, waaronder dezelfde gateboard twee keer met verschillende accounts.

3
Draad de webhaak

Elke provider ingang toont zijn eigen webhook URL met een kopieerknop. Plakken in het leveringsrapport en de instellingen voor inkomende berichten van de gateway om de leveringsstatus te verkrijgen en terug te antwoorden naar OpsIQ.

4
Verzenden van een contact

Open een contact en gebruik de SMS- of WhatsApp-knop. Als meerdere providers het kanaal ondersteunen, kunt u kiezen door middel van een selector; anders wordt de standaard gebruikt.

Toestemming komt eerst

Alleen toestemming verleend

Onbekende toestemming is geen toestemming. Een verzendopdracht weigert tenzij SMS-toestemming uitdrukkelijk wordt verleend. WhatsApp rijdt op dezelfde toestemming.

Niet-contacten winnen altijd

Een niet-contact vlag blokkeert elk kanaal, wat er ook gebeurt.

Onderdrukking wordt geëerd

Contacten op de onderdrukkingslijst worden nooit gemaild.

Weigeringen geven hun reden aan

Een geblokkeerde verzenden vertelt je precies waarom, zodat u de gegevens kunt repareren in plaats van raden.

Voor ontwikkelaars: het webhook contract

URL _vorm

https://your-address/opsiq/cron/messaging_webhook.php?sk=SITE_KEY&e=ENTRY_ID&t=TOKEN. De per-entry token wordt geslagen wanneer de provider is aangesloten en nooit draait op bewerken.

Begrepen formaat

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

Effecten

Leveringsrapporten stempel de rij met het bereik grootboek die het providerbericht-id als geleverd of stuiterde draagt. Inkomende berichten komen overeen met het contact via telefoonnummer binnen de werkruimte, landen als een bericht. ontvangde activiteit, en markeren van het gesprek beantwoord.

Foutmodus

Verkeerde of ontbrekende token antwoorden 403. Onbekende payloads worden geteld en genegeerd, nooit fataal, dus een fout geconfigureerde gateway kan het eindpunt niet breken.

Welke gateways worden ondersteund?+

Twilio, Vonage, Plivo, BerichtBird, Sinch, Infobip, Telnyx, ClickSend, Termii, Afrika's Talking, BulkSMS, Textalocal, Meta WhatsApp Cloud, 360dialog, SMSAPI, Gupshup, Kaleyra, D7 Networks, Hubtel en een aangepaste HTTPS webhook voor alles anders.

Zijn de referenties veilig?+

De gegevens worden versleuteld opgeslagen in de instellingen van de connector en worden nooit teruggeechoekt naar de browser. Een item bewerken met een leeg geheim houdt het opgeslagen bericht bij.

Kan de AI berichten versturen?+

Ja, door geregistreerde acties die bevestiging vereisen en dezelfde toestemmingspoort uitvoeren. De AI kan ook aangesloten providers op een lijst zetten om uit te leggen wat er beschikbaar is.

CRM

Het houden en groeiende klanten

Lifecycle management helpt u bij het beschermen van bestaande inkomsten. Elk account krijgt een karn risico score, een gezondheid score, uitbreidingsscore en een aanbevolen succes playbook.

Levenscyclus
LevenscyclusplankEen klanten-levensfietsbord (Onboarding, Active, At-risk, Revitation) met gezondheidsbalken op elke accountkaart.LevenscycluswerkbladOPBEREIDINGAcmegezondheid 40_ActiefGlobexgezondheid 88_Initechgezondheid 76_AT-RISKSoylentgezondheid 28_VernieuwingOmbraVernieuwt in 12duitbreiding +$8k1STAGESAan boord van de vernieuwing2SCOREDGezondheid en uitbreiding3PLAYBOOKAanbevolen volgende zet
Klanten gaan door onboarding, actief, risicovol en vernieuwing, elk gescoord voor gezondheid en uitbreiding met een speelboek.

Het levenscyclusbord

Plattegrond

Visueel bord dat toont waar elke rekening staat: Lead, Prospect, Opportunity, Customer, Expansion, Revitation, At Risk, Churned.

Risicorekeningen

Accounts gemarkeerd met een hoog karn risico. Elk toont de top bestuurder (ondersteuning piek, inactiviteit, betaling falen) en een aanbevolen opslaan spel.

Uitbreidingsmogelijkheden

Accounts die signalen van bereidheid om meer te kopen tonen: hoog gebruik, feature verzoeken, plan onderzoeken.

Vervallen verlengingen

Rekeningen met aankomende verlengingsdata, gesorteerd op risiconiveau en omzetwaarde.

Hoe OpsIQ detecteert karn risico

Het curnrisico wordt berekend aan de hand van meerdere signalen die samengesmolten zijn:

CRM-signalen

Deal gezondheid, inactiviteit, recente verliezen, afnemende betrokkenheid.

Ondersteuningssignalen

Open kaartjes, ticket volume pieken, negatieve sentiment, escalaties.

Betrokkenheid van het product

Aanmeldfrequentie, gebruik van functies, paginabezoeken, API aanroepen.

Factureringssignalen

Foute betalingen, achterstallige facturen, downgrade aanvragen, annulering pagina bezoeken.

Speelboeken

Afspelen opslaan

Voor risicorekeningen: proactief contact opnemen, de zorg aanpakken, ondersteuning bieden en indien nodig escaleren.

Vernieuwing

Voor komende verlengingen: bevestiging van tevredenheid, herziening gebruik, contante waarde, bieden stimulans indien nodig.

Uitbreidingsspel

Voor kant-en-klare accounts: u kunt upgradeopties presenteren, succesverhalen delen en ROI demonstreren.

Adoptie-afspeelstuk

Voor het onderbenutsen van rekeningen: bieden training, delen van beste praktijken, maken functies die ze niet gebruiken.

spotten karn voordat het gebeurt

Scenario:
Een klant die normaal gesproken dagelijks inlogt is niet aangemeld voor 2 Weken, en ze openden 3 Deze maand tickets voor ondersteuning.
Wat te doen:

Het Lifecycle board markeert deze rekening als "At Risk" met bestuurders: inactiviteit (14 dagen sinds laatste aanmelding) en steunpiek (3x normaal ticket volume). Aanbevolen spel: proactieve outreach call om te begrijpen wat er gebeurt. Is er een product probleem? Zijn ze het evalueren van concurrenten? Vroege interventie kan de rekening opslaan.

CRM

Uw gegevens schoon houden

De Data Steward agent vindt en lost automatisch problemen op met de gegevenskwaliteit: duplicaten, ontbrekende velden, inconsistenties en oude records.

Gegevensbeheerder
GegevensbeheerderEen lijst van problemen met gegevenskwaliteit (dupliceren, missen, oud, formaat), elk met een één-klik repareren actie.GegevensbeheerderwerkbladGegevens problemen die de Steward agent vondDupliceren[email protected] en [email protected]SamenvoegenOntbrekend12 contacten hebben geen bedrijfVerrijkenLidstaat38 deals onaangeraakt voor 90+ dagenEvaluatieFormaattelefoonnummers in 4 formatenAlles herstellen1CATCHESDups, hiaten, oudjes2EXPLAINSWaarom het gemarkeerd elk3FIXESOp uw goedkeuring
De Steward agent houdt uw CRM schoon, vindt duplicaten, gaten, oude records en slechte formaten, vaststelling op goedkeuring.

Wat het vangt

Contacten dupliceren

Meerdere records voor dezelfde persoon (bv. [email protected] en [email protected] De steward stelt voor ze samen te voegen.

Ontbrekende gegevens

Contacten zonder e-mail, aanbiedingen zonder bedragen, bedrijven zonder domeinen. Stelt het vullen van uit beschikbare bronnen voor.

Niet-verbonden records

Deals zonder bijbehorende contacten, contactpersonen zonder bedrijven. Voorgesteld wordt om te koppelen op basis van e-mail domein en context.

Inconsistenties

Een deal in "Won" stadium met 20% waarschijnlijkheid, een contact gemarkeerd met "Klant" zonder deals, een bedrijf met niet-gematchte industrie.

Verkeerde stadia

Deals die al te lang in dezelfde fase zijn of contacten waarvan de levenscyclus niet overeenkomt met hun activiteit.

Hoe gebruikt u dit middel?

1
Open de stewardlijst

Ga naar CRM en vind de Data Steward sectie (of open het vanuit CRM Health).

2
Veilige fixes goedkeuren

Groene items zijn veilig: duidelijke duplicaten, duidelijk ontbrekende gegevens.

3
De rest bekijken

Amber items hebben uw oordeel nodig: mogelijke duplicaten met kleine verschillen, voorgestelde fase wijzigingen, bedrijf koppelen. Bekijk elk van hen.

Dubbele contacten worden schoongemaakt

Scenario:
De rentmeester vond "John Smith ([email protected]) en "J. Smith ([email protected])": zelfde e-mail, verschillende namen.
Wat te doen:

De steward stelt voor om samen te voegen: het record met meer activiteit houden, de andere platendeals en activiteiten samenvoegen. Bekijk het voorstel, pas de naam van de overgebleven display aan indien nodig aan en keur het goed. Beide records' geschiedenis wordt bewaard in het samengevoegde contact.

CRM

Bouw mijn CRM

Met My CRM kun je jouw CRM-instellingen in het gewone Engels beschrijven. OpsIQ genereert een gevalideerd, omkeerbaar plan en past dit toe bij goedkeuring. Geen codering, geen handmatige configuratie klikken.

Bouw mijn CRM
Bouw mijn CRMEen natuurlijke-taalbeschrijving links die een gegenereerd CRM-plan van stadia, velden en segmenten aan de rechterkant produceert.Bouw mijn CRMwerkbladBeschrijf uw bedrijfWij zijn een web design bureauverkoop van maandelijkse houders eneenmalige projecten voor kleine ondernemingenbedrijven.Bouw mijn CRMGegenereerd planFasen: Lood → BewaarderDeal types: beugel, projectVeld: maandelijkse waardeSegmenten: MKB, agentschapSequentie: onboardingToestemming & toepassing1DESCRIBEEngels in2AI PLANSFasen, velden, segmenten3APPROVEToegepast · geen codering
Beschrijf uw bedrijf in gewoon Engels; OpsIQ stelt de hele CRM (fasen, velden, segmenten) en past het toe op goedkeuring.

Hoe het werkt

1
Beschrijf wat je wilt.

Typ een simpele beschrijving van uw CRM-instellingen. Voorbeeld: "Maak een vernieuwingspijpleiding met fasen: Aankomende, Contacted, Negotiates, Hernieuwd, Verloren. Score leidt hoger wanneer ze de prijzen twee keer bekijken."

2
Herziening van het plan

OpsIQ toont een voorbeeld van wat het zal creëren: pijplijn, stadia, fase waarschijnlijkheden, scoreregels, levenscyclus regels. Bekijk elk item.

3
Toepassen

Klik op Toepassen om het plan uit te voeren. Elke wijziging wordt geregistreerd als een bundel die u kunt ongedaan maken in één klik.

4
Terugrollen indien nodig

Als er iets niet klopt, klikt u op Ongedaan maken om de volledige bundel terug te draaien. Uw CRM keert terug naar zijn vorige status.

Wat je kunt bouwen

Pijpleidingen en -fasen

Maak genoemde pijpleidingen met aangepaste stadia, standaard waarschijnlijkheden en rottende drempels.

Scoreregels

Boost lead scores gebaseerd op gedrag: "Score hoger als ze prijzen bekijken," "Scree lager wanneer ze carrières pagina te bezoeken."

Levenscyclusregels

Automatisch de levenscyclusfasen vooruit: "Verplaats naar SQL wanneer ze een demo aanvragen," "Verhuis naar Klant als deal wordt gewonnen."

Aangepaste velden

Velden toevoegen aan contacten, aanbiedingen of bedrijven: tekst, nummer, datum, selecteer, selectievakje, URL, e-mail.

Kwalificatiechecklist

Definieer de MEDDICC of BANT checklist van de Deal Coach kwaliteiten tegen.

Een vernieuwingspijpleiding opzetten

Scenario:
U beheert SaaS abonnementen en heeft een pijpleiding nodig voor vernieuwing.
Wat te doen:

Type: "Maak een vernieuwingspijplijn. 90 Dagen out (10%), 60 Dagen out (25%), contact opgenomen (40%), onderhandelingen (60%), Vernieuwd (100%), Churned (0%) Stel de rottingsdrempel in op 14 dagen."OpsIQ genereert het plan, u bekijkt het en klikt op Toepassen. De pijpleiding verschijnt onmiddellijk op uw Pipeline pagina.

Wat als ik iets beschrijf wat niet mogelijk is?+

De bouwer genereert alleen acties die hij weet te valideren. Als je iets buiten zijn mogelijkheden vraagt (bijv. "Integreer met mijn aangepaste API), zal het de aanvraag afwijzen en uitleggen wat het in plaats daarvan kan doen.

Kan ik de wijzigingen ongedaan maken?+

Ja. Elke Build Mijn CRM-actie wordt vastgelegd als een omkeerbare bundel. Ga naar CRM Health > Verander de geschiedenis om alle bundels te zien en ongedaan te maken.

CRM

Uw CRM-methode instellen

Handmatige CRM-configuratie voor teams die liever klikken boven typen. Alle instellingen die Build My CRM kunnen maken zijn ook beschikbaar als traditionele vormvelden.

Pijpleidingen en -fasen

Maak, hernoemen, opnieuw ordenen en verwijderen van pijpleidingen en stadia. Stel standaard win waarschijnlijkheid per fase in. Stel de rotting drempel (dagen zonder activiteit voordat een transactie wordt gemarkeerd "geïnstalleerd").

Aangepaste velden

Velden toevoegen aan deals, contacten of bedrijven. Veldtypes: tekst, nummer, datum, selecteer (dropdown met vooraf gedefinieerde opties), selectievakje URL, e-mail. Aangepaste velden verschijnen op het objectprofiel en in filters.

Kwalificatiechecklist

Definieer de checklist die de Deal Coach gebruikt om aanbiedingen te evalueren. Kies MEDDICC, BANT of een aangepaste set criteria. Elk item kan worden gemarkeerd vereist of optioneel.

Voorschriften voor de levenscyclus

Definieer automatische faseovergangen: wanneer een contact aan een voorwaarde voldoet (kijkt prijzen, dient een formulier in, doet een aankoop), hun levenscyclusfase gaat automatisch vooruit.

Voorschriften voor loodscoring

Verhoog of verminder de lead scores op basis van gedrag. Voorbeelden: "Bekeken prijs pagina = +15 punten," "Downloaded whitepaper = +10 punten," "Bezochte carrières pagina = -5De minimumtelling kan worden vastgesteld (bijv. "moet ten minste de prijsstelling bekijken."2 maal").

Opgeslagen weergaven

Maak benoemde filter+sort combinaties voor contacten, aanbiedingen of bedrijven. Deel weergaven met uw team. Stel een standaardweergave per objecttype in.

Een regel voor loodscore toevoegen

Scenario:
U wilt contacten die uw prijspagina twee keer of meer bekijken om een hogere score te krijgen.
Wat te doen:

Ga naar CRM Configuratie > Lead Score regels. Klik op Regel toevoegen. Stel: gebeurtenis = "paginaweergave,"URL bevat = "/pricing", Minimumtelling =2, Score boost = +20. Opslaan. De volgende keer dat de scorer draait, zullen contacten met deze regel +20 Hun voorsprong.

CRM

CRM-gezondheidscontrole

CRM Health is een zelfdiagnosepagina die uw CRM correct en soepel controleert.

Gezondheidscontrole
CRM-gezondheidscontroleEen gezondheidsscorering op 92 naast een checklist van het passeren en waarschuwen configuratie controles.CRM-gezondheidscontrolewerkblad92GEZONDHEIDPijpleidingen geconfigureerdVerbindingskoppel & importerenAI-agenten ingeschakeld!Geen actieve vervolgreeks!12 contactpersonen vermist bedrijf1CONTROLEControleert uw installatie2FLAGSWat ontbreekt3SCOREEén totaal getal
Een één-pagina CRM audit: een algemene gezondheidsscore plus een checklist van wat er goed is opgezet en wat nog steeds aandacht nodig heeft.

Wat het controleert

Schema

Database tabellen bestaan en hebben de juiste kolommen. Als een migratie werd gemist, zal CRM Health het markeren.

AI-agenten

Alle CRM-agenten (Capture, Data Steward, Deal Intelligence, etc.) zijn geregistreerd en gezond. Groen = hardlopen, amber = heeft aandacht nodig, rood = fout.

Routes

CRM APIroutes en AJAX eindpunten zijn geregistreerd en aanspreekbaar.

AI-acties

De CRM actie catalogus is geregistreerd in het Actieregister. Als acties ontbreken, geneest CRM Health zichzelf door ze opnieuw te registreren.

Aantal levende gegevens

Totaal aantal contacten, bedrijven, deals, taken, activiteiten en evenementen. Handig voor het verifiëren van importen en permanente gegevensverzameling.

Na de instellingscontrole

Na de eerste CRM-opstelling, open CRM Health en controleer of alle controles groen zijn. Als er amber of rood zijn, klik dan op het item voor een diagnostische uitleg en stel vast te stellen.

Hoe vaak moet ik CRM Health controleren?+

Controleer na de eerste installatie, na grote updates en wanneer CRM gedrag lijkt verkeerd. CRM Health zelf-helpt veel problemen (zoals ontbrekende actie registraties) gewoon door het openen van de pagina.

CRM

CRM-verbindingen voor ontwikkelaars

De CRM stelt een compleet openbaar REST API en uitgaande webhooks bloot zodat het past bij elke stack zonder handmatige export.

API eindpunten

Authenticatie

API toets (Authorisatie: Bearer opq_...) met scope crm.read of cRM.write /api/v1.php met actie en site_key.

Contacten

crm. contacts. list (search + filter), crm, contacts. detail (per ID), cRM. contacten. upert (create or update), chm. contactsen. save.

Aanbiedingen

crm. deals. list, crm . deals. detail, cRM deals. create, cmm. dealds. update, crem. deales. advance (alle via de Trust Layer).

Activiteiten

crm. activities. list (tijdlijn voor een contact/deal), crm,activitys. record (log een nieuwe activiteit).

Gebeurtenissen

crm. events. list (duurzaam wijzigen van feed met sed_id-cursor), crm, events. catalogus (lijst beschikbare gebeurtenistypes).

Maak een deal via API
POST /api/v1.php
Authorization: Bearer opq_live_xxx
Content-Type: application/json

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

Webhook-gebeurtenissen

opsiq.contact.upsert

Ontslagen wanneer een contact is aangemaakt of bijgewerkt. Dit is het contact event waarop u zich kunt abonneren; er is geen aparte aangemaakte gebeurtenis.

contact.lifecycle_changed

Ontslagen als een contact naar een ander levensloopstadium beweegt.

contact.status_changed

Ontslagen wanneer een contactstatus verandert.

contact.conversion

Ontslagen wanneer een conversie wordt geregistreerd tegen een contact.

contact.tag_added

Ontslagen wanneer een tag aan een contact wordt toegevoegd.

contact.erased

Ontslagen wanneer een contact wordt gewist voor een privacyverzoek.

crm.deal.created

Ontslagen als er een deal wordt gemaakt.

crm.deal.stage_changed

Ontslagen als een deal naar een ander stadium gaat.

crm.deal.won

Ontslagen als een deal gesloten is.

crm.deal.lost

Ontslagen als een deal gesloten is.

crm.company.created

Ontslagen als een bedrijf wordt opgericht.

crm.task.created

Ontslagen wanneer een nieuwe taak wordt gecreëerd (handmatig of AI-gegenereerd).

email.replied

Ontslagen wanneer een contact antwoordt op een e-mail.

email.bounced

Ontslagen als een e-mail van de outreach stuitert.

💡
Oproep webhooks.events.list voor de gezaghebbende set op uw installatie, met de lading van elke gebeurtenis. Het wordt gegenereerd uit de leveringscode zelf, zodat het nooit kan oneens zijn met wat er daadwerkelijk aankomt. De volledige lijst verschijnt ook in de sectie Webhooks.

Alle webhook-gebeurtenissen zijn door HMAC ondertekend en opnieuw opgehaald bij storing. Schrijf een URL in Instellingen > Webhoks, of poll crm. events. list met since_id voor een duurzame veranderingsfeed.

CRM-contacten synchroniseren met Google Sheets

Scenario:
U wilt dat elk nieuw CRM-contact in een Google Sheet verschijnt voor uw marketingteam.
Wat te doen:

Een webhook-abonnee instellen vooropsiq.contact.upert. Wijs het aan een Google Apps Script webapp of een Zapier webhookURL. De lading omvat de contactnaam, e-mail, bedrijf, lead score en bron. Uw script voegt een rij naar het Google Sheet voor elk nieuw contact.

CRM

Segmenten

Segmenten besparen herbruikbare contactfilters voor CRM-weergaven, -uitreikingen, promoties en andere publieksbewuste tools.

Productscherm
SegmentenDe Segment editor combineert voorwaarden, toont de live match count en laat de exploitant een live filter of gepinde snapshot kiezen.SegmentenwerkbladMODELevendLOGICALLEMATCHES1,248LEVENDE WERKSPACE-ZICHTKlantenfaseis actief klantArtikelLaatste activiteitbinnen 30 dagenArtikelLandis gelijk aan Verenigd KoninkrijkArtikelHoge intentiescore ten minste 70Artikel1CHOOSE MODELive of snapshot2ADD RULESALLEN of ALLEN3REUSECampagnes en CRM
De Segment editor combineert voorwaarden, toont de live match count en laat de exploitant een live filter of gepinde snapshot kiezen.

A levend segment herrekent met de huidige gegevens wanneer deze worden gebruikt. A gepinde snapshot bevriest de huidige ledenlijst, wat nuttig is als een publiek na goedkeuring niet mag veranderen.

Kies ALLE wanneer elke voorwaarde moet overeenkomen of ALLE als één voorwaarde voldoende is. Bekijk de live telling voordat u opslaat. Systeemsegmenten kunnen zichtbaar zijn maar beschermd tegen gewone bewerking.

CRM

Loodscore

Lead-scoring regels maken gedrag en profiel signalen tot een consistente score die verkoop en automatisering kunnen gebruiken.

Productscherm
LoodscoreLoodscore toont actieve regels, het rolvenster en de positieve of negatieve score wijziging elke regel is van toepassing.LoodscorewerkbladREGELS12SCORED8,412HOT LEADS286LEVENDE WERKSPACE-ZICHTPrijsactiviteit3+ bezoeken in 14 dagen+20Sleutelwoord kopenbevat migratie of onderneming+15Steunrisicoklacht voorval in 30 dagen-10Vertrouwde bronverwijzing naar partners+121DESCRIBE RULEGebruik gewoon Engels2REVIEW FIELDSSignaal, venster, punten3RESCOREToepassen op werkblad
Loodscore toont actieve regels, het rolvenster en de positieve of negatieve score wijziging elke regel is van toepassing.

De AI regelbouwer kan een platte-Engelse instructie omzetten in een gestructureerde regel. Elke regel moet nog worden herzien voordat de activering: bevestig de activiteit of het sleutelwoord, minimum aantal, rolling window en score verandering.

Positieve en negatieve regels kunnen naast elkaar bestaan. Werkblad rescore na materiaalregelwijzigingen zodat bestaande contacten worden geëvalueerd onder het nieuwe model. Scores kunnen segmenten, routering, prospectie en workflow voorwaarden voeden.

CRM

Verkoopleiderbord

Het leaderboard vergelijkt vertegenwoordigers met quotaverwerving, won inkomsten, commissie en open pijpleiding voor de geselecteerde maand.

Productscherm
VerkoopleiderbordHet maandelijkse leaderboard ranglijst sales vertegenwoordigers terwijl het houden van won inkomsten, commissie en open pijplijn zichtbaar.VerkoopleiderbordwerkbladPERIODJuliTEAM QUOTA82%won€ 205kLEVENDE WERKSPACE-ZICHTAmina104% quota · £62k gewonnen1eBen.88% _quota · £51k gewonnen2eRita.76% quota · £ 43k gewonnen3eOpen pijpleiding£312k over teamEvaluatie1CHOOSE MONTHVergelijk één periode2CHECK QUOTABegeleiding door vertegenwoordiger3COACHContext van pijpleiding gebruiken
Het maandelijkse leaderboard ranglijst sales vertegenwoordigers terwijl het houden van won inkomsten, commissie en open pijplijn zichtbaar.

Quota bereiken is alleen zinvol wanneer elke vertegenwoordiger een huidige quota en deals hebben de juiste eigenaar, bedrag, valuta en nauwe status. Gebruik het leaderboard voor coaching en erkenning, niet als de enige kwaliteit maatregel; koppel het met omgaan gezondheid, activiteit en prognose nauwkeurigheid.

CRM

Goedkeuringen van de overeenkomst

Deal goedkeuringen vereisen manager afmelden voordat hoogwaardige aanbiedingen kunnen worden gemarkeerd gewonnen.

Productscherm
Goedkeuringen van de overeenkomstHet goedkeuringsbeleid definieert twee waardedrempels en de wachtrij toont hangende, goedgekeurde en afgewezen besluiten.Goedkeuringen van de overeenkomstwerkbladPOLICYIngeschakeldWAITING6OLDEST3hLEVENDE WERKSPACE-ZICHTNiveau 1Deals van £10,000ManagerNiveau 2Deals van £50,000OudereHernieuwing van het bedrijf£72,000 · opgevraagd door BenIn afwachtingMigratieproject£18,500 · opgevraagd door RitaGoedgekeurd1SET THRESHOLDS0 schakelt een tier uit2REQUESTAntwoord legt de overeenkomst voor3BESLUITAanvaarden of weigeren
Het goedkeuringsbeleid definieert twee waardedrempels en de wachtrij toont hangende, goedgekeurde en afgewezen besluiten.

Het beleid inschakelen en niveau instellen 1 en niveau 2 drempels. 0 Wanneer een niet-manager probeert om een deal te winnen op of boven de drempel, OpsIQ maakt een goedkeuringsverzoek in plaats van stil het stadium te veranderen.

Managers en volledige beheerders worden niet geblokkeerd door het beleid. Elke beslissing moet de aanvrager, goedkeurings-, tijd en reden voor auditability behouden.

CRM

Levenscyclusregels

Lifecycle regels verplaatsen automatisch contacten tussen fasen wanneer hun huidige gegevens overeenkomen met een opgeslagen voorwaarde.

Productscherm
LevenscyclusregelsLifecycle-regels worden per prioriteit beoordeeld; de eerste matchingregel verandert het contactstadium.LevenscyclusregelswerkbladActief7RUNSNachtelijkPRIORITYHoogste eerstLEVENDE WERKSPACE-ZICHTLood → Gekwalificeerdscore ≥ 60 en recente activiteitPrioriteit 100Gekwalificeerd → Klantaankoop-evenement bestaatPrioriteit 90Klant → Risicogeen activiteit gedurende 60 dagenPrioriteit 70Aan risico → Klantnieuwe aankoop of antwoordPrioriteit 601PICK STAGESVan en naar2DEFINE FILTERSegment-stijl JSON3ORDER RULESEerste wedstrijd wint
Lifecycle-regels worden per prioriteit beoordeeld; de eerste matchingregel verandert het contactstadium.

Elke regel heeft een bron-, bestemmings-, actieve vlag-, prioriteits- en segment-stijlfilter. De geplande levenslooptaak evalueert eerst hogere prioriteiten en stopt na de eerste match voor een contact.

Regels moeten wederzijds begrijpelijk zijn. Vermijd twee actieve regels die hetzelfde contact in tegengestelde richtingen kunnen bewegen tijdens dezelfde run. Test het filter tegen een segment voordat u dit activeert.

CRM

CRM-activiteitsstroom

De stream van de activiteiten op het werkruimte-gebied combineert klant- en operationele evenementen zodat teams kunnen onderzoeken wat er gebeurd is zonder elke module te openen.

Productscherm
CRM-activiteitDe activiteitsstroom laat chat, ticket, e-mail, webhook, conversie en anomalie gebeurtenissen met filters en paginatie.CRM-activiteitwerkbladGEBEURTENISSEN2,804CUSTOMERS1,126ANOMALIES14LEVENDE WERKSPACE-ZICHTGesprek opgelost[email protected] AINuTicket beantwoordT-1048 Facturering4mInkomende gebeurtenissubscription.upgraded12mOmrekeningOrde #7788 · £14919m1FILTEREvenement en klant2OPEN CONTEXTSpring naar het record3PAGE RESULTSOnderzoek beperken
De activiteitsstroom laat chat, ticket, e-mail, webhook, conversie en anomalie gebeurtenissen met filters en paginatie.

Filteren op type gebeurtenis, datum, contact of klantstatus (inclusief betalende klanten). De feed is een gelezen model van geregistreerde activiteit; het vervangt niet de bronkaart, conversatie, transactie of connector record. Open de gekoppelde record voordat u een gevoelige actie neemt.

CRM

Werkstromen

Werkstromen reageren op een gebeurtenis en voeren een geordende reeks acties uit, inclusief vertraagde stappen die door cron worden hervat.

Productscherm
WerkstromenEen workflow-run toont de trigger, voltooide acties, wachtvertraging en volgende stap.WerkstromenwerkbladActief9RUNNING42NIET ONTBRAND1LEVENDE WERKSPACE-ZICHTTriggercontact.createdBeginStap 1_E-mail met welkomstwoord sturenKlaarVertragingWacht 2 dagenWachtenStap 2_Verkooptaak aanmakenVolgende1CHOOSE TRIGGERGebeurtenis start de run2ORDER STEPSActies en vertragingen3MONITORDoorgaan met cron
Een workflow-run toont de trigger, voltooide acties, wachtvertraging en volgende stap.

Maak een workflow door de trigger te kiezen, stappen toe te voegen en in staat te stellen. Vertragingen worden opgeslagen, niet gehouden door een browser verzoek; de uniforme cron hervat due workstream draait.

Ingebouwde startsjablonen omvatten welkom na aanmelding, dank je wel voor de aankoop en demobevestiging. Kloon een template, vervang de ontvangers/content ervan, test vervolgens met een gecontroleerde record vóór brede activering.

Een nieuwe poging mag geen dubbele geld-moving verzoeken of dubbele records aanmaken.

Steun

Tickets

Tickets zijn je formele ondersteuningskanaal. Ze hebben afdelingen, prioriteiten, SLA-doelen, bijlagen, interne notities en volledige conversatie threading. Ticketten kunnen komen van de OpsIQ admin, ticket formulier/ingelijfd, e-mail inslikken, chat escalatie, connector, of API_.

Tickets
Kaartje detailEen ticket met een Meta zijbalk (prioriteit, afdeling, SLA, status), de conversatie draad en AI ontwerp en terugbetaling acties.KaartjewerkbladT-12345PrioriteitHoogAfdelingFactureringSLA3h 12m linksStatusOpenenIk werd twee keer aangeklaagd voor mijnabonnement op juni 3.AIBevestigd het duplicaatkosten, restitutie verwerking.Ontwerp-antwoord op de AITerugbetaling1THREADEDVolledige conversatie + notities2SLA & ROUTINGPrioriteit, diepte, tijd3AI DRAFTAntwoord geschreven voor u
Elk ticket draagt zijn prioriteit, afdeling, SLA timer en volledige draad, en de AI kan het antwoord voor u opstellen.

Hoe een ticket stroomt

1
Ticket arriveert

Een klant stuurt een bericht via e-mail, chat escalatie, ticket insluiten of de beheerder maakt er één aan. Het ticket krijgt een unieke ID (bijv. T-12345).

2
Triage

AI leest het onderwerp en lichaam, wijst prioriteit (Low/Normal/High/Urgent), suggereert een afdeling, en detecteert sentiment. Dit gebeurt automatisch als triage is ingeschakeld.

3
Antwoord

Een agent opent het ticket, leest de context (klantenprofiel, platformgegevens van connectors, eerdere tickets), en schrijft een antwoord. AI kan het antwoord opstellen, en de agent bewerkt voordat hij wordt verzonden.

4
Sluiten

Wanneer het probleem is opgelost, sluit de agent het ticket. De klant wordt op de hoogte gebracht. Als de klant antwoordt na sluiting, heropent het ticketje automatisch.

Per ticket

Veranderafdeling

Verplaats het ticket naar een andere afdeling (bijvoorbeeld van generaal naar Billing). Handig wanneer de oorspronkelijke routering verkeerd was.

Aan agent toewijzen

Geef het ticket aan een bepaald teamlid. De toegewezen agent ziet het kaartje in hun "Mijn tickets" weergave.

Interne notitie toevoegen

Schrijf een notitie die alleen zichtbaar is voor personeel. Gebruik voor: bevindingen van onderzoek, terugbetaling redenen, engineering context, eerdere toezeggingen. Interne notities nooit verschijnen aan klanten.

Kaarten samenvoegen

Combineer dubbele tickets van dezelfde klant. De samengevoegde ticketsubject krijgt een [MERGED] tag. Alle berichten van beide ticketjes worden bewaard in het resterende ticket.

Ingeblikte reactie

Een vooraf geschreven antwoordsjabloon invoegen. Variabelen zoals {{customer_name}} en {{ticket_id}} worden automatisch vervangen.

AI herschrijven

Laat AI uw concept antwoord verbeteren: pas toon aan, verkort/verlengen, grammatica repareren of vertalen. U bekijkt het resultaat voordat u het verzendt.

Prioriteit wijzigen

Laag, normaal, hoog of dringend. Prioriteit heeft invloed op SLA-timers en orde sorteren.

Status wijzigen

Instellen op Open, Afwachten, Wachten op Klant, Opgelost of Gesloten.

Werkt bijvoorbeeld: omgaan met een ongelukkige klant

Klantenmail: "Ik werd twee keer in rekening gebracht voor mijn abonnement"

Scenario:
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.
Wat te doen:

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.

Afdelingen

Creëer afdelingen in Instellingen > Tickets > Afdelingen. Gemeenschappelijke diensten: Algemeen, Facturering, Technisch, Verkoop, Misbruik, Onboarding. Elke afdeling kan verschillende auto-reply regels, AI kennis en team opdrachten hebben.

Ingeblikte reacties

Maak herbruikbare antwoordsjablonen in Instellingen > Tickets > Ingeblikte antwoorden. Goede ingeblikte reacties zijn onder meer:

Voorbeeld responssjabloon voor ingeblikte producten
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}}

Kaarten samenvoegen

Wanneer een klant dezelfde vraag meerdere keren verzendt (via e-mail en chat, of twee afzonderlijke e-mailadressen), kunt u de duplicaten samenvoegen. Ga naar het ticket, klik op Samenvoegen, selecteer het andere ticket om te mergen. Het resterende ticket krijgt alle berichten van beide tickets. De onderwerp van het samengevoegde ticket ontvangt een [MERGED] label om aan te geven dat het is gecombineerd.

Aangesloten platforms volgen de merge. Wanneer de tickets ook op een verbonden platform staan (WHMCS, Zendesk, het SaaS klantenportaal), de merge gebeurt daar ook: het platform voegt zijn kopieën samen, zodat het ticket dat u houdt toont eerste bericht van het samengevoegde ticket en antwoorden. Een samengevoegd ticket die nooit op dat platform is geweest heeft zijn gesprek toegevoegd aan het bewaarde platform ticket als een privé-personeelsbrief, nooit als antwoord wordt de klant gemaild. Een merge gedaan binnen het platform (bijvoorbeeld in WHMCS) voegt de OpsIQ Kaartjes op dezelfde manier.

Prioriteit en SLA

Laag

Niet-dringende vragen, functieverzoeken, algemene feedback. Doel eerste antwoord: 24 uren.

Normaal

Standaard ondersteuningsvragen. Eerste antwoord: 8 uren.

Hoog

Het beïnvloeden van de klant business. Doel eerste reactie: 4 uren.

Dringend

Service neer, beveiligingsincidenten, verlies van gegevens, factureringsfout. Doel eerste reactie: 1 uur.

SLA-timers starten wanneer het ticket is gemaakt en pauzeren als de status "Wacht op Klant" is. Als het doel van de SLA wordt gemist, wordt het ticketje gemarkeerd en eventueel verhoogd.

Kunnen klanten interne notities zien?+

Nooit. Interne notities zijn strikt alleen personeel. Ze verschijnen niet in het klantenkaartportaal, e-mail notificaties of een klantgerichte oppervlakte.

Wat gebeurt er als een gesloten ticket wordt beantwoord?+

Het ticket wordt automatisch heropend en keert terug naar de actieve wachtrij. Het team wordt op de hoogte gebracht van het nieuwe antwoord.

Kan ik een ticket vergrendelen om verdere antwoorden te voorkomen?+

Ja. Gebruik de optie Lock Thread om te voorkomen dat zowel klant als AI nieuwe antwoorden toevoegt. Handig voor geschillenbeslechting of gesloten onderzoeken.

Steun

Service Studio: SLA, status stroom en kwaliteit

De controleruimte voor hoe uw ondersteuningsoperatie zich gedraagt: SLA-beleid met escalatieladders, bedrijfsurenkalenders, een gedwongen statusstroom, CSAT-instellingen en de ondernemingsfunctieschakelaars. Open het vanaf de Tickets pagina (de Service Studio knop in de operatiebalk).

SLA-beleid

Elk nieuw ticket krijgt een eerste antwoord en een resolutie deadline van het meest specifieke actieve beleid: afdeling + prioriteit beats departement, verslaat prioriteit, versloeg de standaard. Deadlines pauzeren automatisch terwijl een ticket in afwachting of On wacht zit.

Roltraps

Instead of one breach action, a policy can define up to six steps: for example warn the assignee at 75% of the window, alert managers at 100%, reassign to a named agent at 150%. Each step fires exactly once per ticket.

Openingstijden en agenda's

Met de openingstijden van het bedrijf branden SLA-klokken alleen tijdens werktijd, zodat een ticket dat vrijdagavond geopend wordt niet doorgaat op zaterdag. Genoemde kalenders (tijdzone, dagen, uren, vakantie) kunnen worden gekoppeld aan individuele beleidsmaatregelen voor teams in verschillende regio's.

Statusstroom

Een van/naar matrix beperkend welke statuswijzigingen beheerders kunnen maken, met een Zendesk-stijl preset. Automatisering, inkomende e-mail en klantgerichte ticketantwoorden zijn altijd vrijgesteld, zodat een strikte matrix de pijplijn nooit kan blokkeren. Optioneel vereist u een goedgekeurde afmelding voor het sluiten.

Goedkeuringen

Agenten vragen afmelding op een ticket (terugbetalingen boven een drempel, policy exceptions). Een erkende ontwikkelaar of iedere volledige beheerder besluit met een nota; verzoekers kunnen nooit hun eigen aanvraag goedkeuren. In afwachting van goedkeuring oppervlak als banner op de inbox.

Ticketrelaties

Koppel tickets als gerelateerd, dupliceren, ouder/kind of blokkeren; split replieken op een nieuw gekoppeld ticket (de omgekeerde van merge, zonder e-mailen van de klant); volg ticket voor in-app notificaties en eventueel CC follower e-mailadressen op uitgaande antwoorden.

Live inbox en botsingen

Met de real-time postvak IN worden nieuwe tickets en antwoorden voor agenten binnen enkele seconden via de bestaande berichtenstroom weergegeven. Op een ticket zien agenten wie er nog meer wordt bekeken en krijgen ze een waarschuwingsbanner wanneer een teamgenoot al antwoord schrijft. Een éénklik op Claim knop wijst het ticket aan jezelf toe.

AI-bewuste routering

De regels van de Routing kunnen overeenkomen met die van AI triage signalen: prioriteit, categorie, sentiment en escalatierisico, plus getypte op maat gemaakte veldwaarden uit uw aanvraagformulier voor portal. Regels met deze voorwaarden blijven slapen totdat de functie is ingeschakeld.

💡
Elke onderneming schakelt schepen uit. In Service Studio → Kwaliteit & Automatisering is de opt-in; ze uit laten blijft gedrag identiek aan voordat de upgrade.
Waarom kan een klant nog steeds een gesloten ticket heropenen als mijn matrix sluit → open?+

De matrix regelt alleen ADMIN acties. Klantgeorienteerde antwoorden, e-mail reacties en automatisering zijn opzettelijk vrijgesteld zodat een streng beleid nooit klanten kan vergrendelen of breken de pijpleiding.

Vervangen SLA-ladders de oude inbraakactie?+

Nee. Beleidsredactie met één enkele inbreuk blijft ongewijzigd werken. Een ladder vervangt de enige actie alleen op beleidsgebieden waar u stappen definieert.

Steun

Automatisch antwoord en escalatie van tickets

Automatisch antwoord laat de AI automatisch reageren op nieuwe tickets. Escalation verplaatst ticket naar een andere afdeling wanneer de KI speciale behoeften detecteert. Beide functies werken over inheemse ticket en e-mail-gemaakte ticket.

Automatisch antwoord
Ticket automatisch antwoordEen stroom: nieuw ticket, twee minuten vertraging, AI antwoordt vanuit kennis en context, dan verzonden of opgeslagen als een concept.Automatisch antwoordwerkbladWanneer een nieuw ticket aankomtNieuw ticketelke bronVertraging2 minAI-antwoordenKB + contextVerzondenof ontwerpAls een mens antwoordt tijdens de vertraging, automatisch antwoord wordt geannuleerd. Intent kan escaleren naar een andere afdeling eerst.1DELAYMensen krijgen de eerste kans.2AI REPLIESVan KB + context3OR ESCALATERoute op intentie
Nieuwe tickets krijgen een korte vertraging (zodat mensen kunnen springen in), dan een AI antwoord uit uw kennis, verzonden of wachtrij als concept.

Hoe automatisch antwoord werkt

1
Ticket verschijnt

Een nieuw ticket wordt gemaakt van elke bron (e-mail, chat, portal, API).

2
Schema-antwoord

OpsIQ wacht op de ingestelde vertraging (standaard: 2 Dit geeft menselijke agenten de kans om eerst te reageren.

3
Eerste antwoord wint

Als een menselijke agent antwoordt tijdens de vertraging, wordt automatisch antwoord geannuleerd. Zo niet, dan genereert de AI een antwoord.

4
Genereren en verzenden

De AI leest het ticket, controleert kennisbasis, connector context en klantgeschiedenis, schrijft dan een antwoord. Het antwoord wordt verzonden (of wachtrij als concept voor beoordeling, afhankelijk van de instellingen).

Hoe escalatie werkt

1
Afdelingen configureren

Stel in welke afdelingen escalaties kunnen ontvangen (bijvoorbeeld, Billing kan worden verhoogd van General, Technical kan worden geëscaleerd van General).

2
Classificeren van het ticket

Voordat auto-replying, de AI classificeert het ticket intentie: facturen, technische, terugbetaling, misbruik, enz.

3
Indien nodig verplaatsen

Als de ticket intentie overeenkomt met een escalatie afdeling, wordt het ticket verplaatst. Een interne notitie verklaart waarom.

4
Genereren in nieuwe stem

Het antwoord wordt gegenereerd met behulp van de kennis en AI training van de bestemmingsafdeling.

Instellingen

Automatisch antwoord ingeschakeld

Schakel de hoofdschakelaar in om automatisch antwoord op tickets mogelijk te maken.

Toegestane diensten

Welke afdelingen kunnen automatisch antwoorden ontvangen. Begin met de afdeling risico's (General, Sales) voordat u facturering mogelijk maakt.

Vertraging

Hoe lang moet ik wachten voordat de AI antwoordt (in seconden). Standaard: 120 seconden (2minuten).0voor onmiddellijke antwoorden.

Vertragingsschema

Stel optioneel verschillende vertragingen in voor kantooruren vs. na uren.

Stop met admin antwoord

Als een menselijke agent als eerste antwoordt, annuleer dan het automatisch antwoord. Standaard: aan.

Rolverdeling ingeschakeld

Schakel automatische afdeling routering op basis van ticket intentie.

Afdelingen voor de roltrap

Naar welke afdelingen tickets kunnen worden geëscaleerd.

Escalatiestatus

Welke status moet worden ingesteld bij escaleren (bijv., Openen, In afwachting).

Escalatie-noot

Of er een interne noot moet worden toegevoegd die de escalatiereden verklaart.

E-mail tickets

Tickets die zijn gemaakt van e-mail (via mailbox polling of MX-piped delivery) volgen dezelfde auto-reply en escalatie regels. Het antwoord van AI wordt verzonden als een e-mailadres aan de klant. E-mailontwerpen gaan naar de concept wachtrij voor beoordeling indien geconfigureerd.

Zal de AI automatisch reageren op factureringsvragen?+

Alleen als u automatisch antwoord voor de afdeling Facturering inschakelt. Wij raden aan om te beginnen met automatische reactie op facturen en deze pas mogelijk te maken nadat u de AI hebt opgeleid met uitgebreide facturatiekennis en grondig heeft getest.

Wat als de AI een verkeerd antwoord geeft?+

Als een klant antwoordt dat het antwoord verkeerd was, moet een menselijke agent ingrijpen. Bekijk AI Geschiedenis om te begrijpen waarom de AI gaf het verkeerde antwoord, dan update de kennisbasis of AI training om te voorkomen dat het opnieuw gebeurt.

Kan ik auto-antwoorden beoordelen voordat ze verzonden worden?+

Ja. Stel de leveringsmodus in op "Draft" in plaats van "Auto-verzenden." Automatisch antwoord wordt opgesteld in de Concepten wachtrij voor menselijke beoordeling vóór het verzenden.

Steun

Ticketportaal ingesloten

Met het ticketportaal kunt u een interface voor kaartbeheer toevoegen aan elke website. Klanten kunnen hun tickets bekijken, nieuwe maken en antwoorden zonder de OpsIQ beheerder in te voeren.

Hoe het werkt
Ticketportaal ingeslotenEen support portal ingebed in een website met hun eigen tickets en een nieuwe knop.yoursite.com/supportOndersteuningscentrumNieuw ticketUW TICKETS#1042 · RestitutievraagOpenen#1038 · Hulp instellenOpgelost#1031 · FactuurkopieIn afwachting1EMBEDToevoegen aan elke site2SELF-SERVEKlanten zien hun tickets3NO LOGINIdentiteit veilig afgehandeld
Ticketportaal ingesloten

Drie inbedsmaken

Inline inbed

Stuurt het ticketportaal in een div op uw pagina. Het portaal neemt de volledige breedte van zijn container.

Zwevend widget

Toont een drijvende knop die het ticketportaal opent in een panel. Gelijkaardig aan een chat-widget.

Aangemeld

Vereist een ondertekend identiteitskaartje. Klanten zien alleen hun eigen tickets.

Installatie

Ticket en chat insluiten
<!-- 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.

Identiteitsteken generatie

Voor de geauthentificeerde modus tekent uw server een kortlevend token met het sitegeheim. Dit token vertelt OpsIQ wie de klant is, zodat ze alleen hun eigen tickets zien. Het is een standaard HS256 JWT: elke JWT bibliotheek werkt. Het geheim gaat nooit in een pagina.

PHP · identiteitsteken genereren
<?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, identiteitsteken genereren
// 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 });
}

Eigenschappen van widget

Kaartenlijst

Doorzoekbare, status-gefilterde lijst. Een "Wacht op je" markeert vlaggen tickets die het team heeft beantwoord.

Getwist gesprek

Volledige conversatieweergave met rijke tekst, bijlagen en tijdstempels.

Ontwerp autosave

De antwoorden van de klant concept worden automatisch opgeslagen, zodat ze niet verliezen werk als ze weg navigeren.

Live poll

De widget polls voor nieuwe antwoorden elke ~12 seconden.

Oplossen / heropenen

Klanten kunnen hun eigen tickets met één klik opzeggen of heropenen.

Interne noten worden NOOIT getoond aan klanten in het ticket. Dit is een harde veiligheidsgrens.
Steun

Chat-inbox

De Chat Inbox is waar uw team live klantengesprekken beheert. Het toont actieve chats, toegewezen gesprekken, AI-gespreksen en gearchiveerde geschiedenis.

Chat-inbox
Chat-inboxEen drie-panelen agent chat inbox: conversatielijst, het live gesprek met een AI concept chip en een bezoeker/CRM context panel.Chat-inboxwerkbladJDJaneWaar is mijn bestelling?MOMensahfactureringsvraagNT1Rita.AI behandeldWaar is mijn bestelling?Vandaag verzonden · UPSAI ontwerp klaarAntwoord...BEZOEKERSVERZOEKJane DoeUS · Chroom3 bestellingen in het verledenLTV $480CRMFase: klant1UNIFIEDElke live chat2CONTEXTBezoeker + CRM-paneel3AI ASSISTConcept & herschrijven
Een inbox voor elke live chat, gesprekslijst, de thread met AI-ontwerp op tik en volledige bezoeker + CRM context.

Gesprekken beheren

Actieve chats

Gesprekken zijn momenteel gaande. Groene stip = klant is aan het typen of onlangs actief.

AI-afgehandeld

Gesprekken waarin de AI reageert. U kunt het op elk moment overnemen door te klikken op "Join."

Aan mij toegewezen

Gesprekken die specifiek aan jou zijn toegewezen.

Wachten

Gesprekken waar de klant wacht op een reactie.

Archief

Gesprekken afgerond. Zoeken op sleutelwoord, datum en klant.

Aflevering van AI naar mens

Als je een gesprek van de AI overneemt, volg dan deze drie regels:

1
Persoonlijk groeten

Stel jezelf voor bij naam. "Hallo, dit is Sarah van het ondersteuningsteam."

2
Referentiecontext

Laat zien dat je het gesprek gelezen hebt. "Ik zie dat je gevraagd bent naar de status van je bestelling."

3
Verwachtingen stellen

Vertel de klant wat er nu gebeurt. "Ik ben hier nu naar op zoek en zal binnen een paar minuten een antwoord voor je hebben."

AI-in/uitschakelen per gesprek

Gebruik de AI-schakelaar aan het begin van elk gesprek. Wanneer AI is ingeschakeld, genereert de KI reacties. Als er geen AI beschikbaar is, kunnen alleen menselijke agenten reageren. De AI herinnert zich de conversatiecontext zelfs wanneer deze wordt uitgeschakeld en weer wordt ingeschakeld.

Afwezigheid modus / buiten de uren

Configureren van openingstijden in Instellingen. Buiten kantooruren kan de AI: (1) Blijf reageren op klanten, (2) Toon een "afwezig" bericht en maak een ticket voor de follow-up, of (3) Schakel de chat volledig uit en toon het ticketformulier. Kies het gedrag dat past bij uw supportmodel.

Moeilijke gesprekken verwerken

1
Blijf kalm.

Kom niet overeen met de emotionele intensiteit van de klant. Beken hun frustratie zonder defensief te zijn.

2
Verzamel feiten

Voor u reageert, verzamel de relevante informatie: bestelgegevens, rekeningstatus en eerdere tickets.

3
Vroeg schalen

Als de situatie betrekking heeft op terugbetalingen, juridische bedreigingen, misbruik of veiligheid, escaleren naar een senior teamlid in plaats van proberen om het alleen te behandelen.

Kan ik een teamchat (agent tot agent) hebben?+

Ja. Gebruik interne notities in een gesprek om met andere agenten te communiceren. Deze aantekeningen zijn nooit zichtbaar voor de klant.

Wat gebeurt er als ik een gesprek sluit?+

Het gesprek gaat naar het archief. Als de klant later een nieuw bericht stuurt, wordt er een nieuwe conversatie aangemaakt.

Steun

Berichtkanalen

Verbind WhatsApp, Facebook Messenger, Instagram DM, Telegram en LINE zodat de berichten die klanten al sturen u in dezelfde postvak IN als uw website chat, beantwoord door dezelfde AI assistent.

Elk kanaal gedraagt zich identiek als het eenmaal is verbonden: een klantbericht wordt een gesprek in de Chat Inbox, uw assistente beantwoordt het met dezelfde kennis en instructies als uw websitechat, en elke agent kan het overnemen. Niets over uw AI hoeft per kanaal te worden geconfigureerd.

Hoe verbinding eruit ziet

Facebook-boodschapper & Instagram

Een klik. Open Connectors → Facebook Messenger & Instagram DM, klik op Verbinden, aanmelden met het FaceBook-account dat uw pagina beheert en kies de pagina. Insta gram wordt meegeleverd wanneer uw pagina een professionele account van Instagrammen heeft gekoppeld.

WhatsApp

Eén klik waar uw provider het aanbiedt: open de Messaging Hub connector en gebruik Connect WhatsApp, volg vervolgens Meta's geleid aanmelden om te kiezen of maak je Whatsapp Business nummer. Anders plak referenties van een van 20 gateways.

Telegram

Twee minuten. Bericht @BotFather in Telegram, stuur /newbot, kies een naam en een gebruikersnaam eindigend op "bot," en plak de token die het geeft u in de Telegra-connector. OpsIQ registreert de webhook voor je.

LIJN

Een bericht aanmaken API kanaal op ontwikkelaars.line.biz, plak het Kanaal geheim en toegang token, dan kopieer de webhook URL weergegeven in OpsIQ in LINE en schakel zijn eigen auto-antwoorden uit.

SMS

Voeg een provider (Twilio, Vonage, Termii en anderen) in de Messaging Hub met zijn referenties en afzender nummer.

Elke connector toont zijn eigen stap-voor-stap instructies in de lade, inclusief precies wat te kopiëren en waar. Je hebt nooit ontwikkelaar referenties nodig voor de één-klik opties.

Een kanaal aan zetten

Een kanaal verbinden start niet. Ga naar Instellingen → Klantenchat → Geavanceerd → Kanalen voor berichten, schakel de master toggle en vervolgens het individuele kanaal. Elk kanaal heeft zijn eigen AI auto-reply switch, zodat u kunt pilot op een voordat de rest te openen.

1
Kanaal verbinden

In Connectors, met behulp van de instructies in die connector lade.

2
Test de verbinding

Klik Test. Het maakt een echte oproep naar de provider en vertelt u wat er mis is als iets is.

3
Berichtkanalen inschakelen

Instellingen→Klantenchat→Zet de hoofdschakelaar aan, dan het kanaal.

4
Stuur jezelf een bericht

Van een ander account, bericht uw pagina, nummer of bot. Het moet binnen enkele seconden in de Chat Inbox verschijnen en een AI-antwoord krijgen.

Vensters beantwoorden

Messagingplatforms beperken hoe lang een bedrijf mag antwoorden nadat een klant schrijft. OpsIQ toont de resterende tijd op elk gesprek en handhaaft de regel voor u.

WhatsApp

24 Uren van het laatste bericht van de klant. Daarna mag u alleen een goedgekeurde sjabloon verzenden, die u in hetzelfde tabblad Advanced configureert.

Boodschapper & Instagram

24uur voor normale antwoorden; de agenten kunnen tot7dagen later onder Meta's human-agent toelage.

Telegram, LIJN, SMS

Geen raam met platforms.

⚠️
Als een antwoord mislukt omdat het venster gesloten is, toont de conversatie waarom. Dit is een platformregel, geen OpsIQ limiet.

Gemeenschappelijke vraagstukken

Zien klanten dat een AI antwoordt?+

Alleen als je het hen vertelt. Het antwoord komt van uw pagina, nummer of bot precies zoals een menselijk antwoord zou doen. Uw AI instructies controleren de toon en of het zich identificeert.

Kan een agent het midden-gesprek overnemen?+

Ja. Open het gesprek in de Chat Inbox en klik op Join. De AI stopt, u typt, en de klant ziet een continue draad aan hun kant.

Wat als ik een kanaal loskoppel?+

Gebruik Verbinding verbreken op de connector. Berichtgeschiedenis wordt bewaard; nieuwe berichten stoppen gewoon met binnenkomen, en het platform wordt verteld om te stoppen met verzenden van hen.

Kunnen twee werkruimten dezelfde Facebook pagina gebruiken?+

Nee. Een pagina behoort tot één werkruimte per keer. Het ergens anders verbinden beweegt, en de eerste werkplek stopt met het ontvangen van berichten, dus sluit bewust af in plaats van elders opnieuw verbinding te maken.

Steun

Echte chatgesprekken

Deze voorbeelden laten zien hoe een goed opgeleide klant AI met veelvoorkomende scenario's om moet gaan. Gebruik ze om uw AI training te testen en hiaten te identificeren.

10 Voorbeelden van gesprekken

1. Klant terugsturen vragend naar bestelling

Scenario:
Klant: Hoi, ik heb een bestelling geplaatst 3 dagen geleden en nog geen verzendbericht ontvangen. Bestel #ORD-5523_.
Wat te doen:

De AI moet: (1) Zoek bestelling #ORD-5523 door de connector. (2) Rapporteer de huidige status en tracking-informatie indien beschikbaar (3) Indien de bestelling wordt uitgesteld, moet u de vertraging erkennen en een geschatte tijdlijn aangeven (4) Verzin GEEN verzendstatus als de stekker er geen heeft.

2. Vooruitzichten vragen over prijzen

Scenario:
Klant: Hoeveel kost uw Pro-plan? Biedt u jaarlijkse facturering aan?
Wat te doen:

De AI moet: (1) Antwoord uit de kennisbasis met huidige prijsstelling (2) Leg het verschil uit tussen maandelijkse en jaarlijkse facturering. (3) Als het antwoord niet in de kennisbasis ligt, zeg dat dan en bied aan hen te verbinden met verkoop. (4) Verzin GEEN prijzen die niet in de kennisbasis liggen.

3. Boze klant eisen terugbetaling

Scenario:
Klant: Dit is belachelijk! Uw product werkt niet en ik wil mijn geld NU terug.
Wat te doen:

De AI moet: (1) Erken de frustratie kalm. (2) Vraag naar het bestelnummer of de e-mail van een account. (3) Leg het terugbetalingsproces uit. (4) Maak een support ticket of escaleer naar een menselijke agent. (5) Beloof NIET een terugbetaling, dat vereist menselijke goedkeuring.

4_. Dubbele facturering rand geval

Scenario:
Klanten: Ik ben twee keer in rekening gebracht deze maand. Mijn bank toont twee kosten van $29.99.
Wat te doen:

De AI moet: (1) Erken de bezorgdheid. (2) Verzamel de relevante gegevens (e-mail, data van kosten). (3) Leg uit dat factureringsproblemen een menselijke beoordeling vereisen. (4) Maak een Billing afdeling ticket met de details. (5) Stel prioriteit aan High.

5_. Meertalige klant

Scenario:
Klant: Bonjour, je voodrais savoir si vous livrez en France?
Wat te doen:

De AI moet: (1) Reageer in de taal van de klant als deze taal wordt ondersteund. (2) Antwoord op de vraag over levering aan Frankrijk vanuit de kennisbasis (3) Als de taal niet wordt ondersteund, antwoord dan in de standaardtaal en vermeld welke talen beschikbaar zijn.

6. Na-uren gesprek

Scenario:
Klant: Hallo, is daar iemand? Ik heb hulp nodig met mijn account.
Wat te doen:

De AI moet: (1) Indien geconfigureerd voor na-uren AI, reageren en helpen. (2) Als na-uren tickets maken, zeg dan: "Ons team is momenteel offline. Ik heb een support ticket voor u en iemand zal volgen tijdens kantooruren." (3) Vermeld het ticketnummer.

7. Vergelijker voor aankoop

Scenario:
Klant: Hoe vergelijkt uw product met [Competitor X]?
Wat te doen:

De AI moet: (1) Beschrijf de sterke punten van uw product feitelijk. (2) Doe geen kwaad over de concurrent. (3) Als er een vergelijkingspagina in de kennisbasis, link ernaar. (4) Als de klant vraagt naar functies die je niet hebt, wees eerlijk.

8_. Klant wil een aanbeveling

Scenario:
Klant: Ik heb een kleine online winkel met ongeveer 100 bestellingen per maand. Welk plan is goed voor mij?
Wat te doen:

De AI moet: (1) Vraag indien nodig vragen te verduidelijken (bv. welke kenmerken het meest van belang zijn). (2) Beveel een plan aan op basis van de kennisbasis. (3) Leg uit waarom dat plan aan hun behoeften voldoet. (4) Vermeld dat ze kunnen beginnen met een kleiner plan en later upgraden.

9_. Klant probeert een onbevoegde korting te krijgen

Scenario:
Klant: Ik zag online die je geeft 50% Mag ik er een?
Wat te doen:

De AI moet: (1) Beleefd uitleggen van de huidige promoties als er bestaan. (2) Maak GEEN kortingen of beloftes die niet in de kennisbasis liggen. (3) Als de klant blijft, bieden aan om hen te verbinden met het verkoopteam.

10_. Klant heeft hulp nodig met een functie

Scenario:
Klant: Hoe exporteer ik mijn gegevens? Ik kan de exportknop niet vinden.
Wat te doen:

De AI moet: (1) Geef stapsgewijze instructies van de kennisbasis. (2) Inclusief het exacte paginapad en de locatie van de knop (3) Als de functie een specifiek plan vereist, vermeld dat (4) Als de functie niet bestaat, wees eerlijk en stel alternatieven voor.

Steun

Chatroutering en escalatie

Wanneer een live chat een echte persoon nodig heeft, beantwoordt de AI twee vragen: welk team is eigenaar van dit gesprek en wie moet worden verteld. Beide zijn ingesteld in Instellingen, Client Chat, Support Flow, onder AI-routing afdelingen.

Kiezen welke afdelingen de AI mag gebruiken

De twee vakjes in dat paneel zijn een whitelist. Afdelingen die naar rechts verplaatst worden, zijn de enige waarnaar de AI kan routen of tickets kan openen. Alles wat links blijft is onzichtbaar voor het systeem, zelfs als de afdeling bestaat en er personeel aanwezig is.

💡
Als er geen afdeling is ingeschakeld, dan valt OpsIQ terug naar de legacy routering over elke afdeling die het kan vinden. Behandel dat als een vangnet, niet als configuratiekeuze.

Wie krijgt de escalatie

Dit is het deel dat de meeste mensen verwachten te configureren en niet nodig. Wanneer de AI escaleert een chat, OpsIQ e-mails van de mensen die aan die afdeling. U beheert die lijst eenmaal, op de Team en Departments pagina, en zowel ticket escalatie en chat escalatie volg het.

Leden van het afdelingsteam

Elke actieve admin die bij de afdeling is aangesloten ontvangt zijn eigen exemplaar. Geschorste en gehandicapte accounts worden overgeslagen.

Primaire toediening

Gebruikt als geen teamleden zijn aangesloten, dus een escalatie bereikt nog steeds iemand.

Niemand gehecht

De routing panel markeert dat afdeling in het rood en de AI niet vertellen aan de bezoeker een mens werd ingelicht.

⚠️
Het eigen e-mailadres van een afdeling wordt bewust nooit als ontvanger gebruikt. Dat adres is de inkomende ticketpostbus van het departement, die ene binnenkomende post wordt vergeleken met open tickets. Een escalatie die daar naartoe gestuurd wordt zou eerder teruggesluisd worden dan iemand bereiken.

De catch-all afdeling

Precies één afdeling draagt het vangteken. Het ontvangt chats die de AI niet zelfverzekerd kan plaatsen, en het is een laatste redmiddel in plaats van het normale pad.

1
Duidelijke signalen winnen

De formulering van de facturering gaat naar een afdeling facturen, hosten en foutwoorden in een technische tekst, die tekst koopt bij verkoop.

2
De AI classifier probeert volgende

Als trefwoorden niet overtuigend zijn, leest het model de conversatie en kiest uit de actieve afdelingen.

3
Dan de vangst-all

Pas als beide leeg komen, ontvangt de catch-all afdeling het gesprek.

4
De verkoopbewaker

Als de catch-all is een verkoopafdeling en de bezoeker toonde geen koopsignaal, OpsIQ zoekt in plaats daarvan naar een ondersteuning of technische afdeling, zodat gewone support vragen niet zich ophopen in Sales.

Wat de bezoeker wordt verteld

Als de escalatie e-mail gaat, vertelt de AI aan de bezoeker dat het team is ingelicht. Als het niet kan gaan, zegt de KI iets eerlijks en nodigt hen uit om het bericht in te laten in de chat plaats. Het zal niet beweren een mens werd gewaarschuwd wanneer geen e-mailadres werd verzonden.

Het panel zegt "Niemand te melden" voor een afdeling+

Niemand is eraan verbonden. Open Team en afdelingen, voeg ten minste één actieve admin toe en herlaad vervolgens de instellingen pagina. Het paneel leest live.

Kunnen chat-escalaties ergens anders heen dan het team?+

Ja. Een aangepast adres dat eerder is opgeslagen voor een afdeling die de teamlijst nog overschrijft. Nieuwe instellingen moeten mensen aan het departement koppelen, dus er is één plek om te onderhouden.

Waarom is mijn vangst-alles overgeslagen?+

Controleer of het een verkoopafdeling is. Als dat zo is, en de bezoeker toonde geen koopsignaal, OpsIQ routes naar een ondersteunings- of technische afdeling met opzet.

Steun

E-mail mailboxen en -concepten

OpsIQ kan verbinding maken met e-mail mailboxen om automatisch tickets aan te maken van inkomende e-mailadressen en antwoorden als e-Mail te versturen. Het biedt ook AI-geformuleerde antwoorden voor menselijke beoordeling.

E-mail
E-mail naar ticketEen IMAP mailbox aan de linkerzijde die inkomende e-mails naar een ticket met schroefdraad voert, met rechts een door AI opgesteld antwoord.E-mailwerkblad[email protected] · IMAPAanvraag om terugbetaling[email protected]_Kan niet aanmelden[email protected]Factuurkopie[email protected]Kaartje #_1042van e-mail · FactureringIk zou graag een terugbetaling willen voor dedubbele lading...AI-ontwerpReageer antwoord & versturen1INGESTIMAP & Doorsturen in2TO TICKETSAutomatisch Threaded3AI DRAFTSAntwoorden op het onderzoek
Trek e-mail in over IMAP (of doorsturen), zet elk in een draadloos ticket, en laat de AI het antwoord voor herziening.

Een mailbox verbinden

Protocol

IMAP (meeste aanbieders), Gmail API (Google Workspace), of Microsoft Graph (Outlook) 365).

Instellingen

Host, poort, encryptie (SSL/TLS), gebruikersnaam, wachtwoord of app-wachtwoord, map (meestal INBOX).

Afdelings mapping

Map de mailbox naar een ticketafdeling. E-mails om [email protected] kaarten te maken in de afdeling "Ondersteuning."

Gmail-instellingen (stap voor stap)

1
2-Stapverificatie inschakelen

Ga naar Google Account > Beveiliging > 2-Stap Verificatie en schakel het in.

2
Een App-wachtwoord aanmaken

Ga naar Google Account > Beveiliging > App wachtwoorden. Selecteer "Mail" en "Andere (OpsIQ)" te bevestigen. 16 Wachtwoord.

3
Binnengaan in OpsIQ

Ga naar E-mail > Postvakken > Toevoegen. host instellen: imap.gmail.com, haven: 993, encryptie: SSL, gebruikersnaam: [email protected], wachtwoord: het app-wachtwoord.

4
Test

Klik op Testverbinding. Indien succesvol, OpsIQ zal beginnen met polling voor nieuwe e-mails in het geconfigureerde interval.

Outlook 365

1
Controleer IMAP is ingeschakeld

In Outlook-instellingen > E-mail > Synchronisatie van e-mail, zorg ervoor dat IMAP is ingeschakeld.

2
Gebruik app-wachtwoord of moderne auth

Als MFA is ingeschakeld, maak dan een app-wachtwoord. Gebruik anders uw gewone wachtwoord.

3
Binnengaan in OpsIQ

Host: outlook.office365.com, haven: 993, encryptie: SSL, gebruikersnaam: [email protected].

cPanel webmail setup

1
IMAP _instellingen zoeken

In cPanel > E-mailaccounts, klik op uw e-mailadres voor IMAP instellingen.

2
Binnengaan in OpsIQ

Host: meestal mail.yourdomain.com of uw serverhostnaam, poort: 993 (SSL of 143 (STARTTLS), gebruikersnaam: volledig e-mailadres.

AI e-mail ontwerpen

Wanneer automatisch antwoord wordt ingesteld op "Draft" modus, genereert de AI antwoorden die in de Concepten wachtrij verschijnen. U kunt:

Evaluatie

Lees de ontwerp en controleer op nauwkeurigheid.

Bewerken

Wijzig de tekst, toon of inhoud voordat u deze verstuurt.

Verzenden

Het ontwerp goedkeuren en het als e-mailbericht verzenden.

Gooien

Het ontwerp schrappen indien dit niet passend is.

Automatisch verzenden

Als het vertrouwen hoog genoeg is en automatisch verzenden wordt ingeschakeld, worden de ontwerpen automatisch verzonden na een configureerbare vertraging.

Waarom worden e-mails niet omgezet naar tickets?+

Controle: (1) Is de mailbox verbonden en gezond? Zoek naar groene status in e-mail > Mailboxen. (2Is de cron job loopt? E-mail polling vereist cron. (3Wordt de e-mail gefilterd of verplaatst naar een andere map dan INBOX?

Kan ik meerdere mailboxen gebruiken?+

Ja, elke mailbox kan worden in kaart gebracht naar een andere afdeling. [email protected] gaat naar Ondersteuning, [email protected] gaat naar Billing.

Steun

Tevredenheid van de klant (CSAT)

CSAT meet ticket en praattevredenheid, geeft ongelukkige reacties en vergelijkt AI met menselijke uitkomsten.

Productscherm
Tevredenheid van de klantDe CSAT pagina combineert scorekaarten, de opvolging van tegenstanders, opmerkingen, afdeling en agent breakdowns en chatfeedback.Tevredenheid van de klantwerkbladANTWOORDEN386AVERAGE4.6POSITIVE91%LEVENDE WERKSPACE-ZICHTFollow-up van de detector12 respons beoordeeld1–2EvaluatieTicketenquêtesVerzonden 24h na sluitenAutomatischTerugkoppeling van chatAI 4.5 · Menselijk 4.7VergelijkenAgentzichtScore- en responsgetalCoach1WATCH AVERAGETrend gebruiken, geen score2FOLLOW DETRACTORSLees het commentaar3COMPARE FAIRLYAI en mens
De CSAT pagina combineert scorekaarten, de opvolging van tegenstanders, opmerkingen, afdeling en agent breakdowns en chatfeedback.

Ticketenquêtes zijn gepland na sluiting (normaal gesproken 24 Een positieve respons is een score van4of 5. Gebruik de wachtrij voor scores van 1 of2en lees het ticket/gesprek voordat u contact opneemt met de klant.

Chat feedback wordt afzonderlijk gerapporteerd voor AI-opgeloste en door mensen behandelde gesprekken. Lage steekproefgroottes mogen niet worden gebruikt om agenten of modellen te rangschikken.

Steun

E-mailuitzendingen van teams

De pagina Email Platform laat een geautoriseerde exploitant eenmalig bericht sturen naar alle actieve agenten, geselecteerde agenten of een afdeling en de geschiedenis van het verzenden beoordelen.

Productscherm
E-mailplatformDe team e-mail componist toont het publiek, onderwerp, bericht en verleden aflevering geschiedenis.E-mailplatformwerkbladHULPSTOFFEN12DELIVERED11NIET ONTBRAND1LEVENDE WERKSPACE-ZICHTPubliekAlle actieve agentiaGeselecteerdOnderwerpSteunrooster juliKlaarBerichtSchema en escalatie notesKlaarGeschiedenisVorige uitzendingen en resultaatBeeld1CHOOSE PEOPLEAlle, geselecteerd of team2WRITE CLEARLYOnderwerp en bericht3REVIEW HISTORYBevestig resultaat
De team e-mail componist toont het publiek, onderwerp, bericht en verleden aflevering geschiedenis.

Deze pagina is voor interne operationele berichten, niet klantmarketing. Kies de kleinste correcte doelgroep, voorbeeldnamen en adressen, dan versturen. Levering maakt gebruik van het geconfigureerde uitgaande e-mailpad en registreert het resultaat.

Steun

Postbussen, levering en binnenkomende e-mail

Configureer hoe OpsIQ e-mail stuurt, inkomende berichten verandert in tickets en bewijst dat het verzenden van domein klaar is.

Productscherm
E-mailinstellingenE-mailinstellingen combineren uitgaande routering, Van identiteit, postbus inname, leveringscontroles en test e-mail.E-mailinstellingenwerkbladUITGAANDESMTPMAILBOXES3DOMEINENPasseerLEVENDE WERKSPACE-ZICHTVoorkeursconnectorSMTP / aanbieder connectorGeconfigureerdVan identiteitSupport <[email protected]>KlaarIMAP postbus[email protected] · InboxBesprekingLeveringsbaarheidSPF · DKIM · DMARCPasseer1CHOOSE OUTBOUNDConnector of SMTP2CONNECT INBOXIMAP of pijp3TESTVerzenden en verifiëren
E-mailinstellingen combineren uitgaande routering, Van identiteit, postbus inname, leveringscontroles en test e-mail.

Uitgaande e-mail

Volledige beheerders kunnen de gewenste e-mailconnector kiezen; OpsIQ valt terug naar geconfigureerd SMTP/mail levering indien van toepassing. Stel een herkenbare Van naam/adres, stuur een test en controleer de 24-uursucces/mislukte metriek.

Postbussen

Een IMAP mailbox heeft een naam, e-mailadres, doelafdeling, host, poort, beveiligingsmodus, gebruikersnaam, wachtwoord, map, polling state en certificaatvalidatiekeuze nodig Poll nu. om de inname te verifiëren voordat u wacht op cron.

Direct leidingwerk

Op dezelfde server kan een mailpijp het ruwe RFC822-bericht direct doorgeven. Een externe mailserver kan de ruwe boodschap naar het beveiligde inkomende eindpunt POSTen met behulp van zijn token. Beide paden voeren dezelfde ontdubbeling, draad- en ticketroutepijpleiding in.

Leveringsbaarheid

De SPF/DKIM/DMARC check is een adviesbewijs voor het geconfigureerde Van domein. Een groene controle garandeert geen postvakplaatsing, maar er moet eerst een fout worden vastgesteld alvorens productieberichten te versturen.

Steun

Ondersteuningsportaal Studio

Ondersteuning Portal Studio ontwerpt en publiceert de klantgerichte ondersteuningservaring zonder externe beeldactiva te vereisen.

Productscherm
Ondersteuningsportaal StudioPortal Studio toont een responsieve preview naast thema, navigatie, kennis, ticket, assistent, vorm, footer en CSS controles.Ondersteuningsportaal StudiowerkbladTEMPLATEModernVOORUITZICHTBureaubladSTAATOntwerpLEVENDE WERKSPACE-ZICHTThemaMerkkleuren en typografieBewerkenNavigatieKennis, kaartjes, assistentBewerkenTicketformulierVelden, routering en kopieBewerkenPublicerenValideren en live makenEvaluatie1CHOOSE TEMPLATEBeginnen vanaf structuur2PREVIEW SIZESBureaublad naar mobiel3PUBLISH SAFELYEvaluatie en vervolgens vrijgeven
Portal Studio toont een responsieve preview naast thema, navigatie, kennis, ticket, assistent, vorm, footer en CSS controles.

Gebruik het sjabloon als startpunt, configureer vervolgens thema, lay-out, navigatie, kennis zoeken, ticket formulier, assistent, footer, merk, kaartgedrag, aangepaste CSS en algemene instellingen. Voorbeeld bureaublad, tablet en mobiel voordat u publiceert.

Steun

Kenniskloof

De kennis-gap wachtrij verzamelt vragen van klanten die de AI niet kon beantwoorden, zodat het team kan verbeteren dekking.

Productscherm
KenniskloofDe gap wachtrij rangschikt gemiste of laag vertrouwen vragen en tracks of het team ze heeft opgelost.KenniskloofwerkbladOPEN GAPS28REPEATED9RESOLVED116LEVENDE WERKSPACE-ZICHTMigratiegrenzenGevraagde 14 tijdenHoogOndersteuning voor weekendsGevraagde 8 tijdenMiddelTijd van de terugbetalingGevraagde 6 tijdenMiddelAPI regioGevraagde 3 tijdenLaag1REVIEW QUESTIONZie conversatiecontext2CHOOSE FIXArtikel of prompt3RESOLVEHet volgende antwoord verifiëren
De gap wachtrij rangschikt gemiste of laag vertrouwen vragen en tracks of het team ze heeft opgelost.

Open een gat om de oorspronkelijke vraag en het gesprek in de buurt te lezen, kies dan voor de juiste oplossing: update van een bestaand artikel, maak een nieuw kennisartikel, voeg een zakelijk feit toe, correcte connectorgegevens of wijziging escalatie instructies. Markeer het opgelost pas na een evaluatie of echte test geeft een aanvaardbaar antwoord terug.

Steun

Statuspaginabeheer

De pagina statusbeheer communiceert de gezondheid van diensten en incidenten met behulp van componenten, huidige staten en updates.

Productscherm
StatusbeheerStatusbeheer geeft onderdelen en incidenten aan zodat exploitanten duidelijke, tijdgestempelde service-informatie kunnen publiceren.StatusbeheerwerkbladOVERALLOperationeelONDERDELEN7INCIDENTS1LEVENDE WERKSPACE-ZICHTWebsiteOperationeelGroenAPI_Verstoorde prestatiesKijkE-mail innameOperationeelGroenHuidig incidentAPI _Latief onderzoekOpenen1UPDATE COMPONENTKies een duidelijke status2POST INCIDENTTijdsaanduiding updates3RESOLVESluiten met samenvatting
Statusbeheer geeft onderdelen en incidenten aan zodat exploitanten duidelijke, tijdgestempelde service-informatie kunnen publiceren.

Gebruik component staat consistent. Wanneer een incident invloed heeft op klanten, een eerste kennisgeving publiceren, tijd gestempelde updates toevoegen als feiten veranderen en sluiten met een beknopte resolutie samenvatting. Gebruik de status pagina niet als een interne debug log; gevoelige diagnostiek hoort in OpsIQ en server logs.

AI

Zet je AI klaar.

AI Configuratie is waar u kiest uw AI provider, model en kosten controles. OpsIQ ondersteunt meerdere aanbieders: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), en Grok (xAI). U kunt uw eigen API sleutel (BYOK) of Managed AI indien beschikbaar op uw plan.

AI instellen
AI configuratieEen AI-instellingenpaneel: een Managed-AI / BYOK provider schakelt, een modelkiezer en een maandelijkse token-budget meter.AI configuratiewerkbladAI configuratieAanbiederBeheerde AIUw sleutel (BYOK)Modelclaude · uitgebalanceerdMaandelijkse AI-begroting62%1TWO MODESBeheerde AI of BYOK2PICK A MODELSnelheid vs diepte3BUDGETSToken caps & kostenbeheersing
Kies Beheerde AI of uw eigen sleutel, kies een model voor snelheid vs diepte en cap maandelijks besteden met een token budget.

Een aanbieder kiezen

Claude (Anthropic)

Sterke redenering, voorzichtig met feiten, goed in het volgen van complexe instructies. Modellen: claude-sonnet-4-20250514, claude-3.5-sonnet. Beste voor: ondersteuning gesprekken, technische vragen, gedetailleerde analyse.

GPT-4o (OpenAI)

Snelle, creatieve en goede algemene kennis. Modellen: gpt-4o, gpt-4-o-mini. Beste voor: snelle antwoorden, creatief schrijven, brede kennisvragen.

Gemini (Google)

Goed in feitelijke vragen, multi-taal ondersteuning. Modellen:gemini-2.0- Flash,gemini-1.5-pro. Beste voor: meertalige ondersteuning, feitelijke opzoekingen.

Grok (xAI)

Snelle, beknopte antwoorden. Modellen: grok-3-mini-fast. Beste voor: snelle antwoorden, casual toon.

BYOK vs beheerde AI

BYOK (Breng je eigen sleutel mee)

U geeft uw eigen API sleutel van de provider. U betaalt rechtstreeks aan de providers. Volledige controle over modelselectie en -gebruik.

Beheerde AI

AI wordt verstrekt als onderdeel van uw OpsIQ - Nee, het plan. API Het gebruik wordt gemeten tegen de AI-tegoedbalans van je plan.

Stapsgewijze opstelling

1
Ga naar AI-configuratie

In de OpsIQ admin, navigeer naar Instellingen > AI Configuratie.

2
Selecteer provider

Kies uw AI provider uit de dropdown.

3
Voer de sleutel API in

Indien gebruik BYOK, voer uw API sleutel. Voor Managed AI wordt dit automatisch afgehandeld.

4
Kies model

Selecteer het specifieke model dat u kunt gebruiken. Kleinere modellen zijn sneller en goedkoper. Grotere modellen geven betere kwaliteit antwoorden.

5
Testverbinding

Klik op "Testverbinding" om te controleren of de API sleutel en model werken. Een groen vinkje betekent succes.

6
Opslaan

Klik op Opslaan om uw AI configuratie te activeren.

Kostencontroles

Maandelijkse begroting

Stel een maximale maandelijkse uitgaven aan AI tokens. Wanneer het budget is bereikt, AI functies sierlijk degraderen (kortere antwoorden, geen automatisch antwoord) in plaats van volledig stoppen.

Per-gesprek token limiet

Maximale tokens per gesprek. Voorkomt weggelopen gesprekken van het consumeren van buitensporige credits.

Alarmfase laagbalans

Wanneer uw AI-kredietsaldo onder de drempel daalt (standaard: 50,000 tokens), verschijnt er een waarschuwing in het admin. Stel dit in bij AI configuratie.

Per-werkruimte configuratie

AI-configuratie is per werkruimte. Als u meerdere sites beheert, kan elke werkplek een andere provider, model en budget gebruiken. De werkruimte erft algemene standaardwaarden tenzij deze worden overschreven. Om per werkblad te configureren: naar de werkruimte overschakelen, ga dan naar AI configuratie en sla daar instellingen op.

Ophalen API sleutels

Anthropic (Claude)

Ga naar console.anthropic.com > API Sleutels > Sleutel aanmaken. Kopieer de sleutel die begint met "sk-ant-'.

OpenAI (GPT)

Ga naar platform.openai.com > API Sleutels > Nieuwe geheime sleutel aanmaken. Kopieer de sleutel die begint met "sk-"

Google (Gemini)

Ga naar aistudio.google.com > Get API Sleutel. Maak een sleutel aan voor uw project. Kopieer de sleutel.

xAI (Grok)

Ga naar console.x.ai > API Sleutels. Maak en kopieer uw sleutel.

Testen van uw AI-opstelling

Scenario:
Na het invoeren van uw API sleutel, klik op "Test verbinding." U moet een groen vinkje en een voorbeeld antwoord zien van de AI.
Wat te doen:

Als de test mislukt: (1) Controleer of de API sleutel is correct (geen extra spaties). (2) Controleer of uw rekening bij de provider is ingesteld. (3) Controleer of de modelnaam geldig is (4) Als u Managed AI gebruikt, controleer dan of uw licentie actief is.

Welke provider is het beste?+

Er is geen enkele beste provider. Claude is uitstekend voor ondersteuning van gesprekken. GPT-4o is snel en veelzijdig. Gemini Behandelt meerdere talen goed. Probeer elk en zie welke de beste resultaten voor uw specifieke use case produceert.

Kan ik later van provider wisselen?+

Ja. Wijzig de provider en API sleutel op elk moment. Bestaande gespreksgeschiedenis wordt bewaard. De AI zal de nieuwe provider gebruiken voor alle toekomstige gesprekken.

Wat gebeurt er als ik geen credits meer heb?+

De AI degradeert sierlijk: reacties worden korter, automatisch reageren pauzes en de beheerder toont een laag-balans waarschuwing. Core tracking, tickets en CRM blijven werken zonder AI.

AI

Slimmere en goedkopere klantenchat

Een set opt-in controls die uw klantchat slimmer maken (het redenen voor een klantaccount zoals een menselijke agent) of goedkoper (het stuurt de AI minder, of antwoorden in minder stappen). Elke controle is standaard uitgeschakeld en onafhankelijk, het inschakelen van één op nooit verandert enig ander gedrag. De meeste live onder Instellingen > Client Chat > Gedrag; een paar zijn ingeschakeld Stel je AI in en Train je KI.

Slimmere antwoorden (agentmodus)

Een normale chatbot beantwoordt één vraag van een opzoeker. Agentmodus De assistent kan meerdere read-only rekening controles in één keer en kruis-referentie ze, bijvoorbeeld "heb ik open tickets, en is mijn saldo genoeg voor mijn volgende vernieuwing?" wordt beantwoord in een antwoord met de berekeningen gedaan. Het alleen ingeschakeld voor geverifieerde klanten op rekening of terugbetaling vragen; al het andere loopt de normale single-antwoord pad.

Agentmodus

Tot een paar alleen-lezen opzoeken per beurt, gekruist voordat u antwoord. Schakel wanneer je een aangesloten platform (WHMCS, Shopify, Stripe, Zendesk, enz.). Off = het huidige single-lookup gedrag, ongewijzigd.

Nadenking diepte voor agent antwoorden

Hoe hard de modelredenen op complexe bochten (laag/medium/hoog). Begin met Laag; de meeste supportvragen worden daar goed behandeld.

Agentmodel

Een sterker model voor complexe agenten draait, zodat de dagelijkse chat op een licht, goedkoop model blijft en alleen de harde bochten betalen voor diepte. Blanco = uw normale klantchatmodel.

Plan vooruit · antwoorden met één pas (beta)

Een kleine planning stap bepaalt welke opzoekopdrachten moeten worden uitgevoerd en of de kennisbasis nodig is, antwoordt vervolgens in één hoofdoproep in plaats van meerdere stappen. Een sub-schakeling onder Agent mode. Het kan niet worden ingeschakeld tenzij agent modus aan staat. Dezelfde antwoordkwaliteit, minder oproepen voor meerdelige vragen.

Gespreks & begrip

Langgespreksgeheugen (beta)

Houdt een korte samenvatting van oudere berichten (namen, ticket/factuurnummers, bedragen, beslissingen) zodat de assistent consistent blijft in zeer lange chats zonder het hele transcript te herversturen. Beste voor ondersteuningszware, lange threads; paren met Agent mode.

Typotolerantie

Leest kleine typefouten ("mijn open ticketts," "onbetaalde invocies") als de beoogde woorden zodat de juiste informatie wordt gevonden in plaats van gemist. Werkt met elk aangesloten platform. Standaard uit; nuttig voor mobiele-zware chat.

Lean-accountcontext

Alleen de klant account snapshot wanneer de vraag is eigenlijk over hun rekening (balans, facturen, tickets, diensten), overslaan op algemene vragen. Bespaart kosten zonder kwaliteitsverlies. De assistent kan nog steeds het account live halen als een beurt nodig heeft.

Kostenbesparing

Skip kennis zoeken naar groeten (beta)

"Hoi," "dank je" en "ok" niet leiden tot een kennis-base zoeken, die antwoorden nooit gebruiken. Een bericht met echte inhoud nog steeds zoekt als normaal.

Langste antwoord toegestaan (tokens)

Hoe lang een antwoord kan zijn. Antwoordlengte is het duurste deel van een oproep, dus een verstandige cap (rond 500 voor ondersteuning) is de meest effectieve chat kosten controle. Alleen verlaagt uw globale limiet, nooit verhoogt.

Op instellen van uw AI

Denkdiepte (customer & admin chat)

Hoeveel denkt het model voordat u antwoordt (minimaal tot hoog). Houd de klantchatten op minimaal/laag voor snelheid; reserveer hogere instellingen voor analyse en de beheerder copilot.

Per-AI model (per baan)

Elk AI-oppervlak (live chat, ticketontwerpen, samenvattingen, analyse, admin copiloot, promoties, Site Intelligence en meer) kan op zijn eigen model draaien. Licht waar snelheid belangrijk is, sterk waar kwaliteit van belang is. Blanco op een oppervlak = provider standaard voor die baan.

Beheer chat kosten controles

De beheerder copiloot kan een begrensd werkgeheugen behouden en alleen de gereedschappen laden die een vraag nodig heeft (lean tools) in plaats van elke tool iedere beurt.

Op trein uw AI

Gebruiksaanwijzing comprimeren

Uw instructies worden verzonden op elke beurt, zodat hun lengte is een terugkerende kosten. De Compress knop herschrijft een slot om hetzelfde te zeggen in minder woorden. Het weigert de herschrijven als het zou vallen {variable} of regeren, en meldt wat het beschermd, zodat het nooit stil verandert betekenis.

"Wat al in de hersenen zit" (i

Toont wat OpsIQ al weet over uw bedrijf per slot, zodat u alles kunt verwijderen wat je herhaalde in uw eigen instructies.

💡
Waar gaat het geld naartoe? Voor korte ondersteuningschat is de invoer (instructies + accountgegevens + geschiedenis, verzonden elke keer) meestal meer kosten dan het korte antwoord, caching en mager context helpen meest daar. Voor lange gegenereerde inhoud domineert de uitvoer. De repliek-lengte cap en een lagere denkdiepte betalen er af. Zie Stel uw AI in om snel te blijven cachen op, waardoor het grote herhaalde deel van elke draai goedkoop wordt.
Veranderen deze hoe de chat al antwoordt?+

Nee. Elke controle is standaard uitgeschakeld en onafhankelijk. Eén aanzetten voegt alleen zijn gedrag toe; het uitschakelen geeft de chat terug naar precies hoe hij eerder werkte.

Welke bestelling moet ik ze aanzetten?+

Start de dagelijkse chat op een licht model en pin een sterker Agent-model. Als u dan een aangesloten platform, inschakelen Agent modus, Plan vooruit, dan Long-conversation geheugen. Dan magne context, skip-KB-voor-greetings, en een antwoord cap. Eindelijk comprimeren uw instructies. Bekijk een paar echte chats na elke verandering.

De Admin Agent kit: web zoeken, runbooks, missies, bestand overdracht

De Admin AI chat is een werkende engineer, niet alleen een vragendoos. Het kan onderzoek repareren op het web, houden van een bibliotheek van uw operationele procedures, patrouilleren uw servers op een schema, en verplaatsen bestanden. Het meeste van dit wordt gedreven door te vragen in de chat; het enige wat u vooraf configureert is welke web zoek provider gebruikt, op de Stel uw AI pagina.

Webzoekopdracht

Ingebouwd

De agent zoekt het web op voor docs, foutmeldingen en actuele informatie terwijl het werkt. Uit de doos gebruikt dit DuckDuckGo, die geen sleutel nodig heeft en geen setup.

Runbooks

In gesprek

Een bewaarde bibliotheek van je procedures ("hoe doen we X hier"). De agent schrijft er een op na het vastpakken van een lastige baan en volgt die de volgende keer, zodat de knowhow overleeft het einde van het gesprek.

Dienstreizen

Gepland

Geplande alleen-lezen patrouilles. "Elke ochtend, controleer schijfruimte en de fout logs en vertel me." De bevindingen komen op uw admin bel.

Bestandsoverdracht

In gesprek

Vraag naar een logbestand en krijg een privé-downloadlink, of laat het ene bestand van de ene verbonden server naar de andere kopiëren. Beide worden geplakt op 5 MB_.

Beheerder Agent web search (op Stel uw AI)

Zoekmachine

Wat de agent web zoeken gebruikt. De standaard is DuckDuckGo: sleutelloos, gratis, werkt op elke installatie. Brave Search, Tavily en Serper.dev (Google resultaten) meestal terug betere resultaten, maar elk heeft een API sleutel van die provider. Als een keyed provider faalt om welke reden dan ook (slechte sleutel, quota gebruikt, netwerk problemen), dat zoeken valt terug naar DuckDuckGo automatisch, dus zoek nooit donker wordt.

Zoeken API sleutel

De sleutel voor uw gekozen provider, alleen nodig voor Brave, Tavily of Serper. Eenmaal opgeslagen wordt gemaskeerd en nooit meer op de pagina; plak een nieuwe om het te vervangen. Een keyed provider wordt alleen actief wanneer zowel de provider als zijn sleutel worden bewaard.

Runbooks

Als de agent net een taak heeft uitgevoerd die u op dezelfde manier wilt herhalen, zegt u "slaat dat op als een runbook met de naam nightly-cleanup". Vanaf dan ziet het de runbook bij elke sessie en wanneer u om de taak vraagt (of deze beschrijft), haalt het de stappen op en volgt ze.

💡
Een runbook is begeleiding, geen vrije pas. Wanneer het agent er een volgt, gaat elke stap die een server zou veranderen nog steeds door uw huidige toestemming modus en toont de gebruikelijke goedkeuringskaarten. Een rankbook kan nooit voorbij een goedkeuring.

Dienstreizen

Een missie is een terugkerende taak die de agent zelf uitvoert: uur, dag op een bepaald uur of week op een bepaalde dag. Missies zijn alleen-lezen door ontwerp. Ze kunnen servers, data en het web lezen, maar ze kunnen nooit iets veranderen; ze onderzoeken en rapporteren. Wanneer een missie eindigt, landen de bevindingen als een kennisgeving op uw admin bel. Zeg "run the morning patrouille now" om er één te laten starten op aanvraag, of vraag de agent om een lijst op te nemen, te onderbreken of missies te verwijderen.

⚠️
Missions lopen van de OpsIQ cron, dus het moet worden ingesteld (zie Cron en automatisering). Een eenmalige "run it now" uit de chat werkt zelfs tussen cron draait op de meeste servers.

Bestanden verplaatsen

Vraag om een bestand ("verkrijg me vandaag de fout log van de webserver") en het agent podiumt het en antwoordt met een private download koppeling. De link werkt alleen voor ingelogde admins en verloopt na ongeveer een dag. Bestanden worden afgetopt op 5 MB; als er iets groter is, vraag de agent eerst te comprimeren of trimmen op de server.

De agent kan ook een enkel bestand kopiëren tussen twee verbonden servers, opnieuw tot 5 MB_. Het schrijven op de bestemming wordt behandeld als elke andere wijziging die het maakt: in vraagmodus krijg je eerst een goedkeuringskaart, het bestaande bestand wordt geback-upt en de kopie is omkeerbaar. Voor veiligheid wordt de inhoud van het bestand opnieuw gelezen vanaf de bron zodra de kopie wordt toegepast, niet uit de chat gehaald.

AI

Train uw AI

Bij AI Training leer je OpsIQ hoe hij zich moet gedragen. Je schrijft prompts die persoonlijkheid, grenzen, kennisfocus en escalatieregels definiëren – denk aan het schrijven van een trainingshandleiding voor een nieuwe supportmedewerker.

Trein AI
Train uw AIEen AI instructies-editor met klanten/admin tabs en gewone Engelse toon, altijd en nooit regels.Train uw AIwerkbladKlant AIBeheerder AIToonVriendelijk, beknopt en nooit opdringerig.AltijdBied een menselijke overdracht aan voor factureringsgeschillen.NooitBeloof een terugbetaling zonder controle van de rekening.1TWO MANUALSKlanten & admin AI2PLAIN ENGLISHTone, altijd, nooit3GROUNDEDPlus je kennisbasis
Train de AI als een nieuwe huur, Customer and Admin handleidingen geschreven in gewoon Engels (toon, altijd, nooit), geaard in uw KB.

Twee opleidingsterreinen

Klant AI-prompt

Bepaalt hoe de AI met uw klanten praat in het chat-widget. Dit is de belangrijkste prompt om goed te komen.

Beheerder AI-prompt

Bepaalt hoe de AI uw admin team in het dashboard van de bestuurder helpt. Dit behandelt interne vragen en actie uitvoering.

Een geweldige klant AI prompt schrijven

Uw klant AI prompt moet deze gebieden bestrijken:

1
Identiteit

Wie is de AI? Geef het een naam, rol en persoonlijkheid. Voorbeeld: "Je bent Luna, een vriendelijk en deskundig customer support assistent voor Acme Store."

2
Toon en stijl

Hoe moet het communiceren? Voorbeeld: "Wees professioneel maar warm. Gebruik eenvoudige taal. Vermijd jargon. Houd antwoorden beknopt (2-3 paragrafen max)."

3
Kennisgrenzen

Wat moet het weten en niet weten? Voorbeeld: "Je weet over onze producten, prijzen, verzending, en retourbeleid. Je weet NIET over concurrerende producten of interne bedrijfsbeslissingen."

4
Rolverdelingsregels

Wanneer moet het aan een mens worden overgedragen? Voorbeeld: "Escaleer bij een menselijke agent wanneer: de klant om terugbetaling vraagt, juridische actie vermeldt, een veiligheidsprobleem meldt of dezelfde vraag drie keer stelt."

5
Dingen om nooit te doen

Harde grenzen. Voorbeeld: "Nooit beloven terugbetalingen. Nooit delen interne prijzen formules. Nimmer maken van product kenmerken die niet bestaan. Geef nooit medische, juridische of financiële advies."

Voorbeeldprompts

Voorbeeld klant AI prompt · online winkel
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
Voorbeeld klant AI prompt · hosting bedrijf
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

Uw prompt na verloop van tijd verfijnen

1
Starten met basis

Begin met identiteit, toon en sleutelgrenzen. Probeer niet alles op dag één te bedekken.

2
Review AI Geschiedenis wekelijks

Lees gesprekken waar de AI foute of suboptimale antwoorden gaf.

3
De prompt bijwerken

Voeg specifieke regels toe voor terugkerende problemen. Voorbeeld: als de AI belooft dat er geld terugkomt, voeg dan "Nooit een terugbetaling beloven. Stel dat je escaleert naar het facturatieteam."

4
Kennis toevoegen

Als de AI geen antwoord kan geven, voeg dan het antwoord toe aan de Kennisbank in plaats van alles in de prompt te proberen.

⚠️
Houd uw prompt onder 2,000 woorden. Al te lange prompts kunnen de AI verwarren en token kosten verhogen. Zet gedetailleerde informatie in plaats daarvan in de Kennisbank.
Wat is het verschil tussen de prompt en de kennisbasis?+

De prompt definieert persoonlijkheid, grenzen en regels. De kennisbasis biedt feitelijke informatie (productdetails, prijsstelling, beleid) De AI leest beide, maar de prompte vormen gedrag terwijl de KB antwoorden geeft.

Kan ik verschillende aanwijzingen hebben voor verschillende afdelingen?+

De prompt is per werkruimte. Als je verschillende AI-gedragen voor verschillende afdelingen nodig hebt, gebruik dan de kennisbasis om afdelingspecifieke informatie te verstrekken en vermeld de context van de afdeling in je prompte.

AI

AI geschiedenis

AI History toont elk gesprek dat de AI heeft gehad met klanten en admins. Gebruik het om de KI prestaties te controleren, verkeerde antwoorden te vinden en trainingslacunes te identificeren.

AI geschiedenis
AI geschiedenisEen log van AI draait met type badges, de vraag en het antwoord, reactietijd en resultaat.AI geschiedeniswerkbladElke AI draai, opgenomenchatV: Waar is mijn bestelling?A: vandaag verzonden, UPS tracking...0.9sbeantwoordticketOntwerp-antwoord voor T-12345Opgesteld restitutiebevestiging1.4sdraftedadminBeknopte kaartjes van deze week12-regeloverzicht terug2.1sklaarchatV: Annuleer mijn planoverhandigd aan een mens0.7sescalated1EVERY TURNWaarschuwing, antwoord, actie2SEARCHABLE& Exporteren filteren3OWNER-ONLYVolledige auditspoor
Elke AI-draai (chat, ticketontwerp, admin actie) logde met de exacte prompt, antwoord, duur en uitkomst.

Wat elk gesprek laat zien

Datum en tijd

Toen het gesprek plaatsvond.

Identiteit van de klant

Naam en e-mail indien bekend, anders IP en land.

Kanaal

Chat widget, ticket automatisch antwoord, e-mail concept of admin AI.

Berichten

Volledige transcriptie van het gesprek: klantberichten en AI-reacties.

Gebruik van token

Hoeveel tokens het gesprek verbruikt. Hoog token gebruik kan aangeven dat de AI geeft overdreven verbose antwoorden of het gesprek ging in cirkels.

Getroffen acties

Alle acties die de AI tijdens het gesprek heeft uitgevoerd (opzocht bestelling, gemaakt ticket, enz.).

Waardering

Als CSAT is ingeschakeld, de tevredenheid van de klant waardering voor dit gesprek.

Problemen vinden

Zoeken op sleutelwoord

Zoek naar specifieke onderwerpen om te zien hoe de AI ze behandelt. Voorbeeld: zoek naar "teruggave" om te controleren of de KI uw terugbetalingsbeleid volgt.

Filteren op waardering

Laat alleen laag gewaardeerde gesprekken zien om zich te concentreren op ontevreden klanten.

Filteren op kanaal

Alleen automatisch antwoorden tonen op tickets voor automatische reacties apart van de chat.

Sorteer op tokengebruik

Hooggetoken gesprekken kunnen problemen aangeven: de AI rammelt, gaat in cirkels of niet om de vraag te beantwoorden.

Wekelijkse auditroutine

1
Laag gewaardeerde gesprekken controleren

Was het een kenniskloof, toon of een verkeerd antwoord?

2
Hooggetoken gesprekken controleren

Heeft de AI zich herhaald?

3
Bijwerken van de opleiding

Voor kennislacunes, voeg artikelen toe aan de Kennisbank. Voor gedragsproblemen, update de AI prompt. Voor terugkerende verkeerde antwoorden, voeg expliciete correctieregels toe.

Kenniskloven vinden

Scenario:
U zoekt AI Geschiedenis voor "installatie" en vindt 15 gesprekken waar de AI zei "Ik heb geen specifieke installatie instructies voor dit product."
Wat te doen:

Dit betekent dat uw Kennisbank ontbreekt installatiehandleidingen. Maak kennisbasis artikelen voor de installatiestappen van elk product. Na het toevoegen ervan, test door vragen te stellen over de AI-installatievragen.

AI

AI inzichten

AI Insights analyseert automatisch gesprekspatronen en oppervlaktes actieve bevindingen: veel voorkomende vragen, tevredenheid trends, kennis hiaten, en escalatie patronen.

AI inzichten
AI-inzichten (Intelligence Hub)De Intelligence Hub: een AI-Brievenlijst van vandaag, Smart Alerts, een Score-a-Lead / Analyse-a -Page hulpmiddel en een 14-Day Traffic Pattern grafiek.AI inzichtenwerkbladVandaag is de BRIEFVerkeer omhoog 12%; 3 heet lood;2Deals moeten worden opgevolgd.Slimme waarschuwingenAfrekenfouten piekenOpspringen op /pricingNieuw heet lood uit de VSOntvangsten voorafgaande aan vorige weekScore een lead / analyse van een paginaIP of URL…Uitvoeren14-Dag verkeer patroon1Vandaag is de BRIEFAI schrijft de ochtend samenvatting2SMART ALERTSAnomalieën opgedoken3ON DEMANDScore een lead · analyse van een pagina
De echte Intelligence Hub: een AI-geschreven vandaag de brief, Smart Alerts voor afwijkingen, on-demand lead scoren en pagina analyse, en het 14-dag verkeer patroon.

Welke inzichten tonen

Topvragen

De meest gestelde vragen. Als "Hoe reset ik mijn wachtwoord?" is #1, dan heeft uw kennisbasis een prominente wachtwoordreset-gids nodig.

Tevredenheidstendensen

CSAT scoort na verloop van tijd. Is AI tevredenheid verbeteren of afnemen? Plotselinge druppels kunnen wijzen op een kennis basis verandering die iets gebroken.

Afwikkelingspercentage

Welk percentage gesprekken lost de AI op zonder menselijke tussenkomst? Een tarief boven 70% Hieronder 50% betekent dat de AI meer training nodig heeft.

Escalatieredenen

Waarom gesprekken worden overgedragen aan mensen. Veel voorkomende redenen: klant gevraagd mens, AI kon niet beantwoorden, gevoelig onderwerp, factuur probleem.

Kenniskloof

Onderwerpen waar de AI vaak zegt "Ik weet het niet" of geeft laag vertrouwen antwoorden.

Gemiddelde gespreksduur

Hoeveel berichten per gesprek. Zeer lange gesprekken (10+ berichten) kunnen aangeven dat de AI de vraag niet begrijpt.

Met behulp van inzichten om te verbeteren

Scenario:
AI Insights laat zien dat 23% van escalaties zijn "Klant gevraagd over garantie" en de AI kon niet antwoorden.
Wat te doen:

Dit is een duidelijke kenniskloof.1) Schrijf een uitgebreid garantieartikel in de kennisbasis met betrekking tot alle garantievoorwaarden, claimproces en uitsluitingen. (2) Update de AI-prompt naar referentie garantie informatie. (3) Monitor AI Insights volgende week om te zien of de garantie escalatie afneemt.

AI

Beheerder AI-speelboek

De admin AI (Vraag OpsIQ) helpt uw team te beheren OpsIQ vanuit het admin dashboard. U kunt het vragen om gegevens op te zoeken, functies uit te leggen, tickets samen te vatten en platformacties uit te voeren.

Beheerder AI
Beheerder AI-speelboekHet commandovenster Ask-OpsIQ met een AI-voorgestelde platform actiekaart die parameters toont en de optie bevestigen/annuleer.Vraag OpsIQwerkbladVraag OpsIQDe service voor te laat betalen #4821AIVoorgestelde actie: suspension_serviceaccount: #4821 (vervallen) $120)platform: WHMCS · omkeerbaar · gecontroleerdBevestigenAnnuleren1ASK ANYTHINGGewone Engelse commando's2PROPOSE FIRSTActie getoond voordat het draait3YOU CONFIRMBereikt & gecontroleerd
Vertel de admin AI wat je wilt in het gewone Engels; het stelt de exacte actie (gescoopt, omkeerbaar, gecontroleerd) en wacht op uw bevestiging.

Wat de admin AI kan doen

Data opzoeken

Vraag: "Toon me alle tickets van [email protected]" of "Wat is de status van orde #ORD-5523?"

Samenvatting

Vraag: "Summariseer de laatste 10 tickets" of "Wat zijn de belangrijkste ondersteuningsproblemen deze week?"

Functies uitleggen

Vraag: "Hoe zet ik automatisch antwoord op?" of "Wat betekent de bounce rate kaart?"

Actie uitvoeren

Vraag: "Maak een ticket voor [email protected] over facturering" of "Sluiten ticket T-12345"

Platformqueries

Vraag: "Hoeveel bezoekers hebben we gisteren gekregen?" of "Wat is onze inkomsten deze maand?"

Voorbeeldgesprekken

Opzoeken van een klant

Scenario:
Beheerder vraagt: "Zoek klant [email protected] en laat me hun recente activiteit zien"
Wat te doen:

De AI zoekt de klant op over alle verbonden gegevensbronnen: bezoekerssessies, tickets, chatgesprekken, bestellingen en CRM-contacten. Het geeft een samenvatting van recente activiteiten terug met links naar elk item.

Dagelijkse samenvatting ophalen

Scenario:
De admin vraagt: "Wat is er vandaag gebeurd?"
Wat te doen:

De AI vat samen: "Vandaag had je 245 bezoekers (12%), 8nieuwe tickets (3 opgelost door AI),2Nieuwe bestellingen totaal $198 en1chat escalatie over een vertraging van de verzending."

Uitvoering van een actie

Scenario:
Admin vraagt: "Wijzig ticket T-5523 prioriteit naar Dringend"
Wat te doen:

De AI bevestigt: "Ik zal ticket T-5523 prioriteit veranderen van Normaal naar Dringend. Dit heeft invloed op de SLA timer. Bevestigen?" U bevestigt, en de actie wordt uitgevoerd.

💡
De Admin AI voert alleen acties uit die zijn geregistreerd in het Actieregister. Het kan geen acties of toegangssystemen buiten OpsIQ verzinnen.
AI

Customer AI scenario's

Deze sectie behandelt gemeenschappelijke klantgerichte AI scenario's met verwacht gedrag en training tips.

Klant AI
Customer AI scenario'sEen bibliotheek van klantvragen gekoppeld aan het verwachte AI gedrag en een uitkomsttag voor elk.Customer AI scenario'swerkbladScenariobibliotheek · verwacht AI gedrag"Waar is mijn bestelling?"Zoek de bestelling via connector op, geef het volgenOplossen"Ik wil een terugbetaling"Beloof nooit dat je een mens iets geeft.Afhandeling"Is de dienst neer?"Controlestatus, huidige status rapporterenStatus"Mijn rekening annuleren"Bevestig intentie, dan route naar een mensBevestigen1SCENARIOSGemeenschappelijke vraagstukken2EXPECTEDHoe moet AI antwoorden?3TESTOpleidingskloof vinden
Een bibliotheek met echte klantvragen en precies hoe de AI elk moet behandelen, om uw training te testen en hiaten te vinden.

Scenariobibliotheek

Onderzoek naar de status van de order

Scenario:
Klant: "Waar is mijn bestelling #12345?"
Wat te doen:

Verwacht AI-gedrag: (1) Zoek de volgorde op via het platform. (2) Huidige status rapporteren (verwerking, verzending, levering). (3) Traceernummer indien beschikbaar invoegen (4) Indien de bestelling wordt vertraagd, moet deze worden bevestigd en een geschatte tijdlijn worden opgegeven (5) Verzin nooit informatie over het volgen.

Reset verzoek voor wachtwoord

Scenario:
Klant: "Ik ben mijn wachtwoord vergeten en kan niet inloggen"
Wat te doen:

Verwacht AI-gedrag: (1) Zorg voor het wachtwoord reset stappen van de kennisbasis. (2) Inclusief de resetlink of het paginapad. (3) Vermeld dat de reset e-mail kan een paar minuten duren. (4) Stel voor om spammap te controleren. (5) Als de klant nog steeds niet kan resetten, escaleer dan naar een mens.

Functieverzoek

Scenario:
Klant: "Kunt u de donkere modus toevoegen aan de mobiele app?"
Wat te doen:

Verwacht AI-gedrag: (1) Dank hen voor de suggestie. (2) Leg uit hoe functieverzoeken worden behandeld (gelogd, herzien, prioriteit gegeven). (3) Beloof NIET dat de functie zal worden gebouwd. (4) Als een soortgelijk kenmerk bestaat, vermeld het.

Factureringsgeschil

Scenario:
Klant: "Ik ben opgeladen maar mijn service werkt niet"
Wat te doen:

Verwacht AI-gedrag: (1) Erken de frustratie. (2) Controleer de servicestatus indien mogelijk. (3) Escaleer naar de afdeling facturering met alle details. (4) Beloof GEEN terugbetaling. (5) Stel ticket prioriteit aan High.

Off-topic vraag

Scenario:
Klant: "Hoe is het weer in Londen vandaag?"
Wat te doen:

Verwacht AI-gedrag: (1) Beleefd omleiden. "Ik ben uw [Bedrijf] support assistent en kan helpen met vragen over onze producten en diensten. Voor weerinformatie, probeer een weerservice." (2) Vraag of ze een productvraag hebben.

Hoe test ik klant Al gedrag?+

Open uw website in een privé/incognito browser en chat met de AI als klant. Probeer algemene vragen, randgevallen en tegenstrijdige scenario's. Controleer of de KI uw prompte regels volgt en correct gebruik maakt van kennisbasis inhoud.

AI

AI-kennisbasis

De Knowledge Base is een bibliotheek van artikelen die de AI gebruikt om vragen te beantwoorden. Wanneer een klant iets vraagt, zoekt de KI naar relevante artikels en gebruikt ze om een nauwkeurige, geaarde reactie te genereren.

Kennisbasis
KennisbasisBronnen die zich voeden in een kenniswinkel, dan een AI genererend een gegrond, geciteerd antwoord.KennisbasiswerkbladBronnenWebsite crawlenHulpartikelenVeelgestelde vragenGeïmporteerde documentenKennissemantisch + sleutelwoordAIGrondig antwoordmet een geciteerde bron."Teruggaven nemen 3–5werkdagen."1INGESTKruipen, veelgestelde vragen, importeren2RETRIEVESemantisch + sleutelwoord3GROUNDEDAntwoorden van uw inhoud
Kruip uw site en importeer docs in de kennisbasis; de AI haalt de juiste stukken en antwoorden, geaard en geciteerd.

Hoe het werkt

1
Klant stelt een vraag

"Wat is uw terugkeerbeleid?"

2
AI doorzoekt de kennisbasis

OpsIQ vindt het "Return Policy" artikel door bijpassende zoekwoorden en semantische betekenis.

3
AI genereert een reactie

De AI leest het artikel en schrijft een natuurlijk-taal antwoord op basis van de inhoud van het artikel.

4
Klant krijgt een nauwkeurig antwoord

De reactie is gebaseerd op uw beleid, niet de algemene trainingsgegevens van de AI.

Goede artikelen maken

Eén onderwerp per artikel

Schrijf een apart artikel voor elk onderwerp: retourbeleid, verzendtarieven, account setup, wachtwoord resetten. Niet combineren niet-gerelateerde onderwerpen.

Schrijf als een FAQ

Begin met de vraag die klanten stellen, geef dan het antwoord. Dit helpt de AI vragen te koppelen aan artikelen.

Wees specifiek

"Terugkeer moet worden gestart binnen 30 dagen van levering" is beter dan "We hebben een terugkeerbeleid."

Inclusief randgevallen

En de internationale retourzendingen? Hoe zit het met digitale producten? Wat is er met items die gekocht worden in de verkoop?

Houd het actueel

Bekijk artikelen driemaandelijks. Verwijder verouderde informatie. Update prijzen, beleid en procedures wanneer ze veranderen.

Startersartikelen die je moet schrijven

Verzending en levering

Verzendkosten, levertijden, tracking, internationale verzending en afhandeling van vertragingen.

Teruggave en terugbetaling

Terugkeervenster, voorwaarden, proces, terugbetaling tijdlijn en uitzonderingen.

Accountbeheer

Wachtwoord resetten, e-mail wijzigen, account verwijderen en gegevens exporteren.

Prijzen en facturering

Plan beschrijvingen, facturatie cyclus, betaalmethoden, facturen en valuta.

Productgidsen

Hoe elk product of functie te gebruiken. Stap-voor-stap instructies met screenshots.

Problemen oplossen

Veel voorkomende problemen en oplossingen. Foutmeldingen en hun fixes.

Contactinformatie

Openingstijden, ondersteuningskanalen, responstijden en escalatiepaden.

Juridische en naleving

Samenvatting privacybeleid, samenvatting van de servicevoorwaarden, GDPR gegevensverzoeken.

Kennis van de connector

Elke connector kan kennis aan de AI bijdragen. Wanneer een connecter is ingeschakeld, zijn de ingebouwde kennisartikelen (productcatalogus, veelgestelde vragen, platformspecifieke probleemoplossing) automatisch beschikbaar voor de KI. U kunt de connectorenkennis in- of uitschakelen per connecteur in de Connectorinstellingen.

Begroting

De kennisbasis heeft een configureerbaar token plafond (standaard: 32,000 tokens) die bepaalt hoeveel kennis context wordt verzonden naar de AI per conversatie. Als uw kennisbestand is zeer groot, selecteert de KI de meest relevante artikelen binnen dit budget. Verhoog het plafond als er geen relevante artikelen worden gevonden; verlaag deze als u wilt token kosten te verlagen.

Hoeveel artikelen moet ik hebben?+

Beginnen met5-10 artikelen die betrekking hebben op uw meest voorkomende vragen. Voeg meer als u hiaten door AI Geschiedenis en AI Inzichten identificeren. 20-50 artikelen voor een uitgebreide dekking.

Kan ik artikelen importeren uit een ander systeem?+

Momenteel worden artikelen handmatig gemaakt in OpsIQ. U kunt de inhoud kopiëren-plakken van bestaande veelgestelde vragen, help centra of documenten.

In welk formaat moeten artikelen staan?+

Gewone tekst werkt het beste. De AI begrijpt de natuurlijke taal beter dan gestructureerde HTML of markdown. Schrijf zoals u zou uitleggen aan een klant.

AI

AI-evaluatie en Watchtower

Evaluatiesets maken van kritische klantvragen een herhaalbare test voor antwoordkwaliteit, citaten, escalatie en actieveiligheid.

Productscherm
AI-evaluatieAI Evaluatie geeft gouden testcases, vereiste gedragspatronen, laatste resultaten en geplande Watchtower-runs.AI-evaluatiewerkbladSETS6CASES84PASS RATE96%LEVENDE WERKSPACE-ZICHTZeevaartbeleidCitaat vereistPasseerAanvraag om terugbetalingMenselijke bevestiging vereistPasseerNiet-ondersteunde vorderingVerboden actiePasseerMigratiekwestieVerwachte bron ontbreektFout1CREATE CASESGouden input en regels2RUN SAFELYDroogloop of live evaluatie3WATCHDag- of weekschema
AI Evaluatie geeft gouden testcases, vereiste gedragspatronen, laatste resultaten en geplande Watchtower-runs.

Volledige beheerders kunnen evaluatiesets maken met een prompt, verwachte bronlabels, vereiste citaten, menselijke bevestigingsregels, escalatieverwachtingen en verboden acties. Voer een set direct uit, droog-run het of opnieuw geselecteerde geschiedenis af.

Wachttoren de dagelijkse of wekelijkse controles door middel van cron en voert een beperkt aantal gevallen (tot acht per geplande pas). Beoordelen mislukkingen naast provider/model, prompt versie, kennisversie, voorgestelde acties en kosten voordat het productiegedrag te veranderen.

AI

Talen en vertalingen

Talen beheert vertaalde klantgerichte tekst en het gedrag dat wordt gebruikt wanneer OpsIQ een taal van de klant volgt.

Productscherm
TalenDe pagina Talen toont de brontaal, vertaalde talen, ontwerp/live-state en klant-taalgedrag.TalenwerkbladBRONEngelsLANGUAGES4LEVEN3LEVENDE WERKSPACE-ZICHTFransInterface en inhoudLevendDuitsInterface en inhoudLevendSpaansOntwerpvertalingOntwerpVolg klantAntwoorden in gedetecteerde taalAan1SET SOURCEOorspronkelijke operatortaal2ADD LANGUAGEVertalen in achtergrond3PUBLISHOntwerp of live
De pagina Talen toont de brontaal, vertaalde talen, ontwerp/live-state en klant-taalgedrag.

OpsIQ vertaalt operator-ingevoerde klantgerichte tekst. Stel de brontaal correct in voordat u vertalingen aanmaakt, voeg doeltalen toe en bekijk ontwerpen alvorens deze te publiceren.

Vertalingsomvang kan alleen of live zijn. Vertrouw niet op automatische vertaling voor juridische, terugbetaling, veiligheid of veiligheidstekst zonder menselijke beoordeling.

Elke plaats waar je eigen formulering staat, wordt vermeld met zijn berichtnummer: chatberichten van klanten, promoties, proactieve berichten, chatstromen, rondleidingen, aankondigingen, teaser bubbels en Onderzoeken en formulieren. Het onderzoek oppervlak bestrijkt elke gepubliceerde enquête volledig: titel, elke vraag, elk antwoord optie, knoppen, welkom en dank u kopiëren, pagina chroom en uitkomst pagina's. Sleutels zijn gebonden aan de vraag ID en de optie waarde, dus het herschikken van vragen of opties nooit verliest een vertaling, en herformulering van één bericht opnieuw vertaalt alleen dat bericht. Gepubliceerde live enquêtes worden standaard aangeboden; ontwerpen voegen zich bij wanneer je verbreding van de reikwijdte.

De post-chat email enquête volgt de taal die de bezoeker daadwerkelijk chatte, mits dat taal is een u hier biedt; anders gebruikt het uw systeemtaal. Zijn zes bewerkbare velden zijn ook vertaald op deze pagina, en het gedrag heeft zijn eigen schakelaar in Client Chat instellingen.

Ticket- en portalberichten De vaste tekstoperators typ eenmaal en elke klant ontvangt dan in die ene taal: de ticketbevestiging, de geopende, gesloten en feedback bevestigingen, per-service afmelden en het portal welkomstlijn. (De automatische antwoord van de AI heeft niets van dit nodig, het al beantwoordt in de taal van de klant.) Met E-mail klanten in hun eigen taal ingeschakeld in OpsIQ Schrijven, ticket e-mail lost de taal van de ontvanger op in deze volgorde: de taal die ze kozen in het portal of Help Centre (gesleept op het ticket), de locale op hun contact record, dan de taal waarin ze schreven, lokaal gedetecteerd door script bereik en markeer woorden, zonder externe oproep. Alleen talen geselecteerd op de pagina Talen worden ooit gebruikt, dus de functie is inert totdat talen zijn toegevoegd. De globale HTML e-mail wrapper wordt bewust niet vertaald: het is markup, geen proza. Personeelsgerichte e-mailadres (meldingen, afdeling waarschuwingen, analist slips, geplande rapporten, de wekelijkse samenvatting) gebruikt altijd de systeemtaal.

PeopleOS HR

PeopleOS: het bestuurde besturingssysteem van de werknemers

Voer de levenscyclus van werknemer uit van vordering tot offboarding met mobiele selfservice, evidence-backed workflows, getypte integraties en menselijke controle over gevoelige beslissingen.

Interactieve systeemkaart
PeopleOS lifecycle commandocentrumEen driedimensionaal PeopleOS dashboard dat rekrutering, medewerkers, loonadministratie, leren en geregeerde AI met elkaar verbindt.PeopleOS commandocentrumBEWIJSLEVENMENSEN248OPEN ROLLEN12CONTROLEGATEN15 / 15LEVENDE CYCLUSRecruitHuurGroeienBeloningOvergangEEN RECORDIdentiteit + bewijs van tewerkstellingMENSENCONTROLEBeroep, correctie, overnameBewijzen dat je het niet hebt gedaan.Resultaten en vrijgave van bewijsmateriaal
PeopleOS houdt de levenscyclus, controles en bewijzen op één gecontroleerde record.

Beheerders

Opereren

Beheer mensen, organisatie, rekrutering, onboarding, documenten, verlof, loonvereffening, voordelen, prestaties, leren, relaties met medewerkers, analyses en governance.

Werknemers en managers

Zelfbediening

Gebruik een mobiele eerste portal voor privé-gegevens, verzoeken, documenten, onboarding, tijd, uitleg betalen, leren, bedrijfsinformatie en rechten.

Ontwikkelaars

Extenderen

Gebruik de gecureerd hr.* acties en de herziene platform.hr.* operaties via één contract, plus getypte connectorklassen. De gegenereerde index in de PeopleOS API sectie geeft een overzicht van elk met zijn toepassingsgebied.

⚠️
PeopleOS is geen loonadministratie, juridisch adviseur, background-check bureau of identiteitsprovider. Gecertificeerde externe systemen behouden die verantwoordelijkheden. Een groene technische controle creëert nooit wettelijke goedkeuring of bewijs van de leverancier.

PeopleOS HR ophalen

PeopleOS HR is opgenomen in het Enterprise plan. Op elk ander betaald plan is het een add-on: de eigenaar van de account opent Account → Toevoegen & Tokens, kiest een PeopleOS HR tier en ofwel begint de gratis proef of voegt het rechtstreeks. De niveaus verschillen in hoeveel mensen en hoeveel werving, interview en AI activiteit ze dragen. Prijzen en limieten worden ingesteld op de rekening, niet geschreven in het product, dus zie de huidige niveaus op de prijskaartje. Wat de module doet, oppervlak per oppervlakte, is op het PeopleOS HR product pagina.

Wie kan het toevoegen?

Een betaald plan dat actief is. Een gratis plan kan het niet toevoegen, en een betaalde plan dat nog steeds binnen zijn eigen proefversie moet wachten tot die trial eindigt.

De gratis proefversie

De proef loopt op het niveau dat u kiest. Wanneer deze eindigt zonder aankoop wordt de rechten verwijderd en er wordt niets in rekening gebracht. Niets wordt gewist: de records zijn er weer wanneer de add-on is toegevoegd.

Wanneer het niet eigendom is

PeopleOS HR verschijnt niet in de zijbalk, het commandopalet, Instellingen of hulp bij in-apps. Een directe link naar een HR pagina biedt de add-on in plaats van de pagina.

Bereiken van een tier cap

Wanneer een niveaulimiet is bereikt, wordt de volgende laag weergegeven. Het bewerken of verwijderen van wat al bestaat wordt nooit geblokkeerd.

Zelfgehoste installatie

De rechten reizen in de licentie. Voeg de add-on op uw OpsIQ account en de installatie pikt het op bij zijn volgende licentiecontrole.

Eerste week setup

Alles hieronder is een echt scherm; niets hier heeft een ontwikkelaar nodig.

1
De module aanzetten

Openen PeopleOS → HR Begin. Het vlaggenbord begint met de hoofdschakelaar, PeopleOS HR: zonder HR pagina of werknemersoppervlak is bereikbaar. Een schakelaar inschakelen is een twee-klik bevestiging; het uitschakelen van één klik is eronder. De AI schakelt hieronder (ontwerphulp, toepassing screening, autonome assistenten, AI interviews, automatische aanbieding verzenden, identiteitscontrole) uit totdat u beslist.

2
Laat de configuratie van de Setup Copilot uitvoeren

Openen PeopleOS → Copiloot instellen en zeg wat je wilt in gewone taal: een verlofbeleid met zijn dagen en kennisgeving, de feestdagen voor een land, een zaakcategorie met zijn SLA, een kostenplafond, een onboarding template, een maandelijkse puls. Je krijgt het plan terug met wat het begrepen heeft en wat het veronderstelde. Niets loopt totdat je bevestigt; een stap met middelmatige risico's heeft een tweede persoon nodig; elke run laat een ontvangstbewijs achter.

3
Noem het werknemersportaal

Openen PeopleOS→Frontline→Aanmeldontwerp. Op een zelf-gehoste installatie het portal woont op /hr/<address>; Poortadres hernoemt het onmiddellijk en oude aanmeldlinks blijven werken omdat het oude adres vooruit gaat. Op de cloud is het portaal /hr op uw werkbladhost en heeft geen adres nodig.

4
Publiceer uw carrières site

Openen PeopleOS → Recruiting. Elke post die u publiceert van een goedgekeurde vordering verschijnt op de openbare carrièrepagina; de link Open de pagina over openbare carrières aan de top van Recruiting laat precies zien wat een kandidaat ziet.

5
Een kiosk registreren voor gedeelde apparaten

Openen PeopleOS → Frontline → Kiosken en kies Een kiosk registreren. Het apparaat token wordt eenmaal getoond; open de kiosk pagina op de tablet of PC (het is /kiosk op de portal host) en plakken. Mensen klokken in met hun werk e-mail en PIN, of met de kortlevende badge code van hun portal. Het terughalen van een kiosk stopt het apparaat onmiddellijk.

6
Beslis wat werknemers zelf kunnen doen

Openen Instellingen → HR. Elke zelfbedieningskracht (gegevens, verzoeken, documenten, verlof, uitleg betalen enz.) is ingesteld op elke werknemer, managers of één team en de teams eronder. Elke verandering record die het gemaakt heeft en waarom, en een macht die je uitschakelt wordt uitgelegd aan de medewerker in plaats van stilletjes vermist.

7
Mensen toevoegen en toegang geven

Aan PeopleOS → Mensen de persoon, hun werk en hun manager. Provision portal toegang slechts zodra de persoon een geldige e-mail en een voorgenomen arbeidsverhouding heeft; de uitnodiging gaat uit van hetzelfde scherm en onboarding begint vanaf de reis die u hebt opgezet.

De levenscyclus

Plannen en rekruteren

Maak goedgekeurde aanvragen, publiceren van banen, ontvangen toepassingen via re-query-veilige webhooks, structuur reviews, schema interviews, record beslissingen, uitgifte aanbiedingen en huren.

Deelnemen en voorzien

Bouw evidence-backed onboarding reizen, verzamel de juiste documentversie, vraag apparatuur, verlenen goedgekeurde toegang sjablonen en provision seatless portal toegang.

Werk en groei

Werkzaam verlof, schema's, loon uitleg, voordelen, uitgaven, doelstellingen, feedback, beoordelingen, leren, vaardigheden, interne kansen, successie en beroepsbevolking analyse.

Steun en bescherming

Privé HR-ondersteuning, geregeerde personeelszaken, juridische bezit, gegevensverzoeken, correctie, uitleg, beroep en onafhankelijke menselijke beoordeling.

Veranderen en vertrekken

Gebruik effectieve datering van de werkgelegenheid, intrekking van toegang, herstel van apparatuur, verzoening van externe aanbieders, toepassing van bewaring en behoud van het vereiste bewijsmateriaal.

Toegang en identiteit

Een canonieke persoon bezit arbeidsgegevens en geverifieerde externe identiteitsfacetten. E-mail is veranderlijke contactgegevens, nooit de permanente identiteitssleutel. Portallezingen zijn zelfgescoopt; manager- en beheerderweergaven vereisen expliciete machtigingen. API scopes laag bovenop de route permissies en nooit omzeilen.

Een nieuwe werknemer toevoegen

Scenario:
Maak de persoon, wijs werk en manager aan, levering portal toegang, dan openen van de reis aan boord.
Wat te doen:

Gebruik dry-run en idempotency voor API schrijft. Bevestig dat de persoon een geldige e-mail heeft en voorgenomen arbeidsrelatie voordat hij toegang verstuurt.

Een dubbele identiteit oplossen

Scenario:
Twee externe systemen identificeren dezelfde werknemer anders.
Wat te doen:

Koppel beide geverifieerde facetten aan de canonieke persoon en los het conflict expliciet op. Vermeng geen bestanden alleen omdat twee veranderlijke e-mailwaarden overeenkomen.

PeopleOS HR

HR-workflows en het werknemersportaal

Hoe elk groot PeopleOS gebied wordt geëxploiteerd en wat werknemers zien na de aanmelding.

Personen en organisatie

Behoud de canonieke persoon, werk, type werknemer, manager, team, locatie, vaardigheden, documenten en effectieve datering organisatiestructuur.

Aanbiedingen en recruitment

Verplaatsen van goedgekeurde aanvraag naar plaatsing, toepassing, gestructureerd bewijs, interview, beslissing, aanbod en huur met accommodatie- en beroep routes.

Aan boord en documenten

Toewijzen van de opdracht tot eigenaar-specifieke stappen; verzamelen, beoordelen, ondertekenen, verlopen, bewaren en verwijderen documenten met versie en toegang bewijs.

Tijd, verlof en planning

Definieer de soorten verlof, saldi, verzoeken, goedkeuringen, feestdagen, beschikbaarheid, kalenderevenementen en verzoening.

Betaling, uitkeringen en uitgaven

Leg loon, met de hand goedgekeurde werknemersevenementen uit aan de lonen, vergelijk uitzonderingen, beheer van uitkeringen en vergoedingen.

Prestaties en groei

Doelen, check-ins, feedback, beoordelingen, kalibratie, leren, vaardigheden, mentoring, interne kansen en opvolging.

HR-dienst en betrekkingen

Geef medewerkers privé ondersteuning terwijl ze grieven, discipline, klokkenluider en verzegelde zaak bewijs in specifieke toestemmingsgrenzen bewaren.

Analyse en planning

Gebruik maatregelen voor het personeel, plannen voor de telling van het aantal personen, benchmarks en ervaringsstatistieken die zijn afgeleid uit gegevens; laat nooit ontbrekende resultaten als succes zien.

Portaalkaart werknemers

Overzicht

Heeft uw aandacht nodig, veranderingen sinds het laatste bezoek, open verzoeken, komende evenementen, onboarding vooruitgang en aankondigingen.

Profiel en registers

Werkgelegenheid, geverifieerde record, documenten, machtigingen, privacyverzoeken en correctieverzoeken.

HR Ondersteuning en taken

Privégesprekken, verzoeken, acties die de werknemer en bedrijfseigen taken afzonderlijk tonen.

Je eerste dagen

Bewijs-backed onboarding tijdlijn met eigenaar, de juiste staat, voltooiing en geblokkeerd werk.

Tijd en vertrek

Balansen, verzoeken, beschikbaarheid, schema's en kalendergevolgen achterlaten.

Vaardigheden en groei

Leren, vaardigheid bewijs, doelstellingen, feedback, mentoring en interne kansen.

Mijn loon, uitgelegd

De werknemer mag informatie over de looncompensatie en -vergelijking in eenvoudige taal zien.

Onderneming

Directory en organisatieschema beperkt tot informatie collega's hebben gekozen of beleid stelt hen in staat om te delen.

Rechten en beslissingen

Toelichtingen, beroepsprocedures, toestemming, correctie, toegang en verwijderingsverzoeken.

💡
De portaalsite is mobiel-eerste. De rekeningkaart blijft bereikbaar, navigatie en inhoud scroll onafhankelijk op brede schermen, en mobiele navigatie overlays in plaats van duwen of het bedekken van de pagina. Lange verklarende kopie behoort tot toegankelijke tooltip of openbaarmaking componenten.

Veilige werkingssequentie

1
Beleid en machtigingen instellen

Stel de jurisdictie, rollen, goedkeuringspaden, bewaring, toestemming en functiecontroles in voordat u live records laadt.

2
Externe aanbieders verbinden

Installeer het passende ondertekende pakket, voer de minst-privilege referenties en pas verbinding en overeenstemming testen.

3
Uitvoeren in zandbak of schaduw

Oefen volledige workflows met deterministische gegevens en vergelijk het verwachte bewijs alvorens uitvoering van echte provider mogelijk te maken.

4
Vrijgave onder dubbele controle

Een andere geautoriseerde beoordelaar onderzoekt provider, veiligheid, privacy, juridische, billijkheid en toegankelijkheid bewijs.

PeopleOS HR

AI, eerlijkheid, video- en juridische controle

PeopleOS behandelt automatisering als een bestuurd gereedschapspad: beleidstoestemming, poging tot uitvoering, uitkomst van de provider en bewijs zijn afzonderlijke feiten.

AI- en agentcontrole

Elke agent gebruikt geregistreerde getypte tools met een doel, jurisdictie, risicoklasse en maximale autonomie. Menselijke overname, circuitonderbrekers, incidenten en jurisdictie verandert de uitvoering te stoppen. Correcties kunnen een voorgestelde dataset vormen maar niets trainen totdat een andere gemachtigde persoon de privacybeoordeling heeft voltooid.

Eerlijkheid

Definieer cohorten, minimale steekproefregels, statistieken, evaluatie-identiteit en een wettelijk vrijgegeven beoordeling. Ontbrekende gegevens blijven ontbreken; het wordt nooit omgezet in een pass.

Toelichting en beroep

Bouw verklaringen van verzegelde beslissing en beleidsbewijs. Stuur een beroep op een onafhankelijke mens en behoud resultaat bewijs.

Bevoegdheden

Vrijgeven land beleid pakt alleen met een verantwoordelijke wettelijke eigenaar, geciteerd juridische bronnen en het passeren van tests. Hoge-severity wet wijzigingen opschorten getroffen rijstroken.

EU-AI-wet

Behoud de systeeminventaris, risicoklasse, fundamentele rechten effectbeoordeling, mededelingen, toezichthouders, meters en bewijs.

Grens voor videoscreening

Voorziening is geen deelneming

hr.interview.room.provision maakt een ontmoetingslocatie aan. hr.interview.room.connect kan bewijzen dat de media de werknemer bereikt hebben.

Doelspecifieke toestemming

Opname, transcriptie en biometrische leven zijn aparte keuzes. Onttrekking geldt voor het geselecteerde doel.

Geen schijnanalyse

Het videocontract heeft geen veld of methode voor emotie, aandacht, aantrekkelijkheid, ras, handicap of uiterlijke gevolgtrekking.

Menselijke en tekstroutes

Een recensent kan de sessie permanent overnemen en er blijft een tekstaccommodatieroute beschikbaar.

Bewaaring en verwijdering

De connector rapporteert gecodeerd vervoer, actief beleid en media referenties van de provider, en moet verifieerbare verwijdering ondersteunen.

Aangemaakte kamer, AI afwezig

Scenario:
Er bestaat een zoomruimte URL, maar de mediabrug heeft geen audio/video geleverd aan de interviewmedewerker.
Wat te doen:

Laat de bijeenkomst als voorzien en AI deelname als vals zien. Houd het menselijke interview en tekst accommodatie paden beschikbaar.

Terugbellen zegt dat er een cheque is voorbij gegaan.

Scenario:
Een ondertekende achtergrond-check webhook meldt voltooiing.
Wat te doen:

Neem de terugroep als hint op en vraag vervolgens naar de provider. Alleen het geauthentiseerde statusantwoord kan de controle bijwerken.

🚫
Een technische toegankelijkheidsbeoordeling kan worden vastgelegd door de evaluator, maar WCAG-attest vereist een aparte persoon. Provider bewijs, juridische vrijlating en eerlijkheid bewijsmateriaal vereisen ook hun echte benoemde eigenaren.
PeopleOS HR

PeopleOS API en ontwikkeling van de connector

Gebruik de Algemene API voor geregelde HR-operaties en getypte connectorcontracten voor gezaghebbende externe systemen.

Algemene API bronnen van waarheid

JSON _aan sturen POST /api/v1.php. Ontdek het loopoppervlak door meta.actions, OpenAPI op /api/v1/openapi.php, en Postman op /api/v1/postman.php. De gegenereerde index hieronder bevat de exacte waarde van samengesteld hr.* acties en herzien platform.hr.* operaties in deze build, dus niets op deze pagina wordt met de hand getypt.

Lijst van personen
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}'
Een schrijven uitdrogen
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}'

Gebruik hr.read of hr.write alleen indien nodig. De doelbeheerder route controleert nog steeds zijn eigen toestemming. Schrijven vereist een stabiele idempotency sleutel; hoogrisico schrijft bevestiging vereisen. Probeer tijdelijke storingen met dezelfde sleutel en query herstel toestand na een onzekere timeout.

Elke gecoördineerde actie van de uren

48 curated hr.* actions (22 reads, 26 writes) and 484 reviewed platform.hr.* operations, out of 2418 named actions in this build. Generated from the action registry, the same source as meta.actions, OpenAPI and Postman.

Personen, organisatie en identiteit (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.

Verzoeken en berichten (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.

Vertrekken, leren en de connector markt (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.

Connectorcertificering en gezondheid (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.

Interviewruimtes (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.

Agenten en levenspaden (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.

Bevoegdheid (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.

Besluiten en beroep (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.

AI-kwaliteit (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.

Conversaties en retentie van de arbeidskrachten (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.

Gereedheid en vrijgave (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).

Connectorklassen

Inschrijving

hr_job_board, hr_background_check, hr_identity_verification, hr_assessment en hr_tax_right_to_work.

Aan- en aan boord

hr_esignature, hr_calendar, hr_video en hr_equipment_it.

Werkzaamheden van de arbeidskrachten

hr_payroll, hr_benefits, hr_learning, hr_expense_payment, hr_directory en hr_data_warehouse.

Mededeling

hr_messaging Het contract bevat geen methode voor het lezen van berichten door medewerkers.

Provider Gateway eindpunten

PeopleOS HR Provider Gateway 1.0
GET    /v1/hr/health
POST   /v1/hr/job-postings
PATCH  /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/job-postings/{provider_ref}/close
GET    /v1/hr/job-postings/{provider_ref}
POST   /v1/hr/background-checks
GET    /v1/hr/background-checks/{provider_ref}
POST   /v1/hr/identity-verifications
GET    /v1/hr/identity-verifications/{provider_ref}
DELETE /v1/hr/identity-subjects/{subject_ref}
POST   /v1/hr/payroll/worker-events
GET    /v1/hr/payroll/state?cursor=...
GET    /v1/hr/payroll/exceptions
POST   /v1/hr/equipment/requests
POST   /v1/hr/access/requests
GET    /v1/hr/provisioning/requests/{request_ref}
POST   /v1/hr/provisioning/requests/{request_ref}/revoke

De gateway vereist HTTPS, blokkeert onveilig/privé doelen, pinnen gevalideerd DNS resultaten, volgt geen redirects, beperkt respons grootte, vereist JSON, draagt deterministische idempotentie, en ondersteunt tijdstempel HMAC in beide richtingen. Webhooks zijn altijd hints gevolgd door provider re-query.

Inkomende webhook deuren

Drie openbare deuren ontvangen provider callbacks: POST /opsiq/ajax_api.php?ajax=hr_connector_webhook (velden connector_class, connector_key, topic), ?ajax=hr_esign_webhook (connector_key, offer_uuid, provider_ref) en ?ajax=hr_check_webhook (check_uuidElke controleer het lichaam via de gecertificeerde connector, brandt de levering zodat een herhaling sterft en registreert slechts een lopende re-query; het antwoord van de provider zelf verandert de record. Elke weigering is hetzelfde algemene antwoord op doel. PeopleOS levert geen uitgaande webhook evenementen vandaag: webhooks.events.list is de autoriteit en noemt geen in het hr familie, dus poll de hr.* lezen of gebruiken hr.connectors.health.

Gedetailleerde referenties

Complete PeopleOS-handboek

Gelezen doc/contracts/PEOPLEOS_HR.md in een zelf-gehoste installatie voor elke operator, API, connector, webhook en release regel.

Gateway-ontwikkelaarcontract

Het marktplaatspakket bevat README.md, DEVELOPER.md, connector_contract.json, hr_profile.json en een ondertekende manifest.

PeopleOS HR

Testen en productiebereidheid

Een lancering claim wordt berekend uit bewijsmateriaal. Pakket gereedheid, provider certificering, wettelijke goedkeuring, eerlijkheidsevaluatie en toegankelijkheid attest zijn bewust gescheiden.

1
Code en contracten valideren

PHP syntax, HR PHPUnit, route/APIpariteit, OpenAPI/Postman controles, pakket manifest enJSONSchema validatie.

2
Volledige workflows oefenen

Test rekrutering, AI review, interview/video, onboarding, handtekeningen, verlof, salarisadministratie, portal, meldingen, modes en connector falen paden.

3
Test responsieve en toegankelijke UI

Drive desktop, tablet en telefoon indelingen; toetsenbord, focus, labels, contrast, reflow, tooltips, dialogen, notificatie scroll en onafhankelijke navigatie.

4
Verzamel extern bewijsmateriaal

Gebruik echte provider rondetrips en verwijdering, juridische beleid releases, representatieve eerlijkheid gegevens en een onafhankelijke menselijke WCAG verklaring.

5
Vrijgave onder dubbele controle

Een beoordelaar die anders is dan de indiener keurt connector goed en geeft bewijs vrij. Revoce of kill-switch een connecter als het bewijs vervalt.

Wat elk resultaat betekent

Pakket ondertekend

Bestanden zijn niet gewijzigd sinds de goedgekeurde pakketondertekening. Het bewijst niet dat een rekening van derden werkt.

Sandbox is doorgegaan.

Deterministisch gedrag en staat overgangen voldoen. Het bewijst geen echte provider, residency term of verwijdering.

Productieconnector gecertificeerd

Een specifiek werkruimteaccount heeft de vijf verplichtingen aan de provider-kant onder dubbele controle doorstaan.

Technisch WCAG-rapport

Er zijn automatische en door beoordelaars geleide bewijzen voor genoemde oppervlakken.

Start gereed

Alle vereiste poorten zijn groen tegelijk en er is geen bewijs verlopen, ingetrokken, vermist of tegengesproken door levende gezondheid.

⚠️
Maak nooit een passerende juridische, eerlijkheid, provider of onafhankelijke-attestatie record alleen om de poort te wissen. Neem in plaats daarvan de blokkeer en eigenaar. De bereidheid uitzicht is waardevol precies omdat het weigert niet ondersteunde claims.
Waarom is een connector geïnstalleerd maar nog steeds niet beschikbaar?+

Installatie bewijst dat het pakket aanwezig is. Schakel het in, bespaar echte minst-privilege referenties, slagen voor de verbinding test, dan verlenen de bijpassende PeopleOS account productie bereik met behulp van echt bewijs van de provider en een andere recensent.

Waarom veranderde een webhook de plaat niet?+

De callback kan geldig zijn, maar slechts een hint. Controleer de webhook inbox, provider status endpoint en het resultaat van de verzoening. PeopleOS verandert alleen gezaghebbende staat na re-query.

Waar is de complete machineleesbare HR API?+

Meta.actions en filter oproepen voor uur en platform.hr.; of gebruiken/api/v1/openapi.phpen/api/v1/postman.php.Ze worden gegenereerd uit hetzelfde runtime register.

Steun

Hulpcentrum

Uw Help Center is een zelfbedieningshelp site gebouwd uit de artikelen die u publiceert. Klanten kunnen lezen en zoeken op hun eigen publieke pagina, en direct binnen het chat widget, zodat ze antwoorden kunnen vinden voordat ze ooit een gesprek openen. Alles erin komt van uw kennisbasis, dus dezelfde inhoud die je AI redeneert geeft ook jouw openbare hulp.

Waar uw klanten het zien

De eigen openbare pagina

Een schone, doorzoekbare help site op /help.php. Klanten bladeren door categorie, zoeken en openen elk artikel. U kunt het uw eigen naam en stijl geven.

Binnen het chat-widget

Een helplink in de chat widget zodat klanten uw artikelen kunnen doorzoeken zonder het gesprek te verlaten. Als ze nog steeds een persoon nodig hebben, zijn ze één tik verwijderd van het starten van een gesprek.

Zet het aan.

1
De pagina Helpcentrum openen

Ga naar Config, then Help Center in uw admin en schakel deze in Public Help Center inschakelen.

2
Geef het een naam en een blik

Stel de naam Helpcentrum in, die wordt weergegeven in de header en het tabblad browser, en kies een visuele stijl. U kunt de bovenste navigatie uitschakelen voor een schone pagina zonder menu.

3
Publiceer enkele artikelen

Niets toont tot je artikelen publiceert. Het volgende deel behandelt hoe.

Artikelen publiceren aan het Helpcentrum

Artikelen leven in je kennisbasis. Een artikel verschijnt in het Help Center zodra het gepubliceerd en gemarkeerd publiek is. Er zijn een paar manieren om dit te doen:

Publiceer één artikel

Open het artikel, markeer het gepubliceerd en zet de optie om het te tonen in het Helpcentrum.

Publiceer alles tegelijk

Gebruik de Alles publiceren knop om uw hele gepubliceerde set naar het Helpcentrum in één klik, in plaats van ze een voor een te doen.

Veelgestelde vragen omzetten in artikelen

Heb je al veelgestelde vragen? Publiceer alles om te helpen om ze te veranderen in help artikelen zodat ze naast al het andere zitten.

Importeer een bestaande kennisbasis

Verhuist u van een andere helpdesk? KB importeren De knop op het tabblad Artikelen brengt een bestaande kennisbasis voor u in. U hebt drie manieren om deze te richten op uw inhoud:

Plakken URL

Geef het adres van je huidige helpcenter op. Als het platform (bijvoorbeeld Zendesk) wordt herkend, leest het de exacte categorieboomstructuur van dat platform. Anders crawlt het de site en bouwt het opnieuw de structuur van de pagina's op, waarbij alleen de echte artikelen worden geïmporteerd en aanmeldings-, prijs- en contactpagina's worden overgeslagen.

Kies een verbonden app

Als een platform al verbonden is met deze werkruimte en het heeft een kennisbasis, dan verschijnt het in een dropdown onder Importeren uit een verbonden app. Selecteer het en importeer, geen URL of wachtwoord nodig. De app wordt alleen vermeld als deze is aangesloten en ingesteld.

Een CSV uploaden

Geen live site om naar te wijzen? Upload een spreadsheet met title, category, en body Columns. Parent / Child in de categorie kolom om geneste categorieën te bouwen.

Welke manier je ook kiest, je krijgt een voorbeeld eerste: de artikelen die het gevonden heeft, gegroepeerd per categorie, elk met een selectievakje zodat u alles kunt laten vallen wat u niet wilt. Niets wordt opgeslagen totdat u op Importeren klikt. Daarna kunt u Ongedaan maken de gehele invoer in één klik, of Hersynchroniseren a URL of connected-app import later om nieuwe en gewijzigde artikelen in te trekken.

💡
Ontwikkelaars: elke connector kan adverteren zijn kennis basis naar deze dropdown door het verklaren van een kb_capabilities blok in zijn settings.json (type kb_source, met een adapter en a base_template) Zie de Connectors sectie en de platform-connector referentie.

Organiseren met AI

Een nette help centrum is gemakkelijk te bladeren en gemakkelijker om te zoeken. Organiseren met AI knop doet het opruimen voor u. In een klik leest uw gepubliceerde artikelen, sorteert ze in verstandige categorieën, en voegt tags. Het creëert een categorie wanneer het nodig is, hergebruikt een categorie die al past, en slaat alles wat je hebt georganiseerd, zodat u kunt uitvoeren opnieuw wanneer u nieuwe artikelen toe te voegen. Laat AI zich in subcategorieën organiseren in Help Center instellingen en het kan ook bestanden onder geneste Parent / Child categorieën, die handig zijn direct na het importeren van een kennisbasis met subsecties.

💡
Categorieën geven klanten een manier om te bladeren, en tags scherp zoeken op zowel de openbare pagina als in het widget. U kunt hernoemen of verplaatsen dingen achteraf. De AI geeft u een sterk startpunt, niet een setup waar je aan vastzit.

Het Helpcentrum in uw chat-widget

U kunt het Helpcentrum direct in de chat-widget tonen zodat mensen antwoorden zoeken voordat ze u een bericht sturen. Kies in uw widgetinstellingen waar de help-link verschijnt:

In de kop

Een kleine hulppictogram bovenaan het widget.

Onderaan

Een tekstlink onder het berichtveld, bijvoorbeeld "Helpcentrum doorbladeren." U kunt de formulering wijzigen.

Beide plaatsen

Toon het in de kop en onderaan voor het meest zicht.

De help-link heeft een eigen kleurregeling onder de widget Uiterlijkinstellingen. Laat deze aan staan Geen om uw lanceerder kleur te passen, of kies een Vast kleur of a Verloop. De hele help ervaring volgt uw widget thema, zodat het altijd lijkt op een deel van je merk.

Plaats uw helpcenter op uw eigen webadres

Uit de doos heeft uw help center al een schoon, deelbaar adres (bijvoorbeeld /help/your-help-center) U kunt een stap verder gaan en het onder uw eigen domein, zodat klanten en zoekmachines zien het als onderdeel van uw merk, bijvoorbeeld yourdomain.com/help of help.yourdomain.com. Alles blijft werken aan uw domein: links, afbeeldingen, zoeken en de beoordeling van het artikel.

Onder uw hoofdsite

In Configureren en dan helpen met centreren, open de Ingeschakeld tabblad en vind "Toon uw helpcenter op je eigen webadres." Kies uw setup (Cloudflare, Nginx of Apache), kopieer het kant-en-klare blok, en plak dit in uw site. Elke optie heeft een Hulplijn instellen knop ernaast met de exacte stappen.

Op een subdomein

Voorkeur help.yourdomain.com? Hetzelfde paneel heeft een subdomein optie. Op Cloudflare is een subdomain de meest betrouwbare route, en het geeft je een schoon adres met niets erna.

💡
Using Cloudflare? It only runs its Worker on an address that is proxied through Cloudflare (the orange cloud). Your main domain often points straight at your website, so a rule placed on the main domain can quietly do nothing. The dependable way is a proxied subdomain like help.yourdomain.com. De setup gids voert u door het ene DNS record en de route.
Goed voor SEO. Zodra uw helpcenter op uw eigen domein is, indexeren zoekmachines uw artikelen onder uw merk. Elke pagina verklaart zijn juiste adres en de sitemap lijsten van hen, zodat hetzelfde artikel nooit tweemaal wordt geïndexeerd.
💡
Gebruik ook de hulplink in-widget? In het chat widget "Openen in helpcenter" instellingen, ingesteld Waar de link naartoe gaat tot Uw eigen helpcenter domein en voer hetzelfde adres in. Dan openen die artikellinks ook op uw domein, niet op het OpsIQ -adres.

Zie hoe het met je hele helpcentrum gaat

Naast de stemmen van één artikel, heeft het Help Center zijn eigen analyse. Zet het aan in Help Center instellingen en het stil registreert hoe mensen gebruik maken van uw hulp: de meest bekeken artikelen, wat ze zoeken, en zoekopdrachten die terug leeg (een kant-en-klare lijst te schrijven), het uitwerken van bezoeker land en apparaat op zijn eigen, dus het heeft niet nodig dat de chat widget geïnstalleerd om te melden. Elk nummer wordt getoond voor beide plaatsen uw hulp verschijnt, de openbare pagina en de in-widget hulp, evenals gecombineerd, zodat u kunt zien hoeveel elk daadwerkelijk wordt gebruikt.

💡
Analytics blijft uit totdat je het aanschakelt, en je kunt bezoeker IP adressen geanonimiseerd. Niets wordt opgenomen voordat u zich opteert.

Kies wat er op elk deel van de pagina verschijnt

Elk deel van het Helpcentrum (de categorieën op de homepage, de populaire artikelen, de lijst met artikels op een categoriepagina en meer) heeft zijn eigen eenvoudige regel. Voor elk één kunt u tonen of verbergen, en show alle artikelen, a nummer van de set, de laatste, of alleen degene die je functie Als een regel de lijst afsluit, krijgen klanten nog steeds een "Alles tonen" link, dus niets is echt buiten bereik.

U beslist ook hoe de behulpzame stemmen eruit zien: verborgen, een vriendelijke verhouding zoals "12 van 14 vond dit nuttig", of gewone duimen telt. Een minimum-stemmen instelling stopt een gloednieuwe artikel tonen van een ongemakkelijke "0van0".

Zie welke artikelen werken

Elk artikel toont een Was dit behulpzaam? prompt. Elke ja of nee wordt geteld per artikel, zodat u kunt zien in een oogopslag welke artikelen vragen goed beantwoorden en welke moeten worden herschreven. Herhaalde stemmen van dezelfde bezoeker worden genegeerd, dus de tellingen blijven eerlijk.

Tekst en etiketten

U kunt de rubrieken en labels op het Helpcentrum wijzigen om uw stem te laten overeenkomen. Laat elk veld leeg en het valt terug naar een verstandige standaard, zodat u alleen de tekst die u wilt wijzigen bewerken.

Het Helpcentrum deelt een bibliotheek met uw AI. Elk artikel dat u hier publiceert is dezelfde inhoud die de AI gebruikt om chats en tickets te beantwoorden, dus het verbeteren van het één verbetert de ander.

Gemeenschappelijke vraagstukken

Moet ik aparte content schrijven voor het Help Center?+

Nee. Het is gebouwd uit dezelfde kennis basis artikelen die de AI al gebruikt. Publiceer een artikel eenmaal en het kan dienen beide.

Mag ik wat artikelen intern houden?+

Alleen artikelen die je publiceert en publiekelijk markeert verschijnen in het Help Center.

Kunnen klanten nog steeds iemand bereiken?+

De widget help link zit een tik verwijderd van het starten van een gesprek, dus zelfbediening nooit vallen iemand.

Groei & SEO

Site Intelligence (SEO-suite)

Site Intelligence is OpsIQ's ingebouwde SEO en zoek-zichtbaarheid suite. Het kruipt uw site als een zoekmachine, tracks waar u rangschikken, onderzoekt trefwoorden, horloges backlinks en concurrenten, scant uw lokale kaart aanwezigheid, controleert pagina snelheid, en verandert het allemaal in klant-ready rapporten, met een AI analist die uitlegt wat te repareren en kan ontwerpen van de oplossingen. Het is een premium functie; wanneer ingeschakeld verschijnt het als Site intelligentie in de zijbalk. Elke domeingegevens blijft gescheiden, kruipt, ranglijsten en rapporten nooit mengen tussen domeinen.

Site Intelligence (SITE)
Dashboard voor Site IntelligenceEen SEO dashboard met een site-health score, trefwoord rang bijhouden en een trend van het verkeer.Site Intelligence (SITE)yoursite.com86GEZONDHEIDSZORG3 kritieke kwestiesTracking van zoekwoordenHelpdesk#3Live chat saas#7CRM voor agentschappen#12Biologische klikken1CROWLVindt technische problemen2TRACKRangen, zoekwoorden, backlinks3AI ANALYST - 2018Verklaart en stelt de oplossing vast
Het overzicht van de Site Intelligence: een site-health score uit de nieuwste kruip, live keyword rang tracking, een organische-clicks trend en de drie stappen loop: kruipen, track, laat de AI ontwerp de oplossingen.

Site-intelligentie opvragen

Site Intelligence maakt deel uit van de plannen die het meedragen. Op een plan dat niet werkt, werkt het precies zoals PeopleOS HR: de eigenaar opent Account → Toevoegen & Tokens, kiest een Site Intelligence tier en begint de gratis proefversie of voegt het rechtstreeks toe. Een gratis plan, of een betaald plan nog steeds in zijn eigen planning trial, kan niet toevoegen. Totdat het eigendom is van de suite wordt verborgen uit de zijbalk en een directe koppeling biedt de add-on; wanneer een tier cap wordt bereikt de pagina biedt het volgende niveau; Wanneer een proef eindigt zonder aankoop wordt het recht verwijderd en niets wordt opgeladen. Tiers en prijzen leven op de rekening, dus zie de huidige niveaus op de prijskaartje.

Start hier met een kruip · start hier

Een crawl is OpsIQ uw pagina's bezoeken zoals een zoekmachine zou, om technische problemen te vinden: gebroken links, ontbrekende titels, dunne inhoud, trage pagina' s, indexeren van problemen.

1
Start de kruip

Klik op het overzicht om een kruip te starten. OpsIQ wachtrijen en werkt door uw pagina's in de achtergrond; een status indicator toont vooruitgang.

2
Lees de rapporten

Wanneer het klaar is, open de problemen en de pagina lijst. Elk probleem wordt gegroepeerd door ernst zodat u pakt de grootste overwinningen eerst.

3
Laat de AI helpen.

De AI analist produceert een eenvoudige taal brief van wat er mis is en waarom het belangrijk is, en kan genereren voorgestelde oplossingen die u beoordelen voordat toepassing.

Wat Site Intelligence tracks

Kruip & gezondheid op de bouwplaats

Scant uw pagina's voor technische SEO-problemen en geeft een lijst van elke pagina met zijn problemen. Herrun elk moment, of schema het.

Rangvolgorde

Voeg de sleutelwoorden toe waar je om geeft; OpsIQ controleert waar je site zich opvolgt en volgt beweging in de loop van de tijd.

Onderzoek naar sleutelwoorden

Ontdek nieuwe zoekwoord ideeën om te richten, met de AI sleutelwoord coach om prioriteit te helpen.

Terugkoppeling

Zie wie naar u verwijst, vernieuw de lijst en disavow links die u niet wilt koppelen aan uw site.

Concurrenten

Voeg concurrent domeinen toe en vergelijk uw zichtbaarheid met die van hen, met een AI-concurrent analyse.

Lokaal (kaart) raster

Scan de zichtbaarheid van lokale lijsten over een geografisch raster om te zien waar u op de kaart verschijnt, plus Google Business Profile-tools.

Paginasnelheid

Voer pagina-snelheid controles zodat u trage pagina's die pijn doen rangschikken en conversies kunt repareren.

AI-gehalte

Genereer inhoudsslips en ontwerpen gericht op de trefwoorden die u targeting.

Verslagen

Bouw printbare, klantgerichte rapporten van alles wat hierboven staat.

Sluit Google aan voor nauwkeurige gegevens

Twee Google-connectoren maken van schattingen echte getallen:

Google Zoekconsole

Zoeken

Trek de exacte vragen, klikken en indrukken Google rapporteert voor uw site, kaart uw eigendom, en oppervlakte rangschikking mogelijkheden rechtstreeks uit Googles eigen gegevens.

Google Analytics 4

Verkeer

Breng uw verkeers- en betrokkenheidsgegevens naast uw SEO-gegevens, zodat rapporten zichtbaarheid en gedrag samen tonen.

Geplande meldingen van white-labels

Je hoeft niet alles met de hand te draaien. Geplande verfrissen herrun kruipt, rangcontroles, trefwoord controles, backlink verfrist, lokaal-raster scant en het genereren van een cadans (dagelijks of wekelijks afhankelijk van plan en volume). Deze lopen door de OpsIQ cron, zie de sectie Cron en automatisering. Gegenereerde rapporten exporteren als afdrukbare, klantgerichte documenten: agentschappen sturen elke client een regelmatige SEO update, en omdat elk domein gegevens is gescheiden, ziet elke cliënt alleen maar hun eigen.

Sommige Site Intelligence functies bellen externe data providers en AI via OpsIQ' s geconfigureerde provider. Ze werken uit het vak wanneer de suite is ingeschakeld voor uw plan. Als een vernieuwing niet draait, bevestig dan dat OpsIQ cron loopt (zie Cron en automatisering).
Moet ik iets toevoegen aan mijn site voor SEO tracking?+

Kruiptochten, rangvolgen, zoekwoord onderzoek en backlinks werken zonder uw site aan te raken. Voor verkeer en exacte zoekgegevens, sluit Google Search Console en GA4.

Kan ik meer dan één domein volgen?+

Ja. Voeg elk domein apart toe; hun kruipen, rangschikkingen en rapporten blijven volledig van elkaar geïsoleerd.

Hoe vaak moet ik kruipen?+

Wekelijks is genoeg voor de meeste sites; kruipen op aanvraag na een grote inhoud of structuur verandering. Stel een schema in zodat je nooit vergeet.

Groei & SEO

Auto-implementatie (SEO-agent)

Auto-Implement is het deel van Site Intelligence dat daadwerkelijk de fixes de kruip en AI analist aan te bevelen, in plaats van alleen u adviseren. De agent werkt strikt uit wat Site intelligentie al gevonden (het kan nooit een verandering uitvinden) en loopt elke fix door dezelfde veilige loop: een droog-run preview, uw per-stap goedkeuring, de live schrijven, een automatische snapshot, en een her-crrawl die bewijst dat de open-issue tellen ging naar beneden. Het is een Managed-AI-only functie; het lijkt als de Auto-Integration (rocket) actie binnen de sectie Site Informatie, en het is uitgeschakeld totdat je het aanzet.

Automatisch implementeren
Auto-implementatie SEO agentEen stroom die aanbevolen SEO fixes bewegen door preview, goedkeuring en een live-schrift, met een prove-it re-crrawl.Automatisch implementerenyoursite.comAanbevolen oplossingenAdd missing <title>goedgekeurdRobots. txt herstellengoedgekeurdSitemap indienen._xmlherzieningDRY-RUN VOORVERTONING (DIFF)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>GoedkeuringOverslaanBewijzen - opnieuw CRAWLOpen problemen 124Snapshot opgeslagen1VOORUITZICHTDry-run diff van elke fix2KEUR & WRITE GOEDSSH of gehost API3BEWIJS & ROLLBACKHerkauwen + snapshot
Hoe een sessie draait: de agent geeft een lijst van de oplossingen Site Intelligence al aanbevolen, toont een dry-run diff van elk, past degenen die u keurt over SSH of een gastvrouw API, snapshots voor elke schrijfbeurt, en herkruipt om te bewijzen dat de open-issuetelling is gedaald.

Wat het kan veranderen

De agent alleen maar gebruikt fixes die Site Intelligence (of de AI analist) al aanbevolen voor dat domein. Over de ondersteunde platforms die betrekking hebben op:

Serverconfiguratie

sitemap.xml, robots. txt en redirect, canonieke en header regels in . htaccess (Apache / LiteSpeed) of de nginx configuratie.

kettingen omleiden

Ineenstorting van een multi-hop redirect keten naar beneden tot één hop recht naar de uiteindelijke URL, binnen hetzelfde beheerde . htaccess blok, dus snelheid en koppeling waarde stoppen te lekken door de extra hop.

Page <head>

Ontbrekende of zwakke pagina titels, meta beschrijvingen, canonieke tags en gestructureerde-data (schema) blokken.

WordPress SEO

Yoast, Rang Wiskunde en SEOPress titels & meta, en afbeelding alt tekst, toegepast via WP-CLI op de SSH pad of het REST API op het gehoste pad.

WordPress gestructureerde gegevens

Voegt toe JSON-LD (schema) naar pagina's die het missen. Op de SSH pad een kleine beheerde helper (een must-use plugin) drukt de markup af, zodat het werkt met of zonder SEO-plugin; op het gehoste pad uw SEO plug-in draagt.

Interne links

Voegt een relevante interne link binnen bestaande WordPress inhoud om weespagina's te redden en gerelateerde berichten aan te sluiten. Eén link per pagina, nooit binnen een kop, een bestaande link of een shortcode, en altijd eerst goedgekeurd door u.

Dunne pagina-inhoud herschrijft

Concepten volledige vervanging inhoud voor dunne pagina's (aangevinkt door een kruip optie, zie hieronder). Elke ontwerp wordt herzien en goedgekeurd door u voordat er iets publiceert, en de oude inhoud wordt bewaard zodat het kan worden hersteld.

Paginacache (WordPress)

Schakel W3 Total Cache pagina caching wanneer de kruip vindt snelheidsproblemen en die plugin is geïnstalleerd, zodat pagina's sneller dienen.

Shopify SEO

Product en collectie SEO titels & beschrijvingen, pagina en blog-artikel SEO, plus 301 redirects, via de Shopify Beheerder API.

Webflow SEO

Per pagina SEO titel en meta beschrijving door middel van de Webflow Gegevens API v2.

De fixes automatisch voorbereiden (twee kruipopties)

Het Site Intelligence Configure panel voor een domein (zijn kruipinstellingen) heeft twee opties die bepalen hoeveel het agent zich voor u opmaakt. Beide zijn standaard uitgeschakeld en beide gebruiken AI-krediet, dus je schakelt ze alleen in als je dat werk voor u wilt doen.

Auto-voorbereiding AI herstelt na elke kruip

Elke kruip schrijft ook de betonnen fix-content (titels, meta beschrijvingen, alt tekst, schema, redirects) voor wat het gevonden heeft, zodat de oplossingen klaar zijn om te beoordelen en toepassen van het moment dat de kruip eindigt in plaats van later gegenereerd op aanvraag. Gebruikt AI krediet op elke kruip.

AI-inhoud herschrijft (dunne pagina's)

De agent mag volledige vervanging inhoud voor dunne pagina's opstellen. Niets wordt ooit gepubliceerd op zijn eigen: elke ontwerp verschijnt als een wijziging die u zij aan zij te beoordelen en keurt of verwerpt, de vorige inhoud wordt gehouden zodat het is omkeerbaar, en het is beperkt tot een paar pagina' s per pas. Gebruikt AI krediet per concept.

💡
Beide opties alleen voorbereiden en ontwerpen werk. Elke verandering gaat nog steeds door dezelfde per-stap goedkeuring, snapshot en rollback als elke andere fix, dus het inschakelen van hen nooit iets live op zichzelf zet.

Twee manieren waarop het verbindt

SSH / SFTP pad

Zelfbeheer

Voor sites op uw eigen server, de agent verbindt via SSH/SFTP met behulp van referenties die u opslaat, bewerkt de server config en pagina bestanden direct, en voert WP-CLI voor WordPress. Beste wanneer u toegang tot de shell en volledige controle van bestanden wilt hebben.

Gehost.API pad (geen SSH)

Geen shell

Voor platformen die niet toestaan SSH, de agent werkt volledig via een ambtenaar API connector, WordPress (REST + Application Passwords), Webflow (Gegevens API v2) en Shopify (Admin API Er is niets geïnstalleerd op de host.

💡
Wix en Squarespace hebben geen publieke SEO-write API, dus op die platforms Auto-Implement draait in adviesmodus: het toont u de exacte verandering te maken (de precieze titel, meta of instelling) voor u om toe te passen met de hand. Al het andere is alleen-lezen en veilig.

Zet de connectoren aan

De agent bereikt elk platform via een connector:

Ingebouwd

Shopify en WordPress verbindingsstukken schip met OpsIQ, schakel ze gewoon in onder Connectors en voeg de store / site referenties.

Vanuit de markt

Webflow, Wix en Squarespace installeren van Connectors → Marketplace, dan op dezelfde manier verbinden.

Hoe een sessie draait

1
Kies de fixes

Open Auto-Implement (raket) uit de sectie Site Intelligence. Het geeft een lijst van de problemen die Site-Intelligentie al heeft gevonden dat het kan oplossen op dit domein.

2
Voorbeeld van elke wijziging

Voor elke fix toont het middel een dry-run diff (precies wat het zal schrijven) voordat iets de live site raakt.

3
Stap voor stap goedkeuren

Je keurt elke wijziging individueel goed (of slaat over). Niets wordt toegepast zonder je expliciete toestemming op die stap.

4
Het schrijft, dan snapshots

Bij goedkeuring verandert de agent live over SSH of de gastvrouw API en slaat een snapshot eerst, zodat elke wijziging kan worden teruggerold.

5
Bewijs het, live

Zoals het van toepassing is elke wijziging de agent onmiddellijk opnieuw controleert die exacte pagina en toont een per-stap .. once live . veroordeel, zodat je ziet elke vast te stellen land op de live-pagina als het gebeurt. Aan het einde herkruipt de hele site en bevestigt dat de open-issue tellen gedaald.

Veiligheid & facturering

Alleen SEO

De agent kan alleen doen wat Site Intelligence voor dat domein aanraadt. Het kan geen willekeurige wijzigingen aanbrengen in uw site of server.

Goedkeuring per stap

Elke schrijfwijze wordt als een diff bekeken en pas toegepast nadat je die specifieke stap hebt goedgekeurd.

Terugrollen van napshot

Een snapshot wordt opgeslagen voordat elke schrijfbeurt plaatsvindt, zodat iedere wijziging kan worden teruggedraaid.

Live per stap bewijs

Elke veranderde pagina wordt opnieuw gecontroleerd het moment dat het is geschreven en krijgt een .. ongedeelde live

Inhoud wordt nooit automatisch gepubliceerd

Interne links en thin-page content rewrites zijn een hogere impact, zodat ze altijd worden getoond aan u voor goedkeuring en nooit automatisch toegepast, welke modus je ook draait.

Alleen beheerd-AI

Auto-Implement draait op Managed AI; het wordt geblokkeerd wanneer een werkruimte zijn eigen (BYOK) sleutels gebruikt.

Facturering

AI tokens factuur normaal als je ze gebruikt, plus een vaste per-gebruik vergoeding per Auto-Implementatie sessie, beide getrokken uit dezelfde Managed-AI krediet.

Auto-Implement is standaard uitgeschakeld. Schakel het in op de AI configuratie pagina (Auto-Iplement kaart) en zorg ervoor dat de aansluiting voor uw platform eerst wordt aangesloten.
Verandert het iets zonder te vragen?+

Nee. Elke wijziging wordt als een dry-run diff bekeken en alleen toegepast nadat u die exacte stap goedkeurt. Een snapshot wordt opgeslagen voordat elke schrijf zodat je kunt terugrollen.

Heb ik nodig SSH Toegang?+

Niet op WordPress, Shopify of Webflow. Die werken via hun officiële APIs zonder shell toegang. SSH is slechts één van de twee paden, gebruikt wanneer u wilt dat de agent serverconfiguratie en bestanden direct op uw eigen server bewerken.

Hoe weet ik dat het werkte?+

Na het toepassen van de goedgekeurde fixes de agent herkruipt de site en toont de open-issue tellen voor en na, zodat u kunt bevestigen dat de oplossingen verminderd de problemen.

Zal het pagina-inhoud herschrijven of publiceren op zijn eigen?+

Nee. AI-content herschrijft zijn uit totdat u ze in de kruipopties aanschakelt, zij zijn beperkt tot een paar dunne pagina's per pass en elke ontwerp wordt getoond voor side-by-side goedkeuring voordat er iets publiceert. De vorige inhoud wordt bewaard, dus een herschrijven kan altijd worden teruggedraaid.

Kan ik het gebruiken met mijn eigen Al sleutels?+

Nee. Auto-Implement is alleen beheerd-AI en wordt geblokkeerd onder BYOK. Het factureert AI tokens normaal plus een vaste per-use vergoeding per sessie, van dezelfde Managed-AI krediet.

Groei en engagement

Studio

Survey Studio is de werkruimte voor het maken van bewerkbare enquêtes die kunnen worden geleverd als een rijke standalone pagina, website widget of inline embed. Het huidige product biedt ook gehoste links, getekend concept previews, privé uitnodigingen, QR delen, respons browsen en enquête-geocoped analytics. De website witget is één leveringskeuze; het is niet de definitie van een enquête.

⚠️
Stroom-versus doelgrens: de premium creatie en preview ervaring, Connector Builder survey De Survey Studio heeft nog steeds de onafhankelijke multi-dienst architectuur, ondertekend-token enquête Identity Gateway, targeting/variabele bedrading, CRM Outreach verzenden stroom en getypt nodig surveys.* API_.

Een enquête maken

1
Kies hoe mensen het zullen opnemen

De huidige wizard biedt Standalone pagina & link, Website widget en Inline inbedden. De goedgekeurde doelstroom begint met het enquêtetype en voegt later CRM e-mail, private-link en QR implementaties toe als eersteklas keuzes.

2
Kies het doel

Kies NPS, CSAT, CES, product feedback, post-aankoop, annulering, onboarding, website, evenement, webinar, ondersteuning, lead/demo, trial, getuigenis, onderzoek, werknemer, inname of algemene feedback.

3
Een volledig sjabloon gebruiken of leeg beginnen

De huidige catalogus heeft klaar bewerkbare starters gegroepeerd per doel. Het kiezen van een sjabloon maakt een gekopieerde ontwerp: het wijzigen van uw enquête verandert de starter of een andere enquête niet.

4
Aanpassen of Snel beoordelen

Pas elke vraag, ontwerp, gedrag en leveringscontrole aan. Snelle beoordeling opent dezelfde concept bij de uiteindelijke klant-view check. Niets publiceert of stuurt automatisch.

Bezorging keuzes en huidig gedrag

Zelfstaande pagina & verwijzing

Een responsieve branded pagina met een eigen URL. Gebruik privé uitnodigingen en vervaldatum wanneer elke ontvanger een gecontroleerde link nodig heeft. QR delen punten op deze gehoste ervaring.

Website-widget

Het gemigreerde legacy kanaal. Het kan pagina, aardrijkskunde, apparaat, bezoeker, datum, bemonstering, afkoeling, bezoek en quota regels gebruiken. Het wordt nog steeds ondersteund door de erfenis actieve-widget brug terwijl de implementatie architectuur is gebouwd.

Inline inbed

Een responsieve enquête geplaatst in een pagina, portal, product of help center. Het vereist geen Promotie Studio.

E-mail

Vandaag de dag kan de Studio uitnodigingen genereren HTML en privé links. End-to-end verzenden van CRM contacten/segmenten, met toestemming, onderdrukking, planning, retry en respons correlatie, is het goedgekeurde CRM Outreach integratie doel.

Ontwerp en voorvertoning van ondernemingen

De enquête pagina's hebben overzicht thema's en page-layout families, responsieve controles, welkom en voltooiing kopie, en een ondertekende ontwerp preview. De designer preview is volledige breedte onder de editor, niet een smalle zijrail. Het maakt gebruik van de echte gehoste runtime in een sandboxed kader en ondersteunt bureaublad, tablet en telefoonbreedtes; voorbeeldverkeer schrijft geen antwoorden of analyses.

💡
Survey Studio is onafhankelijk van Promotion Studlo. Runtime targeting, identiteit, activa, rendering en analytics moet in handen zijn van de enquête. Promotie-inhoud mag alleen worden hergebruikt door een expliciete eenmalige kopie/import die losse Survay gegevens creëert; later Promoties mogen geen effect hebben.

Het volledige product

Onafhankelijke inzet

Levend

Een enquête kan apart versioned pagina, widget, embed, CRM e-mail, private-link en QR implementaties hebben, elk met zijn eigen staat, ontwerp, publiek en analytics. Elke enquête kan worden gepauzeerd, uitgeschakeld of verwijderd.

CRM-uitreiking en -campagnes

Levend

Bouw een geverifieerd publiek van CRM-segmenten en Survey-compatible connectors, bevries het in een onveranderlijke versie, geef één ondertekende uitnodiging elk uit, en stuur door de gepinde uitgaande e-mailconnector met per-uitnodiging leveringsbewijs.

Veldkit en validatie

Levend

Schuifregelaars, beeldkeuze, bestand uploaden, handtekening, adres, telefoon, kopjes en rijke tekst, met min/max lengte, e-mail /URL/nummerpresets, aangepaste fouttekst en voorvulling per vraag URL parameters.

Logica, formules, uitkomsten

Levend

AND/OR conditiegroepen, branch regels, een veilige formule motor over antwoorden en score banden die hun eigen resultaat pagina dragen: een gescoorde quiz landt op zijn vonnis.

Taal, kiosk, voorvulling

Levend

Een dropdown van de bezoeker taal alleen talen met echte vertalingen, kiosk modus voor gedeelde tablets (grotere doelen, auto-reset, geen redirects), een prefill link bouwer, en bewerkbare secure-badge en footer tekst.

Testen van versie A/B

Levend

Publiceer een uitdager versie op elke implementatie met een verkeer split. Bezoekers worden toegewezen kleverig, antwoorden zijn gestempeld met de versie daadwerkelijk bediend, en de vergelijking tabel toont reacties, voltooiing en gemiddelde score per versie. Promote the winnaar in one click.

Wekelijks verteren

Levend

Een wekelijkse e-mail met de laatste 7 dagen van enquête KPI's, de drukste enquêtes, de feedback puls en de nieuwste AI briefing, verzonden via de gepinde uitgaande connector. Configureren in Delivery Centre, Automation.

Bestuur

Levend

Per survey toegang lijsten beperken wie een enquête kan bewerken, publiceren of verwijderen. Publiceer goedkeuring (vier-ogen) vereist een tweede admin om de exacte ontwerp vrij te geven; bewerken herstart de goedkeuring. Ontwerp delen links laat een recensent zien het echte concept zonder in te loggen.

Ontwikkelaarsplatform

Levend

Connectorcontract 2.2, getypte enquêtes.* en feedback.* acties op api/v1, canonical survey.* evenementen, duurzame ondertekende webhooks met Slack en Google Sheets relaisformaten en one-respons PDF uitvoer.

Groei en engagement

Onderzoek Analytics en feedback zijn verschillende producten

Onderzoek Analytics legt uit hoe een enquête zelf mensen bereikt en uitvoert. Feedback legt uit wat klanten zeiden over alle toegestane bronnen en wat het bedrijf eraan moet doen. De twee producten koppelen aan elkaar maar delen of overschrijven analytische waarheid niet.

Analyse van de enquête

Geïntroduceerd uit de individuele enquête in Survey Studio, niet vanuit de wereldwijde navigatie. Het meet subsidiabiliteit, blootstelling, trigger gedrag, start, voltooiing, verlaten, vraag en tak wrijving, timing, implementatie/campagne / versie resultaten en runtime betrouwbaarheid.

Feedback-overzicht & Postvak IN

Een permissie-bewuste chronologische feed voor voltooide enquête antwoorden, legacy widget feedback, chat en ticket CSAT, ticket antwoord feedback, klant AI-antwoord beoordelingen, kennis-base nuttige stemmen en goedgekeurde externe / aangepaste bronnen.

Analyse van feedback

Analyseert de betekenis van klanten: originele metrische trends, onderwerpen/thema's, sentiment, emotie, intentie, urgentie, verzoeken, klachten, lof, reis/product/service/teamsegmenten, tegenstanders en gesloten-loop resultaten.

Gegevenseigendom

De enquête antwoorden blijven gezaghebbend in de opslag van Survey. Feedback slaat een herbouwbare bron referentie en afgeleide signalen, dan ladingen toegestaan bewijs op aanvraag. Een voltooide enquête respons wordt maximaal één Feed back item.

⚠️
De huidige Feedback-pagina heeft nog steeds een Survey response browser en een aparte legacy widget inbox, en de AI totaalen maken nog geen gebruik van het volledige genormaliseerde bronmodel. Het uniforme Overzicht / Inbox / Analytics / Bronnen & health design is het implementatiedoel.

NPS, CSAT, CES, sterren, duimen en behulpzaamheid moeten altijd hun oorspronkelijke methode, schaal, monster, datum venster en noemer behouden. Ze mogen nooit worden gecombineerd in een onverklaarbaar gemiddelde.

Groei & SEO

Promotie Studio

De Promotion Studio maakt van uw website een conversie-engine. Ontwerp pop-ups, banners, dia-ins, top/bottom bars, volledige scherm overnames, inline blokken en zelfs country-based redirects, dan tonen de juiste boodschap aan de juiste bezoeker op het juiste moment. Alles wordt geleverd via de OpsIQ widget al op uw site, zodat er niets extra's te installeren. U ontwerpt en campagnes opslaan elk moment; ze laten alleen zien zodra u ze publiceert en de studio is ingeschakeld voor uw werkruimte.

Promotie Studio
Promotie Studio ontwerperEen visuele campagne ontwerper met een blokken palet, een pop-up op het doek en een targeting panel.Promotie Studio - OntwerperBLOKKENxWelkom, {first_name}_!Get 15% uit uw eerste bestellingSAVE15Claim mijn couponDOELSTELLINGLandUS, New YorkTriggerIntent van de uitgangA/B-splitsing50 / 50Publiceren1ONTWERPBlokken op doek slepen2DOELLand, pagina, publiek3MAATREGELA/B winnaar + AI inzicht
De visuele ontwerper: een blok palet links, uw campagne op het canvas (hier een gepersonaliseerde coupon pop-up met behulp van een {first_name} token), en de targeting + publiceren panel aan de rechterkant.

Het grote geheel

Campagne

Wat

Een promotie: een pop-up, banner, bar, dia-in, volledig scherm, inline blok of geo-redirect. Elk heeft een doel: verkoop, lood, aanmelden, chat, enquête, aankondiging.

Ontwerpen en versies

Hoe

Je bouwt de look in de visuele editor. Elke save creëert een nieuwe versie, zodat je altijd terug kunt rollen. Niets is ooit verloren gegaan.

Doel

Wie

Wie ziet het: land, pagina, apparaat, verkeersbron, terugkeer vs nieuwe, schema en (met een connector) uw ingelogde klanten.

Triggers

Wanneer

Wanneer het verschijnt: direct, bij vertraging, op scroll, bij exit-intent, wanneer inactief, op een klik, na N pagina's, of van chat / ticket activiteit.

Analyse

Resultaten

Live impressies, click-through, conversies, een drop-off trechter, country / pagina / apparaat splits, A/B winnaars en een AI inzicht.

Start je eerste promotie in 5 stappen

1
Beginnen met een sjabloon of leeg

Open Promotie Studio en klik op Nieuwe campagne, of kies een kant-en-klare ontwerp uit de Templates gallery. Een concept opent in de ontwerper.

2
Ontwerp het

Sleep in blokken, rubrieken, tekst, knoppen, afbeeldingen, badges, statistieken, aftelaftellen, formulieren, coupons, video's, beoordelingen, spin-wheels. Style kleuren, kleurverloop en 3D effecten met de schuifregelaars. Preview Desktop / Tablet / Mobiel, en gebruik Gratis verplaatsen om overal te plaatsen.

3
Personaliseer het

Typ tokens zoals {first_name}, {country} of {company} In elke tekst. Op show-tijd worden ze de echte waarden van de bezoeker.

4
Doel-starter

Kies wie het ziet (land, pagina, apparaat, publiek) en wanneer het vuurt (vertraging, scroll, exit-intent). Laat een regel leeg om iedereen te bedoelen.

5
Controleren en publiceren

Klik op Controleren voor een snelle pre-lancering scan, vervolgens Publiceren. Het gaat live binnen enkele seconden en begint met het verzamelen van analyses.

Blokkeren die je kunt bouwen

Inhoud

Kern

Rubriek, paragraaf, lijst, citaat, afbeelding, pictogram, badge, stat, scheidingswand en spacer, de bouwstenen van elk bericht.

Oproep tot actie

Kern

Knoppen met echte acties: open een link, start een chat, maak een ticket aan, kopieer een coupon of ga naar een pagina.

Spoed & vangen

Premie

Teltijd, formulieren (e-mail / telefoon / tekst), coupon onthult en video inbedden.

Gegamifieerde & feedback

Premie

Spin-to-win wielen, krasloten, NPS / ster ratings en multi-stap trechters.

Opmaakeffecten

Premie

Columns, voortgangsbalk, sociaal aandeel, sociale bewijs tickers, ja/nee twee-stap, quizzen en 3D effecten, kanteling, gloed, parallax, glasmorfisme.

Personalisatietekens

Typ een van deze punten in rubrieken, paragrafen, knoppen, badges, statistieken, lijsten of citaten. Ze worden vervangen door de live details van de bezoeker op het moment dat de promotie toont (altijd schoongemaakt voor de veiligheid):

Beschikbare tokens
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)

Referentie van de richtpunten

Land & locatie

Alleen tonen in (of verbergen van) gekozen landen, steden of tijdzones via GeoIP. Geweldig voor regiospecifieke aanbiedingen of een geo-redirect.

Pagina's & URLs

Beperk tot bepaalde pagina's met behulp van gelijken / start-with / bevat / regex, en sluit ook pagina' s uit.

Apparaat

Bureaublad, tablet of mobiel, bijvoorbeeld een slanke bar op mobiele telefoon, een modale op desktop.

Type bezoeker

Nieuw, terugkerend, bekend (in uw CRM) of anoniem; CRM-segmenten, levenscyclusfase, leadscore of browsertaal.

Verkeersbron

Door UTM (utm_source, utm_campaign) of verwijzende site, bijvoorbeeld alleen bezoekers van een specifieke advertentie.

Schema & frequentie

Start / einddatum, tijd-van-dag vensters en hoe vaak een persoon het kan zien (per sessie, per dag, nadat ze sluiten / klikken / converteren).

A/B-verkeersverdeling

Toon een percentage bezoekers en loop varianten head-to-head; dezelfde persoon ziet altijd dezelfde variant.

Publiek (ingelogd)

Met een connector ingeschakeld, doel door live-account staat, bijvoorbeeld klanten met onbetaalde facturen of actieve abonnees.

Triggers

Kies hoe de promotie verschijnt: Onmiddellijk, na een vertraging, op scrolldiepte, bij exit-intent, wanneer inactief, op een klik van een element, nadat een aantal pagina's bekeken, op formulier-abdon, of uit chat / ticket activiteit. Ontwikkelaars kunnen een vuurwapen vanuit hun eigen code met window.OpsIQPromo.fire('event').

Aangemelde klanten (connectoren)

Dit is wat maakt OpsIQ promoties speciaal: sluit een platform zoals WHMCS (of een connector die publiek ondersteunt) en de studio kan zich richten op bezoekers door hun live-account staat.

1
Een publieksconnector inschakelen

Onder Connectors, laat een die publiek feiten onthult (WHMCS Klanten worden veilig herkend wanneer ze op dat platform zijn ingelogd, OpsIQ vertrouwt nooit een getypte e-mail.

2
Een regel toevoegen aan het publiek

In de campagne Targeting > Publiek, vereist ingelogd en voeg regels zoals onbetaalde facturen >= 1toe, abonnement is vervallen, of rekeningkrediet > 0.

3
Personaliseer met hun gegevens

Gebruik tokens zoals {first_name} of {balance_due}. Een "U heeft een achterstallige factuur" herinnering schrijft zichzelf.

Publiekstargeting is niet veilig: als de connector geen bevestiging kan geven van een feit (of de bezoeker is niet ingelogd), dan wordt de promotie gewoonweg niet getoond, dus een factuurgerichte aanbieding bereikt nooit de verkeerde persoon. Bouwen van uw eigen connectie? Zie "Promotie publiek targeting" hieronder.

Verbonden handel (de studio supermacht)

Productkaarten uit uw winkel

Levende gegevens

Een product blok trekt echte items (naam, prijs, verkoopprijs, beeld, link) rechtstreeks uit WHMCS, WooCommerce, Shopify of uw OpsIQ facturering. Tik op "Houd fris" en de kaart update zijn prijs vanaf het platform elk uur terwijl gepubliceerd.

Gereserveerde coupons

Coupons

Een coupon blok kan de echte kortingscode in uw winkel maken het moment dat u publiceert, zodat de code een bezoeker onthult altijd werkt bij kassa.

Ontvangsten uit orderwaarheid

Naam

Echte bestellingen van uw platforms worden terug gekoppeld aan campagnes per uur (door coupon code gebruikt of door de lead e-mail) zodat de omzet die u ziet is uit de werkelijke verkoop, niet schattingen.

Echt sociaal bewijs

Vertrouwen

De sociaal-proof ticker kan leiden met echte recente bestellingen ("Ada bestelde Starter Plan · 2h ago"), voornaam en item alleen, nooit e-mails of bedragen.

Experimenten en reizen

A/B varianten en auto-winner

Splits het verkeer over designvarianten; laat de studio automatisch de statistische winnaar promoten, of handverkeer naar de bandiet optimisator die bezoekers verschuift naar wat er wordt omgezet als bewijs binnenkomt.

Ophoudopheftruck

Reserveer een stukje bezoekers die niets zien, zodat je kunt bewijzen dat de campagne zelf de lift veroorzaakt.

Segmentvarianten

Verschillende inhoud per publiek op de SAME campagne (mobiele bezoekers, grote karren, terugkerende klanten), elk segment krijgt zijn eigen versie.

Triggerexperimenten

Varianten kunnen ook WANNEER worden getest: onmiddellijk vs vertraagde versus exit-intent, gemeten hoofd tot kop.

Reis

Doel door wat iemand deed met een andere campagne ("saw campagne A but didn't convert") om multi-step promotie sequences te bouwen.

Peulgroenten

Een kleine pil bezoekers kunnen heropenen na het sluiten van de campagne, zodat een gesloten pop-up nooit voorgoed is verdwenen.

Weet wat er gebeurd is.

Klik op warmtekaart

Ontwerper

In de ontwerper, schakelt u het heatmap om echte bezoeker te schilderen klikt over elk blok van uw ontwerp.

Stappentrechter

Trechters

Meerstapscampagnes tonen precies waar mensen afleveren, scherm voor scherm.

Vergelijk campagnes

Studio

Zet maximaal vier campagnes naast elkaar (impressies, klikken, conversies), beste waarde gemarkeerd.

Wekelijks verhaal & verteren

AI

Elke maandag komt een samenvatting in je meldingen; de 📖 Weekly verhaal knop schrijft een overzicht met volgende stappen wanneer u er maar één wilt.

Gemakkelijk werken

AI-copiloot & ideeën

Chat met de ontwerp copiloot om het canvas te bewerken ("maak de kop dringend, voeg een aftelling"), krijg campagne ideeën uit uw eigen verkeersgegevens, vertaal een campagne per land, of auto-fix een lage ontwerpscore.

Merkkit-import

Een commando leest uw website en stelt uw echte merkkleuren en lettertypen; opslaan en elke picker leidt met hen.

Meervoudige trechters

Stappenblokken krijgen echte per-schermbewerking: tabbladen voor elk scherm, toevoegen of opnieuw ordenen van schermen en het voorbeeld volgt mee.

Vernoemde versies & aanwezigheid

Noem belangrijke versies ("Lanceerkandidaat"), herstel een van hen, en zie een waarschuwing wanneer een teamgenoot is het bewerken van dezelfde campagne.

Apparaatstrip en liniaal

Zie desktop, tablet en mobiel naast elkaar in één weergave; schakel pixellinealen om voor een nauwkeurige plaatsing.

Gehoste pagina & kanalen

Elke campagne kan ook een standalone gehost pagina voor bios en QR codes, een e-mail druppel sequentie voor gevangen leads of een one-click web-push concept.

Veiligheid van ondernemingen

Publiceer de vensters (verander-vriesperiode), een noodpauze-alle schakelaar, goedkeuringen, audit trail en versie terugrollen.

Moet ik code toevoegen aan mijn site?+

Nee. Promoties worden geleverd door dezelfde OpsIQ widget die u al geïnstalleerd hebt. Ontwerp, publiceer, klaar.

Zullen bezoekers steeds dezelfde pop-up zien?+

Nee. Stel frequentie caps in (per sessie / per dag, of stop nadat iemand sluit, klikt of converteren). Verstandige standaardinstellingen worden toegepast.

Wie kan het publiceren?+

Publishing, pauzeren, archiveren en terugrollen zijn beperkt tot de eigenaren van werkruimtes en volledige beheerders. Elk teamlid kan ontwerpen maken en ontwerpen.

Groei & SEO

Promotieontwerper

Promotie Designer is een responsieve blok editor voor het bouwen, beoordelen, versieren en publiceren van een campagne-ervaring.

Productscherm
PromotieontwerperDe ontwerper combineert een live canvas, apparaatvoorvertoningen, blokken, personalisatievariabelen, commentaren en versiegeschiedenis.PromotieontwerperwerkbladVIEWPORTBureaubladVERSIEv12STAATOntwerpLEVENDE WERKSPACE-ZICHTHeldenblokHoofdlijn, media en TTABewerkenAanbod blokKorting en deadlineBewerkenPersoonlijkheidContact- en campagnevariabelenKlaarControle startenOpmerkingen en validatieEvaluatie1BUILD BLOCKSLive-layout bewerken2VOORUITZICHTBureaublad, tablet, mobiel3PUBLISHVersied release
De ontwerper combineert een live canvas, apparaatvoorvertoningen, blokken, personalisatievariabelen, commentaren en versiegeschiedenis.

Gebruik blokken om de ervaring samen te stellen, een voorbeeld van elke ondersteunde viewport en invoegen goedgekeurde personalisatie variabelen. Bekijk opmerkingen en AI-media herkomst voordat u start. Saving maakt versies zodat een vorig ontwerp kan worden geïnspecteerd of hersteld.

Groei & SEO

Promotiesjablonen

Templates bieden een doorzoekbare, gecategoriseerde startgalerie voor promotiestudiocampagnes.

Productscherm
PromotiesjablonenDe template gallery filtert premium lay-outs en past werkruimte merk kleuren wanneer een sjabloon wordt een concept.PromotiesjablonenwerkbladCATEGORIEOmrekeningRESULTS24BRANDToegepastLEVENDE WERKSPACE-ZICHTAfsluitaanbodModal met spoed en TTAVoorbeeldNieuw bezoek welkomBanner en uitkeringslijstVoorbeeldLancering van productenHeld, bewijs en aftellenVoorbeeldTerugkoppelingsverzoekCompacte enquêtepromptVoorbeeld1FILTERCategorie en zoekopdracht2VOORUITZICHTInspecteer het volledige ontwerp3USEEen merkontwerp aanmaken
De template gallery filtert premium lay-outs en past werkruimte merk kleuren wanneer een sjabloon wordt een concept.

Zoeken of filteren per categorie, extra resultaten laden, de volledige ervaring bekijken en vervolgens kiezen Gebruik sjabloon. De nieuwe campagne blijft een concept en kan worden gewijzigd in Promotie Ontwerper voor publicatie.

Groei & SEO

Promotieanalyse

Promotieanalyse verbindt indrukken en klikken met conversies, publiek context, connector actie resultaten en campagne leren.

Productscherm
PromotieanalysePromotie analytics toont hoofdprestaties, publiek en trigger breakdowns, leidt export-en connector actie resultaten.PromotieanalysewerkbladIMPRESSIONS42.8kCTR6.4%CONVERSIONS814LEVENDE WERKSPACE-ZICHTLandVerenigd Koninkrijk · 31%VerdelingBladzijde/pricing · 22%VerdelingTriggerIntent · 44%VerdelingVerbindingsactieCoupon aangemaakt · 97% succesResultaat1MAATREGELImpressies naar conversie2SLICEBladzijde, land, apparaat3LEARNPas het inzicht toe
Promotie analytics toont hoofdprestaties, publiek en trigger breakdowns, leidt export-en connector actie resultaten.

Lees indrukken, click-through rate en conversies samen. Breek resultaten naar land, pagina, trigger en apparaat; export gevangen leads wanneer nodig. Connector actie resultaten tonen of de promotie beloofde follow-up daadwerkelijk liep. AI inzicht en leer samenvattingen moeten worden behandeld als hypothesen om te valideren, niet automatisch bewijs.

Groei & SEO

Mededelingen

Aankondigingen publiceren een bericht in het widget notificatiegebied met optionele targeting, schema en oproep tot actie.

Productscherm
MededelingenDe Aankondigingseditor bevat inhoud, CTA, publiek, segment, paginaregel, actieve data en visuele stijl.MededelingenwerkbladActief3AUDIENCESegmentSCHEMAjul 22–29LEVENDE WERKSPACE-ZICHTTitelGepland onderhoudKlaarInhoudAftekeningsberichtKlaarTCLLees de updateFacultatiefArtikelPrijzen pagina's · actieve klantenDoel1WRITETitel en afwaardering2DOELPubliek, segment, bladzijde3SCHEMAActief venster
De Aankondigingseditor bevat inhoud, CTA, publiek, segment, paginaregel, actieve data en visuele stijl.

Kies alle bezoekers, ingelogde bezoekers of nieuwe bezoekers; vernauw het publiek optioneel met een contactsegment en paginaregel. Stel actieve-van/actieve-tot-data in en een actieve vlag. Premium stijlinstellingen en kleuren veranderen de presentatie maar vervangen geen duidelijke inhoud.

Groei & SEO

Perscampagnes

Push campagnes sturen browser meldingen aan geabonneerde bezoekers nadat ze de site hebben verlaten.

Productscherm
PerscampagnesDe push componist toont abonnement bereik, inhoud, media, acties, doelregels en schema status.PerscampagneswerkbladSUBSCRIBERS8,214Verzonden31.6kCLICK RATE5.8%LEVENDE WERKSPACE-ZICHTTitelJe kar wacht op je.KlaarLichaamVandaag retourneren voor gratis leveringKlaarTCLWinkelwagen openenKlaarSchemaNu of gepland verzendenOntwerp1PREPARE PUSHTitel, lichaam, pictogram2DOELPubliek, segment, bladzijde3SENDNu, schema of concept
De push componist toont abonnement bereik, inhoud, media, acties, doelregels en schema status.

Web Push-toetsen eerst instellen onder de instellingen van Web push. Een campagne kan titel, lichaam, pictogram, heldbeeld, badge, CTA en maximaal twee actieknoppen bevatten; een aanhoudende melding blijft bestaan totdat de bezoeker interacteert.

Doel door publiek, optionele contactsegment en paginaregel. Sla een concept op, plan het of stuur onmiddellijk. Gebruik het abonnement en klik op metrics om te beoordelen bereiken. HTTPS en een correct gehoste service werknemer zijn vereist op embedded sites van derden; zie Web Push op sites die derde partijen.

Groei & SEO

Proactieve berichten

Proactieve berichten bereiken automatisch het moment dat een bezoeker zijn gedrag aan een regel voldoet, voordat ze vragen. Je bouwt elk als regel met drie delen: wat moet er gebeuren, wanneer het moet schieten en hoe vaak. Alles wordt geleverd via de OpsIQ widget al op je site.

Proactief
Proactieve berichtenEen proactieve componist in drie delen: kies een actie (chat, banner, tour, push, e-mail), voeg voorwaarden toe en stel een frequentie afkoelen.Proactieve berichtenwerkblad1 · ActieChatberichtBannerRondleidingPersenE-mail2 · Voorwaardenpage = /pricingtijd op pagina > 20sterugkeer3 · FrequentieEenmaal per sessieStatus1ACTIEChat, banner, e-mail, push...2CONDITIONSPagina, tijd, score, terugkeer3FREQUENTIEAfkoelen per bezoeker
Elke proactieve regel is drie keuzes: wat gebeurt er (chat, banner, tour, push, e-mail, webhook), wanneer (voorwaarden), en hoe vaak (cooldown).

De drie delen van een regel

1
Wat moet er gebeuren (actie)

Toon een chat-bel of banner op de pagina, start een Begeleide Tour, stuur een web push of e-mail, toewijzen aan een afdeling, of vuur een webbook. Tokens zoals {{visitor_name}} en {{page_title}} worden echte waarden.

2
Wanneer het moet vuren (voorwaarden)

Smal wie het activeert: pagina/URL, tijd op de pagina, scrolldiepte, lead score, terugkeer vs nieuw, inactief. Zonder voorwaarden brandt de regel voor elke bezoeker. Voeg er minstens één toe om het te richten. Voorwaarden combineren met EN.

3
Hoe vaak (frequentie)

Stel een afkoeling in zodat dezelfde persoon niet wordt gepest, bijvoorbeeld eenmaal per sessie of één keer per dag. Elke regel heeft een aan/uit status.

⚠️
De werkruimte schakelt "Run time/idle rules uurlijks" in en laat server-side acties (email, push, webhook, authentic) branden op een schema voor bekende contacten die momenteel niet op de pagina staan, zodat je automatisch "emailen zonder hot leads." Het heeft de OpsIQ cron draaiende nodig. Laat het uit als je alleen live wilt nudges op de bladzijde.
Zal het voor iedereen schieten?+

Alleen als u geen voorwaarden toevoegt. Voeg ten minste één voorwaarde (pagina, lead score, terugkeer...) toe om de juiste bezoekers te richten.

Hoe verhouden deze zich tot stromen en tours?+

Ze werken samen: een proactieve regel kan een Rondleiding starten en een Chatbot Flow kan worden geactiveerd door een pro-actieve regel. Begin met één chat-berichtregel, dan de anderen op laagjes leggen.

Groei & SEO

Chatbotstromen

Chatbot Flows script vertakking gesprekken binnen uw chat widget (gegroet, zoekwoord antwoorden, geleide paden) zonder code. Een stroom is een set van verbonden stappen (nodes): u stelt een vraag, de bezoeker kiest een optie en de stroom stuurt ze door naar beneden in de bijpassende tak. Alleen actieve stromen draaien op uw site.

Hoe het werkt
ChatbotstromenEen flow canvas: een begroetende knoop vertakt in drie optieknoppen, elk leidt tot een volgende stap, op zoek orde, of overhandigt aan een mens.Gegroet.Hoe kan ik helpen?Volg mijn bestellingFactureringsvraagPraat met een mens.Bestel opzoeken→ Menselijke stofTriggers: groeten · Trefwoord · Handleiding · Na-details · On-chat-end
Chatbotstromen

Stroom vs de AI · wanneer te gebruiken die

Gebruik een stroom

Wanneer het pad voorspelbaar is en je wilt dat het elke keer identiek: boekingsstappen, een terugkeert wizard, een "what plan?" kieser, het verzamelen van een e-mail voor de overdracht. Flows nooit improviseren.

Gebruik de AI

Als vragen open zijn, "werkt dit met mijn setup?". De klant Chat AI antwoordt uit uw getrainde kennis. Een stroom kan de AI (of een mens) in elke stap overdragen.

Triggers

Gegroet.

Loopt als het openingsbericht wanneer een bezoeker de chat voor het eerst opent.

Trefwoord

Wordt uitgevoerd wanneer de bezoeker een woord dat u vermeld (bijv. restitutie, prijs, annuleren) typt.

Na details / Na vertraging

Start zodra de contactgegevens worden gedeeld, of een bepaalde tijd in het gesprek.

Bij chat end / Proactief

Wordt uitgevoerd als de chat wordt afgesloten (bijvoorbeeld een rating), of wordt gestart met een Proactive Message-regel.

Bouw één in vier stappen

1
De stroom aanmaken

Klik op Nieuwe Flow, noem het, kies een trigger type (en trefwoorden als Keyword), opslaan. Het begint uitgeschakeld.

2
Open het canvas

Klik op Bewerken Canvas. De visuele bouwer waar u stappen toevoegt (berichten, vragen met knoppen, branches) en sluit ze aan.

3
Voeg takken toe en een hand-off

Trek voor elke keuze een tak naar de volgende stap. Eindig paden door het oplossen, overdragen aan de AI of overbrengen aan een mens.

4
Inschakelen

Klik op Inschakelen. De flow gaat direct live in uw widget. Schakel elk moment uit zonder het ontwerp te verliezen.

Vervangen stromen de AI?+

Nee. Ze lopen zij aan zij. Gebruik stromen voor voorspelbare paden en de AI voor open-end vragen; een stroom kan altijd hand af om beide.

Groei & SEO

Rondleidingen

Rondleidingen zijn stap-voor-stap doortochten die op delen van uw pagina met spraakbellen en een spotlight wijzen, waarbij u de bezoeker begeleidt door onboarding of een nieuwe functie. Ze zijn volledig thema en ingebouwd in een visuele ontwerper met een live preview. Een rondleiding draait alleen als het actief is gemarkeerd.

Hoe het werkt
RondleidingenEen gedimde pagina met een spotring rond een Add-deal knop en een thema speech bubble lezen Stap 1 van 4 met een Next-knop.+ Toevoegen dealSTAP 1 VAN 4Maak uw eerste dealKlik hier om een deal aan uw pijpleiding toe te voegen.Volgende →
Rondleidingen

Hoe een tour wordt gebouwd

Stappen

Elke stap richt zich op een element en toont een bel met uw tekst. Voeg zoveel stops als de walkthrough nodig heeft en bestel ze.

Voorinstellingen & thema

Begin met een preset of ontwerp je eigen bel (kleuren, kleurverloop, spot) met een live preview aan de rechterkant.

Trigger

Optioneel link je een Proactieve Regel zodat de tour automatisch start wanneer die regel brandt (bijvoorbeeld het eerste bezoek aan het dashboard van een terugkerende bezoeker).

Actief schakelen

Een tour komt alleen in aanmerking om te draaien terwijl Active aangevinkt is. Untick om het weg te halen zonder deze te verwijderen.

Bouw één in vier stappen

1
Nieuwe tour

Klik op Nieuwe Rondleiding, noem het en koppel eventueel een Proactieve Regel zodat deze automatisch begint.

2
Stappen toevoegen

Voeg elke stop toe: kies het element waarnaar het verwijst en schrijf de bubbletekst. Reorder tot het pad stroomt.

3
Ontwerp het

Kies zelf een preset of stijl van de bubble. De live preview laat precies zien wat bezoekers zien.

4
Activeer

Tik actief en sla op. De tour kan nu draaien, op eigen initiatief of gestart worden met een Proactive Message-regel.

Hoe beginnen tours?+

Op eigen initiatief of via de "Guided tour" actie van een Proactive Message regel, dus je bepaalt welke bezoekers zien welke rondleiding en wanneer.

Groei & SEO

Omschakelingsdoelstellingen

Conversiedoelen maken van een activiteit waar je om geeft (een inkomende webhook-event, een chatbericht, een ticketresolutie) een geregistreerde conversie met volledige toeschrijving. Wanneer de activiteit brandt, logt OpsIQ een conversie tegen het contact en verbindt deze terug naar de campagnes, segmenten en bronnen die daar leidde.

Hoe het werkt
OmschakelingsdoelstellingenEen doelstroom: een payment. succeed webhook event wordt een geregistreerde "aankoop" conversie waard $49, toegeschreven aan de bron en campagne, met snelstart vooraf ingestelde chips hierboven.Snel startenStripe aankoopDemo geboektNieuwsbrief aanmeldenpayment.succeededinkomende webhookOmrekening"Aanschaf" · $49GeattributenBron · campagne
Omschakelingsdoelstellingen

Een doel definiëren in drie stappen

1
Kies de trigger activiteit

Klik op Nieuwe conversiedoelstelling. Kies het type activiteit dat telt als een conversie, of gebruik een Quick-start preset, Stripe aankoop, Demo geboekt, Nieuwsbrief aanmelden of abonnement gestart.

2
Noem het en stel een waarde in

Geef de conversie een naam (aankoop, demo_boeked, aanmelding) en eventueel een vaste waarde en een attributievenster.

3
Opslaan

Bewaar en inschakelen. Vanaf dan, wanneer de activiteit brandt, registreert OpsIQ een conversie tegen het contact met de toeschrijving naar de voorgaande aanrakingen.

Doelen zijn al aangesloten op inkomende webhooks: elk doel waarvan de trigger overeenkomt met het type branden van een inkomende gebeurtenis automatisch zodra het evenement landt. Gebruik de pagina Inbound Webhrooks om Stripe, Calendly of enig systeem dat POST JSON kan verbinden te verbinden.
Wat kan een bekering zijn?+

Elke geregistreerde activiteit: een inkomende webhook event (payment. succeed), een chat-email opname, een ticketresolutie, alles op de contact timeline.

Analyse

Aangepaste dashboards

Met aangepaste Dashboards kun je een eigen weergave van de metrics bouwen, in plaats van alleen op het standaard Overzicht te vertrouwen. Voeg de widgets toe die je wilt, sleep ze naar de lay-out die je leuk vindt en sla ze op en deel deze met je team.

Aangepaste dashboards
Aangepaste dashboardsEen dashboard bouwer met KPI en grafiek widget tegels, een gestreepte dropzone, en een Add-widget knop.Aangepaste dashboardswerkbladMijn dashboard+ widget toevoegenBEZOEKEN2,481ONTVANGSTEN$8.2kTRAFFIESleep een widget hierheenTOPPAGEN/pricing/docs/signup1ADD WIDGETSMetrics & grafieken kiezen2ARRANGEVerslepen & grootte wijzigen3DELENMet je team
Bouw je eigen bord: voeg KPI, grafiek en lijst widgets toe, sleep ze naar de gewenste indeling en deel deze vervolgens met het team.

Bouw één in drie stappen

1
Widgets toevoegen

Klik op Widget toevoegen en kies de metriek of grafiek die u wilt volgen. Herhaal voor alles wat u wilt op het bord.

2
De indeling ordenen

Sleep widgets om te herpositioneren en sleep hun randen naar grootte. KPI's over de bovenkant, grafieken hieronder. Wat het beste leest.

3
Opslaan & delen

Sla het dashboard op en deel het met je team zodat iedereen dezelfde nummers ziet.

Houd aparte boards voor afzonderlijke banen (een "dagelijkse blik" bord met live counts, en een "maandely review" board met trend grafieken) zodat elk blijft gericht.
Groei & SEO

Buitenlandcampagnes

De Commissie is van mening dat de OpsIQ's1:1en bulk e-mailengine: stel een gepersonaliseerd bericht samen of voer een campagne uit naar een CRM segment, met antwoorddetectie, send-time controle, open/klik tracking, een traceerpixel en één klik unsubscribe. Het is consent-gaged en CAN-SPAM / CASL conform.

Overvloed
BuitenlandcampagnesHet Outreach scherm met Componist/Campaigns/Templates/Reageert tabbladen en een campagnetabel die verzonden, open-rate en antwoordsnelheid toont.OvervloedwerkbladCampagnesComponistSjablonenAntwoordenCAMPAGNEVerzondenOPENANTWOORDENJuni nieuwsbrief1,20048%7%Follow-up van de proef34062%14%Win-terug82039%5%Antwoord detectie automatisch-stops follow-ups · one-click uitschrijven op elke verzenden11:1 & BULKSamenstellen of campagne2TRACKEDOpent, klikt en antwoordt3COMPLIANTAanmelden als ingebouwd
De Outreach motor: verzenden1:1of voeren campagnes naar een segment, track opent en antwoorden, en blijven voldoen aan de ingebouwde afmelden en antwoord detectie.

De vier tabbladen

Componist

Schrijf een gepersonaliseerd1:1e-mail met {tokens} van het contact en CRM.

Campagnes

Stuur naar een CRM-segment, gepland of nu, met caps en sendtime control.

Sjablonen

Herbruikbare berichtensjablonen voor herhaalde outreach.

Antwoorden

Antwoord detectie registreert reacties en auto-stops follow-ups aan iedereen die antwoordde.

Hoe een campagne loopt

1
Kies een publiek

Kies een CRM-segment (of upload een lijst). Onderdrukking en toestemming worden automatisch toegepast.

2
Samenstellen

Schrijf het bericht met personalisatie tokens; voorbeeld tegen een echt contact.

3
Plannen & verzenden

Nu of op het beste moment verzenden. Er wordt een trackingpixel record geopend; klikken en antwoorden worden toegeschreven.

Outreach is toestemming- en onderdrukkings-geagated, bevat een one-click uitschrijven op elke verzendopdracht, en volgt CAN-SPAM / CASL. Reacties automatisch stoppen verdere follow-ups.
Analyse

Geplande verslagen

Geplande rapporten e-mailen een gekozen metriek ingesteld op geselecteerde ontvangers volgens een schema (dagelijks, wekelijks of maandelijks) als afdrukbaar, witlabel PDF. Stel het een keer in en het rapport landt automatisch via de OpsIQ Cron.

Geplande verslagen
Geplande verslagenHet scherm met geplande rapporten: een tabel van verslagen met hun schema, ontvangers en laatst verzonden tijd, plus een knop met opslaan-rapport.Geplande verslagenwerkbladGeplande verslagen+ Rapport opslaanVERSLAGSCHEMAHULPSTOFFENLaatst verzondenWekelijks verkeerMon 9:_00[email protected]2 dagen geledenSEO-cliëntrapportMaandelijks[email protected]Jun 1_VerkoopoverzichtDagelijks[email protected]todayGeleverd als witte label PDF via de OpsIQ cron1AUTOMATEDDagelijks · wekelijks · maandelijks2WITTELABELPDF aan cliënten3HULPSTOFFENGemaild op schema
Eenmaal een rapport instellen (metrisch ingesteld, bereik, schema, ontvangers) en OpsIQ e-mailt een wit label PDF automatisch op uw cadans.

Een rapport opstellen

1
Kies wat te verzenden

Kies de metrieke set (verkeer, SEO, verkoop, ondersteuning...) en een datumbereik.

2
Plannen voor geadresseerden instellen

Dagelijks, wekelijks of maandelijks, op een moment dat u kiest, naar één of meer e-mailontvangers.

3
Opslaan

Opslaan en inschakelen. Het rapport genereert en e-mailt zichzelf op schema, geen handmatige stap.

💡
Geplande rapporten lopen door de OpsIQ cron, als een rapport niet aankomt, bevestig dan dat de cron draait (zie Cron en automatisering).
Privacy

Privacy en naleving

De pagina Privacy & Compliance is de enige plek om een auditor te tonen die u verantwoord met persoonsgegevens behandelt: het toestemmingsboek, het loglog van de admintoegang, uw gegevensresidentie en bewaarbeleid, en een kant-en-klare DPA, in één tabbladweergave. Alleen volledige beheerders kunnen deze openen.

Privacy en naleving
Privacy en nalevingHet scherm Privacy & Compliance: tabbladen voor Toestemming grootboek, Access log, Residency en DPA, met een toestemming grootboek van subsidies en intrekkingen per kanaal.Privacy & nalevingwerkbladToestemming grootboekToegangslogboekWoonplaatsDPA_CONTACTPERSOONKANAALACTIEDATUM[email protected]_e-mailToegestaanJun 12_[email protected]pushIngetrokkenJun 10_[email protected]marketingToegestaanJun 9_Zoekbaar bewijs van elke toestemming en intrekking, per kanaal1CONSENT LEDGERBewijs van elke subsidie2ACCESS LOGWie heeft de gegevens aangeraakt?3DPA_Afdrukbare sjabloon
Een auditief scherm: een doorzoekbaar toestemmingsboek (toekenningen/oproepen per kanaal), een toegangslogboek van wie gegevens heeft aangeraakt, residency-/retentieinstellingen en een afdrukbare DPA.

De vier tabbladen

Toestemming grootboek

Een doorzoekbare record van elke toestemming subsidie en herroepen, via contact, kanaal (e-mail, push, SMS, in-widget), actie, bron en datum. Uw bewijs een overeengekomen contact (of ingetrokken).

Toegangslogboek

Wie in uw team de gegevens van een contactpersoon heeft bekeken, bewerkt, geëxporteerd, gewist of verzonden met de beheerder, contact, actie, opgegeven reden en IP. Precies wat een regulator vraagt.

Residentie & retentie

Geef aan waar de data van deze werkruimte leeft, stel in hoeveel dagen activiteit rijen worden bewaard (0 = voor altijd), en neem uw gegevensbeheerder en DPO op.

DPA sjabloon

Een afdrukbaar data processing addendum dat uw controller, adres, DPO, residency en retentie invult. Print of sla op als PDF.

Privacy & Compliance is gekoppeld aan de Cookie toestemming studio (die toestemming verzamelt) en de Export pagina (die het data exemplaar produceert voor een DSAR). Zie ook Cron en automatisering voor de nachtelijke opruiming.
Connectoren

Verbind uw platforms

Verbindingsverbinding OpsIQ naar externe platforms: e-commerce winkels, facturatiesystemen, betaalprocessoren, e-mail providers en aangepaste APIs. Eenmaal aangesloten, kan de AI bestellingen opzoeken, klantgegevens, abonnementen en nog veel meer, en acties ondernemen met uw goedkeuring.

Hoe het werkt
VerbindingenhubOpsIQ kern verbonden met WHMCS, Shopify, Stripe WooCommerce, SendGrid en Google Business Profile, elk met een verbonden status.WHMCS_Shopify_StripeWooCommerceSendGridGoogle BPOpsIQ_CORE1PLUG IN25+ voorgebouwde connectoren2AI CONTEXTEchte platformgegevens3ACTIONSGedaan met uw goedkeuring
Connectoren

Schepen met OpsIQ

Deze zijn aanwezig op het moment dat u installeert en alleen hun referenties nodig hebben.

WHMCS_

Facturering

Webhosting facturering: klanten, diensten, tickets, facturen, domeinen, servers.

Shopify_

E-handel

E-commerce: bestellingen, klanten, producten, inventaris, betalingen, webhooks.

WooCommerce

E-handel

WordPress e-commerce: bestellingen, klanten, producten, coupons, verzending.

WordPress

CMS

Inhoud en gebruikers op een WordPress site.

Vierkant

Betalingen

Betalingen en verkooppunt: bestellingen, klanten, catalogus.

osCommerce

E-handel

Legacy e-commerce: bestellingen, klanten, producten.

BotbleHotel

Brug

Een Botble CMS hotel site door de ondertekendeOpsIQDe referentie-implementatie voor een platform zonderAPI.

Zendesk

Steun

Helpdesk: tickets, gebruikers, organisaties, opmerkingen.

Google Business-profiel

In de handel brengen

Lokale business: recensies, berichten, vragen en antwoorden, inzichten. Gebruikt OAuth.

Google Agenda

Productiviteit

Kalenders en evenementen. Gebruikt OAuth.

GmailenIMAP

E-mail

Postbussen: inkomende en uitgaande e-mail, adresboeksynchronisatie.

SendGrid

E-mail

E-mail levering: stuur e-mails en beheer templates.

Postgeweer

E-mail

E-maillevering: stuur e-mails via Mailgun.

Slack, TelegramLIJN, X DM

Berichten

Berichtkanalen voor inkomende en uitgaande gesprekken.

Metakanalen

Berichten

Facebook Messenger, Instagram DM en WhatsApp.

Site Intelligence (GA4, Zoekconsole)

Analyse

Analytics en zoekgegevens voor de SEO Suite.

Verrijking van websites en CRM importeren

CRM

Verrijking van het bedrijf en import van bulk klanten.

Beschikbaar op de markt

Dit zijn gepubliceerde pakketten, geen onderdeel van de installatie. Installeer er een uit Connectors, Marketplace en het wordt gekopieerd naar de live connectors map, waarna het zich precies gedraagt zoals hierboven.

Stripe

Markt

Betalingen: kosten, klanten, facturen, abonnementen, uitbetalingen, geschillen.

BigCommerce

Markt

E-commerce: bestellingen, klanten, producten, categorieën, merken.

Magento 2

Markt

E-commerce: bestellingen, klanten, producten, categorieën, inventaris.

PrestaShop

Markt

E-commerce: bestellingen, klanten, producten, karregels, carriers.

OpenCart

Markt

E-commerce: bestellingen, klanten, producten, categorieën.

Amazon SES, Poststempel, Herverzenden

Markt

Transactie e-mail levering.

Jira, lineair

Markt

Issue en project tracking.

Microsoft Agenda, Outlook E-mail

Markt

Vergaderingen, agenda's en post.

DocuSign, Apollo, SerpApi, Google Analytics

Markt

Handtekening, prospectie, zoek- en analysegegevens.

Webflow, wix, Squarespace

Markt

Websiteplatformen.

💡
De lijst met connectoren wordt als pakketten gepubliceerd. De gezaghebbende lijst voor uw installatie is de pagina Connectors: wat er staat is wat de runtime ontdekt, en het tabblad Marketplace toont wat u kunt toevoegen.

Een connector installeren

1
Ga naar Connectors

Navigeer naar Connectors in de admin zijbalk.

2
Zoek de connector

Blader door de lijst of zoek. Connectoren zijn gegroepeerd per categorie.

3
Inschakelen

Klik op de connector en schakel Inschakelen.

4
Aanmeldgegevens invoeren

Vul de vereiste velden in: API sleutel, URL, tokens, enz. Elke connector heeft specifieke eisen gedocumenteerd in het instellingenpaneel.

5
Testverbinding

Klik op "Test Connection." Een groen resultaat betekent dat de connector het externe platform kan bereiken. Een rood resultaat toont de fout.

6
Eigenschappen instellen

Kies welke functies ingeschakeld moeten worden: kennissynchronisatie, webhook-synchronisatie, AI acties. Niet alle aansluitingen ondersteunen alle functies.

Welke connectoren geven u

AI context

De AI kan klantgegevens, bestellingen, abonnementen en meer opzoeken via de connector. Wanneer een klant chat, heeft de AI echte platformdata om te verwijzen.

AI context (connector auteurs)

De ContextProvider van uw connector geeft de ticket-AI een overzicht van alleen-lezen rekening van de eigenaar. customer_id indien bekend; anders, op ticket automatisch antwoorden, waarbij de ctx-vlag customer_trust_email is waar, zoek de rekening op door customer_email (de geverifieerde ticket afzender). Op afstand platforms bloot een /context/customer-by-email Dit is wat maakt dat de AI citaat een echte balans / factuur in plaats van te zeggen . Please login.customer_sections, customer_allow_credit) en strikt alleen-lezen blijven, nooit geheimen uitstralen.

Klantmap (connector auteurs)

Uw connector IdentityProvider feeds drie universele ticket lookups: lookupCustomerById() (klantkaart), lookupCustomerServices() (product/diensttabel), en listCustomers($query,$limit): de "Zoek klant of type e-mail" picker op het native Compose-New-Ticket formulier. {id, external_id, name, email, company, phone, platform, platform_label}. Afstand regel: als uw klanten wonen in een andere database of service, halen ze over uw platform's API In deze methoden, lees nooit de tabellen van het andere systeem rechtstreeks (in de OpsIQ DB het zijn lege plaatshouders, dat is de reden waarom een lokale lees geeft een leeg picker). Gate the remote pad op uw geconfigureerd API URL; houd een lokale lezing alleen als een zelfde-DB fallback.

Kaartjes met e-mailpijp, detectie en routering (connectorauteurs)

Wanneer binnenkomende e-mail een native ticket wordt, OpsIQ detecteert de afzender door te bellen lookupCustomerById(0, ['email'=>$sender]) over elke connector; de eerste match "eigent" de klant en zijn platform Slak is gestempeld op de ticket.created gebeurtenis als _pipe_owner_platform (leeg = gast).WHMCS-customer e-mail opent een ticket in WHMCS (WHMCS nummering, spiegelde als één), terwijl een onbekende afzender blijft een inheemse gast. Als uw connector native tickets op zijn eigen platform spiegelt, uw ticket.created De handler moet hier een poort openen: if (array_key_exists('_pipe_owner_platform',$payload) && $payload['_pipe_owner_platform'] !== '<your-slug>') return;. De sleutel ontbreekt op niet-gepipede (chat/handleiding/AI) tickets, dus die spiegelen zich zoals voorheen. Per afdeling controle woont onder Team & Departments → Open ticket per email (Alleen / Klanten alleen / Uit).

Acties

De AI kan acties uitvoeren via de connector: tickets maken, bestellingen bijwerken, abonnementen annuleren, allemaal met uw goedkeuring via de Trust Layer.

Kennis

Connectoren dragen platformspecifieke kennisartikelen bij aan de AI. Shopify connector voegt e-commerce probleemoplossing toe; WHMCS connector voegt hosting kennis.

Import van kennisbasis (connectorauteurs)

Als uw platform een kennisbasis heeft, verklaar dan dat kb_capabilities blok in settings.json (type kb_source) en uw stekker verschijnt in de Help Center-editor KB → Importeren uit een verbonden app dropdown wanneer het is ingeschakeld en geconfigureerd in de werkruimte. Het is declaratief, geen methode om te implementeren: naam een ingebouwde naam adapter (zendesk voor het exacte-boomhelpcentrum API, of crawl voor elke KB-site) en a base_template zoals https://{subdomain}.zendesk.com, die OpsIQ vult van de opgeslagen instellingen van uw connector. De gegevens verlaten nooit de server; de browser stuurt alleen de connectorenlak. Om een nieuw platform te ondersteunen, voeg een opsiq_kb_<platform>_manifest() adapter en verwijzen naar de naam. Volledige referentie: connectors/PLATFORM_CONNECTORS.md §5.

Webhooks

Sommige connectoren registreren webhooks met het externe platform voor real-time event notificaties (nieuwe bestellingen, ticket updates, enz.).

Verkooptracking

E-commerce connectoren voeren inkomstengegevens in het Sales dashboard voor attributie en analyse.

💡
Connectoren zijn werkruimte-scoped. Elke werkplek kan verschillende connectoren met verschillende referenties hebben ingeschakeld. A WHMCS werkruimte gebruikt de WHMCS connector;a Shopify werkruimte gebruikt de Shopify connector.
Kan ik meerdere connectoren tegelijk gebruiken?+

Ja. U kunt Shopify hebben voor bestellingen en Stripe voor betalingen in dezelfde werkruimte. De AI mergets gegevens van alle actieve connectoren.

Wat als mijn platform niet vermeld staat?+

Gebruik de Connector Builder om een aangepaste connector te maken voor elk platform met een REST API. Of controleer de Marktplaats voor community-built connectors.

Werken connectoren met zelf-gehoste OpsIQ?+

Ja. Connectors werken identiek in zowel cloud als self-hosted edities.

Connectoren

Verkoop- en factureringsconnectorcontract

Elke commerce connector gebruikt hetzelfde platform-neutrale event contract. WHMCS is de referentie implementatie, maar SaaS Bridge, winkels, betalingsproviders, marktplaats connectoren en Connector Builder pakketten moeten dezelfde regels te gehoorzamen.

Wat elke commercie connector moet publiceren

Een gezaghebbend grootboek

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.

Stabiele bron-identiteit

platform is de connector register slak, zoals whmcs, shopify of opsiq_saas.traffic_source bevat geverifieerde verwervingstoeschrijving wanneer deze wordt geleverd; gebruik anders dezelfde navel als de terugval. Bewaar identificaties, geen labels tonen. OpsIQ lost de vriendelijke connectornaam op in de UI.

Idempotentie

event_id moet deterministisch zijn. Map ten minste één onveranderlijke order_ref, factuur_ref of abonnement_ref zodat webhook opnieuw en backfills dezelfde gebeurtenis bijwerken in plaats van dubbele sales te maken. service_ref identificeert het betrokken product of dienst geval wanneer er een bestaat.

Tijdstempel bron

conceed_at is de door het bronplatform gerapporteerde betalingstijd of economische-eventtijd. Vervang nooit historische betalingsdata met de importtijd.

Geld en FX

Stuur de bron en een geldige drieletterige ISO-valuta. Als de connectorinstelling OpsIQ FX conversie mogelijk maakt, wordt rapportage omgezet naar de werkruimte rapporterende valuta; anders worden rapporten bewaard de opslag of het factuurplatform valuta. Connector code mag geen hardecode van een rapportagevaluta of wisselkoers.

Levenscyclus op basis van bewijsmateriaal

Gebruik nieuwe, vernieuwing, upgrade, terugbetaling, krediet of onbekend. Classifieer vanuit factuurredenen, abonnements- of servicerelatie, lijn-itemtype of een ander gezaghebbend bronveld. Een herhaalde aankoop door dezelfde klant is niet automatisch een verlenging.

Verkoopgrens

Alleen positief betaalde nieuwe, vernieuwing, upgrade of rechtmatig onbekende commercie ontvangsten behoren in Sales & Conversies. Terugbetalingen worden gerapporteerd door terugbetaling en netto-inkomsten analytics. Account credit, portemonnee top-ups, token top-outs en Toevoegen Fondsen blijven facturatie-ledger gebeurtenissen en nooit tellen als verkoop, conversies, order volume, of omzet.

CRM blijft gescheiden

CRM-deals vertegenwoordigen pijplijn en dealactiviteiten. Ze zijn geen verkoop op commerceplatforms tenzij een aangesloten factuur of store platform via dit contract de gerealiseerde betaalde bestelling of factuur uitstraalt.

Elk betaalsignaal opent de rij

Niet afhankelijk van een evenement naam. Wanneer het platform stuurt meerdere bevestigingen van één betaling (factuur betaald, bestelling betaald, transactie toegevoegd, betaling voltooid) kan een van hen de grootboek rij openen zodra het platform bevestigt dat de verkoop is betaald; de verkoop vingerafdruk klapt de broers en zussen in één rij.

Geplande afstemming (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.

Afgeleide projecties

opsiq_conversies en samenvattingen van dashboards zijn compatibiliteitsprognoses die vanuit het grootboek herbouwd worden. Connectors mogen een projectie niet behandelen als de financiële bron van waarheid. Contract herzieningen kunnen afgeleide rijen opnieuw evalueren zonder de onderliggende facturatiegeschiedenis te verwijderen.

Rand van het platform op afstand

Een externe connector leest zijn platform via de geconfigureerde geauthentificeerde API_. Het mag nooit afhangen van dezelfde-server database tabellen. De exacte geverifieerd domeinsite_sleutel wordt geleverd door ConnectorRegistry en moet worden toegepast op elk grootboek schrijven en backfill. Werkruimte of groepsomvang is alleen leestijd aggregatie; het mag niet uitbreiden opgeslagen gebeurtenis eigendom.

Canonical payed-event voorbeeld

Genormaliseerde handel
{
  "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"
}

Connector Builder-kartering

Wanneer verkoop en facturering is ingeschakeld in Connector Builder, kaart bedrag, valuta, bronstatus en brondatum, plus ten minste één bestelling, factuur of abonnement referentie. Kaart lifecycle_type wanneer de API laat gezaghebbende levenscyclus bewijs. De gegenereerde SalesIngest passeert elke rij door dezelfde CommerceEvenementRegistry normalizer gebruikt door ingebouwde en marktplaats connectors.

⚠️
Credits en Add Funds worden opzettelijk bewaard voor de facturering van geschiedenis, klantbalans context en grootboekanalyse. Exclusief ze uit Sales niet verwijderen; het voorkomt alleen dat ze opblaast handel prestaties.

lifecycle_type bepaalt wat een CRM-deal wordt

lifecycle_type is geen analytische label.OpsIQleest het om te beslissen of een verkoop de CRM pijpleiding, dus elke verkoopconnector maakt een pijplijn beslissing of het van plan is of niet.

nieuw

Opent een gesloten-won deal (nieuwe business).

vernieuwing, verbetering

Geen new-business deal .. vernieuwingen converteren op een andere kans curve en mengen ze corrumpeert beide voorspellingen.

restitutie, krediet

Nooit een deal opent, in welke modus dan ook. Geld terug naar een klant is geen overwinning.

weggelaten / onbekend

De verkoop is geregistreerd, maar komt nooit aan de pijpleiding.

Een verkoop, een grootboekrij: identiteit is de SALE, niet het evenement

Niet overeenkomen met event_id En steek jezelf in. event_id is platform:eventName:externalId, die antwoorden . Hebben we al deze levering verwerken en kunnen niet beantwoorden . hebben we al opgenomen deze verkoop . Een platform dat een betaling twee keer aankondigt . invoice.paid en opnieuw als payment.completed .. munt twee ID's en landt hetzelfde geld tweemaal, met niets te botsen en niets om te waarschuwen.

💡
Gevonden op de referentieinstallatie: zes facturen met elk drie grootboekrijen, van drie codepaden die drie verschillende event_id schema's gebruiken. Ze droegen allemaal 0.00 zodat geen totaal verkeerd leek en een later proces dat echte bedragen herstelde drie keer één betaling zou hebben geteld.

Bel de gedeelde schrijf in plaats daarvan. Core berekent de verkoop ?? s zakelijke identiteit (sale_fingerprint), komt overeen met een bestaande rij op het, behoudt de originele event_id bij update en filters naar echte kolommen:

De enige ondersteunde manier om het sales grootboek te schrijven
\OpsIQ\Commerce\CommerceEventContract::upsertSaleRow('opsiq_sales_events', $row);
Dezelfde verkoop, vele evenementen

factuur. payed, payment. compleet en sale. voltooid voor één factuur delen een vingerafdruk en update een rij.

Terugbetalingen gescheiden blijven

Geld dat uit gaat is een ander feit dan geld binnenkomt. Een terugbetaling van een factuur behoudt zijn eigen identiteit, zodat het nooit kan overschrijven de betaling die hij omgekeerd.

Geen referentie, geen vingerafdruk

Een rij zonder bestelling, factuur, abonnement of servicereferentie krijgt helemaal geen vingerafdruk, dus twee niet-gerelateerde rijen botsen nooit omdat beide een id missen.

Referentieprioriteit

facturation_ref, dan order_ref en vervolgens abonnement_ref. Dan service_ref

Het grootboek is alleen bijvoeglijk naamwoord: nooit een verkoop herschrijven

Een restitutie, annulering of correctie is een nieuwe gedateerde vermelding. Nooit muteren de rij het corrigeert. Herschrijven van een betaling in een restitutie ziet er netjes en breekt drie dingen tegelijk:

Het vernietigt de bruto-inkomsten

Brutoverkoop en restitutie zijn niet langer scheidbaar . De restitutievoet is de maatstaf die er bestaat om te informeren.

Het boek de omkering in de verkeerde periode

Een terugbetaling van een januari verkoop moet maart verminderen. Herschrijven de Januari rij stil resteert een gesloten periode.

Het breekt het auditspoor

Een grootboek registreert wat er gebeurde op een moment in de tijd. Correcties zijn contra-entry, dat is hoe dubbele entry boekhouding werkt voor vijf eeuwen.

Dus een connector rapporteert de omkering in plaats van het toepassen: retour refunded_at en refund_amount naast de verkoop . eigen levenscyclus, en laat de beller schrijven van de restitutie als een eigen rij gedateerd toen de terugbetaling gebeurde . De twee kunnen nooit botsen , omdat de verkoop vingerafdruk scheidt een rendement van een verkoop

💡
Hetzelfde principe geldt voor bedragen. Repareer geen opgeslagen bedrag aan de actuele waarde van het platform: een factuur die is verrekend met credit op rekening is geregistreerd 0 tijdens betalingstijd, en het geld werd al opgenomen toen de klant bijgevuld. Herstel van de nominale waarde telt twee keer.

Het classificatiecontract

OpsIQ bepaalt de levenscyclus eenmaal, in \OpsIQ\Commerce\SaleLifecycleClassifier. Een aansluiting verklaart alleen welke van eigen platform woorden betekenen wat, door te implementeren \OpsIQ\Connectors\SalesLifecycleConnectorInterface::salesLifecycleVocabulary(), en dan de gedeelde classifier aanroepen. Niet opnieuw implementeren van de redenering.

Woordenschat aangeven, beslissing delegeren
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,
]);
💡
Voorwaarde wordt vastgesteld en gedeeld: expliciet, dan terugbetaald/geannuleerd, vervolgens credit, dan upgrade, is_order, dan terugkerende, dan overname, dan onbekend. Upgrade zit boven de bestelling controle omdat platforms verhogen een order voor upgrades ook; terugkerende zit eronder omdat de eerste factuur van een nieuw abonnement heeft een terugkerende lijn type. Op een dubbelzinnige niet-orde verkoop de classifier leunt naar inkomsten en weg van de pijpleiding.

Het platform tonen

Dit is het falen dat het meest kost en er het minst verkeerd uitziet. De WHMCS connector is aangepast ['hosting','addon','domain'] Een lijst die als compleet leest. WHMCS zendt geen kale uit Domain type voor echte domeinlijnen; het zendt DomainRegister, DomainRenew, DomainTransfer, PromoHosting, PromoDomain, DomainAddon* en Upgrade. Allemaal viel voorbij de lijst naar unknown: 1,288 facturen, drie jaar, geen fout en geen logregel.

Elke nieuwe klant importeert zijn geschiedenis via een backfill van de connector, zodat een classificatie bug niet van invloed is op één werkruimte . Het beïnvloedt elke werkplek die ooit aan boord door die connector, op het moment dat ze eerst kijken naar hun pijplijn. Neem de woordenschat uit het platform documentatie of een volkstelling van live gegevens, en match groeiende families door voorvoegsel Dus een broer of zus die niemand heeft gezien, is niet verdwenen.

💡
Een praktische controle: tel hoeveel van uw eigen rijen land op onbekend. Een gezonde verkoop connector classificeert bijna alles. Een constante stroom van onbekende is bijna nooit gegevens die je niet hebt

Geïmporteerde geschiedenis wordt gerepareerd

Elke verzonden OpsIQ sales connector implementeert dit — 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() gebruik makend van de per-record fetch die uw connector al heeft. tools/crm_backfill_sales_lifecycle.php dan repareert uw connector geimporteerde geschiedenis zonder per-connector code: droog lopen standaard, backs zichzelf en controleert de rij tellen voordat het schrijven, omkeerbaar door een ongedaan grootboek, en het schrijft nooit een mislukt gelezen als antwoord.

💡
Als uw connector niet kan opnieuw lezen records verleden . . een webhook-only connection kan niet . Doe de methode niet struikelen. Een strookje terug onbekende is erger dan geen implementatie: een backfill zou goede rijen herschrijven als ongeclassificeerde en rapport succes. Implementeer alleen de woordenschat interface.
💡
Gedetailleerde pakketverwijzingen blijven beschikbaar in connectors/CONNECTOR_EVENTS. md en connectoren/PLATFORM_CONNECTORS. mde in self-hosted brondistributies.
Connectoren

Contract voor het evenement van de reis

Journey Intelligence accepteert één platformneutrale evenement-envelop van de browser widget, ingebouwde connectors, SaaS Bridge, marktplaats pakketten en Connector Builder output. Platformspecifieke namen worden vertaald aan de rand; trechter, attributie en Site Intelliance code verbruikt alleen canonieke gebeurtenissen.

Isolatie en vertrouwensgrens

Exacte peer-domein sleutel

Elke gebeurtenis is gebonden aan de geauthentiseerde domeinsite_key. Een connector moet die sleutel van ConnectorRegistry of het geverifieerde eindpunt nemen, nooit uit een niet-vertrouwde aanvraagtekst. Domeinnamen houden aparte records bij; een domeingroep is alleen een readtime-aggregaat.

Idempotent identiteit

event_id is vereist voor connectors en moet deterministisch zijn voor dezelfde inheemse gebeurtenis. Retrie-, webhooks- en backfills werken één evenement bij in plaats van een reis of verkoop te dupliceren.

Native plus canonieke naam

Bewaar source_event_name voor bewijs en probleemoplossing, map het vervolgens naar event_ name_canonical. Core analytics mag nooit vertakken op een connector naakt.

Server bewijs wint

Geverifieerde connectorgebeurtenissen bevestigen aanmelding, aanmelden, betaling, aankoop, verlenging, terugbetaling en andere eindresultaten. Een geldig sitegebonden correlatietoken is de sterkste join; een ongeldig token wordt geweigerd en de ingesloten id's ervan worden niet vertrouwd. A valid site-bound correlation token is the strongest join; an invalid token is rejected and its embedded IDs are not trusted.

Privacy

Alleen identificaties en velden verzenden die nodig zijn voor de aangegeven reis. Respecteer toestemming, maskering en bewaringsinstellingen. Plaats nooit referenties, kaartgegevens, authentificatiegeheimen of privé-boodschaplichamen in eigenschappen.

Canonische envelop

Reis-evenement envelop
{
  "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"}
}

Canonische taxonomie

Gebruik de engste waarheidsgetrouwe naam. Ondersteunde families omvatten verlovingspagina/CTA-evenementen; rekening aanmelden, login, MFA en wachtwoord resetten; lead and form stadia; product, winkelwagen, kassa, betaling, aankoop, abonnement, vernieuwing en terugbetaling; promotie impressies en conversies; helpcenter, chat en ticket evenementen; security events; en namespaced aangepaste gebeurtenissen. Typische terminal namen zijn account.signup.succeeded, account.login.succeeded, lead.form.succeeded, commerce.payment.succeeded, commerce.purchase.completed, commerce.subscription.renewed en commerce.refund.completed.

Browser-inferentie, bevestiging en verlaten

Het widget kan werken zonder een connector door het waarnemen van paginastructuur, vorm acties, DOM-resultaten en de bezoeker reislogboek. Dat bewijs blijft expliciet ingedeeld als waargenomen of afgeleid. Een connecteur voegt gezaghebbende serverbevestiging toe en kan deze correleren met dezelfde browser poging. Verlatenheid wordt eerst opgeslagen als kandidaat; het wordt verlaten alleen nadat het inactiviteit venster ingesteld in de UI en alleen wanneer er geen later herstel of succes bestaat.

Bestemming en ontvangsten

Attribution prefereert een geldig ondertekend correlatie token, dan een exacte reis, poging, sessie of handel referentie, vervolgens de goedgekeurde identiteit grafiek, en uiteindelijk een begrensd gedragsmatch. Ongeëvenaarde verkoop blijft ontoegewezen. Multi-touch grootboek gewichten moeten totaal 1_. Site Intelligence toegewezen inkomsten leest dit grootboek; credits, portemonnees top-ups, token top-Ups en Add Funds zijn nooit aankoop conversies. Connector FX gedrag blijft gecontroleerd door die connector instelling.

⚠️
Attributiemodel, terugblikvensters, direct-verkeersbehandeling, minimum vertrouwen, timeout en trechterdefinities zijn UI beleid. Connector code mag ze niet hardcoderen.

Connector manifest en Builder

Aangifte van de connectorreis
{
  "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"
    }
  }]
}

Alleen mogelijkheden aangeven die het pakket echt levert. Connector Builder valideert de mapping en genereert dezelfde platformneutrale adapter gebruikt door first-party pakketten. Journey intake accepteert één gebeurtenis of een begrensde batch van 100 via het gegenereerde geauthentiseerde integratie eindpunt.

💡
De commerce grootboek blijft de financiële bron van waarheid. De comeback-to-journey brug publiceert server bevestigde resultaten en verzoent attributie na het bestaande idempotent grootboek upsert, zodat een betaling nooit twee verkopen wordt.
Connectoren

Hoe AI-acties werken

Elke connector verklaart een reeks acties: dingen die de AI via het externe platform kan doen. Acties zijn de brug tussen "de AI zegt" en "de AI doet."

AI-acties
Hoe AI-acties werkenEen verzoek van de klant in kaart gebracht op een actiekaart voor het type verwijderen, vervolgens een controlelijst: toestemming aangevinkt, u bevestigt, API aangeroepen.Hoe AI-acties werkenwerkblad"Mijn abonnement annuleren"klantAIcancel_subscriptiondeletebevestiging vereistparams: abonnement_id (vanaf context)ACTIETYPENreadschrijvendeleteToestemming & rol gecontroleerdU bevestigt de actieAPI aangeroepen · resultaat gemeld1DECLAREDElke connector bevat acties2GATEDToestemming + bevestiging3THEN RUNAPI aanroep, resultaat terug
Een verzoek wordt een aangegeven actie (getypte lees/schrijf/verwijder) die door toestemming gecontroleerd, bevestigd, vervolgens uitgevoerd en gerapporteerd is.

De levenscyclus van de actie

1
Klant vraagt om iets

"Mijn abonnement annuleren." De AI identificeert dit vereist de actie "cancel_subscription"

2
AI-controles permissies

Is deze actie toegestaan? Is het ingeschakeld? Heeft de huidige gebruiker de juiste rol?

3
AI verzamelt parameters

De actie heeft een abonnements-ID nodig. De AI zoekt het op vanuit de context van de klant of vraagt het aan de klant.

4
Bevestiging

Voor destructieve of zeer impactvolle acties vraagt de AI om bevestiging voordat ze wordt uitgevoerd.

5
Uitvoering

De actie roept het externe platform op API.

6
Resultaat

De AI meldt het resultaat aan de klant.

Actietypes

Acties lezen

Zoek gegevens op zonder iets te veranderen. Voorbeelden: list_orders, get_customer. Veilig, geen bevestiging nodig.

Acties schrijven

Gegevens aanmaken of wijzigen. Voorbeelden: create_ticket, update_order. Mogelijk bevestiging nodig hebben.

De acties verwijderen

Gegevens verwijderen. Voorbeelden: annuleer_abonnement. Altijd bevestiging nodig.

HTTP-acties

Verklaard in acties.json, generiek API Oproepen worden declaratively gedefinieerd.

Krachtstags

Facultatief veld "capability" per actie in acties.json, een connector-neutrale klasse label (bv. "tickets" voor het lezen/opzoeken van tickets, "tickeet_create" om een ticket te openen).OpsIQ poorten de hele klasse gelijkmatig over elke connector: ticket leest drop-out uit de AI wanneer de exploitant zet AI Ticket Bewustzijn, en ticket aanmaken is gereserveerd voor OpsIQ's eigen componist (zodat een connector's create tool het niet kan dupliceren).OpsIQ De Connector Builder onthult het als een mogelijkheid dropdown per actie.

Codeacties

In PHP geïmplementeerd in de connectorklasse. Volledige controle over logica.

Voorbeeld van actiedefinitie
{
  "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" }
    }
  }
}
Connectoren

Bouw een connector

Met de Connector Builder kunt u een complete connector maken voor elk platform met een REST API. Geen codering vereist voor basisconnectoren.

Bouw een connector
Connector BouwerEen no-code connector vorm: naam, auth type, base URL, een actie mapping, een passerende test en een publicatie knop.Connector BouwerwerkbladConnector BouwerNaamMijn platformAuthOAuth 2.0 (PKCE)Basis URL_https://api.example.com/v2ActieGET/customers → list_customersTest geslaagdPakketconnector1NO-CODENaam, auth, basis URL2ANY APIKey, Bearer, Basic, HMAC. OAuth3PUBLISHInto /connectors/<slug>/
Richt de bouwer op elke REST API. Stel auth, basis URL en acties, testen en publiceren van een werkende connector. Geen code nodig.

Complete aanbieder API dekking

Elk gegenereerd API connector kan ontmaskeren afzonderlijke Native API Lezen en Inheems API Schrijf acties. Geselecteerde acties blijven de voorkeur geven; native acties hebben betrekking op provider eindpunten later toegevoegd. De runtime ondersteunt REST, GraphQL, JSON, formulier, XML, rauwe en meerdelige lichamen, begrensde paginatie;API-version headers en idempotency terwijl het behouden van referenties binnen de werkruimte connector instellingen.

⚠️
Marktplaats pakketten zijn afkomstig van /marketplace_connectors zowel gebundeld als gebundeld /connectors. Verhoog de package versie, regenereer het contract en documentatie, voer conformance testen uit, dan opnieuw ondertekenen en publiceren van de nieuwe Marketplace-versie.

Connector Builder-assistent

De wizard heeft zes stappen, weergegeven als tabbladen over de bovenkant. U kunt tussen hen vrij springen, en Concept opslaan in de voettekst houdt je werk op elk punt.

1
Identiteit en profiel

Naam, naakt, beschrijving en pictogram, kies dan een contractprofiel: Standaard API, Handel, Helpdesk, Mailbox, Site Intelligence, SaaS Bridge, Lokaal PHP Platform, of Platform zonder API wanneer het platform niets aanroepbaar dient en OpsIQ een brug moet installeren. Het profiel selecteert een volledig startpunt voor de mogelijkheden; u kunt nog steeds individuele mogelijkheden aanpassen.

2
Auth

Kies het authenticatiepatroon dat het platform gebruikt en vul de velden in. Voer hier ook echte testgegevens in: ze worden gebruikt voor de verbindingstest bij de volgende stap, en ze worden niet opgeslagen nadat u deze hebt gepubliceerd.

3
Test

Voer de API basis URL en een verificatie eindpunt, voer dan een live verbinding test met behulp van de referenties uit stap 2. Doe dit voordat u een actie definieert, als de auth of de basis URL is verkeerd, elke actie die je daarna schrijft zou mislukken om dezelfde reden en u zou debuggen het verkeerde ding.

4
Acties

Bepaal elke handeling: naam, HTTP methode, eindpunt pad, parameters, responsveld mapping en de betrouwbaarheidsinstellingen die hieronder worden beschreven. U kunt iedere actie afzonderlijk uitvoeren tegen de live API vanuit deze stap.

5
Triggers

Kaart van de webhook evenementen die uw platform verzendt OpsIQ evenementen, zodat dingen die gebeuren op uw platform kunnen beginnen werken in OpsIQ.

6
Herziening, ondernemingscontract en publicatie

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

⚠️
Publishing doet NIET de conformance suite. Publiceert alleen valideert het wizard formulier en zendt waarschuwingen die niet blokkeren. De volledige suite

Wat publiceren doet dat het formulier niet laat zien

Vijf gedrag van de generator verrassen mensen. Geen is een bug; ze allemaal kost u een namiddag als je hen per ongeluk ontmoet.

Een vraag bepaalt de passthrough: dient het platform een API?

Antwoord het in stap1door de data-access mode te kiezen (of het "Platform zonderAPI" profiel).APImodus declareert native_api and emits the <slug>_api_call passthrough. Bridge mode declares platform_bridge in plaats daarvan en STRIPS native_api Zelfs als een oudere spec het meedroeg, kan de manifest, de gegenereerde klasse en de expertise docs niet oneens zijn. ai_brain_aware wordt toegevoegd hoe dan ook.

SILENCE BEGRIP "Hij heeft een API"

De Bouwer volgt uw antwoord; het werkt niet de waarheid voor zichzelf, en de standaard wanneer niets wordt gezegd isAPIDus een nee-APIplatform moet ACTIEF zeggen zo . Kies het "Platform met geenAPI" profiel, gegevenstoegang tot brug instellen of aanvinken 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.

De verbindingstest standaard voor GET /ping

Als je het verificatiepad leeg laat, schrijft de Bouwer /ping in de gegenereerde connector en in het profiel.json's testblok. Bijna geen echt platform dient die route, dus Test Connection mislukt met HTTP404Op elke installatie en leest als een klant verkeerde configuratie in plaats van een pakket defect. Stel een verificatie pad dat uw platform daadwerkelijk antwoordt. Voor een brug connector, richt het op je eigen diagnose eindpunt te bereiken .Het bewijst de hele keten in één gesprek: de brug wordt ingezet, de sleutel overeenkomt, en de brug kan de database bereiken.

Herpublishing overschrijft nog steeds je hand-edits

Mogelijkheden nu volgen het data-access antwoord, zodat die niet langer drift. Al het andere gegenereerde nog doet: bewerken ContextProvider. php of een ander uitgezonden bestand en de volgende publicatie vervangt het. De enige beschermde uitzondering is het brugbestand

Republicing deletes files

Een mogelijkheid ongedaan maken en de volgende publicatie verwijdert zijn provider bestand. Hand-edits naar een gegenereerd bestandopsiq-Builder.json(Daarna zal de tovenaar het niet meer aankunnen).

release_status is altijd een voorbeeld

De wizard heeft er geen controle over. Een pakket bedoeld om te verzenden als productie moet release_status met de hand gewijzigd hebben in instellingen.json

De handtekening bewijst integriteit, niet oorsprong

Bouwpakketten worden ondertekend met de eigen symmetrische sleutel van deze installatie. Dat detecteert manipulatie. Het bewijst niet wie het pakket heeft geschreven, en elke installatie die dezelfde sleutel bezit kan dezelfde handtekening produceren. Behandel een lokaal ondertekend pakket als zelf-getekend.

Aanrijdingen van de plug worden slechts in één boom gecontroleerd

Uitgeverij weigert een kogel die al bestaat onder/connectors/.Het kijkt niet naar/marketplace_connectors/,Zodat een handgeschreven first-party pakket met dezelfde kogel kan eindigen schaduw.

💡
De wizard heeft geen kennis-authoring stap. Een kennisbestand dat uw platform beschrijft wordt voor u gegenereerd uit de naam, beschrijving, auth type en acties die je hebt gedefinieerd, en het wordt geladen in de AI wanneer de connector is ingeschakeld.

Een actie definiëren (stap 4)

Elke actie heeft de volgende instellingen. Alleen de eerste vier zijn nodig; de rest bepaalt wie het kan uitvoeren en hoe zorgvuldig.

Actiesleutel en label

De sleutel is wat de AI aanroept; het label is wat een mens leest. Sleutels worden automatisch met je connector-naakt verbonden, zodat twee aansluitingen beide een "list_orders" kunnen hebben zonder botsen.

HTTP-methode

Get, POST, PUT, PATTCH of DELETE.

URL pad

Aan de basis toegevoegd URL Gebruik {name} voor plaatshouders, bijvoorbeeld /opportunities/{id}/stage

Parameters

Voor elke parameter kies je ook waar het naartoe gaat: lichaam, pad, query of kop. Een padparameter vult a {placeholder}; een vraagparameter is toegevoegd aan de URL.

responstoewijzing

Zeg welk veld in het JSON antwoord betekent wat, dat is de naam van de klant, die de e-mail is, en dit is het totaal van de bestelling. Dit laat de AI de gegevens van uw platform lezen in plaats van te raden.

Wie kan het gebruiken?

Uw team (admin AI), ingelogde klanten (customer chat), zowel, als de schrijfassistent. Customer acties worden alleen uitgevoerd voor de ingetekende klant en identiteit velden zijn automatisch vergrendeld aan hen zodat een klant niet kan vragen naar een andere klant.

Vereist bevestiging

Een mens moet het goedkeuren voordat de actie loopt.

Destructief

Markeert de actie als verwijderen of wijzigen van status. Wordt gebruikt om te waarschuwen voordat deze draait.

Vereiste toestemming

De beheerder moet deze toestemming voor de AI hebben om namens hen de actie uit te voeren; volledige beheerders geven altijd door. Kies uit manage_integraties, manage _general, managing_billing, manager_sales_bridge, managen_knowledge, manamber_appearance, manay_behavior, manan_permissions, management_dangerzone, reply_to_chats, escale_to _ticket, send_agent_email, of geen, wat betekent dat er een geauthentiseerde admin is.

Beschrijving / AI hint

Optioneel, maar de moeite waard om te schrijven. Het vertelt de AI wanneer je moet bereiken voor deze actie, bijvoorbeeld "Gebruik dit als de beheerder vraagt een deal-fase te wijzigen." Een goede hint is het verschil tussen een actie die de KI correct gebruikt en een actie dat hij negeert.

Vermogen

Optionele klasse-tag, tickets (een ticket gelezen of opzoeken) of ticket_create (opent een ticket). Tagging lets OpsIQ gate de hele klas in één keer, bijvoorbeeld, verbergen ticket leest wanneer een exploitant AI ticket bewustzijn uit zet.

Lijstpad

Optioneel. Voor eindpunten die een lijst teruggeven, het stippelpad naar de array, bijvoorbeeld data of data. items

Foutpad

Facultatief. Een body-veld waarvan de aanwezigheid betekent dat de oproep mislukt is, bijvoorbeeld error.message, nuttig voor APIs die HTTP retourneren 200 bij mislukking.

Doe het.

Elke actie kan vanaf deze stap worden uitgevoerd tegen de live API, zodat je een verkeerd pad of veldnaam kunt repareren voordat iemand anders het gebruikt.

⚠️
Schrijfacties worden standaard beschermd. Elke actie met POST, PUT, PATHCH of DELETE begint te vereisen dat de manage_integraties toestemming en menselijke bevestiging voordat het draait. Dit is opzettelijk. Een nieuwe schrijfactie mislukt eerder dan dat de AI je gegevens zonder toezicht laat veranderen. Je kunt beide wijzigen op de actie, maar ze bewust veranderen.
💡
Om te worden opgeroepen van de klant chat, een actie moet alleen-lezen: laat zowel Vereist bevestiging en Destructief ongevinkt. Een actie die een klant kan activeren dat ook verandert staat is niet iets wat de wizard zal u per ongeluk laten verzenden.

Webhooks ontvangen (stap 5)

De Triggers stap geeft je een webhook URL om te registreren bij uw platform, en controleert elk verzoek dat er op aankomt.

Handtekeningkop

De header van je platform met bijvoorbeeld X-Hub-Handtekening-256.

Handtekeningalgoritme

HMAC-SHA1, HMAC‐SHA256 of HMAC - SHA512.

Ondertekeningsregeling

Eenvoudig, een gewone vix of base64 vert. Of Stripe-stijl, het t=...,v1=.

Handtekening voorvoegsel

Optioneel. Sommige platforms stellen de vertakking voor, bijvoorbeeld sha256=. Laat deze leeg als die van jou niet is.

Evenementen mappings

Kaart elke gebeurtenis die uw platform stuurt naar de OpsIQ gebeurtenis moet verhogen.

Automatisch registreren van de webhook

Als uw platform heeft een API voor het beheer van haar eigen webhooks, hoeft u niet te registreren de URL Met de hand open. Automatisch registreren van deze webhook op inschakelen en richt het op twee van de acties die je in stap 4hebt gedefinieerd:

Webhook-actie aanmaken

Gebeld wanneer een beheerder de connector inschakelt. U geeft de parameternaam die het URL_ draagt, optioneel degene die de agenda van gebeurtenissen draagt en het pad in het antwoord dat de id van de nieuwe webhook bevat.

Actie voor verwijderen van webhook

Geroepen wanneer de connector uitgeschakeld is, met behulp van het hierboven opgenomen id, dus uitschakelen van de schakelaar stopt ook uw platform verzenden naar een dood eindpunt.

Mogelijkheden die u kunt inschakelen

Profielen en mogelijkheden worden gedefinieerd door Connector Contract 2.2. Generated and declarative capabilities are emitt direct; Enterprise mogelijkheden genereren een EnterpriseExtension.php steiger met runtime lifecycle bedrading.

Acties

Operaties die de AI op uw platform kan uitvoeren: lijst van bestellingen, een klant vinden, restitutie geven.

Triggers

Ontvang webhooks van uw platform en zet ze om in OpsIQ evenementen.

AI-tickets

AI Triage en het antwoord Copilot op tickets die blijven op uw platform. Kies het eindpunt dat een ticket met zijn antwoorden teruggeeft en kaart de velden; OpsIQ leest de draad doorheen.

Postvak en contacten

De e-mail van een klant tonen op hun tijdlijn, verzenden vanuit een deal en synchroniseren uw adresboek in het OpsIQ CRM.

Importeren van klanten

Pagina door uw klantenlijst en importeer ze als OpsIQ contact. Dit is wat de Importknop draait.

Context

Druk live data van uw platform in elk AI gesprek.

Identiteit

Bereken welke van uw klanten een bezoeker is en toon hun profiel en aankopen op een ticket.

Verkoop en facturering

Feed inkomsten gebeurtenissen en MRR cijfers in de OpsIQ dashboards.

Inkomende tickets

Zet tickets en e-mails die uw platform levert door webhook in OpsIQ ondersteuning threads.

Uitgaande antwoorden

Post OpsIQ personeel antwoordt terug op het platform waarop de draad is ontstaan.

Gebruikers synchroniseren

Importeer uw personeelaccounts in OpsIQ admin gebruikers.

Afdelingen synchroniseren

Importeer uw ondersteuningsafdelingen in OpsIQ.

Promo targeting en productfeed

Laat Promotie Studio doel op feiten die u weet over een persoon, en maak uw echte producten binnen een promotie.

Studio-aanbieder

Expose server-verified Survey feiten, ontsnapte variabelen en begrensd CRM Outreach ontvanger pagina's via een speciale enquêteProvider. php. Dit niet hergebruikt de Promotie runtime.

Inheemse IP _blokkering

Wanneer OpsIQ blokkeert een IP, bel uw platform's eigen blok API Dus het blok wordt daar ook afgedwongen.

Beveiligingsgebeurtenissen

Ontvang geblokkeerd-IP dreigingssignalen van OpsIQ.

Platformkennis voor de AI

Elke connector die je bouwt, geeft een korte referentie waarin staat wat jouw platform is en wat zijn acties doen. De OpsIQ admin AI leest het wanneer de connecter ingeschakeld is, dus begrijpt het jouw Platform in plaats van alleen maar een lijst met actienamen te zien. Dit wordt voor jou gegenereerd.

API pass-through

Uw connector krijgt altijd een algemene oproep zodat de AI een eindpunt kan bereiken waarvoor u geen getypte actie hebt gedefinieerd. Gebruik getypt acties waar u kunt; dit is het ontsnappingsluik.

Canonical Connector Contract 2.2 referentie

Contractversie: 2.4 · 57 capabilities · 8 profiles.

Verbindingsprofielen

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.

Canonische mogelijkheden

acties

Universal actions. Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: actions.json.

triggers

Inbound event triggers. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook. Package files: actions.json.

webhook

Inbound webhook endpoint. Capability version: 1.0. Mode: generated. Runtime methods: handleWebhook.

journey_events

Universal Journey Event Contract mapping. Capability version: 1.1. Mode: generated. Interfaces: OpsIQ\Connectors\JourneyEventConnectorInterface. Package files: settings.json.

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.

identiteit

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.

facturering

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.

handel

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.

lokaal

Local search/location data. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

dit

SEO data and actions. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

site_intelligence

Site Intelligence provider. Capability version: 1.0. Mode: declarative. Runtime methods: siteIntelligenceProviders. Interfaces: OpsIQ\Connectors\SiteIntelligenceConnectorInterface.

analyse

Analytics data provider. Capability version: 1.0. Mode: declarative. Runtime methods: analyticsCapabilities.

comms

Communications/video-meeting provider. Capability version: 1.0. Mode: declarative. Runtime methods: commsCapabilities.

admin_assets

Connector-provided admin/account/public browser assets. Capability version: 1.0. Mode: generated. Runtime methods: adminAssets. Interfaces: OpsIQ\Connectors\AdminAssetConnectorInterface.

enterprise_hooks

Platform-native hooks and lifecycle callbacks. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

durable_queue

Durable outbox/inbox queue and retry policy. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.

ticket_mirror

Bidirectional ticket mirror with conflict handling. Capability version: 2.0. Mode: extension. Interfaces: OpsIQ\Connectors\TicketMirrorConnectorInterface. Package files: EnterpriseExtension.php.

attachment_bridge

Attachment upload/download transfer. Capability version: 2.0. Mode: extension. Package files: EnterpriseExtension.php.

database_migrations

Connector-owned schema migrations. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

scheduled_workers

Connector-owned scheduled/background workers. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

conflict_resolution

Two-way sync conflict strategy. Capability version: 1.0. Mode: extension. Package files: EnterpriseExtension.php.

⚠️
Bouwspecificaties blijven de gezaghebbende bron. Zet platformspecifieke bedrijfsregels in de gegenereerde extensiepunten; de levenscyclus van het pakket, wachtrijen, werknemers, migraties en conformantietests blijven Builder-beheerd.

Betrouwbaarheidsinstellingen bij elke actie

Opnieuw

Hoe vaak moet je een mislukt gesprek opnieuw proberen, met een backoff die elke poging verdubbelt. Alleen timeouts, 429s en 5xx fouten worden opnieuw opgehaald; een 4xx is de fout van uw verzoek en herhalen zou gewoon branden uw snelheidslimiet.

Maximumpercentage

Een plafond per minuut voor deze actie, dus een drukke trigger kan je platform niet hameren. Laat het op 0 zonder limiet achter.

Tijdslimiet

Hoe lang om te wachten op uw platform voordat u het opgeven.

Bevestiging

Een mens moet het goedkeuren voordat de actie loopt.

Authenticatietypen

Stap 2 biedt zeven patronen. Kies degene die overeenkomt met uw platform's API documentatie, de generator zendt de juiste HTTP client voor.

API sleutel in header

Een statische sleutel verzonden als een vaste header, bijvoorbeeld X-API-Key. U geeft de naam van de header en het label dat het admin-formulier moet tonen. Dit stuurt alleen de sleutel als een header; als uw API Verwacht de sleutel als een query parameter in plaats daarvan, gebruik aangepaste kopregels of een volledige code-connector.

Draagteken

Token sent as Authorization: Bearer <token>. Common for modern APIs.

Basisauth

Gebruikersnaam en wachtwoord, base64-gecodeerd in de Authorization header. U kiest de labels die beide velden tonen op het admin formulier.

HMAC-ondertekend

Een publieke sleutel plus een geheim, met de aanvraag lichaam ondertekend. U geeft de handtekening header, de key header en de tijdstempel header die uw platform verwacht.

OAuth 2.0 (client referenties)

Server-to-server, zonder gebruikersinteractie en geen redirect. U geeft de token URL en een optionele scope; de admin levert een client ID en geheim. Gebruik dit wanneer uw platform referenties aan een toepassing eerder dan aan een persoon geeft.

OAuth 2.0 (Verbind de knop)

De autorisatie-code stroom met PKCE, voor Stripe, Shopify, Slack en QuickBooks-stijl apps. U geeft de autorisatie URL, het token URL en de scope. Na publicatie klikt de admin op de connector, geeft toestemming voor uw platform, en OpsIQ slaat de refresh token en muntjes toegang tokens op aanvraag. URI om u in te schrijven bij uw OAuth app wordt getoond op de instellingen pagina van de stekker.

Aangepaste kopregels

Een vrije vorm JSON header map voor alles wat de bovenstaande patronen niet dekken, bijvoorbeeld {"X-API-Key":"{api_key}","X-Tenant":"{tenant_id}"}. Elke plaatshouder wordt een veld op het administratieformulier.

💡
PKCE is alleen van toepassing op de Connect-knopstroom. De client-intelligentiestroom heeft geen redirect en geen gebruikersstap, dus PKCE is niet van toepassing.

Paginatiestijlen

Verschuiving

Gebruikt offset- en limietparameters. Voorbeeld: ?offset=100&limit=50.

Bladzijde

Gebruikt paginanummer. Voorbeeld: ?page=3&per_page=50.

Cursor

Gebruikt een cursor token van het vorige antwoord.

Linkkop

Gebruikt de Link response header met rel="next."

Geavanceerd: aangepaste PHP-code

connector.php RETURNS een instantie. Het geeft geen naamklasse aan die OpsIQ De methode namen hieronder zijn degenen die ConnectorInterface vereist; het krijgen van een fout is een fatale bij lading, geen waarschuwing.

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

Spiegelkaartjes in het ticketsysteem

Als uw platform een ticket bezit, spiegelt u het naar OpsIQ van uw connector met behulp van de ticketinname helper die uw schakelaar erft (creëer voor een nieuw ticket, add-reply voor follow-ups). Emit en abonneer op de universele ticket evenementen in uw link's subscribers() methode, ticket.created, ticket.replied, ticket.updated, ticket.deleted. Auto-reply, escalatie, SLA en CSAT alle hook dezelfde gebeurtenissen, zodat u ze erft zonder extra code.

Als u ticket.deleted, je ook omgaan met merges. Verwijderen van een samengevoegd ticket draagt merged_into en niet naar een connector wordt gestuurd die verklaart ticket_merge; de merge komt eenmaal als ticket.merged in plaats daarvan, zodat je kunt mergen op uw platform in plaats van het samengevoegde ticket daar sluiten. Zie Ticket merge-vermogen (Contract 2.4).

Zeg wie het bericht heeft geschreven.

Een ticket is altijd voor de klant, maar het openingsbericht kan door personeel: een agent die namens de klant een ticket opent of proactief contact opneemt. Elke helpdesk ondersteunt dit, dus het maakt deel uit van het universele ticket.created contract in plaats van iets wat elke connector privé oplost.

author_type

client (standaard) of admin. Geef het en de klant wordt verondersteld.

author_id

Het personeels-id bij author_type=admin. Nooit het klant-id.

author_name

Agent of afdelingsnaam, valt terug naar 'Personeel'.

author_email

Het agentadres. Nooit de klant. Een personeelsbericht onder de e-mail van de klant is een rapportage en auditfout.

Dit is niet cosmetisch. Consumenten lezen author_type een personeelsgeschreven opening gemeld als client laat automatisch antwoord in aanmerking komen om een bericht te beantwoorden dat je eigen agent schreef, en maakt uw platform echo van die opening lijkt op een verse klantbericht, die dan landt als een duplicaat en het ticket naar beantwoord. Map het signaal van uw platform op het in de stekker Gebruiker, nooit in de consumenten.

Gecentraliseerde blokkering

Wanneer een agent een afzender blokkeert, geldt dat voor elke kanaal onmiddellijk (e-mail, chat, portal, widget en elke connector twin) omdat het blok centraal wordt afgedwongen, voordat een connectie ziet het bericht. Uw connecter erft het door niets te doen. Er is geen inkomende werk om uit te voeren en geen manier om het verkeerd te krijgen.

De facultatieve helft is uitgaande: het vertellen van uw platform een klant werd hier geblokkeerd. Implementeer het alleen als uw platform iets gelijkwaardigs kan uitdrukken.

mogelijkheden()

Moet block_registry bevatten en de klasse moet BlockRegistryInterface implementeren. De vlag is een claim; de interface is de garantie. Het register vereist beide.

blockSender($b)

Ontvangt soort (email ip), waarde, reden, admin_id, expires_at, site_key. Returns [result, detail?, remote_ref?].

unblockSender($b)

Het moet ideaal zijn, iets deblokkeren dat nooit geblokkeerd is.

isSenderBlocked($b)

Voor verzoening wordt dus drift gerapporteerd in plaats van ontdekt door een klant. Returns [result, blokkeerd?].

Resultaatwaarden

Oké.

Toegepast op uw platform. Inclusief remote_ref wanneer u een id heeft die de moeite waard is om te opnemen.

noop

Al in de aangezochte staat.

unsupported

Uw platform heeft geen equivalent concept. GEEN fout.

mislukt

Je had het kunnen doen en het ging mis. Inclusief detail, het landt in de audit trail.

Declineren is een goed antwoord. Veel platforms hebben geen "blok deze afzender" concept en bieden alleen ANTWOORD schorsing, die stopt met het factureren, logins en diensten in plaats van gewoon ondersteunen e-mail. Mapping "een agent geblokkeerd een spam adres" op "sluiten van de klant' account" zou één verkeerd geklikte blok beëindigen van een betalende klant services. Als dat de enige hendel is die u hebt, retourneren unsupported En laat het rusten.

Declinatie omvat ook het geval waarin het platform kan doen maar zal niet toestaan dat u. Controleer voor een API_, geen functie: een hendel die alleen bestaat in de admin-UI van het platform is een hefboom uw connector niet heeft.

Werkvoorbeeld · Zendesk (referentieuitvoering)

Gelezen connectors/zendesk/connector.php alongside this. It is short, and every branch below is a decision you will face too.

e-mail → ok

PUT /api/v2/users/{id} met suspend=true. De nieuwe verzoeken van een geschorste eindgebruiker worden niet geopend, maar naar Geschorste Tickets gestuurd en het is hetzelfde idee als het blokkeren van een afzender, en stopt geen facturering omdat Zendesk-eindgebruikers er geen hebben. Geeft de gebruikersid terug als remote_ref.

domein → niet ondersteund

Zendesk KAN een heel domein opschorten, maar alleen via de schorsing: trefwoord in het Admin Center bloklijst tekstgebied en geen API schrijft dat veld. De functie bestaat; de hendel niet.

ip → niet ondersteund

Geen ticketniveau IP Blok bestaat.

onbekend adres → noop

Zendesk kan een adres dat hij nog nooit heeft gezien niet voorschorsen. Niets te doen is geen mislukking, en het lokale blok stopt nog steeds de ticket.

agent of admin → niet ondersteund

WEIGERING. Opschorting personeel zou een collega uit de helpdesk te sluiten. Een stafadres dat een bloklijst bereikt is veel waarschijnlijker om een fout dan een instructie, controleer de rol voordat u handelen op het.

Die laatste rij is het waard om te kopiëren. Het contract kan niet stoppen met het in kaart brengen van een blok op iets destructiefs, dus elke connector moet zelf beslissen wat hij zal weigeren. detail een operator kan lezen, beter dan gehoorzamen.

- Meld je eerlijk. Merk op hoe weinig van die rijen zijn ok. Dat is het juiste resultaat, geen kloof: een domeinblok werkt nog steeds (het wordt in kern afgedwongen op het moment dat het geschreven wordt); het kan gewoon niet naar buiten gespiegeld worden. ok voor iets wat je niet deed zou een operator vertellen dat het blok uw platform bereikte wanneer het nooit OpsIQ_ verliet.

Regels

Het lokale blok wint altijd

Het is geschreven VOORdat u wordt opgeroepen en staat wat je terugkomt. U kunt niet voorkomen dat een operator iemand blokkeert.

Nooit gooien

Een worp wordt behandeld als niet ondersteund en opgenomen. Terugkeer mislukt met een detail in plaats daarvan zodat de reden overleeft.

Idempotent zijn

Hetzelfde blok kan meer dan eens worden aangekondigd.

Snel terug.

Fan-out is synchroon met de operator klik. Wachtrij langzaam werken in plaats van het verzoek open te houden.

Niet terugbellen

Nooit opnieuw blokkeren in OpsIQ van uw begeleider. Het register slaat de oorspronkelijke connector over, maar een tweede hop zou doorlopen.

Elke aankondiging is geschreven naar opsiq_block_registry_log (operatie, soort, waarde, reden, admin, oorsprong, connector naakt, resultaat, detail en tijdstempel) zodat een exploitant kan zien dat er een blok van uw platform in plaats van van een agent, en wat elke connecteur deed over het.

Aanhangsels correct indrukken

Hand aan hand attachments array to create()/addReply(). Elk item draagt het bestand in een van de drie vormen:

content_b64

Base64 van de RAW-bestandsbytes, gebruik voor bestanden achter auth (meest inkomende gevallen). OpsIQ decodeert het en herhostt het bestand voor u. De meest draagbare vorm.

url / bron_url

Een publieke https URL (bv. een Zendesk content_url). Moet https zijn; geeft een SSRF / allowlist controle voordat het wordt opgeslagen.

stored_path

Een opgeslagen bestandsreferentie die u al hebt geschreven (wat de native componist uploader produceert).

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 alleen bestandsnamen (niet bytes), dus het betrouwbare inkomende patroon is: lees de bytes waar uw code al loopt (binnen het platform, of van de webhook payload), base64 hen, en verzend ze als content_b64 op het evenement.

Uitgaande (OpsIQ → uw platform). Wanneer een agent een bestand aanhecht, de ticket.replied payload geeft u de bestanden van het antwoord als stored_path items onder de OpsIQ bestandsopslag. Lees ze en push in het eigen formaat van uw platform, en controleer de platformdocumenten, de codering belangrijk: WHMCS wil base64_encode(json_encode([[name,data]])) (JSON, niet serialiseren); Zendesk uploadt rauwe bytes naar /uploads.json voor een token en zet comment.uploads; Gmail stuurt een multipart/mixed RFC-822 message base64url-encoded in raw; Amazon SES inbound attachments need the S3 receive action (the SNS path caps at 150 KB).

Platforms op afstand: API + webhook, nooit de tabellen van een andere app

Als uw platform een aparte app of database (een gehoste SaaS, een remote WHMCS, een andere DB op dezelfde server), nooit zijn tabellen direct schrijven: een cross-database schrijft landt op welke verbinding actief is en mist stilletjes de echte rijen. Altijd: uitgaande = de ondertekende REST API van het platform aanroepen (antwoorden, status, afdeling, verwijderen); inkomend = het platform POST een gesigneerde webhook, uw handleWebhook() Controleer het en vuur de bijpassende ticket.* event. Om een spiegellus te stoppen, tag wat je met een oorsprongmarkering duwt (bijv. mirror_origin:'opsiq'); het platform echo's op de webhook en uw inkomende handler slaat zijn eigen echo ' s. Controleer OpsIQEvents::isMirroredEvent() boven aan elke begeleider.

Spiegelstatus, prioriteit & afdeling

Een antwoord verplaatst automatisch status, een agent antwoord → answered, a klant antwoord → customer_reply; spiegel dat op dezelfde manier. Voor expliciete wijzigingen abonneren ticket.updated en lees payload['changes'] (bv. {status:'closed'}).

Status: OpsIQ_'s canonieke set is open, customer_reply, answered, in_progress, pending, closed. Houd een kleine tweewegskaart aan de woordenschat van uw platform, en zorg ervoor dat uw kolom daadwerkelijk de waarden die u schrijft accepteert (een ENUM een waarde ontbreekt wordt stilletjes leeggelaten door sommige databases). Afdeling: de OpsIQ _-afdeling id is zinloos aan jouw kant, nooit verzenden. Stuur de descriptor (name, email en slug) en los het op tegen uw eigen afdelingen via e-mail → naam → kogel, dus uw Factureringsafdeling in plaats van algemeen. Trigger op beide ticket.escalated en a department_id verandering in ticket.updated.

💡
Status / priority / subject / Department / delete mirroring is gated by per-connector toggles (mirror_status_changes, mirror_priority_changes, mirr_subject_changets, mirl_deletes) lees doorheen het gedeelde OpsIQ\Connectors\MirrorOptions helper. Insluiten dat blok in uw instellingen.json En elke kaart-mirror connector leest de toggles identiek.

Koppel een ticket aan een product / dienst

Als de klant een bepaald product heeft gekozen bij het openen van het ticket, stempel dan een hint zodat de agent een gerichte servicekaart ziet (met één klik op "Bekijk andere producten" modal voor de rest). Geef een van deze aan te maken():

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

Een servicecode voor platforms, bijvoorbeeld WHMCS S396 (dienst)396) / D11 (domein11). OpsIQ De optionele type-letter + id ontmantelt en komt overeen met uw servicelijst, met een type guard zodat een domeincode nooit overeenkomt met een product van dezelfde id. Stel een bijpassende ref voor elke dienst uit voor een exacte match.

related_domain

Een domeinnaam; gekoppeld als een subtekenreeks met het detail/domein van elke dienst.

💡
Bouw de bijlagelijst eenmaal, in bovenstaande vorm, en OpsIQ behandelt de rest: gehost URLs worden doorgegeven door en base64 inhoud wordt opgeslagen en opnieuw gehost voor u. Je hoeft nooit te schrijven per-platform bestand behandeling.
⚠️
Actiesleutels zijn kleine letters, cijfers en onderstrepingen. De Bouwer accepteert3tot80karakters en maakt ook stippen mogelijk; de actie store accepteert2tot100karakters zonder puntjes, dus houden aan letters, cijfers en onderstrepingen en je voldoet beide. Het toevoegen van een actie creëert geen AJAX route, zodat er niets is om te regenereren opnieuw opslaan de connector en het wordt gesynchroniseerd.

Laat de AI het voor je bouwen.

Je hoeft de zes stappen niet met de hand in te vullen. Beschrijf de connector in je eigen woorden en OpsIQ's AI ontwerpt de hele specificatie, voert het door dezelfde validator die de wizard gebruikt, en toont u het plan voordat er iets wordt geschreven naar schijf. Er zijn twee plaatsen om het te doen, en ze produceren hetzelfde pakket.

In de tovenaar

Openen Connectoren → + Verbindingsconnector toevoegen → Build connector. In stap 1 zul je zien ✨Bouw het voor me.. Typ wat de stekker is voor het platform, watOpsIQzou moeten lezen en wat het moet schrijven, en wie gebruikt het te voegen deAPIroot als je het weet, en drukt op. De wizard vult elke stap uit de ontwerpversie, en u bekijkt en bewerkt precies alsof u het getypt had.6hetzelfde paneel verschijnt als ✨ Verfijnen met AI, dus u kunt vragen om een wijziging ("ook facturen lezen") in plaats van het bewerken velden.

Door het vragen van OpsIQ

Open de Vraag OpsIQ copiloot overal in de beheerder en zeg wat je wilt. Je hoeft nooit een actie te noemen of weten dat de wizard bestaat.

1
Vraag erom.

Bijvoorbeeld: "Bouw me een connector voor Trello. Het moet mijn boards en lijsten, lees kaarten, en maak een kaart op een bord. Trello maakt gebruik van een API sleutel plus token." De copiloot antwoordt in een zin en toont een Deze connector tekenen Uw bericht is de brief, dus zet het platform, de lezingen en de schrijfsels erin.

2
Bevestigen van het ontwerp

Er is nog niets geschreven. De copilot stelt de specificatie op, valideert het en antwoordt met het plan: wat de connector doet, de acties die hij zal blootleggen (geschreven), de aannames die hij heeft gemaakt, en de vragen die je nog moet beantwoorden, meestal welke referenties te leveren. De concept staat geparkeerd onder een id en blijft beschikbaar voor 24 uren.

3
Zeg "Bouw het"

De copiloot toont een Bouwen 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
Inloggen en inschakelen

De nieuwe connector is gepubliceerd maar NIET ingeschakeld, en het heeft geen geheimen. Open de instellingen, voer de API sleutel of token in, druk op Test, dan InschakelenTotdat je dat doet, doet het niets.

💡
Beide kaarten hebben uw klik nodig. De ontwerpstap schrijft helemaal niets; de bouwstap is destructief gemarkeerd en vraagt altijd aan u. De AI kan geen connector publiceren, er een inschakelen of zelf een credential invoeren.

Wat de AI is en niet mag doen

De validator is de muur

Een opgestelde specificatie gaat door precies dezelfde validatie() die de wizard's Publish-knop gebruikt. Als het niet verloopt, wordt de AI gegeven en opnieuw geprobeerd, tot drie keer, en dan weigert in eigen woorden van de validator. Een concept dat nooit mislukt wordt een pakket.

Het schrijft geen referenties

Het concept noemt het authenticatiepatroon en de instellingenvelden; het verzint nooit een sleutel, token of geheim. U vult deze daarna in op de pagina Instellingen van de connector.

Het antwoordt met vragen, niet gokjes.

Alles wat het niet kon weten . . uw account id, welke regio, die van twee eindpunten uw plan blootlegt . ... komt terug als een vraag op het plan in plaats van een stille aanname.

Een uitgevonden eindpunt faalt luid

De AI wordt verteld nooit paden te vinden, maar geen model is perfect. Een verkeerde weg publiceert als een actie die faalt zijn live test op de Acties stap of de eerste keer dat het loopt

Het pakket is gewoon

Wat het produceert is een normaal Bouwpakket: dezelfde gegenereerde bestanden, hetzelfde contract, zelfde handtekening, bewerkbaar in de wizard, los te maken van de Connectors pagina. Er is geen aparte "AI connector" soort.

Uw model doet de redactie

Kwaliteit volgt het model dat u heeft geconfigureerd onder Instellingen → AI. Een klein, goedkoop model stelt een correcte maar gewone connector en stelt meer vragen; een sterker model krijgt voor de eerste keer meer van de eindpunten. Verander dit onder AI configuratie; niets anders hoeft te veranderen.

⚠️
De copiloot kan alleen acties uitvoeren die deze installatie daadwerkelijk heeft geregistreerd. Als de Connector Builder acties ontbreken manage_connectors De copiloot zegt dat in plaats van het aanbieden van een kaart die zou falen wanneer geklikt.
Connectoren

Verkoop via chat: de rolkaart van handel

Een connector die een winkel platform kan verkopen, een boekingssysteem, een betaling gateway .. verklaart welke van haar eigen verrichtingen antwoord OpsIQ's canonical commerce rollen. Verklaar het en de connector verschijnt onder Instellingen → Klantenchat → Verkoop via chat automatisch; stop met verklaren en het verdwijnt. Er is geen lijst om op te registreren.

Het bestand: commerce_roles.json

De verklaring leeft in zijn eigen bestand op de pakket root . de aanwezigheid van het dossier is de claim. Het kan niet leven in connector_contract.json: dat bestand wordt gerecupereerd door de verpakkingstools en het schema wijst onbekende sleutels af, zodat een met de hand toegevoegd blok niet kan worden gevalideerd en dan overschreven.

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

De regels, en waarom elk bestaat

Rolle's zijn een gesloten woordenschat

OpsIQ leidt nooit een rol uit de naam van een actie af. Een niet-verklaarde rol bestaat niet

De operatie moet een van uw acties zijn.

Elke in kaart gebrachte operatie moet bestaan in uw actions.json. Een typefout verklaart een mogelijkheid die niet kan draaien, en het valt op aan een klant als "ik kan dat voor u controleren" gevolgd door niets.

Een leesrol wijst nooit op een destructieve operatie

Lees rollen (catalogus, beschikbaarheid, offerte, order lookup) moet in kaart brengen naar operaties die niets op uw platform veranderen.

Een schrijfrol maakt nooit een generieke recordbewerking

In kaart brengen order_create naar een ruwe tabel invoegen record.create, db.insert, recordCreate, elke spelling, een scheidingsteken wordt structureel afgewezen. Een rij geschreven direct voorbij de prijzen van uw platform's, voorraad vergrendeling en bevestiging e-mail, het produceren van een bestelling uw eigen systeem niet volledig gelooft in.

Een schrijfrol verklaart een hersteloperatie

Een idempotent opzoeken die antwoordt "heeft mijn schrijfland?". De gevaarlijkste timeout is degene nadat uw platform al de bestelling heeft gemaakt; zonder een herstel lookup zijn de enige opties om blind te proberen of het te verliezen.

De betalingsrollen van de aanbieder dragen drie extra verplichtingen

Een pakket dat rechtstreeks met een betalingsdienstaanbieder praat, moet ook declareren payment_profile (currencies, landen, methoden en milieu Een onopgemerkte omgeving is de manier waarop een testintegratie een live-betaling vergt. webhook_verify (het echte ondertekeningssysteem van de aanbieder; een algemene geheime vergelijking wordt geweigerd) en event_map (provider gebeurtenissen op canonieke degenen). Een handelsconnector die alleen implementeert record_payment ontvangt reeds geverifieerde canonieke betaling bewijs; het mag niet doen alsof de gateway.

Aangeven hoe klanten kunnen bestellen bij een verbonden winkel

Een connector en een betaalpoort aansluiting zijn verschillende contracten. Verbonden winkel klant bestellen, kies de diepste modus die het platform kan bewijzen. De keuze is verpakt binnen ondertekend commerce_roles.json; Store en Client Chat herlezen het op uitvoeringstijd. Verwijderen van een rol of uitschakelen/het verwijderen van de connector ongeldig maakt daarom een eerder gegeven voorstel in plaats van het verlaten van oude autoriteit achter zich.

catalog_only

Kaarten catalog_search of catalog_get. OpsIQ kan zoeken en uitleggen producten, maar het kan niet tonen een uitvoerbare bestelling of kassa bevestiging. Elk pakket blijft bij deze waarheidsgetrouwe standaard totdat zijn eigen getypte offerte en checkout/order acties passeren de diepere contract en Marketplace certificering; nooit afleiden transactie ondersteuning van een platform naam.

platform_checkout

Ook kaarten quote en platform_checkout. De handel actie niet OpsIQ kern terug checkout_url, checkout_reference en de canonieke quote. De URL moet HTTPS zijn, haar hostnaam moet overeenkomen met customer_ordering.checkout_hosts of de HTTPS-host afkomstig van checkout_host_setting, en het citaat mag niet meer dan15minuten. Een product permalink, lokaal geassembleerde winkelwagenURLof terugsturenURLis geen door de handelaar uitgegeven checkoutcapaciteit.

direct_order

Ook kaarten quote, order_create en order_get, met order_create.recovery. Core ververst het offerte onmiddellijk voor de uitvoering, levert de idempotency sleutel, en vraagt de hersteloperatie na elke onbekende uitkomst vóór een nieuwe poging. payment_flow=opsiq_gateway, moet het bovendien in kaart brengen record_payment met een gezaghebbende recovery/read-back operatie. OpsIQ actief controleert de gateway transactie, matches bedrag, valuta, handelaar en orderreferentie, schrijft de provider referentie een keer, dan leest u de merchant factuur/order terug. A mark_invoice_paid status toggle wordt afgewezen omdat het geen betaling bewijs. De creatie actie moet beroep doen op de eigen prijzen, voorraad en order business logica van het platform; ruwe database schrijft worden geweigerd.

Identiteitscontrole en wat de exploitant kan veranderen

Wanneer OpsIQ de betaling bezit, moet een chat-klant bereiken email_otp voordat een bestelling wordt aangemaaktOpsIQe-mails a6-digit code en vraagt ernaar. Dit is niet iets waar een connector uit opteert; het is de garantievloer die de uitvoer kernel eist order_create.

De enige uitzondering, en wie controleert het

De exploitant mag alleen een ongeverifieerd adres accepteren wanneer uw connector dit verklaart fulfilment_presence: customer_present. Een hotelgast moet aankomen, dus een verkeerd adres leidt een ontvangstbewijs en de kamer is er nog steeds. remote_delivery Verscheept, verzorgd, gedownload en verificatie is vereist ongeacht de exploitant sets, omdat waarde blijft op de sterkte van dat adres alleen. minimum_assurance of reversibility: irreversible verwijdert ook de mogelijkheid van de exploitant om het over te slaan.

Hoe lang de code duurt

Dertig minuten standaard, operator-configureerbaar van5minuten tot24De klant ziet een live countdown uitgevoerd in hun eigen tijdzone, niet die van de exploitant. Een verlopen code zegt zo duidelijk en biedt een nieuwe in plaats van het melden van een ongeldige code

Wat de klant moet bieden: customer_fields

Naam en e-mail zijn altijd vereist en worden eerst verzameld. address, phone en company as required of optional om het bedrijf te passen: een winkel die pakketten verscheept vereist adres aan te geven; een hotel verklaart telefoon nodig, omdat een gast niet kan bellen heeft geen boeking contact. De assistent vraagt naar hen in het gesprek voordat citaat, en OpsIQ weigert een bestelling te plaatsen dat ontbreekt aan een verplicht veld. De bouwer schrijft de genormaliseerde kaart uit, basislijn inbegrepen, dus het contract op schijf is expliciet.

Wanneer het account is aangemaakt: account_timing

at_order (standaard) laat de order schrijven een eerste kopersaccount aanmaken. before_quote wanneer uw platform prijzen per accountWHMCSbelastingen door de cliënt zijn eigen profiel en offertes in de valuta van de klant .OpsIQmaakt het account aan via uw customer_create actie zodra de vereiste velden bekend zijn, vraagt dan de offerte voor dat account, zodat de bevestigingskaart draagt het totaal u daadwerkelijk factuur. account_flow: connector_signup.

De assistent haalt, het leest niet: client_tools

Met Create orders op, de assistent leest nooit een geplakt catalogus. Het noemt drie hulpmiddelen commerce_catalog_search (een lege query is een overzicht van de productfamilies; resultaten die verder gaan dan de limiet worden vermeld met naam), commerce_catalog_get voor één volledig item, en commerce_quote, die de ondertekende bevestigingskaartserver-kant door dezelfde muren heen munt het verbindingspad altijd heeft gehad. Een hulpmiddel per werkwoord, uw aansluiting als parameter, dus een opslag met zes connectoren krijgt drie instrumenten in plaats van achttien. client_tools beperkt de standaard; afwezig betekent elke in kaart gebrachte, en a catalog_only connector nooit aanhalingstekens. Bevestiging is nooit een hulpmiddel: de kaart knop op het web, de exacte CONFIRM commando op een kanaal, en niets wat volgens een model geld uitgeeft.

Wat uw catalogus items moeten dragen

id, name, een klant-veilig summary, a category of productfamilie (zo vindt een klantwoord een item waarvan de naam een code is), currency, unit_amount_minor, available, en input_schema Het benoemen van de velden een bestelling nodig. Search scoort de klant woorden tegen naam, familie, cyclus en samenvatting.

Weigeren met een reden dat de klant kan handelen op

Terugkeer {"success":false,"error":"…","missing":["domain"],"retryable":true} wanneer een waarde verkeerd of ontbreekt. Een weigering die naam missing of retryable bereikt de klant letterlijk; een kale storing blijft generiek zodat er niets interne lekken.

Geovaluta en de noodstop

Wanneer de exploitant Geo valuta (Client Chat → Gedrag) aanschakelt, leest de klant prijzen in hun eigen valuta op elk oppervlak . Chat tekst, de webkaart, het kanaal tekst kaart en de storefront een opening valuta . . met behulp van het platform zijn eigen FX winkel. Uw prijs wordt nooit vervangen: de kaart toont de bezoeker figuur naast de winkel totaal, en de gateway verwerkt precies het bedrag dat het toont. Pauzeer alle verkopen (Instellingen → Commerce) is de kill switch: catalogus, citaten en opzoekingen blijven open; voorstellen en bevestigen stoppen op elk kanaal.

Bij verkoop via chat niet gedragen

De handelaar kon niet worden bereikt

Het pakket . seal is verbroken: een bestand werd bewerkt na ondertekening. Herpubliceren van het pakket. Een geïnstalleerde marktkopie wordt nooit op zijn plaats bewerkt; bijwerken van het vanaf de marktplaats panel.

Bestellen is nu onderbroken voor deze winkel

De kill schakelaar staat aan.→Handel→Pauzeer alle verkopen.

Bestellen is nog niet beschikbaar op dit kanaal

Het kanaal wordt niet aangevinkt onder Waar klanten kunnen kopen. De server log noemt het kanaal.

De assistent beschrijft een item maar er verschijnt geen kaart

Het citaat-instrument geweigerd. Elke oproep wordt geregistreerd als [opsiq][commerce][client_tool] met de reden: een verkeerde item id, een veld het item niet aan te geven, een genomen domein, of de handelaar zijn eigen weigering. Lees het logboek voordat u vertrouwen op de assistent .

De assistent zegt dat het de producten niet kan zien.

De pagina behoort tot een andere werkruimte. Elke website widget behoort tot één werkblad, en de opslagconnector moet daar ingeschakeld zijn.

Een ingeblikt antwoord in plaats van een antwoord

Meer informatie over wat je nodig hebt betekent dat de AI provider call zelf mislukt is; AI History toont de exacte fout onder die beurt, en de gereedschappen zijn nooit bereikt.

Een connectorbewerking wordt niet getoond in de chat

De werknemer recycleert op code verandering binnen een minuut, maar een gesprek opnieuw afspelen van zijn laatste kaart. Start een nieuw gesprek om te testen.

Een Nigeriaanse bezoeker ziet dollars, hoewel Geo valuta is aan

Controleer of de geo...IPdatabase is geconfigureerd (Client Chat→Geo) en dat de bezoeker een FX-tarief heeft; zonder tariefOpsIQtoont de winkelprijs in plaats van een verkeerd nummer.

Je totaal is het enige cijfer dat geld verplaatst.

Een citaat draagt unit_amount_minor, quantity en total_amount_minor, en het is verleidelijk om de derde als afgeleid van de eerste twee te behandelen. Het is niet, en aannemen dat het al kost een klant echt geld.

quantity Is wat de KLANT koos .. één kamer, een licentie, een beleid. Uw multiplier kan iets zijn OpsIQ nooit ziet: nachten, stoelen, facturatie cycli, afstand, gewicht, niveaus. Een hotel citeert een kamer voor drie nachten als hoeveelheid 1, eenheid 105,000Totaal 315,000. OpsIQ vermenigvuldigde eenheid met hoeveelheid tot prijs van een bevestigingskaart, toonde een gast 105,000, en vervolgens de 315,000 De koopman kwam terug, akkoord gaan met één cijfer en een ander betalen is het ergste wat dit contract kan doen.

De regel

total_amount_minor is het enige getal OpsIQ toont, tekens, aanklachten en combineert tegen. unit_amount_minor is een display detail op de lijn. Als uw totaal niet precies wat u wilt opgeladen, uw offerte is verkeerdOpsIQzal het niet corrigeren, omdat een totaal dat nuttig is aangepast is er nooit mee ingestemd.

Wat dit betekent voor uw offerte actie

Geef de all-in figuur. Pas uw eigen nachten, oplopende bedragen, kortingen, belastingen en vergoedingen voordat u antwoordt. Als uw lijn niet compenseert een eenheid keer sommige hele aantal nooit gelijk is aan je totaalOpsIQbehandelt het geheel als één regel tegen zijn werkelijke prijs in plaats van een uitsplitsing uit te vinden die met niets verenigbaar is.

Zes antwoorden die dit contract geschikt maken voor elke industrie

De bovenstaande verklaring begon als een winkelverklaring: koop een ding, betaal nu, het is van jou, je mag annuleren. Elk van die vier is een veronderstelling dat sommige echte zaken niet delen. Een bank bewegende geld kan het niet ongedaan maken. Een verzekeraar kan niet zeggen "bevestigd" totdat een underwriter heeft gekeken. Een handelaar facturen achteraf. Een kliniek rekeningen iemand die niet de patiënt. Met geen enkele manier om te zeggen, deze bedrijven ofwel verkeerd hun eigen proces aan hun eigen klanten of kunnen niet verbinden.

Dus een transactieconnector beantwoordt nog zes vragen. Iedereen is niet altijd streng. . . Ze zeggen niets is altijd veilig en nooit permissief, omdat het zeggen van niets is wat een auteur doet als ze niet hebben overwogen de vraag.

transaction_kind

purchase, booking, subscription, bill_payment, transfer, application, top_up, renewal. Woordenschat in plaats van gedrag: het besluit het woord dat uw klant leest. Het bellen van een overschrijving een "order" laat de assistent klinken alsof het niet begrijpt wat voor bedrijf het spreekt, en geen hoeveelheid correct sanitair herstelt daarvan. Standaard purchase.

decision_mode

immediate of deferred. Kies deferred voor alles wat gaat naar het overnemen, kredietbeoordeling, referenties, toelatingen of een commissie. OpsIQ zegt dan ingediend in plaats van bevestigd, en geeft de verwijzing om te vragen over het. Het vertellen van iemand hun toepassing wordt bevestigd terwijl het zit met een mens is het meest schadelijke ding dat een chat assistent kan doen voor een gereguleerd bedrijf, en het is het standaard gedrag van elke retail-vormige stroom. Standaard immediate.

payment_timing

on_confirmation, deposit_then_balance, invoice_later of no_payment. Hiermee wordt besloten of OpsIQ een betaalpagina opent Helemaal niet, zodat het niet kan worden afgeleid uit payment_flow Dat zegt: wie Neem het geld, dit zegt of en wanneer. Werk je factuur achteraf, en toepassingen die niets kosten om in te dienen, eindigen bij de bevestiging in plaats van het bereiken van een gateway lijst dat leeg of fout is.

reversibility

reversible of irreversible. Het belangrijkste wat een financiële connector zegt. Een kamer kan worden vrijgegeven en een pakket kan terugkomen; een voltooide overdracht kan niet irreversible automatisch krachten cancellation_flow tot none en verbiedt elke instelling van de exploitant om identiteitscontrole over te slaan; Wat er verder nog in deze verklaring staat. Twee velden die niet overeenkomen is geen toestand om op te lossen tijdens de looptijd door welke eerst wordt gelezen. Standaardwaarden voor reversible.

cancellation_flow

none, platform_only of connector_cancel. De annuleringsrollen bestonden al zonder regel over wie ze kon bereiken, en de twee verkeerde gissingen falen in tegengestelde richtingen: raden open en een chatbericht annuleert een betaalde boeking zonder kosten geciteerd; gok gesloten en een klant die wil annuleren wordt verteld aan telefoon. connector_cancel bovendien vereist cancellation_quote en order_cancel met een herstel OpsIQ annuleert nooit alvorens te zeggen wat het kost. Standaarden aan none.

fulfilment_presence

customer_present of remote_delivery. Of een niet-verifieerde e-mailadres kan iedereen kosten wat dan ook. Een hotelgast moet aankomen, dus een verkeerd adres leidt een ontvangstbewijs en de kamer is er nog steeds; een gepost pakket, een voorzien server of een downloadlink laat alleen op de sterkte van dat adres. Dit is wat maakt een operator . "skip e-mail verificatie" instelling beschikbaar op alle, en het wordt door u verklaard in plaats van gekozen door hen . . Dus een hotel .. redeneren kan nooit worden geërfd door een connector die goederen verscheept . remote_delivery.

minimum_assurance en disclosure (facultatief)

minimum_assurance laat je eisen meer identiteit bewijs dan OpsIQ vereist, nooit minder .. een bank die een stap-up voor een overdracht is het uitvoeren van de overeenkomst. Het instellen ervan verwijdert ook een exploitant zijn vermogen om verificatie over te slaan voor uw connector, omdat een handelaar eigen risicobeslissing hoger ligt dan een exploitant gemak. disclosure wordt de tekst weergegeven voor de bevestigingsknop, voor een tarief, vergoeding of afkoelingsrecht dat u moet presenteren; zonder deze moeten gereguleerde bedrijven de vereiste formulering in een productnaam smokkelen.

notify_flow

platform_automatic, platform_triggered of none. Wanneer OpsIQ de betaling neemt uw eigen kassa nooit draait, dus wat het normaal gesproken e-mails nooit branden. Het opnemen van de betalingsmarkeringen de betaalde bestelling; het verplicht geen platform om iemand te vertellen. platform_triggered vereist dat de order_notify rol met een herstel, en OpsIQ vraagt alleen nadat de betaling terug te lezen bewijst dat het geld is opgenomen. none maakt de OpsIQ-side bevestiging verplicht, omdat anders een betalende klant helemaal niets hoort. Standaarden none.

Dezelfde overeenkomst, negen niet-verbonden ondernemingen

Geen van deze werden ontworpen rond. Elk is het contract antwoord eerlijk voor een andere industrie, met OpsIQ Ik weet niets van ze.

Eén contract, negen industrieën
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
Betaalde gebeurtenis geleverd aan platforms

Nadat een Storefront betaling actief is geverifieerd en vastgelegd, zendt OpsIQ uit payment.completed met order_id, payment_id/provider_ref, gateway, exact amount_minorISO currency, klant, lijn items, kanaal en paid_at. Een handelsconnector moet blijven bestaan dat bewijs door middel van record_payment en lees het terug; een gehoste-checkout connector verbruikt zijn eigen gezaghebbend betaalde evenement en mag geen dubbele betaling schrijven ontvangen.

AI is een initiatiefnemer, geen autoriteit bron

Het model kan een opgegeven product en hoeveelheid selecteren, maar het kan geen operatienaam kiezen, een checkout URL slaan of koopstaat maken van tekst. De klant ontvangt een exacte ondertekende kaart en moet op de bevestigingsknop drukken. Deze bevestiging is gebonden aan de werkruimte, connector, item, hoeveelheid, offerte, valuta, draad en vervaldatum.

Sociale klanten houden dezelfde stroom zonder e-mailprompt

WhatsAppBoodschapper,Instagram, Telegram, LINE, SMS en X gebruik maken van de provider-geverifieerde kanaalaccount als de klant identiteit. Het voorstel is ondertekend op dat kanaal rekening en bevestiging loopt nog steeds door dezelfde verse offerte, voorraad, idempotency, betaling en recovery controls. Een sociale klant maakt gebruik van de exacte eenmalige bevestiging actie uitgevoerd in hun gesprek; gewone proza zoals

Bestelgeschiedenis volgt een exacte identiteitslink, nooit een e-mail gissing

Inheemse bestellingen worden geïndexeerd door een ondoorzichtige kanaalidentiteit, zodat de AI kan beantwoorden waar is mijn bestelling?CRM/client registreert en implementeert gezaghebbende klant/order lookup in de connector. Klantencontext providers ontvangen die opgeslagen koppeling; ze mogen geen rekening kiezen uit een displaynaam of e-mail getypt in chat. Met één overeenkomende bestelling antwoordt de AI direct; met meerdere geeft het een samenvatting van de overeenkomsten en vraagt welke; zonder dat er sprake is van geen geschiedenis wordt gekoppeld.

Maak de payload universeel: getypte velden en een identiteit van de server

Kern bevat geen WHMCS, hotel, SaaS, winkel, bank, product, route of verkoopkantoor. De offerte actie getypt parameters zijn het klantenformulier en AI slot schema. Een boekingsconnector kan datums en gasten verklaren; een factuurverbinding kan een cyclus aangeven; een toekomstige ondernemingsconnecter kan haar eigen veilige velden verklaren. OpsIQ sanitieert primitieve controles en stuurt de verzamelde waarden alleen naar de in kaart gebrachte connector actie.

Getypte offerteactie
{
  "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"}]}
  ]
}

Voor clients_only, ingesteld customer_ordering.identity_parameter Dit veld wordt nooit aan een klant getoond en elke door beller geleverde waarde wordt verwijderd; OpsIQ injecteert alleen het id van een geverifieerde connectorverbinding. Gastencheckout laat het leeg achter. Een getypte e-mail is bewijs voor een opgegeven gastopzoeker, geen login en niet aankoopautoriteit.

Gegroepeerde domeinen: Ingelogde klantaccounts en connectorconfiguratie behoren tot de groepsprimaire portalwerkruimte. Echter, het identiteitsteken moet worden ondertekend voor de exacte ledenwebsite die de widget insluit, met behulp van dat webhook-geheim.OpsIQControleert dat oppervlak eerst en alleen dan lost handel en de verbonden klant via de groep primaire. Nooit vervangen van het lid site sleutel met de primaire sleutel en nooit kopieer het primaire geheim naar een lid-site.

Canonische enveloppen de connector moet terug

Catalogus
{
  "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"}
  }]}
}
Citaat
{
  "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"
  }
}

De platform-checkout response herhaalt de geldige canonieke citaat en voegt een HTTPS checkout_url. Core ververst de offerte bij bevestiging en vergelijkt valuta, totale en stabiele selectie precies. De connector vertaalt zijn platform respons in deze enveloppen; kern vertaalt nooit leveranciersvelden of construceert de handelaar URL.

Maak een door de operator gebouwde gateway beschikbaar in de native Store en chat

Betalingsmogelijkheden alleen zet geen gateway voor klanten. Native Store betaling gateway blok in Connector Builder. Het voegt een expliciete versioned contract, kaarten checkout creatie en actieve betaling opzoeken, en allowlists de provider-hosted kassa domeinen. Zodra de connector is geïnstalleerd, ingeschakeld en geselecteerd onder Commerce instellingen, dezelfde gateway verschijnt in de openbare Store, Store modal, client-chat checkouts en autonome check-out. Geen provider slug is hardcoded.

Native Store gateway contract
{
  "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"]
    }
  }
}
Canonische checkout uitvoer

De kassa-actiekaarten checkout_url En wanneer de dienstverrichter er een heeft. session_id. De URL moet HTTPS zijn, geen referenties bevatten en overeenkomen met een op de vergunning vermelde gastheer.

Canonische status uitvoer

De statusactie voert een nieuwe provider uit API opzoeken en kaarten paid als een echte booleaan, amount_minor als een geheel getal, currency als drieletterige ISO-code, en provider_ref. Een retour URL, query string, client payload, of connector-toegewezen

Facultatief terugbetalingscontract

Als de gateway restitutie ondersteunt, kaart payment_refund en de terugvordering actie. Refund creatie geeft strikte accepted en completed booleanen plus provider_ref; herstel voert een provider opzoeken en retourneert status. Zonder beide acties, OpsIQ adverteert geen terugbetaling van de aansluiting.

Wie bevestigt de order?

De aansluiting schrijft nooit eenOpsIQBestelstatus.OpsIQvergelijkt het geretourneerde bedrag en valuta precies en registreert de referentie van de provider; alleen dan voert core de door de aanbieder gecontroleerde overgang uit. Handmatige bankoverschrijving blijft de enige stroom die een genoemde agent kan goedkeuren.

Tik in Connector Builder aan handel, de rollen in kaart brengen en configureren Verbonden winkel klant bestellen, Native Store betaling gateway, of beide wanneer de connector daadwerkelijk beide contracten levert. De wizard valideert de verklaring en schrijft commerce_roles.json. Publishing maakt nog steeds gebruik van de normale Marktplaats beoordeling en ondertekening proces; dit contract nooit voorbij pakket verificatie of maakt een connector niet-installeerbaar. Controleer elk pakket met de hand php tools/verify_commerce_contracts.php.
💡
Vervoer http voor een remote API of bridge voor een genoemde operatie op een ingezette brug (zie het NO-API patroon hieronder). Rollen zijn transport-agnostisch; de runtime heeft alleen het aangegeven vervoer nodig zodat het een brug kan koppelen aan versie-paren.
Connectoren

Door de chat verkopen zonder een connector: Acties & Triggers

Het commerce contract hierboven vereist geen connector pakket. Als uw platform is je eigen ?? een aangepaste back office, een interne API, een systeem dat niemand een connection voor te verzenden ? kunt u dezelfde verkoop machines met de twee hulpmiddelen die u al gebruikt om iets anders te integreren: aangepaste acties (uw HTTP-eindpunten, gedefinieerd op de Acties pagina) en Triggers (event webhooks). Zelfde contract, dezelfde kaart, dezelfde identiteitsverzekering, dezelfde betaling kernel, dezelfde ontvangstbewijzen. Het enige wat ontbreekt is het pakket, omdat er geen derde partij code te ondertekenen.

Hoe het bij elkaar past

U bouwt een aangepaste actie per handel rol . . Elk is een gewone HTTPS eindpunt aan uw zijde, gedefinieerd onder AI & Automatisering → Acties met zijn URL, auth header en parameters. Dan sla je een verklaring op die rollen in kaart brengt naar deze acties. Vanaf dat moment verschijnt uw winkel precies als een connector-backed één: de AI citaten uit uw quote actie, de bevestiging kaart rendert, de klant controleert hun e-mail, de order kernel calls uw orderactie met een idempotency key, OpsIQ neemt betaling via de werkruimte gateways, en uw Niets over de klant ervaring zegt "custom."

De verklaring

Sla deze JSON op als de werkruimte instelling commerce_custom_integration (Instellingen→geavanceerde instellingen, of via de REST-instellingenAPIHet is dezelfde vorm als een pakket. commerce_roles.json commerce node, met action Uw aangepaste actie-id's benoemen:

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

Tenslotte, voeg custom_commerce naar de connectors ingeschakeld voor verkoop onder Instellingen→Klantenchat→Verkoop via chat. Toelating wordt opnieuw gecontroleerd op elke verzoek, en het weigert met genoemde redenen in plaats van stil uw winkel te verbergen: een rol die je modus vereist dat kaarten naar niets, een schrijfrol zonder herstel actie (§15.7 . . Een schrijven waarvan de uitkomst niet opnieuw kan worden gevraagd wordt geweigerd), een actie die is verwijderd of uitgeschakeld sinds u opgeslagen.

Wat elke actie moet doen

Geef de connector envelop terug

Antwoord {"success": true, "data": { ... }} of {"success": false, "error": "a sentence a customer may read"}Uw actie. responssuccespad moet wijzen op de envelop.

Quote: het totaal van de totalen, in kleine eenheden

Terugkeer quote_id, product_name, quantity, unit_amount_minor, total_amount_minor, currency, selection, selection_summary, expires_at. Alles in het "uw totaal is de enige figuur die geld verplaatst" hierboven geldt letterlijk: belastingen, vergoedingen en multipliers gaan IN uw totale, omdat je totaal is wat wordt ondertekend, getoond en in rekening gebracht.

Orde creëren: eer de idempotentie sleutel

U ontvangt idempotency_key, de ondertekende total_minor en currency, de geverifieerde customer_email, en uw eigen offerte parameters. Sla de sleutel met de bestelling; als u al een order voor het hebt gemaakt, retourneren die orde in plaats van een tweede. Controleer het geld reference uw platform herkent.

Herstel: antwoord over EEN schrijven

order_by_key ontvangt de idempotency sleutel en antwoorden {"found": true, "order": {...}} of {"found": false}. found:false is een belofte OpsIQ mag opnieuw proberen de schrijf op de sterkte van het. Een statusfeed of een recent-orders lijst is geen antwoord over één schrijven.

Record payment: uw eigen afwikkelingspad

Ontvangt de gateway transactie id als de idempotency sleutel plus uw order referentie, nadat OpsIQ actief heeft geverifieerd bedrag en valuta met de gatetway. Markeer de bestelling betaald via uw platform eigen logica platform_notified: true als uw platform de klant zelf e-mailt.

Kaartinvoer komt van uw actieparameters

Elke parameter die u op uw QUOTE actie (naast de identiteitsparameter) verklaart dat de AI niet is verzameld wordt weergegeven op de bevestigingskaart als input de klant zichzelf vult een domein, een datum, een stoel. Label ze goed; het label is wat de klant leest.

Triggers: hoor je eigen verkoop

Twee evenementen branden op de gedeelde eventbus, zodat uw webhooks en automatiseringen horen elke chatverkoop waar het ook uitgevoerd:

commerce.order.created

Het moment dat de bestelling landt aan de zijde van de handelaar, voor betaling . . referentie, connector (of custom_commerce), bedrag, valuta, klant e-mail, draad id.

commerce.payment.confirmed

Precies eenmaal per bestelling, wanneer de gateway actief controleert van de betaling. Het rijdt dezelfde claim die dubbele ontvangstbewijzen voorkomt, zodat het niet kan dubbel-vuur uw webhook.

Wanneer afstuderen aan een connector

De aangepaste integratie is werkruimte configuratie: het dient UW winkel, op uw werkplek. Het moment dat u wilt de integratie te verspreiden • andere werkruimten, de marktplaats, versiering, ondertekening, betaalde installaties • pakket dezelfde acties en dezelfde verklaring als een connector. Het contract verandert niet; alleen de wrapper doet.

Connectoren

Verbind een platform met NO API (het brugpatroon)

Genoeg echte platformen schip geen RESTAPIEen hotel CMS, een oud facturatiesysteem, een op maat gemaakt intern hulpmiddel. U kunt nog steeds een compleet schrijvenOpsIQconnector voor één: de connecter vervoert een enkele PHP bestand dat de exploitant druppels in hun eigen publieke webroot, en dat bestand IS hetAPI. Deze pagina is het hele patroon, met de regels die het veilig maken om te lopen en de reden achter elke regel.

De vorm ervan

Een normale connector roept iemand anders's API. Een brugverbinding brengt zijn eigen. Niets anders verandert: dezelfde acties, dezelfde context providers, hetzelfde identiteitscontract, dezelfde pakketindeling.

1
U schrijft één PHP-bestand

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
De operator kopieert het naar hun webroot

Naast de eigen index. php platformcode van het platform is geen enkele code gewijzigd, er is geen plugin geïnstalleerd en niets te onderhouden over platform upgrades.

3
Het connectorpaneel geeft ze het bestand

Uw instellingen._json declareert webhook_help. snippet_template. De verbindingspagina maakt het weer als een kopieerbaar bestand met hun live-instellingen al vervangen, dus er is niets om hand-edit te bewerken.

4
OpsIQ noemt het server-naar-server

Uw Client. php stuurt GET-verzoeken met de gedeelde sleutel in een X-Opsiq-Bridge-Key header. De basis URL instelling is de platform site root.

De Connector Builder kan dit nu voor u genereren. Kies het "Platform met geen API" profiel (of instellen van gegevens toegang tot brug) en het zendt de brug bestand, het bijpassende paneel knipsel en de getypte acties die lezen en schrijven door middel van een Laravel-toepassing te lezen zijn .env, voor WordPress lezen van wp-config.php, of met referenties die u plakt in voor iets anders. Bridge mode repareert verificatie aan de OpsIQ brug protocol: de connector genereert veilig api_key Indien ingeschakeld, stuurt u het als X-Opsiq-Bridge-Key, en bindt diezelfde opgeslagen waarde in OPSIQ_BRIDGE_KEY in het kopieerbare bestand. Hand-auteur alleen als uw platform niet van die, of wanneer u gedrag nodig heeft de gegenereerde brug dekt niet. Een handgeschreven brug is veilig voor de wizard: het overschrijft alleen een brugbestand met zijn eigen markeerder.
💡
Alles op deze pagina wordt weergegeven in PHP tegen MySQL, want dat is de referentie implementatie en de enige combinatie van de verpakking pijplijn volledig ondersteunt. Het patroon zelf is taal-agnostisch en motor-anagnostische: zie "De brug in andere talen en andere databases" voor de poort in Node, Python, Go, Ruby, .NET en Java, de introspectie zoekopdracht voor PostgreSQL, SQL Server, SQLite en Orakel, en de MongoDB gelijkwaardig . Samen met de verpakkingsbeperking die bepaalt hoe een niet-PHP brug de exploitant bereikt.

Het beveiligingsmodel, en waarom elke regel er is

Dit bestand zit in een publieke webroot achter één gedeelde sleutel. Dat enkele feit drijft elke regel hieronder. Niet ontspannen om uw brug eenvoudiger te maken.

De beller levert nooit SQL

Geen WHhere-clausule, geen ORDER BY fragment, geen "slechts deze ene keer" raw query parameter. De beller noemt een tabel, een kolom en een waarde; uw bestand bouwt de statement. Op het moment dat een beller kan bijdragen SQL tekst, wordt één gedeelde sleutel willekeurige database uitvoering.

Tabel- en kolomnamen worden gevalideerd tegen informatie_schema

Identifiers kunnen niet worden gebonden als parameters, dus ze moeten in plaats daarvan worden gecontroleerd. Lees de echte tabel en kolom lijst voor DIT database en weigeren alles wat er niet op staat. Een identificatiecode die geen echt object van dit schema is dan kan niet een query helemaal bereiken

Elke waarde is een gebonden parameter

Zonder uitzondering, inclusief waarden binnen een zoekopdracht. Gevalideerde identificaties plus gebonden waarden is het paar dat maakt het oppervlak totaal en de injectie oppervlakte nul.

Leest zijn universeel, schrijft worden toegelaten-listed

Dit is de regel die mensen het liefst willen overslaan.

Geheime kolommen worden geredigeerd op gelezen en geweigerd op schrijven

Match op kolom NAAM: wachtwoord, remember_token, secret, api_key, private_keys, salt, token. Vervang de waarde door een plaatshouder bij het uitstappen. Weigeren van het schrijven volledig op de weg in

Verwijderingen zijn een-rij, met primaire sleutel

Nooit een bulk verwijderen, nooit een verwijdering door filter. Een bulk verwijdering is hoe een database sterft. Als iemand echt nodig heeft, kunnen ze het doen op het platform.

De lezingen zijn rij-omhuld

Klem de limiet parameter met een hard plafond. Een weggelopen query mag niet in staat zijn om de database te dumpen via een chatbericht.

Fout bij sluiten totdat de sleutel is ingesteld

Een niet geconfigureerde brug antwoordt op alles 403. Een brug die nuttig is voordat deze wordt ingesteld is een brug die een vreemdeling helpt.

Constanttijd sleutel vergelijking, sleutel in een header

hash_equals, never ==. De sleutel gaat in X-Opsiq-Bridge-Key, niet de query string, dus het blijft buiten toegang logs, proxy logs en referer headers.

Alleen GET

Eén methode, één vorm, niets om een lichaam binnen te smokkelen. Alles wat de brug doet is expressief als GET met gevalideerde parameters en OpsIQ is de enige beller.

Leest universeel, schrijft allow-listed

Dit is de regel die wordt geargumenteerd met, dus hier is de redenering in het geheel. De assistent moet in staat zijn om te zien van het hele platform: dat is wat maakt het nuttig, en een lezing kan niets vernietigen. Schrijven zijn anders. Dit bestand zit in een publieke webraoot achter één gedeelde sleutel. Als die sleutel lekt, een onbeperkt schrijfoppervlak maakt het lek equivalent aan volledige database controle . Een nieuwe admin gebruiker, een lege boekingstabel. Een allow-list betekent een uitgelekte sleutel nog steeds niet kunnen bereiken een tabel die de exploitant nooit ingeschakeld.

⚠️
De OpsIQ goedkeuring kaart poorten de AI, niet de sleutel. De beheerder klikken Toestaan op een vernietigende actie is een controle over de assistent. Het is geen controle over wie de brugsleutel heeft. Dat zijn twee verschillende bedreigingen, en de allow-list is het antwoord op de tweede.
De bedieningsknop, vanaf de Botble brug
/* ── 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';

Twee details in de onderstaande check zijn gemakkelijk fout te krijgen. De tabelnaam komt al RESOLVED, met het voorvoegsel van de installatietafel, terwijl een exploitant schrijft de vergunning-lijst ongeprefixeerd omdat dat is wat ze zou natuurlijk typen. Vergelijk beide manieren of een vooraf bevestigde installatie laat stil niets en elke schrijfpauzes toe. En de weigering moet zichzelf verklaren, want de persoon die het leest is een admin in een chat venster, niet een ontwikkelaar met een stack trace.

De allow-list check, letterlijk van marketplace_connectors/botble/bridge/opsiq-botble-bridge. php
/** Tables a WRITE may touch. Empty = the built-in defaults. */
$writeAllowed = static function (string $table) use ($prefix): bool {
    $raw = trim((string)(defined('OPSIQ_WRITE_TABLES') ? OPSIQ_WRITE_TABLES : ''));
    if ($raw === '') $raw = 'ht_bookings,ht_booking_rooms,ht_rooms,ht_customers,customers';
    if (trim($raw) === '*') return true;                     // explicit opt-in to everything
    $bare = ($prefix !== '' && stripos($table, $prefix) === 0) ? substr($table, strlen($prefix)) : $table;
    foreach (explode(',', $raw) as $t) {
        $t = trim($t);
        if ($t === '') continue;
        if (strcasecmp($t, $table) === 0) return true;
        if (strcasecmp($t, $bare)  === 0) return true;
        if ($prefix !== '' && strcasecmp($prefix . $t, $table) === 0) return true;
    }
    return false;
};

/** One refusal, one explanation — used by every write op. */
$requireWritable = static function (string $table) use ($writeAllowed): void {
    if ($writeAllowed($table)) return;
    opsiq_bridge_out(['success' => false, 'error' =>
        'write_not_allowed: "' . $table . '" is not in this bridge\'s write allow-list. '
        . 'Reads are unrestricted. To permit writes here, add the table to OPSIQ_WRITE_TABLES '
        . 'in opsiq-botble-bridge.php (or set it to "*" to allow every table).'], 403);
};

De poort, vol

Vier controles, in deze volgorde, voordat iets de gegevens raakt. Kopieer zowel de bestelling als de cheques.

De vier poortcontroles, in volgorde
<?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. */

Validering van identificatiemiddelen tegen informatie_schema

Dit is het stuk dat "de assistent kan elke tafel te bereiken" van roekeloos in veilig. Los de naam van de beller tabel tegen het echte schema, tolereer een ontbrekende of extra tafel prefix, en terug nul voor alles anders. Alles stroomafwaarts dan werkt met een naam die bewezen bestaat.

Identificatievalidatie en redactie, letterlijk vanaf de Botble brug
/** 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;
};

Een lees-op en een schrijf-op, compleet

Let op wat gebonden is en wat gevalideerd wordt. De filterkolom wordt aangevinkt tegen de echte kolomlijst en vervolgens geïnterpoleerd als een identificatie; de waarde ervan is gebonden. De limiet wordt geklemd. Rijen worden geredigeerd bij het uitgaan. De update weigert de primaire sleutel en elke auth-kolom, en stempelt bijgewerkt _bij wanneer de tabel er één heeft.

Alle tabel .. gevalideerde identificatiemiddelen, gebonden waarden en afgeronde rijen lezen
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,
    ]]);
}
Schrijf een rij
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)),
    ]]);
}

Overlevende schemaverschillen

Platformversies verschillen. Kolommen verplaatsen, hernoemd worden of zijn afwezig. Een brug die aanneemt dat één schema werkt op een installatie. Introspecteer en pas aan in plaats daarvan: selecteer alleen de kolommen die hier bestaan, tolereer het tafelprefix, en probeer de aannemelijke spellingen van een referentie.

Schematolerantie, vanaf de Botble brug
/* 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));
💡
Geef uw brug een op=diag die alleen STRUCTUUR rapporteert, welke tabellen opgelost zijn, welke kolommen de hoofdtabel heeft, en het SHAPE van de nieuwste referentie met elk gemaskerd cijfer. Het is sleutel-gegaapt zoals al het andere, en verandert "de lookup vindt niets" uit een support ticket in een tien seconden antwoord. Laat nooit echte records terug te geven.

Uniforme fouten en de opsommingsval

Eén vorm voor alles

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.

Niet gevonden en geen gelijke moet identiek zijn

Op een zoekoppervlak moet een verwijzing die niet bestaat en een referentie waarvan het bewijs niet overeenkomt, de SAMES-respons produceren. Verschillende antwoorden maken van uw brug een orakel dat bevestigt welke referenties echt zijn, wat een gratis klantlijst export is voor iedereen die geduldig is.

Lek nooit de reden naar een bezoeker

De brug kan nauwkeurig zijn metOpsIQ. Wat een bezoeker bereikt wordt beslist doorOpsIQ, bij één vaste weigering.

Het kopieerbare bestand in het connectorpaneel

De operator opent nooit uw repository. Ze openen het paneel van de connector inOpsIQEn druk op Kopie. Die kopie komt van instellingen.json, en het moet hetzelfde programma zijn als bridge/*.php.

instellingen._json
{
  "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.

knipselbindingen overleeft regeneratie

Geef elke gegenereerde geheime opdracht expliciet aan. Het synchronisatieprogramma herbouwt de kopie van het paneel vanaf de verzonden brug en herstelt deze vervolgens OPSIQ_BRIDGE_KEY = {{setting:api_key}} Zonder deze binding kan een upgrade het sleutelloze pakketbestand getrouw kopiëren en stilletjes de inzetbare sleutelhouder van de operator verwijderen. Connector Builder zendt deze binding automatisch uit voor gegenereerde brugpakketten.

Andere plaatshouders worden vervangen server-side

Onafhankelijk van dat,{webhook_url}, {webhook_path}, {webhook_secret}, {site_key}, {base_url}en{slug}worden ingevuld voordat het panel ooit het knipsel ziet.

webhook_help kan één object of een lijst zijn

Een lijst geeft u verschillende snippets in één paneel, bijvoorbeeld een brug bestand en een aparte relaishaak.

🚫
Houd het knipsel niet met de hand. Het brugbestand en de paneelkopie zijn twee kopieën van één programma, en ze ZULLEN driften
Houd de twee kopieën identiek
# 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.

Wat de brug moet onthullen

Gevormde operaties en een universele data-oppervlakte, samen. De gevormde antwoorden keren netjes terug, doelbewust opgebouwde antwoorden op de vragen die mensen eigenlijk stellen; de universele dekken al het andere zodat de assistent nooit vastzit.

Gevormde lectuur

statistieken, de hoofdobjectenlijst met filters, één object met bijbehorende rijen, de catalogus van wat wordt verkocht, klantzoekopdracht met geschiedenis. Deze geven de AI een goed antwoord in één gesprek in plaats van vijf.

Gevormde schrijfsels

De twee of drie statuswijzigingen die van belang zijn . set status, annuleren. Houd de geaccepteerde waarden allow-listed.

Getypte handel

Voor een verkoopbaar platform bloot-gebouwde catalogus, offerte, checkout / bestelling en betaling-bewijs operaties, dan in kaart brengen ze in commerce_roles.json met transport: bridge. Maak nooit een rol in de handel schrijf schrijven naar het universele record. create / update oppervlak.

Universele ontdekking

tabellen (met rij telt) en beschrijven (koloms, typen, primaire sleutel, plus leesbaar en schrijfbare vlaggen per kolom). Zo leert de assistent een platform dat je niet verwachtte.

Universeel lezen en schrijven

query, record. get, record, create, record-update, record

Identiteit, voor de sleutelpoort

Identiteitssonden worden door de ADMIN'S BROWSER opgeroepen, dezelfde oorsprong, dus ze kunnen geen aangepaste header sturen. Hun authenticatie is het platform sessie zelf. Zet ze voor de sleutelpoort, houd ze weg van alle recordgegevens en laat ze nooit een geheim teruggeven. Zie de pagina identiteit van de connector pagina.

Diagnostica

op=diag, structure only, masked.

Rolkaart voor de handel in bruggen
{
  "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"
    }
  }
}
💡
De canonische rol controleert de volgorde en autoriteit; de brug operatie houdt het platform eigen type lading. Een hotel kan aankomst, vertrek en gasten vereisen, WHMCS kan een bestaande client of connector-owned aanmelden nodig hebben, en een SaaS platform kan een factuur cyclus vereisen. Core nooit hardcodes die velden. De brug moet beroep doen op de zakelijke diensten van het platform zodat voorraad, belastingen, facturen, bevestiging mail en haken alle lopende.
⚠️
record_payment is geen mark-paid snelkoppeling. Accepteer alleen server-verifieerde provider bewijs: exacte bestelling, merchant, bedrag, ISO valuta, provider referentie, verse geverifieerde tijdstempel en idempotency sleutel. Persist het via de betaling/factuur van het platform API, dan retourneren een gezaghebbende order of factuur terug te lezen-back. Een onbekend resultaat moet worden uitgevoerd herstel voordat er opnieuw geprobeerd wordt.
💡
Een alleen-lezen connector heeft helemaal geen vergunningslijst nodig. Als uw platform alleen maar vragen beantwoordt, verzend dan een brug zonder schrijfopdrachten en de hele klasse van het schrijfrisico verdwijnt. Voeg toe schrijft wanneer iemand ernaar vraagt.

Checklist voordat u een brug verstuurt

De brug weigert alles zonder sleutel.

Test het. Hernoem de constante naar leeg en bevestig elke op antwoorden 403.

Een verkeerde sleutel wordt in constante tijd geweigerd

hash_equals, en de sleutel alleen gelezen van de koptekst.

Een geconfectioneerde tabelnaam wordt geweigerd

En een echte tabelnaam met een verkeerd voorvoegsel is nog steeds opgelost.

Een wachtwoord kolom verschijnt nooit in een gelezen

En een schrijven dat namen men wordt geweigerd met een verklaring.

Een schrijven naar een tabel buiten de toelaatbare lijst wordt geweigerd

Met het bericht dat de operator vertelt hoe hij hem moet verbreden.

Het paneel knipsel komt overeen met het brugbestand

php-tools/sync_connector_bridge_snippets. php meldt het in stap.

Het opnieuw installeren van de connector is niet voldoende

Als uw pakket een brugbestand verstuurt, moet een operator die de connector upgrade OOK dat bestand opnieuw in hun webroot plaatsen. Zeg dit in het panel lichaam en in uw Changelog, elke release.

Connectoren

Het platform zelf opstarten vanaf een brug

Een brug die alleen leest kan praten SQL. Een brug dat dingen op het platform CREATES (een bestelling, een boeking, een betaalde factuur) moet gaan door de eigen toepassing laag van het platform, en opstarten van die laag hoofdloos is waar elke subtiele mislukking in dit patroon leeft. Alles hieronder werd geleerd de harde manier op een live-integratie, elk regel tegen een echte defect dat nergens fout veroorzaakt.

Een rij in de database is geen bestelling

Raw INSERTs maken een schaduwrecord aan

De rij verschijnt, admin geeft een lijst van het, en het is nog steeds geen record het platform gelooft dat het gemaakt: geen native referentienummer, geen model haken, geen gebeurtenissen, geen factuur, geen klant e-mail, geen werkende klantgerichte koppeling. De klant citeert een referentie die nooit door de perrons wordt uitgegeven aan personeel dat het niet kan vinden. Maak via de eigen service van het platform; als het alleen stelt een post-payment dienst, maak de grafiek die hij verwacht en overhandigen bij de naad die het definieert.

Nooit de nummering van het platform opnieuw implementeren

Twee voorbeelden van een referentieformaat maken het gemakkelijk om te reproduceren, en het is hetzelfde schaduw-schrijf één niveau naar beneden: de dag dat het platform verandert zijn schema, elk van uw records is verkeerd en niets waarschuwt u. Bel de generator (reflectie bereikt een niet-statische), en lees de opgeslagen waarde terug in plaats van vertrouwen op wat je verzonden hebt.

Platform kolommen houden platform betekenissen

Voordat je iets van jou op te slaan in een platform kolom, vind elke lezer. Een column genaamd als een gratis slot kan dragend zijn: op de referentie integratie, transaction_id bleek het token te zijn dat de klant e-mailde "kijk uw boeking" link lost door: een idempotency vertakking opgeslagen er stilletjes gebroken elke gast link. Houd je boekhouding in een brug-eigendom tafel: UNIQUE(operatie, idempotency_key) is de replay bewaker, de beperking weigert de gelijktijdige tweeling, en het herstel lookup leest dezelfde tabel die de create geschreven. Maak die tabel VOOR beginTransaction: MySQL DDL pleegt impliciet een open transactie.

Evenementen, luisteraars en de dubbel-email val

Lees de bron van de dienst voordat het verzenden van de gebeurtenissen

Als de platformdienst die u belt al het evenement verstuurt, verzendt zelf twee bevestigingsmails naar de klant en genereert twee facturen. Als er niets wordt geluisterd, stuurt verzending geen. Geen van beide fouten doet een fout ontstaan. Reflecteert de methode, snijdt zijn bronlijnen, en lees wat het eigenlijk doet: een naam-gebaseerde gok en zelfs een regex over het lichaam beiden had dit verkeerd voordat de bron het geregeld heeft.

getListeners() verbergt de waarheid; getRawListenters() vertelt het

Laravel wraps klasse luisteraars in sluitingen, dus getListeners() rapporteert [email protected] voor alles. getRawListenters() noemt de werkelijke klassen. Nooit een evenement versturen waarvan je geen naam kunt geven aan een luisteraar.

Zou Queue niet "runs later" moeten betekenen

Met queue=sync (de standaard bij veel productie-installaties) draait een luisteraar in de wachtrij INLINE op uw bridge verzoek. Uw bootcontext IS zijn render context: elke registratie of URL defect in uw boot landt in de postvak IN van de klant. Controleer config('queue.default') alvorens te redeneren over waar iets loopt, en kijk in taken /failed_jobs voordat een werknemer erbij betrokken was.

Bewakers herbevestigen met de eigen staat van het platform

Een dienst die onvoorwaardelijk wordt verzonden moet exact eenmaal worden aangeroepen. De marker die niet kan drijven is de eigen recordstatus van het platform (alleen bellen zolang de record nog in behandeling is), geen parallelle "verzonden" vlag van jou die er niet mee akkoord kan gaan.

De koploze boot is niet de webboot

Registreer wat de web boot registers

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.

Alles URL _wortel, niet alleen de router

Het gevangen verzoek wijst op uw bridgescript, dus route(), url() en activa() genereren site.com/public/opsiq-bridge.php/checkout/TOKEN: een klantverbinding via a JSON eindpunt. forceRootUrl(config('app.url')) repareert de generator; de opbergschijf heeft zijn eigen root, zodat het gemailde logo blijft gebroken tot bestandssysteem.disks.public.url is ook ingesteld (het lost lui op, dus het instellen bij opstarten werkt, en alleen wanneer leeg of script-relatief: een exploitant CDN URL Het is niet aan jou om te overschrijven.

Commit voordat u overhandigt

De diensten van het platform lezen via hun eigen verbinding en kunnen uw open transactie niet zien. Gebeld voor commit, vindt een post-payment service geen voltooide betaling, laat rustig de record onbetaald, en nog steeds branden haar gebeurtenissen, zodat de klant wordt gemaild over een record dat het platform denkt dat is onbetaald. Commit de grafiek, dan bellen.

Eerlijkheidsregels

Geen schaduw terugval

Als het oorspronkelijke pad onbereikbaar is, weigeren met een opnieuw te proberen fout VOORdat er geld beweegt. Nooit een referentie uitvinden, nooit rauw-update een status om een half geïntegreerde record look voltooid. Een geverifieerde betaling waarvan de inheemse verwerking mislukt gaat naar verzoening als needs_attention: Het geld is echt, de staat wordt eerlijk gezegd "betaald, nog niet verwerkt."

Rapporteer feiten, niet uw verklaring.

"De dienst liep" en "de klant werd verteld" zijn verschillende feiten: de referentie integratie verzonden een volledig ogende e-mail met elk veld leeg, terwijl de ran-vlag zei waar. Retour ze afzonderlijk (verwerking voltooid, notificatie geprobeerd), houden per oproep platform_notified die de OpsIQ fallback bevestiging wanneer het platform niet verwerkt, en nooit claimen levering: een inbox is niet waarneembaar van een server.

Maatregel, dan schrijven

Stuur een alleen-lezen mogelijkheden sonde in de brug: klasse bestaan, methode handtekeningen, bron plakjes van de methoden die u wilt bellen, rauwe luisteraars, wachtrij bestuurder, en (wanneer een vraag kan worden beantwoord door het oproepen van een onschadelijke functie) de live call zelf. Vijf theorieën over één holle e-mail stierf tegen metingen voordat de bron geregeld. Een probe ronde kost een bestand kopie; een verkeerde schrijven op een live platform kosten een klant.

Connectoren

De brug in andere talen en andere databanken

Het brugpatroon is geen PHP patroon.OpsIQcalls is een HTTP-eindpunt, dus het bestand kan Node, Python, Go, Ruby, .NET of Java zijn en de winkel erachter kan elkeSQLmotor ofMongoDB. Wat PHP-vormig is, is de verpakkingspijplijn en die beperking bepaalt hoe uw brug de exploitant bereikt. Lees eerst het leveringsgedeelte: het is het deel dat mensen verrast.

Wat de connector eigenlijk nodig heeft

Dit is het hele contract, niets in dat woord noemt een taal.

Vervoer

Eén vraag per oproep, geen lichaam of methode.

Authenticatie

Een gedeeld geheim in de X-Opsiq-Bridge-Key vraag header, vergeleken in constante tijd. Geen query parameter, geen cookie, niet Basic auth.

Parameters

Zoekdraad. op het oppervlak te noemen; do Noemt de operatie, de rest zijn de argumenten van die operatie.

Respons

JSON_. {"success":true,"data":{...}} of {"success":false,"error":"snake_case_reason"}. Inhoud-Type toepassing/json, en geen caching.

Statuscodes

200over succes.403niet geconfigureerde of verkeerde sleutel,404niet gevonden,405verkeerde methode,400slecht argument,501niet ondersteund op dit schema.

Dat is alles.

Geen kader, geen runtime, geen OpsIQ bibliotheek aan uw zijde. Als het dat kan dienen, kan het een brug zijn.

Levering: wat kan leven in brug /, en wat niet

Het ondertekende pakket heeft betrekking op een vaste lijst van bestandsextensies, en een bestand buiten die lijst wordt weggelaten uit de ZIP. Een brug in een taal de lijst niet dekt daarom kan niet verzenden binnen het pakket26Augustus2026een bestand in bridge/ dat de pakketbesteller zou vallen is een harde conformantie fout, dus het pakket weigert te passeren in plaats van installeren zonder brug erin.

Hoe een bridge/map wordt behandeld in bouwtijd
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 en JavaScript

Het bestand wordt geleverd in de ondertekende ZIP, en de snippet verificateur houdt uw paneel kopie byte-identiek aan het, welke van de twee het is. De drift controle leest elk dossier in brug / niet alleen de PHP degenen, dus een opgewaardeerde brug met een oud panel exemplaar mislukt de bouw in beide taal.

Al het andere .. leveren via de panel alleen

Het paneel knipsel is platte tekst zonder idee welke taal het bevat, dus het werkt voor elke stack. Zet het hele programma in webhook_help. snippet_template, naam van het bestand in snippet_filename, en laat GEEN kopie achter in bridge/

Als je echt een andere taal nodig hebt in het pakket

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.

💡
Het bestand in naam geven webhook_help.snippet_filename wanneer uw pakket meer dan één brug vervoert. Zo weet de verificateur tot welke brug een paneelkopie behoort; zonder deze is er melding gemaakt van een dubbelzinnige koppeling als waarschuwing voor overeenstemming en wordt het knipsel niet gecontroleerd.
⚠️
Het punt van de drift controle is dat een brug bestand en zijn paneel kopie twee kopieën van één programma en WILL divergeren. Regenereer in plaats van hand-edit: php tools/sync_connector_bridge_snippets.php --apply, dan hertekenen het pakket.

De poort, in zes talen

Dezelfde vier controles in dezelfde volgorde overal: niet gesloten met geen sleutel, één methode, constante-tijd sleutel vergelijking van de header, dan verbinden. De enige echte val is de vergelijking, en het is een andere val in elke taal.

⚠️
Vergelijk de SHA-256verteert de twee toetsen in plaats van de sleutels zelf. Het is correct in elke taal, en het stapt af van het feit dat verschillende constant-time comparators gooien of lekken op een lengte niet-correcte timingSafeEqual verhoogt een RangeError wanneer de buffers verschillen in lengte, waardoor een verkeerde sleutel in een500in plaats van een403.
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 . de poort
# 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)
Ga, Ruby, . NET en 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)));
}

Identificatiecode op elke database-engine valideren

De veiligheidseigenschappen veranderen niet: een tabel of kolomnaam die de beller meegeeft moet worden gecontroleerd op het echte schema voordat deze geïnterpoleerd wordt, en elke waarde moet een gebonden parameter zijn. Alleen de introspectie-query, het quoting-teken en de pagingclausule verschillen.

MySQLenMariaDB

Tabellen: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?. Kolommen: hetzelfde tegen information_schema.COLUMNS met AND TABLE_NAME = ?. Citeren met backticks, verdubbelen van elke backtick binnen. LIMIT n OFFSET m.

PostgreSQL

Dezelfde informatie_schema weergaven, kleine letters WHERE table_schema = $1 (gewoonlijk public). Citaten met dubbele citaten, verdubbelen van elke dubbele offerte binnen. LIMIT n OFFSET m. Let op de vouwregel: een niet-geciteerde identificatiecode wordt naar kleine letters gevouwen, dus vergelijk het hoofdletterongevoelig wanneer u een naam oplost.

SQL Server

Dezelfde informatie_SCHEMA weergaven. Citeren met vierkante haakjes, verdubbelen van elke sluiting beugel binnenin. Paging heeft een ORDER BY: ORDER BY [id] DESC OFFSET @o ROWS FETCH NEXT @n ROWS ONLY.

SQLite

Tabellen: SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'. Kolommen: SELECT name FROM pragma_table_info(?) Gebruik die tafelgewaardeerde vorm, omdat de kale PRAGMA table_info(x) statement kan geen gebonden parameter nemen en het uitnodigen van string interpolatie is er precies het gat dat u probeert te sluiten. Citeren met dubbele citaten. Pagina met LIMIT n OFFSET m.

Orakel

Tabellen: SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = :owner; kolommen van ALL_TAB_COLUMNS. Citeren met dubbele citaten, en herinner een niet-geciteerde identificatie vouwen naar UPPER geval, het tegenovergestelde van PostgreSQL. Pagina met OFFSET :o ROWS FETCH NEXT :n ROWS ONLY op 12c en later.

MongoDB

Geen SQL, dus geen identificatie-invloeden en geen gebonden parameters . . een andere discipline voor hetzelfde doel. Zie hieronder.

De introspectievraag 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;
💡
Oplossen, gebruik dan de RESOLVED naam. Geef nooit de spelling van de beller door aan de query zelfs na het controleren ervan

MongoDB: dezelfde regels, zonder SQL

Er is geen query string om in te injecteren, dus mensen gaan ervan uit dat er niets te bewaken valt. Er is: het filter document.JSONrecht in find() laat een beller sturen {"$ne": null} of {"$gt": ""} waar u een waarde verwachtte, en selecteer rustig elk document. Bouw zelf het filter.

MongoDB — collectie allow-list, scalar geforceerd filter, projectie als redactie
// 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();
Verzamelnamen komen uit lijstCollecties

Dat is je informatieschema. Los de spelling van de beller op en gebruik de opgelost naam.

Dwing elke filterwaarde naar een scalar

Een tekenreeks() of een getal() eromheen is de hele verdediging tegen operator injectie. Een document waar je een waarde verwachtte is het NoSQL equivalent van een verdwaalde quote.

Projectie is de redactieregel

Sluit geheime velden in de projectie uit zodat ze nooit meer van de server afkomen, in plaats van ze achteraf te verwijderen.

Verwijdert één document blijven door _id

DeleteOne met een _id opgelost. Verwijder nooitVeel en nooit een filter dat de beller beïnvloedde.

Schrijven blijven toegestaan-list

Zelfde redenering als SQL: noem de verzamelingen die een schrijf kan raken, en verwerp de rest met een uitleg.

Het identiteitseindpunt in andere talen

De identiteitssonde is de andere helft van een brug, en het is ook HTTP. Het tekenblok is identiek in elke taal: base64url de lading, HMAC-SHA256 die string, voeg met een stip.

Schrijf dit niet van nul af. Instellingen, Ondersteuningsportaal draagt een klaar route per taal voor het portaal (eenmaal, twee minuten token). Remote Sites, uw site, Codes, C. Herkent ingelogde klanten automatisch de chatversie per taal (één uur token plus de refresh handler). Neem de signer uit de smaak die overeenkomt met uw stack.
Wat te veranderen wanneer u het hergebruikt

Deze snippets slaan een PORTAL handoff token, die bewust strenger is: het draagt jti en single_use:true en leeft over120seconden omdat het reist in eenURL. Een brug of widget identiteit token draagt geen van deze en gebruikt een langere exp, minuten tot uren.

Wat blijft hetzelfde

site_key, iat, exp en een top-level authenticated:true, plus een admin of klant subject met een id en een gebruikersnaam of e-mail. Zelfde claims, dezelfde handtekening, hetzelfde geheim.

Beide token vormen controleren

Een driedelige JWT ondertekende HS256 werken, en ook de twee-delige base64url payload plus hex HMAC die PHP referentie zendt. Gebruik welke van uw taal bibliotheken natuurlijk maken

Nooit in de browser slaan

Waar in elke taal. Ondertekenen client-side betekent het verzenden van de site geheim naar elke bezoeker.

Kiezen, eerlijk gezegd.

Het platform is PHP

Schrijf de brug in PHP. Het schip wordt verzonden in het pakket, het is drift-gecheckt, en het kan booten van het platform eigen kader om een live sessie voor de identiteitssonde te lezen. Niets anders geeft u alle drie.

Het platform is Node

Een . js brug schepen, tekens en wordt gecontroleerd precies als een PHP-een. Niets wordt opgegeven.

Het platform is Python, Ruby, Go, . NET of Java

Lever via het paneel knipsel en zeg dat in de paneel body; laat het bestand niet in bridge /, waar conformantie zal weigeren het pakket. De connector is anders volledig normaal: acties, context providers, identiteit en gast lookups werken allemaal hetzelfde, omdat geen van hen geeft wat beantwoordt de HTTP-oproep.

U kunt geen proces uitvoeren op de platformhost

Dan is het brugpatroon niet de juiste tool. Een brug bestaat om een platform te bereiken van binnenuit zijn eigen gastheer. Als je het alleen maar van buiten kunt bereiken, schrijf je een gewone API connector tegen welk oppervlak dan ook dat het ook blootlegt.

⚠️
Nog een beperking die de moeite waard is om rond te plannen: een identiteitssonde moet de inlogsessie van het platform lezen, wat meestal betekent dat hij binnen het eigen proces van het perron loopt of tenminste op zijn gastheer met toegang tot zijn sessie store. Een brug geschreven in een andere taal dan het platform kan gegevens comfortabel dienen en kan nog steeds worstelen om op=admin_identity te beantwoorden. Als dat uw geval is, stuur dan de databrug in je taal en de identiteitsonde in het performance-platform.
Connectoren

Geef de assistente beide helften: acties EN context

Dit is het meest voorkomende ding ontbreekt van een connector die "werkt maar nutteloos". Acties laat de AI dingen doen. Context secties laten het WETEN dingen. Een connecter heeft zowel, en de meeste vragen die een admin vraagt worden beantwoord door context, nooit door een actie. Een verbinding met perfecte acties en geen enkele context provider zal eerlijk melden dat het niets kan zien.

De twee helften

Acties . Hoe de AI dingen doet

Verklaard in acties.jsonof geretourneerd door registerActies(). Het model kiest er een, vult de parameters, enOpsIQActies zijn voor werkwoorden: annuleer deze boeking, open dat ticket en wijzig deze status.

Context secties . Hoe de AI dingen weet

In de lijst geplaatst door een ContextProvider voordat het model draait. "Hoeveel bestellingen deze maand," "wie zijn mijn nieuwste klanten", "wat verkopen we" allemaal oplossen via een context zoekactie en nooit iets aanraken bij alle actie.

⚠️
Symptoom van een ontbrekende provider: de assistent antwoordt "Geen actieve connector geleverd deze context sectie" terwijl de connecter is geïnstalleerd, ingeschakeld en slagen voor zijn verbinding test. Niets wordt gelogd, niets fouten. Dat bericht betekent dat geen enkele aanbieder claimde het gedeelte.

De universele sectie woordenschat

OpsIQ vraagt om secties bij generieke naam. Uw taak is te beslissen wat elk van u op uw platform betekent en het antwoord te geven. Een hotel boeking IS de bestelling van het hotel; een kamer IS wat het hotel verkoopt. Kaart, niet uitvinden.

bestellingen / in behandeling zijnde_orders

Wat een transactie ook op uw platform is: bestellingen, boekingen, reserveringen, jobs, zendingen. in afwachting van_orders is dezelfde lijst gefilterd naar de onvoltooide.

cliënten

Het klantenrooster.

products

Wat het platform verkoopt: producten, kamers, plannen, diensten.

facturering

Inkomsten en geldvormige totalen, plus de staat telt.

tickets, diensten, domeinen, servers, activiteiten

Gebruik deze wanneer uw platform echt heeft ze. Dwing niet een mapping

Iets anders uw platform heeft

Een provider die secties() verklaart: ['licenties', 'verzendingen'] heeft degenen samengevoegd in de allow-list van de universele zoekopdracht, zodat platformspecifieke opzoekingen beschikbaar komen zonder kernwijzigingen.

De fout die een dag kost

Een context provider MOET de interface implementeren. Het register type-checkt het, dus een klasse die alleen maar Looks rechts is overgeslagen

ContextProvider. php
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 '';
    }
}
Registreer het vanaf de stekker

Implementeer ContextConnectorInterface en retourneren van uw providers vanuit contextProviders(). De connector klasse kan ook ContextsProviderInterfac direct implementeren en worden geregistreerd als zichzelf.

Gewone tekst teruggeven, niet JSON

build() geeft een tekstblok terug dat in de prompt wordt samengevoegd. Schrijf het voor een lezer: een kop, dan één regel per rij.

Geef '' terug in plaats van te gooien

Neem je eigen uitzonderingen. Een provider die gooit wordt gelogd en overgeslagen, maar het terugsturen '' is het contract.

De bouwer kan geen secties voor u schrijven

De gegenereerde ContextProvider. php verscheept secties(): array { return [];} en de wizard heeft er geen veld voor. Vul het met de hand in en onthoud dat heruitnemen van de wizzer het bestand OVERWRITES. Kopieer eerst uw bewerkingen uit.

⚠️
Vermeld het werkelijke TOTALE, niet het aantal rijen die u verzonden. Een pagina is geen totaal. Een provider die twintig rijen zonder te zeggen zo krijgt de assistent vol vertrouwen antwoord "je hebt20boekingen" wanneer het platform houdt669. Een goedkope count en een expliciete regel "TOTAL in bestand:669(deze lijst toont de nieuwste20alleen) "" is de hele fix, en een zeker verkeerd aantal is erger dan geen tel.
Een sectieblok dat niet verkeerd kan worden geteld
$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);

Noem uw acties zodat OpsIQ lees lezen kan vertellen van schrijfsels

OpsIQ Classificeert een actie van de W VERMELDING in zijn actie_id, en het is bewust conservatief: alles wat hij niet kan herkennen wordt behandeld als schrijven en vraagt om een goedkeuringskaart. Krijg het werkwoord juist en een lezing gewoon loopt.

1
is_destructief of vereist_bevestiging wint

Als een van beide is ingesteld, de actie moet altijd goedkeuring. Declareren ze eerlijk

2
Een schrijfwoord waar dan ook in het id maakt het een schrijven

toevoegen, maken, openen, bijwerken, bewerken, wijzigen, wijzigen... verwijderen, verwijderen, vernietigen, annuleren, herstellen, schorsen, beëindigen, activeren, goedkeuren, weigeren, verzenden, markeren, resetten, opnemen, vervallen, sluiten, heropenen, toewijzen, intrekken, instellen, toekennen, instellen enggle, inschakelen, uitschakelen, uitgeven, genereren, toepassen, opladen, betalen, voorziening, vernieuwen, upgrade, mergen, verplaatsen, verplaatsen van, escaleren, vlag, register, synchroniseren, duwen, uitvoeren, trigger, starten, stoppen, herstarten en nog een paar meer.

3
Dan is een gelezen woord het lezen

krijgen, lijst, zoeken, vinden, bekijken, tonen, ophalen, tellen, kijken, beschrijven, lezen, exporteren, voorbeeld, test, ping, status, samenvatting, detail, recent, geschiedenis, controleren, log, statistieken, statistieken. overzicht, inkomsten, uitsplitsing, rapport, analyse, balans, gebruik, quota, snapshot, inzichten, feed, concept, triage, classificeren, suggereren.

4
Dan bepaalt de HTTP methode

Get, Head en OPTIES zijn gelezen.

5
Anders is het een schrijven

Onerkend betekent goedkeuring vereist. Die standaard is opzettelijk.

⚠️
Schrijf woorden worden gecontroleerd VOORdat je woorden leest, dus een gemengde naam zoals get_and_sync_orders is geclassificeerd als WRITE. Kies één werkwoord, zet het eerst en houd het schoon: list_order, get _customer, zoek_bookings, cancel_booking, set_order_status.

Alleen native_api aangeven als het platform er echt een heeft

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.

De bouwer beslist het uit uw data-toegang antwoord

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.

Hand-geauthoriseerde pakketten moeten het nog steeds goed krijgen

Als u het manifest zelf schrijft, verklaar dan precies één van native_api of platform_bridge. Conformance behandelt platform_brug als de ontsnappingspoort die een brugconnector naar verwachting heeft en de Builder weigert een spec die platform_ Bridge claimt op een API -connector.

Ai_api_reference. md eerlijk blijven, hoe dan ook

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.

Leer de admin hersenen over uw platform

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

Wat dit platform IS, hoe zijn gegevens worden gevormd, wat de objecten worden genoemd, en de eigenaardigheden die anders zou maken dat de assistent raden. Schrijf het voor een competente collega die nooit heeft gezien van het platform.

ai_api_reference.md

Het aanspreekbare oppervlak. Voor een brugconnector is dit uw op en doe woordenschat met hun parameters, geen REST eindpunt tabel.

Begroting

Ruwweg6,000tekens die per connector worden bewaard, en ongeveer24,000karakters voor het hele blok over elke actieve connector. Over de per-connector cap wordt uw bestand afgekapt; kort zijn voordat de truncator is.

Precisie loont

Deze bestanden zijn het verschil tussen de assistent met behulp van uw universele tafelgereedschappen en antwoorden vanuit de verkeerde sectie omdat niets ooit verteld dat die tools bestonden.

💡
Beide bestanden moeten in het INSTALLED pakket zitten, niet alleen uw broncodeboom. Het zijn gewone pakketbestanden, dus ze worden gedekt door de handtekening en verzonden in de ZIP
Connectoren

Identiteit via een connector: admin, klant, portal

Een ondertekening contract dient drie oppervlakken. De connector is de taak om "wie is ingelogd op het platform" in een ondertekend tokenOpsIQkan verifiëren, en vervolgens het geverifieerde onderwerp inOpsIQ's vorm. De connector maakt nooit een verificatie van iemand, het platform doet, en de handtekening draagt die bewering.

De drie vlakken, één tekenaar

Beheerder .. uw personeel, in je backend

Een admin subject. Het widget laadt in het admin-paneel van het platform en elk personeelslid wordt gekoppeld aan zijn eigen OpsIQ agent. Volledige doorloop op de admin widge pagina.

Klant . . een ingetekende klant, in client chat

Een klantonderwerp. Dit is wat een ingelogde klant zijn HELE account in plaats van anoniem opzoeken laat krijgen: elke bestelling, volledige details en alle zelfbedieningsactie die u toelaat.

Portaal

Dezelfde claims plus jti en single_use, met een120- tweede leven, omdat de token reist in eenURLen moet één keer besteedbaar zijn. Deze niet met de hand rollen: Instellingen, Ondersteuning Portal draagt een klaar knipsel per taal, en het platform munt voor u wanneer het account gebied draait op deze server.

Het laadcontract

Dit zijn de claims die door de verificateurs gecontroleerd worden. Niets hier is facultatief, wat een gedeeltelijk voorbeeld ook mag zijn elders.

site_key

Top niveau. Moet gelijk zijn aan de site sleutel van het verzoek, of de token wordt geweigerd.

iat en exp

Top niveau, unix seconden. exp moet in de toekomst en na iat zijn. Een token meer dan ongeveer een minuut in de toekomstige wordt geweigerd. Houd het leven kort

geauthentiseerd: waar

Je platform beweert dat een echt mens is ingelogd.

platform

Top niveau. Een korte kogel naam geven van de oorsprong. Aanbevolen, en het laat een connector identiteit provider vertellen zijn eigen tokens uit andere platform's.

beheerder of klant

Een object dat het onderwerp noemt. Het moet een niet-lege id bevatten, en een gebruikersnaam of e-mail

Munten, letterlijk vanaf de Botble brug
$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);

De twee verificateurs en het falen dat zij veroorzaken

OpsIQ heeft twee token verificateurs, en ze waren niet identiek. Weten dat dit bespaart u een middag, omdat het symptoom lijkt niets op de oorzaak.

Het admin-widget heeft een eigen verificateur

opsiq/embed/admin_ajax. php draagt een lokale verificateur die de geauthentiseerde vlag in beide posities accepteert. Gesprekslijst, geschiedenis en ongelezen gaan er allemaal doorheen, dus ze authenticeren prima.

De gemeenschappelijke verificateur is strenger

opsiq/includes/customer_identity_token_verify. php zit achter de chatstream en de kern AJAX API. Het vereist van oudsher de vlag op het TOP-niveau.

Het symptoom

Geschiedenis en gesprekken werken. Elke chat om te draaien antwoordt "Admin login vereist" . Het leest precies als een sessie bug en is niet: de token mist de top-level vlag.

Wat doet de huidige kern

Het accepteert nu de vlag op het hoogste niveau OF binnenin het onderwerp, dus het contract is uniform. Oudere kernen lezen alleen het bovenste niveau. Geef de canonieke vorm en uw pakket werkt bij elke release.

Dit is machine-gecheckt nu. Elk bestand in uw pakket dat munt identiteit tokens wordt statisch gescand tegen het contract, en een lading van het platform zou weigeren niet conform te zijn met de exacte bestand en lijn. Voer het zelf uit: php tools/verify_identity_contracts. php.

Gesigneerde klanten in client chat

Twee dingen moeten waar zijn. Kern moet stempelen de geverifieerde klant, en uw connector moet presenteren.

1
Uw brug of eindpunt mint een klant token

Dezelfde signer als de admin, met een klant onderwerp. Lees de klant van het platform eigen sessie. Als uw platform klanten inlogt op een andere wacht van admins, lees dan de bewaker die u wilt en nooit terugvallen over onderwerpen

2
Kerncontrole en stempels

Op een geldig token, core stempelt het geverifieerde onderwerp in de sessie. Uw provider leest een bewezen identiteit; het nooit authenticeert.

3
Uw identiteitProvider presenteert het

detectCustomer() geeft hetOpsIQvorm. Het moet implementerenOpsIQ\Platform\IdentityProviderInterface, of het register slaat stilletjes over in dezelfde val als de context provider.

4
Uw klant-gescoopte acties accepteren een customer_id

En OpsIQ sluit het aan op de geverifieerde identiteit voordat het uitgevoerd wordt. Het model kan het niet leveren.

IdentityProvider. php Lees de bewezen identiteit, presenteer het in OpsIQ's vorm
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;
    }
}

Door de klant gecoöpteerde acties: twee sloten, beide vereist

Het model mag nooit kiezen wiens gegevens het leest. OpsIQ verplicht dat aan zijn kant, en uw platform moet het ook af te dwingen aan de andere kant. Een slot is een bug verwijderd van een lek; twee sloten zijn een contract.

Vergrendelen1 — OpsIQoverschrijft de identiteitsparameters

Voordat een klantchatactie wordt uitgevoerd, vervangt OpsIQ elke identiteits-vormige parameter door de VerifiED bezoeker identiteit: client_id, clientid, user_id , userid, customer_id en account_id nemen het geverifieerde numeriek id; client_identifier, culant_identificator, account/identifier neemt het als string; email, client_email, cunten_e mail, uster_emailadres neem de geverifieerde e-mail. Wat het voorgestelde model ook wordt verworpen.

Vergrendelen 2 .. herschikt uw platform elke zoekopdracht

Neem het ID dat je gegeven werd en voeg dit toe aan de WHERE clausule van elke lezing en elk schrijven op dat oppervlak. Vertrouw nooit de referentie in het verzoek alleen. Een ingelogde klant die vraagt naar iemand anders zijn bestelling moet terug komen leeg, niet verboden.

Geef uw parameters een naam, zodat vergrendel 1 ze kan vinden

Noem het customer_id, niet cust of ref. Een parameter OpsIQ herkent geen parameter die hij niet kan vergrendelen.

⚠️
Geef de ingelogde klant zijn eigen activiteiten, gescheiden van die van de beheerder, zelfs wanneer de SQL Twee vlakken met verschillende regels blijven eerlijk; één oppervlak met een vlag wordt een lek op de dag dat iemand de verkeerde tak bewerkt.

Zero page bedrading: de door de aansluiting aangegeven sonde

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.

instellingen._json
{
  "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."
}
De sonde wordt door de browser aangeroepen

Zelfde oorsprong, dus het kan geen aangepaste header dragen. De authenticatie is de platformsessie. Zet het AHEAD van uw brug-toetsenpoort, houd het weg van recordgegevens en geef helemaal niets terug voor een ingelogde bezoeker.

Het beantwoordt een vaste vorm

{"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} — and {"success":false,"authenticated":false,"error":"..."} when nobody is signed in.

Geen langlevend geheim in paginabron

Alleen het getekende, verlopende teken.

De volledige implementaties voor Laravel,WordPress, WHMCS, Symfony en gewone PHP, plus de hard-won Laravel details en het oplossen van problemen orde, staan op de admin widget pagina. Ze zijn dezelfde code voor een klant onderwerp: verander de bewaker die u leest en de subject sleutel die u tekent.

Connectoren

Publiceren: bewerken van de map is niet publiceren

De meest voorkomende manier om een middag te verliezen is door een connector onder marketmarke_connectors/ te bewerken, opnieuw te installeren en niets te vinden dat veranderd is. Installeert niet lezen die map. Ze trekken een getekend ZIP uit de marktcatalogus. Publishing is de volgorde waarin je wijzigingen in die ZIP zet.

Waarom de bewerking niets deed

marketplace_connectors/<slug>/ is the SOURCE

Daar werkt u, niets installeert ervan.

De catalogus bevat een gesigneerde ZIP

Een installatie downloadt die ZIP, controleert de handtekening en uitpakt het. Totdat u de ZIP herbouwd, elke installatie blijft krijgen van het oude pakket.

De Connector Builder publiceert ergens anders

It writes into /connectors/<slug>/ on this install. That is a local connector, not a marketplace release. The two paths do not overlap.

De reeks van de release

1
Bump de versie in TWEE bestanden

instellingen.jsonen connector_contractjson. Conformance vergelijkt ze en faalt als de kogel, de versie of de mogelijkheid set niet mee eens zijn. Voeg een Changelog.md ingang terwijl u er bent is het een vereist bestand.

2
Hersynchroniseren van het brugfragment

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
Elke verpakking opnieuw ondertekenen

php-tools/resign_all_connectors. php

4
Exporteer de ondertekeningssleutel, dan start

De seeder tekent elk pakket als het bouwt de ZIP, en het loopt in een context waar de sleutel niet kan worden gelezen uit instellingen . . Dus moet het afkomstig zijn van de omgeving.

5
Herschikken van het brugbestand, als u een verzenden

Het opnieuw installeren van de connector werkt het pakket bij. Het raakt de kopie niet aan die in de webroot zit van de exploitant. Vertel ze, in het paneel en in de changelog.

De hele release, in volgorde
# 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
⚠️
Waarom de export niet optioneel is: de signer zoekt naar de sleutel in OPSIQ_CONNECTOR_SIGNING_KEY eerst en de connector_signing_key instelling tweede. De seeder draait op de SaaS bootstrap en gereedschappen/sign_connector. php boots helemaal niets, dus in beide instellingen bestaat lezers niet met geen omgeving variabele er is geen sleutel, en je krijgt "Geen ondertekeningssleutel beschikbaar" of elk pakket gerapporteerd als signeer_failed. Alleen hulpmiddelen/resign_all_connectors. phP boots OpsIQ en kan de sleutel zelf vinden.

Wat eigenlijk schepen

Alleen bestanden van de handtekening covers

De ZIP is opgebouwd uit de eigen bestandslijst van de afzender, zodat een verdwaald bestand in uw pakketmap niet wordt verzonden. Dat is opzettelijk: een ongetekend bestand dat gebruikt wordt om mee te rijden naar klanten.

Bedekte uitbreidingen

php,jsonJs,css, md, txthtml, sh, svg, png, jpg, jpeg, gif, webp, ico, yml, ymal ..onverwijld, inclusief brug/ en tests /. handtekening.jsonzelf is uitgesloten van de hashes en vervolgens toegevoegd aan de ZIP, zodat installs kunnen verifiëren.

Iets anders wordt gerapporteerd als niet_verpakt

De seeder noemt elk bestand dat het achterliet. Lees die lijst. Een bestand dat u verwachtte te verzenden verschijnen er betekent een verkeerde extensie of een verkeerde locatie

Het bewerken van een bestand dat bedekt is breekt de zegel

Inclusief een bestand met aftekeningen.

Vereiste bestanden in een distribueerbaar pakket

connector.php

Moet een instantie van ConnectorInterface teruggeven.

settings.json

Manifest: naakt, naam, versie, manifest_versie, compatibiliteit, mogelijkheden, connector_contract_version, instellingen.

connector_contract.json

Machineleesbaar contract. De naakt-, versie- en vermogensset moet identiek zijn aan de instellingen._json.

README. md, DEVELOPER. mD, ChangelLOG. mde

Alle drie worden gecontroleerd op bestaan EN minimale grootte. DEVELOPER. md heeft echte inhoud, geen strookje nodig.

Een bestand per opgegeven mogelijkheid

Elke mogelijkheid namen het bestand dat het verwacht . . ContextProvider. php voor context, IdentityProvider. phP voor identiteit, GuestLookupProvidor. phps voor gast_lookup, en ga zo maar door .

Niets dat op een geloofsovertuiging lijkt.

De overeenstemming scant de drie Markdown-bestanden op geheime waarden en private sleutels, en faalt bij een hit.

Controleer het voordat je het verstuurt.

De volledige conformance suite is dezelfde als een installatie draait. Het controleert het manifest tegen de canonieke contract, dat runtime en manifeste mogelijkheden overeenkomen, dat elke opgegeven capaciteit heeft zijn bestand en methoden, de identiteit-getoken contract in elk mining bestand, de brug-snippet match, gast-lookup allowlist hygiëne, actie uniciteit en bevestiging veiligheid, en de handtekening van het pakket.

Alle vier draaien voor elke release
# 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
💡
Een fout is verwacht en geen probleem: de ondertekening van het pakket controleert een waarschuwing terwijl u nog bezig bent met bewerken. Het maakt het moment dat u opnieuw tekent, vrij. Elke andere storing is echt.
Connectoren

Referentie connectorpakket en levenscyclus

Dit is het basiscontract voor de bouw van een connector die OpsIQ kan ontdekken, configureren, valideren, inschakelen, uitvoeren, testen, ondertekenen en distribueren.

Referentie ontwikkelaar
KoppelingspakketEen connector pakket heeft een vereiste implementatie en manifest, met optionele acties, recepten, kennis, activa en handtekening metagegevens.KoppelingspakketdeveloperMANIFESTv1LEVENDE CYCLUSBeheerdWERKSPANKToepassingsgebiedLEVENDE WERKSPACE-ZICHTconnector.phpConnectorklasse / fabriekVereistsettings.jsonSchema voor het overzicht en de instellingenVereistactions.jsonActiedefinitiesFacultatiefsignature.jsonMetadata voor pakketondertekeningLoslaten1DECLAREManifest en capaciteiten2IMPLEMENTLevenscyclus en aanbieders3VALIDAATTest, teken, pakket
Een connector pakket heeft een vereiste implementatie en manifest, met optionele acties, recepten, kennis, activa en handtekening metagegevens.

Minimumpakket

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

Manifest-contract

settings.json maakt gebruik van manifeste versie 1. De validator verwacht een naakt, naam, versie, manifest_versie, compatibiliteit, beschrijving en mogelijkheden. Compatibiliteit verklaart opsiq_min en opsiq_max. Release status is een van productie, beta, voorbeeld of template; de capaciteitsvolwassenheid gebruikt niveaus L1

Kernconnectorinterface

  • Identiteit en opzet: slug(), name(), description(), capabilities(), settingsSchema(), testConnection().
  • Levenscyclus: onEnable() en onDisable(). Uitschakelen moet niet-destructief zijn; gegevenszuivering is een afzonderlijke doelbewuste operatie.
  • Inkomende/sync: handleWebhook(), poll(), backfill(). Poll behandelt incrementele werkzaamheden; backfill importgeschiedenis en moet veilig te herhalen zijn.
  • Steun: pushReply() waar het platform antwoorden accepteert.
  • Acties: registerActions() levert uitvoerbare contracten voor acties.
  • Beveiliging: securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

De abstracte basis biedt ook optionele chucked backfill, klantlijst, e-mailaccount ontdekking/creatie, abonnees, admin / klant detectie, facturatie/context / identiteit providers, reactie extractie, opnieuw proberen van HTTP gesprekken, JSON-path toegang, fuzzy rangschikking en pagination helpers.

Mogelijkheden en authenticatie

Ondersteunde vermogensnamen omvatten acties, triggers, context, identiteit, verkoop, facturatie, inbound_ticket, uitgaande_reply, sync_users, synch_departementen, security_events, customer_import, seclection_native_block, promo_audience, proma_feed, email_mailbox, native_api, ai_brain_aware en ai_ticets. De bouwer biedt API sleutel, drager, basis, HMAC;OAuth 2cliëntgegevens;OAuth 2autorisatiecode en aangepaste authenticatiesjablonen.

Levenscyclus register

  1. Ontdekking laadt het pakket en valideert zijn manifest.
  2. De configuratie wordt per werkblad opgeslagen; geheimen worden versleuteld.
  3. Verbindingstest bewijst dat de connector niet in staat is.
  4. Aanroepen inschakelen onEnable(), synchroniseert actie definities en kan de initiële backfill starten.
  5. Polling/webhook/subscriber uitvoering draagt altijd werkruimte context.
  6. Oproepen uitschakelen onDisable() en stopt de activiteit zonder geïmporteerde gegevens te verwijderen.
  7. Zuiveren is een aparte expliciete bewerking.

Correctheidsregels

  • Gebruik de werkruimte/site sleutel in elke lees, schrijf, cachesleutel, deduplicatiesleutel en webhook lookup.
  • Maak backfill, webhook inname en schrijf acties idempotent. Neem een externe ID/event-ID op waar het platform er ook maar één biedt.
  • Voor remote systemen, gebruik hun API; ga er nooit van uit dat hun database tabellen bestaan in de OpsIQ verbinding.
  • Retour gestructureerde, klantveilige fouten. Nooit bloot geheimen, ruwe provider sporen of een andere werkruimte .
  • Geef alleen mogelijkheden aan die het pakket daadwerkelijk implementeert. actions.json catalogus maakt een actie niet bruikbaar totdat de connector is geïnstalleerd, ingeschakeld, geconfigureerd en de verbinding geldig is.

Testen en vrijlaten

Start PHP plint, manifeste validatie, verbinding testen, actie schema tests, webhook handtekening / replay testen, werkruimte-isolatie testen, backfill-herhaaltesten, disabled-connector testen en falen/terugval testen. Een marktplaats pakket moet dan worden ondertekend en geverifieerd, inclusief setup / permissions / web-hook documentatie, en de ware release status te vermelden. De connector tile en manifest zijn het gezaghebbende beschikbaarheid signaal.

Connectoren

Connectorrecepten

Stap-voor-stap recepten voor gemeenschappelijke connector opstellingen.

Recepten
Connector-receptA Shopify setup recept als een checklist: maak app, geef scopes, plak token en test, laat webhooks, plaats een test order.Connector-receptShopify_Recept · Shopify met webhooksEen aangepaste app aanmaken in Shopify adminSubsidie-omvang: lees_orders, lees_klanten...Plakken opslag domein + token, klik TestWebhook-synchronisatie inschakelen (automatisch registreren van bestellingen)Plaats een test order → verschijnt in Sales in 30s1STEP BY STEPKopiëren-plakken recepten2REAL PLATFORMSShopify · WHMCS · Stripe· GBP3VERIFYTestvolgorde toont in 30s
Elk recept is een checklist die je bovenaan tot onderaan volgt, hier Shopify met real-time order webhooks, geverifieerd door een testorder.

Recept: Shopify met real-time webhooks

Scenario:
Doelstelling: Verbinden Shopify met automatische ordersynchronisatie en GDPR naleving.
Wat te doen:

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.

Recept: WHMCS integratie

Scenario:
Doelstelling: Sluit WHMCS zodat AI klanten, diensten, tickets en facturen kan opzoeken.
Wat te doen:

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.

Recept: Stripe betalingen

Scenario:
Doelstelling: Track Stripe betalingen en laat AI transacties opzoeken.
Wat te doen:

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.

Recept: Google Business Profile

Scenario:
Doelstelling: Verbind GBP voor review management, berichten en inzichten.
Wat te doen:

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.

Connectoren

Uitbreiding van de CRM & Site Intelligence

OpsIQ Subsystemen zijn open voor uitbreiding. Een connector kan een nieuwe mogelijkheid aansluiten op de CRM of Site Intelligence zonder wijzigingen aan OpsIQ kern, via het platformcapaciteitsregister (\OpsIQ\Platform\CapabilityRegistry). Geef de mogelijkheid aan, implementeer zijn kleine methode set, verschepen van de connector,OpsIQ ontdekt het en draden in de UI, de Klant 360 tijdlijn en de installatieprompts.

CRM & SI uitbreiden
PlatformmogelijkhedenEen connector op de linker voedingscapaciteit bussen (CRM, Site Intelligence, Analytics) ontdekt door de CapabilityRegistry.PlatformmogelijkhedenwerkbladUw connectordeclareert mogelijkhedenCRMkalender · verrijking · esign · betalingen · mailboxSite Intelligence (SITE)lokale_lijst · rang_gegevensAnalyseweb_analytics · rapport & innameCapabilityRegistryontdekt het & draden van de UI + tijdlijn1DECLAREMogelijkheden, geen kernbewerkingen2PLUG INCRM · SI · Analytics bussen3AUTO-WIREDUI, tijdlijn, prompts
Een connector verklaart capaciteiten (kalender, verrijking, ranggegevens, analyse...) enOpsIQautomatisch bedraad ze in CRM en Site Intelligence, geen kernveranderingen.

Aangeven van mogelijkheden

Aangevend (instellingen._json)

Toevoegen aan <domain>_capabilities array, het beste voor no-code/marketplace aansluitingen. Domein: crm, site_intelligence.

In code (connector. php)

Uitvoeren crmCapabilities() / siCapabilities() dezelfde descriptoren teruggeven.

Declareer een CRM agendaprovider (instellingen.json)

Scenario:
Doelstelling: maak een kalenderconnector in het CRM-schema-meetingpaneel.
Wat te doen:

"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]

Een Site Intelligence provider (instellingen) aangeven.json)

Scenario:
Doelstelling: gegevens van lokale lijsten in Site Intelligence invoeren.
Wat te doen:

"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]

Krachtbussen en het oppervlak van de methode

crm / agenda

createEvent($settings,$params) → {succes,event_id,html_link,meet_link}; listEvents; freeBusy. Gedreven door \OpsIQ\CRM\CalendarBridge.

crm/verrijking

enrich($settings,$params) → {succes, traits}. Gedreven door \OpsIQ\CRM\EnrichmentBridge (wordt ook automatisch uitgevoerd op het aanmaken van een bedrijf wanneer een provider is aangesloten).

CRM / eSign

sendForSignature($settings,$params) → {succes, envelope_id,sign_url}. Gedreven door \OpsIQ\CRM\EsignBridge.

site_intelligentie / local_listing

listLocations, listReviews, getInsights. Schepen via de Google Business Profile-connector.

site_intelligence / rang_data

keywordRanks($settings,$params) → {succes,ranks}. Gedreven door \OpsIQ\SiteIntelligence\RankDataBridge. Schepen: SerpApi-connector.

analytics / web_analytices

report($settings,$params) (synchronisatie/export) + ingest($settings,$events) (import). Gedreven door OpsIQ\Analytics\WebAnalyticsBridge. Schepen: Google Analytics (GA4) aansluiting. Gegevens API voor rapporten, Meetprotocol voor import. Analytics is open voor connectors zoals CRM + Site Intelligence (domein) analytics / analytics_capabilities).

betalingen / betaling_provider

listPayments, customerPayments, createPaymentLink. Gedreven door \OpsIQ\Betalingen\BetalenBridge. Toon de betalingen van een klant op de CRM-tijdlijn + stuur een betalinglink naar een transactie. Schepen: Stripe Payments connector. Domein payments / payments_capabilities.

mailbox / e-mail_sync

listMessages + sendMessage. Gedreven door OpsIQ\Mailbox\MmailboxBridge. E-mails van een klant op de Klant 360 tijdlijn + stuur e-mail van een deal. Schepen: Gmail + Outlook/Microsoft 365 connectors. Domein mailbox / mailbox_capabilities.

Gedeelde OAuth -app + EEN redirect

Alle Google-connectoren delen ONE app via \OpsIQ\OAuth\SharedGoogleApp. set google_oauth_client_id/_secret eenmaal en Agenda, Analytics, Business Profile + Gmail alle werk (de per-connector "(optioneel)" velden zijn overrides). Ze delen ook ONE redirect URI; <site>/connectors.php?oauth=callback (geen per-connector kogel), omdat Google blootstelt geen API URI's omleiden naar een app; OpsIQ herstelt de connector van het ondertekende OAuth state nonce. Registreer die enkele URI één keer en elke Google-connector (present + toekomst) machtigt zonder verdere console setup. SharedGoogleApp::resolve(...)’s redirect_uri van uw oauthParams(); nooit hard-code een per-slug redirect. Microsoft connectors doen hetzelfde via \OpsIQ\OAuth\SharedMicrosoftApp (microsoft_oauth_*).

Importknoppen zijn mogelijk-geagated

De Importeren (historische backfill) en Importklanten knoppen tonen ALLEEN voor aansluitingen die ze daadwerkelijk implementeren, gedetecteerd door reflectie, dus er is geen vlag om aan te geven. Override backfill() of backfillChunk() om de importknop te verdienen; overschrijven listCustomers() (retour {email, voornaam, ...} pagina's) om klanten importeren te verdienen. Erf de AbstractConnector no-op en de knop blijft verborgen, zodat de UI nooit een import-connector kan uitvoeren.

AI over bussen

De CRM agent stelt voor en boekt vergaderingen off-deal signalen (\OpsIQ\CRM\MeetingProposer → AgendaBridge), en auto-verrijkt nieuwe rekeningen, de

Opzoeken van tickets voor klantenchat (fetchTicket())

Twee-tier, geen kernveranderingen

Wanneer een bezoeker verwijst naar een ticketnummer in de client chat ("wat is de status van T-000123?"), OpsIQ lost het op in twee niveaus. Niveau 1 leest de gedeelde OpsIQ ticket store, elke connector met inbound_ticket spiegelt zijn tickets daar, dus gesynchroniseerde kaartjes werken voor ALL-connectors met nul per aansluiting code. Niveau 2 is een live fallback voor oude tickets die nooit gespiegeld zijn: core calls an OPTIONAL fetchTicket() op elke ingeschakelde connector die het implementeert. Het is duck-typed (ontdekt door method_exists(), zoals contextProviders()/audienceCatalog()), dus de ondertekende ConnectorInterface is onaangeroerd en connectors die het niet nodig hebben (email/chat bronnen die tickets maken native) gewoon weglaten.

⚠️
Eigendom is verplicht en de jouwe moet worden afgedwongen. fetchTicket() ontvangt de identiteit van de verified bezoeker in $ctx (client_id + client_email, dezelfde geverifieerde identiteit die de klantchat AI gebruikt). Oplossen van de platformklant uit die identiteit en vraag alleen dat tickets van de klant, dan opnieuw controleren eigendom op het detail record. null op een miss, mismatch of fout, nooit gegevens van een andere klant. Een terugkeer van null Degradeert sierlijk tot "kan dat ticket niet vinden."
connector. php, het fetchTicket() contract (referentie: connectors/whmcs en connectoren/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
    }
}

Hoe het platform het gebruikt

Ontdekking

CapabilityRegistry::providers($domain,$type) geeft providers met geïnstalleerde/ingeschakelde/ready status (bestandssysteem-gebaseerd; DB alleen voor de ingeschakelde vlag).

Selectie

CapabilityRegistry::active($domain,$type) geeft de eerste klaar provider met zijn geladen connector en instellingen. Bruggen noemen dit in plaats van hardcoding nagels.

Bericht-tot-installatie

Waar een functie nog geen verbinding heeft, toont de UI een one-click Connect/Install prompt, nooit een dode control.

Volledige gids

Zie connectors/PLATFORM_CONNECTORS.md (CRM + Site Intelligence) en connectors/CRM_CONNECTORS.md in het pakket.

Connectoren

Customer self-service lookups & refunds (bouw uw connector voor customer chat)

Ingelogde klanten kunnen de klantchat AI vragen over hun OWN-account ("mijn saldo," "mijn bestellingen," "medehelp mijn ticket beantwoorden") en, als het bedrijf dit toelaat, terugbetaling aanvragen. Alles wordt aangedreven door verklaringen van uw connector: geen OpsIQ kernwijzigingen, geen platform hardcoding. De AI roept uw opzoekingen aan als native hulpmiddelen (het kan er niet een uitvinden), identiteit is vergrendelde serverzijde naar de geverifieerde klant, en resultaten worden automatisch gesnoeid voor de AI.

Een klant opzoeken

In uw actions.json, een alleen-lezen actie wordt klant-aanroepbaar met alle drie: "scope":"client", "requires_confirmation":false, "is_destructive":falseGebruik "scope":"both" wanneer dezelfde opzoeking ook door uw team in de Admin AI moet worden aangeroepen. De volledige woordenschat is admin, client, both en system (system bereikt geen van beide AI API en webhook routes alleen). Iets anders wordt zonder meer afgewezen: pakketvalidatie mislukt en de actie niet installeren. Er is geen writing scope — the Writing assistant is served the admin Actie ingesteld.

De identiteitsregel (verplicht)

Noem uw identiteitsparameter uit de standaard set. Vergrendeld op het geverifieerde numerieke id: client_id, clientid, customer_id, user_id, userid, account_id. Aangesloten als een tekenreeks: client_identifier, customer_identifier, account_identifier. Aangesloten op de geverifieerde e-mail: email, client_email, customer_email, user_email. OpsIQ vergrendelt en automatisch vult het van de door platformverifieerde ingelogde klant; de AI ziet of kiest nooit identiteit. Een niet-standaardnaam faalt gesloten (geweigerd, nooit gelekt).

Wat moet alleen admin blijven

Alles wat niet door die identiteit wordt bestreken: fetch-by-bare-id (order_id/ticket_id alleen), store-brede lijsten, gratis tekst zoeken. Dat zijn cross-customer lekken op elk platform. "scope":"admin".

Resultaatvorming (antwoord-dragende toetsen)

De resultaten van het opzoeken worden structureel gesnoeid voordat ze de AI bereiken: geheime sleutels vallen uit, lange strings en lijsten zijn afgetopt, lege velden worden gesnipperd, en een platte kaart breder dan de key cap houdt haar antwoordende sleutels eerst, geld (credit, balance, amount, total, due, paid), identiteit (email, *name, phone, company), toestand (status, active, expir*, renew*), data, plan/product/domein/dienst/abonnement/order/factuur/ticketvelden, valuta, nummers en stats/summary/totals, voordat er nog stoelen naar andere sleutels gaan kleinste-waarde-eerste. Praktische begeleiding: noem uw velden met die standaard woordenschat en geef de velden terug die beantwoorden aan de vraag van de klant in plaats van een ruwe 100-key platform dump; een veld dat buiten het woordenboek wordt genoemd strijdt om de overgebleven zitplaatsen en kan worden gekort uit zeer brede lading.

Terugbetaling · wat uw connector biedt

Twee ruwe bewerkingen, beleidsvrij: (1) een betaling-verificatie gelezen filterbaar op identiteit EN een transactiereferentie (uw API moet AND de filters), bijvoorbeeld. whmcs_get_transactions; (2) een terugbetaling uitvoeren actie (scope:"admin", requires_confirmation:true, is_destructive:true, nooit blootgesteld aan klanten), bijvoorbeeld whmcs_refund_order. Het bedrijf kiest beide sleutels in Instellingen → Client Chat; OpsIQ herverifieert de betaalserver-kant, past het beleid van het bedrijf (bedrag cap, leeftijd venster, maandelijkse limiet), problemen binnen de doos en bestanden een beoordeling ticket voor al het andere.

No-code bouwer

De actie-editor van de Connector Builder heeft dezelfde knoppen: stel "Wie kan het gebruiken" in bij Getekende klanten, laat beide schrijfvaakjes uit en gebruik een standaard naam van identiteitsparameter.

Referentie-implementaties

De "Klant Zelf-Dienst" vermeldingen in connectors/whmcs/actions.json, woocommerce/actions.json, oscommerce/actions.json; volledige overeenkomst in connectors/README.md §8.1 andere_8.2 en ConnectorInterface::registerActions().

Connectoren

Gasten opzoeken

Hotels, koeriers en vele handelsplatformen dienen klanten die een referentie hebben maar geen login: een gast met een boekingsbevestiging, een ontvanger met een trackingnummer. guest_lookup vermogen (Connector Contract, modus: gegenereerd) laat UW connector die bezoekers in de klantchat AI bedienenOpsIQkernwijzigingen, geen platform hardcoding. Uw connector verklaart WAT het recht bewijst en WELKE velden zichtbaar zijn;OpsIQDat dwingt de schakelaars, het gaspedaal en het uniform te ontkennen.

Het vertrouwensmodel

Referentie + bewijs, nooit identiteit

De bezoeker levert de recordreferentie (gematcht met het regex dat u verklaart) plus het bewijs dat u kiest . Normaal gesproken de e-mail op het record. Uw fetch actie haalt de record SERVER-SIDE op referentie; OpsIQ's gegenereerde provider vergelijkt het bewijs met de FETCHED record. De input van de bezoeker is nooit vertrouwd, en er wordt geen geverifieerd identiteit gemaakt: de wedstrijd geeft de bezoekster recht op die ene record staat toe te geven velden, niets anders.

Uniforme weigering (geen opsommingsorakel)

Niet gevonden en proof-mismatch produceren een identiek antwoord. De AI wordt expliciet geïnstrueerd nooit te bevestigen of er een referentie bestaat en nooit om recordgegevens uit te vinden. Pogingen zijn beperkt per gesprek + IP door kern voordat uw connector ooit wordt geraadpleegd.

Dubbele opt-in, beide standaard UIT

Niets serveert gasten totdat het bedrijf mogelijk maakt BOTH switches: de werkruimte-brede controle in Instellingen→Beveiliging→"Gast record opzoeken in client chat" (toestemming-geganeerd EN altijd wachtwoord bevestigd, zelfs als de optie stap-up is uitgeschakeld), en uw connector's eigen guest_lookup_enabled instellingen schakelen. Installeren of inschakelen van een connector alleen opent nooit het gastoppervlak.

Het toegewijde gastoppervlak

De gegenereerde provider registers op de guest contextoppervlak admin en customer. Bestaande context providers worden nooit geraadpleegd voor anonieme bezoekers, en de gast provider wordt nooit geraadpleegd bij ingelogde degenen. De ctx die het ontvangt draagt het chatbericht, de draad id en de bezoeker's beweerde (ongeverifieerde) pre-chat email als een bewijs kandidaat

Het in de bouwer verklaren

1
Definieer de ophaalactie

Op de actie stap, voeg een alleen-lezen actie die terug één record door zijn referentie (bijv. GET /bookings/{booking_number}) en map de response velden met aliassen: status, aankomst, vertrek, room_type, customer_email...

2
Tik op "Gast zoeken"

Op de mogelijkheid stap, inschakelen guest_lookup. Een speciaal paneel verschijnt: kies de fetch actie, naam van de referentie parameter, geef het referentie patroon (een regex lichaam zoals \bBK-[0-9]{4,10}\b), naam van het record ("boeken"), en kies de bewijs

3
De zichtbare velden toestaan

Kies precies de velden die een gast kan zien. Al het andere is DROPPED

4
Publiceren en inschakelen

De bouwer zendt GuestLookupProvider.php De canonische geharde implementatie, identiek voor elk gegenereerd pakket .. en voegt de guest_lookup_enabled schakel de instellingen van uw connector in. De business bewapent de twee switches en het chat-AI begint met opzoeken wanneer een bezoeker vraagt naar uw recordtype.

Contractregels

Alleen statusvormige velden

Denk "wat zou een koerier afdrukken op de publieke volgpagina": status, datums, kamer of dienst categorie, telt. Namen, contactgegevens, straatadressen, betalingsgegevens en gratis tekst notities hebben geen plaats in een anonieme chat

De AI antwoordt ALLEEN uit het blok

De gegenereerde provider eindigt zijn uitvoer met een instructie om alleen te antwoorden vanuit de vermelde velden en om een ticket voor iets anders aan te bieden. Detail niet in de allowlist is "niet beschikbaar in chat"

Follow-ups blijven werken

De provider her-derives de referentie van de bezoeker recente berichten in hetzelfde gesprek, dus "en wanneer is check-out?" werkt zonder het opnieuw typen van de verwijzing. De bijbehorende referentie en bewijs e-mail worden herinnerd op de chat-thread als CANDIDATES, dus follow-ups niet opnieuw vragen. Ze zijn alleen kandidaten: elke keer nog steeds opnieuw fetches de recordserver-side en opnieuw vergelijkt het bewijs voordat een enkel veld vrij te geven.

Handgeauthoriseerde pakketten

Een marktpakket kan zijn eigen schip GuestLookupProvider.php implementing ContextProviderInterface met surfaces(): ['guest']Volg het gegenereerde contract van de template precies . . fetch door referentie, proof-match server-side, uniforme deny, allowlist-only output en declareer guest_lookup in capabilities. De overeenstemming controleert het gastoppervlak en scant de allowlist voor PII.

💡
Gasten opzoeken zijn alleen-lezen context voor de chat AI. Ze nooit acties uitvoeren, nooit identiteiten creëren en nooit ontgrendelen van de klant selfservice actie pad boven
Connectoren

Promotiepubliek gericht (promo_audiëntie)

Laat de Promotion Studio doel campagnes door LIVE client en facturatie staat van uw platform: "heeft een onbetaalde factuur," "bestelling in behandeling", "abonnement geannuleerd." Elke connector (voorgeïnstalleerd, marktplaats, of iemand die u zelf bouwt) voegt zich bij het implementeren van twee kleine methoden. Nee OpsIQ kernwijzigingen, geen platform hardcoding: uw connecter verschijnt als een platform in de studio Targeting tabblad met zijn eigen dropdown van feiten, en verschillende connectors kunnen worden ingeschakeld naast elkaar.

Promopubliek
Doelgroep van de promotieEen geverifieerde identiteit doorgegeven aan een connector publiekVlaggen noemen het produceren van feiten die een targeting regel, met een niet-gesloten noot.Doelgroep van de promotiewerkbladAangemeldgeverifieerde identiteitpubliekVlaggen()uw connectorLITOUWENunpaid_invoices = 2REGELonbetaalde_facturen ≥ 1Campagneprogramma'sFout: onbekende client of een fout → de campagne blijft verborgen.1TWO METHODSpubliekCatalog + Vlaggen2LIVE STATEOnbetaalde, hangende status3FAIL-SAFENooit aan iemand anders laten zien.
Uw connector antwoordt live factuur feiten voor de ingelogde bezoeker; de studio doelen op hen, en mislukt gesloten dus een facturatie aanbod nooit bereikt de verkeerde persoon.

Hoe het werkt

1
Geef uw feiten op.

Implementeer publiekCatalog() op uw connectorklasse. Het geeft een label terug en de lijst met sleutels die uw platform kan beantwoorden. Elke sleutel verschijnt in de studio dropdown onder uw naam platform.

2
Antwoord voor één cliënt

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
Klaar

Activeer de connector. Het Promotion Studio Targeting-tabblad groeit een "Client & billing"-sectie met daarin uw platform; admins bouwregels zoals "unpaid_invoices >= 1"; elk feit wordt ook een personalisatie variabele zoals {unpaid_invoices}.

connector. php, het volledige promo_audiëntiecontract
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'],
    ];
}

Contractregels

Adverteren van de mogelijkheid

Toevoegen 'promo_audience' naar uw stekker capabilities() array zodat het platform en de markt te noemen als publiek-geschikt (ontdekking werkt ook van methode aanwezigheid, maar verklaren is het schone signaal). connectors/whmcs connector is de volledige referentie implementatie.

Sleutelnaam

Slangenkoffer met kleine letters 2-60 tekens, overeenkomende met ^[a-z0-9_]+$. Types: getal, tekst, bool. Onopgegeven sleutels die door het publiek worden teruggegevenVlaggen() zijn nog steeds bruikbaar in regels, maar verklaren alles wat u ondersteunt zodat beheerders het kunnen zien.

Identiteit wordt geverifieerd

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.

Fout bij sluiten · altijd

Bij elke fout (API down, client not found, timeout) return []. Een regel waarvan het feit ontbreekt laat de campagne NIET zien. Een door facturen gerichte popup mag nooit de verkeerde persoon bereiken; OpsIQ Dat staat ook in de regelmatcher.

Prestaties

publiekVlaggen() wordt maximaal eenmaal per connector per paginaweergave opgeroepen, en ALLEEN wanneer een gepubliceerde campagne daadwerkelijk de regels van uw platform gebruikt. Anonieme bezoekers kosten u nul oproepen. Houd het aan 1-2 API oproepen; OpsIQ memo's binnen het verzoek.

Gratis ter beschikking gestelde exploitanten

Beheerders combineren je sleutels met =, !=, >, <=, <, > bevat, is ingesteld, leeg, alleen leveringswaarde.

Personalisatietekens

Elk feit verdubbelt als variabele in campagnekopie: {unpaid_invoices}, {client_status}, plus de ingebouwde {first_name} en {client_email}. Waarden worden gesanctioneerd voordat ze worden weergegeven.

Geen-code marktconnectoren

Automatische feiten

Declaratief (JSON-only) marketplace connectors krijgen promo_audiëntie voor gratis: als uw connector verklaart klanten/gebruikers, facturen, bestellingen of abonnementen middelen, OpsIQ afgeleid van customer_status, onbetaalde_invoices, amount_due, noting_orders, active_subscriptions en abonnement_status uit uw bestaande zoekacties. Geen enkele code.

Aangepaste catalogus (instellingen_json)

Voeg een publiek_capaciteitsobject · {"label": "Mijn Platform," "sleutels": [{"toets": "open_carts," "label":"Open carts,""type": "nummer"}} toe om precies te bepalen welke feiten (en labels) in de studio-uitval verschijnen.

Uw provider testen

1
De connector inschakelen

Connectoren > uw connector > Inschakelen. Open dan het tabblad Targeting van elke campagne. Uw platform moet verschijnen onder "Client & billing (connectors) ."

2
Een regel bouwen

Voeg toe: Uw platform · een sleutel · >= · 1 en stel "Alleen aangemeld clients" in. Opslaan en publiceren.

3
Beide richtingen controleren

Log in op uw platform als een client die voldoet aan de regel (poppoep moet tonen) en als iemand die niet (popop moet verborgen blijven). Aangemelde bezoekers nooit overeenkomen met ingelogde regels.

Vuur een campagne uit uw eigen code (custom trigger)

Waarom

Naast de ingebouwde triggers (vertraging, scroll, exit-intent, inactief, klik, pagina's bekeken, chat / ticket activiteit), kunt u een campagne van overal in uw site of connector front-end te starten, na een succesvolle afreken stap, wanneer een winkelwagen wordt verlaten, als je SPA verandert route, enz.

Hoe

Zet de actie-starter op Aangepast met een evenementnaam (bv. checkout_failed), dan bel de globale hook van uw pagina:

uw site / connector front-end JS
// Any campaign whose Custom trigger event matches will be evaluated
// (it still respects targeting, frequency caps and audience rules).
window.OpsIQPromo && window.OpsIQPromo.fire('checkout_failed');
💡
Het afvuren van een evenement nooit voorbij doelwitten of frequentie. Het alleen releases de
De volledige how-to-use gids (ontwerpen, blokken, analyses, A/B, publiceren) woont in het In-app Help Center onder Aanmelden → Promotie Studio. De mogelijkheid hier wordt automatisch ontdekt van elke ENABED-connector in connectors/of marketmarket_connectors /. Er is niets te registreren. Verschepen de twee methoden, en de studio doet de rest.
Connectoren

Survey-connectorcapaciteit (Contract 2.2)

De survey vermogen laat elk platform geverifieerde klantidentiteit adapters, publiek feiten, veilige variabelen en de ontvanger kandidaten voor Survey Studio leveren. Het is onafhankelijk van promo_audience en geeft geen connector eigendom van enquêtes, antwoorden, analyses of e-maillevering.

💡
Implementatiestatus. Auteur is vandaag compleet en bruikbaar: Connectorcontract 2.2, SurveyConnectorInterface, het speciale bouwpaneel, gegenereerd SurveyProvider.php, pakketmetadata en conformiteit isolatie van alle schepen. Verbruik is nog niet bedraad: SurveyConnectorRegistry wordt geïmplementeerd en getest, maar geen enquête runtime roept het nog niet, zodat provider gezondheid is niet opgedoken in de admin UI en geen gepubliceerde connector pakket verklaart de mogelijkheid. Getekend-token Survey Identity Gateway uitgifte, targeting en variabele integratie, CRM Outreach materialisatie en de eerste verzonden provider mappings blijven aparte fasen. Bouw nu tegen dit contract; verwacht dat de looptijd om te beginnen consumeren in een latere release.

Verantwoording van de aanbieder

Publiekscatalogus en feiten

Getypte canonieke feiten aangeven en waarden alleen oplossen voor een server-verified, werkruimtegebonden onderwerp. Typische feiten zijn order_count, last_order_status, craned_order/counter, customer_created_at, active_subscription_court, past_due_invoice_count en open_ticket_courn.

Variabele catalogus en waarden

Geef klant, account, bestelling, abonnement en ondersteuning variabelen met type, gevoeligheid en toegestane context. Survey kopie vereist terugval en output-context ontsnappen.

Ontvangers

Optioneel kandidaten voor CRM Outreach opsommen met stabiele externe ID's, begrensde pagina's en deterministische cursors en toestemmingsgerelateerde metagegevens. De enquête bevriest het gekozen publiek vóór elke verzending.

Identiteit

Accepteer identiteit alleen van de enquête Identiteit Gateway na token handtekening, vervaldatum, doel, connector en werkruimte verificatie. Browser-toegewezen e-mail, ID, tags of factuur feiten zijn nooit gezaghebbend.

Gezondheid tijdens de vlucht

SurveyConnectorRegistry is ontworpen om compatibele, geblokkeerde en niet-beschikbaar providers te rapporteren zonder instellingen, paden, ruwe identiteiten of uitzonderingsberichten bloot te stellen, en een geblokkeerde provider kan nooit worden aangeroepen. Het rapportageoppervlak wordt nog niet blootgesteld in de admin UI: vandaag is een geblokkeerd provider gewoon inert.

Fout afgesloten regels

Onopgegeven sleutels, verkeerde types, oversized waarden, niet-afgeronde onderwerpen, timeouts van de connector en onbekende identiteiten worden afgewezen. Een targetingregel die een onbeschikbaar feit nodig heeft komt niet overeen met deze. Ontvangerpagina's zijn afgetopt en gecontroleerd. Gevoelige waarden verschijnen nooit in publieke preview of logs.

Bouwer-ontgrendelpoort

Contract 2.2 verscheept de mogelijkheid register vermelding, interface, enquête mapping panel, gegenereerd SurveyProvider.php, vermogen versie, README / developer referentie en conformance armaturen. Handel, helpdesk, SaaS-brug en lokale PHP profielen omvatten; Standaard API De statische poort wijst een Survey provider af die een Promotion namespace, tabel of mogelijkheid aanroept.

💡
Kopie van Promotie is alleen import-only: de Bouwer kan compatibele Promotion mappings vertalen eenmaal, sla een volledige Survey-eigendom kopie en record herkomst. Verwijderen of wijzigen van de Promoties mapping mag niet veranderen enquête gedrag.
Connectoren

Reageer feedbackvermogen (contract) 2.2)

De reply_feedback vermogen spiegelt de eigen per-reply ratings van een platform naar OpsIQ. Een ster een klant geeft een staf antwoord binnen WHMCS's client gebied landt op het SAMES antwoord in de OpsIQ admin thread, met dezelfde chip, agent credit, Feedback pagina en Team & Performance berekening als een rating gegeven op een OpsIQ Een opslagruimte, een chip en één pijplijn.

Het pad dat geschreven wordt

Er zijn precies twee toegangspaden en één waarheid. OpsIQ portal tickets schrijven naar eigen zeggen. Platform ticket flow door de connector, en core landt elk evenement via ReplyFeedback::recordMirrored(): dezelfde kolommen, alleen-personeel regel, one-rating-per-reply laatste-wint semantiek, werkruimte stempel en Voice of Customer indexing the portal write uses. Een connector schrijft nooit feedback rijen zelf.

Configureren (vier bestanden, dan opnieuw ondertekenen)

1
connector_contract.json

Voeg de mogelijkheden.reply_feedback-item toe: versie 1.0, the ReplyFeedbackConnectorInterface, methods repliekFeebackCatalog and pullReplyFiedback, impliceert inbound_ticket.

2
settings.json

Antwoord_feedback toevoegen aan de lijst met mogelijkheden. Dit is wat connector-ontdekking leest.

3
spec.json

Geef antwoord_feedback. modes (poll en/of webhook) aan en de waarderingsschaal van het platform. Dit is wat de conformance gate leest.

4
Runtime klasse

Implementeer de interface, list reply_feedback in mogelijkheden(), dan herteken het pakket.

Verantwoording van de aanbieder

Catalogus

Declareer modi, de eigen ratingschaal van het platform (de kern normaliseert naar de native 1-5), en eventuele reactietekens. De catalogus moet akkoord gaan met specificaties.json.

Vertaling trekken

pullReplyFeedback geeft canonieke gebeurtenissen terug: platform ticket id, platform antwoord id, rating, optionele reactie/commentaar, ingediend tijd en een stabiele event_id. Het leest en vertaalt. Het schrijft nooit.

Idempotentie

event_id is stabiel per feedback STATE, dus een opnieuw afgespeelde gebeurtenis is een no-op en een gewijzigde rating overschrijft (laatste wint, zoals de portal).

Cursordiscipline

Pagina's zijn begrensd en deterministisch; een cursor die niet vooruit loopt eindigt het punt. Historische backfill afvoert als een rolraam, nooit één reus trekt.

Veiligheid van de sonde

Geef zonder configuratie een lege pagina terug in plaats van te gooien. De conformance runner-sondes met lege argumenten.

Afgesloten resolutie

Core lost elke gebeurtenis op naar een lokaal antwoord door de spiegelmarkering dat de kaartspiegel al stempelt (<slug>:<ticket>:reply:<reply>). Een gebeurtenis die niet kan worden opgelost wordt gedropt, nooit geraden; feedback houdt alleen vast aan antwoorden van medewerkers; en agent credit komt altijd van de bestaande auteur van het antwoord. De rating schrijven verandert nooit auteursschap. Dit is waarom de mogelijkheid vereist inbound_ticket of ticket_mirror.

Werkvoorbeeld: WHMCS

WHMCS slaat per antwoord de rating van een cliënt-gebied op in tblticketreplies.rating. De WHMCS connector verklaart poll mode met a 1-5 schaal, ticket_reply_ratings relais commando in zijn bridge bestand, en vertaalt elke rij naar een gebeurtenis waarvan de id's overeenkomen met het whmcs:<ticket>:reply:<reply> markeert zijn ticketspiegel al. Na het upgraden van de connector, kopieer je het brugbestand naar de WHMCS -server zodat het nieuwe commando daar bestaat.

💡
Volledige ontwikkelaar contract met de interface, gebeurtenisvormen, normalisatieregels en de conformance checklist: doc/contracts/TICKET_REPLY_FEEDBACK_CAPABILITY.md in de OpsIQ Aanvaarding: beoordeel een antwoord binnen het platform, wacht op de peiling per uur en hetzelfde antwoord in OpsIQ toont de chip, de Feedback pagina geeft het aan en een opnieuw afgespeelde gebeurtenis verandert niets.
Connectoren

Ticket merge-vermogen (Contract 2.4)

De ticket_merge de mogelijkheid maakt een ticket merge in OpsIQ een merge op elk verbonden ticket platform. Het bewaarde platform ticket ontvangt de samengevoegde tickets' berichten, te beginnen met het openen van elke samengevoegde kaart bericht, in plaats van het samengevoegde platformticket alleen wordt gesloten.

Waarom het bestaat

Een merge in OpsIQ verplaatst elk bericht van de samengevoegde tickets in het bewaarde tickey en verwijdert de samengevoegden ticket 2.4 een enkel gehoorde connector ticket.deleted voor elk samengevoegd ticket. WHMCS gesloten dat ticket en de bewaarde WHMCS ticket nooit ontvangen wat de klant eerst schreef: het onderwerp toonde [MERGED] en de inhoud ontbrak.

Wat kern stuurt

ticket. merged (eenmaal per merge)

ticket_id, ticket_number, onderwerp en external_ref van het KEPT-ticket; native_table (opsiq_tickets); site_key; bronnen, de samengevoegde tickets eerst, elk met ticket_id, ticket_number, onderwerp, external_ref, client_name, client_email, created_at en berichten [{reply_id, author_type, author_name, created_at, lichaam}]; merged_by; merged_at. Berichten zijn het klant-zichtbare gesprek, vastgelegd voordat de verhuizing. Interne notities worden nooit opgenomen.

ticket. deleted (per samengevoegde ticket)

Nog steeds vuurt, nu met merged_into {ticket_id, ticket_number, external_ref}. Core levert het niet aan een connector die verklaart ticket_merge; andere consumenten kunnen een fusie onderscheiden van een verwijdering.

Uitgaande webhooks

ticket.merged is een deliverable event. Een SaaS webhook endpoint geabonneerd op tickets.deleted ontvangt ook ticket, merged, dus een integratie gebouwd voor 2.4 hoort de samenvoeging.

Wat uw connector doet

Aangeven

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.

Inheems samenvoegen als je kunt

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.

Anders een privé-notitie toevoegen

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.

Rapporteren wat niet is samengevoegd

Geef {ok, mode, samengevoegde, opgemerkt, niet-merged, fout} terug. Elke samengevoegde kopie die je niet kon samenvoegen gaat in unmergeed en kern past de normale verwijderingsbehandeling (sluiten of verwijderen met mirror_deletes) toe op precies deze. Retourmodus wordt alleen niet ondersteund wanneer het platform geen merge heeft en geen privénotitie. Een transport of authfout is ok=valse met de reden; het wordt geregistreerd in Diagnostics.

Eer je toggles

Dezelfde spiegelinstellingen die je andere ticket spiegelpoort samenvoegen.

Samenvoegt die op uw platform beginnen

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.

Uitvoeringen verzonden

WHMCS_

MergeTicket (ticketid = bewaard ticket, mergeticketIDs = samengevoegde tickets) wanneer beide in WHMCS; AddTicketNote met het transcript anders. De TicketMerge-haak van de relais combineert de OpsIQ kopieert wanneer notenbalk samenvoegt WHMCS.

Zendesk

POST /api/v2/tickets/{id}/merge.json met privé merge commentaar (tot vijf tickets per oproep), plus het transcript als een prive-commentaar op de bewaarde ticket, omdat Zendesk sluit samengevoegde tickets zonder hun opmerkingen te verplaatsen.

OpsIQ SaaS brug

POST /v1/tickets/{id}/merge met source_ids, die de portal antwoorden en bijlagen verplaatst; een intern antwoord draagt het transcript voor tickets die nooit op het portaal. A /manage merge voegt de OpsIQ Kopieën.

Connector Bouwer

ticket_merge is afgeleid, nooit aangevinkt: een gegenereerd pakket verklaart het wanneer het het platform ticket dat het maakt (een ticket.created abonnee met link ticket op), behandelt tickets.deleted, of declareert ticket_mirror. Op de Tickets stap, onder Samenvoegen, kies de merge-actie van het platform (kaart samenvoegen.target_remote_id, en merge.source_remote_ids of merge.source_remote_id) en een privé-notitie (kaart notitie.remote_id en note.body). De gegenereerde mergeTickets() gebruikt beide. Met geen van beide waarschuwt de Builder dat de berichten van een samengevoegd ticket het platform niet zullen bereiken.

💡
Volledig contract: doc/contracts/CONNECTOR_CONTRACT.md, sectie Ticket mergets. Acceptatie: voeg twee tickets samen in OpsIQ die beide op het platform bestaan en open dan de bewaarde ticket op het perron. Het eerste bericht van het samengevoegde tickeet is er.
Connectoren

Marktplaats connector

Met de Marketplace kunt u connectors ontdekken, installeren en publiceren die door de gemeenschap zijn gebouwd.

Markt
Marktplaats connectorEen doorzoekbaar raster van community connector kaarten met categorieën, installeren knoppen en sterren ratings.Marktplaats connectorwerkbladZoekverbindingen...KalendlyPlanningInstalleren★ 4.8HubSpotCRMInstalleren★ 4.6MailchimpE-mailInstalleren★ 4.7QuickBooksBoekhoudingInstalleren★ 4.5TwilioSMSInstalleren★ 4.9NotieDocumentenInstalleren★ 4.41DISCOVERCommunautaire aansluitingen2INSTALLEén klik3PUBLISHUw tekst ondertekenen
Blader door community connectors, installeer met één klik of teken en publiceer uw eigen, vooraf geïnstalleerde en marktniveau's zowel zoekbaar.

Verbindingen vinden en installeren

1
Bladeren

Ga naar Connectors > Marketplace. Zoek op naam, categorie of platform.

2
Evaluatie

Controleer de beschrijving, ondersteunde acties en ratings.

3
Installeren

Klik op installeren. Het connectorpakket downloadt en installeert naar marketplace_connectors/.

4
Instellen

Inschakelen in Connectors, invoeren API referenties, en test.

Een connector publiceren

1
Bouwen en testen

Gebruik de Connector Builder. Controleer alle acties werken.

2
Verpakking

Profiel genereren.json, acties.json, kennis.json, en PHP-bestanden.

3
Ondertekenen

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
Verzenden

Upload door de markt inzending stroom voor herziening.

Twee aansluitniveaus

connectoren/

De runtime ontdekkingswortel. Alles hier is live: de verbindingen die met OpsIQ_ verschepen, alles wat geïnstalleerd wordt vanaf de marktplaats en alles wat de Connector Builder publiceert op deze installatie.

marketplace_connectors/

De uitgeverij BRON voor first-party marketplace pakketten. Het is geen ontdekkingswortel: niets hier is live totdat het verpakt, ondertekend, in de catalogus geplaatst en geïnstalleerd, op welk punt een kopie landt in connectors /.

💡
Kijk op beide plaatsen. Een pakket dat je hebt geschreven onder marketplace_connectors/ is niet de kopie die draait • het installeren van kopieën ervan in connectoren /, en alleen dat exemplaar wordt ontdekt tijdens de uitvoering.StripeBigCommerce, Magento2, PrestaShop, OpenCart, Amazon SES, Postmark en Resend zijn alle marktpakketten: installeer er een voordat u verwacht het te vinden in Connectors.
Ontwikkelaar

API en webhook bouwer

De API en Webhook Builder kunt u aangepaste API eindpunten en webhook luisteraars binnen OpsIQ zonder rauwe PHP te schrijven.

API _bouwer
API en webhook bouwerEen bouwer die een triggertype (inbound webhook, schema, gebeurtenis, handleiding) kiest dat in een configureerbare actie wordt ingevoerd.API & webhook bouwerwerkbladTRIGGERInkomende webhookSchema (cron)OpsIQ _-gebeurtenisHandleidingActieKaart inkomende velden →tickets maken / notificatie / aanroep APIEindpunt opslaan1TRIGGERSWebhook · schema · event · handleiding2NO RAW PHPIngebouwd in de UI3ACTIEKaartvelden, dan uitvoeren
Bouw eindpunten zonder ruwe PHP: kies een trigger (inkomende webhook, schema, gebeurtenis of handleiding), dan kaart velden naar een actie.

Triggers

Gebeurtenis

Rennen als er iets gebeurt. OpsIQ, of wanneer een extern systeem een bijpassende gebeurtenis plaatst op uw webhook URL. Typ de evenementnaam, bijvoorbeeld ticket.created.

Schema

Gebruik een van de ingebouwde interval gebeurtenissen als de gebeurtenis naam: cron. minutely, cron ourly or cron! daily. Het Acties and Triggers scherm heeft knoppen voor deze, dus je hoeft ze niet te onthouden.

Woorden

Voer uit wanneer een beheerder de AI vraagt om het in gewone taal. Voeg de zin toe die moet overeenkomen, bijvoorbeeld vinden klant.

Inkomende webhook

Een extern systeem stuurt een HTTP POST naar uw OpsIQ webhook URL Elke trigger die luistert naar dat vuurtje.

Alleen soms uitvoeren: voorwaarden

Een gebeurtenis trigger kan omstandigheden dragen, dus het draait alleen wanneer de binnenkomende gegevens overeenkomen. Zonder voorwaarden loopt het elke keer als het evenement brandt.

Veld

Een pad naar de gebeurtenisgegevens. Gebruik een punt voor geneste waarden, bijvoorbeeld customer. email.

Alle of geen overeenkomst

Kies of elke regel moet overeenkomen, of slechts één van hen.

Teksttests

gelijk is aan, niet gelijk is, bevat, bevat geen, begint met, is een van, is er niet één van. Matchen negeert hoofdletters.

Aantal tests

De cijfers die als tekst zijn geschreven, vergelijken nog steeds correct.

Aanwezigheidstests

is aanwezig, ontbreekt, leeg is, niet leeg.

Pagina alleen de oproep ingenieur voor dringende tickets

Scenario:
Event ticket. created, met één regel: prioriteit is gelijk aan dringend.
Wat te doen:

De actie loopt voor dringende tickets en wordt overgeslagen voor al het andere. Geen filter nodig aan uw kant.

💡
Als je de regels leeg laat loopt de trigger op elke overeenkomende gebeurtenis, dat is hetzelfde gedrag als voorheen voorwaarden bestonden.

Acties

Webhaak versturen

Stuur HTTP POST naar een externe URL met een aangepaste lading.

Ticket aanmaken

Maak een support ticket met bepaalde afdeling, onderwerp en bericht.

E-mail versturen

Een e-mail versturen met een aangepaste sjabloon.

record bijwerken

Update een klant, ticket of CRM record.

Verbindingsactie uitvoeren

Voer een geregistreerde actie uit van een actieve connector met de toestemming en bevestigingsregels voor de aansluiting.

Uitvoeren OpsIQ Algemeen API actie

Zoek de volledige General API catalogus. Velden, scopes, machtigingen, bevestiging, idempotentie en dry-run ondersteuning komen uit het live actie contract; de workflow voert binnen zijn opgeslagen werkruimte en beheerder context.

Verzend provider-native API verzoek

Een connector gebruiken API Inheems lezen of bevestigen API Schrijf actie wanneer het eindpunt van de provider geen gecureerde actie heeft. Er zijn nog steeds gegevens binnen de connector en alleen relatieve provider paden worden geaccepteerd.

De Acties & Triggers bouwer, /api/v1.php, OpenAPI en Postman gebruiken dezelfde ActieContractRegistry, dus een selecteerbare actie kan niet uit de runtime documentatie drijven.
Ontwikkelaar

Triggers kookboek

Recepten voor gemeenschappelijke automatiseringsbewerkingen die klaar zijn om te worden gebruikt.

Hoe het werkt
Triggers kookboekEen receptstroom: een uptime. down webhook passeert een productiefilter, dan fans uit om een dringend ticket te maken en melden Slack.uptime.downWebhook monitorenindienfilterMaak een dringend ticket aanLicht Slack #ops in
Triggers kookboek

Automatisch ticket aanmaken vanaf monitoring

Scenario:
Monitoring systeem stuurt POST wanneer de server uitvalt.
Wat te doen:

Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket · Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent

Slack notificatie op grote bestellingen

Scenario:
Slack-bericht elke keer als een klant een bestelling plaatst over $100.
Wat te doen:

Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details

Wekelijkse verteerbare e-mail

Scenario:
Samenvatting e-mail naar het management elke maandag om 9 uur.
Wat te doen:

Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API

Roltraps oude tickets

Scenario:
Als een ticket geen antwoord heeft voor 24 uren, wijs dan aan teamleider.
Wat te doen:

Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note

Ontwikkelaar

Bouwen van uw eerste actie

Deze doorloop creëert een eenvoudige connector actie vanaf nul.

Bouwwerkzaamheden
Een actie opbouwenEen actie-definitie formulier: name lookup_order, een GET verzoek aan /orders/{id}, een getypte id parameter en een passerende 200 test.Nieuwe actiewerkbladNieuwe actieNaamlookup_orderVerzoekGET/orders/{id}Parametersid · tekenreeks200 · bestelling gevonden1DEFINENaam, methode en eindpunt2PARAMSGetypte invoer3TESTLive 200 resultaat
Bouw één actie vanaf nul. Noem het, stel de methode en eindpunt in, verklaar getypte params en test het tot een levende 200.

Twee soorten acties

Voor u begint, bepaal welke u nodig heeft. Beide zijn in hetzelfde scherm geconfigureerd.

Een externe oproepen API

De actie stuurt een HTTP-verzoek naar uw platform. Kies dit wanneer OpsIQ iets aan uw zijde moet doen.

Een connectoractie uitvoeren

De actie draait iets wat een geïnstalleerde connector al biedt. Kies dit wanneer het werk reeds beschikbaar is en je wilt het alleen maar laten triggeren. Je kiest de connectieactie uit een lijst, dus er valt niets te bedraden.

De tweede optie is hoe je alles wat je connectoren al kunnen doen zonder dat het opnieuw bouwen: lees een ticket draad, zoek op een klant, import contactpersonen, enzovoort. Kies de actie van de aansluiting uit de dropdown en u klaar bent.
1
Plan de actie

Voorbeeld: "lookup_product." Zoek een product op naam, retourprijs, voorraad en beschrijving.

2
Definieer in acties._json

De actiedefinitie toevoegen:

acties._json
{
  "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" }
      ]
    }
  ]
}
⚠️
Drie dingen die een actie niet registreren. action_id is vereist en moet worden2tot100lettertekens van kleine letters, cijfers en onderstrepingen Een ingang zonder een wordt volledig afgewezen. Het manifest is een object met een "acties" LIST, geen kaart gesleuteld door actienaam. En respons mapping is "returns" met DOTTED paden (data.id), niet JSONPath ($.datas.id) Er is geen "respons_mapping," "methode," "endpoint" of "params" sleutel overal in het register.
3
Test met droogloop

Druk in de Connector Builder's Review stap op Dry run. Het draait de volledige conformance checklist tegen uw pakket en, wanneer u referenties hebt geleverd, maakt een echte verbinding test. Het gebruikt geen steekproefgegevens.

4
AI-gebruik verifiëren

Vraag admin AI: "Look up product Widget Pro." De AI moet vinden en uitvoeren van de actie.

⚠️
Een actie toevoegen aan acties.jsonmaakt NIET een AJAX-route aan, dus er valt niets te regenereren. Connectoracties worden gesynchroniseerd inOpsIQwanneer de connector is ingeschakeld of zijn instellingen worden opgeslagen: re-save the connection and the new action comes.tools/gen_route_registry.php heeft betrekking op de admin AJAX verzending en heeft geen invloed op de acties van de link.
Ontwikkelaar

Inbound-voorvaleindpunten

Inkomende eindpunten accepteren getekend JSON van een ander systeem en veranderen het in gededupliceerde contactactiviteit die tijdlijnen, scoren en workflows kan voeden.

Productscherm
Inkomende eindpuntenElke inkomende bron heeft zijn eigen URL, geheim, mapping en recente activiteit resultaat.Inkomende eindpuntenwerkbladBRONEN5ACCEPTED12.4kREJECTED18LEVENDE WERKSPACE-ZICHTFactureringsplatformabonnementsevenementenGezondProductappaanmelden en gebruiken van evenementenGezondGebeurtenis-IDprovider_event_idDeduplicatieHandtekeningX-OpsIQ-Inbound-SignatureHMAC1CREATE SOURCEURL en geheim2MAP PAYLOADE-mail, gebeurtenis en ID3VERIFYHMAC vervolgens in te nemen
Elke inkomende bron heeft zijn eigen URL, geheim, mapping en recente activiteit resultaat.

Maak één bron per verzendsysteem. OpsIQ genereert a URL Verzenden /token en geheim JSON met Content-Type: application/json en teken de exacte ruwe lichaam met behulp van HMAC-SHA256:

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

Kaart JSON paden voor de contact e-mail, evenementnaam en optioneel gebeurtenis-ID. De event ID is de voorkeursdeduplicatie sleutel. Geaccepteerde activiteit komt in de contact tijdlijn en kan invloed hebben op lead scoren, segmenten, levenscyclus regels en workflows.

Ongeldige handtekeningen weigeren voordat u bedrijfsgegevens ontleedt. Een geheim roteren door beide zijden te updaten in een gecontroleerd venster; het geheim niet loggen.

Ontwikkelaar

Uitvoeren webhook-bewerkingen

Outbound webhook administratie creëert ondertekende abonnementen, test eindpunten en bewaakt asynchrone levering en opnieuw proberen gezondheid.

Productscherm
Uitgaande webhooksDe uitgaande webhook pagina bevat HTTPS eindpunten, event abonnementen, levering gezondheid en een one-click ondertekende test.Uitgaande webhookswerkbladENDPOINTS7SUCCESS99.2%RETERRIËNTIE4LEVENDE WERKSPACE-ZICHTCRM-spiegelContact* en deal.*GezondOndersteuningsbusticket.* en chat.*GezondGegevensopslag*HerproberenTestleveringOndertekende lading van het monsterKlaar1SUBSCRIBEHTTPS URL en gebeurtenissen2AUTHENTICATEHMAC-ondertekening3OBSERVELevering spoor en retrieges
De uitgaande webhook pagina bevat HTTPS eindpunten, event abonnementen, levering gezondheid en een one-click ondertekende test.

Volledige beheerders maken een HTTPS eindpunt, kies specifieke gebeurtenissen of de wildcard, bewaar het geheim veilig en stuur een test. OpsIQ tekent de ruwe lading met HMAC-SHA256:

X-OpsIQ-Signature: sha256=<hex hmac>

Controleer de handtekening voordat u deserialiseert of handelt. Levering wordt asynchrone en automatisch na ongeveer 1minuut, 5 minuten, 30 minuten,2uren en 12 uren. Gebruik de recente levering spoor om status, respons code en poging tellen te inspecteren.

Uw ontvanger moet idempotent zijn omdat elk asynchroon systeem opnieuw kan leveren. Geef een 2xx respons pas na duurzame acceptatie terug.

Ontwikkelaar

Webhooks

Webhooks laten externe systemen waarschuwen OpsIQ als er iets gebeurt (inkomende), en laat OpsIQ meld externe systemen wanneer er iets intern gebeurt (uitgaande).

Webhooks
Uitgaande webhooksHet uitgaande webhooks scherm: een endpoints tabel met naam, geabonneerde gebeurtenissen, recente levering status punten, en een Send-test knop.Uitgaande webhookswerkbladEindpunten+ Eindpunt opslaanNAAMGEBEURTENISSENBEZORGINGENSlack #sales-alerts - Nieuwsbriefhttps://hooks.slack.com/…crm. deal. won, orderTestCRM-spiegelhttps://api.acme.com/hookcontact*, ticket. createdTestZapierCity in Italyhttps://hooks.zapier.com/…chat.startedTest1ENDPOINTSNaam, gebeurtenissen URL2SIGNEDHMAC + automatisch opnieuw in gebruik genomen3SEND TESTVerifiëren van leveringen
Het echte scherm van uitgaande webhooks: elk eindpunt met zijn gebeurtenissen, recente levering gezondheid en een één-klik Send test, ondertekend en opnieuw geprobeerd.

Uitgaande webhooks

Abonneren

Ga naar Instellingen > Webhooks. Voeg een eindpunt URL toe en selecteer gebeurtenissen die je moet ontvangen.

Gebeurtenissen

Abonneren op specifieke evenementen, of ["*"] voor alles. De volledige lijst van uw installatie is hieronder, en webhooks.events.list geeft het terug als JSON.

Opnieuw proberen

Foute leveringen opnieuw proberen met exponentiële backoff. Na 15 opeenvolgende storingen, het eindpunt is auto-disabled.

Ondertekening

Elke levering is ondertekend. X-OpsIQ-Signature carries v2=<hex>, en de getekende string is version.timestamp.delivery_id.body Niet alleen het lichaam. Controleer altijd, en herbouw de string precies. Zie onderstaande voorbeelden.

SSRF-bescherming

OpsIQ zal niet naar privé/intern verzenden IPs (127.x 10.x 172.16.x 192.168.x 169.254.169.254).

Async-levering

Webhooks worden geleverd via de wachtrij, niet blokkeren OpsIQ operaties.

Stabiele gebeurtenis-ID

Elk evenement heeft een unieke event_id die hetzelfde blijft over retrieves voor deduplicatie.

Wat er bij elke levering aankomt

X-OpsIQ-Event

De naam van de gebeurtenis, bijvoorbeeld ticket.created.

X-OpsIQ-Delivery

De levering id. Het blijft hetzelfde over retrieves

X-OpsIQ-Timestamp

Weiger iets ouder dan vijf minuten.

X-OpsIQ-Signature

De ondertekening als v2=<hex>. Splits op de =: de linkerkant is de versie, de rechterkant is het getal dat je vergelijkt.

X-OpsIQ-Signature-Version

De regeling die momenteel wordt toegepast v2Lees het uit de header in plaats van hard-coderen, en uw code blijft werken als er ooit een v3 wordt toegevoegd.

⚠️
De tekenreeks is version.timestamp.delivery_id.body, niet het ruwe lichaam op zijn eigen. Het hebben van alleen het lichaam is de enige meest voorkomende reden dat een verificatie mislukt . . Elke echte levering wordt afgewezen en het eindpunt ziet er gebroken.

Controleren van een levering

PHP · controleren van een 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 · controleren een 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 });
});

Elke gebeurtenis die deze installatie kan versturen

Generated from the running build, dus het komt altijd overeen met de versie die je gebruikt.

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 geeft deze lijst terug als JSON, dus je code hoeft het nooit hard te programmeren.

analyse (1)

analytics.anomaly

Fired by PHASE_ANOMALY_ALERTS when a daily KPI (sessions, pageviews, conversions, revenue) deviates from its same-weekday 4-week baseline beyond the configured threshold. Payload: day (required), title, site_key, anomalies.

handel (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.

betaling (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.

beveiliging (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.

ticket (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.

Hoe test ik webhooks lokaal?+

Gebruik ngrok om uw lokale server bloot te stellen. Stel het webhook eindpunt in op uw ngrock URL.

Wat als mijn eindpunt tijdelijk is gedaald?+

OpsIQ Als uw eindpunt binnen het venster opnieuw wordt bekeken, zijn er geen gebeurtenissen verloren gegaan.

Ontwikkelaar

API-sleutels

API sleutels authenticeren verzoeken aan de OpsIQ REST API. Elke sleutel heeft permissies met reikwijdte.

API-sleutels
API-sleutelsDe API toetsenscherm: een probleempaneel met toegangsniveau en scope chips, naast een lijst van bestaande gemaskerde sleutels met intrekknoppen.API-sleutelswerkbladEen sleutel uitgevenToegangAlleen lezenBeperktToepassingsgebiedcontacts.readtickets.readevents.writeSleutel van uitgifteUw sleutelsIntegratie van Zapieropq_••••4f2aInstellenMobiele appopq_••••91c7InstellenUitvoer van analyticsopq_••••2db0Instellen1SCOPEDAlleen-lezen of beperken2PER-ACTIONKies exacte scopes3REVOCABLEDraaien wanneer u wilt
Het echte API sleutels scherm: geef een scoped, read-only of beperkt key door het kiezen van exacte scopes, en herroep elke sleutel op elk moment.

Aanmaken van een API sleutel

1
Ga naar instellingen > API Sleutels

Navigeren naar API sleutelbeheer.

2
Klik op sleutel aanmaken

Geef het een beschrijvende naam.

3
Selecteer scopes

Geef de sleutel alleen wat het nodig heeft. Scopes komen in lees-en schrijf paren per gebied, zodat een rapportage integratie kan worden toegestaan leest en niets anders.

Beschikbare gebieden

Kies de smalste set die het werk doet. admin voldoet aan elk toepassingsgebied hieronder, dus gebruik het alleen wanneer u echt behoefte heeft aan brede toegang.

crm. read / crm

Contacten, bedrijven, deals, activiteiten, segmenten, reikwijdte, conversies, lifecycle en CRM webhooks.

tickets. read / ticket. write

Lijst en lees tickets en hun berichten; antwoord, update, open en voer bulk wachtrij operaties.

conversations. read / conversaties. write

Lees live-chatgesprekken en berichtengeschiedenis; verzend berichten, wijs status toe en wijzig status.

kb. read / kb . write

Kennisbasis ingangen.

chat. read / chat

Opgeslagen antwoordsjablonen.

connectors.read

Kijk welke connectoren zijn geïnstalleerd, wat ze kunnen doen en test hun referenties.

automations.read

Zie je acties, triggers en hun loopgeschiedenis.

departments.read

Afdelingen beschikbaar voor routering.

notifications.read

Kennisgevingen voor een genoemde exploitant.

analytics.read

Rapporten, CSV uitvoer en definities van het geplande rapport.

site_intelligence.read

Bewaakte sites en hun SEO rapporten.

files.read

Ondertekende download links voor bijlagen.

status.write

Status pagina onderdelen en incidenten.

schrijven

AI-schrijvers: ontwerp, samenvatting, vertalen, herschrijven, componeren, analyseren.

admin

Alles, inclusief een klein aantal gevoelige acties die bewust niet bereikbaar zijn door een enge reikwijdte: het wissen van contact, wijzigen van privacy-instellingen, en lezen van de toegang log.

💡
Bel meta. actions met uw sleutel om precies te zien welke acties het kan uitvoeren op uw installatie. Dat is altijd betrouwbaarder dan werken vanuit een lijst.

Toegangsniveaus

Alles

De sleutel kan alles wat de reikwijdte toelaat noemen.

Alleen lezen

Elk schrijven wordt geweigerd, wat de scopes ook zeggen. De veiligste keuze voor rapportage, dashboards en alles dat nooit gegevens mag veranderen.

Beperkt

Je geeft een lijst van de acties die je kunt oproepen.

4
De sleutel kopiëren

Eenmaal getoond. Begint met "opq_." Bewaar het veilig.

🚫
Nooit delen API sleutels in publieke code, client-side JavaScript Gebruik omgevingsvariabelen.
Ontwikkelaar

Verbind uw website

De OpsIQ widget is a JavaScript snippet die u toevoegt aan uw website voor het volgen, AI chat, ticket creatie en klantidentificatie.

Hoe het werkt
Verbind uw websiteEen one-line scripttag aan de linkerkant en, rechts, een webpagina met de OpsIQ chatbel verschijnen in de hoek.<!-- paste before </body> --><script src="https://cdn.opsiq.io/w.js" data-site="ws_8a2f" async></script>
Verbind uw website

Basisinstallatie

Basis widget knipsel
<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.

Configuratie-attributen

data-site-key

Vereist. Uw site sleutel van Connected Sites.

data-mode

Optioneel. "chat" (standaard), "tickets," of "beide."

data-position

Facultatief. "rechts onder" (standaard) of "linksonder."

data-color

Optioneel. Primaire kleur vloek code.

data-greeting

Facultatief. Eerste begroetingsbericht.

data-language

Optioneel. UI taal: "en," "es," "fr," "de", "pt," "ar," enz.

data-identity-token

Optioneel. Server-gegenereerde ondertekend identiteitsteken.

Steun voor het SPA

Handmatige SPA routetracking
// 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,
}]);

CSP-regels

CSP-regels voor widget
script-src 'self' https://your-opsiq-domain.com;
connect-src 'self' https://your-opsiq-domain.com;
frame-src https://your-opsiq-domain.com;
Vertraagt het widget mijn website?+

Nee. Onder 15 KB gzipped laadt async na pagina-inhoud.

Kan ik het uiterlijk aanpassen?+

Gebruik data-kleur voor primaire kleur. Contact ondersteuning voor CSS overschrijven opties.

Ontwikkelaar

Widget-installeert recepten

Platformspecifieke installatiehandleidingen.

Hoe het werkt
Widget-installeert receptenPlatform install kaarten voor WordPress, Shopify en Google Tag Manager, elk zeggen waar de widget toe te voegen.WPWordPressInstalleer de plugin, voer inuw site sleutel, opslaan.WinkelShopify_Plak het knipsel inthema. liquid voor /body.GTMTag-beheerAangepast HTML _-tag, alle pagina's.
Recepten installeren

WordPress

Scenario:
Voeg toe aan alle pagina's van een WordPress site.
Wat te doen:

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_

Scenario:
Voeg toe aan uw Shopify Winkel.
Wat te doen:

Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.

Reageren / Next. js

Scenario:
Voeg toe aan een react of Next. js app.
Wat te doen:

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_

Scenario:
Voeg toe aan uw WHMCS client gebied.
Wat te doen:

Instellen > Algemene instellingen > Andere > Globale voettekst. Plakken het knipsel of bewerken van uw sjabloonvoettekst. tpl.

Google Tag Manager

Scenario:
Voeg toe via GTM.
Wat te doen:

Aangepast HTML tag maken, plak knipsel. Trigger: Alle pagina's. Publiceren.

Ontwikkelaar

Admin widget in uw backend (een contract, elk platform)

Insluiten van de OpsIQ admin assistent . . admin chat, ticket inbox en AI Schrijven .In het beheerpaneel van uw eigen platform, zodat uw team nooit verlaat hun gereedschap. Als bezoeker identiteit en portal SSO, dit is een generiek contract uitgevoerd in ~15 lijnen van de servercode van uw platform . hetzelfde patroon Zendesk, Intercom en spreekwoorden voor SSO. Er is geen per-platform plugin om op te wachten: elke stack die een HMAC Kan dit vandaag doen.

Stap 1 .. de inbedregel

Van Sites op afstand → uw site → Codes, kopieer de lader regel en voeg het toe aan uw admin panel pagina's (voettekst omvatten, layout template of een admin-only aangepaste JS doos):

De one-line inbed
<script async src="https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=SITE_KEY&identity_token=TOKEN_FROM_STEP_2"></script>

Stap 2 — vertel OpsIQ die is ingelogd (server ondertekend)

Alleen UW toepassing weet welke admin is ondertekend in

PHP · teken de identiteit van uw beheerder vanuit uw sessie
<?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.
Toegang per admin, automatisch

Elke beheerder die zich inlogt op uw platform wordt individueel aangepast:OpsIQ's per-admin toegangspoort lost de gebruikersnaam + e-mail van het token op tegen eenOpsIQagent (Team pagina; gebruik de lijst van "match e-mails" van het agent wanneer platform e-mailadressen verschillen) en past dat agent's werkruimte, afdeling en inbox permissies toe. Nieuw medewerker = voeg het agent toe aanOpsIQ; geen wijzigingen insluiten.

Rolletjes rijden mee

Welke rol string uw platform wordt weergegeven op deOpsIQDe Voorzitter. - Aan de orde is het gecombineerd debat overOpsIQAgent record, nooit van de gestelde rol.

Waarom niet onze login cookie lezen?

Browsers sturen nooit uw admin-cookie naar een andere oorsprong . Geen enkele leverancier kan "gewoon" detecteren van uw login cross-domein. Elk serieus product lost dit op dezelfde manier: uw server staat voor, ondertekend. Dat is het hele contract.

Geen gedeelde modus op uw eigen site

Uit de OpsIQ host is er geen ongetekende of gedeelde-login modus: de lader blijft verborgen totdat een getekend admin token aankomt. De waarde van het token=... in de codelader is een widget sleutel die alleen de site identificeert; het kan nooit iemand aanmelden.

De authenticated vlag

Deze vlag is de bewering van uw server dat een mens echt ingelogd is, en OpsIQ weigert elk token zonder. Zet "authenticated" => true beside site_key/iat/expNiet alleen binnenin de admin object. Huidige OpsIQ accepteert het in beide posities, maar oudere releases alleen lezen het bovenste niveau "Aanmelding van admin vereist", wat lijkt op een sessie bug en niet is. Als je precies die splitsing ziet, controleer deze vlag eerst.

Takkenhygiëne

Alleen aanmelden op de server, nooit in browserJavaScript. Houd exp kort (minuten tot uren);OpsIQverwerpt verlopen en toekomstig gedateerde tokens, en de handtekening bindt het token aan uw site sleutel.

Referentie-implementaties

DeWHMCSmodule doet dit automatisch vanuit deWHMCSadmin sessie; het brugbestand van de Botble Hotel-connector doet dit vanuit de Laravel sessie (op=admin_identity). Beide zijn gewoon dit contract in hun dialect ..kopie die het dichtst bij uw stack leest.

Bedrading zonder pagina (aansluit-gedeclareerde sonde)

Wanneer uw OpsIQ connector slaat uw identiteit eindpunt in zijn admin_identity_probe_url instelling, de PLAIN loader lijn is al uw admin pagina's nodig: het widget ontdekt de sonde van de connector, roept het met je site sleutel + widge token, en authenticeert elke admin automatisch. De pagina kan nog steeds overschrijven met een data-identity-endpoint attribuut of window.OpsIQAdminIdentityEndpoint.

💡
Het tekengeheim is voor jou ingevuld. In Remote Sites, uw site, Codes, Optie 3, Log in je medewerkers, elk voorbeeld bevat al het eigen geheim van deze site, dus de code werkt zoals geplakt: er is niets om te kopiëren of configureren. De voorbeelden op deze pagina tonen opsiq_whsec_YOUR_SITE_SECRET Elk voorbeeld zoekt naar OPSIQ_SITE_SECRET (of de eigen instelling van uw framework, genoemd in zijn notities) op de server eerst en gebruikt dat wanneer het is ingesteld, zodat u het geheim kunt verplaatsen uit het bestand wanneer je wilt, bijvoorbeeld om te roteren zonder code bewerken. Hoe dan ook het bestand draait alleen op uw server: nooit plakken in een webpagina of browser JavaScript, en nooit commit het naar een openbare repository, omdat iedereen die het geheim kan aanmelden als een van uw klanten of medewerkers. WHMCS en Botble niets van dit alles nodig hebben: de WHMCS haak komt met het geheim ingevuld, en de Botble Het aansluitpaneel vult het in de brug.

Complete code, platform per platform

Elk voorbeeld drukt de Admin Chat-tag alleen af voor een ingelogd personeelslid, met het ondertekende token toegevoegd en beantwoordt de widget's refresh (?opsiq_identity_refresh=1&role=admin) met {"success":true,"identity_token":"…"} of 401. Externe sites, uw website, codes, optie 3, Teken in uw personeel drukt dezelfde code met uw site sleutel en geheim ingevuld.

⚠️
De admin token is de twee-delige vorm: base64url(payload), een stip, dan de hex HMAC-SHA256 van die basis64url tekst. Het is geen JWT, en een JWT wordt geweigerd. Het admin object heeft id en e-mail nodig, en exp moet binnen 24 Uren.

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>`)
}

Uitvoering van het identiteitseindpunt op Laravel (harde-won noten)

Als uw platform Laravel (Botble, Bagisto, aangepaste apps) is en uw eindpunt is een standalone bestand dat het kader boot om de ingelogde admin te lezen, drie specifieke zal u uren besparen . Elke geproduceerd een echte productie mislukking voordat het werd geleerd:

Bind het verzoek VOOR bootstrap

Uw dienstverleners kunnen oplossen request Laravel's eigen levenscyclus bindt het gevangen verzoek als eerste binnen. Kernel::handle() De volgorde is: $app->instance('request', Request::capture()) VOOR $kernel->bootstrap(), of je krijgt "Targetklasse [verzoek] bestaat niet".

Het sessie-cookie prefix is HMAC-toets

Moderne Laravel prefixeert cookiewaarden met een HMAC berekend MET DE APP-KEY (CookieValuePrefix) Een vlakte sha1(name."v2") Kleed je uit met een CookieValuePrefix::validate($name, $decrypted, $keys), met een structurele terugval (40 hex tekens + | in positie40) Tell: een sessie id langer dan40tekens (81= voorvoegsel nog steeds bevestigd) en een sessie die alleen laadt _token In het.

Waar de login woont

De auth stempel is login_<guard>_<sha1(guard class)> Voor de standaard webguard: 'login_web_' . sha1(Illuminate\Auth\SessionGuard::class). Scan elke login_* Numeriek sleutel als een terugval voor aangepaste bewakers.

Debuggen zoals de brug doet

Schip a debug=1 modus die de falende STAP en uitzondering noemt .Een blind catch-all maakte een live implementatie niet te diagnostiseren. De Botble brug (van v1.0.7) is de referentie: stap markers op kernel/bind/bootstrap/decrypt/session/auth/db.

Laravel · complete identiteit eindpunt (kopie, stel de twee constanten in, klaar)
<?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]);
}

Hetzelfde eindpunt op andere stapels

Alleen de "wie is ingelogd?" regel verandert . Het tekenblok is overal identiek. Teken op de server, nooit in JavaScript_.

WordPress · WHMCS • Symfonie · gewoon PHP
<?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]);

Wanneer het niet werkt . .

Widget verschijnt nooit, volgens de console "Signed admin identiteits token is vereist"

Uw eindpunt gaf geen identity_token. Open het eindpunt URL direct in de ingelogde admin browser met &debug=1 Op Laravel is dit bijna altijd het verzoek-bindend of cookie-prefix item hierboven.

Geschiedenis en gesprekken werken, maar elke chat turn zegt "Aanmelding van admin vereist"

De klassieke split. Uw token mist de TOP-LEVEL authenticated vlag het eigen eindpunt van de widget accepteert het token, de gedeelde verificateur achter de chatstream weigert. Toevoegen "authenticated" => true beside exp.

"admin niet voorzien in OpsIQ" (HTTP 401)

De token geverifieerd, maar de gebruikersnaam + e-mail komt overeen met geen OpsIQ Agent, voeg de agent toe OpsIQ → Team, of voeg de platform e-mail aan die agent match-emails lijst wanneer het verschilt van hun OpsIQ e-mail.

Alles 403s van de browser, maar werkt met krul

Een CORS voorvlucht wijst een van uw verzoekkoppen af. Uw eindpunt moet beantwoorden OPTIONS en echo van de gevraagde oorsprong, of gewoon voorkomen dat aangepaste headers . . het widget alleen heeft het cookie nodig.

Werkte gisteren, faalde vandaag

Ophalen exp: tokens zijn kortlevend door ontwerp. De widget re-sondes automatisch, dus dit betekent meestal dat het eindpunt gestopt is met het zien van de sessie

💡
De admin widget rendert verborgen totdat identiteit is opgelost, en elke chat/inbox/data call wordt afgedwongen server-kant tegen de overeenkomendeOpsIQagent ongeacht wat de pagina beweert. De token ontgrendelt de UI; permissies komen altijd vanOpsIQ.
Ontwikkelaar

Bezoekersidentiteit

Identiteit verbindt anonieme bezoekers met bekende klanten. Wanneer geïdentificeerd, OpsIQ koppelt browsegeschiedenis, chats en tickets aan het klantprofiel.

Hoe het werkt
BezoekersidentiteitEen stroom: een gebruiker logt in op uw site, u geeft een ondertekend identiteitsteken uit en OpsIQ verenigt hun sessies, chats en tickets tot één profiel.Gebruiker logt inop uw siteTekentekenidentiteit_token (HMAC)Eén profielsessions+ chats+ tickets bestellen
Bezoekersidentiteit

Twee niveaus van identiteit, en wanneer elk is genoeg

Niveau 1 — een niet-gesigneerde hint

Vertel het widget wie de bezoeker is met een vlakte.JavaScriptobject. Het vult de e-mail en klant id op het bezoekerslogboek, zodat uw dashboard toont ingelogd verkeer en sessies zich aanmelden. Het is een HINT: iedereen kan bewerken in hun browser, dusOpsIQgeeft nooit accountgegevens over de kracht ervan.

Niveau 2 — een ondertekend identiteitsteken

Uw server tekent een kortstondig token met het site webhook geheim. OpsIQ controleert de handtekening en behandelt deze persoon alleen dan als een bewezen klant. Dit is het niveau dat account antwoorden ontgrendelt in customer chat-en connector lookups. Gebruik het voor alles wat een vreemdeling niet mag zien.

⚠️
Niveau1is een display gemak. Niveau2is authentificatie. Als een vraag alleen kan worden beantwoord voor de echte accounthouder, hebt u Niveau nodig2.
💡
Je hoeft geen niveau te schrijven 2 Met de hand: sites op afstand → uw site → Codes → C. Getekende klanten genereren de ondertekeningscode en de refresh handler voor PHP, WordPressLaravel, Node.js, Python, Django, .NET, Rails, Java en Go WHMCS haak en de Botble connector brug al klanten te ondertekenen. Identiteit zegt wie de klant is; hun bestellingen of boekingen bereiken de chat via een connecter (met een brug bestand alleen wanneer het platform geen API).

Niveau 1 .. de niet-gesigneerde hint

Stel het object in VOOR het widgetscript, of bel Identifier() later nadat uw app weet wie er ingelogd is. Beide formulieren worden gelezen; gebruik welke past op uw pagina.

JavaScript · de twee ondersteunde formulieren
<!-- Form A: set the global before the loader -->
<script>
  window.OpsIQClient = {
    id:    "cust_1001",
    email: "[email protected]",
    name:  "Jane Smith",
    plan:  "pro"
  };
</script>
<script async src="https://YOUR-OPSIQ/widget.php?site_key=YOUR_SITE_KEY"></script>

<!-- Form B: identify later, e.g. after a client-side login -->
<script>
  window.opsiq.identify({
    id:    "cust_1001",
    email: "[email protected]",
    name:  "Jane Smith",
    plan:  "pro"
  });
</script>
⚠️
Only these forms are read: the window.OpsIQClient global, window.opsiqConfig.user, and window.opsiq.identify(). There is no OpsIQ.push(['identify', ...]) queue and no OpsIQClientSignature global — if you find either in an old note, it does nothing.

Niveau 2

Precies hetzelfde token contract als de admin widget, met een customer onderwerp in plaats van een admin één. Teken het op uw server en geef het door aan de widget. Twee details beslissen of het controleert, en beide zijn gemakkelijk om fout te krijgen:

De HMAC heeft betrekking op de BASE64URL-tekenreeks, niet de JSON

Ondertekenen $payload64, niet $payload. Het ondertekenen van de raw JSON produceert een token dat er goed uitziet en wordt afgewezen elke keer met een handtekening mismatch.

base64url, ongewatteerde

Vertalen +/ tot -_ en strip de = Opvulling. Gewoon basis64 overleeft vandaag; base64url is het contract en is wat elke OpsIQ verificateur en referentieconnector uitstraalt.

geauthenticeerd gaat op het TOP-niveau

Naast site_key, iat en exp. Het is uw bewering dat een echt mens ingelogd is, en OpsIQ weigert het token zonder dit.

customer. id is verplicht

Een token met alleen een e-mail controleert als handtekening en wordt dan stil laten vallen. Stuur altijd een id.

Vl/v kort houden

De token is een sessie bewering, geen geloofsovertuiging om op te slaan.

PHP - teken een klantidentiteitsteken (deze exacte code controleert)
<?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>';
🚫
Alleen op de server aanmelden. Een token in browser JavaScript betekent het versturen van de site geheim naar elke bezoeker, die geeft iedereen de mogelijkheid om zich te voordoen als een klant.

Hetzelfde contract, drie vlakken.

Klantchat op uw site

klant subject, doorgegeven als identity_token aan widget. php. Bovenom bestreken. Optioneel: met knipsel A en een connector controleert de chat al klanten zelf (een boeking of bestelnummer met bewijs, of een gemailde code voordat een bestelling). Remote Sites, Codes, C genereert de code voor automatische erkenning van klanten die reeds zijn ingelogd op uw site.

Beheer chat in je backend

admin subject, doorgegeven aan opsiq/embed/admin_widget. php. Zelfde tekenaar, andere onderwerpsleutel. Zie "Admin widget in uw backend"

Ondersteuning portal diepe links

Een strengere variant: dezelfde claims plus jti en single_use:true, en a120- tweede leven, omdat de token reist in eenURLen moet één keer besteedbaar zijn. Niet met de hand rollen. Instellingen, Support Portal heeft een klaar knipsel voor uw taal, en het platform munt het voor u wanneer uw account gebied draait op deze server.

Wat als een bezoeker cookies opruimt?+

Ze worden anoniem totdat ze opnieuw geïdentificeerd zijn. OpsIQ verbindt de nieuwe anonieme record met het klantprofiel zodra een hint of token aankomt.

Waarom controleert mijn token voor de bezoekerslog, maar niet voor accountvragen?+

Dat is het niveau.1/ Niveau2split. Een niet-gesigneerde hint vult het bezoekerslogboek en niets anders. Account antwoorden hebben een geverifieerde handtekening nodig.

Ontwikkelaar

Portaalaanmelding: code voor elk platform

Stuur een klant die al is aangemeld in uw applicatie rechtstreeks naar uw support portal, ingelogd, zonder tweede wachtwoord. Deze pagina legt uit hoe de overdracht werkt, elke claim in het token, de setup en een volledige route voor elk platform. Instellingen, Ondersteuning Portaal drukt dezelfde code af met je eigen portaal adres en werkbladsleutel ingevuld.

Hoe het werkt

1
De klant klikt op Ondersteuning in uw app

De link wijst op een kleine route op uw server, bijvoorbeeld /support-portal. Nooit bij een koppeling die al een token bevat: een tokens in een pagina lekt door de bron van de pagina, browsergeschiedenis en de refererkoptekst.

2
De routecontroles die zijn aangemeld

Het leest de klant van uw eigen sessie. Een bezoeker die niet is aangemeld wordt eerst naar uw login gestuurd en komt daarna terug op de route.

3
De route tekent een eenmalig teken

Een standaard HS256 JWT ondertekend met het signing geheim van dit werkblad, dat alleen uw server in bezit heeft. Het vervalt na 120 seconden en kan eenmalig gebruikt worden.

4
De route leidt naar het portaal

Naar de portalpagina waar de klant vandaan kwam toen het portaal om een (opsiq_portal_return, alleen geaccepteerd binnen uw portaaladres), anders het portaal naar huis. Het antwoord draagt Refererer-Policy: no-referer en Cache-Control: no -store.

5
Het portaal controleert en tekent de klant in

De ondertekening, de werkruimtesleutel, het verstrijken en de eenmalige id worden gecontroleerd. De klant wordt gevonden of gemaakt via e-mail en hun bestaande verzoeken zijn aangepast aan hen.

Het token, claim door vordering

site_key

Uw werkbladsleutel. Een token voor een andere werkplek wordt geweigerd, zelfs als het correct is ondertekend.

iat / exp

Uitgegeven-op en verlopen, in seconden. Het portal token leeft 120 seconden: het hoeft maar één redirect te overleven.

geauthentiseerd: waar

Uw app's verklaring dat het echt ondertekend deze persoon in. Vereist, op de top niveau.

jti + single_use: waar

Een willekeurige id en de eenmalige vlag. Dezelfde link kan niet twee keer gebruikt worden.

platform

Een gratis label voor waar de klant vandaan kwam (php, wordpress, whmcs...). Getoond in het profiel van de klant.

customer. id en customers. email

Beide vereist. De id is het eigen klant-id van uw app; de email is hoe het portal vindt de klant en overeenkomt met hun verzoeken.

klant. naam / external_id

Optionele schermnaam en de id OpsIQ slaat op tegen uw platform.

Instellen

1
Route kopiëren

Instellingen, Ondersteuningsportaal, Naadloze aanmelding van uw app. Kies waar uw applicatie op draait; de code onder de lijst heeft uw portal adres en werkruimte sleutel ingevuld, met genummerde notities voor dat platform.

2
Het geheim staat al in de code.

De gekopieerde route bevat het ondertekeningsgeheim van deze werkruimte, zodat het werkt zoals geplakt. Om het buiten het bestand te houden, ingesteld OPSIQ_SITE_SECRET (of de instelling van uw framework) op de server in plaats daarvan: die waarde wordt eerst gebruikt. Zet nooit de route in een pagina, JavaScript, een mobiele app of een openbare repository: iedereen die het geheim heeft kan zich aanmelden als elke klant.

3
Koppel uw Support-knop aan de route

Bijvoorbeeld https://your-app.com/support-portal.

4
Maak de Aanmeldknop van het portaal gebruik van uw app

Portal Studio, Aanmeldpagina, Gebruik mijn website's login, Uw aanmeldpagina URL: Stel het in op dezelfde route. Het portaal voegt opsiq_portal_return zelf en de route brengt de klant terug naar die pagina, ingelogd.

5
Optioneel: overal uitloggen

Instellingen, Ondersteuningsportaal, Overal uitloggen: de afmeldprocedure van uw app URL, dus het aanmelden bij het portal tekent ook de klant vanuit uw applicatie.

6
Test

Genereer een ondertekende testlink op dezelfde instellingen pagina om alleen de portalzijde te controleren, en open vervolgens uw route terwijl u zich aanmeldt voor uw app.

WHMCS heeft geen code nodig: de WHMCS Hook van Remote Sites tekent al klanten in het portaal en brengt ze terug naar de pagina waar ze op stonden.
💡
Het tekengeheim is voor jou ingevuld. In Instellingen, Ondersteuningsportaal, Naadloze aanmelding van uw app bevat elk voorbeeld al het eigen geheim van deze site, zodat de code werkt zoals geplakt: er is niets te kopiëren of in te stellen. De voorbeelden op deze pagina tonen opsiq_whsec_YOUR_SITE_SECRET Elk voorbeeld zoekt naar OPSIQ_SITE_SECRET (of de eigen instelling van uw framework, genoemd in zijn notities) op de server eerst en gebruikt dat wanneer het is ingesteld, zodat u het geheim kunt verplaatsen uit het bestand wanneer je wilt, bijvoorbeeld om te roteren zonder code bewerken. Hoe dan ook het bestand draait alleen op uw server: nooit plakken in een webpagina of browser JavaScript, en nooit commit het naar een openbare repository, omdat iedereen die het geheim kan aanmelden als een van uw klanten of medewerkers. WHMCS en Botble niets van dit alles nodig hebben: de WHMCS haak komt met het geheim ingevuld, en de Botble Het aansluitpaneel vult het in de brug.

Complete routes, per 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)
}

Als er iets mis is.

Het portaal opent, maar tekent zich af

Het geheim of de werkruimtesleutel komt niet overeen met deze werkruimte, het token is ouder dan 120 seconden (controleer de serverklok), of dezelfde koppeling werd tweemaal geopend. Genereer een ondertekende testlink: als dat werkt, vergelijk je token's beweringen met het voorbeeld.

Het landt altijd op het portaal thuis

Het retouradres was niet in uw portaal adres, dus het werd met opzet genegeerd. Vergelijk het met de Portal URL die getoond wordt in Instellingen.

Gasten krijgen een fout in plaats van uw aanmelding

Vervang /login in de route door uw echte login pagina, en zorg ervoor dat je aanmelding terugkeert naar het opgegeven adres.

Het werkt alleen voor sommige klanten

customer. email of customers. id is leeg voor hen. Beide zijn vereist.

Ontwikkelaar

Klantenchat: herken ingelogde klanten

Optioneel. De meeste sites hebben dit niet nodig: met de gewone chat knipperen en een connector, controleert het chat-systeem klanten zelf, met een boeking of bestelnummer plus bewijs voor opzoeken en een emailcode vóór een bestelling. Voeg dit toe wanneer u wilt dat een klant die al is ingelogd op uw website automatisch wordt herkend, met hun hele rekening. WHMCS doet het reeds door zijn haak. Remote Sites, uw site, Codes, C drukt dezelfde code af met uw site sleutel ingevuld in.

Hoe het werkt

1
Uw pagina drukt de chattag af

Voor een ingelogde klant de widget URL draagt &identity_token=... getekend op uw server; voor een gast is het de gewone tag. Er staat niets geheims in de pagina: alleen een teken dat vervalt.

2
Het gesprek controleert het token

Handtekening, werkbladsleutel en vervaldatum. De klant is dan bekend bij elke chataanvraag, en uw connector kan antwoorden op hun eigen bestellingen, boekingen of facturen.

3
De chat verfrist voordat het uur voorbij is

Het noemt de pagina waar het op staat?opsiq_identity_refresh=1&role=customer. Uw code antwoordt {"success":true,"identity_token":" ..."} terwijl de klant is aangemeld, of 401 met {"succes":false,"login_required":waar} als ze dat niet zijn. Daarom moet de ververser draaien voordat uw pagina iets afdrukt.

Hoe het verschilt van de portal token

Levensduur

Een uur (exp = iat + 3600) in plaats van 120 seconden, omdat het rijdt op elke chat verzoek in plaats van een redirect.

Geen jti of single_use

Hetzelfde token wordt gebruikt voor elk bericht totdat de verfrissing vervangt.

Al het andere is hetzelfde.

site_key, iat, exp, geauthentiseerd: true, platform en klant met een vereiste id en e-mail. Zelfde geheim, zelfde handtekening.

💡
Identiteit zegt WIE de klant is. Hun bestellingen, boekingen of facturen bereiken het gesprek via een connector: één die uw platform aanroept API, of wanneer uw platform geen API, een connector plus het brugbestand (de connectorenbouwer maakt er één).
💡
Het tekengeheim is voor jou ingevuld. In Remote Sites, uw site, Codes, C, elk voorbeeld bevat al het eigen geheim van deze site, zodat de code werkt zoals geplakt: er is niets te kopiëren of configureren. De voorbeelden op deze pagina tonen opsiq_whsec_YOUR_SITE_SECRET Elk voorbeeld zoekt naar OPSIQ_SITE_SECRET (of de eigen instelling van uw framework, genoemd in zijn notities) op de server eerst en gebruikt dat wanneer het is ingesteld, zodat u het geheim kunt verplaatsen uit het bestand wanneer je wilt, bijvoorbeeld om te roteren zonder code bewerken. Hoe dan ook het bestand draait alleen op uw server: nooit plakken in een webpagina of browser JavaScript, en nooit commit het naar een openbare repository, omdat iedereen die het geheim kan aanmelden als een van uw klanten of medewerkers. WHMCS en Botble niets van dit alles nodig hebben: de WHMCS haak komt met het geheim ingevuld, en de Botble Het aansluitpaneel vult het in de brug.

Complete code, platform per 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>`)
}

Als er iets mis is.

De chat behandelt een ingelogde klant als gast

De tag is afgedrukt zonder identity_token (het geheim ontbreekt op de server, dus de code mislukt gesloten), of de sleutel van het token werkblad of geheim komt niet overeen.

Eerst herkend, dan een gast na ongeveer een uur

De refresh handler is niet bereikt: het moet draaien voordat er een uitvoer, op elke pagina waarop de chat verschijnt.

Het gewone gesprek toont twee keer

Verwijder de gewone chattag van uw sjabloon: deze code drukt het gesprek zelf af.

Ontwikkelaar

Plugins en SDK's

OpsIQ levert SDK pakketten en plugins voor gemeenschappelijke platforms.

Hoe het werkt
Plugins en SDK'sVier pakketten: PHP SDK, Node.js SDK, WordPress plugin WHMCS module, elk met zijn installatie commando.PHPPHP SDKcomponist vereist opsiq/sdkJSNode. js SDKnpm i @opsiq/sdkWPWordPress pluginEen-klik installeren & verbindenWWWHMCS moduleAdon voor facturering + ticket relais
Plugins & SDK's
PHP SDK

Componistpakket: identiteitsteken generatie, actie API helpers, webhook handtekening verificatie.

JavaScript SDK

Browser-side: tracking, identiteit, aangepaste gebeurtenissen, chat control.

WordPress plugin

Widget injectie, identiteit van WP gebruikerssessies, WooCommerce synchroniseren.

WHMCS module

Volledige integratie: widget, ticket relais, identiteit, admin AI.

Shopify thema-extensie

App ingesloten met automatische klant identiteit.

PHP SDK snel starten

PHP SDK voorbeeld
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);
Ontwikkelaar

Onderzoek API, evenementen en connector-vrije automatisering

Survey Studio is ontworpen om hetzelfde type Algemeen te gebruiken API, interne uitvoerder, event bus en webhook operaties als de rest van OpsIQ. Hiermee kunnen ontwikkelaars integreren van eind tot einde zonder het bouwen van een verpakte connector.

⚠️
Implementatiestatus: de live catalogus stelt momenteel alleen bloot platform.get.survey.config en platform.save.survey.config. De surveys.* en feedback.* families hieronder zijn het goedgekeurde doelcontract en moeten terugkeren unknown_action Totdat ze geregistreerd zijn.

Doelactiefamilies

Types, sjablonen en snelle lancering

surveys.types.*, surveys.templates.* en surveys.quick_launch.* lijst, voorbeeld, instantiate en valideren van complete starters.

Enquêtes en versies

surveys.create|get|list|update|archive|duplicate plus onveranderlijke versie, validatie en publiceren van acties.

Uitzettingen en gerichte acties

surveys.deployments.*, surveys.links.*, surveys.audiences.*, surveys.triggers.* en surveys.variables.*.

Outreach en reacties

surveys.invitations.*, surveys.campaigns.*, surveys.recipients.*, surveys.responses.*, export, redactie en analyse.

Webhooks, import en feedback

surveys.webhooks.*, surveys.imports.*, feedback.items.*, feedback.analytics.*, feedback.sources.* en feedback.analysis.*.

Connectorvrije stroom

1
Creëer en publiceer via Algemeen API

Gebruik getypte enquêtes.* acties met een werkruimte-gepinde sleutel. Schrijven verklaren toestemming, risico's, bevestiging, idempotentie en drooggedrag.

2
Ontvang uw zakelijke evenement

Stuur een ondertekende gebeurtenis naar een inkomende webhook, bijvoorbeeld een order annulering of voltooide stap aan boord. De bescherming van het opnieuw afspelen maakt de event-ID gededupliceerd.

3
Kaarten in acties & triggers

Kies een OpsIQ Algemeen API actie zoals het geven van een enquête uitnodiging of de voorbereiding van een campagne, dan kaart velden uit de geverifieerde trigger lading.

4
Abonneren op enquête-evenementen

Lever de gedocumenteerde business-safe enquête.* levenscyclus subset aan uw eindpunt met handtekening, filter, opnieuw proberen, log en geautoriseerd replay.

Canonische gebeurtenis doel

De gedeelde catalogus zal betrekking hebben op Survey / worp publiceren staat, publiek en trigger beslissingen, uitnodigingen, render/start/partial/resume/complete/abdon, respons redaction, campagne toestand en levering storingen. Hoog volume focus, scroll en vraag timing blijven in enquête Analytics opslag tenzij expliciet gedocumenteerd voor fan-out.

Een connector is optioneel. Het voegt herbruikbare platform ontdekking, geverifieerde identiteit, feiten, variabelen en ontvanger opsomming toe. Algemeen API plus Acties & Triggers/webhooks blijft het volledige integratie pad voor ontwikkelaars die geen verpakte connectoren nodig hebben.
Ontwikkelaar

REST API_

De OpsIQ REST API laat u programmatisch toegang tot alle platformfuncties.

Hoe het werkt
REST API_Een terminal die een POST aan de OpsIQ API met een Bearer sleutel, listing open tickets, en de opgepiept JSON Antwoord.$ curl -X POST https://your-domain.com/api/v1.php \-H "Authorization: Bearer opq_..."200 OK{ "data": [{ "id": 4192, "ticket_number": "T-4192","subject": "Card declined", "status": "open" },... more tickets ...], "page": 1, "per_page": 50, "has_more": true }
REST API_

Opmaak aanvragen

Stuur de sleutel als Authorization: Bearer opq_... of X-OpsIQ-Key: opq_...Gebruik één authenticatiekop, niet allebei.

API aanvraagformaat
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"
}

Gemeenschappelijke acties

De API is op actie gebaseerd: stuur een action naam in de instantie. Elke geregistreerde beheerder JSON -bewerking heeft een stabiele actie genaamd. POST {"action":"meta.actions"} (geen sleutel vereist) voor de gezaghebbende, per-install lijst, aanvraag contract, risico metadata en scope. platform.routes.* De brug blijft alleen voor oudere integraties.

crm.contacts.list

Lijst CRM contacten (scope crm. read). Params: q, status, bron, tag, lead score, limiet.

crm.contacts.upsert

Een contact oplossen-of-create (scope crm. write). Params: email plus velden, tags, notities.

crm.deals.list

Lijst CRM-deals (scope crm. read). Params: status, stage_id, company_id , owner_admin_id en pipeline_id.

crm.activities.record

Neem een levenscyclus/bedrijfsactiviteit op voor een contact (scope crm. write). Params: e-mail of contact_id, gebeurtenis, waarde, valuta.

crm.conversions.record

Neem een conversie op (scope crm. write). Params: contact_id of e-mail, conversie_type, waarde, valuta.

crm.events.list

Bekijk de CRM-gebeurtenissenstroom (scoop crm. read). Params: limiet.

tickets.list

Lijst tickets (scoop ticket. read). Params: pagina, per_pagina, sorteren, orde, status, prioriteit, departement_id, toegewezen_admin_id , client_email , zoeken.

tickets.get

Een ticket en zijn berichten (scoop tickets. read). Params: ticket_id of ticket-nummer, include_messages, messages_limit.

tickets.reply

Plaats een antwoord op een ticket (scooptickets. write). Params: ticket_id of ticket-nummer, body, author_type, auteur_name, intern.

tickets.update

Update een ticket (scoop tickets. write). Params: ticket_id of ticket-nummer, status, prioriteit, onderwerp, afdeling_id, toegewezen_admin_id.

tickets.open

Open een support ticket (scope tickets. write). Params: customer_email, customers_name, subject, body, priority.

tickets.bulk

Voer een bulk wachtrij operatie (scoop tickets. write). Params: bewerking, id's.

conversations.list

Lijst live-chatgesprekken (scope conversations. read). Params: pagina, per_page, status, toegewezen_admin_id, client_email, zoeken.

conversations.get

Een gesprek en de berichten (scoopgesprekken. read). Params: conversation_id of thread_key, include_messages.

conversations.messages

Berichtgeschiedenis opgepiept (scoopgesprekken. read). Params: conversation_id, pagina, per_page, include_internal.

conversations.send

Een bericht in een gesprek sturen (scoopgesprekken. write). Params: conversation_id, message, sender_type, intern.

conversations.update

Geef, her-status of hertiteling van een gesprek (scoop conversations. write). Params: conversation_id, status, toegewezen_admin_id en onderwerp.

connectors. list / . get /

Zie welke connectoren zijn geïnstalleerd, wat elk kan doen en of de referenties werken (scoop connectors. read).

automations.actions.list

De acties die uw Acties-bouwer zal uitvoeren (scope automatiseringen. read).

automations.triggers.list

Wat zal vuur en op welke voorwaarden (scope automatizations. read).

automations.runs.list

Uitvoeringsgeschiedenis voor het debuggen van een integratie (scope automatizations. read). Params: status, action_key.

departments.list

Afdelingen kunt u een ticket naar (scope afdelingen. read).

notifications.list

Notificaties voor één operator (scoop notificaties. read). Params: admin_id (eist), unread_only.

analytics.export

Een rapportsectie als CSV (scope analytics. read). Params: sectie, vooraf ingesteld, van, naar. Call analyticals. sections. list voor geldige waarden.

site_intelligence. sites. list / . reports. lijst

Bewaakte sites en hun SEO-rapporten (scoop site_intelligence. read).

commerce. products. list / . get

Uw winkelcatalogus, opgepiept (scope commerce. read). Filters: actief, categorie, zoeken. .get retourneert één product met zijn varianten.

commerce. orders. list / . get

Winkelorders (scopen commerce. read). Filters: status, betaalmethode, kanaal, customer_email. Een ophalen order_id of de ORD-referentie, met lijn items. De live gateway kassa handvat wordt nooit teruggegeven.

commerce.refunds.list

Restitutieverzoeken en hun staat (scoop commercie. read).

commerce.quotes.create

Prijs een item voor een klant (scope commerce. write). Bron store of een connector kogel. Maakt niets aan: geen bestelling, geen betaling. Zie de sectie Handel.

tickets.csat. list / . get /

Klanttevredenheid antwoorden als gegevens (scoop tickets. read). Filteren op waardering, kaartje, agent of periode; .metrics geeft dezelfde nummers terug die het dashboard laat zien.

conversations.ratings.list

Chat gesprekken uw bezoekers beoordeeld, met het commentaar, wat de rating en de agent bijgeschreven (scoop conversaties. read).

knowledge.articles.list

Pagina door uw Help Center artikelen (scoop kb. read).

knowledge.articles.get

Een Help Center-artikel door id (scope kb. read). Params: article_id.

webhooks.events.list

Elk evenement kunt u een webhook eindpunt te abonneren, met zijn lading. Beschikbaar op elk plan, zodat je kunt bouwen tegen het voordat u koopt.

files.get

Een korte-levende ondertekende downloadlink voor een bijlage (scoop files. read). Params: referentie, ttl.

security.check

Vraag of een IP of e-mail is hier geblokkeerd of verdacht (scope security.read).IP firewall, de ticket spam blocklist en het gecached veiligheids-AI vonnis. ip, e-mail.

security.report

Meld misbruik van uw systeem waargenomen (scope security. write). Opgenomen als een beveiligingsincident, geclassificeerd door de Security AI onmiddellijk, en beheerders worden gewaarschuwd voor hoge risico's vonnissen. Params: ip, e-mail, soort, reden, bron.

security. blocklist. add / . list

Beheer de spamregels die door de ticketpijpleiding worden opgelegd (scope security. write / securities. read). Dezelfde opslag als op Tickets pagina "Block sender" controle. Params: type (email, domein, ip), waarde, reden, verlopen_uren.

💡
Meta. actions is altijd gezaghebbend. Het geeft elke actie terug die beschikbaar is op uw installatie met het bereik dat elk nodig heeft, dus je hoeft nooit te raden of hard-coderen deze lijst.

Oplagen, filteren en sorteren

Elke lijstactie gebruikt dezelfde parameters, dus je leert ze één keer.

pagina / per_pagina

Paginanummer dat begint bij 1, en paginagrootte. Standaard 50, maximum 200. limiet en offset worden ook geaccepteerd als u ze verkiest.

sorteren / ordenen

Veld om te sorteren op, en asc of desc (standaard desc). Elke actie accepteert een vaste set van sorteervelden; alles wordt genegeerd in plaats van fouten.

filters

Filters als object verzenden of een filter doorgeven als top-level parameter. Onbekende filters worden genegeerd.

Wat terugkomt

items, pagina, per_pagina, tellen, totaal en has_more. Blijf pagina's aanvragen totdat has _more onjuist is.

Opgepiept, gefilterd, gesorteerde lijstverzoek
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
}

Fouten

Elke storing geeft dezelfde vorm terug, met een stal code Je kunt je branch aan. Niet overeenkomen met de menselijk leesbare error tekst, die herformuleringen kan bevatten.

Foutmelding
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
ontbrekende_api_key / ongeldig_a pi_keys

Er is geen sleutel verzonden, of de sleutel is fout of verlopen. HTTP 401.

missing_scope

De sleutel is geldig maar mist de reikwijdte die deze actie nodig heeft. HTTP 403.

read_only_key / actie_beperkt

De sleutel is alleen-lezen, of deze actie staat niet in de allow-list. HTTP 403.

unknown_action

Geen actie. Meta. actions voor de huidige lijst oproepen. HTTP 400.

ontbrekende_parameter / ongeldig_parameter

Een vereiste parameter ontbreekt, of een waarde wordt niet geaccepteerd. HTTP 400.

not_found

De record bestaat niet, of is niet in de werkruimte kan deze sleutel zien. HTTP 404.

plan_feature_locked

Uw plan bevat niet de functie waartoe deze actie behoort. Het lichaam noemt feature, de plan_name van kracht en upgrade_url. Het opnieuw proberen zal niet helpen; het plan moet veranderen. HTTP 402.

license_required

De licentie van de installatie is niet actief, dus geen actie zal worden uitgevoerd totdat deze hersteld is. HTTP 402.

selling_paused

Commerce-specifiek: de winkel heeft uitgeschakeld, dus niets kan worden geciteerd of besteld. HTTP 400.

rate_limited

De uurlimiet voor deze sleutel is gebruikt. HTTP 429.

server_error

Er is iets mislukt aan onze kant. De request_id identificeert de poging als je het moet rapporteren. HTTP 500.

Veilige herhalingen

Als een schrijftijd uit je kunt niet zeggen of het landde. Stuur een idempotency_key en een herhaling van dezelfde oproep geeft het oorspronkelijke resultaat terug in plaats van twee keer werken.

Idempotent schrijven
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
Hoe lang het duurt.

Een sleutel wordt onthouden voor 24 uur tegen dezelfde actie en API sleutel.

Wat krijg je terug?

De oorspronkelijke reactie, plus idempotent_replay: waar zodat je kunt zien dat het een herhaling was.

Mislukte resultaten blijven opnieuw te proberen

Alleen succesvolle schrijfsels worden onthouden. Als een oproep mislukt, het verzenden van opnieuw met dezelfde sleutel draait het weer, dat is wat je wilt.

Leest

Leest negeren de sleutel. Het herhalen van een lezing is onschuldig.

Test zonder iets te veranderen

Toevoegen dry_run: true Uw sleutel, scopes en parameters worden allemaal precies als normaal gecontroleerd, dan stopt de oproep voordat er iets wordt aangemaakt of gewijzigd.

Droge run: controleer de gegevens en lading veilig
{
  "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."
}
Gebruik dry_run terwijl u aan het bouwen bent. Het is de snelste manier om te bevestigen dat een sleutel heeft de juiste scopes en uw lading correct gevormd, zonder testgegevens die je dan moet opruimen.

Percentagelimieten

Per sleutellimiet

Een instelbare uurlimiet per API sleutel (standaard 1000 verzoeken per uur). Stel het in op de toets Instellingen,API Sleutels.

Wanneer overschreden

HTTP 429 met code rate_limited, plus een Retry-After header die vertelt hoeveel seconden te wachten. De limiet reset aan de bovenkant van het volgende klokuur.

Weten waar je staat

Elke reactie draagt X-RateLimit-Limite, X-rateLimited-Remaining en X- RateLimits-Reset (een Unix tijdstempel). Kijken Blijft en vertraagt voordat u op bent in plaats van te wachten om geweigerd te worden.

Vertellen 429 van 401

A 429 Dat betekent wachten en het opnieuw proberen. 401 betekent dat de sleutel zelf verkeerd is of verlopen, dus opnieuw proberen zal niet helpen totdat u de sleutel repareren.

Bewaker met brute kracht

Herhaalde mislukte-auth pogingen van één IP worden apart getrotteerd. Geldige sleutels nooit struikelen dit.

Beste praktijk

Terugtrekken wanneer Resterend laag wordt, en eren Retry-After na een 429 in plaats van onmiddellijk opnieuw proberen.

Versies en stabiliteit

Huidige versie

v1. Elke reactie draagt X-OpsIQ-API Versie en X.OpsIQ-API- Status zodat je kunt bevestigen waar je mee praat.

Hoe je gewaarschuwd zult worden

Als een versie ooit gepensioneerd is, krijgen de antwoorden standaard Deprecation en Sunset headers, en meta. actions rapporten verouderd en sunset_at. Controleer die in uw monitoring en je zult nooit verrast worden.

Wat zal er niet veranderen?

Bestaande actienamen, hun parameters en hun foutcodes. Nieuwe acties en nieuwe optionele velden kunnen te allen tijde worden toegevoegd, dus negeer velden die je niet eerder herkent dan dat ze falen.

Een complete integratie, start om af te maken

Dit is de hele lus: zoek werk, lees het, handel er op en bevestig wat je gedaan hebt.

Volledige ticketworkflow over de 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}
💡
Alles hierboven werkt op dezelfde manier voor gesprekken: conversations. list, conversaties. get, convocations. send and conversations. update volg het identieke patroon, parameters en response vorm.

Meer uitgewerkte voorbeelden

Elk van deze is een compleet, runnable stuk van een echte integratie in plaats van een fragment.

Pagina door elk record, in drie talen

De regel is overal hetzelfde: blijf vragen naar de volgende pagina tot has_more Nooit een totaal raden.

Python · pagina door elke open ticket
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 door elke lead
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 door elke open ticket
<?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"]));

Behandel elke storing API kan terugkeren

Aan code, nooit over de formulering van error- Deze verpakking is het hele contract in één functie.

Python · een client die elke foutcode correct verwerkt
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")

Antwoord een slechte tevredenheid score binnen het uur

Lees de lage scores, open een ticket voor elk en doe nooit twee keer hetzelfde.

Sluit de lus op ongelukkige klanten
# 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.

Citeer een item en handel naar het antwoord van de handelaar

Een weigering die je vertelt wat te verzamelen
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 }
}
⚠️
De klant tonen totals.total Precies zoals terug. Hoeveelheid niet altijd vermenigvuldigt de prijs per eenheid

Een webhook ontvanger die veilig te draaien in de productie

Controleren, de-dupliceren, snel antwoorden en dan het werk doen. Bezorgingen opnieuw proberen, zodat dezelfde gebeurtenis kan komen meer dan eens.

PHP · een productievormige webhook ontvanger
<?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

Plannen en rechten

Elke actie behoort tot een product functie, en uw plan bepaalt welke functies u hebt. Als uw plan geen functie bevat, de actie antwoorden 402 Na uw sleutel is gecontroleerd, dus een ongeauthenticeerde beller leert niets over uw plan, en voordat er iets wordt gemaakt, zodat een geblokkeerd schrijven nooit half-happens.

Een geplande actie
{
  "success": false,
  "code": "plan_feature_locked",
  "feature": "commerce",
  "plan_locked": true,
  "plan_name": "Growth",
  "upgrade_url": "https://…",
  "request_id": "req_8f2c1a9d4b7e"
}
Hoe het te onderscheiden van een machtiging probleem

A403betekent dat de KEY is te smal en opnieuw uitgeven met het juiste bereik en het werkt. A402betekent dat de rekening heeft niet de functie . Geen sleutel kan ontgrendelen, het plan moet veranderen.

Probeer geen 402_ opnieuw

Het is niet van voorbijgaande aard. upgrade_url aan wie de rekening heeft in plaats van zich terug te trekken en het opnieuw te proberen.

De admin-scope gaat het niet omzeilen

Scopes geven uit wat de belangrijkste emittent heeft gedelegeerd; het plan geeft aan wat de account kocht. Een admin-gescoopde sleutel krijgt nog steeds een 402 voor een functie die het plan mist.

Zoek het uit voordat u vertrekt

De feature Elke actiebehoefte wordt gepubliceerd in de onderstaande actiegids en in meta.action, zodat u kunt controleren op de bouwtijd in plaats van ontdekken het in productie.

De snelste manier om precies te zien waar een sleutel staat is meta.me. - Het geeft het geldende plan, elke functie die het draagt, en elke actie die deze sleutel kan niet oproepen met de reden voor elk van hen.

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"
    }
  }
}
Bel Meta. me eerst als een integratie zich anders gedraagt tussen twee installs. Het antwoordt "waarom kan deze sleutel dat niet doen" in één verzoek, zonder dat iemand de admin opent.

Een prijs citeren

commerce.quotes.create prijzen een item voor één klant. Het creëert niets

Een item citeren
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"}}
De handelaar wint totaal

Voor een aangesloten platform, het totaal komt van die handelaar en wordt nooit herberekend hier. Hoeveelheid niet altijd vermenigvuldigt de prijs per eenheid

Weigeringen vertellen je wat er ontbreekt.

Als de handelaar meer van de klant, krijg je quote_refused met een missing lijst met de velden te verzamelen, en de verkoper eigen formulering om te tonen.

Bestellen is geen API aanroep

Een citaat is indicatief. Bevestiging gebeurt waar de klant isAPI. De reactie zegt het in ordering.

Bij verkoop wordt gepauzeerd

Als de winkel is uitgeschakeld, citeert antwoorden selling_paused in plaats van iets te prijzen wat niemand kan kopen.

De andere eindpunten

Bijna alles wat je nodig hebt is een POST naar /api/v1.phpDit zijn de uitzonderingen en waar elk voor is.

/api/v1/openapi.php · /api/v1/postman.php · /api/docs/

Het machinecontract en de menselijke referentie. Geen sleutel nodig, dus je kunt verkennen voordat u een hebt.

/api/ai_stream.php

Gebeurtenissen die door de server worden verzonden voor live chat antwoorden zoals ze zijn gegenereerd. Een stroom, geen JSON actie.

/api/writing.php

Het oudere AI-schrijven eindpunt. Alles wat het doet is ook beschikbaar als writing.* acties op /api/v1.php, waar nieuw werk moet gaan.

/api/inbox_copilot.php

Ontwerp, herschrijf en triage voor een ticket inbox die is ingebed in uw eigen beheerder.

/api/v1/si/…

Site Intelligence als een klein REST API — sites, kruipt, problemen, trefwoorden, inkomsten voor CI pijpleidingen die willen beginnen met een crawl na een implementatie en lees het resultaat.

/api/connectors.php?slug=&token=

Waar een aangesloten platform POST zijn eigen webhooks naar u. De token wordt geslagen wanneer je de connector inschakelt.

/api/integrations/*.php

De integratie-engine: uitvoeren en bevestigen acties, en het innemen van verkoop, identiteit en reis evenementen. Het gebruikt zijn eigen sleuteltype, uitgegeven onder API & Webhook bouwer.

💡
Deze allemaal voldoen aan dezelfde planregels als de acties. Een functie die uw plan niet antwoorden 402 hier ook, in dezelfde vorm bevat.

Elke actie, met de reikwijdte die het nodig heeft

Deze lijst wordt gegenereerd uit de lopende catalogus, dus het komt altijd overeen met de versie waarop u zich bevindt. meta.actions geeft dezelfde informatie terug als JSON.

2418 named actions: 804 reads, 1614 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: 604; explicit: 63; route_inferred: 1633; source_inferred: 118.

administration (25)

administration.2fa.disable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Disable

administration.2fa.enable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Enable

administration.2fa.recovery.regenerate

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Recovery Regenerate

administration.2fa.setup

Read. Scope: administration.read, admin. Contract: route_inferred. Admin 2fa Setup

administration.2fa.status

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin 2fa Status

administration.ai.train.from.reply

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Ai Train From Reply

administration.brain.cancel

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Brain Cancel

administration.brain.view

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Brain View

administration.chat.access.check

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Access Check

administration.chat.create.ticket.on.behalf

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Create Ticket On Behalf

administration.chat.draft.ticket.from.thread

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Draft Ticket From Thread

administration.conv.delete

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Delete

administration.conv.get

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Get

administration.conv.list

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv List

administration.conv.new

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv New

administration.conv.save

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Save

administration.notification.prefs.get

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Notification Prefs Get

administration.notification.prefs.save

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notification Prefs Save

administration.notifications.list

Read. Scope: administration.read, admin. Contract: route_inferred. Admin Notifications List

administration.notifications.mark.all.read

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notifications Mark All Read

administration.notifications.mark.read

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Mark Read

administration.notifications.pulse

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Pulse

administration.online.list

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Online List

administration.presence.ping

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Presence Ping

administration.realtime.token

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Realtime Token

analyse (43)

analytics.add.widget

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Add Widget

analytics.analytics.connectors.catalog

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Connectors Catalog

analytics.analytics.data

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Data

analytics.analytics.export

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export

analytics.analytics.export.csv

Read. Scope: analytics.read, admin. Contract: route_inferred. Analytics Export Csv

analytics.analytics.import

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Import

analytics.analytics.report

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Report

analytics.analytics.segments.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Delete

analytics.analytics.segments.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Segments List

analytics.analytics.segments.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Analytics Segments Save

analytics.analytics.status

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Analytics Status

analytics.clear.all

Write. Scope: analytics.write, admin. Contract: declared_dynamic. Replay Clear All

analytics.compute

Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Compute

analytics.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Create

analytics.create.route.dashboard.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Create

analytics.create.route.report.create

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Create

analytics.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Delete

analytics.delete.route.dashboard.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Delete

analytics.delete.route.funnels.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Delete

analytics.delete.route.report.delete

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Delete

analytics.events

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Events

analytics.export

Read. Scope: analytics.read, admin. Contract: source_inferred. Analytics Export

analytics.get

Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Get

analytics.layout.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Layout Save

analytics.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Ab Test List

analytics.list.route.dashboard.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Dashboard List

analytics.list.route.funnels.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Funnels List

analytics.list.route.report.list

Read. Scope: analytics.read, admin. Contract: declared_dynamic. Report List

analytics.remove.widget

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Remove Widget

analytics.rename

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Rename

analytics.results

Read. Scope: analytics.read, admin. Contract: route_inferred. Ab Test Results

analytics.save

Write. Scope: analytics.write, admin. Contract: route_inferred. Funnels Save

analytics.save.widgets

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Save Widgets

analytics.scheduled.list

Read. Scope: analytics.read, admin. Contract: explicit. List scheduled analytics reports for an operator Required fields: admin_id.

analytics.sections.list

Read. Scope: analytics.read, admin. Contract: explicit. List analytics report sections and date presets

analytics.send.now

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Send Now

analytics.sessions

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Sessions

analytics.step.visitors

Read. Scope: analytics.read, admin. Contract: route_inferred. Funnels Step Visitors

analytics.timeline

Read. Scope: analytics.read, admin. Contract: route_inferred. Replay Timeline

analytics.toggle.shared

Write. Scope: analytics.write, admin. Contract: route_inferred. Dashboard Toggle Shared

analytics.update

Write. Scope: analytics.write, admin. Contract: route_inferred. Ab Test Update

analytics.update.route.report.update

Write. Scope: analytics.write, admin. Contract: route_inferred. Report Update

analytics.widget.data

Read. Scope: analytics.read, admin. Contract: route_inferred. Dashboard Widget Data

automations (6)

automations.actions.list

Read. Scope: automations.read, admin. Contract: explicit. List integration actions

automations.delete

Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Delete

automations.list

Read. Scope: automations.read, admin. Contract: route_inferred. Workflow List

automations.runs.list

Read. Scope: automations.read, admin. Contract: explicit. List automation execution history

automations.save

Write. Scope: automations.write, admin. Contract: route_inferred. Workflow Save

automations.triggers.list

Read. Scope: automations.read, admin. Contract: explicit. List integration triggers

chat (40)

chat.call.start

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Call Start

chat.cobrowse.send

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Cobrowse Send

chat.feedback

Read. Scope: chat.read, admin. Contract: route_inferred. Chat Feedback

chat.feedback.digest

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Feedback Digest

chat.form.delete

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Delete

chat.form.get

Read. Scope: chat.read, admin. Contract: route_inferred. Chat Form Get

chat.form.list

Read. Scope: chat.read, admin. Contract: declared_dynamic. Chat Form List

chat.form.save

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Save

chat.form.set.default

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Form Set Default

chat.meeting.decide

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Decide

chat.meeting.outcome.set

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Outcome Set

chat.meeting.type.delete

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Delete

chat.meeting.type.save

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Type Save

chat.meeting.types.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meeting Types List

chat.meetings.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Meetings List

chat.online.admins

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Online Admins

chat.permissions.list

Write. Scope: admin. Contract: route_inferred. Chat Permissions List

chat.permissions.revoke

Write. Scope: admin. Contract: route_inferred. Chat Permissions Revoke

chat.permissions.save

Write. Scope: admin. Contract: route_inferred. Chat Permissions Save

chat.permissions.upload.avatar

Write. Scope: admin. Contract: route_inferred. Chat Permissions Upload Avatar

chat.reaction.toggle

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Reaction Toggle

chat.saved_replies.add

Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Add Retry-safe with idempotency_key.

chat.saved_replies.list

Read. Scope: chat.read, admin. Contract: explicit. List workspace and personal saved replies

chat.saved_replies.save

Write. Scope: chat.write, admin. Contract: source_inferred. Chat Saved Replies Save Retry-safe with idempotency_key.

chat.set.persona

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Set Persona

chat.snooze.clear

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Clear

chat.snooze.set

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Snooze Set

chat.transfer.thread

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Transfer Thread

chat.transfer.unread

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Transfer Unread

chat.typing.preview

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Typing Preview

chat.whisper.ai.summary

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Ai Summary

chat.whisper.controls

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Controls

chat.whisper.delete.room

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Delete Room

chat.whisper.list

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper List

chat.whisper.mentions

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Mentions

chat.whisper.rooms

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Rooms

chat.whisper.save.controls

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Save Controls

chat.whisper.send

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Send

chat.whisper.targets

Write. Scope: chat.write, admin. Contract: declared_dynamic. Chat Whisper Targets

chat.whisper.unread

Write. Scope: chat.write, admin. Contract: route_inferred. Chat Whisper Unread

handel (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 whether the storefront can launch

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.

klanten (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

uur (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

platform (924)

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

beveiliging (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

status (6)

status.component.save

Write. Scope: status.write, admin. Contract: declared_dynamic. Status Component Save

status.components.save

Write. Scope: status.write, admin. Contract: explicit. Create or update a public status component Required fields: name. Retry-safe with idempotency_key.

status.incident.create

Write. Scope: status.write, admin. Contract: declared_dynamic. Status Incident Create

status.incident.resolve

Read. Scope: status.read, admin. Contract: route_inferred. Status Incident Resolve

status.incidents.create

Write. Scope: status.write, admin. Contract: explicit. Create a status-page incident Required fields: title. Retry-safe with idempotency_key.

status.incidents.resolve

Write. Scope: status.write, admin. Contract: source_inferred. Status Incidents Resolve Retry-safe with idempotency_key.

enquêtes (22)

surveys.analytics.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Analytics Get

surveys.audiences.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey audiences

surveys.audiences.materialize

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Audiences Materialize Retry-safe with idempotency_key.

surveys.campaigns.create

Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey campaign Required fields: deployment_id. Retry-safe with idempotency_key.

surveys.campaigns.launch

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Campaigns Launch Retry-safe with idempotency_key.

surveys.campaigns.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey campaigns

surveys.deployments.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey deployments

surveys.deployments.set_status

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Deployments Set Status Retry-safe with idempotency_key.

surveys.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Get

surveys.imports.create

Write. Scope: surveys.write, admin. Contract: explicit. Create and run a survey import Required fields: kind. Retry-safe with idempotency_key.

surveys.imports.process

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Imports Process Retry-safe with idempotency_key.

surveys.invitations.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey invitations

surveys.links.create

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Links Create Retry-safe with idempotency_key.

surveys.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey definitions

surveys.responses.get

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Responses Get

surveys.responses.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey responses

surveys.triggers.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey trigger sets

surveys.types.list

Read. Scope: surveys.read, admin. Contract: explicit. List supported question types and Studio templates

surveys.versions.list

Read. Scope: surveys.read, admin. Contract: source_inferred. Surveys Versions List

surveys.webhooks.delete

Write. Scope: surveys.write, admin. Contract: source_inferred. Surveys Webhooks Delete Retry-safe with idempotency_key.

surveys.webhooks.list

Read. Scope: surveys.read, admin. Contract: explicit. List survey webhook subscriptions

surveys.webhooks.save

Write. Scope: surveys.write, admin. Contract: explicit. Create or update a survey webhook subscription Required fields: url. Retry-safe with idempotency_key.

team (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

tickets (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

webhooks (1)

webhooks.events.list

Read. Scope: webhooks.read, crm.read, admin. Contract: explicit. List outbound webhook events and their payloads

schrijven (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.

Zijn OpenAPI en Postman beschikbaar?+

Ja. De gegenereerde OpenAPI 3.0 Het document is op /api/v1/openapi.php, de gegenereerde Postman collectie is op /api/v1/postman.php, en de mens-leesbare ontwikkelaar docs zijn op /api/docs/.

Hoe werk ik met meer dan één werkplek?+

Stuur site_key in de aanvraagformulier om een werkblad te kiezen. Een sleutel die is uitgegeven voor één werkplek blijft eraan gepind; een sleutel met admin context kan elke werkruimte selecteren die het mag zien en wordt geweigerd voor alle niet-werkplaatsen.

Welke acties kunnen een alleen-lezen sleutel oproep?+

Elke actie gemarkeerd als een lees. Stel de machtigingen modus op de sleutel in om alleen te lezen en elke schrijf wordt geweigerd met read_only_key, zodat een rapportage integratie kan niets veranderen zelfs per ongeluk.

Waarom ben ik niet gevonden voor iets wat ik in de administratie kan zien?+

De sleutel is in een werkruimte geplaatst. Records in andere werkruimten geven geen_gevonden terug in plaats van een toestemmingsfout, dus de API bevestigt nooit of er ergens anders iets bestaat.

Ontwikkelaar

Beveiliging API_

Een beveiligingscontract voor elke connector en integratie: vraag OpsIQ wat het weet over een IP of afzender, en voer het misbruik dat uw eigen systeem ziet terug.

OpsIQ Het is al duidelijk dat de Europese Unie zich moet verdedigen: IP firewall blokkeert aanvallers, de ticket pijpleiding filtert spam en de Security AI classificeert daders en stelt blokregels voor. API opent die intelligentie voor uw andere systemen. Een facturatieplatform, een client portal of een aangepaste app kan controleren een bezoeker alvorens te vertrouwen, en melden wat het waargenomen zodat de hele installatie leert van elk oppervlak.

Wat je kunt doen

Controleer voordat u het vertrouwd

security. check antwoorden met de firewall-status, elke spamregel die overeenkomt met de afzender en het gecached AI-oordeel voor de IP. Eén oproep, één geconsolideerde mening.

Rapporteer wat je zag.

security.report registreert de observatie als een beveiligingsevenement, heeft de Security AI classificeren van het IP en waarschuwt de beheerders als het vonnis terugkomt. OpsIQ Ik zie het direct.

Spamregels delen

security. blocklist. add en securities. bloglist. list lezen en schrijven dezelfde spamregels die de Tickets pagina gebruikt, zodat een afzender geblokkeerd in één systeem overal wordt geblokkeerd.

Misbruik van een connector melden
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"
}

Toepassingsgebied en veiligheid

security.read

Noodzakelijk voor security. check en securities. blocklist. list. Veilig om een rapportage integratie te geven.

security.write

Noodzakelijk voor security. report en securities. blocklist. add. Geef het alleen aan systemen die u wilt voeden regels en rapporten in.

Niets wordt stilletjes vernietigd.

Een afzender met een bloklijst landt nog steeds in de Spam-weergave waar het ticket kan worden gelezen en hersteld.

Het platform beschermt zichzelf

Eigen server IP adressen kunnen nooit worden geblokkeerd, op de bloklijst geplaatst of gerapporteerd via deze API, dus een verkeerde integratie kan het platform niet uitschakelen.

💡
Mint een sleutel onder Integraties, dan API Sleutels, en geef het alleen de beveiligingsomvang die het nodig heeft. Het volledige aanvraagcontract voor elke actie is in meta. actions en het OpenAPI-document.
Gebruiken mijn bestaande connectoren dit automatisch?+

De uitgaande synchronisatie is al automatisch: wanneer u een blokkeren IP, aangesloten platforms worden verteld via de connector security sync. API is de inkomende helft. Richt uw connector of aangepaste code op deze vier acties met een sleutel die de beveiligings scopes.

Waar wonen spamregels?+

Een opslag. De Tickets pagina Blokkeer de controle van de afzender, de spam AI in Instellingen en dit API werken allemaal tegen dezelfde blocklist, dus er is precies één plek om te zoeken.

Ontwikkelaar

Evenementen API_

Stuur aangepaste gebeurtenissen van uw server of website naar OpsIQ voor analyses, experimenten, CRM triggers en webhook voorwaarden.

Hoe het werkt
Evenementen API_Een track() call die een aangepaste demo_boeked event naar OpsIQ stuurt, wat conversiedoelen, segmenten en triggers voedt.OpsIQ. track("demo_booked," {waarde: 0, plan: "pro"});OmschakelingsdoelstellingenSegmentenTriggers & webhooksBrowser (OpsIQ.track) of server-kant POST /v1/events
Evenementen API_

Browser-side gebeurtenissen

Browser-actie volgen
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "button_clicked", {
  button: "signup",
  page: "/pricing",
  variant: "green"
}]);

Server-side gebeurtenissen

Server-side, record activiteiten en conversies tegen een contact via de actie API. Gebruik crm.activities.record voor levenscyclus/bedrijfsactiviteit en crm.conversions.record voor conversies. Er is geen events.send actie; de inkomende CRM-gebeurtenissenontvanger woont op /v1/inbound.php?t=<token> voor systemen van derden die gebeurtenissen indrukken.

Server-side activiteit (actie 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"
}

Naamgevingsconventie

Notatie van punt

"order. completed" niet "orderCompleted."

Verleden tijd

"knop. klikt" niet "knop."klik."

Wees specifiek

"pricing. plan_selected" niet "user_action."

Ontwikkelaar

Hoe data doorloopt OpsIQ

Het begrijpen van de datastroom helpt u integraties te debuggen en prestaties te optimaliseren.

Hoe het werkt
Hoe data stroomtGegevens stromen van het widget en baken naar OpsIQ kern (CDP, identiteitsgrafiek, AI hersenen, analyses, CRM) dan uit via webhooks en de REST API.Widget& bakenOpsIQ kernCDP · identiteitsgrafiekAI hersenenAnalyse · CRMWebhooks uitREST API_
Gegevensstroom

Inkomende gegevensstroom

1
Widgetbaken

De JavaScript widget stuurt paginaweergaven, klikken en chatberichten naar /beacon.php.

2
Ingestie van voorvallen

Gebeurtenissen opgeslagen in opsiq_events met site_key, evenementtype, klant en eigenschappen.

3
Vergadering

Sessie bouwer groepeert paginaweergaven in sessies (via cron).

4
Identiteitsresolutie

Wanneer anonieme gegevens worden geïdentificeerd, zijn ze gekoppeld aan het klantprofiel.

5
Verbindingssynchronisatie

Connectors halen gegevens van externe platformen en slaan in de connector cache.

6
AI context

AI assembleert context uit: bezoekersgeschiedenis, klantprofiel, connectorgegevens, KB en prompt.

Uitgaande gegevensstroom

1
Branden van gebeurtenissen

Interne event branden (ticket. created, chat. message, order. completed).

2
Takenlijst

Gebeurtenis geplaatst in de async-taaklijst.

3
Webhook verzending

Verzender tekent en stuurt naar alle geabonneerde eindpunten.

4
Herproberen bij falen

Mislukte leveringen werden opnieuw opgepakt met exponentieel backoff.

Instellingen

Instellingen

Instellingen is het controlecentrum voor een werkruimte. Alles hieronder wordt gescoped naar de werkruimte waarin u zich bevindt, zodat één account meerdere merken kan uitvoeren met verschillende identiteiten, chatgedrag en bewaarregels.

Een instelling vinden

Er zijn ongeveer zeshonderd individuele controles in Instellingen, verspreid over elf tabbladen gegroepeerd onder vier menu's. U wordt niet verwacht om te bladeren voor hen.

Zoekinstellingen (Ctrl + K)

Druk op Ctrl + K, of Cmd + K op een Mac, overal op de pagina Instellingen. Typ in gewone woorden en druk op Enter om direct naar de controle te springen. Zoeken tolereert kleine typefouten en begrijpt gerelateerde woorden, dus scheduler vindt Cron en privacy vindt de tracking controls. Het toont alleen instellingen die uw rol kan openen.

Werkruimte en plan

Algemeen en rijbewijs.

AI en klantenservice

Beheers-AI assistent, klantchat, OpsIQ Schrijven en ondersteuningsportaal.

Gegevens en governance

Tracking en privacy, machtigingen en beveiliging.

Systeem

Cron Setup (alleen zelf gehost) en Danger Zone.

Opslaan

Elk tabblad slaat op zichzelf met zijn eigen Save-knop. Client Chat en OpsIQ Schrijf de hunne in het scherm. Opslaan voordat u van tabbladen verandert; wijzigingen worden niet doorgesleept.

Diepe banden

Het actieve tabblad wordt in het paginaadres geschreven, zodat een tab bladwijzer kan worden verzonden naar een collega.

Algemeen: Bedrijfsidentiteit

De belangrijkste kaart op de pagina. De AI leest deze waarden op elk antwoord, rapport en dagelijks overzicht.

Bedrijfsnaam

Gebruikt in AI rapporten, dagelijkse slips en klantgerichte formulering. Pas uw website footer aan.

Bedrijfsleven

Tailors AI analyse, lead scoren, slips en survey presets. Kies uit webhosting, e-commerce, SaaS, vastgoed, agentschap, consultancy, gezondheidszorg, onderwijs, financiën of algemene zaken.

Systeemtaal

De taal die iedereen heeft getoond, kan door elke agent worden overgenomen.

Browsertaal gebruiken

Toont de inlogpagina in de eigen taal van de bezoeker. Zodra iemand daar een taal kiest, wint zijn keuze en dat overdrijft het nooit.

Systeemtijdzone

De zone waar het hele systeem draait: data, rapporten, schema's en de achtergrond cron. Gebruik uw bedrijfstijdzone, niet uw klanten.

Algemeen: GeoIP en Tracking

GeoIP2-databasepad

Volledig pad naar GeoLite2-City. mmdb. Auto-detecteert bij eerste lading over cPanel, Plesk, DirectAdmin, Cloudways, Docker en gewone Linux of Windows. Voeg GeoLite2-ASN. mmddb toe in dezelfde map voor de internetprovider van bezoekers.

Geobronmodus

GeoLite2, alleen met een geoLite2 Cloudflare terugval, of Cloudflare Alleen.Cloudflare modi vereisen dat de site door middel van Cloudflare, met bezoekers locatie headers ingeschakeld voor stad en regio detail.

Sessietijd (en)

Inactiviteit voordat een bezoekersessie wordt beschouwd als voltooid. Standaard 14400 Dat is vier uur.

Live vernieuwingsinterval (s)

Hoe vaak de Live Feed verfrist. Standaard 30 seconden.

Actieve drempel (min)

Hoe lang een bezoeker als live telt na de laatste pagina-belasting. Standaard 2 minuten. Dit is de Live Feed drop-off, niet de sessielengte.

Gegevensbewaring (dagen)

Verwijdert verzamelde en gegenereerde records voorbij deze leeftijd: analytics, chat, tickets, feedback, transacties, AI telemetrie, integratie logs en CRM-activiteit. 0 houdt alles voor altijd. Instellingen, auteur inhoud en toestemming ontvangstbewijzen worden nooit verwijderd.

Wanneer een chat verwijderd wordt

Kiest hoeveel van een verwijderd gesprek blijft op de plaat: het volledige record, de plaat zonder het gesprek of alleen de score. Verwijderen verbergt altijd de chat uit de inbox en de bezoekersgeschiedenis. Geplande retentie en Vergeet bezoeker altijd volledig te wissen ongeacht dit.

Spoorbotverkeer

Telt kruipers als bezoekers. Laat het los; het blaast bezoeker telt en schudt elk rapport.

Feedback enquête-popup ingeschakeld

Toont de site-brede feedback widget aan bezoekers. Los van de chat enquêtes onder Client Chat, Support Flow.

Algemeen: AI-functies

Meesterschakelaars voor elk AI-oppervlak. Alle standaardinstellingen aan en opslaan per werkblad.

AI Triage op tickets

Classificeert elk ticket per categorie, prioriteit en sentiment, en schrijft een thread samenvatting bovenaan het ticket.

Samenvatting van de triage zweef

Toont de triagetags en samenvatting in een tooltip wanneer een agent een rij in de ticketlijst zweeft. Vereist AI-triage.

Inbox-copiloot (componist)

Voegt Draft AI antwoord, Warmer, Korter, Meer formele en verontschuldigende buttons onder het ticket repliek vak. Niets stuurt zonder de agent.

Vraag.OpsIQ Copiloot

De pagina-bewuste drijvende copiloot op elke admin pagina. Weet welke klant, factuur of ticket is geopend.

Ochtendbriefje

Bij de eerste open elke dag presenteert de copiloot dringende tickets, te laat antwoorden en wachten chats. Zondag produceren een week in overzicht.

Algemeen: geld, branding, back-up

OpsIQ basisvaluta

Elk bedrag totaal in de admin wordt omgezet in deze valuta voor weergave. Connectoren slaan hun eigen bron valuta; stel dat per connector.

Automatisch synchroniseren van FX-tarieven

Vernieuwt tarieven om de zes uur van een gratis openbare diervoeders met geen API sleutel. U kunt handmatige tarieven die de feed overschrijven toevoegen. Met auto-sync uit, worden valuta's zonder een manuele koers niet omgezet.

Commerce en Facturering functies inschakelen

Schepen uit. Het inschakelen ervan onthult de pagina Verkoop en Conversies, het dashboard inkomstenkaarten en de Live Intelligence Feed. Met deze uit, is elk prijsoppervlak verborgen en de verkooppagina verlaat het menu.

Woordenschat handel

Leert OpsIQ je tekst: of je vernieuwing doet, het woord voor vernieuwen, wat je verkoopt en hoe kopers worden genoemd.

Merken en logo's

Twee uploads, één voor achtergronden (admin zijbalk) en één voor donkere (inlog pagina). PNG, JPG, WebP of SVG tot 3 MB.

Site Intelligence Agent, laat privé SSH doelen

De Auto-Implementatie SEO agent verbindt via SSH. Privé, loopback en gereserveerde adressen worden standaard geblokkeerd als anti-SSRF maatregel. Alleen ingeschakeld op zelfgehoste installs die een lokale server moeten bereiken.

OpsIQ Backup / herstellen

Uitvoer elke instelling en OpsIQ-owned tabel plus geüploade bestanden.OpsIQ alleen configuratie en administratie; het raakt nooit klanten, facturen, tickets, diensten, domeinen, bestellingen of transacties.

⚠️
Neem een back-up voordat u iets in Gevaar Zone. Back-up woont in Algemeen en de verwijderen acties live in Gevarenzone, dus het is gemakkelijk om te bereiken van de verwijderknop zonder eerst te hebben geëxporteerd.
Instellingen

Instellingen: Beveiliging

Bescherming voor de admin-aanmelder, uw personeel accounts en de gegevens OpsIQ verzamelt. Klant aanmelden voor het support portal is apart geconfigureerd.

Aanmeldbescherming

Google reCAPTCHA

Stopt bots en credentiaal vulling op de admin-aanmelding. Kies v3 (onzichtbaar, gescoord) of v2 (checkbox), stel de v3-scoredrempel in, en lever de site en geheime sleutels. Deze zelfde toetsen worden hergebruikt door het support portal aanvraagformulier.

Aanmelden automatisch afsluiten mislukt

Blokt een adres na een aantal fouten binnen een venster, voor een aantal uren. U kunt het bericht van de afgesloten pagina aanpassen en een kleine afleiding op het wachtscherm tonen.

Aanmelden Verharding

Wachtwoordbeleid met een minimale lengte, afwijzing van wachtwoorden gevonden in bekende inbreuken, per-account lockout tegen credential vulling, verplichte twee-factor voor elke admin, wachtwoord opnieuw invoeren vóór gevaarlijke acties en nieuw-device-aanmelding waarschuwingen.

Enkelvoudig aanmelden (OIDC)

Staff-inloggen via uw identiteit provider. Heeft uitgever URL, client ID en cliënt geheim nodig. Auto-provision domeinen, een per regel, maken gebruikers automatisch bij eerste aanmelding.

Enkelvoudig Aangemeld (SAML 2.0)

Voor aanbieders die spreken SAML. OpsIQ levert het antwoord van de ACS URL en SP entiteit ID; u verstrekt de IdP entiteit ID, aanmelden URL, optioneel aanmelden URL en X.509 ondertekening van certificaat. E-mail en naam attribuut velden zijn alleen nodig voor niet-standaard atttribute namen.

SCIM Provisioning

Mapgestuurde aanmaak, update en deactivering van OpsIQ rekeningen.OpsIQ levert de SCIM basis URL; je genereert hier gemerkte tokens zodat men kan worden ingetrokken zonder de rest te breken.

Bedreigingen, blokkering en verzameling

Uitgangs-toestemmingslijst

Beperkt welke externe hosts deze werkruimteconnectoren kunnen oproepen. Meten aan de SSH doel controle in Algemeen.

Bedreiging scoren en automatisch blokkeren

Blokkeert een bezoeker zodra hun dreiging score voorbij uw drempel. 0 schakelt het uit. Bekijk de pagina Security Overzicht voor een week alvorens te kiezen van een nummer.

Block Pagina Bericht

Het bericht dat een geblokkeerde bezoeker ziet, als platte tekst of uw eigen aangepaste HTML blok scherm.

Kern Web Vitals van echte bezoekers

Meet LCP, INP en CLS van echte sessies.

Geloten, opnieuw proberen-veilige gebeurtenis levering

Aangepaste gebeurtenissen wachtrij in de browser en leveren in batches met retrieves, waardoor verlies op slechte mobiele verbindingen.

Getekende volgbalken

Echte widget-inbedden dragen een roterende cryptografische token zodat vervalste trackinggegevens kunnen worden afgewezen. Standaard kan het wijzigen van de inbedden worden geweigerd, dus test eerst.

Beveiligingswaarschuwingen

Standaard uit. Detectie en blokkering draaien ongeacht. Deze kaart bepaalt of u wordt verteld, en hoeveel de AI helpt.

Beveiligingswaarschuwingen inschakelen

Meester schakelaar voor deze kaart.

Aanmeldgolfdrempel mislukt

Hoeveel mislukte inlogmeldingen in een korte periode tellen als een golf die het waard is om te waarschuwen.

IP _reputation intelligence

Voegt een dreiging score voor bezoekers verschijnen in publieke misbruik feeds.

Sitewatch

Uur-uptime en TLS controle van het verloop, waarschuwing voordat een certificaat vervalt.

AI beveiligingsanalist en AI incident shorts

Voegt een verklaring voor verdachte activiteiten, en groepen gerelateerde aanvallen in één leesbaar incident eerder dan een stroom van gebeurtenissen.

Beleidsautopiloot

De heer Cheysson, lid van de Commissie. - (FR) Mijnheer de Voorzitter, ik wil graag een paar opmerkingen maken over het verslag-Spinelli en de amendementen nrs. 1, 2, 3, 4, 5, 6, 9, 10, 11, 12, 14, 15, 18, 19, 23, 24, 25, 26, 27, 29, 30 en 36.

Dagelijkse veiligheidsvertering en Wekelijkse houding adviseur

Een dagelijkse samenvatting op de pagina Security Overzicht, en een wekelijkse verhardingschecklist die laat zien wat beschermd is en wat nog open.

Auto-expire oude voorstellen

Een voorgestelde blokregel waar je nooit op hebt gereageerd verloopt vanzelf in plaats van zich op te stapelen.

DOM-sessie opnieuw afspelen

DOM-sessieherspel inschakelen

Records bezoekerssessies voor afspelen. Wanneer de replaybibliotheek niet geladen is, dus er zijn geen kosten om het uit te laten. Opnames worden gesampled en privacy-gemaskerd, en worden bekeken op de Session Replay pagina onder Analytics.

Monstersnelheid, maximumvangst, retentie

Welk deel van de sessies op te nemen, hoe lang een enkele opname kan draaien en hoeveel dagen er worden opgenomen.

⚠️
Sessie replay registreert echte mensen die uw site gebruiken. Houd de sample rate en retentie zo laag als nog steeds zal beantwoorden uw vraag, en openbaar maken in uw privacyverklaring.
Instellingen

Instellingen: Tracking en Privacy

Wat? OpsIQ kan verzamelen, en hoe lang elk soort record overleeft.

Uitsluitingen

Uitgesloten IPs en CIDR bereik

Adressen zijn nooit getraceerd, één per regel, exacte adressen of CIDR-bereiken. De schoonste manier om je eigen team uit je analyse te houden, omdat het iedereen op dat adres dekt in plaats van alleen ingelogde beheerders.

Uitgesloten URL Paden

Paginapatronen zijn nooit gevolgd, één per regel, wildcards met een asterisk. Bijvoorbeeld /admin/* houdt het hele backoffice uit de bezoekerslogboek.

Beleid inzake gegevensbewaring

Per-subsysteem autopurge in dagen. Los van de algemene gegevensbewaring instelling in het algemeen en van de Danger Zone zuivering.

AI-interactielogs

Vertrouwen telemetrie met korte voorvertoningen van query en respons. Standaard 90 dagen. Dit bevat de meeste klanttekst, dus verkort deze eerst bij het aanscherpen van privacy.

AI-gebruiksgebeurtenissen

Per-call token telt voor kostenrapportage. Standaard 90 dagen. Alleen nummers, geen berichtinhoud.

Trail voor de controle van acties

Het favoriete actie- en beveiligingslogboek. Standaard 365 dagen. Houd dit langste; het is uw bewijsspoor.

Diagnostica

Systeemgezondheidsdossiers. Standaard 30 dagen.

Onbeantwoorde vragen

Clusters van vragen die de AI niet kon beantwoorden. Standaard 90 dagen. Werk ze door op de Vragen die de pagina AI miste voordat ze verlopen zijn.

Watchdogs en export

Metrische anomaliewaarschuwingen

Dagelijkse vergelijking van gisteren met de recente baseline, waarbij een metriek meer dan je drempel beweegt. Standaard 35 procent. Standaard uit.

Magazijn Export

Nachtelijke dumps van sessies, bezoekers, paginaviews en aanverwante tabellen voor uw eigen BI stack, in een formaat dat u kiest, gehouden voor een aantal dagen. Standaard uit.

Instellingen

Instellingen: Admin AI-assistent

De drijvende assistent die uw medewerkers gebruiken binnen de admin, met live lees toegang tot clients, facturen, tickets, servers en cron logs. Een andere assistent dan de klant-gerichte onder Client Chat.

Inschakelen OpsIQ AI-widget

Laat de assistent-knop zien op elke admin pagina.

Indeling en gedrag

Hoekpositie, paneelbreedte (320 tot 600 px), maximale hoogte (400 tot 900 px), hoekradius (0tot 24), lettergrootte, en een matglas wazig achter het paneel.

Snelle spaanders tonen

Een-klik sneltoetsen onder de kop. De snelste manier voor het meeste personeel.

Modelinformatie tonen

Toont welk model beantwoord en hoe lang het duurde. Nuttig tijdens de stemming kosten, lawaai voor dagelijks gebruik.

Toegangspoort per admin

Alleen de assistent toont aan een ingelogde beheerder wiens gebruikersnaam en e-mail overeenkomen met een OpsIQ -agent toegewezen aan deze werkruimte. Eigenaars slagen altijd. Gebruik de knop Controleer mijn toegang voordat u het inschakelen of kunt uw eigen team uit te sluiten.

AI Persona

Toon naam, header-tagline en een aangepaste welkomstbericht getoond wanneer het paneel wordt geopend.

Slimme Quick-Action Chips

Bewerk het label en de onderliggende prompt voor elke snelkoppeling, voeg uw eigen of reset toe aan standaardinstellingen. Het label is wat de notenbalk ziet, de prompte is wat AI ontvangt.

Kleuren en vorm

Chipvorm (pils, afgerond, vierkant), chipkleuren, kaartthema en lanceeraarvorm (rond, eekhoorn, vierkant) met een live preview.

Geheugen van gesprekken

De assistent herinnert zich elke persoonsgeschiedenis tijdens browsersessies, tot 120 berichten, opgeslagen in uw eigen database. Wis het om opnieuw te beginnen.

Instellingen

Instellingen: Client Chat

Het chat-widget dat uw klanten gebruiken, en het grootste gebied van Instellingen. Zes subtabs, met de master switch en Save gepind aan de bovenkant van het tabblad.

Werk door de subtabs in volgorde van een nieuwe installatie: Identiteit en kopieer, Uiterlijk, Gedrag, Ondersteuning Flow, Kennistraining. Geavanceerd is infrastructuur en kan wachten.

Identiteit en kopie

Merkidentiteit

Widgetnaam, tagline, AI-naam, de naam die wordt gebruikt voor systeemberichten en notificaties inactief, en hoe agentnamen verschijnen. Agent Name Source bepaalt tussen echte namen, een aangepaste naam of een teamlabel.

In-chat groeten

Twee groeten, één voor alle bezoekers en één voor geïdentificeerde bezoekers. Een vraag begint meer gesprekken dan een statement.

Popup-teaser

Het zwevende bericht voordat de chat wordt geopend, met zijn eigen naam, lettergrootte en kleuren. De AI kan de teasers schrijven, met controlemogelijkheden voor hoeveel er gegenereerd moeten worden, hoeveel ze per bezoek tonen en hoe groot het verschil is tussen hen.

Waarschuwingen en overhandiging

Het volledige script: vragen om een naam en e-mail, bevestigingen, het aanvragen van een mens, geen agenten beschikbaar, ticket gemaakt of geannuleerd, overdracht in afwachting. Ongeveer twee dozijn individuele lijnen in een opvouwbaar panel.

Status en notificaties

Drie klant-zichtbare berichten: agent sluit de chat, bezoeker is stil geworden en agent geeft terug aan de AI. Vermijd interne formulering zoals opgelost of triaged.

Componist en suggesties

Input placeholder, het label van de knop "Praat-met-een-mens" en de voorgestelde openingsvragen. Drie goede suggesties laten meer tickets afdwalen dan een pagina met artikelen.

Lancering, Icon en Avatars

Launcher pictogram, een optioneel ander icoon bij open, lanceerder grootte en afbeeldingen voor de menselijke agent en de AI.

Uiterlijk

Thema en glas

Themamodus, een premium kleurvoorinstelling, vervagingsintensiteit en dekking, plus schakelt voor animaties, scheidingslijnen, het verbergen van de statusrij, het verstoppen van de berichtvakkaart en het verbergen op de sluitknop. Begin met een vooraf ingestelde; het stelt tientallen kleuren tegelijk in.

Hoofdkleuren

Launcher, header, help paneel, koppelingen, knoppen, systeem notes en componist, elk met een start-en eindkleur voor kleurverloop. Een gebruik standaard glas optie negeert deze en houdt de transparante afwerking.

Paneel, bubbels en spaanders

Ongeveer dertig pickers die het paneel, de rand, tekst, invoergebied en elk type bubble (bezoeker, AI, agent, typen, systeem) plus suggestiechips en hun zweefstand. Alleen openen voor exacte merkmatching, en contrast controleren op bubbeltekst.

Lay-out en vorm

Paneelbreedte en -hoogte, hoekradius, lettergrootte, schermpositie, lanceervorm, bubble stijl en of avatars tonen. Test de breedte op een telefoon.

Gedrag

AI antwoordt automatisch

De hoofdschakelaar voor AI antwoorden.

Menselijke follow-ups en natuurlijke dubbele tekst

Een zachte follow-up wanneer een bezoeker stil gaat, en een optionele korte tweede bericht de manier waarop iemand zou sturen. Gestemd met max follow- ups per stilte, eerste vertraging, later multiplier, aanwezigheid venster en maximale volgorde venster. Kan worden beperkt tot zakelijke uren, en onderdrukt na een eenvoudige dank.

Antwoorden van de schrijfmachine en antwoordtempo

Of antwoorden woord voor woord uittypen, en hoe snel de assistent antwoordt, door vooraf te stellen of uw eigen minimale en maximale vertraging in milliseconden. Een kleine vertraging leest als meer menselijk dan een direct antwoord.

Live vertaling

Elke agent leest en schrijft in zijn eigen taal terwijl de bezoeker het hunne leest.

Teruggeven aan AI na agent inactief

Minuten van inactiviteit voordat de AI het gesprek hervat.

De chat automatisch openen

Seconden voordat het widget zichzelf opent.0nooit opent. Opdringerig op mobiel; vertrek bij0tenzij getest.

Slimmere antwoorden

Plannen vooruit voor one-pass antwoorden, denkdiepte, een optioneel apart model voor agent antwoorden, tonen redeneren aan bezoekers, tolereren misspellen, lang-gesprek geheugen, beperken van de assistent tot uw bedrijf alleen, prijzen in de bezoeker valuta, en hoe links verschijnen. Alleen praten over je business moet worden op voor bijna iedereen.

Kostenbesparing

Skipt kennis zoeken naar groeten zoals hi en dank, en caps het langste antwoord in tokens. Trims kosten zonder verandering van de kwaliteit van het antwoord op echte vragen.

Talen

Welke talen de widget ondersteunt en hoe het kiest een voor een bezoeker.

Antwoorden op klantaccounts

Antwoorden van een ingetekende klant eigen account, optioneel live opgezocht en eventueel alleen geladen wanneer nodig. Alleen-lezen in alle gevallen; laden-wanneer nodig merkbaar vermindert kosten.

Bedrag van de restitutie

Geassisteerde terugbetalingsverzoeken waarbij de assistent detail en handen verzamelt aan een persoon. Het vult nooit zelf een restitutie in.

Gesprek en widget

Gesprekken achterhouden, een gesprek voortzetten over je verbonden sites, slepend venster, gasten vragen om een e-mail en je team laten veranderen in een ticket.

Eigenschappen van widget

Emoji-picker, bijlagen met een optionele alleen-pasta modus, AI beeld begrijpen, inline iconen, microfoon, talk-to-agent knop, bezoekersgeluiden, bijlage preview, voice-call knop en session isolatie. AI afbeelding begrip is wat laat een bezoeker plakken van een fout schermafdruk en krijg een nuttig antwoord.

Beheerder Postvak IN, Meldingen en Welkomstpopup

De bezoeker verwelkomt popup, plus uw agent waarschuwingen: inbox geluiden, desktop meldingen, fluistergeluiden, of privé fluisteringen piepen, en het inbox poll interval.

Ondersteuningsstroom

Menselijke overdracht

Hoe verzoeken voor een persoon worden toegewezen, de seconden die een agent moet beantwoorden, of het weigeren van de chat teruggeeft aan de AI en of de KI hervat wanneer de timeout verloopt. Configureer dit voordat je live gaat of een bezoeker die vraagt om een mens wacht gewoon af.

Werktijden

Openingstijden, tijdzone en het bericht van gesloten uren. Buiten deze uren zal de AI geen mens aanbieden. Een aparte planning van de ticketuren onder OpsIQ Schrijven.

Antwoorden wanneer de AI uit is

Het eerste antwoord op een nieuw bericht, het antwoord wanneer iemand al in de wachtrij staat en hoe lang voordat hij zich herhaalt.

Offline formulier

Toont een contactformulier in plaats van het gesprek.

Ticket opzoeken en afdeling meldingen

AI ticket sensitive, dus een bezoeker die een ticketnummer citeerde krijgt zijn echte status en welke afdelingen de AI naar toe kan leiden. Een ingebouwd panel toont de werkelijke ontvangers voor elke afdeling, opgelost op dezelfde manier als de kennisgever ze oplost, zodat je kunt zien voordat een klant dat doet dat een afdeling niemand waarschuwt.

Help bij het centreren in chat-widget

Laat bezoekers gepubliceerde artikelen doorbladeren zonder de chat te verlaten. U kiest waar het invoerpunt verschijnt, het onderste streepjeslabel en pictogram, en of u een link naar het volledige helpcentrum moet aanbieden. Standaard wordt dit niet gedaan.

Gespreksscore

Sterrenklasse geactiveerd wanneer een agent de chat sluit, als er een overdracht eindigt of na een inactiviteitsperiode die je hebt ingesteld. Kies één of twee triggers, niet allemaal.

Na-chatenquête

Een korte enquête wanneer de bezoeker sluit het gesprek, met uw vraag, vertraging, timing regel en een cap per bezoek. Bezoekers kunnen ook e-mail of downloaden van het transcript. Eén vraag wordt beantwoord; drie niet.

Post-chat email enquête

Een follow-up survey per email na het gesprek eindigt, optioneel in de taal waarin de bezoeker chatte, met controle over vertraging, onderwerp, intro, vraag, zowel knop labels als de bedanklijn.

Feedback beantwoorden

Duimen omhoog en duimen naar beneden op elke AI antwoord, voeden van de kwaliteit dashboards.

Conversatiearchief

Auto-archief na dagen, automatisch oplossen na minuten stilte en verwijderen van gearchiveerde gesprekken na dagen. Een derde plaats retentie is ingesteld, naast General en Tracking.

Kennis Training

Wat de assistent eigenlijk weet, is niet zo belangrijk.

Kennistraining op de website

Kruipt uw site zodat de assistent kan antwoorden. Tot tien start links, een pagina limiet, een koppeling diepte en uitgesloten mappen. Een enkele URL kan worden getest voordat de volledige crawl. Exclusief kassa, account en admin paden.

Inbeddingen

De API sleutel en model die pagina's veranderen in zoekbare betekenis eerder dan trefwoord wedstrijden.

AI Kennisorganizer

Eén klik en de AI leest elke veelgestelde vragen en gekropen pagina en sorteert ze in categorieën.

Veelgestelde vragen, Geverifieerde antwoorden

Vraag en antwoord paren behandeld als de hoogste prioriteit bron, elk met een status, gewicht en categorie. Zoekbaar, importeerbaar van JSON, en de AI kan ze schrijven uit een beschrijving van uw bedrijf. Wanneer de assistent iets mis heeft, schrijf een FAQ: het is hoger dan gekropen pagina's, dus de oplossing is onmiddellijk.

Geavanceerd

Prestaties en grenswaarden

Besprekingsinterval, limiet van de berichtsnelheid en venster, maximale bijlagegrootte, bijlage pogingen per window, en toegestane bestandsextensies. De extensielijst is een beveiligingscontrole; houd het strak.

Realtime levering

Instant bericht en status levering in plaats van peiling, via Pusher, Ably of Firebase, met een terugval polling interval. Polling is prima voor de meeste sites.

Aanmeldingen pushen

Apparaatwaarschuwingen voor agenten via Pusher Straal of OneSignal, met een apparaatinteresse.

Webduwen (VAPID)

Browser push met behulp van uw eigen gegenereerde toetsen zonder externe provider. Gegenereerd hier, niet in de gevarenzone.

Spraak, video en scherm delen

TURN referenties dus oproepen verbinden via beperkende netwerken, met behulp van Cloudflare of Twilio referenties of uw eigen TURN URL, gebruikersnaam en credential.

Inbox-workflow

Werkruimte instellingen voor agent in plaats van bezoekersinstellingen: eerste reactie SLA in minuten, opgeslagen wachtrij weergaven, toetsenbord sneltoetsen en het commando palet, in-gesprek zoeken, en klantentickets in de inspecteur.

Berichtkanalen

WhatsApp, SMS, Facebook Messenger, Instagram, Telegram, X directe berichten en LINE, elk met zijn eigen AI auto-reply switch, plus een beleidsschakelaar voor AI acties op kanalen, een antwoord debounce en de Whatsapp re-engagement template. Elk kanaal landt in dezelfde postvak IN als web chat.

Een live widget-voorbeeld onderaan het tabblad updates als u deze bewerkt. Gebruik dit in plaats van uw website opnieuw te laden om een wijziging te controleren.
Instellingen

Instellingen: Sjablonen

Elke e-mailOpsIQstuurt, en degene die ze allemaal frames. Bewerk de formulering van een bericht, en schrijf sjablonen van jezelf voor allesOpsIQniet al verstuurd.

Eén ontwerp, veel berichten

De globale e-mailsjabloon is de wrapper: uw logo, de header, de kaart, de typografie en de voettekst, met een leeg midden. Elk bericht OpsIQ verzendt wordt ingevoegd in dat midden. Bewerk de wapper eenmaal en elke e-mail verandert samen

Er is geen manier om een e-mail te versturen uit OpsIQ zonder deze wikkelaar. Het wordt toegepast op het enige punt dat elk bericht doorlaat, dus een later toegevoegd bericht kan het niet missen.

Een bericht bewerken

1
Instellingen openen, dan sjablonen

Berichten worden gegroepeerd door wat ze zijn: ticket en portal, Store, inlog- en accountbeveiliging, boekingen, gesprekken en meldingen, rapporten, PeopleOS brieven, en uw eigen.

2
Druk op Bewerken op degene die u wilt

Je krijgt het onderwerp, een rijke teksteditor met een HTML weergave kunt u overschakelen naar live, en een voorbeeld van de voltooide e-mail precies zoals de ontvanger ontvangt .

3
De variabele spaanders gebruiken

De chips boven de editor zijn de feiten die veranderen: een ticketnummer, een orderreferentie, een boekingstijd. Klik op één om het te laten vallen waar de cursor is.

4
Opslaan

Alleen dat bericht is geschreven. Laat een veld leeg en het houdt zijn ingebouwde tekst; de pil op de rij vertelt u in welke staat het is.

💡
Een variabele die u niet gebruikt wordt verwijderd wanneer de e-mail verzonden wordt, en zo is ook de lijn waarop het zit. Daarom stuurt een boeking zonder telefoonnummer nooit "Phone:" met niets erna.

Schrijf je eigen sjabloon

Gebruik dit voor een berichtOpsIQniet al verzenden: een leveringsbericht, een verlenging herinnering, een welkom pakket, een licentie sleutel. Het krijgt alles wat een ingebouwde bericht krijgtAPI.

1
Druk op Sjabloon toevoegen

De knop zit bovenaan de pagina Templates en weer naast "Uw eigen sjablonen."

2
Noem het maar.

De naam wordt de referentie die uw systeem doorstuurt, getoond onder het veld als u

3
Zeg waar het voor is en wanneer het verzonden wordt

Deze twee regels zijn wat u en uw collega's gelezen hebben op de Templates pagina over een jaar. Ze zijn dertig seconden waard.

4
De delen die veranderen tonen

Comma-afgescheiden, bijvoorbeeld: naam, wanneer tracking_link. Elk wordt een {{variable}} je kunt vallen in het onderwerp of het bericht, en uw systeem vult het op verzendtijd.

5
Het onderwerp en het bericht schrijven

Gewone zinnen zijn fijne . . regel breekt worden alinea's. Schrijf de boodschap alleen; het logo, header en voettekst komen uit de globale template.

6
Maak het aan en open het dan.

Het verschijnt onder "Je eigen sjablonen" met de volledige editor en een live preview, hetzelfde als elk ingebouwd bericht.

⚠️
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.

Uw eigen sjabloon versturen

Twee oproepen op het product API. De beller levert de ontvanger en de variabelen

Geef uw sjablonen en de variabelen die elk van u neemt
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{ "action": "email.templates.list", "mine": true }
Stuur het maar door.
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"
  }
}
💡
Variabele namen gaan ZONDER beugels in de API call. email. templates. list geeft ze terug in precies de vorm waarin je ze doorgeeft.

Sjablonen en uw plan

Een bericht waar u geen service voor heeft

Blijft vermeld met een "Zie plannen" link en geen editor, zodat u kunt zien wat OpsIQ zou verzenden, en wat ontgrendelt het.

Je eigen templates

Kies de service waartoe een sjabloon behoort wanneer u het aanmaakt, of laat het op Elk plan staan. Een werkruimte zonder die dienst ziet het vermeld maar kan het niet bewerken of verzenden.

Aanmelden, beveiliging, meldingen en de e-mailtest

Nooit gepland. Het niet kunnen repareren van de formulering van een wachtwoord dat uw eigen beheerders ontvangen zou het verkeerde soort slot zijn.

Vragen

Kan ik het ontwerp voor één bericht wijzigen?+

Nee, en bewust. Het ontwerp is de wrapper en het wordt gedeeld, dat is wat houdt elke e-mail herkenbaar aan jou. Wat per-bericht is de formulering, de feiten paneel en alle knoppen die u toevoegt in het bericht.

Wat gebeurt er met mijn formulering als ik op Reset druk?+

Reset verschijnt alleen op het globale sjabloon en vervangt wat er in de editor staat met het ingebouwde ontwerp. Er wordt niets geschreven totdat u op Opslaan drukt, zodat u het dialoogvenster kunt sluiten om uw gedachten te veranderen.

Ik heb per ongeluk een van mijn sjablonen verwijderd.+

Het verwijderen duurt twee klikken voor precies die reden . . de eerste armen het en vertelt u wat zal stoppen met werken. Als het al is verdwenen, maak het opnieuw met dezelfde naam en dezelfde verwijzing komt terug; alleen de formulering moet worden gehertypt.

Kan een connector of add-on zijn eigen sjablonen meenemen?+

Ja. Een pakket draagt een mail_templates._json in zijn eigen directory, en de berichten ervan worden weergegeven onder "Developer templates" met dezelfde editor, voorvertoning, wrapper en plan gate. Uw formulering bewerken behoren tot uw werkruimte en overleven het pakket bijwerken.

Instellingen

Instellingen: OpsIQ Schrijven

Tickets werden schriftelijk beantwoord: automatische antwoorden, het ticketsysteem van de oorspronkelijke klant, escalatie, openingstijden, routering en e-mails die op klanten betrekking hebben.

Automatisch antwoord

OpsIQ Schrijvende knoppen tonen

Voegt de schrijfhelperknoppen voor uw agenten in de admin toe.

Automatisch antwoord van ticket inschakelen

Wacht nieuwe tickets en antwoorden op en beantwoord ze na een vertraging. Begin met het uit en bekijk ontwerpen voor een week. Terugbetalingen, annuleringen en toegang wijzigingen moeten altijd een persoon bereiken.

Automatisch antwoord

Wat voor afdelingen antwoord geven, is iets wat niet vermeld staat.

Vertragingsschema beantwoorden (minuten)

Hoe lang moet ik wachten voordat het automatische antwoord wordt verstuurd. Een direct antwoord leest als een robot; enkele minuten leest als snel team.

Max AI antwoorden per afdeling

Een maximum per dienst, bijvoorbeeld Billing 1 en ondersteuning 3. Zonder dop kan een verwarde draad doorlopen.

Lengte, status en identiteit beantwoorden

Maximale schrijftekens, de ticketstatus na een antwoord en na een escalatie, en aan welke admin account de automatische antwoorden worden toegeschreven. Gebruik een duidelijk genoemde rekening zodat personeel kan vertellen AI antwoorden van menselijke reacties.

Inheemse ticketoperaties

Inheems ticketsysteem

Het ticketsysteem ingebouwd in OpsIQ, voor installs zonder externe helpdesk.

Pijp inkomende e-mail naar inheemse tickets

Inkomende e-mail verandert in tickets. OpsIQ levert het eindpunt URL, auth token, script pad en PHP binair. Alles wat kan posten naar dat eindpunt kunnen tickets maken, dus houd de token geheim.

Multi-turn antwoorden en vertraging en debounce

Of de AI blijft antwoorden als het gesprek verdergaat, en of het wacht een rustig venster zodat drie snelle berichten krijgen één overwogen antwoord. Het stille venster is de beste enkele instelling voor het maken van automatische antwoorden voelen beschouwd.

Publiek ondersteuningsportaal

Een pagina met klantengerichtheid waar iedereen een ticket kan verhogen en volgen, met een optionele welkomstregel. Het adres en de look zijn geconfigureerd in het tabblad Ondersteuningsportal.

Ticketnummerformaat

Hoeveel willekeurige letters verschijnen in gegenereerde ticketnummers.

E-mail klanten in hun eigen taal

Ticket e-mails volgen de taal van de klant. Personeel e-mailadres verandert nooit taal: meldingen, afdeling waarschuwingen, briefings en geplande rapporten blijven in uw systeemtaal.

Bedankt en bevestigingen

Een vaste bevestiging op nieuwe tickets, plus bevestigingsberichten wanneer een ticket wordt geopend, als feedback wordt achtergelaten en wanneer het ticket is gesloten, elk met een live preview. Er is ook een globale e-mail sjabloon wrapper en de link achter de knop bekijken van uw ticket.

AI spamscreening

Screens tickets van onbekende afzenders, en kan optioneel verdachte spam verplaatsen op zijn eigen. Laat de automatische beweging uit totdat u het oordeel hebt bekeken.

Automatisch sluiten van niet-actieve tickets

Sluit een ticket na een aantal rustige dagen. Vertel de klant in het slotbericht hoe te heropenen.

Openingstijden (SLA-agenda)

Tijdzone, openings- en sluitingstijd, werkdagen en feestdagen voor eerste antwoord en resolutietimers. Een apart schema van de werkuren onder Client Chat.

Nieuwe tickets automatisch toewijzen

Automatische toewijzing, optioneel alleen aan online agenten met een agent-vaardigheden en een matchgevoeligheid voor skills-gebaseerde routering.

Stel dubbele tickets voor

Vlekken wanneer een klant een ticket opent dicht bij één die ze al hebben, met een instelbare match gevoeligheid.

Tevredenheidsonderzoek na afsluiting

E-mailt een enquête per dag na sluiting. Resultaten verschijnen op de CSAT pagina.

De afdeling per e-mail op de hoogte stellen

E-mailt de afdeling wanneer een nieuw ticket aankomt. Ontvangers zijn leden van die dienst, niet het postbusadres van de afdeling, dat is de inkomende adrestickets komen op.

Wat kan de AI lezen

Toegang tot AI-clientgegevens

Een master switch plus individuele alleen-lezen permissies voor de samenvatting van het clientprofiel, facturen, transacties, creditsaldo, producten en diensten, domeinen, gekoppelde servers en een hoog niveau rekeningoverzicht. Begin met de profielsamenvatting en voeg categorieën toe als antwoorden ze nodig hebben.

Rolverdeling en kennis

AI-ticketes escaleren inschakelen

Verplaatst een ticket naar een beter uitgeruste afdeling voordat u antwoord geeft. U kiest de toegestane afdelingen, de controlevertraging en kunt uw eigen instructies schrijven over escalatie. Zet de interne escalatienota aan zodat uw team kan zien waarom een kaartje verplaatst is.

Kennisinstellingen

Of antwoorden de klanttaal gebruiken, of ze gebruik maken van gekropen links en FAQ's, of het AI afbeelding leest en PDF bijlagen, de kennisantwoordmodus, al dan niet geïmporteerd JSON kennis wordt gebruikt, en of bronlinks kunnen verschijnen. Gebruik gekropen links en veelgestelde vragen moet worden ingeschakeld, of de AI is gissen.

Automatisch antwoord stoppen na menselijk antwoord

Als de AI antwoordt, kan de KI je eigen agent bellen.

Ticket- en e-mailinstructies

Vrije tekst instructies vormgeven toon en inhoud voor elk antwoord, met een belastbaar werk voorbeeld. Wees specifiek over wat de AI nooit mag doen.

Importeren JSON kennis

Upload of plak a JSON kennisdossier voor de schrijfassistent.

Knoppenstudio

Een volledig ontwerper voor de klantgerichte knop: displaystijl, grootte, label, pictogram, vorm, minimale breedte, achtergrondstijl met primaire en secundaire kleuren, hellingshoek, rand, hoekradius, schaduw, typografie, padding, inactieve animatie, zweefbeweging en -kleuren, en de focusring, plus een aangepaste CSS doos voor alles wat de besturing niet dekt.

Instellingen

Instellingen: Ondersteuningsportaal

De site waar mensen tickets ophalen en volgen en uw hulpartikelen lezen. Dit tabblad bepaalt hoe het bereikt wordt en hoe klanten zich aanmelden; zijn visuele ontwerp gebeurt in de Support Portal Studio.

Portal Studio of Ingebed Ticket Portal: welke wil ik?

Dit zijn twee verschillende producten en mensen mengen ze voortdurend. Ze lossen verschillende problemen op, en samen rennen is normaal.

Ondersteuning Portal Studio: een plek waar u klanten naartoe stuurt

De Studio ontwerpt een volledige support site die OpsIQ hosts voor u. Het heeft een eigen webadres, of uw eigen domein, en het draagt de hele self-service ervaring: help artikelen met zoeken, het aanvraagformulier, ticket geschiedenis, klant aanmelden en de assistent. Kies een sjabloon, werk via Thema, Navigatie, Layout, Kennis, Footer, Merk, Tickets, Assistent, Formulier en CSS, preview op bureaublad, tablet en telefoongroottes, vervolgens publiceren.

Gebruik het wanneer u wilt een merk bestemming kunt wijzen elke klant op, en je zou liever niet bouwen of onderhouden van een ondersteuningsgebied binnen uw eigen website.

Ingebed Ticket Portal: tickets op uw eigen site

De inbed plaatst alleen de ticketervaring op een pagina van uw eigen website. Klanten openen, volgen en beantwoorden verzoeken om ondersteuning zonder ooit uw pagina's te verlaten, en je eigen header, navigatie en ontwerp blijven precies zoals ze zijn. Stel de regels voor indeling, uiterlijk en toegang in de widget bouwer, bekijk het resultaat, kopieer vervolgens de embed knipsel op uw pagina.

Gebruik het wanneer U hebt al een website of applicatie met zijn eigen ontwerp, en u wilt ondersteuning om te gebeuren binnen in plaats van de klant uit te leveren aan een ander adres.

De korte versie

De studio bouwt een plaats waar u klanten naartoe stuurt. De embed brengt kaartjes naar waar uw klanten al zijn. Veel bedrijven draaien beide, het inbedding van de ticket widget in hun rekening gebied voor in-context verzoeken terwijl het houden van de gehoste portal als volledige selfservice bestemming met artikelen en zoeken. Ze zijn onafhankelijke switches.

Adres en toegang

Toegangsmodus

Of het portaal nu voor iedereen toegankelijk is of beperkt tot ingetekende klanten. Open portals krijgen meer tickets en meer spam.

Opmaakkeuzes

Of het portaal en helpcentrum nu één held delen of twee gebruiken, welke navigatie- en voetteksten op beide oppervlakken voorkomen, en het label voor de navigatiesectie.

Poortadres

Het adres dat klanten gebruiken. Kies een naam en OpsIQ toont het resulterende portaal en de bijbehorende helpcenteradressen. Later wordt deze gewijzigd door links die u al hebt verzonden te wijzigen.

Uw eigen domein

Serveert het portaal vanuit een domein dat u bezit, zoals support. yourdomein. com.

Ingebed ticketportaal

Schakel de drop-in widget hierboven beschreven, en opent de embed builder waar u kiest voor de lay-out, uiterlijk en toegangsregels, een voorbeeld van het resultaat en kopieer het knipsel voor uw pagina. Dit is niet de Portal Studio: de studio ontwerpt de gehoste portal, dit plaatst tickets in je eigen site. Beide kunnen op één keer worden gestart.

Hoe klanten zich aanmelden

Dit zijn uw klanten aanmelden opties. Personeelsaanmelding is geconfigureerd onder Instellingen, Veiligheid.

Aanmeldmethoden

Welke opties verschijnen op de inlogpagina. Aanmelden van connector en e-mail werkt automatisch.

Sociale aanmelding

Consumentenaccountproviders, die elk een client ID en geheim nodig hebben, met het door OpsIQ opgegeven omleidingsadres om zich bij die provider te registreren.

Enkelvoudig aan te geven (OIDC)

Klant aanmelden via een identiteit provider, met uitgever URL, client ID, geheim en een optioneel toegestane e-mail domein lijst.

Klant SAML 2.0

De SAML equivalent. OpsIQ levert het antwoord van de ACS URLen SP entiteit ID; u verstrekt de IdP entiteit ID, aanmelden en aanmelden URLs, X.509 certificaat en optionele attribuutnamen.SAML in Sign-in methoden of het zal niet verschijnen.

Naadloze aanmelding van uw app

Een ondertekende diepe link zodat een klant al aangemeld bij uw toepassing landt in het portal zonder opnieuw aanmelden. OpsIQ levert het ondertekening geheim, portaal URL en werkruimte sleutel, een volledige route voor uw taal (PHP, Laravel, WordPress, WHMCS, Node.js, Flask, Django, .NET, Rails, Java, Go, en op zelf-gehoste installaties de OpsIQ server zelf), stap-voor-stap setup notes, en een generator voor een ondertekende testlink. Gebruik de generator alvorens een code te schrijven.

Hoe werkt de route?

Uw klant klikt op een ondersteuningslink die wijst op de route. De route vindt dat de klant is aangemeld bij uw app (een gast wordt verzonden naar uw login en terug), leest het geheim van uw server, tekent een eenmalig token dat verloopt in twee minuten, en verwijst door naar het portal met geen-verwijzing en no-store kopregels zodat het token niet gecached of gelekt wordt.

Eigen Aanmeldknop van het portaal

In Portal Studio, Aanmeldpagina, zet aan Login van mijn website gebruiken en stel je login pagina in URL op dezelfde route. Het portaal voegt opsiq_portal_return (de pagina waar de klant op stond); de route eert het alleen als het zich in uw portal adres bevindt en brengt de klant terug, ingelogd.

WHMCS_

Niets te schrijven: de WHMCS haak van Remote Sites tekent al klanten in het portal en behandelt het retouradres URL om uw WHMCS client area login.

Overal uitloggen

Uitloggen van het portaal tekent ook de klant uit uw aanvraag.

Inname en bescherming

Velden voor het aanvraagformulier

Welke gestructureerde velden het aanvraagformulier verzamelt. Elk extra veld verliest inzendingen, dus vraag alleen om wat je nodig hebt om te triage.

Bescherming van spam en misbruik

Een honingpot en snelheidsbeperking beschermen altijd het publieke formulier. Bovenop kunt u wegwerp-e-mailadressen blokkeren, uw eigen geblokkeerde domeinen toevoegen en een CAPTCHA toevoegen met GooglereCAPTCHAofCloudflareTurnstile.reCAPTCHAgebruikt de sleutels die al zijn ingesteld onder Instellingen, Beveiliging; Turnstile toetsen worden hier ingevoerd.

Portaalanalyse

Een samenvatting van de portalactiviteit in de afgelopen dertig dagen.

Instellingen

Instellingen: Toestemmingen, Licentie, Cron en Gevaar Zone

De Systeemgroep, plus de teamtoegangscontrole die bepaalt wie welke Instellingen tab kan zien.

Toegang tot en machtigingen van het team

Per-admin-rechten

Elke beheerder krijgt een expliciete set machtigingen voor chat-inboxtoegang, welke secties ze kunnen bewerken en hun afdelingen. Iedereen met de functie van Full Administrator heeft altijd alle toestemmingen. Instellingen machtigingen bepalen welke tabbladen iemand ziet, dus geef de smalste set waarmee hij kan werken.

Vergunning

Toont uw huidige licentie, wat het u recht geeft en de status ervan.

Cron-instellingen

Zelfgehoste installatie. Op de OpsIQ cloud worden de geplande taken voor u uitgevoerd en het tabblad is verborgen. Eén regel crontab stuurt elke geplande taak: automatisch antwoord van ticket, escalatie routering, omruil-snelheidsverversing, mailbox polling en connectorsynchronisatie.

1
Regel kopiëren

Het tabblad toont de exacte crontab-regel voor uw server met het juiste PHP binaire programma dat al is gekozen.

2
Voeg het toe aan crontab

Start crontab -e als de gebruiker die PHP draait en plakt de enkele regel. Gebruik in plaats daarvan het Cron Jobs gereedschap op cPanel.

3
Verifiëren

Binnen een minuut de hartslag tegels oplichten. Gebruik Nu rennen om direct te testen in plaats van wachten.

Het hartslagpaneel toont de laatste run, duur en wat werd verwerkt voor zowel de auto-reply wachtrij en de e-mail en connector poll. Het waarschuwt wanneer de laatste ronde kwam van de handmatige webknop in plaats van een echte server cron, en als een hartslag is gaan oud.

Gevaarszone

Alle trackinggegevens verwijderen

Veegt alles af OpsIQ verzameld of gegenereerd. U vink aan wat u moet opnemen en typ de bevestigingszin precies. Instellingen en siteconfiguratie, geblokkeerde adressen, alles wat uw team heeft geschreven (kennisbasis, veelgestelde vragen, vertalingen, portalontwerpen, actiedefinities) en toestemmingsbonnen zijn allemaal bewaard gebleven.

Verwijderen van gegevens ouder dan

Dezelfde sweep beperkt tot records ouder dan 30, 60, 90 of 180 dagen, of een jaar. Voor het automatisch rollen retentie gebruik van de bewaarwaarden in Algemeen en Tracking in plaats daarvan en laat de geplande taak doen.

🚫
Exporteer een back-up van Instellingen, Algemeen voordat u iets gebruikt in Gevaarzone. Deze acties kunnen niet ongedaan worden gemaakt.
Instellingen

Beheer van uw team

Nodig teamleden uit en geef rollen aan om te controleren wie toegang heeft tot wat.

Team
TeamafdelingenHet teamscherm: een tabel met admins met contact, rolbadge (Eeuwig, Full Admin, Agent) en de afdelingen elk kunnen toegang krijgen.TeamafdelingenwerkbladTeamafdelingen+ Beheerder opslaanCONTACTPERSOONROLDEPARTEMENTENAO[email protected]Ada OwusuEigenaarAllesKM[email protected]Kojo MensahVolledige beheerderAllesNT1[email protected]Rita TettehAgentFactureringSB[email protected]AgentSteun1TEAMBeheerbeheerders uitnodigen2ROLESEigenaar · Volledige beheerder · Agent3SCOPEDToegang per dienst
Het echte teamscherm: elke beheerder met zijn contact, rol en de afdelingen die hij kan bereiken, agenten in zicht, eigenaren vol.

Rol

Eigenaar

Volledige toegang inclusief vergunning, facturering en gevarenzone.

Volledige beheerder

Volledige toegang behalve licentie en gevarenzone. Kan beheerders beheren.

Agent

Alleen toegewezen afdelingen. Tickets, chats en analyses.

Uitnodiging van teamleden

1
Ga naar Team

Navigeer naar Team in de zijbalk.

2
Klik op Uitnodigen

Voer de e-mail van het teamlid in.

3
Rol instellen

Kies eigenaar, volledige beheerder of agent.

4
Afdelingen toewijzen

Voor Agenten, selecteer toegankelijke afdelingen.

5
Uitnodiging versturen

Ze ontvangen een e-mail met een setup link.

Instellingen

Teamprestaties

Hoe uw support team werkt. Toegang is per toestemming, niet per rol: de kijkvergunning opent de pagina, het beheer van de machtiging ontgrendelt doelen, QA en de collega-identifier leest, en de beloning-financials toestemming is wat voegt de Beloningen tab. Een team lead kan worden gegeven een van deze zonder dat een volledige beheerder.

Teamprestaties
TeamprestatiesHet team-performance scherm: agenten gerangschikt door een samengestelde score bar, CSAT en een beloningsbalans met een Pay-knop per rij.TeamprestatieswerkbladTeamprestatiesAgentSCORECSATBALANSNT1Rita Tetteh4.8$42BetalingSBSam Boateng - Wikipedia4.5$28BetalingKMKojo Mensah4.2$15BetalingAOAda Owusu4.9$51Betaling1SCOREDSamengestelde prestaties2CSAT & LOADWaarderingen + volume3REWARDSSaldi van de uitbetalende instantie
Het echte team-performance scherm: elk agent scoorde op volume en CSAT, met een beloningssaldo kunt u betalen per rij.

Hoe de pagina wordt georganiseerd

Team Performance is vijf tabbladen. Elk antwoord een andere vraag, en ze zijn besteld door hoe dringend ze meestal nodig hebben u.

01 Commandocentrum

Live-wachtrijstatus, klantresultaten tegen je doelen, hoe capaciteit werd besteed, situaties die een beslissing nodig hebben en de voor bewijs gecorrigeerde per teamgenoot index.

02 Teamgenoten

Het leaderboard, de herkenning (meest verbeterde en strepen), quests, en de opt-in controle voor wie het rangschikken kan zien.

03 Kwaliteit

Scorekaarten, geregistreerde evaluaties, kans-gecorrigeerde beoordelaar overeenkomst, reviewer drift en bewijsgeschillen.

04 Beloningen

Token waarde, uitbetaling claims en de periode allocatie: toestemming voor een gefinancierd plafond, herziening van het voorbeeld, afronding.

05 Geschiedenis

Hoe de werkruimte is verplaatst in de tijd: trend metrics met een grafiek, en a 28 Elke kaart verbergt zich tot er genoeg geschiedenis is om het te tekenen.

Niet-gescoord is niet nul

Een teamgenoot zonder voldoende behandelde volume .. of wiens afmetingen dragend bewijs tot minder dan de helft van het geconfigureerde gewicht toevoegt . . wordt weergegeven als niet-gescoorde. Hun score, rang en band zijn leeg en hun afbraak is verborgen. Dit is opzettelijk: een afwezige meting als nul plaatst iemand aan de onderkant van een ranglijst voor het hebben van een rustige week. Bewijsdrempels zijn configureerbaar per werkruimte in Targets & scoren.

De twee bewijsdrempels doen verschillende taken en het is de moeite waard om ze apart te houden. Minimumafhandeld bepaalt of iemand wordt gescoord. Minimumratings hebben geen invloed op de score: het beslist award and reward approvaling. Dus een teamgenoot kan volledig worden beoordeeld en gerangschikt en nog steeds niet in aanmerking komen voor die periode, omdat er te weinig klanten beoordeelden hen.

💡
Elke figuur is gescoped naar de werkruimte die je bekijkt en het tijdbereik dat je kiest. Een teamgenoot die in twee afzonderlijke werkruimten werkt heeft een onafhankelijk record in elk van deze. Twee uitzonderingen zijn de moeite waard om te weten: een site GROUP is één werkblad, dus haar ledendomeinen worden samen gemeten; en de All-sites weergave meet bewust alles tegelijk.

De prestatie-index

Een samenstelling van vijf dimensies, elk gemeten tegen een doel dat je hebt ingesteld in plaats van tegen collega's, dan getrokken naar het midden wanneer de bewijzen erachter is dun. Let op de richting: de aanpassing beweegt de figuur naar 70, dus wordt een dunne uitstekende score naar beneden getrokken en een dunne slechte score omhoog gehaald. Een slechte eerste week op vier gesprekken is geen vaste uitspraak ook niet. Als bewijs accumuleert de aangepaste cijfer convergeert op de ruwe.

Kwaliteit

Tevredenheid van de klant uit geverifieerde feedback. Aangevuld met QA scorecard resultaten waar die bestaan en worden bestuurd.

Responsiviteit

Eerste responstijden bij de P50 en P90-percentielen, tegen je doelen.

Resolutie

Resolutietijd en een-aanraakresolutie.

SLA

Bezwaar tegen de SLA die je hebt geconfigureerd, plus risico en schending van het aantal.

Stewardship

Heropenen en overdrachtstarieven . Het werk dat terugkomt.

💡
Gewichten zijn configureerbaar en relatief; ze hoeven niet te totaal 100_. Ontbrekend bewijs kan alleen de index verlagen, nooit verhogen

Capaciteit en productietijd

Bezetteheid, productieve tijd, opgelost per productief uur en online aandeel van het venster. Gebruik wordt bewust niet gemeld: het heeft geplande uren als noemer nodig, OpsIQ heeft geen rooster of shift bron, en een vervangen noemer zou een gok zijn met een percentage teken. Het leest als onbeschikbaar met die reden eraan gehecht.

⚠️
Alleen rapporteren. Bezetteheid zegt hoe tijd werd besteed, nooit hoe goed het was besteed, en het nooit geld, poorten of maten een betaling. Een teamgenoot zonder handle-time bewijs leest als onbeschikbaar, nooit als nul.

Kwaliteitsborging

Een scorekaart is de rubric reviewers scoren echte gesprekken tegen. Alleen een gepubliceerde versie kan een evaluatie ontvangen, en het publiceren van een nieuwe versie nooit herschrijft wat al was gescoord. Een beoordeling is bewijs over één gesprek, niet een oordeel over een persoon.

Overeenkomst tussen de beoordelaars

Gemeld als een kans gecorrigeerde statistiek (Cohen's en Fleiss 'kappa), geen rauw akkoord percentage. Twee recensies die alles passeren overeen 100% van de tijd, terwijl het dragen van geen informatie.

Recenseerdrift

Of een recensent scoort systematisch harder of zachter dan hun collega's op hetzelfde gesprek . . een vergelijking met de rest van het panel, niet een trend in de tijd. Het moet een interactie onafhankelijk meer dan eens worden beoordeeld.

Geschillen

Een teamgenoot kan formeel bewijs dat over hen is vastgelegd betwisten. Een open geschil blokkeert de beloningsperiode tot het einde van de periode.

Zelfevaluatie

Een teamgenoot kan geen evaluatie van zichzelf indienen.

⚠️
AI-gegradeerde evaluaties kunnen pas van invloed zijn op de beloning als een kalibratie is gepubliceerd, waarin wordt aangetoond dat het model goed genoeg overeenkomt met menselijke reviewers, gemeten door kappa tegen een minimummonster. Een open poort betekent dat het met mensen overeenkomt die dicht genoeg zijn om te tellen

Erkenning

Ranking alleen heeft gedocumenteerd falen modes: metrische gaming, burnout en publieke schaamte van wie de laatste is. Drie alternatieven zitten naast het.

Meest verbeterd

Gemeten tegen een teamgenoot's eigen eerdere plaat, nooit tegen collega's met krimp dus een kleine noemer kan geen winst kopen.

Streaks

Consecutieve perioden die voldoen aan een vaste, aangegeven bar . gemiddelde rating, behandeld volume, ratings tellen en negatieve-feedback rate, alle absolute cijfers. Iedereen kan een streep tegelijk houden, zodat het creëert geen rangschikking, en een collega met een uitzonderlijke maand kan niet breken de uwe.

Opt-in rangschikking

Standaard is het een teamgenoot die altijd zijn eigen index ziet; of ze collega's zien is een werkruimte beslissing. Percentiele banden kunnen worden gepubliceerd in plaats van absolute posities.

💡
Erkenning raakt nooit geld. Een streep kan geen uitbetaling of breuk te financieren, en de meeste verbeterd is niet een categorie van prijzen.

Quests

Een doel waar het team naartoe werkt, gemeten tegen een vaste aangegeven bar in plaats van tegen elkaar .. zodat iedereen dezelfde zoektocht kan wissen in dezelfde periode.

Toepassingsgebied en cadans

Individueel of team; eenmalig, herhaalbaar of seizoensgebonden met een expliciet venster.

Criteria

Gesprekken behandeld, ratings ontvangen, actieve dagen, gemiddelde rating of negatieve feedback rate. Alle absolute

Kwaliteitsbewaking

Vereist op elke zoektocht met een volume doel. Het raken van het aantal terwijl de kwaliteit valt onder de vloer houdt de zoektocht in plaats van voltooien, en het wordt weergegeven als niet-afgerond.

Herhaalgrenzen

Een per-periode dop, aangedreven door het langzaamste criterium, plus een optionele afkoeling voordat een herhaling kan tellen.

Team-quests

Gedeelde vooruitgang zonder per-team naamsvermelding gepubliceerd, dus een team quest kan geen leaderboard worden.

Coachingsessies

Een coachingsessie is een record, geen gesprek. Er wordt een coach, een teamgenoot gecoacht, een geplande tijd, overeengekomen gesprekspunten en daarna een samenvatting geschreven. Echte chats, tickets en QA evaluaties worden er als bewijs aan gekoppeld, dus het gesprek is verankerd in werk dat eigenlijk gebeurde eerder dan op een herinnerde indruk.

Pratende punten

Akkoord voor de sessie, dus de teamgenoot komt niet in een verrassing.

Gevonden bewijs

Chats, tickets en QA-evaluaties die aan de sessie zijn gekoppeld. Een speld slaat een referentie op, een type en een id, niet een kopie, dus het wijst altijd naar de live record. OpsIQ controleert het ID niet voordat het wordt geaccepteerd.

Actiepunten

Elk met een eigenaar en een vervaldatum. Een item dat voorbij de datum is weergegeven als te laat

Privé-notitie

De coach's eigen notitie. De teamgenoot die wordt gecoacht kan het nooit lezen

Wie kan een sessie zien

De coach, de teamgenoot en iedereen met toestemming voor het managementteam.

Controle

Elke creatie, update, pin, unpin en voltooiing wordt opgenomen met wat veranderd is, door wie.

💡
Coaching is bewust gescheiden van scoren en geld. Een sessie verandert niemands index, geeft geen beloning af en verschijnt niet op het leaderboard.

Beloningen en awards

De opgenomen activiteit wordt omgezet in tokens met een contante waarde die u hebt ingesteld. Het pad naar een betaling is opzettelijk traag en elke stap wordt geregistreerd.

1
Tokenwaarde instellen

Hoeveel tokens zijn gelijk aan hoeveel geld, en wat elke activiteit waard is.

2
Het gefinancierde maximum goedkeuren

Voor een gesloten kalenderperiode vermeldt de full administrator het maximum van de tokens die hij mag betalen. Het opslaan van het instellingenformulier geeft geen toestemming voor een budget en kan een plafond dat al is goedgekeurd niet wijzigen.

3
Bekijk het voorbeeld

Ontvangers, reserve en de reden waarom iedereen niet in aanmerking komt. Open bewijsgeschillen blokkeren deze stap.

4
Afronden

De allocatie wordt permanent geregistreerd met het bewijs erachter. Een periode die niets toegewezen kan worden nietig verklaard en opnieuw uitgevoerd regelrecht. Eén die uitgegeven tokens moet eerst worden omgekeerd: OpsIQ schrijft een compenserende invoer tegen elke portemonnee en nooit verwijdert het origineel, dus het grootboek laat nog steeds zien wat er gebeurd is en waarom, en alleen dan is de periode vrijgegeven. De omkering weigert als iemand heeft al meer uit te geven dan het bedrag dat wordt teruggevorderd, en namen wie en door hoeveel.

⚠️
Subsidiabiliteit vereist geverifieerde feedback van klanten. AI-kwaliteitscores kunnen dat oordeel aanvullen maar nooit vervangen, en een teamgenoot die wordt getoond als niet-gescoorde is niet in aanmerking komen. Elke deelnemer wordt begrensd op 25% boven hun verwachte aandeel in de periode, zodat één maand met zeer hoge volumes het hele budget niet kan absorberen.
💡
De eigenaar van de rekening neemt geen deel aan awards of token beloningen, zonder schakelaar: ze staan het gefinancierde plafond toe en voltooien elke toewijzing, en er is niemand boven hen om goed te keuren wat zij zelf zouden betalen. Hun werk wordt gemeten, gescoord en gerangschikt op het bord precies zoals iedereen anders.

Iedereen neemt standaard deel, team leidt en mede-eigenaren inbegrepen. Om iemand buiten te laten, open ze in Team & Departments en schakel de takes part uit in awards en beloningen optie. Hun werk wordt nog steeds gescoord en getoond; ze stoppen met het zijn van een kandidaat vanaf dat punt, en niets al afgerond is geraakt.

⚠️
Niemand keurt geld voor zichzelf goed. Omdat de mensen die kunnen deelnemen ook de mensen zijn die kunnen goedkeuren uitbetalingen, OpsIQ weigert een uitbetaling of krediet in uw eigen portemonnee, het betalen van je eigen claim, het afronden van een periode waarin u zou worden betaald, en het voltooien van een award die u zou winnen. Een andere full administrator of de eigenaar moet doen. Betaal alle claims slaat uw eigen en rapporteert als overgeslagen, niet mislukt.

Wie kan zien en doen wat

Teamprestaties bekijken

Het bestuur, live state, capaciteit en kwaliteit overzicht voor de werkplek.

Teamprestaties beheren

Targets en scoren, exporten, QA-scorecards en evaluaties, coaching, quests en de lezingen die collega-identificerende gegevens zoals per-admin geschiedenis en awardgeschiedenis dragen.

Bekijk team beloning financiën

Saldi, contante waardes, vorderingsnota's en betalingsverwijzingen .. gescheiden van prestatie-informatie omdat het loonaangrenzend is.

Alleen volledige beheerder

Elke geldmutatie: een beloning betalen, betalen of weigeren van een claim, toestemming geven voor een begroting, het afronden, nietig maken of omkeren van een toewijzing en de vaststelling van de token-tot-cash rate. Deze kunnen niet worden gedelegeerd door toestemming te verlenen.

Het eerlijk gebruiken

De prestatie-index is management bewijs, niet een automatische werkgelegenheid beslissing. Open de bron gesprekken achter een nummer voordat u op te treden, en weeg geval complexiteit, schema's, verlof en toegankelijkheid behoeften. Een enkele moeilijke week lijkt niets als een aanhoudende patroon.

Instellingen

Uw sites (werkruimten)

Met sites (werkruimtes) kunt u meerdere websites beheren vanaf één OpsIQ installatie. Elk heeft zijn eigen tracking, AI, connectors en teamtoegang.

Sites
Uw sitesHet scherm van de sites: een lijst met werkbladen, elk met zijn domein, type, connector, status badge en een Open-knop, plus Add-new-site.Uw siteswerkbladUw sites+ Voeg nieuwe site toeSshop.acme.comShopify connector voor e-commerceActiefOpenenHhost.acme.comHosting · WHMCS connectorActiefOpenenBblog.acme.comInhoud · geen connectorInstellenOpenen1MULTI-SITEEén werkplek per site2ISOLATEDData wordt nooit gemengd3PER-SITEEigen instellingen & connectoren
Het echte Sites scherm: elke site is zijn eigen geïsoleerde werkruimte (eigen domein, connector en instellingen), toegevoegd en geopend uit een lijst.

Een site aanmaken

1
Ga naar verbonden sites

Navigeren naar verbonden sites.

2
Een nieuwe site toevoegen

Voer naam, domein en beschrijving in.

3
De site-toets kopiëren

Elke site krijgt een unieke sleutel (site_xxx) voor het widget-knippertje.

4
Zelf instellen

Elke site heeft zijn eigen AI, connectoren en instellingen.

Hoeveel sites kan ik hebben?+

Afhankelijk van uw licentieplan. Controleer de gegevens van uw rijbewijs.

Instellingen

Licentie en plan

Uw OpsIQ licentie controleert functies, site limieten en AI kredietsaldo.

Licentie
LicentiecentrumDe OpsIQ Licentiecentrum: plan, een Active status badge, de gemaskerde licentiesleutel, een AI-kredietmeter en een Force-remote-check knop.LicentiecentrumwerkbladOpsIQ LicentiecentrumPlanZakelijkStatusActiefSleutelOPSIQ-••••-••••-2F9CAI-kredieten$68 linksControle op afstand forceren1PLAN & STATUSActief, in een oogopslag2KEYHMAC-gecached lokaal3CREDITSAI-balans & limieten
Het echte Licentiecentrum: uw plan en actieve status, de gemaskerde sleutel, uw AI-kredietbalans en een één-klik kracht opnieuw controleren.
Licentiesleutel

Voer in Instellingen > Licentie. Gevalideerd tegen de OpsIQ licentieserver.

Licentie hartslag / validatie

OpsIQ normaal leest de ondertekende lokale licentie cache en vernieuwt validatie indien nodig. Gebruik Force remote controle wanneer u een direct resultaat; Diagnostics identificeert DNS, HTTPS of server-tijd problemen.

Plan

Bepaalt de beschikbaarheid en limieten van functies.

Sitelimiet

Maximum aantal werkruimten.

AI-kredieten

Als u Managed AI gebruikt, wordt uw creditsaldo hier weergegeven.

Geldigheidsduur

Vernieuwen voor het verstrijken om onderbreking van de dienst te voorkomen.

Wat gebeurt er als mijn licentie vervalt?+

Tracking, tickets en CRM blijven doorgaan. AI-functies onderbreken tot vernieuwing. Gegevens worden bewaard.

Instellingen

Profiel, wachtwoord en twee-factor authenticatie

Elke beheerder kan zijn eigen identiteit, werkvoorkeuren, wachtwoord en twee-factor authenticatie behouden.

Productscherm
Mijn profielDe profielpagina scheidt persoonlijke gegevens, taal/tijdzone, avatar/handtekening, wachtwoord en twee-factor authenticatie.Mijn profielwerkbladPROFIELVoltooidTIMEZONEEuropa/Athene2FAIngeschakeldLEVENDE WERKSPACE-ZICHTNaam en e-mailPersoonlijke identiteitBewerkenTaal en tijdzoneData en interfaceBewerkenAvatar en handtekeningAntwoorden en aanwezigheid van het teamBewerkenWachtwoord en 2FARekeningbeschermingVeilig1UPDATE PROFILEIdentiteit en locale2SECURE LOGINWachtwoord en 2FA3SAVEAanpassen bij deze admin
De profielpagina scheidt persoonlijke gegevens, taal/tijdzone, avatar/handtekening, wachtwoord en twee-factor authenticatie.

Profielinstellingen behoren tot de ingelogde beheerder en veranderen geen werkruimtebranding. Gebruik een uniek wachtwoord en schakel twee-factor authenticatie in. Een e-mail of authenticatieinstelling wijzigen kan herverificatie of een nieuwe aanmelding vereisen.

Instellingen

Kennisgevingsvoorkeuren

De voorkeuren van de melding bepalen welke operationele gebeurtenissen een beheerder bereiken in het product of per e-mail.

Productscherm
KennisgevingsvoorkeurenDe meldingspagina biedt per-event in-app en e-mail keuzes plus een recente notificatielijst.KennisgevingsvoorkeurenwerkbladIN-APPAanE-mailSelectiefUNREAD4LEVENDE WERKSPACE-ZICHTToegewezen ticketIn-app en e-mailAanKlant antwoorddeIn-appAanSLA-risicoIn-app en e-mailAanAI-goedkeuringIn-app en e-mailAan1CHOOSE EVENTSAlleen nuttige signalen2CHOOSE CHANNELIn-app of e-mail3OVERZICHTRecente kennisgevingen
De meldingspagina biedt per-event in-app en e-mail keuzes plus een recente notificatielijst.

Voorkeuren hebben betrekking op tickettoewijzing, klantantwoorden, SLA waarschuwingen, chat-handoff en AI goedkeuring evenementen. Houd dringende operationele signalen ingeschakeld ergens; het uitschakelen van e-mail hoeft niet noodzakelijk de in-app notificatie uit te schakelen.

Instellingen

Veiligheidsoverzicht

Het beveiligingsoverzicht is het eerste scherm voor de beoordeling van blokken, inlogaanvallen, dreigingssessies, veiligheidstrends en integriteit van gebeurtenissen.

Productscherm
VeiligheidsoverzichtBeveiligingsoverzicht combineert de huidige risicokaarten, een 14-dag trend, aanvaller lijst, gebeurtenisfeed en integriteit status.VeiligheidsoverzichtwerkbladACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3LEVENDE WERKSPACE-ZICHTAutomatisch geblokkeerd7-dag totaal en bronTrendLaatste aanvallersIP, land en redenEvaluatieBeveiligingsgebeurtenissenRisico en actieresultaatFeedHash-chain integriteitTamper-vanzelfsprekende gebeurtenisketenGeldig1READ HEADLINEHuidige blootstelling2OPEN EVIDENCEAanvallen en gebeurtenissen3AKTEBlokkeren, onderzoeken, exporteren
Beveiligingsoverzicht combineert de huidige risicokaarten, een 14-dag trend, aanvaller lijst, gebeurtenisfeed en integriteit status.

Gebruik de kopkaarten voor triage, open dan de bijbehorende Audit, Failed Logins, Geblokkeerd IPs of JavaScript Foutenpagina voor record-niveau werk. De 14-day trend is nuttiger dan een enkele piek. High-threat sessies moeten worden onderzocht tegen bezoeker, verzoek en verificatie bewijs voordat een permanent blok wordt toegepast.

Instellingen

Tampere-vanzelfsprekend auditlog

Het audit logboek registreert wie wat deed, wanneer, tot welk object, op welk risiconiveau en of het gelukt is.

Productscherm
ActiviteitscontroleDe audit pagina biedt doorzoekbare manipulatie-vanzelfsprekende activiteit met actie, actor, risico, doel en resultaat.ActiviteitscontrolewerkbladGEBEURTENISSEN18.2kHIGH RISK21INTEGRITYGeldigLEVENDE WERKSPACE-ZICHTConnector ingeschakeld[email protected] · ShopifySuccesAPI sleutel ingetrokken[email protected] · sleutel 19SuccesInstellingen gewijzigd[email protected] AISuccesToestemming geweigerd[email protected] · exporterenGeblokkeerd1FILTERActie, risico en actor2INSPECTDoel en resultaat3EXPORTCSV of JSON
De audit pagina biedt doorzoekbare manipulatie-vanzelfsprekende activiteit met actie, actor, risico, doel en resultaat.

Filter op actie, risico en actor; export CSV of JSON De hash-keten helpt ontbrekende of gewijzigde auditrijen te detecteren, maar vervangt geen beschermde backups en beperkte toegang tot databases. Beschouw de export van audits als gevoelig omdat ze gebruikers, records en beveiligingsacties kunnen identificeren.

Operaties

Diagnostica

Diagnostics verandert subsysteem controles in gewoon-Engelse gezondheidsresultaten en directe volgende acties.

Productscherm
DiagnosticaDiagnostics groepen gezondheidscontroles voor de widget, AI, tickets, integraties, Site Intelligence, achtergrondtaken, CRM automatisering, licentieverlening en opslag.DiagnosticawerkbladGEZONDHEID13WARNING2NIET ONTBRAND1LEVENDE WERKSPACE-ZICHTWidgetBeacon en chat eindpuntenGezondAchtergrondtakenHartslag Cron laatWaarschuwingE-mailUitgaande test misluktFoutConnectorenRegistratie en gebeurtenisopnameGezond1REFRESHHuidige controles uitvoeren2OPEN WARNINGBewijsstuk lezen3FIX AND RETESTBevestigen dat de terugvordering plaatsvindt
Diagnostics groepen gezondheidscontroles voor de widget, AI, tickets, integraties, Site Intelligence, achtergrondtaken, CRM automatisering, licentieverlening en opslag.

De pagina controleert Site Speed, rang/toetswoord/backlink/lokale gegevens, AI en actie gateway, tickets, crawler / audits, integratie/event inname, achtergrondtaken, CRM-automatiseringen, licentie, widget en gerelateerde productdiensten. Het rapporteert opzettelijk voor de exploitant leesbare oorzaken in plaats van het blootleggen van ruwe geheimen.

Na een verandering, Vernieuwen en bevestig dat het betrokken subsysteem gezond terugkeert. Een groene diagnostiek pagina is noodzakelijk maar niet voldoende voor lancering; vul ook de Pre-launch checklist.

Instellingen

Veiligheid en toegang

OpsIQ bevat meerdere beveiligingslagen om uw beheerder, gegevens te beschermen en API Toegang.

Hoe het werkt
Veiligheid en toegangEen beveiligingsschild naast de ingeschakelde bedieningen: twee factor, OIDC SSO, SCIM 2.0, OAuth2 PKCE, CSRF/CSP; IP firewall, snelheidsgrenzen en een geheime kluis.Twee-factor (TOTP)OIDC SSOSCIM 2.0OAuth2 PKCECSRF + CSPIP firewallPercentagelimietenGeheimenkluis
Beveiliging

Beveiligingskenmerken

Beheerderscontrole

E-mail/wachtwoord met optioneel 2FA.

Login lockout - 1

Tijdelijke vergrendeling na te veel mislukte pogingen.

IP blokkeren

Blokkeren IPs of CIDR varieert van toegang tot tracked sites.

Bedreigingsscore

Gedragsgebaseerde dreiging scores. High-threat bezoekers kunnen worden automatisch geblokkeerd.

HTTPS-handhaving

Vereist voor alle verbindingen. HTTP verwijst naar HTTPS.

HST-koppen

Strikte-Vervoer-Veiligheid voorkomt downgrade aanvallen.

CSRF-bescherming

Alle administratieve formulieren omvatten CSRF tokens.

XSS-bescherming

Alle gebruikersinvoer is ontsnapt. CSP-headers beperken de scriptuitvoering.

SSRF-bescherming

Uitgaande webhooks blokkeren privé/interne IP adressen.

Aanbevolen setup

1
2FA inschakelen

Voor alle beheerdersaccounts.

2
Sterke wachtwoorden

Minimum 12 karakters, gemengd.

3
Controlerekeningen

Toegang voor voormalige teamleden verwijderen.

4
Monitor mislukt logins

Kijk wekelijks naar verdachte patronen.

5
Op de hoogte blijven

Pas updates onmiddellijk toe voor beveiligingspatches.

Instellingen

Rol en machtigingen

Met Role-Based Access Control kunt u bepalen wat elk teamlid kan doen.

Roles & rechten
Rol en machtigingenEen rol-by-capability matrix: Eigenaar heeft alles; Full Admin mist de factuur en gevaar zone; Agent heeft alleen scope tickets.Roles & rechtenwerkbladSETTINGENBILLENGEVAARTICKETSEigenaarVolledige beheerderAgentscoped13 ROLESEigenaar · Volledige beheerder · Agent2GRANULARPer pagina + per afdeling3DEFAULT-DENYVergeten routes geblokkeerd
De rolmatrix in één oogopslag: Eigenaar krijgt alles, Volledige Beheerder alles behalve facturering en gevarenzone, Agent alleen hun kaartjes.

Standaardfuncties

Eigenaar

Alles inclusief licentie, gevarenzone en installatiebeheer.

Volledige beheerder

Alles behalve licentie en gevarenzone.

Agent

Reageer op toegewezen-afdeling tickets en chats, bekijk analytics. Geen instellingen, team of toegang tot de beveiliging.

Kan ik aangepaste rollen aanmaken?+

Drie ingebouwde rollen plus afdelingsopdracht geeft korrelige controle.

Instellingen

Geblokkeerd IPs

Beheer IP adressen geblokkeerd van toegang tot uw getraceerde sites.

Geblokkeerd IPs
Geblokkeerd IPsDe geblokkeerde.IPs scherm: een blok-an-IP/CIDR formulier naast een tabel met geblokkeerde adressen bij elke ingang, datum, reden en een Unblock knop.Geblokkeerd IPswerkbladBlokkeer een IP / CIDR203.0.113.0/24Reden (facultatief)BlokGeblokkeerde adressen203.0.113.9Juni 12 · brute krachtDeblokkeren45.12.0.0/16Jun 10 · 1 maand geledenDeblokkeren102.89.6.2Juni 9 · misbruikDeblokkeren1BLOKIP of CIDR bereik2LISTWie & wanneer, met reden3UNBLOCKEén klik
De echte geblokkeerde IPs scherm: blok een enkele IPof een CIDR bereik, en beheren van de lijst, elk met zijn datum, reden en één-klik deblokkeren.

Hoe te blokkeren

1
Ga naar beveiliging > Geblokkeerd IPs

2
Een IP of CIDR-bereik toevoegen

Voorbeeld: 203.0.113.42 of 203.0.113.0/24

3
Een reden toevoegen

Document waarom: spam, misbruik, schraapsel enz.

Zal blokkeren invloed hebben op legitieme gebruikers?+

Als klanten een bedrijf delen IP of VPN, blokkerend dat IP Gebruik smalle blokken.

Instellingen

Aanmelden mislukt

Alle mislukte aanmeldpogingen naar uw OpsIQ beheerder.

Aanmelden mislukt
Aanmelden misluktHet scherm van de foutmeldingen: een tabel met accounts/IPs Met mislukking telt, tijd van de laatste poging, en een blok knop per rij.Aanmelden misluktwerkbladAanmeldpogingen misluktREKENING / IPNIET ONTBRANDLAATSTEACTIE[email protected] · 41.62.10.472m geledenBlok[email protected] · 102.89.6.2318m geledenBlokonbekend · 45.12.9.71226m geledenBlok[email protected] · 88.21.4.921h geledenBlok1WATCHAanmeldpogingen mislukt2COUNTSPer rekening / IP3AKTEBlokkeren vanaf de rij
Het echte aanmeldscherm is mislukt: elke account/IP met zijn foutnummer en laatste poging, blokkeert een bron van brute kracht rechtstreeks vanuit de rij.

Wat elke regel laat zien

Datum/tijd

Toen de poging plaatsvond.

E-mail

E-mailadres gebruikt.

IP adres

Bron van de poging.

Land

Geografische locatie.

Reden

Verkeerd wachtwoord, vergrendeld of niet gevonden.

Waarschuwingsborden

Veel pogingen, dezelfde e-mail

Wachtwoord raden. Zorg ervoor dat 2FA is ingeschakeld.

Veel pogingen, verschillende e-mails

Automatische aanval. Blokkeer de bron IP.

Ongebruikelijke landen

Als je team lokaal is, zijn buitenlandse pogingen waarschijnlijk aanvallen.

Instellingen

AI beveiligingsanalist

Een opt-in analist laag over de Security pagina's: vonnissen, incident slips, een dagelijkse vertering, een wekelijkse houding controle, Vraag Beveiliging en 0-token blok beleid. Het loopt nooit in het bezoeker aanvraag pad.

Elke beveiligingspagina registreert wat er gebeurd is, maar het lezen ervan neemt nog steeds oordeel. De AI security analist voegt dat oordeel op zijn plaats toe, en het is gebouwd om bijna niets te besteden: het zit nooit in het baken of login pad, deterministische regels regelen de voor de hand liggende gevallen zonder AI oproep, vonnissen worden gecached, en de beste output van de analist is een deterministisch regel die dan voor altijd afdwingt bij nul tokens. Zet functies aan in Instellingen → Beveiliging; alle standaard uit.

Wat het toevoegt

Verdict chips + Leg uit

Geblokkeerd IPs en foutieve logins rijen tonen een goedaardige / verdachte / vijandige chip met een vertrouwensscore. Leg uit opent de redenering, de gebruikte feiten, en één-klik Blok / Loslaten acties. 24h, dus opnieuw bekijken van een IPis vrij.

Incidentslip

Gerelateerde gebeurtenissen cluster in een incident (login wave, URL scan, auto-blok barsten) met een gewone Engelse tijdlijn en een aanbevolen volgende stap. Doorlopende aanvallen vouwen zich om tot hetzelfde incident.

Dagelijkse vertering

Een samenvatting per dag: gisteren versus je basislijn, blokken, incidenten en het enige wat we moeten doen. Stille dagen sturen een deterministische alles-duidelijk bij nul tokens.

Wekelijkse postuurcontrole

Een maandag verharding checklist (2FA gaten, lockout drempel versus echte aanval volume, waarschuwingen uit) met een ernst, inspanning en exacte vaststelling per item.

Vraag beveiliging

Een vraagdoos op de Security Overzicht die antwoordt vanuit uw live beveiligingsstatus. Diepe server vragen worden overhandigd aan de admin engineer chat in plaats van geraden.

Beleidsvoorstellen + automatische piloot

De analist stelt concrete blokregels voor als goedkeurings- / ontslagkaarten; goedgekeurde regels handhaven bij nul tokens met een live hit teller. Optionele autopilot keurt alleen de veiligste regels automatisch.

Instellingen

AI-beveiligingsanalist (security_ai_enabled)

Meester switch. Schakel vonnis chips, Leg uit en Vraag Beveiliging. Alleen dubbelzinnig IPs bereiken het model, gestapeld in een gesprek.

Incidentslip (security_ai_incident)

Clusters gebeurtenissen in incidenten en schrijft elk nieuw verhaal. Runs op de bestaande uur beveiliging cron.

Dagelijkse weergave (security_ai_digest)

Een veiligheidsrecap per dag op de bel en het Overzicht. Rustige dagen kosten niets.

Wekelijkse postuurcontrole (security_ai_posture)

Maandag verharding checklist op de Overzicht. De checklijst is volledig deterministisch.

Beleidsautopiloot (security_ai_autopilot)

Laat de analist zijn veiligste voorstellen onbeheerd activeren: alleen omkeerbare tijd-beperkte blokken, single IPs of niet breder dan /24, nooit gedeeld/mobiel/privé, afgetopt 10 per uur, altijd gecontroleerd en niet te doen.

💡
Elke oproep is getagd security_ai met zijn eigen maandelijkse cap in AI Config → Cost Guardrails (standaard 300k tokens). Als de dop wordt getroffen, functies afbreken tot deterministische leest. Blokkeren, vergrendelingen en waarschuwingen nooit afhankelijk van dit budget. De analist kan nooit gegevens verwijderen, instellingen wijzigen, het audit grootboek aanraken of een permanent verbod maken.
Operaties

Cron en automatisering

OpsIQ gebruikt één productplanner om e-mailpeiling, ticketautomatisering, analytics oprollen, retentie, AI wachtrijen, CRM werk, rapporten en connector banen uit te voeren.

Productscherm
Cron en automatiseringEén product cron entry levert de hartslag; OpsIQ bepaalt welke interne jobs moeten worden uitgevoerd.Cron en automatiseringserverHARTBEATElke minuutRUNNERcron/all.phpHEALTHInstellingenLEVENDE WERKSPACE-ZICHTVerenigd product runneropsiq/cron/all.phpVereistTicket- en e-mailwachtrijenKorte geplande werkzaamhedenActiefAnalyse en bewaringInterne cadansGeplandAbonnees van connectorenGedeclareerde cron-evenementenToepassingsgebied1INSTALL ONE LINEVoer de productplanner elke minuut2CHECK CRON SETUPBevestig CLI hartslagen3USE DIAGNOSTICSVerlate of mislukte werkzaamheden onderzoeken
Eén product cron entry levert de hartslag; OpsIQ bepaalt welke interne jobs moeten worden uitgevoerd.

Vereist product cron entry

Voeg deze regel toe aan het crontab voor dezelfde server en PHP omgeving die draait OpsIQ:

OpsIQ product crontab invoer
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

Vervangen /path/to/opsiq met de installatie root. Gebruik het volledige PHP CLI pad wanneer de host er een nodig heeft, bijvoorbeeld /usr/bin/php8.4.

Gebruik het bovenste niveau niet /cron.php voor productwerkzaamheden. In deze repository behoort de running tot een aparte niet-product service buiten dit handboek. De OpsIQ productrunner is opsiq/cron/all.php.

Wat de unified scheduler drijft

Ticket- en AI-rijen

Processen door auto-antwoorden, escalaties, goedkeuringen en andere in de wachtrij staande product werkzaamheden.

Inkomende e-mail

Enquêtes geconfigureerde brievenbussen waar peilingen de geselecteerde intakemethode is.

Analyse en sessies

Verzamelt sessies en verfrist geplande aggregaten wanneer ze moeten worden geleverd.

CRM en engagement

Runs scoren, levenscyclus, workflow, campagne en geplande rapportage taken die zijn ingeschakeld.

Bewaring en onderhoud

Voert de juiste opruiming, archief, vervallen en integriteit werk.

Connectoren

Verdeelt connector cron abonnees en peiling alleen voor geïnstalleerde, ingeschakelde en geconfigureerde connectoren.

Cron controleren

  1. Openen Instellingen - Cron setup en bevestigen dat het product loper bestaat.
  2. Gebruik Rennen. een keer, bevestig dan de admin en polling hartslagen update.
  3. Ophalen Diagnostica voor een late hartslag, PHP CLI, database of file-path probleem.
  4. Inspecteren /tmp/opsiq-cron.log of het logpad dat u hebt geselecteerd als een handmatige run mislukt.

Houd de connectorbedienaars kort, idempotent en werkruimte-gescoopt. Batch lange synchronisaties en bewaar een cursor/controlepunt zodat het volgende programma veilig kan doorgaan.

🚫
Wanneer het product cron stopt, time-based OpsIQ werk stopt of wordt te laat, ook al kan de gewone admin pagina's nog steeds laden.
Operaties

Gehoste inzetoperaties

Een gehost OpsIQ implementatie maakt gebruik van dezelfde productschermen en workflows terwijl de hostingoperator de serverlaag beheert. Commerciële aanmelding, plannen, facturen en rekening-portaalprocedures vallen buiten dit handboek.

Productscherm
Gehoste inzetGehoste bewerking verandert wie de infrastructuur onderhoudt; het verandert niet hoe klanten gebruiken OpsIQ.Gehoste inzetwerkbladPRODUCT UIZelfde OpsIQINFRASTRUCTUREBeheerd door de exploitantWORKSPACE DATAGeïsoleerdLEVENDE WERKSPACE-ZICHTToepassingsverloopPHP, webserver en databaseBeheerdProduct cronGepland door hostingoperatorVerifiërenBackups en updatesBeleid en bewijsmiddelen van de aanbiederEvaluatieOpsIQ instellingenSites, AI, team en aansluitingenJouw team1OPERATE OPSIQ NORMALLYGebruik dezelfde productnavigatie2VERIFY SERVICE HEALTHDiagnostics en status-bewijs gebruiken3KNOW RESPONSIBILITYAparte productinstellingen van hostingwerk
Gehoste bewerking verandert wie de infrastructuur onderhoudt; het verandert niet hoe klanten gebruiken OpsIQ.

Wat de hostingoperator normaal gesproken beheert

  • Webserver, PHP runtime, database service, TLS en opslag.
  • Het uniforme product cron en zijn server-niveau logs.
  • Applicatie-updates, infrastructuurbewaking en het back-upproces dat is gedefinieerd in de hostingovereenkomst.

Wat een OpsIQ Beheerder beheert nog steeds

  • Websites en widget installatie, AI-instellingen, kennis, mailboxen en klantenondersteuning workflows.
  • Toegang tot het team, afdelingen, beveiligingscontroles, API sleutels, connectoren, automatiseringen en instellingen voor gegevensretentie.
  • Productkeuring via Diagnostics, auditlog, connectortests en echte controles van het einde tot eind.

Operationele controles

Ga er niet van uit dat een beheerde dienst betekent dat elke productintegratie gezond is. Bevestig het laatste back-up bewijs en retentiebeleid met de hostingoperator, en gebruik OpsIQ Diagnostica na wijzigingen in DNS, e-mail, AI providers, websites of connectors.

Deze sectie heeft uitsluitend betrekking op productbewerkingen. Commercieel onboarding, abonnementen, facturering en klantenaccountbeheer vallen niet onder het handboek OpsIQ _.

Operaties

Zelfhosting OpsIQ

Een zelf-gehoste OpsIQ installatie draait op infrastructuur die u controleert. U bent verantwoordelijk voor de looptijd, database, TLS, product cron, back-ups, updates en monitoring.

Productscherm
ZelfhostingZelfhosting geeft infrastructuurcontrole en maakt uw team verantwoordelijk voor elke operationele afhankelijkheid.ZelfhostingserverPHP8.4+DATABASEMySQL 5.7+SCHEDULERElke minuutLEVENDE WERKSPACE-ZICHTRuntime-extensiesVoorbeelden: pdo_mysql, mbstring, jsonVereistAanvullende uitbreidingenxml, openssl, zip, intl, gdVereistAlternatieve databaseMariaDB 10.3+ met InnoDBOndersteundVervoerHTTPS en uitgaande provider toegangVerifiëren1PREPARE THE SERVERVereisten inzake runtime-afspraak2INSTALL AND CONFIGUREGebruik een speciale database en HTTPS3ADD PRODUCT CRONopsiq/cron/all. php uitvoeren
Zelfhosting geeft infrastructuurcontrole en maakt uw team verantwoordelijk voor elke operationele afhankelijkheid.

Minimum softwarecontract

PHP

PHP 8.4 of nieuwer. Vereiste uitbreidingen: krullen, pdo_mysql, mbstring, json, xml, openssl, zip, intl en gd.

Database

MySQL 5.7+ of MariaDB 10.3+ gebruik maken van InnoDB. Maak een speciale database en minst bevoorrechte applicatie gebruiker.

Webserver

Apache of Nginx ingesteld voor de OpsIQ front controller, statische activa en vereiste herschrijven.

HTTPS

Vereist voor admin sessies, widget verkeer, API sleutels, webhooks en provider oproepen.

Toegang naar buiten

Toestaan DNS en HTTPS toegang tot de AI, e-mail, connector en licentie eindpunten die u daadwerkelijk inschakelt.

Bestandstoegang

De web- en CLI-gebruikers moeten in staat zijn om de toepassingsbestanden te lezen en alleen naar de gedocumenteerde runtime/opslaglocaties te schrijven.

Cron

Voer de OpsIQ productplanner elke minuut met dezelfde toepassingsconfiguratie en database toegang als het webproces.

Installatiereeks

  1. Upload de release naar de gewenste document root en behoud de opgegeven directory structuur.
  2. Maak de database en toepassing gebruiker, voer dan de database, canonieke URL en licentie instellingen.
  3. Voer de installatie/installatiestroom uit en maak het eerste eigenaaraccount aan.
  4. HTTPS inschakelen en omleidingen, cookies en de openbare widget/API paden verifiëren.
  5. Het verenigde OpsIQ product cron toevoegen:
Zelfgehost product cron
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
  1. Open Instellingen - Cron Setup en Diagnostics; voer de scheduler één keer uit en los elke mislukte afhankelijkheid op.
  2. Configureren van back-up, herstellen testen, log retentie en update procedures voor het toevoegen van productiegegevens.

Veilig bijwerken

  1. Lees de release notes en controleer de vereiste PHP/extensies voordat u bestanden wijzigt.
  2. Een back-up van de database en applicatie/configuratie bestanden, dan bewijzen dat de back-op kan worden hersteld in een test locatie.
  3. De nieuwe bestanden in te zetten zonder installatie-specifieke configuratie of runtime gegevens verwijderen.
  4. Voer het meegeleverde migratie/voorvluchtproces uit en verifieer login, widgettracking, tickets, e-mail, AI, connectoren en cron.
  5. Houd de vorige release en database back-up beschikbaar voor het gedocumenteerde terugrolvenster.
🚫
Het bovenste niveau van de repository /cron.php is niet de OpsIQ produktplanner. Punt productautomatisering alleen op opsiq/cron/all.php.
⚠️
Verwijder . schema_cache._json niet als routine onderhoud. Verwijder het alleen wanneer de productinstructies expliciet een schema-cache herbouw vereisen.
Operaties

Productiegids

Checklist en best practices voor hardlopen OpsIQ in productie.

Productiegids
ProductiegidsEen go-live checklist: aangepast domein en SSL, AI getraind, connectors en cron, backups en retentie, en teamrollen.Checklist voor go-livewerkbladVoordat je gaat liveAangepast domein + SSL geconfigureerdAI getraind op uw inhoudConnectoren getest · cron draaienReservekopieën gepland · retentie setTeamfuncties toegewezen & herzien1GO-LIVEChecklist voor de lancering2VERIFYDomein · SSL · backups3CONFIDENTSchip als het groen is
Een go-live checklist zodat er niets wordt gemist: domein + SSL, getrainde AI, geteste connectors en cron, backups en retentie, en teamrollen.

Voordat je live gaat

HTTPS geconfigureerd

SSL geïnstalleerd, HTTP redirects, HSTS ingeschakeld.

Cron loopt

Controleer via de diagnose pagina.

AI getest

Chat als klant. Controleer de nauwkeurigheid en toon.

Widget geïnstalleerd

Op alle website pagina's. Controleer met Live Feed.

Reservekopie geconfigureerd

Geautomatiseerde dagelijkse database en bestandsback-ups.

Fout bij aanmelden

PHP fout log ingeschakeld en bewaakt.

Team uitgenodigd

Alle leden hebben rekeningen met juiste rollen.

bevolkte kennisbasis

Tenminste 5-10 artikelen.

Dagelijks: Controleer dashboard, duidelijke ticketrij, spot-check AI gesprekken.

Weekly: Bekijk AI Insights, update KB, controleer teamprestaties, beoordeel beveiliging.

Maandelijks: Review analytics trends, audit connectors, update AI training, controleren back-ups.

Operaties

Checklist voor de lancering

Voer de bronpoorten uit en voltooi echte productcontroles voordat een release of eerste productie wordt gelanceerd. Een commando dat beschikbaar is, is geen bewijs dat het in uw omgeving werd doorgegeven.

Productscherm
Controle van de vrijgaveDe releaseweergave toont de vereiste poorten om te draaien; het prelabelt ze niet zoals ze zijn doorgegeven.Controle van de vrijgaveserverRUNTIMPHP 8.4SOURCE GATESLokaal uitvoerenOUTCOMEBewijsmateriaalLEVENDE WERKSPACE-ZICHTVereiste uitbreidingenControleer voor de suitePoortPHP syntaxis-afdrukAlle project PHP-bestandenPoortAI-evaluatie en PHPUnitUitvoeren wanneer afhankelijkheden aanwezig zijnPoortStatische en browsercontrolesUitvoeren bij instellenPoort1RUN THE CHECKSDe werkelijke uitvoer vastleggen2FIX EVERY REQUIRED FAILUREVervang bewijs niet door aannames3TEST THE PRODUCTControleer echte gebruikersritten
De releaseweergave toont de vereiste poorten om te draaien; het prelabelt ze niet zoals ze zijn doorgegeven.

Bron- en vrijgavepoorten

Voer de repository controles uit van de installatie root en houd hun volledige uitvoer met de release record.

Primaire poort voor de vlucht
php tools/preflight.php
Uitgebreide release poort
php tools/release_gate.php

De preflight controleert de PHP 8.4 runtime en vereiste extensies, voert een PHP syntax sweep uit, draait het AI evaluatieschip poort en volledige PHPUnit suite, en voert PHPStan / Node controles wanneer deze instrumenten zijn geïnstalleerd. De uitgebreide gate omvat ook rook, clean-install/schema en browser eind-tot-end controles als hun omgeving is geconfigureerd.

Een overgeslagen controle is geen pas. Registreer waarom het niet beschikbaar was, installeer de ontbrekende afhankelijkheid of voer deze uit in de juiste CI/staging omgeving voordat ze vrijgegeven worden.

Productcontroles

1. Authenticatie en rollen

Aanmelden als elke beoogde rol; controleren toegestaan en geweigerd pagina's/acties.

2. Widget en tracking

Een echte site laden in een privé-browser; bakenverkeer, Live Feed, bezoeker en sessie records verifiëren.

3. Chat en AI

Stel representatieve vragen; verifieer kennis gronding, veiligheid, escalatie en AI geschiedenis.

4. Tickets bestellen

Creëer, wijs toe, antwoord, escaleer, sluit en heropent via elk ingeschakeld intakepad.

5. E-mail

Test uitgaande levering en elke geconfigureerde inkomende mailbox of webhook pad.

6. CRM en analyses

Maak een gecontroleerde contact/deal/conversie en verifieer dashboards, trechters, scoren en rapporten.

7. Verbindingen

Start verbindingstesten, één gelezen, een veilige schrijf/droge run en webhook/polling paden voor elke actieve connector.

8. API en webhooks

Controleer smalle scopes, snelheidsgrenzen, idempotent retrieves, handtekeningen en dubbele behandeling.

9_. Cron

Voer de uniforme productplanner en bevestig alle gewenste hartslagen in Cron Setup / Diagnostics.

10. Beveiliging

Controleer 2FA, CSRF/session controls, audit entries, sleutel intrekking en werkruimte isolatie.

11. Reservekopie en herstel

Herstel een huidige back-up in een aparte testomgeving en verifieer gegevens en configuratie.

12. Waarneming en terugdraaien

Bevestig logs/alerts, bewaar ID's en bewijs de terugrolprocedure.

⚠️
Pas inzetten na elke vereiste poort en bedrijfskritische reis heeft actuele bewijzen voor de exacte vrijgave en omgeving.
Ontwikkelaar

Web Push op sites van derden

Browser push notificaties (inclusief OpsIQ Push Campagnes) hebben behoefte aan een service werknemer bediend van de SME ORIGIN als de pagina.OpsIQ widget ladingen van uw OpsIQ implementatie, zodat een site van derden zich niet kan registreren OpsIQ's werknemer direct. Host een klein bestand op de site eigen domein om te pushen daar. Campagnes leveren via beide ondersteunde methoden.

Hoe het werkt
Web pushEen OS-stijl push notificatie boven twee leveringsmethodekaarten: Ingebouwde VAPID en Pusher Beams.Uw winkelJe karretje wacht · 10% vandaag vrijnuIngebouwd (VAPID)Geen derde partijHost één bestandPusherbalkGebruik je accountGastheer van de werknemer
Web push

Waarom dit nodig is

Browsers laten alleen een pagina registreren van een service werknemer uit zijn eigen oorsprong. De widget laadt kruis-origine van uw OpsIQ implementatie, zodat het niet kan installeren van de push werknemer op een klantensite, totdat u gastheer van de werknemer op die site's oorsprong, de widget stil overslaat push (geen fout, geen abonnement). U hebt twee opties hieronder;OpsIQ Push Campaigns publiceren via beide.

Optie A · Zelfgehoste Web Push (VAPID, geen derde partij)

1. Download de werknemer van uw OpsIQ implementatie: https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. Upload het naar uw webwortel dus het is bereikbaar op https://yoursite.com/opsiq-push-sw.js. Het widget automatisch dit pad detecteren op de pagina's eigen oorsprong en registreert het, geen knipsel nodig. (Het maakt gebruik van een smalle reikwijdte, zodat nooit vervangt een service werknemer die je al loopt.)

Facultatief: als je het op een niet-standaard pad moet hosten, wijs dan de widget erop voor Het wordt alleen geaccepteerd als het van dezelfde oorsprong is:

Alleen optioneel · als het bestand NIET in de web root staat
<script>window.OpsIQ=window.OpsIQ||{};window.OpsIQ.pushSwUrl="/custom/opsiq-push-sw.js";</script>

3. In OpsIQ, genereren VAPID sleutels (Instellingen → Client Chat AI → Geavanceerd → Web Push). De widget vraagt bezoekers dan om toestemming voor de melding en abonneert hen.

Achter een CDN/Cloudflare? /opsiq-push-sw.js geeft HTTP terug 200 (purge de cache als het was 404 voordat je geüpload; een cache 404 zal de registratie blokkeren).

Optie B · Pusher Straal (beheerde provider)

1. In OpsIQ instellingen stellen de pushprovider in Pusherbalk En treed in jullie [hemels] troepen. Instantie-ID en Geheime sleutel.

2. Host de Beams service werknemer op de site root als /service-worker.jsBegrepen. https://YOUR-OPSIQ/opsiq/pusher-beams-service-worker.js, of merge deze regel in uw bestaande root werknemer:

Stralenarbeider, gastheer op https://yoursite.com/service-worker.js
importScripts("https://js.pusher.com/beams/service-worker.js");

3. Het widget laadt automatisch de Beams SDK en abonneert elke bezoeker op het per-site belang opsiq-site-<your-site-key>- Geen andere bedrading nodig.

Hoe campagnes tot stand komen

Push Campagnes publiceren via beide methoden in een keer: bezoekers op de zelf-gehoste VAPID werknemer krijgen de gecodeerde Web Push, en bezoekers die zich hebben ingeschreven via Pusher Beams krijgen de Beam's gepubliceerd. Elke bezoeker wordt bereikt door welke ze ook geabonneerd zijn, zodat u dezelfde oorsprong kunt uitvoeren VAPid op sommige sites en kruis-origine Beam van andere.

HTTPS is vereist voor servicemedewerkers en Web Push (localhost is vrijgesteld voor testen). De admin chat inbox gebruikt al hetzelfde Beams rentemechanisme voor de exploitant waarschuwingen.

Operaties

Problemen oplossen

Gemeenschappelijke problemen en hoe ze te verhelpen.

Algemeen

Lege pagina+

Controleer PHP fout logs. Oorzaken: oude PHP (nodig 8.4+), ontbrekende extensie, DB-verbinding mislukt, verkeerde bestand permissies.

Dashboard toont nullen+

Controle: widget geïnstalleerd? Cron draait? Datumbereik correct? IP uitgesloten?

AI

AI reageert niet+

Check: provider geconfigureerd? API sleutel geldig (gebruik Test verbinding)? Budget uitgeput? Werkruimte AI config correct?

AI geeft verkeerde antwoorden+

Controle: kennisbasis up to date? Vraagt duidelijk? Connector opzoekingen terugsturen van correcte gegevens? Bekijk conversatie in AI Geschiedenis.

AI is traag+

Afhankelijk van: provider API snelheid, contextgrootte (grotere KB = meer tokens = langzamer), netwerk latency. Probeer een sneller model.

Tracking

Widget ontbreekt+

Controle: script in paginabron? JS fouten in console? CSP blokkeren? Ad blocker?

Onbekend land+

GeoIP is niet geconfigureerd. Gebruik Cloudflare (automatic) of MaxMind GeoLite2-database.

Tickets

E-mails die geen tickets maken+

Check: mailbox verbonden? Cron draait? App wachtwoord gewijzigd? IMAP De instellingen correct?

Automatisch antwoord werkt niet+

Controle: ingeschakeld? Afdeling toegestaan? AI geconfigureerd? Cron draaien? Menselijke antwoorden eerst?

Connectoren

Verbinding mislukt+

Check: referenties correct? Sleutel verlopen? API toegankelijk vanaf de server? Basis URL Klopt dat?

Verbonden maar geen gegevens+

Controleren: API Webhook-synchronisatie ingeschakeld?

Prestaties

Langzame pagina's+

Controle: databaseprestaties (SHOW PROCSTIST), PHP-geheugen (verhoging naar 1GB), opcache inschakelen, bewaartermijn verminderen.

Operaties

Widget niet loggen bezoeken

Gebruik deze gerichte controle wanneer het widget onjuist geladen wordt of Live Feed leeg blijft.

Wanneer de widget is geen bezoeken loggen, controleer de sleutel van de site, laad de pagina in een privé-browser, controleren de browsers Netwerk/Console panelen voor geblokkeerd baken of widget verzoeken, beoordeling Content-Security-Policy en advertentieblokkers, bevestig dat de website actief is in OpsIQ, en open Diagnostics. Een zichtbare chatbel bewijst niet op zichzelf dat het analytics baken werd geaccepteerd.

Rubrieknummer

Woordenlijst

Definities voor termen die in de gehele OpsIQ worden gebruikt.

Actie

Iets wat de AI kan doen via een stekker of het platform.

Agent

Een teamlid met beperkte toegang, of een AI agent.

BYOK_

Breng uw eigen sleutel mee, u geeft uw eigen AI API sleutel.

Verbinding

Een plugin die een extern platform met OpsIQ integreert.

CSAT

Klanttevredenheid score.

Afgesproken

Een inkomstenmogelijkheid in de CRM.

Afdeling

Een ticketcategorie voor routering en toegangscontrole.

Roltrap

Een ticket verplaatsen naar een andere afdeling of van AI naar mens.

GeoIP

Localisatiedetectie van bezoekers vanaf IP -adres.

Afhandeling

Een gesprek van AI naar mens overbrengen.

Identiteitskaart

Getekend teken om een bezoeker van de website te identificeren.

Kennisbasis

Artikelen die de AI gebruikt om vragen te beantwoorden.

Lood

Een bezoeker die wilskracht toont.

Loodscore

0-_100 nummer dat wijst op conversie waarschijnlijkheid.

Levenscyclus

Waar een klant is: Lead, Prospect, Customer, At Risk, Churned.

Beheerde AI

AI verstrekt als onderdeel van uw OpsIQ plan.

Pijpleiding

Visueel bestuur van deal stadia.

RBAC

Role-based Access Control.

Directoraat

Een reeks pagina's binnen een timeout venster.

Sitesleutel

Unieke identificatiecode voor een traceerde website.

SLA

Service Level Agreement, doelresponstijden.

Token

Eenheid AI-tekst. 4 tekens = 1 Token.

Laag vertrouwen

Veiligheidssysteem dat de autonomie van AI controleert.

Webhook

HTTP callback voor event notificaties.

Widget

JavaScript code ingebed op uw website.

Werkblad

Een site met een eigen tracking, AI, aansluitingen en team. Zelfde als "site."

Rubrieknummer

Haal meer hulp.

Als deze documentatie geen antwoord geeft op uw vraag:

Beheerder AI

Klik op "Vraag OpsIQ" in de beheerder. Heeft toegang tot deze documentatie en uw platformgegevens.

Ondersteuningsticket

Include: wat je hebt geprobeerd, wat er gebeurd is, wat je verwachtte en welke foutmeldingen dan ook.

E-mail

E-mailondersteuning met uw licentiesleutel en afgiftebeschrijving.

Tips voor effectieve ondersteuningsverzoeken

De pagina invoegen

Welke admin pagina (URL of naam).

De instelling invoegen

Exacte instelling van naam en huidige waarde.

De fout invoegen

Exacte foutmelding met codes.

De stappen opnemen

Wat je deed, stap voor stap.

Include forwarded vs.

Wat er moet gebeuren tegen wat er gebeurd is.

💡
Hoe specifieker uw verzoek, hoe sneller het antwoord. "Het werkt niet" vereist onderzoek. "Klik op opslaan op AI Configuratie geeft foutcode 502" krijgt een direct antwoord.