OpsIQ Dokumentation

Bygg, driva och Förlängning OpsIQ.

Detta är fullständig dokumentation för OpsIQ Ställ in produkten, kör stöd, konfigurera AI, hantera CRM, installera widgeten, bygga kontakter, ring REST API, ta emot webhooks, paketmarknad appar och driva självvärda utplaceringar.

KundguideAdminguideUtvecklarguideCRM referensAnslutning SDKREST API_Självvärd
Tillämpningsområde

Rör av denna handbok

Allt allting OpsIQ Gör, på ett ställe: hur varje skärm fungerar, hur du ansluter dina egna system och hur man bygger ovanpå det. Börja var som helst, avsnitten följer samma ordning som admin sidofältet.

Tillämpningsområde
DokumentationskartaHandboken är organiserad kring OpsIQ -produkten, efter samma ordning som administratörssidan.DokumentationskartaOpsIQ produktAUDIENCEOperatörerByggnadUtvecklareRUNAdministratörerLivet Arbetarspace VIEWAnvänd OpsIQ_Produktskärmar och arbetsflödenInkluderadFörlängning OpsIQAnslutningar, APIs och widgetInkluderadOperativ OpsIQSäkerhet, krön och distributionInkluderadHänvisningPaket, API och webhook avtalInkluderad1CHOOSE AUDIENCEOperatör eller utvecklare2FOLLOW THE UIAvsnitt spegel OpsIQ3USE SOURCE TRUTHStatus kommer från att bygga
Handboken är organiserad kring OpsIQ -produkten, efter samma ordning som administratörssidan.
Portal Studio fältguide

Använd den dedikerade administratören och utvecklarguiden för Portal arkitektur, sidor, komponenter, förhandsgranskning, Hjälpcenter, identitet, SCIM, styrda utgåvor, förlängningar, migrationer och certifiering.

Öppna Portal Studio guide

Vad är här

Kör produkten

Varje skärm i admin: analytics, live chat, biljetter CRM kunskapsbas, Site Intelligence, kampanjer och kundkontoportalen. Vad varje sida gör, vad siffrorna betyder och vad de ska göra när de ser fel ut.

Anslut dina system

Webbplatsen widget, e-postlådor, inkommande och utgående webhooks och kontaktbiblioteket för plattformar som Shopify, WooCommerce, WHMCS Zendesk, Stripe, Slack och Gmail.

Bygg din egen

Connector Builder för no-code-kontakter, Aktiviteter & Triggers om du hellre inte skulle använda kontakter alls och REST API med varje åtgärd, omfattning och felkod.

Operatera det

Roller och behörigheter, säkerhet, krön, diagnostik, säkerhetskopior och både värd och egenvärderad utplacering.

Var ska man börja

1
Om du kör OpsIQ Dag till dag

Läs skärmsektionerna i sidofältet. Varje öppnar med vad sidan är för, så att du kan sluta så snart du har det du behöver.

2
Om du administrerar den

Lägg till inställningar, säkerhet, diagnostik, kron och produktion. Dessa är de avsnitt som bestämmer om allt annat fungerar.

3
Om du bygger en integration

Börja på Connectors, sedan Connector Builder, sedan REST API och webhooks. Läs dem i ordning och du kommer att ha sett alla sätt OpsIQ kan prata med ett annat system.

💡
Två saker ändrar vad du ser. Behörigheter döljer sidor som din roll inte kan öppna, så ett avsnitt som beskrivs här kan saknas från ditt sidofält. Fråga en administratör för att kontrollera din roll. Och kontakter bär en mognadsetikett av Produktion, Beta, Förhandsvisning eller mall; den löpande byggnaden och dess anslutningsmanifest är den myndighet på vilken du har, inte denna sida.
Börja här

Vad är vad OpsIQ gör för ditt företag

OpsIQ är en komplett AI-första affärsoperativ plattform. Det ersätter din analys, livechatt, helpdesk, CRM, SEO verktygslåda, integration mellanprogram och utvecklarplattform med en enhetlig admin där varje verktyg delar samma kundkontext. Istället för att sy tillsammans 8-12 separata SaaS-produkter, du installerar OpsIQ En gång och kör allt från en skärm.

Plattformen
OpsIQ Enad plattformEn central AI-hjärna ansluten till livechatt, CRM, biljetter, Site Intelligence, kampanjer och analys.Live chattKampanjerAI CRM-lösningarIntels webbplatsBiljetterAnalysOpsIQ_AI HJÄRNA1ONE WORKSPACEVarje verktyg i en admin2SHARED BRAINEn kundkontext3ANYWHEREMoln eller självhostad
OpsIQ är en plattform med ett gemensamt kundkontext, varje verktygsflöde och drivs av samma AI-hjärna.

Allt allting OpsIQ gör · i detalj

Webbplatsanalys och besökares intelligens

Realtidsbesökare spårning

Varje sida belastning, klicka, bläddra och navigering händelse fångas i realtid. Se vem som är på din webbplats just nu, vilka sidor de tittar, hur länge de spenderar, och var de kom ifrån, alla utan tredjeparts cookies.

Besökare logga och sessioner

Full historia av varje besökare med enhet, webbläsare, operativsystem, land, stad, revisor, UTM-parametrar, landningssida och identitetsupplösning. Sessioner gruppsidvisningar i resor så att du kan se hela vägen som en besökare tar.

Sessionåterspelning

Tidslinje-stil uppspelning av fångade besökare sessioner. Se exakt vad användarna gjorde: musrörelser, klick, rullar, sidomvandlingar och bild interaktioner. Använd den för att diagnostisera UX frågor, förstå drop-off poäng och verifiera omvandlande flöden.

Live-flöde

En realtidsström av besökareaktivitet som det händer. Se sidvisningar, chattstartar, bildinlämningar och intent signaler uppdaterar några sekunder. Filtrera efter land, enhet eller revisor för att fokusera på specifika trafiksegment.

Toppsidor

Sidor som rankas av besök, engagemangstid, studsfrekvens, omvandlingar och stödaktivitet. Identifiera ditt högst prestanda innehåll och sidor som behöver förbättring.

Geo Intelligence

Land, stad och region nedbrytningar med kartor. Enhet och webbläsardistribution, trafikkälla analys, sökmotor revisor spårning och marknadspenetration insikter.

Avsiktstratt

Spåra besökare intent signaler (prissättning sidbesök, upprepade avkastningar, dokumentation surfmönster och stöd interaktioner) för att identifiera besökare som sannolikt kommer att köpa, churn eller behöver hjälp.

A/B-experiment

Kör split tester på din webbplats direkt från OpsIQ Skapa varianter, ställ in trafikallokering, definiera omvandlingsmål och mäta statistisk betydelse. Inget externt testverktyg behövs.

JavaScript fel spårning

Fånga klientsidan JavaScript fel från din webbplats automatiskt. Se felmeddelanden, stapla spår, drabbade webbläsare, frekvensräkningar och vilka sidor som utlöser dem. Debug frontend problem utan separat felövervakning.

Händelselogg

Varje spårad händelse (sidvisningar, anpassade händelser, chattinteraktioner, bildinlämningar, inköp) i en sökbar, filtrerbar logga med fullständig metadata.

Försäljning och omvandlingar

Spåra order, intäkter, återbetalningar, abonnemangsförnyelser och attribut omvandlingar till trafikkällor, kampanjer och besökare resor. Intäkter instrumentbrädor med period jämförelse och trendanalys.

Leder

Högintenta besökare identifierade genom beteendemönster. Score leder baserat på sidbesök, tid på plats, returfrekvens, stödinteraktioner och anpassade signaler. Feed leder direkt in i CRM-rörledningen.

Site Intelligence (SEO och innehållsanalys)

Site Crawls

Automatiserad krypning av hela din webbplats för att upptäcka sidor, upptäcka brutna länkar, hitta saknade metataggar, kontrollera bildalttexten, validera canonical URLs, och kartlägga din webbplatsstruktur. Schedule kryper för att köra dagligen, veckovis eller på efterfrågan.

Teknisk SEO-revision

Omfattande teknisk analys: sidhastighetspoäng, mobil respons, Core Web Vitals, SSL certifikatstatus, omdirigera kedjor, duplicerad innehållsdetektering, krypdjupanalys och strukturerad datavalidering.

Innehållsrevision

Utvärdera varje sida för innehållskvalitet, ordräkning, läsbarhetspoäng, sökordstäthet, rubrikstruktur, internt / externt länkförhållande och friskhet. Identifiera tunt innehåll, dubbla sidor och innehållsluckor.

AI-drivna sökningar

Semantisk sökning över hela webbplatsens innehåll. Fråga naturliga språkfrågor om ditt innehåll och få AI-syntetiserade svar med källsidan referenser.

SERP rank spårning

Övervaka dina sökmotorrankingar för målnyckelord över Google och andra motorer. Spåra positionsändringar över tiden, jämföra mot konkurrenterna och se vilka sidor som rankas för vilka villkor.

Keyword forskning

Upptäck sökordsmöjligheter baserat på ditt innehåll, konkurrentanalys och sökvolymdata. Få förslag till nya innehållsämnen, long-tail variationer och content optimization mål.

Backlink analys

Övervaka din inkommande länkprofil. Se vilka webbplatser som länkar till dig, spåra nya och förlorade länkar, analysera ankartextdistribution och identifiera möjligheter för länkbyggnad.

Lokalt SEO-nät

För företag med fysiska platser: visualisera din lokala söksynlighet över ett geografiskt rutnät. Se hur dina rankningar varierar beroende på plats, avstånd från ditt företag och sökinnehåll.

Google Business Profile synkroniseras

Anslut din Google Business Profil för att OpsIQ Synkronisera recensioner, inlägg, Q & A, foton och affärsinformation. Hantera din GBP-lista inifrån OpsIQ Svara på recensioner, publicera inlägg och övervaka insikter.

Schemalagda rapporter

Automatiserade SEO- och analysrapporter som genereras på ditt schema (dagligen, varje vecka, månad) Rapporter inkluderar ranking förändringar, trafiktrender, tekniska problem hittades och innehållsprestanda. Vit-labelutgång tillgänglig för myndigheter.

AI-drivet stöd

Kund AI chat

AI svarar på kundfrågor på din webbplats 24/7 använda din kunskapsbas, anslutna plattformsdata (order, konton, prenumerationer) och anpassade utbildningsinsatser. Stöder flera AI-leverantörer: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google) och Grok (xAI).

Admin AI assistent

En AI-kolpilot inuti din adminpanel som hjälper dig att skriva biljettsvar, utkast till kundkommunikation, analysera supporttrender, leta upp kunddata över anslutna plattformar och utföra åtgärder genom kontaktsystemet.

AI kunskap grundning

AI är grundad i dina kunskapsbasartiklar, FAQ-poster, produktdokumentation och anslutna plattformsdata. Det har inte kollucinerat. Det svarar från din faktiska affärsinformation eller eskalerar när det är osäkert.

Auto-handoff för människor

När AI inte kan lösa en fråga, upptäcker frustration eller kunden ber om en människa, det automatiskt händer till ditt team med fullständig konversationskontext. Konfigurerbar nedgång / timeout auto-revert tillbaka till AI.

AI-utbildningsinsatser

Skriv separata instruktioner om uppmanar till kundinriktad AI och admin-facing AI. Kontroll ton, gränser, eskaleringsregler, förbjudna ämnen och affärsspecifikt beteende. Per-workspace konfiguration stöds.

AI historia och revision

Varje AI-konversation är inloggad med fullständiga förfrågningar / svarsuppgifter, tokenanvändning, kostnadsspårning, leverantör som används och modellversion. Granska samtal för att identifiera träningsluckor och förbättra AI noggrannhet.

AI insikter

Automatiserad analys av AI-konversationsmönster. Se gemensamma frågor, resolutionsfrekvenser, handofffrekvens, kundtillfredsställelse genom ämnet och områden där AI behöver bättre utbildning.

AI-konfiguration per arbetsyta

Varje ansluten plats / arbetsyta kan använda sin egen AI-leverantör, modell, temperatur, token budget och utbildningsprompts. Ett SaaS-företag kan använda Claude för huvudprodukten och GPT-4o för ett sekundärt varumärke.

Hanterad AI och BYOK

Två AI-lägen: Hanterad AI (ingår i din plan, ingen API Nyckel behövs eller ta med din egen nyckel (använd din egen OpenAI/Anthropic/Google/xAI API Nyckeln för full kontroll över val av modeller och kostnader). Båda är förstklassiga, varje funktion fungerar med båda läget.

AI-token budgetar och kostnadskontroller

Ställ in månatliga token budgetar, per-konversationsgränser och låg balans varningar. Spåra utgifter per leverantör, per arbetsyta och per konversation. Förhindra runaway kostnader med hårda tak.

Biljetter och helpdesk

Native biljettsystem

Full helpdesk med avdelningar, prioriteringar (låg / medelhög / hög / brådskande), statuser, SLA-spårning, interna anteckningar, kundsvar, filbilagor och trådade samtal. Ingen extern helpdeski behövde.

AI triage och auto-reply

AI triages automatiskt inkommande biljetter per avdelning och prioritet. Enable auto-reply för säkra avdelningar. AI utkast och skickar ett svar efter en konfigurerbar fördröjning (standard: 2 minuter) så att människor kan intervenera först.

Intag av e-post

Anslut en brevlåda (Gmail, IMAP eller leverantörsspecifik) för att automatiskt skapa biljetter från inkommande e-postmeddelanden. Svar på biljettmeddelanden uppdaterar biljetttråden.

Biljettportal inbäddad

Inbädda en kund-ansikte biljett portal på din webbplats. Kunder kan skicka in biljetter, visa sin historia, svara på öppna biljetterna och kontrollera status, alla märkta till din design.

Biljett sammanslagning

Sammanslagna dubbletter biljetter till en enda tråd. Sammanfogade biljetterna visar [Merged] på ämnesraden. All konversationshistorik bevaras i den överlevande biljetten.

Återgå till AI

När en mänsklig agent tar över en biljett, använd "Return to AI" för att låta AI återuppta auto-reply på den biljetten. Användbar när den mänskliga nödvändighet delen är löst men kunden har uppföljningsfrågor som AI kan hantera.

Inkorgen för co-pilot

AI-assisterade biljetthantering från inkorgvyn. Kopiloten föreslår svar, sammanfattar konversationshistorik, rekommenderar prioritet / avgångsuppdrag och kan utföra åtgärder på anslutna plattformar.

Chatt och realtidsstöd

Chatt inbox

Realtid kundchatt hanteras från en enhetlig inkorg. Se alla aktiva samtal, kundidentitet, konversationshistorik och AI-förslag. Flera agenter kan samarbeta på ett samtal.

Proaktiva chattregler

Utlösa chattmeddelanden baserat på besökarens beteende: tid på sidan, specifikt URL Besökt, bläddra djup, återbesök räkna, exit avsikt eller anpassade händelser. Exempel: visa ett hjälpmeddelande efter 60 sekunder på prissidan.

Chattwidget

En anpassningsbar chatt widget inbäddad på din webbplats. Stöder AI-chatt, live agentchatt biljettinlämning, kunskap bassökning och besökare identitet. Responsive, tillgängligt och brandable.

CSAT-undersökningar

Samla kundnöjdhetsbetyg efter chatt- och biljettinteraktioner. Designundersökningar med egna frågor, betygsskalor och uppföljningsinsatser. Resultat matas in i teamprestanda och AI-insikter.

Post-chat e-postundersökning

Efter ett chattslut kan besökare med en känd e-post få ett märkt mail med en AI-sammanfattning av vad som hanterades och ett klick "Var det enkelt?" Ja / Nej. En gång per tråd, signerade engångslänkar, varje skicka inloggad, och resultatet landar på Feedback sidan som sin egen signal bredvid in-chat stjärnorna.

Feedback ID-loop

Varje feedback-post som bär en person visar dem: namn, e-post, ett klick genom sin fulla kundresa och CRM kontakt och en-klick Email eller AI-draft svar grundade i deras faktiska historia.

Skriva AI

Separat AI-skrivningsassistent för att komponera e-postutkast, biljettreparationer, tillkännagivanden och kundkommunikation. Använder sin egen prompt (inte chatthjärnan) för professionell affärsskrivning.

AI-Först CRM

CRM-kommandocentral

En enda skärm som visar hela ditt CRM-tillstånd: pipeline värde, affärhastighet, kommande uppgifter, riskerbjudanden, agentaktivitet och AI-rekommendationer. CRm-hemsidan är din dagliga utgångspunkt.

Kontakter och företag

Hantera kundkontakter med fullständiga profiler: namn, e-post, telefon, företag, taggar, livscykelstadium, konversationshistorik, biljetthistoritet, köp historia och anpassade områden. Länkkontkt till företag för B2B relation management.

Deals och pipeline board

Visuell Kanban-stil affär ombord med anpassningsbara steg. Drag handlar mellan stadier, sätt värderingar, tilldela ägarna, spåra nära datum och se pipeline värde i varje skede. Flera rörledningar stöds.

AI-affärscoaching

AI analyserar varje affär och ger coaching: risksignaler (när tyst, konkurrent som nämns, budgetproblem), nästa bästa åtgärd rekommendationer, vinna sannolikhet och föreslagen uppföljning tidpunkt.

Prognos och rapporter

Intäktsprognoser baserade på pipeline data, historiska nära priser och affären hastighet. Rapporter inkluderar pipelin i stadium, av ägaren, efter källa, omvandlingsfrekvenser, genomsnittlig affär storlek och försäljning cykellängd.

Prospekteringsagent (SDR)

AI-drivna prospektering som identifierar potentiella kunder från dina besökare data, ledsignaler och ansluten plattform aktivitet. Föreslår uppsökande mål, utkast till initiala meddelanden och poäng blykvalitet.

Uppföljningssekvenser

Automatiserade flerstegsuppföljningssekvenser: e-post, vänta, e-postadress, checkrespons, eskalera. Definiera sekvenser för nya leads, stoppade erbjudanden, efter köp incheckningar och omfördelningskampanjer.

Livcykel och retention

Spåra kundlivscykelstadier (ledare, utsikter, kund, churned) med automatiska övergångar. Retention agent övervakar för churn signaler och föreslår interventioner.

Data Steward agent

AI-agent som kontinuerligt rengör och berikar dina CRM-data: deduplicerar kontakter, fyller saknade fält, validerar e-postmeddelanden, standardiserar företagsnamn och flaggor stale poster.

Bygg min CRM

Naturligt språk CRM-konfiguration: berätta för AI hur din försäljningsprocess ser ut och den bygger dina pipelinesteg, anpassade fält, affärmallar och automatiseringsregler.

CRM hälsokontroll

Automatiserad revision av din CRM-datakvalitet: dubbla kontakter, handlar utan nästa steg, stalpipelines, saknas kontaktinformation och data fullständighets poäng.

Trust Dial

Tre-nivå autonomi kontroll för varje CRM AI agent: Autopilot (AI agerar självständigt), Copilot(AI föreslår, mänskliga godkännanden) och Manual (Ai observerar endast). Ställ in ringen per agent, per åtgärd typ och per deal värde tröskel.

Fyra AI-agenter

CRM driver fyra specialiserade AI-agenter: Steward (datakvalitet), SDR (prospektering), Retention (körförebyggande) och Analyst (rapportering och insikter). Varje agent har sin egen Trust Dial-inställning.

Anslutningar och integrationer

Pre-byggda kontakter

Ready-to-use kontakter för Shopify, WooCommerce BigCommerce, Magento 2PrestaShop, OpenCart, osCommerce WordPress, WHMCS Zendesk, Stripe, Amazon SES, Postmark, Resend, SendGrid, Mailgun, Gmail, IMAP Slack och Google Business Profile. Varje kontakt ger plattformsspecifika AI-åtgärder, kunskap och datasynkronisering.

Connector Builder

Bygg anpassade kontakter för någon plattform, ingen kod, AI-assisted eller full kod. Byggaren stödjer REST och GraphQL APIs, OAuth auktorisationskodflöde, webhook auto-registrering med Stripe och enkla signatursystem, pagination (offset, sida, cursor och länkheader), list / feltransformer, multi-action kontext och marknadsplats förpackningar.

AI-assisterad anslutningsredigering

ConnectorBuilderAI hjälper dig att bygga kontakter: beskriva vad du vill och det föreslår åtgärder, skriver förfrågningshanterare och kartor API svar. Handles autentisering, paginering och felhantering automatiskt.

OAuth flöde för alla kontakter

Generisk in-app OAuth auktorisationsflödet som fungerar med alla kontakter. PKCE-stöd, platskodad statlig förvaltning, automatisk tokenuppdatering. Connectors definierar deras OAuth parametrar och OpsIQ hanterar flödet.

Kapabilitetsbussar (plattformsövergripande förlängning)

Connectors lägger inte bara till plattformsåtgärder. De kan driva kärnfunktioner genom kapacitet "bussar". En kontakt förklarar en förmåga (kalender, anrikning, esign i CRM; lokal_listing, rank_data in Site Intelligence; web_analytics in Analytics; Pay_provider in Payments; email_sync in Mailbox; video_meeting in Comms) och implementerar sin lilla metoduppsättning; OpsIQ upptäcker det via CapabilityRegistry och trådar in i UI, Kunden 360 tidslinje, och AI-åtgärder. Flera kontakter kan erbjuda samma kapacitet utan inlåsning. Se anslutningar/PLATFORM_CONNECTORS.md.

Förinstallerad vs marknadsplatsnivå

Connectors bor i en av två nivåer. Förinstallerade kontakter (connectors/) är registeraktiva ur rutan, hålls lutande till bara den nyckellösa referensen och den mest använda leverantören per kapacitet (t.ex. Google Calendar, Gmail, Google Business Profile). Marketplace-kontakter (marketplace_connektors /) kan upptäckas men tröja tills de är installerade, t.ex Microsoft 365 Kalender, Outlook, DocuSign, Stripe, GA4, SerpApi, Zoom. Varje bro ytor en marknadsplats lista så att UI och AI kan uppmana "installera från marknaden" (notify-to-install) när en kapacitet inte har någon färdig leverantör, aldrig en trasig knapp.

Connector Marketplace

Publicera dina kontakter till OpsIQ Marketplace. Package kontakter med profil.json kunskap.json, workflow_recept.json, och undertecknade arkiv. Marketplace stöder fria och betalda kontakter med multi-source fakturering.

Connector signering

Alla kontakter är kryptografiskt signerade för integritetsverifiering. Signering kontrolleras vid installationstid. Använd verktyget resign_all_connectors för att återsignera efter uppdateringar.

SmartLookup

Deklarativt fuzzy-matchningssystem för kopplingsåtgärder. Definiera uppslagsregler och OpsIQ matchar användarfrågor till plattformsenheter med hjälp av fuzzyScore och smartRank-algoritmer.Exempel: find_country("germ") matchar Tyskland med 88.9% förtroende.

Action kontrakt

GeneralenOpsIQ APIpublicerar varje registreradJSONoperation som en upptäckbar namngiven åtgärd. Använd meta.actions för levande total och exakt skrivna kontrakt; kontaktpaket förklarar sina egna leverantörsåtgärder genom den enhetliga ActionExecutor.

Connector recept

Förbyggda arbetsflödesrecept som kombinerar flera kontakter till vanliga affärsarbetsflöden. Exempel: "När en ny order kommer in på Shopify Skapa en biljett, uppdatera CRM och skicka ett Slack-meddelande.

Kunskap sync

Connectors förklarar kunskapsämnen som synkroniserar till AI-kunskapsbasen. Plattformspecifika hjälpartiklar, installationsguider och felsökningssteg är automatiskt tillgängliga för AI utan manuell kunskapsinmatning.

Utvecklare plattform

REST API_

En namngiven JSON API täcker alla registrerade administratörer JSON drift, medAPI-Key autentisering, isolering av arbetsytan, omfattningar, räntebegränsning, idempotentskrivningar, OpenAPI och en genererad Postman-samling.

Webhooks

Outbound webhooks för alla stora händelser: order, fakturor, abonnemang, biljetter, chattar, leads, användarregistreringar och kartövergivande. Async leverans via jobbkö, exponentiell backoff retry, SSRF skydd och auto-disable efter 15 följdfel.

Webhook- signering

Varje utgående webhook är undertecknad med HMAC-SHA256. Verifiera signaturer på din mottagande ände för att säkerställa webbhook autenticitet. Stabil Event_id för idempotent bearbetning.

Widget SDK_

JavaScript SDK för spårnings widget med identitetsupplösning, anpassad händelsespårning, programmatisk chattkontroll och sidspecifik konfiguration. Installera recept för React, Vue, Next.js, WordPress, Shopify och statisk HTML.

Plugins och SDKs

Server-side SDK och plugins för gemensamma ramar. WordPress plugin, WHMCS modul, och generiska PHP/Node.js integration bibliotek.

Evenemang API

Push anpassade händelser till OpsIQ från din backend: inköp, registreringar, funktionsanvändning, fel eller något affärsevenemang. Events visas i tidslinjen för besökare och matas in i analys- och AI-kontexten.

Triggers Cookbook

Bygga automatiserade arbetsflöden utlösta av händelser: ny biljett, chattstartade, besökare identifierade, deal stage ändrades eller anpassad händelse. Triggers utför anslutningsåtgärder, skicka webhooks, uppdatera poster eller meddela ditt team.

API byggare

Visuell API och webhook byggare inuti admin. Konfigurera endpoints, testförfrågningar, inspektera svar och debug integrationer utan att lämna OpsIQ.

Team och administration

Rollbaserad åtkomstkontroll

Tre roller: Ägare (full åtkomst, fakturering, farazon), Full Admin (all verksamhet utom faktura- och riskzon) och Agent (endast tilldelade avdelningar, ingen inställningsåtkomst). Alla känsliga sidor är hårdgerade av roll.

Teamets prestationspanel

Ägare och Full Admin-endast instrumentpanel som visar upplösningstider, arbetsbelastning distribution, hantera djup, kanaluppdelning, trendanalys, SLA efterlevnad, CSAT av agent, återöppna priser, lagrulleups och mest trafikerade timmar. Uppdaterad i realtid.

Admin närvaro och online tracking

Realtid who-is-online widget i admin navigation. Heartbeat-baserad närvaro detektering (60-andra ping, 300-andra förlängning, auto-prune efter 120 dagar). se vilka administratörer som är aktiva och på vilka sidor.

Per-workspace inställningar

Varje ansluten webbplats (arbetsutrymme) kan ha sin egen AI-konfiguration, kontaktinställningar, biljettavdelningar, branding och operativa regler. Global standard kaskad till arbetsytor som inte åsidosätter dem.

Hantering av flera platser

Hantera flera webbplatser från en OpsIQ admin. Varje webbplats har sin egen spårning snippet, besökare data och konfiguration. Växla mellan webbplatser från adman navigering.

E-post mallsystem

Registreringsdrivna e-postmallar för all automatiserad kommunikation: biljettmeddelanden, chatttranscripts, välkomstmail, lösenordsåterställningar och systemvarningar. Edit HTML mallar med levande förhandsgranskning, variabla chips ({{customer_name}}, {{ticket_id}}), och global layoutkontroll.

Importera och exportera

Importera kontakter, biljetter och kunskapsartiklar från CSV/JSON Exportbesöksdata, analysrapporter och CRM-poster. Dataportabilitet för migration mellan systemen.

Säkerhet, efterlevnad och verksamhet

Företag SSO

OIDC (OpenID Connect) enkel inloggning med full runtime: upptäckt, auktorisering, återuppringning, JWKS signaturverifiering, användarinformation, domän tillåt-lista, JIT tillhandahållande och statusvakter. SAML konfigurationsstöd.

GDPR och dataöverensstämmelse

Inbyggd DSAR (Data Subject Access Request) hantering: exportera och ta bort kunddata över alla system. Kontakt-nivå data radering täcker sessioner, biljetter, chattar, CRM-poster och e-postloggar. Samtyckehanterings- och lagringspolicyer.

IP blockering och brute-force skydd

Blockera specifikt IPs eller sträcker sig från att komma åt din webbplats eller admin. Automatisk lockout efter konfigurerbara misslyckade inloggningsförsök. Misslyckad logga in med IP, timestamp och användaragent.

HSTS och säkerhetshuvuden

HTTP Strict Transport Security, Permissions-Policy rubriker och säker cookie konfiguration. Självvärderade distributioner kan lägga till CSP-headers genom serverkonfigurationen.

Outbound webhook härdning

SSRF-skydd blockerar webhooks till privata/metadata IP Async leverans förhindrar långsamma slutpunkter från att blockera din ansökan. Auto-inaktiveras efter 15 följdfel förhindrar resursavfall på döda slutpunkter.

Workspace isolering

Strikt data isolering mellan arbetsytor. Besökare, biljetter, chattar, CRM-poster och AI-konversationer är omfattade till deras arbetsplats. Cross-workspace dataläckor förhindras i fråga lagret.

Faktureringscykelhantering

Stöd för månatliga, kvartalsvisa, halvårs-, årliga, biennala och livstidsfaktureringscykler. Valuta normalisering för multivaluta gateways. FX-omvandling på betalningskvittot för korrekt intäktsrapportering.

Cron och schemalagd automation

Inbyggt krönsystem för schemalagda uppgifter: rapportgenerering, datasädning, abonnemangsförnyelser, AI-utbildningsuppdateringar, kontaktsynkronisering och webhook retries. Hälsodiagnostik med varningsindikatorer.

Datalagringspolicy

Konfigurera hur långa besökssessioner, chatttranscripts, AI-konversationshistorik och evenemangsloggar behålls. Automatisk rengöring av åldrade data för att hantera lagring och följa lagringspolicyer.

Diagnostik och hälsa

Systemhälsoinstrumentpanel som visar cronstatus, databasanslutning, AI-leverantörsstatus , kontakt hälsa , webhook leveranshastigheter och lagringsanvändning. Varningar för konfigurationsproblem och prestanda flaskhalsar.

Vem som helst OpsIQ är för

E-handel butiker

Butiker

Spåra varje besökare från landning till köp. Låt AI svara "Var är min beställning?"Shopify/WooCommerce/BigCommerce data. Hantera supportbiljetter med AI auto-reply. Kör en affär pipeline för grossist och B2B leder. Rita intäkter till trafikkällor och kampanjer. Monitor cart övergivande med återställning arbetsflöden.

SaaS och mjukvaruföretag

SaaS

Övervaka försöksregistreringar och funktion antagande med session replay. Spåra vilka dokumentationssidor konverterar. Automatisera stöd med AI grundat i din API Docs. Hantera abonnemangsintäkter och expansionserbjudanden i CRM. Anslut din faktureringsplattform (Stripe, WHMCS) för MRR-spårning i realtid. Använd CRM:s livscykelagent för att upptäcka och förhindra churn.

Agencies och frilansare

Byrån

Erbjud vit-label analys och support portaler till kunder. Spår leder över flera klientwebbplatser från en admin. Använd CRM pipeline för att hantera utsikter och projektledare. Bygg anpassade kontakter för kundplattformar med hjälp av Connector Builder. Generate branded SEO rapporter med Site Intelligence. Återförsälj marknadsplatskontakter som värdeadd service.

Hosting och infrastruktur

Värd

Djupt WHMCS Integrering med 80+ AI-åtgärder för orderuppslag, service management, DNS, och provisioning. Auto-reply till vanliga värdfrågor med hjälp av kunskapsbasartiklar. Spåra server status sida engagemang. Hantera tekniska supportbiljetter med AI triage. Använd faktureringscykelstegen för månadsvis genom livstid hosting planer.

Support-tunga företag

Stöd för support

Deflect 40-70% av repetitiva frågor med AI-chatt grundad i din kunskapsbas. Route biljetter till rätt avdelning med ai triage. Spåra teamprestanda med resolutionstider, SLA efterlevnad och CSAT by agent. Använd skriven AI för professionellt svar utarbetande. Monitor stöd trender med A I insikter.

Marknadsföring och SEO team

Marknadsföring

Full Site Intelligence Suite: crawls, tekniska SEO-revisioner, innehållsanalys, SERP rank tracking, sökordsforskning, backlink övervakning och lokalt SEOS-nät. Google Business Profile management. Schedulerade white-label rapporter för kunder. A / B testning inbyggd i spårningswidgeten. Kampanj attribution över alla kanaler.

Solo grundare och små lag

Nystartade företag

Börja med att bara spåra och chatta, gratis att lägga till. Lägg sedan till biljetter när du får stödvolym. Slå på CRM när du börjar sälja. Anslut plattformar som du antar dem. OpsIQ skalor från en person som gör allt till en 50 Personlig verksamhet team med RBAC, avdelningar och per-agent prestanda spårning.

Enterprise och multi-brand

Företag

Företag SSO med OIDC för centraliserad autentisering. Multi-workspace isolering för separata varumärken eller divisioner. Per-workSpace AI konfiguration med olika leverantörer och modeller. Custom connector development with marketplace distribution. Audit spår, GDPR överensstämmelse verktyg och datalagringspolicyer.

Vad är vad OpsIQ Ersätter

Google Analytics + Hotjar + Plausible

Full webbplats analys med besökare spårning, session replay, sida ranking, geo intelligens, avsikt tratt, konvertering attribution, händelser, A / B experiment och JS felspårning, all integritet-vänlig, allt i en plattform.

IntercomDrift + Tidio

AI-driven kundchatt med kunskapsgrundande, multi-leverantör AI support, auto-handoff till människor, proaktiv chat regler, konversationshistorik, CSAT undersökningar och biljett skapande från chatt.

Zendesk + Freshdesk + Hjälp Scout

Native biljettsystem med avdelningar, prioriteringar, SLA, AI triage, auto-reply med konfigurerbar fördröjning, e-post intag, biljettinbäddad, automatfusion, inkorgskopilot och Return to AI-kapacitet.

HubSpot + Pipedrive + Salesforce

AI-first CRM med fyra specialiserade AI agenter (Steward, SDR, Retention, Analyst), Trust Dial autonomi kontroll, pipeline board, deal coaching, prognoser, sekvenser, livscykelhantering och naturligt språk CRm konfiguration.

Ahrefs + SEMrush + Moz

Site Intelligence med automatiserade kryphål, tekniska SEO-revisioner, innehållsanalys, AI-sökning, SERP rank tracking, sökordsforskning, backlink analys, lokalt SEOS-nät och schemalagda white-label rapporter.

Zapier + Gör + anpassad mellanvaruhandel

Connector SDK med 25+ färdigbyggda kontakter, Connector Builder (ingen kod/AI-assisterad/full-kod), OAuth flöde, webhook auto-registrering, en stor katalog över anslutningsaktionsdefinitioner som blir verkställbara endast när den relevanta kontakten är installerad, aktiverad, konfigurerad och validerad, SmartLookup, marknadsplats och signerade paket.

Google Business Profile Manager

Full GBP-kontakt: granskningshantering, postpublicering, Q & A förvaltning, fotouppladdningar, affärsinformationssynkronisering, insikter spårning och AI-drivna granskning svar, allt från insidan OpsIQ.

Separata e-mallverktyg

Registreringsdrivna e-mallar med visuell redaktör, live förhandsgranskning, variabla chips, global layoutkontroll och per-event anpassning för all automatisk kommunikation.

Team management instrumentpaneler

Inbyggd teamprestanda: upplösningstider, arbetsbelastning, SLA-överensstämmelse, CSAT av agent, återöppna priser, mest trafikerade timmar, realtidsnärvaro spårning och per-departement nedbrytningar.

GDPR överensstämmelse verktyg

Native DSAR hantering, data radering över alla system, samtycke management, lagringspolicy och revisionsleder, inbyggda i plattformen, inte bultade på.

Två utgåvor

Hosted Deployment

OpsIQ körs på förvaltad infrastruktur. Produktdriften är densamma; Infrastruktur, uppdateringar och säkerhetskopior hanteras av värdoperatören. Denna handbok dokumenterar OpsIQ körtid snarare än marknadsföring eller kommersiella kontoflöden.

Självvärd modul

Installera OpsIQ på din egen server för full kontroll över data, branding, uppdateringar och integrationer. Kräver PHP 8.4+, MySQL 5.7+ eller MariaDB 10.3+, HTTPS och OpsIQ Enad Cron. Stöder WHMCS Integrering som en addon modul. Full data suveränitet.

Rekommenderad läsordning

1
Snabbstart

Följa 30- minut inställning guide för att få spårning, chatt och grundläggande AI som arbetar på din webbplats.

2
Dashboard och analys

Lär dig hur du läser dina besökardata, konfigurerar sessionsreplay, identifierar leads och förstår trafikmönster.

3
Webbplats Intelligence

Kör din första SEO-krypning, kontrollera din tekniska hälsa och konfigurera SERP rank spårning för dina målnyckelord.

4
Biljetter och support

Ställ in avdelningar, konfigurera auto-reply med AI, ansluta e-postintag och träna din AI för att hantera vanliga frågor.

5
CRM_

Organisera kontakter, bygga din pipeline, konfigurera AI-agenterna, ställa in Trust Dial nivåer och låt AI coach dina erbjudanden.

6
Connectors och utvecklarverktyg

Anslut din e-handel / faktureringsplattform, bygga anpassade kontakter, ställa in webhooks och integrera via REST API.

💡
Nytt för OpsIQ Börja med snabbstartsguiden nedan. Du kan ha spårning och grundläggande AI-chatt som körs in under 30 minuter.
Börja här

Snabbstart i 30 minuter

Följ dessa steg för att få OpsIQ kör. Varje steg bygger på den tidigare. I slutet kommer du att ha besökare spårning, AI chatt och grundläggande biljett stöd.

Inställningar
Snabbstart checklistaEn guidad inställning checklista som visar widgetinstallation, plattformsanslutning, AI-utbildning, teaminbjudan och go-live, med en 60 procent progress bar.Kom igångsetupInstallera OpsIQ widgetFörrAnslut en plattform (WHMCS, Shopify...)FörrTräna din AI på ditt innehållFörrBjud in ditt teamChecka och gå liveFörlopp för installation3 av 5 · 60%1STEP 1Installera widgeten2STEP 2Connect & Train AI3STEP 3Inbjude & Go live
Den är 30-minutersväg: installera widgeten, ansluta en plattform, träna din AI, bjud in laget och gå sedan live.

Den är 30-minute setup

1
Aktivera din licens

Ange din licensnyckel i OpsIQ admin. Gå till Inställningar, ange licensnumret som levereras för denna installation och klicka på Aktivera. Du bör se en grön "Aktiv" emblem.

2
Ställ din affärsidentitet

Gå till Inställningar och fyll i ditt företagsnamn, bransch, tidszon, standardvaluta och support timmar. Denna information används av AI när du svarar på kundfrågor och analytics för timezone-medvetna rapporter.

3
Välj en AI-leverantör

Gå till AI-konfiguration och välj din leverantör. Alternativ: Claude Anthropic), GPT-4o (OpenAI), Gemini (Google) eller Grok (xAI). API Nyckel om du använder din egen nyckel eller använd hanterad AI om den är tillgänglig på din plan. Klicka på "Test-anslutning" för att verifiera.

4
Installera spårnings widget

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
Anslut din plattform

Om du använder Shopify, WooCommerce, WHMCS, eller en annan stödd plattform, gå till Connectors, hitta din plattform, ange referenser och klicka på Test Anslutning. Detta ger AI tillgång till orderdata, kundprofiler och supportsammanhang.

6
Bjud in ditt team

Gå till Team, klicka på Inbjude, ange deras e-post och roll (Owner, Full Admin eller Agent). Agenter kan bara komma åt avdelningar du tilldela dem till. Ägare och fulla administratörer ser allt.

Den snabbaste möjliga vägen (5 minut)

Steg 1: Installera widget

Kopiera snippet från Connected Sites och klistra in den på din webbplats. Detta ger dig spårning omedelbart.

Steg steg 2Aktivera AI

Gå till AI Configuration, välj en leverantör, ange din nyckel och spara. AI-chatt är nu aktiv på din webbplats.

Klar

Du har nu besökare spårning och AI chat. Du kan lägga till biljetter, CRM och kontakter senare.

Dagens dag 2Gör det användbart

Lägg till kunskap

Gå till Knowledge Base och lägg till 5-10 Artiklar om dina vanligaste frågor. AI använder dessa för att svara på kunderna korrekt.

Skapa avdelningar

Gå till Biljetter och skapa åtminstone 2 avdelningar (t. ex. "Sales" och "Stöd"). Tilldela teammedlemmar till varje.

Skriv din AI-prompt

Gå till AI-utbildning och skriv en kund AI prompt som beskriver ditt företag, ton och eskaleringsregler.

Testa en konversation

Öppna din webbplats i en privat webbläsare och chatta med AI som kund. Kontrollera att svaren är korrekta och tonen är rätt.

Week 1: Bygg din verksamhet

Anslut e-postmeddelande

Ställ in en brevlåda (Gmail, IMAP, eller en leverantörskontakt) så att kundens e-post automatiskt skapar biljetter.

Ställ in auto-reply

Aktivera biljett auto-reply för säkra avdelningar. Ställ en 2Minutförsening så att människor kan ingripa först.

Granska analys

Kontrollera Dashboard dagligen. Titta på besökare räkna, studsa ränta, toppsidor och försäljning om spårning är ansluten.

Starta din CRM

Öppna AI CRM och låt OpsIQ importera kontakter från dina anslutna plattformar. Granska pipelinekortet.

Månad 1: Optimera

Granska AI historia

Kolla AI History varje vecka. Leta efter felaktiga svar, missade frågor och möjligheter att lägga till kunskap.

Lägga till proaktiva regler

Skapa en regel: om en besökare är på prissidan för 60+ sekunder, visa ett chattmeddelande om de behöver hjälp.

Bygg en kontakt

Om du använder en plattform som inte har en inbyggd kontakt, använd Connector Builder för att skapa en.

Ställ in webhooks

Anslut OpsIQ till dina interna verktyg med utgående webhooks för biljett, chatt och försäljningshändelser.

Kan jag hoppa över AI och bara använda spårning?+

AI-leverantören är valfri. OpsIQ fungerar som en ren analys och biljettplattform utan AI. Du kan aktivera AI senare när du är redo.

Kan jag hoppa över kontakter och lägga till dem senare?+

Anslutningar berikar AI med plattformsspecifika data, men OpsIQ fungerar utan dem. Börja med spårning och chatt, sedan ansluta plattformar när det behövs.

Tänk om jag inte har en webbplats än?+

Du kan fortfarande använda OpsIQ för biljetter, CRM och team samarbete. Spårnings widgeten är valfri. Lägg till när din webbplats är klar.

Hur vet jag om widgeten är installerad korrekt?+

Besök din webbplats i en privat / incognito webbläsare. Kontrollera sedan OpsIQ Live Feed. Du bör se ditt besök visas inom 15 Om inte, kontrollera: (1är snippet som klistras rätt, (2) är webbplatsens nyckel korrekt, (3) är annonsblockerare eller CSP-rubriker som blockerar manuset.

Börja här

Komplett produktkarta

OpsIQ är inte en funktion. Det är ett operatörsadmin, en webbplats widget, ett AI-stödslager, ett biljett/helpdesk-system, en full CRM med fyra AI agenter, en Site Intelligence suite, en kontaktplattform med marknadsplats och en utvecklare yta. Här är varje komponent som den innehåller.

Operatörsadmin

Dashboard, live feed, besökarlogg, sessioner, sessionsreplay, toppsidor, geo intelligens, intent funnel, events log, A/B-experiment, JS felspårning, försäljning och omvandlingar, leads, AI CRM (command center, kontakter, företag, erbjudanden, pipeline board, deal coaching, prognos, prospecting, sequences, lifecycle, datasteward, Build my crm, CRm config, C RM hälsa, Crum API), biljetter, chatt inkorg, proaktiva regler, CSAT-undersökningar, e-postutkast, brevlådor, AI-konfiguration, Ai-utbildning, AIA-historik, kunskapsbas, kontakter, Connector Builder, marknadsplats, anslutna webbplatser, teamhantering, lagprestanda, inställningar, diagnostik och licens.

Kund-facing ytor

Webbplatsspårning widget (analytics beacon + chat + biljett inbäddad + kunskap bassökning), klient AI chatt, biljettinlämningsportal, besökaridentitet tokenhantering, filuppladdningar, CSAT-undersökningswidget och kundanpassade hjälpcenter.

AI-Först CRM

Command center, kontakter, företag, erbjudanden, pipeline board med drag-and-drop, AI deal coaching (risksignaler, nästa bästa åtgärd, vinna sannolikhet), intäktsprognoser, prospektering agent (SDR), automatisk uppföljningssekvenser, livscykel och retention management, data steward agent (dedup, berika, validera), Bygg min CRM (naturspråket setup), CRm konfiguration, CRMA hälsokontroll, Trust Dial (Autopilot/Copilote API med webhooks.

Site Intelligence Suite

Automatiserade webbplats kryper, teknisk SEO-revision (hastighet, mobil, Core Web Vitals, SSL, omdirigeringar, strukturerade data), innehållsrevision (ordräkning, läsbarhet, sökordstäthet, rubrikstruktur), AI-drivna semantiska sökningar, SERP rang spårning över motorer, nyckelord forskning med möjlighet scoring, backlink analys och övervakning, lokal SEO grid visualisering, Google Business Profile sync (reviews, inlägg, Q & A, foton, insikter), schemalagda rapporter (dagligen / vecka / månad) och vit-label PDF Utgång för byråer.

AI och automation

Kund AI chatt (multi-leverantör: Claude, GPT-4o, Gemini, Grok), admin AI-assistent, AI kunskap jordning, auto-handoff med konfigurerbar återgång, per arbetsplats AI konfiguration, hanterade AI och BYOK lägen, token budgetar och kostnadskontroller, AI historiegranskningsspår, insiktsanalys av AI, biljett AI triage, auto-reply med fördröjning, skriv AI (separat snabb) och admin inbox copilot.

Anslutningar och integrationer

25+ pre-built connectors (förbyggda kontakter)Shopify, WooCommerce BigCommerce, Magento2PrestaShop, OpenCart, osCommerce WordPress, WHMCS Zendesk, Stripe, Amazon SES, Postmark, Resend, SendGrid, Mailgun, Gmail, IMAP Slack, Google Business Profile), Connector Builder (ingen kod/AI-assisterad/full-kod), generisk OAuth flödet med PKCE, kontaktmarknadsplats med betald distribution, anslutningssignering och verifiering, SmartLookup fuzzy matchning, en stor katalog över HTTP-åtgärdsdefinitioner vars tillgänglighet beror på anslutning installation, möjliggörelse, konfiguration och validering, kunskap synkronisering och arbetsflöde recept.

Utvecklare plattform

RESTAPI(visitorer, evenemang, biljetter, kontakter, inställningar, anslutningar), OpenAPI spec,API nyckelhantering, utgående webhooks (async, signed, retried, SSRF-bevakad, automatisk inaktiverad), EventsAPI för anpassad händelseintag, widget SDKmed identitetsupplösning, utlöser kokbok, handlingskontrakt, kontakt SDK, marknadsplats förpackning, server-side SDKs (PHP, Node.js), WordPress plugin, och WHMCS modul.

Inställningar och verksamheter

AI-konfiguration per arbetsyta, spårningsinställningar, säkerhet (HSTS, Permissions-Policy, IP blockering, brute-force skydd), RBAC (Owner/Full Admin/Agent), team management och inbjudningar, team performance dashboard, admin närvaro spårning, e-post mallsystem (registreringsdriven, visuell redaktör, variabel chips), undersökning designer, domänkunskap, biljettinbäddad konfiguration, branding, datalagring politik, faktureringscykelhantering (månat genom livstid), valuta normalisering, import / export, diagnostik, cron automation och farozon.

Säkerhet och efterlevnad

Företag SSO (OIDC med JWKS-verifiering, JIT-tillhandahållande), SAML konfiguration, GDPR/DSAR Hantering (exportera och ta bort över alla system), data radering per kontakt, samtycke hantering, arbetsyta isolering (strict query-layer scoping), revisionsleder, misslyckad inloggningsspårning, IP blockering, utgående webhook SSRF-vakt och datalagringspolicyer.

Leverantörsbro

Hanterade AI proxied genom OpsIQ Leverantör URL, Site Intelligence-leverantörens samtal, licens validering, hälsorapporter, PDF rendering och dataexport, alla dirigerade genom den konfigurerade leverantörens slutpunkt, inte direktleverantör API samtal från din server.

Varje admin sida

Instrumentpanel

Kärna

Dagligt kommandocenter: trafiköversikt, levande besökare räkna, försäljningssammanfattning, stöd kö djup, AI aktivitet varningar och snabb åtgärd genvägar.

Live-flöde

Analys

Realtidsbesökare ström: sidvisningar, chattstartar, bildinlämningar och avsiktssignaler uppdaterar några sekunder med land, enhet och referentfilter.

Besökare logga

Analys

Fullständiga besöksrekord: enhet, webbläsare, OS, land, stad, revisor, UTM-param, landningssida, identitet och fullständig sida-view historia.

Sessioner

Analys

Resegrupperad vy: sidflöde, tid på sidan, bläddra djup, omvandlingsväg och utgångssidan för varje besökare session.

Sessionåterspelning

Analys

Tidslinjeuppspelning av fångade händelser: musrörelse, klick, rullar, sidövergångar och bildar interaktioner för UX-diagnos.

Toppsidor

Analys

Sidprestandaranking: besök, engagemangstid, studsfrekvens, omvandlingar, stödinteraktioner och trendriktning.

Geo Intelligence

Analys

Geografiska rapporter: land / stadsfördelning med kartor, enhetsdistribution, webbläsarandelar, trafikkällor och marknadspenetration.

Avsiktstratt

Analys

Beteendeintent tracking: prissättning besök, returfrekvens, doc surfning, stödja interaktioner och anpassade signaler med omvandling sannolikhet.

Händelselogg

Analys

Sökbar händelsehistorik: sidvisningar, anpassade händelser, chattar, inköp, bildinlämningar med fullständig metadata och filtrering.

A/B-experiment

Analys

Split testning: skapa varianter, fördela trafiken, definiera mål, mäta betydelse och deklarera vinnare allt inifrån OpsIQ.

JS-fel

Analys

Frontend felinfångning: meddelanden, stapla spår, drabbade webbläsare, frekvens, drastiska sidor och trendspårning.

Försäljning

Försäljning

Intäktsinstrumentpanel: order, förnyelser, återbetalningar, attribution av källa, kampanjprestanda, periodjämförelse och trendanalys.

Leder

Försäljning

Ledhantering: scoring, källtilldelning, CRM status, kontaktuppgifter, beteendesignaler och rörledningsrouting.

AI CRM-lösningar

CRM_

Full CRM: kommandocenter, kontakter, företag, erbjudanden, pipeline board, coaching, prognos, prospektering, sekvenser, livscykel, datasteward och hälsa.

Biljetter

Stöd för support

Support inbox: avdelningar, prioriteringar, SLA-spårning, AI-triage, auto-reply, interna anteckningar, filbilagor, sammanslagning och statushantering.

Chatt inbox

Stöd för support

Live samtal: AI och mänsklig chatt, handoff, samarbete, konversationshistoria, kundidentitet och CSAT-kollektion.

E-postutkast

Stöd för support

E-posthantering: inkommande post till biljetter, AI-assisterade svarskomposition, mallval och brevlåda konfiguration.

AI- konfiguration

AI

Provider setup: Välj Claude/GPT-4o/Gemini/Grok, gå in API Nyckel eller aktivera administrerad AI, satt modell, temperatur och token budgetar per arbetsyta.

AI utbildning

AI

Snabb författarskap: kundanpassning och admin-facing prompts, eskaleringsregler, ton riktlinjer, förbjudna ämnen och gränskonfiguration.

AI historia

AI

Konversationsgranskning: fullständiga förfrågningar / svarloggar, tokenanvändning, kostnad per konversation, leverantör, modellversion och resolutionsresultat.

AI insikter

AI

Mönsteranalys: gemensamma frågor, resolutionsnivåer, handofffrekvens, tillfredsställelse genom ämne och utbildning gap identifiering.

Kunskapsbas

AI

AI-utbildningsinnehåll: artiklar, FAQ-poster, produktdokument, kontaktkunskap och anpassade poster. Semantisk och sökordssökning för AI grundning.

Kopplingar

Integrationer

Integrationsnav: installerade kontakter, hälsostatus, handlingsinventering, referenshantering, marknadsplatswebbläsare och Connector Builder.

Anslutna webbplatser

Inställningar

Webbplatshantering: spårning av snippet, platsnyckel, widgetkonfiguration, domäninställningar och per-site arbetsplats isolering.

Teamteam

Inställningar

Användarhantering: bjud in medlemmar, tilldela roller (Owner/Full Admin/Agent), ställa in avdelningsåtkomst och hantera behörigheter.

Teamets prestanda

Inställningar

Ops-metri: resolutionstider, arbetsbelastning, SLA-överensstämmelse, CSAT av agent, återöppna priser, mest trafikerade timmar och trendanalys.

Inställningar

Inställningar

Konfiguration: affärsidentitet, AI-installation, spårning, säkerhet, branding, retention, e-postmallar, fakturering, import / export, diagnostik och farozon.

Licens

Inställningar

Planhantering: licensstatus, planfunktioner, användningsmetri, förnyelsedatum och uppgraderings-/nedgraderingsalternativ.

Börja här

Guidad onboarding för företag

Den ombordstigande resan förvandlar en ny installation till ett fungerande arbetsutrymme för OpsIQ och kan lämnas kvar och återupptas utan att förlora framsteg.

Produktskärm
InförandeInbyggda visar varje installationsområde, dess nuvarande tillstånd och nästa åtgärd att slutföra.InförandeWorkPayPROGRESS60%COMPLETED6NästanWidgetLivet Arbetarspace VIEWLicensValidera produktlicensenKlarAI-leverantörVälj leverantör och testa nyckelKlarBrand varumärkeAffärsidentitet och tonKlarWebbplatsLägg till plats och installera widgetNästa1COMPLETE BASICSLicens, varumärke, AI2CONNECT DATAWebbplats och kontakt3VERIFY LAUNCHTeam, e-post, checkar
Inbyggda visar varje installationsområde, dess nuvarande tillstånd och nästa åtgärd att slutföra.

Rekommenderad sekvens

  1. Licens: validera licensen och bekräfta att arbetsytan är aktiv.
  2. AI-leverantör: Välj leverantören/modellen, ange referenser och kör anslutningstestet. AI kan hoppas om arbetsytan ursprungligen kommer att använda analyser och biljetter endast.
  3. Affärsidentitet: ange namnet, industrin, beskrivningen, kundanpassad ton och varumärkesdetaljer som används av widgeten och AI.
  4. Anslutning: möjliggöra minst en extern plattform när OpsIQ behöver beställningar, kunder, biljetter, e-post eller annan plattform sammanhang.
  5. Webbplats och widget: skapa webbplatsen / arbetsytan, kopiera webbplatsnyckeln och verifiera ett privat webbläsarebesök i Live Feed.
  6. Team och routing: bjud in administratörer/agenter, skapa avdelningar, ange e-postruttning och bekräfta anmälningspreferenser.
  7. Go-live checkar: testchatt, en biljett, kontakt synkronisering, krön, utgående e-post, webhooks och säkerhetsrubriker.

Resebutikerna slutförs per arbetsyta. Återgå till Onboarding bör visa färdiga steg snarare än att tvinga en omstart.

Börja här

Admin navigering och behörigheter

Sidfältet OpsIQ är medvetet om. Den här kartan förklarar var varje operationellt område bor och varför en sida kanske inte syns för alla administratörer.

Produktskärm
OpsIQ navigeringSidofältgrupperna OpsIQ by work area; enskilda länkar visas endast när den aktuella rollen kan använda dem.OpsIQ navigeringWorkPayGROUPS8SIDORTillståndsbaseradSEARCHTillgängligLivet Arbetarspace VIEWStöd för supportBiljetter, e-post, CSAT, kunskapÖppnaCRM_Kontakter, pipeline, erbjudanden, prospekteringÖppnaAutomatiseringArbetsflöden, regler, målÖppnaSäkerhet & SekretessÖversikt, revision, samtycke, blockAdmin1PICK A GROUPMatcha sidofältet2CHECK ROLEDolda betyder begränsad3USE PAGE HELPÖppna matchningsavsnittet
Sidofältgrupperna OpsIQ by work area; enskilda länkar visas endast när den aktuella rollen kan använda dem.
Stöd för support

Biljetter, teamet e-post plattform, CSAT, Hjälpcenter och chatbot flöden.

CRM_

De dagliga försäljningsytorna: CRM Home, Command Center, kontakter, pipeline, prognos, livscykel, prospektering, segment, leaderboard, godkännanden av affären, datasteward, tillväxtverktyg och aktivitetsströmmen.

Automatisering

Event-driven arbetsflöden, livscykelregler och omvandlingsmål.

Marknadsföring

Outreach, proaktiva meddelanden, tillkännagivanden, Kampanj Studio, Survey Studio, push kampanjer och guidade turer.

Analys

Rapportera ytor först - Analytics Hub, AI insikter, försäljning, kunder, leads, funnels, A / B-test, session replay, anpassade instrumentbrädor och schemalagda rapporter - med rå besökare, session, sida, geografi och händelseloggar i en Raw Data underavsnitt.

Standalone sidor

Site Intelligence, Team Performance och Feedback sitter utanför grupperna som direkta poster.

Integrationer

Anslutningar, åtgärder och triggers, brevlådor, utkast, e-postinställningar, inkommande slutpunkter, utgående webhooks och API nycklar.

Säkerhet & Sekretess

Säkerhetsöversikt, integritet och efterlevnad, cookie-godkännande, revisionsaktivitet, misslyckade inloggningar, blockeradeIPsochJavaScriptfel.

Inställningar

Arbetsytor grunder (allmänt, team, webbplatser, språk), sedan kollapsbara underavsnitt: AI Brain (instruktioner, konfiguration, utvärdering, historia), CRM Setup (byggare, anpassade fält, bly scoring, hälsa), Data & Health (diagnostics, export) och komma igång (ombordstigning, hjälp).

Sidor en roll kan inte öppna är dolda från sidofältet. Sidor som den nuvarande planen inte inkluderar att hålla sig synlig med en Uppgradera tagga och öppna en in-app uppgraderingsskärm.

Direkta rutter kontrolleras fortfarande server-side. Att dölja en sidofält länk är inte säkerhetsgränsen: varje skyddad åtgärd måste passera sitt tillstånd och arbetsytan kontroller.

Analys

Hubb för Analytics

Analytics-navet ger stöd, chatt, AI, besökare och agentrapportering till en datefiltrerad arbetsyta med exporterbara resultat.

Produktskärm
Hubb för AnalyticsAnalytics Hub visar ett datumintervall, metriska kort och flikar för support, chatt, AI, besökare och agentprestanda.Hubb för AnalyticsWorkPayTickets184AI RESOLVE63%CSAT_4.7Livet Arbetarspace VIEWStöd för supportSkapad, stängd, väntande, SLAFlikChattarAI/mänskliga resultat och hanterar tidFlikAIFörtroende, feedback, token användningFlikAgentVolym, hastighet och tillfredsställelseFlik1CHOOSE DATESFörinställd eller anpassad2CHANGE TABStöd till agent3EXPORTLadda ner CSV_
Analytics Hub visar ett datumintervall, metriska kort och flikar för support, chatt, AI, besökare och agentprestanda.

Filter och kontroller

  • Använd en förinställd eller anpassad Från/to räckvidd, sedan Skicka för att bygga om varje kort och diagram under samma period.
  • Exportera CSV exporterar den aktiva analytiska vyn snarare än en skärmdump.
  • Workspace scoping är automatisk; ändra webbplatser ändrar den underliggande datamängden.

Vad varje flik mäter

  • Stöd: biljetter skapade/stängda/pågående, första svaret, resolution, första kontaktupplösning, SLA och prioritet/avgång/statusnedbrytningar.
  • Chatt: sessioner startade, AI resolutioner, eskaleringar, övergivande, hantera tid, meddelanden per session och AI / människa / all CSAT.
  • AI: genomsnittlig förtroende, lågt förtroende, triage noggrannhet, feedback, kunskapsavböjning, token / cache-användning och de objekt som behöver granskning.
  • Besökare: trafik- och engagemangstrender för den valda perioden.
  • Agent: per-agent arbetsbelastning, hastighet, stängning och tillfredsställelse åtgärder.

Använd Analytics Hub för cross-team recension; använd dedikerade besökarna, Biljetterna, CSAT, AI History och Team Performance sidor när du behöver rekordnivåutredning.

Analys

Dashboard

Dashboard är ditt dagliga kommandocenter. Det visar trafik, försäljning, supportbelastning, AI-aktivitet och konverteringsindikatorer i en vy. Öppna det varje morgon för att förstå vad som hände över natten och vad som behöver uppmärksamhet idag.

Instrumentpanel
Översikt DashboardÖversiktsskärmen ledd av en OpsIQ Intelligence AI-panel (med dagliga korta, smarta varningar, prognos), KPI widgetplattor och en sju dagars trafikwidget plus en Reset layout kontroll.ÖversiktWorkPayOPSIQ IntelligensVälj en analys och OpsIQ Skriver detDagliga kortaSmarta varningarPrognosÅterställ layoutVISITORER IDAG2,481+12%Revenue$8.2k+5%Öppna skyttar143 SLATrafik · sista 7 dagar1AI-FIRSTOpsIQ Intelligenspanel2WIDGETSKPI-plattor du ordnar3DinaÅterställ layout när som helst
Den verkliga översiktsskärmen: den OpsIQ Intelligence panel upp toppen (plocka en analys och det skriver den) ovanför KPI widgets du ordnar dig själv.

Dashboard kort förklarade

Live besökare

Antalet personer på din webbplats just nu. Detta uppdaterar varje 15 sekunder (konfigurerbar) En besökare är "aktiv" om de laddade en sida inom den aktiva tröskeln (standard: 90 sekunder).

Unika besökare

Hur många olika personer besökte din webbplats i det valda datumintervallet. OpsIQ identifierar besökare genom en kombination av webbläsarfingeravtryck, cookies och (om tillgänglig) autentiserad identitet.

Ny vs återvänder

Nya besökare ser din webbplats för första gången. Återkommande besökare har setts tidigare. Ett högt återkommande förhållande betyder att ditt innehåll ger människor tillbaka. En mycket låg avkastningsgrad kan innebära att du inte behåller intresse.

Avvisningsfrekvens

Andelen besökare som lämnade efter att ha tittat på endast en sida. En studsfrekvens ovan 70% på landningssidor betyder vanligtvis att sidan inte uppfyller besökarens förväntningar, fel innehåll, långsam belastning eller dålig mobilupplevelse.

Genomsnittlig tid på sidan

Hur långa besökare spenderar på varje sida i genomsnitt. Mycket kort tid (under 10 sekunder) på innehållssidor tyder på att innehållet inte är engagerande. Mycket långa tider på kassasidor kan indikera förvirring.

Hot blockerade

IPadresser som OpsIQ identifieras som potentiellt skadliga baserat på hot scoring, brute force försök eller manuella block. Klicka för att se de blockerade IPs Lista.

Försäljning idag / denna vecka / den här månaden

Intäkter från anslutna försäljningskällor (Shopify, WooCommerce, StripeOm försäljningen visar noll, kontrollera att din plattformskontakt är ansluten och synkronisera.

Trenddiagram

En linje diagram som visar besökare räkna över det valda datumintervallet. Leta efter mönster: trafikspikar (kampanjer, tryck på omnämnanden), dopp (veckor, helgdagar) och långvariga trender.

Toppkällor

Där dina besökare kommer från: direkt, Google, sociala medier, e-postkampanjer, remisswebbplatser. Använd detta för att förstå vilka marknadsföringskanaler som fungerar.

Top webbläsare

Chrome, Safari, Firefox, Edge och andra. Om en webbläsare har ovanligt hög studsfrekvens kan du ha en CSS eller JavaScript Kompatibilitetsfråga.

Timme Heatmap

Ett nät som visar besökareaktivitet per timme på dagen och veckodagen. Använd detta för att bestämma när du ska schemalägga stödskiften, när du skickar meddelanden och när du kör kampanjer.

Nyligen besökande

De sista besökarna med land, sida, enhet och källa. Användbart för snabba spot-checkar under kampanjer.

Använda datumintervallet filter

Klicka på datum väljaren högst upp till höger om Dashboard. Förinställningar: Idag, Igår, Sista 7 Dagar, Sista 30 dagar, denna månad, förra månaden, anpassad sortiment. Alla instrumentpanelkort och diagram uppdateras när du ändrar intervallet. Datumintervallet är i din konfigurerade tidszon (som anges i Inställningar).

Arbetade exempel

Bounce rate spike utredning

Scenario:
Din studsfrekvens hoppade från 45% att 78% Denna vecka. Vad hände?
Vad ska man göra:

Kontrollera: (1) Ändrade en specifik landningssida? Gå till Toppsidor och sortera efter studsfrekvens. (2) Skickade en kampanj trafik till fel sida?Kontrollera Top Sources för nya revisorer. (3) Satsade webbplatsen på mobilen? Kontrollera webbläsaruppdelning för mobil studsfrekvens. (4) Är det bot trafik? Kontrollera hot mot och besökare detaljer för misstänkta mönster.

Zero besökare på Dashboard

Scenario:
Dashboard visar 0 Live besökare trots att din webbplats får trafik.
Vad ska man göra:

Kontrollera: (1) Är spårnings widget installerad? Visa din webbplats källkod och söka efter OpsIQ skript. (från)2) Är webbplatsens nyckel korrekt? Jämför data-webbplatsen i manuset med nyckeln på Connected Sites.3) Är en CDN eller cache som serverar en stale sida utan manuset? Rensa din cdn-cache.4) Är en annonsblockerare eller CSP-rubrik blockerar manuset? Kontrollera webbläsarens konsol för blockerade förfrågningar.

Läsa den timliga värmekartan

Scenario:
Din värmekarta visar tung aktivitet mellan 10:00-2:00 på vardagar men ingenting på helgerna.
Vad ska man göra:

Detta är ett B2B-trafikmönster. Dina besökare arbetar proffs som surfar under arbetstid: (1) Schemalägga stödpersonal för arbetsdagar i vardagen. (2) Skicka e-postkampanjer tisdag-torsdag morgon. (3) Weekend underhåll fönster är säkra. (4) Överväg att erbjuda livechatt endast under topp timmar.

Trafikspik från okänd källa

Scenario:
Du ser en plötslig spik av 500 besökare på en timme från en okänd revisor.
Vad ska man göra:

Gå till Besökare och filtrera efter tidsfönstret. Kontrollera:1) Är de riktiga besökare eller bots? Titta på sessionens varaktighet, sidor som visas och webbläsarens mångfald.2Om det är sant, vilken sida landar de på?3) Kontrollera revisorn URL Någon kanske har länkat till dig från Reddit, Hacker News eller en populär blogg.4) Om det är bottrafik, kontrollera hot och överväga att blockera IP range.

Varför min besökare räkna skiljer sig från Google Analytics?+

OpsIQ räknar besökare annorlunda. Det använder webbläsare fingeravtryck och cookies, medan GA använder en annan cookie modell. Bot filtrering, ad blocker priser och skript lastning order kan också orsaka skillnader. 10-20% Variansen är normal.

Kan jag bädda in instrumentbrädan i ett annat verktyg?+

Dashboarden är designad för OpsIQ admin. För extern rapportering, använd REST API för att dra analysdata och visa den i ditt eget instrumentpanel eller BI-verktyg.

Vad betyder "hot" moten?+

Det räknas IP adresser som OpsIQ har flaggats eller blockerats baserat på hot scoring, upprepade misslyckade inloggningar eller manuella block. Klicka på disken för att se detaljer och hantera block.

Analys

Besökare logga

Besökarloggen visar varje besök på dina spårade webbplatser. Varje rad är en sida belastning från en besökare. Använd den för att undersöka individuellt besöksbeteende, hitta kampanjtrafik och diagnostisera spårningsproblem.

Besökare logga
Besökare loggaEn besökare tabell med en filterbar (datum, sök IP/email/city, source, device) och kolumner för IP/email, plats, källa, enhet och tid, med en flaggad hot rad.Besökare loggayoursite.com7 dagarSök IP, e-post, stad...Källa ▾Enhet ▾IP / EMAILFörhållandeKÄLLAPRODUKTERNär[email protected]_USA · New YorkgoogleSkrivbord2m41.62.10.4Storbritannien · LondondirectMobil6m[email protected]_DE · StockholmUtm:adsMobil14m203.0.113.9NG · StockholmreferralSkrivbordthreat1–25 av 3,402Nästa session →1FILTERDatum · Sök · källa · enhet2REAL COLUMNSIP/email · plats · enhet · hot3DRILL INÖppna hela sessionen
Den verkliga besökarens logga: filtrera efter datum, sök och enhet, läs sedan varje besök av IP/email, plats, källa, enhet och tid, hot som flaggas i rött.

Vad varje rad visar

IP Adress

Besökarens IP Anonymiserad om IP anonymisering är aktiverad i Inställningar. Klicka för att se alla besök från detta IP.

Land och stad

Detekterad frånIP adress med hjälp av GeoIP-data. Kräver MaxMind GeoLite2-databas eller Cloudflare geo rubriker. Visar "Okänd" om GeoIP inte är konfigurerad.

Page URL_

Sidan besökaren laddade. Klicka för att se hela URLLångt URLs är truncated i tabellvyn.

Hänvisande

Där besökaren kom från innan du landar på din webbplats. "Direct" betyder ingen referens (bokmärken, skrivna URLs Vissa app länkar).

Enhet och webbläsare

Besökarens enhetstyp (skrivbord, mobil, surfplatta) och webbläsare (Chrome, Safari, Firefox etc.). Parsed från användaragentens rubrik.

Datum och tid

När sidan laddades, i din konfigurerade tidszon.

Kundidentitet

Om besökaren identifieras (via identitet token eller inloggning), visas deras namn eller e-post. Annars visar som anonymt.

Filter

Datumintervall

Filtrera besök på en viss tidsperiod. Standard: Last 7 dagar.

Sök efter sökningar

Sök efter IP adress, sida URL revisor, land eller kundmail.

Källa

Filtrera efter trafikkälla: Direkt, organiskt, socialt, remiss, betalt, e-post.

Enhet

Filtrera efter skrivbord, mobil eller tablett.

Ny endast

Visa bara första gången besökare som aldrig setts tidigare.

Arbetade exempel

Hitta besökare från en specifik kampanj

Scenario:
Du lanserade en Google Ads-kampanj med UTM parameter utm_source=google&utm_medium = cpc &utm _campaign = sommarförsäljning. Hur hittar du dessa besökare?
Vad ska man göra:

I Visitor Log, använd sökfältet och skriv "sommar-försäljning". Sökkontrollerna revisor URLs och sida URLs, så UTM-parametrar kommer att matcha. Du kan också filtrera genom Källan = Betald för att begränsa ytterligare.

Hitta en kund som rapporterade ett problem

Scenario:
En kund mailade och sa att "din checkout-sida bröts igår runt klockan 15.00." Hur hittar du deras session?
Vad ska man göra:

Sök efter sin e-postadress i Visitor Log. Om de var inloggade kommer deras identitet att visas. Ange datumintervallet till gårdagen. Leta efter besök på kassan runt klockan 3:00. Klicka på deras session för att se hela sidflödet och alla JavaScript fel.

Detektera en loop hitter eller scraper

Scenario:
Du märker en IP Adressen har 500+ besök på en timme, allt till samma sida.
Vad ska man göra:

Detta är sannolikt en bot, skrapa eller trasiga skript. Gå till Visitor Log och sök av det IP Kontrollera: (1) Är alla besök på samma sida?2Är användaragenten en känd bot?3) Är sessionstiden alltid 0 Om bekräftas som en bot, gå till säkerhet och blockera IP.

Besökare logga vs Sessions vs Live feed

Besökare logga

Raw page loads. En rad per sidvisning. Bäst för: undersöka specifika sidor, hitta trafik från specifika källor, diagnostisera spårningsproblem.

Sessioner

Grupper sidvisningar i resor. En rad per besök session. Bäst för: förstå användarflöde, mätning session varaktighet, identifiera omvandlingsvägar.

Live-flöde

Realtidsaktivitet. Visar besökare för närvarande på din webbplats. Bäst för: övervakningskampanjer pågår, spotting högintenterade besökare och tittar på supportmöjligheter.

Varför ser jag mina egna besök i loggen?+

OpsIQ spår alla besök som standard. För att utesluta din egen trafik, lägga till din IPadress till den uteslutna IPs Lista i Inställningar > Spårning.

Varför visar en besökare "Okänd" land?+

GeoIP-uppslag kräver antingen Cloudflare geo headers (automatiskt om du använder Cloudflare) eller en MaxMind GeoLite2-databasfil. Kontrollinställningar > GeoIP-väg för att säkerställa databasfilen finns och läsbar.

Hur länge lagras besökardata?+

Besöksdata hålls för lagringsperioden konfigurerad i Inställningar (standard: 90 dagar). Därefter rengörs gamla poster automatiskt av cronretentionsjobbet.

Analys

Sessioner

Sessioner gruppera flera sidvisningar från samma person till en enda resa. Medan Visitor Log visar enskilda sidor, visar sessioner hur människor flyttar genom din webbplats från landning till utgång.

Sessioner
SessionerSession Log-bordet med IP, land, enhet, källa, varaktighet och sidor kolumner, och en flaggad hot rad.Sessioneryoursite.comLand (NG)SessionsloggIP(S)RådetPRODUKTERKÄLLAFöroreningSIDOR41.62.10.4StorbritannienSkrivbordgoogle3m 12s_6102.89.6.2NGMobildirect1m 05s_388.21.4.9DeSkrivbordUtm:ads7m 48s_11203.0.113.9USAMobilreferral0m 42s_21SESSION LOGGrupperade resor2COLUMNSLand · enhet · källa · varaktighet3THREATRisky-sessioner flaggade
Den riktiga sessionsloggen: varje besökareresa som rad (IP land, enhet, källa, varaktighet och sidor) med riskfyllda sessioner som flaggas i rött.

Hur sessioner fungerar

En session börjar när en besökare laddar sin första sida. Det fortsätter när de navigerar till fler sidor. En session slutar när besökaren är inaktiv för perioden för sessionstid (standard: 30 minuter) eller stänger webbläsaren. Samma person som återvänder efter timeout skapar en ny session.

Vad varje session visar

Första sidan

Landningssidan, där besökaren kom in på din webbplats. Detta berättar vilket innehåll som lockar människor.

Sista sidan

Avgångssidan, där besökaren lämnade. Om utgångssida ofta är prissättningssidan kan besökarna jämföra dig med konkurrenter.

Antal sidor

Hur många sidor besökaren såg i denna session. Fler sidor betyder oftast mer engagemang, men det kan också betyda att besökaren är förlorad.

Varaktighet

Totaltid från första sidan belastning till sista aktivitet. Sessioner med 0 sekunder är studsar (enkel sidvisning, ingen ytterligare interaktion).

Källa

Trafikkällan för denna session (Direct, Google, social, remiss etc.).

Landsting

Detekterat land från besökarens IP adress.

Studsa

Oavsett om besökaren lämnade efter att ha sett en sida. studsade sessioner har en röd indikator.

Konvertering

Oavsett om besökaren slutförde en spårad konverteringshändelse (köp, registrering, formulärinlämning) under denna session.

Filter

Sök efter sökningar

Sök efter IP, e-post, sida URL, eller revisor inom sessioner.

Typ

Filtrera av nya besökare (första sessionen någonsin) eller Återkommande besökare.

Källa

Filtrera efter trafikkälla.

Landsting

Filtrera efter land för att se sessioner från en viss region.

Hot/Bounced

Filtrera för att visa endast studsade sessioner eller sessioner som flaggats som hot.

Arbetade exempel

Profilera en högvärdig kund

Scenario:
En kund gjorde bara ett stort köp. Du vill förstå deras resa innan du köper.
Vad ska man göra:

Sök efter deras e-post i Sessions. Titta på alla sina sessioner: (1) Hur många gånger besökte de innan de köpte? (2) Vilka sidor såg de? (3) Använder de chatt eller öppnar en biljett? (4) Vad var den totala tiden från första besök till köp? Detta berättar för dig den typiska inköpsresan för högvärdiga kunder.

Upptäck inloggning från en ny plats

Scenario:
En kund loggar vanligtvis in från Nigeria men du ser en session från Ryssland.
Vad ska man göra:

Sök efter kundens e-post i Sessions. Jämför det senaste besöket. Om en session plötsligt visas från ett ovanligt land kan det vara legitimt resor eller ett kompromissat konto.1Har det misslyckats inloggningsförsök innan den framgångsrika?2) Gjorde den IP ändras inom samma session? Flagga det för granskning om misstänkt.

Vad är skillnaden mellan en session och besökare?+

En besökare är en person (eller webbläsare) Ett besök från den personen. Samma besökare kan ha många sessioner över tiden. Sessioner löper ut efter timeout perioden.

Hur identifierar OpsIQ återkommande besökare?+

OpsIQ använder en kombination av cookies, fingeravtryck på webbläsaren och autentiserade identitetstokens. Om besökaren rensar sina cookies och inte är inloggad visas de som ny besökare.

Analys

Live-flöde

Live Feed visar besökare på din webbplats i realtid. Den uppdateras automatiskt varje 15 sekunder (konfigurerbar) Använd den under kampanjer, produktlanseringar och upptagna supportperioder för att se vad som händer just nu.

Live-flöde
Live-flödeEn realtidsaktivitet ström som visar en levande online-besökare räkna och ett foder av senaste besökarna åtgärder i landet.Live-flödeyoursite.com37besökare online nuLive aktivitetNu numeraUS · Visar /pricing_2sStorbritannien startade en chatt5sDE · tillsatt i kundvagn9sCA · färdig registrering1RIGHT NOWSe vem som är på plats2AUTO-REFRESHUppdateringar varje 15s3RÄTTSAKTHoppa in i en live chat
Se vem som är på din webbplats den andra och vad de gör, uppdatera automatiskt varje 15 sekunder.

Hur det fungerar

Live Feed omröstar din server på det konfigurerade uppfriskningsintervallet. Varje rad visar en besökare för närvarande på din webbplats: deras nuvarande sida, land, enhet, källa, sessionslängd och sidräkning. Gröna höjdpunkter indikerar ny aktivitet sedan den sista uppdaterade. Klicka på någon besökare rad för att se sina fullständiga sessionsuppgifter.

Inställningar

Refresh intervall

Hur ofta live feed uppdateringar. standard: 15 Sekunder. Lägre värden (5-10s) ge snabbare uppdateringar men använda fler serverresurser. Högre värden 30-60s är lättare på servern men mindre realtid.

Aktiv tröskel

Hur länge en besökare anses vara "aktiv" efter sin sista sida belastning. standard: 90 Om en besökare laddar en sida och sedan läser den för 2 minuter utan att klicka, försvinner de från levande foder efter tröskeln.

Paus knapp

Klicka på Paus för att stoppa auto-uppdatering. Användbart när du vill läsa detaljer utan listan uppdaterar. Klicka på Återuppta att starta om.

Arbetade exempel

Spot en het bly under en kampanj

Scenario:
Du kör en produktlansering. En besökare såg bara din hemsida, sedan funktioner, sedan prissättning och är nu på kassasidan.
Vad ska man göra:

Detta är hög avsiktligt beteende. i Live Feed: (1) Klicka på besökaren för att se deras session. (2) Om de startar en chatt, kommer AI att ha sin fulla resa kontext. (3) Om de lämnar utan att köpa, blir de en ledning på sidan Leads. (4) Överväg att skapa en proaktiv regel för att visa ett chattmeddelande när besökare når kassan.

För många besökare från samma IP

Scenario:
Du ser 20 besökare från samma IP adress, allt på olika sidor.
Vad ska man göra:

Detta kan vara: (1Ett kontor med delat internet. Kontrollera om besöken ser ut som riktiga människor (olika sidor, rimliga sessionstider).2En bot eller skrapa. Kontrollera om sessioner är mycket kort (0-1sekunder) eller slå sidor systematiskt. (3) Ett lasttest. Om du kör automatiska tester, uteslut inte IP från tracking.

Varför visar live-flödet 0 besökare när min webbplats har trafik?+

Kontrollera: (1) Är widget-skriptet installerat på din webbplats?2Är webbplatsen nyckeln korrekt? ()3Har den aktiva tröskeln passerat?4) Använder besökare aggressiva annonsblockerare som blockerar spårningsskriptet?

Kan jag filtrera den levande matningen efter land eller enhet?+

Live feed visar alla aktiva besökare. För filtrerade vyer, använd Visitor Log eller Sessions sidor med sina filteralternativ. Live-flödet är avsiktligt enkelt för realtidsövervakning.

Analys

Toppsidor

Top Pages visar vilka sidor på din webbplats som får mest trafik. Det rankar sidor genom besök, engagemang, omvandlingar och stödaktiviteter. Använd den för att identifiera ditt bästa innehåll, hitta underpresterande sidor och upptäcka sidor som genererar supportfrågor.

Toppsidor
ToppsidorEn rankad lista över de mest besökta sidorna med horisontella besöksstänger och räknas.Toppsidoryoursite.comMest besökta sidor/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKEDMest besökta sidor2SIGNALSBesök och omvandlingar3FINDSidor som kör biljetter
Dina sidor rankades av trafik och engagemang, så att du kan upptäcka toppinnehåll och sidor som genererar stöd.

Vad varje sida visar

Page URL_

Den fullständiga URL -vägen. Liknande sidor (t. ex. produktvarianter) grupperas om gruppering är aktiverad.

Utsikt

Totalt antal gånger denna sida laddades i det valda datumintervallet.

Unika besökare

Hur många olika personer såg denna sida (en person som tittar på samma sida räknas två gånger som 1 unika).

Avvisningsfrekvens

Andel besökare som lämnade din webbplats efter att ha sett endast denna sida. Hög studsa på landningssidor = problem. Högt studium på "tack" sidor = normalt.

Genomsnittlig tid

Hur långa besökare spenderar på denna sida i genomsnitt. Mycket kort = inte läsa. Mycket länge på en formsida = förvirring.

Chatten börjar

Hur många chattkonversationer startades från den här sidan. Hög chatt börjar på en produktsida betyder att produktbeskrivningen kan vara oklar.

Supportbiljetter

Hur många supportbiljetter skapades av besökare som var på denna sida. Hög biljett räknar = potentiella UX eller innehållsproblem.

Arbetade exempel

Hitta sidor som driver supportfrågor

Scenario:
Ditt supportteam håller på att få frågor om frakt. Vilken sida misslyckas?
Vad ska man göra:

Sortera Top Pages med "Supportbiljetter" eller "Chat startar" nedåt. Leta efter produkt- eller fraktsidor med höga räkningar. Sidan med de mest stödfrågor har förmodligen oklar information. Fix sidan innehåll och övervaka om supportfrågor minskar.

Hitta sidor med hög exithastighet

Scenario:
Du vill veta var människor lämnar din webbplats oftast.
Vad ska man göra:

Sortera efter studsfrekvens nedåt. Ignorera sidor som naturligt lämnar poäng (tack sidor, bekräftelsesidor). Fokusera på sidor som bör hålla besökare engagerade: produktsidor, prissättning, funktioner. Dessa behöver bättre samtal-till-action eller tydligare innehåll.

Varför visar en sida 0 visningar trots att jag vet att det blir trafik?+

Kontrollera: (1) Är spårnings widgeten installerad på den specifika sidan? Ensidig-sida appar kanske inte avfyra sidvisningar på vägändringar.2) Är sidan utesluten i spårningsinställningar? (3Är en CDN som serverar en cachad version utan spårningsskriptet?

Analys

Geo Intelligence

Geo Intelligence visar var dina besökare kommer från land, stad, enhet och källa. Använd den för att förstå dina geografiska marknader, bestämma språkstöd, planera regional marknadsföring och upptäcka misstänkta trafikmönster.

Geo
Geo IntelligenceEn karta över besökare platser bredvid en per land bar ranking.Geo Intelligenceyoursite.comBesökare på platsUSAStorbritannienDeSENG1MARKETSLand, stad, enhet2PLANSpråk & regioner3WATCHSpot Odd Trafik
Där dina besökare kommer från (by country, city och device) till storleksmarknader och upptäcka ovanlig trafik.

Vad du ser

Top Country Bar Chart

De högsta länderna rankas av besökare räkna. Klicka på ett land för att borra ner till stadsnivå data.

Land Doughnut

Visuell nedbrytning av trafiken per land. Hover för procentandelar.

Fullständig landstabell

Varje land med besökare under den valda perioden, som visar besöksräkning, session räkna, studsa ränta och omvandlingsfrekvens.

City borr-down

Klicka på ett land för att se vilka städer i landet som har flest besökare.

Hur GeoIP-detektering fungerar

OpsIQ detekterar besökarens plats på två sätt: (1) Cloudflare geo headers. Om din webbplats ligger bakom Cloudflare landdetektering är automatisk och korrekt. (2 MaxMind GeoLite2-databasen. Ladda ner den fria databasen och konfigurera sökvägen i Inställningar. Detektering på stadsnivå kräver Geolit2-City-databaden, inte bara landdatabas.

VPN och proxy trafik

Besökare som använder VPN kommer att visas komma från VPN-serverns plats, inte deras verkliga läge. Detta är genom design. OpsIQ kan inte och bör inte försöka kringgå VPN. Om du ser ovanliga landmönster, anser att det 10-20% besökare kan använda VPN.

Arbetade exempel

Oväntad landstrafik

Scenario:
Du driver ett amerikanskt företag men 30% trafiken är från Indien.
Vad ska man göra:

Kontrollera: (1) Är dessa riktiga besökare? Titta på sessionens varaktighet och sidor som visas. Mycket korta sessioner med hög studsning = troliga bots.2) Hittar de dig genom Google? kontrollera revisorn.3Kan de vara potentiella kunder på en ny marknad? Om trafiken är verklig och engagerad, överväga att lägga till Indien-specifik prissättning eller innehåll.

Beslut om språkstöd

Scenario:
Du vill veta om du ska översätta din webbplats till spanska.
Vad ska man göra:

Titta på sidan Geo Intelligence. Om spansktalande länder (Spanien, Mexiko, Colombia, Argentina etc.) tillsammans representerar mer än 10% Av din trafik med låga studsräntor är översättningen värd att överväga. Kontrollera också: konverterar besökare från dessa länder till samma priser som din primära marknad?

Regional supportskift planering

Scenario:
Du måste bestämma supportteam timmar för olika tidszoner.
Vad ska man göra:

Använd den timvisa värmekartan (på Dashboard) i kombination med Geo Intelligence. Om 40% av din trafik kommer från Europa och 35% Värmekartan visar exakt när varje region är som mest aktiv, vilket gör det lättare att se var du kan få hjälp.

Land med besök men inga order

Scenario:
Tyskland visar 500 besökare denna månad men noll försäljning.
Vad ska man göra:

Undersöka: (1) Studsar de på prissättningen? Kanske är din prissättning inte konkurrenskraftig för den marknaden. (2) Skickar du till Tyskland?Kontrollera om din fraktsida nämner Tyskland. (3) Är din utcheckning tillgänglig i EUR? Valuta felmatch orsakar övergivna kassan. (4) Är dessa besökare från en enda källa som kan vara lågavsiktstrafik?

Varför visar en besökare "Okänd" land?+

GeoIP är inte konfigurerad. Antingen ställa in Cloudflare (som lägger till geo headers automatiskt) eller ladda ner MaxMind GeoLite2-databasen och ange filvägen i Inställningar> Geoip Path.

Kan jag blockera trafiken från specifika länder?+

OpsIQ blockerar inte efter land. Använd din webbserver eller Cloudflare brandväggsregler för landbaserad blockering.OpsIQ fokuserar på synlighet, inte åtkomstkontroll på nätverksnivå.

Analys

Avsiktstratt

Intent Funnel klassificerar besökssessioner av vad de verkar försöka göra: bläddra, forskning, jämföra, köpa, få stöd eller lämna. Använd den för att förstå balansen i avsikt på din webbplats och identifiera var besökare släpper av.

Avsiktstratt
AvsiktstrattEn tratt från Browse till Research för att jämföra med köp med räkningar, plus stöd och lämnar chips.Avsiktstrattyoursite.comBläddra · 8,200Forskning · 4,100_Jämför · 1,650Köp · 5206%- FöretagstjänstLämna 11%1CLASSIFYVad besökare vill ha2STAGESBläddra för att köpa3FIXHitta drop-off
Sessioner som klassificeras avsikt (bläddra, forskning, jämföra, köpa) så att du kan se exakt var människor släpper av.

Intentkategorier

Bläddra

Besökare tittar tillfälligt runt. Korta sessioner, få sidor, inget specifikt mål upptäcktes.

Forskning

Besökare som läser produkt / funktionssidor, docs eller blogginnehåll. Längre tid på sidan, flera innehållssidor.

Jämför

Besökare som tittar på prissättning, plan jämförelse eller funktionsbord. Ofta återvändande besökare.

Köpa

Besökare på kassan, kundvagnen eller registreringssidorna. Hög avsikt. Dessa är dina omvandlingsmöjligheter.

Stödsökande

Besökare på hjälpsidor, kontaktsidor eller startchatt. De behöver hjälp.

Studsar

Besökare som lämnade efter en sida. Lågt engagemang.

Hur man läser tratten

Tolka din tratt

Scenario:
1,000 besökare såg prissättning. 270 Öppna chatten. 92 Började checkout. 64 Betalt. 18 Öppna supportbiljetter.
Vad ska man göra:

Prissättning sida är stark nog att skapa avsikt. Chatt är viktigt i köpvägen: 27% för pristagare som deltar i chatten innan du köper. Supportbiljetter efter kassan kan indikera aktivering eller betalningsförvirring1) Se till att AI-chatten svarar på prissättningsfrågor väl2) Undersöka 18 post-checkout support biljetter för gemensamma frågor.

Tidsfilter

Använd datumintervallfiltret för att jämföra avsiktsmönster under perioder. Till exempel, jämför Black Friday-veckan till en vanlig vecka. Du bör se en spik i "Buying" -intentation och eventuellt "Supportsökande" om dina kampanjer skapade förvirring.

Hur klassificerar OpsIQ avsikt?+

OpsIQ Tittar på sidan URLs, sessionsbeteende och tidsmönster. Prissättning sidor signal jämförelse avsikt. Checkout-sidor signalerar att köpa intent. Hjälp / kontakt sidor signal supportintent. Klassificeringen är heuristisk-baserad, inte AI-driven.

Kan jag anpassa intentkategorierna?+

För närvarande är kategorierna inbyggda baserat på vanliga webbbeteendemönster. Anpassad avsiktsklassificering ligger på färdplanen.

Analys

Funnels, retention och vägar

Bygga anpassade resor från sida eller händelsesteg, mät kohortretention och upptäck de vägar som besökarna oftast tar genom en webbplats.

Produktskärm
TrattarEn anpassad tratt visar varje sida / händelse steg, de återstående besökarna och omvandlingsprocenten.TrattarWorkPaySTEPS4CONVERSION28.4%WINDOW72h_Livet Arbetarspace VIEWPrissättning sedda1,420 besökare100%Plan vald780 besökare54.9%Checkout startade530 besökare37.3%Order slutförd403 besökare28.4%1DEFINEVälj välja att välja 2–8 Steg2MätaStäll in konverteringsfönster3ImpropeHitta den största droppen
En anpassad tratt visar varje sida / händelse steg, de återstående besökarna och omvandlingsprocenten.

Trattar

Skapa en namngiven tratt med 2 att 8 sidan eller händelsestegen. Ställ in omvandlingsfönstret i timmar; en besökare räknas endast när de beställda stegen inträffar inne i det fönstret. Använd droppen mellan steg för att välja var du ska kontrollera omspelning, fel, sidhastighet eller meddelanden.

Lagring

Lagring grupper besökare i veckovisa kohorter och visar hur många återvänder. Välj en 6, 8 eller 12 veckohorisont. Håll kohortdefinitionen stabil när du jämför utgåvor eller kampanjer.

Vägarna

Paths listar de vanligaste sidsekvenserna. Välj en väglängd från 2 att 5 sidor för att hålla resultatet läsbart. Använd det för att hitta oväntade omvägar, gemensamma utgångar och innehåll som upprepade gånger föregår konvertering.

Anpassade tratt är analytiska definitioner, inte automationer. För att reagera på ett slutfört steg skapar du ett omvandlingsmål, segment, utlösare eller arbetsflöde.

Analys

Sessionåterspelning

Session Replay låter dig titta på en tidslinje av vad en besökare gjorde på din webbplats: vilka element de klickade, hur de rullade, där de svävade och vad de skrev (med känsliga fält maskerade). Använd den för att diagnostisera UX-problem, verifiera buggrapporter och förstå kundförvirring.

Sessionåterspelning
SessionåterspelningEn replay-spelare som visar en sidvisningsport med en markör, en session infopanel och en tidslinje skrubber.Sessionåterspelningyoursite.comKöp nuSESSIONVaraktighet 3m 12s14 klickarUS · SkrivbordChrome 124_1WATCHKlickar, scroll, typ2MASKEDKänsliga fält dolda3DIAGNOSEVerifiera bug-rapporter
Spela exakt vad en besökare gjorde: klickar, rullar, skriver (känsliga fält maskerade), på en tidslinje skrubber.

Hitta rätt session

Från sidan Sessions, leta efter sessioner med rapporterade problem, räknar hög sida utan konvertering eller sessioner från kunder som lämnat in supportbiljetter. Klicka på replay-ikonen för att öppna tidslinjens vy.

Vad replay visar

Tidslinje

En horisontell bar som visar händelser över tiden. Klicka var som helst på tidslinjen för att hoppa till det ögonblicket.

Sidnavigering

Varje sidladdning visas som ett segment på tidslinjen. Du kan se den exakta vägen besökaren tog.

Klickar

Klicka på händelser visas som prickar på tidslinjen och som höjdpunkter på sidan rekonstruktion.

Rullning

Scrolldjup spåras så att du kan se hur långt ner besökaren läser.

Form interaktion

Fältfokus och skriva händelser registreras. Textingång i lösenord och känsliga fält maskeras som standard.

Sekretess och maskering

Session replay masker känsliga formulärfält som standard. Lösenordsfält, kreditkortsinmatningar och fält markerade med data-opsiq-mask registreras aldrig. Du kan konfigurera ytterligare maskeringsregler i Inställningar> Spårning. Om din efterlevnadspolicy kräver det, kan du inaktivera replay helt.

Diagnosera en trasig kassa

Scenario:
En kund säger: "Jag försökte köpa men knappen gjorde ingenting."
Vad ska man göra:

Hitta deras session på sidan Sessions (sök via e-post). Öppna replay. Titta på kassasidan segmentet. Leta efter: (1) Klickade de på rätt knapp? (2) Gjorde en JavaScript fel uppstår? (Kontrollera JS-felsidan för den tiden.) (3) Har sidan laddats om eller visat ett felmeddelande? (4) Var ett obligatoriskt fält tomt? Replayen visar exakt vad som hände.

Hur mycket lagring spelar session replay användning?+

Replay data växer med trafikvolym. Använd lagringsinställningar för att automatiskt rensa upp gamla replay-data. För högtrafikerade webbplatser, överväga en kortare replay retention period (t. ex. 30 dagar) för att hantera lagring.

Kan besökare välja bort replay?+

Om "Respect Do Not Track" är aktiverad i Inställningar, registreras inte besökare med DNT-rubriker. Du kan också utesluta specifika sidor från att spela in spårningsinställningarna.

Analys

Händelselogg

Events Log visar varje händelse som OpsIQ har spelats in: sidvisningar, klick, chattstart, biljett skapelser, försäljning och anpassade händelser. Använd den för att debug integrationer, verifiera webhook leverans och förstå sekvensen av åtgärder.

Händelselogg
HändelseloggEn kronologisk händelse logga med färgkodade typ märken: sidvisning, chatt, försäljning, webhook och custom.Händelseloggyoursite.compageview· /pricing_12:04:01chat.startStorbritannien · widget öppnas12:04:09försäljning$49.00· order #104212:05:22Webhookpayment.succeeded12:05:23customdemo_booked12:06:101EVERYTHINGVarje inspelad händelse2DEBUGVerifiera webhook leverans3ORDERSe exakt sekvens
En tidslinje av allt OpsIQ rekord (sidor, chattar, försäljning, webhooks, anpassade händelser) för felsökning och revision.

Inbyggda evenemang (automatiska)

⚠️
Dessa är events-log namn – vadOpsIQposter på besökartidslinjen för analys, felsökning och revision. De är ett annat ordförråd från Utomhus webhook händelser du prenumererar på en slutpunkt till. Om du bygger en webhook mottagare, använd listan i Webhooks-avsnittet eller ring webhooks.events.lista) att prenumerera på ett namn från denna tabell kommer inte att leverera något.

Varje rad visar namnet du Skicka sänd och det kanoniska namnet OpsIQ butiker Det som. Båda är inspelade: det råa namnet du skickade, och den kanoniska en som den kartlägger till, så en rapport skriven mot den kanonsiska taxonomin fortsätter att fungera beroende på vilket som helst en tracker används.

pageview page.viewed

En spårad sidlast. InkluderarURL, titel, revisor och timestamp. page_view och view accepteras som samma sak.

chat_open support.chat_opened

En besökare öppnar chatten widget.

chat_send support.chat_message_sent

En besökare skickar ett chattmeddelande. Svarssidan lagras som support.chat_message_received.

ticket_open support.ticket_created

En supportbiljett skapas. ticket_create accepteras som samma sak; svar och nedläggningar lagras som support.ticket_replied och support.ticket_closed.

form_submit form.submitted

En spårad form lämnas in. submit accepteras som samma sak.

purchase commerce.purchase_completed

Ett köp slutförs. purchase_successoch försäljningen alias order.completed, sale.completed, payment.completed och invoice.paidAlla accepteras från en uppkopplad plattform.

kassan commerce.checkout_started

Checkout börjar. Relaterad: cart_view, checkout_view, checkout_intent, checkout_abandon, add_to_cart.

login_success identity.signed_in

En besökare skriver in. Ett misslyckande är login_failedlagras som identity.login_failedEn lockout är login_lockout_created.

Registrering conversion.signup

En besökare slutför en registrering. En bly är leadlagras som conversion.lead.

js_error error.js

Ett fel på JavaScript fångas på en spårad sida.

💡
Ett evenemangsnamn som du skickar är inte ett av dessa alias fortfarande registrerat verbatim - ingenting tappas. Det har helt enkelt ingen kanonisk kartläggning, så det kommer inte att rulla upp i taxonomi-baserade rapporter.

Anpassade händelser

Du kan skicka anpassade händelser från din webbplats eller server till OpsIQ Anpassade händelser är användbara för att spåra åtgärder som är specifika för ditt företag: knappklick, funktionsanvändning, videospel, nedladdningar etc.

JavaScript · anpassad händelse från webbläsare
// Send a custom event from the browser
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "plan_selected", {
  plan: "pro",
  billing: "annual",
  value: 99
}]);
PHP · spela in en kontaktaktivitet från din 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);

Filtrera händelser

Event typ

Filtrera efter specifika evenemangsnamn: pageview, chat. started, ticket. created, etc.

Datumintervall

Visa händelser från en viss tidsperiod.

Sök efter sökningar

Sök händelsedata genom sökord (URL e-post, event property values).

Hur länge hålls händelser?+

Händelser följer lagringspolicyn som anges i Inställningar. Standard: 90 dagar. Högvärdiga händelser (köp, säkerhetshändelser) kan konfigureras med längre lagring.

Kan jag använda händelser i A/B-experiment?+

När du skapar ett experiment väljer du en omvandlingshändelse. Alla inbyggda eller anpassade händelser kan användas som konverteringsmål.

Analys

A/B-experiment

Experiment låter dig testa två versioner av en sida eller funktion och mäta vilken som fungerar bättre. OpsIQ spårar intryck, omvandlingar och statistisk betydelse.

A/B-experiment
A/B-experimentTvå variantkort som jämför konverteringsfrekvenser, med en vinnare märke och betydelse på den ledande varianten.A/B-experimentyoursite.comAlternativ A4.2%Konvertering · 1,020 UtsiktAlternativ BVINNARE6.8%Konvertering · 1,005 Utsikt+62% hiss · 96% signifikant1TestTvå varianter huvud-till-head2MätaKonverteringar och betydelse3DECIDEFörklara en vinnare
Kör två varianter, se konverteringar och statistisk betydelse och förklara vinnaren.

Hur experiment fungerar

1
Skapa ett experiment

Ge det ett namn, definiera din primära metriska (omvandlingshändelse) och ange varianterna (kontrollera och testa).

2
Kör det

OpsIQ tilldelar slumpmässigt besökare till varianter och spårar deras beteende. Ändra inte experimentet medan det körs.

3
Läs resultaten

När tillräckligt med data har samlats in, kontrollera konfidensnivån. 95% självförtroende betyder att du kan vara. 95% säker på att skillnaden är verklig, inte slumpmässig chans.

Experimenttillstånd

Utkast

Skapad men ännu inte startad. Du kan fortfarande redigera varianter och mätvärden.

Körning

Aktivt tilldela besökare till varianter. redigera inte när du kör.

Slutförd

Nådda statistiska betydelse eller stoppades manuellt. Resultaten är slutgiltiga.

Arkiverad

Resultaten har granskats och experimentet behövs inte längre i den aktiva listan.

Bästa praxis

Definiera ditt metriska innan lanseringen

Bestäm vad du mäter innan du börjar. Välja en metrisk efter att ha sett resultat introducerar fördomar.

Undantaga interntrafik

Lägg till ditt teams IP adresser till uteslutningslistan så personalbesök inte sneda resultat.

Kör tillräckligt länge

Stoppa inte ett experiment efter 100 Du behöver hundratals eller tusentals besökare per variant för tillförlitliga resultat.

Testa en förändring i taget

Om du ändrar rubriken OCH knappfärgen vet du inte vilken förändring som orsakade förbättringen.

Registrera ditt beslut

Efter att experimentet slutar, notera vilken variant som vunnits och varför du valde att implementera den.

Hur många besökare behöver jag för ett giltigt experiment?+

Det beror på omvandlingsfrekvensen för baslinjen och effektstorleken som du vill upptäcka.Som en tumregel: minst 500 besökare per variant för en 20% effektstorlek. För mindre effekter behöver du tusentals.

Kan jag köra flera experiment samtidigt?+

Ja, men var försiktig. Om två experiment påverkar samma sida kan deras resultat interagera. Det är säkrare att köra experiment på olika sidor eller funktioner samtidigt.

Analys

JavaScript fel

JavaScript Fel samlar in klient-side fel från dina besökare. En trasig knapp, en misslyckad API samtal, eller en saknad resurs dyker upp här. Använd den för att hitta och fixa buggar som påverkar verkliga kunder.

JS-fel
JavaScript felEn lista över fångade front-end fel med svårighetsgrad prickar, källfil, webbläsare och händelse räknas.JavaScript felyoursite.comNyligen felTypeError: kan inte läsa x av odefinieradcheckout.js:42· Chrome×214404 lastning /assets/app.cssIndex · Safari×88Uncaught (i löfte) NetworkErrorapi.js:17 Firefox×51Försämring varning: loss händelsevendor. js · Edge×331CAPTUREKund-side fel2IMPACTRäknar & webbläsare3FIXSquash riktiga buggar
Riktiga besökare slår bruten kodyta här (meddelande, källa, webbläsare och hur ofta) så att du kan fixa vad som är viktigt.

Vad varje fel visar

Felmeddelande

Den är JavaScript feltext (t.ex. "TypeError: Kan inte läsa egenskaper av odefinierade").

Page URL_

Vilken sida felet inträffade på.

Webbläsare och enhet

Vilken webbläsare och enhetstyp såg felet. Vissa fel är webbläsarspecifika.

Stack Trace

Kodplatsen där felet inträffade. Klicka för att utöka hela stack spåret.

Först sett

När detta fel först dök upp.

Senast sett

När detta fel senast inträffade.

Räkna

Hur många gånger har detta fel registrerats.

Påverkade sessioner

Hur många olika besökarsessioner upplevde detta fel.

Prioritera fel

Inte alla JavaScript Fel behöver omedelbar uppmärksamhet. Prioritera genom: (1) fel på kritiska sidor (checkout, signup, inloggning),2fel med hög session räknas, (3fel som dök upp nyligen (möjlig regression från en kodändring),4fel på din egen kod (inte tredjepartsskript).

Fastställande av en trasig checkout knapp

Scenario:
På sidan JS-fel visas "TypeError: Kan inte läsa egenskaper av odefinierade (läsa in)" på /checkout, påverka 45 sessioner denna vecka.
Vad ska man göra:

Detta innebär 45 riktiga kunder kunde inte slutföra kassan. steg:1Öppna sidan i samma webbläsare/enhetskombination.2Öppna webbläsarkonsolen och reproducera felet.3) Kontrollera stack spår för att hitta den exakta raden av koden.4) Fixa buggen, distribuera och övervaka felräkningen som går till noll.

Får OpsIQ fel från tredjepartsskript?+

Ja, OpsIQ fångar alla JavaScript fel på sidan, inklusive fel från analysskript, chattwidgetar och annonsskript. Filtrera efter URL i stackspårningen för att fokusera på din egen kod.

Hur utesluter jag kända ofarliga fel?+

Du kan inte undertrycka specifika fel i OpsIQ men du kan filtrera listan efter sida URL eller felmeddelande. Fixa eller ignorera fel från webbläsartillägg (de visar ofta som fel från okända källor).

Försäljning

Försäljning och omvandlingar

Försäljningsspårning ansluter din butik eller faktureringsplattform till OpsIQ så att du kan se intäkter tillsammans med besökarens beteende. Varje köp hänförs till en besökarresa så du vet vilka sidor, kampanjer och kanaler som driver intäkterna.

Försäljning
FörsäljningFörsäljningsskärmen: en intäktssumma med en all-time period kontroll, en sökning och ett Senaste köptabell (datum, kund, plattform, belopp, källa).Försäljningyoursite.comRevenue$42,180+18%All time ▾_Sök e-post, IP, Order ID ...Nyligen inköpDatumKUNDERPLATTFORMMÅLKÄLLAJun 3_[email protected]_Shopify_$49googleJun 3_[email protected]_WooCommerce$129directJun 2_[email protected]_Stripe_$480annonser1RevenueBeställningar och förnyelser2RECENT PURCHASESDatum · Kund · Mängd3ATTRIBUTEDTill trafikkällan
Den verkliga försäljningsskärmen, intäkter upp toppen, sedan Senaste Inköp (datum, kund, plattform, belopp), som varje tillskrivits dess trafikkälla.

Försäljning Dashboard

Dagens försäljning

Intäkter från order som slutförts idag. Refreshes med varje ny orderhändelse från din anslutna plattform.

Denna vecka / denna månad / totalt

Intäkter aggregerade under perioden. Återbetalningar subtraheras från dessa totalsummor.

Trenddiagram

Linjegraf som visar dagliga intäkter över det valda datumintervallet. Leta efter spikar (främjande, kampanjer) och dips (frågor, säsongsbetonade).

Topp konvertera källor

Vilka trafikkällor leder till de flesta inköp. "Direct" köpare bokmärkte ofta din webbplats. "Google" köparna hittade dig genom sökningen.

Nyligen köp

De senaste order med kund e-post, belopp, valuta och objekt som köpts.

Obekräftade inköp (kundresa)

När trackern ser en besökare når en köpbekräftelse i webbläsaren men ingen ansluten plattform har rapporterat att försäljning ännu, visar kundresan ett inköp (obekrediterad) rad med en bärnsten. Det räknas aldrig som intäkter. När plattformen bekräftar försäljningen ersätter det bekräftade köpet den.

Försoning

Försäljningskontakter beror inte på en enda webhook. Varje betalningssignal plattformen skickar kan öppna försäljningen, och Connector Contract 2.3 läser om plattformens egen lista över färdigförsäljan på ett schema (standard per arbetsyta) så att en webhoke plattformen aldrig levereras kan förlora en försäljning. Operatörerna kan köra den på begäran från kommandoraden med verktyg / säljes_reconcile. php.

Plattform setup guider

Shopify_

Gå till Connectors >Shopify Skapa en anpassad app i din Shopify admin (Inställningar > Appar och försäljningskanaler > Utveckla appar). Grant omfattningar: read_orders, read_customers, Read_products. Copy the Admin API tillgång till token. OpsIQ Ange din butik domän (t.ex. your-store.myshopify.com) och åtkomsttoken. Klicka på Test Anslutning. Om det är framgångsrikt, aktivera webhook synkronisera för realtidsbeställningsmeddelanden.

WooCommerce

Gå till Connectors >WooCommerce I din WordPress admin, gå till WooCommerce> Inställningar > Avancerad > REST API Skapa en nyckel med läs / skriv tillstånd. Kopiera konsumentnyckeln och konsumenthemligheten. OpsIQ, ange din webbplats URL, konsumentnyckel och konsumenthemlighet. Klicka på Testanslutning.

BigCommerce

Gå till Connectors > BigCommerce. I din BigCommerce-administration går du till Advanced Settings>API Skapa en V2/V3 API Konto med läs omfattning för Order, Kunder och Produkter. Kopiera åtkomsttoken, klient-ID och API Vägen in i dem OpsIQ och testa.

Magento 2_

Gå till Connectors > Magento. I din magento-administration går du till System> Integrationer. Skapa en ny integration med API resursåtkomst till Försäljning, Kunder och Katalog. Aktivera integrationen och kopiera åtkomsttoken. Ange den i OpsIQ med din Magento-bas URL.

PrestaShop

Gå till Connectors > PrestaShop. I din Prestashop-admin, gå till Advanced Parameters> Webservice. Aktivera webbtjänsten och skapa en ny nyckel. Grant tillgång till beställningar, kunder och produkter. Kopiera nyckeln och ange den i OpsIQ med din butik URL.

OpenCart

Gå till Connectors > OpenCart. Generate API credentials från din OpenCart admin panel. Ange API URL, användarnamn och nyckel i OpsIQ Anslutningen använder OpenCarts REST API för order och kunddata.

osCommerce

Gå till Connectors > osCommerce. Konfigurera databasåtkomst eller API credentials som dokumenteras i anslutningsinställningarna. osCommerce integration kräver vanligtvis direkt databasåtkomst eller en anpassad API modul.

Stripe_

Gå till kontakter > Stripe. Kopiera din rand begränsad API Nyckeln från Stripe Dashboard (Developers >API nycklar). Nyckeln behöver läsa tillgång till kunder, avgifter, fakturor och prenumerationer. Ange den i OpsIQ Konfigurera webhook endpoint för realtid händelser.

Anpassad/andra plattformar

Använd REST API eller webhooks för att skicka försäljningshändelser från någon plattform. Skicka order.fullbordade händelser med kundens e-post, belopp, valuta och objekt. Se Events API sektion för payload-format.

Förstå din försäljning tratt

Topp konvertera källor

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.

Återbetalningar

Återbetalda order spåras separat. De minskar dina nettointäkter totalt. Om återbetalningsgraden är hög från en viss källa, kan trafiken vara låg kvalitet.

Valutahantering

OpsIQ lagrar den ursprungliga transaktionsvalutan och mängden. Flervalutaföretag ser intäkter i varje valuta. Normaliserad rapportering använder konfigurerad växelkurs.

Arbetade exempel

100 besökare, nollförsäljning

Scenario:
Din prissättningssida får 100 besökare per dag men noll omvandlingar.
Vad ska man göra:

Undersöka: (1) Använd Session Replay på prissättning sidbesökare. Titta på hur de interagerar med prisbordet. (2) Kontrollera Top Pages för prissättning sidan studsa hastighet och tid-på-sidan. (3) Kontrollera chattkonversationer från prissättningssidor besökare. Vilka frågor ställer de? (4) Jämför din prissättning sida till konkurrenter. (5) Prova ett A/B-experiment med olika prissättningslayouter.

Attribution för en marknadsföringskampanj

Scenario:
Du skickade en e-postkampanj med UTM-taggar. Hur mäter du dess intäktspåverkan?
Vad ska man göra:

Gå till Försäljning och filtrera efter källa. Sök efter kampanjen UTM-parametern: (1) Hur många besökare kom från e-postmeddelandet. (2) Hur många konverterade till försäljning. (3) Totala intäkter tillskrivs kampanjen. (4) Jämför med samma period före kampanjen.

Varför visar Sales noll trots att min butik har order?+

Kontrollera: (1Är plattformskontakten ansluten och frisk? Gå till Connectors och kontrollera status.2Är webhook sync aktiverad? Om du använder polling, är cron-jobbet igång?3) Har kontakten rätt API omfattningar? för Shopify Du behöver read_orders.

Hur gör OpsIQ Tillskriva en försäljning till en besökare?+

När en beställning kommer in via kontakten, OpsIQ matchar kundens e-post till en känd besökare. Om besökaren spårades innan köpet, är försäljningen hänförd till deras besökarresa, inklusive trafikkällan, landningssidan och sessionshistoriken.

Kan jag manuellt lägga till försäljning?+

Du kan skicka försäljningsevenemang via REST API eller webhooks från alla system. Evenemangsformatet är dokumenterat i händelserna API sektion.

Kommers

Bygg, starta och driva den infödda Storefront

Storefront är OpsIQs inhemska butik för produkter, sidor, lookbooks, kampanjpaneler, kassa, kundkonton och AI-assisterade försäljning i Kundchatt och stödda sociala kanaler.

Börja i marknadsföring→Storefront

1
Välj arbetsytan

Bekräfta webbplatsen du konfigurerar. Produkter, inställningar, sidor, order och analys isoleras till det arbetsutrymmet.

2
Aktivera e-handel och Storefront

Allmänna inställningar → E-handel är föräldermyndigheten. Storefront publicering, orderskapande och betalningar förblir separata så att du kan förhandsgranska en katalog säkert.

3
Publicera kompletta produkter

Ange produkttyp, pris, valuta, lager, varianter/alternativ, media och uppfyllelse. Förhandsgranska produkt- och kassavalen innan du publicerar.

4
Konfigurera betalning och uppfyllande

Anslut en gateway eller lägga till banköverföring, kontanter eller motbetalning. Fysiska varor behöver leveranszoner eller insamling; digitala varor kräver skyddade filer eller koder.

5
Kör lansera beredskap

Fixa varje blockerare och granska varje varning, sedan fylla i en sandlåda order från den offentliga butiken.

Starter om och policyinnehåll

Nya och uppgraderade butiker får redigerbar starttext för Om oss, Villkor och villkor, Sekretessoch Återbetalningar och returer När dessa fält är tomma. Befintlig köpmanskopia skrivs aldrig över.

  • Ersätt varje [Add …] Prompt och Starter TEMPLATE märka innan lanseringen.
  • Använd det verkliga juridiska namnet, kontaktvägen, uppfyllandelöften, returregler, datapraxis, lagringsperioder och marknader som serveras.
  • Få råd som är lämpliga för de produkter och länder du tjänar. Startaren är operativ vägledning, inte juridisk rådgivning.

Design, sidor och kampanjer

Tema och siddesign

Välj ett curerat färgtema och komposition, låt sedan typografi, fyller / gradienter, former, bredd, rörelse, svävare och ljus / mörkt beteende. Förhandsgranska skrivbordet och telefonen innan du sparar.

Om, Kontakta, Showcase/Lookbook och Konto

Bygg varje sida från omordnade block. Varje block har premium designvarianter. Håll kravsblock som statistik, lag, utmärkelser eller citat av tills deras innehåll är sant.

Anpassade sidor

Ställ titel, slug, hjälte SEO och beställda block; förhandsgranska medan utkast, sedan publicera. Reserverade butiksrutter som kundvagn, kassa, konto och policyer kan inte återanvändas.

Promotionella popup-fönster och sidopaneler

Skapa en modal sida med minst ett block. Välj premium design, center / vänster / höger / botten placering, last / fördröjning / utgång / klick trigger, bakgrund, rörelse, bredd, kupong och en gång-per-visitor beteende. Test nära, tangentbord och telefonlayout.

Menus och footer

Länk till sidor, produkter, samlingar, policyer, konto/hjälp/kortåtgärder, live-modaler eller säker externURLsHuvudartiklar stöder en nedgång / mega-menynivå.

Kundchatt och sociala order

Aktivera kundchatt som säljer, välj sedan var kunderna kan köpa. Assistenten söker katalogen och frågar servern för ett auktoritativt citat; servern - inte modellen - skapar det signerade orderkortet. Bekräftelse sker endast genom kortet på webben eller den verifierade interaktionen på socialkanalen.

WhatsAppMessenger,Instagram, TelegramLINE, SMS och X använder det leverantörsverifierade kanalkontot som kanalidentitet. E-post samlas fortfarande in för kvitton. Connector beställning håller sitt undertecknade universella kontrakt och merchant-auktoritativ total; Storefront konfiguration ändrar inte detta avtal.

Store Intelligence Analytics

Granska unika besökare, produktvyer, karttillskott, kassan startar / överge/avslutningar, omvandling, bekräftade order, intäkter genom valuta, förvärv, enheter, länder / städer, toppprodukter, återhämtning och varningar av datakvaliteten. Konvertering använder uttryckligen taggade offentliga-Store händelser; valutasummor kombineras aldrig tyst. En dash betyder att det valda intervallet inte kan svara på konverteringsfrågan - inte noll procent.

General generalOpsIQ API

Använd en bärarnyckel med commerce.read; analytics.read också ger analysen ögonblicksbild. Nyckelns bundna arbetsyta är auktoritativ.

Typed Storefront läser
{ "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 får returnera offentlig-säker konfiguration,URL, menyer och start-review state. Storefront katalog returnerar varje tema, sida design, block typ, block sammansättning och premium befordran skal så avlägsna byggare aldrig hårdkod valen. Sidor lista returnerar anpassade sidor och premium modals. Analytics returnerar aggregat utan kundidentiteter. Beredskap returnerar genomförbara lanseringskontroller. OpenAPI och Postman använder samma kontrakt.

Final pre-lansering drive-through

  1. Skrivbord och telefon: hem, sök, produkt / variant, kundvagn, kassa validering, konto, spårning, nedladdningar, Om, Kontakta, politik, lookbook, sidor, menyer och varje live-kampanj.
  2. Fyll i en sandlåda betalning och verifiera orderstatus, kvitto, lager och uppfyllelse.
  3. Placera en kundchatt beställning och en leverantörs-sandbox order på varje aktiverad social kanal.
  4. Bekräfta att dessa händelser visas under rätt yta och valuta i Store Intelligence.
⚠️
Starter policy text gör en butik icke-tom, men det gör inte den juridiska kopian granskas. Launch Readiness håller varning tills varje prompt ersätts.
Försäljning

Leder

Ledar är besökare eller kunder som visar köp eller stöd avsikt. OpsIQ automatiskt upptäcker leads baserat på beteende: prissättning sidbesök, returnera besök, chattinteraktioner, kassastar och högt engagemang. Använd sidan Leads för att prioritera uppföljning och mata din CRM-pipeline.

Leder
LederSkärmen Leads: ett sökbart bord med IP/email, plats, enhet, källa och time-on-site kolumner och top source och country.Lederyoursite.comSök efter sökningar IP Stad, land...Top source: Google · Toppland: USAIP / EMAILFörhållandePRODUKTERKÄLLATid41.62.10.4Storbritannien · LondonMobilgoogle4m 12s_[email protected]_USA · New YorkSkrivborddirect7m 02s_[email protected]_DE · StockholmMobilUtm:ads5m 40s_203.0.113.9CA · TorontoSkrivbordgoogle3m 28s_1DETECTEDHögintenta besökare2TOPLedkällor och länder3ENRICHEDIP, plats, enhet, tid
Den verkliga Leads-skärmen, högintent besökare som ett sökbart bord (IP/email, plats, enhet, källa, tid på plats) med toppkällor och länder.

Vad gör en lead

Prissättning Sidan besök

Besökare som ser din prissättning eller planer sida överväger aktivt ett köp.

Återkommande besök

Besökare som kommer tillbaka flera gånger är engagerade men ännu inte konverteras.

Chatt interaktioner

Besökare som startar en chatt söker aktivt hjälp, antingen förköp eller efterköp.

Checkout startar

Besökare som når utcheckningssidan men inte slutför köpet.

Form Inlämningar

Besökare som skickar ett kontaktformulär, demoförfrågan eller registreringsformulär.

High page förlovning

Besökare som ser många sidor med lång sessionstid är djupt undersökta.

Led detalj panel

Klicka på någon bly för att se deras fullständiga profil:

Identitet

Namn, e-post, företag om det är känt. Anonyma leads visar IP och plats.

Sessioner

Alla sessioner från denna ledning med sidflöde, varaktighet och källa.

Sidor som visas

Varje sida de besökte, beställd av en rekrytering.

Källa

Hur de hittade dig: organisk, betald, social, remiss, direkt.

Lead score

En A0-100 poäng baserat på beteendeintensitet, återkallelse och sidinsikt.

CRM-status

Oavsett om detta led har lagts till CRM som en kontakt eller affär.

Försäljningstips

AI-genererade förslag på vad man ska göra härnäst (t. ex. "Visited pricing 3 gånger · anser proaktiv uppsökande").

Högt värde bly badge

Leder med en poäng ovan 80 få ett "High Value"-märke. Dessa är dina hetaste utsikter. Prioritera dem för uppsökande, proaktiv chatt eller CRM pipeline inträde.

Arbetade exempel

Arbeta en het bly

Scenario:
En bly tittade på din prissättning sida 3 gånger i 2 dagar, startade en chatt som frågade om företagsplaner, men har inte köpt.
Vad ska man göra:

Detta är en hög avsiktlig ledning. steg: (1) Kontrollera deras ledande detaljer för företags- och rollinformation.2) Granska chatttranskriptet för specifika behov och invändningar.3Skapa en affär i CRM med den insamlade informationen.4) Tilldela en uppföljningsuppgift för en medlem i säljteamet.5) Om de återvänder till prissättningssidan kan den proaktiva chattregeln utlösa ett personligt meddelande.

Konvertering av anonyma leder till CRM-kontakter

Scenario:
Du har 50 anonyma leads med höga poäng men inga e-postadresser.
Vad ska man göra:

Alternativ: (1) Skapa en proaktiv regel som erbjuder rabatt eller resursnedladdning i utbyte mot e-post på högavsiktliga sidor.2Använd chatten widget för att be om e-post när anonyma besökare startar en konversation.3) Lägg till en identitetstoken på dina inloggnings-/signupsidor så att återkommande besökare automatiskt identifieras.

Hur beräknas ledresultatet?+

Poängen anser: återkomst av besök (nyligen = högre), frekvens av besöken (mer = större), sidor som ses (prissättning / checkout = hög), session varaktighet (längre = higher), chattinteraktioner (engaged = ökad) och återvända besök (flera sessioner = Högre).

Kan jag anpassa lead scoring regler?+

I CRM Configuration kan du lägga till ledscoring-regler som ökar poängen baserat på specifika sökord, händelser, källor eller sidmönster.

CRM_

Din CRM · starta här

OpsIQ skickar en full AI-första CRM som fångar kundsanning, rensar data, poäng leads, coaches erbjudanden, prognoser intäkter och agerar, med webbplats intelligens, support, biljetter, produkter och betalningar som ett levande diagram. Varje AI handling är källkodad, förklarande, reversibel och godkännande kontrollerad.

AI CRM-lösningar
AI CRM översiktEn Trust Dial som är inställd på Copilot bredvid fyra AI-agentkort: Steward, Prospector, Retention och Analyst.AI CRM-lösningarWorkPayTrust DialManuellAndrapilotAutopilotHur mycket AI gör på egen handDSStewardDedupe, berikar,validera dataSDRProspektörHitta & scoreNy affärsverksamhetRTLagringSpot churn,driva förnyelserANNINGARAnalytikerPrognos & utvecklingförklara siffror1AI-FIRSTFyra specialistagenter2YOU DECIDETrust Dial autonomi3TRUSTEDKälla & reversibel
En AI-första CRM drivs av fyra specialistagenter, och en Trust Dial som bestämmer hur mycket de gör på egen hand.

CRM-sidor översikt

AI CRM (Kommandocenter)

Börja här

Din dagliga hemskärm: intäktspuls, vad AI hittade, vad det gjorde, godkännandekö, nästa drag, agenthälsa och ROI.

Kontakter

Kärna

Människor och företag i din CRM. Sök, filtrera, poäng och hantera profiler.

Pipeline

Kärna

Visuell deal board med drag-and-drop scener, vinna sannolikhet och AI coaching.

Prognos och rapporter

Kärna

Board-grade prognoser: engagerade, troliga, bästa fallet, med förtroendeintervaller och noggrannhetsspårning.

Livscykel

Kärna

Där varje kund står: aktiv, i riskzonen, expansion redo, förnyelse på grund av eller churning.

Bygg min CRM

Konfig

Beskriv din CRM-inställning på vanligt engelska. OpsIQ genererar en reversibel plan och tillämpar den på godkännande.

CRM Hälsa

Ops.

Självkontroll sida: schema, agenter, rutter, AI-åtgärder och live data räknas.

Hur OpsIQ håller dig säker

Fråga innan du agerar

AI-förslag går till godkännandeköen. Du godkänner, redigerar eller avvisar var och en. Inget händer utan ditt ord.

Aldrig överskriven

När AI föreslår en förändring visar den nuvarande värdet och det föreslagna värdet. Human-inmatade data har bevisningsskydd.

Allt är reversibelt

Varje AI-åtgärd registreras i tidskriften. Du kan ångra någon förändring med ett klick.

Förklarlig

Varje AI-rekommendation visar sitt resonemang och de datakällor som den använde. Ingen svart låda.

Brand new? Börja här

1
Öppna AI CRM

Klicka på AI CRM i vänster navigation. kommandotcentret visar ditt nuvarande tillstånd.

2
Kontrollera CRM Hälsa

Öppen CRM Health för att verifiera schemat, agenterna och rutterna är klara.

3
Importera kontakter

Om en anslutning är aktiv (Shopify, WHMCS, etc.), kontakter importeras automatiskt. Annars import via CSV Eller skapa manuellt.

4
Skapa en pipeline

Gå till Pipeline och skapa din första pipeline med stadier (t. ex. Lead, Qualified, Proposal, Förhandling, Won, Lost).

5
Lägg till din första affär

Skapa en affär från en kontakt, ange beloppet och scenen, och låt Deal Coach guida dig.

Behöver jag använda CRM?+

Nej. CRM är valfritt. OpsIQ fungerar perfekt som en spårning + support + AI-plattform utan CRM. Möjliggöra det när du är redo att hantera försäljning och kundrelationer.

Kan CRM fungera utan kontakter?+

Ja. Du kan skapa kontakter och erbjudanden manuellt. Connectors berikar CRM med plattformsdata (order, prenumerationer, biljetter) men krävs inte.

Vad är Trust Layer?+

Trust Layer är säkerhetssystemet som styr vad AI kan göra. Copilot läge (standard): AI föreslår, mänskliga godkänner. Autopilot-läge (opt-in): ai agerar automatiskt på låg risk, reversibla operationer.

CRM_

AI CRM hemskärm

Kommandocentret är din dagliga briefing. Öppna det varje morgon för att se vad som hände, vad behöver uppmärksamhet och vad du ska göra nästa.

Kommandocenter
CRM-kommandocentralCRM-hemmet med prognos / vinränta / pipeline-tugglar, en viktad prognostiserad KPI och ett AI-förslagskö med Godkänna och avvisa på varje rad.CRM-kommandocentralWorkPayPrognosVinsträntanPipelineFörvärv · detta Q$ 74k87%AI-förslag · godkänna köSkapa affären · Acme $ 24kfrån en chatt med köparenGodkännaAvfärdaFlytta Nimbus → Förslagpositivt svar upptäcktGodkännaAvfärdaLogga uppgift · Följ upp PeakIngen aktivitet i 7 dagarGodkännaAvfärda1TOGGLEPrognos · Vinstfrekvens · Pipeline2AI PROPOSESErbjudanden, stadier, uppgifter3YOU DECIDEGodkänna eller avvisa
Det verkliga kommandotcentret: växla mellan prognos, vinränta och pipeline och arbeta AI-förslaget kö, godkänna eller avfärda erbjudanden, steg rörelser och uppgifter som föreslås.

Vad kommandot Center visar

Dagens siffror

Pipeline värde, erbjudanden vann / förlorade, nya leads, aktiva erbjudanden och intäktstrenden, en ögonblicksbild av ditt nuvarande tillstånd.

Vad OpsIQ hittades

AI-upptäckta insikter: slutna erbjudanden, riskkonton, nya möjligheter, datakvalitetsfrågor och marknadssignaler.

Vad är vad OpsIQ gjorde

AI har vidtagit (i Autopilot) eller föreslagit (i Copilot), stegförskott, poänguppdateringar, kontaktanrikning och uppgiftsskapande.

Behovsgodkännande

Kö av AI-förslag som väntar på ditt beslut. Varje visar den föreslagna åtgärden, resonemang och bevis. Godkänna, redigera eller avvisa.

Nästa drag

AI-ranked lista över 10 De viktigaste sakerna att göra idag: följ upp på en het deal, kolla ett riskkonto, forska en ny bly etc.

Hjälparstatus

Hälsa av AI-agenter: Capture, Data Steward, Deal Intelligence, DeAL Coach, SDR, Retention. Green = running, amber = behöver uppmärksamhet, röd = fel.

Resultat

ROI-spårning: Affärer som påverkas av AI, tidsbesparade, noggrannhet av förutsägelser och jämförelse med manuellt CRM-arbete.

Morgon briefing arbetsflöde

1
Läs dagens siffror

Kontrollera pipeline hälsa och intäkter trend. Är du på rätt spår denna månad?

2
Tydliga godkännandeköen

Granska varje AI-förslag. Godkänna säkra åtgärder, redigera där det behövs, avvisa dåliga förslag.

3
Kontrollera vad OpsIQ Hittat

Läs AI-insikter. Är några erbjudanden i riskzonen? Finns det nya möjligheter?

4
Arbeta nästa rörelselista

Börja med högsta prioritet. AI har rankat dessa genom brådskande och potentiell påverkan.

Fånga upp efter time off

Scenario:
Du var borta i en vecka. Vad hände när du var bort?
Vad ska man göra:

Öppna kommandocentret och kontrollera: (1) "Vad OpsIQ Visar alla AI-åtgärder under din frånvaro.2"Behovsgodkännande" visar förslag som väntar på din recension.3) "Vad OpsIQ fann" markerar brådskande objekt. (4) Ställ in instrumentbrädan datumintervall till din frånvaro period för att se trenden.

CRM_

Kontakter, företag och erbjudanden

CRM organiserar dina affärsrelationer i fyra objekt: Kontakter (människor), Företag (organisationer), Erbjudanden (intäktsmöjligheter) och Uppgifter (uppföljningsåtgärder).

CRM-objekt
CRM-objektEn kontaktrekord kopplad till företag, Deal och Task objekt i en ansluten graf.CRM-objektWorkPayKontakta Kontaktperson · e-post · telefonFöretagaccounts- Avtal.IntäktsmöjlighetUppgiftUppföljningsåtgärd1OBJECTSKontakter, företag, erbjudanden2LINKEDEn ansluten graf3TASKSUppföljningar bifogade
Fyra kärnobjekt (kontakter, företag, erbjudanden och uppgifter) kopplade till en ansluten kunddiagram.

Kontakter

Vad är en kontakt

En person i din CRM. De kan vara en kund, ett utsikter, en partner eller en bly. Kontakter har ett e-postmeddelande, namn, företag, taggar, livscykelstadium och hethetspoäng.

Hitta kontakter

Använd sökfältet för att hitta efter namn, e-post, företag eller taggar. Använd filter: livscykelstadium, blypoäng, källa, land, sista aktivitetsdatum, tilldelad ägare.

Kontaktprofil

Klicka på en kontakt för att se sin fullständiga profil: personlig information, företag, erbjudanden, aktiviteter, biljetter, chattar, webbplatsbesök, blypoäng och AI insikter.

Hotness-poäng

En A0-100 poäng beräknas från beteendesignaler: webbplatsbesök, e-postengagemang, chattinteraktioner, köphistorik och recency. Högre = varmare.

Företag

... fler biljetter...
Kontakt-företag länkar

Kontakter är kopplade till företag via e-postdomän eller manuell uppgift. Ett företag kan ha många kontakter.

Avtal

Vad är en deal

En intäktsmöjlighet. Deals har en titel, belopp, pipeline, scen, vinna sannolikhet, slutdatum, tilldelad ägare och tillhörande kontakter / företag.

Vinn sannolikhet

En procentuell chans att vinna affären. Ställ in manuellt eller beräknat av AI baserat på dina historiska vinstdata. Kör den viktade prognosen.

Deal Health

Grönt (hälsosamt), bärnsten (i riskzonen) eller rött (stallat). Baserat på aktivitetsåtervinning, scenvaraktighet och engagemang signaler.

Uppgifter

Vad är en uppgift

En uppföljningsåtgärd som tilldelats en person. Uppgifter har en titel, förfallodatum, prioritet, typ (samtal, e-post, möte, annat) och länkad kontakt / överenskommelse.

AI-genererade uppgifter

AI skapar uppgifter automatiskt när det upptäcker något behöver uppmärksamhet: följ upp på en avstannad affär, svara på ett riskkonto, forska en ny bly.

Hitta heta leads

Scenario:
Du vill se alla högkärnkontakter i Storbritannien som inte har kontaktats nyligen.
Vad ska man göra:

Gå till Kontakter. Filter by: Lead score > 80, land = Storbritannien, sista aktivitet 7 dagar sedan. Sortera efter blypoäng nedåt. Dessa är dina hetaste försummade leder, prioritera uppsökande.

Skapa en affär från en kontakt

Scenario:
En kontakt uttryckte bara intresse för din företagsplan under en chatt.
Vad ska man göra:

Öppna kontaktprofilen. Klicka på "Skapa affären." Ange affärens titel (t. ex. "Acme Corp - Enterprise Plan"), belopp, pipeline och scen (t ex "Kvalificerad"). Ställ in det nära datumet och tilldela den till dig själv. Deal Coach kommer att börja spåra denna möjlighet.

CRM_

Pipeline (din deal board)

Pipeline är en visuell styrelse där erbjudanden rör sig genom stadier från vänster till höger. Drag och drop-kort för att avancera erbjudanden. Varje kort visar affären belopp, vinna sannolikhet och hälsostatus.

Pipeline
CRM-pipelinePipeline-skärmen med Open-deals, Open-value, Weighted-forecast och Attributed-detals stats, en New-deala-knapp, en AI Godkänna kö och Lead / kvalificerad / Won board.PipelineWorkPayÖppna erbjudanden23Öppet värde$128kVikt prognos$ 74kAttributerade erbjudanden12+ Ny affärGodkänna kö2 för att granskaLeadVolt Inc4000 dollar.Eld6000 dollar.KVALIFICERADNimbus30k dollar.Topp9000 dollar.Kommer attOmloppsbana48 000 dollar.1LIVE STATSÖppet värde och viktad prognos2AI QUEUEGodkänna föreslagna erbjudanden3BOARDDrag deals i scen
Den verkliga pipeline skärmen: levande statistik (öppet värde, viktad prognos), en AI Godkänna kö för föreslagna erbjudanden och dra-och-släpp brädan.

Använda pipeline board

1
Visa dina erbjudanden

Pipeline visar alla aktiva erbjudanden som kort ordnade i kolumner (stages). Varje kolonnrubrik visar det totala värdet av erbjudanden i det skedet.

2
Drag för att avancera

Dra ett kort till nästa steg. Vinst sannolikheten och räknar uppdatering direkt. Om flytten misslyckas (validering fel), snaps kortet tillbaka till sin ursprungliga position.

3
Kontrollera kortets märken

Grönt märke = hälsosam (ny aktivitet, på rätt spår) Amber = i riskzonen (slowing down, needs attention). Red = stalled (ingen aktivitet för länge).

4
Klicka för detaljer

Klicka på ett kort för att öppna affären detaljpanel med kontakter, aktiviteter, Deal Coach kort och snabba åtgärder.

Godkännande kö

AI-förslag visas i godkännandeköen längst upp på pipelinesidan. Varje förslag visar vad AI vill göra, varför och beviset.

Godkänna

Acceptera förslaget som-är. Åtgärden går igenom Trust Layer och registreras i tidskriften.

Redigera

Ändra förslaget innan du godkänner. Till exempel ändra det föreslagna steget eller justera beloppet.

Avvisa

Förslaget. AI lär sig av avslag för att göra bättre förslag i framtiden.

Vinn sannolikhet förklarad

Sannolikheten att vinna kan ställas in manuellt eller beräknas av AI. När AI beräknar det använder den en modell tränad på dina egna avslutade affärer (vunna och förlorade). Om du inte har tillräckligt med historiska data, använder AI scenens standardsannolikhet. $10,000 deal at 30% sannolikhet bidrar $3,000 till "sannolikt" prognos.

Flytta en affär till Won

Scenario:
En kund undertecknade kontraktet och betalade.
Vad ska man göra:

Dra dealkortet till "Won"-scenen. OpsIQ kommer att vilja: (1) Markera affären som slutna-won. (2) uppdatera prognosen. (3) Lägg till en "Won" aktivitet i tidslinjen. (4) Om konfigureras, utlösa en webhook händelse (crm.deal.won). (5) Uppdatera kontaktlivscykelstadiet till "Kunden"

Spotting fast erbjudanden

Scenario:
Du vill hitta erbjudanden som har varit i samma skede för länge.
Vad ska man göra:

Leta efter röda (stalled) märken på rörledningen. Dessa erbjudanden har inte haft någon aktivitet längre än den konfigurerade rotting tröskeln (som anges i CRM Configuration > Pipelines). Klicka på varje sluten affär för att se Deal Coach rekommendation för reaktivering.

Kan jag ha flera pipelines?+

Ja. Gå till CRM Configuration > Pipelines för att skapa ytterligare rörledningar. Vanliga användningsfall: separata pipelineer för nya affärer vs förnyelser, eller för olika produkter/tjänster.

Vad händer när jag drar en deal till "Lost"?+

Avtalet är markerat som sluten förlorat. Du kommer att bli ombedd av en förlust anledning. Avtalet tas bort från den aktiva brädan men finns i slutna erbjudanden filter. Kontakten kvarstår i CRM.

CRM_

Deal coaching

Deal Coach analyserar varje affär och ger dig en kort med hälsostatus, risksignaler, nyckelpersoner, en kvalifikationskontrolllista, mötesprep och föreslagna nästa åtgärder. Allt är hämtat. Tränaren visar vilken biljett, chatt eller aktivitet som varje anspråk kommer från.

Deal coach
Deal coachEtt kort som listar AI-upptäckta risksignaler med beviskällor, förutom en AI rekommendation och ett utkast till e-post knapp.Deal coachWorkPayAcme Corp · $24,000_Steg: Förslag · 60% winRISKSIGNALERInget svar i 10 dagarChampion gick tystKonkurrent som nämns i chattKällor: biljett #482 chatta 6/12 · E-posttrådAI rekommenderarÅterupprätta den ekonomiskaKöpare med en ROI recapoch en 7-dag nära plan.Utarbeta e-post1SIGNALSVarför en affär kan glida2SOURCEDVarje påstående citerar bevis3ÅtgärderOne-klicka nästa steg
Tränaren flaggar varför en affär kan glida (varje signal citerar sin källa) och händer dig nästa drag att ta.

Vad tränaren berättar för dig

Hälsoförklaring

Varför affären är hälsosam, i riskzonen eller stannade. Specifika signaler: dagar i stadium, sista kontaktdatum, aktivitetsfrekvens, konkurrent omnämnanden, invändningsmönster.

Signaler

Kategoriserad till: invändningar som uppkommit, konkurrent nämner, prissättningsdiskussioner, stödr riskindikatorer, förnyelse/expansion signaler. Varje signal länkar till sin källa (chatttranscript, biljett, e-post, aktivitet).

Champion och blockerare karta

Vem hjälper affären (mästare) och vem motstår (blockerare). Baserat på interaktionsanalys och kontaktroller.

Kvalificeringskontrolllista

MEDDICC eller BANT checklista (konfigurerbar) som visar vilka kvalifikationskriterier som är uppfyllda och som saknas. Grade: A, B, C, D eller F.

Möte prep

Innan ett schemalagt möte genererar coachen en kort: agenda, viktiga punkter att täcka, frågor att ställa, risker för att hantera och material att förbereda.

Svara och ringa planer

Föreslagna nästa meddelande eller samtalskript baserat på aktuellt avtalstillstånd och senaste interaktioner.

Bevis tidslinje

Varje påstående coachen gör länkar till en källa: ett biljettnummer, chatt transkript ID, aktivitetsdatum eller webbplatsbesök.

Hur man använder tränaren

1
Läs kort

Öppna alla erbjudanden och bläddra till avsnittet Deal Coach. Läs hälsostatusen och nyckelsignalerna.

2
Nära kvalificeringsgapser

Kontrollera kvalificeringskontrollen. Om "Economic Buyer" saknas, planerar du att identifiera och engagera budgetinnehavaren.

3
Agera på förslag

Tränaren föreslår konkreta nästa åtgärder. Klicka för att skapa en uppgift, utarbeta ett e-postmeddelande eller schemalägga ett möte, alla dirigerade genom godkännandeköen.

Förberedelser för ett stort möte

Scenario:
Du har ett möte med en utsikt imorgon om en $50,000 deal.
Vad ska man göra:

Öppna affären och läs Meeting Prep-sektionen. Det visar: (1) Nyckeltalande punkter baserade på senaste interaktioner. (2) Invändningar de höjde i chatt förra veckan. (3) Konkurrens de nämnde i en supportbiljett. (4) Frågor att fråga om sin tidslinje. (5) Riskfaktorer för att hantera proaktivt. Använd denna korta för att förbereda en fokuserad, evidensbaserad agenda.

Förstå varför en affär är i riskzonen

Scenario:
Rörledningen visar ett rött märke på en affär du trodde gick bra.
Vad ska man göra:

Klicka på affären och läs Deal Coach hälsoförklaring. Det kan säga: "Denna överenskommelse har varit i Förslag skede för 22 dagar (tröskeln: 14) Sista kontakten var 11 För några dagar sedan öppnade den primära kontakten en supportbiljett om datamigrationsproblem. 5 För några dagar sedan (ticket #T-892 Förslag: ta itu med migrationsproblemet och schemalägga ett uppföljningssamtal. "Nu vet du exakt vad du ska fixa.

CRM_

Prognos och rapporter

Board-grade prognoser med ett försvarbart intervall, förändringsförklaringar på dealnivå och noggrannhetsspårning så att du kan bevisa och förklara dina siffror.

Prognos
PrognosEtt kvartalsprognosnummer med Commit, Best-case och Pipeline band och en noggrannhet notera.PrognosWorkPayFörvärv - denna kvarter$312k87% Att målaKommitténBästa falletPipelineAI-viktad av affärens hälsa och historia - noggrannhet spåras över tiden1KategärerBegå till pipeline2AI-WEIGHTEDGenom att hantera hälsa3PROVABLENoggrannhet spårad
Begå, bäst fall och pipeline på ett ögonblick, AI-viktad av affärens hälsa, med noggrannhet spåras så att du kan försvara den.

Prognoskategorier

Begåvning

Deals with 80% eller högre vinst sannolikhet. Dessa är dina mest troliga vinster. Detta bör vara din minsta förväntade intäkter.

AI-vikt troligen

Alla öppna erbjudanden som viktas av deras AI-beräkningsvinst sannolikhet. Detta är den mest realistiska förutsägelsen av vad du kommer att stänga.

Bästa fallet

Alla öppna erbjudanden till fullo värde. Detta är den maximala möjliga intäkten om allt går perfekt (det sällan gör det).

Förtroende intervall

An 80% Exempel: "Du kommer sannolikt att stänga mellan 0,1 och 0.2". $45,000 och $72,000 detta kvartalet."

Vad förändrades och varför

Prognosen innehåller veckovis förändringsattribut. När din prognos sjunker med $15,000 Rapporten förklarar exakt vilka erbjudanden som orsakade förändringen: "Avsluta A gled till nästa kvartal (...)$8,000 Deal B förlorad (förlust)$5,000), Deal C minskat i värde ($2,000)."

Noggrann spårning

Prognos MAPE

Betyda absolut procentuellt fel: hur långt bort dina prognoser har varit historiskt. Lägre är bättre.15% innebär att dina prognoser vanligtvis finns inom 15% av faktiska resultat.

Vinn sannolikhet kalibrering

Brier-poäng som mäter hur väl sannolikheten att vinna matchar det faktiska resultatet. 70% sannolikhet att faktiskt vinna. 70% för det mesta är kalibreringen bra.

Veckovisa ögonblicksbilder

OpsIQ fångar en ögonblicksbild av din prognos varje vecka (via cron). Med tiden kan du se hur din procast precision förbättras.

Rollups och varningar

Per-stegs konvertering

Hur många affärer går från varje steg till nästa. Om 80% gå från Kvalificerad till Förslag men endast 20% gå från förslag till förhandling, kan dina förslag behöva arbete.

Per-källa vinstfrekvens

Vilka blykällor producerar flest vinster. Investera mer i högklassiga källor.

Per-ägare prestanda

Hur varje säljteammedlem utför: erbjudanden som vunnits, pipeline värde, genomsnittlig deal size, win rate.

Varningar

Sandbagging (orealistiskt låga sannolikheter), överbesvärjande (orealistisk hög) och engagerad i risk (hög sannolika erbjudanden som visar stallsignaler).

Förstå en prognos droppe

Scenario:
Din kvartalsprognos sjönk från $180,000 att $155,000 Sedan förra veckan.
Vad ska man göra:

Öppna prognossidan och kontrollera "Vad som har ändrats." Rapporten visar: "Acme Corp-avtal (ACM)$15,000) flyttade till Lost, konkurrent vald. Beta Inc-avtal (Beta Inc)$8,000) Nära datum som skjuts till nästa kvartal. Ny överenskommelse med Gamma LLC ($3,000) läggas till denna vecka. "Nätändringen är -$20,000 + $3,000 = -$17,000, förklara droppen från $ 180K till $163K (med resterande $ 8K förklaras genom sannolikhet justeringar på andra erbjudanden).

CRM_

Hitta nya affärer

Prospecting Agent hjälper dig att hitta och undersöka potentiella kunder. Beskriv din ideala kund, lägga till målföretag och låt AI-forskningen, poängen och utkastet förstahandsutredning.

Prospektering
ProspekteringEn lista över AI-grundade prospektföretag med passande anteckningar, poäng och en utkastuppsöksknapp vardera.ProspekteringWorkPayutsikter som hittats av SDR-agentenNorthwind ABSaaS · 50 personal · anställningsstöd88Draft OutreachCobalt MfgTillverkning · 200 personal74Draft OutreachMesa Retail ABeCommerce · 30 personal69Draft OutreachVega hälsaHälso- och sjukvård · 80 personal63Draft Outreach1FINDAI-källor riktar sig till konton2SkorFit & Intent rankad3DRAFTFörsta touch skriven för dig
SDR-agenten hittar målföretag, gör dem i form och utarbetar förstahandsutredningen för din granskning.

Engångsinstallation

1
Beskriv din ideala kund

Gå till CRM Configuration > Prospecting. Beskriv din ideala kundprofil (ICP): målindustrier, företagsstorlekar, jobbtitlar, geografiskt fokus, produktmatchtermer och minsta passform. Exempel: "B2B SaaS-företag med 50-500 anställda i USA/UK, som säljer utvecklarverktyg, med en VP för försäljning eller tillväxtchef som primärkontakt.

2
Lägga till målföretag

Ange företagsdomäner eller namn som du vill undersöka. Du kan också låta AI föreslå företag baserat på din ICP.

3
Granska forskningsresultat

AI berikar varje företag med tillgängliga data: storlek, industri, teknisk stack, senaste nyheter och passande poäng med förklaring.

4
Godkänn outreach

För bra passande företag, AI utarbetar en personlig första touch-meddelande. Granska och godkänna i kön.

Fit Scoring

Varje prospekt får en0-100 Passform baserat på fem faktorer:

ICP passar

Hur bra företaget matchar din ideala kundprofil (industri, storlek, plats).

Urgency signaler

Finns det bevis för att de behöver din produkt nu? Job postings, tekniska förändringar, klagomål om konkurrenter.

Budgetproxy

Företagsstorlek, finansieringsstadium och intäktsindikatorer föreslår budgettillgänglighet.

Produktmatch

Hur relevant din produkt är för deras verksamhet baserat på industri och teknik.

Support Passform

Oavsett om du kan tjäna denna kund (tidszon, språk, komplexitet).

Forska ett målföretag

Scenario:
Du vill utvärdera om acme.com är värt att fortsätta.
Vad ska man göra:

Lägg till acme.com till prospekteringslistan. AI returnerar: Fit score 78/100 (God passform) Skäl: B2B SaaS, 120 anställda, USA-baserade, nyligen anställde en VP av försäljning (urgency signal), använder konkurrent X (produktmatch). Köpsignaler: besökte din prissättning sida två gånger förra månaden (från webbplats spårning). [email protected] (VP of Sales) Utarbetade öppnare refererar till deras senaste rekryterings- och prissättningssidor.

CRM_

Automatiska uppföljningssekvenser

Sequences automatiserar multi-steg uppföljning: en blandning av e-post, vänta, uppgift, samtal och webhook steg som körs automatiskt efter att du godkänner den första sändningen.

Sekvenser
UppföljningssekvenserEtt horisontellt sekvensflöde: E-post, vänta tre dagar, e-post och sedan en uppgift med svarsdetektering.UppföljningssekvenserWorkPayNär du godkänner den första sändningen →E-postInledningVänta3 dagarE-postUppföljningUppgiftRing CallSteg kan vara e-post, vänta, uppgift eller webhook. Ett svar automatiskt slutar sekvensen.1AUTOMATEMulti-step uppföljning2STEPSE-post · vänta · uppgift · webhook3YOU APPROVEFörsta sändningen är gated
Automatiserad multistegsuppföljning (email, vänta, e-post, uppgift) som du godkänner först och ett svar stannar automatiskt.

Hur sekvenser fungerar

1
Skapa en sekvens

Definiera stegen: e-post, vänta 3 Dagar, e-post, vänta 5 dagar, uppgift (samtal om inget svar), e-post. Varje e-postadress har en mall som du kan anpassa.

2
Registrera kontakter

Lägg till kontakter till sekvensen. AI kan också föreslå inskrivning från prospekteringsresultat.

3
Automatisk utförande

Steg körs automatiskt på schemat. Om en kontakt svarar när som helst, pausar sekvensen automatiskt.

4
Spåra resultat

Se öppna priser, svarsfrekvenser, omvandlingshastigheter och unsubscribes per steg. Använd detta för att optimera din sekvens.

Svara förståelse

När en kontakt svarar klassificerar AI svaret:

Positiv

Intresserad vill du prata. Sequence pauser, uppgift som skapats för uppföljning.

Objektionsföremål

Har oro men inte avvisar. Sekvens pauser, uppgift skapad med invändnings detaljer.

Avsluta prenumeration

Vill sluta ta emot meddelanden. Kontakten undertrycks permanent.

Inte nu

Intresserad men timing är fel. Sequence pauser, snooze uppgift skapad.

Fel person

Inte rätt kontakt. Sequence stops, kontakta flaggad för granskning.

Stöd för support

En supportfråga, inte ett försäljningsrespons. Sequence pausar, biljett skapad.

Anti-spam skydd

Opt-out hantering

Avskriva förfrågningar hedras omedelbart och kontakten undertrycks från alla framtida sekvenser.

Daglig sänd cap

Workspace-nivå daglig gräns (standard: 1,000 e-post) Förhindrar massa skickar som utlöser spamfilter.

Per-kontaktgräns

Maximalt 1 _-meddelande per kontakt per dag. Förhindrar överväldigande enskilda personer.

Over-cap hantering

Steg som överstiger det dagliga locket skjuts upp till nästa dag. De är aldrig droppade eller hoppade.

Vad händer om en kontakt öppnar en supportbiljett under en sekvens?+

Sekvensen pausar automatiskt. Stödet prioriteras över utåtriktade. Sequencen kan manuellt återupptas efter att supportproblemet är löst.

Kan jag A/B testsekvenssteg?+

Inte direkt inom sekvenser, men du kan skapa två sekvenserna med olika meddelanden och jämföra deras resultat.

CRM_

Tillväxtverktyg

En sida under CRM som håller tillväxtmotorn: återkommande intäkter (MRR / ARR), produktkatalogen, bly-capture former, bokningslänkar och blyrouting. Allt här skriver rakt in i CRMA, så ett forminlämnande eller en bokad samtal är en kontakt med historien, inte en rad i ett kalkylblad.

Vad som lever på sidan

Återkommande intäkter

Intäkter

MR och ARR projiceras från din verkliga faktureringsledare. Abonnemang grupperas från betalningar per plattform, fakturacykeln härrör från räkningsgap, och ett abonnema varv när en betalning är förfallen tidigare 1.5 gånger sin cykel. Kunder länkar till CRM-kontakter automatiskt när huvudboken bär deras e-post.

Produktkatalog

Katalog

En källa till sanning för vad du säljer. Citat drar namn och listpris från katalogen, och accepterade citat rullar upp i intäkter av produkten. Produkterna arkiv, de tar aldrig bort.

Lead-capture former

Fånga

Varje formulär får en värd sida plus en iframe inbäddad kod för din egen webbplats. Inlämningar blir kontakter, ägaren får ett meddelande och dina routingregler tilldela ledningen.

Bokningslänkar

Schemaläggning

Dela en länk, låt utsikterna välja en gratis slot. Slots respektera arrangörens arbetstid, tidszon och befintliga möten. En bokning skapar mötet, e-post prospect en bekräftelse och meddelar arganisatören.

Lead Routing

Routning

Territoriereglerna körs först, sedan fältregler (match ett fält som land eller källa), sedan rund-robin över din reppool. Det sträcker sig CONTACTS OCH DEALS lika, oavsett affärens status: en vunnen affär fortfarande behöver en ägare för provision attribution, kontoansvar och uppföljning, och i ägaren eller lagets synlighet läge är en oägd rekord osynlig för alla utom en chef. Records skapad av automatisering (en kontakt försäljning, chatt, en import) bär ingen interaktiv skapare än vad som helst

Skapa din första form

1
Öppna tillväxtverktyg

Gå till CRM, sedan Tillväxtverktyg, sedan Lead-capture bildformulär avsnittet.

2
Namn och välj fält

Skriv ett namn och en komma-separerad fältlista, till exempel namn, e-post, telefon, meddelande. Email krävs alltid.

3
Dela eller bädda in

Kopiera den värderade länken för att dela den var som helst, eller kopiera bäddkod och klistra in den i någon sida på din webbplats.

4
Watch leads anländer

Varje inlämning är en CRM-kontakt med ett formulär. submitted aktivitet, en ägarmeddelande och automatisk routing.

💡
Offentliga inspelningssidor använder ditt arbetsutrymmes egen adress. Cloud-arbetsytor använder sin tilldelade underdomän (företag.opsiq.help), så länken alltid löser rätt data.

Inbyggda skydd

Bots ser framgång, du ser ingenting

Ett dolt honeypot-fält kastar tyst bot inlämningar.

Rate begränsad

Tio inlämningar per timme per timme IP adress över formulär och bokningar.

Samtycke ärligt

Att skicka in ett formulär ger inte marknadsföringsgodkännande. Endast en uttrycklig samtycke checkbox gör.

Ingen dubbelbokning

En slot är omvaliderad mot en ny tillgänglighetskontroll vid bokningstillfället.

Var kommer de återkommande intäktsdata från?+

Från samma handelsledare använder din Sales-sida, matad av faktureringskontakter. Använd Re-sync från faktura efter att ha anslutit en ny plattform.

Kan jag använda formulären utan en webbplats?+

Ja. Varje formulär har en värdsida på din egen adress som fungerar fristående, med eller utan JavaScript.

CRM_

Messaging Hub (SMS och WhatsApp)

En kontakt, upp till tjugo gateways. Anslut SMS och WhatsApp-leverantörer du faktiskt använder, markera en som standard och välj någon av dem när du skriver en kontakt. Samtycke kontrolleras av CRM innan någon gatelet kontaktas.

Ställ upp det

1
Aktivera kontakten

På sidan Anslutningar öppnar du meddelandenav (SMS och WhatsApp) och aktiverar den.

2
Lägg till en leverantör

I samma låda, eller i CRM Growth Tools, välj en port från nedgången (Twilio, Vonage, Termii, Meta WhatsApp Cloud, Infobip och mer), klistra in sina API -uppgifter och anslut. Du kan lägga till flera, inklusive samma port två gånger med olika konton.

3
Dra ihop webhook:en

Varje leverantörspost visar sin egen webhook URL med en kopiaknapp. Klistra in den i porten leveransrapport och inkommande meddelandeinställningar för att få leveransstatus och svarar tillbaka till OpsIQ.

4
Skicka från en kontakt

Öppna en kontakt och använd SMS eller WhatsApp-knappen. Om fler än en leverantör stöder kanalen, låter en väljare dig välja; annars används standarden.

Samtycke kommer först

Beviljat samtycke endast

Okänt samtycke är inte medgivande. En avsändning vägrar om SMS-godkännande uttryckligen beviljas. WhatsApp rider samma samtycke.

Do-not-contact vinner alltid

En flagga blockerar inte varje kanal, oavsett vad som är inställt.

Förtryck hedrad

Kontakter på förtryckningslistan är aldrig meddelande.

Vägranar namnger deras anledning

En blockerad sändning berättar exakt varför, så att du kan fixa data istället för att gissa.

För utvecklare: Webhook-kontraktet

URL form

https://your-address/opsiq/cron/messaging_webhook.php?sk=SITE_KEY&e=ENTRY_ID&t=TOKEN. Per-entry token är präglad när leverantören är ansluten och aldrig roterar på redigering.

Format förstås

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

Effekter

Leveransrapporter stämplar den uppsökande ledger rad som bär leverantörsmeddelandet id som levererats eller studsade. Inkommande meddelanden matchar kontakten via telefonnummer inuti arbetsytan, landa som ett meddelande. mottagna aktivitet och markera samtalet svarade.

Misslyckande läge

Fel eller saknade token svar 403 Okända nyttolast räknas och ignoreras, aldrig dödlig, så en misskonfigurerad port kan inte bryta slutpunkten.

Vilka gateways stöds?+

Twilio, Vonage, Plivo, MessageBird, Sinch, Infobip, Telnyx, ClickSend, Termii, Afrikas Talking, BulkSMS, Textlocal, Meta WhatsApp Cloud, 360dialog, SMSAPI, Gupshup, Kaleyra, D7 Networks, Hubtel och en anpassad HTTPS-webbhook för allt annat.

Är referenser säkra?+

Krediter lagras krypterade i kontaktinställningarna och echoas aldrig tillbaka till webbläsaren. Redigera en post med en tom hemlighet håller den lagrade.

Kan AI skicka meddelanden?+

Ja, genom registrerade åtgärder som kräver bekräftelse och kör samma samtyckesport. AI kan också lista anslutna leverantörer för att förklara vad som är tillgängligt.

CRM_

Hålla och växande kunder

Lifecycle management hjälper dig att skydda befintliga intäkter. Varje konto får en churn riskpoäng, en hälsopoäng och en rekommenderad framgångsspelbok.

Livscykel
Lifecycle BoardEn kund-livscykel styrelse (Onboarding, Active, At-risk, Renewal) med hälsostänger på varje kontokort.LivscykelWorkPayOnboardingAcmeCity in California USAHälsa 40AKTIVGlobexHälsa 88InitechHälsa 76AT-RISKSoylentHälsa 28RenewaalUmbraCity in ItalyFörnyad i 12dexpansion + $8k1STAGESOmbordstigning till förnyelse2SCOREDHälsa & expansion3PLAYBOOKRekommenderas nästa drag
Kunderna går igenom ombordstigning, aktiv, risk- och förnyelse, varje poäng för hälsa och expansion med en spelbok.

Livcykeln styrelse

Scenkarta över Stockholm

Visuell styrelse som visar var varje konto står: Lead, Prospect, Opportunity, Customer, Expansion, Renewal, At Risk, Churned.

Riskkonton

Konton flaggade med hög churn risk. Varje visar den översta föraren (stöd spik, inaktivitet, betalningsfel) och en rekommenderad spara spel.

Expansion möjligheter

Konton som visar beredskapssignaler för att köpa mer: hög användning, funktionsförfrågningar, planeringsförfrågor.

Förnyelserna förfaller

Konton med kommande förnyelsedatum. Sorterad av risknivå och intäktsvärde.

Hur hur OpsIQ detekterar churn risk

Churn risk beräknas från flera signaler smälta samman:

CRM-signaler

Deal hälsa, inaktivitet, senaste förluster, minska engagemang.

Supportsignaler

Öppna biljetträkning, biljettvolymspikar, negativ känsla, upptrappningar.

Produktengagemanget

Inloggningsfrekvens, funktionsanvändning, sidbesök, API samtal.

Billing signaler

Misslyckade betalningar, försenade fakturor, nedgradera förfrågningar, avbokningssidor besök.

Spelböcker

Spara spel

För riskkonton: nå proaktivt, ta itu med oroen, erbjuda support, eskalera om det behövs.

Förnyelsespel

För kommande förnyelser: bekräfta tillfredsställelse, översyn användning, nuvarande värde, erbjuda incitament om det är lämpligt.

Expansion Play

För redo att växa konton: presentera uppgraderingsalternativ, dela framgångshistorier, visa ROI.

Adoptionsspel

För underutnyttja konton: erbjuda utbildning, dela bästa praxis, aktivera funktioner som de inte använder.

Spotting churn innan det händer

Scenario:
En kund som normalt loggar in dagligen har inte loggat in för 2 veckor, och de öppnade 3 Stöd biljetter denna månad.
Vad ska man göra:

Lifecycle-kortet flaggar det här kontot som "Risk" med förare: inaktivitet.14 dagar sedan senaste inloggningen) och support spike (3x Rekommenderad spel: proaktivt uppsökande för att förstå vad som händer. Finns det en produktfråga? utvärderar de konkurrenter? Tidig intervention kan spara kontot.

CRM_

Håll dina data rena

Data Steward-agenten hittar automatiskt och åtgärdar datakvalitetsfrågor: dubbletter, saknade fält, inkonsekvenser och stale poster.

Data Steward
Data StewardEn lista över datakvalitetsproblem (duplicera, saknas, stale, format), var och en med en one-klick fix åtgärd.Data StewardWorkPayDatafrågor som Steward-agenten hittadeDuplicera[email protected] och [email protected]SammanfogaSaknar12 kontakter har inget företagAnrikaFöråldrad38 erbjudanden orörda för 90+ dagarGranskaFormattelefonnummer i 4 _-formatRätta till alla1CATCHESDupes, luckor, stale2EXPLAINSVarför det flaggade var3FIXESPå ditt godkännande
Steward agenten håller din CRM ren, hitta dubbletter, luckor, stale poster och dåliga format, fixering på godkännande.

Vad den fångar

Duplicera kontakter

Flera poster för samma person (t.ex. [email protected] och [email protected] Förvaltaren föreslår sammanslagning av dem.

Saknar data

Kontakter utan e-post, handlar utan belopp, företag utan domäner. Förslag som fyller från tillgängliga källor.

Olänkade poster

Föreslår länkning baserat på e-postdomän och kontext, samt lägger till en ny kontakt för varje företag.

Inkonsekvenser

En affär i "Won" -stadiet med 20% sannolikhet, en kontakt markerad "Kund" utan avtal, ett företag med missmatchad industri.

Fel scener

Dealer som har varit i samma skede för länge eller kontakter vars livscykelstadium inte matchar deras aktivitet.

Hur man använder

1
Öppna förvaltaren lista

Gå till CRM och hitta avsnittet Data Steward (eller öppna den från CRm Health).

2
Godkänna säkra korrigeringar

Gröna objekt är säkra: tydliga dubbletter, uppenbara saknade data. Godkänn dessa i bulk.

3
Granska resten

Amber objekt behöver din dom: möjliga dubbletter med små skillnader, föreslagna steg förändringar, företagskoppling. Granska var och en.

Rengöring dubbla kontakter

Scenario:
Förvaltaren fann "John Smith" (Johannes Smith)[email protected] och J. Smith (J. Smith)[email protected]": samma e-post, olika visningsnamn.
Vad ska man göra:

Förvaltaren föreslår sammanslagning: hålla rekordet med mer aktivitet, slå ihop den andra postens erbjudanden och aktiviteter. Granska förslaget, justera det överlevande displaynamnet om det behövs och godkänna. Båda skivornas historia bevaras i den sammanslagna kontakten.

CRM_

Bygg min CRM

Bygg min CRM låter dig beskriva din CRm-installation på vanligt engelska. OpsIQ genererar en validerad, reversibel plan och tillämpa den på godkännande. Ingen kodning, ingen manuell konfiguration klickar.

Bygg min CRM
Bygg min CRMEn naturlig språkbeskrivning till vänster som producerar en genererad CRM-plan av stadier, fält och segment till höger.Bygg min CRMWorkPayBeskriv ditt företagVi är en web designbyråSälja månatliga behållare ochengångsprojekt till småföretag.Bygg min CRMGenererad planStadier: Lead → RetainerDealtyper: behållare, projektFält: månatligt värdeSegment: SMB, byråSekvens: onboardingGodkänna och tillämpa1DESCRIBEPlain engelska i2AI PLANSStadier, fält, segment3APPROVETillämpad · ingen kodning
Beskriv ditt företag på vanligt engelska; OpsIQ utarbetar hela CRM (stages, fält, segment) och tillämpar den på godkännande.

Hur det fungerar

1
Beskriv vad du vill

Skriv en vanlig engelska beskrivning av din CRM-installation. Exempel: "Skapa en förnyelsepipeline med steg: Komma, Kontaktad, Förhandling, Förnyad, förlorad poäng leder högre när de tittar på prissättning två gånger."

2
Granska planen

OpsIQ visar en förhandsgranskning av vad den kommer att skapa: pipeline, steg, scen sannolikheter, poängregler, livscykelregler. Granska varje objekt.

3
Applicera

Klicka på Ansök att genomföra planen. Varje förändring registreras som ett bunt du kan ångra i ett klick.

4
Rulla tillbaka om det behövs

Om något inte är rätt, klicka på Undo för att återgå hela bunten. Din CRM återvänder till sitt tidigare tillstånd.

Vad du kan bygga

Pipelines och stadier

Skapa namngivna rörledningar med anpassade stadier, standard sannolikheter och ruttnande trösklar.

Scoring regler

Öka ledresultat baserat på beteende: "Score högre när de ser prissättning", "Scorre lägre när de besöker karriärssidan."

Livcykelregler

Automatiskt fördjupa livscykelstegen: "Flytta till SQL när de begär en demo", "FÖRFÖRA till Kund när affären är vunnen."

Anpassade fält

Lägg till fält för kontakter, erbjudanden eller företag: text, nummer, datum, välj, checkbox, URL, e-post.

Kvalificeringskontrolllista

Definiera MEDDICC eller BANT checklistan Deal Coach betyg mot.

Ställa in en förnyelsepipeline

Scenario:
Du hanterar SaaS-prenumerationer och behöver en pipeline för förnyelser.
Vad ska man göra:

Skriv: "Skapa en förnyelsepipeline. Steg: 90 Dags att åka (10%), 60 Dags att åka (25%), Kontaktad (40%), Förhandlingar (60%), Förnyad (100%), Churned (0% Ställ in ruttningströskeln till. 14 dagar."OpsIQ När planen har skapats granskar du den och klickar på Verkställ.Pipelinen visas omedelbart på sidan Pipeline.

Tänk om jag beskriver något som inte är möjligt?+

Byggaren genererar bara åtgärder som den vet hur man validerar. Om du ber om något utanför dess kapacitet (t. ex. "Integrera med min anpassade API"), kommer det att avvisa begäran och förklara vad det kan göra istället.

Kan jag ångra förändringar?+

Ja. Varje Bygg Min CRM-åtgärd fångas som en reversibel bunt. Gå till CRm Health > Ändra historia för att se alla buntar och ångra någon av dem.

CRM_

Ställ in din CRM på ditt sätt

Manuell CRM-konfiguration för lag som föredrar att klicka över skriva. Alla inställningar som Build My CRMA kan skapa finns också tillgängliga som traditionella formulärfält.

Pipelines och stadier

Skapa, byta namn, ombesörja och ta bort rörledningar och stadier. Ställ in standardvinna sannolikhet per scen. Ställa in ruttningsgränsen (dagar utan aktivitet innan en affär markeras "stalled").

Anpassade fält

Lägg till fält för erbjudanden, kontakter eller företag. Fälttyper: text, nummer, datum, välj (nedslag med fördefinierade alternativ), checkbox, URL, e-post. Anpassade fält visas på objektprofilen och i filter.

Kvalificeringskontrolllista

Definiera checklistan Deal Coach använder för att utvärdera erbjudanden. Välj MEDDICC, BANT eller en anpassad uppsättning av kriterier. Varje objekt kan markeras krävs eller valfritt.

Livcykel stadium regler

Definiera automatiska stegövergångar: när en kontakt uppfyller ett villkor (vissningar prissättning, skickar in ett formulär, gör ett köp), går deras livscykel steg automatiskt framåt.

Lead-scoring regler

Öka eller minska blypoäng baserat på beteende. Exempel: "Visad prissättning sida = +15 poäng, "Downloaded whitepaper = +10 poäng, "Besökt karriärsida = -5Minsta antal kan ställas in (t.ex. "måste visa prissättning åtminstone 2 gånger").

Sparad utsikt

Skapa namngivna filter + sort kombinationer för kontakter, erbjudanden eller företag. Dela vyer med ditt team. Ställ in en standardvy per objekttyp.

Lägga till en ledande scoring regel

Scenario:
Du vill ha kontakter som visar din prissättningssida två gånger eller mer för att få en högre poäng.
Vad ska man göra:

Gå till CRM Configuration > Lead Scoring Rules. Klicka på Lägg till regel. Set: Event = "sidvisning", URL innehåller = "/pricing Minsta antal =2Score boost = +20. Spara. Nästa gång scorer körs, kontakter som matchar denna regel kommer att få +20 till deras lead score.

CRM_

CRM Hälsokontroll

CRM Health är en självdiagnostisk sida som verifierar din CRm är korrekt inställd och kör smidigt.

Hälsokontroll
CRM hälsokontrollEn hälsopoäng ring på 92 bredvid en checklista över passerings- och varningskonfigurationskontroller.CRM hälsokontrollWorkPay92HälsosamtPipeline-steg konfigureradeConnector kopplad och importeraAI-agenter aktiverade!Ingen aktiv uppföljningssekvens!12 kontakter som saknas1AUDITVerifierar din inställning2FLAGSVad saknas3SkorEtt totalt nummer
En ensidig CRM-revision: en övergripande hälsopoäng plus en checklista över vad som är inställt rätt och vad som fortfarande behöver uppmärksamhet.

Vad det kontrollerar

Schema

Databastabeller finns och har rätt kolumner. Om en migration missades kommer CRM Health att flagga den.

AI-agenter

Alla CRM-agenter (Capture, Data Steward, Deal Intelligence etc.) är registrerade och friska. Grön = spring, amber = behöver uppmärksamhet, röd = fel.

Rutter

CRM API -rutter och AJAX-slutpunkter är registrerade och anropsbara.

AI-åtgärder

CRM-åtgärdskatalogen är registrerad i åtgärdsregistret. Om åtgärder saknas, CRMS hälsoegenhälsa genom att omregistrera dem.

Live data räknas

Totala kontakter, företag, erbjudanden, uppgifter, aktiviteter och evenemang. Användbart för att verifiera importen och pågående datainsamling.

Efter installationskontroll

Efter första gången CRM-installationen, öppna CRMS Health och verifiera att alla kontroller är gröna. Om någon är bärnsten eller röd klickar du på objektet för en diagnostisk förklaring och föreslog fixering.

Hur ofta ska jag kolla CRM Health?+

Kontrollera efter inledande installation, efter stora uppdateringar och när CRM-beteende verkar fel. CRm Health självläker många problem (som saknade handlingsregistreringar) bara genom att öppna sidan.

CRM_

CRM-anslutningar för utvecklare

CRM avslöjar en fullständig offentlig REST API och utgående webhooks så att den passar alla stackar utan manuell export.

API slutpunkter

Autentisering

API Nyckel (Authorization: Bearer opq_...) med omfattning crm.read eller crmi.write. POST till /api/v1.php med action och site_key.

Kontakter

crm. contacts. list (sök + filter), crmi. conteacts (av ID), cRm. contact. upsert (skapa eller uppdatera), crum. kontactes. save.

Avtal

crm. deals. list, crmi. detals. detail, cRM. deuals. create, crum. deals . update, crk. deALs. advance (allt genom Trust Layer).

Aktiviteter

crm. activities. list (tidslinje för en kontakt/deal), crmi. activeities. record (logga en ny aktivitet).

Evenemang

crm. events. list (härdlig förändring foder med sedan_id cursor), crmi. evenes. catalog (lista tillgängliga evenemangstyper).

Skapa en affär 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 händelser

opsiq.contact.upsert

Fylld när en kontakt skapas eller uppdateras. Detta är kontaktevenemang för att prenumerera på; det finns ingen separat händelse.

contact.lifecycle_changed

Fylld när en kontakt flyttar till ett annat livscykelstadium.

contact.status_changed

Fylld när en kontaktstatus ändras.

contact.conversion

Skjut när en omvandling registreras mot en kontakt.

contact.tag_added

Eld när en tag läggs till i en kontakt.

contact.erased

Eld när en kontakt raderas för en integritetsbegäran.

crm.deal.created

skjuten när en deal skapas.

crm.deal.stage_changed

Fylld när en affär flyttar till ett annat stadium.

crm.deal.won

Fired när en affär är stängd som vunnit.

crm.deal.lost

Fylld när en affär är stängd som förlorad.

crm.company.created

Eld när ett företag skapas.

crm.task.created

Fylld när en ny uppgift skapas (manuell eller AI-genererad).

email.replied

Fylld när en kontakt svarar på ett uppsökande e-postmeddelande.

email.bounced

Fired när en outreach e-post studsar.

💡
Ring Call webhooks.events.list för den auktoritativa inställningen på din installation, med nyttolast av varje händelse. Det genereras från leveranskoden själv, så det kan aldrig vara oense om vad som faktiskt kommer. Den fullständiga listan visas också i Webhooks-avsnittet.

Alla webhook-händelser är HMAC-signerade och hämtade på misslyckande. URL i Inställningar > Webhooks, eller omröstning crm.events.list med sen_id för en hållbar förändring foder.

Synkronisera CRM-kontakter till Google Sheets

Scenario:
Du vill att varje ny CRM-kontakt ska visas i ett Google Sheet för ditt marknadsföringsteam.
Vad ska man göra:

Ställ in en webhook abonnent föropsiq.contact.upsert. Point it to a Google Apps Script web app or a Zapier webhookURLBetalningen inkluderar kontaktnamnet, e-post, företag, blypoäng och källa. Ditt manus avslutar en rad till Google Sheet för varje ny kontakt.

CRM_

Segment

Segment spara återanvändbara kontaktfilter för CRM-vyer, uppsökande, kampanjer och andra publikmedvetna verktyg.

Produktskärm
SegmentSegmentredigeraren kombinerar villkor, visar live matchräkning och låter operatören välja ett levande filter eller inställd snapshot.SegmentWorkPayModeLivet LiveLOGICAlltMATCHES1,248Livet Arbetarspace VIEWKundscenJämför Active-kundenRegelSista aktiviteteninom 30 dagarRegelLandstingJämfört med StorbritannienRegelHög avsiktGör minst 70Regel1CHOOSE MODELive eller snapshot2ADD RULESAlla eller alla3REUSEKampanjer och CRM
Segmentredigeraren kombinerar villkor, visar live matchräkning och låter operatören välja ett levande filter eller inställd snapshot.

A Live segment beräknar från aktuella data när den används. Pinned Snapshot fryser den aktuella medlemslistan, vilket är användbart när en uppsökande publik inte får ändra efter godkännande.

Välj välja att välja Allt när varje villkor måste matcha eller Varje När ett villkor är tillräckligt. Granska live räkna innan du sparar. Systemsegment kan vara synliga men skyddade från vanlig redigering.

CRM_

Lead Scoring

Lead-scoring regler vänder beteende och profil signaler till en konsekvent poäng som försäljning och automation kan använda.

Produktskärm
Lead ScoringLedscore visar aktiva regler, rullfönstret och den positiva eller negativa poängändringen varje regel gäller.Lead ScoringWorkPayRuler12SCORED8,412HOT LEADS286Livet Arbetarspace VIEWPrissättning aktivitet3+ besök i 14 dagar+20Köpa nyckelordinnehåller migration eller företag+15Stöd riskklagomål händelse i 30 dagar-10Förtroende källaPartner remiss+121DESCRIBE RULEAnvänd vanlig engelska2REVIEW FIELDSSignal, fönster, punkter3RESCOREAnsök till Workspace
Ledscore visar aktiva regler, rullfönstret och den positiva eller negativa poängändringen varje regel gäller.

AI-regelbyggaren kan förvandla en vanlig engelska instruktion till en strukturerad regel. Varje regel bör fortfarande granskas före aktivering: bekräfta aktiviteten eller sökordet, minsta räkning, rullande fönster och poängförändring.

Positiva och negativa regler kan samexistera. Rescore Workspace Efter materialregeländringar utvärderas befintliga kontakter under den nya modellen. Scores kan mata segment, routing, prospektering och arbetsflödesförhållanden.

CRM_

Försäljningsledartavlan

Ledartavlan jämför representanter med kvotuppnående, vann intäkter, provision och öppen pipeline för den valda månaden.

Produktskärm
FörsäljningsledartavlanDen månatliga leaderboarden rankar säljare samtidigt som de håller vunna intäkter, provision och öppna rörledning synlig.FörsäljningsledartavlanWorkPayPERIODJuliTEAM QUOTA82%Kommer att184k £Livet Arbetarspace VIEWAmin104% Kvot · £62k vann1: a- Jag är...88% Kvot · £51k vann2:aRita76% Kvot · £43k vann3: eÖppen pipeline£ 312k över lagetGranska1CHOOSE MONTHJämför en period2CHECK QUOTAUppnående av rep3COACHAnvänd pipeline-kontext
Den månatliga leaderboarden rankar säljare samtidigt som de håller vunna intäkter, provision och öppna rörledning synlig.

Quota uppnåelse är meningsfull endast när varje representant har en aktuell kvot och erbjudanden har rätt ägare, belopp, valuta och nära status. Använd ledartavlan för coachning och erkännande, inte som den enda kvalitetsåtgärden; para det med affär hälsa, aktivitet och prognos noggrannhet.

CRM_

Deal godkännanden

Deal godkännanden kräver chefsavskrivning innan höga värden kan markeras som vunna.

Produktskärm
Deal godkännandenGodkännandepolicyn definierar två värdetrösklar och köen visar pågående, godkända och avvisade beslut.Deal godkännandenWorkPayPOLICYAktiveradWAITING6OLDEST3h_Livet Arbetarspace VIEWNivå 1_Erbjudanden från £10,000ChefNivå 2_Erbjudanden från £50,000SeniorEnterprise förnyelse£72,000 · begärd av BenI väntanMigrationsprojekt£18,500 · begärd av RitaGodkänd1SET THRESHOLDS0 Inaktiverar en tier2REQUESTRep lämnar affären3DECIDEGodkänna eller avvisa
Godkännandepolicyn definierar två värdetrösklar och köen visar pågående, godkända och avvisade beslut.

Aktivera policyn och ställa in nivå 1 och nivå 2 tröskelvärden. en tröskel av 0 inaktiverar den nivån. När en icke-chef försöker vinna ett avtal på eller över tröskeln, OpsIQ skapar en godkännandebegäran istället för att tyst ändra scenen.

Chefer och fulla administratörer blockeras inte av policyn. Varje beslut bör behålla förfrågan, godkännandet, tiden och revisionsrätten.

CRM_

Livcykelregler

Livcykelreglerna rör automatiskt kontakter mellan steg när deras nuvarande data matchar ett sparat tillstånd.

Produktskärm
LivcykelreglerLivcykelreglerna utvärderas av prioritet; den första matchningsregeln ändrar kontaktsteget.LivcykelreglerWorkPayAKTIV7RUNSnattligaPRIORITYHögsta förstaLivet Arbetarspace VIEWLead → Kvalificeradpoäng ≥ 60 och den senaste aktivitetenPrioritet 100Kvalificerad → KundKöpevenemang existerarPrioritet 90Kunden → I riskzonenIngen aktivitet för 60 dagarPrioritet 70I riskzonen → KundNytt köp eller svarPrioritet 601PICK STAGESFrån och till2DEFINE FILTERSegment-style JSON_3ORDER RULESFörsta matchen vinner
Livcykelreglerna utvärderas av prioritet; den första matchningsregeln ändrar kontaktsteget.

Varje regel har ett källsteg, destinationsstadium, aktiv flagga, prioritet och segmentsfilter. Det schemalagda livscykeljobbet utvärderar högre prioriteringar först och slutar efter den första matchen för en kontakt.

Regler bör vara ömsesidigt förståeliga. Undvik två aktiva regler som kan flytta samma kontakt i motsatta riktningar under samma körning. Testa filtret mot ett segment innan du aktiverar det.

CRM_

CRM aktivitet stream

Arbetsytans aktivitetsström kombinerar kund- och drifthändelser så att team kan undersöka vad som hände utan att öppna varje modul.

Produktskärm
CRM aktivitetAktivitetsströmmen mellanleder chatt, biljett, e-post, webhook, konvertering och anomali händelser med filter och pagination.CRM aktivitetWorkPayHÄNDELSER2,804CUSTOMERS1,126ANOMALIES14Livet Arbetarspace VIEWChatten löst[email protected] AINu numeraBiljetten svaradeT-1048 · Fakturering och betalning4mInbound Eventsubscription.upgraded12mKonverteringBeställningsnummer 7788 · £14919m 19m1FILTEREvent och kund2OPEN CONTEXTHoppa till skivan3PAGE RESULTSHålla utredningar bundna
Aktivitetsströmmen mellanleder chatt, biljett, e-post, webhook, konvertering och anomali händelser med filter och pagination.

Filtrera efter händelsetyp, datum, kontakt eller kundstatus (inklusive betalande kunder) Foder är en läsmodell av inspelad aktivitet; det ersätter inte källbiljetten, konversationen, affären eller anslutningsposten. Öppna den länkade posten innan du vidtar en känslig åtgärd.

CRM_

Arbetsflöden

Arbetsflöden svarar på ett evenemang och kör en beställd serie av åtgärder, inklusive försenade steg som återupptas av krön.

Produktskärm
ArbetsflödenEtt arbetsflödeslöpning visar sin utlösare, slutförda åtgärder, väntande fördröjning och nästa steg.ArbetsflödenWorkPayAKTIV9RUNNING42FEL1Livet Arbetarspace VIEWUtlösarecontact.createdBörjaSteg 1_Skicka välkommen e-postKlarFördröjningVänta 2 dagarVäntarSteg 2_Skapa försäljningsuppgiftNästa1CHOOSE TRIGGEREvent startar loppet2ORDER STEPSÅtgärder och förseningar3MONITORÅteruppta genom cron
Ett arbetsflödeslöpning visar sin utlösare, slutförda åtgärder, väntande fördröjning och nästa steg.

Skapa ett arbetsflöde genom att välja utlösaren, lägga till steg i ordning och möjliggöra det. Förseningar lagras, inte hålls av en webbläsare begäran; den enhetliga cron återupptar på grund av arbetsflöde körningar.

Inbyggda startmallar inkluderar välkommen efter registrering, efter köp tack och demobekräftelse. Klon en mall, ersätt sina mottagare / innehåll, testa sedan med ett kontrollerat rekord innan bred aktivering.

Designåtgärder som ska vara obetydliga. En retry får inte skicka dubbla penningrörelseförfrågningar eller skapa dubbletter.

Stöd för support

Biljetter

Biljetter är din formella supportkanal. De har avdelningar, prioriteringar, SLA-mål, bilagor, interna anteckningar och full konversationstrådning. Biljetterna kan komma från biljetter OpsIQ admin, biljettformulär / inbäddad, e-postintag, chattupptrappning, kontakt eller API.

Biljetter
BiljettdetaljerEn biljett med en meta-sidofält (prioritet, avdelning, SLA, status), konversationstråden och AI utkast till och återbetala åtgärder.BiljettWorkPayT-12345_PrioritetHöghöghögAvdelningFaktureringSLA_3h 12m vänsterStatusÖppnaJag blev belastad två gånger för minPrenumeration i juni 3.AIBekräftade dubblettenavgift, återbetalning bearbetning.AI utkast till svarÅterbetalning1THREADEDFull konversation + anteckningar2SLA & ROUTINGPrioritet, Djupt, Timers3AI DRAFTSvara skrivet för dig
Varje biljett bär sin prioritet, avdelning, SLA timer och full tråd, och AI kan utarbeta svaret för dig.

Hur en biljett flyter

1
Biljetten anländer

En kund skickar ett meddelande via e-post, chatt eskalering, biljett inbäddad eller admin skapar en. Biljetten får ett unikt ID (t.ex. T-12345).

2
Triage

AI läser ämnet och kroppen, tilldelar prioritet (Låg/Normal/High/Urgent), föreslår en avdelning och upptäcker känsla. Detta sker automatiskt om triage är aktiverad.

3
Svar

En agent öppnar biljetten, läser sammanhanget (kundprofil, plattformsdata från kontakter, tidigare biljetter) och skriver ett svar. AI kan utarbeta svaret och agenten redigerar innan du skickar.

4
Nära

När problemet är löst stänger agenten biljetten. Kunden meddelas. Om kunden svarar efter att ha avslutats öppnar biljett automatiskt igen.

Per-ticket åtgärder

Förändringsavdelning

Flytta biljetten till en annan avdelning (t. ex. från General till Billing). Användbar när den ursprungliga routingen var fel.

Tilldela agent

Tilldela biljetten till en viss lagmedlem. Den tilldelade agenten ser biljett i sin "Mina biljetter" -vy.

Lägg till intern anteckning

Skriv en anteckning som endast är synlig för personalen. Användning av: undersökningsresultat, återbetalningsskäl, tekniska sammanhang, tidigare åtaganden. Interna anteckningar verkar aldrig för kunder.

Sammanslagna biljetter

Kombinera dubbla biljetter från samma kund. Den sammanslagna biljetten får en [MERGED]-tagg. Alla meddelanden från båda biljetterna bevaras i den överlevande biljett.

Konserverat svar

Sätt in en förskriven svar mall. Variables som {{customer_name}} och {{ticket_id}} ersätts automatiskt.

AI skriver om

Låt AI förbättra ditt förslag till svar: justera ton, förkorta/längd, fix grammatik eller översätta. Du granskar resultatet innan du skickar.

Förändringsprioritering

Beläget för låg, normal, hög eller brådskande. Prioritet påverkar SLA-timmar och sorteringsordning.

Ändra status

Ange som Öppet, Väntar, Vänta på kund, Löst eller Stängt.

Arbetat exempel: hantera en olycklig kund

Kunde-mail: "Jag debiterades två gånger för min prenumeration"

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.
Vad ska man göra:

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.

Institutioner

Skapa avdelningar i Inställningar > Biljetter > Avdelningar. Vanliga avdelningarna: Allmänna, Billing, Tekniska, Försäljning, Missbruk, Onboarding. Varje avdelning kan ha olika auto-reply regler, AI kunskap och teamuppdrag.

Konserverade svar

Skapa återanvändbara svarmallar i Inställningar > Biljetter > Konserverade svar. Goda konserverade svar inkluderar:

Exempel konserverade svar mall
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}}

Slå biljetter

När en kund skickar samma fråga flera gånger (via e-post och chatt, eller två separata email), kan du slå samman dubbletterna. Gå till biljetten, klicka på Sammanslagning, välj den andra biljett för att gå samman. Den överlevande biljett får alla meddelanden från båda biljetter. Den sammanslagna biljettens ämne får en [MERGED] taggen för att ange det kombinerades.

Anslutna plattformar följer sammanslagningen. När biljetterna också finns på en uppkopplad plattform (WHMCS, Zendesk, SaaS kundportalen), sammanslagningen händer där också: plattformen slår ihop sina kopior, så den biljett du håller visar den sammanslagna biljettens första meddelande och svar. En sammanslagen biljett som aldrig var på den plattformen har sitt samtal lagt till den bevarade plattformsbiljetten som en privatperson notera, aldrig som ett svar kunden är e-postad. En fusion gjort inuti plattformen (till exempel i den plattform som har sin konversation lagts till den hållna plattformen betalning biljetten WHMCS) slår samman OpsIQ Biljetter på samma sätt.

Prioritet och SLA

Låg

Icke-brådskande frågor, funktionsförfrågningar, allmän feedback. Målet första svar: 24 timmar.

Normal

Standardstödsfrågor. Målet första svar: 8 timmar.

Höghöghög

Genomföra kundens verksamhet. Målet första svar: 4 timmar.

Brådskande

Service ner, säkerhetsincident, dataförlust, faktureringsfel. Målet första svar: 1 timme.

SLA-timmar startar när biljetten skapas och pausas när statusen är "Väntar på Kunden". Om SLA målet missas, markeras biljetterna och valfritt eskaleras.

Kan kunder se interna anteckningar?+

Aldrig. Interna anteckningar är strikt personal-bara. De visas inte i kundbiljettportalen, e-postmeddelanden eller någon kundanpassad yta.

Vad händer när en sluten biljett svaras?+

Biljetten öppnar automatiskt och återvänder till den aktiva kö. Laget meddelas om det nya svaret.

Kan jag låsa en biljett för att förhindra ytterligare svar?+

Använd alternativet Lock Thread för att förhindra både kund och AI från att lägga till nya svar. Användbart för lösta tvister eller slutna utredningar.

Stöd för support

Service Studio: SLA, statusflöde och kvalitet

Kontrollrummet för hur din supportoperation beter sig: SLA-policyer med eskaleringsstegar, affärstimmarskalendrar, ett verkställt statusflöde, CSAT-inställningar och funktionen om företaget växlar. Öppna den från sidan Biljetter (tjänststudio knappen i operationsfältet).

SLA-policy

Varje ny biljett får ett första svar och en resolutionstid från den mest specifika aktiva policyn: avdelning + prioriterade slag avdelning, slår prioritet, slå standard. Deadlines pausar automatiskt medan en biljett sitter i väntan eller på håll.

Escalation stegar

Istället för en överträdelse kan en policy definiera upp till sex steg: till exempel varna uppdragstagaren vid 75% av fönstret, varningschefer på 100%, omfördela till en namngiven agent vid 150% Varje steg bränder exakt en gång per biljett.

Affärstider och kalendrar

Med arbetstid på, SLA klockor brinner bara under arbetstiden, så en biljett öppnas fredag kväll inte brytas av lördag. Namngivna kalendrar (tidszon, dagar, timmar, helgdagar) kan fästas till individuella politik för lag i olika regioner.

Statusflöde

En från / till matris som begränsar vilka statusändringar administratörer kan göra, med en Zendesk-stil förinställd. Automation, inkommande e-post och kundoriginerade biljettrester är alltid undantagna, så en strikt matris kan aldrig sylt pipeline. Optionellt kräver ett godkänt sign-off innan du stänger.

Godkännanden

Agenter begär avskrivning på en biljett (återbetalningar över ett tröskelvärde, policy undantag). En namngiven approver eller någon Full Administrator bestämmer med en anteckning; förfrågan kan aldrig godkänna sin egen begäran. I väntan på godkännanden ytan som en banner på inkorgen.

Biljettförhållanden

Länka biljetter som relaterade, dubblett, förälder / barn eller blockering; dela svarar ut till en ny länkad biljett (omvänd av sammanslagning, utan att skicka e-post till kunden); Följ biljetterna för meddelanden i appen och valfritt CC-följarens e-postadresser på utgående svar.

Live inbox och kollisioner

Med realtidsinkorgen aktiverad visas nya biljetter och svar för agenter inom några sekunder genom den befintliga anmälningsströmmen. På en biljett ser agenterna vem som annars tittar på och får en varning banner när en lagkamrat redan skriver ett svar. En one-click Klara anger biljetten till dig själv.

AI-medvetna routing

Ruttregler kan matcha på AI-triagesignaler: prioritet, kategori, sentiment och eskaleringsrisk, plus skrivna anpassade fältvärden från din portalförfrågan. Regler som använder dessa villkor förbli vilande tills funktionen är aktiverad.

💡
Varje företag byter fartyg OFF. Att slå en på i Service Studio → Kvalitet & Automation är opt-in; lämnar dem bort håller beteendet identiskt med före uppgraderingen.
Varför kan en kund fortfarande öppna en sluten biljett när min matris förbjuder stängt →?+

Matrisen styr endast ADMIN-åtgärder. Kundoriginerade svar, e-postsvar och automatisering är medvetet undantagna så en strikt policy kan aldrig låsa kunder eller bryta rörledningen.

Ersätter SLA-stegar den gamla brottsligheten?+

Politik som sparats med en enda överträdelse agerar oförändrad. En stege ersätter den gemensamma åtgärden endast på policyer där du definierar åtgärder.

Stöd för support

Biljett auto-reply och eskalering

Auto-reply låter AI svara på nya biljetter automatiskt. Escalation flyttar biljetterna till en annan avdelning när AI upptäcker specialiserade behov. Båda funktionerna fungerar över inhemska biljett och e-skapade biljett.

Autosvar
Automatiskt svar på ärendenEtt flöde: ny biljett, en två minuters fördröjning, AI svarar från kunskap och sammanhang, sedan skickas eller sparas som ett utkast.AutosvarWorkPayNär en ny biljett anländerNy biljettAlla källorFördröjning2 min_AI svararKB + kontextAvsändeller utkastOm ett mänskligt svar under förseningen, auto-reply avbryts. Intent kan eskalera till en annan avdelning först.1DELAYMänniskor får första chansen2AI REPLIESFrån KB + kontext3OR ESCALATERoute av Avsikt
Nya biljetter får en kort fördröjning (så människor kan hoppa in), sedan svarar ett AI från din kunskap, skickade eller köade som ett utkast.

Hur auto-reply fungerar

1
Biljetten visas

En ny biljett skapas från vilken källa som helst (email, chat, portal, API).

2
Schemalägg svar

OpsIQ Väntar på konfigurerad fördröjning (standard: 2 Detta ger människor en chans att svara först.

3
Första svaret vinner

Om en mänsklig agent svarar under förseningen, auto-reply avbryts. Om inte, AI genererar ett svar.

4
Generera och skicka

AI läser biljetten, kontrollerar kunskapsbas, kontaktkontext och kundhistorik, skriver sedan ett svar. Svaret skickas (eller köas som ett utkast för granskning beroende på inställningar).

Hur eskalering fungerar

1
Konfigurera avdelningar

Ange vilka avdelningar som kan få upptrappningar (t. ex. Billing kan eskaleras från general, teknisk kan scalated från General).

2
Klassificera biljetten

Innan auto-replying klassificerar AI biljettintenten: fakturering, teknisk, återbetalning, missbruk etc.

3
Flytta om det behövs

Om biljettintentet matchar en upptrappningsavdelning flyttas biljetten. En intern anteckning förklarar varför.

4
Generera i ny röst

Svaret genereras med hjälp av destinationsavdelningens kunskap och AI-utbildning.

Inställningar referens

Auto-reply aktiverad

Master switch. Slå på för att aktivera AI auto-reply för biljetter.

Tillåtna avdelningar

Vilka avdelningar kan få auto-replies. Börja med lågriskavdelningar (Allmänt, Försäljning) innan du aktiverar fakturering.

Fördröjning

Hur lång tid att vänta innan AI svarar (på några sekunder). 120 sekunder (några)2minuter).0För omedelbara svar.

Delay schema

Alternativt ställa olika förseningar för arbetstid vs. efter timmar.

Sluta på admin svar

Om en mänsklig agent svarar först, avbryta auto-reply. Standard: on.

Eskalering aktiverad

Aktivera automatisk avdelning routing baserat på biljett avsikt.

Escalation avdelningar

Vilka avdelningar biljetter kan eskaleras till.

Eskaleringsstatus

Vilken status som ska ställas in när du eskalerar (t. ex. Öppen, vänta).

Escalation Note

Oavsett om du vill lägga till en intern anteckning som förklarar eskaleringsskälet.

E-post skapade biljetter

Biljetter som skapats från e-post (via mailbox polling eller MX-piped leverans) följer samma auto-reply och upptrappningsregler. AI svar skickas som ett e-postadresssvar till kunden. E-postutkast går till utkasten kö för granskning om konfigureras.

Kommer AI auto-reply att fakturera frågor?+

Endast om du aktiverar auto-reply för Billing Department. Vi rekommenderar att du börjar med automatisk svara på fakturering och möjliggör det först efter att du har tränat AI med omfattande fakturakunskaper och testats noggrant.

Tänk om AI ger fel svar?+

Om en kund svarar säger att svaret var fel, bör en mänsklig agent ingripa. Granska AI historia för att förstå varför AI gav fel svar, sedan uppdatera kunskapsbasen eller AI utbildning för att förhindra det händer igen.

Kan jag granska auto-replies innan de skickas?+

Ja. Ställ in leveransläget till "Draft" istället för "Auto-send." Auto-reply utkast kommer att visas i utkast kö för mänsklig granskning innan du skickar.

Stöd för support

Biljettportal inbäddad

Biljettportalen som bäddas in låter dig lägga till ett biljetthanteringsgränssnitt på någon webbplats. Kunder kan se sina biljetter, skapa nya och svara, allt utan att ange OpsIQ -administratören.

Hur det fungerar
Biljettportal inbäddadEn supportportal inbäddad på en webbplats som visar en kund sina egna biljetter och en ny biljettknapp.yoursite.com/supportSupportcenterNy biljettDina Tickets#1042 · ÅterbetalningsfrågaÖppna#1038 · InställningshjälpLösen#1031 · FakturakopiaI väntan1EMBEDLägg till på någon webbplats2SELF-SERVEKunderna ser sina biljetter3NO LOGINIdentitet hanteras säkert
Biljettportal inbäddad

Tre inbäddade smaker

Inline bäddat

Gör biljettportalen inuti en dyk på din sida. Portalen tar hela bredden av behållaren.

Flytande widget

Visar en flytande knapp som öppnar biljettportalen i en panel. Liknar en chatt widget.

Autentiserad

Kräver ett signerat identitetstoken. Kunderna ser bara sina egna biljetter.

Installation

Biljett och chat bäddas in
<!-- 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.

Identitetstoken generation

För autentiserat läge undertecknar din server ett kortlivat token med webbplatsens hemlighet OpsIQ Vem kunden är så att de bara ser sina egna biljetter. Det är en standard HS256 JWT: alla JW T-bibliotek fungerar. Hemligheten går aldrig in på en sida.

PHP · generera identitetstoken
<?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, generera identitetstoken
// 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 });
}

Widget funktioner

Biljettlista

Sökbar, statusfiltrerad lista. En "Awaiting you" markerar flaggor biljetter laget har svarat.

Trådad konversation

Full konversation med rik text, bilagor och tidsstämplar.

Utkast till autospara

Kundutkast till svar är auto-sparad så att de inte förlorar arbete om de navigerar bort.

Live-avröstning

widgetundersökningar för nya svar varje ~12 sekunder.

Lösning / Reopen

Kunder kan lösa eller öppna sina egna biljetter med ett klick.

Interna personalanteckningar visas aldrig för kunder i biljetten inbäddad. Detta är en hård säkerhetsgräns.
Stöd för support

Chatt inbox

Chatten Inbox är där ditt team hanterar live-kundkonversationer. Det visar aktiva chattar, tilldelade konversationer, AI-handlade chat och arkiverad historia.

Chatt inbox
Chatt inboxEn tre-pane agent chatt inkorg: samtalslista, live konversation med ett AI utkast chip och en besökare / CRM kontext panel.Chatt inboxWorkPayAUDJanevar är min orderMånadMensahFaktureringsfrågaRTRitaAI hanteradVar är min order?Fraktad idag · UPSAI utkast redoSvara...BESÖKAREJane DoeUSA · Chrome3 tidigare beställningarLTV $480_CRM_Steg: Kund1UNIFIEDVarje live chat2CONTEXTBesökare + CRM panel3AI ASSISTDraft & Rewrite
En inkorg för varje livechatt, konversationslista, tråden med AI-utkast på kran och full besökare + CRM-kontext.

Hantera konversationer

Aktiva chattar

Konversationer som för närvarande pågår. Grönt prick = kund är att skriva eller nyligen aktiva.

AI-hanterad

Konversationer där AI svarar. Du kan ta över när som helst genom att klicka på "Join".

Tilldelat till mig

Konversationer som tilldelats dig specifikt.

Väntar

Konversationer där kunden väntar på ett svar.

Arkiv

Slutförda samtal. Sökbara med sökord, datum och kund.

Handoff från AI till människa

När du tar över en konversation från AI, följ dessa tre regler:

1
Hälsa personligen

Introducera dig själv med namn. "Hej, det här är Sarah från supportteamet."

2
Referens sammanhang

Visa dig läsa konversationen. ”Jag kan se dig fråga om din orderstatus.”

3
Ställ förväntningar

Berätta för kunden vad som händer härnäst. ”Jag tittar på det här nu och kommer att ha ett svar för dig om några minuter.”

Byta AI på/off per konversation

Använd AI-tonglen högst upp i varje konversation. När AI är på, genererar AI svar. När det är av kan endast mänskliga agenter svara. AI kommer ihåg konversationskontexten även när den stängs av och tillbaka.

Away mode / av timmar

Konfigurera affärstider i Inställningar. Utanför arbetstiden kan AI:1) Fortsätt att svara på kunderna, (2Visa ett "bort" meddelande och skapa en biljett för uppföljning, eller (3Inaktivera chatt helt och visa biljettformuläret. Välj det beteende som passar din supportmodell.

Hantera tuffa samtal

1
Håll dig lugn

Inte matcha kundens känslomässiga intensitet. Bekräfta deras frustration utan att vara defensiv.

2
Samla fakta

Innan du svarar samlar du in relevant information: orderuppgifter, kontostatus, tidigare biljetter.

3
Eskalera tidigt

Om situationen innebär återbetalningar, juridiska hot, missbruk eller säkerhet eskalerar till en ledande gruppmedlem snarare än att försöka hantera det ensam.

Kan jag ha lagchatt (agent to agent)?+

Använd interna anteckningar i ett samtal för att kommunicera med andra agenter. Dessa anteckningarna är aldrig synliga för kunden.

Vad händer när jag stänger en chatt?+

Konversationen går till Arkivet. Om kunden skickar ett nytt meddelande senare skapas en ny konversation.

Stöd för support

Meddelande kanaler

Anslut WhatsApp, Facebook Messenger, Instagram DM, Telegram och LINE så att meddelandena som kunder redan skickar dig anländer i samma inkorg som din webbplats chatt, besvarad av samma AI-assistent.

Varje kanal beter sig identiskt en gång ansluten: ett kundmeddelande blir en konversation i Chatt Inbox, din AI-assistent svarar på det med samma kunskap och instruktioner som din webbplatschatt, och någon agent kan ta över. Ingenting om ditt AI behöver konfigurera per kanal.

Vad anslutning ser ut

Facebook Messenger & Instagram_

Ett klick. Öppna kontakter→Facebook Messenger & Instagram DM, klicka på Anslut, logga in med Facebook-kontot som hanterar din sida och välj sidan. Instagram kommer med det när din sida har ett professionellt konto kopplat till Instagram.

WhatsApp

Ett klick där din leverantör erbjuder det: öppna meddelandenav-kontakten och använd Connect WhatsAppFölj sedan Metas guidade registrering för att välja eller skapa din WhatsApp Företagsnummer. Annars klistra in referenser från någon av 20 gateways.

Telegram_

Två minuter. Meddelande @BotFather i Telegram, skicka/newbot,Välj ett namn och ett användarnamn som slutar i "bot" och klistra in token det ger dig i Telegram-kontakten.OpsIQregistrerar webhook för dig.

LINE

Skapa ett meddelande API kanal på developers.line.biz, klistra in Channel hemligheten och tillgång token, sedan kopiera webhook URL visas i OpsIQ till LINE och byt ut sina egna auto-replies.

SMS

Lägg till en leverantör (Twilio, Vonage, Termii och andra) i Messaging Hub med sina referenser och avsändarnummer.

Varje kontakt visar sina egna steg-för-steg-instruktioner inuti lådan, inklusive exakt vad du ska kopiera och var. Du behöver aldrig utvecklare referenser för en-klick alternativ.

Slå en kanal på

Ansluta en kanal startar inte den. Inställningar → Kundchatt → Avancerad → Messaging kanalerByt på mastertoggle och sedan den enskilda kanalen. Varje kanal har sin egen AI-automatsbrytare, så att du kan pilota på en innan du öppnar resten.

1
Anslut kanalen

I Connectors använder du instruktionerna i den kontaktens låda.

2
Testa anslutningen

Klicka på Test. Det gör ett riktigt samtal till leverantören och berättar vad som är fel om något är.

3
Möjligt att skicka meddelandekanaler

Inställningar→Kundchatt→Avancerad. Slå på huvudbrytaren, sedan kanalen.

4
Skicka dig ett meddelande

Från ett annat konto, meddelande din sida, nummer eller bot. Det bör visas i chattinkorgen inom några sekunder och få ett AI-svar.

Svara på fönster

Meddelandeplattformar begränsar hur länge ett företag kan svara efter att en kund skriver.OpsIQVisar den återstående tiden på varje samtal och genomdriver regeln för dig.

WhatsApp

24 timmar från kundens sista meddelande. Därefter kan du bara skicka en godkänd mall som du konfigurerar i samma avancerade flik.

Messenger & Instagram_

24timmar för normala svar; agenter kan besvara upp till7dagar senare under Metas humanagentbidrag.

Telegram, LINE, SMS

Inget plattformspåslaget fönster.

⚠️
Om ett svar misslyckas eftersom fönstret stängs visar konversationen varför. Detta är en plattformsregel, inte en gräns för OpsIQ.

Vanliga frågor

Ser kunderna att ett AI-stöd svarar?+

Endast om du säger till dem. Svaret kommer från din sida, nummer eller bot precis som ett mänskligt svar skulle. Din AI-instruktion kontrollerar tonen och om det identifierar sig själv.

Kan en agent ta över mitten av samtalet?+

Öppna konversationen i Chatt Inbox och klicka på Gå med. AI stannar, du skriver, och kunden ser en kontinuerlig tråd på deras sida.

Tänk om jag kopplar bort en kanal?+

Använda Avkoppling på kontakten. Meddelandehistorik hålls; nya meddelanden slutar helt enkelt anlända, och plattformen uppmanas att sluta skicka dem.

Kan två arbetsytor använda samma Facebook-sida?+

Nej. En sida tillhör en arbetsyta åt gången. Ansluta den någon annanstans flyttar den, och den första arbetsytan slutar att ta emot meddelanden, så koppla av medvetet snarare än att återansluta någon annan plats.

Stöd för support

Real chat konversationer

Dessa exempel visar hur en välutbildad kund AI ska hantera vanliga scenarier. Använd dem för att testa din AI-utbildning och identifiera luckor.

10 samtalsexempel

1Återkommande kund som frågar om beställning

Scenario:
Kund: Hej, jag lade en beställning3dagar sedan och har inte fått någon frakt meddelande ännu. Order #ORD-5523.
Vad ska man göra:

AI bör: (1Leta upp ordning #ORD-5523 genom anslutningen. (2) Rapportera den aktuella statusen och spårningsinformationen om så är tillgängligt.3) Om beställningen försenas, bekräfta förseningen och ge en uppskattad tidslinje.4Uppfinna INTE en fraktstatus om kontakten inte har någon.

2. Prospekt frågar om prissättning

Scenario:
Kund: Hur mycket kostar din Pro-plan? Erbjuder du årlig fakturering?
Vad ska man göra:

AI bör: (1) Svar från kunskapsbasen med nuvarande prissättning. (2) Förklara skillnaden mellan månatlig och årlig fakturering. (3) Om svaret inte finns i kunskapsbasen, säg det och erbjuda att ansluta dem med försäljning. (4) Uppfinna INTE prissättning som inte finns i kunskapsbasen.

3. Angry kund som kräver återbetalning

Scenario:
Kund: Det här är löjligt! Din produkt fungerar inte och jag vill ha tillbaka mina pengar nu.
Vad ska man göra:

AI bör: (1erkänna frustrationen lugnt.2) Be om ordernummer eller konto e-post. (3Förklara återbetalningsprocessen. ()4Skapa en supportbiljett eller eskalera till ett mänskligt ombud.5• Utlova inte en återbetalning, som kräver mänskligt godkännande.

4. Dubbel fakturering kant fall

Scenario:
Kund: Jag debiterades två gånger i månaden. Min bank visar två avgifter för $29.99.
Vad ska man göra:

AI bör: (1) Erkänna oron.2) samla in relevanta uppgifter (e-post, avgiftsdatum).3Förklara att faktureringsfrågor kräver mänsklig granskning.4) Skapa en Billing-avdelningsbiljett med detaljerna.5) Ställ in prioritet till hög.

5Multi-language kund

Scenario:
Kund: Bonjour, je voudrais savoir si vous leverrez i Frankrike?
Vad ska man göra:

AI bör: (1) Svara på kundens språk om det språket stöds.2Svara på frågan om leverans till Frankrike från kunskapsbasen.3) Om språket inte stöds, svara på standardspråket och nämna vilka språk som finns tillgängliga.

6. Efterhandskonversation

Scenario:
Kund: Hej, är någon där? Jag behöver hjälp med mitt konto.
Vad ska man göra:

AI bör: (1Om konfigureras för eftertimmars AI, svara och hjälpa.2Om eftertimmar skapar biljetter, säg: "Vårt team är för närvarande offline. Jag har skapat en supportbiljett till dig och någon kommer att följa upp under arbetstid."3) Tillhandahålla biljettnummer.

7Förköp jämförelse shopper

Scenario:
Kund: Hur jämför din produkt med [Competitor X]?
Vad ska man göra:

AI bör: (1Beskriv din produkts styrkor faktiskt.2) Inte badmouth konkurrenten.3) Om det finns en jämförelsesida i kunskapsbasen, länka till den.4) Om kunden frågar om funktioner som du inte har, var ärlig.

8Kunden vill ha en rekommendation

Scenario:
Kund: Jag kör en liten webbutik med ca 100 order per månad. Vilken plan är rätt för mig?
Vad ska man göra:

AI bör: (1) Ställ frågor om det behövs (t.ex. vilka funktioner som är viktigast).2) rekommendera en plan som bygger på kunskapsbasen.3Förklara varför denna plan passar deras behov.4) Påpeka att de kan börja med en mindre plan och uppgradera senare.

9Kunden försöker få en obehörig rabatt

Scenario:
Kund: Jag såg online som du ger 50% rabatter. Kan jag ha en?
Vad ska man göra:

AI bör: (1) Förklara öppet gällande kampanjer om någon existerar.2skapa eller lova rabatter som inte finns i kunskapsbasen.3) Om kunden kvarstår, erbjuda att ansluta dem med säljteamet.

10 Kunden behöver hjälp med en funktion

Scenario:
Kund: Hur exporterar jag mina data? Jag kan inte hitta exportknappen.
Vad ska man göra:

AI bör: (1) Ge steg för steg instruktioner från kunskapsbasen.2) Inkludera den exakta sidleden och knappplatsen.3Om funktionen kräver en specifik plan, nämn det.4) Om funktionen inte existerar, var ärlig och föreslå alternativ.

Stöd för support

Chatt routing och eskalering

När en livechatt behöver en riktig person svarar AI två frågor: vilket lag äger denna konversation, och vem ska få veta. Båda är konfigurerade i Inställningar, Kundchatt, Support Flow, under AI-routingavdelningar.

Välja vilka avdelningar AI kan använda

De två lådorna på panelen är en vitlista. Institutioner som flyttas till höger är de enda AI kan väga till eller öppna biljetter i. Allt kvar till vänster är osynligt för det, även om institutionen finns och är bemannad. Börja smal och lägga till avdelningar när du personal dem.

💡
Om ingen avdelning är aktiverad alls, OpsIQ faller tillbaka till äldre routing över varje avdelning som den kan hitta. Behandla det som ett säkerhetsnät, inte en konfigurationsval.

Vem får eskaleringen

Detta är den del som de flesta förväntar sig att konfigurera och inte behöver. När AI eskalerar en chatt, OpsIQ e-postmeddelanden de personer som är knutna till den avdelningen. Du hanterar den listan en gång, på sidan Team och Institutioner, och både biljett upptrappning och chatt eskalering följer det.

Institutionens teammedlemmar

Varje aktiv administratör som är knuten till avdelningen får sin egen kopia. Avstängda och funktionshindrade konton hoppas över.

Primär admin

Används när inga lagmedlemmar är fästa, så en upptrappning når fortfarande någon.

Ingen fäst

Leverans är inte möjligt. Routingpanelen markerar att avdelningen i rött och AI inte berättar besökaren en människa meddelades.

⚠️
En avdelnings egen e-postadress används avsiktligt aldrig som mottagaren. Den adressen är avdelningens inkommande biljettpostlåda, den inkommaande posten matchas mot att öppna biljetter. En upptrappning skickad skulle det pipas tillbaka som en ny biljett snarare än att nå en person.

Den catch-all avdelningen

Exakt en avdelning bär fångst-all-märket. Det får chatt som AI inte kan säkert placera, och det är en sista utväg snarare än den normala vägen.

1
Tydliga signaler vinner

Billing ordalydelse går till en faktureringsavdelning, hosting och felorder till en teknisk, köpa tal till försäljning.

2
AI-klassificeraren försöker nästa

Om sökord är oavslutande läser modellen konversationen och plockar från de aktiverade avdelningarna.

3
Och fångsten

Först när båda kommer upp tomt får catch-all avdelningen chatten.

4
Försäljningsvakten

Om fångsten är en försäljningsavdelning och besökaren visade ingen köpsignal, OpsIQ söker stöd eller teknisk avdelning istället, så vanliga supportfrågor ackumuleras inte i försäljningen.

Vad besökaren får höra

Om eskaleringsmailet går ut berättar AI besökaren laget har meddelats. Om det inte kan gå ut, säger AI något ärligt och uppmanar dem att lämna meddelandet i chatten istället. Det kommer inte att hävda en människa varnade när inget e-postmeddelande skickades.

Panelen säger "Ingen att meddela" för en avdelning+

Ingen är knuten till det. Open Team och avdelningar, bifoga minst en aktiv administratör, sedan ladda inställningar sidan. panelen läser live.

Kan chatttrappor gå någon annanstans än laget?+

En anpassad adress som tidigare sparats för en avdelning åsidosätter fortfarande laglistan. Nya inställningar bör fästa människor till institutionen istället, så det finns ett enda ställe att underhålla.

Varför var min catch-all hoppad?+

Kontrollera om det är en försäljningsavdelning. Om det är, och besökaren visade ingen köpsignal, OpsIQ vägar till ett stöd eller teknisk avdelning i syfte.

Stöd för support

E-post mailboxar och utkast

OpsIQ kan ansluta till e-postlådor för att automatiskt skapa biljetter från inkommande e-postadress och skicka svar som e-mail. Det ger också AI-utarbetade svar för mänsklig granskning.

E-post
Email till biljettEn IMAP brevlåda på vänster utfodring inkommande e-postmeddelanden till en trådad biljett med ett AI-utarbetat svar till höger.E-postWorkPay[email protected] · IMAPÅterbetalningsförfrågan[email protected]_Kan inte logga in[email protected]_Fakturakopia[email protected]_Biljett #1042Från e-post · BillingJag vill ha en återbetalning förDuplicera avgift ...AI utkastGranska & skicka svar1INGESTIMAP och vidarebefordran2TO TICKETSTrådas automatiskt3AI DRAFTSSvar för granskning
Dra e-post i över IMAP (eller vidarebefordran), förvandla var och en till en trådad biljett, och låt AI utarbeta svaret för granskning.

Ansluta en brevlåda

Protokoll

IMAP (de flesta leverantörer), Gmail API (Google Workspace) eller Microsoft Graph (Outlook 365).

Inställningar som behövs

Värd, port, kryptering (SSL/TLS), användarnamn, lösenord eller applösenord, mapp (vanligtvis INBOX).

Departementets kartläggning

Kartlägg brevlådan till en biljettavdelning. E-post till [email protected] skapa biljetter i "Support"-avdelningen.

Gmail-inställning (steg för steg)

1
Aktivera 2Stegverifiering

Gå till Google-konto > Säkerhet > 2-Step Verification och aktivera det.

2
Skapa ett App Password

Gå till Google-konto > Säkerhet > Applösenord. Välj "Mail" och "Övrigt (eller)OpsIQ) Kopia på 16 Karaktärslösenord.

3
Inträde i OpsIQ

Gå till e-post > Mailboxes > Add. Set värd: imap.gmail.com Port: 993 Kryptering: SSL, användarnamn: [email protected] Lösenord: Appens lösenord.

4
Testa testtest

Klicka på Test Connection. Om det är framgångsrikt kommer OpsIQ att börja omröstning för nya e-postmeddelanden i konfigurerat intervall.

Outlook 365 -inställning

1
Kontrollera IMAP är aktiverat

I Outlook-inställningar > Mail > Synkronisera e-post, se till att IMAP är aktiverat.

2
Använd app lösenord eller modern auth

Om MFA är aktiverat, skapa ett applösenord. Annars, använd ditt vanliga lösenord.

3
Inträde i OpsIQ

Värd: outlook.office365.com Port: 993 Kryptering: SSL Användarnamn: [email protected].

cPanel webbmail setup

1
Hitta IMAP inställningar

Inom cPanel > E-postkonton, klicka på ditt e-post konto för IMAP Inställningar.

2
Inträde i OpsIQ

Värd: vanligtvis mail.yourdomain.com Eller din server värdnamn, port: 993 (SSL) eller 143 (STARTTLS), användarnamn: fullständig e-postadress.

AI e-postutkast

När auto-reply är inställd på "Draft" -läge genererar AI svarsutkast som visas i Drafts kö. Du kan:

Granska

Läs utkastet och kontrollera noggrannhet.

Redigera

Ändra text, ton eller innehåll innan du skickar.

Skicka

Godkänn utkastet och skicka det som ett e-postsvar.

Avfärda

Ta bort utkastet om det inte är lämpligt.

Skicka automatiskt

Om förtroendet är tillräckligt högt och auto-sändning aktiveras skickas utkast automatiskt efter en konfigurerbar fördröjning.

Varför konverteras e-postmeddelanden inte till biljetter?+

Kontrollera: (1Är brevlådan ansluten och frisk? Leta efter grön status i e-post > Mailboxes.2) Är cron jobb igång? Email polling kräver cron.3Är e-post filtreras eller flyttas till en annan mapp än INBOX?

Kan jag använda flera brevlådor?+

Varje brevlåda kan kartläggas till en annan avdelning. [email protected] Gå till Support, [email protected] Går till Billing.

Stöd för support

Kundnöjdhet (CSAT)

CSAT mäter biljett och chatttillfredsställelse, ytor olyckliga svar och jämför AI och mänskliga resultat.

Produktskärm
KundnöjdhetCSAT-sidan kombinerar poängkort, detractor uppföljning, kommentarer, avdelning och agentuppdelningar och chattåterkoppling.KundnöjdhetWorkPayResponsessor386AVERAGE4.6POSITIVE91%Livet Arbetarspace VIEWDetractor uppföljning12 svar rankade1–2GranskaBiljettundersökningarSent 24h Efter näraAutomatiskFeedback från chattenAI 4.5 Mänskliga 4.7JämförVisa agentvyScore och response countCoach1WATCH AVERAGEAnvänd trend, inte en poäng2FOLLOW DETRACTORSLäs kommentaren3COMPARE FAIRLYAI och mänsklig
CSAT-sidan kombinerar poängkort, detractor uppföljning, kommentarer, avdelning och agentuppdelningar och chattåterkoppling.

Biljettundersökningar är schemalagda efter stängning (normalt 24 timmar senare) Ett positivt svar är en poäng av4eller 5Använd detractor kö för poäng av 1 eller2och läs biljetten/konversationen innan du kontaktar kunden.

Chattåterkoppling rapporteras separat för AI-lösta och mänskligt handlade samtal. Låga provstorlekar bör inte användas för att rangordna agenter eller modeller.

Stöd för support

Team e-postsändningar

Sidan E-postplattform låter en auktoriserad operatör skicka ett meddelande till alla aktiva agenter, utvalda agenter eller en avdelning och granska skicka historia.

Produktskärm
E-postplattformTeamets e-postkompositör visar publiken, ämnet, meddelandet och tidigare leveranshistorik.E-postplattformWorkPayRättsliga12DELIVERED11FEL1Livet Arbetarspace VIEWPublikAlla aktiva agenterValtÄmneJuli stöd rotaRedoMeddelandeSchema och eskaleringsanteckningarRedoHistoriaTidigare sändningar och resultatVisa vy1CHOOSE PEOPLEAlla, utvalda eller lag2WRITE CLEARLYSubject och meddelande3REVIEW HISTORYBekräfta resultat
Teamets e-postkompositör visar publiken, ämnet, meddelandet och tidigare leveranshistorik.

Denna sida är för interna operativa meddelanden, inte kundmarknadsföring. Välj den minsta korrekt publiken, förhandsgranskningsnamn och adresser, sedan skicka. Leverans använder konfigurerad utgående e-postväg och registrerar resultatet.

Stöd för support

Mailboxes, leverans och inkommande e-post

Konfigurera hur OpsIQ Skickar e-post, förvandlar inkommande meddelanden till biljetter och bevisar att sändningsdomänen är klar.

Produktskärm
E-postinställningarE-postinställningar kombinerar utgående routing, Från identitet, postbox ingestion, leveranskontroller och test e-post.E-postinställningarWorkPayUTGÅNGSMTP_MAILBOXES3DOMÄNPassar passLivet Arbetarspace VIEWFöredrar ConnectorSMTP /leverantörskontaktKonfigureradFrån identitetSupport <[email protected]>RedoIMAP mailbox[email protected] · InkorgenAvröstningLeveransSPF · DKIM · MARCPassar pass1CHOOSE OUTBOUNDAnslutning eller SMTP_2CONNECT INBOXIMAP eller pipa3TestSkicka och verifiera
E-postinställningar kombinerar utgående routing, Från identitet, postbox ingestion, leveranskontroller och test e-post.

Outbound e-post

Fullständiga administratörer kan välja den föredragna e-postkontakten; OpsIQ faller tillbaka till konfigurerad SMTP/mail leverans när så är lämpligt. Ange en igenkännlig från namn/adress, skicka ett test och kontrollera 24-timmars framgång / misslyckande mätvärden.

Brevlådor

En IMAP brevlåda behöver ett namn, e-postadress, målavdelning, värd, port, säkerhetsläge, användarnamn, lösenord, mapp, val av vald röstning och certifikatvalidering. Poll nu för att verifiera intag innan du väntar på krona.

Instant Piping

På samma server kan ett poströr passera det råa RFC822-meddelandet direkt. En fjärrpostserver kan POST det råmeddelandet till den skyddade inkommande slutpunkten med hjälp av dess token. Båda vägarna går in i samma deduplikation, trådning och biljettruttningspipeline.

Leverans

SPF/DKIM/DMARC-kontrollen är rådgivande bevis för den konfigurerade domänen. En grön kontroll garanterar inte inkorgplacering, men ett fel bör åtgärdas innan produktionsmeddelanden skickas.

Stöd för support

Supportportal för Studio

Support Portal Studio designar och publicerar kundanpassad supportupplevelse utan att kräva externa bildtillgångar.

Produktskärm
Supportportal för StudioPortal Studio visar en responsiv förhandsvisning tillsammans med tema, navigering, kunskap, biljett, assistent, form, sidfot och CSS kontroller.Supportportal för StudioWorkPayTEMPLATEModern modern modernaFörnyelseSkrivbordStäll enUtkastLivet Arbetarspace VIEWTemaBrandfärger och typografiRedigeraNavigeringKunskap, biljetter, assistentRedigeraBiljettformFält, routing och copyRedigeraPubliceraValidera och göra liveGranska1CHOOSE TEMPLATEBörja från struktur2PREVIEW SIZESDesktop till mobil3PUBLISH SAFELYGranska sedan release
Portal Studio visar en responsiv förhandsvisning tillsammans med tema, navigering, kunskap, biljett, assistent, form, sidfot och CSS kontroller.

Använd mallen som utgångspunkt, konfigurera sedan tema, layout, navigering, kunskapssökning, biljettformulär, assistent, sidfot, varumärke, automatbeteende, anpassad CSS och allmänna inställningar. Förhandsgranska skrivbordet, surfplattan och mobilen innan du publicerar.

Stöd för support

Kunskapsgap

Kunskapsgapet samlar in kundfrågor som AI inte kunde svara säkert så att teamet kan förbättra täckningen.

Produktskärm
KunskapsgapKlyftan rankas missade eller låga förtroendefrågor och spårar om laget har löst dem.KunskapsgapWorkPayOPEN GAPS28REPEATED9RESOLVED116Livet Arbetarspace VIEWMigrationsgränserFrågad 14 gångerHöghöghögSupport under helgenFrågad 8 gångerMediumÅterbetalningstidFrågad 6 gångerMediumAPI regionFrågad 3 gångerLåg1REVIEW QUESTIONSe konversation sammanhang2CHOOSE FIXArtikel eller prompt3RESOLVEVerifiera nästa svar
Klyftan rankas missade eller låga förtroendefrågor och spårar om laget har löst dem.

Öppna ett gap för att läsa den ursprungliga frågan och närliggande konversation, välj sedan rätt fix: uppdatera en befintlig artikel, skapa en ny kunskapsartikel, lägga till ett företag fakta, korrekta kontaktdata eller ändra upptrappningsinstruktioner. Markera det löste först efter en utvärdering eller verklig test returnerar ett acceptabelt svar.

Stöd för support

Status page Administration

Statusadministrationssidan kommunicerar servicehälsan och incidenter med hjälp av komponenter, aktuella tillstånd och uppdateringar.

Produktskärm
StatusadministrationStatusadministrationen listar komponenter och incidenter så att operatörerna kan publicera tydlig, tidsstämplad serviceinformation.StatusadministrationWorkPayOVERALLOperationellFörening7INCIDENTS1Livet Arbetarspace VIEWWebbplatsOperationellGröna gröntAPI_Försämrad prestandaTittaIntag av e-postOperationellGröna gröntNuvarande incidentAPI latensutredningÖppna1UPDATE COMPONENTVälj tydlig stat2POST INCIDENTTidsstämplade uppdateringar3RESOLVENära med sammanfattning
Statusadministrationen listar komponenter och incidenter så att operatörerna kan publicera tydlig, tidsstämplad serviceinformation.

Använd komponentstater konsekvent. När en incident påverkar kunderna, publicera ett första meddelande, lägga till tidsstämplade uppdateringar eftersom fakta ändras och nära med en kortfattad resolution sammanfattning. Använd inte statussidan som en intern fellogg; känsliga diagnostik hör hemma i OpsIQ och server loggar.

AI

Ställ in ditt AI

AI Configuration är där du väljer din AI-leverantör, modell och kostnadskontroller. OpsIQ Stöder flera leverantörer: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google) och Grok (xAI). API Nyckeln (nyckel)BYOK) eller hanterat AI om det finns tillgängligt på din plan.

Ställ in AI
AI-konfigurationEn AI-inställningspanel: en Managed-AI / BYOK leverantör växlar, en modellväljare och en månatlig token-budgetmätare.AI-konfigurationWorkPayAI-konfigurationLeverantörHantera AIDin nyckel (BYOK)ModellmodellKlaud · balanseradMånadsvis AI-budget62%1TWO MODESHanterad AI eller BYOK2PICK A MODELHastighet vs djup3BUDGETSTokentak och kostnadskontroll
Välj Managed AI eller din egen nyckel, välj en modell för hastighet vs djup och ta månadskostnader med en token budget.

Välja en leverantör

Claude (Storbritannien)Anthropic)

Stark resonemang, försiktig med fakta, bra på att följa komplexa instruktioner. Modeller: claude-sonnet-4-20250514 klaude-3.5-sonnet. Bäst för: stödja samtal, tekniska frågor, detaljerad analys.

GPT-4o (GPT 4o)OpenAI)

Snabb, kreativ, bra allmän kunskap. Modeller: gpt-4o, gpt 4o-mini. Bäst för: snabba svar, kreativt skrivande, breda kunskapsfrågor.

Gemini (Google)

Bra på faktiska frågor, flerspråkigt stöd. Modeller:gemini-2.0 Flash,gemini-1.5-pro. Bäst för: multi-language support, faktiska uppslag.

Gul (xAI)

Snabba, kortfattade svar. Modeller: Grack-3-mini-snabbt. Bäst för: snabba svar, casual ton.

BYOK vs Managed AI

BYOK (Ta med din egen nyckel)

Du ger din egen API _-nyckel från leverantören. Du betalar direkt leverantör. Full kontroll över val av modeller och användning.

Hantera AI

AI tillhandahålls som en del av din OpsIQ Plan. Nej API Nyckel behövs. Användning mäts mot din plan AI kreditbalans.

Steg för steg-installation

1
Gå till AI Configuration

I OpsIQ admin, navigera till Inställningar > AI-konfiguration.

2
Välj leverantör

Välj din AI-leverantör från nedgången.

3
Ange API nyckel

Om du använder BYOK Gå in i din API För Managed AI hanteras detta automatiskt.

4
Välj modell

Välj den specifika modellen att använda. Mindre modeller är snabbare och billigare. Större modell ger bättre kvalitetsbesparingar.

5
Testanslutning

Klicka på "Test-anslutning" för att verifiera API Nyckel och modell fungerar. Ett grönt checkmark betyder framgång.

6
Spara

Klicka på Spara för att aktivera din AI-konfiguration.

Kostnadskontroller

Månadsbudget

Ställ en maximal månatlig utgift på AI-tokens. När budgeten nås, har AI graciöst nedbrytning (kort svar, ingen auto-reply) snarare än att sluta helt.

Per-konversation token limit

Maximala tokens per enstaka konversation. Förhindrar runaway-konversationer från att konsumera överdrivna krediter.

Låg balans varning

När din AI-kreditbalans sjunker under tröskeln (standard: 50,000 tokens), visas en varning i admin. Ställ in detta i AI Configuration.

Per-workspace konfiguration

AI-konfiguration är per arbetsplats. Om du hanterar flera webbplatser kan varje arbetsyta använda en annan leverantör, modell och budget. Arbetsytan ärver globala standarder om inte överskridna. För att konfigurera per arbetsyt: byta till arbetsytan, gå sedan till AI Configuration och spara inställningar där.

Få API -nycklar

Anthropic (Claude)

Gå till console.anthropic.com > API Nycklar > Skapa nyckel. Kopiera nyckeln med "sk-ant-".

OpenAI (GPT)

Gå till platform.openai.com > API Nycklar > Skapa ny hemlig nyckel. Kopiera nyckeln med "sk-".

Google (Guds)Gemini)

Gå till aistudio.google.com > Få API Skapa en nyckel för ditt projekt. Kopiera nyckeln.

xAI (Grekland)

Gå till console.x.ai > API Nycklar. Skapa och kopiera din nyckel.

Testa din AI-installation

Scenario:
När du har angett din API -nyckel klickar du på "Test-anslutning". Du bör se en grön checkmark och ett provsvar från AI.
Vad ska man göra:

Om testet misslyckas: (1Kontrollera att API Nyckeln är korrekt (inga extra utrymmen).2) Kontrollera att ditt konto har fakturering inrättats med leverantören.3) Kontrollera att modellnamnet är giltigt.4Om du använder Managed AI, verifiera din licens är aktiv.

Vilken leverantör är bäst?+

Det finns ingen enskild bästa leverantör. Claude är utmärkt för supportsamtal. GPT-4o är snabb och mångsidig. Gemini hanterar flera språk bra. Försök var och en och se vilka som ger de bästa resultaten för ditt specifika användningsfall.

Kan jag byta leverantörer senare?+

Ändra leverantören och API _-nyckeln när som helst. Befintlig konversationshistorik bevaras. AI kommer att använda den nya leverantör för alla framtida samtal.

Vad händer när jag går ut ur krediter?+

AI försämrar graciöst: svaren blir kortare, auto-reply pauser och admin visar en låg balans varning. Core spårning, biljetter och CRM fortsätter att arbeta utan AI.

AI

Smartare & billigare kundchatt

En uppsättning opt-in kontroller som gör din kund chatta antingen smartare (det skäl över en kunds konto som en mänsklig agent) eller billigare (det skickar AI mindre, eller svar i färre steg). Varje kontroll är avstängd som standard och oberoende, vänder en på aldrig ändra något annat beteende. De flesta lever under Inställningar > Kundchatt > Behavior; några finns på Ställ in ditt AI och träna ditt A I.

Smartare svar (agentläge)

En vanlig chatbot svarar på en fråga från en uppslag. Agent läge på, kan assistenten göra flera lätta kontokontroller i en enda tur och korsreferens dem, t. ex. "har jag öppna biljetter, och är min balans nog för min nästa förnyelse?" besvaras i ett svar med matematiken gjort. Det engagerar bara för verifierade kunder på grund eller återbetala frågor; allt annat kör den normala enkelsvarsvägen.

Agent läge

Upp till några läsbara uppslag per tur, korsrefererad innan du svarar. Slå på när du har en ansluten plattform (WHMCS, Shopify, Stripe, Zendesk etc.). Off = dagens enlookup beteende, oförändrad.

Tänka djup för agenten svar

Hur svårt modellen motiverar på komplexa svängar (låg/medium/hög) Börjar på Låg; de flesta supportfrågor hanteras bra där.

Agent modell

Pins en starkare modell bara för komplexa agentvarvningar, så daglig chatt stannar på en ljus, billig modell och endast de hårda svängarna betalar för djup. Blank = din normala kundchattmodell.

Planera framåt · en-pass svar (beta)

Ett litet planeringssteg bestämmer vilka uppslag för att dra och om kunskapsbasen behövs, svarar sedan i ett huvudsamtal istället för flera steg. En underkamp under agentläge. Det kan inte aktiveras såvida Agent-läget är på. Samma svarkvalitet, färre samtal på flerpartsfrågor.

Konversation och förståelse

Långkonversation minne (beta)

Håller en kort löpning sammanfattning av äldre meddelanden (namn, biljett / fakturanummer, belopp, beslut) så assistenten förblir konsekvent över mycket långa chattar utan att skicka hela transkriptet. Bäst för stöd-tunga, långa trådar; par med agent läge.

Typo tolerans

Läser små typos ("mina öppna biljetter", "obetalda fakturor") som de avsedda orden så att rätt information hittas istället för missade. Arbetar med varje ansluten plattform. Av som standard; användbar för mobiltung chatt.

Lean konto sammanhang

Bara fäster kundens konto ögonblicksbild när frågan faktiskt handlar om deras konto (balans, fakturor, biljetter, tjänster), hoppa över det på allmänna frågor. Skärningar kostar utan kvalitetsförlust. Assistenten kan fortfarande hämta kontot live när en tur behöver det.

Kostnadsbesparing

Hoppa över kunskapssökning efter hälsningar (beta)

"Hej", "tack" och "ok" utlöser inte en kunskapsbassökning, dessa svar använder aldrig det. Alla meddelanden med verkligt innehåll söker fortfarande som vanligt.

Längsta svaret tillåtet (tokens)

Caps hur länge ett enda svar kan vara. Svara längd är den dyraste delen av ett samtal, så en förnuftig cap (runt 500 för support) är den enskilt mest effektiva chattkostnadskontrollen. Endast sänker din globala gräns, aldrig höjer den.

På Set Up Your AI

Tänka djup (kund och admin chat)

Hur mycket modellen tänker innan svaret (minimalt till högt) Håll kundchatt på minimal / låg för hastighet; reservera högre inställningar för analys och admin kopilot.

Per-AI modell (per jobb)

Varje AI-yta (levande chatt, biljettutkast, sammanfattningar, analys, admin kopilot, kampanjer, Site Intelligence och mer) kan köras på sin egen modell. Ljus där hastigheten är viktiga, starka där kvaliteten är viktig. Blank på en yta = leverantör standard för det jobbet.

Admin chat kostnadskontroller

Admin kopiloten kan hålla ett gränsat arbetsminne och ladda endast de verktyg som en fråga behöver (lean verktyg) i stället för varje verktyg varje tur.

På tåg din AI

Komprimerade instruktioner

Dina instruktioner skickas på varje tur, så deras längd är en återkommande kostnad. Komprimeringsknappen skriver om en slot för att säga samma sak i färre ord. Det vägrar skriva om det skulle släppa någon form av ord. {variable} eller regera, och rapporterar vad den skyddade, så det ändrar aldrig tyst mening.

"Vad som redan finns i hjärnan" (i )

Visar vad OpsIQ redan vet om ditt företag per slot, så att du kan ta bort allt du upprepade i dina egna instruktioner.

💡
Var går pengarna? För kort support chatta ingången (instruktioner + kontodata + historia, skickas varje tur) kostar vanligtvis mer än det korta svaret, cachning och magert sammanhang hjälpa mest där. För länge genererat innehåll dominerar utgången. Svarlängd cap och ett lägre tanke djup betala av där. Se Ställ in din AI för att hålla snabb cache på, vilket gör den stora upprepade delen av varje tur billigt.
Ändra hur chatten redan svarar?+

Nej. Varje kontroll är avstängd som standard och oberoende. Att stänga en på lägger bara till sitt beteende; att stänga av den returnerar chatten till exakt hur det fungerade förut.

Vilken ordning ska jag vända på dem?+

Kör vardagschatt på en ljus modell och stifta en starkare agentmodell. Sedan, om du har en ansluten plattform, aktivera Agent läge, sedan Plan framåt, då Långkonversation minne. Då lutar kontext, hoppa-KB-för-hälsningar och ett svar cap. Slutligen komprimera dina instruktioner. Titta några riktiga chattar efter varje förändring.

Admin Agent kit: webbsökning, runbooks, uppdrag, filöverföring

Admin AI-chatten är en arbetsingenjör, inte bara en frågebox. Det kan undersöka fixar på webben, hålla ett bibliotek av dina operativa procedurer, patrullera dina servrar på ett schema och flytta filer. De flesta av detta drivs genom att fråga efter det i chatt; den enda du konfigurerar framsidan är vilken webbsökningsleverantör som används, på inställningen din AI sida.

Web Search

Byggd i

Agenten söker webben för docs, felmeddelanden och aktuell information medan den fungerar. Av rutan använder detta DuckDuckGo, som inte behöver någon nyckel och ingen inställning.

Runbooks

I chatt

Ett sparat bibliotek av dina procedurer ("hur vi gör X här"). agenten skriver en efter att ha spikat ett knepigt jobb och följer det nästa gång, så know-how överlever slutet på chatten.

Uppdrag

Schemalagd

Planerade lättlästa patruller. "Varje morgon, kontrollera diskutrymme och felloggarna och berätta för mig."Finnselser anländer på din admin klockan.

Filöverföring

I chatt

Be om en loggfil och få en privat nedladdningslänk, eller ha en fil kopierad från en ansluten server till en annan. Båda capped på 5 MB.

Admin Agent Web Search (på Ställ in din AI)

Sökleverantör

Vad agentens webbsökning använder. Standarden är DuckDuckGo: Keyless, gratis, fungerar på varje installation. Brave Search, Tavily och Serper.dev (Googleresultat) returnerar vanligtvis bättre resultat, men varje behöver en API Nyckel från den leverantören. Om en nyckelleverantör misslyckas av någon anledning (dålig nyckel, kvot som används upp, nätverksproblem), faller sökningen tillbaka till DuckDuckGo automatiskt, så sök aldrig går mörkt.

Sök API _Nyckeln

Nyckeln till din valda leverantör, som bara behövs för Brave, Tavily eller Serper. När den har sparats maskeras den aldrig på sidan igen; klistra in en ny för att ersätta den. En nyckelperson blir aktiv endast när både leverantören och dess nyckel sparas.

Runbooks

När agenten precis har arbetat igenom ett jobb som du vill göra på samma sätt igen, säg "spara det som en runbook med namnet nightly-cleanup". Från och med då ser den runboken efter namn i varje session, och när du frågar efter jobbet efter namn (eller beskriver det) drar den fram stegen och följer dem.

💡
En runbook är vägledning, inte ett gratis pass. När agenten följer en, varje steg som skulle ändra en server går fortfarande igenom ditt nuvarande tillstånd läge och visar de vanliga godkännandekort. En runbok kan aldrig kringgå ett godkännande.

Uppdrag

Ett uppdrag är ett återkommande jobb agenten körs på egen hand: timly, dagligen i en viss timme eller vecka på en fastställd dag. Missioner läses bara av design. De kan läsa servrar, data och webben, men de kan aldrig ändra något; de undersöker och rapporterar. När ett uppdrag slutar landar fynden som en anmälan på din admin klockan. Säg "kör morgonpatrull nu" för att utlösa en på begäran, eller be agenten att lista, pausa eller ta bort uppdrag.

⚠️
Missioner kör av OpsIQ _-kronan, så det måste ställas in (se Cron och automatisering). En engångs "kör nu" från chatten fungerar även mellan cron körningar på de flesta servrar.

Flytta filer

Be om en fil ("få mig dagens fellogg från webbservern") och agenten iscensätter den och svarar med en privat nedladdningslänk. Länken fungerar bara för inloggade administratörer och löper ut efter ungefär en dag. filer är kapade på 5 MB För allt större, be agenten att komprimera eller trimma den på servern först.

Agenten kan också kopiera en enda fil mellan två anslutna servrar, igen upp till 5 MB Skrivet på destinationen behandlas som alla andra ändringar det gör: i fråga läge får du ett godkännandekort först, den befintliga filen säkerhetskopieras och kopieringen är reversibel. För säkerhet är filinnehållet återläst från källan när kopian tillämpas, inte tas från chatten.

AI

Träna din AI

AI utbildning är där du undervisar OpsIQ Hur man beter sig. Du skriver in omgångar som definierar personlighet, gränser, kunskapsfokus och eskaleringsregler. Tänk på det som att skriva en träningshandbok för ett nytt supportagent.

Tåg AI
Träna din AIEn AI-instruktion redaktör med klappar och vanlig engelska ton, alltid och aldrig regler.Träna din AIWorkPayKund AIAdmin AITon tonenVänlig, kortfattad, aldrig pushy.AlltidErbjud en mänsklig handoff för fakturering tvister.AldrigLova en återbetalning utan att kontrollera kontot.1TWO MANUALSKund & admin AI2PLAIN ENGLISHTon, alltid, aldrig3GROUNDEDPlus din kunskapsbas
Träna AI som en ny hyra, kund och admin handböcker skrivna på vanligt engelska (ton, alltid, aldrig), grundad i din KB.

Två utbildningsområden

Kund AI snabb

Kontrollerar hur AI talar med dina kunder i chatten widget. Detta är den viktigaste snabb att få rätt.

Admin AI-anmälan

Kontrollerar hur AI hjälper ditt administratörsteam i operatörens instrumentpanel. Detta hanterar interna frågor och handlingsutförande.

Skriva en bra kund AI prompt

Din kund AI-ansökan ska täcka dessa områden:

1
Identitet

Vem är AI? Ge det ett namn, roll och personlighet. Exempel: "Du är Luna, en vänlig och kunnig kundsupport assistent för Acme Store."

2
Ton och stil

Hur ska det kommunicera? Exempel: "Var professionell men varm. Använd enkelt språk. Undvik jargong. Håll svaren koncisa2-3 stycken max).”

3
Kunskapsgränser

Vad ska det veta och inte veta? Exempel: "Du vet om våra produkter, prissättning, frakt och returpolicy. Du vet INTE om konkurrentprodukter eller interna företagsbeslut."

4
Eskaleringsregler

När ska det lämnas till en människa? Exempel: "Escalate to a human agent when: the customer ask for a refund, nämner juridiska åtgärder, rapporterar ett säkerhetsproblem eller ställer samma fråga tre gånger."

5
Saker att aldrig göra

Hårda gränser. Exempel: "Låt aldrig återbetalningar. dela aldrig interna prissättningsformler. Skapa aldrig produktfunktioner som inte finns. Ge aldrig medicinsk, juridisk eller ekonomisk rådgivning."

Exempel på prompts

Exempel på kund AI prompt · online store
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
Exempel på kund AI prompt · hosting företag
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

Raffinera din snabb över tiden

1
Starta med grunderna

Börja med identitet, ton och nyckelgränser. Försök inte att täcka allt på dag ett.

2
Granska AI History varje vecka

Läs konversationer där AI gav fel eller suboptimala svar.

3
Uppdatera prompten

Lägg till specifika regler för återkommande problem. Exempel: om AI fortsätter lovande bidrag, lägg till "Låt aldrig en återbetalning. Säg att du kommer att eskalera till faktureringsteamet."

4
Lägg till kunskap

Om AI inte kan svara på en fråga, lägg till svaret på kunskapsbasen istället för att försöka passa allt i snabbmeddelandet.

⚠️
Håll din snabbhet under 2,000 ord. Alltför långa uppmaningar kan förvirra AI och öka tokenkostnaderna. Lägg detaljerad information i Knowledge Base istället.
Vad är skillnaden mellan snabb och kunskapsbas?+

Prompten definierar personlighet, gränser och regler. Kunskapsbasen ger faktisk information (produktinformation, prissättning, politik). AI läser både, men snabbformar beteende medan KB ger svar.

Kan jag ha olika prompter för olika avdelningar?+

Prompten är per-workspace. Om du behöver olika AI beteende för olika avdelningar, använda kunskapsbasen för att ge avdelningsspecifik information och nämna avdelningens sammanhang i din omgång.

AI

AI historia

AI History visar varje samtal som AI har haft med kunder och administratörer. Använd den för att granska AI-prestanda, hitta fel svar och identifiera träningsluckor.

AI historia
AI historiaEn logga av AI vänder med typ märken, frågan och svaret, svarstid och resultat.AI historiaWorkPayVarje AI vänder, inspeladchattQ: Var är min order?A: Skickas idag, UPS spårning...0.9sSvaradeBiljettbiljettFörslag till svar för T-12345återbetalningsbekräftelse utarbetad1.4sdraftedAdminSammanfattar veckans biljetter12-line sammanfattning returneras2.1sgjortchattQ: Avbryta min planHans hand till en människa0.7sescalated1EVERY TURNSnabbt, svar, åtgärd2SEARCHABLEFiltrera & exportera3OWNER-ONLYFull revision spår
Varje AI-vridning (chatt, biljettutkast, administratörsåtgärd) inloggad med exakt snabb, svar, varaktighet och resultat.

Vad varje konversation visar

Datum och tid

När samtalet hände.

Kundidentitet

Namn och e-post om det är känt, annars IP och land.

Kanal

Chatt widget, biljett auto-reply, e-postutkast eller admin AI.

Meddelanden

Full transkript av konversationen: kundmeddelanden och AI-responser.

Token användning

Hur många tokens konversationen konsumeras. Hög token användning kan indikera att AI ger alltför verbose svar eller samtalet gick i cirklar.

Åtgärder som vidtas

Alla åtgärder som AI utförde under samtalet (utseende på order, skapad biljett etc.).

Betyg

Om CSAT är aktiverat, kundens tillfredsställelse betyg för detta samtal.

Hitta problem

Sök efter sökord

Sök efter specifika ämnen för att se hur AI hanterar dem. Exempel: sök efter "återbetalning" för att kontrollera om AI följer din återbetalningspolicy.

Filtrera efter rating

Visa endast låga konversationer för att fokusera på missnöjda kunder.

Filtrera efter kanal

Visa endast biljett auto-replies för att granska automatiska svar separat från chatt.

Sortera genom token användning

Högtoken konversationer kan indikera problem: AI-rambling, går i cirklar eller misslyckas med att svara på frågan.

Veckovis revision rutin

1
Kontrollera låga konversationer

Läs hela utskriften. Vad gick fel? Var det en kunskapsgap, ett tonproblem eller ett felaktigt svar?

2
Kontrollera högtoken konversationer

Kan det tyda på förvirring. Var AI upprepa sig? Har det inte förstå frågan?

3
Uppdatera utbildning

För kunskapsluckor, lägga till artiklar i Knowledge Base. För beteendefrågor, uppdatera AI-prompten. För återkommande fel svar lägger du till uttryckliga korrigeringsregler.

Hitta kunskapsluckor

Scenario:
Du söker AI History för "installation" och hittar 15 samtal där AI sa "Jag har inte specifika installationsanvisningar för denna produkt."
Vad ska man göra:

Detta innebär att din kunskapsbas saknas installationsguider. Skapa kunskapsbaserade artiklar för varje produkts installationssteg. Efter att ha lagt till dem, testa genom att ställa AI-installationsfrågorna.

AI

AI insikter

AI Insights analyserar automatiskt konversationsmönster och ytor som kan mätas: vanliga frågor, tillfredsställelsetrender, kunskapsluckor och eskaleringsmönster.

AI insikter
AI insikter (Intelligence Hub)Intelligence Hub: en AI Today's Brief, Smart Alerts, ett Score-a-Lead / Analyse-A-Page-verktyg och ett AI Dagens korta, smarta varningar 14-Day Traffic Pattern diagram.AI insikterWorkPayDagens BriefTrafik upp 12%; 3 Heta leads;2Affärer behöver uppföljning.Smarta varningarCheckout fel spikadeStudsa upp på /pricingNytt hett bly från USAIntäkter före förra veckanBetygsätt en lead / Analysera en sidaIP eller URL…Kör14-Dag Trafikmönster1Dagens BriefAI skriver morgonsammanfattningen2SMART ALERTSAnomalier upplysta3ON DEMANDGör en bly · analysera en sida
Den verkliga Intelligence Hub: en AI-skriven Dagens korta, smarta varningar för anomalier, on-demand lead scoring och sidanalys, och den 14 Dagens trafikmönster.

Vilka insikter visar

Toppfrågor

De vanligaste frågorna.Om "Hur återställer jag mitt lösenord?" är #1Din kunskapsbas behöver en framträdande lösenordsåterställning guide.

Nöjdhetstrender

CSAT poäng över tiden. Är AI tillfredsställelse förbättra eller minska? Plötsliga droppar kan indikera en kunskap bas förändring som bröt något.

Upplösningshastighet

Vilken procentandel av samtalen löser AI utan mänsklig intervention? 70% Bra. Nedan 50% innebär att AI behöver mer utbildning.

Escalation skäl

Varför samtal delas ut till människor. Vanliga skäl: Kund begärde mänsklig, AI kunde inte svara, känslig ämne, faktureringsfrågan.

Kunskapsgap

Ämnen där AI ofta säger "Jag vet inte" eller ger lågt förtroende svar.

Genomsnittlig konversationslängd

Hur många meddelanden per konversation.Mycket långa samtal 10+ meddelanden) kan indikera att AI inte förstår frågan.

Använda insikter för att förbättra

Scenario:
AI Insights visar att 23% Av upptrappningar är "Kunden frågade om garanti" och AI kunde inte svara.
Vad ska man göra:

Detta är en klar kunskapsgap. steg: (1) Skriv en omfattande garantiartikel i kunskapsbasen som täcker alla garantivillkor, fordran process och uteslutningar.2) Uppdatera AI-prompten för referensgarantiinformation. (3Övervaka AI-insikter nästa vecka för att se om garantiupptrappningar minskar.

AI

Admin AI-spelplan

Admin AI (Fråga OpsIQ) hjälper ditt team att hantera OpsIQ inifrån admin instrumentpanelen. Du kan be den att titta upp data, förklara funktioner, sammanfatta biljetter och utföra plattformsåtgärder.

Admin AI
Admin AI-spelplanAsk-OpsIQ kommandobox med ett AI-föreslaget plattformshandlingskort som visar parametrar och bekräftar/avbryter.Fråga OpsIQWorkPayFråga OpsIQAvbryta tjänsten för överdue konto #4821AIFörslag: suspend_serviceKonto: ##4821 (försenad $120)plattform: WHMCS · reversibel · granskadBekräftelseAvbokning1ASK ANYTHINGPlain-engelska kommandon2PROPOSE FIRSTÅtgärd som visas innan den körs3YOU CONFIRMOmfattning & granskad
Berätta för admin AI vad du vill på vanligt engelska; det föreslår exakt åtgärd (sköljs, reversibel, granskas) och väntar på din bekräftelse.

Vad admin AI kan göra

Titta upp data

Fråga: Visa alla biljetter från [email protected]"eller" Vad är statusen för order #ORD-5523?"

Sammanfatta

Fråga: "Summarize the last 10 _" eller "Vad är de bästa supportproblemen i veckan?"

Förklara funktioner

Fråga: "Hur ställer jag in auto-reply?" eller "Vad betyder studsfrekvenskortet?"

Utför åtgärder

Fråga: "Skapa en biljett för [email protected] om fakturering eller "Stäng biljett T-12345"

Plattformsfrågor

Fråga: "Hur många besökare fick vi igår?" eller "Vad är våra intäkter denna månad?"

Exempel konversationer

Tittar upp en kund

Scenario:
Admin frågar: "Hitta kund [email protected] och visa mig deras senaste aktivitet"
Vad ska man göra:

AI ser upp kunden över alla anslutna datakällor: besökare sessioner, biljetter, chattkonversationer, order och CRM kontakter. Det returnerar en sammanfattning av den senaste aktiviteten med länkar till varje objekt.

Få en daglig sammanfattning

Scenario:
Admin frågar: "Vad hände idag?"
Vad ska man göra:

AI sammanfattar: "Idag hade du 245 besökare (upp 12%), 8nya biljetter (3 löst av AI),2nya order totalt $198 och1chatt eskalering om en fraktfördröjning."

Genomföra en åtgärd

Scenario:
Admin frågar: "Ändra biljett T-5523 prioritet till Urgent"
Vad ska man göra:

AI bekräftar: "Jag kommer att ändra biljett T-5523 Prioritet från Normal till Urgent. Detta kommer att påverka SLA-timern. Bekräfta?" Du bekräftar, och åtgärden utförs.

💡
Admin AI utför endast åtgärder som registreras i åtgärdsregistret. Det kan inte uppfinna handlingar eller åtkomstsystem utanför OpsIQ.
AI

Kund AI-scenarier

Detta avsnitt omfattar vanliga kund-mot-scenarier med förväntat beteende och träningstips.

Kund AI
Kund AI-scenarierEtt bibliotek med kundfrågor i kombination med det förväntade AI-beteendet och en utfallslapp för varje.Kund AI-scenarierWorkPayScenario-bibliotek · förväntat AI-beteendeVar är min order?»Titta upp ordern via kontakt, ge spårningLösning"Jag vill ha en återbetalning"Bekräftelse, lova aldrig · hand till en människaHandoff"Är tjänsten nere?"Kontrollera status, rapportera nuvarande tillståndStatus"Cancel my account" (avsnittligt mitt konto)Bekräfta avsikten, sedan väg till en människaBekräftelse1SCENARIOSVanliga frågor2EXPECTEDHur AI ska svara3TestHitta utbildningsgap
Ett bibliotek med verkliga kundfrågor och exakt hur AI ska hantera var och en, för att testa din träning och hitta luckor.

Scenario bibliotek

Beställningsstatusförfrågan

Scenario:
Kund: "Var är min beställning #12345?"
Vad ska man göra:

Förväntat AI beteende: (1) Titta upp ordern genom plattformskontakten. (2) Rapportera nuvarande status (bearbetning, levererad, levereras).3) Inkludera spårningsnummer om det finns tillgängligt.4) Om beställningen är försenad, bekräfta och ge beräknad tidslinje.5) Uppfinna aldrig spårningsinformation.

Lösenord återställ begäran

Scenario:
Kund: "Jag glömde mitt lösenord och kan inte logga in"
Vad ska man göra:

Förväntat AI beteende: (1) Ge lösenordsåterställningsstegen från kunskapsbasen. (2) Inkludera återställningslänken eller sidans sökväg. (3) Påpeka att återställningsmailet kan ta några minuter.4) Föreslå att du kontrollerar spam-mappen. (5Om kunden fortfarande inte kan återställa, eskalera till en människa.

Funktion för begäran

Scenario:
Kund: "Kan du lägga till mörkt läge i mobilappen?"
Vad ska man göra:

Förväntat AI beteende: (1) Tack för förslaget. (2) Förklara hur funktionsförfrågningar hanteras (loggade, granskade, prioriterade). (3) Låt inte funktionen byggas. (4) Om en liknande funktion finns, nämn det.

Billing Dispyt

Scenario:
Kund: "Jag debiterades men min tjänst fungerar inte"
Vad ska man göra:

Förväntat AI beteende: (1bekräfta frustrationen.2Kontrollera servicestatus om möjligt. ()3) Skala till faktureringsavdelningen med alla detaljer.4Lös inte en återbetalning.5) Ställ in biljettprioritering till High.

Off-topic fråga

Scenario:
Kund: Vad är vädret som i London idag?
Vad ska man göra:

Förväntat AI beteende: (1) Polit omdirigera. "Jag är din [företag] supportassistent och kan hjälpa till med frågor om våra produkter och tjänster. För väderinformation, prova en vädertjänst."2Fråga om de har en produktfråga.

Hur testar jag kundens AI-beteende?+

Öppna din webbplats i en privat / incognito webbläsare och chatta med AI som kund. Prova vanliga frågor, kantfall och adversariella scenarier. Kontrollera att AI följer dina snabba regler och använder kunskapsbasinnehåll korrekt.

AI

AI kunskapsbas

Knowledge Base är ett bibliotek med artiklar som AI använder för att svara på frågor. När en kund frågar något söker AI kunskapsbasen för relevanta artiklar och använder dem för att generera ett korrekt, grundat svar.

Kunskapsbas
KunskapsbasKällor som matar in i en kunskapsbutik, sedan genererar ett AI-grundat, citerat svar.KunskapsbasWorkPayKällorWebbplats crawlHjälp artiklarVanliga frågor och svarImporterade docsKunskapsemantiskt + nyckelordAIGrounded svarmed en citerad källa."Refunds tar 3–5affärsdagar.”1INGESTCrawl, FAQ, import2RETRIEVESemantiskt + nyckelord3GROUNDEDSvar från ditt innehåll
Crawl din webbplats och importera docs till kunskapsbasen; AI hämtar rätt bitar och svar, grundade och citerade.

Hur det fungerar

1
Kunden ställer en fråga

Vad är din returpolicy?

2
AI söker kunskapsbasen

OpsIQ hittar artikeln "Return Policy" genom att matcha sökord och semantisk betydelse.

3
AI genererar ett svar

AI läser artikeln och skriver ett naturligt språk svar baserat på artikelinnehållet.

4
Kunden får ett korrekt svar

Svaret är grundat i din faktiska policy, inte AI: s allmänna utbildningsdata.

Skapa bra artiklar

Ett ämne per artikel

Skriv en separat artikel för varje ämne: returpolicy, frakträntor, kontoinställning, lösenordsåterställning. Förena inte orelaterade ämnen.

Skriv som en FAQ

Börja med att fråga kunderna ställer, ge sedan svaret. Detta hjälper AI match frågor till artiklar.

Var specifik

”Returneringar måste initieras inom 30 leveransdagar” är bättre än ”Vi har en returpolicy”.

Inkludera edge fall

Vad sägs om internationell avkastning? Vad sägs det om digitala produkter? Vad händer med föremål som köpts till försäljning? Täck undantagen.

Håll det aktuellt

Granska artiklar kvartalsvis. Ta bort föråldrad information. Uppdatera prissättning, policyer och procedurer när de ändras.

Startar artiklar du bör skriva

Frakt och leverans

Fraktkostnader, leveranstider, spårning, internationell sjöfart och hantering av förseningar.

Returnerar och återbetalningar

Returnera fönster, förhållanden, process, återbetala tidslinje och undantag.

Kontohantering

Lösenordåterställning, e-poständring, kontoavdrag och dataexport.

Prissättning och fakturering

Planbeskrivningar, faktureringscykel, betalningsmetoder, faktureor och valuta.

Produktguider

Hur man använder varje produkt eller funktion. Steg-för-steg instruktioner med skärmdumpar.

Felsökning

Vanliga problem och lösningar. Felmeddelanden och deras fixar.

Kontaktinformation

Affärstider, supportkanaler, svarstid och eskaleringsvägar.

Rättslig och efterlevnad

Sammanfattning av sekretesspolicy, villkor för sammanfattande av tjänster, GDPR dataförfrågningar.

Connector kunskap

Varje kontakt kan bidra med kunskap till AI. När en anslutning är aktiverad, dess inbyggda kunskapsartiklar (produktkatalog, gemensamma frågor, plattformsspecifik felsökning) är automatiskt tillgängliga för AI:n. Du kan växla anslutningskunskaper på eller av per kontakt i Connector-inställningarna.

Tokenbudget

Kunskapsbasen har ett konfigurerbart tokentak (standard: 32,000 -tokens) som styr hur mycket kunskapssammanhang skickas till AI per samtal. Om din kunskapsbas är mycket stor väljer AI de mest relevanta artiklarna inom denna budget. Öka taket om AI inte hittar relevanta varor; minska det om du vill minska tokenkostnaderna.

Hur många artiklar ska jag ha?+

Börja med5-10 Artiklar som täcker dina vanligaste frågor. Lägg till mer när du identifierar luckor genom AI-historik och AI Insights. De flesta företag behöver 20-50 Artiklar för omfattande täckning.

Kan jag importera artiklar från ett annat system?+

För närvarande skapas artiklar manuellt i OpsIQ Du kan kopiera innehåll från befintliga FAQs, hjälpa centra eller dokument.

Vilket format ska artiklar vara i?+

Plain text fungerar bäst. AI förstår naturligt språk bättre än strukturerat HTML eller markdown. Skriv som du skulle förklara för en kund.

AI

AI utvärdering och Watchtower

Utvärdering ställer kritiska kundfrågor till repeterbara tester för svar kvalitet, citationer, eskalering och åtgärdssäkerhet.

Produktskärm
AI utvärderingAI Evaluation listar gyllene testfall, nödvändiga beteenden, senaste resultat och schemalagda Watchtower körningar.AI utvärderingWorkPaySETS6CASES84PASS RATE96%Livet Arbetarspace VIEWFraktpolitikCitation krävsPassar passÅterbetalningsförfråganMänsklig bekräftelse krävsPassar passOförklarat kravFörbjudna åtgärderPassar passMigrationsfrågaFörväntad källa saknasMisslyckades1CREATE CASESGyllene input och regler2RUN SAFELYTorr kör eller levande utvärdera3WATCHSchemalägg dagligen eller veckovis
AI Evaluation listar gyllene testfall, nödvändiga beteenden, senaste resultat och schemalagda Watchtower körningar.

Fullständiga administratörer kan skapa utvärderingsuppsättningar med en snabb, förväntad källmärkning, nödvändiga citat, human-bekräftelse regler, upptrappningsförväntningar och förbjudna åtgärder. Kör en direkt, torr kör den eller spela om utvald historia.

Vakttornet scheman dagliga eller veckovisa kontroller genom krön och kör ett begränsat antal fall (upp till åtta per planerad pass). Granska misslyckanden tillsammans med leverantör / modell, snabb version, kunskapsversion, föreslagna åtgärder och kostnader innan du ändrar produktionsbeteende.

AI

Språk och översättning

Språk hanterar översatt kundinriktad text och det beteende som används när OpsIQ följer kundens språk.

Produktskärm
SpråkSpråksidan visar källspråket, översatta språk, utkast/levande tillstånd och kundspråk beteende.SpråkWorkPayKÄLLAEngelskaLANGUAGES4Levande3Livet Arbetarspace VIEWFranskaInterface och innehållLivet LiveTyskaInterface och innehållLivet LiveSpanskaFörslag till översättningUtkastFölj kundSvara på detekterat språk1SET SOURCEUrsprungligt operatörsspråk2ADD LANGUAGEÖversättning i bakgrunden3PUBLISHDraft eller live
Språksidan visar källspråket, översatta språk, utkast/levande tillstånd och kundspråk beteende.

OpsIQ Översätt operatörsinmatade kundanpassningstext. Ställ in källspråket korrekt innan du skapar översättningar, lägg till målspråk och granska sedan utkasten innan du publicerar. "Följ kundspråk" styr svarsspråk; översätta widgetgränssnittet kontrollerar dess knappar, etiketter och systemtext.

Översättningsområdet kan vara utkast till endast eller leva. Förlita dig inte på maskinöversättning för juridisk, återbetalning, säkerhets- eller säkerhetstext utan mänsklig granskning.

Varje plats som håller din egen formulering är listad med sitt meddelandeantal: klientchattmeddelanden, kampanjer, proaktiva meddelanden, chatflöden, guidade turer, tillkännagivanden, teaserbubblor och Undersökningar och formerUndersökningsytan täcker varje publicerad undersökning helt: titel, varje fråga, varje svaralternativ, knappar, välkommen och tack-du kopiera, sidokrom och resultatsidor. Nycklar är knutna till fråge-ID och optionsvärdet, så omordnande frågor eller alternativ förlorar aldrig en översättning och ombeställer ett meddelande omöversätter bara det meddelandet. Publicerade liveundersökningar erbjuds som standard; utkast går med när du bredder omfattningen.

Post-chatt e-postundersökning följer språket besökaren faktiskt chattade in, förutsatt att språket är ett du erbjuder här; annars använder det ditt systemspråk. Dess sex redigerbara fält översätts på denna sida också, och beteendet har sin egen switch i kundchattinställningar.

Biljett och portalmeddelanden täcker de fasta textoperatörerna typ en gång varje kund får sedan på det ett språk: biljettbekräftelsen, öppnade, slutna och återkopplingsbekredelser, per-department sign-offs och portalen välkomstlinje. (AI behöver automatiskt svaret inget av detta, det svarar redan på kundens språk.) Med E-postkunder på sitt eget språk aktiverad in OpsIQ Skriva, biljett e-post löser mottagarens språk i denna ordning: det språk de plockade i portalen eller Hjälpcentret (bär på biljett), lokalen på deras kontaktrekord, sedan det språk som de skrev in, upptäcktes lokalt av manusintervall och markör ord, utan externt samtal. Endast språk som valts på sidan Språk används någonsin, så funktionen är trög tills språken läggs till. HTML e-post wrapper är medvetet inte översatt: det är markup, inte prosa. Personal-facing e-postadress (meddelanden, avdelningsvarningar, analytiker briefs, schemalagda rapporter, veckosmältningen) använder alltid systemspråket.

PeopleOS HR

PeopleOS: det styrda operativsystemet för arbetskraft

Kör arbetstagarlivscykeln från rekvisition till offboarding med mobil självbetjäning, evidensstödda arbetsflöden, skrivna integrationer och mänsklig kontroll över känsliga beslut.

Interaktiv systemkarta
PeopleOS livscykel kommandocenterEn tredimensionell PeopleOS-instrumentpanel som länkar till rekrytering, anställda, löneskrivning, lärande och styrt AI.PeopleOS kommandocenterEvangelieleverFolk248Öppna regler12Kontrollera portar15 / 15LifectycleRekryteringHireVäxaBelöningÖvergångEn RECORDIdentitet + anställningsbevisMänniskans kontrollÖverklagande, korrigering, övertagandeFörtrolla detOutcome och release bevis
PeopleOS håller livscykeln, kontrollerna och bevisen på en styrd post.

Administratörer

Operatör

Hantera människor, organisation, rekrytering, ombordstigning, dokument, lämna, löneförsoning, förmåner, prestation, lärande, anställd relationer, analys och styrning.

Anställda och chefer

Självbetjäning

Använd en mobil-första portal för privata register, förfrågningar, dokument, ombordstigning, tid, betala förklaringar, lärande, företagsinformation och rättigheter.

Utvecklare

Förlängning

Använd den curerade hr.* åtgärder och de granskade platform.hr.* verksamhet genom ett kontrakt, plus typade kontaktklasser. Det genererade indexet i avsnittet PeopleOS API listar var och en med dess omfattning.

⚠️
PeopleOS är inte en löneförbud, juridisk rådgivare, bakgrundskontrollbyrå eller identitetsleverantör. Certifierade externa system behåller dessa ansvarsområden. En grön teknisk kontroll skapar aldrig rättsligt godkännande eller bevis för leverantören.

Få PeopleOS HR

PeopleOS HR ingår i Enterprise-planen. På alla andra betalda planer är det ett tillägg: kontoägaren öppnar Konto→Add-ons och Tokens, plockar en PeopleOS HR-nivå och antingen startar den fria rättegången eller lägger till det direkt. Tiderna skiljer sig åt i hur många människor och hur mycket rekrytering, intervju och AI-aktivitet de bär. Priser och gränser sätts på kontot, inte skrivna in produkten, så se aktuella nivåer på Prissättning sidaVad modulen gör, yta efter ytan, är på PeopleOS HR produktsida.

Vem kan lägga till den

En betald plan som är aktiv. En fri plan kan inte lägga till den, och en betalda plan som fortfarande finns inne i sin egen plan försök måste vänta tills rättegången slutar.

Den fria rättegången

Rättegången körs på nivån du väljer. När det slutar utan ett köp tar rätten bort och ingenting laddas ut. Ingenting raderas: posterna finns där igen när tillägget läggs till.

När den inte ägs

PeopleOS HR visas inte i sidofältet, kommandotpaletten, Inställningarna eller in-app hjälp. En direkt länk till en HR sida erbjuder tillägget istället för sidan.

Nå en tier cap

När en gränsnivå nås sidan erbjuder nästa nivå. Redigera eller ta bort det som redan finns är aldrig blockerat.

Självvärderade installationer

Berättigandet reser i licensen. Lägg till tillägget på ditt OpsIQ -konto och installationen hämtar det vid nästa licenskontroll.

Första veckans installation

Allt nedan är en riktig skärm, ingenting här behöver en utvecklare.

1
Vänd modulen på

Öppna PeopleOS → HR HomeFlaggbrädan börjar med huvudbrytaren, PeopleOS HRMed det av ingen HR-sida eller anställd yta är nåbar. Att slå på en switch är en tvåklicksbekräftelse; stänga av ett klick. AI-skivan slår under den (utarbeta hjälp, applikationsscreening, autonoma assistenter, AI intervjuer, automatisk erbjudande skicka, identitetsverifiering) stanna upp tills du bestämmer dig.

2
Låt Setup Copilot göra konfigurationen

Öppna PeopleOS→Setup Copilot och säg vad du vill ha på vanligt språk: en ledighetspolicy med sina dagar och meddelande, helgdagar för ett land, en fallkategori med sin SLA, en kostnad cap, en ombord mall, en månatlig puls. Du får planen tillbaka med vad den förstod och vad det antog. Ingenting går tills du bekräftar; ett medelhögt steg behöver en andra person; varje körning lämnar ett kvitto.

3
Namn på den anställde portalen

Öppna PeopleOS→Frontline→Sign-in designPå en självhäftad installera portalen liv på /hr/<address>; Portal adress Skriker det omedelbart och gamla inloggningslänkar fortsätter att fungera eftersom den gamla adressen vidarebefordrar. På molnet portalen är /hr på din arbetsplats värd och behöver ingen adress.

4
Publicera din karriärs webbplats

Öppna PeopleOS→RekryteringVarje inlägg du publicerar från en godkänd requisition visas på den offentliga karriärsidan; länken Öppna den offentliga karriärssidan Högst upp på Recruiting visar exakt vad en kandidat ser.

5
Registrera en kiosk för delade enheter

Öppna PeopleOS→Frontline→Kiosks och välja Registrera en kioskEnheten token visas en gång; öppna kiosk sidan på tabletten eller PC (det är /kiosk på portalen värd) och klistra in det. Människor klockar in med sitt arbete e-post och PIN, eller med kortlivad märkekod från sin portal. Återkalla en kiosk stoppar enheten samtidigt.

6
Bestäm vad anställda kan göra för sig själva

Öppna Inställningar → HRVarje självbetjäningskraft (inspelningar, förfrågningar, dokument, lämna, betala förklaringar och så vidare) är inställd på varje anställd, chefer bara eller ett lag och team under det. Varje förändringsrekord som gjorde det och varför, och en kraft du stänger av förklaras för den anställde snarare än tyst saknas.

7
Lägg till personer och ge dem tillgång

PeopleOS → Folk skapa personen, deras anställning och deras chef. Tillhandahållande portal åtkomst endast när personen har ett giltigt e-postmeddelande och en avsedd anställningsförhållande; inbjudan går ut från samma skärm och ombordstigning börjar från den resa du ställer in.

Livscykeln

Planera och rekrytera

Skapa godkända krav, publicera jobb, ta emot ansökningar genom återförfrågningssäkra webhooks, strukturrecensioner, schemaintervjuer, rekordbeslut, utfärda erbjudanden och hyra.

Gå med och tillhandahålla

Bygga bevis-backade ombordstigningsresor, samla rätt dokumentversion, begär utrustning, bevilja godkända åtkomstmallar och tillhandahålla platslös portalåtkomst.

Arbeta och växa

Operativ ledighet, scheman, löneförklaringar, förmåner, kostnader, mål, feedback, recensioner, lärande, färdigheter, interna möjligheter, succession och workforce analys.

Stöd och skydd

Ge privat HR-stöd, styrda arbetstagarrelaterade fall, rättsliga innehav, dataförfrågningar, korrigering, förklaring, överklagande och oberoende mänsklig granskning.

Förändring och ledighet

Använd effektiva daterade anställningsförändringar, återkalla åtkomst, återvinningsutrustning, förena externa leverantörer, tillämpa lagring och bevara nödvändiga bevis.

Tillgång och identitet

En kanonisk person äger anställningsregister och verifierade externa identitetsfasetter. E-post är ömsesidig kontaktdata, aldrig den permanenta identitetsnyckeln. Portalläsare är självutformade; chef och administratörsvyer kräver uttryckliga behörigheter. API omfattningar skikt ovanpå rutten behörigheter och aldrig kringgå dem.

Lägg till en ny arbetstagare

Scenario:
Skapa personen, tilldela sysselsättning och chef, tillhandahålla portalåtkomst och öppna sedan ombordstigningsresan.
Vad ska man göra:

Använd torrtyr och idempotens för API skriver. Bekräfta att personen har ett giltigt e-postmeddelande och avsett anställningsförhållande innan du skickar åtkomst.

Lös en dubblett identitet

Scenario:
Två externa system identifierar samma arbetare annorlunda.
Vad ska man göra:

Länka båda verifierade aspekter till den kanoniska personen och lösa konflikten uttryckligen. slå inte samman register bara för att två mutable e-post värden matchar.

PeopleOS HR

HR arbetsflöden och anställdas portal

Hur varje större PeopleOS-område drivs och vad anställda ser efter inloggning.

Människor och organisation

Behåll den kanoniska personen, sysselsättningen, arbetstagartypen, chefen, teamet, platsen, färdigheterna, dokumenten och en effektiv organisationsstruktur.

Rekrytering och erbjudanden

Flytta från godkända krav på utstationering, ansökan, strukturerade bevis, intervju, beslut, erbjuda och hyra med boende och överklagande vägar.

Inombord och dokument

Tilldela beställda ägarspecifika steg; samla in, granska, signera, löpa ut, hålla och ta bort dokument med version och åtkomstbevis.

Tid, lämna och schemalägga

Definiera policystödda ledighetstyper, balanser, förfrågningar, godkännanden, semester, tillgänglighet, kalenderhändelser och försoning.

Betalning, förmåner och utgifter

Förklara lön, hand godkända arbetstagare händelser att lönelista, försona undantag, hantera fördelar berättigade och styr ersättningar.

Prestanda och tillväxt

Operativa mål, incheckningar, feedback, recensioner, kalibrering, lärande, färdigheter, mentorskap, interna möjligheter och succession.

HR-tjänst och relationer

Ge anställda privat stöd samtidigt som du behåller klagomål, disciplin, visselblåsare och förseglade fallbevis i dedikerade tillståndsgränserna.

Analys och planering

Använd arbetskraftsåtgärder, huvudkontoplaner, riktmärken och erfarenhetsmätningar som härrör från poster; aldrig dra slutsatser om saknade resultat som framgång.

Anställd Portal karta

Översikt

Behov av din uppmärksamhet, förändringar sedan det senaste besöket, öppna förfrågningar, kommande evenemang, ombordstigning framsteg och tillkännagivanden.

Profil och register

Anställning, verifierad post, dokument, behörigheter, sekretessförfrågningar och korrigeringsförfrågor.

HR Support och uppgifter

Privata samtal, förfrågningar, åtgärder som behöver den anställda och företagsägda uppgifterna visas separat.

Dina första dagar

Bevis-stödda ombordstigningstidslinjen med ägare, due state, slutförande och blockerat arbete.

Tid och ledighet

Balanser, lämna förfrågningar, tillgänglighet, scheman och kalenderkonsekvenser.

Färdigheter och tillväxt

Lärande, skicklighet bevis, mål, feedback, mentorskap och interna möjligheter.

Min lön, förklarad

Försoningsinformation för vanliga ersättningar och löneförsoning som den anställde får se.

Företag

Katalog och organisationsdiagram begränsat till informationskollegor har valt eller policy tillåter dem att dela.

Rättigheter och beslut

Förklaringar, överklaganden, samtycke, korrigering, åtkomst och raderingsförfrågningar.

💡
Portalen är mobil-först. Kontokortet förblir tillgängligt, navigering och innehållsrulle oberoende på breda skärmar och överlagringar av mobilnavigation snarare än att trycka eller täcka sidan. Lång förklaringskopia hör hemma i tillgängliga verktygs- eller avslöjandekomponenter.

Säker driftssekvens

1
Konfigurera policy och behörigheter

Ställ in jurisdiktion, roller, godkännandevägar, lagring, samtycke och funktionskontroller innan du laddar live-poster.

2
Anslut externa leverantörer

Installera lämpligt signerat paket, ange minsta säkerhetsuppgifter och passanslutning och överensstämmelse tester.

3
Kör i sandlåda eller skugga

Öva fulla arbetsflöden med deterministiska data och jämför förväntade bevis innan du aktiverar utförande av verkliga leverantörer.

4
Släpp under dubbel kontroll

En annan auktoriserad granskare undersöker leverantör, säkerhet, integritet, juridiska, rättvisa och tillgänglighetsbevis.

PeopleOS HR

AI, rättvisa, video och juridiska kontroller

PeopleOS behandlar automation som en styrd verktygsväg: policytillstånd, försök till utförande, leverantörsresultat och bevis är separata fakta.

AI och agentkontroller

Varje agent använder registrerade skrivverktyg med ett syfte, jurisdiktion, riskklass och maximal autonomi. Mänsklig övertagande, kretsbrytare, incidenter och jurisdiction förändringar stoppa utförande. Korrigeringar kan bilda en föreslagen datamängd men träna ingenting tills en annan behörig person slutför sekretessgranskning.

Rättvisa

Definiera kohorter, minimiprovregler, mätvärden, evaluatoridentitet och en juridiskt släppt utvärdering. saknas data förblir saknad; det omvandlas aldrig till ett pass.

Förklaringar och överklagande

Bygg förklaringar från förseglat beslut och politiska bevis. Skicka vädjar till en oberoende människa och bevara resultatbevis.

Jurisdiktioner

Frigör landspolitik packar endast med en namngiven juridisk ägare, citerade rättsliga källor och passerar tester. Höga lagändringar avbryter drabbade körfält.

EU AI Act

Behåll systeminventeringen, riskklassen, fundamental-rättigheter konsekvensbedömning, meddelanden, övervakare, mätning och bevis.

Video screening gräns

Tillhandahållande är inte deltagande

hr.interview.room.provision skapa en mötesplats. hr.interview.room.connect kan bevisa att media nådde arbetaren.

Syfte-specifikt samtycke

Inspelning, transkription och biometrisk livlighet är separata val. Uttag gäller för det valda syftet.

Ingen utseendeanalys

Videokontraktet har inget fält eller metod för känslor, uppmärksamhet, attraktivitet, ras, funktionshinder eller utseende inferens.

Mänskliga och textrutter

En granskare kan ta över permanent för sessionen, och en text boenderutt är tillgänglig.

Behållande och radering

Anslutningen rapporterar krypterad transport, aktiv lagringspolicy och leverantörsmediereferenser och måste stödja kontrollerbar radering.

Rum skapat, AI frånvarande

Scenario:
En Zoom rumURLfinns, men mediebron har inte levererat ljud/video till intervjuarbetaren.
Vad ska man göra:

Visa mötet som bestäms och AI deltagande som falsk. Håll den mänskliga intervjun och text boende vägar tillgängliga.

Callback säger att en check passerat

Scenario:
En signerad bakgrundskontroll webhook rapporterar slutförande.
Vad ska man göra:

Spela in återkopplingen som en antydan, fråga sedan leverantören. Endast det autentiserade statussvaret kan uppdatera kontrollen.

🚫
En teknisk tillgänglighetsutvärdering kan registreras av dess utvärderare, men WCAG-intyg kräver en separat person. Provider bevis, juridisk frigivning och rättvisa bevis kräver också sina äkta namngivna ägare.
PeopleOS HR

PeopleOSAPIoch connector development

Använd General API för styrda HR-verksamheter och skrivna kontaktkontrakt för auktoritativa externa system.

Allmänt API källor till sanning

SkickaJSONatt POST /api/v1.phpUpptäck den löpande ytan genom meta.actionsOpenAPI på /api/v1/openapi.phpoch Postman på /api/v1/postman.phpDet genererade indexet nedan bär det exakta antalet kuraterade hr.* åtgärder och granskade platform.hr.* operationer i denna byggnad, så ingenting på den här sidan är skriven för hand.

Lista folk
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}'
Torr-kör en skriv
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}'

Användning hr.read eller hr.write endast efter behov. måladministratörsrutten kontrollerar fortfarande sitt eget tillstånd. Writes kräver en stabil idempotency-nyckel; högriskskrivare kräver bekräftelse. Retry övergående misslyckanden med samma nyckel och frågeåterställningstillstånd efter en osäker tidsperiod.

Varje curated hr.* åtgärd

48 curated hr.* actions (22 reads, 26 writes) and 484 reviewed platform.hr.* operations, out of 2420 named actions in this build. Generated from the action registry, the same source as meta.actions, OpenAPI and Postman.

Människor, organisation och identitet (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.

Krav och inlägg (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.

Lämna, lärande och kontaktmarknaden (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.

Connector certifiering och hälsa (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.

Intervjurum (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.

Agenter och livscykelbanor (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.

Behörighet (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.

Beslut och överklaganden (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 kvalitet (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.

Workforce konversationer och retention (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.

Beredskap och release (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).

Connector klasser

Rekrytering

hr_job_board, hr_background_check, hr_identity_verification, hr_assessment och hr_tax_right_to_work.

Hyra och ombordstigning

hr_esignature, hr_calendar, hr_video och hr_equipment_it.

Workforce verksamhet

hr_payroll, hr_benefits, hr_learning, hr_expense_payment, hr_directory och hr_data_warehouse.

Kommunikation

hr_messaging är endast sändning. Kontraktet innehåller ingen metod för läsning av arbetstagare.

Leverantör Gateway endpoints

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

Gateway kräver HTTPS, blockerar osäkra / privata mål, stift validerade DNS resultat, följer inga omdirigeringar, begränsar svarsstorleken, kräver JSON, bär denerministisk idempotens och stöder tidsstämplade HMAC I båda riktningarna. Webhooks är alltid ledtrådar följt av leverantörsförfrågan.

Inkommande webhook dörrar

Tre offentliga dörrar får återkoppling av leverantörer: POST /opsiq/ajax_api.php?ajax=hr_connector_webhook (fält) connector_class, connector_key, topic), ?ajax=hr_esign_webhook (connector_key, offer_uuid, provider_ref) och ?ajax=hr_check_webhook (check_uuidVarje verifierar kroppen genom den certifierade kontakten, bränner leveransen så att en replay dör och registrerar bara en väntande återfråga; leverantörens eget svar ändrar posten. Varje vägran är samma generiska svar på ändamålet. PeopleOS levererar inga utgående webhook händelser idag: webhooks.events.list är myndigheten och namnen som ingen i hr Familj, så undersökning av hr.* Läser eller använder hr.connectors.health.

Detaljerade referenser

Fullständig PeopleOS handbok

Läs mer doc/contracts/PEOPLEOS_HR.md i en självhäftad installation för varje operatör,API, connector, webhook och release rule.

Gateway utvecklarkontrakt

Marketplace-paketet innehåller README.md, DEVELOPER.md, connector_contract.json, hr_profile.json och en signerad fil manifesteras.

PeopleOS HR

Testning och produktionsberedskap

Ett lanseringsanspråk beräknas från bevis. Paketberedskap, leverantörscertifiering, rättsligt godkännande, rättvisa utvärdering och tillgänglighetsbetygelse är avsiktligt separata.

1
Validera kod och kontrakt

Kör PHP syntax, HR PHFUnit, rutt/APIparitet, OpenAPI/Postman kontroller, paket manifest ochJSONSchema validering.

2
Övning fulla arbetsflöden

Test rekrytering, AI-granskning, intervju / video, ombordstigning, signaturer, lämna, lönelista, portal, meddelanden, modaler och kontakt misslyckande vägar.

3
Test responsivt och tillgängligt UI

Kör skrivbord, surfplattor och telefonlayouter; tangentbord, fokus, etiketter, kontrast, reflow, verktygspetsar, dialoger, anmälningsrulle och oberoende navigering.

4
Samla externa bevis

Använd verkliga leverantörsrundturer och radering, juridiska politiska utgåvor, representativ rättvisa data och en oberoende mänsklig WCAG-intyg.

5
Släpp under dubbel kontroll

En granskare skiljer sig från inlämnaren godkänner kontakt och släpper bevis. Återkalla eller döda byta en anslutning om dess bevis löper ut.

Vad varje resultat innebär

Paket undertecknat

Filer har inte ändrats sedan den godkända paketsignaturen. Det visar inte ett tredjepartskontoverk.

Sandbox passerade

Deterministiskt beteende och statliga övergångar överensstämmer. Det visar inte en riktig leverantör, uppehållsperiod eller radering.

Produktionskontakt certifierad

Ett specifikt konto för arbetsytan passerade de fem skyldigheterna på leverantörssidan under dubbel kontroll.

Teknisk WCAG-rapport

Automatiserade och utvärderande ledda bevis finns för namngivna ytor. Det är inte andra personens intyg.

Starta färdigt

Alla nödvändiga grindar är gröna samtidigt och inga bevis upphör, återkallas, saknas eller motsägs av levande hälsa.

⚠️
Skapa aldrig en passerande juridisk, rättvisa, leverantör eller oberoende-attestation rekord bara för att rensa porten. Spela in blocker och ägare istället. Beredskapssyn är värdefull just eftersom den vägrar ostödda påståenden.
Varför installeras en kontakt men fortfarande otillgänglig?+

Installation bevisar paket närvaro. Aktivera det, spara verkliga minstaprivilegium referenser, passera anslutningstestet och bevilja sedan matchande PeopleOS-konto produktionsområde med hjälp av äkta leverantörsbevis och en annan granskare.

Varför ändrade en webhook inte rekordet?+

Återkopplingen kan vara giltig men bara en ledtråd. Kontrollera webhook inbox, leverantörsstatus endpoint och försoning resultat. PeopleOS ändrar auktoritativa tillstånd först efter återförfrågan.

Var är den kompletta maskinläsbara HRAPI?+

Ring meta.actions och filter för hr. och plattform.hr.; eller använd/api/v1/openapi.phpoch/api/v1/postman.php.De genereras från samma körtidsregistret.

Stöd för support

Hjälpcenter

Ditt hjälpcenter är en självbetjäningshjälp webbplats byggd från de artiklar du publicerar. Kunderna kan läsa och söka den på sin egen offentliga sida, och precis inuti chatten widget, så att de kan hitta svar på egen hand innan de någonsin öppna ett samtal. Allt i det kommer från din kunskapsbas, så samma innehåll som grundar ditt AI driver också din offentliga hjälp.

Där dina kunder ser det

Dess egen offentliga sida

En ren, sökbar hjälp webbplats på /help.phpKunder bläddra efter kategori, söka och öppna någon artikel. Du kan ge det ditt eget namn och stil.

Inne i chatten widget

En hjälp länk i chatten widget så att kunderna kan söka efter dina artiklar utan att lämna chatt. Om de fortfarande behöver en person, är de ett knack bort från att starta en konversation.

Slå på den

1
Öppna Hjälpcentersidan

Gå till Config, then Help Center i din admin och slå på Möjliggöra offentliga hjälpcenter.

2
Ge det ett namn och en look

Ställ in Hjälpcenter-namnet, som visas i rubriken och fliken webbläsaren och välj en visuell stil. Du kan stänga av den övre navigeringen för en ren sida utan meny.

3
Publicera vissa artiklar

Ingenting visar tills du publicerar artiklar till det. Nästa del täcker hur.

Publicera artiklar till hjälpcentret

Artiklar lever i din kunskapsbas. En artikel visas i Hjälpcentret när den publiceras och markeras offentligt. Det finns några sätt att göra detta:

Publicera en artikel

Öppna artikeln, markera den publicerad och aktivera alternativet för att visa det i Hjälpcentret.

Publicera allt på en gång

Använda Publicera alla knappen för att trycka hela din publicerade inställning till Hjälpcentret i ett klick, istället för att göra dem en åt gången.

Vänd FAQs till artiklar

Har redan FAQs? Publicera allt för att hjälpa för att göra dem till hjälpartiklar så de sitter bredvid allt annat.

Importera en befintlig kunskapsbas

Flytta från ett annat helpdesk? Importera KB knappen på fliken Artiklar ger en befintlig kunskapsbas för dig. Du har tre sätt att peka den på ditt innehåll:

Klistra in en URL

Ge det adressen till ditt nuvarande hjälpcenter. Om den känner igen plattformen (till exempel Zendesk) läser den exakta kategoriträdet från den plattformen. Annars kryper den webbplatsen och bygger om strukturen från sidorna, importerar endast de verkliga artiklarna och hoppar över inloggning, prissättning och kontaktsidor.

Välj en ansluten app

Om en plattform redan är ansluten till denna arbetsyta och den har en kunskapsbas, visas den i en nedgång under Importera från en ansluten appVälj den och importera, nej URL eller lösenord som behövs. Appen är endast listad när den är ansluten och konfigurerad.

Ladda upp en CSV

Ingen levande webbplats att peka på? Ladda upp ett kalkylblad med title, categoryoch body Kolumner. Put Parent / Child i kategorikolumnen för att bygga kapslade kategorier.

Oavsett vilket sätt du väljer får du en Förhandsgranska förstaDe artiklar som den hittade, grupperade efter kategori, var och en med en kryssruta så att du kan släppa allt du inte vill ha. Ingenting sparas tills du klickar på Importera. Ångra hela importen i ett klick, eller Re-synkronisering en URL eller ansluten app importera senare för att dra in nya och ändrade artiklar.

💡
Utvecklare: alla kontakter kan annonsera sin kunskapsbas till denna nedgång genom att förklara en kb_capabilities blockera i sin settings.json (typ) kb_sourcemed en adapter och en base_templatese avsnittet Anslutningar och referensen för plattformskoppling.

Organisera med AI

Ett snyggt hjälpcenter är lätt att bläddra och lättare att söka. Organisera med AI knappen gör tidningen för dig. I ett klick läser den dina publicerade artiklar, sorterar dem i vettiga kategorier och lägger till taggar. Det skapar en kategori när det behöver en, återanvänder en kategori som redan passar och hoppar över allt du redan har organiserat, så att du kan köra den igen när du lägger nya artiklar. Låt AI organisera sig i underkategorier i hjälpcenter inställningar och det kan också fila artiklar under kapsling Parent / Child kategorier, som är praktiska direkt efter att ha importerat en kunskapsbas som hade underavsnitt.

💡
Kategorier ger kunderna ett sätt att bläddra, och taggar skärper sökningen på både den offentliga sidan och i widgeten. Du kan byta namn eller flytta saker efteråt. AI ger dig en stark utgångspunkt, inte en inställning du har fastnat med.

Hjälpcenter inuti din chatt widget

Du kan visa hjälpcentret precis inuti chatten widget så att folk söker svar innan de meddelande dig. I dina chatt widgeninställningar, välj var hjälplänken visas:

I rubriken

En liten hjälpikon på toppen av widgeten.

Längst ner

En textlänk under meddelanderutan, till exempel "Bläddra hjälpcenter". Du kan ändra ordalydelsen.

Båda platserna

Visa det i rubriken och längst ner för mest synlighet.

Hjälplänken har sin egen färgkontroll under widget Appearance-inställningarna. Lämna den på Ingen matcha din lanseringsfärg, eller välj en Fast färg eller ToningHela hjälpupplevelsen följer ditt widgettema, så det ser alltid ut som en del av ditt varumärke.

Sätt ditt hjälpcenter på din egen webbadress

Ut ur lådan har ditt hjälpcenter redan en ren, delbar adress för sig själv (till exempel /help/your-help-centerDu kan gå ett steg längre och tjäna det under din egen domänkunder och sökmotorer ser det som en del av ditt varumärke, till exempel yourdomain.com/help eller help.yourdomain.comAllt fortsätter att fungera på din domän: länkar, bilder, sökningar och artikelbetyg.

Under din huvudsakliga webbplats

Inom Config, hjälpcenterÖppna Inbäddad Fliken och hitta "Visa ditt hjälpcenter på din egen webbadress" Pick your setup (Plocka din inställning)Cloudflare Nginx eller Apache), kopiera det färdiga blocket och klistra in den på din webbplats. Varje alternativ har ett Installationsguide för Windows knappen bredvid den med exakta steg.

På en subdomain

Föredrar help.yourdomain.comSamma panel har ett subdomänalternativ. Cloudflare En underdomän är den mest tillförlitliga vägen, och det ger dig en ren adress med ingenting efter det.

💡
Använda Cloudflare Det driver bara sin arbetstagare på en adress som är proxied genom Cloudflare(det orangea molnet) Din huvuddomän pekar ofta rakt på din webbplats, så en regel placerad på huvuddomen kan tyst göra ingenting. Det pålitliga sättet är en närliggande underdomän som help.yourdomain.comSetup guiden går dig genom en DNS rekord och rutten.
Bra för SEO. När ditt hjälpcenter är på din egen domän indexerar sökmotorerna dina artiklar under ditt varumärke. Varje sida förklarar sin rätta adress och webbplatskartan listar dem, så samma artikel indexeras aldrig två gånger.
💡
Använda hjälp länken i Widget också? I chatt widgetens "Öppna i hjälpcenter" inställningar, ställ in Där länken går till Din egen hjälpcenterdomän och ange samma adress. Då länkar dessa artiklar öppna på din domän också, inte på OpsIQ adress.

Se hur hela ditt hjälpcenter gör

Utöver röster från enartikel har hjälpcentret egna AnalyticsByt den på i hjälpcenter-inställningar och det registrerar tyst hur människor använder din hjälp: de mest sedda artiklarna, vad de söker efter och sökningar som kom tillbaka tomma (en färdig att skriva lista), träna besökare land och enhet på egen hand, så det behöver inte chatt widget installeras för att rapportera. Varje nummer visas för båda platser din hjälp visas, den offentliga sidan och in-widget hjälp, samt kombineras, så du kan se hur mycket var och en faktiskt används.

💡
Analytics stannar tills du slår på den, och du kan ha besökare IP Adresser anonymiserade. Ingenting registreras innan du väljer in.

Välj vad som visas på varje del av sidan

Varje avsnitt i Hjälpcentret (kategorierna på hemsidan, de populära artiklarna, artikellistan på en kategori sida och mer) har sin egen enkla regel. För var och en kan du visa eller dölja den och visa det. Allt allt objekt, en Set-nummer, den senasteeller bara de du funktion När en regel tar en lista får kunderna fortfarande en "Visa alla" -länk, så ingenting är verkligen utom räckhåll.

Du bestämmer också hur de hjälpsamma rösterna ser ut: dold, ett vänligt förhållande som "12 av 14 fann denna hjälpsamma "eller vanliga tummar räknas. En minsta röstinställning stoppar en helt ny artikel som visar ett besvärligt"0ur0".

Se vilka artiklar som arbetar

Varje artikel visar en Var det här hjälpsamt? Varje ja eller nej räknas per artikel, så du kan se i en blick som artiklar svarar på frågor väl och vilka som behöver en omskrivning. Upprepade röster från samma besökare ignoreras, så räknas ärliga.

Text och etiketter

Du kan ändra rubriker och etiketter på Hjälpcentret för att matcha din röst. Lämna alla fält tomma och det faller tillbaka till en vettig standard, så du redigerar bara ordalydelsen du faktiskt vill ändra.

Hjälpcentret delar ett bibliotek med ditt AI. Varje artikel du publicerar här är samma innehåll som AI använder för att svara på chattar och biljetter, så förbättra den ena förbättrar den andra.

Vanliga frågor

Behöver jag skriva separat innehåll för hjälpcentret?+

Det är byggt av samma kunskapsbasartiklar som AI redan använder. Publicera en artikel en gång och det kan tjäna båda.

Kan jag hålla vissa artiklar interna?+

Endast artiklar du publicerar och markerar offentliga visas i Hjälpcentret. Allt som inte offentliggörs stannar ur det.

Kommer kunderna fortfarande att kunna nå en person?+

Ja. Widgeten hjälper länk sitter en kran bort från att starta ett samtal, så självbetjäning aldrig fångar någon.

Tillväxt och SEO

Site Intelligence (SEO Suite)

Site Intelligence är OpsIQ s inbyggda SEO och söksynlighet svit. Det kryper din webbplats som en sökmotor, spår där du rankar, forskar sökord, tittar bakåtlänkar och konkurrenter, skannar din lokala kart närvaro, kontrollerar sidhastigheten och förvandlar allt till kundredo rapporter, med en AI-analytiker som förklarar vad man kan fixa och utarbeta fixarna. Det är en premiumfunktion; när det aktiveras verkar som platsintensitet i sida baren.

Webbplats Intelligence
Site Intelligence DashboardEn SEO instrumentbräda som visar en plats-hälsopoäng, sökord rank spårning och en trafiktrend.Webbplats Intelligenceyoursite.com86Site Health3 kritiska frågorSökordsrankningsspårningAi Helpdesk#3Live chatt med tjejer#7crm för byråer#12Organiska klick1KRÖVHitta tekniska problem2TrackRanks, nyckelord, backlinks3AI AnalystFörklarar och utkast fixes
Översikt över Site Intelligence: en plats-hälsopoäng från den senaste krypningen, live sökordsrankning, en organisk-klick trend och trestegsloopen: crawl, track, let the AI draft the fixes.

Få Site Intelligence

Webbplatsintelligens är en del av de planer som bär den. På en plan som inte fungerar det precis som PeopleOS HR: kontoägaren öppnar Konto→Add-ons och Tokens, plockar en Site Intelligence nivå och startar den fria rättegången eller lägger till det direkt. En gratis plan, eller en betald plan fortfarande i sin egen plan försök, kan inte lägga till det. Tills det ägs sviten är dold från sidofältet och en direkt länk erbjuder tillägget; när ett tier cap nås sidan erbjuder nästa nivå; När en rättemedel slutar utan ett köp rätteligen tas bort och ingenting debiteras. Tiers and prices live på kontot, så se nuvarande nivåer på Prissättning sida.

Kör en crawl · börja här

En krypa är OpsIQ besöker dina sidor hur en sökmotor skulle, för att hitta tekniska problem: brutna länkar, saknade titlar, tunn innehåll, långsamma sidor, indexeringsproblem.

1
Börja crawl

På översikten klickar du på för att starta en kryp. OpsIQ köer det och fungerar genom dina sidor i bakgrunden; en statusindikator visar framsteg.

2
Läs rapporterna

När det slutar öppnar du problemen och sidlistan. Varje fråga är grupperad av svårighetsgrad så att du tar itu med de största vinsterna först.

3
Låt AI hjälpa

AI-analytikern ger en vanlig språklig korthet av vad som är fel och varför det spelar roll, och kan generera föreslagna fixar du granskar innan du ansöker.

Vad Site Intelligence spårar

Crawls & Site Health

Skanna dina sidor för tekniska SEO-problem och listar varje sida med sina problem. Re-run när som helst, eller schemalägga det.

Rank spårning

Lägg till sökorden du bryr dig om; OpsIQ Kontrollera var din webbplats rankar och spår rörelse över tiden.

Keyword forskning

Upptäck nya sökordsidéer för att rikta sig till, med AI-nyckelordet tränare för att hjälpa till att prioritera.

Bakåtlänkar

Se vilka länkar till dig, uppdatera listan och avskräcka länkar du inte vill ha i samband med din webbplats.

Konkurrenter

Lägg till konkurrentdomäner och jämför din synlighet mot deras, med en AI-konkurrensanalys.

Lokalt (karta) rutnät

Skanna lokalt informationsperspektiv över ett geografiskt rutnät för att se var du dyker upp på kartan, plus Google Business Profile verktyg.

Sidhastighet

Kör sidhastighetskontroller så att du kan fixa långsamma sidor som skadar rankningar och omvandlingar.

AI-innehåll

Generera innehållskort och utkast som riktar sig till de sökord du riktar.

Rapporter

Bygga utskrivbara, kundklara rapporter om allt ovan.

Anslut Google för korrekt data

Två Google-kontakter gör uppskattningar till verkliga nummer:

Google Search Console

Sök efter sökningar

Dra exakta frågor, klickar och intryck Google rapporter för din webbplats, kartlägga din egendom och ytrankning möjligheter direkt från Googles egna data.

Google Analytics 4

Trafik

Ta med dina trafik- och engagemangsdata tillsammans med dina SEO-uppgifter, så rapporter visar synlighet och beteende tillsammans.

Schemalagda uppdateringar och rapporter om vitmärke

Du behöver inte köra allt för hand. Scheduled uppdateringar omkörning kryper, rangordnar kontroller, sökordskontroller, backlink-refreshes, lokal-grid-skanningar och rapportgenerering på en kadens (dagligen eller veckovis beroende på plan och volym) Dessa går igenom OpsIQ krönen, se Cron och automation avsnittet. Genererade rapporter exporteras som utskrivbara, kundklara dokument: organ skickar varje klient en vanlig SEO-uppdatering, och eftersom varje domänens data är separat ser bara sina egna.

Vissa Site Intelligence-funktioner kallar externa dataleverantörer och AI genom OpsIQ"Skonfigurerad leverantör. De arbetar ur lådan när sviten är aktiverad för din plan. Om ett uppfriskande inte körs, bekräftar du OpsIQ cron körs (se Cron och automation).
Behöver jag lägga till något på min webbplats för SEO-spårning?+

Crawls, rank tracking, sökord forskning och backlinks fungerar utan att röra din webbplats. För trafik och exakta sökdata, anslut Google Search Console och GA4.

Kan jag spåra mer än en domän?+

Lägg till varje domän separat; deras kryper, rankningar och rapporter är helt isolerade från varandra.

Hur ofta ska jag krypa?+

Veckovis är mycket för de flesta webbplatser; krypa på efterfrågan efter ett stort innehåll eller strukturförändring. Ställ in ett schema så att du aldrig glömmer.

Tillväxt och SEO

Auto-Implementera (SEO Agent)

Auto-Implement är den del av Site Intelligence som faktiskt tillämpar fixar krypa och AI analytiker rekommenderar, istället för att bara rådgöra dig. agenten arbetar strikt från vad Site Intellligence redan hittade (det kan aldrig uppfinna en förändring) och går varje fix genom samma säkra slinga: en torrr-run förhandsgranskning, din per-steg godkännande, live-skrivning, en automatisk ögonblicksbild och en omräkning som bevisar öppenhet räknas ner. Det är en Managed-AI-only funktion; det verkar som Auto Tur-s

Auto-Implementering
Auto-Implementera SEO agentEtt flöde som visar rekommenderade SEO-fixar som rör sig genom förhandsgranskning, godkännande och en levande skriv, med en prove-it åter krypa.Auto-Implementeringyoursite.comRekommenderade fixarAdd missing <title>GodkändFix Robots. txtGodkändSkicka sitemap.xml_GranskaFörhandsgranska (DIFF)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>GodkännaFartygProducera det - RE-CRAWLÖppna problem 12_4Snapshot räddad1FörnyelseTorr-run diff för varje fix2Godkänn & skrivSSH eller värd API3Prove & RollbackRe-crawl + Snapshot
Hur en session körs: agenten listar fixarna Site Intelligence som redan rekommenderats, visar en torrt diff av var och en, tillämpar de du godkänner över SSH eller en värd API, snapshots före varje skrivande och åter kryper för att bevisa öppen fråga räknat sjönk.

Vad det kan förändra

Agenten tillämpar bara fixar som Site Intelligence (eller AI-analytikern) redan rekommenderas för den domänen. Över de stödda plattformarna som täcker:

Serverkonfiguration

Sitemap.xml, robots. txt och omdirigera, kanoniska och rubrikregler i . htaccess (Apache / LiteSpeed) eller nginx config.

Omdirigera kedjor

Kollapsar en multi-hop redirect kedja ner till en enda hopp rakt till finalen URL Inuti samma hanterade .htaccess block, så snabb och länk värde sluta läcka genom de extra hoppen.

Page <head>

Saknade eller svaga sidtitlar, metabeskrivningar, kanoniska taggar och strukturerade data (schema) block.

WordPress SEO

Yoast, Rank Math och SEOPress titlar & meta och bildalt text, applicerad via WP-CLI på SSH Vägen eller REST API på den värderade vägen.

WordPress strukturerade data

Lägger till JSON-LD (schema) till sidor som saknas. SSH Vägen en liten hanterad hjälpare (en must-use plugin) skriver ut markeringen så att den fungerar med eller utan ett SEO-plugin; på den värderade vägen din SEOS-plugg bär det.

Interna länkar

Lägger till en relevant intern länk i befintliga WordPress _-innehåll för att rädda föräldralösa sidor och ansluta relaterade inlägg. En länk per sida, aldrig i ett rubrik, en befintenlig länk eller en kortkod, och alltid godkänt av dig först.

innehållet på tunn sida skriver om

Utkast till fullständigt ersättningsinnehåll för tunna sidor (som vrids på av ett krypalternativ, se nedan). Varje utkast granskas och godkänns av dig innan något publicerar, och det gamla innehållet hålls så att det kan återställas.

Page cache (Page Cache)WordPress)

Vänds på W3 Total Cache sida caching när krypningen hittar hastighetsproblem och att plugin är installerat, så sidor tjänar snabbare.

Shopify SEO

Produkt och samling SEO titlar & beskrivningar, sida och bloggartikel SEo, plus 301 omdirigeringar, genom Shopify Admin API.

Webflow SEO

Per-sida SEO titel och meta beskrivning genom Webflow Datadata data API v2.

Förbered fixarna automatiskt (två krypalternativ)

Panelen Site Intelligence Configure för en domän (dess krypinställningar) har två alternativ som bestämmer hur mycket agenten raderar upp för dig i förväg. Båda är avstängda som standard och båda använder AI-krediter, så du slår dem på endast när du vill att det arbetet gjort för dig.

Auto-prepare AI fixar efter varje crawl

Varje krypa skriver också det konkreta fixinnehållet (texter, metabeskrivningar, alt text, schema, omdirigeringar) för vad den hittades, så fixarna är redo att granska och tillämpa ögonblicket crawl avslutar istället för att genereras senare på begäran. Använder AI-kredit på varje krypning.

AI-innehållet skriver om (tunna sidor)

Agenten kan utarbeta fullständigt ersättningsinnehåll för tunna sidor. Ingenting publiceras någonsin på egen hand: varje utkast visas som en förändring du granskar sida vid sida och godkänner eller avvisar, det tidigare innehållet hålls så att det är reversibelt, och det är begränsat till några sidor per pass. Använder AI kredit per utkast.

💡
Båda alternativen förbereder och utarbetar bara arbete. Varje förändring går fortfarande igenom samma per-steg godkännande, snapshot och rollback som någon annan fix, så att de på aldrig sätter något live i sig själv.

Två sätt som den ansluter

SSH / SFTP Vägen

Självstyrd

För webbplatser på din egen server ansluter agenten över SSH/SFTP använda referenser du lagrar, redigerar servern konfig och sidfiler direkt, och kör WP-CLI för WordPress Bäst när du har skal tillgång och vill ha full kontroll över filer.

Hosted-API Vägen (ingen) SSH)

Inget skal

För plattformar som inte tillåter SSH agenten fungerar helt genom en tjänsteman API Anslutning, WordPress (REST + Application Passwords), Webflow (Data)API v2) och Shopify (Admin API Ingenting är installerat på värden.

💡
Wix och Squarespace har ingen offentlig SEO-skrivare API På dessa plattformar kör Auto-Implement i rådgivande läge: det visar dig den exakta förändringen att göra (den exakta titeln, meta eller inställning) för att du ska tillämpa för hand. Allt annat är lätt och säkert.

Slå på kontakterna

Agenten når varje plattform genom en kontakt:

Byggd i

Shopify och WordPress Ansluter fartyg med OpsIQ, bara aktivera dem under Connectors och lägga till butik / webbplats referenser.

Från marknaden

Webflow, Wix och Squarespace installerat från Connectors → Marketplace, sedan ansluta på samma sätt.

Hur en session går

1
Välja fixarna

Öppna Auto-Implement (rocket) från avsnittet Webbplatsunderrättelse. Det listar de problem som Site Intelligence redan fann att den kan fixa på denna domän.

2
Förhandsgranska varje förändring

För varje fix visar agenten en torrt diff (exakt vad den kommer att skriva) innan något rör levande plats.

3
Godkänn steg för steg

Du godkänner (eller hoppar över) varje förändring individuellt. Ingenting tillämpas utan din uttryckliga gå framåt på det steget.

4
Den skriver, sedan snapshots

På godkännande agenten gör live förändring över SSH eller den värd API och sparar en ögonblicksbild först, så alla förändringar kan rullas tillbaka.

5
Bevisa det, live

Eftersom det gäller varje förändring omkontrollerar agenten omedelbart den exakta sidan och visar en "fixed live" -dom, så du tittar på varje fix land på levande sida som det händer. I slutet åter kryper den hela webbplatsen och bekräftar att det öppna problemräkningen tappade.

Säkerhet & fakturering

SEO-bara

Agenten kan bara göra vad Site Intelligence rekommenderade för den domänen. Det kan inte göra godtyckliga ändringar på din webbplats eller server.

Per-step godkännande

Varje skrivande är förhandsgranskad som en diff och tillämpas först efter att du godkänner det specifika steget.

Snapshot & Rollback

En ögonblicksbild sparas innan varje skriv, så att eventuella förändringar kan återgå.

Live per-step bevis

Varje ändrad sida är omkontrollerad det ögonblick som den skrivs och får en "fixed live" -dom, så en fix bekräftas mot live-sidan direkt, inte bara i stängningen åter krypa.

Innehållet är aldrig auto-publicerat

Interna länkar och tunnsidor innehållsrewrites är högre effekt, så de visas alltid för godkännande och tillämpas aldrig automatiskt, oavsett vilket läge du kör.

Managed-AI endast

Auto-Implement körs på Managed AI; den är blockerad när en arbetsyta använder sin egen (BYOK) nycklar.

Fakturering

AI tokens fakturering normalt som du använder dem, plus en platt per användning avgift per Auto-Implement session, båda hämtade från samma Managed-AI kredit.

Auto-Implement är avstängd som standard. Aktivera det på AI konfigurationssidan (Auto-Imlement kort) och se till att kontakten för din plattform är ansluten först.
Ändrar det något utan att fråga?+

Nej. Varje förändring förhandsgranskas som en torr-kör diff och tillämpas först efter att du godkänner det exakta steget. En ögonblicksbild sparas innan varje skriv så att du kan rulla tillbaka.

Behöver jag SSH _?+

Inte på WordPress, Shopify eller Webflow De arbetar genom sin officiella APIs utan Shell access. SSH är bara en av de två vägarna, som används när du vill att agenten ska redigera serverkonfig och filer direkt på din egen server.

Hur vet jag att det fungerade?+

Efter att ha tillämpat de godkända fixarna omkryptering av sajten och visar öppen fråga räkna före och efter, så du kan bekräfta att korrigeringarna minskade problemen.

Kommer det att skriva om eller publicera sidinnehåll på egen hand?+

Nej. AI-innehållsrewrites är avstängda tills du slår på dem i krypningsalternativen, de är begränsade till några tunna sidor per pass och varje utkast visas för dig för sida vid sida godkännande innan något publicerar. Det tidigare innehållet hålls, så en omskrivning kan alltid återskapas.

Kan jag använda den med egna AI-nycklar?+

Nej. Auto-Implement är endast hanterad AI och blockeras under BYOK. Det fakturerar AI-tokens normalt plus en platt per användning avgift per session, från samma Managed-AI-kredit.

Tillväxt och engagemang

Survey Studio AB

Survey Studio är arbetsytan för att skapa redigerbara undersökningar som kan levereras som en rik fristående sida, webbplats widget eller inline bäddas. Den aktuella produkten ger också värd länkar, undertecknade utkast till förhandsvisningar, privata inbjudningar, QR-delning, svarsläsning och undersökningskodade analyser. Webbplatsen widgen är ett leveransval; det är inte definitionen av en undersökning.

⚠️
Nuvarande-versus-target gräns: Premiumskapande och förhandsgranskningsupplevelse, Connector Builder survey Förmåga och Survey-ägda leverantörsregistret / hälsogränsen finns nu. Surveyr Studio behöver fortfarande den oberoende multidistributionsarkitekturen, signerad Survej Identity Gateway, inriktning / variabel ledningar, CRM Outreach skickar flöde och skrivna surveys.* API.

Skapa en undersökning

1
Välj hur människor tar det

Den nuvarande guiden erbjuder Standalone sida & länk, webbplats widget och Inline inbäddat. Det godkända målflödet börjar med enkättyp och senare lägger till CRM e-post, privatlänkar och QR-utplaceringar som förstklassiga val.

2
Välj syftet

Pick NPS, CSAT, CES, produktåterkoppling, post-köp, avbokning, ombordstigning, webbplats, händelse, webinar, support, lead / demo, trial, testimonial, forskning, anställd, intag eller allmän feedback.

3
Använd en komplett mall eller Starta tom

Den nuvarande katalogen har färdiga redigerbara startare grupperade efter ändamål. Välja en mall skapar ett kopierat utkast: ändra din undersökning inte ändra start eller annan undersökning.

4
Anpassa eller snabb recension

Anpassa öppnar varje fråga, design, beteende och leveranskontroll. Quick review öppnar samma utkast vid den slutliga kundsynskontrollen. Inget publicerar eller skickar automatiskt.

Leverans val och nuvarande beteende

Standalone sida & länk

En responsiv märkessida med sin egen URL Använd privata inbjudningar och utgång när varje mottagare behöver en kontrollerad länk. QR-delningspunkter på denna värderade upplevelse.

Webbplats widget

Den migrerade arvskanalen. Det kan använda sidan, geografi, enhet, besökare, datum, provtagning, nedkylning, besök och kvotregler. Det stöds fortfarande av den äldre aktiva widgetbron medan installationsarkitekturen är byggd.

Inline bäddat

En responsiv undersökning placerad inuti en sida, portal, produkt eller hjälpcenter. Det kräver inte kampanj Studio.

E-post

Idag kan Studion generera inbjudan HTML och privata länkar. End-to-end skickar från CRM kontakter/segment, med samtycke, undertryckande, schemaläggning, retry och svar korrelation, är det godkända CRm Outreach integration målet.

Enterprise Design och Preview

Undersökningssidor har Survey-ägda teman och sidlayout familjer, responsiva kontroller, välkomst och slutförande kopiera och ett undertecknat utkast förhandsgranskning. Designer förhandsanvisningen är full bredd under redaktören, inte en smal sida järnväg. Det använder den verkliga värd drifttiden i en sandboxad ram och stöder skrivbord, surfplatta och telefonbredd; förhandstyrning trafik skriver inte svar eller analyser.

💡
Survey Studio är oberoende av Promotion Studio. Runtime-mål, identitet, tillgångar, rendering och analys måste vara Survejägt. Kampanjinnehåll kan endast återanvändas genom en explicit engångskopia/import som skapar fristående undersökningsdata; senare Redigering av kampanjer får inte ha någon effekt.

Full Formulär produkt

Oberoende distributioner

Livet Live

En undersökning kan ha separat versionerad sida, widget, inbäddad, CRM-e-post, privatlänkar och QR-distributioner, var och en med sitt eget tillstånd, design, publik och analys. Varje undersökning kan pausas, inaktiveras eller tas bort.

CRM Outreach och kampanjer

Livet Live

Bygg en verifierad publik från CRM-segment och Survey-kompatibla kontakter, frysa den till en oföränderlig version, utfärda en signerad inbjudan varje och skicka genom den stiftade utgående e-postkontakten med per inbjudningsleverans bevis.

Fältkit och validering

Livet Live

Sliders, bildval, filuppladdning, signatur, adress, telefon, rubriker och rik text, med min/maxlängd, e-post /URL/number förinställningar, anpassad feltext och per-fråga prefill URL parametrar.

Logik, formler, resultat

Livet Live

OCH/OR kondition grupper, gren regler, en säker formel motor över svar och poäng band som bär sin egen utfall sida: en poäng quiz landar på sin dom.

Språk, kiosk, prefill

Livet Live

En besökare språk nedgång listar bara språk med riktiga översättningar, kiosk läge för delade tabletter (tiggare mål, auto-reset, inga omdirigeringar), en prefill länk byggare och redigerbar säkra-badge och sidfot text.

Version A/B testning

Livet Live

Publicera en utmanare version på alla utplaceringar med en trafik split. Besökare tilldelas klibbigt, svar stämplas med den version som faktiskt serveras, och jämförbordet visar svar, slutförande och genomsnittlig poäng per version. Främja vinnaren i ett klick.

Veckovis smälta

Livet Live

Ett veckovis e-postmeddelande med de sista 7 dagarna av enkät KPI, de mest trafikerade undersökningarna, Feedback-pulsen och den senaste AI- briefingen, som skickades genom den fasta utgående kontakten. Konfigurera det i Leveranscentrum, Automation.

Styrning

Livet Live

Per-survey åtkomst listor begränsar vem som kan redigera, publicera eller ta bort en undersökning. Publicera godkännande (fyra ögon) kräver en andra admin för att släppa det exakta utkastet; redigering återställer godkännandet. Utkast dela länkar låta en granskare se det verkliga utkast utan inloggning.

Utvecklare plattform

Livet Live

Connectoravtal 2.2, skrivna undersökningar.* och feedback. * åtgärder på api/v1, kanonisk undersökning.* händelser, hållbara signerade webhooks med Slack och Google Sheets reläformat och ett svar PDF export.

Tillväxt och engagemang

Undersökning Analytics och Feedback är olika produkter

Undersökning Analytics förklarar hur en undersökning själv når människor och utför. Feedback förklarar vad kunderna sa över alla tillåtna källor och vad verksamheten ska göra åt det. De två produkterna länkar till varandra men inte dela eller skriva analytisk sanning.

Undersökning Analytics

Inmatad från den enskilda undersökningen i Survey Studio, inte från den globala sidonavigeringen. Det mäter behörighet, exponering, utlösande beteende, startar, slutförande, övergivande, fråga och gren friktion, tidsplanering, distribution / kampanj / version resultat och driftstillförlitlighet.

Feedback översikt och inbox

Ett tillstånd-medvetet kronologiskt foder för färdiga Survey svar, arv widget feedback, chatt och biljett CSAT, biljett svar återkoppling, kund AI-svar betyg, kunskapsbas hjälpsamma röster och godkända externa / anpassade källor.

Analys av återkoppling

Analyserar kundens mening: ursprungliga metriska trender, ämnen / teman, känsla, känslor, avsikt, brådskande, förfrågningar, klagomål, beröm, resa / produkt / tjänst / ångsegment, detractors och slutna livsutfall.

Data ägande

Undersökningssvar förblir auktoritativa i Survey-lagring. Feedback lagrar en ombyggbar källreferens och härledda signaler, sedan laddar tillåtna bevis på efterfrågan. En avslutad undersökningsrespons blir högst ett återkopplingsobjekt.

⚠️
Den nuvarande Feedback-sidan har fortfarande en Survey-responswebbläsare och en separat arv widget inkorg, och dess AI-summor använder ännu inte den fullständiga normaliserade källmodellen. Den enhetliga översikten / Inbox / Analytics / Källor & hälsodesign är implementeringsmålet.

NPS, CSAT, CES, stjärnor, tummar och hjälpsamhet måste alltid behålla sin ursprungliga metod, skala, prov, datumfönster och nämnare. De får aldrig kombineras till ett oförklarligt genomsnitt.

Tillväxt och SEO

Kampanjstudio

Kampanjen förvandlar din webbplats till en omvandlingsmotor. Design pop-ups, banners, slide-ins, top/bottom barer, full-screen takeovers, inline block och även landbaserade omdirigeringar, sedan visa rätt meddelande till rätt besökare i rätt ögonblick. Allt levereras genom OpsIQ widget redan på din webbplats, så det finns inget extra att installera. Du designar och spara kampanjer när som helst; de bara visar när du Publicerar dem och studion är påslagen för din arbetsyta.

Kampanjstudio
Designer för Promotion StudioEn visuell kampanjdesigner med en blockpalett, en popup på duken och en målgrupp.Kampanj Studio - DesignerBLOCKARxVälkommen, {first_name}!Få 15% av din första beställningSAVE15Klaga min kupongTargetingLandstingUSA, CAUtlösareAvsikt att lämnaA/B-uppdelning50 / 50Publicera1DesigDrag block på canvas2TargetLand, sida, publik3MätaA/B vinnare + AI insikt
Den visuella designern: en blockpalett till vänster, din kampanj på duken (här en personlig kupong pop-up med hjälp av en {first_name} token), och målningen + publicera panelen till höger.

Den stora bilden

Kampanj

Vad är vad

En kampanj: en pop-up, banner, bar, glid-in, full-screen, inline block eller geo-omdirigering. Var och en har ett mål: försäljning, bly, sign-up chat, undersökning, tillkännagivande.

Design & versioner

Hur

Du bygger utseendet i den visuella redaktören. Varje spara skapar en ny version, så att du alltid kan rulla tillbaka. Ingenting är någonsin förlorat.

Målsättning

Vem som helst

Vem ser det: land, sida, enhet, trafikkälla, återvändande vs nya, schema och (med en kontakt) dina inloggade kunder.

Utlösare

När

När det visas: omedelbart, på förseningar, på scroll, på exit-intent, när tomgång, på ett klick, efter N sidor eller från chatt / biljettaktivitet.

Analys

Resultat

Live intryck, klick-through, omvandlingar, en drop-off tratt, land / sida / enhetsdelar, A/B vinnare och en AI insikt.

Starta din första kampanj i 5 Steg

1
Börja från en mall eller tom

Open Promotion Studio och klicka på Ny kampanj, eller välj en färdig design från Templates galleriet. Ett utkast öppnas i designern.

2
Designa den

Dra i block, rubriker, text, knappar, bilder, märken, statistik, nedräkningar, former, kuponger, videor, betyg, spin-wheels. Stilfärger, gradienter och 3D effekter med reglagen. Förhandsgranska skrivbord / tablett / mobil och använd fri rörlighet för att placera något var som helst.

3
Personifiera det

Type tokens som {first_name}, {country} eller {company} i vilken text som helst. Vid show-time blir de besökarens verkliga värderingar.

4
Mål & trigger

Välj vem som ser det (land, sida, enhet, publik) och när det bränder (fördröjning, rullning, avsikt). Lämna en regel tom för att betyda alla.

5
Kontrollera sedan publicera

Klicka på Kontrollera för en snabb pre-lanseringsskanning, sedan Publicera. Det går live inom några sekunder och börjar samla analyser.

Block du kan bygga

Innehåll

Kärna

Rubriker, punkt, lista, citat, bild, ikon, märke, stat, divider och spacer, byggstenarna för alla meddelanden.

Ring till handling

Kärna

Knappar med riktiga åtgärder: öppna en länk, starta en chatt, skapa en biljett, kopiera en kupong eller hoppa till en sida.

Urgency & catch

Förmån

Nedräkningstimmar, formulär (email / telefon / text), kupong avslöjar och videoinbäddar.

Spelifiering & feedback

Förmån

Spin-to-win hjul, skraplotter, NPS / stjärnbetyg och multistegskullar.

Layout & Effekter

Förmån

Kolumner, framstegsstänger, social del, sociala bevistjockare, ja / nej tvåsteg, frågesporter och 3D-effekter, lutning, glöd, parallax, glasmorfism.

Personaliseringstokens

Skriv någon av dessa i rubriker, punkter, knappar, märken, statistik, listor eller citat. De ersätts med besökarens live-detaljer när kampanjen visar (alltid rengjord för säkerhet):

Tillgängliga 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)

Målsättningsreferens

Land & plats

Visa endast i (eller gömma sig från) utvalda länder, städer eller tidszoner via GeoIP. Stort för regionspecifika erbjudanden eller en geo-omdirigering.

Sidor och URLs

Begränsa till vissa sidor med likabehandling / start-med/ innehåller/regex och uteslut även sidor.

Enhet

Skrivbord, surfplatta eller mobil, t. ex. en smal bar på mobilen, en modal på skrivbordet.

Besökstyp

Ny, återkommande, känd (i din CRM) eller anonym; CRm segment, livscykel scen, bly poäng eller webbläsarspråk.

Trafikkälla

Genom UTM (utm_source, utm_campaign) eller referensplats, t. ex. endast besökare från en specifik annons.

Schema och frekvens

Start / slutdatum, tid-of-day fönster och hur ofta en person kan se det (per session, per dag, efter att de stängt / klicka / konvertera).

A/B trafik split

Visa en procentandel av besökare och kör varianter huvud-till-huvud; samma person ser alltid samma variant.

Publikationer (loggad-in)

Med en anslutning aktiverad, mål genom live-kontotillstånd, t. ex. kunder med obetalda fakturor eller aktiva abonnenter.

Utlösare

Välj hur kampanjen visas: Omedelbart, efter en fördröjning, på bläddra djup, på avsikt, när tomgång, på ett klick i ett element, efter ett antal sidor som ses, på form-överge eller från chatt / biljettaktivitet. Utvecklare kan avfyra en från sin egen kod med window.OpsIQPromo.fire('event').

Mål inloggade kunder (connectors)

Detta är vad som gör OpsIQ Särskilda kampanjer: Anslut en plattform som WHMCS (eller någon kontakt som stöder publiken) och studion kan rikta besökare genom sitt live-kontotillstånd.

1
Aktivera en publik kontakt

Under Connectors, aktivera en som avslöjar publik fakta (WHMCS gör ur lådan). Kunderna är erkända säkert när de loggas in på den plattformen, OpsIQ Litar aldrig på ett inskrivet e-postmeddelande.

2
Lägg till en publikregel

I kampanjens inriktning > Audience kräver du inloggad och lägger till regler som obetalda fakturor >= 1abonnemang är förflutet, eller kontokredit > 0.

3
Personifiera med sina data

Använd tokens som {first_name} eller {balance_due} En "Du har en försenad faktura" påminnelse skriver sig själv.

Audience-målning är felsäkert: om kontakten inte kan bekräfta ett faktum (eller besökaren inte är inloggad), visas kampanjen helt enkelt inte, så ett faktureringsriktat erbjudande når aldrig fel person. Bygga din egen kontakt? Se "Promotion publik riktar sig" nedan.

Ansluten handel (studio superpower)

Produktkort från din butik

Livedata

Ett produktblock drar riktiga objekt (namn, pris, försäljningspris, bild, länk) direkt från WHMCS, WooCommerce, Shopify eller din OpsIQ Tick "Keep fresh" och kortet uppdaterar sitt pris från plattformen varje timme medan det publiceras.

Store-provisioned kuponger

Kuponger

Ett kupongblock kan skapa den verkliga rabattkoden i din butik när du publicerar, så koden en besökare avslöjar alltid fungerar vid kassan.

Order-sanningsintäkter

Tillskrivning

Verkliga order från dina plattformar matchas tillbaka till kampanjer varje timme (genom kupongkod som används eller av ledningens e-post) så intäkterna du ser är från faktisk försäljning, inte uppskattningar.

Real socialt bevis

Förtroende

Den socialt bevis ticker kan leda med äkta senaste beställningar ("Ada beställde Starter Plan · 2h _]), förnamn och objekt bara, aldrig e-post eller mängder.

Experiment och resor

A/B-varianter och auto-vinnare

Split trafik över designvarianter; låt studion främja statistisk vinnare automatiskt, eller handtrafik till banditoptimering som flyttar besökare mot vad konverterar som bevis kommer in.

Holdout Uplift

Boka en bit besökare som inte ser någonting, så du kan bevisa att kampanjen själv orsakar hissen.

Segment varianter

Olika innehåll per publik på SAME-kampanjen (mobile besökare, stora vagnar, återvändande kunder), varje segment får sin egen version.

Trigger experiment

Varianter kan också testa när de ska visas: omedelbar vs fördröjd vs exit-intent, mätt huvud till huvud.

Resor (kedja)

Mål genom vad någon gjorde med en annan kampanj ("sågkampanj A men konverterade inte") för att bygga flerstegsfrämjande sekvenser.

Teaser

En liten piller besökare kan öppna igen efter att ha stängt kampanjen, så en sluten pop-up är aldrig borta för gott.

Vet vad som hände

Klicka på Heatmap

Designer

I designern, växla värmebänken för att måla riktiga besökare klickar över varje block av din design.

Steg funnel

Trattar

Multi-steg kampanjer visar exakt var människor släpper av, skärmen på skärmen.

Jämför kampanjer

Studio

Sätt upp till fyra kampanjer sida vid sida (intryck, klick, omvandlingar), bäst värde markeras.

Veckovis historia & smälta

AI

Varje måndag landar ett smält i dina meddelanden;📖Weekly story knappen skriver en vanlig språk sammanfattning med nästa steg när du vill ha en.

Arbeta bekvämt

AI copilot & idéer

Chatta med designkoliopit för att redigera duken ("göra rubriken brådskande, lägga till en nedräkning"), få kampanjidéer från dina egna trafikdata, översätta en kampanj per land eller auto-fix en låg designpoäng.

Importera varumärkeskit

Ett kommando läser din webbplats och föreslår dina riktiga varumärkesfärger och teckensnitt; spara och varje väljare leder med dem.

Trattar för flera skärmar

Steg block får sann per-screen redigering: flikar för varje skärm, lägga till eller omordna skärmar och förhandsgranskningen följer med.

Namngivna versioner och närvaro

Namn viktiga versioner ("Låt kandidaten"), återställa någon av dem och se en varning när en lagkamrat redigerar samma kampanj.

Enhetsremsa & härskare

Se skrivbord, surfplatta och mobil sida vid sida i en vy; växla pixel härskare för exakt placering.

Hosted page & kanaler

Varje kampanj kan också vara en fristående sida för bios och QR-koder, en e-post droppsekvens för fångade leads eller ett one-klick webb-push utkast.

Enterprise Säkerhet

Publicera frysfönster (förändringsfria perioder), en nödpaus-all switch, godkännanden, revisionsled och versionsupprullning.

Behöver jag lägga till kod på min webbplats?+

Nej. Kampanjer levereras av samma OpsIQ widget du redan installerat. Design, publicera, gjort.

Kommer besökare att se samma popup om och om igen?+

Nej. Ange frekvenskapslar (per session/dag eller stanna efter att någon stänger, klickar eller konverterar). Sensible standards tillämpas.

Vem kan publicera?+

Publicering, pausning, arkivering och rullande tillbaka är begränsade till arbetsytans ägare och fulla administratörer. Alla teammedlem kan skapa och designutkast.

Tillväxt och SEO

Kampanjdesigner

Promotion Designer är en responsiv blockredigerare för att bygga, granska, versionera och publicera en kampanjupplevelse.

Produktskärm
KampanjdesignerDesignern kombinerar en live canvas, enhet förhandsvisningar, block, personalisering variabler, kommentarer och versionshistorik.KampanjdesignerWorkPayVIEWPORTSkrivbordVERSIONv12Ställ enUtkastLivet Arbetarspace VIEWHjälteblockRubriker, media och CTARedigeraErbjudande blockRabatt och deadlineRedigeraPersonlig anpassningKontakt- och kampanjvariablerRedoStarta checkKommentarer och valideringGranska1BUILD BLOCKSRedigera livelayout2FörnyelseDesktop, tablett, mobil3PUBLISHVersionerad utgåva
Designern kombinerar en live canvas, enhet förhandsvisningar, block, personalisering variabler, kommentarer och versionshistorik.

Använd block för att komponera upplevelsen, förhandsgranska varje stödd visning och infoga godkända personlighetsvariabler. Granskningskommentarer och AI-mediaprovenance innan lanseringen. Spara skapar versioner så att en tidigare design kan inspekteras eller återställas.

Tillväxt och SEO

Kampanjmallar

Mallar ger ett sökbart, kategoriserat startgalleri för Promotion Studio-kampanjer.

Produktskärm
KampanjmallarMallen galleri filtrerar premiumlayouter och tillämpar varumärkesfärger på arbetsplatsen när en mall blir ett utkast.KampanjmallarWorkPayKategärKonverteringRESULTS24BRANDTillämpadLivet Arbetarspace VIEWExit erbjudandeModal med brådskande och CTAFörhandsgranskaNy besökare välkomnaBanner och förmånslistaFörhandsgranskaProduktlanseringHero, bevis och nedräkningFörhandsgranskaFeedback begäranKompakt enkätpromptFörhandsgranska1FILTERKategori och sök2FörnyelseInspektera hela designen3USESkapa ett varumärkesutkast
Mallen galleri filtrerar premiumlayouter och tillämpar varumärkesfärger på arbetsplatsen när en mall blir ett utkast.

Sök eller filtrera efter kategori, ladda ytterligare resultat, förhandsgranska hela upplevelsen och välj sedan Använd mallDen nya kampanjen är fortfarande ett utkast och kan ändras i Kampanjdesigner innan publicering.

Tillväxt och SEO

Kampanjanalys

Kampanjanalys kopplar intryck och klick till omvandlingar, publikkontext, kontaktaktionsresultat och kampanjinlärning.

Produktskärm
KampanjanalysPromotion analytics visar rubrikprestanda, publik och utlöser nedbrytningar, leder export- och kontakteffektresultat.KampanjanalysWorkPayIMPRESSIONS42.8kCTR6.4%CONVERSIONS814Livet Arbetarspace VIEWLandstingFörenade kungariket · 31%UppdelningSidan/pricing · 22%UppdelningUtlösareAvsluta avsikt · 44%UppdelningConnector-åtgärdKupong skapad · 97% framgångResultat1MätaImpressioner till omvandling2SLICESidan, landet, enheten3LEARNApplicera insikten
Promotion analytics visar rubrikprestanda, publik och utlöser nedbrytningar, leder export- och kontakteffektresultat.

Läs intryck, klickfrekvens och omvandlingar tillsammans. Bryt resultat ner av land, sida, utlösare och enhet; exportera fångade leder när det behövs. Connector-åtgärdsresultat visar huruvida kampanjens utlovade uppföljning faktiskt sprang. AI insikt och inlärningssammanfattningar bör behandlas som hypoteser för att validera, inte automatiska bevis.

Tillväxt och SEO

Meddelanden

Meddelanden publicerar ett meddelande i widgetmeddelandeområdet med valfri riktad, schema och uppmaning till handling.

Produktskärm
MeddelandenTillkännagivandet redaktören innehåller innehåll, CTA, publik, segment, sida regel, aktiva datum och visuell stil.MeddelandenWorkPayAKTIV3AUDIENCESegmentScheduleJul22–29Livet Arbetarspace VIEWTitelPlanerat underhållRedoInnehållMarkdown-meddelandeRedoCTALäs uppdateringenOptionellRegelPrissättning sidor · aktiva kunderMål1WRITETitle och Markdown2TargetAudience, segment, sida3ScheduleAktivt fönster
Tillkännagivandet redaktören innehåller innehåll, CTA, publik, segment, sida regel, aktiva datum och visuell stil.

Välj alla besökare, inloggade besökare eller nya besökare; valfritt begränsa publiken med ett kontaktsegment och sidregel. Ställ in aktiv-från / aktiv-till-datum och en aktiv flagga. Premium stil förinställningar och färger ändra presentation men inte ersätta tydligt innehåll.

Tillväxt och SEO

Push kampanjer

Push-kampanjer skickar webbläsarmeddelanden till prenumererade besökare efter att de har lämnat webbplatsen.

Produktskärm
Push kampanjerTryckkompositören visar abonnemangsåtkomst, innehåll, media, åtgärder, målregler och schemaläge.Push kampanjerWorkPaySUBSCRIBERS8,214SEND31.6kCLICK RATE5.8%Livet Arbetarspace VIEWTitelDin kundvagn väntarRedoKroppÅtervänd idag för gratis leveransRedoCTAÖppen kundvagnRedoSchemaläggaSkicka nu eller schemalagdUtkast1PREPARE PUSHTitel, kropp, ikon2TargetAudience, segment, sida3SENDNu, schema eller utkast
Tryckkompositören visar abonnemangsåtkomst, innehåll, media, åtgärder, målregler och schemaläge.

Konfigurera Web Push-nycklar först under webben Push inställningar. En kampanj kan innehålla titel, kropp, ikon, hjältebild, märke, CTA och upp till två aktionsknappar; en beständig anmälan kvarstår tills besökaren interagerar.

Mål för publik, valfri kontaktsegment och sidregel. Spara ett utkast, schemalägga det eller skicka omedelbart. Använd prenumerationen och klicka mätvärden för att bedöma nå. HTTPS och en korrekt värd servicearbetare krävs på inbäddade tredjepartswebbplatser; se webb push på webbplatser från tredje part.

Tillväxt och SEO

Proaktiva meddelanden

Proaktiva meddelanden når ut automatiskt när en besökares beteende matchar en regel, innan de frågar. Du bygger var och en som regel med tre delar: vad som ska hända, när det ska elda och hur ofta. Allt levereras genom den. OpsIQ widget redan på din webbplats.

Proaktivt
Proaktiva meddelandenEn proaktiv-rule kompositör i tre delar: välj en åtgärd (chatt, banner, turné, push, e-post), lägga till villkor och ställa in en frekvens nedkylning.Proaktiva meddelandenWorkPay1 · ÅtgärdChattmeddelandeBanderollTurnéTryckE-post2 · Villkorpage = /pricingtid på sidan > 20sÅtervändande3 · FrekvensEn gång per sessionStatus1ÅtgärderChatta, banner, e-post, push...2CONDITIONSSidan, tid, poäng, retur3FrekvensCooldown per besökare
Varje proaktiv regel är tre val: vad som händer (chatt, banner, turné, push, e-post, webhook), när (villkor) och hur ofta (cooldown).

De tre delarna av en regel

1
Vad som ska hända (åtgärd)

Visa en chattbubbla eller på sidan banner, starta en guidad tur, skicka ett webb push eller e-post, tilldela till en avdelning eller avfyra en webhook. Tokens som {{visitor_name}} och {{page_title}} bli verkliga värden.

2
När det skall skjuta (villkor)

Narrow som utlöser det: sida/URL, tid på sidan, bläddra djup, blypoäng, återvända vs nya, tomgång. Utan några villkor, regeln bränder för varje besökare. Lägg till minst en att rikta det. Villkor kombinera med OCH.

3
Hur ofta (frekvens)

Ställ en nedkylning så att samma person inte är pestered, t. ex. en gång per session eller en gång om dagen. Varje regel har en in-/off status.

⚠️
Arbetsytan växlar "Run time/idle-reglerna timly" låter serversidan åtgärder (email, push, webhook, assign) eld på ett schema för kända kontakter som inte är för närvarande på sidan, så att du kan "email idle hot leads" automatiskt. Det behöver OpsIQ cron kör. Lämna det om du bara vill ha live på sidan nudges.
Kommer det att elda för alla?+

Endast om du inte lägger till några villkor. Lägg till minst ett villkor (sid, blypoäng, retur...) för att rikta rätt besökare.

Hur relaterar dessa till flöden och turer?+

De arbetar tillsammans: en proaktiv regel kan starta en guidad tur, och ett chatbotflöde kan utlösas av en proaktivitetsregel. Börja med en enda chatt-meddelanderegel, sedan lager de andra på.

Tillväxt och SEO

Chatbot flyter

Chatbot Flows script förgreningskonversationer inuti din chatt widget (hälsningar, sökords svar, guidade vägar) utan kod. Ett flöde är en uppsättning anslutna steg (noder): du ställer en fråga, besökaren plockar ett alternativ, och flödet skickar dem ner matchande grenen. Bara aktiva flöden körs på din webbplats.

Hur det fungerar
Chatbot flyterEtt flöde duk: en hälsningsnod grenar i tre alternativ knappar, var och en leder till ett nästa steg, leta upp ordning eller lämna ut till en människa.HälsningHej! Hur kan jag hjälpa?Spåra min orderBilling QuestionPrata med en människaTitta upp order→Mänsklig agentTriggers: Hälsning · Nyckelord · Manuell · Efterdetaljer · On-chat-end
Chatbot flyter

Flödes vs AI · när du ska använda

Använd ett flöde

När vägen är förutsägbar och du vill ha den identisk varje gång: bokning steg, en returguiden, en "vilket plan?" väljare, samla ett e-postmeddelande före handoff. Flödningar improviserar aldrig.

Använd AI

När frågor är öppna, "gör detta arbete med min installation?". Kundchatt AI svarar från din utbildade kunskap. Ett flöde kan lämnas till AI (eller en människa) när som helst.

Utlösare

Hälsning

Körs som öppningsmeddelande när en besökare först öppnar chatten.

Nyckelord

Körs när besökaren skriver ett ord som du listade (t. ex. återbetalning, prissättning, avbokning).

Efter detaljer / efter fördröjning

Börjar när kontaktuppgifter delas, eller en viss tid i konversationen.

På chattänden / Proaktiv

Körs som chatten slår upp (t. ex. ett betyg), eller startas av en proaktiv meddelanderegel.

Bygg en i fyra steg

1
Skapa flödet

Klicka på Ny Flow, namnge den, välj en triggertyp (och sökord om Keyword), spara. Det börjar stängas av.

2
Öppna duken

Klicka på Redigera Canvas. Den visuella byggaren där du lägger till steg (meddelanden, frågor med knappar, grenar) och anslut dem.

3
Lägg till grenar och en hand-off

För varje val, dra en gren till nästa steg. Sluta vägar genom att lösa, överlämna till AI eller överföra till en människa.

4
Gör det möjligt

Klicka på Aktivera. Flödet går live i din widget omedelbart. Inaktivera när som helst utan att förlora designen.

Ersätter flöden AI?+

Nej. De kör sida vid sida. Använd flöden för förutsägbara vägar och AI för öppna frågor; ett flöde kan alltid lämnas till antingen.

Tillväxt och SEO

Guidade turer

Guidade turer är steg-för-steg-vandringar som pekar på delar av din sida med talbubblor och en spotlight, guida en besökare genom ombordstigning eller en ny funktion. De är fullt tema och byggd i en visuell designer med en levande förhandsvisning. En turné går bara när den markeras Active.

Hur det fungerar
Guidade turerEn dimmed sida med en spotlight ring runt en Add-deal knapp och ett tema tal bubbla läsa steg 1 av 4 med en nästa knapp.+ Lägg till dealSTEP1OF4Skapa din första dealKlicka här för att lägga till en affär i din pipeline.Nästa →
Guidade turer

Hur en turné är byggd

Steg

Varje steg riktar sig mot ett element och visar en bubbla med din text. Lägg till så många stopp som genomgångsbehoven och beställa dem.

Förinställningar & tema

Börja från en förinställning eller design din egen bubbla (färger, gradienter, spotlight) med en levande förhandsvisning till höger.

Utlösare

Alternativt länka en Proaktiv Regel så turnén autostarts när den här regeln bränder (t. ex. en återvändande besökares första instrumentbräda besök).

Aktivt växel

En turné är berättigad att springa endast medan Active blir kryssad. Untick för att ta ner det utan att ta bort det.

Bygg en i fyra steg

1
Ny turné

Klicka på Ny guidad tur, namnge den och länka eventuellt en proaktiv regel så att den startar automatiskt.

2
Lägga till steg

Lägg till varje stopp: välj det element som den pekar på och skriv bubbeltexten. Beställ tills vägen strömmar.

3
Designa den

Välj en förinställning eller stil bubblan själv. Live förhandsvisning visar exakt vad besökare ser.

4
Aktivera

Tick Active och spara. Turnén kan nu köras, på egen utlösare eller startas av en proaktiv meddelanderegel.

Hur börjar turer?+

På egen utlösning, eller via en Proaktiv Meddelande regel "Guided tour" -åtgärd, så du bestämmer vilka besökare som ser vilken turné och när.

Tillväxt och SEO

Konverteringsmål

Omvandlingsmål vänder en aktivitet du bryr dig om (en inkommande webhook-händelse, ett chattmeddelande, en biljettupplösning) till en inspelad konvertering med full attribution. När aktiviteten bränder, OpsIQ loggar en omvandling mot kontakten och knyter den tillbaka till de kampanjer, segment och källor som ledde där.

Hur det fungerar
KonverteringsmålEtt målflöde: en betalning.succeeded webhook-evenemang blir ett inspelat "köp" konverteringsvärde $49, tillskrivs dess källa och kampanj, med snabbstart förinställda chips ovan.SnabbstartStripe köpDemo bokadeNyhetsbrev signuppayment.succeededInbound WebhookKonvertering"köp" · $49AttributeradKälla · Kampanj
Konverteringsmål

Definiera ett mål i tre steg

1
Välj utlösare aktivitet

Klicka på Ny omvandling mål. Välj aktivitetstyp som räknas som en omvanda, eller använd en snabbstart förinställd, Stripe inköp, Demo bokad, nyhetsbrev registrering eller prenumeration startade.

2
Namn och ange ett värde

Ge konverteringen ett namn (köp, demo_booked, signup) och valfritt ett fast värde och ett attributionsfönster.

3
Spara

Spara och aktivera. Från och med då, när aktiviteten brinner, OpsIQ registrerar en omvandling mot kontakten med hänvisning till de föregående beröringarna.

Mål är redan trådbundna till inkommande webhooks: varje mål vars utlösare matchar en inkommand händelse typ bränder automatiskt i det ögonblick evenemanget landar. Använd sidan Inbound Webhook för att ansluta Stripe, Kalendly eller något system som kan POST JSON_.
Vad kan vara en omvandling?+

Alla inspelade aktiviteter: en inkommande webhook händelse (payment. succeeded), en chatt e-post fånga, en biljett upplösning, allt på kontakt tidslinjen.

Analys

Anpassade instrumentbrädor

Anpassade Dashboards låter dig bygga din egen bild av mätvärdena som betyder något, istället för att lita bara på standardöversikten. Lägg till de widgets du vill ha, dra och ändra storlek på dem i den layout du gillar, spara det och dela med ditt team.

Anpassade instrumentbrädor
Anpassade instrumentbrädorEn instrumentpanelbyggare med KPI och diagram widget plattor, en streckad drop zone och en Add-widget knapp.Anpassade DashboardsWorkPayMin instrumentbräda+ Lägg till widgetVISITORER2,481Revenue$8.2kTrafikDra en widget härTopparingar/pricing/docs/signup1ADD WIDGETSPick Metrics & Diagram2ARRANGEDra & ändra storlek3HAREMed ditt team
Bygg ditt eget styrelse: lägg till KPI, diagram och list widgets, dra och ändra storlek på dem i den layout du vill ha, dela sedan med laget.

Bygg en i tre steg

1
Lägg till widgets

Klicka på Lägg till Widget och välj det metriska eller diagram du vill spåra. Upprepa för allt du vill ha i styrelsen.

2
Ordna layouten

Dra widgets att ompositionera och dra sina kanter för att ändra storlek. KPI över toppen, diagram nedan. Vad som än läser bäst.

3
Spara & dela

Spara instrumentbrädan och dela den med ditt team så att alla tittar på samma nummer.

Håll separata brädor för separata jobb (en "daglig blick" -bräda med levande räknas och en "månadsöversyn" -kort med trenddiagram) så varje vistelse fokuserad.
Tillväxt och SEO

Outreach-kampanjer

Outreach är OpsIQ s.1:1och bulk e-post motor: komponera ett personligt meddelande eller köra en kampanj till ett CRM segment, med svar detektering, sändningstid kontroll, öppen / klicka spårning, en spårningspixel och en-klick unsubscribe. Det är samtycke-gated och CAN-SPAM / CASL överensstämmer.

Utåtriktad verksamhet
Outreach-kampanjerUtåtriktad skärm med Composer / Kampanjer / Templater / Svar flikar och en kampanjtabell som visar skickade, öppna räntor och svarsfrekvens.Utåtriktad verksamhetWorkPayKampanjerKompositörMallarSvarKampanjSENDÖppnaSvarJuni nyhetsbrev1,20048%7%Trial uppföljning34062%14%Återvinning82039%5%Svara på detektering auto-stops uppföljningar · ett-klick unsubscribe på varje sändning11:1 & BULKKomponera eller kampanja2TRACKEDÖppnar, klick, svar3COMPLIANTUnsubscribe byggd i
Outreach-motorn: skicka1:1eller köra kampanjer till ett segment, spår öppnar och svarar, och förbli kompatibel med inbyggd unsubscribe och svara på detektering.

De fyra flikarna

Kompositör

Skriv en personifierad1:1e-post med {tokens} från kontakt och CRM.

Kampanjer

Skicka till ett CRM-segment, schemalagt eller nu, med mössor och sändningstidskontroll.

Mallar

Återanvändbara meddelandemallar för upprepad uppsökande.

Svar

Svara på detektering registrerar svar och auto-stops uppföljningar till alla som svarade.

Hur en kampanj löper

1
Välj en publik

Välj ett CRM-segment (eller ladda upp en lista). Förtryck och samtycke tillämpas automatiskt.

2
Komposit

Skriv meddelandet med personaliseringstokens; förhandsgranska mot en riktig kontakt.

3
Schema och skicka

Skicka nu eller vid bästa tidpunkt. En spårningspixelpost öppnas; klick och svar tillskrivs.

Outreach är samtycke- och undertrycknings-gated, innehåller ett one-click unsubscribe på varje sändning, och följer CAN-SPAM / CASL. Replies automatiskt stoppa ytterligare uppföljningar.
Analys

Schemalagda rapporter

Schemalagda rapporter e-post en vald metrisk inställning till utvalda mottagare på ett schema (dagligen, veckovis eller månadsvis) som en tryckbar, vitmärke PDF Ställ in den en gång och rapporten landar i inkorgar automatiskt genom OpsIQ cron.

Schemalagda rapporter
Schemalagda rapporterSkärmen för schemalagda rapporter: en tabell med rapporter med deras schema, mottagare och sista gången plus en knapp Save-report.Schemalagda rapporterWorkPaySchemalagda rapporter+ Spara rapportReportortScheduleRättsligaSenaste SENTVeckotrafikMon 9:00[email protected]_För 2d sedanSEO kundrapportMånadsvis[email protected]_Jun 1_FörsäljningssammanfattningDagligen[email protected]_todayLevereras som ett vitt märke PDF via OpsIQ Cron cron1AUTOMATEDDaglig · Veckovis · månatlig2VITE-LABELPDF till kunder3RättsligaEmailed on schema
Ange en rapport en gång (metrisk uppsättning, räckvidd, schema, mottagare) och OpsIQ e-postmeddelanden ett white-label PDF automatiskt på din kadens.

Ställ in en rapport

1
Välj vad du ska skicka

Välj den metriska uppsättningen (trafik, SEO, försäljning, support...) och ett datumintervall.

2
Ställ schema och mottagare

Dagligen, veckovis eller månadsvis, vid en tidpunkt du väljer, till en eller flera e-postmottagare.

3
Spara

Spara och aktivera. Rapporten genererar och e-postmeddelanden själv på schemat, inget manuellt steg.

💡
Planerade rapporter går igenom OpsIQ -kronan, om en rapport inte anländer, bekräftar att krönen körs (se Cron och automatisering).
Sekretess

Sekretess & compliance

Sekretess- och efterlevnadssidan är den enda platsen för att visa en revisor som du hanterar personuppgifter på ett ansvarsfullt sätt: samtyckesboken, admin åtkomstloggen, din dataresidentitet och lagringspolicy samt en färdig utskrift DPA, i en tabbad vy. Endast fulla administratörer kan öppna den.

Sekretess & compliance
Sekretess & complianceSkärmen Sekretess & Efterlevnad: flikar för Samtycklig huvudbok, Access-logg, Residency och DPA, med ett samtycke ledger tabell över bidrag och återkallar efter kanal.Integritet och efterlevnadWorkPaySamtycke LedgerAccess loggaBosättningDPA_KONTAKTChanelÅtgärderDatum[email protected]_e- postBeviljasJun 12_[email protected]_pushÅterkalladJun 10_[email protected]_marketingBeviljasJun 9_Sökbara bevis på varje samtyckesbidrag och återkalla, via kanal1RELATERAD LEDGERBevis på varje bidrag2ACCESS LOGVem rörde data3DPA_Utskrivbar mall för arkiv
En revisor-ready skärm: en sökbar samtyckesledare (bidrag / återkallar efter kanal), en åtkomstlogg över vem som rörde data, bostad/retention inställningar och en utskriftsbar DPA.

De fyra flikarna

Samtycke Ledger

En sökbar post av varje samtycke bidrag och återkalla, genom kontakt, kanal (email, push, SMS, in-widget), åtgärd, källa och datum. Ditt bevis på en kontakt överenskommen (eller drog tillbaka).

Access logga

Vem i ditt team såg, redigerade, exporterade, raderade eller skickade en kontakts data med administratören, kontakt, åtgärd, angiven anledning och IP Exakt vad en tillsynsmyndighet begär.

Bosättning och bevarande

Förklara var detta arbetsytas data lever, ange hur många dagar aktivitetsrader hålls.0 = för alltid), och registrera din datakontroller och DPO.

DPA mall

Ett utskrivbart databehandlingstillägg som fyller i din kontrollör, adress, DPO, bostad och lagring. Skriv eller spara som PDF.

Sekretess & Compliance par med Cookie samtycke studio (som samlar in samtycke) och Export sida (som producerar data kopia för en DSAR). Se även Cron och automation för nattlig lagring rengöring.
Kopplingar

Anslut dina plattformar

Connectors länk OpsIQ till externa plattformar: e-handelsbutiker, faktureringssystem, betalningsprocessorer, e-postleverantörer och anpassade APIs När du är ansluten kan AI leta upp order, kunddata, prenumerationer och mer och vidta åtgärder med ditt godkännande.

Hur det fungerar
Hub för kontaktdonOpsIQ Kärnansluten till WHMCS, Shopify Stripe, WooCommerce SendGrid och Google Business Profile, som visar en ansluten status.WHMCS_Shopify_Stripe_WooCommerceSendGridGoogle BPOpsIQ_Kärna1PLUG IN25+ pre-byggda kontakter2AI CONTEXTReal plattform data3ACTIONSGör med ditt godkännande
Kopplingar

Fartyg med OpsIQ

Dessa är närvarande det ögonblick du installerar och behöver bara deras referenser.

WHMCS_

Fakturering

Webbhotell fakturering: kunder, tjänster, biljetter, faktura, domäner, servrar.

Shopify_

E-handel

E-handel: order, kunder, produkter, lager, betalningar, webhooks.

WooCommerce

E-handel

WordPress e-handel: order, kunder, produkter, kuponger, sjöfart.

WordPress

CMS

Innehåll och användare på en WordPress -webbplats.

Square Square

Betalningar

Betalningar och försäljningsställe: order, kunder, katalog.

osCommerce

E-handel

Legacy e-handel: order, kunder, produkter.

Botble Hotel

Bridge

En Botble CMS-hotellplats genom den undertecknadeOpsIQbron. Referensgenomförandet för en plattform utanAPI.

Zendesk_

Stöd för support

Helpdesk: biljetter, användare, organisationer, kommentarer.

Google företagsprofil

Marknadsföring

Lokal verksamhet: recensioner, inlägg, Q & A, insikter. Använder OAuth.

Google Kalender

Produktivitet

Kalendrar och händelser.OAuth.

GmailochIMAP

E-post

Mailboxes: inkommande och utgående post, adressbok synkronisera.

SendGrid

E-post

E-postleverans: skicka e-post och hantera mallar.

Mailgun_

E-post

E-postleverans: skicka e-post via Mailgun.

Slack, TelegramLINE, X DM

Messaging

Meddelande kanaler för inkommande och utgående samtal.

Meta kanaler

Messaging

Facebook Messenger, Instagram DM och WhatsApp.

Site Intelligence (Intelligens)GA4 Sök konsol)

Analys

Analytics och sökdata för SEO -paketet.

Webbplatsberikning och CRM import

CRM_

Företagsberikning och bulk kundimport.

Tillgänglig från marknaden

Dessa publiceras paket, inte en del av installationen. Installera en från Connectors, Marketplace och den kopieras till mappen livekontakter, varefter den beter sig precis som de ovan.

Stripe_

Marknadsplats

Betalningar: avgifter, kunder, fakturor, prenumerationer, utbetalningar, tvister.

BigCommerce

Marknadsplats

E-handel: order, kunder, produkter, kategorier, varumärken.

Magento 2_

Marknadsplats

E-handel: order, kunder, produkter, kategorier, lager.

PrestaShop

Marknadsplats

E-handel: order, kunder, produkter, kundvagnsregler, transportörer.

OpenCart

Marknadsplats

E-handel: order, kunder, produkter, kategorier.

Amazon SES,Postmark, Resend

Marknadsplats

Transaktionell e-postleverans.

Jira, linjär

Marknadsplats

Problem och projektspårning.

Zoom, Microsoft Kalender, Outlook Mail

Marknadsplats

Möten, kalendrar och post.

DocuSign, Apollo, SerpApi, Google Analytics_

Marknadsplats

Signatur, prospektering, sök- och analysdata.

Webflow, Wix, Squarespace

Marknadsplats

Webbplatsplattformar.

💡
Anslutningslistan flyttas som paket publiceras. Den auktoritativa listan för DIN installation är Connectors-sidan: vad som anges finns det vad runtime upptäckte, och fliken Marketplace visar vad du kan lägga till.

Installera en kontakt

1
Gå till Connectors

Navigera till Connectors i admin sidofältet.

2
Hitta kontakten

Bläddra i listan eller sökningen. Anslutningar grupperas efter kategori.

3
Gör det möjligt

Klicka på kontakten och växla aktivera.

4
Ange referenser

Fyll i de nödvändiga fälten: API Nyckeln, URL, tokens etc. Varje kontakt har specifika krav dokumenterade i sin inställningspanel.

5
Testanslutning

Klicka på "Test Connection" Ett grönt resultat innebär att kontakten kan nå den externa plattformen. Ett rött resultat visar felet.

6
Konfigurera funktioner

Välj vilka funktioner som ska aktiveras: kunskap synkronisera, webhook sync, AI-åtgärder. Inte alla kontakter stöder alla funktioner.

Vilka kontakter ger dig

AI-kontext

AI kan titta upp kunddata, order, prenumerationer och mer genom kontakten. När en kund chattar har AI verkliga plattformsdata för att referera till.

AI-kontext (connector authors)

Din kontakt ContextProvider matar biljett-AI en lätt konto sammanfattning av biljettägare. Lös kunden genom customer_id när det är känt, annars, på biljett auto-replies, där ctx flaggan customer_trust_email är sant, se kontot upp av customer_email (den verifierade biljettsändaren). Fjärrplattformar avslöjar en /context/customer-by-email endpoint och kontakten kallar det. Detta är vad som gör AI citera en verklig balans / faktura istället för att säga "vänlig logga in."Härskar operatörens dataklass växlar (Säkerhetsinloggning).customer_sections, customer_allow_credit) och håll dig strikt läs-bara, aldrig avge hemligheter.

Kundkatalog (connector authors)

Din kontakt IdentityProvider matar tre universella biljettuppslag: lookupCustomerById() (kundkort), lookupCustomerServices() (produkt/servicebord) och listCustomers($query,$limit): "Sök kund eller typ e-post" -väljare på den infödda Compose-New-Ticket-formuläret. Return rader av {id, external_id, name, email, company, phone, platform, platform_label}. Fjärrregel: Om dina kunder bor i en annan databas eller tjänst, hämta dem över din plattform API i dessa metoder, läs aldrig det andra systemets tabeller direkt (i OpsIQ DB de är tomma platshållare, vilket är anledningen till att en lokal läsa returnerar en tom plockare). Gate den avlägsna vägen på din konfigurerade API URL Håll en lokal läs bara som en sam-DB-nedgång.

E-postpiped biljetter, detektering och routing (connector authors)

När inkommande e-post blir en infödd biljett, detekterar OpsIQ avsändaren genom att ringa lookupCustomerById(0, ['email'=>$sender]) över varje kontakt; den första matchen "äger" kunden och dess platform Slämma är stämplad på ticket.created Evenemang som _pipe_owner_platform (Töm = gäst) Så en WHMCS Kunde-mail öppnar en biljett i WHMCS (WHMCS Numrering, speglad som en), medan en okänd avsändare stannar en infödd gäst. Om din kontakt speglar infödda biljetter på sin egen plattform, din ticket.created Handlaren måste gate på detta: if (array_key_exists('_pipe_owner_platform',$payload) && $payload['_pipe_owner_platform'] !== '<your-slug>') return;Nyckeln är frånvarande på icke-piped (chatt / manuell / AI) biljetter, så de speglar som tidigare. Per-department kontroll bor under Team & Departments → Öppna biljetterna via e-post (endast någon / Kunder / Off).

Åtgärder

AI kan utföra åtgärder genom kontakten: skapa biljetter, uppdatera order, avbryta prenumerationer, allt med ditt godkännande via Trust Layer.

Kunskap

Connectors bidrar med plattformsspecifika kunskapsartiklar till AI. Shopify Anslutning lägger till e-handel felsökning; WHMCS Connector lägger till hosting kunskap.

Kunskapsbasimport (connector authors)

Om din plattform är värd för en kunskapsbas, förklara en kb_capabilities block i settings.json (typ) kb_source) och din kontakt visas i Help Center-redigerarens Importera KB → Importera från en ansluten app nedgång när den är aktiverad och konfigurerad i arbetsytan. Det är deklarativt, ingen metod att genomföra: namnge en inbyggd adapter (zendesk för det exakta hjälpcentret API eller crawl för alla KB-webbplatser) och en base_template Såsom https://{subdomain}.zendesk.comsom OpsIQ fyller från din kontakt lagrade inställningar. Krediter lämnar aldrig servern; webbläsaren skickar bara anslutningsslammet. För att stödja en ny plattform, lägga till en opsiq_kb_<platform>_manifest() adapter och referera till den med namn. Fullständig referens: connectors/PLATFORM_CONNECTORS.md §5.

Webhooks

Vissa kontakter registrerar webhooks med den externa plattformen för evenemangsmeddelanden i realtid (nya order, biljettuppdateringar etc.).

Försäljningsspårning

E-handelskontakter matar intäktsdata till Sales instrumentbräda för attribution och analys.

💡
Anslutningar är arbetsyta-scoped. Varje arbetsytan kan ha olika kontakter aktiverade med olika referenser.WHMCS Workpace använder WHMCS anslutning; en Shopify Workpace använder Shopify Anslutning.
Kan jag använda flera kontakter samtidigt?+

Ja. Du kan ha Shopify För beställningar och Stripe för betalningar i samma arbetsyta. AI sammanfogar data från alla aktiverade kontakter.

Tänk om min plattform inte är listad?+

Använd Connector Builder för att skapa en anpassad kontakt för alla plattformar med en REST API Eller kontrollera marknadsplatsen för gemenskapsbyggda kontakter.

Få kontakter att arbeta med självhävd OpsIQ?+

Ja. Connectors arbetar identiskt med både moln och självvärda utgåvor.

Kopplingar

Försäljning och fakturering av kontaktkontrakt

Varje handelskontakt använder samma plattform-neutrala händelseavtal. WHMCS är referensgenomförandet, men SaaS Bridge, butiker, betalningsleverantörer, anslutningar på marknaden och Connector Builder-paket måste följa samma regler.

Vad varje handelskontakt måste publicera

En auktoritativ huvudbok

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.

Stabil källidentitet

plattform är connector registry slug, till exempel whmcs, shopify eller opsiq_saas. traffic_source innehåller verifierad förvärvsegenskap när den levereras; annars använder samma slug som nedgången. Store identifierare, inte visa etiketter. OpsIQ löser det vänliga kontaktnamnet i UI.

Idempotens

Event_id måste vara deterministisk. Karta minst en oföränderlig order_ref, invoice_reff eller prenumeration_refi så webhook retries och backfills uppdatera samma händelse istället för att skapa dubblettförsäljning. service_refe identifierar den drabbade produkten eller tjänsten när man existerar.

Källa timestamp

Det är den betalning eller ekonomisk-event tid som rapporterats av källplattformen. Byt aldrig ut historiska betalningsdatum med importtiden.

Pengar och FX

Skicka källbeloppet och en giltig tre-brevs ISO-valuta. Om anslutningsinställningen möjliggör OpsIQ FX-omvandling, rapportering konverterar till arbetsutrymmet rapporteringsvaluta; annars rapporterar bevara butiken eller faktureringsplattformsvalutan. Connector-kod får inte hårdkoda en rapporterings valuta eller växelkurs.

Bevisbaserad livscykel

Använd nya, förnya, uppgradera, återbetala, kredit eller okänt. Klassificera från fakturaskäl, prenumeration eller servicerelationer, linje-item typ eller annat auktoritativt källfält. Ett upprepande köp av samma kund är inte automatiskt en förnyelse.

Försäljningsgräns

Endast positiva betalda nya, förnyelse, uppgradering eller legitimt okända handelskvitton hör hemma i Försäljning & Konverteringar. Återbetalningar rapporteras av återbetalning och nettointäktsanalys. Konto kredit, plånbok top-ups, token top-upps och Add Funds förblir faktureringsledger händelser och aldrig räknas som försäljning, omvandlingar, ordervolym eller försäljning intäkter.

CRM stannar separat

CRM-erbjudanden representerar pipeline och affäraktivitet. De är inte handelsplattform försäljning om en ansluten fakturering eller butiksplattform avger den realiserade betalda ordern eller faktura genom detta avtal.

Varje betalningssignal öppnar raden

Beroende inte på ett evenemangsnamn. När plattformen skickar flera bekräftelser av en betalning (faktura betalad, beställningsbetald, tillägg till transaktionen), kan någon av dem öppna ledger raden när plattformen bekräftar försäljningen betalas; försäljning fingeravtryck kollapsar syskon i en rad.

Schemalagd försoning (kontrakt 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.

Härledda prognoser

opsiq_conversions och instrumentpanel sammanfattningar är kompatibilitet prognoser byggda från huvudboken. Connectors får inte behandla en projektion som den finansiella källan till sanning. Kontrakt revideringar kan omvärdera härledda rader utan att ta bort den underliggande faktureringshistoriken.

Fjärrplattform gräns

En fjärrkontakt läser sin plattform genom den konfigurerade autentiserade API Det får aldrig bero på samma serverdatabastabeller. Den exakta autentiserade domänwebbplatsen_key levereras av ConnectorRegistry och måste tillämpas på varje huvudbokskrivare och backfill. Workspace eller gruppomfattning är endast lästidsaggregering; det får aldrig bredda lagrade evenemangsägande.

Canonical betald-event exempel

Normaliserad handel händelse
{
  "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"
}

Mappning av Connector Builder

När Försäljning och fakturering aktiveras i Connector Builder, kartbelopp, valuta, källstatus och källa datum, plus minst en order, faktura eller abonnemang referens. Karta Lifecycle_type när den API exponerar auktoritativa livscykelbevis. Den genererade SalesIngest passerar varje rad genom samma CommerceEventRegistry normalizer som används av inbyggda och marknadsplatskontakter.

⚠️
Krediter och tilläggsfonder behålls avsiktligt för faktureringshistorik, kundbalanskontext och huvudbokanalys. Exklusive dem från försäljning tar inte bort dem; det hindrar dem bara från att blåsa upp handelsprestanda.

Lifecycle_type bestämmer vad som blir en CRM-affär

lifecycle_type är inte en analys etikett. OpsIQ läser det för att avgöra om en försäljning går in i CRM-ledningen, så varje försäljningskontakt gör ett pipelinebeslut oavsett om den tänker eller inte.

ny

Öppnar en sluten affär (ny verksamhet).

förnyelse, uppgradering

Inspelad som återkommande intäkter. Ingen nyföretagsavtal - förnyelser konverterar på en annan sannolikhetskurva och blandar dem korrupta båda prognoserna.

återbetalning, kredit

Aldrig öppnar en affär, i vilket läge som helst. Pengar återvände till en kund är inte en vinst.

utelämnad/okänt

Intäkter bara. Försäljningen registreras men når aldrig pipeline.

En försäljning, en huvudbok rad: identitet är SALE, inte händelsen

Inte matcha på event_id och sätt in dig själv. event_id is platform:eventName:externalId, som svarar "did we already process this delivery" och kan inte svara "har vi redan registrerat denna försäljning". en plattform som meddelar en betalning två gånger - som invoice.paid och igen som payment.completed Mints två id och landar samma pengar två gånger, med ingenting att kollidera och inget att varna.

💡
Hittade på referensinstallationen: sex fakturor med tre huvudbok rader vardera, från tre kodbanor med hjälp av tre olika event_id system. De alla bar 0.00 så ingen total såg fel, och någon senare process återställa verkliga belopp skulle ha räknat en betalning tre gånger.

Ring den delade skriva istället. Core beräknar försäljningens affärsidentitet (sale_fingerprint), matchar en befintlig rad på den, bevarar originalet event_id på uppdatering och filter till riktiga kolumner:

Det enda stödda sättet att skriva försäljningsledaren
\OpsIQ\Commerce\CommerceEventContract::upsertSaleRow('opsiq_sales_events', $row);
Samma försäljning, många evenemang

invoice. paid, pay. completed and sales. comfullt för en faktura dela ett fingeravtryck och uppdatera en rad.

Återbetalningar förblir separata

Pengar går ut är ett annat faktum från pengar som kommer in. En återbetalning av en faktura håller sin egen identitet, så det kan aldrig överskriva den betalning den vänder.

Ingen referens, inget fingeravtryck

En rad som inte bär någon order, faktura, prenumeration eller servicereferens får inget fingeravtryck alls, så två orelaterade rader kolliderar aldrig bara för att båda saknar ett id.

Referensföreträde

invoice_ref, sedan order_reff, sedan prenumeration_refi, då service_refa - starkast först, så en försäljning håller en stabil identitet.

Ledgern är bara tillägnad: aldrig skriva en försäljning

En återbetalning, en avbokning eller en korrigering är en Ny daterad ingångAldrig mutera raden det korrigerar. Skriva en betalning till återbetalning ser snygg ut och bryter tre saker samtidigt:

Det förstör bruttointäkterna

Bruttoförsäljning och återbetalningsgraden slutar vara separerbar - och återbetalningsfrekvens är mätvärdet som omkastningen finns för att informera.

Den bokar omvändelsen under fel period

En mars återbetalning av en januariförsäljning måste minska mars. Skriva om Januari rad tyst vilar en stängd period.

Det bryter revisionsleden

En huvudbok registrerar vad som hände vid en tidpunkt. Korrigeringar är kontra-entries, vilket är hur dubbelinträde bokföring har fungerat i fem århundraden.

Så en kontakt rapporterar omkastningen snarare än att tillämpa den: returnera refunded_at och refund_amount Vid sidan av försäljningens egen livscykel, och låt uppringaren skriva återbetalningen som sin egen rad daterad när återbetalning skett. De två kan aldrig kollidera, eftersom försäljningsfingeravtrycket skiljer en retur från en försäljning.

💡
Samma princip gäller för belopp. "Reparera" inte ett lagrat belopp till plattformens nuvarande värde: en faktura som avgjorts från kontokredit registrerad legitimt0Vid betalningstid, och pengarna registrerades redan när kunden toppade upp. Återställande av ansiktsvärdet räknar det två gånger.

Klassificeringsavtalet

OpsIQ bestämmer livscykeln en gång, in \OpsIQ\Commerce\SaleLifecycleClassifierEn kontakt förklarar endast vilken av egen plattform ord betyder vad, genom att implementera \OpsIQ\Connectors\SalesLifecycleConnectorInterface::salesLifecycleVocabulary()Och sedan kallar den delade klassificeraren. Gör inte omfördela resonemanget.

Deklarera ordförråd, delegera beslutet
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,
]);
💡
Precedence är fast och delas: explicit, sedan återbetalad / avbruten, sedan kredit, uppgradera, då is_order, sedan upprepar, sedan förvärva, sedan okänt. Uppgradera sitter ovanför orderkontrollen eftersom plattformar höjer en beställning för uppgraderingar också; återkommande ligger under det eftersom den första fakturan av ett nytt abonnemang bär en återkommaande linje typ. På en tvetydig icke-ordning försäljning klassificerar lutar till intäkter och bort från rörledningen.

Förklara plattformens hela ordförråd

Detta är det misslyckande som kostar mest och ser minst fel. WHMCS -kontakten matchade ['hosting','addon','domain'] En lista som läser så fullständig.WHMCS Avger inte en bare Domain Typ för riktiga domänlinjer; det avger DomainRegister, DomainRenew, DomainTransfer, PromoHosting, PromoDomain, DomainAddon* och UpgradeAlla föll förbi listan unknown1,288 fakturor, tre år, inget fel och ingen logglinje.

Varje ny kund importerar sin historia genom en kontaktbackfill, så en klassificeringsbugg påverkar inte ett arbetsutrymme - det påverkar varje arbetsyta som någonsin ombord genom den kontakten, för tillfället tittar de först på sin pipeline. Ta ordförråd från plattformens dokumentation eller en folkräkning av levande data och matcha växande familjer genom Prefix Så en syskon som ingen har sett ännu klassificerar med sina släktingar istället för att försvinna.

💡
En praktisk kontroll: räkna hur många av dina egna rader landar på okänd. En hälsosam försäljningskontakt klassificerar nästan allt. En stadig ström av okänt är nästan aldrig data du inte har - det är ett ordförråd som kontakten aldrig lärde sig att läsa.

Reparera importerad historia

Varje levererad OpsIQ försäljningskontakt genomför detta — 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() Använda vad per-record fetch din kontakt redan har. tools/crm_backfill_sales_lifecycle.php sedan reparerar din kontakt importerade historia utan per-connector kod: torr körs som standard, backar sig upp och verifierar radräkningen innan du skriver, reversibel genom en undo huvudbok, och det skriver aldrig en misslyckad läsa som ett svar.

💡
Om din kontakt inte kan läsa tidigare poster - en webhook-only connector inte - inte knuffa metoden. En stub som returnerar okänt är värre än ingen implementering: en backfill skulle skriva om bra rader som oklassificerade och rapportera framgång.
💡
Detaljerade paketreferenser finns fortfarande tillgängliga i kontakter / Connector_EVENTS. md och anslutningar/PLATFORM_CONNECTORS. MD i självvärda källdistributioner.
Kopplingar

Journey Event Contrakt

Journey Intelligence accepterar en plattformsneutral händelse kuvert från webbläsare widget, inbyggda kontakter, SaaS Bridge, marknadsplats paket och Connector Builder utgång. Plattform specifika namn översätts vid kanten; tratt, attribution och Site Intelligens koden förbrukar endast kanoniska händelser.

Isolering och förtroende gräns

Exakt peer-domain nyckel

Varje händelse är bunden till den autentiserade domänwebbplatsen_key. En kontakt måste ta nyckeln från ConnectorRegistry eller dess autentiserade slutpunkt, aldrig från ett opålitligt förfrågningsorgan. Domäner håller separata poster; en domängrupp är endast en lästidsaggregat.

Idempotent identitet

Event_id krävs för kontakter och måste vara deterministiskt för samma inhemska händelse. Retries, webhooks and backfills uppdaterar ett evenemang snarare än duplicera en resa eller försäljning.

Infödda plus kanoniska namn

Bevara source_event_name för bevis och felsökning, sedan kartlägga det till event_nam_canonical. Core analytics får aldrig gren på en kontaktslämma.

Server bevis vinner

Webbläsarobservation kan starta eller dra slutsatsen en resa. Authenticated connector events bekräftar registrering, inloggning, betalning, köp, förnyelse, återbetalning och andra terminala resultat. En giltig platsbunden korrelationstoken är den starkaste gåvan; ett ogiltigt token avvisas och dess inbäddade ID-skivor litas inte på.

Sekretess

Skicka endast identifierare och fält som behövs för den deklarerade resan. Respekt samtycke, maskering och lagringsinställningar. Placera aldrig referenser, kortdata, autentiseringshemligheter eller privata meddelandeorgan i egenskaper.

Canonical kuvert

Journey event kuvert
{
  "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"}
}

Kanonisk taxonomi

Använd det smalaste sanningsenliga namnet. Supported familjer inkluderar engagemang sida / CTA händelser; kontoregistrering, inloggning, MFA och lösenord återställning; bly och form stadier; produkt, kundvagn, checkout, betalning, köp, prenumeration, förnyelse och återbetalning; främjande av intryck och omvandlingar; hjälpcenter, chatt och biljetthändelser; säkerhetshändelse; och namnspaced custom events. Typiska terminalnamn är account.signup.succeeded, account.login.succeeded, lead.form.succeeded, commerce.payment.succeeded, commerce.purchase.completed, commerce.subscription.renewed och commerce.refund.completed.

Webbläsarinferens, bekräftelse och övergivande

Widgeten kan fungera utan en kontakt genom att observera sidstruktur, bilda åtgärder, DOM-resultat och besökarresan log. Det beviset förblir uttryckligen graderat som observerat eller slutfört. En anslutning lägger till auktoritativ serverbekräftelse och kan korrelera det till samma webbläsare försök. Övergivande lagras först som kandidat; det blir övergiven endast efter inaktivitet fönster i UI och bara när ingen senare återhämtning eller framgång finns.

Attribution och intäkter

Attribution föredrar en giltig undertecknad korrelationstoken, sedan en exakt resa, försök, session eller handel referens, då den medgivande identitet graf och slutligen en gränsad beteende match. Oöverträffade försäljning förbli otillförlitlig. Multi-touch ledger vikter måste totalt 1. Site Intelligence attributed intäkter läser denna huvudbok; krediter, plånbok top-ups, token top-upps och Add Funds är aldrig köp omvandlingar. Connector FX beteende förblir kontrollerad av den kontaktinställningen.

⚠️
Attribution modell, återblick fönster, direkttrafik hantering, minimalt förtroende, övergivande timeout och tratt definitioner är UI policy. Connector code får inte hårdkoda dem.

Connector manifest och Builder

Connector resedeklaration
{
  "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"
    }
  }]
}

Deklarera endast kapacitet som paketet verkligen levererar. Connector Builder validerar kartläggningen och genererar samma plattformsneutrala adapter som används av förstapartspaket. Reseintag accepterar en händelse eller ett gränsat parti av 100 genom den genererade autentiserade slutpunkten för integration.

💡
Handelsboken förblir den finansiella källan till sanningen. Den handel-till-resa bron publicerar server bekräftade resultat och försonar attribution efter befintliga obetydliga huvudboken upprör, så en betalning aldrig blir två försäljning.
Kopplingar

Hur AI-åtgärder fungerar

Varje kontakt förklarar en uppsättning åtgärder: saker AI kan göra genom den externa plattformen. Åtgärder är bron mellan "AI säger" och "Ai gör."

AI-åtgärder
Hur AI-åtgärder fungerarEn kundförfrågan mappade till ett raderingstyp-handlingskort, sedan en checklista: tillstånd kontrollerad, bekräftar du API _.Hur AI-åtgärder fungerarWorkPay"Cancel my prenumeration"kundAIcancel_subscriptiondeletebekräftar krävsparam: prenumeration_id (från sammanhang)Förhållande TYPESreadSkriv skrivandedeleteTillstånd och roll kontrolleradDu bekräftar åtgärdenAPI kallad · resultatrapporterad1DECLAREDVarje kontakt listar åtgärder2GATEDTillstånd + bekräfta3THEN RUNAPI call, resultera tillbaka
En begäran blir en deklarerad åtgärd (typad läs/skriv/ta bort) som är tillståndskontrollerad, bekräftad, sedan utförd och rapporterad.

Handlingslivscykeln

1
Kunden ber om något

"Avbryt mitt abonnemang." AI identifierar detta kräver "cancel_subscription" -åtgärden.

2
AI kontrollerar behörigheter

Är det tillåtet? Är det aktiverat? Har den nuvarande användaren rätt roll?

3
AI samlar parametrar

Aktiviteten behöver ett abonnemangs-ID. AI ser upp det från kundkontexten eller frågar kunden.

4
Bekräftelse

För destruktiva eller högeffektiva åtgärder, ber AI om bekräftelse innan avrättning.

5
Exekverings

Åtgärden kallar den externa plattformen API.

6
Resultat

AI rapporterar resultatet till kunden.

Action typer

Läs åtgärder

Titta upp data utan att ändra något. Exempel: list_orders, get_customer. Safe, ingen bekräftelse behövs.

Skriva handlingar

Skapa eller ändra data. Exempel: skapa_ticket, update_order. Kan kräva bekräftelse.

Ta bort åtgärder

Ta bort data. Exempel: cancel_subscription. Alltid kräva bekräftelse.

HTTP-åtgärder

Deklarerad i handlingar.json Generisk API samtal definierade deklarativt.

Kapabilitetstaggar

Valfri "kapacitet" per åtgärd i handlingar.json En kontaktneutral klasstagg (t.ex. "biljetter" för en biljettläs/lookup, "ticket_create" för att öppna en betalning).OpsIQ portar hela klassen enhetligt över alla kontakter: biljetten läser av AI när operatören stänger av Ai-biljettmedvetenhet, och skapandet av biljett är reserverad för OpsIQ"S egen kompositör (så en anslutnings skapa verktyg kan inte duplicera det). Deklarera den och din kontakt överensstämmer.OpsIQ Du behöver aldrig känna till dina handlingsnamn. Connector Builder avslöjar det som en Capability dropdown per åtgärd.

Kodåtgärder

Implementerad i PHP i kontaktklassen. Full kontroll över logiken.

Exempel på definition av åtgärd
{
  "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" }
    }
  }
}
Kopplingar

Bygg en kontakt

Connector Builder låter dig skapa en komplett kontakt för alla plattformar med en REST API Ingen kodning krävs för grundläggande kontakter.

Bygg en kontakt
Connector BuilderEtt anslutningsformulär för no-code: name, auth type, base URL, en handlingsplanering, ett passerande test och en publiceringsknapp.Connector BuilderWorkPayConnector BuilderNamnnamnMin plattformAutentiseringOAuth 2.0(PKCE)Base URL_https://api.example.com/v2ÅtgärderGET/customers →list_customersTest passeradePaketkontakt1NO-CODENamn, auth, base URL_2ANY APINyckel, Bärare, Basic, HMAC, OAuth_3PUBLISHInto /connectors/<slug>/
Placera byggaren på någon REST API Ställ in auth, bas URL och åtgärder, testa den och publicera en fungerande kontakt. Ingen kod behövs.

Fullständig leverantör API Täckning

Varje genererad API Anslutning kan exponera separat infödd API Läs och infödd API Skriva åtgärder. Kurerade handlingar förblir föredragna; inhemska åtgärder täcker leverantörens slutpunkter läggas till senare. runtime stöder REST, GraphQL, JSON, form, XML, råa och multipart kroppar bundna pagination,API-versionsrubriker och idempotens samtidigt som du håller referenser inuti arbetsytan anslutningsinställningarna.

⚠️
Marketplace-paket kommer från /marketplace_connectors samt bundled /connectors. Öka paketversionen, regenerera kontraktet och dokumentationen, kör överensstämmelsestester, skriv sedan om och publicera den nya Marketplace-versionen.

Connector Builder Wiizard

Trollkarlen har sex steg, som visas som flikar över toppen. Du kan hoppa mellan dem fritt och Spara utkast i sidfoten håller ditt arbete när som helst.

1
Identitet och profil

Namn, slämma, beskrivning och ikon, välj sedan en kontraktsprofil: Standard API, Commerce, Helpdesk, Mailbox, Site Intelligence, SaaS Bridge, Local PHP Platform eller Plattform utan API när plattformen inte tjänar något kallbart ochOpsIQmåste installera en bro. Profilen väljer en komplett kapacitetsstartpunkt; du kan fortfarande justera individuella funktioner.

2
Autentisering

Välj autentiseringsmönster som plattformen använder och fyller i sina områden. Ange verkliga testuppgifter här också: de används för anslutningstestet på nästa steg, och de lagras inte efter att du publicerat.

3
Testa testtest

Ange den API basen bas URL och en verifiera endpoint, kör sedan ett live-anslutningstest med hjälp av referenserna från steg 2Gör detta innan du definierar några åtgärder, om auten eller basen URL är fel, varje handling du skriver efteråt skulle misslyckas av samma anledning och du skulle fela fel sak.

4
Åtgärder

Definiera varje operation: namn, HTTP-metod, slutpunktsväg, parametrar, responsfältkartläggning och de tillförlitlighetsinställningar som beskrivs nedan. Du kan köra varje åtgärd individuellt mot live API från detta steg.

5
Utlösare

Kartlägga webhook-evenemang som din plattform skickar till OpsIQ händelser, så saker som händer på din plattform kan börja arbeta i OpsIQ.

6
Granska, företagskontrakt och publicera

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

⚠️
Publicering kör INTE överensstämmelse svit. Publicera validerar bara guide form och avger varningar som inte blockerar. Den fullständiga sviten - manifest, kapacitetsfiler, identitet-token kontraktet och brygg-snippet kontroll - går när du trycker på Dry-run, och igen vid installationstid. Tryck torrrt innan du skickar, varje gång.

Vad publicering gör att formuläret inte visar dig

Fem beteenden hos generatorn överraskar människor. Ingen är en bugg; alla kommer att kosta dig en eftermiddag om du träffar dem av misstag.

En fråga bestämmer genomgången: tjänar plattformen enAPI?

Svara på det i steg1genom att välja dataåtkomstläge (eller "Plattform utanAPI"Profil").APIläget förklarar native_api and emits the <slug>_api_call passthrough. Bridge mode declares platform_bridge Istället och STRIPS native_api Även om ett äldre specifikt spektrum bar det, så kan den uppenbart, den genererade klassen och expertisdokumenten inte vara oense. ai_brain_aware läggs till på båda sätten.

SILENCE MEANS "den har enAPI"

Byggaren följer ditt svar; det fungerar inte ut sanningen för sig själv, och standarden när ingenting sägs är.APIläge. så en no-APIplattform måste ACTIVELY säga så - välj "Plattform utanAPIprofil, ställa in dataåtkomst till bro eller fästing 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.

Anslutningstestet standarder för att få /ping_

Om du lämnar verifiera vägen tom, skriver byggaren /ping in i den genererade kontakten och i profil.json"S testblock. Nästan ingen riktig plattform tjänar den vägen, så Test Connection misslyckas med HTTP404på varje installation och läser som en kund felkonfiguration snarare än ett paket defekt. Ställ in en verifierad väg som din plattform faktiskt svarar på. För en brygga kontakt, peka det på din egen diagnostik slutpunkt - det bevisar hela kedjan i ett samtal: bron distribueras, nyckel matcher, och bron kan nå databasen.

Re-publicering fortfarande överskriver dina handredigeringar

Förmågor följer nu data-access svar, så de inte längre drift. Allt annat genererat fortfarande gör: redigera ContextProvider. php eller någon annan emitterad fil och nästa publicering ersätter den. Det enda skyddade undantaget är bryggfilen - guiden överskriver bara en bro som bär sin egen markör, så en handskriven en lämnas ensam.

Republicera rader filer

Un-tick en kapacitet och nästa publicering tar bort sin leverantörsfil. Hand-edits till någon genererad fil - ContextProvider.php framför allt - är överskrivna utan varning. Copy anpassningar ut först, eller ta ägande av paketet genom att radera.opsiq-byggare.json(Efter vilket trollkarlen inte längre kommer att hantera den).

release_status är alltid förhandsgranskning

Trollkarlen har ingen kontroll för det. Ett paket som är avsett att skeppa eftersom produktionen måste ha release_status ändrats för hand i inställningar.json- och den redigeringen bryter signaturen, så återsignera efteråt.

Signaturen bevisar integritet, inte ursprung

Byggare paket är undertecknade med denna installations egen symmetriska nyckel. Det upptäcker manipulering. Det visar inte vem som skrev paketet, och någon installera som håller samma nyckel kan producera samma signatur. Behandla ett lokalt signerat paket som självsignerat.

Slug kollisioner kontrolleras endast i ett träd

Publicering vägrar en snigel som redan finns under/connectors/.Det ser inte på/marketplace_connectors/,Så ett hand-auktoriserat förstapartspaket med samma snigel kan hamna skuggad.

💡
Trollkarlen har inte ett kunskapsförfattare steg. En kunskapsfil som beskriver din plattform genereras för dig från namnet, beskrivningen, aut typ och åtgärder du definierade, och den laddas in i AI när kontakten är aktiverad.

Definiera en åtgärd (steg) 4)

Varje åtgärd har följande inställningar. Endast de fyra första krävs; den övriga kontrollen som kan köra det och hur noggrant.

Åtgärdsnyckel och etikett

Nyckeln är vad AI kallar; etiketten är vad en människa läser. Keys är namnspaced med din kontaktduk automatiskt, så två kontakter kan båda ha en "list_orders" utan kollidering.

HTTP-metod

Få, POST, PUT, PATCH eller DELETE.

URL Vägen

Tillämpad till basen URL Använd {name} för platshållare, till exempel /opportunities/{id}/stage

Parametrar

För varje parameter väljer du också vart den går: Kroppskropp kropp, Vägen, Fråga eller rubrikEn vägparameter fyller en {placeholder} En fråga parametern är appenderad till URL.

Svarskartläggning

Säg vilket fält i JSON svar betyder vad, vilket är kundnamnet, som är e-postmeddelandet, vilket motsvarar ordern totalt. Det här låter AI läsa din plattforms data snarare än att gissa på den.

Vem kan använda den

Ditt team (admin AI), inloggade kunder (kundchatt), både eller skrivassistenten. Kundens åtgärder drivs endast för den inloggningskunden, och identitetsfält är låsta till dem automatiskt så att en kund inte kan fråga om en annan.

Kräver bekräftelse

En människa måste godkänna innan handlingen går.

Destruktiv

Markerar åtgärden som att ta bort eller ändra tillstånd. Används för att varna innan den körs.

Krävt tillstånd

Administratören måste hålla detta tillstånd för AI att köra åtgärden på deras vägnar; fulla administratorer passerar alltid. Välj från manage_integrations, manage_general, manage _billing, manage\s_bridge, manage@knowledge, manage. appearance, manage-beteende, manage/permissions, manager_dangerzone, reply_to_chats, escalate_to\ticket, send_agent_email eller ingen, vilket betyder något autentiserat administer.

Beskrivning / AI-hint

Valfritt, men värt att skriva. Det berättar AI när man ska nå för denna åtgärd, till exempel "Använd detta när admin ber om att ändra ett avtalsstadium". En bra ledtråd är skillnaden mellan en handling som AI använder korrekt och en det ignorerar.

Förmåga

Valfri klasstagg, antingen biljetter (en biljettläsning eller uppslag) eller ticket_create (öppnar en biljett). Tagging låter OpsIQ port hela klassen samtidigt, till exempel dölja biljett läser när en operatör stänger AI-biljettmedvetenhet.

Lista Vägen

För endpoints som returnerar en lista, den prickade vägen till matrisen, till exempel data eller data. items

Fel väg

Ett kroppsfält vars närvaro betyder att samtalet misslyckades, till exempel felmeddelande, användbart för APIs Den returnerar HTTP 200 på misslyckande.

Kör det

Varje handling kan köras mot live API från det här steget, så att du kan fixa en fel väg eller fältnamn innan någon annan använder den.

⚠️
Skriv åtgärder skyddas som standard. Alla åtgärder med hjälp av POST, PUT, PATCH eller DELETE börjar kräva att manage_integrations tillstånd och Mänsklig bekräftelse innan den körs. Detta är avsiktligt. En ny skrivåtgärd stängdes snarare än att låta AI ändra dina data oövervakas. Du kan ändra både på åtgärden, men ändra dem medvetet.
💡
För att vara kallbar från kundchatt måste en åtgärd läsas endast: lämna både Kräver bekräftelse och Destruktiv okontrollerad. En handling som en kund kan utlösa som också ändrar tillstånd är inte något trollkarlen kommer låta dig ske med misstag.

Ta emot webhooks (steg) 5)

Triggers steg ger dig en webhook URL Registrera dig med din plattform och verifiera varje förfrågan som anländer till den.

Signatur header

Rubriken på din plattform tecknar med exempelvis X-Hub-Signature-256.

Signaturalgoritm

HMAC-SHA1, HMAK-Sha256 eller HMACA-ShA512.

Signatursystem

Enkel, en vanlig säkring eller bas64 smälter. Eller Stripe-style, t=...,v1= ... format som används av Stripa och flera plattformar som kopierade den.

Signatur prefix

Vissa plattformar prefixa smältningen, till exempel sha256=. Lämna det tomt om din inte gör det.

Mappningar av händelser

Karta varje händelse som din plattform skickar till OpsIQ -evenemang den ska höja.

Auto-registrera webhook

Om din plattform har en API För att hantera sina egna webhooks behöver du inte registrera dig URL För hand. Öppen Auto-registrera denna webhook på aktivera och peka på två av de åtgärder du definierade i steg 4:

Skapa-webhook action

Kallas när en admin gör det möjligt för kontakten. Du ger parameternamnet som bär URL, valfritt den som bär händelselistan och vägen i svaret som håller den nya webhooks id.

Åtgärd för Delete-webhook

Kallas när kontakten är inaktiverad, med id fångad ovan, så inaktivera anslutningen stoppar också din plattform som skickar till en död slutpunkt.

Förmågor du kan slå på

Profiler och kapacitet definieras av Connector Contract 2.2 Genererade och deklarativa funktioner avges direkt; företagskapacitet genererar en EnterpriseExtension.php ställningar med runtime Lifecycle Wiring.

Åtgärder

Operationer AI kan köras på din plattform: listordrar, hitta en kund, utfärda en återbetalning.

Utlösare

Ta emot webhooks från din plattform och förvandla dem till OpsIQ -evenemang.

AI biljetter

AI Triage och svaret Copilot på biljetter som stannar på din plattform. Välj slutpunkten som returnerar en biljett med sina svar och kartlägga fälten; OpsIQ läser tråden genom den.

Mailbox och kontakter

Visa en kunds mail på sin tidslinje, skicka från ett avtal och synkronisera din adressbok i OpsIQ CRM.

Kundimport

Sidan genom kundlistan och importera var och en som en OpsIQ -kontakt. Detta är vad knappen Import körs.

Kontext

Tryck på live-data från din plattform till varje AI-konversation.

Identitet

Utbilda vilken av dina kunder som en besökare är, och visa sin profil och köp på en biljett.

Försäljning och fakturering

Foder intäkter händelser och MRR siffror i OpsIQ instrumentpaneler.

Inkommande biljetter

Förvandla biljetter och e-postmeddelanden din plattform levererar via webhook till OpsIQ Stöd trådar.

Outbound svar

Post OpsIQ personal svarar tillbaka till plattformen tråden härstammar på.

Synkronisera användare

Importera dina personalkonton till OpsIQ admin-användare.

Sync avdelningar

Importera dina supportavdelningar till OpsIQ.

Promo targeting och produktflöde

Låt kampanj Studio rikta sig till fakta du känner till om en person och göra dina riktiga produkter inom en kampanj.

Survey Studio-leverantör

Exponera serververifierade undersökningsfakta, undkom variabler och gränsade CRM Outreach-mottagaresidor genom en dedikerad SurveyProvider. php. Detta återanvänder inte kampanjens runtime.

Native IP blockering

När när OpsIQ blockerar en IP Ring din plattforms eget block API Blocket verkställs där också.

Säkerhetshändelser

Få blockerad -IP hot signaler från OpsIQ.

Plattform kunskap för AI

Varje kontakt du bygger fartyg en kort referens som beskriver vad din plattform är och vad dess åtgärder gör. OpsIQ admin AI läser det när din kontakt är aktiverad, så det förstår din plattform snarare än att bara se en lista över åtgärdsnamn. Detta genereras för dig.

API genomgång

Din kontakt får alltid ett allmänt ändamål samtal så AI kan nå en slutpunkt du inte definierar en typad åtgärd för. Använda skrivna åtgärder där du kan; detta är flykt kläcken.

Canonical Connector Contract 2.2 referensreferens

Kontraktsversion: 2.4 · 57 capabilities · 8 profiles.

Connector profiler

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.

Canonical kapacitet

Åtgärder

Universal actions. Capability version: 1.0. Mode: generated. Runtime methods: registerActions. Package files: actions.json.

utlösare

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.

sammanhanget

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.

identitet

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.

fakturering

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.

Handels

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.

lokalt

Local search/location data. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

Seo

SEO data and actions. Capability version: 1.0. Mode: declarative. Runtime methods: registerActions.

site_intelligence

Site Intelligence provider. Capability version: 1.0. Mode: declarative. Runtime methods: siteIntelligenceProviders. Interfaces: OpsIQ\Connectors\SiteIntelligenceConnectorInterface.

Analytics

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.

⚠️
Byggarspecifikationer förblir den auktoritativa källan. Sätt plattformsspecifika affärsregler i de genererade utvidgningspunkterna; paketets livscykel, köer, arbetare, migrationer och överensstämmelsestester är byggherraväldet.

Tillförlitlighetsinställningar på varje åtgärd

Försök igen

Hur många gånger för att göra ett misslyckat samtal, med en backoff som dubblar varje försök. Endast timeouts 429s 5xx-fel hämtas; en 4xx är din begäran fel och upprepa det skulle bara bränna din räntegräns.

Hastighetsgräns

Ett tak per minut för denna åtgärd, så en upptagen trigger kan inte hammare din plattform. Lämna den på 0 för ingen gräns.

Timeout

Hur länge du väntar på din plattform innan du ger upp.

Bekräftelse

Kräver att en människa godkänner innan åtgärden går. Använd den för något destruktivt.

Autentiseringstyper

Steg steg 2 erbjuder sju mönster. Välj den som matchar din plattforms API dokumentation, generatorn avger rätt HTTP-klient för det.

API nyckel i rubrik

En statisk nyckel skickad som en fast rubrik, till exempel X-API-Key. Du ger rubriknamnet och etiketten administratörsformen ska visa. Detta skickar nyckeln som en header endast; om din API Förväntar sig nyckeln som en fråga parameter istället, använd Anpassade rubriker eller en full-kod anslutning.

Bärare token

Token sent as Authorization: Bearer <token>. Common for modern APIs.

Grundläggande auth

Användarnamn och lösenord, base64-kodade i auktoriseringsrubriken. Du väljer etiketterna båda fälten visar på administratörsformen.

HMAC-signerad

En offentlig nyckel plus en hemlighet, med begäran kropp undertecknad. Du ger signaturrubriken, den viktigaste header och tidsstämpelrubrik din plattform förväntar sig.

OAuth 2.0 (kunduppgifter)

Server-till-server, utan användarinteraktion och ingen omdirigering. Du ger token URL och en valfri omfattning; administratören levererar ett klient-ID och hemlighet. Använd detta när din plattform utfärdar referenser till en applikation snarare än till en person.

OAuth 2.0 (Konnect-knapp)

Tillståndskodflödet med PKCE, för Stripe Shopify Slack och QuickBooks-stil appar. Du ger tillstånd URL, token URL och omfattningen. Efter publicering klickar administratören Anslut på kontakten, godkänner på din plattform och OpsIQ lagrar den uppfriskande token och mynt åtkomst tokens på begäran. URI Registrera dig i din OAuth app visas på anslutningssidan inställningar.

Anpassade rubriker

En fri form JSON huvudkarta för allt mönstren ovan täcker inte, till exempel {"X-API-Key":{api_key}"X-Tenant":{tenant_id} Varje platshållare blir ett fält på administratörsformen.

💡
PKCE gäller endast Connect-knappflödet. Klient-krediteringsflödet har ingen omdirigering och inget användarsteg, så PKC gäller inte det.

Pagination stilar

Förskjutning

Använder kompensation och gränsparametrar. Exempel: ?offset=100&limit=50.

Sidan

Använder sidnummer. Exempel: ?page=3ochper_page=50.

Markören

Använder en cursor token från föregående svar.

Länk header

Använder länken svarsrubrik med rel="next".

Avancerad: anpassad PHP-kod

connector.php RETURNS ett exempel. Det förklarar inte en namngiven klass somOpsIQMetoden namn nedan är de som ConnectorInterface kräver; att få ett fel är en dödlig vid belastning, inte en varning.

connector. php - det verkliga kontraktet, minimalt och runnable
<?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.

Spegelbiljetter till det inhemska biljettsystemet

När din plattform äger en biljett, spegla den i OpsIQ från din kontakt med biljetten intas hjälpare dina kontaktar ärv (skapa för en ny biljett, tillägg för uppföljningar). Emit och prenumerera på de universella biljetthändelserna i din anslutning subscribers() metod, ticket.created, ticket.replied, ticket.updated, ticket.deletedAuto-reply, eskalering, SLA och CSAT alla krok samma händelser, så du ärver dem utan extra kod.

Om du hanterar ticket.deletedDu hanterar också sammanslagningar. En sammanslagen biljett rad bär merged_into och skickas inte till en kontakt som förklarar ticket_merge; sammanslagningen kommer en gång som ticket.merged Istället kan du slå samman på din plattform istället för att stänga den fusionerade biljetten där. Biljettfusionskapacitet (Contract 2.4).

Säg vem som skrev invigningsmeddelandet

En biljett är alltid för Kunden, men öppningsmeddelandet kan skrivas av personalEn agent som öppnar en biljett på kundens vägnar eller når ut proaktivt. Varje helpdesk stöder detta, så det är en del av den universella ticket.created kontrakt snarare än något varje kontakt löser privat.

author_type

Kund (standard) eller admin. Omit det och kunden antas.

author_id

Personalen id när författare_type=admin. Aldrig kunden id.

author_name

Agent eller avdelning visar namn. Falls tillbaka till "Staff".

author_email

Agentadressen. NEVER kunden. Ett personalmeddelande under kundens e-post är en rapportering och revisionsfel.

Detta är inte kosmetiskt. Konsumenterna läser author_type att bestämma vars tur det är. En personalskriven öppning rapporterade som client lämnar auto-reply berättigade att svara på ett meddelande som din egen agent skrev, och gör din plattforms eko av den öppningen ser ut som en ny kundmeddelande, som sedan landar som dubblett och vänder biljetten till SvaradeKartlägga din plattforms signal på den i din kontakt Event normaliseraldrig i konsumenterna.

Centraliserad blockering

När en agent blockerar en avsändare, som gäller över Var och en var kanal omedelbart (e-post, chatt, portal, widget och varje kontakt tvilling) eftersom blocket verkställs centralt innan någon kontakt ser meddelandet. Din kontakt ärver det genom att göra ingenting. Det finns inget inkommande arbete för att genomföra och inget sätt att få det fel.

Den valfria hälften är UtomhusAtt berätta för din plattform en kund blockerades här. Genomföra det bara om din plattform kan uttrycka något likvärdigt.

Förmågor()

Måste inkludera block_registry OCH klassen måste genomföra BlockRegistryInterface. Flaggan är ett krav; gränssnittet är garantin. Registerkravet kräver båda.

blockSender($b)

Får vänligt (email|domain |ip), värde, anledning, admin_id, expires_at, site_key. Returns [resultat, detalj?, remote_ref?].

unblockSender($b)

Samma nyttolast, omvänd. Måste vara oförskämd. Att avblockera något som aldrig blockeras är noop, inte ett fel.

isSenderBlocked($b)

För försoning, så drift rapporteras snarare än upptäckt av en kund. Returnerar [resultat, blockerat?]

Resultatvärden

OK

Appliceras på din plattform. Inkludera fjärrref när du har ett id-värde inspelning.

noop

Redan i det anmodade tillståndet.

unsupported

Din plattform har inget likvärdigt koncept. inte ett fel.

Misslyckades

Du kunde ha gjort det och det gick fel. Inkludera detaljer; det landar i revisionsleden.

Att minska är ett korrekt svar. Många plattformar har ingen "blockera denna avsändare" koncept och erbjuder bara ACCOUNT upphävande, som stoppar fakturering, inloggningar och tjänster snarare än bara stöd mail. Kartläggning "en agent blockerade en spam adress" på "nära klientens konto" skulle låta ett felklickat block avsluta en betalande kunds tjänster. Om det är den enda hävstång du har, returnera tillbaka unsupported och lämna den ensam.

Declining täcker också fallet där plattformen kan Gör det men kommer inte att låta dig. API_, inte en funktion: en spak som bara finns i plattformens admin UI är en hävstång din kontakt har inte.

Arbetat exempel · Zendesk (referensgenomförandet)

Läs mer connectors/zendesk/connector.php alongside this. It is short, and every branch below is a decision you will face too.

e-post → OK

PUT /api/v2/users/{id} med suspended=true. En upphängd slutanvändares nya förfrågningar avleda till Avstängda biljetter istället för att öppna en, verkligen samma idé som att blockera en avsändare, och det stoppar ingen fakturering eftersom Zendesk slutanvändarna inte har någon. Returnerar användarid som remote_ref.

domän → ostödd

Zendesk CAN avbryter en hel domän, men endast genom suspenden: sökord i Admin Center blocklist textarea och ingen API Skriver det fältet. Funktionen finns; spaken gör inte.

ip →Osupporterad

Inget biljettnivåer finns IP block.

Okänd adress → Noop

Zendesk kan inte fördriva en adress som den aldrig har sett. Ingenting att göra är ett misslyckande, och det lokala blocket stoppar fortfarande biljetten.

agent eller admin → ostödda

Avbrytande personal skulle låsa en kollega ur helpdesk. En personaladress som når en blocklista är mycket mer benägna att vara ett misstag än en instruktion, kontrollera rollen innan du agerar på den.

Den sista raden är den som är värd att kopiera. Kontraktet kan inte hindra dig från att mappa ett block till något destruktivt, så varje anslutning måste själv bestämma vad det kommer att vägra. detail En operatör kan läsa, slår lydnad.

Rapportera ärligt. Lägg märke till hur få av dessa rader är okDet är det korrekta resultatet, inte ett gap: en domänblock fungerar fortfarande (det verkställs i kärnan när den skrivs); det kan helt enkelt inte speglas utåt. ok för något du inte gjorde skulle berätta för en operatör att blocket nådde din plattform när den aldrig lämnade OpsIQ.

Regler

Det lokala blocket vinner alltid

Det är skrivet för dig som kallas och står vad du än återvänder. Du kan inte hindra en operatör att blockera någon.

Kasta aldrig

Ett kast behandlas som ostödd och inspelad. Return misslyckades med en detalj istället så att orsaken överlever.

Vara idempotent

Samma block kan meddelas mer än en gång.

Återgå snabbt

Fan-out är synkront med operatören klicka. Queue långsamt arbete snarare än att hålla begäran öppen.

Ring inte tillbaka in

Aldrig återblockera in OpsIQ från din hanterare. Registret hoppar över den ursprungliga kontakten, men en andra hop skulle slinga.

Varje tillkännagivande är skrivet till opsiq_block_registry_log (Arbete, vänligt, värde, anledning, admin, ursprung, kontaktslämma, resultat, detalj och tidsstämpel) så en operatör kan se ett block som anlänt från din plattform snarare än från en agent, och vad varje kontakt gjorde om det.

Push-bilagor korrekt

Hand en attachments array för att skapa()/addReply(). Varje objekt bär filen i en av tre former:

content_b64

Base64 av RAW-filen byte, använda för filer bakom auth (de flesta inkommande fall). OpsIQ avkodar den och återvärderar filen för dig. Den mest bärbara formen.

url/källa_url

En offentlig https URL (t. ex. en Zendesk content_url) måste vara https; passerar en SSRF / checklista innan den lagras.

stored_path

En lagrad filreferens du redan skrev (vad den infödda komposituppladdaren producerar).

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 Filnamn endast (inte byte), så det pålitliga inkommande mönstret är: läs byte där din kod redan körs (inuti plattformen, eller från webhook payload), base64 dem och skicka dem som content_b64 på evenemanget.

Utgående (OpsIQ → din plattform). När en agent fäster en fil, ticket.replied payload ger dig svarets filer som stored_path föremål under OpsIQ fil store. Läs dem och tryck i din plattforms eget format, och kontrollera plattformen docs, kodningsfrågor: WHMCS Önskar base64_encode(json_encode([[name,data]])) (JSON, inte serialisera); Zendesk laddar upp råa byte /uploads.json för en token sedan sets comment.uploads; GmailSkickar en multipart/blandad RFC-822meddelandet base64url-kodat i raw; Amazon SES inbound attachments need the S3 receive action (the SNS path caps at 150 KB).

Fjärrplattformar: API + webhook, aldrig en annan apps tabeller

Om din plattform är en separat app eller databas (en värd SaaS, en fjärrkontroll WHMCS En annan DB på samma server) Skriv aldrig sina tabeller direktEn databas skriver landar på vad som helst samband är aktivt och tyst missar de verkliga raderna. Utomhus = Ring plattformens signerade REST API (replier, status, avdelning, rader); Inbound = plattformen POSTs en signerad webhook, din handleWebhook() verifierar den och eldar matchningen ticket.* För att stoppa en spegelslinga, tagga vad du trycker med en ursprungsmarkör (t. ex. mirror_origin:'opsiq') plattformen echoes den på webhook och din inkommande handtag hoppar över sina egna ekon. OpsIQEvents::isMirroredEvent() högst upp på varje handtag.

Spegelstatus, prioritet och avdelning

Ett svar rör sig automatiskt, ett agent Svar →_ answered, a kund Svar →_ customer_replyspegel på samma sätt. För explicita förändringar prenumerera på ticket.updated och läsa payload['changes'] (t. ex. {status:'closed'}).

Status: OpsIQ s kanoniska uppsättning är open, customer_reply, answered, in_progress, pending, closedHåll en liten tvåvägs karta till din plattform ordförråd, och se till att din kolumn faktiskt accepterar de värden du skriver (enligt ENUM Att missa ett värde sjunker tyst till tomt av vissa databaser. Institution: OpsIQ avdelning id är meningslöst på din sida, Skicka aldrig denSkicka deskriptören (name, email och slug) och lösa det mot dina egna avdelningar via e-post → namn → slug, så "Billing Department" landar i din Billing avdelning istället för allmäntTrigger på båda ticket.escalated och en department_id förändring i ticket.updated.

💡
Status / prioritet / ämne / avdelning / ta bort spegling gated av per-connector toggles (mirror_status_changes, spegel_priority_changeds, Spanish_subject_changers, Spele_department_changetes, spegeln_deletes) läs igenom de delade OpsIQ\Connectors\MirrorOptions hjälpare. Inbäddat det blocket i dina inställningar.json Och varje biljett-spegelkontakt läser växlarna identiskt.

Länka en biljett till en produkt/tjänst

Om kunden valde en specifik produkt när du öppnar biljetten stämplar du en antydan så att agenten ser ett fokuserat servicekort (med ett klick på "view other products" -modal för resten). Passera någon av dessa för att skapa():

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

En plattform service-kod, t.ex. WHMCS S396 (service)396 D11 (domän)11). OpsIQ sönder den valfria typ-brev + id och matchar din servicelista, med en typvakt så att en domänkod aldrig matchar en produkt av samma id. Exponera en matchande ref på varje tjänst för en exakt matchning.

related_domain

Ett domännamn; matchat som en substring mot varje tjänsts detaljer/domän.

💡
Bygg bifogad bilagalista en gång, i formen ovan och OpsIQ Hanterar resten: värd URLs passerar igenom och bas64 innehåll lagras och återvärderas för dig. Du behöver aldrig skriva per plattform filhantering.
⚠️
Åtgärdsnycklar är mindre bokstäver, siffror och understrykningar. Byggaren accepterar3att80karaktärer och tillåter också prickar; handlingsbutiken accepterar2att100tecken utan prickar, så fortsätt till bokstäver, siffror och understryker och du uppfyller båda. Lägga till en åtgärd skapar ingen AJAX-rutt, så det finns inget att regenerera - återspara kontakten och den synkroniseras.

Låt AI bygga den för dig

Du behöver inte fylla de sex stegen i för hand. Beskriv kontakten med dina egna ord och OpsIQ_ AI utkast till hela specifikationen, kör den genom samma validator guiden använder guiden och visar dig planen innan något skrivs till disk. Det finns två ställen att göra det, och de producerar samma paket.

I trollkarlen

Öppna Connectors→+ Lägg till connector→Bygga kontakterPå steg 1 ser du ✨ Bygg det för migTyp vad kontakten är för - plattformen, vadOpsIQläsa och vad den ska skriva, och vem som använder den - lägg tillAPIRot om du vet det och tryck på den. Trollkarlen fyller varje steg från utkastet, och du granskar och redigerar exakt som om du hade skrivit det.6samma panel visas som ✨ Förfina sig med AIDu kan begära en förändring ("också läsa fakturor") istället för redigeringsfält.

Fråga: OpsIQ

Öppna öppna Fråga OpsIQ kopilot någonstans i administratören och säga vad du vill. Du behöver aldrig namnge en handling eller veta trollkarlen finns.

1
Fråga om det

Till exempel: "Bygg mig en kontakt för Trello. Det bör lista mina styrelser och listor, läsa kort och skapa ett kort på en bräda. Trellon använder en API nyckel plus token." Utkasta denna kontakt Ditt meddelande är kortet, så sätt plattformen, läsarna och skrivningarna i den.

2
Bekräfta utkastet

Ingenting är skrivet ännu. Kopiloten utarbetar specifikationen, validerar den och svarar med planen: vad kontakten gör, de åtgärder som det kommer att exponera (skrifter markerade), antagandena det gjorde, och de frågor du fortfarande måste svara - vanligtvis vilka referenser för att leverera. Utkastet parkeras under ett id och stannar tillgängliga för leverans.24timmar.

3
Säg "bygga det"

Kopiloten visar en Bygga 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
Ange referenser och aktivera

Den nya kontakten publiceras men inte aktiverad, och den håller inga hemligheter. Öppna inställningarna, ange API -nyckeln eller token, tryck Testa testtestOch så MöjlighetTills du gör det, gör det ingenting.

💡
Båda korten behöver ditt klick. Utkastet till steg skriver ingenting alls; byggsteget är markerat destruktivt och frågar alltid. AI kan inte publicera en kontakt, aktivera en eller ange ett referensvärde på egen hand.

Vad AI är och inte får göra

Valideraren är väggen

En utarbetad specifikation går igenom exakt samma validat() guidens Publicera knapp använder. Om det inte passerar, AI ges fel och försöker igen, upp till tre gånger, och sedan vägrar i validatorns egna ord. Ett utkast som misslyckas aldrig blir ett paket.

Det skriver inga referenser

Utkastet namn autentiseringsmönstret och inställningarna fält; det uppfinner aldrig en nyckel, token eller hemlighet. Du fyller dem i efteråt på kontaktens inställningssida.

Svara med frågor, inte gissningar

Allt som det inte kunde veta - ditt konto-ID, vilken region, som av två slutpunkter din plan avslöjar - kommer tillbaka som en fråga på planen snarare än ett tyst antagande.

En uppfunnen slutpunkt misslyckas högt

AI får höra att aldrig uppfinna banor, men ingen modell är perfekt. En felaktig väg publiceras som en handling som misslyckas sitt livetest på åtgärder steg eller första gången det körs - det är aldrig en tyst framgång.

Paketet är vanligt

Vad det producerar är ett normalt byggpaket: samma genererade filer, samma kontrakt, samma signatur, redigerbar i guiden, borttagbar från Connectors-sidan. Det finns ingen separat "AI-kontakt" -typ.

Din modell gör utkastet

Kvalitet följer den modell du konfigurerade under Inställningar→En liten, billig modell utarbetar en korrekt men vanlig kontakt och ställer fler frågor; en starkare modell får mer av slutpunkterna rätt första gången. Ändra den under AI-konfigurationen; inget annat måste ändras.

⚠️
Kopiloten kan bara köra åtgärder som denna installation faktiskt har registrerat. Om Connector Builder-åtgärder saknas - en plan som inte inkluderar dem eller en roll utan manage_connectors - kopiloten säger så snarare än att erbjuda ett kort som skulle misslyckas när du klickade.
Kopplingar

Sälj genom chatt: handelsrollkartan

En kontakt som kan sälja - en butiksplattform, ett bokningssystem, en betalningsgateway - förklarar vilken av OWN-operativens svar OpsIQs kanoniska handel roller. Deklarera det och kontakten visas under Inställningar → Kundchatt → Sälja genom chatt automatiskt; sluta deklarera och det försvinner. Det finns ingen lista att registrera sig på.

Filen: commerce_roles.json

Deklarationen lever i sin egen fil på paketroten - Närvaron av filen är påståendetDet kan inte leva i connector_contract.jsonDen filen regenereras av förpackningsverktyg och dess schema avvisar okända nycklar, så ett hand-added block skulle misslyckas validering och sedan skrivas över.

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

Reglerna och varför var och en existerar

Roller är ett slutet ordförråd

OpsIQ sluter aldrig en roll från ett handlingsnamn. En roll som inte förklaras existerar inte – deklarering är hela kontraktet.

Operationen måste vara en av dina handlingar

Varje kartlagd operation måste finnas i din actions.jsonEn typo förklarar en förmåga som inte kan köras, och det ytor till en kund som "Jag kan kontrollera att för dig" följt av ingenting.

En läsroll pekar aldrig på en destruktiv operation

Läs roller (katalog, tillgänglighet, citat, orderuppslag) måste kartlägga till verksamhet som inte förändrar någonting på din plattform.

En skrivroll kartlägger aldrig till en generisk rekordoperation

Kartläggning order_create till en rå tabellinsats - record.create, db.insert, recordCreate, någon stavning, alla separator - avvisas strukturellt. En rad skriven direkt kringgår din plattforms prissättning, låsning och bekräftelse post, producerar en order ditt eget system inte helt tror på.

En skrivroll förklarar en återhämtningsoperation

En idempotent uppslag som svarar "did my write land?". Den farligaste timeouten är den efter din plattform kanske redan har skapat ordern; utan en återhämtningsuppslag de enda alternativen är att förbli blinda eller förlora det.

Leverantörsinriktade betalningsroller bär tre extra förpliktelser

Ett paket som talar direkt till en betalningsleverantör måste också förklara payment_profile (valutor, länder, metoder och Miljö - en ostatlig miljö är hur en testintegrering tar en levande betalning webhook_verify (leverantörens verkliga signaturschema; en generisk hemlig förtjänst vägras) och event_map (leverantörshändelser på kanoniska sådana). En köpmanskontakt som endast genomför record_payment erhåller redan verifierade kanoniska betalningsbevis; det får inte låtsas vara porten.

Förklara hur kunder kan beställa från en ansluten butik

En köpman kontakt och en betalning-gateway kontakt är olika kontrakt. Under Ansluten butik kund beställningVälj det djupaste läget plattformen kan bevisa. Valet är förpackat inuti undertecknat commerce_roles.json; Store och kundchatt återläsa den vid utförandetiden. Ta bort en roll eller inaktivera / avinstallera kontakten ogiltigförklarar därför ett tidigare gjort förslag istället för att lämna stal myndighet bakom sig.

catalog_only

Kartor catalog_search eller catalog_get. OpsIQ kan söka och förklara produkter, men det kan inte visa en körbar order eller checkout bekräftelse. Varje paket kvarstår vid denna sanningsenliga standard till dess att dess egen typificerade citat och kassa / order åtgärder passerar djupare kontrakt och Marketplace certifiering; aldrig infer transaktionellt stöd från ett plattformsnamn.

platform_checkout

Kartor också quote och platform_checkoutHandelshandlaren - inte OpsIQ kärnan - återkommer checkout_url, checkout_reference och kanoniska citat URL måste vara HTTPS, dess värdnamn måste matcha customer_ordering.checkout_hosts eller HTTPS-värden som härrör från checkout_host_settingcitatet kan leva för inte mer än15minuter. En produkt permalink, lokalt monterad kundvagnURLeller returneraURLär inte en handelsutfärdad kassakapacitet.

direct_order

Kartor också quote, order_create och order_getmed order_create.recoveryCore uppdaterar citatet omedelbart före utförandet, levererar idempotensnyckeln och frågar återhämtningsoperationen efter varje okänd utgång innan någon retry. payment_flow=opsiq_gatewayDen måste dessutom kartlägga record_payment med en auktoritativ återhämtning/läs-back operation. OpsIQ verifierar aktivt gateway transaktion, matcher belopp, valuta, handlare och orderreferens, skriver leverantören referens en gång, sedan läser köparen faktura / order tillbaka. mark_invoice_paid status toggle avvisas eftersom det inte bär några betalningsbevis. Skapa handlingen måste åberopa plattformens egen prissättning, aktie och order affärslogik; rådatabas skriver vägras.

Identitetsverifiering och vad operatören kan ändra

När närOpsIQäger betalningen, en chattkund måste nå email_otp innan en beställning skapas,OpsIQe-postmeddelanden en6-digit kod och ber om det. Detta är inte något som en kontakt väljer bort; Det är garantigolvet avrättningskärnan kräver för order_create.

Det enda undantaget, och vem kontrollerar det

En operatör kan acceptera en overifierad adress endast där din kontakt deklarerar fulfilment_presence: customer_presentEn hotellgäst måste anlända, så en felaktig adress missriktade mot ett kvitto och rummet är fortfarande där. remote_delivery - Frakt, bestäms, laddas ner och verifiering krävs oavsett operatören sätter, eftersom värdet lämnar på styrkan av den adressen ensam. minimum_assurance eller reversibility: irreversible tar också bort operatörens förmåga att hoppa över den.

Hur länge koden varar

Trettio minuter som standard, operatörskonfigurerbar från5minuter till24timmar. Kunden ser en levande nedräkning som görs i sina egna tidszon, inte operatörens. En utgången kod säger så tydligt och erbjuder en ny snarare än att rapportera en ogiltig kod - en kund som skriver en korrekt men gammal kod har gjort något misstag och berätta för dem att de har skickat dem runt samma slinga.

Vad kunden måste erbjuda: kund_fields

Namn och e-post krävs alltid och samlas in först. Deklaration address, phone och company as required eller optional för att passa verksamheten: en butik som fartyg paket förklarar adress krävs; ett hotell deklarerar telefon krävs, eftersom en gäst det inte kan ringa har ingen bokningskontakt. Assistenten frågar efter dem i samtalet innan citering, ochOpsIQvägrar att placera en order som saknar ett obligatoriskt fält. Byggaren skriver den normaliserade kartläggningen, baslinjen ingår, så kontraktet på disken är explicit.

När kontot skapas: account_timing

at_order (standard) låter ordern skriva skapa ett förstagångsköpare konto. before_quote när dina plattformspriser per kontoWHMCSskatter genom kundens egen profil och citat i klientens valuta – ochOpsIQSkapar kontot genom ditt customer_create åtgärd så snart de nödvändiga fälten är kända, frågar sedan citatet för det kontot, så bekräftelsekortet bär den totala du faktiskt fakturerar. account_flow: connector_signup.

Biträdande fetischer, det läser inte: klient_tools

Med Skapa beställningar på läser assistenten aldrig en klistrad katalog. Det kallar tre verktyg - commerce_catalog_search (en tom fråga är en översikt över produktfamiljerna; resultat utöver gränsen anges med namn), commerce_catalog_get för ett objekt i sin helhet, och commerce_quote, som myntar den signerade bekräftelse kortserver-sidan genom samma väggar har anslutningsvägen alltid haft. Ett verktyg per verb, din kontakt som en parameter, så en butik med sex anslutningar får tre verktyg snarare än arton. client_tools begränsar standarden; frånvarande betyder varje kartlagd, och en catalog_only Anslut aldrig citat. Bekräftelse är aldrig ett verktyg: kortets knapp på webben, exakt CONFIRM kommandot på en kanal, och ingenting som en modell säger spenderar pengar.

Vad dina katalogobjekt ska bära

id, nameEn kundsäker summary, a category eller produktfamilj (det är så en kunds ord hittar ett objekt vars namn är en kod), currency, unit_amount_minor, availableoch input_schema namnge fälten en order behöver. Sök gör kundens ord mot namn, familj, cykel och sammanfattning.

Vägra med en anledning som kunden kan agera på

Återvänd {"success":false,"error":"…","missing":["domain"],"retryable":true} När ett värde är fel eller saknas. En vägran som namnen missing eller retryable når kundens verbatim; ett nakna misslyckande förblir generiskt så ingenting inre läckor.

Geo valuta och nödstopp

När operatören slår på Geo valuta (klientchatt → Behaviour), läser kunden priser i sin egen valuta på varje yta - chattext, webbkortet, kanalens textkort och butiksfrontens öppningsvaluta - med hjälp av plattformens egna FX-butik. Ditt pris ersätts aldrig: kortet visar besökarens figur bredvid butikssumman, och porten behandlar exakt det belopp som den visar. Pausa alla försäljning (Inställningar → Commerce) är kill switch: katalog, citat och look-ups håller öppet; föreslår och bekräftar stopp på varje kanal.

När du säljer via chatten beter sig inte

Handlaren kunde inte nås

Paketets tätning är bruten: en fil redigerades efter signering. Re-publish paketet. En installerad marknadsplatskopia redigeras aldrig på plats; uppdatera den från marknaden panelen.

Beställningen är pausad för denna butik just nu

Dödsbrytaren är på. Inställningar→Kommers→Pausa all försäljning.

Beställning är inte tillgänglig på denna kanal ännu

Kanalen är inte inkrypterad under Var kunderna kan köpa. Serverns logga namn på kanalen.

Assistenten beskriver ett objekt men inget kort visas

Citationsverktyget vägrade. Varje samtal är inloggat som [opsiq][commerce][client_tool] Med anledningen: ett fel objekt id, ett fält objektet inte förklarar, en tagen domän eller köpmannens egen vägran. Läs loggen innan du litar på assistentens parafras.

Assistenten säger att det inte kan se produkterna

Sidan tillhör en annan arbetsyta. Varje webbplats widget hör till ett arbetsutrymme, och butikskontakten måste aktiveras där.

Ett konserverat svar istället för ett svar

Berätta lite mer om vad du behöver, betyder att AI-leverantören kallar sig misslyckad; AI History visar exakt felet under den turen och verktygen nåddes aldrig.

En kontaktredigering visas inte i chatt

Arbetaren återvinner kodändring inom en minut, men ett samtal spelar sitt sista kort. Starta ett nytt konversation för att testa.

En nigeriansk besökare ser dollar, även om Geo valuta är på

Kontrollera att geo-IPdatabasen är konfigurerad (klientchatt→Geo) och att besökarens valuta har en FX-ränta; utan räntesatsOpsIQVisar butikspriset snarare än ett fel nummer.

Din totala är den enda siffra som rör pengar

Ett citat bär unit_amount_minor, quantity och total_amount_minorDet är frestande att behandla den tredje som härrör från de två första. Det är inte, och anta att det redan har kostat en kund riktiga pengar.

quantity är vad KUNDEN valde – ett rum, en licens, en politik. Din multiplikator kan vara något OpsIQ aldrig ser: nätter, platser, faktureringscykler, avstånd, vikt, nivåer. Ett hotell citerar ett rum för tre nätter som mängd 1Enhet 105,000Totalt 315,000. OpsIQ multiplicerad enhet med kvantitet till pris ett bekräftelsekort, visade en gäst 105,000och sedan debiteras 315,000 handlaren faktiskt återvände. Att gå med i en siffra och debiteras en annan är det värsta som detta kontrakt kan göra.

Regeln

total_amount_minor är den enda siffranOpsIQvisar, skyltar, anklagelser och försoning mot. unit_amount_minor är en visningsdetalj på raden. Om din totala inte exakt vad du vill ha debiterat, kommer ditt citat fel - OpsIQ inte att rätta till det, eftersom en summa som har blivit hjälpfullt justerad är en du aldrig gått med på att hedra.

Vad detta innebär för din citatåtgärd

Returnera all-in siffran. Applicera dina egna nätter, nivåer, rabatter, skatter och avgifter innan du svarar. Om din linje inte försonar - enhet gånger något helt nummer aldrig motsvarar din totala -OpsIQbehandlar det hela som en linje till sitt verkliga pris snarare än att uppfinna ett sammanbrott som försonar ingenting.

Sex svar som gör detta kontrakt passar alla branscher

Deklarationen ovan började som en butiks deklaration: köp en sak, betala nu, det är din, du kan avbryta. Var och en av dessa fyra är ett antagande vissa verkliga affärer inte dela. En bank flytta pengar kan inte ångra det. En försäkringsgivare kan inte säga "bekräftad" tills en underwriter har tittat. En tradesman fakturor efteråt. En klinik räkningar någon som inte är patienten. Med något sätt att säga så, dessa företag antingen förvränga sin egen process till sina egna kunder eller inte kan ansluta alls.

En transaktionskontakt svarar sex fler frågor. Var och en av standarderna för den strikta läsning – Att säga att ingenting alltid är säkert och aldrig tillåtet, för att inte säga något är vad en författare gör när de inte har ansett frågan.

transaction_kind

purchase, booking, subscription, bill_payment, transfer, application, top_up, renewalVocabulary snarare än beteende: det bestämmer ordet din kund läser. Ringa en trådöverföring en "ordning" gör assistenten låter som om den inte förstår den verksamhet som den talar för, och ingen mängd korrekt VVS återhämtar sig från det. Standarder till purchase.

decision_mode

immediate eller deferredVälja deferred för allt som går till underwriting, kreditbedömning, referenser, antagningar eller en kommitté.OpsIQSedan säger lämnat in snarare än bekräftad, och händer över referensen för att fråga om det. Att berätta för någon deras ansökan bekräftas medan den sitter med en människa är det mest skadliga som en chatt assistent kan göra för ett reglerat företag, och det är standard beteende av varje detaljhandel formade flöde. Standarder till immediate.

payment_timing

on_confirmation, deposit_then_balance, invoice_later eller no_paymentDetta beslutar omOpsIQöppnar en betalningssida allsså att den inte kan dras från payment_flow - Det säger Den som tar pengarna, säger om och närArbeta du fakturerar efteråt, och ansökningar som inte kostar något att skicka in, avsluta vid bekräftelsen istället för att nå en portfölj lista som är tom eller fel.

reversibility

reversible eller irreversibleDet viktigaste en finansiell kontakt säger. Ett rum kan släppas och ett paket kan komma tillbaka; en färdig överföring inte - det finns ingen undo, pengarna är i andra änden, och den enda åtgärden ber en främling att returnera den. irreversible automatiskt krafter cancellation_flow till none och förbjuder alla operatörer som inställer sig från att hoppa över identitetsverifiering, Vad annat denna deklaration sägerTvå fält som inte håller med om är inte ett tillstånd att lösa vid drifttid genom vilken det läses först. Standarder reversible.

cancellation_flow

none, platform_only eller connector_cancelAvbokningsrollerna som redan fanns utan någon regel om vem som kunde nå dem, och de två felaktiga gissningarna misslyckas i motsatt riktning: gissa öppna och ett chattmeddelande avbryter en betald bokning utan någon avgift citerad; Gissa stängt och en kund som vill säga upp sig är till telefon. connector_cancel ytterligare kräver cancellation_quote och order_cancel med en återhämtning -OpsIQAldrig avbryter innan du säger vad det kostar. none.

fulfilment_presence

customer_present eller remote_deliveryOm en overifierad e-postadress kan kosta någon någonting. En hotellgäst måste komma, så en felaktig adress missvisar ett kvitto och rummet är fortfarande där; ett postat paket, en beställd server eller en nedladdningslänk lämnar på styrkan av den adressen ensam. Detta är vad som gör en operatörs "skip e-postverifiering" -inställning tillgänglig alls, och det förklaras av dig snarare än valt av dem - så ett hotell resonemang kan aldrig ärvas av en kontakt som fartyg varor. remote_delivery.

minimum_assurance och disclosure (valfritt)

minimum_assurance Låter dig kräva more identitetsbevis änOpsIQkräver aldrig mindre - en bank som kräver ett steg för en överföring utövar kontraktet. Att ställa in det tar också bort en operatörs förmåga att hoppa över kontrollen för din kontakt, eftersom en handlares eget riskbeslut överträffar en ägares bekvämlighet. disclosure är ordalydelse visas innan före Den bekräfta knappen, för en ränta, en avgift eller en avkylning rätt måste du presentera; utan det, reglerade företag smuggle krävs ordalydelse i ett produktnamn.

notify_flow

platform_automatic, platform_triggered eller noneNärOpsIQtar betalningen din egen kassan aldrig körs, så oavsett vad det normalt e-postmeddelanden aldrig bränder. Inspelning av betalningsmärkena beställningen betalas; den tvingar ingen plattform att berätta för någon. platform_triggered kräver att order_notify roll med en återhämtning, ochOpsIQfrågar först efter betalning återlämning bevisar att pengarna registreras. none gör OpsIQ-sidan bekräftelse obligatorisk, eftersom annars en betalande kund inte hör något alls. none.

Samma kontrakt, nio icke-relaterade företag

Ingen av dessa var utformad runt. Var och en är kontraktet svarar ärligt för en annan bransch, medOpsIQAtt inte veta något om någon av dem.

Ett kontrakt, nio branscher
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
Betald händelse som levereras till plattformar

Efter en infödd Storefront-betalning verifieras och begås aktivt, OpsIQ avger payment.completed med order_id, payment_id/provider_ref, gatewayexakt amount_minor, ISO currencyKund, linje objekt, kanal och paid_atEn köpman kontakt måste kvarstå som bevis genom record_payment och läsa den tillbaka; en värd-checkout kontakt konsumerar sin egen auktoritativa betalda händelse och får inte få ett dubblett betalningsskriv.

AI är en förespråkare, inte en myndighetskälla

Modellen kan välja en deklarerad produkt och kvantitet, men den kan inte välja ett operativt namn, mynta en utcheckning.URLEller skapa handelsstatus från text. Kunden får ett exakt signerat kort och måste trycka på sin bekräftelsesknapp. Den bekryftelsen är bunden till arbetsytan, kontakten, objektet, kvantiteten, citat, valuta, tråd och utgång.

Sociala kunder håller samma flöde utan e-postmeddelande

WhatsAppMessenger,Instagram, TelegramLINE, SMS och X använder det leverantörsverifierade kanalkontot som kundidentitet. Förslaget är signerat till detta kanal konto och bekräftelse fortfarande går igenom samma färska citat, lager, idempotens, betalning och återhämtning kontroller. En social kund använder exakt engångsbekrävande åtgärder utförs i deras konversation; vanliga prosa såsom "ja" är aldrig ordermyndighet.

Beställningshistorik följer en exakt identitetslänk, aldrig ett e-postgissa

Native order indexeras av en ogenomskinlig identitet, så AI kan svara "var är min beställning?" utan att begära ett e-post eller ordernummer. För ansluten butikshistorik länkar du kanalidentiteten till arbetsytan CRM/klientrekord och implementera auktoritativ kund/orderuppslag i kontakten. Kundkontextleverantörer får den lagrade länken; de får inte välja ett konto från ett displaynamn eller ett e-postmeddelande som skrivs in i chatt. Med en matchande order svarar AI direkt; med flera sammanfattar det matcherna och frågar vilken; utan någon säger att ingen historia är kopplad.

Gör nyttolast universellt: skrivna fält och en serverägd identitet

Kärnan innehåller ingenWHMCS, hotell, SaaS, butik, bank, produkt, väg eller leverantör gren. Citatet handling är skrivet parameters är kundformuläret och AI-slotschemat. En bokningskontakt kan deklarera datum och gäster; en faktureringsanslutning kan förklara en cykel; en framtida företagsanslutare kan förklara sina egna säkra fält.OpsIQsanerar primitiva kontroller och skickar de insamlade värdena endast till den kartlagda kontakten.

Typerad citat åtgärd
{
  "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"}]}
  ]
}

För clients_only, set customer_ordering.identity_parameter till åtgärdsparametern som tar emot kontaktens externa kund-id. Detta fält visas aldrig för en kund och alla uppringda värde tas bort;OpsIQinjicerar endast id från en verifierad kontaktlänk. Gästutcheckningen lämnar den tom. Ett skrivet e-postmeddelande är bevis för en deklarerad gästuppslag, inte en inloggning och inte köpmyndighet.

Grupperade domäner: signerade kundkonton och kontaktkonfiguration tillhör gruppprimär portalens arbetsyta. Dock måste identitetstoken undertecknas för den exakta medlemswebbplatsen som bäddar in widgeten, med hjälp av den medlemmens webhook hemlighet.OpsIQverifierar att ytan först och sedan löser handeln och den länkade kunden genom grupp primären. Byt aldrig ut medlemswebbplatsens nyckel med primärnyckeln och kopiera aldrig den primära hemligheten till en medlemssajt.

Canonical omsluter kontakten måste returnera

Katalog
{
  "success": true,
  "data": {"items":[{
    "id":"42", "name":"Example product", "summary":"Customer-safe summary",
    "currency":"USD", "unit_amount_minor":2500, "available":true,
    "selection":{"item_id":"42"}
  }]}
}
citat
{
  "success": true,
  "data": {
    "quote_id":"opaque", "currency":"USD",
    "unit_amount_minor":2500, "total_amount_minor":5000,
    "selection":{"item_id":"42","quantity":2},
    "expires_at":"2026-08-31T14:05:00Z"
  }
}

Plattformscheckout-responsen upprepar det giltiga kanoniska citatet och lägger till en HTTPS checkout_urlCore uppdaterar citatet vid bekräftelse och jämför valuta, totalt och stabilt urval exakt. Anslutningen översätter sitt plattformsrespons i dessa kuvert; kärnan översätt aldrig leverantörsfält eller bygger handlarenURL.

Gör en operatörsbyggd portfölj tillgänglig i den inhemska butiken och chatten

Betalningskapacitet ensam inte sätta en port framför kunder. Native Store betalningsgateway blockera i Connector Builder. Det lägger till ett explicit versionerat kontrakt, kartor checkout skapande och aktiv betalningsuppslag, och låtlistar de leverantörsvärda kassadomänerna. När anslutningen är installerad, aktiverad och vald under handel inställningar, samma porten visas i den offentliga butiken, Store modal, klient-chat kassan och autonom kasering. Ingen leverantör slug är hardcoded.

Native Store gateway kontrakt
{
  "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"]
    }
  }
}
Canonical Checkout Output

Checkout-åtgärden kartor checkout_url när leverantören har en, session_id. . Den URL måste vara HTTPS, innehålla inga referenser och matcha en tillåten värd.

Canonical status output

Statusåtgärden utför en ny leverantör API -uppslag och kartor paid som en riktig boolean, amount_minor som en heltal, currency som en tre-brevs ISO-kod, och provider_refEn returURLFråga sträng, klient nyttolast eller kontakt-tillhandahållen "bekräftad" instruktion är aldrig betalningssanning.

Valfritt återbetalningsavtal

Om gateway stöder återbetalningar, kartlägga payment_refund och dess återhämtningsåtgärder. Återbetalning av skapelsen returnerar strikt accepted och completed Booleans plus provider_refÅterhämtning utför en leverantörsuppslag och returnerar statusUtan båda åtgärderna,OpsIQannonserar inte anslutningsåterbäring.

Vem bekräftar ordern

Anslutningen skriver aldrig enOpsIQorderstatus.OpsIQJämför det returnerade beloppet och valutan exakt och registrerar leverantörsreferensen; först då utför kärnan den leverantör-verifierade övergången. Manuell banköverföring förblir det enda flödet som en namngiven agent kan godkänna.

I Connector Builder, tick Handelskartlägga rollerna och konfigurera antingen Ansluten butik kund beställning, Native Store betalningsgateway, eller båda när kontakten verkligen ger både kontrakt. Trollkarlen validerar deklarationen och skriver commerce_roles.jsonPublicering fortfarande använder den normala marknadsplatsen granskning och signatur process; detta avtal aldrig kringgår paketverifiering eller gör en kontakt icke-ininstallerbar. Verifiera alla paket för hand med php tools/verify_commerce_contracts.php.
💡
Transport är http för en fjärrkontroll API eller bridge för en namngiven operation på en utplacerad bro (se NO-APImönster nedan) Roller är transport-agnostiska; runtime behöver bara transporten som anges så att den kan versionspara en bro.
Kopplingar

Sälj genom chatt utan en kontakt: Aktiviteter & Triggers

Handelsavtalet ovan kräver inte ett kontaktpaket. Om din plattform är din egen - ett anpassat bakverk, en internAPI, ett system ingen skickar en kontakt för - du kan nå samma försäljningsmaskiner med de två verktygen som du redan använder för att integrera något annat: anpassade åtgärder (dina HTTP slutpunkter, definierade på sidan Aktiviteter) och Triggers (händelse webhooks). Samma kontrakt, samma kort, samma identitetssäkring, samma betalningskärnel, samma kvitton. Det enda sak som saknas är paketet, eftersom det inte finns någon tredjepartskod att underteckna.

Hur det passar ihop

Du bygger en anpassad åtgärd per handelsroll - var och en är en vanlig HTTPS-slutpunkt på din sida, definierad under AI & Automation → Åtgärder med dessURL, auth header och parametrar. Sedan sparar du en deklaration som kartlägger roller för dessa åtgärder. Från det ögonblicket visas din butik i chatt precis som en kontakt-stödd: AI citat från din citatåtgärd, bekräftelsekortet gör, kunden verifierar deras e-post, orderkärnan din beställning med en idempotensnyckel,OpsIQtar betalning genom arbetsytans portar, och din rekordbetalningshandlingar böcker det. ingenting om kundupplevelsen säger "anpassad".

Förklaringen

Spara dettaJSONSom arbetsytan inställning commerce_custom_integration (Inställningar→avancerade inställningar, eller via REST-inställningarnaAPIDet är samma form som ett paket commerce_roles.json handelsnod, med action namnge dina anpassade handlingsid:

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

Slutligen, lägga till custom_commerce till de kontakter som är aktiverade för försäljning under Inställningar→Kundchatt→Sälja genom chatt. Antagning är omcheckad på Var och en var begär, och det vägrar med namngivna skäl snarare än att tyst dölja din butik: en roll ditt läge kräver som kartor till ingenting, en skrivroll utan återhämtningsåtgärd (§ § 1)15.7- en skrivning vars resultat inte kan återinföras vägras), en åtgärd som har raderats eller inaktiverats sedan du sparade.

Vad varje handling måste göra

Returnera anslutningskuvertet

Svara {"success": true, "data": { ... }} eller {"success": false, "error": "a sentence a customer may read"}Din handlings Resulte Snabb bör peka på kuvertet.

Citat: totalt i mindre enheter

Återvänd quote_id, product_name, quantity, unit_amount_minor, total_amount_minor, currency, selection, selection_summary, expires_atAllt i avsnittet "din total är den enda siffra som rör pengar" ovan gäller verbatim: skatter, avgifter och multiplikatorer går till din totala, eftersom din total är vad som undertecknas, visas och debiteras.

Order skapa: hedra idempotensnyckeln

Du får idempotency_keyoch undertecknade total_minor och currencyverifierad customer_email, och dina egna citat parametrar. Förvara nyckeln med ordern; om du redan har skapat en beställning för det, returnera den ordningen istället för en andra. Verifiera pengarna - om ditt system prisar ordern annorlunda än den undertecknade totalen, vägra på ett retryably snarare än underladdning. Returnera en annan. reference Din plattform erkänner.

Återhämtning: svar om en skriv

order_by_key tar emot idempotensnyckeln och svaren {"found": true, "order": {...}} eller {"found": false}Falska är ett löfte -OpsIQkan skriva på styrkan av det. Ett statusflöde eller en ny orderlista är inte ett svar om en skrivning.

Rekordbetalning: din egen bosättningsväg

Får gateway-transaktionsid som idempotensnyckeln plus din orderreferens, efter att OpsIQ aktivt har verifierat belopp och valuta med porten. Markera den beställning som betalats via plattformens egen logik - elda dina egna e-postmeddelanden, minska ditt eget lager. Return platform_notified: true Om din plattform e-postar kunden själv.

Kortinmatningar kommer från dina handlingsparametrar

Varje parameter du deklarerar på din QUOTE-åtgärd (utöver identitetsparametern) som AI inte har samlat in görs på bekräftelsekortet som en ingång kunden fyller sig - en domän, ett datum, en plats. Märk dem väl; etiketten är vad kunden läser.

Triggers: hör din egen försäljning

Två evenemang eld på den delade eventbussen, så dina webhooks och automationer hör varje chattförsäljning varhelst det avrättade:

commerce.order.created

I det ögonblick ordern landar på köpmannens sida, före betalning - referens, kontakt (eller custom_commerce), belopp, valuta, kund e-post, tråd id.

commerce.payment.confirmed

Exakt en gång per order, när porten aktivt verifierar betalningen. Det rider samma påstående som förhindrar dubbla kvitton, så det kan inte dubbel-eld din webhook.

När ska man examen till en kontakt

Den anpassade integrationen är arbetsytan konfiguration: den tjänar din butik, på ditt arbetsutrymme. Det ögonblick du vill distribuera integrationen - andra arbetsplatser, marknaden, versionering, signering, betalda installationer - paket samma åtgärder och samma deklaration som en kontakt. Kontraktet ändras inte; bara omslaget gör det.

Kopplingar

Anslut en plattform som inte harAPI(bromsmönster)

Massor av riktiga plattformar fartyg ingen RESTAPIEtt hotell CMS, ett gammalt faktureringssystem, ett skräddarsytt internt verktyg. Du kan fortfarande skriva en komplettOpsIQAnslutning för en: anslutningen skickar en enda PHP-fil som operatören droppar in i sin egen offentliga brutto, och den filen ärAPIDenna sida är hela mönstret, med de regler som gör det säkert att köra och orsaken bakom varje regel.

Formen av den

En vanlig kontakt kallar någon annansAPIEn brokontakt ger sin egen. Inget annat förändras: samma åtgärder, samma kontextleverantörer, samma identitetsavtal, samma paketlayout.

1
Du skriver en PHP-fil

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
Operatören kopierar den till sin webroot

Bredvid plattformens egna index. php. Ingen plattformskod ändras, ingen plugin installeras, ingenting att upprätthålla över plattform uppgraderingar.

3
Anslutningspanelen händer dem filen

Dina inställningar.json förklarar webhook_help. snippet_template. Anslutningssidan gör det som en kopierbar fil med sina liveinställningar redan ersatt, så det finns inget att hand-redigera.

4
OpsIQ kallar den server-till-server

Din kund.php skickar GET-förfrågningar med den delade nyckeln i en X-Opsiq-Bridge-Key header. BasenURLInställningen är plattformens webbplats root.

Connector Builder CAN genererar detta för dig nu. Välj "Plattform utan API"profil (eller ställa in dataåtkomst till bro) och det avger bron filen, matchande panel snippet och de skrivna åtgärder som läser och skriver genom den - för en Laravel-applikation som läser dess .env, för WordPress läsning wp-config.php, eller med referenser du klistra in för något annat. Bridge läge fixar autentisering till OpsIQ broprotokoll: kontakten genererar säkert api_key när det är aktiverat, skickar den som X-Opsiq-Bridge-Keybinder samma sparade värde till OPSIQ_BRIDGE_KEY I den kopieringsbara filen. Hand-author endast när din plattform inte är någon av dem, eller när du behöver beteende den genererade broen täcker inte. En handskriven bro är säker från trollkarlen: det överskrider bara en bryggfil som bär sin egen markör.
💡
Allt på denna sida visas i PHP mot MySQL, eftersom det är referensgenomförandet och den enda kombinationen av förpackningspipeline stöder helt. Mönstret självt är språk-agnostiskt och motor-agnostik: se "Bron på andra språk och andra databaser" för porten i Node, Python, Go, Ruby, .NET och Java, introspektion frågan för PostgreSQL, SQL Server, SQLite Oracle och MongoDB motsvarande – tillsammans med förpackningsbegränsningen som bestämmer hur en icke-PHP-bro når operatören.

Säkerhetsmodellen och varför varje regel finns där

Den här filen sitter i en offentlig vibrator bakom en delad nyckel. Det enda faktum driver varje regel nedan. Slappna inte av någon av dem för att göra din bro enklare.

Den som ringer levererar aldrig SQL

Inte en WHERE-klausul, inte ett ORDER BY fragment, inte en "bara denna gång" raw query parameter. Uppringaren namnger en tabell, en kolumn och ett värde; din fil bygger uttalandet. Det ögonblick som en uppringare kan bidra tillSQLtext, en delad nyckel blir godtycklig databasutförande.

Tabell- och kolumnnamn valideras mot information_schema

Identifiers kan inte vara bundna som parametrar, så de måste kontrolleras istället. Läs den verkliga tabellen och kolumnlistan för denna databas och vägra något inte på det. En identifierare som inte är ett verkligt objekt i detta schema kan då inte nå en fråga alls - vilket gör det säkert att exponera varje tabell.

Varje värde är en bunden parameter

Utan undantag, inklusive värden inuti en sökning. Validerade identifierare plus gränsvärden är det par som gör ytan totalt och injektionsytan nil.

Läser är universella, skriver är tillåtna

Se nästa block. Detta är regeln som folk mest vill hoppa över.

Hemliga kolumner redigeras på läs och vägras skriva

Match på kolumn NAME: lösenord, Remember_token, hemlighet, api_key, Private_keyn, salt, token. Byta värdet med en platshållare på väg ut. Vägra skriva helt på vägen in - skriv ett råt lösenord hash är inte en operation, det är en fotvapen. Skicka operatören till plattformens eget lösenordsflöde.

Rader är engångsrad, genom primärnyckel

Aldrig en bulk rad, aldrig ett borttagning med filter. En bulktborttagning är hur en databas dör. Om någon verkligen behöver en, kan de göra det i plattformen.

Reads är row-capped

Klämma gränsparametern med ett hårt tak. En runaway fråga får inte kunna dumpa databasen genom ett chattmeddelande.

Fail stängd tills nyckeln är inställd

En okonfigurerad bro svarar 403 till allt. En bro som är användbar innan den konfigureras är en bro med hjälp av en främling.

Konstant-tid nyckel jämförelse, nyckel i en rubrik

hash_equals, aldrig ==. Nyckeln går i X-Opsiq-Bridge-Key, inte frågan strängen, så det stannar ur åtkomstloggar, proxy loggar och Refererer rubriker.

GET endast

En metod, en form, ingenting att smuggla i en kropp. Allt bron gör är uttrycksfullt som ett GET med validerade parametrar och OpsIQ är den enda uppmaning.

Läser universellt, skriver tillåtet - och varför

Detta är den regel som blir argued med, så här är resonemang i sin helhet. Assistenten bör kunna SE hela plattformen: det är vad som gör det användbart, och en läs kan inte förstöra någonting. Writes are different. Denna fil sitter i ett offentligt vibrerat bakom ONE delad nyckel. Om denna nyckelläckor, gör en obegränsad skrivyta läcka motsvarande fullständig databaskontroll - en ny adminanvändare, en tömd bokningstabell. En låt-lista betyder att en läckt nyckel fortfarande inte kan nå en tabell som operatören aldrig aktiverade.

⚠️
Den är OpsIQ godkännandekortet portar AI, inte nyckeln. Admin klickar Tillåta på en destruktiv åtgärd är en kontroll över assistenten. Det är inte en styrning över vem som än håller bryggan nyckel. De är två olika hot och tillåt-listan är svaret på den andra.
Operatörsövande knopp, från Botble bron
/* ── 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';

Två detaljer i checken nedan är lätta att få fel. Tabellnamnet anländer redan RESOLVED, bär installationens bord prefix, medan en operatör skriver den tillåtna listan utan förtryck eftersom det är vad de skulle naturligt skriva. Jämför båda sätten eller en prefixid installera tyst tillåter ingenting och varje skrivavbrott. Och vägran måste förklara sig själv, eftersom personen som läser det är en admin i ett chattfönster, inte en utvecklare med en stapla spår.

Kontrollen av tillåtna listor, verbatim från 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);
};

porten, i full

Fyra kontroller, i denna ordning, innan något rör data. Kopiera beställningen samt checkarna.

De fyra grindkontrollerna, för att
<?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. */

Validera identifierare mot information_schema

Detta är den bit som vänder "assistenten kan nå något bord" från hänsynslös till säker. Lös uppringarens tabellnamn mot det verkliga schemat, tolerera en saknad eller extra tabell prefix och returnera null för allt annat. Allt nedströms fungerar sedan med ett namn som bevisligen finns.

Identifier validering och redigering, verbatim från Botble bridge
/** 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;
};

En läs op och en skriv op, komplett

Observera vad som är bundet och vad som valideras. Filtret kolumnen kontrolleras mot den verkliga kolonnlistan och sedan interpolerad som en identifierare; dess värde är gränsen är klämd. Rows redigeras på vägen ut. Uppdateringen vägrar primärnyckeln och någon auth-kolumn, och frimärken uppdaterade_at när tabellen har en.

Läs varje tabell - validerade identifierare, bundna värden, begränsade rader
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,
    ]]);
}
Skriv en rad - tillåtet tabell, vägrade auth-kolumner, enstaka rad med primärnyckel
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)),
    ]]);
}

Överlevande schemaskillnader

Plattformsversioner skiljer sig. Kolumner flytta, byta namn eller är frånvarande. En bro som antar ett schema fungerar på en installation. Introspect och anpassa istället: välj bara de kolumner som finns här, tolerera tabellprefixet och prova trovärdiga stavningar av en referens.

Schema tolerans, från Botble bridge
/* 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));
💡
Ge din bro en op=diag som rapporterar STRUCTURE bara - vilka tabeller lösas, som kolumner huvudtabellen har och SHAPE av den senaste referens med varje digital maskerad. Det är nyckel-git som allt annat, och det blir "uppslaget inte hittar något" från en supportbiljett till ett tio sekunders svar. Låt aldrig den returnera riktiga poster.

Uniforma fel och uppräkningsfällan

En form för allt

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.

Inte-grundad och ingen match måste vara identisk

På en uppslagsyta, en referens som inte existerar och en referen vars bevis inte matchar måste ge SAME-respons. Olika svar förvandlar din bro till ett orakel som bekräftar vilka referenser är verkliga, vilket är en gratis kundlista export för alla patienter.

Läck aldrig orsaken till en besökare

Bron kan vara exakt medOpsIQVad som når en besökare bestäms avOpsIQi en fast vägran.

Den kopierbara filen i kontaktpanelen

Operatören öppnar aldrig ditt förråd. De öppnar kontaktens panel iOpsIQTryck på Copy. Den kopian kommer från inställningarna.json, och det måste vara samma program som bridge /*.php.

inställningar.json — panelentrén för en brokontakt
{
  "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.

Snippet_bindings överlever regenerering

Deklarera varje genererad hemlig uppgift uttryckligen. Synkroniseringsverktyget bygger om panelkopian från den levererade bryggan och återställer sedan OPSIQ_BRIDGE_KEY = {{setting:api_key}} Utan det kan en uppgradering troget kopiera nyckellös paketfil och tyst ta bort operatörens utplacerade nyckelställare. Connector Builder avger denna bindning automatiskt för genererade broförpackningar.

Andra platsägare ersätts server-side

oberoende av detta,{webhook_url}, {webhook_path}, {webhook_secret}, {site_key}, {base_url}och{slug}är fyllda innan panelen någonsin ser snippet.

webhook_help kan vara ett objekt eller en lista

En lista ger dig flera snippets i en panel, t. ex. en bryggfil och en separat reläkok.

🚫
Upprätthåll inte snippet för hand. Brofilen och panelkopian är två kopior av ett program, och de kommer att driva - en bro uppgraderades och dess panel kopia var inte, så alla som installerade om och kopierade från panelen installerade den gamla bron och tyst förlorade varje ny förmåga. Ingenting upptäckte det: överensstämmelse passerade, signaturer passerade testerna gick.
Håll de två kopiorna identiska
# 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.

Vad bron ska exponera

Formade operationer och en universell datayta, tillsammans. De formade återvänder snygga, ändamålsenliga svar på de frågor som människor faktiskt ställer; de universella täcker allt annat så att assistenten aldrig fastnar.

Fortsatta läsare

Statistik, huvudobjektlistan med filter, ett objekt med sina relaterade rader, katalogen över vad som säljs, kundsökning med historia. Dessa ger AI ett bra svar i ett samtal istället för fem.

Fortsatta författare

De två eller tre statliga förändringar som är viktiga - sätt status, avbryta. Håll de accepterade värdena tillåtna.

Typerad handel

För en säljbar plattform exponera specialbyggd katalog, citat, checkout / order och betalningsbevis operationer, sedan kartlägga dem i commerce_roles.json med transport: bridgeAldrig kartlägga en handelsskrivare roll till den universella rekordet. skapa / uppdatera ytan.

Universell upptäckt

tabeller (med radräkningar) och beskriva (kolumner, typer, primärnyckel, plus läsbara och skrivbara flaggor per kolumn). Så här lär assistenten en plattform du inte förutsåg.

Universal läs och skriv

query, record. get, record . create, record! update, record... delete. Every one of them validated as displayed above.

Identitet, före nyckelporten

Identitetssonder kallas av ADMIN'S BROWSER, samma ursprung, så att de inte kan skicka en anpassad rubrik. Deras autentisering är plattformen session själv. Sätt dem framför nyckelporten, hålla dem borta från alla postdata och låt dem aldrig återvända en hemlighet. Se kontakt identitet sida.

Diagnostik

op=diag, structure only, masked.

Bridge commerce roll map
{
  "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"
    }
  }
}
💡
Den kanoniska rollen styr sekvens och myndighet; bryggverksamheten håller plattformens egen typad nyttolast. Ett hotell kan kräva ankomst, avgång och gäster, WHMCS kan kräva en befintlig kund eller kontaktägda registrering, och en SaaS-plattform kan kräva ett faktureringscykel. Core aldrig hårdkoder dessa områden. Bron måste åberopa plattformens affärstjänster så lager, skatter, faktura, bekräftelsemail och krokar alla körs.
⚠️
record_payment är inte en mark-betald genväg. Acceptera endast serververifierade leverantörsbevis: exakt ordning, handlare, belopp, ISO valuta, leverantör referens, färsk verifierad tidsstämpel och idempotency nyckel. Bestå det genom plattformens betalning / faktura API, sedan returnera en auktoritativ order eller faktureringsåterställning. Ett okänt resultat måste köra återhämtning innan någon retry.
💡
En lättläst kontakt behöver ingen tillåten lista alls. Om din plattform bara någonsin svarar på frågor, skicka en bro utan skrivops och hela klassen av skrivrisk försvinner.

Checklista innan du skickar en bro

Bron vägrar allt utan nyckeluppsättning

Testa det. Byt namn på konstanten för att tömma och bekräfta varje op-svar 403.

En fel nyckel vägras i ständig tid

hash_equals, och nyckeln lästes endast från rubriken.

Ett uppslagsbordsnamn vägras

Och ett riktigt bordsnamn med fel prefix löser fortfarande.

En lösenordskolumn visas aldrig i en läsning

Och en skriv som heter man vägras med en förklaring.

En skrivelse till en tabell utanför den tillåtna listan vägras

Med meddelandet som berättar för operatören hur man breddar det.

Panelen snippet matchar bridgefilen

php verktyg/sync_connector_bridge_snippets. php rapporterar det i steg.

Ominstallera kontakten räcker inte

Om ditt paket skickar en bryggfil måste en operatör som uppgraderar kontakten ALSO omdirigera filen i sin brutto. Säg så i panelkroppen och i din CHANGELOG, varje release.

Kopplingar

Stövlar plattformens egna ramar från en bro

En bro som bara läser kan prata SQLEn bro som skapar saker på plattformen (en order, en bokning, en betald faktura) måste gå igenom plattformens eget programskikt och starta det skiktet huvudlöst är där varje subtilt misslyckande i detta mönster lever. Allt nedan lärdes den hårda vägen på en levande integration, varje regel mot en verklig defekt som inte producerade något fel någonstans.

En rad i databasen är inte en order

Raw INSERTs skapar en skuggrekord

Raden visas, admin listar den, och det är fortfarande inte en rekord plattformen tror att den skapas: ingen inhemsk referensnummer, inga modell krokar, inga händelser, ingen faktura, ingen kund e-post, ingen fungerande kund-ansikte länk. Kunden citerar en hänvisning plattform aldrig utfärdats till personal som inte kan hitta det. Skapa genom plattformens egen tjänst; om det bara utsätter en post-betalning service, skapa grafen det förväntar sig och överlämna på sömmen som den definierar.

Aldrig återanvända plattformens nummer

Två prover av ett referensformat gör det enkelt att reproducera och reproducera det är samma skuggskriv en nivå ner: dagen plattformen ändrar sitt schema, var och en av dina poster är fel och ingenting varnar dig. Ring dess generator (reflektion når en icke-statisk en) och läs den lagrade värdet tillbaka snarare än att lita på vad du skickade.

Plattformskolumner håller plattformsbetydelser

Innan du lagrar något av din i en plattformskolumn, hitta varje läsare. En kolumnen som heter som en gratis slot kan vara bärande: på referensintegrationen, transaction_id visade sig vara token kundens e-postade "view your booking" länk löser genom: en idempotency digest lagras där tyst bröt varje gästlänk. Håll din bokföring i ett broägt bord: UNIQUE (operation, idempotency_key) är replay vakt, begränsningar vägrar den samtidiga tvillingen, och återhämtningsuppslag läser samma tabell som skapandet skrev. Skapa det bordet innan Transaktion: MySQL DDL begår en öppen transaktion implicit.

Händelser, lyssnare och dubbel-e-postfällan

Läs tjänstens källa innan du skickar ut sina händelser

Om plattformstjänsten du ringer redan skickar händelsen, skickar den själv skickar kunden två bekräftelse e-post och genererar två fakturor. Om ingenting lyssnar skickar avsändning ingen. Varken misslyckande höjer ett fel. Reflektera metoden, skära källlinjerna, och läs vad det faktiskt gör: en namnbaserad gissning och även en regex över kroppen fick båda detta fel innan källan avgjorde det.

Få lyssnare () döljer sanningen; getRawListeners() berättar det

Laravel inslag av klasslyssnare i stängningar, så getListeners() rapporter [email protected] för allt. getRawListeners () namnger de faktiska klasserna. Aldrig skicka en händelse vars lyssnare du inte kan namnge.

ShouldQueue betyder inte "kör senare"

Med queue=sync (standarden på massor av produktionsinstallationer) kör en köad lyssnare INLINE i din brygga begäran. Din startkontext är dess render-sammanhang: varje registrering eller URL defekt i din boot landar i kundens inkorg. Kontrollera config ('queue.default') innan du resonerar om var något går, och titta på jobb /failed_jobs innan en arbetstagare antogs var inblandad.

Bevakningsreturer med plattformens egen stat

En tjänst som skickar ovillkorligt måste kallas exakt en gång. Markören som inte kan driva är plattformens egen rekordstatus (endast ring medan skivan fortfarande väntar), inte en parallell "sänd" flagga av din som kan vara oense med den.

Den huvudlösa boot är inte webbstart

Registrera vad webbstarten registrerar

Template variables, module settings, filter hooks: platform service providers often register them only on a web request. On the reference integration the email handler substitutes only REGISTERED variables: every value was set correctly and the customer's confirmation still rendered with empty name, phone and link, no error anywhere, because registration lives in a runtime registry the headless boot never filled. Find the platform's registration call (for Botble: EmailHandler::addTemplateSettings with the module's email config) and make it in your boot, exactly as the platform's own provider does.

Pin ALLA URL roten, inte bara routern

De fångade förfrågningspunkterna på ditt broskript, så rutt(), url() och tillgång() generera site.com/Public/opsiqbridge.php/checkout/TOKEN: en kundlänk via en JSON endpoint. forceRootUrl (config('app.url) fixar generatorn; STORAGE disken har sin egen rot, så den e-postade logotypen förblir trasig till filsystem.disks.public.url är också inställd (det löser lätt, så att ställa den på startarbeten, och endast när tom eller skript-relativ: en operatörs CDN URL är inte din att överskrida).

Begå innan du överlämnar

Plattformens tjänster läser genom sin egen anslutning och kan inte se din öppna transaktion. Kallas innan de begår, en post-betalning tjänsten finner ingen färdig betalning, tyst lämnar rekordet obetald, och fortfarande eldar sina händelser, så kunden är e-postade om ett skiva plattformen tror är obetalt. Begå diagrammet, sedan ringa.

Ärlighetsregler

Inga skuggor fallbacks

Om den inhemska vägen är oåtkomlig, vägra med ett förfallligt fel BEFORE några pengar flyttar. Uppfinna aldrig en hänvisning, aldrig rå-update en status att göra en halvintegrerad rekord ser färdig ut. En verifierad betalning vars infödda bearbetning misslyckades går till försoning som needs_attention: pengarna är verkliga, staten är ärligt "betald, ännu inte behandlas".

Rapportera fakta, inte din deklaration

"Tjänsten sprang" och "kunden fick höra" är olika fakta: referensintegrationen skickade ett komplett e-postmeddelande med varje fält tom medan ran-flag sa sant. Returnera dem separat (processing färdig, anmälan försökt), hålla en per samtal platform_notified som tvingar OpsIQ återkommande bekräftelse när plattformen inte behandlades, och aldrig hävdar leverans: en inkorg är inte observerbar från en server.

Mät, skriv sedan

Fartyga en lätt kapacitet sond i bron: klass existens, metod signaturer, källslakt av de metoder du tänker ringa, råa lyssnare, köförare och (när en fråga kan besvaras genom att kalla en ofarlig funktion) levande samtalet själv. Fem teorier om ett ihåligt e-post dog mot mätningar innan källan bosatte det. En sond runt kostar en filkopia; en fel skriv på en live plattform kostar kunden.

Kopplingar

Bron på andra språk och andra databaser

Bryggmönstret är inte ett PHP-mönster.OpsIQsamtal är en HTTP endpoint, så filen kan vara Node, Python, Go, Ruby, .NET eller Java, och butiken bakom det kan vara någonSQLmotor ellerMongoDBVad är PHP-format är förpackningsledningen, och den begränsningen bestämmer hur din bro når operatören. Läs leveransavsnittet först: det är den del som överraskar människor.

Vad kontakten faktiskt kräver

Detta är hela kontraktet. ingenting i det heter ett språk.

Transporter

HTTPS. En GET-begäran per samtal. Ingen kropp, ingen annan metod.

Autentisering

En delad hemlighet i X-Opsiq-Bridge-Key begära rubrik, jämfört i konstant tid. Inte en fråga parameter, inte en cookie, inte grundläggande auth.

Parametrar

Query string. op namn på ytan, do namn på operationen, resten är den verksamhetens argument.

Svar

JSON. {"success":true,"data":{...}} eller {"success":false,"error":"snake_case_reason"}. Content-Type-applikation/jsonoch ingen cachning.

Statuskoder

200på framgång.403okonfigurerad eller fel nyckel,404inte hittat,405fel metod,400dåligt argument,501inte stöds på detta schema.

Det är allt

Inget ramverk, ingen runtime, nej OpsIQ -bibliotek på din sida. Om det kan tjäna det kan det vara en bro.

Leverans: vad som kan leva i bro/, och vad får inte

Det signerade paketet täcker en fast lista över filändelser, och en fil utanför den listan lämnas ut ur ZIP. En bro på ett språk som listan inte täcker därför kan inte skickas inuti paket - men det kan inte längre försvinna på dig heller.26Augusti augusti2026En fil i bridge/ att paketeraren skulle släppa är ett hårt överensstämmelsesvikt, så paketet vägrar att passera istället för att installera utan bro i det.

Hur en bro/mapp behandlas vid byggtiden
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 och JavaScript — fullt stöd

Filen fartyg i den undertecknade ZIP, och snippet verifier håller din panel kopiera byte-identisk till det, beroende på vilken av de två är. Driftkontrollen läser varje fil i bro /, inte bara PHP en, så en uppgraderad bro med en förföljande panelkopia misslyckas byggandet på något språk.

Allt annat – leverera genom panelen endast

Panelen snippet är vanlig text utan aning om vilket språk det håller, så det fungerar för någon stack. Sätt hela programmet i webhook_help. snippet_template, namn filen i snippets_filename, och lämna inte en kopia i bridge / - överensstämmelse kommer att vägra paketet snarare än skicka den ihålig. Säg tydligt i webhiok_hjälp. body som operatören kopierar denna fil istället för att få det från paket.

Om du verkligen behöver ett annat språk I paketet

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.

💡
Namn filen i webhook_help.snippet_filename När ditt paket skickar mer än en brygga. Det är så kontrollören vet vilken bro en panelkopia tillhör; utan det, en tvetydig parning rapporteras som en överensstämmelse varning och att snippet lämnas okontrollerad.
⚠️
Poängen med driftkontrollen är att en bryggfil och dess panelkopia är två kopior av ett program och kommer att avvika. Regenerera snarare än handredigering: php tools/sync_connector_bridge_snippets.php --applyoch sedan återsigna paketet.

Porten, på sex språk

Samma fyra kontroller i samma ordning överallt: misslyckas med att stängas utan nyckel, en metod, konstant-tid nyckel jämförelse från header, sedan ansluta. Den enda riktiga fällan är jämförelsen, och det är en annan fälla på varje språk.

⚠️
Jämför SHA-256smälter av de två nycklarna snarare än nycklar själva. Det är korrekt på alla språk, och det sidesteps det faktum att flera konstant-tid jämförare antingen kasta eller läcka på en lång missmatchning - Nodes timingSafeEqual höjer en RangeError när bufferterna skiljer sig i längd, vilket gör en fel nyckel till en500istället för en403.
Node. js – porten
// 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 - porten
# 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)
Gå, Ruby, . NET och Java - samma jämförelse
// 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)));
}

Validera identifierare på varje databasmotor

Säkerhetsegenskapen ändras inte: en tabell eller kolumnnamn som den anropade måste kontrolleras mot det verkliga schemat innan det interpoleras, och varje värde måste vara en bunden parameter. Endast introspektion fråga, citeringspersonalen och paging klausulen skiljer sig åt.

MySQLochMariaDB

Tabeller: SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = ?Kolumner: samma mot information_schema.COLUMNS med AND TABLE_NAME = ?. Citat med backticks, fördubbling någon bakåt inuti. Sidan med LIMIT n OFFSET m.

PostgreSQL

Samma information_schema-vyer, lägre namn WHERE table_schema = $1 (vanligtvis publiccitera med dubbla offerter, fördubbling av något dubbelt citat inuti. sida med LIMIT n OFFSET mTitta på vikningsregeln: en ociterad identifierare är viktad till lägre fall, så jämföra känslomässigt när du löser ett namn.

SQL Server

Samma INFORMATION_SCHEMA-vyer. Citat med fyrkantiga fästen, fördubbling av någon stängning av fästet inuti. Paging behöver ett ORDER BY: ORDER BY [id] DESC OFFSET @o ROWS FETCH NEXT @n ROWS ONLY.

SQLite_

Tabeller: SELECT name FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%'Kolumner: SELECT name FROM pragma_table_info(?) Använd den bordsvärderade formen, eftersom det är bara PRAGMA table_info(x) uttalande kan inte ta en bunden parameter och inbjudande sträng interpolering finns exakt hålet du försöker stänga. Citat med dubbla citat. LIMIT n OFFSET m.

Oracle

Tabeller: SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = :owner; kolumner från ALL_TAB_COLUMNScitat med dubbla offerter, och kom ihåg en ociterad identifierare veck till UPPER fallet, motsatsen tillPostgreSQLPage med OFFSET :o ROWS FETCH NEXT :n ROWS ONLY 12c och senare.

MongoDB

Inget nejSQLSå ingen identifierare interpolering och inga bundna parametrar - en annan disciplin för samma mål.

Introspektionsfrågan 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;
💡
Lös sedan, använd sedan RESOLVED-namnet. Aldrig passera uppringaren stavning till frågan även efter att ha kontrollerat det - se det riktiga namnet i listan du läser från schemat och interpolera det. Det kostar ingenting och det stänger gapet mellan "detta namn matchade något" och "det här är namnet jag håller på att köra".

MongoDBsamma regler, utanSQL

Det finns ingen fråga sträng att injicera, så folk antar att det inte finns något att vakta. Det finns: filtret dokumentet. Passerar caller-supplied JSON rakt in i find() Låt en caller skicka {"$ne": null} eller {"$gt": ""} Där du förväntade dig ett värde och tyst väljer varje dokument. Bygg filtret själv.

MongoDB — samlingsprogram, skalärt-tvingat filter, projektion som Redigering
// 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();
Insamlingsnamn kommer från listCollections

Det är din information_schema. Lös upp den som stavar mot det och använd det lösta namnet.

Tvinga varje filtervärde till en skalär

En String() eller ett nummer () runt det är hela försvaret mot injektion av operatören. Ett dokument där du förväntade dig ett värde är NoSQL-ekvivalenten med en stray citat.

Projektion är Redigeringsregeln

Uteslut hemliga formatfält i projektionen så att de aldrig lämnar servern, snarare än att ta bort dem från resultatet efteråt.

Rader stannar endokument av _id

radera en med en löst _id. aldrig ta bortMånga, och aldrig ett filter som den influerade.

Skriver stannar tillåtna listade

Samma resonemang somSQLNamnet på samlingarna en skriv kan röra, och vägra resten med en förklaring.

Identitetsändpunkten på andra språk

Identitetssonden är den andra hälften av en bro, och det är HTTP också. Signeringsblocket är identiskt på alla språk: base64url nyttolast,HMAC-SHA256 som sträng, gå med i en prick.

Skriftligt inte handstil detta från början. Inställningar, Support Portal bär en färdig rutt per språk för portalen (en gång, två minuters token). Remote Sites, din webbplats, Codes, C. Erkänner inloggade kunder automatiskt bär chattversionen per språk (en timme token plus den uppdaterade handtagaren). Ta signeraren från smaken som matchar din stack.
Vad du ska ändra när du återanvänder det

Dessa snippets mint en PORTAL handoff token, som medvetet är strängare: det bär jti och singel_use: sanna och liv om120sekunder för att den reser i enURLEn bro eller widget identitet token bär varken av dem och använder en längre exp, minuter till timmar.

Vad som förblir detsamma

Site_key, iat, exp och en toppnivå autentiserad:sann, plus en admin eller kund med ett id och ett användarnamn eller e-post. Samma påståenden, samma signatur, samma hemlighet.

Båda tokenformerna verifierar

En tredelad JWT signerade HS256 fungerar, och det gör också den tvådelade bas64url nyttolast plus hex HMAC att PHP-referensen avger. Använd vilken språkets bibliotek som helst gör naturligt – ett JWT-biblioteck är vanligtvis den kortare vägen utanför PHC.

Aldrig mint det i webbläsaren

Sant på alla språk. Signering klient-side innebär att skicka webbplatsen hemlighet till varje besökare.

Välja, ärligt

Plattformen är PHP

Skriv bron i PHP. Det skepp i paketet, det är driftkontrollerat och det kan starta plattformens egen ram för att läsa en live-session för identitetssonden. Ingenting annat ger dig alla tre.

Plattformen är Node

En . js bridge fartyg, skyltar och är driftkontrollerad precis som en PHP en. Ingenting ges upp.

Plattformen är Python, Ruby, Go, . NET eller Java

Leverera genom panelen snippet och säg så i panelkroppen; lämna inte filen i brygga /, där överensstämmelse vägrar paketet. Anslutningen är annars helt normal: åtgärder, kontextleverantörer, identitets- och gästuppslag fungerar alla lika, eftersom ingen av dem bryr sig vad som svarar på HTTP samtalet.

Du kan inte köra en process på plattformsvärden

Då är bryggmönstret inte rätt verktyg. En bro finns för att nå en plattform inifrån sin egen värd. Om du bara kan nå den från utsidan skriver du ett vanligtAPIAnslutning mot vilken yta den än exponerar.

⚠️
En mer begränsning värd att planera runt: en identitet sond måste läsa plattformens inloggningssession, vilket vanligtvis innebär att köra inuti plattformens egen process eller åtminstone på sin värd med tillgång till sin session butik. En bro skriven på ett annat språk från plattformen kan tjäna data bekvämt och kan fortfarande kämpa för att svara op= admin_identity. Om det är ditt fall, skicka databron i ditt språk och identitetssonden i plattformens.
Kopplingar

Ge assistenten båda halvorna: handlingar och sammanhang

Detta är det enda vanligaste sak som saknas från en kontakt som "arbetar men är värdelös". Åtgärder låter AI DO saker. Kontext avsnitt låta det VÄNT saker. En kontakt behöver både, och de flesta frågor en admin frågar besvaras av sammanhanget, aldrig genom en åtgärd. En anslutning med perfekta åtgärder och ingen kontextleverantör kommer sanningsenligt rapportera att det inte kan se någonting.

De två halvorna

Åtgärder – hur AI gör saker

Deklarerad i handlingar.jsoneller returneras genom registerActions(). Modellen väljer en, fyller sina parametrar ochOpsIQavrättar det. Åtgärder är för verb: annullera denna bokning, öppna den biljetten, ändra denna status.

Kontext avsnitt - hur AI vet saker

Monteras av en ContextProvider innan modellen körs. "Hur många order den här månaden", "vem är mina nyaste kunder", "vad säljer vi" alla lösa genom ett kontextuppslag, och aldrig röra vid en åtgärd alls.

⚠️
Symptom på en saknad leverantör: assistenten svarar "Ingen aktiverad kontakt levereras denna kontext avsnitt" medan anslutningen är installerad, aktiverad och passerar sitt anslutningstest. Ingenting är inloggad, inget fel. Det meddelandet betyder att ingen leverantör hävdade sektionen.

Det universella sektionsordförrådet

OpsIQ begär sektioner med generiskt namn. Ditt jobb är att bestämma vad var och en betyder på din plattform och svara på den. Ett hotell bokning IS hotellets order; ett rum Är det hotellet säljer. Karta, uppfinna inte.

Order/Pending_orders

Oavsett en transaktion är på din plattform: order, bokningar, reservationer, jobb, försändelser. pending_orders är samma lista som filtreras till de oavslutade.

Kunder

Kunden roster.

products

Vad plattformen säljer: produkter, rum, planer, tjänster.

fakturering

Intäkter och penningformade totaler, plus räknas av staten.

Biljetter, tjänster, domäner, servrar, aktivitet

Använd dessa när din plattform verkligen har dem. Tvinga inte en kartläggning - ett obesvarat avsnitt är bättre än fel.

Allt annat din plattform har

Förklara din egen. En leverantör som förklarar avsnitt(): [licenser", "skepp"] har de sammanslagna i den universella uppslagstilen, så plattformsspecifika uppslag blir tillgängliga utan några kärnförändringar.

Det misstag som kostar en dag

En kontextleverantör måste implementera gränssnittet. Registret typkontrollerar det, så en klass som bara LOOKS rätt hoppas över - utan fel, någonstans.

ContextProvider. php — kontraktet, från Botble referenspaket
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 '';
    }
}
Registrera den från kontakten

Genomföra ContextConnectorInterface och returnera dina leverantörer från kontextProviders(). Anslutningsklassen kan också genomföra ContextProfant direkt och registreras som sig själv.

Återvänd vanlig text, inte JSON

bygga() returnerar ett textblock som är sammanfogat i prompten. Skriv det för en läsare: en rubrik, sedan en rad per rad.

Återvända " snarare än att kasta

Fånga dina egna undantag. En leverantör som kastar är inloggad och hoppad, men att returnera "är kontraktet.

Byggaren kan inte skriva avsnitt () för dig

Den genererade ContextProvider. php skepp sektioner(): array { returnera [], och guiden har inget fält för det. Fyll den i för hand - och kom ihåg att publicera från trollkarlen OVERWRITES filen. Kopiera dina redigeringar först.

⚠️
Ange det sanna TOTAL, inte antalet rader du skickade. En sida är inte totalt. En leverantör som listar tjugo rader utan att säga så får assistenten självsäkert svar på "du har20bokningar" när plattformen håller669Ett billigt rådet och en explicit linje - "TOTAL på filen:669(Denna lista visar det senaste20"-är hela fixen, och ett säkert fel räkning är värre än ingen räkna.
Ett sektionsblock som inte kan missberättas
$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);

Namnge dina handlingar såOpsIQkan berätta läsningar från författare

OpsIQ klassificerar en åtgärd av WORDS i sin action_id, och det är medvetet konservativt: allt som inte kan känna igen behandlas som ett skriv-och kräver ett godkännandekort. Få verbet rätt och en läs bara körs.

1
is_destruktiva eller kräver_confirmation wins

Om någon av dem är inställd behöver åtgärden alltid godkännande. Deklarera dem ärligt - det här är vad som yttrar adminens godkännandekort.

2
Ett skrivord någonstans i ID gör det till en skriva

lägga till, skapa, öppna, uppdatera, redigera, ändra, modifiera, ta bort, ta av, förstöra, avbryta, återbetala, avstänga, avsluta, aktivera, godkänna, förkasta, skicka, markera, återställ, fånga, tomrum, stänga, öppna upp, tilldela, återkalla, bevilja, ställa in, växla, aktivera och göra en del mer, generera, tillämpa, debitera, betala, tillhandahålla, förnya, uppgradera, gå samman, överföra, trappa, flagga, registrera, synkronisera, trycka, importera, utlösa, börja, stoppa, stanna, starta, om och omstarta och några fler.

3
Ett läsord gör det till en läsning

få, lista, söka, hitta, visa, fetch, räkna, leta upp, beskriva, läsa, exportera, förhandsgranska, test, ping, status, sammanfattning, detalj, senaste historia, check, logga, statistik, mätvärden, översikt, intäkter, nedbrytning, rapport, analys, balans, användning, kvot, ögonblicksbild, insikter, foder, utkast, triage, klassificera, föreslå.

4
Därefter bestämmer HTTP-metoden

GET, HEAD och OPTIONS är läsningar.

5
Annars är det en skriven

Okänd betyder godkännande krävs. Det standarden är avsiktlig.

⚠️
Skriv ord kontrolleras innan läsord, så ett blandat namn som get_and_sync_orders klassificeras som en WRITE. Välj ett verb, sätt det först och håll den ren: list_order, get_customer, search_bookings, cancel_bookning, set_ordER_status.

Bara deklarera native_api om plattformen verkligen har en

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.

Byggaren bestämmer det från ditt data-tillgångsbesked

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-auktoriserade paket måste fortfarande få det rätt

Om du skriver manifestet själv, förklara exakt en av native_api eller plattform_bridge. Överensstämmelse behandlar plattform_bro som flykt kläckning en bro kontakt förväntas ha, och byggaren vägrar ett specifikt som hävdar plattformen_bro på enAPIAnslutning.

Håll ai_api_reference. md ärlig på något sätt

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.

Lär admin hjärna om din plattform

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

Vad denna plattform är, hur dess data formas, vad dess objekt kallas och de quirks som annars skulle göra assistenten gissning. Skriv den för en kompetent kollega som aldrig har sett plattformen.

ai_api_reference.md

Den uppringbara ytan. För en brokontakt är detta din op och gör ordförråd med sina parametrar, inte ett REST-slutpunktbord.

Budget

Grovt6,000karaktärer hålls per kontakt, och om24,000tecken för hela blocket över alla aktiverade kontakter. Över per-connector cap din fil är truncated; vara kortfattad innan trunkatorn är.

Precision betalar

Dessa filer är skillnaden mellan assistenten med hjälp av dina universella bordsverktyg och svarar från fel avsnitt eftersom ingenting någonsin berättade det dessa verktyg fanns.

💡
Båda filerna måste vara i INSTALLED-paketet, inte bara ditt källträd. De är vanliga paketfiler, så de täcks av signaturen och skickas i ZIP - vilket också innebär att redigera en efter signering bryter tätningen. Re-sign.
Kopplingar

Identitet genom en kontakt: admin, kund, portal

Ett signeringskontrakt tjänar tre ytor. Anslutarens jobb är att vända "vem som är inloggad på plattformen" till ett undertecknat tokenOpsIQkan verifiera, och sedan presentera det verifierade ämnet iOpsIQ"S form. Anslutningen autentiserar aldrig någon - plattformen gör, och signaturen bär det påståendet.

De tre ytorna, en signerare

Admin – din personal, inuti din backend

En administratörsobjekt. Widgeten laddar inuti plattformens administrationspanel och varje medarbetare matchas till sin egenOpsIQagent. Full genomgång på admin widget sida.

Kund - en inloggad kund, i kundchatt

En kundsubjekt. Detta är vad som låter en inloggad kund få sitt konto i stället för en anonym uppslag: varje beställning, fullständig detalj och alla självbetjäningsåtgärder du tillåter.

Portal – en djup länk till supportportalen

Samma påståenden plus jti och single_use, med en120-andra livet, för token reser i ettURLOch måste vara spenderad en gång. Handrulla inte den här: Inställningar, Support Portal bär ett färdigt snippet per språk och plattformen myntar det för dig när kontoområdet körs på denna server.

Payload-kontraktet

Det här är påståendena som verifierarna kontrollerar. Inget här är valfritt, oavsett vilket partiellt exempel någon annanstans kan föreslå.

site_key

Toppnivå. Måste vara lika med webbplatsens nyckel för begäran, eller token vägras.

Iat och Exp

Toppnivå, unix sekunder. exp måste vara i framtiden och efter att ha ätit. En token mer än ungefär en minut i framtiden vägras. Håll livet kort - minuter till timmar.

Autentiserad: sant

Toppnivå, förutom Exp. Din plattforms påstående att en verklig människa är inloggad.

plattform

Toppnivå. En kort släp som namnger ursprunget. Rekommenderas, och det låter en kontaktpersons identitetsleverantör berätta sina egna tokens från en annan plattform.

admin eller kund

Ett objekt som namnger ämnet. Det måste bära ett icke-tomt id, och ett användarnamn eller ett e-postmeddelande - per-admin access gate matcher på dem. Inkludera både när du har båda.

Minting, Verbatim från Botble bron
$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 två verifierarna och de misslyckanden som de orsakar

OpsIQ har två token-verifiers, och de var inte identiska. Att veta detta sparar dig en eftermiddag, eftersom symptomet ser ingenting ut som orsaken.

Admin widgeten har en egen kontrollör

opsiq/embed/admin_ajax.php bär en lokal verifier som accepterar den autentiska flaggan i båda positionerna. Konversationslista, historia och oläs allt går igenom det, så de autentiserar bra.

Den delade kontrollören är strängare

opsiq/includes/customer_identity_token_verify.php sitter bakom chattströmmen och kärnan AJAXAPIDet krävde historiskt flaggan på TOP-nivå.

Symptomen

Historia och samtal fungerar. Varje chatt vänder svar "Admin inloggning krävs". Det läser precis som en session bugg och är inte: token saknas top-nivå flaggan.

Vad nuvarande kärna gör

Det accepterar nu flaggan på toppnivå ELLER inuti ämnet, så kontraktet är enhetligt. Äldre kärnor läser bara den högsta nivån. Begränsa kanoniska formen och ditt paket fungerar på varje release.

Detta är maskinkontrollerat nu. Alla filer i ditt paket som mynt identitetstokens är statiskt skannas mot kontraktet, och en nyttolast plattformen skulle vägra att inte överensstämma med den exakta filen och raden. Kör det själv: php verktyg /verify_identity_contracts. php.

Signerade kunder i kundchatt

Två saker måste vara sant. Core måste stämpla den verifierade kunden, och din kontakt måste presentera det.

1
Din bro eller endpoint mints en kund token

Samma signerare som administratör, med en kundsubjekt. Läs kunden från plattformens egen session. Om din plattform undertecknar kunder på en annan vakt från administer, läs den vakt du vill ha och aldrig falla tillbaka över ämnen - det är så en kund skulle lämnas ett admikret.

2
Kärn verifierar och stämplar det

På en giltig token stämplar kärnan det verifierade ämnet i sessionen. Din leverantör läser en beprövad identitet; den autentiserar aldrig.

3
Din identitetsförmedlare presenterar den

DetectCustomer() returnerarOpsIQFormulär: Det måste genomförasOpsIQ\Platform\IdentityProviderInterface, eller registret tyst hoppar över det - samma fälla som kontextleverantören.

4
Dina kundscoped-åtgärder accepterar en kund_id

Och OpsIQ låser den till verifierad identitet innan utförandet. Modellen kan inte leverera den.

IdentityProvider.php - läs den beprövade identiteten, presentera den iOpsIQ"S Form"
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;
    }
}

Kundscoped action: två lås, båda krävs

Modellen får aldrig välja vars data den läser. OpsIQ genomdriver att på sin sida, och din plattform måste genomdriva det också på andra sidan. Ett lås är en bugg bort från ett läckage; två lås är ett kontrakt.

Lås1 — OpsIQSkriver över identitetsparametrarna

Innan en kund-chat-åtgärd körs, OpsIQ ersätter varje identitetsformad parameter med VERIFIED besökarens identitet: klient_id, klientid, user_id , userid, customer_id och account_id tar det verifierade numeriska id; klientnamngivaren, Customer_identifier, account_idententifiers ta det som en sträng; e-post, customer. email, user@email take the verified email. Vad än den föreslagna modellen är kaserad.

Lock 2 — din plattform omformar varje fråga

Ta id du fick och lägg till den på WHERE klausulen av varje läsning och varje skriv på den ytan. Lita aldrig på referensen i begäran på egen hand. En inloggad kund som frågar om någon annans order måste komma tillbaka tom, inte förbjudet.

Namn på dina parametrar så lås 1 kan hitta dem

Ring det kund_id, inte kusta eller ref. En parameterOpsIQerkänner inte att det är en parameter som den inte kan låsa.

⚠️
Ge den inloggade kunden ytan sin OWN-verksamhet, separerad från administratörerna, även närSQLser likadant ut. Två ytor med olika regler förblir ärliga; en yta med en flagga blir ett läckage dagen någon redigerar fel gren.

Zero page wiring: den anslutna deklarerade sonden

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.

inställningar.json — sonden inställning
{
  "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."
}
Probe kallas av webbläsaren

Samma ursprung, så det kan inte bära en anpassad rubrik. Dess autentisering är plattformen session. Sätt den AHEAD av din bridge-key grind, hålla borta från rekorddata och returnera ingenting alls för en inloggad besökare.

Svarar på en fast form

{"success":true,"authenticated":true,"admin":{...},"identity_token":"..."} — and {"success":false,"authenticated":false,"error":"..."} when nobody is signed in.

Ingen långlivad hemlighet i sidkälla

Endast de undertecknade, som löper ut token.

Fullständiga slutpunktsgenomföranden för Laravel,WordPress, WHMCSSymfoni och vanlig PHP, plus de hårda Laravel-specifikationerna och felsökningsordern, finns på admin widgetsidan. De är samma kod för ett kundämne: ändra vakten du läser och ämnesnyckeln du loggar in.

Kopplingar

Publicering: redigera mappen publicerar inte

Det vanligaste sättet att förlora en eftermiddag är att redigera en kontakt under marketplace_connectors /, installera om den och hitta inget förändrat. Installationer läser inte den mappen. De drar ett signerat ZIP från marknaden katalog. Publicering är sekvensen som sätter dina ändringar i den ZIPP.

Varför redigeringen inte gjorde någonting

marketplace_connectors/<slug>/ is the SOURCE

Det är där du jobbar. Inget installerar från det.

Katalogen har en signerad ZIP

En installera nedladdningar som ZIP, verifierar signaturen och packar upp den. Tills du bygger om ZIPP, håller varje installation att få det gamla paketet.

Connector Builder publicerar någon annanstans

It writes into /connectors/<slug>/ on this install. That is a local connector, not a marketplace release. The two paths do not overlap.

Frigörande sekvens

1
Bumpa versionen i TWO-filer

Inställningar.jsonoch connector_contract.jsonÖverensstämmelse jämför dem och misslyckas om den snigel, versionen eller förmågan som anges oense. Lägg till en CHANGELOG.md-post medan du är där - det är en nödvändig fil.

2
Re-synkronisera bryggsnippet

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
Skriv om varje paket

php verktyg/resign_all_connectors. php — signaturen täcker fil hashes, så ANY redigerar det. Sign sista, efter varje fil är slutgiltig.

4
Exportera signeringsnyckeln, sedan frö

Sedern tecknar varje paket eftersom det bygger ZIP, och det går i ett sammanhang där nyckeln inte kan läsas från inställningar - så det måste komma från miljön.

5
Redeploy bridge-filen, om du skickar en

Ominstallera kontakten uppdaterar paketet. Det rör inte kopian sitter i operatörens brutto. Berätta för dem, panelen och i changelog.

Hela frigörelsen, i ordning
# 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
⚠️
Varför exporten inte är valfri: undertecknaren letar efter nyckeln i OPSIQ_CONNECTOR_SIGNING_KEY först och connector_signing_key inställning andra. Sedern körs på SaaS bootstrap och verktyg / sign_connector.php stövlar ingenting alls, så i båda inställningarna läsare finns inte - utan miljövariabel det finns ingen nyckel, och du får "Ingen signeringsnyckel tillgänglig" eller varje paket som rapporterats asfailed.OpsIQoch kan hitta nyckeln på egen hand.

Vad som faktiskt fartyg

Endast filer som signaturen täcker

ZIP är byggd från undertecknarens egen fillista, så en strayfil som sitter i din paketmapp skickas inte. Det är avsiktligt: en osignerad fil som används för att åka med till kunderna.

Täckta tillägg

php,jsonjs,cssmd, txt,html, sh, svg, png, jpg, jopeg, gif, webp, ico, yml, yaml - återkommande, inklusive bridge / och tester /. signatur.jsonsjälv är utesluten från hasharna och sedan läggs till i ZIP så att installationer kan verifiera.

Allt annat rapporteras som not_packaged

Sedern namnger varje fil som den lämnade kvar. Läs den listan. En fil du förväntas skicka visas det innebär en fel förlängning eller fel plats - inte en tyst framgång.

Redigera alla täckta filen bryter sig om förseglingen

Inklusive en Markdown-fil. Skriv det paketet.

Krävda filer i ett distribuerbart paket

connector.php

Måste returnera ett exempel på ConnectorInterface.

settings.json

Manifest: slug, name, version, manifest_version, kompatibilitet, kapacitet, connector_contract_version och inställningar.

connector_contract.json

Maskinläsbart kontrakt. Dess slam, version och förmåga måste vara identisk med inställningarna.json.

README. md, Developer. mD, Changelog. m

Alla tre kontrolleras för existens och minsta storlek. DEVELOPER. md behöver verkligt innehåll, inte en stub.

En fil per deklarerad kapacitet

Varje kapacitet namn filen den förväntar sig - ContextProvider. php för sammanhang, IdentityProviser. fp för identitet, GuestLookupProvisioner. fap för gäst_lookup och så vidare - om inte kontakten genomför kapacitetsinlinet.

Ingenting som ser ut som en referens

Överensstämmelse skannar de tre Markdown-filerna för hemliga formatvärden och privata nycklar, och misslyckas på en träff.

Kontrollera det innan du skickar den

Den fullständiga överensstämmelse svit är samma en installation körs. Det kontrollerar manifestet mot det kanoniska kontraktet, att runtime och manifest kapaciteten är överens om, att varje deklarerad förmåga har sin fil och dess metoder, identitet-token kontrah i varje gruvfil, bridge-snippet match, gäst-lookup tillåtalist hygien, action unikhet och bekräftelse säkerhet, och paket signatur.

Kör alla fyra innan varje 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
💡
Ett misslyckande förväntas och är inte ett problem: paketsignaturen rapporterar en varning medan du fortfarande redigerar. Det rensar det ögonblick du skriver om. Varje annat fel är en riktig.
Kopplingar

Connector-paket och Lifecycle referens

Detta är källnivåkontraktet för att bygga en kontakt som OpsIQ kan upptäcka, konfigurera, validera, aktivera, genomföra, testa, signera och distribuera.

Utvecklare referens
Connector-paketEtt kontaktpaket har en obligatorisk anslutningsgenomförande och manifest, med valfria åtgärder, recept, kunskaper, tillgångar och signaturmetadata.Connector-paketdeveloperMANIFESTv1LifectycleHanteradArbeteOmfattningLivet Arbetarspace VIEWconnector.phpConnector klass / fabrikKrävssettings.jsonManifest och inställningar schemaKrävsactions.jsonÅtgärdsdefinitionerOptionellsignature.jsonPaket signatur metadataSläpp1DECLAREManifest och kapacitet2IMPLEMENTLivcykel och leverantörer3ValidateTest, sign, paket
Ett kontaktpaket har en obligatorisk anslutningsgenomförande och manifest, med valfria åtgärder, recept, kunskaper, tillgångar och signaturmetadata.

Minimipaket

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

Manifestkontrakt

settings.json Använder manifestversion 1validatorn förväntar sig en snigel, namn, version, manifest_version, kompatibilitet, beskrivning och förmåga. Kompatibiliteten förklarar opsiq_min och opsiq_maxRelease status är en av produktionsproduktion, Beta, Förhandsgranskning eller mall; förmåga mognad använder nivåer L1-L6. Legacy paket kan normaliseras med varningar, men ett nytt paket bör passera utan varningar.

Core connector gränssnitt

  • Identitet och installation: slug(), name(), description(), capabilities(), settingsSchema(), testConnection().
  • Livscykel: onEnable() och onDisable()Inaktivera måste vara icke-destruktiva; data rensning är en separat avsiktlig operation.
  • Inkommande/synkronisering: handleWebhook(), poll(), backfill()Undersökningen hanterar inkrementellt arbete; backfill importhistoria och måste vara säker att upprepa.
  • Stöd: pushReply() där plattformen accepterar svar.
  • Åtgärder: registerActions() Leveranser genomförbara handlingsavtal.
  • Säkerhet: securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

Den abstrakta basen erbjuder också valfria chunked backfill, kundlista, e-konto upptäckt / kreativitet, prenumeranter, admin / skräddarsydda detektering, fakturering / kontext / identitetsleverantörer, svar extraktion, förtrying HTTP samtal, JSON-väg åtkomst, fuzzy ranking och pagination hjälpare.

Förmågor och autentisering

Stödda kapacitetsnamn inkluderar åtgärder, triggers, kontext, identitet, försäljning, fakturering, inbound_ticket, outbound _reply, sync_users, Sync_departments, security_events, Customer_import, Security_native_block, promo_audience, promot_feed, email_mailbox, native _api, ai_brain_aware och ai _tickets. Byggaren tillhandahåller API nyckel, bärare, grundläggande, HMAC,OAuth 2klientuppgifter,OAuth 2auktorisationskod och anpassade autentiseringsmallar.

Registrera livscykel

  1. Upptäckten laddar paketet och validerar dess manifest.
  2. Konfiguration lagras per arbetsyta; hemligheter krypteras.
  3. Anslutningstest bevisar referenser utan att möjliggöra kontakten.
  4. Möjliga samtal onEnable()synkroniserar handlingsdefinitioner och kan starta den ursprungliga backfillen.
  5. Polling/webhook/subscriber utförande bär alltid arbetsyta sammanhang.
  6. Inaktivera samtal onDisable() och stoppar aktiviteten utan att ta bort importerade data.
  7. Purge är en separat explicit operation.

Korrekthetsregler

  • Använd arbetsytan / platsnyckeln i varje läs, skriv, cache key, deduplication nyckel och webhook lookup.
  • Gör backfill, webhook ingestion och skriva handlingar idempotent. Spela in ett externt ID / händelse-ID varhelst plattformen ger en.
  • För fjärrsystem, använd deras API Anta aldrig att deras databastabeller finns i OpsIQ anslutning.
  • Återkomma strukturerade, kundsäkra fel. exponera aldrig hemligheter, råleverantörsspår eller annan arbetsytas existens.
  • Deklarera endast kapacitet som paketet faktiskt genomför. actions.json Katalog gör inte en åtgärd som är användbar förrän kontakten installeras, aktiverad, konfigurerad och dess anslutning är giltig.

Testning och release

Kör PHP-fodral, manifest validering, anslutningstester, handlingschema tester, webhook signatur / replay tester , workpace-isolation tester och backfill-repeat tester avaktiverade-connector tester samt fel/retry tester. Ett marknadspaket bör sedan undertecknas och verifieras, inkluderar installation / behörigheter / vobhook dokumentation och ange dess sanna frisättning status. Anslutningsplattan och manifest är den auktoritativa tillgänglighet signalen.

Kopplingar

Connector recept

Steg-för-steg recept för vanliga kontaktinställningar.

Recept
Connector ReceptEn A Shopify konfigurera recept som en checklista: skapa app, bidragsområden, klistra in token och testa, aktivera webhooks, placera en testorder.Connector ReceptShopify_Recept · Shopify med webhooksSkapa en anpassad app i Shopify adminGrant omfattningar: read_orders, read_customers...Paste Store Domän + Token, Klicka på TestAktivera Webhook sync (orders auto-register)Placera en testorder → visas i Försäljningen i 30s_1STEP BY STEPKopiera-kräm recept2REAL PLATFORMSShopify · WHMCS Stripe · GBP3VERIFYTestorder visas i 30s
Varje recept är en checklista du följer toppen till botten, här Shopify med realtidsorder webhooks, verifierad av en testorder.

Recept: Shopify med realtids webhooks

Scenario:
Mål: Anslut Shopify med automatisk ordersynkronisering och GDPR överensstämmelse.
Vad ska man göra:

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 integration

Scenario:
Mål: Anslut WHMCS Så AI kan leta upp kunder, tjänster, biljetter och fakturor.
Vad ska man göra:

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 betalningar

Scenario:
Mål: Spåra Stripe-betalningar och låt AI titta upp transaktioner.
Vad ska man göra:

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:
Mål: Anslut GBP för granskning förvaltning, inlägg och insikter.
Vad ska man göra:

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.

Kopplingar

Förlänga CRM & Site Intelligence

OpsIQ delsystem är öppna för utvidgning. En kontakt kan ansluta en ny kapacitet till CRM eller Site Intelligence utan ändringar i OpsIQ Kärna, via plattformens kapacitetsregister (\OpsIQ\Platform\CapabilityRegistry) Deklarera förmågan, implementera sin lilla metoduppsättning, skicka kontakten,OpsIQ upptäcker det och trådar in i UI, Kunden 360 tidslinje och installationen av prompts.

Förlängning CRM & SI
PlattformskapacitetEn kontakt på vänster matningskapacitet bussar (CRM, Site Intelligence, Analytics) upptäckt av CapabilityRegistry.PlattformskapacitetWorkPayDin kontaktförklarar förmågaCRM_kalender · berikning · esign · betalningar · brevlådaWebbplats IntelligenceLokala_listing · ran_dataAnalysweb_analytics · Rapportera och intagCapabilityRegistryupptäcker det och trådar UI + tidslinjen1DECLAREFörmågor, inte kärnredigeringar2PLUG INCRM · SI · Analytics bussar3AUTO-WIREDUI, tidslinje, prompts
En kontakt förklarar kapacitet (kalender, berikning, rang data, analys ...) och OpsIQ auto-wires dem i CRM och Site Intelligence, ingen kärna förändringar.

Deklarationsförmåga

Deklarativa (inställningar).json)

Lägg till en <domain>_capabilities array, bäst för no-code / marknadsplatskontakter. domäner: crm, site_intelligence.

I code (connector. php)

Implementering crmCapabilities() / siCapabilities() Återlämna samma deskriptorer.

Deklarera en CRM-kalenderleverantör (inställningar.json)

Scenario:
Mål: Gör en kalenderkontakt visas i CRM Schedule-mötespanelen.
Vad ska man göra:

"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]

Deklarera en webbplats intelligens leverantör (inställningar.json)

Scenario:
Mål: mata lokallistningsdata till Site Intelligence.
Vad ska man göra:

"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]

Kapabilitetsbussar och deras metod yta

crm / kalender

createEvent($settings,$params) → {framgång,event_id,html_link,meet_linK}; listEvents; freeBusyDriven by \OpsIQ CRM\CalendarBridge.

crm / berikning

enrich($settings,$params) → {framgång, drag}. Driven by \OpsIQ\CRM\EnrichmentBridge (även körs automatiskt på företaget skapar när en leverantör är ansluten).

CRM / eSign

sendForSignature($settings,$params) → {success,envelope_id,sign_url}. Driven by \OpsIQ CRM\EsignBridge.

Site_intelligence / lokal_listing

listLocations, listReviews, getInsightsFartyg via Google Business Profile-kontakten.

Site_intelligence / ran_data

keywordRanks($settings,$params) → {framgång,ranks}. Driven by \OpsIQ\SiteIntelligence\RankDataBridge. Ships: SerpApi-kontakt.

Analytics / web_analytics

report($settings,$params) (synkronisering/export) + ingest($settings,$events) (import) Körs av \OpsIQ\Analytics\WebAnaliticsBridge. Fartyg: Google Analytics (GA4) anslutning. Data API För rapporter är mätprotokollet för import. Analytics öppet för kontakter som CRM + Site Intelligence (domän analytics / analytics_capabilities).

betalningar / Pay_provider

listPayments, customerPayments, createPaymentLinkDriven by \OpsIQ\Payments\Bridge. Visa en kunds betalningar på CRM-tidlinjen + skicka en betalningslänk på ett avtal. Fartyg: Stripe Payments-kontakt. Domain payments / payments_capabilities.

e-postlåda / e-mail_sync

listMessages + sendMessageDriven by \OpsIQ\Mailbox \ MailboxBridge. En kunds e-postmeddelanden på Kunden 360 Tidslinje + skicka e-post från en affär. Fartyg: Gmail + Outlook / Microsoft 365 Anslutningar. Domain mailbox / mailbox_capabilities.

Delad OAuth app + ONE omdirigering

Alla Google-kontakter delar en app via \OpsIQ\OAuth SharedGoogleApp. Set google_oauth_client_id/_secret En gång i kalendern, Analytics, Business Profile + Gmail allt arbete (per-connector "(valfritt)" fält är överskridande). De delar också en omdirigering av ONE. URI, <site>/connectors.php?oauth=callback (ingen per-connector slug), eftersom Google inte avslöjar API lägga till omdirigera URI:er i en app; OpsIQ återställer kontakten från den undertecknade OAuth state Registrera den singeln URI En gång varje Google-kontakt (nuvarande + framtida) godkänner ingen ytterligare konsolinställning SharedGoogleApp::resolve(...)’S redirect_uri från din oauthParams(); aldrig hårdkod en per-slug omdirigering. Microsoft-kontakter gör detsamma via \OpsIQ\OAuth SharedMicrosoftApp (SharedMikrosFTApp)microsoft_oauth_*).

Importknappar är kapabilitets-Gated

Den som Importera import (historisk backfill) och Importera kunder knappar visar bara för kontakter som faktiskt implementerar dem, upptäckta av reflektion, så det finns ingen flagga att deklarera. backfill() eller backfillChunk() För att tjäna Import-knappen; överrid listCustomers() (återgå {email, first_name, ...} sidor) för att tjäna Import kunder. Ärva AbstractConnector no-op och knappen är dold, så UI erbjuder aldrig en import som en kontakt inte kan utföra.

AI över bussar

CRM-agenten föreslår och bokar möten av erbjudanden signaler (\OpsIQ\CRM\MeetingProposer → CalendarBridge) och auto-berikar nya konton, "AI driver CRM" loopen, utförs över anslutningsbussar.

Kundchatt biljettuppslag (fetchTicket())

Två nivåer, ingen kärna ändras

När en besökare refererar till ett biljettnummer i kundchatten ("vad är statusen för T-000123?"), OpsIQ löser det i två nivåer. Tier 1_ läser den delade OpsIQ biljettbutiken, varje kontakt med inbound_ticket speglar sina biljetter där, så synkroniserade biljetterna fungerar bara för ALL-kontakter med noll per-connector-kod. Tier 2_ är en levande återgång för OLD-biljetter som aldrig speglades: kärnan kallar ett OPTIONAL fetchTicket() på varje aktiverad kontakt som implementerar den. duck-typed (upptäckt av method_exists()Som likt contextProviders()/audienceCatalog()), så undertecknad ConnectorInterface är orörd och kontakter som inte behöver det (e-post / chatt källor som skapar biljetter inhemskt) helt enkelt utelämna det.

⚠️
Ägarskap är obligatoriskt och din att verkställa. fetchTicket() får den VERIFIerade besökarens identitet $ctx (client_id + client_email, samma verifierade identitet som kundchatten AI använder). Lös plattformskunden från den identiteten och fråga bara att kundens biljetter, sedan omkontrollera äganderätt på detaljposten. Return null på eventuella missar, felmatcher eller fel, aldrig en annan kunds data. null försämras graciöst till "kan inte hitta den biljetten".
connector.php, fetchTicket() kontrakt (referens: kontakter/whmcs och kontakter/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
    }
}

Hur plattformen använder den

Upptäcktsresa

CapabilityRegistry::providers($domain,$type) listar leverantörer med installerad/aktiverad/ready status (filsystembaserad; DB endast för den aktiverade flaggan).

Urval

CapabilityRegistry::active($domain,$type) returnerar den första färdiga leverantören med sin laddade kontakt och inställningar. Bridges kallar detta istället för hårdkodningssniglar.

Meddela-för-installation

Om en funktion behöver en kapacitet som inte är ansluten ännu, visar UI ett one-klick Connect / Install prompt, aldrig en död kontroll.

Den fullständiga guiden

Se här connectors/PLATFORM_CONNECTORS.md (CRM + Site Intelligence) och connectors/CRM_CONNECTORS.md i paketet.

Kopplingar

Kundens självbetjäning uppslag och återbetalningar (bygg din kontakt för kundchatt)

Signerade kunder kan fråga kundchatt AI om deras OWN-konto ("min balans", "mina order", "svarade supporten på min biljett") och, om verksamheten möjliggör det, begära återbetalningar. Allt drivs av din kontaktens deklarationer: nej OpsIQ Kärnförändringar, ingen plattformshårdkodning. AI kallar dina uppslag som inhemska verktyg (det kan inte uppfinna en), identitet är låst server-side till den verifierade kunden och resultaten trimmas automatiskt för AI.

Förklara en kunduppslag

I din actions.jsonEn lättläst åtgärd blir kundanpassad med allt: "scope":"client", "requires_confirmation":false, "is_destructive":falseAnvänd "scope":"both" när samma uppslag också ska vara anropbar av ditt team i Admin AI. Det fullständiga ordförrådet är admin, client, both och system (system når varken AIAPIEndast webhook-rutter). Allt annat avvisas direkt: paketvalidering misslyckas och åtgärden installeras inte. writing omfattning - skrivassistenten serveras admin Åtgärder som är satta.

Identitetsregeln (obligatorisk)

Namnge din identitetsparameter från standarduppsättningen. Låst till det verifierade numeriska id: client_id, clientid, customer_id, user_id, userid, account_idLåst till det id som en sträng: client_identifier, customer_identifier, account_identifierLås till verifierad e-post: email, client_email, customer_email, user_emailOpsIQ låser och automatiskt fyller den från plattformsverifierad inloggad kund; AI ser aldrig eller väljer aldrig identitet. Ett icke-standardnamn misslyckas (förvägrat, läckt).

Vad måste hålla admin-bara

Allt som inte omfattas av denna identitet: fetch-by-bare-id (fetch)order_id/ticket_id ensam), butiksövergripande listor, fritextsökningar. De är tvärkund läckage på någon plattform. Håll dem "scope":"admin".

Resultatformning (svarbärande nycklar)

Uppslagsresultaten trimmas strukturellt innan de når AI: hemliga formade nycklar tappas, långa strängar och listor är kapade, tomma fält beskäras, och en platt karta bredare än nyckelkåpan håller sin svar-bärande nycklar förstpengar (credit, balance, amount, total, due, paidIdentitet ()email, *name, phone, companystat ()status, active, expir*, renew*), datum, plan/produkt/domän/tjänst/prenumeration/order/faktura/biljettfält, valuta, räknas och stats/summary/totalsInnan några återstående platser går till andra nycklar minsta värde först. Praktisk vägledning: namnge dina fält med standard ordförråd och returnera de fält som svarar på kundens fråga snarare än en rå100-key plattform dumpa; ett fält som heter utanför ordförrådet tävlar om de överblivna platserna och kan trimmas från mycket stora nyttolast.

Återbetalningar · vad din kontakt ger

Två råa operationer, politiskt fri: (1) en betalningsverifiering som läsfiltreras av identitet OCH en transaktionsreferens (din API och filtren), t.ex. whmcs_get_transactions; (2en återbetalning utför åtgärder (scope:"admin", requires_confirmation:true, is_destructive:truealdrig kundexponerad), t. ex. whmcs_refund_orderFöretaget väljer båda nycklarna i Inställningar → Kundchatt; OpsIQ omverifierar betalningsserversidan, tillämpar verksamhetens policyruta (belopp cap, åldersfönster, månadsgräns), problem i lådan och filer en granskningsbiljett för allt annat.

No-code byggare

Connector Builders åtgärdsredaktör har samma kontroller: Sätt in "Vem kan använda den" till Signed-in kunder, lämna båda skriva kryssrutor och använd ett standard identitetsparameternamn.

Referensimplementeringar

"Kunde Själv-Tjänsten" poster i connectors/whmcs/actions.json, woocommerce/actions.json, oscommerce/actions.jsonfullt kontrakt i connectors/README.md §8.1–8.2 och ConnectorInterface::registerActions().

Kopplingar

Gästuppslag - låt besökare spåra en bokning, leverans eller beställning utan att logga in (Gest_lookup)

Hotell, kurirer och många handelsplattformar tjänar kunder som har en referens men ingen inloggning: en gäst med bokningsbekräftelse, en mottagare med ett spårningsnummer. guest_lookup Förmåga (Connector Contract, mode: genererad) låter DIN kontakt servera besökarna i kundchatt AI - ingenOpsIQKärnförändringar, ingen plattformshårdkodning. Din kontakt förklarar att WHAT bevisar rättighet och WHICH-fält är synliga;OpsIQgenomdriver strömbrytarna, gasen och den enhetliga förnekar.

Förtroendemodell

Referens + bevis, aldrig identitet

Besökaren levererar rekordreferensen (matchad av den regex du deklarerar) plus beviset du väljer - normalt e-post på posten. Din fetch åtgärd hämtar rektorn SERVER-SIDE med hänvisning; OpsIQ genererade leverantör jämför bevis mot FETCHED rekordet. Besökare ingång är aldrig betrodd, och ingen verifierad identitet skapas: matchen ger besökaren rätt till att en rekordens låtsas fält, inget annat.

Uniform förnekar (ingen uppräkningsorakel)

Inte grundad och bevis-mismatch producerar ett identiskt svar. AI är uttryckligen instruerad att aldrig bekräfta om en referens existerar och aldrig uppfinna rekord detaljer. Försök är räntebegränsade per konversation + IP av kärnan innan din kontakt någonsin rådfrågas.

Dubbel opt-in, båda standard OFF

Ingenting serverar gäster tills verksamheten möjliggör BOTH-brytare: arbetsytan över hela kontrollen i Inställningar→Säkerhet→"Gästa rekorduppslag i klientchatt" (tillståndsgiterad OCH alltid lösenordsbekräftad, även när valfri steg-up är avstängd), och din kontaktens egen guest_lookup_enabled Inställningar växlar. Installera eller aktivera en kontakt ensam öppnar aldrig gästytan.

Den dedikerade gästytan

Den genererade leverantören registrerar sig på guest kontextyta - strukturellt separat från admin och customerBefintliga kontextleverantörer är aldrig konsulterade för anonyma besökare, och gästleverantören är aldrig rådfrågad för inloggade. ctx den tar emot bär chattmeddelandet, tråd-ID och besökarens påstådda (overifierade) pre-chat e-post som beviskandidat - inga identitetsfält.

Deklarera det i byggaren

1
Definiera fetch-åtgärden

På åtgärdssteget lägg till en lättåtkomlig handling som returnerar ett rekord genom sin referens (t. ex. GET /bookings/{booking_number}) och kartlägga sina svarsfält med alias: status, ankomst, avgång, rum_type, kund_email...

2
Tick "Gästa uppslag"

På kapacitetssteget möjliggör guest_lookupEn dedikerad panel visas: välj fetch-åtgärden, namn referensparametern, ge referensmönstret (en regex kropp som \bBK-[0-9]{4,10}\b), namn rekordet ("bokning"), och välj bevis - e-post på posten (rekommenderas) eller ingen (referens ensam, för status-bara kurir spårning).

3
Tillåt synliga fält

Kryssa exakt de fält en gäst kan se. Allt annat är DROPPED - aldrig redigerad. Byggaren vägrar PII-formade fält (email, telefon, adress, betalning ...) i den tillåtna listan och frisläppningsporten svit om kontrollerar samma regel innan publicering, så ett handredigerat specifikation inte smyga en i. Observera att installationstid validering täcker manifestet och signaturen bara, så kör konformanspaket själv innan du skickar. bevisfältet själv kan aldrig visas.

4
Publicera och aktivera

Byggaren avger GuestLookupProvider.php - det kanoniska härdade genomförandet, identiskt för varje genererat paket och tillägger guest_lookup_enabled Växla till din kontakt inställningar. Företaget beväpnar de två switcharna och chatt AI börjar erbjuda uppslag när en besökare frågar om din rekordtyp.

Kontraktsregler

Statusformade fält endast

Tänk "vad skulle en kurirutskrift på den offentliga spårningssidan": status, datum, rum eller servicekategori, räknas. Namn, kontaktuppgifter, gatuadresser, betalningsdata och fritextnoter har ingen plats i en anonym chatt - Byggaren och överensstämmelse båda vägrar dem.

AI svarar bara från blocket

Den genererade leverantören avslutar sin produktion med en instruktion att svara endast från de listade fälten och att erbjuda en biljett för något annat. Detalj inte i den tillåtna listan är "inte tillgänglig i chatt" - genom design.

Uppföljningar fortsätter att arbeta

Leverantören re-derives referensen från besökarens senaste meddelanden i samma konversation, så "och när är utcheckning?" fungerar utan att skriva om referens. Den matchade referens och bevis e-post kommer ihåg på chatttråd som CANDIDATES, så uppföljningar inte fråga. De är kandidater bara: varje tur återföder fortfarande rekord server sidan och jämför bevis innan släppa ett enda fält.

Hand-auktoriserade paket

Ett paket på marknaden kan skicka sina egna GuestLookupProvider.php implementing ContextProviderInterface med surfaces(): ['guest']Följ den genererade mallens kontrakt exakt - hämta med hänvisning, bevis-match server-side, enhetlig förneka, letlista-bara utgången - och förklara guest_lookup in capabilities. Överensstämmelse verifierar gästytan och skannar tillåtna listan för PII.

💡
Gästuppslag är lätta sammanhang för chatten AI. De utför aldrig åtgärder, skapar aldrig identiteter och låser aldrig upp kundens självbetjäningsväg ovan - den vägen kräver fortfarande en plattformsverifierad inloggad kund.
Kopplingar

Främjande publik som riktar sig (promo_audience)

Låt kampanjen Promotion Studio mål av LIVE-klient och fakturering stat från din plattform: "har en obetald faktura", "beställning väntande", "prenumeration inställd". Alla kontakter (förinstallerad, marknadsplats eller en du bygger själv) går med genom att genomföra två små metoder. No OpsIQ kärnändringar, ingen plattformshärdning: din kontakt visas som en plattform i studion Targeting fliken med sin egen nedgång av fakta, och flera kontakter kan aktiveras sida vid sida.

Promo publik
Främjande publik som riktar sigEn verifierad identitet passerade till en kontakt publikFlags samtal producera fakta som driver en målregel, med en misslyckad anteckning.Främjande publik som riktar sigWorkPayInloggadverifierad identitetpublikflags()Din kontaktFAKTAunpaid_invoices = 2RELobetalda_fakturor ≥ 1Kampanj visarMisslyckanden stängd: okänd klient eller något fel → kampanjen är dold.1TWO METHODSpublikkatalog + flaggor2LIVE STATEObetald, väntande, status3FAIL-SAFEVisar aldrig fel person
Din kontakt svarar levande fakturering fakta för den inloggade besökaren; studion mål på dem, och misslyckas stängd så ett faktura erbjudande aldrig når fel person.

Hur det fungerar

1
Förklara dina fakta

Implementera publikCatalog() på din kontaktklass. Det returnerar en etikett och listan över nycklar som din plattform kan svara på. Varje nyckel visas i studions nedgång under ditt plattformsnamn.

2
Svar för en klient

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
Klar

Aktivera anslutningen. Fliken Kampanj för kampanjstudio växer en avsnitt "Klient & fakturering" som listar din plattform; administratörer bygger regler som "opaid_invoices >= 1Varje faktum blir också en personlighetsvariabel som {unpaid_invoices}.

connector. php, det fullständiga promo_audience-kontraktet
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'],
    ];
}

Kontraktsregler

Reklam för kapaciteten

Lägg till 'promo_audience' till din kontakt capabilities() array så plattformen och marknadsplatsen listar den som publik-kompatibel (upptäckten fungerar också från metodnärvaro, men förklarar att det är den rena signalen). connectors/whmcs Anslutning är fullständig referens genomförande.

Nyckelnamn

Lowercase snake_case, 2-60 chars, matchande ^ [a-z0-9_]+$. Typer: nummer, text, bool. Odeklarerade nycklar som returneras av publikFlags() är fortfarande användbara i reglerna, men förklara allt du stöder så administratörer kan se det.

Identitet verifieras

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.

Misslycka stängd · alltid

på något fel (på ett annat sätt)API nedåt, klient som inte hittats, timeout) returnera []. En regel vars fakta saknas gör kampanjen INTE visar. En faktureringsriktad popup får aldrig nå fel person; OpsIQ genomdriver detta även i regelmatcharen.

Prestanda

publikFlags() kallas högst en gång per kontakt per sidvisning, och endast när en publicerad kampanj faktiskt använder din plattforms regler. Anonyma besökare kostar dig noll samtal. 1-2 API samtal; OpsIQ Memoizes inom begäran.

Operatörer som tillhandahålls gratis

Adminer kombinerar dina nycklar med =, !=, >, >=,<, ≤, innehåller, är inställd, är tomt, du bara levererar värden.

Personaliseringstokens

Varje faktum fördubblas som en variabel i kampanjkopian: {unpaid_invoices}, {client_status} plus inbyggda {first_name} och {client_email} Värden är sanerade innan de gör det.

No-code marknadsplatskontakter

Automatiska fakta

Deklarativ (förklaring)JSON-bara) marknadsplatskontakter får promo_audience gratis: om din kontakt förklarar kunder / användare, fakturor, order eller abonnemangsresurser, OpsIQ härleder kund_status, unpaid_invoices, mängd_due, pending_orders, aktiv_subscriptions och prenumeration_statos från dina befintliga sökåtgärder. Ingen kod alls.

Anpassad katalog (inställningar.json)

Lägg till ett publik_capabilities objekt · {"label": "My Platform", "keys": [{"nyckel":"öppen_carts", "label ":"Öppna kundvagnar", "typ": 'nummer']}, för att kontrollera exakt vilka fakta (och etiketter) visas i studio nedgång.

Testa din leverantör

1
Aktivera kontakten

Anslutningar > din kontakt > Aktivera. Öppna sedan kampanjens flik Målning. Din plattform måste visas under "Klient & fakturering (connectors)".

2
Bygg en regel

Lägg till: Din plattform · en nyckel · >= · 1 och ställ in "Logged-in klienter only" Spara och publicera.

3
Verifiera båda riktningarna

Logga in på din plattform som en klient som matchar regeln (popup måste visa) och som en som inte (pOPup måste vara dolda). Logged-out besökare aldrig matcha inloggade regler.

Brand en kampanj från din egen kod (anpassad utlösare)

Varför

Utöver de inbyggda triggersna (fördröjning, rullning, avsikt, tomgång, klicka på sidor-visad, chatt / biljettaktivitet), kan du avfyra en kampanj från var som helst i din webbplats eller kontaktfrontend, efter ett framgångsrikt kassa steg, när en kundvagn överges, när din SPA ändrar rutten etc.

Hur

Ställ in kampanjen utlöser att Anpassad med ett evenemangsnamn (t. ex. checkout_failed), sedan ringa den globala kroken från din sida:

Din webbplats / kontakt 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');
💡
Att ta en händelse går aldrig över mål eller frekvens. Det frigör bara "när". Kampanjen måste fortfarande passera varje regel (geo, publik, samtycke, caps) innan den visar.
Den fullständiga guiden för hur-till-användning (design, block, analys, A/B, publicering) bor i Hjälpcentret under appen Engage → Kampanj StudioKapaciteten här upptäcks automatiskt från någon ENABLED-kontakt i kontakter/eller marketplace_connectors/. Det finns inget att registrera. Skepa de två metoderna, och studion gör resten.
Kopplingar

Undersökningskontaktkapacitet (Contract 2.2)

Den som survey Möjlighet låter alla plattformsleverantörer verifierade kundidentitet adaptrar, publik fakta, säkra variabler och mottagare kandidater till Survey Studio. promo_audience och ger inte en kontakt ägande av undersökningar, svar, analys eller e-post leverans.

💡
Implementeringsstatus. Authoring är komplett och användbar idag: Connector Contract 2.2, SurveyConnectorInterfaceDen dedikerade panelen Builder, som genereras SurveyProvider.phppaketmetadata och överensstämmelse isolering allt fartyg. Konsumtion är ännu inte trådbunden: SurveyConnectorRegistry är implementerad och testad, men ingen undersökning runtime kallar det ännu, så leverantör hälsa inte uppytas i admin UI och ingen publicerad kontaktpaket förklarar förmågan. Signed-token Survey Identity Gateway emission, inriktning och variabel integration, CRM Outreach materialisering och de första skeppade leverantör kartläggningar förbli separata faser. Byggd mot detta avtal nu; förväntar sig att drifttiden för att börja konsumera den i en senare release.

Leverantörsansvar

Audience katalog och fakta

Deklarera typade kanoniska fakta och lösa värden endast för en serververifierad, arbetsyta-bundna ämne. Typiska fakta inkluderar order_count, Last_order_status, cancelled_ordER_cont, customer_created_at, aktiv_subscription_copt, past_due_invoice_cound och open_ticket_coon.

Variabel katalog och värden

Deklarera kund, konto, order, prenumeration och supportvariabler med typ, känslighet och tillåtet sammanhang. Undersökningskopia kräver återfall och utgångskontext flyr.

Recipient Paging

Alternativt räkna kandidater för CRM Outreach med stabila externa ID, bundna sidor, deterministiska kursorer och samtycke-relaterade metadata. Undersökningen fryser den valda publiken innan någon skickar.

Identitet

Acceptera identitet endast från Survey Identity Gateway efter token signatur, utgång, syfte, kontakt och verifiering av arbetsutrymmet. Webbläsare-levererad e-post, ID, taggar eller faktureringsfakta är aldrig auktoritativa.

Runtime hälsa

SurveyConnectorRegistry är utformad för att rapportera kompatibla, blockerade och otillgängliga leverantörer utan att avslöja inställningar, vägar, råa identiteter eller undantagsmeddelanden, och en blockerad leverantör kan aldrig åberopas. Rapporteringsytan är ännu inte exponerad i admin UI: idag är en blockad leverantör helt enkelt inert.

Fail-closed regler

Odeklarerade nycklar, fel typer, överdimensionerade värden, föremål för missmatchningar, anslutningstider och okända identiteter avvisas. En målregel som behöver ett otillgängligt faktum matchar inte. Mottagaresidor är kapade och granskade. Känsliga värden visas aldrig i offentlig förhandsvisning eller loggar.

Builder release grind

Kontrakt 2.2 skickar kapacitetsregistret ingång, gränssnitt, Survey kartläggning panel, genererad SurveyProvider.php, kapabilitetsversion, README/developer referens och överensstämmelse fixturer. Commerce, helpdesk, SaaS bridge och lokala PHP-profiler inkluderar det; Standard API kontakter väljer in. Den statiska porten avvisar en Survey-leverantör som kallar ett Kampanjnamn, tabell eller kapacitet.

💡
Kopiera från Kampanj är endast import: Byggaren kan översätta kompatibla kampanjkartläggningar en gång, spara en fullständig undersökning ägd kopiering och rekordprovenans. Ta bort eller ändra Kampatering får inte ändra Survey beteende.
Kopplingar

Svara på feedbackkapacitet (Contract 2.2)

Den som reply_feedback förmåga speglar en plattforms egna per-reply betyg i OpsIQ En stjärna en kund ger en personal svar inuti WHMCS"S klientområde landar på SAME svaret i OpsIQ admin tråd, med samma chip, agent kredit, Feedback sida inträde och Team & Performance beräkning som ett betyg ges på en OpsIQ portalbiljett. En förvaring, ett chip, en pipeline; kontakten översätts endast.

Den enda skrivvägen

Det finns exakt två ingångsvägar och en sanning. OpsIQ portalbiljetter skriver infödd. Plattform biljetter flyter genom kontakten, och kärnområdena landar varje händelse via ReplyFeedback::recordMirrored(): samma kolumner, personal-bara regel, en-rating-per-reply senaste-vins semantik, arbetsyta stämpel och Voice of Customer indexering portalen skriva använder. En kontakt skriver aldrig återkoppling rader själv.

Överensstämmelse (fyra filer, sedan återsignera)

1
connector_contract.json

Lägg till kapaciteten.reply_feedback-inmatningen: version 1.0, ReplyFeedbackConnectorInterface, metoder replyFesbackCatalog och pullReplyFedback, innebär inbound_ticket.

2
settings.json

Lägg till reply_feedback i listan för kapacitet. Detta är vad kontaktupptäckten läser.

3
spec.json

Declare reply_feedback. modes (poll och/eller webhook) och plattformens betygsskala. Detta är vad överensstämmelse grinden läser.

4
Runtime klass

Implementera gränssnittet, lista reply_feedback i kapacitet(), sedan skriva om paketet.

Leverantörsansvar

Katalog

Deklarationslägen, plattformens egen betygsskala (kärnan normaliserar till den infödda 1-5), och eventuella reaktionstokens. Katalogen måste komma överens med spec.json.

Pull översättning

pullReplyFeedback returnerar kanoniska händelser: plattformsbiljett id, plattform svarar id-, betyg, valfri reaktion / kommentar, lämnade in tid och en stabil händelse_id. Det läser och översätter aldrig.

Idempotens

Event_id är stabil per feedback STATE, så en återspelad händelse är ett no-op och en ändrad rating överskrivning (senaste vinster, som portalen).

Cursor Disciplin

Sidor är bundna och deterministiska; en markör som inte går framåt slutar löpningen. Historisk backfill dräneras som ett rullande fönster, aldrig en jätte dragning.

Probe säkerhet

Utan konfiguration, returnera en tom fullständig sida istället för att kasta. Överensstämmelse löpare sondar med tomma argument.

Felstängd upplösning

Kärnan löser varje händelse till ett lokalt svar av spegeln markören biljettspegel redan stämplar (<slug>:<ticket>:reply:<reply>) En händelse som inte kan lösas tappas, aldrig gissade; feedback bara fäster på personalens svar; och agentkredit kommer alltid från svarets befintliga författare. Betyget skriver aldrig ändrar författarskap. Det är därför förmågan kräver inbound_ticket eller ticket_mirror.

Arbetat exempel: WHMCS_

WHMCS lagrar kund-område per-reply stjärnbetyg i tblticketreplies.rating. . Den WHMCS Anslutning förklarar opinionsläge med en 1-5 skala, fartyg en ticket_reply_ratings reläkommandot i sin bridgefil och översätter varje rad till en händelse vars id-spelar whmcs:<ticket>:reply:<reply> markörer sin biljettspegel redan stämplar. Efter uppgradering av kontakten kopierar du bronfilen till WHMCS -servern så att det nya kommandot finns där.

💡
Fullständigt utvecklarkontrakt med gränssnittet, evenemangsformerna, normaliseringsreglerna och kontrolllistan för överensstämmelse: doc/contracts/TICKET_REPLY_FEEDBACK_CAPABILITY.md i den OpsIQ paket. Godkännande: betygsätta ett svar inuti plattformen, vänta på den timliga omröstningen och samma svar i OpsIQ Visar chip, Feedback-sidan listar den och en omspelad händelse ändras ingenting.
Kopplingar

Biljettfusionskapacitet (Contract 2.4)

Den som ticket_merge Förmåga gör en biljett sammanslagning i OpsIQ en sammanslagningen på varje ansluten biljettplattform. Den bevarade plattformsbiljetten tar emot de sammanslagna biljetternas meddelanden, med början med varje sammanslagen automats öppningsmeddelande istället för den sammanslagda plattformslott som bara stängs.

Varför det existerar

En sammansmältning OpsIQ flyttar varje meddelande om de sammanslagna biljetterna till den bevarade biljetten och tar bort de sammanfogade betalningarna. Innan avtalet 2.4 En kontakt som bara hörs ticket.deleted för varje sammanslagen biljett. WHMCS Stängt den biljetten och hållningen WHMCS biljetten fick aldrig vad kunden först skrev: ämnet visade [MERGED] och innehållet saknades.

Vad kärnan sänder

Biljett. merged (en gång per sammanslagning)

ticket_id, ticket_number, ämne och external_ref av KEPT-biljetten; native_table (opsiq_tickets); site_key; källor, de sammanslagna biljetterna äldsta först, var och en med ticket_id, ticket_numberämne, external_ref, client_name, client_email, created_at och budskapen [reply_id, author_type, author_name, created_at, kropp}]; merged_by; merged_atMeddelanden är den kundsynliga konversation, fångad före flytten. Interna anteckningar ingår aldrig.

Biljett. debiterad (per fusionerade biljett)

Fortfarande bränder, nu med merged_into {ticket_id, ticket_number, external_refCore levererar inte den till en kontakt som förklarar ticket_mergeandra konsumenter kan berätta en sammanslagning från ett rad.

Utgående webhookar

biljett.merged är en leveransbar händelse. En SaaS webhook endpoint prenumererad på ticket.deleted får också biljetten.mergad, så en integration byggd innan 2.4 hör samman,

Vad din kontakt gör

Förklara

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.

Sammanslagning infödd när du kan

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.

Annars lägga till en privat anteckning

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.

Rapportera vad som inte gick samman

Return {ok, läge, sammanslagen, noterade, unmerged, error}. Varje sammanslagna kopia kan du inte slå ihop går i oförändrad och kärnan tillämpar din normala radering (nära eller ta bort med mirror_deletes) till exakt de. Return mode utan stöds endast när plattformen har ingen sammanslagning och ingen privat anteckning. En transport eller auth misslyckande är ok=falskt med anledningen; det spelas in i Diagnostics.

Hedra dina växlar

Samma spegelinställningar som gate din andra biljett spegling port sammanslagningar.

Sammanslagningar som börjar på din plattform

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.

Fraktade implementeringar

WHMCS_

MergeTicket (ticketid = hållen biljett, mergeticketids = sammanslagna biljetter) när båda är i WHMCS; AddTicketNote med utskriften annars. Reläets TicketMerge krok sammanfogar OpsIQ Kopior när personalen går samman WHMCS.

Zendesk_

POST /api/v2/tickets/{id}/merge.json med privata sammanslagningar (upp till fem biljetter per samtal), plus utskriften som en privat kommentar på den bevarade biljetten, eftersom Zendesk stänger ihop biljetter utan att flytta sina kommentarer.

OpsIQ SaaS bridge

POST /v1/tickets/{id}/merge med source_ids, som flyttar portalen svar och bilagor; ett internt svar bär utskriften för biljetter som aldrig var på portal /manage sammanfogar sammansmälter OpsIQ kopior.

Connector Builder

ticket_merge är härledd, aldrig kryssad: ett genererat paket förklarar det när den länkar plattformen biljett som den skapar (en mottagare.skapad abonnent med länkbiljett på), hanterar biljett.rade eller deklarerar ticket_mirrorPå biljetterna steg, under MergesVälj plattformens sammanslagning åtgärder (karta sammanfogas.target_remote_idoch smälta samman.source_remote_ids eller smälta samman.source_remote_id) och en privat anteckningsåtgärd (karta notera.remote_id och note.body) Den genererade mergeTickets () använder båda. Med varken, varnar Builder att en sammanslagen biljett meddelanden inte kommer att nå plattformen.

💡
Fullständigt kontrakt: doc/contracts/CONNECTOR_CONTRACT.md, avsnitt Ticket sammanfogar. Acceptans: slå samman två biljetter i OpsIQ att båda existerar på plattformen, öppna sedan den bevarade biljetten på en plattform. Den sammanslagna biljettens första meddelande finns där.
Kopplingar

Connector Marketplace

Marknadsplatsen låter dig upptäcka, installera och publicera kontakter byggda av samhället.

Marknadsplats
Connector MarketplaceEtt sökbart rutnät av gemenskapskontaktkort med kategorier, installera knappar och stjärnbetyg.Connector MarketplaceWorkPaySöka kontakter...KalendlySchemaläggningInstallera★ 4.8HubSpotCRM_Installera★ 4.6MailchimpE-postInstallera★ 4.7QuickBooksRedovisningInstallera★ 4.5Twilio_SMSInstallera★ 4.9BegreppDokumentInstallera★ 4.41DISCOVERGemensamma kontakter2INSTALLEtt klick3PUBLISHSign & skicka in din
Bläddra i gemenskapskontakter, installera på ett klick eller signera och publicera dina egna förinstallerade och marknadsplatsnivåer både sökbara.

Hitta och installera kontakter

1
Bläddra

Gå till Connectors > Marknadsplats. Sök efter namn, kategori eller plattform.

2
Granska

Kontrollera beskrivningen, stödda åtgärder och betyg.

3
Installera

Klicka på Installera. Anslutningspaketet laddar ner och installerar till marketplace_connectors/.

4
Konfigurera

Möjliggöra det i Connectors, ange API referenser och test.

Publicera en kontakt

1
Bygga och testa

Använd Connector Builder. Verifiera alla åtgärder fungerar.

2
Paketpaket

Generera profil.json Åtgärder.json kunskap.json och PHP-filer.

3
Signal

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
Submited

Ladda upp genom marknadsplatsens inlämningsflöde för granskning.

Två kontakter

Anslutningar/- Vad som faktiskt körs

Roten för runtime-upptäckten. Everything here is live: the connectors that ship withOpsIQAllt installerat från marknaden, och allt som Connector Builder publicerar på denna installation.

marketplace_connectors/- där förpackningar är auktoriserade

Publiceringen SOURCE för förstapartsmarknadspaket. Det är inte en upptäckt rot: ingenting här bor tills det är packat, undertecknat, utsäde i katalogen och installerat, vid vilken tidpunkt ett exemplar landar i kontakter /.

💡
Titta på båda ställena. Ett paket som du har skrivit under marketplace_connectors/ är inte kopian som körs – installera kopior den i kontakter/, och endast den kopieringen upptäcks vid drifttid.StripeBigCommerce, Magento2PrestaShop, OpenCart, Amazon SES, Postmark och Resend är alla marknadspaket: installera en innan du förväntar dig att hitta den i Connectors.
Utvecklare

API och webhook builder

Den är API Webhook Builder låter dig skapa anpassad API endpoints och webhook lyssnare inuti OpsIQ utan att skriva rå PHP.

API byggare
API och webhook builderEn byggare som väljer en triggertyp (inkommande webhook, schema, händelse, manual) som matar in i en konfigurerbar åtgärd.API & webhook builderWorkPayTriggerInkommande webhookSchemalägg (cron)OpsIQ EventManuellÅtgärderKarta inkommande fält →Skapa biljett/meddelande/samtal API_Spara endpoint1TrigersWebhook · schema · händelse · manuell2NO RAW PHPByggd i UI3ÅtgärderKartfält, kör sedan
Bygga slutpunkter utan rå PHP: välj en trigger (inkommande webhook, schema, händelse eller manual), sedan kartlägga fält till en åtgärd.

Utlösare

Händelse

Kör när något händer i OpsIQ, eller när ett externt system skickar en matchande händelse till din webhook URL Typ händelsenamnet, till exempel biljett.created.

Schemalägga

Använd en av de inbyggda intervall händelser som händelsenamn: cron. minutely, cron tim eller crondaily. The Actions and Triggers screen has knapps for these, så du behöver inte komma ihåg dem.

Fras

Kör när en admin frågar AI för det på vanligt språk. Lägg till frasen som ska matcha, till exempel hitta kund.

Inkommande webhook

Ett externt system skickar en HTTP-POST till din OpsIQ Webhook URL Med ett evenemangsnamn. Alla utlösare som lyssnar på den händelsen bränder.

Kör det ibland: villkor

En händelseutlösare kan bära villkor, så det körs bara när inkommande data matchar. Utan förhållanden den löper varje gång händelsen bränder.

Fält

En väg in i händelsedata. Använd en prick för nästlade värden, till exempel kund. email.

Matcha alla eller någon

Välj om varje regel måste matcha, eller bara en av dem.

Texttester

är lika med, är inte lika, innehåller, innehålle inte, börjar på, är en av, är ej en av.

Antal tester

större än, åtminstone mindre än, på de flesta. Antal skrivna som text jämför fortfarande korrekt.

Närvaro tester

är närvarande, saknas, är tomt, inte tom.

Endast sida på samtalsingenjören för brådskande biljetter

Scenario:
Eventbiljett. created, med en regel: prioritet är lika brådskande.
Vad ska man göra:

Åtgärden körs för brådskande biljetter och hoppas över allt annat. Ingen filtrering behövs i slutet.

💡
Om du lämnar reglerna tomma triggern körs på varje matchande händelse, vilket är samma beteende som före villkoren fanns.

Åtgärder

Skicka webhook

Skicka HTTP POST till en extern URL med en anpassad nyttolast.

Skapa biljett

Skapa en supportbiljett med specificerad avdelning, ämne och meddelande.

Skicka e-post

Skicka ett e-postmeddelande med en anpassad mall.

Uppdatera rekord

Uppdatera en kund, biljett eller CRM-post.

Kör anslutningsåtgärd

Utför en registrerad åtgärd från en aktiverad kontakt med dess anslutningstillstånd och bekräftelseregler.

Kör OpsIQ General general API åtgärder handling

Sök den fullständiga namngivna General API katalogen. Fält, omfattningar, behörigheter, bekräftelse, idempotens och torrt stöd kommer från live-åtgärden; arbetsflödet utförs inom dess sparade arbetsyta och administratör sammanhang.

Skicka leverantörsinbyggd API begäran

Använd en kontakt Native API Läs eller bekräftad infödd API Skriv åtgärder när leverantörens slutpunkt inte har någon curated åtgärd. Krediter kvar i kontakten och endast relativa leverantörsvägar accepteras.

Byggaren Actions & Triggers, /api/v1.php, OpenAPI och Postman använder samma ActionContractRegistry, så en valbar åtgärd kan inte driva från runtime-dokumentation.
Utvecklare

Triggers Cookbook

Redo att använda trigger-action recept för vanliga automationer.

Hur det fungerar
Triggers CookbookEtt receptflöde: en uptime. down webhook passerar ett produktionsfilter, sedan fans ut för att skapa en brådskande biljett och meddela Slack.uptime.downÖvervaka webhookOm prodfilterSkapa brådskande biljettMeddela Slack #ops
Triggers Cookbook

Biljett från övervakning

Scenario:
Övervakningssystem skickar POST när servern går ner.
Vad ska man göra:

Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket · Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent

Slack notification på stora order

Scenario:
Slack meddelande varje gång en kund lägger en beställning över $100.
Vad ska man göra:

Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details

Veckovis smält e-post

Scenario:
Sammanfattningsvis e-post till hantering varje måndag klockan 9.
Vad ska man göra:

Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API

Escalate stale biljetter

Scenario:
Om en biljett inte har något svar på 24 timmar, tilldela lagledare.
Vad ska man göra:

Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note

Utvecklare

Bygga din första åtgärd

Detta genomgång skapar en enkel kontaktaktion från början.

Bygga åtgärder
Bygga en åtgärdEtt handlingsdefinitionsformulär: name lookup_order, en GET-begäran /orders/{id} En typad id parameter, och en passerande 200 test.Nya åtgärderWorkPayNya åtgärderNamnnamnlookup_orderBegäranGET/orders/{id}ParamId · Sträng200 · Order som hittats1DEFINENamn, metod, endpoint2PARAMSTyperade ingångar3TestLive 200 resultat
Bygg en åtgärd från början. Namnge den, sätt metoden och slutpunkten, deklarera skrivna params och testa den till en levande 200.

Två typer av åtgärder

Innan du börjar, bestämma vilken du behöver. Båda är konfigurerade på samma skärm.

Ring en extern API

Åtgärden skickar en HTTP-begäran till din plattform. Välj detta när OpsIQ behöver nå ut och göra något på din sida.

Kör en kontaktåtgärd

Åtgärden kör något en installerad kontakt redan ger. Välj det här när arbetet är redan tillgängligt och du bara vill utlösa den. Du väljer anslutningsåtgärdet från en lista, så det finns inget att tråda upp.

Det andra alternativet är hur du återanvänder allt som dina kontakter redan kan göra utan att bygga något av det igen: läs en biljett tråd, leta upp en kund, importera kontakter och så vidare. Välj anslutningsåtgärden från nedgången och du är klar.
1
Planera åtgärden

Exempel: "lookup_product". Leta upp en produkt efter namn, returpris, aktie och beskrivning.

2
Definiera i handlingar.json_

Lägg till handlingsdefinitionen:

json — den verkliga manifestformen
{
  "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" }
      ]
    }
  ]
}
⚠️
Tre saker som gör en åtgärd misslyckas med att registrera sig alls. action_id är REQUIRED och måste2att100tecken på nedre bokstäver, siffror och understrykningar - en post utan en avvisas direkt. manifestet är ett objekt med en "åtgärd" LIST, inte en karta som anges genom åtgärdsnamn. Och responskartläggningen är "återvänder" med DOTTED-vägar (data.id), inte JSONPath ($.data.ID) - det finns ingen "response_mapping", "metod", "endpoint" eller "params" nyckel någonstans i registret.
3
Test med torrt kör

I Connector Builders Review steg, tryck Dry run. Det kör hela överensstämmelse checklista mot ditt paket och när du har levererat referenser gör en verklig anslutningstest. Det använder inte provdata.

4
Verifiera AI-användning

Fråga admin AI: "Se upp produkt Widget Pro." AI bör hitta och utföra åtgärden.

⚠️
Lägga till en åtgärd i handlingar.jsonSkapa INTE en AJAX-rutt, så det finns inget att regenerera. Connector-åtgärder synkroniseras tillOpsIQNär kontakten är aktiverad eller dess inställningar sparas: återspara kontakten och den nya åtgärden visas. verktyg /gen_route_registry.php täcker admin AJAX-avsändningen och har ingen betydelse för anslutningsåtgärder.
Utvecklare

Inkommande slutpunkter

Inkommande slutpunkter accepterar signerade JSON från ett annat system och förvandla det till deduplicerad kontaktaktivitet som kan mata tidslinjer, poäng och arbetsflöden.

Produktskärm
Inkommande endpointsVarje inkommande källa har sin egen URL Hemlighet, kartläggning och nyligen genomförda aktivitetsresultat.Inkommande endpointsWorkPaySOURCES5ACCEPTED12.4kREJECTED18Livet Arbetarspace VIEWBilling plattformPrenumerationshändelserHälsosamProdukt appsignup och användning händelserHälsosamHändelse-IDprovider_event_idAvdubbleraSignaturX-OpsIQ-Inbound-SignatureHMAC_1CREATE SOURCEURL och hemlighet2MAP PAYLOADE-post, event och ID3VERIFYHMAC intar sedan
Varje inkommande källa har sin egen URL Hemlighet, kartläggning och nyligen genomförda aktivitetsresultat.

Skapa en källa per sändningssystem. OpsIQ genererar en URL/token och hemlighet. JSON med Content-Type: application/json och underteckna den exakta råkroppen med HMAC-SHA256:

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

Karta JSON -vägar för kontakt e-post, händelsenamn och valfritt evenemang ID. Eventuellt ID är den föredragna dedupliceringsnyckeln. Godtagen aktivitet går in i kontakttidslinjen och kan påverka ledscore, segment, livscykelregler och arbetsflöden.

Avvisa ogiltiga signaturer innan du parsar företagsdata. Rotera en hemlighet genom att uppdatera båda sidor i ett kontrollerat fönster; logga inte hemligheten.

Utvecklare

Outbound webhook operationer

Outbound webhook administration skapar signerade prenumerationer, tester slutpunkter och övervakar asynkron leverans och retry hälsa.

Produktskärm
Utgående webhookarDen utgående webhook sidan listar HTTPS-endpoints, evenemangsabonnemang, leveranshälsa och ett enklick signerat test.Utgående webhookarWorkPayENDPOINTS7SUCCESS99.2%Retrera4Livet Arbetarspace VIEWCRM spegelkontakt.* och deal.*HälsosamStöd bussBiljett.* och chat.*HälsosamDatalager*Försöker igenTest leveransSignerat prov payloadRedo1SUBSCRIBEHTTPS URL och händelser2AUTHENTICATEHMAC signatur3OBSERVELeverans järnväg och retries
Den utgående webhook sidan listar HTTPS-endpoints, evenemangsabonnemang, leveranshälsa och ett enklick signerat test.

Fullständiga administratörer skapar en HTTPS-slutpunkt, väljer specifika händelser eller wildcard, lagrar hemligheten säkert och skickar ett test. OpsIQ tecknar den råa nyttolast med HMAC-SHA256:

X-OpsIQ-Signature: sha256=<hex hmac>

Kontrollera signaturen innan deserialisera eller agera. Leverans är asynkron och hämtas automatiskt efter ungefär 1Minut, 5 minuter, 30 minuter,2timmar och 12 timmarAnvänd den senaste leveransen järnväg för att inspektera status, svarskod och försök räkna.

Din mottagare måste vara obetydlig eftersom alla asynkrona system kan lösas om. returnera ett 2xx-respons först efter hållbar acceptans.

Utvecklare

Webhooks

Webhooks låter externa system meddela OpsIQ När något händer (inkommande) och låt OpsIQ anmäla externa system när något händer internt (utomhus).

Webhooks
Utgående webhookarDen utgående webhooks-skärmen: en slutpunktstabell med namn, prenumererade händelser, senaste leveransstatuspunkterna och en Send-test knapp.Utgående webhookarWorkPaySlutpunkterSpara endpointNamnHÄNDELSERDelierSlack #sales-alerts - Företagstjänsthttps://hooks.slack.com/…crm.deal.won, orderTesta testtestCRM spegelhttps://api.acme.com/hookKontakt.*, biljett. createdTesta testtestZapierhttps://hooks.zapier.com/…chat.startedTesta testtest1ENDPOINTSNamn, händelser URL2SIGNEDHMAC + automatiskt försök igen3SEND TESTVerifiera leveranser
Den verkliga utgående-webhooks skärmen: varje slutpunkt med sina händelser, senaste leverans hälsa och ett enklick Skicka test, undertecknat och hämtade.

Utgående webhookar

Prenumeration

Gå till Inställningar > Webhooks. Lägg till en slutpunkt URL och välja evenemang att ta emot.

Evenemang

Prenumerera på specifika händelser, eller ["*"] för allt. Den fullständiga listan för din installation är nedan, och webhooks.events.list returnerar den somJSON.

Försök igen

Misslyckade leveranser retry med exponentiell backoff. Efter 15 följdfel är slutpunkten automatisk inaktiverad.

Signering

Varje leverans är signerad. X-OpsIQ-Signature carries v2=<hex>och den undertecknade strängen är version.timestamp.delivery_id.body - inte kroppen ensam. Kontrollera alltid, och bygg alltid om strängen exakt. Se exemplen nedan.

SSRF-skydd

OpsIQ Skicka inte till privat/intern IPs (127.x, 10.x, 172.16.x, 192.168.x, 169.254.169.254).

Async leverans

Webhooks levereras via jobbköen, inte blockering OpsIQ drift.

Stabilt evenemang ID

Varje händelse har en unik händelse_id som håller sig densamma över retries för deduplicering.

Vad som kommer med varje leverans

X-OpsIQ-Event

Evenemangsnamnet, till exempel ticket.created.

X-OpsIQ-Delivery

Leveransen id. Det är samma över retries - använd den för att ignorera en dubblett.

X-OpsIQ-Timestamp

Unix sekunder vid signering tid. Avvisa något äldre än cirka fem minuter.

X-OpsIQ-Signature

signaturen som v2=<hex>Split på =Den vänstra sidan är versionen, den högra sidan är det värde du jämför.

X-OpsIQ-Signature-Version

Systemet i bruk, för närvarande v2Läs den från rubriken snarare än hårdkodning, och din kod fortsätter att fungera om en v3 någonsin läggs till.

⚠️
Den signerade strängen är version.timestamp.delivery_id.body, inte den råa kroppen på egen hand. Att bara hacka kroppen är den enskilt vanligaste orsaken till att en verifiering misslyckas - varje genuin leverans blir avvisad och slutpunkten ser trasig ut.

Verifiera en leverans

PHP · verifiera en 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 · verifiera en 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 });
});

Varje händelse som denna installation kan skicka

Genererad från körbyggnaden, så det matchar alltid den version du är på.

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 returnerar samma lista somJSONDin kod behöver aldrig koda den.

Analytics (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.

Handels (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.

Kontakta kontakt (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- post (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.

Betalning (3)

payment.completed

Fired when a payment succeeds. Payload: order_id (required), payment_id, provider_ref, customer_id, customer_email, amount, amount_minor, currency, gateway, invoice_id, items, paid_at.

payment.failed

Fired when a payment attempt fails. Payload: order_id, customer_id, customer_email, amount, currency, gateway, reason.

payment.refunded

Fired when a refund is issued. Payload: order_id, refund_id, customer_id, customer_email, amount, currency, reason.

Säkerhetssäkerhet (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.

Biljettbiljett (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.

Hur testar jag webhooks lokalt?+

Använd ngrok för att exponera din lokala server. Ställ in webhook endpoint till din ngrook URL.

Tänk om min slutpunkt är tillfälligt nere?+

OpsIQ Retries med exponentiell backoff. Om din slutpunkt återhämtar sig inom retry-fönstret går inga händelser förlorade.

Utvecklare

API-nycklar

API Nycklarna autentiserar förfrågningar till OpsIQ REST API Varje nyckel har räckvidd behörigheter.

API-nycklar
API-nycklarNycklarna API _: en problempanel med åtkomstnivå och omfattningschips, bredvid en lista över befintliga maskerade nycklar med återkallande knappar.API-nycklarWorkPayProblem en nyckelTillgångLäs endastBegränsadTillämpningsområdencontacts.readtickets.readevents.writeProblem nyckelDina nycklarIntegration med Zapieropq_••••4f2aÅterkallaMobilapp appopq_••••91c7ÅterkallaExportera till Analyticsopq_••••2db0Återkalla1SCOPEDLäs-bara eller begränsade2PER-ACTIONVälj exakta omfattningar3REVOCABLERotera när som helst
Den verkliga knappen API _: utfärda en omfångad, lättläst eller begränsad nyckel genom att välja exakta räckvidd och återkalla någon nyckel när som helst.

Skapa en API nyckel

1
Gå till Inställningar > API Nycklar

Navigera till API nyckelhantering.

2
Klicka på Skapa nyckel

Ge det ett beskrivande namn.

3
Välj omfattningar

Ge nyckeln bara vad den behöver. Scopes kommer i läs- och skrivpar per område, så en rapporteringsintegration kan beviljas läsning och inget annat.

Tillgängliga omfattningar

Välj den smalaste uppsättningen som gör jobbet. admin uppfyller alla nedanstående omfattningar, så använd det endast när du verkligen behöver bred tillgång.

crm. read / crmi. write

Kontakter, företag, erbjudanden, aktiviteter, segment, uppsökande, omvandlingar, livscykel och CRM-webbhooks.

Biljetter. read / tickets. write

Lista och läsa biljetter och deras meddelanden; svara, uppdatera, öppna och köra bulk kö operationer.

samtal. read / konversationer. write

Läs live-chat konversationer och meddelandehistorik; skicka meddelanden, tilldela och ändra status.

kb. read / kb

Kunskap basposter.

chat. read / chat . write

Sparad svar mallar.

connectors.read

Se vilka kontakter som är installerade, vad de kan göra och testa deras referenser.

automations.read

Se dina handlingar, triggers och deras löpande historia.

departments.read

Institutioner tillgängliga för routing.

notifications.read

Meddelanden för en namngiven operatör.

analytics.read

Rapportera avsnitt, CSV export och schemalagda rapportdefinitioner.

site_intelligence.read

Övervakade webbplatser och deras SEO-rapporter.

files.read

Signerade nedladdningslänkar för bilagor.

status.write

Status sidokomponenter och incidenter.

skriva

AI skriver hjälpare: utkast, sammanfatta, översätta, skriva om, komponera, analysera.

Admin

Allt, inklusive ett litet antal känsliga åtgärder som avsiktligt inte kan nås genom något smalt omfattning: radera en kontakt, ändra sekretessinställningar och läsa åtkomstloggen.

💡
Ring meta. actions med din nyckel för att se exakt vilka åtgärder som den kan köra på din installation. Det är alltid mer tillförlitligt än att arbeta från en lista.

Tillgångsnivåer

Alla

Nyckeln kan kalla allt dess omfattningar tillåter.

Läs endast

Varje skrivande vägras, oavsett omfattningarna säger. Det säkraste valet för rapportering, instrumentpaneler och allt som aldrig ska ändra data.

Begränsad

Du listar de exakta åtgärderna som nyckeln kan ringa. Allt annat vägras, även inom ett tillåtet utrymme.

4
Kopiera nyckeln

Visas en gång. Börjar med "opq_". Förvara det säkert.

🚫
Aldrig dela API Nycklar i offentlig kod, klient-side JavaScript, eller versionskontroll. Använd miljövariabler
Utvecklare

Anslut din webbplats

Den är OpsIQ widget är en JavaScript Snippet du lägger till på din webbplats för spårning, AI-chatt, biljettskapande och kundidentifiering.

Hur det fungerar
Anslut din webbplatsEn one-line script tag till vänster och till höger en webbsida med OpsIQ chattbubbla som förekommer i hörnet.<!-- paste before </body> --><script src="https://cdn.opsiq.io/w.js" data-site="ws_8a2f" async></script>
Anslut din webbplats

Grundläggande installation

Grundläggande widget snippet
<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.

Konfigurationsattribut

data-site-key

Krävs. Din webbplatsnyckel från Connected Sites.

data-mode

Valfritt. "chat" (standard), "biljetter", eller "både".

data-position

Valfritt. "bottom-right" (standard) eller "bottenvänster".

data-color

Valfritt. Primär färghex kod.

data-greeting

Valfritt. Initial greeting message.

data-language

Optional. UI språk: "en", "es", "fr", "de", "pt", "ar" etc.

data-identity-token

Optional. Server-genererad signerad identitetstoken.

SPA stöd

Manuell SPA-vägspårning
// 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-regler

CSP regler för widget
script-src 'self' https://your-opsiq-domain.com;
connect-src 'self' https://your-opsiq-domain.com;
frame-src https://your-opsiq-domain.com;
Saknar widgeten min hemsida?+

Nej. Under 15 KB gzipped, laddar asynkroniserat efter sidinnehåll.

Kan jag anpassa utseendet?+

Använd datafärg för primär färg. Kontaktstöd för CSS Överskridande alternativ.

Utvecklare

Widget installera recept

Plattformsspecifika installationsguider.

Hur det fungerar
Widget installera receptPlattform installera kort för WordPress, Shopify och Google Tag Manager Var och en säger var man ska lägga till widgeten.WPWordPressInstallera plugin, angeDin webbplatsnyckel, spara.Shop shoppaShopify_Klistra in snippet iTema. flytande före /body._GTMTagghanterare för WordPressAnpassad HTML tag, alla sidor.
Installera recept

WordPress

Scenario:
Lägg till alla sidor på en WordPress -webbplats.
Vad ska man göra:

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:
Lägg till i ditt Shopify butik.
Vad ska man göra:

Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.

Reagera / Next. js

Scenario:
Lägg till en Reagera eller Next. js app.
Vad ska man göra:

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:
Lägg till i ditt WHMCS kundområde.
Vad ska man göra:

Inställning > Allmänna inställningar > Andra > Global Footer Content. Klistra på snippet. Eller redigera din mallfotboll. tpl.

Google Tag Manager_

Scenario:
Lägg till via GTM.
Vad ska man göra:

Skapa anpassad HTML tag, klistra in snippet. Trigger: All Pages. Publicera.

Utvecklare

Admin widget i din backend (ett kontrakt, någon plattform)

Inbädda för OpsIQ admin assistent - administer chatt, biljett inkorg och AI Writing - inom din OWN-plattforms ad ministratör panel, så ditt team lämnar aldrig sina verktyg SSO Detta är ett generiskt kontrakt som genomförs i ~15 rader av din plattforms serverkod - samma mönster Zendesk, Intercom och Discourse användning för SSO Det finns ingen per-platform plugin att vänta på: någon stack som kan beräkna en HMAC Kan göra detta idag.

Steg 1 — den inbäddade linjen

Från Fjärrplatser→Din webbplats→Kodernakopiera loader-linjen och lägga till den i din admin panelens sidor (footer inkluderar, layout mall eller en administer endast anpassad-JS-box):

En-line bäddat
<script async src="https://YOUR-OPSIQ/opsiq/embed/admin_widget.php?site_key=SITE_KEY&identity_token=TOKEN_FROM_STEP_2"></script>

Steg steg2- berättaOpsIQsom är inloggad (server-signerad)

Endast din ansökan vet vilken administratör som är inloggad - det är inte en brist, det är säkerhetsmodellen. Din server genererar ett kortlivat signerat token från din egen session, precis som besökaridentitetstoken, undertecknad med samma webbplats hemlig:

PHP · signera admin-identiteten från din session
<?php
$secret  = "opsiq_whsec_your_site_secret";   // Remote Sites → Codes
$payload = json_encode([
    "site_key"      => "SITE_KEY",
    "iat"           => time(),
    "exp"           => time() + 6 * 3600,
    "authenticated" => true,          // REQUIRED, top level — see note below
    "platform"      => "your-platform",
    "admin"    => [
        "id"            => (string)$admin->id,      // from YOUR session
        "name"          => $admin->name,
        "username"      => $admin->username,
        "email"         => $admin->email,
        "role"          => $admin->role,
        "authenticated" => true,
    ],
]);
$payload64 = rtrim(strtr(base64_encode($payload), "+/", "-_"), "=");
$identityToken = $payload64 . "." . hash_hmac("sha256", $payload64, $secret);
// Put $identityToken into the embed line (identity_token=…), or expose it as
// window.OpsIQAdminIdentityToken before the loader script.
Per-admin åtkomst, automatiskt

Varje administratör som loggar in på din plattform matchas individuellt:OpsIQs per-admin access gate löser tokens användarnamn + e-post mot enOpsIQagent (Team sida; använd agentens "match e-post" lista när plattformsmail skiljer sig) och tillämpar THAT agentens arbetsyta, avdelning och inkorgbehörigheter. Ny personalmedlem = lägga till agenten iOpsIQInga bädda förändringar.

Roles ride längs

Oavsett vilken roll sträng din plattform skickar visas påOpsIQsida för attribution; auktorisation kommer alltid frånOpsIQagentrekord, aldrig från den påstådda rollen.

Varför inte läsa vår inloggningscookie?

Webbläsare skickar aldrig din admin cookie till ett annat ursprung - ingen leverantör kan "bara upptäcka" ditt inloggningsdomän. Varje seriös produkt löser på samma sätt: din server vouches, signerad. Det är hela kontraktet.

Inget delat läge på din egen webbplats

Av värden OpsIQ finns det ingen osignerad eller delad login-läge: lastaren förblir dold tills en signerad administratör token anländer. Token=... värdet i kodlastaren är en widgetnyckel som bara identifierar webbplatsen; den kan aldrig underteckna någon i.

Den som authenticated flagga – sätt den på TOP-nivå

Denna flagga är din servers påstående att en människa verkligen är inloggad, ochOpsIQvägrar någon token utan den. "authenticated" => true beside site_key/iat/expInte bara inuti admin Objekt. AktuelltOpsIQaccepterar det i båda positionerna, men äldre releaser läser bara toppnivån - och misslyckandet är bedrägligt: konversationslista, historia och oläs alla autentisera bra medan varje chatt vänder svar "Admin inloggning krävs", som ser ut som en session bugg och inte. Om du ser exakt den splittringen, kontrollera denna flagga först.

Token hygien

Logga in på servern bara, aldrig i webbläsarenJavaScriptHåll dig kort (minuter till timmar);OpsIQavvisar utgångna och framtida daterade tokens, och signaturen binder token till din webbplatsnyckel.

Referensimplementeringar

Den ärWHMCSmodulen gör detta automatiskt frånWHMCSadmin session; Botble Hotel-kontaktens bryggfil gör det från Laravel-sessionen (op=admin_identity). Båda är bara detta kontrakt i sin plattforms dialekt - kopia som läser närmast din stack.

Zero page wiring (connector-declared probe)

När din OpsIQ -kontakt lagrar din identitets endpoint i sin admin_identity_probe_url Inställning, PLAIN-laddaren är alla dina admin sidor behöver: widgeten upptäcker sonden från kontakten, kallar den med din webbplatsnyckel + widge token och autentiserar varje administer automatiskt. Sidan kan fortfarande åsidosätta sig med en admiär. data-identity-endpoint attribut eller window.OpsIQAdminIdentityEndpoint.

💡
Den signerande hemligheten är fylld för dig. I fjärrwebbplatser, din webbplats, koder, alternativ 3, Sign i din personal, innehåller varje exempel redan denna webbplats egen hemlighet, så koden fungerar som klistrad: det finns inget att kopiera eller konfigurera. Exemplen på den här sidan visar opsiq_whsec_YOUR_SITE_SECRET I sin plats. Varje exempel letar efter OPSIQ_SITE_SECRET (eller ramens egen inställning, namngiven i sina anteckningar) på servern först och använder det när den är inställd, så att du kan flytta hemligheten ur filen när du vill, till exempel för att rotera den utan redigering kod. Hur som helst filen körs på din server bara: aldrig klistra in den i en webbsida eller webbläsare JavaScript, och aldrig begå det till ett offentligt förvar, eftersom alla som håller hemligheten kan logga in som någon av dina kunder eller personal. WHMCS och Botble behöver inget av detta: WHMCS kroken kommer med hemligheten fylld i, och Botble Anslutningspanelen fyller den i bron.

Komplett kod, plattform genom plattform

Varje exempel skriver ut Admin Chat-taggen endast för en inloggad personalmedlem, med den signerade token tillagd och svarar på widgetens uppfriskningar (?opsiq_identity_refresh=1&role=admin) med {"success":true,"identity_token":"…"} eller 401Fjärrplatser, din webbplats, koder, alternativ 3Logga in på din personal skriver samma kod med din webbplatsnyckel och hemlighet fylld i.

⚠️
Admintoken är tvådelad form: base64url (payload), en prick, sedan hex HMAC-SHA256 av den bas64url texten. Det är inte en JWT, och en JVT vägras. Admin objekt behöver id och e-post, och exp måste vara inom 24 timmar.

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>`)
}

Genomföra identitets endpoint på Laravel (hårda anteckningar)

Om din plattform är Laravel (Botble, Bagisto, anpassade appar) och din slutpunkt är en fristående fil som startar ramen för att läsa inloggad admin, kommer tre detaljer spara timmar - var och en producerade ett verkligt produktionsfel innan det lärdes:

Bind the request för bootstrap

Dina tjänsteleverantörer kan lösa request från behållaren under starten. Laravels egen livscykel binder den infångade begäran först inombords Kernel::handle() spegel den ordern: $app->instance('request', Request::capture()) Före $kernel->bootstrap()eller du får "Target class [förfrågan] existerar inte".

session-cookie prefixet är HMAC-Keyed

Modern Laravel prefixar cookie-värden med en HMAC dator med APP KEY (App KEJ)CookieValuePrefix) - en vanlig sha1(name."v2") Kan aldrig matcha det. Strip med CookieValuePrefix::validate($name, $decrypted, $keys), med en strukturell nedgång (40 hex chars + | på position40) Berätta: ett sessions-ID längre än40chars (eller)81= prefix fortfarande fäst) och en session som laddas med endast _token i den.

Där inloggningen lever

Auth stämpel är login_<guard>_<sha1(guard class)> för standard webbskydd: 'login_web_' . sha1(Illuminate\Auth\SessionGuard::class)Skanna någon login_* Numerisk nyckel som en återgång för anpassade vakter.

Debug som bron gör

Fartyg ett debug=1 läge som namnger den misslyckade STEP och undantag - en blind fångst gjorde en levande utplacering odiagnoserbar. Botble bridge (från v1.0.7) är referensen: stegmarkörer vid kärna/bind/bootstrap/decrypt/session/auth/db.

Laravel · fullständig identitets endpoint (kopia, ställa in de två konstanterna), gjort)
<?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]);
}

Samma slutpunkt på andra staplar

Endast "vem är inloggad?" linjeändringar - signeringsblocket är identiskt överallt. Sign på servern, aldrig iJavaScript.

WordPress · WHMCSSymfoni - vanlig PHP - byta uppslag, hålla undertecknaren
<?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]);

När det inte fungerar - diagnostisera i denna ordning

Widget dyker aldrig upp, säger konsolen "Tecknat admin identitetstoken krävs"

Din slutpunkt återvände inte identity_tokenÖppna endpoint URL direkt i den inloggade admin webbläsaren med &debug=1 - du kommer att se det misslyckande steget. På Laravel är detta nästan alltid begäran-bindande eller cookie-prefix objekt ovan.

Historia och samtal fungerar, men varje chatt vänder säger "Admin inloggning krävs"

Den klassiska splittringen. Din token saknas TOP-LEVEL authenticated flagga - widgetens egen slutpunkt accepterar token, den delade verifiern bakom chattströmmen vägrar det. "authenticated" => true beside exp.

"Admin inte bestäms iOpsIQ" (HTTP401)

Token verifierad, men dess användarnamn + e-post matcha ingen OpsIQ agent. Lägg till agenten i OpsIQ → Team, eller lägg till plattformen e-post till den agentens match-emails lista när det skiljer sig från deras OpsIQ e-post.

Allt 403s från webbläsaren men fungerar med curl

En CORS preflight avvisar en av dina förfrågan rubriker. Din slutpunkt måste svara OPTIONS och echo det begärda ursprunget, eller helt enkelt undvika anpassade rubriker - widgeten behöver bara cookien.

Arbetade igår, misslyckas idag

Kontrollera exp: tokens är kortlivade av design. Widgeten åter-prober automatiskt, så det betyder vanligtvis att slutpunkten slutade se sessionen - en app nyckel rotation, en session-driver förändring eller en cookie-domänändring.

💡
Admin widget gör dold tills identiteten löser, och varje chatt / inbox / data samtal är verkställd server sida mot matchadeOpsIQagent oavsett vad sidan hävdar. Token låser upp UI; behörigheter kommer alltid frånOpsIQ.
Utvecklare

Besökare identitet

Identitet kopplar anonyma besökare till kända kunder. När identifierad länkar OpsIQ surfhistorik, chatt och biljetter till kundprofilen.

Hur det fungerar
Besökare identitetEtt flöde: en användare loggar in på din webbplats, du utfärdar ett signerat identitetstoken och OpsIQ enar sina sessioner, chattar och biljetter till en profil.Användarloggar inpå din webbplatsSignerad tokenId-token (HMAC)En profilsessions+ chattar+ biljetter
Besökare identitet

Två nivåer av identitet, och när var och en är tillräckligt

Nivå 1 — en osignerad antydan

Du berättar widgeten som besökaren är med en vanlig JavaScript Objekt. Det fyller e-post och kundid på besökarens logga, så din instrumentpanel visar inloggad trafik och sessioner går upp. Det är en HINT: vem som helst kan redigera den i sin webbläsare, så OpsIQ Aldrig släpper kontodata på styrkan av det.

Nivå 2 — ett signerat identitetstoken

Din server undertecknar en kortlivad token med webbplatsen webhook hemlighet.OpsIQverifierar signaturen och behandlar först då personen som en beprövad kund. Detta är den nivå som låser upp kontosvar i kundchatt och kontaktuppslag. Använd det för något som en främling inte får se.

⚠️
Nivå1är en display bekvämlighet. nivå2Om en fråga bara kan besvaras för den verkliga kontoinnehavaren, behöver du Nivå2.
💡
Du behöver inte skriva nivå 2 För hand: Remote Sites → Din webbplats → Koderna → C. Signed-in kunder genererar signeringskoden och den uppdaterade hanteraren för PHP, WordPressLaravel, Node.jsPython, Django, .NET, Rails, Java och Go WHMCS hook och the Botble Anslutningsbron undertecknar redan kunder. Identitet säger vem kunden är; deras beställningar eller bokningar nå chatten genom en kontakt (med en brofil endast när plattformen inte har någon API).

Nivå 1 — den osignerade ledtråden

Ställ in objektet för widget script, eller ring identifiera() senare när din app vet vem som är undertecknad i. Båda formerna läses; Använd vilken som passar din sida.

JavaScript · de två stödda formerna
<!-- 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.

Nivå 2 — det serversignerade identitetstoken

Exakt samma tokenkontrakt som admin widget, med en customer Ämne istället för ett admin Skriv på den på din server och skicka den till widgeten. Två detaljer bestämmer om det verifierar, och båda är lätta att få fel:

Den är HMAC täcker BASE64URL-strängen, inteJSON

Signal $payload64Inte, inte $payloadSignering av råa JSON producerar en token som ser rätt ut och förkastas varje gång med en signaturmatch.

Bas64url, oöverträffad

Översättning +/ till -_ och strippa = padding. Plain bas64 händer att överleva idag; base64url är kontraktet och är vad varje OpsIQ verifier och referenskontakt avger.

Autentiserad går på TOP-nivå

Förutom site_key, iat och expDet är ditt påstående att en verklig människa är inloggad, ochOpsIQvägrar token utan den.

Kund. id är obligatoriskt

En token som endast bär ett e-postmeddelande verifieras som en signatur och sedan tyst tappas. Skicka alltid ett id.

Håll exp short

Minuter till timmar. Token är ett sessionsförsäkran, inte en referens för att lagra.

PHP - signera en kundidentitetstoken (detta exakta kodverifierar)
<?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>';
🚫
Logga in på servern bara. En token minted i webbläsarenJavaScriptinnebär att skicka webbplatsen hemlighet till varje besökare, vilket händer alla möjligheten att imitera någon kund.

Samma kontrakt, tre ytor

Kundchatt på din webbplats

Kunden, passerat som identity_token widget.php. Täckt ovan. Valfritt: med snippet A och en kontakt chatten redan verifierar kunderna själv (en bokning eller ordernummer med bevis, eller en e-postad kod före en beställning). Remote Sites, Codes, C genererar koden för automatisk erkännande av kunder som redan är inloggade på din webbplats.

Admin chat inuti din backend

admin ämne, passerat tillopsiq/embed/admin_widget.php. Samma signer, olika ämnesnyckel. Se "Admin widget i din backend".

Stöd portal djupa länkar

En striktare variant: samma påståenden plus jti och single_use:true, och en120-andra livet, för token reser i ettURLOch måste vara utgiftsbar en gång. Handrullera inte det. Inställningar, Support Portal har ett färdigt snippet för ditt språk och plattformen myntar den för dig när ditt kontoområde körs på denna server.

Tänk om en besökare rensar cookies?+

De blir anonyma tills de identifieras igen. OpsIQ länkar det nya anonyma rekordet till kundprofilen när en ledtråd eller ett token anländer.

Varför verifierar mitt token för besökarens logga men inte för kontofrågor?+

Det är nivån1/ nivå2En osignerad ledtråd fyller besökarloggen och inget annat. Kontosvar behöver en verifierad signatur.

Utvecklare

Portal sign-in: kod för varje plattform

Skicka en kund som redan är inloggad på din ansökan direkt till din supportportal, signerad, utan andra lösenord. Denna sida förklarar hur handoff fungerar, varje krav i token, installationen och en komplett rutt för varje plattform. Inställningar, Support Portal skriver samma kod med din egen portal adress och arbetsyta nyckel fylld i.

Hur det fungerar

1
Kunden klickar på Support i din app

Länken pekar på en liten rutt på din server, till exempel /support-portal. Aldrig på en länk som redan innehåller ett token: en symbol i en sida läcker genom sidkälla, webbläsarhistorik och Refererensrubrik.

2
Rutten kontrollerar vem som är inloggad

Det läser kunden från din egen session. En besökare som inte är inloggad skickas till din inloggning först och kommer tillbaka till rutten efteråt.

3
Rutten tecknar en engångstoken

En standard HS256 JWT signerad med denna arbetsytas signingshemlighet, som bara din server håller. Det går ut efter 120 sekunder och kan användas en gång.

4
Rutten omdirigerar till portalen

Till portalsidan kom kunden från när portalen bad om en (opsiq_portal_return, accepteras endast i din portal adress), annars portalen hem. Svaret bär Referrer-Policy: no-referrer och Cache-Control: ingen butik.

5
Portalen verifierar och undertecknar kunden i

Signaturen, arbetsytangenten, utgången och engångs-id kontrolleras. Kunden hittas eller skapas via e-post och deras befintliga förfrågningar matchas till dem.

Token, påstående av fordran

site_key

Din arbetsyta nyckel. En token gjord för en annan arbetsplats vägras även när den är undertecknad korrekt.

Iat / Exp

Utfärdas och utgår på några sekunder. portalen token liv 120 sekunder: det måste bara överleva en omdirigering.

Autentiserad: sant

Din app uttalande att det verkligen undertecknade denna person i. Krävs, på toppnivå.

jti + single_use: sant

En slumpmässig id och engångsflaggan. Samma länk kan inte användas två gånger.

plattform

En gratis etikett för var kunden kom ifrån (php, wordpress, whmcsVisas i kundens profil.

Customer. id och customer. email

Båda krävs. Id är din apps egen kundid; e-posten är hur portalen hittar kunden och matchar deras önskemål.

kund. name / external_id

Valfritt displaynamn och id OpsIQ butiker mot din plattform.

Inställningar

1
Kopiera rutten

Inställningar, Support Portal, Sömlös inloggning från din app. Välj vad din app körs på; koden nedanför listan har din portal adress och arbetsyta nyckel fylld i, med numrerade anteckningar för den plattformen.

2
Hemligheten är redan i koden

Den kopierade rutten innehåller denna arbetsytas signing hemlighet, så det fungerar som klistrat. För att hålla den ur filen, ställa in OPSIQ_SITE_SECRET (eller ramens inställning) på servern istället: det värdet används först. Lägg aldrig rutten i en sida, JavaScriptEn mobilapp eller ett offentligt förvar: alla som håller hemligheten kan logga in som någon kund.

3
Länka din supportknapp till rutten

Till exempel https://your-app.com/support-portal.

4
Gör portalens tecken i knappen använda din app

Portal Studio, Sign-in sida, Använd min webbplats inloggning, Din inloggningssida URL: Ställ in den på samma väg. Portalen lägger till opsiq_portal_return i sig själv och rutten ger kunden tillbaka till den sidan, inloggad.

5
Valfritt: signera ut överallt

Inställningar, Support Portal, Logga ut överallt: appens sign-out URL, så att underteckna ut ur portalen också tecknar kunden ur din app.

6
Testa testtest

Skapa en signerad testlänk på samma inställningar sida för att kontrollera portalsidan ensam, öppna sedan din rutt medan du är inloggad i appen.

WHMCS behöver ingen kod: WHMCS Krok från Remote Sites signerar redan klienter i portalen och tar dem tillbaka till den sida de var på.
💡
Den signerande hemligheten är fylld för dig. I Inställningar, Support Portal, Sömlös inloggning från din app innehåller varje exempel redan denna webbplats egen hemlighet, så koden fungerar som klistrad: det finns inget att kopiera eller konfigurera. Exemplen på den här sidan visar opsiq_whsec_YOUR_SITE_SECRET I sin plats. Varje exempel letar efter OPSIQ_SITE_SECRET (eller ramens egen inställning, namngiven i sina anteckningar) på servern först och använder det när den är inställd, så att du kan flytta hemligheten ur filen när du vill, till exempel för att rotera den utan redigering kod. Hur som helst filen körs på din server bara: aldrig klistra in den i en webbsida eller webbläsare JavaScript, och aldrig begå det till ett offentligt förvar, eftersom alla som håller hemligheten kan logga in som någon av dina kunder eller personal. WHMCS och Botble behöver inget av detta: WHMCS kroken kommer med hemligheten fylld i, och Botble Anslutningspanelen fyller den i bron.

Komplett vägar, plattform genom plattform

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)
}

När något är fel

Portalen öppnar, men signerade ut

Hemligheten eller arbetsytangenten matchar inte denna arbetsyta, token är äldre än 120 sekunder (kontrollera serverklockan), eller samma länk öppnades två gånger. Generera en signerad testlänk: om det fungerar, jämföra tokens påståenden med exemplet.

Det landar alltid på portalen hem

Returadressen var inte inuti din portal adress, så det ignorerades avsiktligt. Jämför den med Portalen URL visas i Inställningar.

Gästerna får ett fel istället för din inloggning

Ersätt /login i rutten med din riktiga inloggningssida, och se till att din inloggning återvänder till den adress som den gavs.

Det fungerar för vissa kunder bara

Customer. email eller customer. id är tomt för dem. Båda krävs.

Utvecklare

Kundchatt: Känn igen inloggade kunder

Valfritt. De flesta webbplatser behöver inte detta: med den enkla chatt-nippet och en kontakt, verifierar chatten kunderna själv, med en bokning eller ordernummer plus bevis för uppslag och en e-postkod före en beställning. Lägg till det här när du vill ha en kund som redan är inloggad på din webbplats erkänd automatiskt, med hela kontot. WHMCS gör det redan genom sin krok. Fjärrplatser, din webbplats, Koder, C skriver samma kod med din webbplats nyckel fylld i.

Hur det fungerar

1
Din sida skriver ut chatten taggen

För en inloggad kund widgeten URL Bilder &identity_token=... signerad på din server; för en gäst är det den vanliga taggen. Ingenting hemlighet finns på sidan: bara ett tecken som löper ut.

2
Chatten verifierar token

Signatur, arbetsyta nyckel och utgång. Kunden är sedan känd på varje chattförfrågan, och din kontakt kan svara om sina egna beställningar, bokningar eller fakturor.

3
Chatten ryggar innan timmen är uppe

Den kallar den sida som den är på med?opsiq_identity_refresh=1&role=customer. Din kod svarar { "framgång": santidentity_token”... medan kunden är inloggad, eller 401 med "framgång": falskt,login_required":sann" när de inte är det. Det är därför som den uppfriskande handtagaren måste köra innan din sida skriver ut något.

Hur det skiljer sig från portalen token

Livstid

En timme (exp = iat + 3600) I stället för 120 sekunder, eftersom det rider varje chattförfrågan istället för en omdirigering.

Inget jti eller single_use

Samma token används för varje meddelande tills uppdateringen ersätter den.

Samma allt annat

site_key, iat, exp, autentiserad: sant, plattform och kund med en obligatorisk id och e-post. Samma hemlighet, samma signatur.

💡
Identitet säger WHO kunden är. Deras beställningar, bokningar eller fakturor når chatten genom en kontakt: en som kallar din plattforms APIeller när din plattform inte har någon APIEn anslutning plus dess bryggfil (kontaktbyggaren gör en).
💡
Den signerande hemligheten är fylld för dig. I fjärrwebbplatser, din webbplats, koder, C, innehåller varje exempel redan denna webbplats egen hemlighet, så koden fungerar som tidigare: det finns inget att kopiera eller konfigurera. Exemplen på den här sidan visar opsiq_whsec_YOUR_SITE_SECRET I sin plats. Varje exempel letar efter OPSIQ_SITE_SECRET (eller ramens egen inställning, namngiven i sina anteckningar) på servern först och använder det när den är inställd, så att du kan flytta hemligheten ur filen när du vill, till exempel för att rotera den utan redigering kod. Hur som helst filen körs på din server bara: aldrig klistra in den i en webbsida eller webbläsare JavaScript, och aldrig begå det till ett offentligt förvar, eftersom alla som håller hemligheten kan logga in som någon av dina kunder eller personal. WHMCS och Botble behöver inget av detta: WHMCS kroken kommer med hemligheten fylld i, och Botble Anslutningspanelen fyller den i bron.

Komplett kod, plattform genom plattform

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>`)
}

När något är fel

Chatten behandlar en inloggad kund som gäst

taggen trycktes utan identity_token (Hemligheten saknas på servern, så koden stängdes), eller tokens arbetsyta nyckel eller hemlighet inte matchar.

Erkänd först, sedan en gäst efter ungefär en timme

Den uppdaterade handtagaren är inte nådd: den måste köras före någon utgång, på varje sida chatten visas på.

Den vanliga chatten visar två gånger

Ta bort den vanliga chatt-taggen från din mall: denna kod skriver ut chatten själv.

Utvecklare

Plugins och SDKs

OpsIQ Förser SDK paket och plugins för gemensamma plattformar.

Hur det fungerar
Plugins och SDKsFyra paket: PHP SDK Node.js SDK, WordPress plugin och WHMCS modul, var och en med sitt installationskommando.PHPPHP SDK_Kompositör kräver opsiq/sdkJSNode. js SDK_npm i @opsiq/sdkWPWordPress pluginOne-click installera & anslutaWHWHMCS _-modulenAddon för fakturering + biljettrelä
Plugins & SDK:er
PHP SDK_

Kompositörpaket: identitetstokengenerering, action API hjälpare, webhook signaturverifiering.

JavaScript SDK

Webbläsare sida: spårning, identitet, anpassade händelser, chattkontroll.

WordPress plugin

Widget injektion, identitet från WP användarsessioner, WooCommerce synkronisera.

WHMCS _-modulen

Full integration: widget, biljettrelä, identitet, admin AI.

Shopify tema förlängning

App inbäddad med automatisk kundidentitet.

PHP SDK Snabbstart

PHP SDK -exempel
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);
Utvecklare

Undersökning API Händelser och connector-free automation

Survey Studio är utformad för att använda samma typerade general API interna exekutör, evenemangsbuss och webhook verksamhet som resten av OpsIQ Detta gör att utvecklare integrerar slut utan att bygga en förpackad kontakt.

⚠️
Implementeringsstatus: Livekatalogen avslöjar för närvarande endast platform.get.survey.config och platform.save.survey.config. Den surveys.* och feedback.* familjer nedan är det godkända målkontraktet och måste returnera unknown_action till registrerad.

Måla actionfamiljer

Typer, mallar och snabb lansering

surveys.types.*, surveys.templates.* och surveys.quick_launch.* lista, förhandsgranska, omedelbara och validera fullständiga startare.

Undersökningar och versioner

surveys.create|get|list|update|archive|duplicate plus oföränderlig version, validering och publiceringsåtgärder.

Utplaceringar och inriktning

surveys.deployments.*, surveys.links.*, surveys.audiences.*, surveys.triggers.* och surveys.variables.*.

Outreach och svar

surveys.invitations.*, surveys.campaigns.*, surveys.recipients.*, surveys.responses.*export, bortredigering och analys.

Webhooks, import och feedback

surveys.webhooks.*, surveys.imports.*, feedback.items.*, feedback.analytics.*, feedback.sources.* och feedback.analysis.*.

Connector-fritt flöde

1
Skapa och publicera genom General API

Använd typade undersökningar.* åtgärder med en arbetsyta-finns nyckel. Writes förklarar tillstånd, risk, bekräftelse, idempotens och torrt beteende.

2
Få ditt affärsevenemang

Skicka en signerad händelse till en inkommande webhook, till exempel en orderavbokning eller avslutad ombordstigning. Replay skydd deduplicerar händelse ID.

3
Karta över det i Aktiviteter & Triggers

Välj en OpsIQ General general API Åtgärder som att utfärda en undersökning inbjudan eller förbereda en kampanj, sedan kartlägga fält från den verifierade trigger nyttolast.

4
Prenumerera på Survey Evenemang

Leverera den dokumenterade affärssäkra undersökningen.* livscykelsubset till din slutpunkt med signatur, filter, retry, logga och auktoriserad replay.

Canonical Event mål

Den delade katalogen kommer att täcka Survey / distribution publicera stat, publik och utlösa beslut, inbjudningar, render / starta / partiell / återuppta / komplett / överge, svarsredigering, kampanjtillstånd och leveransfel. Hög volym fokus, bläddra och fråga tids vistelse i Surveyn Analytics lagring om inte uttryckligen dokumenterad för fan-out.

En kontakt är valfri. Det lägger till återanvändbar plattform upptäckt, verifierad identitet, fakta, variabler och mottagare uppräkning. API plus Aktiviteter & Triggers/webhooks är fortfarande den kompletta integrationsvägen för utvecklare som inte behöver en paketerad kontakt.
Utvecklare

REST API_

Den är OpsIQ REST API låter dig programmeratiskt komma åt alla plattformsfunktioner.

Hur det fungerar
REST API_En terminal som visar en POST till OpsIQ API med en Bearer-nyckel, listning av öppna biljetter och sidan JSON svar.$ 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_

Begär format

Skicka nyckeln som Authorization: Bearer opq_... eller X-OpsIQ-Key: opq_...Använd en autentiseringsrubrik, inte båda.

API begära format
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"
}

Vanliga handlingar

API är åtgärdsbaserad: skicka en action Namn i kroppen. Varje registrerad administratör JSON har en stabil namngiven åtgärd. {"action":"meta.actions"} (ingen nyckel krävs) för den auktoritativa, per-install listan, begära kontrakt, riskmetadata och omfattning. platform.routes.* bron är endast för äldre integrationer.

crm.contacts.list

Lista CRM kontakter (scope crm. read). Params: q, status, källa, tag, bly poäng, gräns.

crm.contacts.upsert

Lös eller skapa en kontakt (scope crm. write). Params: e-post plus fält, taggar, anteckningar.

crm.deals.list

Lista CRM erbjudanden (scope crm. read). Params: status, stage_id, company_id , owner_admin_id och pipeline_id.

crm.activities.record

Spela in en livscykel / företagsaktivitet för en kontakt (scope crm. write). Params: e-post eller kontakt_id, händelse, värde, valuta.

crm.conversions.record

Spela in en konvertering (scope crm. write). Params: kontakt_id eller e-post, conversion_type, value, valuta.

crm.events.list

Undersök CRM-händelsen ström (skop crm. read). Params: limit.

tickets.list

Lista biljetter (scope tickets. read). Params: page, per_page, sort, order, status, prioritet, department_id, assigned_admin_id , klient_email, search.

tickets.get

En biljett och dess meddelanden (scope tickets. read). Params: ticket_id eller ticket_number, inkluderar_messages, messages_limit.

tickets.reply

Skriv ett svar på en biljett (scope tickets. write). Params: ticket_id or ticket_number, body, author_type, authornamn, internt.

tickets.update

Uppdatera en biljett (scope tickets. write). Params: ticket_id or ticket_number, status, prioritet, ämne, department_id, assigned_admin_id.

tickets.open

Öppna en supportbiljett (scope tickets. write). Params: Customer_email, customer_name, subject, body, priority.

tickets.bulk

Kör en bulk kö operation (scope tickets. write). Params: drift, ids.

conversations.list

Lista live-chat konversationer (scope konversation. read). Params: sida, per_page, status, assigned_admin_id, klient_email, search.

conversations.get

Ett samtal och dess meddelanden (skope konversationer. läs). Params: konversation_id eller thread_key, inkluderar_messages.

conversations.messages

Paged message history (scope conversations. read). Params: konversation_id, sida, per_page, inkluderar_internal.

conversations.send

Skicka ett meddelande till en konversation (scope conversations. write). Params: Convers_id, Metod, sender_type, internt.

conversations.update

Tilldela, åter-status eller omtitel en konversation (skope konversationer. write). Params: Convers_id, status, assigned_admin_id.

Anslutningar. list / . get/ . test

Se vilka kontakter som är installerade, vad var och en kan göra, och om dess referenser fungerar (skopanslutningar. read).

automations.actions.list

De åtgärder som din Aktivitetsbyggare kommer att köra (skopautomationer. read).

automations.triggers.list

Vad kommer att elda och på vilka villkor (skopautomatisering. läs).

automations.runs.list

Exekveringshistorik för att debugga en integration (scope automations. read). Params: status, action_key.

departments.list

Avdelningar du kan dirigera en biljett till (scope departement. read).

notifications.list

Meddelanden för en operatör (scope notifications. read). Params: admin_id (krävs), unread_only.

analytics.export

En rapport avsnitt som CSV (scope analytics. read). Params: sektion, förinställd, från, till. Call analytik. sections. list för giltiga värden.

Site_intelligence. sites. list / . reports. lista

Övervakade webbplatser och deras SEO-rapporter (scope site_intelligence. read).

commerce. products. list / . get

Din Store-katalog, sidosatt (skop handel. läs). Filter: aktiv, kategori, sök. .get returnerar en produkt med sina varianter.

commerce. orders. list / . get

Lagra order (scope commerce. read). Filter: status, Pay_metod, kanal, Customer_email. Fetch one by order_id eller dess ORD-referens, med linjeartiklar. Live gateway kassan handtaget returneras aldrig.

commerce.refunds.list

Återbetalningsförfrågningar och deras tillstånd (scope commerce. read).

commerce.quotes.create

Pris ett objekt för en kund (scope commerce. write). store eller en kontaktslämma. Skapar ingenting: ingen ordning, ingen betalning. se handelsdelen.

Biljetter.csat.list / .get/ .metrics

Kundsupport som data (scope tickets. read). Filtrera genom betyg, biljett, agent eller period; .metrics returnerar samma siffror som instrumentbrädan visar.

conversations.ratings.list

Chatta konverserar dina besökare med kommentaren, vad som fick betyget och agenten krediteras (skopkonversationer. läs).

knowledge.articles.list

Sidan genom dina Help Center-artiklar (skop kb. read).

knowledge.articles.get

En Help Center artikel av id (scope kb. read). Params: Article_id.

webhooks.events.list

Varje händelse kan du prenumerera en webhook endpoint till, med sin nyttolast. Finns på varje plan, så att du kan bygga mot det innan du köper.

files.get

En kortlivad signerad nedladdningslänk för en bilaga (skopfiler. läs). Params: referens, ttl.

security.check

Fråga om en IP e-post blockeras eller misstänks här (cope security.read).IP brandvägg, biljett spam blocklista och den cachade Security AI-verdict. Params: ip, e-post.

security.report

Rapportera missbruk ditt system observerat (scope security. write). registrerat som ett säkerhetsevenemang, klassificerat av Säkerhet AI omedelbart och administratörer är varnade på högriskbeslut. Params: ip, e-post, vänligen, källa.

security. blocklist. add/ . list

Hantera spam regler biljett pipeline verkställer (scope security.write / security.read). Samma butik som biljettsidan "Block sender" kontroll. Params: kind (email, domän,ipvärde, förnuft, utgångar_hours.

💡
meta. actions är alltid auktoritativ. Det returnerar varje åtgärd som finns tillgänglig på din installation med omfattningen var och en behöver, så du behöver aldrig gissa eller hårdkod denna lista.

Paging, filtrering och sortering

Varje lista åtgärd använder samma parametrar, så du lär dig dem en gång.

Sidan / per_page

Sidnummer som börjar vid 1, och page size. standard 50 maximalt 200 gräns och kompensation accepteras också om du föredrar dem.

Sort / Order

Fält att sortera efter, och uppstigning eller nedgång (standarddesc). Varje åtgärd accepterar en fast uppsättning olika fält; allt annat ignoreras snarare än fel.

filters

Skicka filter som objekt, eller passera ett filter som en parameter på toppnivå. Okända filter ignoreras.

Vad kommer tillbaka

objekt, sida, per_page, count, total and has_more. Fortsätt att begära sidor tills has_mer är falskt.

Paged, filtrerad, sorterad lista request
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
}

Fel

Varje misslyckande returnerar samma form, med en stabil code Du kan grena på. Inte matcha på den mänskliga läsbara error text, som kan ombesvaras.

Felrespons
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
Missing_api_key / Invalid_apic_keyn

Ingen nyckel skickades, eller nyckeln är fel eller förfallen. HTTP 401_.

missing_scope

Nyckeln är giltig men saknar omfattningen av denna åtgärdsbehov. HTTP 403_.

Read_only_key / action_restricted

Nyckeln är endast läsbar, eller den här åtgärden finns inte i sin tillåtna lista. HTTP 403.

unknown_action

Inga sådana åtgärder. Ring meta. actions för den aktuella listan. HTTP 400_.

Missing_parameter / Invalid_parametr

En nödvändig parameter är frånvarande, eller ett värde accepteras inte. HTTP 400.

not_found

Skivan finns inte, eller är inte i arbetsytan denna nyckel kan se. HTTP 404.

plan_feature_locked

Din plan inkluderar inte funktionen som denna åtgärd tillhör. Kroppen namnger den feature, den plan_name i kraft och upgrade_urlRetrying kommer inte att hjälpa; planen måste ändras. HTTP 402.

license_required

Installationslicensen är inte aktiv, så ingen åtgärd kommer att köras tills den återställs. HTTP 402.

selling_paused

Handelsspecifik: butiken har sålt avstängd, så ingenting kan citeras eller beställas. HTTP 400.

rate_limited

Den timliga gränsen för denna nyckel används upp. HTTP 429.

server_error

Något misslyckades på vår sida. Frågan_id identifierar försöket om du behöver rapportera det. HTTP 500_.

Säker retries

Om en skrivtid kan du inte berätta om det landade. Skicka ett idempotency_key Och en upprepad samma samtal returnerar det ursprungliga resultatet istället för att göra jobbet två gånger.

Idempotent skriv
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
Hur länge det varar

En nyckel kommer ihåg för 24 timmar mot samma handling och API Nyckeln.

Vad du får tillbaka

Det ursprungliga svaret, plus idempotent_replay: sant så att du kan berätta det var en replay.

Misslyckanden stannar retryable

Endast framgångsrika författare kommer ihåg. Om ett samtal misslyckades, skickar det igen med samma nyckel kör det igen, vilket är vad du vill ha.

Läser

Läser ignorera nyckeln. Upprepa en läs är ofarlig.

Test utan att ändra något

Lägg till dry_run: true Din nyckel, omfattningar och parametrar kontrolleras alla exakt som normalt, då slutar samtalet innan något skapas eller ändras.

Torr kör: verifiera referenser och nyttolast säkert
{
  "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."
}
Använda torr_run medan du bygger. Det är det snabbaste sättet att bekräfta en nyckel har rätt omfattningar och din nyttolast formas korrekt, utan att skapa testdata som du sedan måste rensa upp.

Hastighetsbegränsningar

Per-key gräns

En konfigurerbar timgräns per API Nyckeln (standard 1000 Förfrågningar per timme). Ställ in den per nyckel under Inställningar,API Nycklar.

När överskrids

HTTP 429 med code rate_limited, plus en Retry-After header som berättar hur många sekunder att vänta. Gränsen återställs högst upp på nästa klocktimme.

Att veta var du står

Varje svar bär X-RateLimit-Limits, X-Reset Limit-Remaining och X-RATELimitit-Rese (en Unix timestamp). Titta på Återstående och sakta ner innan du slutar snarare än att vänta på att bli vägrad.

Berätta 429 Från 401

En A 429 Vänta och prova igen. 401 betyder att nyckeln själv är fel eller utgången, så retrying hjälper inte till förrän du fixar nyckeln.

Pre-auth brute-force vakt

Upprepa misslyckade autentiska försök från enIPär strypt separat. Giltiga nycklar reser aldrig detta.

Bästa praxis

Tillbaka när Remaining blir låg, och hedra Retry-After efter en 429 I stället för att retrying omedelbart.

Versioner och stabilitet

Nuvarande version

Varje svar bär X-OpsIQ-API-Version och X-OpsIQ-API-Status så att du kan bekräfta vad du pratar med.

Hur du kommer att bli varnad

Om en version någonsin är pensionerad, svar får standard Deprecation och Sunset rubriker, och meta. actions rapporter avskrivna och sunset_at. kontrollera dem i din övervakning och du kommer aldrig att bli förvånad.

Vad kommer inte att förändras

Befintliga åtgärdsnamn, deras parametrar och felkoder. Nya åtgärder och nya valfria fält kan läggas till när som helst, så ignorera fält du inte känner igen snarare än att misslyckas på dem.

En komplett integration, börja avsluta

Det här är hela slingan: hitta arbete, läs det, agera på det och bekräfta vad du gjorde.

Fullständigt biljettflöde över 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}
💡
Allt ovan fungerar på samma sätt för samtal: konversationer. list, konversation. get, konsulter. send och konversations. update följer det identiska mönstret, parametrarna och svarsformen.

Fler arbetade exempel

Var och en av dessa är ett komplett, runnable stycke av en verklig integration snarare än ett fragment.

Sidan genom varje rekord, på tre språk

Regeln är densamma överallt: fortsätt att be om nästa sida tills has_more Är falskt. Gissa aldrig en totalsumma.

Python · sida genom varje öppen biljett
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 · sida genom varje 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 · sida genom varje öppen biljett
<?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"]));

Hantera varje misslyckandeAPIkan returnera

Branch på codealdrig på ordalydelsen errorDenna wrapper är hela kontraktet i en funktion.

Python · en klient som hanterar varje felkod korrekt
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")

Svara på en dålig tillfredsställelse poäng inom timmen

Läs de låga poängen, öppna en biljett för varje och agera aldrig på samma två gånger.

Nära slingan på olyckliga kunder
# 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.

citera ett objekt och agera på köpmannens svar

En vägran som berättar vad du ska samla
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 }
}
⚠️
Visa kunden totals.total Precis som returneras. Kvantitet multiplicerar inte alltid enhetspriset - ett hotell citerar ett rum i tre nätter - så en figur du beräknar själv kan skilja sig från vad köpmannen faktiskt kommer att ta ut.

En webhook mottagare som är säker att köra i produktion

Verifiera, de-duplicera, svara snabbt och gör sedan arbetet. Leveranser retry, så samma händelse kan komma mer än en gång.

PHP · en produktionsformad webhook-mottagare
<?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

Planer och rättigheter

Varje åtgärd tillhör en produktfunktion, och din plan bestämmer vilka funktioner du har. Om din plan inte innehåller en funktion svarar åtgärden 402 – efter att din nyckel kontrolleras, så lär en oautentiserad uppringare ingenting om din plan och innan någonting skapas, då en blockerad skriv aldrig halvhappens.

En planlåst åtgärd
{
  "success": false,
  "code": "plan_feature_locked",
  "feature": "commerce",
  "plan_locked": true,
  "plan_name": "Growth",
  "upgrade_url": "https://…",
  "request_id": "req_8f2c1a9d4b7e"
}
Hur man berättar det förutom ett behörighetsproblem

En A403betyder att KEY är för smal - återutge den med rätt omfattning och det fungerar.402betyder att ACCOUNT inte har funktionen - ingen nyckel kan låsa upp den, planen måste ändras.

Försök inte att förlåta en 402

Det är inte övergående. Surface the upgrade_url Den som äger kontot istället för att backa och försöka igen.

Admin-omfattningen kringgår inte den

Scopes uttrycker vad den viktigaste emittenten delegerade; planen uttrycker det som kontot köpte. En admin-scoped nyckel får fortfarande en402För en funktion som planen saknar.

Ta reda på innan du skickar

Den som feature varje handlingsbehov publiceras i åtgärdskatalogen nedan och i meta.actionSå du kan kontrollera vid byggtiden istället för att upptäcka den i produktionen.

Det snabbaste sättet att se exakt var en nyckel står är meta.meDen rapporterar planen i kraft, varje funktion den bär och alla åtgärder denna nyckel kan inte ringa med anledning av var och en.

meta. me – vad denna nyckel faktiskt kan göra
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"
    }
  }
}
Ring meta. me först när en integration beter sig annorlunda mellan två installationer. Det svarar "varför kan denna nyckel inte göra det" på en begäran, utan någon som öppnar admin.

citera ett pris

commerce.quotes.create Priser ett objekt för en kund. Det skapar ingenting - ingen order, ingen betalningssession, inget innehavande lager - så det är säkert att ringa medan en kund fortfarande bestämmer sig.

citera ett objekt
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"}}
Handels totala vinster

För en uppkopplad plattform kommer den totala från köpmannen och beräknas aldrig här. Kvantitet multiplicerar inte alltid enhetspriset - ett hotell citerar ett rum i tre nätter - så visa det totala du fick, inte en du arbetade ut.

Vägran berättar vad som saknas

Om köpmannen behöver mer från kunden får du quote_refused med en missing lista namnge fälten för att samla in, och köpmannens egen ordalydelse att visa.

Ordering är inte enAPIRing samtal

Ett citat är indikativt. Bekräftelse sker där kunden är - det signerade kortet i chatten eller köpmannens egen kassa - aldrig genom detta API. Svaret säger så i ordering.

När försäljningen är pausad

Om butiken har sålt avstängd, citera svar selling_paused I stället för att prissätta något som ingen kan köpa.

De andra endpoints

Nästan allt du behöver är ett försök att /api/v1.phpDessa är undantagen, och vad var och en är för.

/api/v1/openapi.php · /api/v1/postman.php · /api/docs/

Maskinkontraktet och den mänskliga referensen. Ingen nyckel behövs, så du kan utforska innan du har en.

/api/ai_stream.php

Server-sent händelser för livechatt svar som de genereras. En ström, inte enJSONhandling.

/api/writing.php

Den äldre AI-skrivande slutpunkten. Allt det gör är också tillgängligt som writing.* Åtgärder för /api/v1.php, Det är där nytt arbete ska gå.

/api/inbox_copilot.php

Skriv, skriv och triage för en biljett inkorg inbäddad i din egen admin.

/api/v1/si/…

Site Intelligence som en liten REST API — webbplatser, kryper, problem, sökord, intäkter – för CI-pipelines som vill starta en krypning efter en utplacering och läsa resultatet.

/api/connectors.php?slug=&token=

Där en ansluten plattform POSTs egna webhooks till dig. Token är bryts när du aktiverar kontakten.

/api/integrations/*.php

Integrationsmotorn: kör och bekräftar åtgärder, och intar försäljning, identitet och resehändelser. Den använder sin egen nyckeltyp som utfärdats underAPIoch Webhook builder.

💡
Alla dessa följer samma planregler som handlingarna. En funktion som din plan inte innehåller svar 402 här också, i samma form.

Varje handling, med omfattningen den behöver

Den här listan genereras från den löpande katalogen, så det matchar alltid versionen du är på. meta.actions returnerar samma information som JSON.

2420 named actions: 805 reads, 1615 writes and 69 scopes. Every registered administrator JSON operation has a stable named action. OpenAPI: /api/v1/openapi.php. Postman: /api/v1/postman.php. Contract quality: declared_dynamic: 606; explicit: 63; route_inferred: 1633; source_inferred: 118.

administration (25)

administration.2fa.disable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Disable

administration.2fa.enable

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Enable

administration.2fa.recovery.regenerate

Write. Scope: administration.write, admin. Contract: route_inferred. Admin 2fa Recovery Regenerate

administration.2fa.setup

Read. Scope: administration.read, admin. Contract: route_inferred. Admin 2fa Setup

administration.2fa.status

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin 2fa Status

administration.ai.train.from.reply

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Ai Train From Reply

administration.brain.cancel

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Brain Cancel

administration.brain.view

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Brain View

administration.chat.access.check

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Access Check

administration.chat.create.ticket.on.behalf

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Create Ticket On Behalf

administration.chat.draft.ticket.from.thread

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Chat Draft Ticket From Thread

administration.conv.delete

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Delete

administration.conv.get

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Get

administration.conv.list

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv List

administration.conv.new

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv New

administration.conv.save

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Conv Save

administration.notification.prefs.get

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Notification Prefs Get

administration.notification.prefs.save

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notification Prefs Save

administration.notifications.list

Read. Scope: administration.read, admin. Contract: route_inferred. Admin Notifications List

administration.notifications.mark.all.read

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Notifications Mark All Read

administration.notifications.mark.read

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Mark Read

administration.notifications.pulse

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Notifications Pulse

administration.online.list

Read. Scope: administration.read, admin. Contract: declared_dynamic. Admin Online List

administration.presence.ping

Write. Scope: administration.write, admin. Contract: declared_dynamic. Admin Presence Ping

administration.realtime.token

Write. Scope: administration.write, admin. Contract: route_inferred. Admin Realtime Token

Analytics (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

chatt (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

Handels (11)

commerce.analytics.snapshot

Read. Scope: commerce.read, analytics.read, admin. Contract: explicit. Read privacy-safe storefront analytics

commerce.orders.get

Read. Scope: commerce.read, admin. Contract: explicit. Get one Store order with its line items

commerce.orders.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store orders in the bound workspace

commerce.pages.list

Read. Scope: commerce.read, admin. Contract: explicit. List storefront pages and promotional modals

commerce.products.get

Read. Scope: commerce.read, admin. Contract: explicit. Get one Store product with its variants Required fields: product_id.

commerce.products.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store products in the bound workspace

commerce.quotes.create

Write. Scope: commerce.write, admin. Contract: explicit. Quote an item for a customer (creates nothing) Required fields: source, item_id. Retry-safe with idempotency_key.

commerce.readiness.get

Read. Scope: commerce.read, admin. Contract: explicit. Check demo readiness and merchant go-live readiness

commerce.refunds.list

Read. Scope: commerce.read, admin. Contract: explicit. List Store refund requests in the bound workspace

commerce.storefront.catalog.get

Read. Scope: commerce.read, admin. Contract: explicit. Discover Store themes, designs, blocks and promotional shells

commerce.storefront.get

Read. Scope: commerce.read, admin. Contract: explicit. Get the bound workspace storefront configuration

communications (21)

communications.auth.check

Read. Scope: admin. Contract: route_inferred. Email Auth Check

communications.campaign.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Delete

communications.campaign.save

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Save

communications.campaign.send

Write. Scope: communications.write, admin. Contract: route_inferred. Push Campaign Send

communications.campaigns.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Push Campaigns List

communications.drafts.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Delete

communications.drafts.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Drafts List

communications.drafts.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Save

communications.drafts.send

Write. Scope: communications.write, admin. Contract: route_inferred. Email Drafts Send

communications.mailboxes.delete

Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Delete

communications.mailboxes.list

Read. Scope: communications.read, admin. Contract: route_inferred. Email Mailboxes List

communications.mailboxes.poll

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Poll

communications.mailboxes.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Mailboxes Save

communications.mailboxes.test

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Mailboxes Test

communications.pipe.regen.token

Write. Scope: communications.write, admin. Contract: declared_dynamic. Email Pipe Regen Token

communications.platform.list

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Platform List

communications.platform.send

Write. Scope: communications.write, admin. Contract: route_inferred. Email Platform Send

communications.settings.get

Read. Scope: communications.read, admin. Contract: declared_dynamic. Email Settings Get

communications.settings.save

Write. Scope: communications.write, admin. Contract: route_inferred. Email Settings Save

communications.settings.test

Read. Scope: communications.read, admin. Contract: route_inferred. Email Settings Test

communications.vapid.generate

Write. Scope: communications.write, admin. Contract: declared_dynamic. Push Vapid Generate

connector_builder (11)

connector_builder.export

Read. Scope: connector_builder.read, admin. Contract: explicit. Export a generated connector Required fields: slug.

connector_builder.generate

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Generate a connector package Required fields: spec.

connector_builder.get

Read. Scope: connector_builder.read, admin. Contract: route_inferred. Load a Builder specification Required fields: slug.

connector_builder.import.curl

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import cURL into Connector Builder

connector_builder.import.openapi

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import OpenAPI into Connector Builder

connector_builder.import.postman

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Import Postman into Connector Builder

connector_builder.list

Read. Scope: connector_builder.read, admin. Contract: declared_dynamic. List Builder connectors

connector_builder.profiles

Read. Scope: connector_builder.read, connectors.read, admin. Contract: source_inferred. List Connector Builder profiles and capability contracts

connector_builder.test

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Run Builder conformance tests Required fields: slug.

connector_builder.update

Write. Scope: connector_builder.write, admin. Contract: route_inferred. Update a generated connector Required fields: slug, spec.

connector_builder.validate

Read. Scope: connector_builder.read, admin. Contract: route_inferred. Validate a Builder specification Required fields: spec.

connectors (51)

connectors.action

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Action

connectors.backfill

Write. Scope: connectors.write, admin. Contract: route_inferred. Start connector backfill Required fields: slug.

connectors.backfill.route.connectors.backfill

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Backfill

connectors.backfill.status

Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector backfill status Required fields: slug.

connectors.backfill.status.route.connectors.backfill.status

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Backfill Status

connectors.builder.ai.actions

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Actions

connectors.builder.ai.draft

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Draft

connectors.builder.ai.handler

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Ai Handler

connectors.builder.ai.map

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Ai Map

connectors.builder.delete

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Delete

connectors.builder.dry.run

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Dry Run

connectors.builder.generate

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Generate

connectors.builder.import.curl

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Curl

connectors.builder.import.openapi

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Openapi

connectors.builder.import.postman

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Import Postman

connectors.builder.list

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder List

connectors.builder.load

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Load

connectors.builder.marketplace.apply

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Apply

connectors.builder.marketplace.link

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Link

connectors.builder.marketplace.status

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Marketplace Status

connectors.builder.marketplace.submit

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Marketplace Submit

connectors.builder.schema

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors Builder Schema

connectors.builder.test

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test

connectors.builder.test.action

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Test Action

connectors.builder.update

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Builder Update

connectors.builder.validate

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Builder Validate

connectors.contacts.import

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Contacts Import

connectors.contract

Read. Scope: connectors.read, connector_builder.read, admin. Contract: source_inferred. Read the canonical connector capability contract

connectors.customers.sync

Write. Scope: connectors.write, admin. Contract: route_inferred. Synchronize connector customers Required fields: slug.

connectors.disable

Write. Scope: connectors.write, admin. Contract: route_inferred. Disable a connector Required fields: slug.

connectors.disable.route.connectors.disable

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Disable

connectors.email.account.department

Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Department

connectors.email.account.remove

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Email Account Remove

connectors.email.account.routing

Read. Scope: connectors.read, admin. Contract: route_inferred. Connector Email Account Routing

connectors.enable

Write. Scope: connectors.write, admin. Contract: route_inferred. Enable a connector Required fields: slug.

connectors.enable.route.connectors.enable

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Enable

connectors.get

Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Get

connectors.get.route.connectors.get

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Get

connectors.install

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Install

connectors.integrity.scan

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connector Integrity Scan

connectors.list

Read. Scope: connectors.read, admin. Contract: explicit. List installed connectors and capabilities

connectors.list.route.connectors.list

Read. Scope: connectors.read, admin. Contract: declared_dynamic. Connectors List

connectors.oauth.start

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Oauth Start

connectors.settings.get

Read. Scope: connectors.read, admin. Contract: route_inferred. Read connector settings Required fields: slug.

connectors.settings.save

Write. Scope: connectors.write, admin. Contract: route_inferred. Save connector settings Required fields: slug, settings.

connectors.shared.oauth.delete

Write. Scope: connectors.write, admin. Contract: route_inferred. Connector Shared Oauth Delete

connectors.sync.customers

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Sync Customers

connectors.test

Read. Scope: connectors.read, admin. Contract: source_inferred. Connectors Test

connectors.test.route.connectors.test

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Test

connectors.uninstall

Write. Scope: connectors.write, admin. Contract: route_inferred. Connectors Uninstall

connectors.workflow.recipes

Read. Scope: connectors.read, admin. Contract: route_inferred. Connectors Workflow Recipes

conversations (38)

conversations.ai.draft

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Draft

conversations.ai.rewrite

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Ai Rewrite

conversations.archive

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Archive

conversations.assign

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Assign

conversations.assignees

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Assignees

conversations.bulk

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Bulk

conversations.clear

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear

conversations.clear.all

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Clear All

conversations.customer.tickets

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Customer Tickets

conversations.decline

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Decline

conversations.delete

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete

conversations.delete.last

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Delete Last

conversations.edit.last

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Edit Last

conversations.export

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Export

conversations.forget.visitor

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Forget Visitor

conversations.get

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Get

conversations.history

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat History

conversations.list

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations List

conversations.messages

Read. Scope: conversations.read, admin. Contract: source_inferred. Conversations Messages

conversations.ratings.list

Read. Scope: conversations.read, admin. Contract: explicit. List rated Client Chat conversations

conversations.resolve

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Resolve

conversations.saved.replies

Write. Scope: conversations.write, admin. Contract: declared_dynamic. Admin Client Chat Saved Replies

conversations.saved.reply.add

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Add

conversations.saved.reply.ai.generate

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Ai Generate

conversations.saved.reply.delete

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Delete

conversations.saved.reply.save

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Saved Reply Save

conversations.send

Write. Scope: conversations.write, admin. Contract: source_inferred. Conversations Send Retry-safe with idempotency_key.

conversations.send.route.admin.client.chat.send

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Send

conversations.tags.set

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Tags Set

conversations.thread

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Thread

conversations.threads

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Threads

conversations.toggle

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle

conversations.toggle.attachments

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Attachments

conversations.toggle.call.button

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Toggle Call Button

conversations.typing

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Typing

conversations.unarchive

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Unarchive

conversations.update

Write. Scope: conversations.write, admin. Contract: explicit. Update a conversation status, assignment or subject Retry-safe with idempotency_key.

conversations.upload

Write. Scope: conversations.write, admin. Contract: route_inferred. Admin Client Chat Upload

crm_ (260)

crm.ab.results

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ab Results

crm.access.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Access Set

crm.access_log.list

Read. Scope: admin. Contract: source_inferred. Crm Access Log List

crm.account.health

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health

crm.account.health.board

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Account Health Board

crm.account.health.refresh

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Account Health Refresh

crm.account.plan.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Get

crm.account.plan.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plan Save

crm.account.plans.due

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Account Plans Due

crm.account.timeline

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Account Timeline

crm.activities.list

Read. Scope: crm.read. Contract: explicit. List CRM contact activities

crm.activities.record

Write. Scope: crm.write. Contract: explicit. Record a CRM contact activity Required fields: contact_id, activity_type. Retry-safe with idempotency_key.

crm.activity.feed

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Activity Feed

crm.agent.toggle

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Agent Toggle

crm.ai.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Get

crm.ai.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Save

crm.ai.policy.simulate

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ai Policy Simulate

crm.ai.trace

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Ai Trace

crm.approval.decide

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Decide

crm.approval.delegate.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Delegate Set

crm.approval.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Approval List

crm.approval.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Get

crm.approval.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Policy Save

crm.approval.settings

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Approval Settings

crm.approve.apply

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Apply

crm.approve.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Approve List

crm.approve.reject

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Reject

crm.approve.update

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Approve Update

crm.ask

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Ask

crm.assign.owner

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Assign Owner

crm.assignment.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Assignment Get

crm.assignment.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Assignment Save

crm.attachment.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Delete

crm.attachment.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Attachment List

crm.attachment.upload

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Attachment Upload

crm.autobook.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autobook Meeting

crm.autodeal.mode

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Autodeal Mode

crm.book.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Book Meeting

crm.booking.link.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Booking Link Save

crm.booking.links.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Booking Links List

crm.build.apply

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Apply

crm.build.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build Get

crm.build.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Build List

crm.build.plan

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Plan

crm.build.rollback

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Build Rollback

crm.bulk

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Bulk

crm.bundle.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Bundle Set

crm.calendar.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Calendar Status

crm.capture.status

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Capture Status

crm.comm.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Get

crm.comm.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Comm Policy Save

crm.command.snapshot

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Command Snapshot

crm.companies.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Companies List

crm.company.hierarchy

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Hierarchy

crm.company.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Company Save

crm.company.set.parent

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Company Set Parent

crm.company.suggest.related

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Company Suggest Related

crm.connectors.catalog

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Connectors Catalog

crm.consent_log.list

Read. Scope: crm.read. Contract: source_inferred. Crm Consent Log List

crm.contact.churn

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Contact Churn

crm.contact.draft.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Draft Email

crm.contact.enrich

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Enrich

crm.contact.propose.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contact Propose Email

crm.contacts.detail

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Detail

crm.contacts.erase

Write. Scope: admin. Contract: source_inferred. Crm Contacts Erase Retry-safe with idempotency_key.

crm.contacts.export

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Export

crm.contacts.import.list

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Import List

crm.contacts.import.run

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Import Run Retry-safe with idempotency_key.

crm.contacts.list

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts List

crm.contacts.next_action

Read. Scope: crm.read. Contract: source_inferred. Crm Contacts Next Action

crm.contacts.open_chat

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Chat Retry-safe with idempotency_key.

crm.contacts.open_ticket

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Open Ticket Retry-safe with idempotency_key.

crm.contacts.resync

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Resync Retry-safe with idempotency_key.

crm.contacts.save

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Save Retry-safe with idempotency_key.

crm.contacts.send_email

Write. Scope: crm.write. Contract: source_inferred. Crm Contacts Send Email Retry-safe with idempotency_key.

crm.contacts.upsert

Write. Scope: crm.write. Contract: explicit. Crm Contacts Upsert Required fields: email. Retry-safe with idempotency_key.

crm.contract.amend

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Amend

crm.contract.price.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Price Set

crm.contract.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Save

crm.contract.usage

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contract Usage

crm.contracts.list

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Contracts List

crm.conversation.intel

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Conversation Intel

crm.conversions.goals.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Delete Retry-safe with idempotency_key.

crm.conversions.goals.list

Read. Scope: crm.read. Contract: source_inferred. Crm Conversions Goals List

crm.conversions.goals.save

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Goals Save Retry-safe with idempotency_key.

crm.conversions.list

Read. Scope: crm.read. Contract: source_inferred. Crm Conversions List

crm.conversions.record

Write. Scope: crm.write. Contract: source_inferred. Crm Conversions Record Retry-safe with idempotency_key.

crm.create.video.meeting

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Create Video Meeting

crm.customer.auto.sync

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Customer Auto Sync

crm.customer.auto.sync.status

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Auto Sync Status

crm.customer.emails

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Emails

crm.customer.payments

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Customer Payments

crm.data.steward.bulk.propose

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Bulk Propose

crm.data.steward.inbox

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Data Steward Inbox

crm.data.steward.propose

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Data Steward Propose

crm.deal.advance

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Advance

crm.deal.coach

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Coach

crm.deal.coach.action

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Deal Coach Action

crm.deal.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deal Get

crm.deal.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Save

crm.deal.splits.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Deal Splits Get

crm.deal.splits.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Deal Splits Set

crm.deals.advance

Write. Scope: crm.write. Contract: explicit. Advance a CRM deal to another stage Required fields: deal_id, stage_id. Retry-safe with idempotency_key.

crm.deals.create

Write. Scope: crm.write. Contract: explicit. Create a CRM deal Required fields: title. Retry-safe with idempotency_key.

crm.deals.detail

Read. Scope: crm.read. Contract: explicit. Get one CRM deal Required fields: deal_id.

crm.deals.list

Read. Scope: crm.read. Contract: explicit. List CRM deals

crm.deals.list.route.crm.deals.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Deals List

crm.deals.update

Write. Scope: crm.write. Contract: explicit. Update a CRM deal Required fields: deal_id. Retry-safe with idempotency_key.

crm.detail

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Detail

crm.draft.outreach

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Draft Outreach

crm.enrich.account

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Enrich Account

crm.erase

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Erase

crm.events.catalog

Read. Scope: crm.read. Contract: explicit. List subscribable CRM domain events

crm.events.list

Read. Scope: crm.read. Contract: explicit. List durable CRM domain events

crm.export

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Export

crm.export.all

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Export All

crm.field.add

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Add

crm.field.policy.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Get

crm.field.policy.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Policy Save

crm.field.remove

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Field Remove

crm.fields.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Fields List

crm.forecast.board

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forecast Board

crm.forecast.snapshot

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Forecast Snapshot

crm.form.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Form Save

crm.forms.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Forms List

crm.health.repair.catalog

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Repair Catalog

crm.health.smoke

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Health Smoke

crm.health.snapshot

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Health Snapshot

crm.home.persona.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Home Persona Set

crm.identity.rules.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Get

crm.identity.rules.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Identity Rules Save

crm.import.list

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Import List

crm.import.run

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Import Run

crm.inbound.activity

Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Activity

crm.inbound.endpoints.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Delete Retry-safe with idempotency_key.

crm.inbound.endpoints.list

Read. Scope: crm.read. Contract: source_inferred. Crm Inbound Endpoints List

crm.inbound.endpoints.save

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Save Retry-safe with idempotency_key.

crm.inbound.endpoints.test

Write. Scope: crm.write. Contract: source_inferred. Crm Inbound Endpoints Test Retry-safe with idempotency_key.

crm.leaderboard

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Leaderboard

crm.lifecycle.evaluate

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Evaluate Retry-safe with idempotency_key.

crm.lifecycle.rules.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Delete Retry-safe with idempotency_key.

crm.lifecycle.rules.list

Read. Scope: crm.read. Contract: source_inferred. Crm Lifecycle Rules List

crm.lifecycle.rules.save

Write. Scope: crm.write. Contract: source_inferred. Crm Lifecycle Rules Save Retry-safe with idempotency_key.

crm.list

Read. Scope: crm.read, admin. Contract: route_inferred. Contacts List

crm.mailbox.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Mailbox Status

crm.meeting.book

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Book

crm.meeting.cancel

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Cancel

crm.meeting.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Meeting List

crm.meeting.reschedule.accept

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Accept

crm.meeting.reschedule.reject

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Meeting Reschedule Reject

crm.merge

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Merge

crm.message.send

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Message Send

crm.messaging.provider.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Delete

crm.messaging.provider.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Messaging Provider Save

crm.messaging.provider.test

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Messaging Provider Test

crm.messaging.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Messaging Status

crm.next.action

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Next Action

crm.object.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Object Save

crm.objects.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Objects List

crm.offline.pull

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Pull

crm.offline.push

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Offline Push

crm.open.chat

Read. Scope: crm.read, admin. Contract: route_inferred. Contact Open Chat

crm.open.ticket

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Open Ticket

crm.outreach.campaigns.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Delete Retry-safe with idempotency_key.

crm.outreach.campaigns.list

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Campaigns List

crm.outreach.campaigns.save

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Save Retry-safe with idempotency_key.

crm.outreach.campaigns.send

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Campaigns Send Retry-safe with idempotency_key.

crm.outreach.send

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Send Retry-safe with idempotency_key.

crm.outreach.templates.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Delete Retry-safe with idempotency_key.

crm.outreach.templates.list

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates List

crm.outreach.templates.preview

Read. Scope: crm.read. Contract: source_inferred. Crm Outreach Templates Preview

crm.outreach.templates.save

Write. Scope: crm.write. Contract: source_inferred. Crm Outreach Templates Save Retry-safe with idempotency_key.

crm.payments.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Payments Status

crm.pipeline.data

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Pipeline Data

crm.price.resolve

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Price Resolve

crm.pricebook.entry.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Entry Set

crm.pricebook.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebook Save

crm.pricebooks.list

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Pricebooks List

crm.privacy_settings.get

Read. Scope: crm.read. Contract: source_inferred. Crm Privacy Settings Get

crm.privacy_settings.save

Write. Scope: admin. Contract: source_inferred. Crm Privacy Settings Save Retry-safe with idempotency_key.

crm.product.archive

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Product Archive

crm.product.revenue

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Product Revenue

crm.product.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Product Save

crm.products.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Products List

crm.propose.meeting

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Propose Meeting

crm.propose.outreach

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Propose Outreach

crm.prospecting.dashboard

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Prospecting Dashboard

crm.prospecting.icp.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Icp Save

crm.prospecting.import

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Import

crm.prospecting.research

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Prospecting Research

crm.prospecting.score

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Score

crm.prospecting.sequence

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Prospecting Sequence

crm.qualification.checklist.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Qualification Checklist Get

crm.qualification.checklist.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Qualification Checklist Save

crm.quota.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quota Save

crm.quote.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quote Get

crm.quote.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Quote Save

crm.quotes.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Quotes List

crm.record.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Delete

crm.record.fields.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Fields Get

crm.record.fields.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Fields Save

crm.record.get

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record Get

crm.record.history

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Record History

crm.record.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Save

crm.record.share.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Set

crm.record.share.unset

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Share Unset

crm.record.shares

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Record Shares

crm.records.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Records List

crm.restore.email.consent

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Restore Email Consent

crm.resync.from.platform

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Resync From Platform

crm.retention.catalog

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Retention Catalog

crm.revert

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Revert

crm.runtime.policy.get

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Get

crm.runtime.policy.remote.wipe

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Runtime Policy Remote Wipe

crm.runtime.policy.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Runtime Policy Save

crm.save

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Save

crm.scoring.rule.ai

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Ai

crm.scoring.rule.delete

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Delete

crm.scoring.rule.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Scoring Rule List

crm.scoring.rule.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Scoring Rule Save

crm.segments.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Delete Retry-safe with idempotency_key.

crm.segments.list

Read. Scope: crm.read. Contract: source_inferred. Crm Segments List

crm.segments.members

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Members

crm.segments.preview

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Preview

crm.segments.save

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Save Retry-safe with idempotency_key.

crm.segments.suggestions.accept

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Accept Retry-safe with idempotency_key.

crm.segments.suggestions.dismiss

Write. Scope: crm.write. Contract: source_inferred. Crm Segments Suggestions Dismiss Retry-safe with idempotency_key.

crm.segments.suggestions.list

Read. Scope: crm.read. Contract: source_inferred. Crm Segments Suggestions List

crm.semantic.search

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Semantic Search

crm.send.email

Write. Scope: crm.write, admin. Contract: route_inferred. Contact Send Email

crm.send.email.route.crm.send.email

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Email

crm.send.for.signature

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send For Signature

crm.send.payment.link

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Send Payment Link

crm.sequence.action

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sequence Action

crm.sequence.runs

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Sequence Runs

crm.setup.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Setup Status

crm.sharing.rules.get

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Get

crm.sharing.rules.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Sharing Rules Save

crm.subject.registry

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Subject Registry

crm.subscriptions.list

Read. Scope: crm.read, admin. Contract: route_inferred. Crm Subscriptions List

crm.subscriptions.rollup

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Subscriptions Rollup

crm.subscriptions.sync

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Subscriptions Sync

crm.task.create

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Task Create

crm.tasks.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Tasks List

crm.team.parent.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Parent Set

crm.team.rules.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Rules Set

crm.team.save

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Team Save

crm.teams.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Teams List

crm.territory.set

Write. Scope: crm.write, admin. Contract: route_inferred. Crm Territory Set

crm.video.status

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Video Status

crm.views.delete

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Delete

crm.views.list

Read. Scope: crm.read, admin. Contract: declared_dynamic. Crm Views List

crm.views.save

Write. Scope: crm.write, admin. Contract: declared_dynamic. Crm Views Save

crm.webhooks.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Delete Retry-safe with idempotency_key.

crm.webhooks.list

Read. Scope: crm.read. Contract: explicit. List CRM outbound webhook endpoints and recent deliveries

crm.webhooks.save

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Save Retry-safe with idempotency_key.

crm.webhooks.test

Write. Scope: crm.write. Contract: source_inferred. Crm Webhooks Test Retry-safe with idempotency_key.

crm.workflows.delete

Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Delete Retry-safe with idempotency_key.

crm.workflows.list

Read. Scope: crm.read. Contract: source_inferred. Crm Workflows List

crm.workflows.save

Write. Scope: crm.write. Contract: source_inferred. Crm Workflows Save Retry-safe with idempotency_key.

kunder (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- post (2)

email.template.send

Write. Scope: email.write, admin. Contract: source_inferred. Send one governed workspace email template Required fields: template, to. Retry-safe with idempotency_key.

email.templates.list

Read. Scope: email.read, admin. Contract: source_inferred. List email templates available to this workspace

engagement (163)

engagement.ab.autowinner

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Autowinner

engagement.ab.bandit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ab Bandit

engagement.address.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Address Get

engagement.address.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Address Save

engagement.ai.agent

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Agent

engagement.ai.analyze

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Analyze

engagement.ai.compile.profile

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Compile Profile

engagement.ai.copy

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Copy

engagement.ai.critique

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Critique

engagement.ai.decide

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Decide

engagement.ai.design

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Design

engagement.ai.edit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Edit

engagement.ai.generate

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Generate

engagement.ai.ideas

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Ideas

engagement.ai.image

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image

engagement.ai.image.edit

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Image Edit

engagement.ai.localize

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Localize

engagement.ai.logo

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Logo

engagement.ai.media.jobs

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Media Jobs

engagement.ai.narrative

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Narrative

engagement.ai.responsive

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Ai Responsive

engagement.ai.variants

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Ai Variants

engagement.ai.video.start

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Start

engagement.ai.video.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Ai Video Status

engagement.approval.decide

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Decide

engagement.approval.request

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Approval Request

engagement.approvals.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Approvals List

engagement.asset.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Delete

engagement.asset.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Asset Upload

engagement.assets.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Assets List

engagement.audience.materialize

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Materialize

engagement.audience.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Audience Save

engagement.audience.test

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Audience Test

engagement.audit.export

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Audit Export

engagement.autoresponder.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Autoresponder Get

engagement.autoresponder.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Autoresponder Save

engagement.bank.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Delete

engagement.bank.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Bank List

engagement.bank.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Save

engagement.bank.used

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Bank Used

engagement.blackouts.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Blackouts Get

engagement.blackouts.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Blackouts Save

engagement.brand.kit.bootstrap

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Bootstrap

engagement.brand.kit.font.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Brand Kit Font Upload

engagement.brand.kit.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Brand Kit Get

engagement.brand.kit.get.route.survey.brand.kit.get

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Brand Kit Get

engagement.brand.kit.save

Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Brand Kit Save

engagement.brand.kit.save.route.survey.brand.kit.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Brand Kit Save

engagement.campaign.archive

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Archive

engagement.campaign.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Delete

engagement.campaign.duplicate

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Duplicate

engagement.campaign.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Get

engagement.campaign.launch

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Launch

engagement.campaign.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign List

engagement.campaign.pause

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Pause

engagement.campaign.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Preview

engagement.campaign.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Publish

engagement.campaign.rollback

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Rollback

engagement.campaign.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Save

engagement.campaign.save.route.survey.campaign.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Campaign Save

engagement.campaign.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Campaign Toggle

engagement.campaign.versions

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Campaign Versions

engagement.comment.add

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Comment Add

engagement.comments.add

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Add

engagement.comments.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Delete

engagement.comments.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Comments List

engagement.comments.list.route.survey.comments.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Comments List

engagement.comments.resolve

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Comments Resolve

engagement.connectors.catalog

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Connectors Catalog

engagement.coupon.providers

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Coupon Providers

engagement.coupons.clear

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Clear

engagement.coupons.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Coupons Stats

engagement.coupons.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Coupons Upload

engagement.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Delete

engagement.delete.route.tour.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Delete

engagement.delivery.analytics

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Analytics

engagement.delivery.dashboard

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Delivery Dashboard

engagement.deployment.ab.promote

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Promote

engagement.deployment.ab.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Ab Save

engagement.deployment.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Publish

engagement.deployment.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Save

engagement.deployment.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Deployment Status

engagement.detail

Read. Scope: engagement.read, admin. Contract: route_inferred. Campaign Detail

engagement.digest.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Digest Save

engagement.feed.catalog

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Feed Catalog

engagement.feed.items

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Feed Items

engagement.geo.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Geo Preview

engagement.idle.cron.set

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Idle Cron Set

engagement.import.create

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Create

engagement.import.replay

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Import Replay

engagement.leads.export

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads Export

engagement.leads.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Leads List

engagement.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Announcements List

engagement.list.route.tours.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Tours List

engagement.module.set.ai.live

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Ai Live

engagement.module.set.custom.html

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Custom Html

engagement.module.set.enabled

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Module Set Enabled

engagement.module.status

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Promo Module Status

engagement.onsite.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Onsite Preview

engagement.pause.all

Write. Scope: engagement.write, admin. Contract: declared_dynamic. Promo Pause All

engagement.presence

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Presence

engagement.preview.share

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Preview Share

engagement.push.draft

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Push Draft

engagement.recipients.issue

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Issue

engagement.recipients.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Recipients List

engagement.recipients.revoke

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Recipients Revoke

engagement.response.detail

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Response Detail

engagement.responses.browse

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Responses Browse

engagement.rule.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Delete

engagement.rule.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Save

engagement.rule.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Proactive Rule Stats

engagement.rule.test

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Rule Test

engagement.rule.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Proactive Rule Toggle

engagement.rules.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Proactive Rules List

engagement.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Save

engagement.save.route.tour.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Save

engagement.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Stats

engagement.stats.route.tour.stats

Read. Scope: engagement.read, admin. Contract: route_inferred. Tour Stats

engagement.studio.a11y

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio A11y

engagement.studio.ai.generate

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Generate

engagement.studio.ai.insights

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Insights

engagement.studio.ai.target

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Ai Target

engagement.studio.archive

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Archive

engagement.studio.assets

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio Assets

engagement.studio.create

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Create

engagement.studio.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Delete

engagement.studio.duplicate

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Duplicate

engagement.studio.event

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Studio Event

engagement.studio.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Get

engagement.studio.governance

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Governance

engagement.studio.list

Read. Scope: engagement.read, admin. Contract: declared_dynamic. Survey Studio List

engagement.studio.preview

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview

engagement.studio.preview.link

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Studio Preview Link

engagement.studio.publish

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Publish

engagement.studio.rename

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Rename

engagement.studio.revert

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Revert

engagement.studio.save.draft

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Draft

engagement.studio.save.targeting

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Save Targeting

engagement.studio.set.active

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Active

engagement.studio.set.status

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Set Status

engagement.studio.template.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Delete

engagement.studio.template.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Template Save

engagement.studio.tpl.preview

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Tpl Preview

engagement.studio.upload

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Upload

engagement.studio.webhook

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Studio Webhook

engagement.targeting.simulate

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Targeting Simulate

engagement.template.apply

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Apply

engagement.template.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Template List

engagement.template.save.custom

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Template Save Custom

engagement.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Announcement Toggle

engagement.toggle.route.tour.toggle

Write. Scope: engagement.write, admin. Contract: route_inferred. Tour Toggle

engagement.trigger.set.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Trigger Set Save

engagement.variant.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Delete

engagement.variant.list

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Variant List

engagement.variant.promote

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Promote

engagement.variant.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Variant Save

engagement.version.compare

Read. Scope: engagement.read, admin. Contract: route_inferred. Survey Version Compare

engagement.version.get

Read. Scope: engagement.read, admin. Contract: route_inferred. Promo Version Get

engagement.version.label

Write. Scope: engagement.write, admin. Contract: route_inferred. Promo Version Label

engagement.webhook.delete

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Delete

engagement.webhook.replay

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Replay

engagement.webhook.run

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Run

engagement.webhook.save

Write. Scope: engagement.write, admin. Contract: route_inferred. Survey Webhook Save

feedback (8)

feedback.analytics

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Analytics

feedback.detractors

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Detractors

feedback.get

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Get

feedback.ingest

Write. Scope: feedback.write, admin. Contract: explicit. Ingest a feedback record or external review

feedback.list

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback List

feedback.overview

Read. Scope: feedback.read, admin. Contract: source_inferred. Feedback Overview

feedback.sources.list

Read. Scope: feedback.read, admin. Contract: explicit. List Voice of Customer feedback sources

feedback.update

Write. Scope: feedback.write, admin. Contract: source_inferred. Feedback Update Retry-safe with idempotency_key.

files (1)

files.get

Read. Scope: files.read, admin. Contract: source_inferred. Files Get

HR (48)

hr.agent.incident.close

Write. Scope: hr.write, admin. Contract: route_inferred. Close an agent incident — the same act that lifts the suspension it caused Required fields: incident_uuid, resolution.

hr.agent.step

Write. Scope: hr.write, admin. Contract: route_inferred. Run one agent step: gate verdict, execution and outcome reported separately Required fields: run_uuid, agent_key, tool_key, jurisdiction, purpose.

hr.agent.step.status

Read. Scope: hr.read, admin. Contract: route_inferred. What actually happened at a step (permitted, executed, proven, failed, compensated) Required fields: run_uuid, seq.

hr.agent.takeover

Write. Scope: hr.write, admin. Contract: route_inferred. A human takes an agent run; no further agent steps are accepted Required fields: run_uuid.

hr.agent.tool.grant

Write. Scope: hr.write, admin. Contract: route_inferred. Grant an agent a tool for one jurisdiction and purpose, up to a risk ceiling Required fields: agent_key, tool_key, jurisdiction, max_risk, purpose.

hr.agent.tools

Read. Scope: hr.read, admin. Contract: declared_dynamic. List the registered typed tools an agent may use, and open agent incidents

hr.ai.corrections

Write. Scope: hr.write, admin. Contract: declared_dynamic. Bundle recent reviewer corrections into a dataset; it is pending privacy review and trains nothing

hr.ai.quality.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. The AI quality board: sampled defect rate, override pressure per workflow, coaching reception

hr.booking.slots_reconcile

Write. Scope: hr.write, admin. Contract: declared_dynamic. Release booking slots whose claim never became a booked meeting

hr.connectors.certify

Write. Scope: hr.write, admin. Contract: route_inferred. Certify an HR connector (scope sandbox|production; production demands provider-side proof under dual control) Required fields: connector_class, connector_key, scope, evidence, submitted_by.

hr.connectors.health

Read. Scope: hr.read, admin. Contract: route_inferred. One connector account's health: certification level and scope, last reconciliation verdict, failures and webhook backlog Required fields: account_uuid.

hr.decisions.appeals

Write. Scope: hr.write, admin. Contract: route_inferred. File an appeal against an AI decision on a person's behalf; it must be heard by an independent human Required fields: decision_uuid, subject_type, subject_id, grounds.

hr.decisions.explanation

Read. Scope: hr.read, admin. Contract: route_inferred. Plain-language explanation of one AI decision: what was looked at, which policy, and how to appeal Required fields: decision_uuid, audience.

hr.employee.provision

Write. Scope: hr.write, admin. Contract: route_inferred. Provision seatless employee access and send the invitation Required fields: person_uuid.

hr.employee.restore

Write. Scope: hr.write, admin. Contract: route_inferred. Lift an employee access suspension (written reason required) and provision again Required fields: person_uuid, reason.

hr.experience.metrics

Read. Scope: hr.read, admin. Contract: route_inferred. Measured persona experience metrics (self-service rate, decision cycle, coaching usefulness, quality) from live journeys

hr.global.readiness

Read. Scope: hr.read, admin. Contract: declared_dynamic. The whole launch picture: 15-gate leadership score, release readiness checks and jurisdiction coverage

hr.identity.facets

Read. Scope: hr.read, admin. Contract: route_inferred. List a person's identity facets and open conflicts Required fields: person_uuid.

hr.identity.link

Write. Scope: hr.write, admin. Contract: route_inferred. Link an identity facet to a person Required fields: person_uuid, facet_type, facet_key.

hr.interview.room.connect

Write. Scope: hr.write, admin. Contract: route_inferred. Connect the AI to interview media; refuses unless media really reaches the worker Required fields: media_uuid.

hr.interview.room.consent

Write. Scope: hr.write, admin. Contract: route_inferred. Record or withdraw consent for ONE interview purpose (recording, biometric_liveness, transcription) Required fields: media_uuid, purpose, state.

hr.interview.room.pause

Write. Scope: hr.write, admin. Contract: route_inferred. Pause a live interview Required fields: media_uuid.

hr.interview.room.provision

Write. Scope: hr.write, admin. Contract: route_inferred. Provision an interview room (a place to meet — NOT AI participation) Required fields: session_uuid, transport, accommodation_route.

hr.interview.room.state

Read. Scope: hr.read, admin. Contract: route_inferred. Read an interview room, including whether the AI is actually participating Required fields: media_uuid.

hr.interview.room.takeover

Write. Scope: hr.write, admin. Contract: route_inferred. A human takes the interview; the AI cannot speak in it again Required fields: media_uuid, reason.

hr.jurisdiction.capabilities

Read. Scope: hr.read, admin. Contract: route_inferred. What this product may do in one country, per feature, with the law behind each answer Required fields: code.

hr.jurisdiction.change.raise

Write. Scope: hr.write, admin. Contract: route_inferred. Report a change in the law; a high or critical one suspends every lane in that jurisdiction at once Required fields: pack_key, summary, severity.

hr.jurisdiction.coverage

Read. Scope: hr.read, admin. Contract: declared_dynamic. Computed coverage for every market: released pack, named counsel owner, cited sources, passing tests

hr.jurisdiction.explain

Read. Scope: hr.read, admin. Contract: route_inferred. Why an action about one person is allowed, reduced or blocked, with the rule and citation Required fields: person_uuid, feature.

hr.jurisdiction.pack.release

Write. Scope: hr.write, admin. Contract: route_inferred. Put a drafted policy pack into effect; refused without a named counsel owner and a cited law Required fields: release_uuid.

hr.learning.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read courses, paths and enrolments

hr.leave.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read leave types and requests

hr.lifecycle.lanes

Read. Scope: hr.read, admin. Contract: declared_dynamic. Every lifecycle lane with its mode, KPIs and whether a live tool path really exists behind it

hr.marketplace.overview

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read HR connector accounts, conflicts and deliveries

hr.org.tree

Read. Scope: hr.read, admin. Contract: declared_dynamic. Read the organisation tree

hr.people.create

Write. Scope: hr.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.

hr.people.get

Read. Scope: hr.read, admin. Contract: route_inferred. Get one HR person Required fields: person_uuid.

hr.people.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List HR people

hr.people.update

Write. Scope: hr.write, admin. Contract: route_inferred. Update an HR person Required fields: person_uuid, display_name, primary_email.

hr.postings.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List job postings

hr.readiness.read

Read. Scope: hr.read, admin. Contract: declared_dynamic. Run the HR release readiness report

hr.release.verify

Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the four HR release gates (schema, manifest, probe, readiness)

hr.requisitions.create

Write. Scope: hr.write, admin. Contract: route_inferred. Create a requisition Required fields: title, openings, justification.

hr.requisitions.list

Read. Scope: hr.read, admin. Contract: declared_dynamic. List requisitions

hr.thread.delete

Write. Scope: hr.write, admin. Contract: route_inferred. Delete a workforce conversation; refused while it is under legal hold Required fields: thread_uuid, reason.

hr.thread.legal_hold

Write. Scope: hr.write, admin. Contract: route_inferred. Place or lift a legal hold on a workforce conversation Required fields: thread_uuid, on, reason.

hr.thread.retention

Write. Scope: hr.write, admin. Contract: route_inferred. Set a conversation's retention class (standard|extended|permanent) Required fields: thread_uuid, retention_class.

hr.threads.retention_sweep

Write. Scope: hr.write, admin. Contract: declared_dynamic. Run the conversation retention sweep; legal holds are never swept

intent (6)

intent.clear

Write. Scope: intent.write, admin. Contract: declared_dynamic. Intent Clear

intent.funnel

Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read the intent funnel

intent.funnel.aggregate

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel Aggregate

intent.funnel.route.intent.funnel

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Funnel

intent.summary

Read. Scope: intent.read, analytics.read, admin. Contract: route_inferred. Read intent summaries

intent.summary.route.intent.summary

Read. Scope: intent.read, admin. Contract: route_inferred. Intent Summary

KB (6)

kb.faq.delete

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Delete Retry-safe with idempotency_key.

kb.faq.generate

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Generate Retry-safe with idempotency_key.

kb.faq.import

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Import Retry-safe with idempotency_key.

kb.faq.list

Read. Scope: kb.read, read, admin. Contract: source_inferred. Kb Faq List

kb.faq.save

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Save Retry-safe with idempotency_key.

kb.faq.set_status

Write. Scope: kb.write, admin. Contract: source_inferred. Kb Faq Set Status Retry-safe with idempotency_key.

knowledge (78)

knowledge.analytics.get

Read. Scope: kb.read, admin. Contract: route_inferred. Help Analytics Get

knowledge.analytics.toggle

Write. Scope: kb.write, admin. Contract: route_inferred. Help Analytics Toggle

knowledge.article.ai.refine

Read. Scope: kb.read, admin. Contract: route_inferred. Help Article Ai Refine

knowledge.article.class.bulk

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Class Bulk

knowledge.article.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Delete

knowledge.article.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Publish

knowledge.article.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Save

knowledge.article.set.category

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Category

knowledge.article.set.public

Write. Scope: kb.write, admin. Contract: route_inferred. Help Article Set Public

knowledge.articles.ai.generate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ai Generate

knowledge.articles.bulk.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Bulk Delete

knowledge.articles.count

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Articles Count

knowledge.articles.get

Read. Scope: kb.read, admin. Contract: explicit. Get one Help Center article Required fields: article_id.

knowledge.articles.ids

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Ids

knowledge.articles.list

Read. Scope: kb.read, admin. Contract: route_inferred. Help Articles List

knowledge.articles.set.public.all

Write. Scope: kb.write, admin. Contract: route_inferred. Help Articles Set Public All

knowledge.categories.ai.merge

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Ai Merge

knowledge.categories.bulk.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Categories Bulk Delete

knowledge.categories.list

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Categories List

knowledge.categories.merge.dupes

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Categories Merge Dupes

knowledge.category.delete

Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Delete

knowledge.category.get

Read. Scope: kb.read, admin. Contract: route_inferred. Help Category Get

knowledge.category.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Category Save

knowledge.center.article.image.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Article Image Upload

knowledge.center.favicon.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Favicon Upload

knowledge.center.hero.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Dark Upload

knowledge.center.hero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Hero Upload

knowledge.center.logo.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Dark Upload

knowledge.center.logo.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Logo Upload

knowledge.center.og.image.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Og Image Upload

knowledge.center.settings.get

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Settings Get

knowledge.center.settings.save

Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Settings Save

knowledge.center.subhero.dark.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Dark Upload

knowledge.center.subhero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Subhero Upload

knowledge.center.translate.estimate

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Estimate

knowledge.center.translate.run

Write. Scope: kb.write, admin. Contract: route_inferred. Help Center Translate Run

knowledge.center.translate.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Center Translate Status

knowledge.center.translate.stop

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Translate Stop

knowledge.center.widget.hero.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Hero Upload

knowledge.center.widget.icon.upload

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Center Widget Icon Upload

knowledge.comments.deliver.notifications

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Deliver Notifications

knowledge.comments.moderate

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Comments Moderate

knowledge.comments.moderation.list

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Comments Moderation List

knowledge.import.batches

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Batches

knowledge.import.connectors

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Import Connectors

knowledge.import.csv.preview

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Import Csv Preview

knowledge.import.preview

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Preview

knowledge.import.resync

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Resync

knowledge.import.run

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Run

knowledge.import.undo

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Import Undo

knowledge.insights.generate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Insights Generate

knowledge.insights.get

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Insights Get

knowledge.mark.reviewed

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Mark Reviewed

knowledge.missed.dismiss

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Dismiss

knowledge.missed.draft.article

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Draft Article

knowledge.missed.list

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Missed List

knowledge.missed.mark.published

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Missed Mark Published

knowledge.missed.refresh

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Missed Refresh

knowledge.organize.descriptions

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Descriptions

knowledge.organize.status

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Organize Status

knowledge.organize.step

Write. Scope: kb.write, admin. Contract: route_inferred. Help Organize Step

knowledge.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Publish

knowledge.reformat.revert

Write. Scope: kb.write, admin. Contract: declared_dynamic. Help Reformat Revert

knowledge.reformat.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Help Reformat Status

knowledge.reformat.step

Write. Scope: kb.write, admin. Contract: route_inferred. Help Reformat Step

knowledge.review.queue

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Review Queue

knowledge.search.gaps

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Search Gaps

knowledge.set.featured

Write. Scope: kb.write, admin. Contract: route_inferred. Help Set Featured

knowledge.set.visibility

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Set Visibility

knowledge.subdomain.allocate

Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Allocate

knowledge.subdomain.check

Read. Scope: kb.read, admin. Contract: route_inferred. Help Subdomain Check

knowledge.subdomain.release

Write. Scope: kb.write, admin. Contract: route_inferred. Help Subdomain Release

knowledge.taxonomy.organize

Write. Scope: kb.write, admin. Contract: declared_dynamic. Kb Taxonomy Organize

knowledge.taxonomy.status

Read. Scope: kb.read, admin. Contract: declared_dynamic. Kb Taxonomy Status

knowledge.taxonomy.step

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Taxonomy Step

knowledge.widget.categories

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Categories

knowledge.widget.publish

Write. Scope: kb.write, admin. Contract: route_inferred. Kb Widget Publish

knowledge.widget.targets

Read. Scope: kb.read, admin. Contract: route_inferred. Kb Widget Targets

leads (6)

leads.delete

Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Delete a lead Required fields: lead_id.

leads.delete.route.lead.delete

Write. Scope: leads.write, admin. Contract: route_inferred. Lead Delete

leads.list

Read. Scope: leads.read, crm.read, admin. Contract: route_inferred. List leads

leads.stats

Read. Scope: leads.read, analytics.read, admin. Contract: declared_dynamic. Get lead statistics

leads.stats.route.leads.stats

Read. Scope: leads.read, admin. Contract: declared_dynamic. Leads Stats

leads.update

Write. Scope: leads.write, crm.write, admin. Contract: route_inferred. Update a lead Required fields: lead_id, status.

meta 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

plattform (926)

platform.add.announcement

Write. Scope: platform.write, admin. Contract: declared_dynamic. Add Announcement

platform.add.kb.article

Write. Scope: platform.write, admin. Contract: route_inferred. Add Kb Article

platform.add.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Add Todo Item

platform.ai.action.lookup

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Action Lookup

platform.ai.anomaly.detect

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Anomaly Detect

platform.ai.brain.add

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Add

platform.ai.brain.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Delete

platform.ai.brain.edit

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Edit

platform.ai.brain.list

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain List

platform.ai.brain.pin

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Pin

platform.ai.brain.status

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Brain Status

platform.ai.chat

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Chat

platform.ai.confidence.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Confidence Stats

platform.ai.context.lookup

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Context Lookup

platform.ai.daily.brief

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief

platform.ai.daily.brief.check

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Daily Brief Check

platform.ai.daily.brief.dismiss

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Daily Brief Dismiss

platform.ai.daily.brief.fetch

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Daily Brief Fetch

platform.ai.eval.control.summary

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Control Summary

platform.ai.eval.feedback.queue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Feedback Queue

platform.ai.eval.kb.gap.queue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Kb Gap Queue

platform.ai.eval.load

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Load

platform.ai.eval.replay.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Replay History

platform.ai.eval.run

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Run

platform.ai.eval.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Eval Save

platform.ai.eval.score.answer

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Eval Score Answer

platform.ai.eval.simulate

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Eval Simulate

platform.ai.feedback.analysis

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Analysis

platform.ai.feedback.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Feedback Stats

platform.ai.history.archive

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Archive

platform.ai.history.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Clear All

platform.ai.history.delete

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Delete

platform.ai.history.export.csv

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Export Csv

platform.ai.history.get

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Get

platform.ai.history.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History List

platform.ai.history.stats

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai History Stats

platform.ai.insight.clear

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Clear

platform.ai.insight.history

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight History

platform.ai.insight.report.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Insight Report Delete

platform.ai.insight.report.get

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Insight Report Get

platform.ai.instructions.compress

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Compress

platform.ai.instructions.connector.templates

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Connector Templates

platform.ai.instructions.example

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Instructions Example

platform.ai.instructions.load

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Load

platform.ai.instructions.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Instructions Preview

platform.ai.instructions.reset

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Reset

platform.ai.instructions.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Ai Instructions Save

platform.ai.page.insights

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Page Insights

platform.ai.popup.regen

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Popup Regen

platform.ai.quality.view

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Quality View

platform.ai.reasoning.chain.get

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Reasoning Chain Get

platform.ai.score.lead

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Score Lead

platform.ai.smart.alerts

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Smart Alerts

platform.ai.spoke

Read. Scope: platform.read, admin. Contract: route_inferred. Ai Spoke

platform.ai.triage.accuracy

Read. Scope: platform.read, admin. Contract: declared_dynamic. Ai Triage Accuracy

platform.ai.whmcs.chat

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Whmcs Chat

platform.ai.writing

Write. Scope: platform.write, admin. Contract: route_inferred. Ai Writing

platform.api.keys.catalog

Read. Scope: admin. Contract: declared_dynamic. Api Keys Catalog

platform.api.keys.create

Write. Scope: admin. Contract: route_inferred. Api Keys Create

platform.api.keys.delete

Write. Scope: admin. Contract: route_inferred. Api Keys Delete

platform.api.keys.list

Read. Scope: admin. Contract: declared_dynamic. Api Keys List

platform.api.keys.revoke

Write. Scope: admin. Contract: route_inferred. Api Keys Revoke

platform.api.keys.update

Write. Scope: admin. Contract: route_inferred. Api Keys Update

platform.audit.export

Read. Scope: admin. Contract: route_inferred. Audit Export

platform.blocked

Write. Scope: platform.write, admin. Contract: route_inferred. Blocked

platform.campaigns

Read. Scope: platform.read, admin. Contract: declared_dynamic. Campaigns

platform.chart.browsers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Browsers

platform.chart.countries

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Countries

platform.chart.devices

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Devices

platform.chart.hourly

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Hourly

platform.chart.new.returning

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart New Returning

platform.chart.os

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Os

platform.chart.sources

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chart Sources

platform.chart.visitors

Read. Scope: platform.read, admin. Contract: route_inferred. Chart Visitors

platform.chatbot.flow.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Delete

platform.chatbot.flow.get

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Get

platform.chatbot.flow.save

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Save

platform.chatbot.flow.stats

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Flow Stats

platform.chatbot.flow.test.advance

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Advance

platform.chatbot.flow.test.start

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Test Start

platform.chatbot.flow.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Flow Toggle

platform.chatbot.flows.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Chatbot Flows List

platform.chatbot.node.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Delete

platform.chatbot.node.save

Write. Scope: platform.write, admin. Contract: route_inferred. Chatbot Node Save

platform.chatbot.nodes.list

Read. Scope: platform.read, admin. Contract: route_inferred. Chatbot Nodes List

platform.clear.admin.chat.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Clear Admin Chat History

platform.command.center.view

Read. Scope: platform.read, admin. Contract: declared_dynamic. Command Center View

platform.commerce.actf.execute

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Execute

platform.commerce.actf.policy.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Actf Policy Save

platform.commerce.actf.review

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Review

platform.commerce.actf.simulate

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Actf Simulate

platform.commerce.analytics.report

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report

platform.commerce.analytics.report.email

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Analytics Report Email

platform.commerce.autonomy.issue

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Autonomy Issue

platform.commerce.autonomy.status

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Autonomy Status

platform.commerce.collections.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Collections Delete

platform.commerce.collections.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Collections Save

platform.commerce.customer.block

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Block

platform.commerce.customer.credit.add

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Credit Add

platform.commerce.customer.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Customer Save

platform.commerce.customers.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Customers List

platform.commerce.digital.codes.import

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Codes Import

platform.commerce.digital.config.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Digital Config Save

platform.commerce.digital.file.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Digital File Upload

platform.commerce.fulfilment.transition

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Fulfilment Transition

platform.commerce.intelligence.economics.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Economics Save

platform.commerce.intelligence.market.price.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Price Save

platform.commerce.intelligence.market.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Intelligence Market Save

platform.commerce.kit.apply

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Kit Apply

platform.commerce.kit.preview

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Kit Preview

platform.commerce.kits.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Kits List

platform.commerce.launch.readiness

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Launch Readiness

platform.commerce.menu.ai.build

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menu Ai Build

platform.commerce.menus.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Menus Save

platform.commerce.merchandising.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Merchandising Save

platform.commerce.midmarket.operations

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Midmarket Operations

platform.commerce.onboarding.ai.draft

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Ai Draft

platform.commerce.onboarding.apply

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Onboarding Apply

platform.commerce.option.sets.generate

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Option Sets Generate

platform.commerce.option.sets.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Option Sets Save

platform.commerce.option.templates

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Option Templates

platform.commerce.order.refundable

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Refundable

platform.commerce.order.ship

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Order Ship

platform.commerce.order.shipments

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Order Shipments

platform.commerce.orders.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Orders List

platform.commerce.orders.transition

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Orders Transition

platform.commerce.page.ai.draft

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Draft

platform.commerce.page.ai.refine

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Ai Refine

platform.commerce.page.render

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Page Render

platform.commerce.pages.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Pages Delete

platform.commerce.pages.list

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages List

platform.commerce.pages.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Pages Save

platform.commerce.price.advice

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Price Advice

platform.commerce.products.ai.copy

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Ai Copy

platform.commerce.products.bulk

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Bulk

platform.commerce.products.catalog.meta

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Catalog Meta

platform.commerce.products.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Delete

platform.commerce.products.duplicate

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Duplicate

platform.commerce.products.export.csv

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products Export Csv

platform.commerce.products.image.alt.ai

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Image Alt Ai

platform.commerce.products.image.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Delete

platform.commerce.products.image.update

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Image Update

platform.commerce.products.image.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Image Upload

platform.commerce.products.images.list

Read. Scope: commerce.read, admin. Contract: route_inferred. Commerce Products Images List

platform.commerce.products.images.reorder

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Images Reorder

platform.commerce.products.import.csv

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Products Import Csv

platform.commerce.products.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Products List

platform.commerce.products.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Products Save

platform.commerce.refunds.complete.manual

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Complete Manual

platform.commerce.refunds.request

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Refunds Request

platform.commerce.returns.transition

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Returns Transition

platform.commerce.size.charts.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Size Charts Delete

platform.commerce.size.charts.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Size Charts Save

platform.commerce.store.maturity

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Store Maturity

platform.commerce.storefront.brand.import

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Brand Import

platform.commerce.storefront.domain.remove

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Remove

platform.commerce.storefront.domain.set

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Domain Set

platform.commerce.storefront.logo.upload

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Storefront Logo Upload

platform.commerce.storefront.page.ai.seo

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Storefront Page Ai Seo

platform.commerce.storefront.slug.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Storefront Slug Save

platform.commerce.supply.chain

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Supply Chain

platform.commerce.variants.delete

Write. Scope: commerce.write, admin. Contract: route_inferred. Commerce Variants Delete

platform.commerce.variants.save

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Variants Save

platform.commerce.wallet.topup.refund

Write. Scope: commerce.write, admin. Contract: declared_dynamic. Commerce Wallet Topup Refund

platform.commerce.wallet.topups.list

Read. Scope: commerce.read, admin. Contract: declared_dynamic. Commerce Wallet Topups List

platform.complete.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Complete Todo Item

platform.consent.log.list

Read. Scope: platform.read, admin. Contract: route_inferred. Consent Log List

platform.countries

Read. Scope: platform.read, admin. Contract: declared_dynamic. Countries

platform.country.detail

Read. Scope: platform.read, admin. Contract: route_inferred. Country Detail

platform.custom.code.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Approve

platform.custom.code.disable

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Disable

platform.custom.code.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Reject

platform.custom.code.rollback

Write. Scope: platform.write, admin. Contract: route_inferred. Custom Code Rollback

platform.custom.code.status

Read. Scope: platform.read, admin. Contract: route_inferred. Custom Code Status

platform.delete.todo.item

Write. Scope: platform.write, admin. Contract: route_inferred. Delete Todo Item

platform.devices

Read. Scope: platform.read, admin. Contract: declared_dynamic. Devices

platform.diag.check.resolutions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Check Resolutions

platform.diag.dismiss

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Dismiss

platform.diag.event.taxonomy

Read. Scope: platform.read, admin. Contract: declared_dynamic. Diag Event Taxonomy

platform.diag.identity.restitch

Write. Scope: admin. Contract: declared_dynamic. Diag Identity Restitch

platform.diag.recheck

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Recheck

platform.diag.recheck.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Diag Recheck All

platform.diag.report

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Report

platform.diag.unmute

Write. Scope: platform.write, admin. Contract: route_inferred. Diag Unmute

platform.dismiss.credit.alert

Write. Scope: admin. Contract: route_inferred. Dismiss Credit Alert

platform.domain.knowledge.ai.generate

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Ai Generate

platform.domain.knowledge.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Delete

platform.domain.knowledge.list

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge List

platform.domain.knowledge.save

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Save

platform.domain.knowledge.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Knowledge Toggle

platform.domain.verify.add

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Add

platform.domain.verify.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Domain Verify List

platform.domain.verify.recheck

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Recheck

platform.domain.verify.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Domain Verify Remove

platform.dynamic.action.dispatch

Write. Scope: platform.write, admin. Contract: route_inferred. Dynamic Action Dispatch

platform.events.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Events Clear All

platform.events.list

Read. Scope: platform.read, admin. Contract: route_inferred. Events List

platform.experiment.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Delete

platform.experiment.results

Read. Scope: platform.read, admin. Contract: route_inferred. Experiment Results

platform.experiment.save

Write. Scope: platform.write, admin. Contract: route_inferred. Experiment Save

platform.experiments.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Experiments Clear All

platform.experiments.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Experiments List

platform.failed.logins.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear All

platform.failed.logins.clear.history

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins Clear History

platform.failed.logins.journey

Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Journey

platform.failed.logins.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Failed Logins List

platform.failed.logins.unblock

Write. Scope: platform.write, admin. Contract: route_inferred. Failed Logins Unblock

platform.feedback.analysis.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Analysis Get

platform.feedback.analysis.run

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Analysis Run

platform.feedback.analytics.all

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics All

platform.feedback.analytics.detractors

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Detractors

platform.feedback.analytics.metrics

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Metrics

platform.feedback.analytics.overview

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Overview

platform.feedback.analytics.segments

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Segments

platform.feedback.analytics.sentiment

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Sentiment

platform.feedback.analytics.themes

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Themes

platform.feedback.analytics.trends

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Analytics Trends

platform.feedback.assignees.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Assignees List

platform.feedback.event.outbox.drain

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Event Outbox Drain

platform.feedback.exports.create

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Exports Create

platform.feedback.exports.get

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Exports Get

platform.feedback.external.review.ingest

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback External Review Ingest

platform.feedback.ingest.create

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Ingest Create

platform.feedback.items.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Assign

platform.feedback.items.evidence

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Evidence

platform.feedback.items.follow.up.complete

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Complete

platform.feedback.items.follow.up.set

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Follow Up Set Required fields: bool.

platform.feedback.items.get

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items Get

platform.feedback.items.list

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback Items List

platform.feedback.items.mark.read

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Mark Read

platform.feedback.items.notes.add

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Notes Add

platform.feedback.items.set.priority

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Priority

platform.feedback.items.set.status

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Set Status

platform.feedback.items.tags.add

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Add

platform.feedback.items.tags.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Items Tags Remove

platform.feedback.list

Read. Scope: platform.read, admin. Contract: route_inferred. Feedback List

platform.feedback.reconciliation

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reconciliation

platform.feedback.reports.delete

Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Reports Delete

platform.feedback.reports.email

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Email

platform.feedback.reports.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports Get

platform.feedback.reports.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Reports List

platform.feedback.satisfaction.advice.last

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advice Last

platform.feedback.satisfaction.advise

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Advise

platform.feedback.satisfaction.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Satisfaction Overview

platform.feedback.sources.health

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources Health

platform.feedback.sources.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Feedback Sources List

platform.feedback.sources.rebuild

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Rebuild

platform.feedback.sources.replay

Write. Scope: platform.write, admin. Contract: route_inferred. Feedback Sources Replay

platform.feedback.stats

Write. Scope: platform.write, admin. Contract: declared_dynamic. Feedback Stats

platform.fx.refresh.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. Fx Refresh Now

platform.geoip.autodetect

Read. Scope: platform.read, admin. Contract: declared_dynamic. Geoip Autodetect

platform.get.admin.chat.history

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Admin Chat History

platform.get.ai.snapshot

Write. Scope: platform.write, admin. Contract: route_inferred. Get Ai Snapshot

platform.get.campaign.groups

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Campaign Groups

platform.get.client.chat.knowledge.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Client Chat Knowledge Overview

platform.get.kb.categories

Read. Scope: platform.read, admin. Contract: route_inferred. Get Kb Categories

platform.get.live.health.snapshot

Read. Scope: platform.read, admin. Contract: route_inferred. Get Live Health Snapshot

platform.get.pwa.chat.prefs

Write. Scope: platform.write, admin. Contract: declared_dynamic. Get Pwa Chat Prefs

platform.get.servers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Servers

platform.get.survey.config

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Survey Config

platform.get.ticket.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Ticket Options

platform.get.ticket.thread

Read. Scope: platform.read, admin. Contract: route_inferred. Get Ticket Thread

platform.get.todo.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Get Todo List

platform.get.widget.advanced

Read. Scope: platform.read, admin. Contract: route_inferred. Get Widget Advanced

platform.governance.summary

Read. Scope: platform.read, admin. Contract: route_inferred. Governance Summary

platform.groups.create

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Create

platform.groups.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Delete

platform.groups.list

Write. Scope: platform.write, admin. Contract: route_inferred. Groups List

platform.groups.rename

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Rename

platform.groups.set.primary

Write. Scope: platform.write, admin. Contract: route_inferred. Groups Set Primary

platform.hc.preview.mint

Read. Scope: platform.read, admin. Contract: route_inferred. Hc Preview Mint

platform.hc.template.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Apply

platform.hc.template.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Delete

platform.hc.template.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hc Template Preview

platform.hc.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hc Template Save

platform.hc.templates.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Templates List

platform.hc.translation.review.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review Get

platform.hc.translation.review.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hc Translation Review List

platform.hc.translation.review.revert

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Revert

platform.hc.translation.review.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hc Translation Review Save

platform.heatmap

Read. Scope: platform.read, admin. Contract: route_inferred. Heatmap

platform.hr.access.grant.manual

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Grant Manual

platform.hr.access.policy.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Access Policy List

platform.hr.access.policy.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Policy Set

platform.hr.access.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Request

platform.hr.access.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Access Revoke

platform.hr.accommodation.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Accommodation List

platform.hr.accommodation.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Accommodation Resolve

platform.hr.agent.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Assign

platform.hr.agent.compensation.retry

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Compensation Retry

platform.hr.agent.compensation.sweep

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Agent Compensation Sweep

platform.hr.agent.compensations

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Compensations

platform.hr.agent.incident.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Incident Close

platform.hr.agent.register

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Register

platform.hr.agent.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Step

platform.hr.agent.step.status

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Agent Step Status

platform.hr.agent.tool.auth

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Auth

platform.hr.agent.tool.grant

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Agent Tool Grant

platform.hr.agent.tools

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Agent Tools

platform.hr.ai.act.build

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Ai Act Build

platform.hr.ai.act.export

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Export

platform.hr.ai.act.fria.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Fria Record

platform.hr.ai.act.notice.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Notice Publish

platform.hr.ai.act.overseer.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Assign

platform.hr.ai.act.overseer.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Act Overseer Revoke

platform.hr.ai.act.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Act Overview

platform.hr.ai.metering.export

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Export

platform.hr.ai.metering.overview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Ai Metering Overview

platform.hr.ai.metering.settings.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Ai Metering Settings Save

platform.hr.ai.status

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Ai Status

platform.hr.analytics.ask

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Analytics Ask

platform.hr.analytics.snapshot

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Analytics Snapshot

platform.hr.app.move

Write. Scope: platform.write, admin. Contract: route_inferred. Hr App Move

platform.hr.appeal.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Appeal List

platform.hr.appeal.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Appeal Resolve

platform.hr.application.history

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Application History

platform.hr.application.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Application List

platform.hr.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Assign

platform.hr.auto.offer.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Auto Offer Run

platform.hr.autonomy.lane.demote

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Demote

platform.hr.autonomy.lane.install

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Autonomy Lane Install

platform.hr.autonomy.lane.promote

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Promote

platform.hr.autonomy.lane.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Autonomy Lane Review

platform.hr.autonomy.lane.shadow

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Autonomy Lane Shadow

platform.hr.autonomy.lanes

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Lanes

platform.hr.autonomy.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Autonomy Overview

platform.hr.availability.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Availability Save

platform.hr.band.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Approve

platform.hr.band.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Band List

platform.hr.band.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Band Save

platform.hr.benchmarks.contribute.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Contribute Now

platform.hr.benchmarks.opt.in

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benchmarks Opt In

platform.hr.benchmarks.opt.out

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Benchmarks Opt Out

platform.hr.benchmarks.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Benchmarks Overview

platform.hr.benefit.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Enroll

platform.hr.benefit.plan.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Benefit Plan Save

platform.hr.bias.audit.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Bias Audit List

platform.hr.bias.audit.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Bias Audit Run

platform.hr.booking.link.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Booking Link Save

platform.hr.booking.slots.reconcile

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Booking Slots Reconcile

platform.hr.breaker.reset

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Breaker Reset

platform.hr.broadcast.audience.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast Audience Options

platform.hr.broadcast.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Broadcast List

platform.hr.broadcast.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Broadcast Preview

platform.hr.broadcast.send

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Broadcast Send

platform.hr.budget.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Budget Set

platform.hr.calibration.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Close

platform.hr.calibration.move

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Move

platform.hr.calibration.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Calibration Open

platform.hr.capabilities.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capabilities Get

platform.hr.capability.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Capability Set

platform.hr.capability.trail

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Capability Trail

platform.hr.cards.refresh

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Cards Refresh

platform.hr.case.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Assign

platform.hr.case.attachment.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Attachment Add

platform.hr.case.attachment.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Attachment List

platform.hr.case.categories

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case Categories

platform.hr.case.event.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Event Add

platform.hr.case.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Get

platform.hr.case.grant.access

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Case Grant Access

platform.hr.case.intake.mailbox

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Intake Mailbox

platform.hr.case.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Case List

platform.hr.case.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Open

platform.hr.case.route

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Route

platform.hr.case.thread

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Thread

platform.hr.case.tighten

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Case Tighten

platform.hr.certification.define

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification Define

platform.hr.certification.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Certification List

platform.hr.certification.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification Record

platform.hr.certification.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Certification State

platform.hr.certification.types

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Certification Types

platform.hr.check.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Check List

platform.hr.check.manual.result

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Manual Result

platform.hr.check.order

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Order

platform.hr.check.requery

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Requery

platform.hr.check.void

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Check Void

platform.hr.checkin.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Checkin Record

platform.hr.coach.feedback

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Coach Feedback

platform.hr.coach.me

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Coach Me

platform.hr.coach.receive

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Coach Receive

platform.hr.comp.change.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Approve

platform.hr.comp.change.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Comp Change Request

platform.hr.compliance.build

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Compliance Build

platform.hr.compliance.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Compliance List

platform.hr.connector.cert.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Revoke

platform.hr.connector.cert.submissions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Connector Cert Submissions

platform.hr.connector.cert.submit

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Cert Submit

platform.hr.connector.certify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Certify

platform.hr.connector.health

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Health

platform.hr.connector.options

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Connector Options

platform.hr.connector.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Connector Revoke

platform.hr.contract.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Contract List

platform.hr.copilot.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Apply

platform.hr.copilot.plan

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Copilot Plan

platform.hr.copilot.recipes

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Copilot Recipes

platform.hr.copilot.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Copilot Reject

platform.hr.correction.dataset.build

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Correction Dataset Build

platform.hr.correction.datasets

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Correction Datasets

platform.hr.correction.privacy.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Correction Privacy Review

platform.hr.course.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Enroll

platform.hr.course.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Save

platform.hr.course.skills.tag

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Course Skills Tag

platform.hr.decision.appeal.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Assign

platform.hr.decision.appeal.file

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal File

platform.hr.decision.appeal.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Decision Appeal Resolve

platform.hr.decision.appeals.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decision Appeals List

platform.hr.decision.explanation

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Decision Explanation

platform.hr.decisions.recent

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Decisions Recent

platform.hr.directory.visibility.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Directory Visibility Get

platform.hr.directory.visibility.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Directory Visibility Set

platform.hr.discipline.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Decide

platform.hr.discipline.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Discipline Propose

platform.hr.document.access.log

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document Access Log

platform.hr.document.deletion.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Deletion Request

platform.hr.document.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Hold

platform.hr.document.intake

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Intake

platform.hr.document.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Document List

platform.hr.document.requirement.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Add

platform.hr.document.requirement.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Requirement Remove

platform.hr.document.review.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Document Review Approve

platform.hr.document.reviews

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Document Reviews

platform.hr.dsr.list

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Dsr List

platform.hr.dsr.transition

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Dsr Transition

platform.hr.email.intake.log

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Email Intake Log

platform.hr.employee.access.events

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Employee Access Events

platform.hr.employee.provision

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Provision

platform.hr.employee.restore

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Restore

platform.hr.employee.suspend

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employee Suspend

platform.hr.employment.activate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment Activate

platform.hr.employment.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Employment End

platform.hr.enterprise.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Enterprise Approve

platform.hr.equipment.delivered

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Delivered

platform.hr.equipment.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Request

platform.hr.equipment.returned

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Equipment Returned

platform.hr.escrow.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Escrow Resolve

platform.hr.evidence.a11y.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence A11y Record

platform.hr.evidence.attest

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Attest

platform.hr.evidence.dr.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Dr Record

platform.hr.evidence.ledgers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Evidence Ledgers

platform.hr.evidence.load.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Load Record

platform.hr.evidence.owner.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Evidence Owner Assign

platform.hr.expense.confirm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Confirm

platform.hr.expense.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Decide

platform.hr.expense.handoff

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Handoff

platform.hr.expense.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Expense Overview

platform.hr.expense.policy.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Expense Policy Save

platform.hr.experience.metrics

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Experience Metrics

platform.hr.expiry.run

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Expiry Run

platform.hr.fairness.cohort.define

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Cohort Define

platform.hr.fairness.cohorts

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Fairness Cohorts

platform.hr.fairness.evaluate

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Fairness Evaluate

platform.hr.faq.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Delete

platform.hr.faq.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Draft

platform.hr.faq.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Faq List

platform.hr.faq.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq Save

platform.hr.faq.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Faq State

platform.hr.feedback.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Feedback List

platform.hr.feedback.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Feedback Record

platform.hr.flag.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Flag Set

platform.hr.flags.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Flags Get

platform.hr.frontline.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Frontline Overview

platform.hr.gig.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Decide

platform.hr.gig.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Gig Post

platform.hr.global.readiness

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Global Readiness

platform.hr.goal.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Create

platform.hr.goal.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Draft

platform.hr.goal.update

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Goal Update

platform.hr.grievance.file

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance File

platform.hr.grievance.outcome

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Grievance Outcome

platform.hr.headcount.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Approve

platform.hr.headcount.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Headcount Draft

platform.hr.headcount.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Headcount List

platform.hr.hire

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hire

platform.hr.hiring.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Hiring Decide

platform.hr.holiday.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Holiday Save

platform.hr.identity.admin.options

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Admin Options

platform.hr.identity.conflict.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Conflict Resolve

platform.hr.identity.coverage.plan

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity Coverage Plan

platform.hr.identity.facets

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Identity Facets

platform.hr.identity.history

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Identity History

platform.hr.identity.link

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Link

platform.hr.identity.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Revoke

platform.hr.identity.verification.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Identity Verification Record

platform.hr.incident.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Incident List

platform.hr.incident.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Open

platform.hr.incident.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Incident Step

platform.hr.interview.recording.start

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Start

platform.hr.interview.recording.upload

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Recording Upload

platform.hr.interview.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Review

platform.hr.interview.room.answer

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Answer

platform.hr.interview.room.ask

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Ask

platform.hr.interview.room.connect

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Connect

platform.hr.interview.room.consent

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Consent

platform.hr.interview.room.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room End

platform.hr.interview.room.leave

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Leave

platform.hr.interview.room.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Interview Room List

platform.hr.interview.room.observe

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Observe

platform.hr.interview.room.pause

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Pause

platform.hr.interview.room.provision

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Provision

platform.hr.interview.room.reconnect

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Reconnect

platform.hr.interview.room.resume

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room Resume

platform.hr.interview.room.state

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Interview Room State

platform.hr.interview.room.takeover

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Room Takeover

platform.hr.interview.schedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Schedule

platform.hr.interview.transcript.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Interview Transcript Correct

platform.hr.investigation.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Close

platform.hr.investigation.finding

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Finding

platform.hr.investigation.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Hold

platform.hr.investigation.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Investigation Open

platform.hr.investigation.triage

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Investigation Triage

platform.hr.iplan.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Approve

platform.hr.iplan.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iplan Create

platform.hr.iplan.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Iplan List

platform.hr.iscore.human

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Human

platform.hr.iscore.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Iscore Run

platform.hr.isession.attach.meeting

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Attach Meeting

platform.hr.isession.control

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Control

platform.hr.isession.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Isession List

platform.hr.isession.liveness

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Isession Liveness

platform.hr.isession.schedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Isession Schedule

platform.hr.job.arch.analyse

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Job Arch Analyse

platform.hr.job.arch.apply

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Apply

platform.hr.job.arch.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Approve

platform.hr.job.arch.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Job Arch Overview

platform.hr.job.arch.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Propose

platform.hr.job.arch.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Arch Reject

platform.hr.job.family.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Family Save

platform.hr.job.level.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Level Save

platform.hr.job.profile.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Profile Save

platform.hr.job.version.draft.ai

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Draft Ai

platform.hr.job.version.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Publish

platform.hr.job.version.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Job Version Save

platform.hr.job.versions

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Job Versions

platform.hr.jurisdiction.capabilities

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Capabilities

platform.hr.jurisdiction.case.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Run

platform.hr.jurisdiction.case.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Case Save

platform.hr.jurisdiction.change.assess

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Assess

platform.hr.jurisdiction.change.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Close

platform.hr.jurisdiction.change.raise

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Change Raise

platform.hr.jurisdiction.coverage

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Coverage

platform.hr.jurisdiction.explain

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Explain

platform.hr.jurisdiction.overlay.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Overlay List

platform.hr.jurisdiction.overlay.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Overlay Save

platform.hr.jurisdiction.pack.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Draft

platform.hr.jurisdiction.pack.release

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Release

platform.hr.jurisdiction.pack.withdraw

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Pack Withdraw

platform.hr.jurisdiction.release.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Jurisdiction Release List

platform.hr.jurisdiction.rule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Rule Save

platform.hr.jurisdiction.source.declare

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Jurisdiction Source Declare

platform.hr.jurisdiction.transfer.declare

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Jurisdiction Transfer Declare

platform.hr.kill.flip

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Flip

platform.hr.kill.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kill Toggle

platform.hr.kiosk.register

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Register

platform.hr.kiosk.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Kiosk Revoke

platform.hr.knowledge.pack.install

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Install

platform.hr.knowledge.pack.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Knowledge Pack Remove

platform.hr.knowledge.packs

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Knowledge Packs

platform.hr.leadership.score

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leadership Score

platform.hr.learning.assign.mandatory

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Learning Assign Mandatory

platform.hr.learning.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Learning Overview

platform.hr.leave.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Decide

platform.hr.leave.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Leave Overview

platform.hr.leave.policy.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Policy Save

platform.hr.leave.type.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Leave Type Save

platform.hr.letter.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Letter Issue

platform.hr.letter.kinds

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Letter Kinds

platform.hr.letter.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Letter Preview

platform.hr.listening.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Close

platform.hr.listening.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Listening Overview

platform.hr.listening.run.due

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Listening Run Due

platform.hr.listening.schedule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule Save

platform.hr.listening.schedule.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Listening Schedule State

platform.hr.loop.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Approve

platform.hr.loop.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Correct

platform.hr.loop.evaluate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Evaluate

platform.hr.loop.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Loop Overview

platform.hr.loop.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Propose

platform.hr.loop.release

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Release

platform.hr.loop.rollback

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Rollback

platform.hr.loop.snapshot

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Loop Snapshot

platform.hr.marketplace.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Marketplace Overview

platform.hr.meeting.book

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Book

platform.hr.meeting.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Cancel

platform.hr.meeting.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Propose

platform.hr.meeting.reschedule

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Meeting Reschedule

platform.hr.meetings.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Meetings Overview

platform.hr.meetings.reconcile

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Meetings Reconcile

platform.hr.mentor.propose

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Mentor Propose

platform.hr.module.toggle

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Module Toggle

platform.hr.new.hire.checkin.state

Read. Scope: platform.read, admin. Contract: route_inferred. Hr New Hire Checkin State

platform.hr.offer.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Approve

platform.hr.offer.draft

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Draft

platform.hr.offer.esign.confirm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Esign Confirm

platform.hr.offer.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Offer List

platform.hr.offer.send

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Send

platform.hr.offer.withdraw

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Offer Withdraw

platform.hr.onboarding.checkins.book

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Checkins Book

platform.hr.onboarding.draft.tasks

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Draft Tasks

platform.hr.onboarding.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Onboarding Overview

platform.hr.onboarding.plan.buddy

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Buddy

platform.hr.onboarding.plan.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Close

platform.hr.onboarding.plan.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Plan Create

platform.hr.onboarding.task.block

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Block

platform.hr.onboarding.task.done

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Done

platform.hr.onboarding.task.skip

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Onboarding Task Skip

platform.hr.onboarding.task.unblock

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Unblock

platform.hr.onboarding.task.verify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Task Verify

platform.hr.onboarding.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Onboarding Template Save

platform.hr.one.on.one.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr One On One List

platform.hr.one.on.one.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr One On One Record

platform.hr.opportunity.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Decide

platform.hr.opportunity.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Opportunity Post

platform.hr.org.chart

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Chart

platform.hr.org.legal.entities

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Legal Entities

platform.hr.org.legal.entity.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Legal Entity Create

platform.hr.org.location.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Location Create

platform.hr.org.locations

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Locations

platform.hr.org.map.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Org Map Overview

platform.hr.org.map.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Remove

platform.hr.org.map.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Map Save

platform.hr.org.tree

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Org Tree

platform.hr.org.unit.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Org Unit Create

platform.hr.org.unit.move

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Org Unit Move

platform.hr.override.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Override Record

platform.hr.overtime.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Overtime Decide

platform.hr.path.enroll

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Enroll

platform.hr.path.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Path Save

platform.hr.pay.equity.overview

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Pay Equity Overview

platform.hr.pay.gap.evaluate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pay Gap Evaluate

platform.hr.payroll.import

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Import

platform.hr.payroll.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Overview

platform.hr.payroll.provider.exceptions

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Payroll Provider Exceptions

platform.hr.payroll.reconcile

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payroll Reconcile

platform.hr.payslips.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Payslips Issue

platform.hr.people.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr People List

platform.hr.perf.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Perf Overview

platform.hr.person.create

Write. Scope: platform.write, admin. Contract: route_inferred. Create an HR person Required fields: display_name.

platform.hr.person.get

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Get

platform.hr.person.identifier.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Identifier Add

platform.hr.person.identifier.read

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifier Read

platform.hr.person.identifiers

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Person Identifiers

platform.hr.person.update

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Person Update

platform.hr.pilot.outcome.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pilot Outcome Record

platform.hr.pipeline

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pipeline

platform.hr.policy.activate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Activate

platform.hr.policy.compile

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Policy Compile

platform.hr.pool.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Create

platform.hr.pool.member.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Add

platform.hr.pool.member.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pool Member Remove

platform.hr.pool.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pool Overview

platform.hr.portal.address

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Portal Address

platform.hr.portal.slug.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Portal Slug Save

platform.hr.position.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Assign

platform.hr.position.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Create

platform.hr.position.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Position Overview

platform.hr.position.profile.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Profile Set

platform.hr.position.reports.to

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Reports To

platform.hr.position.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position State

platform.hr.position.vacate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Position Vacate

platform.hr.posting.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Close

platform.hr.posting.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Create

platform.hr.posting.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Posting List

platform.hr.posting.publish

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Posting Publish

platform.hr.probation.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Open

platform.hr.probation.review

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Probation Review

platform.hr.profile.address.format

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Address Format

platform.hr.profile.address.write

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Address Write

platform.hr.profile.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Decide

platform.hr.profile.ownership.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Ownership Get

platform.hr.profile.ownership.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Ownership Set

platform.hr.profile.pending

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Profile Pending

platform.hr.profile.photo.clear

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Clear

platform.hr.profile.photo.set

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Photo Set

platform.hr.profile.reveal

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Reveal

platform.hr.profile.section.end

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section End

platform.hr.profile.section.write

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Profile Section Write

platform.hr.profile.sections

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Profile Sections

platform.hr.pulse.close

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Close

platform.hr.pulse.issue

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Issue

platform.hr.pulse.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Pulse List

platform.hr.pulse.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Pulse Open

platform.hr.pulse.results

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Pulse Results

platform.hr.quality.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Overview

platform.hr.quality.sample.draw

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Quality Sample Draw

platform.hr.quality.samples

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Quality Samples

platform.hr.quality.verdict

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Quality Verdict

platform.hr.queue.agent.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Add

platform.hr.queue.agent.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Agent Remove

platform.hr.queue.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Queue Save

platform.hr.readiness.report

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Readiness Report

platform.hr.recognise

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Recognise

platform.hr.relations.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Relations Overview

platform.hr.release.gates

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Release Gates

platform.hr.release.verify

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Release Verify

platform.hr.req.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Create

platform.hr.req.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Req List

platform.hr.req.reject

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Reject

platform.hr.req.transition

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Req Transition

platform.hr.review.cycle.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Cycle Open

platform.hr.review.include

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Include

platform.hr.review.respond

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Respond

platform.hr.review.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Review Template Save

platform.hr.rubric.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Approve

platform.hr.rubric.create

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Rubric Create

platform.hr.rubric.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Rubric List

platform.hr.run.replay

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Replay

platform.hr.run.start

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Start

platform.hr.run.step

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Step

platform.hr.run.takeover

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Run Takeover

platform.hr.scenario.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Scenario Run

platform.hr.schedule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Schedule Save

platform.hr.screening.correct

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Correct

platform.hr.screening.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Screening List

platform.hr.screening.review

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Screening Review

platform.hr.screening.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Run

platform.hr.screening.verify

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Screening Verify

platform.hr.security.assurance.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Security Assurance Record

platform.hr.service.item.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Service Item Save

platform.hr.servicedesk.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Servicedesk Overview

platform.hr.shadow.compare

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shadow Compare

platform.hr.shift.add

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Add

platform.hr.shift.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Shift Assign

platform.hr.signature.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Cancel

platform.hr.signature.confirm

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature Confirm

platform.hr.signature.list

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Signature List

platform.hr.signature.request

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Signature Request

platform.hr.signin.design.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Signin Design Get

platform.hr.signin.design.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Signin Design Save

platform.hr.skill.challenge.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Skill Challenge Resolve

platform.hr.skills.infer.sweep

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Sweep

platform.hr.skills.infer.text

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Skills Infer Text

platform.hr.skills.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Skills Overview

platform.hr.skills.taxonomy.adopt

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Skills Taxonomy Adopt

platform.hr.status

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Status

platform.hr.succession.nominate

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Nominate

platform.hr.succession.open

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Succession Open

platform.hr.succession.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Succession Overview

platform.hr.swap.approve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Approve

platform.hr.swap.decline

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Swap Decline

platform.hr.sync.conflict.resolve

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Sync Conflict Resolve

platform.hr.talent.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Talent Overview

platform.hr.thread.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Delete

platform.hr.thread.dm

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Dm

platform.hr.thread.legal.hold

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Legal Hold

platform.hr.thread.outreach

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Outreach

platform.hr.thread.post

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Post

platform.hr.thread.read

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Read

platform.hr.thread.retention

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Thread Retention

platform.hr.thread.search

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Thread Search

platform.hr.threads.inbox

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Threads Inbox

platform.hr.threads.retention.sweep

Write. Scope: platform.write, admin. Contract: declared_dynamic. Hr Threads Retention Sweep

platform.hr.time.decide

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Time Decide

platform.hr.time.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Time Overview

platform.hr.title.history

Read. Scope: platform.read, admin. Contract: route_inferred. Hr Title History

platform.hr.title.record

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Title Record

platform.hr.training.requirement.save

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Training Requirement Save

platform.hr.truth.register

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Truth Register

platform.hr.turnover.run

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Turnover Run

platform.hr.verifier.verdict

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Verifier Verdict

platform.hr.wb.grant

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Grant

platform.hr.wb.identity

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Identity

platform.hr.wb.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Wb List

platform.hr.wb.read

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb Read

platform.hr.wb.state

Write. Scope: platform.write, admin. Contract: route_inferred. Hr Wb State

platform.hr.workforce.dashboard

Read. Scope: platform.read, admin. Contract: declared_dynamic. Hr Workforce Dashboard

platform.inbound.activity.feed

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Activity Feed

platform.inbound.endpoints.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Delete

platform.inbound.endpoints.list

Write. Scope: admin. Contract: route_inferred. Inbound Endpoints List

platform.inbound.endpoints.save

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Save

platform.inbound.endpoints.test

Write. Scope: platform.write, admin. Contract: route_inferred. Inbound Endpoints Test

platform.interrupted

Read. Scope: platform.read, admin. Contract: declared_dynamic. Interrupted

platform.ip.classify

Read. Scope: platform.read, admin. Contract: route_inferred. Ip Classify

platform.js.errors.clear.all

Write. Scope: platform.write, admin. Contract: declared_dynamic. Js Errors Clear All

platform.js.errors.list

Read. Scope: platform.read, admin. Contract: route_inferred. Js Errors List

platform.js.issue.assign

Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Assign

platform.js.issue.update

Write. Scope: platform.write, admin. Contract: route_inferred. Js Issue Update

platform.js.sourcemap.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Delete

platform.js.sourcemap.upload

Write. Scope: platform.write, admin. Contract: route_inferred. Js Sourcemap Upload

platform.js.sourcemaps.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Js Sourcemaps List

platform.leads

Read. Scope: platform.read, admin. Contract: route_inferred. Leads

platform.license.delete

Write. Scope: admin. Contract: declared_dynamic. License Delete

platform.license.diagnostics

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Diagnostics

platform.license.force.check

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Force Check

platform.license.preflight

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Preflight

platform.license.save

Write. Scope: admin. Contract: route_inferred. License Save

platform.license.status

Read. Scope: platform.read, admin. Contract: declared_dynamic. License Status

platform.license.verify.now

Write. Scope: platform.write, admin. Contract: declared_dynamic. License Verify Now

platform.lifecycle.evaluate

Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Evaluate

platform.lifecycle.rule.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Delete

platform.lifecycle.rule.list

Read. Scope: platform.read, admin. Contract: route_inferred. Lifecycle Rule List

platform.lifecycle.rule.save

Write. Scope: platform.write, admin. Contract: route_inferred. Lifecycle Rule Save

platform.list.assignable.sites

Read. Scope: platform.read, admin. Contract: declared_dynamic. List Assignable Sites

platform.list.network.issues

Read. Scope: platform.read, admin. Contract: declared_dynamic. List Network Issues

platform.lookup.client.full

Read. Scope: platform.read, admin. Contract: route_inferred. Lookup Client Full

platform.mark.feedback.read

Write. Scope: platform.write, admin. Contract: route_inferred. Mark Feedback Read

platform.marketplace.local.install

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Install

platform.marketplace.local.uninstall

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Local Uninstall

platform.marketplace.session.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Marketplace Session Get

platform.marketplace.session.set

Write. Scope: platform.write, admin. Contract: route_inferred. Marketplace Session Set

platform.media.ready

Read. Scope: platform.read, admin. Contract: route_inferred. Media Ready

platform.message.contact.locale

Write. Scope: platform.write, admin. Contract: route_inferred. Message Contact Locale

platform.message.outbound.convert

Write. Scope: platform.write, admin. Contract: route_inferred. Message Outbound Convert

platform.message.translate

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translate

platform.message.translation.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Delete

platform.message.translation.save

Write. Scope: platform.write, admin. Contract: route_inferred. Message Translation Save

platform.meta.channels.disconnect

Write. Scope: platform.write, admin. Contract: declared_dynamic. Meta Channels Disconnect

platform.meta.channels.switch.page

Write. Scope: platform.write, admin. Contract: route_inferred. Meta Channels Switch Page

platform.observe

Read. Scope: platform.read, admin. Contract: declared_dynamic. Observe

platform.onboarding.action

Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Action

platform.onboarding.readiness

Read. Scope: platform.read, admin. Contract: declared_dynamic. Onboarding Readiness

platform.open.network.issue

Read. Scope: platform.read, admin. Contract: declared_dynamic. Open Network Issue

platform.open.ticket

Read. Scope: platform.read, admin. Contract: route_inferred. Open Ticket

platform.operator.text.translate

Write. Scope: platform.write, admin. Contract: route_inferred. Operator Text Translate

platform.opsiq.backup.export

Read. Scope: platform.read, admin. Contract: declared_dynamic. Download a full backup in one request (retired)

platform.opsiq.backup.import

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import

platform.opsiq.backup.import.start

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Import Start

platform.opsiq.backup.job.start

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Start

platform.opsiq.backup.job.status

Write. Scope: platform.write, admin. Contract: route_inferred. Opsiq Backup Job Status

platform.outreach.campaign.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Delete

platform.outreach.campaign.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Campaign List

platform.outreach.campaign.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Save

platform.outreach.campaign.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Campaign Send

platform.outreach.compose.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Compose Send

platform.outreach.draft.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Delete

platform.outreach.draft.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Draft List

platform.outreach.draft.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Draft Save

platform.outreach.messages.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Messages Delete

platform.outreach.replies.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Replies List

platform.outreach.reply.ai

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Ai

platform.outreach.reply.mark

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Mark

platform.outreach.reply.pref

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Pref

platform.outreach.reply.send

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Send

platform.outreach.reply.thread

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Reply Thread

platform.outreach.send.detail

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Send Detail

platform.outreach.send.retry

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Send Retry

platform.outreach.sends.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Sends List

platform.outreach.template.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Delete

platform.outreach.template.list

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template List

platform.outreach.template.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Outreach Template Preview

platform.outreach.template.save

Write. Scope: platform.write, admin. Contract: route_inferred. Outreach Template Save

platform.overview

Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview

platform.overview.hub.view

Read. Scope: platform.read, admin. Contract: route_inferred. Overview Hub View

platform.overview.intelligence.graph

Read. Scope: platform.read, admin. Contract: declared_dynamic. Overview Intelligence Graph

platform.pages

Read. Scope: platform.read, admin. Contract: route_inferred. Pages

platform.paths.data

Read. Scope: platform.read, admin. Contract: route_inferred. Paths Data

platform.pause

Read. Scope: platform.read, admin. Contract: declared_dynamic. Pause

platform.profile.change.password

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Change Password

platform.profile.get

Read. Scope: platform.read, admin. Contract: route_inferred. Profile Get

platform.profile.reward.claim

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim

platform.profile.reward.claim.cancel

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Reward Claim Cancel

platform.profile.save

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Save

platform.profile.session.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Session Revoke

platform.profile.sessions.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Profile Sessions List

platform.profile.sessions.revoke.others

Write. Scope: platform.write, admin. Contract: declared_dynamic. Profile Sessions Revoke Others

platform.profile.team.dispute.file

Write. Scope: platform.write, admin. Contract: route_inferred. Profile Team Dispute File

platform.purge

Write. Scope: admin. Contract: route_inferred. Purge

platform.purge.all

Write. Scope: admin. Contract: route_inferred. Purge All

platform.realtime

Read. Scope: platform.read, admin. Contract: route_inferred. Realtime

platform.realtime.test

Write. Scope: platform.write, admin. Contract: route_inferred. Realtime Test

platform.resume

Read. Scope: platform.read, admin. Contract: declared_dynamic. Resume

platform.retention.data

Read. Scope: platform.read, admin. Contract: route_inferred. Retention Data

platform.routes.list

Read. Scope: admin. Contract: source_inferred. List every registered OpsIQ operation

platform.routes.read

Read. Scope: admin. Contract: explicit. Execute a registered read operation Required fields: route.

platform.routes.write

Write. Scope: admin. Contract: explicit. Execute a registered write operation Required fields: route, idempotency_key. Retry-safe with idempotency_key.

platform.run.ai.analysis

Write. Scope: platform.write, admin. Contract: route_inferred. Run Ai Analysis

platform.save.admin.chat.history

Write. Scope: platform.write, admin. Contract: route_inferred. Save Admin Chat History

platform.save.pwa.chat.prefs

Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Pwa Chat Prefs

platform.save.survey.config

Write. Scope: platform.write, admin. Contract: route_inferred. Save Survey Config

platform.save.widget.advanced

Write. Scope: platform.write, admin. Contract: declared_dynamic. Save Widget Advanced

platform.scim.token.issue

Read. Scope: platform.read, admin. Contract: route_inferred. Scim Token Issue

platform.scim.token.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Scim Token List

platform.scim.token.revoke

Write. Scope: platform.write, admin. Contract: route_inferred. Scim Token Revoke

platform.segment.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Delete

platform.segment.list

Read. Scope: platform.read, admin. Contract: route_inferred. Segment List

platform.segment.members

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Members

platform.segment.preview

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Preview

platform.segment.save

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Save

platform.segment.suggestion.accept

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Accept

platform.segment.suggestion.dismiss

Write. Scope: platform.write, admin. Contract: route_inferred. Segment Suggestion Dismiss

platform.segment.suggestion.list

Read. Scope: platform.read, admin. Contract: route_inferred. Segment Suggestion List

platform.send.campaign

Write. Scope: platform.write, admin. Contract: route_inferred. Send Campaign

platform.send.client.email

Write. Scope: platform.write, admin. Contract: route_inferred. Send Client Email

platform.send.ticket.reply

Write. Scope: platform.write, admin. Contract: route_inferred. Send Ticket Reply

platform.service.studio.get

Read. Scope: platform.read, admin. Contract: declared_dynamic. Service Studio Get

platform.set.active.site

Write. Scope: platform.write, admin. Contract: route_inferred. Set Active Site

platform.silence

Read. Scope: platform.read, admin. Contract: declared_dynamic. Silence

platform.site.set.group

Write. Scope: platform.write, admin. Contract: route_inferred. Site Set Group

platform.sites.add

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Add

platform.sites.edit

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Edit

platform.sites.list

Write. Scope: platform.write, admin. Contract: route_inferred. Sites List

platform.sites.picker

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Picker

platform.sites.regenerate.secret

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Regenerate Secret

platform.sites.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Sites Remove

platform.stats

Read. Scope: platform.read, admin. Contract: declared_dynamic. Stats

platform.stepup.verify

Write. Scope: platform.write, admin. Contract: declared_dynamic. Stepup Verify

platform.submit.agent.ai.feedback

Write. Scope: platform.write, admin. Contract: route_inferred. Submit Agent Ai Feedback

platform.submit.triage.feedback

Write. Scope: platform.write, admin. Contract: route_inferred. Submit Triage Feedback

platform.takeover

Read. Scope: platform.read, admin. Contract: declared_dynamic. Takeover

platform.terminate

Read. Scope: platform.read, admin. Contract: route_inferred. Terminate

platform.test.geoip

Read. Scope: platform.read, admin. Contract: route_inferred. Test Geoip

platform.top.pages

Read. Scope: platform.read, admin. Contract: route_inferred. Top Pages

platform.train.client.chat.knowledge

Write. Scope: platform.write, admin. Contract: route_inferred. Train Client Chat Knowledge

platform.triggers

Read. Scope: platform.read, admin. Contract: declared_dynamic. Triggers

platform.trust.evidence.report

Write. Scope: platform.write, admin. Contract: declared_dynamic. Trust Evidence Report

platform.turn.pool.add

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Add

platform.turn.pool.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Turn Pool List

platform.turn.pool.pick.test

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Pick Test

platform.turn.pool.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Remove

platform.turn.pool.update

Write. Scope: platform.write, admin. Contract: route_inferred. Turn Pool Update

platform.update.lead.status

Write. Scope: platform.write, admin. Contract: route_inferred. Update Lead Status

platform.wa.embedded.signup.exchange

Write. Scope: platform.write, admin. Contract: route_inferred. Wa Embedded Signup Exchange

platform.warehouse.export.run

Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Export Run

platform.warehouse.exports.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Warehouse Exports List

platform.webhook.deliveries.list

Read. Scope: platform.read, admin. Contract: route_inferred. Webhook Deliveries List

platform.webhook.endpoint.delete

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Delete

platform.webhook.endpoint.list

Read. Scope: platform.read, admin. Contract: declared_dynamic. Webhook Endpoint List

platform.webhook.endpoint.save

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Save

platform.webhook.endpoint.test

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Endpoint Test

platform.webhook.redeliver

Write. Scope: platform.write, admin. Contract: route_inferred. Webhook Redeliver

platform.weekly.digest.view

Read. Scope: platform.read, admin. Contract: route_inferred. Weekly Digest View

platform.whmcs.op.dispatch

Read. Scope: platform.read, admin. Contract: declared_dynamic. Whmcs Op Dispatch

platform.workspace.custom.domain.remove

Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Remove

platform.workspace.custom.domain.set

Write. Scope: platform.write, admin. Contract: route_inferred. Workspace Custom Domain Set

platform.writing.json.knowledge.clear

Write. Scope: platform.write, admin. Contract: declared_dynamic. Writing Json Knowledge Clear

platform.writing.json.knowledge.count

Read. Scope: platform.read, admin. Contract: declared_dynamic. Writing Json Knowledge Count

platform.writing.json.knowledge.import

Write. Scope: platform.write, admin. Contract: route_inferred. Writing Json Knowledge Import

portal_studio (169)

portal_studio.accessibility.evidence.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Accessibility Evidence Save

portal_studio.add

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Add

portal_studio.allocate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Subdomain Allocate

portal_studio.analytics.breakdown

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Breakdown

portal_studio.analytics.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Analytics Load

portal_studio.apply.kit

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Apply Kit

portal_studio.apply.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Apply Theme

portal_studio.approval

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Approval

portal_studio.approve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Approve

portal_studio.ask

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Ask

portal_studio.audience.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Delete

portal_studio.audience.explain

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Explain

portal_studio.audience.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience List

portal_studio.audience.preview

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Audience Preview

portal_studio.audience.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Audience Save

portal_studio.brand.generate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Generate

portal_studio.brand.import

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Brand Import

portal_studio.cancel.schedule

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Cancel Schedule

portal_studio.certify

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Certify

portal_studio.check

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Host Check

portal_studio.check.route.portal.subdomain.check

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Subdomain Check

portal_studio.comment.add

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Add

portal_studio.comment.resolve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Comment Resolve

portal_studio.component.package.inspect

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Package Inspect

portal_studio.component.package.install

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Component Package Install

portal_studio.component.validate

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Component Validate

portal_studio.config

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Handoff Config

portal_studio.data.resolve

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Data Resolve

portal_studio.delete.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Delete Theme

portal_studio.developer.contract

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Developer Contract

portal_studio.discovery.preview

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Discovery Preview

portal_studio.discovery.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Discovery Save

portal_studio.document.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Load

portal_studio.document.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Save

portal_studio.experiment.control

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Control

portal_studio.experiment.results

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiment Results

portal_studio.experiment.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Experiment Save

portal_studio.experiments.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Experiments List

portal_studio.form.archive

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Archive

portal_studio.form.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Form Catalog

portal_studio.form.create

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Create

portal_studio.form.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Delete

portal_studio.form.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Duplicate

portal_studio.form.evaluate

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Evaluate

portal_studio.form.group.apply

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Apply

portal_studio.form.group.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Delete

portal_studio.form.group.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Group Save

portal_studio.form.publish

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Publish

portal_studio.form.restore

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Form Restore

portal_studio.form.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Save

portal_studio.form.template

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Template

portal_studio.form.test

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Form Test

portal_studio.form.version.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Form Version Restore

portal_studio.history

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design History

portal_studio.identity.discover

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Discover

portal_studio.identity.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Identity Load

portal_studio.identity.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Identity Save

portal_studio.integration.activate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Activate

portal_studio.integration.install

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Install

portal_studio.integration.kill.switch

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Kill Switch

portal_studio.integration.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration List

portal_studio.integration.policy

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Integration Policy

portal_studio.integration.policy.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Integration Policy Save

portal_studio.integration.preflight

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Preflight

portal_studio.integration.revise

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Revise

portal_studio.integration.rollback

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Rollback

portal_studio.integration.transition

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Integration Transition

portal_studio.journey.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Archive

portal_studio.journey.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Journey Catalog

portal_studio.journey.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Delete

portal_studio.journey.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Duplicate

portal_studio.journey.evaluate

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Studio Journey Evaluate

portal_studio.journey.instantiate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Instantiate

portal_studio.journey.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Restore

portal_studio.journey.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Journey Save

portal_studio.kb.category.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Delete

portal_studio.kb.category.reorder

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Category Reorder

portal_studio.kb.category.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Category Save

portal_studio.kb.governance

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Governance

portal_studio.kb.governance.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Kb Governance Save

portal_studio.kb.languages

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Languages

portal_studio.kb.languages.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Languages Save

portal_studio.kb.parity

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Parity

portal_studio.kb.search.tuning

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning

portal_studio.kb.search.tuning.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Kb Search Tuning Save

portal_studio.kb.tree

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Kb Tree

portal_studio.knowledge.summary

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Knowledge Summary

portal_studio.list

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain List

portal_studio.load

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Analytics Load

portal_studio.load.route.portal.design.load

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Design Load

portal_studio.load.route.portal.form.load

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Form Load

portal_studio.lock

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Lock

portal_studio.migration.apply

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Apply

portal_studio.migration.approve

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Approve

portal_studio.migration.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration List

portal_studio.migration.reconcile

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Reconcile

portal_studio.migration.report

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Migration Report

portal_studio.migration.rollback

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollback

portal_studio.migration.rollout

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Rollout

portal_studio.migration.start

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Migration Start

portal_studio.node.add

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Add

portal_studio.node.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Delete

portal_studio.node.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Duplicate

portal_studio.node.move

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Move

portal_studio.node.update

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Node Update

portal_studio.operations.control

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Control

portal_studio.operations.feed

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Feed

portal_studio.operations.record

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Operations Record

portal_studio.operations.summary

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Operations Summary

portal_studio.org.context

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Context

portal_studio.org.member.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Org Member Save

portal_studio.org.members

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Members

portal_studio.org.requests

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Org Requests

portal_studio.page.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Archive

portal_studio.page.create

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Create

portal_studio.page.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Delete

portal_studio.page.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Duplicate

portal_studio.page.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Restore

portal_studio.page.update

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Page Update

portal_studio.parity.accept

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Accept

portal_studio.parity.capture

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Capture

portal_studio.parity.compare

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Compare

portal_studio.parity.create

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Parity Create

portal_studio.parity.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Parity List

portal_studio.personalization.delete

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Delete

portal_studio.personalization.list

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Personalization List

portal_studio.personalization.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Personalization Save

portal_studio.presence

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Presence

portal_studio.preview

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Preview

portal_studio.preview.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Preview Catalog

portal_studio.publish

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Publish

portal_studio.quality

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Quality

portal_studio.redirect.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Delete

portal_studio.redirect.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Redirect Save

portal_studio.release.diff

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Release Diff

portal_studio.release.evidence

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Release Evidence

portal_studio.release.history

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Release History

portal_studio.release.publish

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Publish

portal_studio.release.rollback

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Rollback

portal_studio.release.schedule

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule

portal_studio.remove

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Domain Remove

portal_studio.request.changes

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Request Changes

portal_studio.restore.field

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Restore Field

portal_studio.restore.published

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Restore Published

portal_studio.revert

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Design Revert

portal_studio.review

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Review

portal_studio.review.link

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Review Link

portal_studio.rollback

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Rollback

portal_studio.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save

portal_studio.save.route.portal.form.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Form Save

portal_studio.save.theme

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Save Theme

portal_studio.saved.section.delete

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Delete

portal_studio.saved.section.instantiate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Instantiate

portal_studio.saved.section.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Saved Section Save

portal_studio.schedule

Read. Scope: portal_studio.read, admin. Contract: route_inferred. Portal Design Schedule

portal_studio.schedule.cancel

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Schedule Cancel

portal_studio.scim.config

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Scim Config

portal_studio.service.archive

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Archive

portal_studio.service.catalog

Read. Scope: portal_studio.read, admin. Contract: declared_dynamic. Portal Studio Service Catalog

portal_studio.service.duplicate

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Duplicate

portal_studio.service.reorder

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Reorder

portal_studio.service.restore

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Restore

portal_studio.service.save

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Save

portal_studio.service.template

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Studio Service Template

portal_studio.sign.in.flow.save

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Sign In Flow Save

portal_studio.signin.methods

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Design Signin Methods

portal_studio.test.link

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Handoff Test Link

portal_studio.unlock

Write. Scope: portal_studio.write, admin. Contract: declared_dynamic. Portal Studio Unlock

portal_studio.upload

Write. Scope: portal_studio.write, admin. Contract: route_inferred. Portal Image Upload

sales (14)

sales.ai.insight

Write. Scope: sales.write, admin. Contract: route_inferred. Sales Ai Insight

sales.analyze

Write. Scope: sales.write, analytics.write, admin. Contract: route_inferred. Analyze sales with AI

sales.chart

Write. Scope: sales.write, admin. Contract: route_inferred. Sales Chart

sales.compare

Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. Compare sales periods

sales.compare.route.sales.compare

Read. Scope: sales.read, admin. Contract: route_inferred. Sales Compare

sales.goal.delete

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Delete

sales.goal.list

Read. Scope: sales.read, admin. Contract: route_inferred. Conversion Goal List

sales.goal.save

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Goal Save

sales.list

Read. Scope: sales.read, analytics.read, admin. Contract: route_inferred. List sales and conversions

sales.list.route.conversion.list

Read. Scope: sales.read, admin. Contract: route_inferred. Conversion List

sales.record

Write. Scope: sales.write, admin. Contract: route_inferred. Conversion Record

sales.stats

Read. Scope: sales.read, analytics.read, admin. Contract: declared_dynamic. Read sales statistics

sales.stats.route.sales.stats

Read. Scope: sales.read, admin. Contract: declared_dynamic. Sales Stats

sales.table

Read. Scope: sales.read, admin. Contract: route_inferred. Sales Table

Säkerhetssäkerhet (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

statusstatus (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.

undersökningar (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 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

Biljetter (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

skriva (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.

Är OpenAPI och Postman tillgänglig?+

Den genererade OpenAPI 3.0 Dokumentet är på /api/v1/openapi.php, Den genererade Postman-kollektionen är på /api/v1/postman.php, och de mänskliga läsbara utvecklarnas docs är på /api/docs/.

Hur jobbar jag med mer än ett arbetsutrymme?+

Skicka Site_key i förfrågan kroppen att välja en arbetsyta. En nyckel utfärdad för ett arbetsutrymme stannar fast på det; en nyckel med admin sammanhang kan välja vilken arbetsyt som är tillåtet att se, och vägras för någon det inte är.

Vilka åtgärder kan ett lättsamt nyckelsamtal?+

Alla åtgärder som markeras som en läs. Ställ in behörighetsläget på nyckeln till read_only och varje skriv vägras med read_ only_key, så en rapportering integration kan inte ändra något även av misstag.

Varför fick jag inte_found för något som jag kan se i admin?+

Nyckeln är räckvidd till en arbetsyta. Records i andra arbetsplatser returnerar inte_found snarare än ett behörighetsfel, så att API bekräftar aldrig om något finns någon annanstans.

Utvecklare

Säkerhet API

Ett säkerhetskontrakt för varje kontakt och integration: fråga OpsIQ Vad det vet om en IP eller sändare, och mata tillbaka missbruket ditt eget system ser.

OpsIQ redan försvarar sig själv: IP brandvägg blockerar angripare, biljettpipelinefilter spam, och säkerhets AI klassificerar brottslingar och föreslår blockregler. API öppnar den intelligensen för dina andra system. En faktureringsplattform, en kundportal eller en anpassad app kan kontrollera en besökare innan du litar på det och rapportera vad den observerade så att hela installationen lär sig från varje yta.

Vad du kan göra

Kontrollera innan du litar på

security. check svarar med brandväggen tillstånd, någon spam regel matchande avsändaren och cachade AI dom för IP. Ett samtal, en konsoliderad åsikt.

Rapportera vad du såg

security.report registrerar observationen som ett säkerhetsevenemang, har säkerhets-AI klassificera IP genast, och varnar administratörerna när domen kommer tillbaka hög risk. Upprepade rapporter kluster in i incidenter, precis som attacker OpsIQ ser direkt.

Dela spam regler

security. blocklist. add och security. Blocklist . list läsa och skriva samma spam regler Tickets sidan använder, så en avsändare blockerad i ett system är blockerat överallt.

Rapportera missbruk från en kontakt
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"
}

Scopes och säkerhet

security.read

Behövs för security. check och security. blocklist. list. se. Säkert att ge en rapportering integration.

security.write

Behövs för security. report och security. blocklist. add. Ge det endast till system som du vill ha matningsregler och rapporter i.

Ingenting förstörs tyst

En blocklistad avsändare landar fortfarande i spamvyn där biljetten kan läsas och återställas.

Plattformen skyddar sig själv

Serverns egen IP adresser kan aldrig blockeras, blocklistas eller rapporteras genom denna. API, så att en felkonfigurerad integration inte kan ta ner plattformen.

💡
Mint en nyckel under Integrations, sedan API Keys och ge den endast de säkerhetsomfattningar som behövs. Det fullständiga förfrågan kontraktet för varje åtgärd är i meta. actions och OpenAPI dokumentet.
Använder mina befintliga kontakter detta automatiskt?+

Utgående synkronisering är redan automatisk: när du blockerar en IP Anslutna plattformar berättas via kontaktsäkerhet synkronisera. Säkerheten API är den inkommande halvan. Peka din anslutning eller anpassad kod på dessa fyra åtgärder med en nyckel som bär säkerhetsomfattningarna.

Var bor spamreglerna?+

En butik. Biljettsidan Block-sändarekontroll, spam AI i Inställningar och detta API Alla arbetar mot samma blocklista, så det finns exakt en plats att titta på.

Utvecklare

Evenemang API

Skicka anpassade händelser från din server eller webbplats till OpsIQ för analyser, experiment, CRM triggers och webhook förhållanden.

Hur det fungerar
Evenemang APIEtt spår() samtal skicka en anpassad demo_booked händelse till OpsIQ, som matar omvandlingsmål, segment och triggers.OpsIQ. track("demo_booked", {värde: 0Plan: "pro"});KonverteringsmålSegmentUtlösare och webhookarWebbläsare (OpsIQ.track) eller server-side POST /v1/events
Evenemang API

Webbläsar-side händelser

Webbläsarhändelsespårning
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "button_clicked", {
  button: "signup",
  page: "/pricing",
  variant: "green"
}]);

Server-side händelser

Server-side, rekordaktiviteter och konverteringar mot en kontakt genom åtgärden API Använd crm.activities.record för livscykel/affärsaktivitet och crm.conversions.record För omvandlingar. Det finns ingen events.send handling; den inkommande CRM-händelsens mottagare lever på /v1/inbound.php?t=<token> för tredjepartssystem som driver händelser i.

Server-side aktivitet (action API)
POST /api/v1.php
Authorization: Bearer opq_your_key
Content-Type: application/json

{
  "action": "crm.activities.record",
  "site_key": "site_abc123",
  "email": "[email protected]",
  "event": "subscription.upgraded",
  "value": 50,
  "currency": "USD"
}

Namnkonvention

Dot Notation

"order. completed" inte "ordersCompleted".

Tidigare spänd

"button. clicked" inte "butt. clogg".

Var specifik

"pricing. plan_selected" inte "user_action".

Utvecklare

Hur data strömmar genom OpsIQ

Att förstå dataflödet hjälper dig att debug integrationer och optimera prestanda.

Hur det fungerar
Hur dataflödenDataflöden från widgeten och beacon in OpsIQ Kärna (CDP, identitetsgraf, AI-hjärna, analys, CRM) sedan ut via webhooks och REST API.Widgetoch beaconOpsIQ kärnaCDP · IdentitetsgrafAI hjärnaAnalytics · CRMWebhooks utREST API_
Dataflöde

Inkommande dataflöde

1
Widget Beacon

Den är JavaScript widget skickar sidvisningar, klick och chattmeddelanden till /beacon.php.

2
Event Ingestion

Evenemang som lagras i opsiq_events med Site_key, eventtyp, kund och egenskaper.

3
Session församling

Session byggare grupper sidvisningar i sessioner (via cron).

4
Identitetsupplösning

När identifierade är anonyma register kopplade till kundprofilen.

5
Synkronisering av anslutning

Connectors drar data från externa plattformar och lagrar i kontaktcache.

6
AI-kontext

AI samlar sammanhang från: besökarens historia, kundprofil, kontaktdata, KB och snabb.

Outbound Data flow

1
Event Brands

Interna händelsebränder (ticket. created, chat. message, order. completed).

2
Jobbkö

Event placerad i asynkroniseringsjobbet.

3
Webhook-sändning

Dispatcher-tecken och skickar till alla prenumererade slutpunkter.

4
Försök på misslyckande

Misslyckade leveranser hämtade med exponentiell backoff.

Inställningar

Inställningar referens

Inställningar är kontrollcentret för en arbetsyta. Allt nedan är omfattad till den arbetsplats du befinner dig i, så ett konto kan köra flera varumärken med olika identiteter, chattbeteende och lagringsregler.

Hitta en inställning

Det finns cirka sex hundra individuella kontroller i Inställningar, spridda över elva flikar grupperade under fyra menyer. Du förväntas inte bläddra för dem.

Sökinställningar (Ctrl + K)

Tryck på Ctrl + K, eller Cmd + K på en Mac, var som helst på inställningar sidan. Skriv i enkla ord och tryck på Enter för att hoppa direkt till kontrollen. Sök tolererar små typos och förstår relaterade ord, så schemaläggaren finner Cron och sekretess hittar spårningskontrollerna. Det visar bara inställningar din roll kan öppna.

Workspace och plan

General och Licens.

AI och kundsupport

Admin AI Assistant, Client Chat, OpsIQ Skriva och stödja Portal.

Data och styrning

Spårning och integritet, behörigheter och säkerhet.

Systemsystem

Cron Setup (endast värd) och Danger Zone.

Spara

Varje flik sparar på egen hand med sin egen Spara-knapp. Kundchatt och OpsIQ Skriva stift sina till skärmen. Spara innan du byter flikar; förändringar sker inte över.

Djupa länkar

Den aktiva fliken är skriven i sidan adress, så en flik kan bokmärkas eller skickas till en kollega.

Allmänt: Business Identity

Det viktigaste kortet på sidan. AI läser dessa värden på varje svar, rapport och daglig kort.

Företagsnamn

Används i AI-rapporter, dagliga kort och kundanpassade ordalydelse. Matcha din webbplatsfot.

Företagsindustrin

Tailors AI-analys, lead scoring, briefs och undersökningsförinställningar. Välj från webbhotell, e-handel, SaaS, fastigheter, byrå, konsultation, hälsovård, utbildning, ekonomi eller allmän verksamhet.

Systemspråk

Det språk som visas för alla som inte har valt sina egna. Varje agent kan åsidosätta det i sin profil.

Använd webbläsarspråk

Visar inloggningssidan på besökarnas eget språk. När någon väljer ett språk där vinner deras val och det här åsidosätter aldrig det.

Systemtidszon

Zonen hela systemet körs in: datum, rapporter, scheman och bakgrundskronan. Använd din operationstidszon, inte dina kunder.

General: GeoIP och spårning

GeoIP2 Databasväg

Full väg till GeoLite2-City.mmdb. Auto-detekter på första belastning över cPanel, Plesk, DirectAdmin, Cloudways, Docker och vanlig Linux eller Windows. Add GeoLite2-ASN.mmdb i samma mapp för besökarens internetleverantör.

Geo Källa läge

GeoLite2 endast, Geolit2 med en Cloudflare fallback, eller Cloudflare Bara.Cloudflare lägen kräver att webbplatsen ska vara proxied genom Cloudflare, med besökare plats rubriker som är aktiverade för stad och region detalj.

Sessionens timeout (s)

Inaktivitet innan en besökare session anses vara klar. 14400 som är fyra timmar.

Uppdateringsintervall (s)

Hur ofta Live Feed uppdateringar. Default 30 sekunder.

Aktivt tröskelvärde (min)

Hur länge en besökare räknas som levande efter sin sista sida belastning. Standard 2 minuter. Detta är Live Feed drop-off, inte sessionen längd.

Datalagring (dagar)

Rader samlade och genererade poster förbi denna ålder: analys, chatt, biljetter, feedback, transaktioner, AI-telemetri, integrationsloggar och CRM-aktivitet. 0 Håller allt för alltid. Inställningar, författad innehåll och samtycke kvitton tas aldrig bort.

När en chatt raderas

Väljer hur mycket av en raderad konversation som finns på rekord: hela posten, rekordet utan samtalet eller poängen bara. Ta bort alltid döljer chatten från inkorgen och besökarens historia. Schemalagd lagring och Glöm besökaren raderar alltid i sin helhet oavsett detta.

Track bot trafik

Räknar krypskyttar som besökare. Lämna av; det blåser upp besökare räknar och snedar varje rapport.

Feedback-undersökning popup aktiverad

Visar webbplatsen-wide feedback widget till besökare. Separat från chattundersökningarna under kundchatt, Support Flow.

General: AI-funktioner

Master växlar för varje AI-yta. Allt standard till på och spara per arbetsyta

AI Triage på biljetter

Klassificerar varje biljett efter kategori, prioritet och känsla och skriver en tråd sammanfattning högst upp på biljetten.

AI Triage Hover sammanfattning

Visar triage taggar och sammanfattning i ett verktygs tips när en agent hoppar en rad i biljettlistan. Kräver AI Triage.

Inbox Copilot (kompositör)

Lägger till Draft AI-svar, Warmer, Shorter, More formella och ursäktande knappar under biljettens svarrutan. Ingenting skickar utan agenten.

Fråga-OpsIQ Copilot

Sidan-medvetna flytande kopilot på varje admin sida. Vet vilken kund, faktura eller biljett är öppen.

Morgon kort

Vid första öppna varje dag presenterar kopiloten brådskande biljetter, försenade svar och vänte chattar. söndagar producerar en vecka i granskning.

General: Pengar, branding, backup

OpsIQ basvaluta

Varje penningsumma i admin omvandlas till denna valuta för displayen. Connectors lagrar sin egen källvaluta; sätt den per kontakt.

Auto-synkronisera FX priser

Refreshes priser var sjätte timme från ett gratis offentligt foder utan API -nyckel. Du kan lägga till manuella priser som åsidosätter fodret. Med autosynkronisering av, är valutor utan manuell ränta lämnas oomvandlade.

Aktivera Commerce och Billing-funktioner

Fartyg av. Stänga på avslöjar sidan Försäljning och omvandlingar, instrumentpanelens intäktskort och Live Intelligence Feed. Med det är varje prisyta dold och sidan Sales lämnar menyn.

Handel vokabulär

Lär dig OpsIQ din lydelse: om du gör förnyelser, ordet för förnyelse, vad du säljer och vilka köpare kallas.

Branding och Logos

Två uppladdningar, en för ljus bakgrunder (admin sidebar) och en för mörk (sign-in sida). PNG, JPG, WebP eller SVG upp till 3 MB.

Webbplatsintelligensagent, tillåta privata SSH -mål

Auto-Implement SEO-agenten ansluter över SSH Privata, loopback- och reserverade adresser blockeras som standard som en anti-SSRF-åtgärd. aktivera endast på självvärderade installationer som måste nå en lokal server.

OpsIQ Backup / Återställ

Exporterar varje inställning och OpsIQ-ägt bord plus uppladdade filer. Återställ ersätter OpsIQ endast konfiguration och poster; det rör aldrig kunder, fakturor, biljetter, tjänster, domäner, order eller transaktioner.

⚠️
Ta en säkerhetskopia innan du använder något i farazonen. Backup bor i allmänhet och raderingsåtgärderna lever i farozonen, så det är lätt att nå ta bort knappen utan att ha exporterat först.
Inställningar

Inställningar: Säkerhet

Skydd för admin-tecknet, dina personalkonton och data OpsIQ samlar in. Kundskylten för supportportalen är konfigurerad separat.

Inloggningsskydd

Google reCAPTCHA_

Stops bots och credential fyllning på admin inloggningen. Välj v3 (osynlig, poäng) eller v2 (checkbox), ställa in v3 poäng tröskeln och leverera webbplatsen och hemliga nycklar. Dessa samma nycklarna återanvänds av supportportal begäran form.

Misslyckad login auto-Lockout

Blockerar en adress efter ett antal misslyckanden inom ett fönster, för ett antal timmar. Du kan anpassa låst sida meddelande och visa en liten vänte-skärm distraktion.

Logga in Härdning

Lösenordspolicy med en lägsta längd, avslag på lösenord som finns i kända överträdelser, per-konto lockout mot referensfyllning, obligatorisk tvåfaktor för varje admin, återinträde lösenord innan farliga åtgärder och nybörjare inloggningsvarningar.

Enkel sign-on (OIDC)

Personal inloggning genom din identitetsleverantör. Needs emittent URL Klient-ID och klienthemlighet. Auto-provision domäner, en per rad, skapar användare automatiskt vid första inloggningen.

Single Sign-On (engelska)SAML 2.0)

För leverantörer som talar SAML. OpsIQ Tillbehör ACS svar URL och SP-enhet ID; du levererar IdP-ettitets-ID, inloggning URL valfri sign-out URL och X.509 signeringscertifikat. E-post och namnegenskaper behövs endast för icke-standardatributnamn.

SCIM Provisionering

Directory-driven skapande, uppdatering och deaktivering av OpsIQ konton.OpsIQ förnödenheter SCIM basen bas URL; du genererar märkta tokens här så att man kan återkallas utan att bryta resten.

Hot, blockering och samling

Tillåtelselista för utgående utgång

Begränsningar som externa värdar denna arbetsyta kontakter kan ringa. följeslagare till SSH målkontroll i allmänhet.

Hot Scoring och Auto-Block

Blockerar en besökare när deras hotresultat passerar ditt tröskelvärde. 0 Inaktivera den. Titta på sidan för säkerhetsöversikt i en vecka innan du väljer ett nummer.

Blockera sidmeddelande

Meddelandet som en blockerad besökare ser, som vanlig text eller din egen anpassade blockskärm för HTML.

Core Web Vitals från riktiga besökare

Mäter LCP, INP och CLS från riktiga sessioner.

Batchleverans av händelser som kan försökas om

Anpassade händelser kö i webbläsaren och leverera i partier med retries, minska förlust på dåliga mobilanslutningar.

Signerad spårning Beacons

Real widget bäddar bär en roterande kryptografiska token så smidda spårningsdata kan avvisas. Av som standard; möjliggör ändringar hur inbäddade autentiserar, så testa först.

Säkerhetsvarningar

Av som standard. Detektion och blockering körs oavsett. Detta kort styr om du får veta, och hur mycket AI hjälper.

Aktivera säkerhetsvarningar

Master switch för detta kort.

Failed-login våg tröskel

Hur många misslyckade inloggningar på en kort period räknas som en våg värt att varna.

IP Anseende Intelligens

Lägger till ett hotresultat för besökare som förekommer i offentliga missbruksflöden.

Site Watch

Timme Uptime och TLS utgångskontroller, varning innan ett certifikat varar.

AI säkerhetsanalytiker och AI incident briefs

Lägger till en förklarande dom till misstänkt aktivitet och grupper relaterade attacker i en enda läsbar händelse snarare än en ström av händelser.

Politisk autopilot

Agerar på egen hand, vänder vad det lär sig från en incident till en föreslagen eller tillämpad regel. Lämna av tills du har granskat sina förslag och håller med dem.

Daglig säkerhet smälter och veckovis hållning rådgivare

En daglig recap på sidan Säkerhetsöversikt och en veckovis härdningskontroll som visar vad som är skyddat och vad som fortfarande är öppet.

Auto-expire stale förslag

En föreslagen blockregel du aldrig agerat på utgångar i sig själv istället för att samla.

DOM Session Replay

Aktivera DOM session replay

Register besökarsessioner för uppspelning. När det inte är laddat av replay-biblioteket, så det finns ingen kostnad att lämna det. Inspelningar provas och sekretessmaskeras, och ses på Session Replay sidan under Analytics.

Provfrekvens, max capture, retention

Vilken del av sessioner att spela in, hur länge en enda inspelning kan köras och hur många dagar inspelningar hålls.

⚠️
Session replay registrerar riktiga människor som använder din webbplats. Håll provfrekvensen och lagringen så lågt som fortfarande kommer att svara på din fråga, och avslöja den i ditt integritetsmeddelande.
Inställningar

Inställningar: Spårning och integritet

Vad är vad OpsIQ kan samla in, och hur länge varje typ av rekord överlever.

Exklusioner

Exkluderad IPs och CIDR Ranges

Adresser spåras aldrig, en per rad, exakta adresser eller CIDR-sortiment. Det renaste sättet att hålla ditt eget team ur din analys, eftersom det täcker alla på den adressen snarare än bara inloggade administratörer.

Exkluderade URL Vägar

Sidmönster spåras aldrig, en per rad, wildcards med en asterisk. /admin/* Håller hela back office ur besökarens logga.

Datalagringspolicy

Per-subsystem auto-purge i dagar. Separat från den övergripande datalagring inställningen i allmänhet och från Danger Zone rensning.

AI interaktion loggar

Förtroende telemetri som håller korta förhandsvisningar om frågan och svar. Default 90 dagar. Detta har den mest kundtext, så förkorta det först när du skärper integriteten.

AI-användningshändelser

Per-call token räknas för kostnadsrapportering. 90 dagar. nummer endast, inget meddelandeinnehåll

Åtgärdsrevisionsled

Den dumper-evidenta åtgärd och säkerhetslogg. Default 365 dagar. Håll detta längst; det är ditt bevisspår.

Diagnostik

Systemhälsorekord. Standard 30 dagar.

Osvarliga frågor

Kluster av frågor som AI inte kunde svara. 90 Dagar. Arbeta igenom dem på frågor som AI missade sidan innan de löper ut.

Watchdogs och export

Metriska avvikelsevarningar

Daglig jämförelse av gårdagen mot den senaste baslinjen, varnar när ett metriskt rör sig mer än ditt tröskelvärde. 35 procent. av som standard.

Lagerexport

Nattdumpar av sessioner, besökare, sidvisningar och relaterade tabeller för din egen BI-stack, i ett format du väljer, hålls under ett antal dagar.

Inställningar

Inställningar: Admin AI Assistant

Den flytande assistenten din personal använder inuti admin, med levande läs tillgång till kunder, fakturor, biljetter, servrar och cron loggar. En annan assistent från kund-facing en under Kundchatt.

Aktivera OpsIQ AI Widget

Visar assistentknappen på varje admin sida. Off döljer den för alla.

Layout och beteende

Hörnposition, panelbredd (320 att 600 px), max höjd (400 att 900 px), hörn radie (0att 24), teckenstorlek och en frostad glassudd bakom panelen.

Visa snabba chips

En-klicka på genvägsknappar under rubriken. Det snabbaste sättet för de flesta anställda.

Visa modellinformation

Visar vilken modell som svarade och hur lång tid det tog. Användbar medan stämning kostar, buller för daglig användning.

Per-admin åtkomst gate

Visar bara assistenten till en inloggad admin vars användarnamn och e-post matchar båda ett OpsIQ agent som tilldelats denna arbetsyta. Ägare passerar alltid. Använd knappen Kontrollera min åtkomst innan du aktiverar eller du kan låsa ditt eget team ut.

AI Persona

Visa namn, rubriktaglin och ett anpassat välkomstmeddelande som visas när panelen öppnas.

Smarta Quick-Action Chips

Redigera etiketten och underliggande prompt för varje genväg, lägga till din egen eller återställning till standarder. Etikett är vad personal ser, snabben är vad AI får.

Färger och form

Chip form (piller, rundade, kvadrat), chip färger, kort tema och launcher form (runda, ekorre, kvadratisk) med en levande förhandsvisning.

Konversation minne

Assistenten kommer ihåg varje personhistorik över webbläsarsessioner, upp till 120 -meddelanden, lagrade i din egen databas. Rensa det att börja färska.

Inställningar

Inställningar: Kundchatt

Chatten widget dina kunder använder, och det största området av Inställningar. Six-undertabs, med huvudbrytaren och Save stiftade till toppen av fliken.

Arbeta genom underflikarna för att installera en ny: Identitet och kopia, utseende, beteende, supportflöde, kunskapsutbildning. Avancerad är infrastruktur och kan vänta.

Identitet och kopia

Varumärkesidentitet och varumärkesstrategi

Widget namn, tagline, AI-namn, det namn som används för system och tomt meddelanden, och hur agentnamn visas. Agent Name Source beslutar mellan riktiga namn, ett anpassat namn eller en lagetikett.

In-Chat Hälsning

Två hälsningar, en för alla besökare och en för identifierade besökare. En fråga börjar mer samtal än ett uttalande.

Popup Teaser

Det flytande budskapet innan chatten öppnas, med sitt eget namn, teckenstorlek och färger. AI kan skriva teasers, med kontroller för hur många som ska generera, hur många att visa per besök och klyftan mellan dem.

Prompts och Handoff

Det fullständiga skriptet: be om ett namn och e-post, bekräftelser, begär en människa, inga agenter tillgängliga, biljett skapad eller avbokad, handoff i väntan. Runt två dussin enskilda rader i en hopfällbar panel.

Status och Idle Notices

Tre kundsynliga meddelanden: agenten stänger chatten, besökare har gått tyst och agent händer tillbaka till AI. Undvik interna ordalydelser som löst eller triaged.

Kompositör och förslag

Input placeholder, talk-to-a-human knappetiketten och de föreslagna öppningsfrågorna. Tre bra förslag avböjer fler biljetter än en sida med artiklar.

Launcher, Icon och Avatars

Launcher ikon, en valfri annan ikon när öppen, launcher storlek och bilder för den mänskliga agenten och AI.

Utseende

Tema och glas

Temaläge, en premium färg förinställd, suddighet och osäkerhet, plus växlar för animationer, separatorlinjer, gömmer status raden, döljer meddelandekortet och gömma den nära knappen. Börja med en förinställning; det sätter dussintals färger samtidigt.

Huvudfärger

Lansering, header, hjälp panel, länkar, knappar, systemmeddelanden och kompositör, var och en med start- och slutfärg för gradienter. Ett standardglasalternativ ignorerar dessa och håller den transparenta finishen.

Panel, Bubbles och Chips

Omkring trettio plockare som täcker panelen, gränsen, texten, ingångsområdet och varje bubbeltyp (besökare, AI, agent, typning, system) plus förslag chips och deras svävarstatus. Öppna bara detta för exakt matchning av varumärket och kontrollera kontrast på bubbla text.

Layout och Shape

Panelbredd och höjd, hörnradie, teckenstorlek, skärmposition, launcher form, bubbelstil och om avatarer visar. Testa bredden på en telefon.

Beteende

AI svarar automatiskt

Mästaren växlar för AI svar. Av betyder att varje meddelande väntar på en människa.

Mänskliga uppföljningar och naturliga dubbeltextning

En mild uppföljning när en besökare går tyst, och ett valfritt kort andra meddelande hur en person skulle skicka en. Tuned med max uppföljningar per tystnad, första förseningen, senare multiplikator, närvaro fönster och maximal sekvensfönster. Kan begränsas till arbetstid, och undertryckas efter ett enkelt tack.

Typewriter svarar och svarar takt

Oavsett om det svarar ut ordet efter ord, och hur snabbt assistenten svarar, av förinställda eller ditt eget minimum och maximal fördröjning i millisekunder. En liten fördjupning läser som mer mänsklig än ett omedelbart svar.

Live översättning

Varje agent läser och skriver på sitt eget språk medan besökaren läser deras.

Hand tillbaka till AI efter agent idle

Minuter av agentinaktivitet innan AI återupptar konversationen.

Auto-öppna chatten

Andra innan widgeten öppnar sig.0Aldrig öppnar. Påträngande på mobilen; lämna på0om inte testats.

Smartare svar

Planera framåt för enpass svar, tänkande djup, en valfri separat modell för agentsvar, som visar resonemang till besökare, tolererar felstavningar, långkonversationsminne, begränsar assistenten till ditt företag bara, priser i besökarvalutan och hur länkar visas. Bara prata om ditt företag bör vara på för nästan alla.

Kostnadsbesparing

Hoppa över kunskapssökning efter hälsningar som hej och tack, och lockar det längsta svaret i tokens. Trims kostar utan att ändra svarkvalitet på verkliga frågor.

Språk

Vilka språk widgeten stöder och hur den plockar en för en besökare.

Kundkonto svar

Svar från ett inloggat kundkonto, valfritt såg upp live och valfritt laddade endast när det behövs. Läs-bara i alla fall; last-nödvändigt minskar kostnaderna märkbart.

Återbetalningar

Biträdande återbetalningsförfrågningar där assistenten samlar detaljer och händer till en person. Det slutför aldrig en återbetalning själv.

Konversation och Widget

Att hålla förbi konversationer, fortsätta en chatt över dina anslutna webbplatser, släpande fönster och fråga gäster om ett e-postmeddelande och låta ditt team förvandla en chatta till en biljett.

Widget funktioner

Emoji picker, fästen med ett valfritt paste-only läge, AI bild förståelse, inline ikoner, mikrofon, talk-to-agent knapp, besökare ljud, bifoga förhandsgranskning, röstsamtal knapp och session isolering. AI-bildförståelse är vad låter en besökare klistra in en felskärmdump och få ett användbart svar.

Admin Inbox, Notifikationer och välkomst Popup

Besökaren välkomnar popup, plus dina agenter varningar: inkorg ljud, skrivbordsmeddelanden, viska ljud, oavsett om privata viskningar pipa och inbox opinionsintervallet.

Supportflöde för tjänster

Mänsklig handoff

Hur begäran om en person tilldelas, de sekunder som en agent måste svara, oavsett om avtagande returnerar chatten till AI, och om AI återupptar när timeouten går ut. Konfigurera detta innan du går live eller en besökare som ber om en människa bara väntar.

Arbeta timmar

Öppningstider, tidszon och slutna timmar meddelande. Utanför dessa timmar AI kommer inte att erbjuda en människa. Ett separat schema från biljetten arbetstimmar under OpsIQ Skrivning.

Svarar när AI är avstängd

Det första svaret på ett nytt meddelande, svaret när någon redan är kö och hur länge innan du upprepar.

Offlineformulär

Visar ett kontaktformulär istället för chatten.

Ticket Lookup och Department Notifications

AI biljett medvetenhet, så en besökare citerar ett biljettnummer får sin verkliga status, och vilka avdelningar som AI kan väga till. En inbyggd panel visar de riktiga mottagare för varje avdelning, löste på samma sätt som anmälaren löser dem, så du kan se innan en kund gör att en avdelning varnar ingen.

Hjälpcenter i chatt widget

Låt besökare bläddra i publicerade artiklar utan att lämna chatten. Du väljer var ingångspunkten visas, bottenbaretiketten och ikonen, och om du vill erbjuda en länk till hela hjälpcentret.

Konversationsbetyg

Stjärnbetyg utlöstes när en agent stänger chatten, när en handoff slutar eller efter en inaktivitetsperiod du ställer. Välj en eller två triggers, inte alla av dem.

Enkät efter chatten

En kort undersökning när besökaren stänger chatten, med din fråga, fördröjning, tidpunktsregel och ett mössa per besök. Besökare kan också skicka e-post eller ladda ner transkriptet. En fråga blir besvarad; tre gör det inte.

E-postenkät efter chatten

En uppföljningsundersökning via e-post efter samtalet slutar, valfritt på det språk besökaren chattade in, med kontroll över förseningen, ämnet, intro, fråga, både knappetiketter och tacklinjen.

Svara Feedback

Tummen upp och tummar ner på varje AI-svar, matar kvaliteten instrumentbrädor.

Konversationsarkiv

Auto-arkiv efter dagar, auto-upplöses efter minuter av tystnad och ta bort arkiverade samtal efter dagar. En tredje plats retention är inställd tillsammans med General och Tracking.

Kunskapsutbildning

Vad assistenten faktiskt vet. Ingenting annat i kundchatt betyder lika mycket.

Webbplatskunskapsutbildning

Crawls din webbplats så att assistenten kan svara från den. Upp till tio startlänkar, en sidgräns, ett länkdjup och exkluderade mappar. URL kan testas innan hela crawl. Exkludera checkout, konto och administratörsvägar.

Inbäddningar

Den är API nyckel och modell som förvandlar sidor till sökbar mening snarare än sökordsmatcher.

AI Kunskap Organizer

Ett klick och AI läser varje FAQ och krypterad sida och sorterar dem i kategorier.

FAQs, verifierade svar

Fråga och svara par som behandlas som den högsta prioritetskällan, var och en med status, vikt och kategori. Sökbar, importerbar från JSON, och AI kan skriva dem från en beskrivning av ditt företag. När assistenten får något fel, skriv en FAQ: det överträffar krypterade sidor, så fix är omedelbar.

Avancerad

Prestanda och gränser

Polling intervall, meddelandefrekvensgräns och fönster, maximal fastsättningsstorlek, bifogade försök per fönster och tillåtna filändelser. Förlängningslistan är en säkerhetskontroll; håll den tät.

Realtime leverans

Instant meddelande och statusleverans istället för att polera, genom Pusher, Ably eller Firebase, med ett nedgångsröstningsintervall. Polling är bra för de flesta webbplatser.

Push-meddelanden

Enhetsvarningar för agenter genom Pusher Beams eller OneSignal, med ett enhetsintresse.

Webb-push (VAPID)

Webbläsare trycka med egna genererade nycklar utan tredjepartsleverantör. Genererad här, inte i farozonen.

Voice, Video och Screen Share

TURN-uppgifter så samtal ansluter via restriktiva nätverk, med hjälp av Cloudflare eller Twilio-uppgifter eller din egen TURN URL, användarnamn och referens.

Arbetsflöde för inkorg

Agent arbetsyta inställningar snarare än besökare inställningar: första respons SLA på några minuter, sparade kö vyer, tangentbordsgenvägar och kommandot palett, in-konversationssökning och kundbiljetter i inspektören.

Messaging kanaler

WhatsApp, SMS, Facebook Messenger, Instagram, Telegram, X direktmeddelanden och LINE, var och en med sin egen AI automatiskt svar växla, plus en policy switch för AI-åtgärder på kanaler, ett svar debounce och Whatsapp re-engagement mall. Varje kanal landar i samma inkorg som webbchatt.

En Live Widget Förhandsgranskning längst ner på fliken uppdateringar som du redigerar. Använd det istället för att ladda om din webbplats för att kontrollera en förändring.
Inställningar

Inställningar: mallar

Varje e-postmeddelandeOpsIQSkickar, och en design som ramar dem alla. Redigera ordalydelsen av något meddelande, och skriva mallar på egen hand för alltOpsIQinte redan skicka.

En design, många meddelanden

Den som Global e-postmall är wrapper: din logotyp, rubriken, kortet, typografin och sidfoten, med ett tomt mellanrum.OpsIQSkickas är infogad i den mitten. Redigera omslaget en gång och varje e-poständring tillsammans - biljetten svarar, Store kvitton, lösenordsåterställningen, bokningspåminnelserna, PeopleOS brev och allt du skriver själv.

Det finns inget sätt att skicka ett e-postmeddelande urOpsIQUtan denna wrapper. Det appliceras på en punkt varje meddelande går igenom, så ett meddelande som läggs till senare kan inte missa det.

Redigera ett meddelande

1
Öppna inställningar, sedan mallar

Meddelanden grupperas av vad de är: biljett och portal, Lagra, inloggning och kontosäkerhet, bokningar, samtal och meddelanden, rapporter, PeopleOS-brev och din egen.

2
Tryck på redigera den du vill

Du får ämnet, en rik textredigerare med en HTML -vy du kan byta till live och en förhandsvisning av den färdiga e-post exakt som mottagaren tar emot det - din wrapper ingår.

3
Använd de variabla chipsen

Chips ovanför redaktören är de fakta som ändras: ett biljettnummer, en orderreferens, en bokningstid. Klicka på en för att släppa den där markören finns.

4
Spara

Endast det budskapet är skrivet. Lämna ett fält tomt och det håller sin inbyggda ordalydelse; pillret på raden berättar vilken stat den befinner sig i.

💡
En variabel du inte använder tas bort när e-postmeddelandet skickas, och det är den linje som det sitter på. Det är därför en bokning utan telefonnummer aldrig skickar "Phone:" med ingenting efter det.

Skriv din egen mall

Använd detta för ett meddelandeOpsIQinte redan skicka: ett leveransmeddelande, en förnyelse påminnelse, en välkomstpaket, en licensnyckel. Det får allt som ett inbyggt meddelande får - redaktören, förhandsgranskningen, planreglerna och din globala design - och ditt eget system skickar det genomAPI.

1
Tryck Lägg till mall

Knappen sitter högst upp på sidan Templates och igen bredvid "Dina egna mallar".

2
Namnge den

Namnet blir referensen som ditt system skickar efter, visas under fältet när du skriver - till exempel x_custom_delivery_booked. Det kan inte ändras efteråt, eftersom något redan kommer att skickas med det.

3
Säg vad det är för och när det skickas

Dessa två rader är vad du och dina kollegor läser på sidan Templates ett år från nu. De är värda trettio sekunder.

4
Lista de delar som ändrar

Comma-separerade, till exempel: namn, när, tracking_link. Varje blir en{{variable}}Du kan släppa in ämnet eller meddelandet, och ditt system fyller det på vid sändningstid.

5
Skriv ämnet och meddelandet

Smärta meningar är bra - linjeavbrott blir stycken. Skriv bara MESSAGE; logotypen, header och sidfot kommer från den globala mallen.

6
Skapa den, öppna den

Det verkar under "Dina egna mallar" med hela redaktören och en levande förhandsvisning, samma som varje inbyggt meddelande.

⚠️
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.

Skicka din egen mall

Två samtal på produktenAPIUppmanaren levererar mottagaren och variablerna - aldrig ordalydelsen och aldrig designen, så en integration kan varken skicka obranded post via din arbetsyta eller tyst ändra vad du säger till dina kunder.

Lista dina mallar och variablerna var och en tar
POST /api/v1.php
Authorization: Bearer YOUR_API_KEY

{ "action": "email.templates.list", "mine": true }
Skicka den
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"
  }
}
💡
Variabla namn går utan hängslen i API call. e-post. templates. list händer dem tillbaka i exakt den form du passerar dem in.

Mallar och din plan

Ett meddelande som du inte har tjänsten för

Bostäder listade med en "Se planer" -länk och ingen redaktör - så att du kan se vadOpsIQskulle sända, och vad låser upp det.

Dina egna mallar

Välj den tjänst en mall tillhör när du skapar den, eller lämna den på varje plan. En arbetsyta utan att den tjänsten ser det listat men kan inte redigera eller skicka det.

Inloggning, säkerhet, meddelanden och e-posttestet

Aldrig planerat. Att inte kunna fixa ordalydelsen av ett lösenord återställa dina egna administratörer motta skulle vara fel typ av lås.

Frågor

Kan jag ändra designen för ett meddelande bara?+

Nej, och medvetet. Designen är omslaget och det delas, vilket är vad som håller varje e-post igenkännligt din. Vad är per-meddelande är lydelsen, faktapanelen och eventuella knappar du lägger till i meddelandet.

Vad händer med min ordalydelse om jag trycker på Återställ?+

Återställ visas endast på den globala mallen, och det ersätter vad som finns i redaktören med inbyggd design. Ingenting skrivs tills du trycker på Spara, så att du kan stänga dialogrutan för att ändra ditt sinne.

Jag raderade en av mina mallar av misstag.+

Ta bort tar två klick av exakt den anledningen - de första armarna det och berättar vad som kommer att sluta fungera. Om det redan är borta, skapa det igen med samma namn och samma referens kommer tillbaka; bara ordalydelsen måste skrivas om.

Kan en kontakt eller tillägg ta med egna mallar?+

Ja. Ett paket skickar en mail_mallar.jsonI sin egen katalog, och dess meddelanden visas under "Developer mallar" med samma redaktör, förhandsgranskning, omslag och plan grind. Dina ordningsredigeringar tillhör din arbetsyta och överlever paketet uppdateras.

Inställningar

Inställningar: OpsIQ Skriva

Biljetter svarade skriftligen: automatiska svar, det inhemska biljettsystemet, upptrappning, arbetstid, routing och kund-facing e-post.

Autosvar

Visa OpsIQ Skriva knappar

Lägger till knapparna för att skriva hjälpare för dina agenter i admin.

Aktivera biljett auto-reply

Köer nya biljetter och svar och svarar dem efter en fördröjning. Börja med det och granska utkast i en vecka. Återbetalningar, avbokningar och åtkomständringar bör alltid nå en person.

Auto-reply avdelningar

Vilka avdelningar auto-reply kan svara i. Allt som inte är listat lämnas för en människa, vilket är den säkra standarden.

Svara på fördröjningsschema (minuter)

Hur länge man väntar innan det automatiska svaret skickas. Ett snabbmeddelande lyder som en robot; några minuter läser som ett snabbt lag.

Max AI svar per biljett av avdelningen

En per-department cap, till exempel Billing 1 och stöd 3Utan ett lock kan en förvirrad tråd slinga.

Svara längd, status och identitet

Maximal skrivtokens, biljettstatus efter ett svar och efter en upptrappning, och som administratörskonto de automatiska svaren tillskrivs. Använd ett tydligt namngivet konto så att personal kan berätta AI-reparationer från mänskliga.

Native biljett operationer

Native biljettsystem

Biljettsystemet inbyggt i OpsIQ, för installationer utan extern helpdesk.

Pipe inkommande e-post till inhemska biljetter

Gör inkommande e-post till biljetter. OpsIQ levererar endpoint URL auth token, script path och PHP binär. Allt som kan posta till den slutpunkten kan skapa biljetter, så håll token hemligheten.

Multi-turn svar och fördröjning och avstötning

Oavsett om AI fortsätter att svara när samtalet fortsätter, och om det väntar ett tyst fönster så tre snabba meddelanden får man betraktas som svar. Det lugna fönstret är den bästa enstaka inställningen för att göra automatiska svar känner sig beaktade.

Offentlig supportportal

En kundanpassad sida där vem som helst kan höja och spåra en biljett, med en valfri välkomstlinje. Dess adress och utseende är konfigurerade i fliken Support Portal.

Biljettnummer format

Hur många slumpmässiga brev visas i genererade biljettnummer.

E-postkunder på sitt eget språk

Biljett e-post följer kundspråket. Personal e-mail ändrar aldrig språk: meddelanden, avdelningsvarningar, briefings och schemalagda rapporter stanna i ditt systemspråk.

Erkännanden och bekräftelser

Ett fast erkännande på nya biljetter, plus bekräftelsemeddelanden när en biljett öppnas, när återkopplingen lämnas och när en lott är stängt, var och en med en live förhandsvisning. Det finns också en global e-postmall omslag och länken bakom vyn din biljettknapp.

AI spam screening

Skärm biljetter från okända avsändare, och kan eventuellt flytta misstänkta spam på egen hand. Lämna automatisk flytt tills du har sett dess dom.

Auto-close idle biljetter

Stänger en biljett efter ett antal tysta dagar. Berätta för kunden i stängningsmeddelandet hur man öppnar igen.

Affärstid (SLA kalender)

Timezone, öppning och stängningstider, arbetsdagar och helgdagar för första-reply och resolutionstimmar. Ett separat schema från Arbetstiden under kundchatten.

Auto-tilldela nya biljetter

Automatisk uppgift, valfritt endast till agenter som är online, med agentkunskaper och en matchkänslighet för färdighetsbaserad routing.

Föreslagna dubbletter

Spots när en kund öppnar en biljett nära den som de redan har, med en justerbar matchkänslighet.

Tillfredsställande undersökning efter nära

E-post en undersökning om dagen efter att ha stängts. Resultat visas på CSAT-sidan.

Meddela avdelningen via e-post

E-post avdelningen när en ny biljett anländer. Mottagare är medlemmar av den avdelning, inte avdelningens brevlåda adress, som är inkommande adressbiljetter anländer på.

Vad AI kan läsa

AI-klientdataåtkomst

En huvudbrytare plus individuella läsbehörigheter för klientprofilsammanfattningen, fakturorna, transaktionerna, kreditbalansen, produkter och tjänster, domäner, länkade servrar och en översikt på hög nivå. Börja med profilsammanktionen och lägg till kategorier som svar behöver dem.

Eskalering och kunskap

AI biljett upptrappning

Flytta en biljett till en bättre lämpad avdelning innan du svarar. Du väljer de tillåtna avdelningarna, checkfördröjningen och kan skriva dina egna upptrappningsmeddelandeinstruktioner. Slå på den interna upptrampningsanteckningen så att ditt team kan se varför en betalning flyttas.

Kunskapsinställningar

Oavsett om svaren använder kundspråket, oavsett om de ritar på krypade länkar och FAQs, om AI läser bild och PDF Bifogade, kunskapssvarsläget, oavsett om det importeras JSON kunskap används, och om källlänkar kan visas. Använd krypade länkar och FAQ bör vara på, eller AI gissar.

Sluta auto-reply efter mänskligt svar

När personalen svarar slutar AI att svara på den biljetten. Utan det kan AI prata över din egen agent.

Biljett och e-postinstruktioner

Fritext instruktioner som formar ton och innehåll för varje svar, med ett laddat fungerande exempel. Var specifik om vad AI får aldrig göra.

Importera JSON kunskap

Ladda upp eller klistra in en JSON kunskapsfil för skrivassistenten.

Button Studio AB

En full designer för kundanpassningsknappen: displaystil, storlek, etikett, ikon, form, minsta bredd, bakgrundsstil med primära och sekundära färger, gradient vinkel, gräns, hörnradie, skugga, typografi, vadslagning, tomgångsanimering, svävarrörelse och färger samt fokusringen plus en anpassad CSS _-box för allt som kontrollerna inte täcker.

Inställningar

Inställningar: Stöd Portal

Den kundanpassade platsen där människor höjer och spårar biljetter och läser dina hjälpartiklar. Denna flik styr hur den nås och hur kunder loggar in; dess visuella design görs i Support Portal Studio.

Portal Studio eller inbäddad biljettportal: vilken vill jag ha?

Det är två olika produkter och människor blandar dem ständigt. De löser olika problem, och kör båda tillsammans är normalt.

Support Portal Studio: en plats du skickar kunder till

Studio designar en fullständig supportwebbplats som OpsIQ värdar för digDen har sin egen webbadress, eller din egen domän, och den bär hela självbetjäningsupplevelsen: hjälpa artiklar med sökning, förfrågningsformuläret, biljetthistorik, kundinloggning och assistenten. Välj en mall, arbeta genom tema, navigering, Layout, Knowledge, Footer, Brand, Tickets, Assistant, Form och CSS Förhandsgranska på skrivbord, surfplattor och telefonstorlekar, sedan publicera.

Använd den när Du vill ha en märkesdestination som du kan peka på varje kund, och du skulle hellre inte bygga eller underhålla ett supportområde inuti din egen webbplats.

Inbäddad biljettportal: biljetter inuti din egen webbplats

Den bäddade sätter endast biljettupplevelsen på en sida av din egen webbplatsKunder öppna, spåra och svara på att stödja förfrågningar utan att någonsin lämna dina sidor, och din egen rubrik, navigering och design stanna exakt som de är. Ställ in layouten, utseendet och åtkomstreglerna i widgetbyggaren, förhandsgranska resultatet, kopiera sedan den inbäddade snippet till din sida.

Använd den när Du har redan en webbplats eller ett program med egen design, och du vill att support ska hända i den snarare än att lämna kunden till en annan adress.

Den korta versionen

Studion bygger en plats du skickar kunder till. Den inbäddade tar med biljetter där dina kunder redan ärMånga företag kör båda, bäddar in biljett widget i sitt kontoområde för kontextförfrågningar samtidigt som den värd portalen som hela självbetjäningsdestination med artiklar och sök. De är oberoende switchar.

Adress och åtkomst

Access-läge

Oavsett om portalen är öppen för någon eller begränsad till inloggade kunder. Öppna portaler får fler biljetter och mer spam.

Layout val

Oavsett om portalen och hjälpcentret delar en hjälte eller använder två, vilken navigering och sidfot visas på båda ytorna och etiketten navigationsavsnitt.

Portal adress

Adresskunder använder. Välj ett namn och OpsIQ Visar den resulterande portalen och matchande hjälpcentraladresser. Ändra det senare bryter länkar du redan har skickat.

Din egen domän

Serverar portalen från en domän du äger, till exempel support. yourdomain. com.

Inbäddad biljettportal

Switches på drop-in widgeten som beskrivs ovan, och öppnar den inbäddade byggaren där du väljer layout, utseende och åtkomstregler, förhandsgranska resultatet och kopiera snippet för din sida. Detta är inte Portal Studio: Studio designar den värderade portalen, detta sätter biljetter i din egen webbplats. Båda kan vara på en gång.

Hur kunder loggar in

Dessa är dina kunders inloggningsalternativ. Personal-inloggning är konfigurerad under Inställningar, Säkerhet.

Sign-in metoder

Vilka alternativ visas på inloggningssidan. Anslutning och e-postinloggning fungerar automatiskt.

Socialt inloggnings

Konsumentkontoleverantörer, var och en behöver ett klient-ID och hemlighet, med den omdirigerade adress som tillhandahålls av OpsIQ att registrera sig hos den leverantören.

Enkel sign-on (OIDC)

Kundinloggning genom en identitetsleverantör, med emittent URL, klient-ID, hemlighet och en valfri tillåten e-postdomänlista.

Kund kund SAML 2.0

Den är SAML motsvarande. OpsIQ Tillbehör ACS svar URLoch SP-enhet ID; du levererar IdP Entity ID, sign-in och sign-out URLs X.509 Intyg och valfria attributnamn. Turn SAML i Sign-in metoder eller det kommer inte att visas.

Sömlöst inloggning från din app

En signerad djup länk så att en kund redan har skrivit in på din ansökan landar i portalen utan att logga in igen. OpsIQ Tillhandahåller undertecknande hemlighet, portal URL och arbetsplatsnyckel, en komplett rutt för ditt språk (PHP, Laravel, WordPress, WHMCS, Node.jsFlask, Django, .NET, Rails, Java, Go och på egen värd installerar den OpsIQ själva servern), steg-för-steg-inställningar och en generator för en signerad testlänk. Använd generatorn innan du skriver någon kod.

Hur rutten fungerar

Din kund klickar på en Support-länk som pekar på vägen. Rutten finner att kunden logga in i din app (en gäst skickas till din inloggning och tillbaka), läser hemligheten från din server, signerar ett engångstoken som löper ut på två minuter och omdirigerar till portalen med no-referrer och no-store headers så token är inte cachad eller läckt.

Portalens eget tecken i knappen

I Portal Studio, Sign-in sida, slå på Använd min webbplats inloggning och ange din inloggningssida URL till samma väg. Portalen lägger till opsiq_portal_return (sidan kunden var på); rutten hedrar den endast när det är inuti din portaladress och tar tillbaka kunden där, undertecknad.

WHMCS_

Inget att skriva: The WHMCS Hook from Remote Sites signerar redan kunder i portalen och hanterar returadressen. Ange din inloggningssida URL till din WHMCS kundområde inloggning.

Logga ut överallt

Signering av portalen undertecknar också kunden ur din ansökan.

Intag och skydd

Begär formfält

Vilka strukturerade fält som begäran formulär samlar in. Varje extra fält förlorar inlämningar, så fråga bara om vad du behöver för att triagera.

Spam och missbruk skydd

En honungspott och räntebegränsning skyddar alltid den offentliga formen. Ovanpå kan du blockera disponibla e-postadresser, lägga till dina egna blockerade domäner och lägga till en CAPTCHA med hjälp av Google reCAPTChA eller Cloudflare Turnstile. reCAPTCHA återanvänder nycklarna som redan är inställda under Inställningar, Säkerhet; Turnstail-tangenterna finns här.

Portalanalys

En lätt sammanfattning av portalaktiviteten under de senaste trettio dagarna.

Inställningar

Inställningar: Behörigheter, licens, krön och farlig zon

Systemgruppen, plus teamet åtkomstkontroller som bestämmer vem som kan se vilken inställningar flik.

Team Access och behörigheter

Per-admin behörigheter

Varje admin får en explicit uppsättning behörigheter som täcker chatt inkorg tillgång, vilka Inställningar avsnitt de kan redigera och deras avdelningar. Alla med Full Administrator roll har alltid varje tillstånd. Inställningar behörighet bestämmer vilka flikar en person ser, så bevilja den smalaste uppsättningen som låter dem arbeta.

Licens

Visar din nuvarande licens, vad den ger dig rätt till och dess status.

Cron- inställningar

Self-hosted installerar bara. på OpsIQ Moln de schemalagda uppgifterna som körs för dig och fliken är dold. En rad krönika driver varje planerad uppgift: biljett auto-reply, eskalering routing, växelkursuppdatering, brevlåda val och kontaktsynkronisering.

1
Kopiera linjen

Fliken visar exakt krönta linje för din server med rätt PHP binär redan valt.

2
Lägg till det i Crontab

Kör crontab -e som användaren som kör PHP och klistra in den enda raden. På cPanel använder Cron Jobs-verktyget istället.

3
Verifiera

Inom en minut lyser hjärtslagplattor upp. Använd nu Kör för att testa omedelbart istället för att vänta.

Hjärtslagspanelen visar den sista körningen, varaktigheten och vad som bearbetades för både auto-reply kö och e-post och kontaktundersökning. Det varnar när den sista loppet kom från manuell webbknapp snarare än en riktig serverkrona, och när ett hjärtslag har gått stale.

Farliga zonen

Ta bort alla spårningsdata

Torkar allt OpsIQ samlas in eller genereras. Du kryssa vad du ska inkludera och skriva bekräftelsefrasen exakt. Inställningar och webbplatskonfiguration, blockerade adresser, allt ditt team skrev (kunskapsbas, FAQs, översättningar, portaldesigner, handlingsdefinitioner) och samtycke kvitton är alla bevarade.

Rengör data äldre än

Samma svep begränsas till poster äldre än 30, 60, 90 eller 180 dagar, eller ett år. För automatisk rullande lagring använder retentionsvärdena i General and Tracking istället och låt den schemalagda uppgiften göra det.

🚫
Exportera en säkerhetskopia från Inställningar, General innan du använder något i farazonen. Dessa åtgärder kan inte ångras.
Inställningar

Hantera ditt team

Bjud in gruppmedlemmar och tilldela roller för att kontrollera vem som kan komma åt vad.

Teamteam
Team & avdelningarLagskärmen: en tabell med administratörer med kontakt, rollmärke (Owner, Full Admin, Agent) och de avdelningar som varje kan komma åt.Team & avdelningarWorkPayTeam & avdelningarSpara admin användareKONTAKTRoleFörskottAO[email protected]_Ada OwusuÄgareAllaKM[email protected]_Kojo MensahFullständig adminAllaRT[email protected]_Rita TettehAgentFaktureringSB[email protected]_AgentStöd för support1TEAMInbjude & hantera administratörer2ROLESÄgare · Full Admin · Agent3SCOPEDÅtkomst per avdelning
Den verkliga lagskärmen: varje administratör med sin kontakt, roll och de avdelningar som de kan nå, agenter omfattade, ägare fulla.

Roller

Ägare

Full åtkomst inklusive licens, fakturering och farozon. En per installation.

Fullständig admin

Full åtkomst förutom licens- och riskzonen. kan hantera administratörer.

Agent

Begränsad till tilldelade avdelningar. Biljetter, chattar och analyser bara.

Inbjudande gruppmedlemmar

1
Gå till Team

Navigera till Team i sidofältet.

2
Klicka på Inbjude

Ange teammedlemmens e-post.

3
Ställ roll

Välj Ägare, Full Admin eller Agent.

4
Tilldela avdelningar

För agenter, välj tillgängliga avdelningar.

5
Skicka inbjudan

De får ett e-postmeddelande med en inställningslänk.

Inställningar

Teamets prestanda

Hur ditt stödteam utför. Access är genom tillstånd, inte av roll: vyn tillstånd öppnar sidan, hantera tillstånd låser upp mål, QA och kollegan identifierande läser, och belöningsfinansiella tillstånd är vad som lägger till fliken Belöningar. En lagledare kan ges någon av dessa utan att bli en full administratör.

Teamets prestanda
Teamets prestandaLagets prestanda skärm: agenter rankade av en sammansatt poäng bar, CSAT och en belöningsbalans med en Pay-knapp per rad.Teamets prestandaWorkPayTeamets prestandaMEDLEMSkorCSAT_BalansRTRita Tetteh4.8$42LönSBMer om Sam Boateng4.5$28LönKMKojo Mensah4.2$15LönAOAda Owusu4.9$51Lön1SCOREDKomposite prestanda2CSAT & LOADBetyg + volym3REWARDSPay agent saldon
Den verkliga lagprestanda skärmen: varje agent som gjordes på volym och CSAT, med en belöningsbalans kan du betala per rad.

Hur sidan är organiserad

Team Performance är fem flikar. Varje svarar på en annan fråga, och de beställs av hur brådskande de vanligtvis behöver dig.

01 Kommandocentrum

Live kö tillstånd, kundresultat mot dina mål, hur kapaciteten spenderades, situationer som behöver ett beslut och evidensjusterat per-teammate index.

02Teammates

Ledartavlan, erkännande (de flesta förbättrade och sträckor), uppdrag och opt-in kontroll för vem som kan se rankningen.

03 Kvalitet kvalitet

Resultatkort, registrerade utvärderingar, chanskorrigerade granskareavtal, granskningsdrift och bevistvister.

04 Belöningar

Token värde, utbetalningskrav och den styrda perioden tilldelning: auktorisera ett finansierat tak, granska förhandsgranskningen, slutföra.

05 Historia

Hur arbetsytan har flyttat över tiden: trendmätningar med ett diagram och en 28 Dagens täckning värmekarta som visar när laget faktiskt fungerade. Varje kort döljer sig tills det finns tillräckligt med historia för att dra den.

Unscored är inte noll

En lagkamrat utan tillräckligt hanterad volym - eller vars dimensioner bär bevis lägger till mindre än hälften av den konfigurerade vikten - visas som Unscored. Deras poäng, rang och band är tomma och deras nedbrytning är dolda. Detta är avsiktligt: att göra en frånvarande mätning som noll sätter någon längst ner i en ranking för att ha en tyst vecka. Bevisgränsningar är konfigurerbara per arbetsyta i Targets & scoring.

De två bevisgränserna gör olika jobb och det är värt att hålla dem ifrån varandra. Minsta hanterade bestämmer om någon görs alls. Minimum betyg påverkar inte poängen: det bestämmer pris och belöningsberättigande. Så en lagkamrat kan vara fullt poängsatt och rankad och fortfarande vara oberättigad för den perioden, eftersom alltför få kunder betygsatte dem.

💡
Varje siffra är omfångad till arbetsytan du tittar på och tidsintervallet du väljer. En lagkamrat som arbetar i två separata arbetsplatser har en oberoende post i varje. Två undantag värda att veta: en webbplats GROUP är ett arbetsutrymme, så dess medlemsdomäner mäts tillsammans; och alla platser ser medvetet mäter allt samtidigt.

Prestationsindexet

En sammansättning av fem dimensioner, varje mätt mot ett mål du ställde snarare än mot kollegor, sedan drogs mot mitten när bevis bakom det är tunn. Notera riktning: justeringen flyttar figuren mot 70, så en tunna utmärkta poäng dras ner och en tunt dålig poäng drabbas upp. En dålig första vecka på fyra samtal är inte en fast dom heller. Som bevis ackumulerar den justerade figur konvergerar på rå en.

Kvalitetskvalitet

Kundnöjdhet från verifierad feedback. kompletteras med QA resultat efter poängkort där de finns och styrs.

Responsivitet

Första svarstiderna på P50 och P90-procentiler, mot dina mål.

Resolution

Resolutionstid och en-touch resolutionsfrekvens.

SLA_

Uppnående mot SLA du konfigurerade, plus risk och brottas räknas.

Stewardship

Åter öppna och överföra priser - det arbete som kommer tillbaka.

💡
Vikter är konfigurerbara och relativa; de behöver inte totalt 100 Saknade bevis kan bara sänka indexet, aldrig höja det - den fullständiga konfigurerade vikten stannar i nämnaren.

Kapacitet och produktiv tid

Företag, produktiv tid, löst per produktiv timme och online-andel av fönstret. Utnyttjandet rapporteras medvetet inte: det behöver schemalagda timmar som nämnare.OpsIQ har ingen roster eller skiftkälla, och en ersatt nämnare skulle vara en gissning som bär ett procentuellt tecken. Det läser lika otillgängligt med den anledningen bifogad.

⚠️
Rapportering bara. Occupancy säger hur tiden spenderades, aldrig hur bra det var att spendera, och det aldrig fonder, grindar eller storlekar en betalning. En lagkamrat utan handtagstid bevis läser som otillgänglig, aldrig som noll.

Kvalitetssäkring

Ett scorekort är de rubriska granskarna gör riktiga samtal mot. Bara en publicerad version kan få en utvärdering, och att publicera en ny version skrivs aldrig om vad som redan gjordes. En översyn är bevis på ett samtal, inte en dom på en person.

Granskningsavtal

Rapporterad som en chanskorrigerad statistik (Cohens och Fleiss kappa), inte en rå avtalsprocent 100% av tiden medan du inte bär någon information.

Granskare drift

Oavsett om en granskare gör systematiskt hårdare eller mjukare än sina kollegor på samma konversation - en jämförelse mot resten av panelen, inte en trend över tiden. Det behöver en interaktion som granskas oberoende mer än en gång.

Tvister

En lagkamrat kan formellt bestrida bevis som registrerats om dem. En öppen tvist blockerar belöningsperiods slutförande tills den är löst.

Självgranskning

En lagkamrat kan inte lämna in en utvärdering av sig själv.

⚠️
AI-graderade utvärderingar kan inte påverka lönen förrän en kalibrering publiceras som visar att modellen håller med mänskliga granskare noga, mätt av kappa mot ett minimumprov. En öppen port innebär att modellens överensstämmer med människor nära nog att räkna - det betyder aldrig att modell är korrekt.

Erkännande

Att bara vandra har dokumenterat fellägen: metriskt spel, utbrändhet och offentlig skämtning av den som är sista. Tre alternativ sitter bredvid det.

Mest förbättrad

Mäts mot en lagkamrats egen tidigare rekord, aldrig mot kollegor, med krympning så att en liten nämnare inte kan köpa en vinst.

Streaks

Konsekutiva perioder som uppfyller en fast, förklarad bar - genomsnittlig betyg, hanterad volym, betyg räkna och negativ feedback-frekvens, alla absoluta siffror. Alla kan hålla ett streck samtidigt, så det skapar ingen rankning, och en kollega med en exceptionell månad kan inte bryta din.

Opt-in ranking

En lagkamrat ser alltid sitt eget index; oavsett om de ser kollegor är ett arbetsutrymme beslut. Percentil band kan publiceras istället för absoluta positioner.

💡
Erkännande rör aldrig pengar. En streak kan inte finansiera en utbetalning eller bryta en, och mest förbättrad är inte en priskategori.

Quests

Ett mål som laget arbetar mot, mätt mot en fast deklarerad bar snarare än mot varandra - så att alla kan rensa samma strävan under samma period.

Scope och cadence

Individuellt eller lag; engångs, repeterbar eller säsongsbetonad med ett explicit fönster.

Kriterier

Konversationer hanterade, betyg mottogs, aktiva dagar, genomsnittlig betyg eller negativ återkopplingsgrad. Alla absoluta - ingen mätvärd vars värde beror på vad kollegor gjorde.

Kvalitetsbevakning

Krävs på någon strävan med ett volymmål. Att sitta numret medan kvaliteten faller under golvet håller sökningen snarare än att slutföra den, och det visas som undanhållen, inte oavslutad.

Upprepa gränser

En per period cap, driven av det långsammaste kriteriet, plus en valfri nedkylning innan en upprepning kan räknas.

Team quests

Delade framsteg utan per-teammate attribution publicerad, så ett lag sökande kan inte bli en leaderboard.

Coaching sessioner

En coaching session är en rekord, inte en chatt. Det har en tränare, en lagkamrat som coachas, en schemalagd tid, överenskomna samtalspunkter och en sammanfattning skriven efteråt. Real chattar, biljetter och QA-utvärderingar är knäppta till det som bevis, så konversationen förankras till arbete som faktiskt hände snarare än att ett ihågkommet intryck.

Prata poäng

Instämt innan sessionen, så lagkamraten går inte in i en överraskning.

Pinned bevis

Chatt, biljetter och QA-utvärderingar som är knutna till sessionen. En pin lagrar en referens - en typ och ett id - inte en kopia, så det pekar alltid på live rekordet.OpsIQ verifiera inte id innan du accepterar det.

Action objekt

Var och en med en ägare och ett förfallodatum. Ett objekt förbi dess datum visas som överdrivet - ett härledt tillstånd, inte en status någon måste komma ihåg att ställa in.

Privat note

Tränarens egen anteckning. Lagkamraten som coachas kan aldrig läsa den - inte som agent, inte som chef, inte såsom ägare. Den kontrollen körs före varje annat tillstånd och kan inte överskridas.

Vem kan se en session

Tränaren, lagkamraten och alla med ledningsgruppens prestationstillstånd. Ingen annan, inklusive andra lagkameror på samma avdelning.

Revision

Varje skapande, uppdatering, pin, unpin och slutförande registreras med vad som ändrats av vem.

💡
Coaching är avsiktligt separat från poäng och från pengar. En session ändrar inte någons index, lägger inte en belöning och visas inte på leaderboarden.

Belöningar och utmärkelser

Inspelad aktivitet omvandlas till tokens med ett kontantvärde du ställer in. Vägen till en betalning är avsiktligt långsam och varje steg registreras.

1
Ställ token värde

Hur många symboler är lika med hur mycket pengar och vad varje aktivitet är värt.

2
auktorisera det finansierade taket

För en sluten kalenderperiod anger en fullständig administratör de maximala symbolerna som den kan betala. Spara inställningsformuläret tillåter inte en budget, och det kan inte ändra ett tak som redan har godkänts.

3
Granska förhandsgranskningen

Mottagare, reserver och anledningen till att någon är oberättigad. Öppna bevis tvister blockerar detta steg.

4
Finalise

Tilldelningen registreras permanent med bevis bakom det. En period som tilldelats ingenting kan ogiltigförklaras och åter köras direkt. En som utfärdade tokens måste vändas först: OpsIQ skriver en kompenserande inträde mot varje plånbok och aldrig raderar originalet, så huvudboken visar fortfarande vad som hände och varför, och bara då är den frisläppta perioden. Återföringen vägrar om någon redan har betalat ut mer än beloppet återhämtas, och namn vem och hur mycket.

⚠️
Behörighet kräver verifierad kundfeedback. AI kvalitetspoäng kan komplettera den domen men aldrig ersätta det, och en lagkamrat som visas som Unscored är inte berättigad. Varje bidragsgivare är kapad på 25% över deras förväntade andel av perioden, så en mycket högvolym månad kan inte absorbera hela budgeten.
💡
Kontoägaren deltar inte i utmärkelser eller token belöningar, utan någon switch: de godkänner det finansierade taket och slutför varje tilldelning, och det finns ingen ovanför dem för att godkänna vad de skulle betala sig själva. Deras arbete mäts, görs och rankas på styrelsen precis som alla andra.

Alla andra deltar som standard, team leads och medägare ingår. För att lämna någon ut, öppna dem i Team & Departments och stänga av Takes del i utmärkelser och belöningar alternativ. Deras arbete är fortfarande poäng och visas; de slutar vara en kandidat från den punkten, och ingenting redan färdigställt rörs.

⚠️
Ingen godkänner pengar för sig själva. Eftersom de människor som kan delta är också de personer som kan godkänna utbetalningar,OpsIQ vägrar en utbetalning eller kredit i din egen plånbok, betalar ditt eget krav, slutför en period där du skulle bli betald och slutföra ett pris som du skulle vinna. En annan full administratör eller ägaren måste göra det. Betala alla påståenden hoppar över dina egna och rapporterar det som hoppades, inte misslyckades.

Vem kan se och göra vad

View Team performance

Styrelsen, levande tillstånd, kapacitet och kvalitetsöversikt för arbetsytan.

Hantera teamprestanda

Mål och poäng, export, QA-poängkort och utvärderingar, coaching, uppdrag och läsningarna som bär kollegaidentifierande data såsom per admin historia och prishistorik.

Visa team belöna finanser

Balanser, kontantvärden, anspråksnoteringar och betalningsreferenser - separerade från prestationsbevis eftersom det är lönebredd.

Full administratör endast

Varje penningmutation: betala en belöning, betala eller avvisa ett krav, godkänna en budget, slutföra, ogiltigförklara eller vända en tilldelning och ställa in token-to-cash rate. Dessa kan inte delegeras genom att bevilja tillstånd.

Använda det rättvist

Prestationsindexet är ledningsbevis, inte ett automatiskt sysselsättningsbeslut. Öppna källkonversationerna bakom ett nummer innan du agerar på det och väga fall komplexitet, scheman, ledighet och tillgänglighet behov. En enda svår vecka ser ingenting som en ihållande mönster.

Inställningar

Dina webbplatser (arbetsutrymmen)

Webbplatser (arbetsutrymme) låter dig hantera flera webbplatser från en OpsIQ installation. Varje har sin egen spårning, AI, kontakter och teamåtkomst.

Webbplatser
Dina webbplatserSidorna skärmen: en lista över arbetsytor, var och en med sin domän, typ, kontakt, status märke och en öppen knapp plus Add-new-site.Dina webbplatserWorkPayDina webbplatser+ Lägg till ny webbplatsSshop.acme.comeCommerce · Shopify -kontaktAktivtÖppnaHhost.acme.comHosting · WHMCS _-kontaktAktivtÖppnaBblog.acme.comInnehåll · Ingen kontaktInställningarÖppna1MULTI-SITEEtt arbetsyta per webbplats2ISOLATEDData mixar aldrig3PER-SITEEgna inställningar och kontakter
Skärmen för de verkliga webbplatserna: varje plats är sin egen isolerade arbetsyta (egen domän, kontakt och inställningar), läggs till och öppnade från en lista.

Skapa en webbplats

1
Gå till Connected Sites

Navigera till Connected Sites.

2
Lägg till en ny webbplats

Ange namn, domän och beskrivning.

3
Kopiera webbplatsen nyckel

Varje webbplats får en unik nyckel (site_xx) för widget-nippet.

4
Konfigurera oberoende

Varje webbplats har sin egen AI, kontakter och inställningar.

Hur många webbplatser kan jag ha?+

Beroende på din licensplan. kontrollera dina licensuppgifter.

Inställningar

Licens och plan

Din OpsIQ licenskontrollfunktioner, webbplatsgränser och AI-kreditbalans.

Licens
LicenscenterOpsIQ License Center: plan, en aktiv status märke, den maskerade licensnyckeln, en AI-kreditmätare och en Force-remote-check knapp.LicenscenterWorkPayOpsIQ LicenscenterPlanplanFöretagStatusAktivtNyckelnOPSIQ-••••-••••-2F9CAI krediter$68 vänsterForce fjärrkontroll1PLAN & STATUSAktiv, vid en blick2KEYHMAC-cachade lokalt3CREDITSAI balans och gränser
Det verkliga licenscentret: din plan och aktiv status, den maskerade nyckeln, din AI-kreditbalans och en one-klick-kraft åter verifieras.
Licensnyckel

Ange i Inställningar > Licens. Validated mot OpsIQ licence servern.

Licens hjärtslag / validering

OpsIQ normalt läser sin signerade lokala licens cache och uppdaterar validering vid behov. Använda Force fjärrkontroll när du behöver ett omedelbart resultat; Diagnostics identifierar DNS HTTPS eller servertidsproblem.

Planplan

Bestäm funktion tillgänglighet och gränser.

Webbplatsgräns

Maximalt antal arbetsytor.

AI krediter

Om du använder hanterad AI visas din kreditbalans här.

Förfalloförklaring

Förnya innan utgången för att undvika avbrott i tjänsten.

Vad händer när min licens går ut?+

Spårning, biljetter och CRM fortsätter. AI har paus tills förnyelse. Data bevaras.

Inställningar

Profil, lösenord och tvåfaktorsautentisering

Varje administratör kan behålla sin egen identitet, arbetspreferenser, lösenord och tvåfaktorsautentisering.

Produktskärm
Min profilProfilsidan skiljer personliga detaljer, språk / tidszon, avatar /signatur, lösenord och tvåfaktorsautentisering.Min profilWorkPayProfitKomplettTIMEZONEEuropa/Athen2FAAktiveradLivet Arbetarspace VIEWNamn och e-postPersonlig identitetRedigeraSpråk och tidszonDatum och gränssnittRedigeraAvatar och signaturSvar och team närvaroRedigeraLösenord och 2FAKontoskyddSäker1UPDATE PROFILEIdentitet och lokal2SECURE LOGINLösenord och 2FA3SAVEAnsök till denna admin
Profilsidan skiljer personliga detaljer, språk / tidszon, avatar /signatur, lösenord och tvåfaktorsautentisering.

Profilinställningar tillhör den inloggade administratören och ändrar inte varumärkesförändring på arbetsplatsen. Använd ett unikt lösenord och aktivera tvåfaktorsautentisering. Ändra en e-post eller autentiseringsinställning kan kräva omverifiering eller en ny inloggning.

Inställningar

Anmälansinställningar

Anmälans preferenser kontrollera vilka operativa händelser som når en administratör i produkten eller via e-post.

Produktskärm
AnmälansinställningarAnmälan sidan ger per-event in-app och e-postval plus en ny anmälningslista.AnmälansinställningarWorkPayIN-APPEMAILSelektivUNREAD4Livet Arbetarspace VIEWBiljett tilldeladIn-app och e-postKunden svaradeI appenSLA-riskIn-app och e-postAI-godkännandeIn-app och e-post1CHOOSE EVENTSEndast användbara signaler2CHOOSE CHANNELIn-app eller e-post3RevewNyligen meddelade
Anmälan sidan ger per-event in-app och e-postval plus en ny anmälningslista.

Föreställningar täcker biljettuppdrag, kundsvar, SLA-varningar, chatthandoff och AI-godkännandehändelser. Håll akuta operativa signaler aktiverade någonstans; stänga av e-post stänger inte nödvändigtvis av meddelandet i appen.

Inställningar

Säkerhetsöversikt

Säkerhetsöversikten är den första skärmen för att bedöma block, inloggningsattacker, hotsessioner, säkerhetstrender och händelseintegritet.

Produktskärm
SäkerhetsöversiktSäkerhetsöversikt kombinerar aktuella riskkort, en 14 Dagens trend, angriparlista, händelsefoder och integritetsstatus.SäkerhetsöversiktWorkPayACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3Livet Arbetarspace VIEWAutoblockerad7-dagars total och källaTrendSenaste angripareIP land och förnuftGranskaSäkerhetshändelserRisk- och åtgärdsresultatFoderHash-chain integritetTammerfors-evident eventkedjaGiltigt1READ HEADLINEAktuell exponering2OPEN EVIDENCEAttackers och händelser3RÄTTSAKTBlockera, undersöka, exportera
Säkerhetsöversikt kombinerar aktuella riskkort, en 14 Dagens trend, angriparlista, händelsefoder och integritetsstatus.

Använd rubrikkorten för triage, öppna sedan den relaterade revisionen, misslyckade inloggningar, blockerad IPs eller JavaScript Fel sida för rekordnivå arbete. 14 Dagens trend är mer användbar än en enda spik. Höghot sessioner bör undersökas mot besökare, begäran och autentisering bevis innan ett permanent block tillämpas.

Inställningar

Tammerfors-evident revisionslogg

Revisionsloggen registrerar vem som gjorde vad, när, till vilket objekt, på vilken risknivå och om det lyckades.

Produktskärm
AktivitetsrevisionRevisionssidan ger sökbar manipulerande uppenbar aktivitet med åtgärder, skådespelare, risk, mål och resultat.AktivitetsrevisionWorkPayHÄNDELSER18.2kHIGH RISK21INTEGRITYGiltigtLivet Arbetarspace VIEWConnector aktiverad[email protected] · ShopifyFramgångAPI nyckel återkallad[email protected] Nyckeln 19FramgångInställningar ändrade[email protected] AIFramgångTillstånd nekas[email protected] · exportBlockerad1FILTERÅtgärd, risk och skådespelare2InspektMål och resultat3EXPORTCSV eller JSON
Revisionssidan ger sökbar manipulerande uppenbar aktivitet med åtgärder, skådespelare, risk, mål och resultat.

Filtrera efter åtgärder, risk och skådespelare; export CSV eller JSON för en undersökning. hash-kedjan hjälper till att upptäcka saknade eller ändrade revisionsrader, men den ersätter inte skyddade säkerhetskopior och begränsad databasåtkomst. Behandla revisionen som känslig eftersom de kan identifiera användare, register och säkerhetsåtgärder.

Operationer

Diagnostik

Diagnostik förvandlar delsystemkontroller till enkla och engelska hälsoresultat och direkta nästa åtgärder.

Produktskärm
DiagnostikDiagnostikgrupper hälsokontroller för widget, AI, biljetter, integrationer, Site Intelligence, bakgrundsuppgifter, CRM-automation, licensiering och lagring.DiagnostikWorkPayHälsosamt13WARNING2FEL1Livet Arbetarspace VIEWWidgetBeacon och chatt endpointsHälsosamBakgrundsuppgifterCron heartbeat sentVarningE-postUtgående test misslyckadesMisslyckadesKopplingarRegistrering och evenemangsintagHälsosam1REFRESHKör aktuella kontroller2OPEN WARNINGLäs bevis3FIX AND RETESTBekräfta återhämtning
Diagnostikgrupper hälsokontroller för widget, AI, biljetter, integrationer, Site Intelligence, bakgrundsuppgifter, CRM-automation, licensiering och lagring.

Sidan kontrollerar Site Speed, rang/keyword/backlink/local data, AI och action gateway, biljetter, crawler/audits, integration/event intag, bakgrundsuppgifter, CRM-automationer, licens, widget och tillhörande produkttjänster. Det rapporterar avsiktligt operatörsläsbara orsaker snarare än att exponera råa hemligheter.

Efter en förändring, uppdatera och bekräfta det drabbade delsystemet returnerar hälsosamt. En grön diagnostik sida är nödvändig men inte tillräcklig för lansering; slutföra pre-lanseringskontrollen också.

Inställningar

Säkerhet och åtkomst

OpsIQ innehåller flera säkerhetslager för att skydda din admin, data och API Tillgång.

Hur det fungerar
Säkerhet och åtkomstEn säkerhetssköld förutom aktiverade kontroller: tvåfaktor, OIDC SSO, SCIM 2.0 OAuth2 PKCE, CSRF/CSP, IP brandvägg, räntebegränsningar och hemligheter valv.Tvåfaktor (TOTP)OIDC SSOSCIM 2.0OAuth2 PKCECSRF + CSPIP brandväggHastighetsbegränsningarHemligheter valv
Säkerhet

Säkerhetsfunktioner

Admin autentisering

E-post/lösenord med valfri 2FA.

Login Lockout

Tillfälligt lås efter alltför många misslyckade försök.

IP blockering

Block IPs eller CIDR sträcker sig från att komma åt spårade webbplatser.

Hot scoring

Beteendebaserade hotpoäng. Höghotbesökare kan vara auto-blockerade.

HTTPS verkställighet

Krävs för alla anslutningar. HTTP omdirigerar till HTTPS.

HSTS- rubriker

Strict-Transport-Security förhindrar nedgradering av attacker.

CSRF-skydd

Alla administratörsformer inkluderar CSRF-tokens.

XSS skydd

All användarinmatning är undkommen. CSP-rubriker begränsar manusutförandet.

SSRF-skydd

Outbound webhooks blockerar privat/intern IP adresser.

Rekommenderad setup

1
Möjliggöra 2FA

För alla admin-konton.

2
Starka lösenord

Minsta 12 tecken, blandade.

3
Granska konton

Ta bort åtkomst för tidigare lagmedlemmar.

4
Monitor misslyckade inloggningar

Kontrollera varje vecka för misstänkta mönster.

5
Håll dig uppdaterad

Applicera uppdateringar snabbt för säkerhetsfläckar.

Inställningar

Roller och behörigheter

Rollbaserad åtkomstkontroll låter dig styra vad varje lagmedlem kan göra.

Roller och behörigheter
Roller och behörigheterEn roll-by-capability matrix: Ägaren har allt; Full Admin saknar fakturering och fara zonen; Agent har endast omfångade biljetter.Roller och behörigheterWorkPayInställningarAtt skjutaDangerTicketsÄgareFullständig adminAgentscoped13 ROLESÄgare · Full Admin · Agent2GRANULARPer-page + per-departement3DEFAULT-DENYGlömda rutter blockerade
Rollmatrisen i ett ögonblick: Ägaren får allt, Full Admin allt utom fakturering och farozon, Agent endast deras omfångade biljetter.

Standardroller

Ägare

Allt inklusive licens, farozon och installationshantering.

Fullständig admin

Allt utom licens- och farozon. kan hantera teamet.

Agent

Svara på tilldelade avgångsbiljetter och chattar, visa analys. Inga inställningar, lag eller säkerhetsåtkomst.

Kan jag skapa egna roller?+

För närvarande inte. Tre inbyggda roller plus avdelningsuppdrag ger granulär kontroll.

Inställningar

Blockerad IPs

Hantera IP -adresser blockerade från att komma åt dina spårade webbplatser.

Blockerad IPs
Blockerad IPsDen blockerade -IPs skärm: ett block-an-IP/CIDR-formulär bredvid ett blockerat adressbord med varje post, datum, anledning och en Unblock-knapp.Blockerad IPsWorkPayBlockera en IP /CIDR203.0.113.0/24Förnuft (valfritt)BlockBlockerade adresser203.0.113.9Jun 12 · Brute forceAvblockera45.12.0.0/16Jun 10 · spamAvblockera102.89.6.2Jun 9 · missbrukAvblockera1BlockIP eller CIDR-intervall2LISTVem och när, med förnuft3UNBLOCKEtt klick
Den verkliga blockerad IPs skärmen: blockera en enda IPeller ett CIDR-sortiment och hantera listan, var och en med sitt datum, förnuft och ett-klicka avblockera.

Hur man blockerar

1
Gå till säkerhet > Blockerad IPs_

2
Lägg till ett IP eller CIDR-intervall

Exempel: 203.0.113.42 eller 203.0.113.0/24

3
Lägg till en anledning

Dokumentera varför: spam, missbruk, skrapning etc.

Kommer blockering att påverka legitima användare?+

Om kunderna delar ett företag IP eller VPN, blockera det IP blockerar alla på den. Använd smala block.

Inställningar

Misslyckade inloggningar

Alla misslyckade inloggningsförsök till din OpsIQ admin.

Misslyckade inloggningar
Misslyckade inloggningarDen misslyckade inloggningsskärmen: en tabell med konton/IPs med misslyckande räknas, tid för sista försöket och en blockknapp per rad.Misslyckade inloggningarWorkPayMisslyckad inloggning försökKONTO / IPFELFörsenadÅtgärder[email protected] · 41.62.10.472m sedanBlock[email protected] · 102.89.6.2318m sedanBlockOkänd · 45.12.9.71226m sedanBlock[email protected] · 88.21.4.921h För för länge sedanBlock1WATCHMisslyckad inloggning försök2COUNTSPer konto / IP3RÄTTSAKTBlockera från raden
skärmen för Failed inloggningar: varje konto/IP med sitt misslyckande räkna och sista försök, blockera en brute-force källa direkt från raden.

Vad varje inträde visar

Datum/tid

När försöket hände.

E-post

E-postadress som används.

IP Adress

Källa till försöket.

Landsting

Geografisk plats.

Anledning

Fel lösenord, låst eller inte hittat.

Varningssignaler

Många försök, samma e-post

Lösenord gissning. Säkerställ att 2FA är aktiverat.

Många försök, olika e-postmeddelanden

Automatiserad attack. Blockera källan IP.

Ovanliga länder

Om ditt team är lokalt, är utländska försök sannolikt attacker.

Inställningar

AI säkerhetsanalytiker

Ett opt-in analytikerskikt över säkerhetssidorna: domar, incident briefs, en daglig smältning, en veckovis hållning check, Fråga säkerhet och 0-token blockpolicy. Det går aldrig i besökarens begäranväg.

Varje säkerhetssida registrerar vad som hände, men läser det fortfarande tar dom. AI-säkerhetsanalytiker lägger till den domen på plats, och det är byggt för att spendera nästan ingenting: det sitter aldrig i fyr eller inloggningsvägen, deterministiska reglerna avgör de uppenbara fallen utan AI samtal, domar är cachade, och analytikernas bästa utgång är en determinister regel som sedan verkställer för evigt vid nolltokens. Inställningar → SäkerhetAlla standard.

Vad det lägger till

Verdict chips + förklara

Blockerad IPs och Failed Logins rader visar en godartad / misstänksam / fientlig chip med ett förtroende poäng. Explain öppnar resonemang, de fakta som används och en-klicka Block / Release åtgärder. 24h Så återblickar en IPär gratis.

Incidentbeskrivningar

Relaterade händelser kluster i en incident (login våg, URL scan, auto-block burst) med en vanlig engelska tidslinje och man rekommenderade nästa steg. Pågående attacker vika in i samma händelse.

Daglig smältning

En recap per dag: igår mot din baslinje, block, incidenter och det enda att göra. Tyst dagar skicka en deterministisk all-clear på nolltokens.

Veckovis hållning check

En måndag härdning checklista (2FA luckor, lockout tröskelvärde kontra verklig attack volym, varnar av) med en svårighetsgrad, ansträngning och exakt fix per objekt.

Fråga säkerhet

En frågebox på säkerhetsöversikten som svarar från ditt levande säkerhetstillstånd. Djupa serverfrågor överlämnas till administratörschatten snarare än gissade.

Policyförslag + autopilot

Analytikern föreslår konkreta blockregler som Godkänna / Avfärda kort; godkända regler genomdriver på nolltokens med en levande hit mot. Valfri autopilot godkänner endast de säkraste reglerna automatiskt.

Inställningar

AI säkerhetsanalytiker (security_ai_enabled)

Mästaren switch. Enables verdict chips, Explain och Ask Security. Endast tvetydig IPs når modellen, batched in one call.

Förekomstkort (security_ai_incidents)

Kluster händelser i incidenter och skriver varje ny historia. Kör på den befintliga timme säkerhetskronan.

Daglig smältning (security_ai_digest)

En säkerhetsåterkastad per dag på klockan och översikten. Tyst dagar kostar ingenting.

Veckovis hållning check (security_ai_posture)

Måndagshärdande checklista på Översikt. Checklistan är helt avgörande.

Politisk autopilot (security_ai_autopilot)

Låt analytikern aktivera sina säkraste förslag obevakas: reversibla tidsbegränsade block endast, singel IPs eller sträcker sig inte bredare än /24, aldrig delad/mobil/privat, kapad 10 per timme, alltid granskas och ogiltigförklaras.

💡
Varje samtal är taggad security_ai med sin egen månatliga cap i AI Config → Kostnadsgardeiler (standard 300k tokens). Om locket drabbas, har degradering till deterministiska läsningar. Blockering, lockouts och varningar beror aldrig på denna budget. Analytikern kan aldrig ta bort data, ändra inställningar, röra revisionsledaren eller göra ett permanent förbud.
Operationer

Cron och automation

OpsIQ använder en produkt schemaläggare för att köra e-post val, biljettautomation, analys rollups, retention, AI köer, CRM arbete, rapporter och kontaktjobb.

Produktskärm
Cron och automationEn produktkroninmatning levererar hjärtslag; OpsIQ bestämmer vilka interna jobb som ska betalas.Cron och automationServer serverHjärtatsVarje minutRUNNERcron/all.phpHEALTHInställningarLivet Arbetarspace VIEWUnified Product runneropsiq/cron/all.phpKrävsBiljett och e-post köerKort schemalagt arbeteAktivtAnalytics och retentionIntern kadensSchemalagdConnector-abonnenterDeklarerade cronhändelserOmfattning1INSTALL ONE LINEKör produktscheman varje minut2CHECK CRON SETUPBekräfta CLI hjärtslag3USE DIAGNOSTICSUndersök sent eller misslyckat arbete
En produktkroninmatning levererar hjärtslag; OpsIQ bestämmer vilka interna jobb som ska betalas.

Krävd produktkroninmatning

Lägg till denna enda rad i krönta för samma server och PHP-miljö som körs OpsIQ:

OpsIQ produktkrontab inträde
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

Ersätt /path/to/opsiq med installationsroten. Använd hela PHP CLI-vägen när värden kräver en, till exempel /usr/bin/php8.4.

Använd inte toppnivån /cron.php för produktarbete. I detta förvar som löpare tillhör en separat icke-produkt tjänst utanför denna handbok. OpsIQ Produktlöpare är opsiq/cron/all.php.

Vad den enhetliga schemaläggaren driver

Biljett och AI köer

Processer som orsakas av auto-replies, eskaleringar, godkännanden och annat kö produktarbete.

Inbound e-post

Undersökningar konfigurerade brevlådor där val är den valda intagsmetoden.

Analytics och sessioner

Monterar sessioner och uppdateringar schemalagda aggregat när de är på grund av.

CRM och engagemang

Kör scoring, livscykel, arbetsflöde, kampanj och schemalagda rapportuppgifter som är aktiverade.

Lagring och underhåll

Utför en förfallen rengöring, arkiv, utgång och integritetsarbete.

Kopplingar

Dispatches connector cron-abonnenter och polling endast för installerade, aktiverade och konfigurerade kontakter.

Verifiera cron

  1. Öppna Inställningar - Cron Setup och bekräftar att produktlöparen finns.
  2. Användning Kör nu En gång, sedan bekräfta admin och opinionsbildning hjärtslag uppdatering.
  3. Kontrollera Diagnostik för en sen hjärtslag, PHP CLI, databas eller filvägsproblem.
  4. Inspekt /tmp/opsiq-cron.log eller den loggbana du valde när en manuell körning misslyckas.

Håll kontakthanterare korta, idempotent och arbetsyta-scoped. Batch långa synkroniseringar och lagra en markör / checkpoint så nästa körning kan fortsätta säkert.

🚫
När produktens cron stoppar, slutar tidsbaserat OpsIQ -arbete eller blir försenat även om vanliga adminsidor fortfarande kan laddas.
Operationer

Hosted deployment operationer

En värd OpsIQ -distribution använder samma produktskärmar och arbetsflöden medan värdoperatören hanterar serverlagret. Kommersiell registrering, planer, fakturering och kontoportalprocedurer ligger utanför denna handbok.

Produktskärm
Hosted DeploymentFörbättrad drift förändras som upprätthåller infrastrukturen; den ändrar inte hur kunderna använder OpsIQ.Hosted DeploymentWorkPayPRODUCT UISamma OpsIQINFRASTRUCTUREOperatörsstyrdWORKSPACE DATAIsoleradLivet Arbetarspace VIEWProgramkörningPHP, webbserver och databasHanteradProduktkronanSchemalagd av hosting operatörVerifieraBackups och uppdateringarLeverantörspolicy och bevisGranskaOpsIQ inställningarWebbplatser, AI, team och kontakterDitt team1OPERATE OPSIQ NORMALLYAnvänd samma produktnavigering2VERIFY SERVICE HEALTHAnvänd diagnostik och statusbevis3KNOW RESPONSIBILITYSeparata produktinställningar från hosting work
Förbättrad drift förändras som upprätthåller infrastrukturen; den ändrar inte hur kunderna använder OpsIQ.

Vad värdoperatören normalt hanterar

  • Webbserver, PHP runtime, databastjänst, TLS och lagring.
  • Den enhetliga produktkronan och dess servernivåloggar.
  • Ansökningsuppdateringar, infrastrukturövervakning och säkerhetskopieringsprocessen som definierats av hostingavtalet.

Vad en OpsIQ Administratören hanterar fortfarande

  • Webbplatser och widget installation, AI-inställningar, kunskap, brevlådor och kundstöd arbetsflöden.
  • Teamåtkomst, avdelningar, säkerhetskontroller, API -nycklar, kontakter, automationer och inställningar för dataretention.
  • Produktverifiering genom Diagnostics, revisionsloggen, kontakttesterna och verkliga end-to-end kontroller.

Operativa kontroller

Anta inte att en hanterad tjänst innebär att varje produktintegration är hälsosam. Bekräfta den senaste säkerhetskopieringsbevis och lagringspolicy med värdoperatören, och använd OpsIQ Diagnostik efter förändringar i DNS, e-post, AI-leverantörer, webbplatser eller kontakter.

Detta avsnitt omfattar endast produktverksamhet. Kommersiell ombordstigning, abonnemang, fakturering och kundkontoadministration ligger utanför OpsIQ Handbok.

Operationer

Självvärdering OpsIQ

En självhäftad OpsIQ installationen körs på infrastruktur som du kontrollerar. Du ansvarar för drifttiden, databasen, TLS, produktkrona, säkerhetskopior, uppdateringar och övervakning.

Produktskärm
SjälvvärderingSjälvvärdering ger infrastrukturkontroll och gör ditt team ansvarigt för varje operativ beroende.SjälvvärderingServer serverPHP8.4+DATABASEMySQL 5.7+SCHEDULERVarje minutLivet Arbetarspace VIEWRuntime förlängningarcurl, pdo_mysql, mbstring, json_KrävsYtterligare tilläggxml, på engelska, OpenSSL, Inbunden, AnvändsKrävsDatabasalternativMariaDB 10.3+ med InnoDBStödsTransporterHTTPS och outbound leverantörsåtkomstVerifiera1PREPARE THE SERVERMatch runtime krav2INSTALL AND CONFIGUREAnvänd en dedikerad databas och HTTPS3ADD PRODUCT CRONKör opsiq/cron/all.php
Självvärdering ger infrastrukturkontroll och gör ditt team ansvarigt för varje operativ beroende.

Minsta mjukvarukontrakt

PHP

PHP 8.4 eller nyare. Krävda tillägg: curl, pdo_mysql, mbstring, json, xml, openssl, zip, intl och gd.

Databas

MySQL 5.7+ eller MariaDB 10.3 Använda InnoDB. Skapa en dedikerad databas och minstprivilegierad applikationsanvändare.

Webserver

Apache eller Nginx konfigurerade för frontkontrollen av OpsIQ, statiska tillgångar och nödvändiga omskrivningar.

HTTPS

Krävs för admin sessioner, widget trafik, API nycklar, webhooks och leverantör samtal.

Outbound Access

Tillåt DNS och HTTPS tillgång till AI, e-post, kontakt och licens slutpunkter du faktiskt aktiverar.

Filåtkomst

Webb- och CLI-användare måste kunna läsa programfiler och skriva endast till de dokumenterade runtime/lagringsplatserna.

Cron

Kör OpsIQ produktschemat varje minut med samma applikationskonfiguration och databasåtkomst som webbprocessen.

Installationssekvens

  1. Ladda upp lanseringen till den avsedda dokumentroten och bevara den levererade katalogen struktur.
  2. Skapa databasen och applikationsanvändaren, ange sedan databasen, kanonisk URL och licensinställningar.
  3. Kör installations-/inställningsflödet och skapa det första ägarkontot.
  4. Möjliggöra HTTPS och verifiera omdirigeringar, cookies och den offentliga widgeten /API -vägar.
  5. Lägg till den enhetliga produktkronan för OpsIQ _:
Självvärd produktkrona
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
  1. Öppna inställningar - Cron Setup och Diagnostics; kör schemaläggaren en gång och lösa varje misslyckat beroende.
  2. Konfigurera säkerhetskopiering, återställa testning, logga retention och uppdateringsprocedurer innan du lägger till produktionsdata.

Uppdatering säkert

  1. Läs lanseringsanteckningarna och kontrollera de nödvändiga PHP / tilläggen innan du ändrar filer.
  2. Säkerhetskopiera databas och program / konfigurationsfiler, sedan bevisa att säkerhetskopian kan återställas på en testplats.
  3. Distribuera de nya filerna utan att ta bort installationsspecifika konfigurations- eller runtimedata.
  4. Kör den levererade migration / förhandsflygprocessen och verifiera inloggning, widget tracking, biljetter, e-post, AI, kontakter och cron.
  5. Håll den tidigare versionen och databasbackup tillgänglig för det dokumenterade rullningsfönstret.
🚫
Repository top-nivå /cron.php är inte det OpsIQ Produktschemaläggare. Punktproduktautomation endast vid opsiq/cron/all.php.
⚠️
Ta inte bort .schema_cache.json som rutinunderhåll. Ta bort det först när produktinstruktionerna uttryckligen kräver en schema-cache ombyggnad.
Operationer

Produktionsguide

Checklista och bästa praxis för löpning OpsIQ i produktionen.

Produktionsguide
ProduktionsguideEn go-live checklista: anpassad domän och SSL AI utbildade, kontakter och cron, backups och retention och lag roller.Go-live checklistaWorkPayInnan du går liveAnpassad domän + SSL konfigureradAI utbildad på ditt innehållAnslutningar testad · cron runningBackups schemalagda · retention setTeamroller tilldelade och granskade1GO-LIVEFörhandslansering checklista2VERIFYDomän · SSL · säkerhetskopior3CONFIDENTFartyg när det är grönt
En go-live checklista så ingenting saknas: domän + SSL, utbildad AI, testade kontakter och cron, backups och retention och lag roller.

Innan du går live

HTTPS konfigurerad

SSL installerad, HTTP omdirigeringar, HSTS aktiverat.

Cron springer

Verifiera via diagnostik sida.

AI testad

Chatta som kund. Verifiera noggrannhet och ton.

Widget installerat

På alla sidor på webbplatsen. Verifiera med Live Feed.

Backup konfigurerad

Automatiserad daglig databas och filbackups.

Felloggning

PHP fel log aktiverad och övervakad.

Team inbjudna

Alla medlemmar har konton med rätt roller.

Kunskapsbas befolkad

åtminstone 5-10 artiklar.

Dagligen: Kontrollera instrumentbrädan, tydlig biljettkö, spot-check AI-konversationer.

Veckovis: Granska AI Insights, uppdatera KB, kontrollera teamprestanda, granska säkerheten.

Månat: Granska analystrender, revisionskontakter, uppdatera AI-utbildning, verifiera säkerhetskopior.

Operationer

Förhandslansering checklista

Kör källportarna och fullständiga riktiga produktkontroller innan en release eller första produktionslansering. Ett kommando som finns tillgängligt är inte bevis för att det passerade i din miljö.

Produktskärm
Släpp verifieringUtgivningsvyn visar att de krävs grindar för att köra; det gör inte förklädda dem som passerat.Släpp verifieringServer serverRUNTIMEPHP 8.4_SOURCE GATESKör lokaltOUTCOMEBevisbaseradLivet Arbetarspace VIEWKrävda tilläggKontrollera innan svitenPortPHP syntax sveperAlla projekt PHP-filerPortAI utvärdering och PHPUnitKör när beroenden är närvarandePortStatiska och webbläsare kontrollerKör när konfigureradPort1RUN THE CHECKSFånga den faktiska produktionen2FIX EVERY REQUIRED FAILUREErsätt inte bevis med antaganden3TEST THE PRODUCTVerifiera riktiga användarresor
Utgivningsvyn visar att de krävs grindar för att köra; det gör inte förklädda dem som passerat.

Källa och släppa grindar

Kör repository kontroller från installationsroten och hålla sin fullständiga produktion med releaserekordet.

Primär preflight gate
php tools/preflight.php
Utökat frigörande grind
php tools/release_gate.php

Preflight kontrollerar PHP 8.4 runtime och obligatoriska tillägg, utför en PHP syntax svep, kör AI-utvärderingsfartygsporten och full PHFUnit-paketet, och kör PHPStan / Node kontroller när dessa verktyg är installerade. Den utökade porten innehåller också rök, rengöring / schema och webbläsare end-to-end checkar när deras miljö är konfigurerad.

En hoppad kontroll är inte ett pass. Spela in varför det var otillgängligt, installera den saknade beroendet eller köra det i rätt CI / iscensättning miljö innan release.

Produktkontroller

1Autentisering och roller

Logga in som varje avsedd roll; verifiera tillåtna och nekade sidor/åtgärder.

2. Widget och spårning

Ladda en riktig webbplats i en privat webbläsare; verifiera beacon trafik, Live Feed, besökare och session poster.

3Chatt och AI

Ställ en fråga om representativa frågor; verifiera kunskapsgrund, säkerhet, eskalering och AI-historia.

4. Biljetter

Skapa, tilldela, svara, eskalera, stänga och öppna genom varje aktiverad intagsväg.

5. E-post

Testa utgående leverans och varje konfigurerad inkommande brevlåda eller webhook bana.

6 CRM och analys

Skapa en kontrollerad kontakt / överenskommelse / konvertering och verifiera instrumentpaneler, trattformar, poäng och rapporter.

7Anslutningar

Kör anslutningstest, en läs, en säker skriv / torr kör och webhook / opinionsbildning vägar för varje aktiverad kontakt.

8. API och webhooks

Verifiera smala omfattningar, räntebegränsningar, idempotent retries, signaturer och duplicerad hantering.

9. cron

Kör den enhetliga produktschemater och bekräfta alla nödvändiga hjärtslag i Cron Setup / Diagnostics.

10. Säkerhet

Verifiera 2FA, CSRF/session kontroller, revisionsposter, nyckelåterkallelse och arbetsyta isolering.

11 Backup och återställa

Återställ en aktuell säkerhetskopia till en separat testmiljö och verifiera data och konfiguration.

12. Observability och rollback

Bekräfta loggar/alerter, bevara begäran-ID och bevisa återgångsförfarandet.

⚠️
Distribuera först efter varje obligatorisk grind och affärskritisk resa har aktuella bevis för exakt frisättning och miljö.
Utvecklare

Web Push på tredje parts webbplatser

Webbläsare push-meddelanden (inklusive OpsIQ Push Campaigns) behöver en servicearbetare som serveras från SAME ORIGIN som sidan.OpsIQ widget laster från din OpsIQ utplacering, så en tredjepartswebbplats kan inte registrera OpsIQ"Sarbetare direkt. Värd en liten fil på webbplatsens egen domän för att aktivera push där. Kampanjer leverera genom BOTH-stödda metoder.

Hur det fungerar
Webb- pushEn OS-stil push notification ovan två leveransmetod kort: Inbyggd VAPID och Pusher Beams.Din butikDin kundvagn väntar · 10% off idagNu numeraInbyggd (VAPID)Ingen tredje partVärd en filPusher BalkarAnvänd ditt kontoVärd arbetstagaren
Webb- push

Varför detta behövs

Webbläsare bara låta en sida registrera en tjänstearbetare från sitt eget ursprung. widgeten laddar kors-origin från din egen OpsIQ utplacering, så det kan inte installera pusharbetaren på en kundwebbplats, tills du är värd för arbetstagaren på webbplatsens ursprung, widgeten tyst hoppar över tryck (inget fel, ingen prenumeration). Du har två alternativ nedan;OpsIQ Push Campaigns publicerar genom båda.

Alternativ A · Självhäftad webbpush (VAPID, ingen tredje part)

1. Ladda ner arbetstagaren från din implementering av OpsIQ: https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. Ladda upp den till din Web root så det är nåbart https://yoursite.com/opsiq-push-sw.jsWidget Auto-detekterar denna väg på sidans eget ursprung och registrerar det, ingen snippet förändring behövs. (Det använder ett smalt omfång, så det ersätter aldrig en tjänstearbetare du redan kör.)

Valfritt: Om du måste vara värd för det på en icke-standardväg, peka widgeten på den innan före Snippet. Det accepteras endast när samma ursprung:

Valfritt · endast om filen inte är på webbröret
<script>window.OpsIQ=window.OpsIQ||{};window.OpsIQ.pushSwUrl="/custom/opsiq-push-sw.js";</script>

3. I OpsIQ, generera VAPID-nycklar (Inställningar → Kundchatt AI → Avancerad → Web Push). Widgeten frågar sedan besökare om anmälningstillstånd och prenumererar på dem.

Bakom en CDN/Cloudflare Se till att /opsiq-push-sw.js returnerar HTTP 200 (Purge cache om det var 404 innan du laddar upp; en cachad 404 blockera registreringen).

Alternativ B · Pusher Beams (hanterad leverantör)

1. I OpsIQ inställningarna sätter push-leverantören till Pusher Balkar och gå in i dina balkar Instans-ID och Hemliga nyckel.

2. Värd Beams servicearbetare på webbplatsens rot som /service-worker.js. Kopiera https://YOUR-OPSIQ/opsiq/pusher-beams-service-worker.jseller slå samman denna linje i din befintliga rotarbetare:

Beams arbetare, värd på https://yoursite.com/service-worker.js
importScripts("https://js.pusher.com/beams/service-worker.js");

3. Det är det. widgeten laddar automatiskt balkarna SDK och prenumererar varje besökare på per plats intresse opsiq-site-<your-site-key>Ingen annan ledningar behövs.

Hur kampanjer levererar

Push kampanjer publicerar genom båda metoder samtidigt: besökare på den självhävda VAPID-arbetaren får den krypterade webben Push, och besökare som prenumereras via Pusher Beams få Beam-publiceringen. Varje besökare nås genom vilken de prenämnts, så att du kan köra samma ursprung VAPid på vissa webbplatser och korsorigin Beam på andra.

HTTPS krävs för servicearbetare och Web Push (localhost är befriad för testning). Admin chatt inkorgen använder redan samma Beams intressemekanism för operatörsvarningar.

Operationer

Felsökning

Vanliga frågor och hur man fixar dem.

Allmänt

Blank sida+

Kontrollera PHP-felloggar. Orsaker: gammal php (behövs 8.4+), saknas förlängning, DB-anslutning misslyckades, fel filbehörigheter.

Dashboard visar nollor+

Kontrollera: widget installerad? Cron running? Date range korrekt? IP Exkluderad?

AI

AI svarar inte+

Kontrollera: leverantör konfigurerad? API nyckel giltig (använd testanslutning)? Budget utmattad? Workspace AI config rätt?

AI ger fel svar+

Kontrollera: kunskapsbas uppdaterad? Snabbt klart? Connector-uppslag som returnerar korrekt data? Granska konversation i AI History.

AI är långsam+

Beroende på: leverantör API hastighet, kontextstorlek (stor KB= fler tokens = långsammare), nätverks latens. Prova en snabbare modell.

Spårning

Widget saknas+

Kontrollera: skript i sidkälla? JS-fel i konsolen? CSP blockering? Ad blockerare?

Okändt land+

GeoIP inte konfigurerad. Använd Cloudflare (automatisk) eller MaxMind GeoLite2-databas.

Biljetter

E-postmeddelanden som inte skapar biljetter+

Kontrollera: mailbox ansluten? Cron running? App-lösenord ändras? IMAP Inställningar korrekt?

Auto-reply inte fungerar+

Kontrollera: aktiverad? Avdelning tillåten? AI konfigurerad? Cron running? Människa svarade först?

Kopplingar

Anslutning misslyckades+

Kontrollera: Credentials korrekt? Nyckeln löpte ut? API Tillgänglig från server? Base URL Rätt?

Ansluten men ingen data+

Kontrollera: API nyckelområden? Webhook sync aktiverad? Cron körning?

Prestanda

Långsamma sidor+

Kontrollera: databasprestanda (SHOW PROCESSLIST), PHP-minne (öka för att 1GB aktivera opcache, minska lagringsperioden.

Operationer

Widget inte loggar besök

Använd denna fokuserade kontroll när widgeten laddas felaktigt eller Live Feed stannar tom.

När widget är inte logging besök, verifiera webbplatsen nyckeln, ladda sidan i en privat webbläsare, kontrollera webbläsaren Network / konsol paneler för blockerade beacon eller widgetförfrågningar, granska innehåll-säkerhet-Policy och annonsblockerare, bekräfta att webbplatsen är aktiv i OpsIQ, och öppna Diagnostics. En synlig chattbubbla bevisar inte själv att analytics beakon accepterades.

Hänvisning

Ordlista

Definitioner för termer som används under hela OpsIQ.

Åtgärder

Något AI kan göra genom en kontakt eller plattformen.

Agent

En gruppmedlem med begränsad åtkomst eller en AI-agent.

BYOK_

Ta med din egen nyckel, du ger din egen AI API -nyckel.

Anslutning

En plugin som integrerar en extern plattform med OpsIQ.

CSAT_

Kundnöjdhetspoäng.

- Avtal.

En intäktsmöjlighet i CRM.

Avdelning

En biljettkategori för routing och åtkomstkontroll.

Eskalering

Flytta en biljett till en annan avdelning eller från AI till människa.

GeoIP

Besökare plats detektion från IP adress.

Handoff

Överför en konversation från AI till människa.

Identitetstoken

Signerad token identifierar en webbplats besökare.

Kunskapsbas

Artiklarna AI använder för att svara på frågor.

Led

En besökare som visar köp avsikt.

Lead score

0-100 nummer som anger omvandling sannolikhet.

Livecycle scenen

Där en kund är: Lead, Prospect, Customer, At Risk, Churned.

Hantera AI

AI tillhandahålls som en del av din OpsIQ Plan.

Pipeline

Visuell styrelse av affären stadier.

RBAC

Rollbaserad åtkomstkontroll.

Session

En serie sidvisningar inom ett timeout-fönster.

Webbplats nyckel

Unik identifierare för en spårad webbplats.

SLA_

Servicenivåavtal, måltider för svar.

Token

Enhet av AI text. grovt 4 tecken = 1 Token.

Förtroendelager

Säkerhetssystem som styr AI autonomi.

Webhook

HTTP callback för eventmeddelanden.

Widget

JavaScript kod inbäddad på din webbplats.

Arbetsyta

En webbplats med egen spårning, AI, kontakter och team. Samma som "plats".

Hänvisning

Få mer hjälp

Om denna dokumentation inte svarar på din fråga:

Admin AI

Klicka på "Fråga OpsIQ" i admin. Har tillgång till denna dokumentation och dina plattformsdata.

Supportbiljett

Inkludera: vad du försökte, vad som hände, vad du förväntade dig och eventuella felmeddelanden.

E-post

E-postsupport med din licensnyckel och utfärda beskrivning.

Tips för effektiva supportförfrågningar

Inkludera sidan

Vilken administratörssida (engelska)URL eller namn).

Inkludera inställningen

Exakt inställningsnamn och aktuellt värde.

Inkludera felet

Exakt felmeddelande med koder.

Inkludera stegen

Vad du gjorde, steg för steg.

Inkludera förväntat vs faktiska

Vad som skulle hända mot vad som hände.

💡
Ju mer specifik din begäran, desto snabbare svaret. "Det fungerar inte" kräver undersökning. "Klicka Spara på AI-konfiguration ger felkod 502" får ett direkt svar.