OpsIQ Documentation

Build, operate, and extend OpsIQ.

This is the complete documentation for OpsIQ. Use it to set up the product, run support, configure AI, manage your CRM, install the widget, connect sites, build connectors, call the REST API, receive webhooks, package marketplace apps, and operate self-hosted deployments. Every feature is covered with detailed examples so you can operate OpsIQ without contacting support.

Customer guideAdmin guideDeveloper guideCRM referenceConnector SDKREST APISelf-hosted
Scope

Scope of this handbook

Everything OpsIQ does, in one place: how each screen works, how to connect your own systems, and how to build on top of it. Start anywhere — the sections follow the same order as the admin sidebar.

Scope
Documentation mapThe handbook is organised around the OpsIQ product, following the same order as the admin sidebar.Documentation mapOpsIQ productAUDIENCEOperatorsBUILDDevelopersRUNAdministratorsLIVE WORKSPACE VIEWUse OpsIQProduct screens and workflowsIncludedExtend OpsIQConnectors, APIs and widgetIncludedOperate OpsIQSecurity, cron and deploymentIncludedReferencePackage, API and webhook contractsIncluded1CHOOSE AUDIENCEOperator or developer2FOLLOW THE UISections mirror OpsIQ3USE SOURCE TRUTHStatus comes from build
The handbook is organised around the OpsIQ product, following the same order as the admin sidebar.

What is in here

Run the product

Every screen in the admin: analytics, live chat, tickets, CRM, knowledge base, Site Intelligence, promotions and the customer portal. What each page does, what the numbers mean, and what to do when they look wrong.

Connect your systems

The website widget, email mailboxes, inbound and outbound webhooks, and the connector library for platforms like Shopify, WooCommerce, WHMCS, Zendesk, Stripe, Slack and Gmail.

Build your own

The Connector Builder for no-code connectors, Actions & Triggers if you would rather not use connectors at all, and the REST API with every action, scope and error code.

Operate it

Roles and permissions, security, cron, diagnostics, backups, and both hosted and self-hosted deployment.

Where to start

1
If you run OpsIQ day to day

Read the screen sections in sidebar order. Each opens with what the page is for, so you can stop as soon as you have what you need.

2
If you administer it

Add Settings, Security, Diagnostics, Cron and Production. These are the sections that decide whether everything else keeps working.

3
If you are building an integration

Start at Connectors, then the Connector Builder, then the REST API and webhooks. Read those in order and you will have seen every way OpsIQ can talk to another system.

💡
Two things change what you see. Permissions hide pages your role cannot open, so a section described here may be missing from your sidebar — ask an administrator to check your role. And connectors carry a maturity label of Production, Beta, Preview or Template; the running build and its connector manifest are the authority on which one you have, not this page.
Start here

What OpsIQ does for your business

OpsIQ is a complete AI-first business operating platform. It replaces your analytics, live chat, helpdesk, CRM, SEO toolkit, integration middleware, and developer platform with a single unified admin where every tool shares the same customer context. Instead of stitching together 8-12 separate SaaS products, you install OpsIQ once and operate everything from one screen.

The platform
OpsIQ unified platformA central AI brain connected to live chat, CRM, tickets, Site Intelligence, promotions and analytics.Live chatPromotionsAI CRMSite IntelTicketsAnalyticsOpsIQAI BRAIN1ONE WORKSPACEEvery tool in one admin2SHARED BRAINOne customer context3ANYWHERECloud or self-hosted
OpsIQ is one platform with one shared customer context — every tool feeds, and is powered by, the same AI brain.

Everything OpsIQ does — in detail

Website analytics and visitor intelligence

Real-time visitor tracking

Every page load, click, scroll, and navigation event is captured in real time. See who is on your site right now, what pages they are viewing, how long they spend, and where they came from — all without third-party cookies.

Visitor log and sessions

Full history of every visitor with device, browser, operating system, country, city, referrer, UTM parameters, landing page, and identity resolution. Sessions group page views into journeys so you can see the entire path a visitor takes.

Session replay

Timeline-style playback of captured visitor sessions. See exactly what users did — mouse movements, clicks, scrolls, page transitions, and form interactions. Use it to diagnose UX issues, understand drop-off points, and verify conversion flows.

Live feed

A real-time stream of visitor activity as it happens. See page views, chat starts, form submissions, and intent signals updating every few seconds. Filter by country, device, or referrer to focus on specific traffic segments.

Top pages

Pages ranked by visits, engagement time, bounce rate, conversions, and support activity. Identify your highest-performing content and pages that need improvement.

Geo intelligence

Country, city, and region breakdowns with maps. Device and browser distribution, traffic source analysis, search engine referrer tracking, and market penetration insights.

Intent funnel

Track visitor intent signals — pricing page visits, repeated returns, documentation browsing patterns, and support interactions — to identify visitors who are likely to buy, churn, or need help.

A/B experiments

Run split tests on your website directly from OpsIQ. Create variants, set traffic allocation, define conversion goals, and measure statistical significance. No external testing tool needed.

JavaScript error tracking

Capture client-side JavaScript errors from your website automatically. See error messages, stack traces, affected browsers, frequency counts, and which pages trigger them. Debug frontend issues without separate error monitoring.

Events log

Every tracked event — page views, custom events, chat interactions, form submissions, purchases — in a searchable, filterable log with full metadata.

Sales and conversions

Track orders, revenue, refunds, subscription renewals, and attribute conversions to traffic sources, campaigns, and visitor journeys. Revenue dashboards with period comparison and trend analysis.

Leads

High-intent visitors identified by behavior patterns. Score leads based on page visits, time on site, return frequency, support interactions, and custom signals. Feed leads directly into the CRM pipeline.

Site Intelligence (SEO and content analysis)

Site crawls

Automated crawling of your entire website to discover pages, detect broken links, find missing meta tags, check image alt text, validate canonical URLs, and map your site structure. Schedule crawls to run daily, weekly, or on demand.

Technical SEO audit

Comprehensive technical analysis: page speed scores, mobile responsiveness, Core Web Vitals, SSL certificate status, redirect chains, duplicate content detection, crawl depth analysis, and structured data validation.

Content audit

Evaluate every page for content quality, word count, readability score, keyword density, heading structure, internal/external link ratio, and freshness. Identify thin content, duplicate pages, and content gaps.

AI-powered search

Semantic search across your entire site content. Ask natural language questions about your content and get AI-synthesized answers with source page references.

SERP rank tracking

Monitor your search engine rankings for target keywords across Google and other engines. Track position changes over time, compare against competitors, and see which pages rank for which terms.

Keyword research

Discover keyword opportunities based on your content, competitor analysis, and search volume data. Get suggestions for new content topics, long-tail variations, and content optimization targets.

Backlink analysis

Monitor your inbound link profile. See which sites link to you, track new and lost links, analyze anchor text distribution, and identify link-building opportunities.

Local SEO grid

For businesses with physical locations: visualize your local search visibility across a geographic grid. See how your rankings vary by location, distance from your business, and search intent.

Google Business Profile sync

Connect your Google Business Profile to OpsIQ. Sync reviews, posts, Q&A, photos, and business information. Manage your GBP listing from inside OpsIQ. Respond to reviews, publish posts, and monitor insights.

Scheduled reports

Automated SEO and analytics reports generated on your schedule (daily, weekly, monthly). Reports include ranking changes, traffic trends, technical issues found, and content performance. White-label output available for agencies.

AI-powered support

Customer AI chat

AI answers customer questions on your website 24/7 using your knowledge base, connected platform data (orders, accounts, subscriptions), and custom training prompts. Supports multiple AI providers: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), and Grok (xAI).

Admin AI assistant

An AI copilot inside your admin panel that helps you write ticket replies, draft customer communications, analyze support trends, look up customer data across connected platforms, and execute actions through the connector system.

AI knowledge grounding

The AI is grounded in your knowledge base articles, FAQ entries, product documentation, and connected platform data. It does not hallucinate — it answers from your actual business information or escalates when uncertain.

Auto-handoff to humans

When the AI cannot resolve a question, detects frustration, or the customer asks for a human, it automatically hands off to your team with full conversation context. Configurable decline/timeout auto-revert back to AI.

AI training prompts

Write separate instruction prompts for customer-facing AI and admin-facing AI. Control tone, boundaries, escalation rules, prohibited topics, and business-specific behavior. Per-workspace configuration supported.

AI history and audit

Every AI conversation is logged with full request/response details, token usage, cost tracking, provider used, and model version. Review conversations to identify training gaps and improve AI accuracy.

AI insights

Automated analysis of AI conversation patterns. See common questions, resolution rates, handoff frequency, customer satisfaction by topic, and areas where the AI needs better training.

Per-workspace AI config

Each connected site/workspace can use its own AI provider, model, temperature, token budget, and training prompts. A SaaS company can use Claude for the main product and GPT-4o for a secondary brand.

Managed AI and BYOK

Two AI modes: Managed AI (included in your plan, no API key needed) or Bring Your Own Key (use your own OpenAI/Anthropic/Google/xAI API key for full control over model selection and costs). Both are first-class — every feature works with either mode.

AI token budgets and cost controls

Set monthly token budgets, per-conversation limits, and low-balance alerts. Track spending per provider, per workspace, and per conversation. Prevent runaway costs with hard ceilings.

Tickets and helpdesk

Native ticket system

Full helpdesk with departments, priorities (low/medium/high/urgent), statuses, SLA tracking, internal notes, customer replies, file attachments, and threaded conversations. No external helpdesk needed.

AI triage and auto-reply

AI automatically triages incoming tickets by department and priority. Enable auto-reply for safe departments — the AI drafts and sends a response after a configurable delay (default: 2 minutes) so humans can intervene first.

Email ingestion

Connect a mailbox (Gmail, IMAP, or provider-specific) to automatically create tickets from inbound emails. Replies to ticket notification emails update the ticket thread.

Ticket portal embed

Embed a customer-facing ticket portal on your website. Customers can submit tickets, view their history, reply to open tickets, and check status — all branded to your design.

Ticket merging

Merge duplicate tickets into a single thread. Merged tickets show [Merged] on the subject line. All conversation history is preserved in the surviving ticket.

Return to AI

After a human agent takes over a ticket, use "Return to AI" to let the AI resume auto-reply on that ticket. Useful when the human-required portion is resolved but the customer has follow-up questions the AI can handle.

Inbox copilot

AI-assisted ticket management from the inbox view. The copilot suggests replies, summarizes conversation history, recommends priority/department assignments, and can execute actions on connected platforms.

Chat and real-time support

Chat inbox

Real-time customer chat managed from a unified inbox. See all active conversations, customer identity, conversation history, and AI suggestions. Multiple agents can collaborate on a conversation.

Proactive chat rules

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

Chat widget

A customizable chat widget embedded on your website. Supports AI chat, live agent chat, ticket submission, knowledge base search, and visitor identity. Responsive, accessible, and brandable.

CSAT surveys

Collect customer satisfaction ratings after chat and ticket interactions. Design surveys with your own questions, rating scales, and follow-up prompts. Results feed into team performance and AI insights.

Writing AI

Separate AI writing assistant for composing email drafts, ticket replies, announcements, and customer communications. Uses its own prompt (not the chat brain) for professional business writing.

AI-First CRM

CRM Command Center

A single screen showing your entire CRM state: pipeline value, deal velocity, upcoming tasks, at-risk deals, agent activity, and AI recommendations. The CRM home page is your daily starting point.

Contacts and companies

Manage customer contacts with full profiles: name, email, phone, company, tags, lifecycle stage, conversation history, ticket history, purchase history, and custom fields. Link contacts to companies for B2B relationship management.

Deals and pipeline board

Visual Kanban-style deal board with customizable stages. Drag deals between stages, set values, assign owners, track close dates, and see pipeline value at each stage. Multiple pipelines supported.

AI deal coaching

The AI analyzes each deal and provides coaching: risk signals (gone quiet, competitor mentioned, budget concerns), next-best-action recommendations, win probability, and suggested follow-up timing.

Forecast and reports

Revenue forecasting based on pipeline data, historical close rates, and deal velocity. Reports include pipeline by stage, by owner, by source, conversion rates, average deal size, and sales cycle length.

Prospecting agent (SDR)

AI-powered prospecting that identifies potential customers from your visitor data, lead signals, and connected platform activity. Suggests outreach targets, drafts initial messages, and scores lead quality.

Follow-up sequences

Automated multi-step follow-up sequences: email, wait, email, check response, escalate. Define sequences for new leads, stalled deals, post-purchase check-ins, and re-engagement campaigns.

Lifecycle and retention

Track customer lifecycle stages (lead, prospect, customer, churned) with automated transitions. The retention agent monitors for churn signals and suggests interventions.

Data steward agent

AI agent that continuously cleans and enriches your CRM data: deduplicates contacts, fills missing fields, validates emails, standardizes company names, and flags stale records.

Build my CRM

Natural language CRM configuration: tell the AI what your sales process looks like and it builds your pipeline stages, custom fields, deal templates, and automation rules.

CRM health check

Automated audit of your CRM data quality: duplicate contacts, deals without next steps, stale pipelines, missing contact information, and data completeness scoring.

Trust Dial

Three-level autonomy control for each CRM AI agent: Autopilot (AI acts independently), Copilot (AI suggests, human approves), and Manual (AI observes only). Set the dial per agent, per action type, and per deal value threshold.

Four AI agents

The CRM runs four specialized AI agents: Steward (data quality), SDR (prospecting), Retention (churn prevention), and Analyst (reporting and insights). Each agent has its own Trust Dial setting.

Connectors and integrations

Pre-built connectors

Ready-to-use connectors for Shopify, WooCommerce, BigCommerce, Magento 2, PrestaShop, OpenCart, osCommerce, WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Postmark, Resend, SendGrid, Mailgun, Gmail, IMAP, Slack, and Google Business Profile. Each connector brings platform-specific AI actions, knowledge, and data sync.

Connector Builder

Build custom connectors for any platform — no code, AI-assisted, or full code. The builder supports REST and GraphQL APIs, OAuth authorization code flow, webhook auto-registration with Stripe and simple signature schemes, pagination (offset, page, cursor, and link-header), list/error transforms, multi-action context, and marketplace packaging.

AI-assisted connector authoring

The ConnectorBuilderAI helps you build connectors: describe what you want and it suggests actions, writes request handlers, and maps API responses. Handles authentication, pagination, and error handling automatically.

OAuth flow for any connector

Generic in-app OAuth authorization flow that works with any connector. PKCE support, site-scoped state management, automatic token refresh. Connectors define their OAuth parameters and OpsIQ handles the flow.

Capability buses (platform-wide extension)

Connectors don't just add platform actions — they can power core features through capability "buses". A connector declares a capability (calendar, enrichment, esign in CRM; local_listing, rank_data in Site Intelligence; web_analytics in Analytics; payment_provider in Payments; email_sync in Mailbox; video_meeting in Comms) and implements its small method set; OpsIQ discovers it via CapabilityRegistry and wires it into the UI, the Customer 360 timeline, and the AI actions. Several connectors can offer the same capability with no lock-in. See connectors/PLATFORM_CONNECTORS.md.

Pre-installed vs marketplace tier

Connectors live in one of two tiers. Pre-installed connectors (connectors/) are registry-active out of the box — kept lean to just the keyless reference and the most-used provider per capability (e.g. Google Calendar, Gmail, Google Business Profile). Marketplace connectors (marketplace_connectors/) are discoverable but inert until installed — e.g. Microsoft 365 Calendar, Outlook, DocuSign, Stripe, GA4, SerpApi, Zoom. Every bridge surfaces a marketplace list so the UI and the AI can prompt "install from the marketplace" (notify-to-install) when a capability has no ready provider — never a broken button.

Connector marketplace

Publish your connectors to the OpsIQ marketplace. Package connectors with profile.json, knowledge.json, workflow_recipes.json, and signed archives. Marketplace supports free and paid connectors with multi-source billing.

Connector signing

All connectors are cryptographically signed for integrity verification. Signing is checked at install time. Use the resign_all_connectors tool to re-sign after updates.

SmartLookup

Declarative fuzzy-matching system for connector actions. Define lookup rules and OpsIQ matches user queries to platform entities using fuzzyScore and smartRank algorithms. Example: find_country("germ") matches Germany with 88.9% confidence.

Action contracts

Connectors declare actions with typed parameters, authentication requirements, pagination rules, and response transforms. Over 1,200 HTTP actions across all connectors, all executable through the unified ActionExecutor.

Connector recipes

Pre-built workflow recipes that combine multiple connector actions into common business workflows. Example: "When a new order comes in on Shopify, create a ticket, update the CRM, and send a Slack notification."

Knowledge sync

Connectors declare knowledge topics that sync to the AI knowledge base. Platform-specific help articles, setup guides, and troubleshooting steps are automatically available to the AI without manual knowledge entry.

Developer platform

REST API

Full API for visitors, events, tickets, contacts, settings, and connector operations. API key authentication, rate limiting, and JSON request/response format. OpenAPI specification available.

Webhooks

Outbound webhooks for all major events: orders, invoices, subscriptions, tickets, chats, leads, user registrations, and cart abandonment. Async delivery via job queue, exponential backoff retry, SSRF protection, and auto-disable after 15 consecutive failures.

Webhook signing

Every outbound webhook is signed with HMAC-SHA256. Verify signatures on your receiving end to ensure webhook authenticity. Stable event_id for idempotent processing.

Widget SDK

JavaScript SDK for the tracking widget with identity resolution, custom event tracking, programmatic chat control, and page-specific configuration. Install recipes for React, Vue, Next.js, WordPress, Shopify, and static HTML.

Plugins and SDKs

Server-side SDKs and plugins for common frameworks. WordPress plugin, WHMCS module, and generic PHP/Node.js integration libraries.

Events API

Push custom events into OpsIQ from your backend: purchases, signups, feature usage, errors, or any business event. Events appear in the visitor timeline and feed into analytics and AI context.

Triggers cookbook

Build automated workflows triggered by events: new ticket, chat started, visitor identified, deal stage changed, or custom event. Triggers execute connector actions, send webhooks, update records, or notify your team.

API builder

Visual API and webhook builder inside the admin. Configure endpoints, test requests, inspect responses, and debug integrations without leaving OpsIQ.

Team and administration

Role-based access control

Three roles: Owner (full access, billing, danger zone), Full Admin (all operations except billing and danger zone), and Agent (only assigned departments, no settings access). All sensitive pages are hard-gated by role.

Team performance dashboard

Owner and Full Admin-only dashboard showing resolution times, workload distribution, handle depth, channel breakdown, trend analysis, SLA compliance, CSAT by agent, reopen rates, team rollups, and busiest hours. Updated in real time.

Admin presence and online tracking

Real-time who-is-online widget in the admin navigation. Heartbeat-based presence detection (60-second ping, 300-second extend, auto-prune after 120 days). See which admins are currently active and on which pages.

Per-workspace settings

Each connected site (workspace) can have its own AI configuration, connector settings, ticket departments, branding, and operational rules. Global defaults cascade to workspaces that do not override them.

Multi-site management

Manage multiple websites from one OpsIQ admin. Each site has its own tracking snippet, visitor data, and configuration. Switch between sites from the admin navigation.

Email template system

Registry-driven email templates for all automated communications: ticket notifications, chat transcripts, welcome emails, password resets, and system alerts. Edit HTML templates with live preview, variable chips ({{customer_name}}, {{ticket_id}}), and global layout control.

Import and export

Import contacts, tickets, and knowledge articles from CSV/JSON. Export visitor data, analytics reports, and CRM records. Data portability for migration between systems.

Security, compliance, and operations

Enterprise SSO

OIDC (OpenID Connect) single sign-on with full runtime: discovery, authorize, callback, JWKS signature verification, userinfo, domain allow-listing, JIT provisioning, and status guards. SAML configuration support.

GDPR and data compliance

Built-in DSAR (Data Subject Access Request) handling: export and delete customer data across all systems. Contact-level data erasure covering sessions, tickets, chats, CRM records, and email logs. Consent management and retention policies.

IP blocking and brute-force protection

Block specific IPs or ranges from accessing your site or admin. Automatic lockout after configurable failed login attempts. Failed login log with IP, timestamp, and user agent.

HSTS and security headers

HTTP Strict Transport Security, Permissions-Policy headers, and secure cookie configuration. Self-hosted deployments can add CSP headers through server configuration.

Outbound webhook hardening

SSRF guard blocks webhooks to private/metadata IP ranges. Async delivery prevents slow endpoints from blocking your application. Auto-disable after 15 consecutive failures prevents resource waste on dead endpoints.

Workspace isolation

Strict data isolation between workspaces. Visitors, tickets, chats, CRM records, and AI conversations are scoped to their workspace. Cross-workspace data leaks are prevented at the query layer.

Billing cycle management

Support for monthly, quarterly, semi-annual, yearly, biennial, and lifetime billing cycles. Currency normalization for multi-currency gateways. FX conversion on payment receipt for accurate revenue reporting.

Cron and scheduled automation

Built-in cron system for scheduled tasks: report generation, data cleanup, subscription renewals, AI training updates, connector syncs, and webhook retries. Health diagnostics with warning indicators.

Data retention policies

Configure how long visitor sessions, chat transcripts, AI conversation history, and event logs are retained. Automatic cleanup of aged data to manage storage and comply with retention policies.

Diagnostics and health

System health dashboard showing cron status, database connectivity, AI provider status, connector health, webhook delivery rates, and storage usage. Warnings for configuration issues and performance bottlenecks.

Who OpsIQ is for

E-commerce stores

Stores

Track every visitor from landing to purchase. Let AI answer "Where is my order?" using live Shopify/WooCommerce/BigCommerce data. Manage support tickets with AI auto-reply. Run a deal pipeline for wholesale and B2B leads. Attribute revenue to traffic sources and campaigns. Monitor cart abandonment with recovery workflows.

SaaS and software companies

SaaS

Monitor trial signups and feature adoption with session replay. Track which documentation pages convert. Automate support with AI grounded in your API docs. Manage subscription revenue and expansion deals in the CRM. Connect your billing platform (Stripe, WHMCS) for real-time MRR tracking. Use the CRM lifecycle agent to detect and prevent churn.

Agencies and freelancers

Agency

Offer white-label analytics and support portals to clients. Track leads across multiple client sites from one admin. Use the CRM pipeline to manage prospects and project leads. Build custom connectors for client platforms using the Connector Builder. Generate branded SEO reports with Site Intelligence. Resell marketplace connectors as value-add services.

Hosting and infrastructure

Hosting

Deep WHMCS integration with 80+ AI actions for order lookup, service management, DNS, and provisioning. Auto-reply to common hosting questions using knowledge base articles. Track server status page engagement. Manage technical support tickets with AI triage. Use the billing cycle ladder for monthly through lifetime hosting plans.

Support-heavy businesses

Support

Deflect 40-70% of repetitive questions with AI chat grounded in your knowledge base. Route tickets to the right department with AI triage. Track team performance with resolution times, SLA compliance, and CSAT by agent. Use the writing AI for professional reply drafting. Monitor support trends with AI insights.

Marketing and SEO teams

Marketing

Full Site Intelligence suite: crawls, technical SEO audits, content analysis, SERP rank tracking, keyword research, backlink monitoring, and local SEO grid. Google Business Profile management. Scheduled white-label reports for clients. A/B testing built into the tracking widget. Campaign attribution across all channels.

Solo founders and small teams

Startups

Start with just tracking and chat — free to add. Then add tickets when you get support volume. Turn on the CRM when you start selling. Connect platforms as you adopt them. OpsIQ scales from one person doing everything to a 50-person operations team with RBAC, departments, and per-agent performance tracking.

Enterprise and multi-brand

Enterprise

Enterprise SSO with OIDC for centralized authentication. Multi-workspace isolation for separate brands or divisions. Per-workspace AI configuration with different providers and models. Custom connector development with marketplace distribution. Audit trails, GDPR compliance tools, and data retention policies.

What OpsIQ replaces

Google Analytics + Hotjar + Plausible

Full website analytics with visitor tracking, session replay, page rankings, geo intelligence, intent funnels, conversion attribution, events, A/B experiments, and JS error tracking — all privacy-friendly, all in one platform.

Intercom + Drift + Tidio

AI-powered customer chat with knowledge grounding, multi-provider AI support, auto-handoff to humans, proactive chat rules, conversation history, CSAT surveys, and ticket creation from chat.

Zendesk + Freshdesk + Help Scout

Native ticket system with departments, priorities, SLA, AI triage, auto-reply with configurable delay, email ingestion, ticket embed, ticket merging, inbox copilot, and Return to AI capability.

HubSpot + Pipedrive + Salesforce

AI-first CRM with four specialized AI agents (Steward, SDR, Retention, Analyst), Trust Dial autonomy control, pipeline board, deal coaching, forecasting, sequences, lifecycle management, and natural language CRM configuration.

Ahrefs + SEMrush + Moz

Site Intelligence with automated crawls, technical SEO audits, content analysis, AI search, SERP rank tracking, keyword research, backlink analysis, local SEO grid, and scheduled white-label reports.

Zapier + Make + custom middleware

Connector SDK with 25+ pre-built connectors, Connector Builder (no-code/AI-assisted/full-code), OAuth flow, webhook auto-registration, a large catalogue of connector action definitions that become executable only when the relevant connector is installed, enabled, configured and validated, SmartLookup, marketplace, and signed packages.

Google Business Profile manager

Full GBP connector: review management, post publishing, Q&A management, photo uploads, business info sync, insights tracking, and AI-powered review responses — all from inside OpsIQ.

Separate email template tools

Registry-driven email templates with visual editor, live preview, variable chips, global layout control, and per-event customization for all automated communications.

Team management dashboards

Built-in team performance: resolution times, workload, SLA compliance, CSAT by agent, reopen rates, busiest hours, real-time presence tracking, and per-department breakdowns.

GDPR compliance tools

Native DSAR handling, data erasure across all systems, consent management, retention policies, and audit trails — built into the platform, not bolted on.

Two editions

Hosted deployment

OpsIQ runs on managed infrastructure. Product operation is the same; infrastructure, updates and backups are handled by the hosting operator. This handbook documents the OpsIQ runtime rather than marketing or commercial account flows.

Self-hosted module

Install OpsIQ on your own server for full control over data, branding, updates, and integrations. Requires PHP 8.4+, MySQL 5.7+ or MariaDB 10.3+, HTTPS, and the OpsIQ unified cron. Supports WHMCS integration as an addon module. Full data sovereignty.

Recommended reading order

1
Quick start

Follow the 30-minute setup guide to get tracking, chat, and basic AI working on your website.

2
Dashboard and analytics

Learn how to read your visitor data, set up session replay, identify leads, and understand traffic patterns.

3
Site Intelligence

Run your first SEO crawl, check your technical health, and set up SERP rank tracking for your target keywords.

4
Tickets and support

Set up departments, configure auto-reply with AI, connect email ingestion, and train your AI to handle common questions.

5
CRM

Organize contacts, build your pipeline, configure the AI agents, set Trust Dial levels, and let AI coach your deals.

6
Connectors and developer tools

Connect your e-commerce/billing platform, build custom connectors, set up webhooks, and integrate via the REST API.

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

Quick start in 30 minutes

Follow these steps in order to get OpsIQ running. Each step builds on the previous one. By the end, you will have visitor tracking, AI chat, and basic ticket support.

Setup
Quick start checklistA guided setup checklist showing widget install, platform connect, AI training, team invite and go-live, with a 60 percent progress bar.Get startedsetupInstall the OpsIQ widgetDONEConnect a platform (WHMCS, Shopify...)DONETrain your AI on your contentDONEInvite your teamCheck and go liveSetup progress3 of 5 — 60%1STEP 1Install the widget2STEP 2Connect & train AI3STEP 3Invite & go live
The 30-minute path: install the widget, connect a platform, train your AI, invite the team, then go live.

The 30-minute setup

1
Activate your license

Enter your license key in the OpsIQ admin. Go to Settings, enter the licence key supplied for this installation, and click Activate. You should see a green "Active" badge.

2
Set your business identity

Go to Settings and fill in your business name, industry, timezone, default currency, and support hours. This information is used by the AI when answering customer questions and by analytics for timezone-aware reports.

3
Choose an AI provider

Go to AI Configuration and select your provider. Options: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), or Grok (xAI). Enter your API key if using your own key, or use Managed AI if available on your plan. Click "Test connection" to verify.

4
Install the tracking 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
Connect your platform

If you use Shopify, WooCommerce, WHMCS, or another supported platform, go to Connectors, find your platform, enter credentials, and click Test Connection. This gives the AI access to order data, customer profiles, and support context.

6
Invite your team

Go to Team, click Invite, enter their email and role (Owner, Full Admin, or Agent). Agents can only access departments you assign them to. Owners and Full Admins see everything.

The fastest possible path (5 minutes)

Step 1: Install widget

Copy the snippet from Connected Sites and paste it on your website. This gives you tracking immediately.

Step 2: Enable AI

Go to AI Configuration, pick a provider, enter your key, and save. AI chat is now active on your website.

Done

You now have visitor tracking and AI chat. You can add tickets, CRM, and connectors later.

Day 2: Make it useful

Add knowledge

Go to Knowledge Base and add 5-10 articles about your most common questions. The AI uses these to answer customers accurately.

Create departments

Go to Tickets and create at least 2 departments (e.g., "Sales" and "Support"). Assign team members to each.

Write your AI prompt

Go to AI Training and write a Customer AI prompt that describes your business, tone, and escalation rules.

Test a conversation

Open your website in a private browser and chat with the AI as a customer. Check that answers are accurate and tone is right.

Week 1: Build your operations

Connect email

Set up a mailbox (Gmail, IMAP, or a provider connector) so customer emails automatically create tickets.

Set up auto-reply

Enable ticket auto-reply for safe departments. Set a 2-minute delay so humans can intervene first.

Review analytics

Check Dashboard daily. Look at visitor count, bounce rate, top pages, and sales if tracking is connected.

Start your CRM

Open AI CRM and let OpsIQ import contacts from your connected platforms. Review the pipeline board.

Month 1: Optimize

Review AI history

Check AI History weekly. Look for wrong answers, missed questions, and opportunities to add knowledge.

Add proactive rules

Create a rule: if a visitor is on the pricing page for 60+ seconds, show a chat message asking if they need help.

Build a connector

If you use a platform that does not have a built-in connector, use the Connector Builder to create one.

Set up webhooks

Connect OpsIQ to your internal tools using outbound webhooks for ticket, chat, and sales events.

Can I skip the AI and just use tracking?+

Yes. The AI provider is optional. OpsIQ works as a pure analytics and ticketing platform without AI. You can enable AI later when you are ready.

Can I skip connectors and add them later?+

Yes. Connectors enrich the AI with platform-specific data, but OpsIQ works without them. Start with tracking and chat, then connect platforms when needed.

What if I do not have a website yet?+

You can still use OpsIQ for tickets, CRM, and team collaboration. The tracking widget is optional. Add it when your website is ready.

How do I know if the widget is installed correctly?+

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

Start here

Complete product map

OpsIQ is not one feature. It is an operator admin, a website widget, an AI support layer, a ticket/helpdesk system, a full CRM with four AI agents, a Site Intelligence suite, a connector platform with marketplace, and a developer surface. Here is every component it contains.

Operator admin

Dashboard, live feed, visitor log, sessions, session replay, top pages, geo intelligence, intent funnel, events log, A/B experiments, JS error tracking, sales and conversions, leads, AI CRM (command center, contacts, companies, deals, pipeline board, deal coaching, forecast, prospecting, sequences, lifecycle, data steward, Build my CRM, CRM config, CRM health, CRM API), tickets, chat inbox, proactive rules, CSAT surveys, email drafts, mailboxes, AI configuration, AI training, AI history, AI insights, knowledge base, connectors, Connector Builder, marketplace, connected sites, team management, team performance, settings, diagnostics, and license.

Customer-facing surfaces

Website tracking widget (analytics beacon + chat + ticket embed + knowledge base search), client AI chat, ticket submission portal, visitor identity token handling, file uploads, CSAT survey widget, and customer-facing help center.

AI-First CRM

Command center, contacts, companies, deals, pipeline board with drag-and-drop, AI deal coaching (risk signals, next-best-action, win probability), revenue forecasting, prospecting agent (SDR), automated follow-up sequences, lifecycle and retention management, data steward agent (dedup, enrich, validate), Build my CRM (natural language setup), CRM configuration, CRM health check, Trust Dial (Autopilot/Copilot/Manual per agent), four specialized agents (Steward, SDR, Retention, Analyst), and CRM API with webhooks.

Site Intelligence suite

Automated site crawls, technical SEO audit (speed, mobile, Core Web Vitals, SSL, redirects, structured data), content audit (word count, readability, keyword density, heading structure), AI-powered semantic search, SERP rank tracking across engines, keyword research with opportunity scoring, backlink analysis and monitoring, local SEO grid visualization, Google Business Profile sync (reviews, posts, Q&A, photos, insights), scheduled reports (daily/weekly/monthly), and white-label PDF output for agencies.

AI and automation

Customer AI chat (multi-provider: Claude, GPT-4o, Gemini, Grok), admin AI assistant, AI knowledge grounding, auto-handoff with configurable revert, per-workspace AI configuration, managed AI and BYOK modes, token budgets and cost controls, AI history audit trail, AI insights analysis, ticket AI triage, ticket auto-reply with delay, writing AI (separate prompt), and admin inbox copilot.

Connectors and integrations

25+ pre-built connectors (Shopify, WooCommerce, BigCommerce, Magento 2, PrestaShop, OpenCart, osCommerce, WordPress, WHMCS, Zendesk, Stripe, Amazon SES, Postmark, Resend, SendGrid, Mailgun, Gmail, IMAP, Slack, Google Business Profile), Connector Builder (no-code/AI-assisted/full-code), generic OAuth flow with PKCE, connector marketplace with paid distribution, connector signing and verification, SmartLookup fuzzy matching, a large catalogue of HTTP action definitions whose availability depends on connector installation, enablement, configuration and validation, knowledge sync, and workflow recipes.

Developer platform

REST API (visitors, events, tickets, contacts, settings, connectors), OpenAPI spec, API key management, outbound webhooks (async, signed, retried, SSRF-guarded, auto-disable), Events API for custom event ingestion, widget SDK with identity resolution, triggers cookbook, action contracts, connector SDK, marketplace packaging, server-side SDKs (PHP, Node.js), WordPress plugin, and WHMCS module.

Settings and operations

Business identity, AI configuration per workspace, tracking settings, security (HSTS, Permissions-Policy, IP blocking, brute-force protection), RBAC (Owner/Full Admin/Agent), team management and invitations, team performance dashboard, admin presence tracking, email template system (registry-driven, visual editor, variable chips), survey designer, domain knowledge, ticket embed configuration, branding, data retention policies, billing cycle management (monthly through lifetime), currency normalization, import/export, diagnostics, cron automation, and danger zone.

Security and compliance

Enterprise SSO (OIDC with JWKS verification, JIT provisioning), SAML configuration, GDPR/DSAR handling (export and delete across all systems), data erasure per contact, consent management, workspace isolation (strict query-layer scoping), audit trails, failed login tracking, IP blocking, outbound webhook SSRF guard, and data retention policies.

Provider bridge

Managed AI proxied through OpsIQ provider URL, Site Intelligence provider calls, license validation, health reports, PDF rendering, and data exports — all routed through the configured provider endpoint, not direct vendor API calls from your server.

Every admin page

Dashboard

Core

Daily command center: traffic overview, live visitor count, sales summary, support queue depth, AI activity alerts, and quick-action shortcuts.

Live feed

Analytics

Real-time visitor stream: page views, chat starts, form submissions, and intent signals updating every few seconds with country, device, and referrer filters.

Visitor log

Analytics

Complete visit records: device, browser, OS, country, city, referrer, UTM params, landing page, identity, and full page-view history.

Sessions

Analytics

Journey-grouped view: page flow, time on page, scroll depth, conversion path, and exit page for each visitor session.

Session replay

Analytics

Timeline playback of captured events: mouse movement, clicks, scrolls, page transitions, and form interactions for UX diagnosis.

Top pages

Analytics

Page performance ranking: visits, engagement time, bounce rate, conversions, support interactions, and trend direction.

Geo intelligence

Analytics

Geographic reports: country/city breakdown with maps, device distribution, browser share, traffic sources, and market penetration.

Intent funnel

Analytics

Behavioral intent tracking: pricing visits, return frequency, doc browsing, support interactions, and custom signals with conversion probability.

Events log

Analytics

Searchable event history: page views, custom events, chats, purchases, form submissions with full metadata and filtering.

A/B experiments

Analytics

Split testing: create variants, allocate traffic, define goals, measure significance, and declare winners — all from inside OpsIQ.

JS errors

Analytics

Frontend error capture: messages, stack traces, affected browsers, frequency, affected pages, and trend tracking.

Sales

Sales

Revenue dashboard: orders, renewals, refunds, attribution by source, campaign performance, period comparison, and trend analysis.

Leads

Sales

Lead management: scoring, source attribution, CRM status, contact details, behavioral signals, and pipeline routing.

AI CRM

CRM

Full CRM: command center, contacts, companies, deals, pipeline board, coaching, forecast, prospecting, sequences, lifecycle, data steward, and health.

Tickets

Support

Support inbox: departments, priorities, SLA tracking, AI triage, auto-reply, internal notes, file attachments, merging, and status management.

Chat inbox

Support

Live conversations: AI and human chat, handoff, collaboration, conversation history, customer identity, and CSAT collection.

Email drafts

Support

Email management: inbound mail to tickets, AI-assisted reply composition, template selection, and mailbox configuration.

AI config

AI

Provider setup: select Claude/GPT-4o/Gemini/Grok, enter API key or enable managed AI, set model, temperature, and token budgets per workspace.

AI training

AI

Prompt authoring: customer-facing and admin-facing prompts, escalation rules, tone guidelines, prohibited topics, and boundary configuration.

AI history

AI

Conversation audit: full request/response logs, token usage, cost per conversation, provider, model version, and resolution outcome.

AI insights

AI

Pattern analysis: common questions, resolution rates, handoff frequency, satisfaction by topic, and training gap identification.

Knowledge base

AI

AI training content: articles, FAQ entries, product docs, connector knowledge, and custom entries. Semantic and keyword search for AI grounding.

Connectors

Integrations

Integration hub: installed connectors, health status, action inventory, credential management, marketplace browser, and Connector Builder.

Connected sites

Settings

Site management: tracking snippet, site key, widget configuration, domain settings, and per-site workspace isolation.

Team

Settings

User management: invite members, assign roles (Owner/Full Admin/Agent), set department access, and manage permissions.

Team performance

Settings

Ops metrics: resolution times, workload, SLA compliance, CSAT by agent, reopen rates, busiest hours, and trend analysis.

Settings

Settings

Configuration: business identity, AI setup, tracking, security, branding, retention, email templates, billing, import/export, diagnostics, and danger zone.

License

Settings

Plan management: license status, plan features, usage metrics, renewal date, and upgrade/downgrade options.

Start here

Guided onboarding

The onboarding journey turns a new installation into a working OpsIQ workspace and can be left and resumed without losing progress.

Product screen
OnboardingOnboarding shows each setup area, its current state and the next action to complete.OnboardingworkspacePROGRESS60%COMPLETED6NEXTWidgetLIVE WORKSPACE VIEWLicenseValidate the product licenceDoneAI providerSelect provider and test keyDoneBrandBusiness identity and toneDoneWebsiteAdd site and install widgetNext1COMPLETE BASICSLicense, brand, AI2CONNECT DATASite and connector3VERIFY LAUNCHTeam, email, checks
Onboarding shows each setup area, its current state and the next action to complete.

Recommended sequence

  1. License: validate the licence and confirm the workspace is active.
  2. AI provider: choose the provider/model, enter credentials and run the connection test. AI can be skipped if the workspace will initially use analytics and tickets only.
  3. Business identity: set the name, industry, description, customer-facing tone and brand details used by the widget and AI.
  4. Connector: enable at least one external platform when OpsIQ needs orders, customers, tickets, email or other platform context.
  5. Site and widget: create the site/workspace, copy the site key and verify a private-browser visit in Live Feed.
  6. Team and routing: invite admins/agents, create departments, set email routing and confirm notification preferences.
  7. Go-live checks: test chat, a ticket, connector sync, cron, outbound email, webhooks and security headers.

The journey stores completion per workspace. Returning to Onboarding should show completed steps rather than forcing a restart.

Start here

Admin navigation and permissions

The OpsIQ sidebar is permission-aware. This map explains where each operational area lives and why a page may not be visible to every administrator.

Product screen
OpsIQ navigationThe sidebar groups OpsIQ by work area; individual links appear only when the current role can use them.OpsIQ navigationworkspaceGROUPS8PAGESPermission basedSEARCHAvailableLIVE WORKSPACE VIEWSupportTickets, email, CSAT, knowledgeOpenCRMContacts, pipeline, scoring, workflowsOpenMarketingOutreach, announcements, push, toursOpenSecurityOverview, audit, blocks, errorsAdmin1PICK A GROUPMatch the sidebar2CHECK ROLEHidden means restricted3USE PAGE HELPOpen the matching section
The sidebar groups OpsIQ by work area; individual links appear only when the current role can use them.
Support

Tickets, team email, CSAT, Help Center, chatbot flows, mailboxes, drafts and routing.

CRM

Command Center, contacts, lifecycle, builder, health, data steward, prospecting, pipeline, forecast, segments, scoring, leaderboard, approvals, activity, workflows and conversion/privacy controls.

Marketing

Outreach, proactive messages, announcements, Promotion Studio, push campaigns, tours and feedback.

Analytics

Analytics Hub, visitor/session/page/geo reports, funnels, replay, events, experiments, custom dashboards and scheduled reports.

Integrations

Connectors, actions and triggers, mailboxes, inbound endpoints, outbound webhooks and API keys.

Security

Security overview, audit activity, failed logins, blocked IPs and JavaScript errors.

Settings

AI instructions/configuration/evaluation/history, general settings, languages, team, sites, diagnostics, export, onboarding and help.

Direct routes are still checked server-side. Hiding a sidebar link is not the security boundary: every protected action must pass its permission and workspace checks.

Analytics

Analytics hub

The Analytics hub brings support, chat, AI, visitor and agent reporting into one date-filtered workspace with exportable results.

Product screen
Analytics hubAnalytics Hub shows a date range, metric cards and tabs for Support, Chat, AI, Visitor and Agent performance.Analytics hubworkspaceTICKETS184AI RESOLVE63%CSAT4.7LIVE WORKSPACE VIEWSupportCreated, closed, pending, SLATabChatAI/human outcomes and handle timeTabAIConfidence, feedback, token useTabAgentVolume, speed and satisfactionTab1CHOOSE DATESPreset or custom2CHANGE TABSupport to Agent3EXPORTDownload CSV
Analytics Hub shows a date range, metric cards and tabs for Support, Chat, AI, Visitor and Agent performance.

Filters and controls

  • Use a preset or a custom from/to range, then Refresh to rebuild every card and chart for the same period.
  • Export CSV exports the active analytical view rather than a screenshot.
  • Workspace scoping is automatic; changing sites changes the underlying dataset.

What each tab measures

  • Support: tickets created/closed/pending, first reply, resolution, first-contact resolution, SLA, and priority/department/status breakdowns.
  • Chat: sessions started, AI resolutions, escalations, abandonment, handle time, messages per session, and AI/human/all CSAT.
  • AI: average confidence, low-confidence rate, triage accuracy, feedback, knowledge deflection, token/cache usage, and the items that need review.
  • Visitor: traffic and engagement trends for the selected period.
  • Agent: per-agent workload, speed, closure and satisfaction measures.

Use Analytics Hub for cross-team review; use the dedicated Visitors, Tickets, CSAT, AI History and Team Performance pages when you need record-level investigation.

Analytics

The Dashboard

The Dashboard is your daily command center. It shows traffic, sales, support load, AI activity, and conversion indicators in one view. Open it every morning to understand what happened overnight and what needs attention today.

Dashboard
Overview dashboardThe Overview screen led by an OpsIQ Intelligence AI panel (with Daily brief, Smart alerts, Forecast), KPI widget tiles and a seven-day traffic widget, plus a Reset layout control.OverviewworkspaceOPSIQ INTELLIGENCEPick an analysis and OpsIQ writes itDaily briefSmart alertsForecastReset layoutVISITORS TODAY2,481+12%REVENUE$8.2k+5%OPEN TICKETS143 SLATraffic — last 7 days1AI-FIRSTOpsIQ Intelligence panel2WIDGETSKPI tiles you arrange3YOURSReset layout anytime
The real Overview screen: the OpsIQ Intelligence panel up top — pick an analysis and it writes it — above the KPI widgets you arrange yourself.

Dashboard cards explained

Live visitors

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

Unique visitors

How many different people visited your website in the selected date range. OpsIQ identifies visitors by a combination of browser fingerprint, cookies, and (if available) authenticated identity.

New vs returning

New visitors are seeing your site for the first time. Returning visitors have been seen before. A high returning ratio means your content brings people back. A very low returning ratio might mean you are not retaining interest.

Bounce rate

The percentage of visitors who left after viewing only one page. A bounce rate above 70% on landing pages usually means the page is not meeting visitor expectations — wrong content, slow load, or poor mobile experience.

Average time on page

How long visitors spend on each page on average. Very short times (under 10 seconds) on content pages suggest the content is not engaging. Very long times on checkout pages might indicate confusion.

Threats blocked

IP addresses that OpsIQ identified as potentially malicious based on threat scoring, brute force attempts, or manual blocks. Click to see the blocked IPs list.

Sales today / this week / this month

Revenue from connected sales sources (Shopify, WooCommerce, Stripe, etc.). If sales show zero, check that your platform connector is connected and syncing.

Trend chart

A line graph showing visitor count over the selected date range. Look for patterns: traffic spikes (campaigns, press mentions), dips (weekends, holidays), and sustained trends.

Top sources

Where your visitors come from: direct, Google, social media, email campaigns, referral sites. Use this to understand which marketing channels are working.

Top browsers

Chrome, Safari, Firefox, Edge, and others. If a browser has unusually high bounce rate, you might have a CSS or JavaScript compatibility issue.

Hourly heatmap

A grid showing visitor activity by hour of day and day of week. Use this to decide when to schedule support shifts, when to send announcements, and when to run promotions.

Recent visitors

The last few visitors with country, page, device, and source. Useful for quick spot-checks during campaigns.

Using the date range filter

Click the date picker at the top right of the Dashboard. Presets: Today, Yesterday, Last 7 days, Last 30 days, This month, Last month, Custom range. All dashboard cards and charts update when you change the range. The date range is in your configured timezone (set in Settings).

Worked examples

Bounce rate spike investigation

Scenario:
Your bounce rate jumped from 45% to 78% this week. What happened?
What to do:

Check: (1) Did a specific landing page change? Go to Top Pages and sort by bounce rate. (2) Did a campaign send traffic to the wrong page? Check Top Sources for new referrers. (3) Did the site break on mobile? Check browser breakdown for mobile bounce rate. (4) Is it bot traffic? Check the Threats counter and visitor details for suspicious patterns.

Zero visitors on dashboard

Scenario:
The dashboard shows 0 live visitors even though your website is getting traffic.
What to do:

Check: (1) Is the tracking widget installed? View your website source code and search for the OpsIQ script. (2) Is the site key correct? Compare the data-site-key in the script with the key in Connected Sites. (3) Is a CDN or cache serving a stale page without the script? Clear your CDN cache. (4) Is an ad blocker or CSP header blocking the script? Check the browser console for blocked requests.

Reading the hourly heatmap

Scenario:
Your heatmap shows heavy activity between 10am-2pm on weekdays but nothing on weekends.
What to do:

This is a B2B traffic pattern. Your visitors are working professionals browsing during business hours. Implications: (1) Schedule support staff for weekday business hours. (2) Send email campaigns Tuesday-Thursday morning. (3) Weekend maintenance windows are safe. (4) Consider offering live chat only during peak hours.

Traffic spike from unknown source

Scenario:
You see a sudden spike of 500 visitors in one hour from an unknown referrer.
What to do:

Go to Visitors and filter by the time window. Check: (1) Are they real visitors or bots? Look at session duration, pages viewed, and browser diversity. (2) If real, what page are they landing on? (3) Check the referrer URL — someone might have linked to you from Reddit, Hacker News, or a popular blog. (4) If it is bot traffic, check Threats and consider blocking the IP range.

Why does my visitor count differ from Google Analytics?+

OpsIQ counts visitors differently. It uses browser fingerprinting and cookies, while GA uses a different cookie model. Bot filtering, ad blocker rates, and script loading order can also cause differences. A 10-20% variance is normal.

Can I embed the dashboard in another tool?+

The dashboard is designed for the OpsIQ admin. For external reporting, use the REST API to pull analytics data and display it in your own dashboard or BI tool.

What does the "threats" counter mean?+

It counts IP addresses that OpsIQ has flagged or blocked based on threat scoring, repeated failed logins, or manual blocks. Click the counter to see details and manage blocks.

Analytics

Visitor log

The Visitor Log shows every visit to your tracked websites. Each row is one page load from one visitor. Use it to investigate individual visitor behavior, find campaign traffic, and diagnose tracking issues.

Visitor log
Visitor logA visitor table with a filter bar (date, search IP/email/city, source, device) and columns for IP/email, location, source, device and time, with a flagged threat row.Visitor logyoursite.com7 daysSearch IP, email, city…Source ▾Device ▾IP / EMAILLOCATIONSOURCEDEVICEWHEN[email protected]US · New YorkgoogleDesktop2m41.62.10.4UK · LondondirectMobile6m[email protected]DE · Berlinutm:adsMobile14m203.0.113.9NG · LagosreferralDesktopthreat1–25 of 3,402Session →1FILTERDate · search · source · device2REAL COLUMNSIP/email · location · device · threat3DRILL INOpen the full session
The real Visitor Log: filter by date, search and device, then read every visit by IP/email, location, source, device and time — threats flagged in red.

What each row shows

IP address

The visitor's IP address. Anonymized if IP anonymization is enabled in Settings. Click to see all visits from this IP.

Country and city

Detected from the IP address using GeoIP data. Requires MaxMind GeoLite2 database or Cloudflare geo headers. Shows "Unknown" if GeoIP is not configured.

Page URL

The page the visitor loaded. Click to see the full URL. Long URLs are truncated in the table view.

Referrer

Where the visitor came from before landing on your site. "Direct" means no referrer (bookmarks, typed URLs, some app links).

Device and browser

The visitor's device type (desktop, mobile, tablet) and browser (Chrome, Safari, Firefox, etc.). Parsed from the User-Agent header.

Date and time

When the page was loaded, in your configured timezone.

Customer identity

If the visitor is identified (via identity token or login), their name or email appears. Otherwise shows as anonymous.

Filters

Date range

Filter visits to a specific time period. Default: last 7 days.

Search

Search by IP address, page URL, referrer, country, or customer email.

Source

Filter by traffic source: Direct, Organic, Social, Referral, Paid, Email.

Device

Filter by Desktop, Mobile, or Tablet.

New only

Show only first-time visitors who have never been seen before.

Worked examples

Find visitors from a specific campaign

Scenario:
You launched a Google Ads campaign with UTM parameter utm_source=google&utm_medium=cpc&utm_campaign=summer-sale. How do you find those visitors?
What to do:

In the Visitor Log, use the Search field and type "summer-sale". The search checks referrer URLs and page URLs, so UTM parameters will match. You can also filter by Source = Paid to narrow down further.

Find a customer who reported a problem

Scenario:
A customer emailed saying "your checkout page was broken yesterday around 3pm." How do you find their session?
What to do:

Search by their email address in the Visitor Log. If they were logged in, their identity will appear. Set the date range to yesterday. Look for visits to checkout pages around 3pm. Click their session to see the full page flow and any JavaScript errors.

Detect a loop hitter or scraper

Scenario:
You notice an IP address has 500+ visits in one hour, all to the same page.
What to do:

This is likely a bot, scraper, or broken script. Go to the Visitor Log and search by that IP. Check: (1) Are all visits to the same page? (2) Is the user agent a known bot? (3) Is the session duration always 0 seconds? If confirmed as a bot, go to Security and block the IP.

Visitor log vs Sessions vs Live feed

Visitor log

Raw page loads. One row per page view. Best for: investigating specific pages, finding traffic from specific sources, diagnosing tracking issues.

Sessions

Groups page views into journeys. One row per visit session. Best for: understanding user flow, measuring session duration, identifying conversion paths.

Live feed

Real-time activity. Shows visitors currently on your site. Best for: monitoring campaigns in progress, spotting high-intent visitors, watching support opportunities.

Why do I see my own visits in the log?+

OpsIQ tracks all visits by default. To exclude your own traffic, add your IP address to the excluded IPs list in Settings > Tracking.

Why does a visitor show "Unknown" country?+

GeoIP lookup requires either Cloudflare geo headers (automatic if using Cloudflare) or a MaxMind GeoLite2 database file. Check Settings > GeoIP Path to ensure the database file exists and is readable.

How long is visitor data kept?+

Visitor data is kept for the retention period configured in Settings (default: 90 days). After that, old records are automatically cleaned up by the cron retention job.

Analytics

Sessions

Sessions group multiple page views from the same person into a single journey. While the Visitor Log shows individual page loads, Sessions show you how people move through your website from landing to exit.

Sessions
SessionsThe Session Log table with IP, country, device, source, duration and pages columns, and a flagged threat row.Sessionsyoursite.comCountry (NG)Session LogIP(S)COUNTRYDEVICESOURCEDURATIONPAGES41.62.10.4UKDesktopgoogle3m 12s6102.89.6.2NGMobiledirect1m 05s388.21.4.9DEDesktoputm:ads7m 48s11203.0.113.9USMobilereferral0m 42s21SESSION LOGGrouped journeys2COLUMNSCountry · device · source · duration3THREATRisky sessions flagged
The real Session Log: every visitor journey as a row — IP, country, device, source, duration and pages — with risky sessions flagged in red.

How sessions work

A session starts when a visitor loads their first page. It continues as they navigate to more pages. A session ends when the visitor is inactive for the session timeout period (default: 30 minutes) or closes their browser. The same person returning after the timeout creates a new session.

What each session shows

First page

The landing page — where the visitor entered your site. This tells you which content is attracting people.

Last page

The exit page — where the visitor left. If the exit page is often the pricing page, visitors might be comparing you with competitors.

Page count

How many pages the visitor viewed in this session. More pages usually means more engagement, but it can also mean the visitor is lost.

Duration

Total time from first page load to last activity. Sessions with 0 seconds are bounces (single page view, no further interaction).

Source

The traffic source for this session (Direct, Google, social, referral, etc.).

Country

Detected country from the visitor's IP address.

Bounce

Whether the visitor left after viewing only one page. Bounced sessions have a red indicator.

Conversion

Whether the visitor completed a tracked conversion event (purchase, signup, form submission) during this session.

Filters

Search

Search by IP, email, page URL, or referrer within sessions.

Type

Filter by New visitors (first session ever) or Returning visitors.

Source

Filter by traffic source.

Country

Filter by country to see sessions from a specific region.

Threats/Bounced

Filter to show only bounced sessions or sessions flagged as threats.

Worked examples

Profile a high-value customer

Scenario:
A customer just made a large purchase. You want to understand their journey before buying.
What to do:

Search for their email in Sessions. Look at all their sessions: (1) How many times did they visit before buying? (2) Which pages did they view? (3) Did they use chat or open a ticket? (4) What was the total time from first visit to purchase? This tells you the typical buying journey for high-value customers.

Detect login from a new location

Scenario:
A customer usually logs in from Nigeria but you see a session from Russia.
What to do:

Search for the customer email in Sessions. Compare the country of recent sessions. If a session suddenly appears from an unusual country, it could be legitimate travel or a compromised account. Check: (1) Was there a failed login attempt before the successful one? (2) Did the IP change within the same session? Flag it for review if suspicious.

What is the difference between a session and a visitor?+

A visitor is a person (or browser). A session is one visit from that person. The same visitor can have many sessions over time. Sessions expire after the timeout period.

How does OpsIQ identify returning visitors?+

OpsIQ uses a combination of cookies, browser fingerprinting, and authenticated identity tokens. If a visitor clears their cookies and is not logged in, they will appear as a new visitor.

Analytics

Live feed

The Live Feed shows visitors currently on your website in real time. It updates automatically every 15 seconds (configurable). Use it during campaigns, product launches, and busy support periods to see what is happening right now.

Live feed
Live feedA real-time activity stream showing a live online-visitor count and a feed of recent visitor actions by country.Live feedyoursite.com37visitors online nowLive activitynowUS · viewing /pricing2sUK · started a chat5sDE · added to cart9sCA · completed signup1RIGHT NOWSee who is on-site2AUTO-REFRESHUpdates every 15s3ACTJump into a live chat
See who is on your site this second and what they are doing — refreshing automatically every 15 seconds.

How it works

The Live Feed polls your server at the configured refresh interval. Each row shows a visitor currently on your site: their current page, country, device, source, session duration, and page count. Green highlights indicate new activity since the last refresh. Click any visitor row to see their full session details.

Settings

Refresh interval

How often the live feed updates. Default: 15 seconds. Lower values (5-10s) give faster updates but use more server resources. Higher values (30-60s) are easier on the server but less real-time.

Active threshold

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

Pause button

Click Pause to stop auto-refresh. Useful when you want to read details without the list updating. Click Resume to restart.

Worked examples

Spot a hot lead during a campaign

Scenario:
You are running a product launch. A visitor just viewed your homepage, then features, then pricing, and is now on the checkout page.
What to do:

This is high-intent behavior. In the Live Feed: (1) Click the visitor to see their session. (2) If they start a chat, the AI will have their full journey context. (3) If they leave without buying, they become a lead in the Leads page. (4) Consider creating a proactive rule to show a chat message when visitors reach checkout.

Too many visitors from the same IP

Scenario:
You see 20 visitors from the same IP address, all on different pages.
What to do:

This could be: (1) An office with shared internet — check if the visits look like real humans (different pages, reasonable session durations). (2) A bot or scraper — check if sessions are very short (0-1 seconds) or hitting pages systematically. (3) A load test — if you are running automated tests, exclude the IP from tracking.

Why does the live feed show 0 visitors when my site has traffic?+

Check: (1) Is the widget script installed on your site? (2) Is the site key correct? (3) Has the active threshold passed? (4) Are visitors using aggressive ad blockers that block the tracking script?

Can I filter the live feed by country or device?+

The live feed shows all active visitors. For filtered views, use the Visitor Log or Sessions pages with their filter options. The live feed is intentionally simple for real-time monitoring.

Analytics

Top pages

Top Pages shows which pages on your website get the most traffic. It ranks pages by visits, engagement, conversions, and support activity. Use it to identify your best content, find underperforming pages, and discover pages that generate support questions.

Top pages
Top pagesA ranked list of the most-visited pages with horizontal visit bars and counts.Top pagesyoursite.comMost-visited pages/pricing3,402/2,910/docs1,740/blog/seo-guide980/signup6401RANKEDMost-visited pages2SIGNALSVisits & conversions3FINDPages that drive tickets
Your pages ranked by traffic and engagement, so you can spot top content and pages that generate support.

What each page shows

Page URL

The full URL path. Similar pages (e.g., product variants) are grouped if grouping is enabled.

Views

Total number of times this page was loaded in the selected date range.

Unique visitors

How many different people viewed this page (a person viewing the same page twice counts as 1 unique).

Bounce rate

Percentage of visitors who left your site after viewing only this page. High bounce on landing pages = problem. High bounce on "thank you" pages = normal.

Average time

How long visitors spend on this page on average. Very short = not reading. Very long on a form page = confusion.

Chat starts

How many chat conversations were started from this page. High chat starts on a product page means the product description might be unclear.

Support tickets

How many support tickets were created by visitors who were on this page. High ticket count = potential UX or content problem.

Worked examples

Find pages that drive support questions

Scenario:
Your support team keeps getting questions about shipping. Which page is failing?
What to do:

Sort Top Pages by "Support tickets" or "Chat starts" descending. Look for product or shipping pages with high counts. The page with the most support questions probably has unclear information. Fix the page content and monitor whether support questions decrease.

Find pages with high exit rate

Scenario:
You want to know where people leave your site most often.
What to do:

Sort by bounce rate descending. Ignore pages that are naturally exit points (thank you pages, confirmation pages). Focus on pages that should keep visitors engaged: product pages, pricing, features. These need better calls-to-action or clearer content.

Why does a page show 0 views even though I know it gets traffic?+

Check: (1) Is the tracking widget installed on that specific page? Single-page apps might not fire page views on route changes. (2) Is the page excluded in tracking settings? (3) Is a CDN serving a cached version without the tracking script?

Analytics

Geo intelligence

Geo Intelligence shows where your visitors come from by country, city, device, and source. Use it to understand your geographic markets, decide on language support, plan regional marketing, and detect suspicious traffic patterns.

Geo
Geo intelligenceA map of visitor locations beside a per-country bar ranking.Geo intelligenceyoursite.comVisitors by locationUSUKDECANG1MARKETSCountry, city, device2PLANLanguage & regions3WATCHSpot odd traffic
Where your visitors come from — by country, city and device — to size markets and spot unusual traffic.

What you see

Top countries bar chart

The top countries ranked by visitor count. Click a country to drill down to city-level data.

Country doughnut

Visual breakdown of traffic by country. Hover for percentages.

Full country table

Every country with visitors in the selected period, showing visitor count, session count, bounce rate, and conversion rate.

City drill-down

Click a country to see which cities within that country have the most visitors.

How GeoIP detection works

OpsIQ detects visitor location in two ways: (1) Cloudflare geo headers — if your site is behind Cloudflare, country detection is automatic and accurate. (2) MaxMind GeoLite2 database — download the free database and configure the path in Settings. City-level detection requires the GeoLite2-City database, not just the Country database.

VPN and proxy traffic

Visitors using VPNs will appear to come from the VPN server's location, not their real location. This is by design — OpsIQ cannot and should not try to bypass VPNs. If you see unusual country patterns, consider that 10-20% of visitors may be using VPNs.

Worked examples

Unexpected country traffic

Scenario:
You run a US-only business but 30% of traffic is from India.
What to do:

Check: (1) Are these real visitors? Look at session duration and pages viewed. Very short sessions with high bounce = likely bots. (2) Are they finding you through Google? Check the referrer. (3) Could they be potential customers in a new market? If the traffic is genuine and engaged, consider adding India-specific pricing or content.

Deciding on language support

Scenario:
You want to know if you should translate your site into Spanish.
What to do:

Look at the Geo Intelligence page. If Spanish-speaking countries (Spain, Mexico, Colombia, Argentina, etc.) together represent more than 10% of your traffic with low bounce rates, translation is worth considering. Also check: do visitors from these countries convert at similar rates to your primary market?

Regional support shift planning

Scenario:
You need to decide support team hours for different time zones.
What to do:

Use the hourly heatmap (on Dashboard) combined with Geo Intelligence. If 40% of your traffic is from Europe and 35% from the US, you need coverage for both time zones. The heatmap shows exactly when each region is most active.

Country with visits but no orders

Scenario:
Germany shows 500 visitors this month but zero sales.
What to do:

Investigate: (1) Are they bouncing on the pricing page? Maybe your pricing is not competitive for that market. (2) Do you ship to Germany? Check if your shipping page mentions Germany. (3) Is your checkout available in EUR? Currency mismatch causes abandoned checkouts. (4) Are these visitors from a single source that might be low-intent traffic?

Why does a visitor show "Unknown" country?+

GeoIP is not configured. Either set up Cloudflare (which adds geo headers automatically) or download the MaxMind GeoLite2 database and set the file path in Settings > GeoIP Path.

Can I block traffic from specific countries?+

OpsIQ does not block by country. Use your web server or Cloudflare firewall rules for country-based blocking. OpsIQ focuses on visibility, not access control at the network level.

Analytics

Intent funnel

The Intent Funnel classifies visitor sessions by what they seem to be trying to do: browse, research, compare, buy, get support, or leave. Use it to understand the balance of intent on your site and identify where visitors drop off.

Intent funnel
Intent funnelA funnel from Browse to Research to Compare to Buy with counts, plus support and leaving chips.Intent funnelyoursite.comBrowse — 8,200Research — 4,100Compare — 1,650Buy — 520Support 6%Leaving 11%1CLASSIFYWhat visitors want2STAGESBrowse to buy3FIXFind the drop-off
Sessions classified by intent — browse, research, compare, buy — so you can see exactly where people drop off.

Intent categories

Browsing

Visitors casually looking around. Short sessions, few pages, no specific goal detected.

Researching

Visitors reading product/feature pages, docs, or blog content. Longer time on page, multiple content pages.

Comparing

Visitors viewing pricing, plan comparison, or feature tables. Often returning visitors.

Buying

Visitors on checkout, cart, or signup pages. High intent — these are your conversion opportunities.

Support-seeking

Visitors on help pages, contact pages, or starting chat. They need assistance.

Bouncing

Visitors who left after one page. Low engagement.

How to read the funnel

Interpreting your funnel

Scenario:
1,000 visitors viewed Pricing. 270 opened chat. 92 started checkout. 64 paid. 18 opened support tickets.
What to do:

Pricing page is strong enough to create intent. Chat is important in the buying path — 27% of pricing visitors engage with chat before buying. Support tickets after checkout may indicate activation or payment confusion. Action: (1) Ensure AI chat answers pricing questions well. (2) Investigate the 18 post-checkout support tickets for common issues.

Time filters

Use the date range filter to compare intent patterns across periods. For example, compare Black Friday week to a normal week — you should see a spike in "Buying" intent and possibly "Support-seeking" if your promotions created confusion.

How does OpsIQ classify intent?+

OpsIQ looks at page URLs, session behavior, and time patterns. Pricing pages signal comparison intent. Checkout pages signal buying intent. Help/contact pages signal support intent. The classification is heuristic-based, not AI-driven.

Can I customize the intent categories?+

Not currently. The categories are built-in based on common web behavior patterns. Custom intent classification is on the roadmap.

Analytics

Funnels, retention and paths

Build custom journeys from page or event steps, measure cohort retention and discover the paths visitors most often take through a site.

Product screen
FunnelsA custom funnel displays each page/event step, the remaining visitors and the conversion percentage.FunnelsworkspaceSTEPS4CONVERSION28.4%WINDOW72hLIVE WORKSPACE VIEWPricing viewed1,420 visitors100%Plan selected780 visitors54.9%Checkout started530 visitors37.3%Order completed403 visitors28.4%1DEFINEChoose 2–8 steps2MEASURESet conversion window3IMPROVEFind the biggest drop
A custom funnel displays each page/event step, the remaining visitors and the conversion percentage.

Funnels

Create a named funnel with 2 to 8 page or event steps. Set the conversion window in hours; a visitor counts only when the ordered steps occur inside that window. Use the drop between steps to choose where to inspect replay, errors, page speed or messaging.

Retention

Retention groups visitors into weekly cohorts and shows how many return. Choose a 6, 8 or 12 week horizon. Keep the cohort definition stable when comparing releases or campaigns.

Paths

Paths lists the most common page sequences. Choose a path length from 2 to 5 pages to keep the result readable. Use it to find unexpected detours, common exits and content that repeatedly precedes conversion.

Custom funnels are analytical definitions, not automations. To react to a completed step, create a conversion goal, segment, trigger or workflow.

Analytics

Session replay

Session Replay lets you watch a timeline of what a visitor did on your site: which elements they clicked, how they scrolled, where they hovered, and what they typed (with sensitive fields masked). Use it to diagnose UX problems, verify bug reports, and understand customer confusion.

Session replay
Session replayA replay player showing a page viewport with a cursor, a session info panel, and a timeline scrubber.Session replayyoursite.comBuy nowSESSIONDuration 3m 12s14 clicksUS · DesktopChrome 1241WATCHClicks, scroll, type2MASKEDSensitive fields hidden3DIAGNOSEVerify bug reports
Replay exactly what a visitor did — clicks, scrolls, typing (sensitive fields masked) — on a timeline scrubber.

Finding the right session

From the Sessions page, look for sessions with reported issues, high page counts with no conversion, or sessions from customers who filed support tickets. Click the replay icon to open the timeline view.

What replay shows

Timeline

A horizontal bar showing events over time. Click anywhere on the timeline to jump to that moment.

Page navigation

Each page load appears as a segment on the timeline. You can see the exact path the visitor took.

Clicks

Click events are shown as dots on the timeline and as highlights on the page reconstruction.

Scrolling

Scroll depth is tracked so you can see how far down the visitor read.

Form interaction

Field focus and typing events are recorded. Text input in password and sensitive fields is masked by default.

Privacy and masking

Session replay masks sensitive form fields by default. Password fields, credit card inputs, and fields marked with data-opsiq-mask are never recorded. You can configure additional masking rules in Settings > Tracking. If your compliance policy requires it, you can disable replay entirely.

Diagnosing a broken checkout

Scenario:
A customer says "I tried to buy but the button did nothing."
What to do:

Find their session in the Sessions page (search by email). Open the replay. Watch the checkout page segment. Look for: (1) Did they click the right button? (2) Did a JavaScript error occur? (Check the JS Errors page for that time.) (3) Did the page reload or show an error message? (4) Was a required field empty? The replay shows exactly what happened.

How much storage does session replay use?+

Replay data grows with traffic volume. Use retention settings to automatically clean up old replay data. For high-traffic sites, consider a shorter replay retention period (e.g., 30 days) to manage storage.

Can visitors opt out of replay?+

If "Respect Do Not Track" is enabled in Settings, visitors with DNT headers are not recorded. You can also exclude specific pages from replay in the tracking settings.

Analytics

Events log

The Events Log shows every event that OpsIQ has recorded: page views, clicks, chat starts, ticket creations, sales, and custom events. Use it to debug integrations, verify webhook delivery, and understand the sequence of actions.

Events log
Events logA chronological event log with colour-coded type badges: pageview, chat, sale, webhook and custom.Events logyoursite.compageviewUS · /pricing12:04:01chat.startUK · widget opened12:04:09sale$49.00 · order #104212:05:22webhookpayment.succeeded12:05:23customdemo_booked12:06:101EVERYTHINGEvery recorded event2DEBUGVerify webhook delivery3ORDERSee the exact sequence
A timeline of everything OpsIQ records — pageviews, chats, sales, webhooks, custom events — for debugging and audit.

Built-in events (automatic)

pageview

Fired every time a tracked page loads. Includes URL, title, referrer, and timestamp.

chat.started

Fired when a visitor opens the chat widget and sends their first message.

chat.message

Fired for each message in a chat conversation (both visitor and AI/agent).

ticket.created

Fired when a new support ticket is created (from chat, email, widget, or admin).

ticket.replied

Fired when a reply is added to a ticket.

order.completed

Fired when a purchase is completed through a connected platform.

form.submitted

Fired when a tracked form is submitted (if form tracking is enabled).

identify

Fired when a visitor is identified via an identity token.

security.login_failed

Fired when a login attempt fails.

Custom events

You can send custom events from your website or server to OpsIQ. Custom events are useful for tracking actions specific to your business: button clicks, feature usage, video plays, downloads, etc.

JavaScript — custom event from browser
// Send a custom event from the browser
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "plan_selected", {
  plan: "pro",
  billing: "annual",
  value: 99
}]);
PHP — record a contact activity from your 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);

Filtering events

Event type

Filter by specific event names: pageview, chat.started, ticket.created, etc.

Date range

Show events from a specific time period.

Search

Search event data by keyword (URL, email, event property values).

How long are events kept?+

Events follow the retention policy set in Settings. Default: 90 days. High-value events (purchases, security events) can be configured with longer retention.

Can I use events in A/B experiments?+

Yes. When creating an experiment, you choose a conversion event. Any built-in or custom event can be used as the conversion goal.

Analytics

A/B experiments

Experiments let you test two versions of a page or feature and measure which one performs better. OpsIQ tracks impressions, conversions, and statistical significance.

A/B experiments
A/B experimentsTwo variant cards comparing conversion rates, with a winner badge and significance on the leading variant.A/B experimentsyoursite.comVariant A4.2%conversion · 1,020 viewsVariant BWINNER6.8%conversion · 1,005 views+62% lift · 96% significant1TESTTwo variants head-to-head2MEASUREConversions & significance3DECIDEDeclare a winner
Run two variants, watch conversions and statistical significance, and declare the winner.

How experiments work

1
Create an experiment

Give it a name, define your primary metric (conversion event), and set the variants (control and test).

2
Run it

OpsIQ randomly assigns visitors to variants and tracks their behavior. Do not change the experiment while it is running.

3
Read the results

After enough data is collected, check confidence level. 95% confidence means you can be 95% sure the difference is real, not random chance.

Experiment states

Draft

Created but not yet started. You can still edit variants and metrics.

Running

Actively assigning visitors to variants. Do not edit while running.

Completed

Reached statistical significance or was manually stopped. Results are final.

Archived

Results have been reviewed and the experiment is no longer needed in the active list.

Best practices

Define your metric before launch

Decide what you are measuring before starting. Choosing a metric after seeing results introduces bias.

Exclude internal traffic

Add your team's IP addresses to the exclusion list so staff visits do not skew results.

Run long enough

Do not stop an experiment after 100 visitors. You need hundreds or thousands of visitors per variant for reliable results.

Test one change at a time

If you change the headline AND the button color, you will not know which change caused the improvement.

Record your decision

After the experiment ends, note which variant won and why you chose to implement it.

How many visitors do I need for a valid experiment?+

It depends on the baseline conversion rate and the effect size you want to detect. As a rule of thumb: at least 500 visitors per variant for a 20% effect size. For smaller effects, you need thousands.

Can I run multiple experiments at the same time?+

Yes, but be careful. If two experiments affect the same page, their results may interact. It is safer to run experiments on different pages or features simultaneously.

Analytics

JavaScript errors

JavaScript Errors collects client-side errors from your website visitors. A broken button, a failed API call, or a missing resource shows up here. Use it to find and fix bugs that affect real customers.

JS errors
JavaScript errorsA list of captured front-end errors with severity dots, source file, browser and occurrence counts.JavaScript errorsyoursite.comRecent errorsTypeError: cannot read x of undefinedcheckout.js:42 · Chrome×214404 loading /assets/app.cssindex · Safari×88Uncaught (in promise) NetworkErrorapi.js:17 · Firefox×51Deprecation warning: unload eventvendor.js · Edge×331CAPTUREClient-side errors2IMPACTCounts & browsers3FIXSquash real bugs
Real visitors hitting broken code surface here — message, source, browser and how often — so you can fix what matters.

What each error shows

Error message

The JavaScript error text (e.g., "TypeError: Cannot read properties of undefined").

Page URL

Which page the error occurred on.

Browser and device

Which browser and device type saw the error. Some errors are browser-specific.

Stack trace

The code location where the error occurred. Click to expand the full stack trace.

First seen

When this error first appeared.

Last seen

When this error most recently occurred.

Count

How many times this error has been recorded.

Affected sessions

How many different visitor sessions experienced this error.

Prioritizing errors

Not all JavaScript errors need immediate attention. Prioritize by: (1) errors on critical pages (checkout, signup, login), (2) errors with high session counts, (3) errors that appeared recently (possible regression from a code change), (4) errors on your own code (not third-party scripts).

Fixing a broken checkout button

Scenario:
The JS Errors page shows "TypeError: Cannot read properties of undefined (reading submit)" on /checkout, affecting 45 sessions this week.
What to do:

This means 45 real customers could not complete checkout. Steps: (1) Open the page in the same browser/device combination. (2) Open browser console and reproduce the error. (3) Check the stack trace to find the exact line of code. (4) Fix the bug, deploy, and monitor the error count going to zero.

Does OpsIQ capture errors from third-party scripts?+

Yes, OpsIQ captures all JavaScript errors on the page, including errors from analytics scripts, chat widgets, and ad scripts. Filter by URL in the stack trace to focus on your own code.

How do I exclude known harmless errors?+

You cannot suppress specific errors in OpsIQ, but you can filter the list by page URL or error message. Fix or ignore errors from browser extensions (they often show as errors from unknown sources).

Sales

Sales and conversions

Sales tracking connects your store or billing platform to OpsIQ so you can see revenue alongside visitor behavior. Every purchase is attributed to a visitor journey so you know which pages, campaigns, and channels drive revenue.

Sales
SalesThe Sales screen: a revenue total with an All-time period control, a search, and a Recent Purchases table (date, customer, platform, amount, source).Salesyoursite.comREVENUE$42,180+18%All time ▾Search email, IP, Order ID…Recent PurchasesDATECUSTOMERPLATFORMAMOUNTSOURCEJun 3[email protected]Shopify$49googleJun 3[email protected]WooCommerce$129directJun 2[email protected]Stripe$480ads1REVENUEOrders & renewals2RECENT PURCHASESDate · customer · amount3ATTRIBUTEDTo the traffic source
The real Sales screen — revenue up top, then Recent Purchases (date, customer, platform, amount), each attributed to its traffic source.

Sales dashboard

Today's sales

Revenue from orders completed today. Refreshes with each new order event from your connected platform.

This week / this month / total

Revenue aggregated over the period. Refunds are subtracted from these totals.

Trend chart

Line graph showing daily revenue over the selected date range. Look for spikes (promotions, campaigns) and dips (issues, seasonal).

Top converting sources

Which traffic sources lead to the most purchases. "Direct" buyers often bookmarked your site. "Google" buyers found you through search.

Recent purchases

The latest orders with customer email, amount, currency, and items purchased.

Platform setup guides

Shopify

Go to Connectors > Shopify. Create a custom app in your Shopify admin (Settings > Apps and sales channels > Develop apps). Grant scopes: read_orders, read_customers, read_products. Copy the Admin API access token. In OpsIQ, enter your store domain (e.g., your-store.myshopify.com) and the access token. Click Test Connection. If successful, enable webhook sync for real-time order notifications.

WooCommerce

Go to Connectors > WooCommerce. In your WordPress admin, go to WooCommerce > Settings > Advanced > REST API. Create a key with Read/Write permission. Copy the consumer key and consumer secret. In OpsIQ, enter your site URL, consumer key, and consumer secret. Click Test Connection.

BigCommerce

Go to Connectors > BigCommerce. In your BigCommerce admin, go to Advanced Settings > API Accounts. Create a V2/V3 API Account with read scope for Orders, Customers, and Products. Copy the access token, client ID, and API path. Enter them in OpsIQ and test.

Magento 2

Go to Connectors > Magento. In your Magento admin, go to System > Integrations. Create a new integration with API resource access to Sales, Customers, and Catalog. Activate the integration and copy the access token. Enter it in OpsIQ with your Magento base URL.

PrestaShop

Go to Connectors > PrestaShop. In your PrestaShop admin, go to Advanced Parameters > Webservice. Enable the webservice and create a new key. Grant access to orders, customers, and products. Copy the key and enter it in OpsIQ with your store URL.

OpenCart

Go to Connectors > OpenCart. Generate API credentials from your OpenCart admin panel. Enter the API URL, username, and key in OpsIQ. The connector uses OpenCart's REST API for order and customer data.

osCommerce

Go to Connectors > osCommerce. Configure database access or API credentials as documented in the connector settings. osCommerce integration typically requires direct database access or a custom API module.

Stripe

Go to Connectors > Stripe. Copy your Stripe restricted API key from the Stripe Dashboard (Developers > API keys). The key needs read access to Customers, Charges, Invoices, and Subscriptions. Enter it in OpsIQ. Configure webhook endpoint for real-time events.

Paystack

Go to Connectors > Paystack. Copy your Paystack secret key from the Paystack Dashboard. Enter it in OpsIQ. Configure webhook URL for transaction notifications.

Custom / other platforms

Use the REST API or webhooks to send sales events from any platform. Send order.completed events with customer email, amount, currency, and items. See the Events API section for the payload format.

Understanding your sales funnel

Top converting sources

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.

Refunds

Refunded orders are tracked separately. They reduce your net revenue totals. If refund rates are high from a specific source, the traffic might be low quality.

Currency handling

OpsIQ stores the original transaction currency and amount. Multi-currency businesses see revenue in each currency. Normalized reporting uses the configured exchange rate.

Worked examples

100 visitors, zero sales

Scenario:
Your pricing page gets 100 visitors per day but zero conversions.
What to do:

Investigate: (1) Use Session Replay on pricing page visitors. Watch how they interact with the pricing table. (2) Check Top Pages for the pricing page bounce rate and time-on-page. (3) Check Chat conversations from pricing page visitors — what questions do they ask? (4) Compare your pricing page to competitors. (5) Try an A/B experiment with different pricing layouts.

Attribution for a marketing campaign

Scenario:
You sent an email campaign with UTM tags. How do you measure its revenue impact?
What to do:

Go to Sales and filter by source. Search for the campaign UTM parameter. You will see: (1) How many visitors came from the email. (2) How many converted to sales. (3) Total revenue attributed to the campaign. (4) Compare to the same period before the campaign.

Why does Sales show zero even though my store has orders?+

Check: (1) Is the platform connector connected and healthy? Go to Connectors and check the status. (2) Is webhook sync enabled? If using polling, is the cron job running? (3) Does the connector have the right API scopes? For Shopify, you need read_orders.

How does OpsIQ attribute a sale to a visitor?+

When an order comes in via the connector, OpsIQ matches the customer email to a known visitor. If the visitor was tracked before the purchase, the sale is attributed to their visitor journey, including the traffic source, landing page, and session history.

Can I manually add sales?+

You can send sales events via the REST API or webhooks from any system. The event format is documented in the Events API section.

Sales

Leads

Leads are visitors or customers who show buying or support intent. OpsIQ automatically detects leads based on behavior: pricing page visits, return visits, chat interactions, checkout starts, and high engagement. Use the Leads page to prioritize follow-up and feed your CRM pipeline.

Leads
LeadsThe Leads screen: a searchable table with IP/email, location, device, source and time-on-site columns, and top source and country.Leadsyoursite.comSearch IP, city, country…Top source: google · Top country: USIP / EMAILLOCATIONDEVICESOURCETIME41.62.10.4UK · LondonMobilegoogle4m 12s[email protected]US · New YorkDesktopdirect7m 02s[email protected]DE · BerlinMobileutm:ads5m 40s203.0.113.9CA · TorontoDesktopgoogle3m 28s1DETECTEDHigh-intent visitors2TOPLead sources & countries3ENRICHEDIP, location, device, time
The real Leads screen — high-intent visitors as a searchable table (IP/email, location, device, source, time on site) with top sources and countries.

What makes a lead

Pricing page visits

Visitors who view your pricing or plans page are actively considering a purchase.

Return visits

Visitors who come back multiple times are engaged but not yet converted.

Chat interactions

Visitors who start a chat are actively seeking help — either pre-purchase or post-purchase.

Checkout starts

Visitors who reach the checkout page but do not complete the purchase.

Form submissions

Visitors who submit a contact form, demo request, or signup form.

High page engagement

Visitors who view many pages with long session duration are deeply researching.

Lead detail panel

Click any lead to see their full profile:

Identity

Name, email, company if known. Anonymous leads show IP and location.

Sessions

All sessions from this lead with page flow, duration, and source.

Pages viewed

Every page they visited, ordered by recency.

Source

How they found you: organic, paid, social, referral, direct.

Lead score

A 0-100 score based on behavior intensity, recency, and page intent.

CRM status

Whether this lead has been added to the CRM as a contact or deal.

Sales tip

AI-generated suggestion on what to do next (e.g., "Visited pricing 3 times — consider proactive outreach").

High-value lead badge

Leads with a score above 80 get a "High Value" badge. These are your hottest prospects. Prioritize them for outreach, proactive chat, or CRM pipeline entry.

Worked examples

Working a hot lead

Scenario:
A lead viewed your pricing page 3 times in 2 days, started a chat asking about enterprise plans, but has not purchased.
What to do:

This is a high-intent lead. Steps: (1) Check their lead detail for company and role information. (2) Review the chat transcript for specific needs and objections. (3) Create a deal in the CRM with the information gathered. (4) Assign a follow-up task for a sales team member. (5) If they return to the pricing page, the proactive chat rule can trigger a personalized message.

Converting anonymous leads to CRM contacts

Scenario:
You have 50 anonymous leads with high scores but no email addresses.
What to do:

Options: (1) Create a proactive rule that offers a discount or resource download in exchange for email on high-intent pages. (2) Use the chat widget to ask for email when anonymous visitors start a conversation. (3) Add an identity token to your login/signup pages so returning visitors are automatically identified.

How is the lead score calculated?+

The score considers: recency of visits (recent = higher), frequency of visits (more = higher), pages viewed (pricing/checkout = higher), session duration (longer = higher), chat interactions (engaged = higher), and return visits (multiple sessions = higher).

Can I customize lead scoring rules?+

Yes. In CRM Configuration, you can add lead-scoring rules that boost the score based on specific keywords, events, sources, or page patterns.

CRM

Your CRM — start here

OpsIQ ships a full AI-first CRM that captures customer truth, cleans data, scores leads, coaches deals, forecasts revenue, and acts — with website intelligence, support, tickets, products and payments as one live graph. Every AI action is sourced, explainable, reversible and approval-controlled.

AI CRM
AI CRM overviewA Trust Dial set to Copilot beside four AI agent cards: Steward, Prospector, Retention and Analyst.AI CRMworkspaceTrust DialManualCopilotAutopilotHow much the AI does on its ownDSStewardDedupe, enrich,validate dataSDRProspectorFind & scorenew businessRTRetentionSpot churn,drive renewalsANAnalystForecast &explain numbers1AI-FIRSTFour specialist agents2YOU DECIDETrust Dial autonomy3TRUSTEDSourced & reversible
An AI-first CRM run by four specialist agents — and a Trust Dial that decides how much they do on their own.

CRM pages overview

AI CRM (Command Center)

Start here

Your daily home screen: revenue pulse, what AI found, what it did, approval queue, next moves, agent health, and ROI.

Contacts

Core

People and companies in your CRM. Search, filter, score, and manage profiles.

Pipeline

Core

Visual deal board with drag-and-drop stages, win probability, and AI coaching.

Forecast and Reports

Core

Board-grade forecasting: committed, likely, best case, with confidence intervals and accuracy tracking.

Lifecycle

Core

Where every customer stands: active, at risk, expansion ready, renewal due, or churning.

Build my CRM

Config

Describe your CRM setup in plain English. OpsIQ generates a reversible plan and applies it on approval.

CRM Health

Ops

Self-check page: schema, agents, routes, AI actions, and live data counts.

How OpsIQ keeps you safe

Ask before acting

AI proposals go to the approval queue. You approve, edit, or reject each one. Nothing happens without your say.

Never overwrite

When AI suggests a change, it shows the current value and the proposed value. Human-entered data has provenance protection.

Everything is reversible

Every AI action is recorded in the journal. You can undo any change with one click.

Explainable

Every AI recommendation shows its reasoning and the data sources it used. No black box.

Brand new? Start here

1
Open AI CRM

Click AI CRM in the left navigation. The Command Center shows your current state.

2
Check CRM Health

Open CRM Health to verify the schema, agents, and routes are ready.

3
Import contacts

If a connector is active (Shopify, WHMCS, etc.), contacts are imported automatically. Otherwise, import via CSV or create manually.

4
Create a pipeline

Go to Pipeline and create your first pipeline with stages (e.g., Lead, Qualified, Proposal, Negotiation, Won, Lost).

5
Add your first deal

Create a deal from a contact, set the amount and stage, and let the Deal Coach guide you.

Do I need to use the CRM?+

No. The CRM is optional. OpsIQ works perfectly as a tracking + support + AI platform without the CRM. Enable it when you are ready to manage sales and customer relationships.

Can the CRM work without connectors?+

Yes. You can create contacts and deals manually. Connectors enrich the CRM with platform data (orders, subscriptions, tickets) but are not required.

What is the Trust Layer?+

The Trust Layer is the safety system that controls what the AI can do. Copilot mode (default): AI proposes, human approves. Autopilot mode (opt-in): AI acts automatically on low-risk, reversible operations.

CRM

The AI CRM home screen

The Command Center is your daily briefing. Open it every morning to see what happened, what needs attention, and what to do next.

Command Center
CRM Command CenterThe CRM home with Forecast/Win-rate/Pipeline toggles, a weighted-forecast KPI, and an AI proposal queue with Approve and Dismiss on each row.CRM Command CenterworkspaceForecastWin ratePipelineFORECAST · THIS Q$74k87%AI proposals · approve queueCreate deal · Acme $24kfrom a chat with the buyerApproveDismissMove Nimbus → Proposalpositive reply detectedApproveDismissLog task · follow up Peakno activity in 7 daysApproveDismiss1TOGGLEForecast · Win rate · Pipeline2AI PROPOSESDeals, stages, tasks3YOU DECIDEApprove or Dismiss
The real Command Center: switch between Forecast, Win rate and Pipeline, and work the AI proposal queue — approve or dismiss the deals, stage moves and tasks it suggests.

What the Command Center shows

Today's numbers

Pipeline value, deals won/lost, new leads, active deals, and revenue trend — a snapshot of your current state.

What OpsIQ found

AI-discovered insights: stalled deals, at-risk accounts, new opportunities, data quality issues, and market signals.

What OpsIQ did

Actions the AI has taken (in Autopilot) or proposed (in Copilot): stage advances, score updates, contact enrichment, and task creation.

Needs approval

Queue of AI proposals waiting for your decision. Each shows the proposed action, reasoning, and evidence. Approve, edit, or reject.

Next moves

AI-ranked list of the 10 most important things to do today: follow up on a hot deal, check an at-risk account, research a new lead, etc.

Helper status

Health of AI agents: Capture, Data Steward, Deal Intelligence, Deal Coach, SDR, Retention. Green = running, amber = needs attention, red = error.

Results

ROI tracking: deals influenced by AI, time saved, accuracy of predictions, and comparison to manual CRM work.

Morning briefing workflow

1
Read today's numbers

Check pipeline health and revenue trend. Are you on track this month?

2
Clear the approval queue

Review each AI proposal. Approve safe actions, edit where needed, reject bad suggestions.

3
Check what OpsIQ found

Read AI insights. Are any deals at risk? Are there new opportunities?

4
Work the next moves list

Start with the top priority. The AI has ranked these by urgency and potential impact.

Catching up after time off

Scenario:
You were away for a week. What happened while you were gone?
What to do:

Open the Command Center and check: (1) "What OpsIQ did" shows all AI actions during your absence. (2) "Needs approval" shows proposals waiting for your review. (3) "What OpsIQ found" highlights urgent items. (4) Set the dashboard date range to your absence period to see the trend.

CRM

Contacts, companies and deals

The CRM organizes your business relationships into four objects: Contacts (people), Companies (organizations), Deals (revenue opportunities), and Tasks (follow-up actions).

CRM objects
CRM objectsA Contact record linked to Company, Deal and Task objects in a connected graph.CRM objectsworkspaceContactperson · email · phoneCompanyaccountsDealrevenue opportunityTaskfollow-up action1OBJECTSContacts, companies, deals2LINKEDOne connected graph3TASKSFollow-ups attached
Four core objects — contacts, companies, deals and tasks — linked into one connected customer graph.

Contacts

What is a contact

A person in your CRM. They might be a customer, a prospect, a partner, or a lead. Contacts have an email, name, company, tags, lifecycle stage, and hotness score.

Finding contacts

Use the search bar to find by name, email, company, or tags. Use filters: lifecycle stage, lead score, source, country, last activity date, assigned owner.

Contact profile

Click a contact to see their full profile: personal info, company, deals, activities, tickets, chats, website visits, lead score, and AI insights.

Hotness score

A 0-100 score calculated from behavior signals: website visits, email engagement, chat interactions, purchase history, and recency. Higher = hotter.

Companies

... more tickets ...
Contact-company linking

Contacts are linked to companies by email domain or manual assignment. One company can have many contacts.

Deals

What is a deal

A revenue opportunity. Deals have a title, amount, pipeline, stage, win probability, close date, assigned owner, and associated contacts/company.

Win probability

A percentage chance of winning the deal. Set manually or calculated by AI based on your historical win data. Drives the weighted forecast.

Deal health

Green (healthy), amber (at risk), or red (stalled). Based on activity recency, stage duration, and engagement signals.

Tasks

What is a task

A follow-up action assigned to a person. Tasks have a title, due date, priority, type (call, email, meeting, other), and linked contact/deal.

AI-generated tasks

The AI creates tasks automatically when it detects something needs attention: follow up on a stalled deal, respond to an at-risk account, research a new lead.

Finding hot leads

Scenario:
You want to see all high-score contacts in the UK who have not been contacted recently.
What to do:

Go to Contacts. Filter by: Lead score > 80, Country = United Kingdom, Last activity > 7 days ago. Sort by lead score descending. These are your hottest neglected leads — prioritize outreach.

Creating a deal from a contact

Scenario:
A contact just expressed interest in your enterprise plan during a chat.
What to do:

Open the contact profile. Click "Create deal." Enter the deal title (e.g., "Acme Corp - Enterprise Plan"), amount, pipeline, and stage (e.g., "Qualified"). Set the close date and assign it to yourself. The Deal Coach will begin tracking this opportunity.

CRM

The pipeline (your deal board)

The Pipeline is a visual board where deals move through stages from left to right. Drag and drop cards to advance deals. Each card shows the deal amount, win probability, and health status.

Pipeline
CRM pipelineThe pipeline screen with Open-deals, Open-value, Weighted-forecast and Attributed-deals stats, a New-deal button, an AI Approve queue, and the Lead/Qualified/Won board.PipelineworkspaceOpen deals23Open value$128kWeighted forecast$74kAttributed deals12+ New dealApprove queue2 to reviewLEADVolt Inc$4kLume$6kQUALIFIEDNimbus$30kPeak$9kWONOrbit$48k1LIVE STATSOpen value & weighted forecast2AI QUEUEApprove proposed deals3BOARDDrag deals by stage
The real pipeline screen: live stats (open value, weighted forecast), an AI Approve queue for proposed deals, and the drag-and-drop board.

Using the pipeline board

1
View your deals

The pipeline shows all active deals as cards arranged in columns (stages). Each column header shows the total value of deals in that stage.

2
Drag to advance

Drag a card to the next stage. The win probability and counts update instantly. If the move fails (validation error), the card snaps back to its original position.

3
Check card badges

Green badge = healthy (recent activity, on track). Amber = at risk (slowing down, needs attention). Red = stalled (no activity for too long).

4
Click for details

Click a card to open the deal detail panel with contacts, activities, Deal Coach brief, and quick actions.

The approval queue

AI proposals appear in the approval queue at the top of the pipeline page. Each proposal shows what the AI wants to do, why, and the evidence. You can:

Approve

Accept the proposal as-is. The action runs through the Trust Layer and is recorded in the journal.

Edit

Modify the proposal before approving. For example, change the suggested stage or adjust the amount.

Reject

Decline the proposal. The AI learns from rejections to make better suggestions in the future.

Win probability explained

Win probability can be set manually or calculated by AI. When AI calculates it, it uses a model trained on your own closed deals (won and lost). If you don't have enough historical data, the AI uses the stage default probability. The probability drives the weighted forecast: a $10,000 deal at 30% probability contributes $3,000 to the "likely" forecast.

Moving a deal to Won

Scenario:
A customer signed the contract and paid.
What to do:

Drag the deal card to the "Won" stage. OpsIQ will: (1) Mark the deal as closed-won. (2) Update the forecast. (3) Add a "Won" activity to the timeline. (4) If configured, trigger a webhook event (crm.deal.won). (5) Update the contact lifecycle stage to "Customer."

Spotting stuck deals

Scenario:
You want to find deals that have been in the same stage for too long.
What to do:

Look for red (stalled) badges on the pipeline board. These deals have had no activity for longer than the configured rotting threshold (set in CRM Configuration > Pipelines). Click each stalled deal to see the Deal Coach's recommendation for reactivation.

Can I have multiple pipelines?+

Yes. Go to CRM Configuration > Pipelines to create additional pipelines. Common use cases: separate pipelines for new business vs. renewals, or for different products/services.

What happens when I drag a deal to "Lost"?+

The deal is marked as closed-lost. You will be asked for a loss reason. The deal is removed from the active board but can be found in the closed deals filter. The contact remains in the CRM.

CRM

Deal coaching

The Deal Coach analyzes each deal and gives you a brief with health status, risk signals, key people, a qualification checklist, meeting prep, and suggested next actions. Everything is sourced — the coach shows which ticket, chat, or activity each claim comes from.

Deal coach
Deal coachA deal card listing AI-detected risk signals with evidence sources, beside an AI recommendation and a draft-email button.Deal coachworkspaceAcme Corp — $24,000Stage: Proposal · 60% winRISK SIGNALSNo reply in 10 daysChampion went quietCompetitor mentioned in chatSources: ticket #482 · chat 6/12 · email threadAI recommendsRe-engage the economicbuyer with an ROI recapand a 7-day close plan.Draft the email1SIGNALSWhy a deal may slip2SOURCEDEvery claim cites evidence3ACTIONOne-click next step
The coach flags why a deal might slip — each signal cites its source — and hands you the next move to take.

What the coach tells you

Health explanation

Why the deal is healthy, at risk, or stalled. Specific signals: days in stage, last contact date, activity frequency, competitor mentions, objection patterns.

Signals

Categorized into: objections raised, competitor mentions, pricing discussions, support risk indicators, renewal/expansion signals. Each signal links to its source (chat transcript, ticket, email, activity).

Champion and blocker map

Who is helping the deal (champion) and who is resisting (blocker). Based on interaction analysis and contact roles.

Qualification checklist

MEDDICC or BANT checklist (configurable) showing which qualification criteria are met and which are missing. Grade: A, B, C, D, or F.

Meeting prep

Before a scheduled meeting, the coach generates a brief: agenda, key points to cover, questions to ask, risks to address, and materials to prepare.

Reply and call plans

Suggested next message or call script based on the current deal state and recent interactions.

Evidence timeline

Every claim the coach makes links to a source: a ticket number, chat transcript ID, activity date, or website visit.

How to use the coach

1
Read the brief

Open any deal and scroll to the Deal Coach section. Read the health status and key signals.

2
Close qualification gaps

Check the qualification checklist. If "Economic Buyer" is missing, plan to identify and engage the budget holder.

3
Act on suggestions

The coach suggests concrete next actions. Click to create a task, draft an email, or schedule a meeting — all routed through the approval queue.

Preparing for a big meeting

Scenario:
You have a meeting with a prospect tomorrow about a $50,000 deal.
What to do:

Open the deal and read the Meeting Prep section. It shows: (1) Key talking points based on recent interactions. (2) Objections they raised in chat last week. (3) Competitor they mentioned in a support ticket. (4) Questions to ask about their timeline. (5) Risk factors to address proactively. Use this brief to prepare a focused, evidence-based agenda.

Understanding why a deal is at risk

Scenario:
The pipeline shows a red badge on a deal you thought was going well.
What to do:

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

CRM

Forecast and reports

Board-grade forecasting with a defensible range, deal-level change explanations, and accuracy tracking so you can prove and explain your numbers.

Forecast
ForecastA quarterly forecast number with Commit, Best-case and Pipeline bands and an accuracy note.ForecastworkspaceFORECAST · THIS QUARTER$312k87% to goalCommitBest casePipelineAI-weighted by deal health and history · accuracy tracked over time1CATEGORIESCommit to pipeline2AI-WEIGHTEDBy deal health3PROVABLEAccuracy tracked
Commit, best-case and pipeline at a glance — AI-weighted by deal health, with accuracy tracked so you can defend it.

Forecast categories

Committed

Deals with 80% or higher win probability. These are your most likely wins. This should be your minimum expected revenue.

AI-weighted likely

All open deals weighted by their AI-calculated win probability. This is the most realistic prediction of what you will close.

Best case

All open deals at full value. This is the maximum possible revenue if everything goes perfectly (it rarely does).

Confidence interval

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

What changed and why

The forecast includes week-over-week change attribution. When your forecast drops by $15,000, the report explains exactly which deals caused the change: "Deal A slipped to next quarter ($8,000), Deal B lost ($5,000), Deal C reduced in value ($2,000)."

Accuracy tracking

Forecast MAPE

Mean Absolute Percentage Error — how far off your forecasts have been historically. Lower is better. A MAPE of 15% means your forecasts are typically within 15% of actual results.

Win probability calibration

Brier score measuring how well win probabilities match actual outcomes. If deals at 70% probability actually win 70% of the time, calibration is good.

Weekly snapshots

OpsIQ captures a snapshot of your forecast each week (via cron). Over time, you can see how your forecast accuracy improves.

Rollups and warnings

Per-stage conversion

How many deals move from each stage to the next. If 80% pass from Qualified to Proposal but only 20% go from Proposal to Negotiation, your proposals might need work.

Per-source win rate

Which lead sources produce the most wins. Invest more in high-win-rate sources.

Per-owner performance

How each sales team member is performing: deals won, pipeline value, average deal size, win rate.

Warnings

Sandbagging (unrealistically low probabilities), overcommitting (unrealistically high), and committed-at-risk (high-probability deals showing stall signals).

Understanding a forecast drop

Scenario:
Your quarterly forecast dropped from $180,000 to $155,000 since last week.
What to do:

Open the Forecast page and check "What changed." The report shows: "Acme Corp deal ($15,000) moved to Lost — competitor chosen. Beta Inc deal ($8,000) close date pushed to next quarter. New deal with Gamma LLC ($3,000) added this week." The net change is -$20,000 + $3,000 = -$17,000, explaining the drop from $180K to $163K (with the remaining $8K explained by probability adjustments on other deals).

CRM

Finding new business

The Prospecting Agent helps you find and research potential customers. Describe your ideal customer, add target companies, and let the AI research, score, and draft first-touch outreach.

Prospecting
ProspectingA list of AI-found prospect companies with fit notes, scores and a draft-outreach button each.ProspectingworkspaceProspects found by the SDR agentNorthwind LtdSaaS · 50 staff · hiring support88Draft outreachCobalt MfgManufacturing · 200 staff74Draft outreachMesa RetaileCommerce · 30 staff69Draft outreachVega HealthHealthcare · 80 staff63Draft outreach1FINDAI sources target accounts2SCOREFit & intent ranked3DRAFTFirst-touch written for you
The SDR agent finds target companies, scores them on fit, and drafts the first-touch outreach for your review.

One-time setup

1
Describe your ideal customer

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

2
Add target companies

Enter company domains or names you want to research. You can also let the AI suggest companies based on your ICP.

3
Review research results

The AI enriches each company with available data: size, industry, tech stack, recent news, and fit score with explanation.

4
Approve outreach

For good-fit companies, the AI drafts a personalized first-touch message. Review and approve in the queue.

Fit scoring

Each prospect gets a 0-100 fit score based on five factors:

ICP fit

How well the company matches your ideal customer profile (industry, size, location).

Urgency signals

Is there evidence they need your product now? Job postings, tech changes, complaints about competitors.

Budget proxy

Company size, funding stage, and revenue indicators suggest budget availability.

Product match

How relevant your product is to their business based on industry and technology.

Support fit

Whether you can effectively serve this customer (timezone, language, complexity).

Researching a target company

Scenario:
You want to evaluate whether acme.com is worth pursuing.
What to do:

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

CRM

Automatic follow-up sequences

Sequences automate multi-step follow-up: a mix of email, wait, task, call, and webhook steps that run automatically after you approve the initial send.

Sequences
Follow-up sequencesA horizontal sequence flow: Email, wait three days, Email, then a task, with reply detection.Follow-up sequencesworkspaceAfter you approve the first send →EmailIntroWait3 daysEmailFollow-upTaskCallSteps can be email, wait, task or webhook — a reply auto-stops the sequence.1AUTOMATEMulti-step follow-up2STEPSEmail · wait · task · webhook3YOU APPROVEFirst send is gated
Automated multi-step follow-up — email, wait, email, task — that you approve first and a reply stops automatically.

How sequences work

1
Create a sequence

Define the steps: email, wait 3 days, email, wait 5 days, task (call if no reply), email. Each email step has a template you can customize.

2
Enroll contacts

Add contacts to the sequence. The AI may also propose enrollment from prospecting results.

3
Automatic execution

Steps run automatically on schedule. If a contact replies at any point, the sequence pauses automatically.

4
Track results

See open rates, reply rates, conversion rates, and unsubscribes per step. Use this to optimize your sequence.

Reply understanding

When a contact replies, the AI classifies the reply:

Positive

Interested, wants to talk. Sequence pauses, task created for follow-up.

Objection

Has concerns but not rejecting. Sequence pauses, task created with objection details.

Unsubscribe

Wants to stop receiving messages. Contact is suppressed permanently.

Not now

Interested but timing is wrong. Sequence pauses, snooze task created.

Wrong person

Not the right contact. Sequence stops, contact flagged for review.

Support

A support question, not a sales response. Sequence pauses, ticket created.

Anti-spam protections

Opt-out handling

Unsubscribe requests are honored immediately and the contact is suppressed from all future sequences.

Daily send cap

Workspace-level daily limit (default: 1,000 emails). Prevents mass sends that trigger spam filters.

Per-contact limit

Maximum 1 message per contact per day. Prevents overwhelming individual people.

Over-cap handling

Steps that exceed the daily cap are deferred to the next day. They are never dropped or skipped.

What happens if a contact opens a support ticket during a sequence?+

The sequence pauses automatically. Support takes priority over outreach. The sequence can be manually resumed after the support issue is resolved.

Can I A/B test sequence steps?+

Not directly within sequences, but you can create two sequences with different messaging and compare their results.

CRM

Keeping and growing customers

Lifecycle management helps you protect existing revenue. Each account gets a churn risk score, a health score, an expansion score, and a recommended success playbook.

Lifecycle
Lifecycle boardA customer-lifecycle board — Onboarding, Active, At-risk, Renewal — with health bars on each account card.LifecycleworkspaceONBOARDINGAcmehealth 40ACTIVEGlobexhealth 88Initechhealth 76AT-RISKSoylenthealth 28RENEWALUmbrarenews in 12dexpansion +$8k1STAGESOnboarding to renewal2SCOREDHealth & expansion3PLAYBOOKRecommended next move
Customers move through onboarding, active, at-risk and renewal — each scored for health and expansion with a playbook.

The lifecycle board

Stage map

Visual board showing where every account stands: Lead, Prospect, Opportunity, Customer, Expansion, Renewal, At Risk, Churned.

At-risk accounts

Accounts flagged with high churn risk. Each shows the top driver (support spike, inactivity, payment failure) and a recommended save play.

Expansion opportunities

Accounts that show signals of readiness to buy more: high usage, feature requests, plan inquiries.

Renewals due

Accounts with upcoming renewal dates. Sorted by risk level and revenue value.

How OpsIQ detects churn risk

Churn risk is calculated from multiple signals fused together:

CRM signals

Deal health, inactivity, recent losses, declining engagement.

Support signals

Open ticket count, ticket volume spikes, negative sentiment, escalations.

Product engagement

Login frequency, feature usage, page visits, API calls.

Billing signals

Failed payments, overdue invoices, downgrade requests, cancellation page visits.

Playbooks

Save play

For at-risk accounts: reach out proactively, address the concern, offer support, escalate if needed.

Renewal play

For upcoming renewals: confirm satisfaction, review usage, present value, offer incentive if appropriate.

Expansion play

For ready-to-grow accounts: present upgrade options, share success stories, demonstrate ROI.

Adoption play

For underutilizing accounts: offer training, share best practices, enable features they are not using.

Spotting churn before it happens

Scenario:
A customer who normally logs in daily has not logged in for 2 weeks, and they opened 3 support tickets this month.
What to do:

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

CRM

Keeping your data clean

The Data Steward agent automatically finds and fixes data quality issues: duplicates, missing fields, inconsistencies, and stale records.

Data steward
Data stewardA list of data-quality issues — duplicate, missing, stale, format — each with a one-click fix action.Data stewardworkspaceData issues the Steward agent foundDuplicate[email protected] and [email protected]MergeMissing12 contacts have no companyEnrichStale38 deals untouched for 90+ daysReviewFormatphone numbers in 4 formatsFix all1CATCHESDupes, gaps, stale2EXPLAINSWhy it flagged each3FIXESOn your approval
The Steward agent keeps your CRM clean — finding duplicates, gaps, stale records and bad formats, fixing on approval.

What it catches

Duplicate contacts

Multiple records for the same person (e.g., [email protected] and [email protected]). The steward proposes merging them.

Missing data

Contacts without email, deals without amounts, companies without domains. Suggests filling from available sources.

Unlinked records

Deals without associated contacts, contacts without companies. Proposes linking based on email domain and context.

Inconsistencies

A deal in "Won" stage with 20% probability, a contact marked "Customer" with no deals, a company with mismatched industry.

Wrong stages

Deals that have been in the same stage for too long or contacts whose lifecycle stage does not match their activity.

How to use

1
Open the steward list

Go to CRM and find the Data Steward section (or open it from CRM Health).

2
Approve safe fixes

Green items are safe: clear duplicates, obvious missing data. Approve these in bulk.

3
Review the rest

Amber items need your judgment: possible duplicates with slight differences, proposed stage changes, company linking. Review each one.

Cleaning duplicate contacts

Scenario:
The steward found "John Smith ([email protected])" and "J. Smith ([email protected])" — same email, different display names.
What to do:

The steward proposes merging: keep the record with more activity, merge the other record's deals and activities. Review the proposal, adjust the surviving display name if needed, and approve. Both records' history is preserved in the merged contact.

CRM

Build my CRM

Build My CRM lets you describe your CRM setup in plain English. OpsIQ generates a validated, reversible plan and applies it on approval. No coding, no manual configuration clicking.

Build my CRM
Build my CRMA natural-language description on the left producing a generated CRM plan of stages, fields and segments on the right.Build my CRMworkspaceDescribe your businessWe are a web design agencyselling monthly retainers andone-off projects to smallbusinesses.Build my CRMGenerated planStages: Lead → RetainerDeal types: retainer, projectField: monthly valueSegments: SMB, agencySequence: onboardingApprove & apply1DESCRIBEPlain English in2AI PLANSStages, fields, segments3APPROVEApplied — no coding
Describe your business in plain English; OpsIQ drafts the whole CRM — stages, fields, segments — and applies it on approval.

How it works

1
Describe what you want

Type a plain-English description of your CRM setup. Example: "Create a renewal pipeline with stages: Upcoming, Contacted, Negotiating, Renewed, Lost. Score leads higher when they view pricing twice."

2
Review the plan

OpsIQ shows a preview of what it will create: pipeline, stages, stage probabilities, scoring rules, lifecycle rules. Review each item.

3
Apply

Click Apply to execute the plan. Every change is recorded as a bundle you can undo in one click.

4
Roll back if needed

If something is not right, click Undo to revert the entire bundle. Your CRM returns to its previous state.

What you can build

Pipelines and stages

Create named pipelines with custom stages, default probabilities, and rotting thresholds.

Scoring rules

Boost lead scores based on behavior: "Score higher when they view pricing," "Score lower when they visit careers page."

Lifecycle rules

Automatically advance lifecycle stages: "Move to SQL when they request a demo," "Move to Customer when deal is won."

Custom fields

Add fields to contacts, deals, or companies: text, number, date, select, checkbox, URL, email.

Qualification checklist

Define the MEDDICC or BANT checklist the Deal Coach grades against.

Setting up a renewal pipeline

Scenario:
You manage SaaS subscriptions and need a pipeline for renewals.
What to do:

Type: "Create a renewal pipeline. Stages: 90 Days Out (10%), 60 Days Out (25%), Contacted (40%), Negotiating (60%), Renewed (100%), Churned (0%). Set the rotting threshold to 14 days." OpsIQ generates the plan, you review it, and click Apply. The pipeline appears on your Pipeline page immediately.

What if I describe something that is not possible?+

The builder only generates actions it knows how to validate. If you ask for something outside its capabilities (e.g., "Integrate with my custom API"), it will reject the request and explain what it can do instead.

Can I undo changes?+

Yes. Every Build My CRM action is captured as a reversible bundle. Go to CRM Health > Change History to see all bundles and undo any of them.

CRM

Setting up your CRM your way

Manual CRM configuration for teams that prefer clicking over typing. All settings that Build My CRM can create are also available as traditional form fields.

Pipelines and stages

Create, rename, reorder, and delete pipelines and stages. Set default win probability per stage. Set the rotting threshold (days without activity before a deal is marked "stalled").

Custom fields

Add fields to deals, contacts, or companies. Field types: text, number, date, select (dropdown with predefined options), checkbox, URL, email. Custom fields appear on the object profile and in filters.

Qualification checklist

Define the checklist the Deal Coach uses to evaluate deals. Choose MEDDICC, BANT, or a custom set of criteria. Each item can be marked required or optional.

Lifecycle stage rules

Define automatic stage transitions: when a contact meets a condition (views pricing, submits a form, makes a purchase), their lifecycle stage advances automatically.

Lead-scoring rules

Boost or reduce lead scores based on behavior. Examples: "Viewed pricing page = +15 points," "Downloaded whitepaper = +10 points," "Visited careers page = -5 points." Minimum count can be set (e.g., "must view pricing at least 2 times").

Saved views

Create named filter+sort combinations for contacts, deals, or companies. Share views with your team. Set a default view per object type.

Adding a lead scoring rule

Scenario:
You want contacts who view your pricing page twice or more to get a higher score.
What to do:

Go to CRM Configuration > Lead Scoring Rules. Click Add Rule. Set: Event = "pageview", URL contains = "/pricing", Minimum count = 2, Score boost = +20. Save. The next time the scorer runs, contacts matching this rule will get +20 to their lead score.

CRM

CRM Health check-up

CRM Health is a self-diagnostic page that verifies your CRM is set up correctly and running smoothly.

Health check
CRM Health checkA health score ring at 92 beside a checklist of passing and warning configuration checks.CRM Health checkworkspace92HEALTHYPipeline stages configuredConnector linked & importingAI agents enabled!No active follow-up sequence!12 contacts missing company1AUDITVerifies your setup2FLAGSWhat is missing3SCOREOne overall number
A one-page CRM audit: an overall health score plus a checklist of what is set up right and what still needs attention.

What it checks

Schema

Database tables exist and have the correct columns. If a migration was missed, CRM Health will flag it.

AI agents

All CRM agents (Capture, Data Steward, Deal Intelligence, etc.) are registered and healthy. Green = running, amber = needs attention, red = error.

Routes

CRM API routes and AJAX endpoints are registered and callable.

AI actions

The CRM action catalog is registered in the Action Registry. If actions are missing, CRM Health self-heals by re-registering them.

Live data counts

Total contacts, companies, deals, tasks, activities, and events. Useful for verifying imports and ongoing data capture.

After setup check

After first-time CRM setup, open CRM Health and verify all checks are green. If any are amber or red, click the item for a diagnostic explanation and suggested fix.

How often should I check CRM Health?+

Check after initial setup, after major updates, and whenever CRM behavior seems wrong. CRM Health self-heals many issues (like missing action registrations) just by opening the page.

CRM

CRM connections for developers

The CRM exposes a complete public REST API and outbound webhooks so it fits any stack without manual exports.

API endpoints

Authentication

API key (Authorization: Bearer opq_...) with scope crm.read or crm.write. POST to /api/v1.php with action and site_key.

Contacts

crm.contacts.list (search + filter), crm.contacts.detail (by ID), crm.contacts.upsert (create or update), crm.contacts.save.

Deals

crm.deals.list, crm.deals.detail, crm.deals.create, crm.deals.update, crm.deals.advance (all through the Trust Layer).

Activities

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

Events

crm.events.list (durable change feed with since_id cursor), crm.events.catalog (list available event types).

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

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

Webhook events

crm.contact.created

Fired when a new contact is added to the CRM.

crm.deal.stage_changed

Fired when a deal moves to a different stage.

crm.deal.won

Fired when a deal is closed as won.

crm.deal.lost

Fired when a deal is closed as lost.

crm.task.created

Fired when a new task is created (manual or AI-generated).

crm.outreach.reply

Fired when a prospect replies to a sequence email.

crm.agent.proposal_created

Fired when an AI agent creates a proposal for the approval queue.

All webhook events are HMAC-signed and retried on failure. Subscribe a URL in Settings > Webhooks, or poll crm.events.list with since_id for a durable change feed.

Syncing CRM contacts to Google Sheets

Scenario:
You want every new CRM contact to appear in a Google Sheet for your marketing team.
What to do:

Set up a webhook subscriber for crm.contact.created. Point it to a Google Apps Script web app or a Zapier webhook URL. The payload includes the contact name, email, company, lead score, and source. Your script appends a row to the Google Sheet for each new contact.

CRM

Segments

Segments save reusable contact filters for CRM views, outreach, promotions and other audience-aware tools.

Product screen
SegmentsThe Segment editor combines conditions, shows the live match count and lets the operator choose a live filter or pinned snapshot.SegmentsworkspaceMODELiveLOGICALLMATCHES1,248LIVE WORKSPACE VIEWCustomer stageequals Active customerRuleLast activitywithin 30 daysRuleCountryequals United KingdomRuleHigh intentscore at least 70Rule1CHOOSE MODELive or snapshot2ADD RULESALL or ANY3REUSECampaigns and CRM
The Segment editor combines conditions, shows the live match count and lets the operator choose a live filter or pinned snapshot.

A live segment recalculates from current data whenever it is used. A pinned snapshot freezes the current member list, which is useful when an outreach audience must not change after approval.

Choose ALL when every condition must match or ANY when one condition is enough. Review the live count before saving. System segments can be visible but protected from ordinary editing.

CRM

Lead scoring

Lead-scoring rules turn behaviour and profile signals into a consistent score that sales and automation can use.

Product screen
Lead scoringLead scoring shows active rules, the rolling window and the positive or negative score change each rule applies.Lead scoringworkspaceRULES12SCORED8,412HOT LEADS286LIVE WORKSPACE VIEWPricing activity3+ visits in 14 days+20Buying keywordcontains migration or enterprise+15Support riskcomplaint event in 30 days-10Trusted sourcepartner referral+121DESCRIBE RULEUse plain English2REVIEW FIELDSSignal, window, points3RESCOREApply to workspace
Lead scoring shows active rules, the rolling window and the positive or negative score change each rule applies.

The AI rule builder can turn a plain-English instruction into a structured rule. Every rule should still be reviewed before activation: confirm the activity or keyword, minimum count, rolling window and score change.

Positive and negative rules can coexist. Use Rescore workspace after material rule changes so existing contacts are evaluated under the new model. Scores can feed segments, routing, prospecting and workflow conditions.

CRM

Sales leaderboard

The leaderboard compares representatives using quota attainment, won revenue, commission and open pipeline for the selected month.

Product screen
Sales leaderboardThe monthly leaderboard ranks sales representatives while keeping won revenue, commission and open pipeline visible.Sales leaderboardworkspacePERIODJulyTEAM QUOTA82%WON£184kLIVE WORKSPACE VIEWAmina104% quota · £62k won1stBen88% quota · £51k won2ndRita76% quota · £43k won3rdOpen pipeline£312k across teamReview1CHOOSE MONTHCompare one period2CHECK QUOTAAttainment by rep3COACHUse pipeline context
The monthly leaderboard ranks sales representatives while keeping won revenue, commission and open pipeline visible.

Quota attainment is meaningful only when each representative has a current quota and deals have the correct owner, amount, currency and close status. Use the leaderboard for coaching and recognition, not as the only quality measure; pair it with deal health, activity and forecast accuracy.

CRM

Deal approvals

Deal approvals require manager sign-off before high-value deals can be marked won.

Product screen
Deal approvalsThe approval policy defines two value thresholds and the queue shows pending, approved and rejected decisions.Deal approvalsworkspacePOLICYEnabledWAITING6OLDEST3hLIVE WORKSPACE VIEWLevel 1Deals from £10,000ManagerLevel 2Deals from £50,000SeniorEnterprise renewal£72,000 · requested by BenPendingMigration project£18,500 · requested by RitaApproved1SET THRESHOLDS0 disables a tier2REQUESTRep submits the deal3DECIDEApprove or reject
The approval policy defines two value thresholds and the queue shows pending, approved and rejected decisions.

Enable the policy and set Level 1 and Level 2 thresholds. A threshold of 0 disables that tier. When a non-manager tries to win a deal at or above the threshold, OpsIQ creates an approval request instead of silently changing the stage.

Managers and full administrators are not blocked by the policy. Every decision should retain the requester, approver, time and reason for auditability.

CRM

Lifecycle rules

Lifecycle rules automatically move contacts between stages when their current data matches a saved condition.

Product screen
Lifecycle rulesLifecycle rules are evaluated by priority; the first matching rule changes the contact stage.Lifecycle rulesworkspaceACTIVE7RUNSNightlyPRIORITYHighest firstLIVE WORKSPACE VIEWLead → Qualifiedscore ≥ 60 and recent activityPriority 100Qualified → Customerpurchase event existsPriority 90Customer → At riskno activity for 60 daysPriority 70At risk → Customernew purchase or replyPriority 601PICK STAGESFrom and to2DEFINE FILTERSegment-style JSON3ORDER RULESFirst match wins
Lifecycle rules are evaluated by priority; the first matching rule changes the contact stage.

Each rule has a source stage, destination stage, active flag, priority and segment-style filter. The scheduled lifecycle job evaluates higher priorities first and stops after the first match for a contact.

Rules should be mutually understandable. Avoid two active rules that can move the same contact in opposite directions during the same run. Test the filter against a segment before activating it.

CRM

CRM activity stream

The workspace activity stream combines customer and operational events so teams can investigate what happened without opening every module.

Product screen
CRM activityThe activity stream interleaves chat, ticket, email, webhook, conversion and anomaly events with filters and pagination.CRM activityworkspaceEVENTS2,804CUSTOMERS1,126ANOMALIES14LIVE WORKSPACE VIEWChat resolved[email protected] · AINowTicket repliedT-1048 · Billing4mInbound eventsubscription.upgraded12mConversionOrder #7788 · £14919m1FILTEREvent and customer2OPEN CONTEXTJump to the record3PAGE RESULTSKeep investigations bounded
The activity stream interleaves chat, ticket, email, webhook, conversion and anomaly events with filters and pagination.

Filter by event type, date, contact or customer state (including paying customers). The feed is a read model of recorded activity; it does not replace the source ticket, conversation, deal or connector record. Open the linked record before taking a sensitive action.

CRM

Workflows

Workflows respond to an event and run an ordered series of actions, including delayed steps resumed by cron.

Product screen
WorkflowsA workflow run shows its trigger, completed actions, waiting delay and next step.WorkflowsworkspaceACTIVE9RUNNING42FAILED1LIVE WORKSPACE VIEWTriggercontact.createdStartStep 1Send welcome emailDoneDelayWait 2 daysWaitingStep 2Create sales taskNext1CHOOSE TRIGGEREvent starts the run2ORDER STEPSActions and delays3MONITORResume through cron
A workflow run shows its trigger, completed actions, waiting delay and next step.

Create a workflow by choosing the trigger, adding steps in order and enabling it. Delays are stored, not held by a browser request; the unified cron resumes due workflow runs.

Built-in starting templates include welcome after signup, post-purchase thank-you and demo confirmation. Clone a template, replace its recipients/content, then test with a controlled record before broad activation.

Design actions to be idempotent. A retry must not send duplicate money-moving requests or create duplicate records.

Support

Tickets

Tickets are your formal support channel. They have departments, priorities, SLA targets, attachments, internal notes, and full conversation threading. Tickets can arrive from the OpsIQ admin, ticket form/embed, email ingestion, chat escalation, connector, or API.

Tickets
Ticket detailA ticket with a meta sidebar (priority, department, SLA, status), the conversation thread, and AI draft and refund actions.TicketworkspaceT-12345PriorityHighDepartmentBillingSLA3h 12m leftStatusOpenI was charged twice for mysubscription on June 3.AIConfirmed the duplicatecharge — refund processing.AI draft replyRefund1THREADEDFull conversation + notes2SLA & ROUTINGPriority, dept, timers3AI DRAFTReply written for you
Every ticket carries its priority, department, SLA timer and full thread — and the AI can draft the reply for you.

How a ticket flows

1
Ticket arrives

A customer sends a message via email, chat escalation, ticket embed, or the admin creates one. The ticket gets a unique ID (e.g., T-12345).

2
Triage

AI reads the subject and body, assigns priority (Low/Normal/High/Urgent), suggests a department, and detects sentiment. This happens automatically if triage is enabled.

3
Reply

An agent opens the ticket, reads the context (customer profile, platform data from connectors, previous tickets), and writes a reply. AI can draft the reply, and the agent edits before sending.

4
Close

When the issue is resolved, the agent closes the ticket. The customer is notified. If the customer replies after closing, the ticket reopens automatically.

Per-ticket actions

Change department

Move the ticket to a different department (e.g., from General to Billing). Useful when the initial routing was wrong.

Assign to agent

Assign the ticket to a specific team member. The assigned agent sees the ticket in their "My tickets" view.

Add internal note

Write a note visible only to staff. Use for: investigation findings, refund reasons, engineering context, previous commitments. Internal notes never appear to customers.

Merge tickets

Combine duplicate tickets from the same customer. The merged ticket subject gets a [MERGED] tag. All messages from both tickets are preserved in the surviving ticket.

Canned response

Insert a pre-written reply template. Variables like {{customer_name}} and {{ticket_id}} are automatically replaced.

AI rewrite

Let AI improve your draft reply: adjust tone, shorten/lengthen, fix grammar, or translate. You review the result before sending.

Change priority

Set to Low, Normal, High, or Urgent. Priority affects SLA timers and sort order.

Change status

Set to Open, Pending, Waiting on Customer, Resolved, or Closed.

Worked example: handling an unhappy customer

Customer email: "I was charged twice for my subscription"

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.
What to do:

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.

Departments

Create departments in Settings > Tickets > Departments. Common departments: General, Billing, Technical, Sales, Abuse, Onboarding. Each department can have different auto-reply rules, AI knowledge, and team assignments.

Canned responses

Create reusable reply templates in Settings > Tickets > Canned Responses. Good canned responses include:

Example canned response template
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}}

Merging tickets

When a customer sends the same question multiple times (via email and chat, or two separate emails), you can merge the duplicates. Go to the ticket, click Merge, select the other ticket to merge. The surviving ticket gets all messages from both tickets. The merged ticket's subject gets a [MERGED] tag to indicate it was combined.

Priority and SLA

Low

Non-urgent questions, feature requests, general feedback. Target first response: 24 hours.

Normal

Standard support questions. Target first response: 8 hours.

High

Impacting the customer's business. Target first response: 4 hours.

Urgent

Service down, security incident, data loss, billing error. Target first response: 1 hour.

SLA timers start when the ticket is created and pause when the status is "Waiting on Customer." If the SLA target is missed, the ticket is highlighted and optionally escalated.

Can customers see internal notes?+

Never. Internal notes are strictly staff-only. They do not appear in the customer ticket portal, email notifications, or any customer-facing surface.

What happens when a closed ticket is replied to?+

The ticket automatically reopens and returns to the active queue. The team is notified of the new reply.

Can I lock a ticket to prevent further replies?+

Yes. Use the Lock Thread option to prevent both customer and AI from adding new replies. Useful for resolved disputes or closed investigations.

Support

Service Studio: SLA, status flow and quality

The control room for how your support operation behaves: SLA policies with escalation ladders, business-hours calendars, an enforced status flow, CSAT settings and the enterprise feature switches. Open it from the Tickets page (the Service Studio button in the operations bar).

SLA policies

Every new ticket gets a first-reply and a resolution deadline from the most specific active policy: department + priority beats department, beats priority, beats the default. Deadlines pause automatically while a ticket sits in Pending or On hold.

Escalation ladders

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

Business hours and calendars

With business hours on, SLA clocks only burn during working time, so a ticket opened Friday evening is not breached by Saturday. Named calendars (timezone, days, hours, holidays) can be attached to individual policies for teams in different regions.

Status flow

A from/to matrix restricting which status changes admins may make, with a Zendesk-style preset. Automation, inbound email and customer-originated ticket replies are always exempt, so a strict matrix can never jam the pipeline. Optionally require an approved sign-off before closing.

Approvals

Agents request sign-off on a ticket (refunds over a threshold, policy exceptions). A named approver or any Full Administrator decides with a note; requesters can never approve their own request. Pending approvals surface as a banner on the inbox.

Ticket relationships

Link tickets as related, duplicate, parent/child or blocking; split replies out to a new linked ticket (the reverse of merge, without emailing the customer); follow tickets for in-app notifications, and optionally CC follower email addresses on outbound replies.

Live inbox and collisions

With the real-time inbox enabled, new tickets and replies appear for agents within seconds through the existing notification stream. On a ticket, agents see who else is viewing and get a warning banner when a teammate is already writing a reply. A one-click Claim button assigns the ticket to yourself.

AI-aware routing

Routing rules can match on AI triage signals: priority, category, sentiment and escalation risk, plus typed custom-field values from your portal request form. Rules using these conditions stay dormant until the feature is enabled.

💡
Every enterprise switch ships OFF. Turning one on in Service Studio → Quality & Automation is the opt-in; leaving them off keeps behavior identical to before the upgrade.
Why can a customer still reopen a closed ticket when my matrix forbids closed → open?+

The matrix only governs ADMIN actions. Customer-originated replies, email replies and automation are deliberately exempt so a strict policy can never lock customers out or break the pipeline.

Do SLA ladders replace the old breach action?+

No. Policies saved with a single breach action keep working unchanged. A ladder replaces the single action only on policies where you define steps.

Support

Ticket auto-reply and escalation

Auto-reply lets the AI respond to new tickets automatically. Escalation moves tickets to a different department when the AI detects specialized needs. Both features work across native tickets and email-created tickets.

Auto-reply
Ticket auto-replyA flow: new ticket, a two-minute delay, AI reply from knowledge and context, then sent or saved as a draft.Auto-replyworkspaceWhen a new ticket arrivesNew ticketany sourceDelay2 minAI repliesKB + contextSentor draftIf a human replies during the delay, auto-reply is cancelled. Intent can escalate to another department first.1DELAYHumans get first chance2AI REPLIESFrom KB + context3OR ESCALATERoute by intent
New tickets get a short delay (so humans can jump in), then an AI reply from your knowledge — sent or queued as a draft.

How auto-reply works

1
Ticket appears

A new ticket is created from any source (email, chat, portal, API).

2
Schedule reply

OpsIQ waits for the configured delay (default: 2 minutes). This gives human agents a chance to respond first.

3
First reply wins

If a human agent replies during the delay, auto-reply is cancelled. If not, the AI generates a reply.

4
Generate and send

The AI reads the ticket, checks knowledge base, connector context, and customer history, then writes a reply. The reply is sent (or queued as a draft for review, depending on settings).

How escalation works

1
Configure departments

Set which departments can receive escalations (e.g., Billing can be escalated from General, Technical can be escalated from General).

2
Classify the ticket

Before auto-replying, the AI classifies the ticket intent: billing, technical, refund, abuse, etc.

3
Move if needed

If the ticket intent matches an escalation department, the ticket is moved. An internal note explains why.

4
Generate in new voice

The reply is generated using the destination department's knowledge and AI training.

Settings reference

Auto-reply enabled

Master switch. Turn on to enable AI auto-reply for tickets.

Allowed departments

Which departments can receive auto-replies. Start with low-risk departments (General, Sales) before enabling billing.

Delay

How long to wait before the AI replies (in seconds). Default: 120 seconds (2 minutes). Set to 0 for instant replies.

Delay schedule

Optionally set different delays for business hours vs. after hours.

Stop on admin reply

If a human agent replies first, cancel the auto-reply. Default: on.

Escalation enabled

Enable automatic department routing based on ticket intent.

Escalation departments

Which departments tickets can be escalated to.

Escalation status

What status to set when escalating (e.g., Open, Pending).

Escalation note

Whether to add an internal note explaining the escalation reason.

Email-created tickets

Tickets created from email (via mailbox polling or MX-piped delivery) follow the same auto-reply and escalation rules. The AI reply is sent as an email response to the customer. Email drafts go to the drafts queue for review if configured.

Will the AI auto-reply to billing questions?+

Only if you enable auto-reply for the Billing department. We recommend starting with auto-reply off for billing and enabling it only after you have trained the AI with comprehensive billing knowledge and tested thoroughly.

What if the AI gives a wrong answer?+

If a customer replies saying the answer was wrong, a human agent should intervene. Review AI History to understand why the AI gave the wrong answer, then update the knowledge base or AI training to prevent it from happening again.

Can I review auto-replies before they are sent?+

Yes. Set the delivery mode to "Draft" instead of "Auto-send." Auto-reply drafts will appear in the Drafts queue for human review before sending.

Support

Ticket portal embed

The ticket portal embed lets you add a ticket management interface to any website. Customers can view their tickets, create new ones, and reply — all without entering the OpsIQ admin.

How it works
Ticket portal embedA support portal embedded in a website showing a customer their own tickets and a new-ticket button.yoursite.com/supportSupport centerNew ticketYOUR TICKETS#1042 · Refund questionOpen#1038 · Setup helpResolved#1031 · Invoice copyPending1EMBEDAdd to any site2SELF-SERVECustomers see their tickets3NO LOGINIdentity handled securely
Ticket portal embed

Three embed flavors

Inline embed

Renders the ticket portal inside a div on your page. The portal takes the full width of its container.

Floating widget

Shows a floating button that opens the ticket portal in a panel. Similar to a chat widget.

Authenticated

Requires a signed identity token. Customers see only their own tickets.

Installation

Ticket embed snippet
<script src="https://your-opsiq-domain.com/widget.php"
  data-site-key="site_abc123"
  data-mode="tickets"
  data-identity-token="SERVER_GENERATED_TOKEN"
  async></script>

Identity token generation

For authenticated mode, your server must generate a signed identity token. This token tells OpsIQ who the customer is so they see only their own tickets.

PHP — generate identity token
<?php
// Generate identity token (PHP)
$site_secret = "opsiq_whsec_your_secret";
$payload = json_encode([
    "site_key" => "site_abc123",
    "customer" => [
        "id" => "cust_1001",
        "email" => "[email protected]",
        "name" => "Ada Lovelace",
    ],
    "iat" => time(),
    "exp" => time() + 900, // 15 minutes
]);
$token = base64_encode($payload) . "." . hash_hmac("sha256", $payload, $site_secret);
// Pass $token to the frontend
WHMCS hook — identity token
// WHMCS hook — auto-generate identity token
add_hook("ClientAreaPage", 1, function($vars) {
    if (!isset($vars["loggedinuser"])) return;
    $payload = json_encode([
        "site_key" => "site_abc123",
        "customer" => [
            "id" => $vars["loggedinuser"]["id"],
            "email" => $vars["loggedinuser"]["email"],
            "name" => $vars["loggedinuser"]["firstname"]." ".$vars["loggedinuser"]["lastname"],
        ],
        "iat" => time(),
        "exp" => time() + 900,
    ]);
    $token = base64_encode($payload).".".hash_hmac("sha256", $payload, "opsiq_whsec_xxx");
    // Inject into page
});
Node.js — generate identity token
// Node.js / Express — generate identity token
const crypto = require("crypto");

function generateOpsIQToken(customer) {
    const payload = JSON.stringify({
        site_key: "site_abc123",
        customer: {
            id: customer.id,
            email: customer.email,
            name: customer.name,
        },
        iat: Math.floor(Date.now() / 1000),
        exp: Math.floor(Date.now() / 1000) + 900,
    });
    const sig = crypto.createHmac("sha256", "opsiq_whsec_xxx")
        .update(payload).digest("hex");
    return Buffer.from(payload).toString("base64") + "." + sig;
}

Widget features

Ticket list

Searchable, status-filtered list. An "Awaiting you" highlight flags tickets the team has answered.

Threaded conversation

Full conversation view with rich text, attachments, and timestamps.

Draft autosaving

Customer draft replies are auto-saved so they do not lose work if they navigate away.

Live polling

The widget polls for new replies every ~12 seconds.

Resolve / reopen

Customers can resolve or reopen their own tickets with one click.

Internal staff notes are NEVER shown to customers in the ticket embed. This is a hard security boundary.
Support

Chat inbox

The Chat Inbox is where your team manages live customer conversations. It shows active chats, assigned conversations, AI-handled chats, and archived history.

Chat inbox
Chat inboxA three-pane agent chat inbox: conversation list, the live conversation with an AI draft chip, and a visitor/CRM context panel.Chat inboxworkspaceJDJanewhere is my orderMOMensahbilling questionRTRitaAI handledWhere is my order?Shipped today — UPSAI draft readyReply…VISITORJane DoeUS · Chrome3 past ordersLTV $480CRMStage: Customer1UNIFIEDEvery live chat2CONTEXTVisitor + CRM panel3AI ASSISTDraft & rewrite
One inbox for every live chat — conversation list, the thread with AI draft on tap, and full visitor + CRM context.

Managing conversations

Active chats

Conversations currently in progress. Green dot = customer is typing or recently active.

AI-handled

Conversations where the AI is responding. You can take over at any time by clicking "Join."

Assigned to me

Conversations assigned to you specifically.

Waiting

Conversations where the customer is waiting for a response.

Archive

Completed conversations. Searchable by keyword, date, and customer.

Handoff from AI to human

When you take over a conversation from the AI, follow these three rules:

1
Greet personally

Introduce yourself by name. "Hi, this is Sarah from the support team."

2
Reference context

Show you read the conversation. "I can see you asked about your order status."

3
Set expectations

Tell the customer what happens next. "I am looking into this now and will have an answer for you in a few minutes."

Switching AI on/off per conversation

Use the AI toggle at the top of each conversation. When AI is on, the AI generates responses. When off, only human agents can reply. The AI remembers the conversation context even when turned off and back on.

Away mode / out of hours

Configure business hours in Settings. Outside business hours, the AI can: (1) Continue responding to customers, (2) Show an "away" message and create a ticket for follow-up, or (3) Disable chat completely and show the ticket form. Choose the behavior that fits your support model.

Handling tough conversations

1
Stay calm

Do not match the customer's emotional intensity. Acknowledge their frustration without being defensive.

2
Collect facts

Before responding, gather the relevant information: order details, account status, previous tickets.

3
Escalate early

If the situation involves refunds, legal threats, abuse, or security, escalate to a senior team member rather than trying to handle it alone.

Can I have team chat (agent to agent)?+

Yes. Use internal notes within a conversation to communicate with other agents. These notes are never visible to the customer.

What happens when I close a chat?+

The conversation moves to the Archive. If the customer sends a new message later, a new conversation is created.

Support

Real chat conversations

These examples show how a well-trained Customer AI should handle common scenarios. Use them to test your AI training and identify gaps.

10 conversation examples

1. Returning customer asking about order

Scenario:
Customer: Hi, I placed an order 3 days ago and haven't received any shipping notification yet. Order #ORD-5523.
What to do:

The AI should: (1) Look up order #ORD-5523 through the connector. (2) Report the current status and tracking info if available. (3) If the order is delayed, acknowledge the delay and provide an estimated timeline. (4) Do NOT invent a shipping status if the connector does not have one.

2. Prospect asking about pricing

Scenario:
Customer: How much does your Pro plan cost? Do you offer annual billing?
What to do:

The AI should: (1) Answer from the knowledge base with current pricing. (2) Explain the difference between monthly and annual billing. (3) If the answer is not in the knowledge base, say so and offer to connect them with sales. (4) Do NOT invent pricing that is not in the knowledge base.

3. Angry customer demanding refund

Scenario:
Customer: This is ridiculous! Your product does not work and I want my money back NOW.
What to do:

The AI should: (1) Acknowledge the frustration calmly. (2) Ask for the order number or account email. (3) Explain the refund process. (4) Create a support ticket or escalate to a human agent. (5) Do NOT promise a refund — that requires human approval.

4. Double billing edge case

Scenario:
Customer: I was charged twice this month. My bank shows two charges of $29.99.
What to do:

The AI should: (1) Acknowledge the concern. (2) Collect the relevant details (email, dates of charges). (3) Explain that billing issues require human review. (4) Create a Billing department ticket with the details. (5) Set priority to High.

5. Multi-language customer

Scenario:
Customer: Bonjour, je voudrais savoir si vous livrez en France?
What to do:

The AI should: (1) Respond in the customer's language if that language is supported. (2) Answer the question about delivery to France from the knowledge base. (3) If the language is not supported, respond in the default language and mention which languages are available.

6. After-hours conversation

Scenario:
Customer: Hello, is anyone there? I need help with my account.
What to do:

The AI should: (1) If configured for after-hours AI, respond and assist. (2) If after-hours creates tickets, say: "Our team is currently offline. I have created a support ticket for you and someone will follow up during business hours." (3) Provide the ticket number.

7. Pre-purchase comparison shopper

Scenario:
Customer: How does your product compare to [Competitor X]?
What to do:

The AI should: (1) Describe your product's strengths factually. (2) Do NOT badmouth the competitor. (3) If there is a comparison page in the knowledge base, link to it. (4) If the customer asks about features you do not have, be honest.

8. Customer wants a recommendation

Scenario:
Customer: I run a small online store with about 100 orders per month. Which plan is right for me?
What to do:

The AI should: (1) Ask clarifying questions if needed (e.g., what features matter most). (2) Recommend a plan based on the knowledge base. (3) Explain why that plan fits their needs. (4) Mention that they can start with a smaller plan and upgrade later.

9. Customer trying to get an unauthorized discount

Scenario:
Customer: I saw online that you give 50% discounts. Can I have one?
What to do:

The AI should: (1) Politely explain current promotions if any exist. (2) Do NOT create or promise discounts that are not in the knowledge base. (3) If the customer persists, offer to connect them with the sales team.

10. Customer needs help with a feature

Scenario:
Customer: How do I export my data? I can't find the export button.
What to do:

The AI should: (1) Provide step-by-step instructions from the knowledge base. (2) Include the exact page path and button location. (3) If the feature requires a specific plan, mention that. (4) If the feature does not exist, be honest and suggest alternatives.

Support

Email mailboxes and drafts

OpsIQ can connect to email mailboxes to automatically create tickets from incoming email and send replies as email. It also provides AI-drafted replies for human review.

Email
Email to ticketAn IMAP mailbox on the left feeding incoming emails into a threaded ticket with an AI-drafted reply on the right.Emailworkspace[email protected] · IMAPRefund request[email protected]Cannot log in[email protected]Invoice copy[email protected]Ticket #1042from email · BillingI would like a refund for theduplicate charge…AI draftReview & send reply1INGESTIMAP & forwarding in2TO TICKETSThreaded automatically3AI DRAFTSReplies for review
Pull email in over IMAP (or forwarding), turn each into a threaded ticket, and let the AI draft the reply for review.

Connecting a mailbox

Protocol

IMAP (most providers), Gmail API (Google Workspace), or Microsoft Graph (Outlook 365).

Settings needed

Host, port, encryption (SSL/TLS), username, password or app password, folder (usually INBOX).

Department mapping

Map the mailbox to a ticket department. Emails to [email protected] create tickets in the "Support" department.

Gmail setup (step by step)

1
Enable 2-Step Verification

Go to Google Account > Security > 2-Step Verification and enable it.

2
Create an App Password

Go to Google Account > Security > App Passwords. Select "Mail" and "Other (OpsIQ)". Copy the 16-character password.

3
Enter in OpsIQ

Go to Email > Mailboxes > Add. Set host: imap.gmail.com, port: 993, encryption: SSL, username: [email protected], password: the app password.

4
Test

Click Test Connection. If successful, OpsIQ will start polling for new emails at the configured interval.

Outlook 365 setup

1
Check IMAP is enabled

In Outlook settings > Mail > Sync email, ensure IMAP is enabled.

2
Use app password or modern auth

If MFA is enabled, create an app password. Otherwise, use your regular password.

3
Enter in OpsIQ

Host: outlook.office365.com, port: 993, encryption: SSL, username: [email protected].

cPanel webmail setup

1
Find IMAP settings

In cPanel > Email Accounts, click your email account for IMAP settings.

2
Enter in OpsIQ

Host: usually mail.yourdomain.com or your server hostname, port: 993 (SSL) or 143 (STARTTLS), username: full email address.

AI email drafts

When auto-reply is set to "Draft" mode, the AI generates reply drafts that appear in the Drafts queue. You can:

Review

Read the draft and check for accuracy.

Edit

Modify the text, tone, or content before sending.

Send

Approve the draft and send it as an email reply.

Discard

Delete the draft if it is not appropriate.

Auto-send

If confidence is high enough and auto-send is enabled, drafts are sent automatically after a configurable delay.

Why are emails not being converted to tickets?+

Check: (1) Is the mailbox connected and healthy? Look for green status in Email > Mailboxes. (2) Is the cron job running? Email polling requires cron. (3) Is the email being filtered or moved to a folder other than INBOX?

Can I use multiple mailboxes?+

Yes. Each mailbox can be mapped to a different department. [email protected] goes to Support, [email protected] goes to Billing.

Support

Customer satisfaction (CSAT)

CSAT measures ticket and chat satisfaction, surfaces unhappy responses and compares AI and human outcomes.

Product screen
Customer satisfactionThe CSAT page combines score cards, detractor follow-up, comments, department and agent breakdowns, and chat feedback.Customer satisfactionworkspaceRESPONSES386AVERAGE4.6POSITIVE91%LIVE WORKSPACE VIEWDetractor follow-up12 responses rated 1–2ReviewTicket surveysSent 24h after closeAutomaticChat feedbackAI 4.5 · Human 4.7CompareAgent viewScore and response countCoach1WATCH AVERAGEUse trend, not one score2FOLLOW DETRACTORSRead the comment3COMPARE FAIRLYAI and human
The CSAT page combines score cards, detractor follow-up, comments, department and agent breakdowns, and chat feedback.

Ticket surveys are scheduled after closure (normally 24 hours later). A positive response is a score of 4 or 5. Use the detractor queue for scores of 1 or 2 and read the ticket/conversation before contacting the customer.

Chat feedback is reported separately for AI-resolved and human-handled conversations. Low sample sizes should not be used to rank agents or models.

Support

Team email broadcasts

The Email Platform page lets an authorised operator send a one-time message to all active agents, selected agents or a department and review send history.

Product screen
Email PlatformThe team email composer shows the audience, subject, message and past delivery history.Email PlatformworkspaceRECIPIENTS12DELIVERED11FAILED1LIVE WORKSPACE VIEWAudienceAll active agentsSelectedSubjectJuly support rotaReadyMessageSchedule and escalation notesReadyHistoryPrevious broadcasts and resultView1CHOOSE PEOPLEAll, selected or team2WRITE CLEARLYSubject and message3REVIEW HISTORYConfirm outcome
The team email composer shows the audience, subject, message and past delivery history.

This page is for internal operational messages, not customer marketing. Choose the smallest correct audience, preview names and addresses, then send. Delivery uses the configured outbound email path and records the result.

Support

Mailboxes, delivery and inbound email

Configure how OpsIQ sends email, turns inbound messages into tickets and proves the sending domain is ready.

Product screen
Email settingsEmail settings combine outbound routing, From identity, mailbox ingestion, deliverability checks and test email.Email settingsworkspaceOUTBOUNDSMTPMAILBOXES3DOMAINPassLIVE WORKSPACE VIEWPreferred connectorSMTP / provider connectorConfiguredFrom identitySupport <[email protected]>ReadyIMAP mailbox[email protected] · INBOXPollingDeliverabilitySPF · DKIM · DMARCPass1CHOOSE OUTBOUNDConnector or SMTP2CONNECT INBOXIMAP or pipe3TESTSend and verify
Email settings combine outbound routing, From identity, mailbox ingestion, deliverability checks and test email.

Outbound email

Full administrators can choose the preferred email connector; OpsIQ falls back to configured SMTP/mail delivery when appropriate. Set a recognisable From name/address, send a test and check the 24-hour success/failure metrics.

Mailboxes

An IMAP mailbox needs a name, email address, target department, host, port, security mode, username, password, folder, polling state and certificate-validation choice. Use Poll now to verify ingestion before waiting for cron.

Instant piping

On the same server, a mail pipe can pass the raw RFC822 message directly. A remote mail server can POST the raw message to the protected inbound endpoint using its token. Both paths enter the same deduplication, threading and ticket-routing pipeline.

Deliverability

The SPF/DKIM/DMARC check is advisory evidence for the configured From domain. A green check does not guarantee inbox placement, but a failure should be fixed before sending production messages.

Support

Support Portal Studio

Support Portal Studio designs and publishes the customer-facing support experience without requiring external image assets.

Product screen
Support Portal StudioPortal Studio shows a responsive preview alongside theme, navigation, knowledge, ticket, assistant, form, footer and CSS controls.Support Portal StudioworkspaceTEMPLATEModernPREVIEWDesktopSTATEDraftLIVE WORKSPACE VIEWThemeBrand colours and typographyEditNavigationKnowledge, tickets, assistantEditTicket formFields, routing and copyEditPublishValidate and make liveReview1CHOOSE TEMPLATEStart from structure2PREVIEW SIZESDesktop to mobile3PUBLISH SAFELYReview then release
Portal Studio shows a responsive preview alongside theme, navigation, knowledge, ticket, assistant, form, footer and CSS controls.

Use the template as a starting point, then configure theme, layout, navigation, knowledge search, ticket form, assistant, footer, brand, ticket behaviour, custom CSS and general settings. Preview desktop, tablet and mobile before publishing.

Support

Knowledge gaps

The knowledge-gap queue collects customer questions the AI could not answer confidently so the team can improve coverage.

Product screen
Knowledge gapsThe gap queue ranks missed or low-confidence questions and tracks whether the team has resolved them.Knowledge gapsworkspaceOPEN GAPS28REPEATED9RESOLVED116LIVE WORKSPACE VIEWMigration limitsAsked 14 timesHighWeekend supportAsked 8 timesMediumRefund timingAsked 6 timesMediumAPI regionAsked 3 timesLow1REVIEW QUESTIONSee conversation context2CHOOSE FIXArticle or prompt3RESOLVEVerify the next answer
The gap queue ranks missed or low-confidence questions and tracks whether the team has resolved them.

Open a gap to read the original question and nearby conversation, then choose the right fix: update an existing article, create a new knowledge article, add a business fact, correct connector data or change escalation instructions. Mark it resolved only after an evaluation or real test returns an acceptable answer.

Support

Status page administration

The status administration page communicates service health and incidents using components, current states and updates.

Product screen
Status administrationStatus administration lists components and incidents so operators can publish clear, time-stamped service information.Status administrationworkspaceOVERALLOperationalCOMPONENTS7INCIDENTS1LIVE WORKSPACE VIEWWebsiteOperationalGreenAPIDegraded performanceWatchEmail ingestionOperationalGreenCurrent incidentAPI latency investigationOpen1UPDATE COMPONENTChoose clear state2POST INCIDENTTime-stamped updates3RESOLVEClose with summary
Status administration lists components and incidents so operators can publish clear, time-stamped service information.

Use component states consistently. When an incident affects customers, publish an initial notice, add time-stamped updates as facts change, and close with a concise resolution summary. Do not use the status page as an internal debug log; sensitive diagnostics belong in OpsIQ and server logs.

AI

Set up your AI

AI Configuration is where you choose your AI provider, model, and cost controls. OpsIQ supports multiple providers: Claude (Anthropic), GPT-4o (OpenAI), Gemini (Google), and Grok (xAI). You can use your own API key (BYOK) or Managed AI if available on your plan.

Set up AI
AI configurationAn AI settings panel: a Managed-AI / BYOK provider toggle, a model selector, and a monthly token-budget meter.AI configurationworkspaceAI configurationProviderManaged AIYour key (BYOK)Modelclaude · balancedMonthly AI budget62%1TWO MODESManaged AI or BYOK2PICK A MODELSpeed vs depth3BUDGETSToken caps & cost control
Choose Managed AI or your own key, pick a model for speed vs depth, and cap monthly spend with a token budget.

Choosing a provider

Claude (Anthropic)

Strong reasoning, careful with facts, good at following complex instructions. Models: claude-sonnet-4-20250514, claude-3.5-sonnet. Best for: support conversations, technical questions, detailed analysis.

GPT-4o (OpenAI)

Fast, creative, good general knowledge. Models: gpt-4o, gpt-4o-mini. Best for: quick responses, creative writing, broad knowledge questions.

Gemini (Google)

Good at factual questions, multi-language support. Models: gemini-2.0-flash, gemini-1.5-pro. Best for: multi-language support, factual lookups.

Grok (xAI)

Fast, concise responses. Models: grok-3-mini-fast. Best for: quick answers, casual tone.

BYOK vs Managed AI

BYOK (Bring Your Own Key)

You provide your own API key from the provider. You pay the provider directly. Full control over model selection and usage.

Managed AI

AI is provided as part of your OpsIQ plan. No API key needed. Usage is metered against your plan's AI credit balance.

Step-by-step setup

1
Go to AI Configuration

In the OpsIQ admin, navigate to Settings > AI Configuration.

2
Select provider

Choose your AI provider from the dropdown.

3
Enter API key

If using BYOK, enter your API key. For Managed AI, this is handled automatically.

4
Choose model

Select the specific model to use. Smaller models are faster and cheaper. Larger models give better quality answers.

5
Test connection

Click "Test connection" to verify the API key and model are working. A green checkmark means success.

6
Save

Click Save to activate your AI configuration.

Cost controls

Monthly budget

Set a maximum monthly spend on AI tokens. When the budget is reached, AI features gracefully degrade (shorter responses, no auto-reply) rather than stopping entirely.

Per-conversation token limit

Maximum tokens per single conversation. Prevents runaway conversations from consuming excessive credits.

Low balance alert

When your AI credit balance drops below the threshold (default: 50,000 tokens), a warning appears in the admin. Set this in AI Configuration.

Per-workspace configuration

AI configuration is per-workspace. If you manage multiple sites, each workspace can use a different provider, model, and budget. The workspace inherits global defaults unless overridden. To configure per workspace: switch to the workspace, then go to AI Configuration and save settings there.

Getting API keys

Anthropic (Claude)

Go to console.anthropic.com > API Keys > Create Key. Copy the key starting with "sk-ant-".

OpenAI (GPT)

Go to platform.openai.com > API Keys > Create new secret key. Copy the key starting with "sk-".

Google (Gemini)

Go to aistudio.google.com > Get API Key. Create a key for your project. Copy the key.

xAI (Grok)

Go to console.x.ai > API Keys. Create and copy your key.

Testing your AI setup

Scenario:
After entering your API key, click "Test connection." You should see a green checkmark and a sample response from the AI.
What to do:

If the test fails: (1) Check that the API key is correct (no extra spaces). (2) Check that your account has billing set up with the provider. (3) Check that the model name is valid. (4) If using Managed AI, verify your license is active.

Which provider is best?+

There is no single best provider. Claude is excellent for support conversations. GPT-4o is fast and versatile. Gemini handles multiple languages well. Try each one and see which produces the best results for your specific use case.

Can I switch providers later?+

Yes. Change the provider and API key at any time. Existing conversation history is preserved. The AI will use the new provider for all future conversations.

What happens when I run out of credits?+

The AI degrades gracefully: responses become shorter, auto-reply pauses, and the admin shows a low-balance warning. Core tracking, tickets, and CRM continue working without AI.

AI

Smarter & cheaper customer chat

A set of opt-in controls that make your customer chat either smarter (it reasons across a customer's account like a human agent) or cheaper (it sends the AI less, or answers in fewer steps). Every control is off by default and independent — turning one on never changes any other behaviour. Most live under Settings > Client Chat > Behaviour; a few are on Set up your AI and Train your AI.

Smarter Answers (agent mode)

A normal chatbot answers one question from one lookup. With Agent mode on, the assistant can make several read-only account checks in a single turn and cross-reference them — e.g. "do I have open tickets, and is my balance enough for my next renewal?" is answered in one reply with the maths done. It only engages for verified customers on account or refund questions; everything else runs the normal single-answer path.

Agent mode

Up to a few read-only lookups per turn, cross-referenced before answering. Turn on when you have a connected platform (WHMCS, Shopify, Stripe, Zendesk, etc.). Off = today's single-lookup behaviour, unchanged.

Thinking depth for agent answers

How hard the model reasons on complex turns (low/medium/high). Start on Low; most support questions are handled well there.

Agent model

Pins a stronger model just for complex agent turns, so everyday chat stays on a light, cheap model and only the hard turns pay for depth. Blank = your normal customer-chat model.

Plan ahead — one-pass answers (beta)

A tiny planning step decides which lookups to pull and whether the knowledge base is needed, then answers in ONE main call instead of several steps. A sub-toggle under Agent mode — it cannot be enabled unless Agent mode is on. Same answer quality, fewer calls on multi-part questions.

Conversation & understanding

Long-conversation memory (beta)

Keeps a short running summary of older messages (names, ticket/invoice numbers, amounts, decisions) so the assistant stays consistent across very long chats without resending the whole transcript. Best for support-heavy, long threads; pairs with Agent mode.

Typo tolerance

Reads small typos ("my open ticketts", "unpaid invocies") as the intended words so the right information is found instead of missed. Works with every connected platform. Off by default; useful for mobile-heavy chat.

Lean account context

Only attaches the customer's account snapshot when the question is actually about their account (balance, invoices, tickets, services), skipping it on general questions. Cuts cost with no quality loss — the assistant can still fetch the account live when a turn needs it.

Cost saving

Skip knowledge search for greetings (beta)

"Hi", "thanks" and "ok" don't trigger a knowledge-base search — those replies never use it. Any message with real content still searches as normal.

Longest reply allowed (tokens)

Caps how long a single reply can be. Reply length is the most expensive part of a call, so a sensible cap (around 500 for support) is the single most effective chat cost control. Only lowers your global limit, never raises it.

On Set up your AI

Thinking depth (customer & admin chat)

How much the model thinks before answering (minimal to high). Keep customer chat on minimal/low for speed; reserve higher settings for analysis and the admin copilot.

Per-AI model (per job)

Every AI surface — live chat, ticket drafts, summaries, analysis, admin copilot, promotions, Site Intelligence and more — can run on its own model. Light where speed matters, strong where quality matters. Blank on a surface = provider default for that job.

Admin chat cost controls

The admin copilot can keep a bounded working memory and load only the tools a question needs (lean tools) instead of every tool every turn.

On Train your AI

Compress instructions

Your instructions are sent on every turn, so their length is a recurring cost. The Compress button rewrites a slot to say the same thing in fewer words. It refuses the rewrite if it would drop any {variable} or rule, and reports what it protected — so it never silently changes meaning.

"What's already in the brain" (ℹ️)

Shows what OpsIQ already knows about your business per slot, so you can delete anything you were repeating in your own instructions.

💡
Where does the money go? For short support chat the input (instructions + account data + history, sent each turn) usually costs more than the short reply — caching and lean context help most there. For long generated content the output dominates — the reply-length cap and a lower thinking depth pay off there. See Set up your AI to keep prompt caching on, which makes the big repeated part of each turn cheap.
Do these change how the chat already answers?+

No. Every control is off by default and independent. Turning one on only adds its behaviour; turning it off returns the chat to exactly how it worked before.

What order should I turn them on?+

Run everyday chat on a light model and pin a stronger Agent model. Then, if you have a connected platform, enable Agent mode, then Plan ahead, then Long-conversation memory. Then lean context, skip-KB-for-greetings, and a reply cap. Finally compress your instructions. Watch a few real chats after each change.

The Admin Agent kit: web search, runbooks, missions, file transfer

The Admin AI chat is a working engineer, not just a question box. It can research fixes on the web, keep a library of your operating procedures, patrol your servers on a schedule, and move files. Most of this is driven by asking for it in chat; the one thing you configure up front is which web search provider it uses, on the Set up your AI page.

Web search

Built in

The agent searches the web for docs, error messages and current information while it works. Out of the box this uses DuckDuckGo, which needs no key and no setup.

Runbooks

In chat

A saved library of your procedures ("how we do X here"). The agent writes one down after nailing a tricky job and follows it next time, so the know-how survives the end of the chat.

Missions

Scheduled

Scheduled read-only patrols. "Every morning, check disk space and the error logs and tell me." Findings arrive on your admin bell.

File transfer

In chat

Ask for a log file and get a private download link, or have one file copied from one connected server to another. Both capped at 5 MB.

Admin Agent web search (on Set up your AI)

Search provider

What the agent web search uses. The default is DuckDuckGo: keyless, free, works on every install. Brave Search, Tavily and Serper.dev (Google results) usually return better results but each needs an API key from that provider. If a keyed provider fails for any reason (bad key, quota used up, network trouble), that search falls back to DuckDuckGo automatically, so search never goes dark.

Search API key

The key for your chosen provider, only needed for Brave, Tavily or Serper. Once saved it is masked and never shown on the page again; paste a new one to replace it. A keyed provider becomes active only when both the provider and its key are saved.

Runbooks

When the agent has just worked through a job you will want done the same way again, say "save that as a runbook called nightly-cleanup". From then on it sees the runbook by name in every session, and when you ask for the job by name (or describe it) it pulls up the steps and follows them. You can ask it to list, update or delete runbooks any time.

💡
A runbook is guidance, not a free pass. When the agent follows one, every step that would change a server still goes through your current permission mode and shows the usual approval cards. A runbook can never bypass an approval.

Missions

A mission is a recurring job the agent runs on its own: hourly, daily at a set hour, or weekly on a set day. Missions are read-only by design. They can read servers, data and the web, but they can never change anything; they investigate and report. When a mission finishes, the findings land as a notification on your admin bell. Say "run the morning patrol now" to trigger one on demand, or ask the agent to list, pause or remove missions.

⚠️
Missions run off the OpsIQ cron, so it needs to be set up (see Cron and automation). A one-off "run it now" from the chat works even between cron runs on most servers.

Moving files

Ask for a file ("get me today's error log from the web server") and the agent stages it and replies with a private download link. The link only works for signed-in admins and expires after about a day. Files are capped at 5 MB; for anything bigger, ask the agent to compress or trim it on the server first.

The agent can also copy a single file between two connected servers, again up to 5 MB. The write on the destination is treated like any other change it makes: in ask mode you get an approval card first, the existing file is backed up, and the copy is reversible. For safety, the file content is re-read from the source at the moment the copy is applied, not taken from the chat.

AI

Train your AI

AI Training is where you teach OpsIQ how to behave. You write prompts that define personality, boundaries, knowledge focus, and escalation rules. Think of it as writing a training manual for a new support agent.

Train AI
Train your AIAn AI instructions editor with Customer/Admin tabs and plain-English tone, always and never rules.Train your AIworkspaceCustomer AIAdmin AIToneFriendly, concise, never pushy.AlwaysOffer a human handoff for billing disputes.NeverPromise a refund without checking the account.1TWO MANUALSCustomer & admin AI2PLAIN ENGLISHTone, always, never3GROUNDEDPlus your knowledge base
Train the AI like a new hire — Customer and Admin manuals written in plain English (tone, always, never), grounded in your KB.

Two training areas

Customer AI prompt

Controls how the AI talks to your customers in the chat widget. This is the most important prompt to get right.

Admin AI prompt

Controls how the AI assists your admin team in the operator dashboard. This handles internal queries and action execution.

Writing a great customer AI prompt

Your customer AI prompt should cover these areas:

1
Identity

Who is the AI? Give it a name, role, and personality. Example: "You are Luna, a friendly and knowledgeable customer support assistant for Acme Store."

2
Tone and style

How should it communicate? Example: "Be professional but warm. Use simple language. Avoid jargon. Keep responses concise (2-3 paragraphs max)."

3
Knowledge boundaries

What should it know and not know? Example: "You know about our products, pricing, shipping, and return policy. You do NOT know about competitor products or internal company decisions."

4
Escalation rules

When should it hand off to a human? Example: "Escalate to a human agent when: the customer asks for a refund, mentions legal action, reports a security issue, or asks the same question three times."

5
Things to never do

Hard boundaries. Example: "Never promise refunds. Never share internal pricing formulas. Never make up product features that do not exist. Never give medical, legal, or financial advice."

Example prompts

Example customer 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
Example customer AI prompt — hosting company
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

Refining your prompt over time

1
Launch with basics

Start with identity, tone, and key boundaries. Do not try to cover everything on day one.

2
Review AI History weekly

Read conversations where the AI gave wrong or suboptimal answers.

3
Update the prompt

Add specific rules for recurring issues. Example: if the AI keeps promising refunds, add "Never promise a refund — say you will escalate to the billing team."

4
Add knowledge

If the AI cannot answer a question, add the answer to the Knowledge Base rather than trying to fit everything in the prompt.

⚠️
Keep your prompt under 2,000 words. Overly long prompts can confuse the AI and increase token costs. Put detailed information in the Knowledge Base instead.
What is the difference between the prompt and the knowledge base?+

The prompt defines personality, boundaries, and rules. The knowledge base provides factual information (product details, pricing, policies). The AI reads both, but the prompt shapes behavior while the KB provides answers.

Can I have different prompts for different departments?+

The prompt is per-workspace. If you need different AI behavior for different departments, use the knowledge base to provide department-specific information and mention the department context in your prompt.

AI

AI history

AI History shows every conversation the AI has had with customers and admins. Use it to audit AI performance, find wrong answers, and identify training gaps.

AI history
AI historyA log of AI turns with type badges, the question and answer, response time and outcome.AI historyworkspaceEvery AI turn, recordedchatQ: where is my order?A: shipped today — UPS tracking…0.9sansweredticketDraft reply for T-12345refund acknowledgement drafted1.4sdraftedadminSummarize this week's tickets12-line summary returned2.1sdonechatQ: cancel my planhanded off to a human0.7sescalated1EVERY TURNPrompt, reply, action2SEARCHABLEFilter & export3OWNER-ONLYFull audit trail
Every AI turn — chat, ticket draft, admin action — logged with the exact prompt, reply, duration and outcome.

What each conversation shows

Date and time

When the conversation happened.

Customer identity

Name and email if known, otherwise IP and country.

Channel

Chat widget, ticket auto-reply, email draft, or admin AI.

Messages

Full transcript of the conversation: customer messages and AI responses.

Token usage

How many tokens the conversation consumed. High token usage may indicate the AI is giving overly verbose answers or the conversation went in circles.

Actions taken

Any actions the AI executed during the conversation (looked up order, created ticket, etc.).

Rating

If CSAT is enabled, the customer's satisfaction rating for this conversation.

Finding problems

Search by keyword

Search for specific topics to see how the AI handles them. Example: search for "refund" to check if the AI is following your refund policy.

Filter by rating

Show only low-rated conversations to focus on dissatisfied customers.

Filter by channel

Show only ticket auto-replies to audit automated responses separately from chat.

Sort by token usage

High-token conversations may indicate problems: the AI rambling, going in circles, or failing to answer the question.

Weekly audit routine

1
Check low-rated conversations

Read the full transcript. What went wrong? Was it a knowledge gap, a tone issue, or a wrong answer?

2
Check high-token conversations

These might indicate confusion. Was the AI repeating itself? Did it fail to understand the question?

3
Update training

For knowledge gaps, add articles to the Knowledge Base. For behavior issues, update the AI prompt. For recurring wrong answers, add explicit correction rules.

Finding knowledge gaps

Scenario:
You search AI History for "installation" and find 15 conversations where the AI said "I do not have specific installation instructions for this product."
What to do:

This means your Knowledge Base is missing installation guides. Create knowledge base articles for each product's installation steps. After adding them, test by asking the AI installation questions.

AI

AI insights

AI Insights automatically analyzes conversation patterns and surfaces actionable findings: common questions, satisfaction trends, knowledge gaps, and escalation patterns.

AI insights
AI insights (Intelligence Hub)The Intelligence Hub: an AI Today's Brief, Smart Alerts, a Score-a-Lead / Analyse-a-Page tool, and a 14-Day Traffic Pattern chart.AI insightsworkspaceTODAY'S BRIEFTraffic up 12%; 3 hot leads; 2 deals need follow-up.Smart AlertsCheckout errors spikedBounce up on /pricingNew hot lead from USRevenue ahead of last weekScore a Lead / Analyse a PageIP or URL…Run14-Day Traffic Pattern1TODAY'S BRIEFAI writes the morning summary2SMART ALERTSAnomalies surfaced3ON DEMANDScore a lead · analyse a page
The real Intelligence Hub: an AI-written Today's Brief, Smart Alerts for anomalies, on-demand lead scoring and page analysis, and the 14-day traffic pattern.

What insights show

Top questions

The most frequently asked questions. If "How do I reset my password?" is #1, your knowledge base needs a prominent password reset guide.

Satisfaction trends

CSAT scores over time. Is AI satisfaction improving or declining? Sudden drops may indicate a knowledge base change that broke something.

Resolution rate

What percentage of conversations does the AI resolve without human intervention? A rate above 70% is good. Below 50% means the AI needs more training.

Escalation reasons

Why conversations get handed off to humans. Common reasons: customer requested human, AI could not answer, sensitive topic, billing issue.

Knowledge gaps

Topics where the AI frequently says "I don't know" or gives low-confidence answers.

Average conversation length

How many messages per conversation. Very long conversations (10+ messages) might indicate the AI is not understanding the question.

Using insights to improve

Scenario:
AI Insights shows that 23% of escalations are "Customer asked about warranty" and the AI could not answer.
What to do:

This is a clear knowledge gap. Steps: (1) Write a comprehensive warranty article in the Knowledge Base covering all warranty terms, claim process, and exclusions. (2) Update the AI prompt to reference warranty information. (3) Monitor AI Insights next week to see if warranty escalations decrease.

AI

Admin AI playbook

The Admin AI (Ask OpsIQ) helps your team manage OpsIQ from within the admin dashboard. You can ask it to look up data, explain features, summarize tickets, and execute platform actions.

Admin AI
Admin AI playbookThe Ask-OpsIQ command box with an AI-proposed platform action card showing parameters and confirm/cancel.Ask OpsIQworkspaceAsk OpsIQSuspend the service for overdue account #4821AIProposed action: suspend_serviceaccount: #4821 (overdue $120)platform: WHMCS · reversible · auditedConfirmCancel1ASK ANYTHINGPlain-English commands2PROPOSE FIRSTAction shown before it runs3YOU CONFIRMScoped & audited
Tell the admin AI what you want in plain English; it proposes the exact action — scoped, reversible, audited — and waits for your confirm.

What the admin AI can do

Look up data

Ask: "Show me all tickets from [email protected]" or "What is the status of order #ORD-5523?"

Summarize

Ask: "Summarize the last 10 tickets" or "What are the top support issues this week?"

Explain features

Ask: "How do I set up auto-reply?" or "What does the bounce rate card mean?"

Execute actions

Ask: "Create a ticket for [email protected] about billing" or "Close ticket T-12345"

Platform queries

Ask: "How many visitors did we get yesterday?" or "What is our revenue this month?"

Example conversations

Looking up a customer

Scenario:
Admin asks: "Find customer [email protected] and show me their recent activity"
What to do:

The AI looks up the customer across all connected data sources: visitor sessions, tickets, chat conversations, orders, and CRM contacts. It returns a summary of recent activity with links to each item.

Getting a daily summary

Scenario:
Admin asks: "What happened today?"
What to do:

The AI summarizes: "Today you had 245 visitors (up 12%), 8 new tickets (3 resolved by AI), 2 new orders totaling $198, and 1 chat escalation about a shipping delay."

Executing an action

Scenario:
Admin asks: "Change ticket T-5523 priority to Urgent"
What to do:

The AI confirms: "I will change ticket T-5523 priority from Normal to Urgent. This will affect the SLA timer. Confirm?" You confirm, and the action is executed.

💡
The Admin AI only executes actions that are registered in the Action Registry. It cannot invent actions or access systems outside OpsIQ.
AI

Customer AI scenarios

This section covers common customer-facing AI scenarios with expected behavior and training tips.

Customer AI
Customer AI scenariosA library of customer questions paired with the expected AI behavior and an outcome tag for each.Customer AI scenariosworkspaceScenario library — expected AI behavior"Where is my order?"Look up the order via connector, give trackingResolve"I want a refund"Acknowledge, never promise — hand to a humanHandoff"Is the service down?"Check status, report current stateStatus"Cancel my account"Confirm intent, then route to a humanConfirm1SCENARIOSCommon questions2EXPECTEDHow AI should answer3TESTFind training gaps
A library of real customer questions and exactly how the AI should handle each — to test your training and find gaps.

Scenario library

Order status inquiry

Scenario:
Customer: "Where is my order #12345?"
What to do:

Expected AI behavior: (1) Look up the order through the platform connector. (2) Report current status (processing, shipped, delivered). (3) Include tracking number if available. (4) If the order is delayed, acknowledge and provide estimated timeline. (5) Never invent tracking information.

Password reset request

Scenario:
Customer: "I forgot my password and cannot log in"
What to do:

Expected AI behavior: (1) Provide the password reset steps from the knowledge base. (2) Include the reset link or page path. (3) Mention that the reset email may take a few minutes. (4) Suggest checking spam folder. (5) If the customer still cannot reset, escalate to a human.

Feature request

Scenario:
Customer: "Can you add dark mode to the mobile app?"
What to do:

Expected AI behavior: (1) Thank them for the suggestion. (2) Explain how feature requests are handled (logged, reviewed, prioritized). (3) Do NOT promise the feature will be built. (4) If a similar feature exists, mention it.

Billing dispute

Scenario:
Customer: "I was charged but my service is not working"
What to do:

Expected AI behavior: (1) Acknowledge the frustration. (2) Check the service status if possible. (3) Escalate to the billing department with all details. (4) Do NOT promise a refund. (5) Set ticket priority to High.

Off-topic question

Scenario:
Customer: "What is the weather like in London today?"
What to do:

Expected AI behavior: (1) Politely redirect. "I am your [Company] support assistant and can help with questions about our products and services. For weather information, try a weather service." (2) Ask if they have a product question.

How do I test customer AI behavior?+

Open your website in a private/incognito browser and chat with the AI as a customer. Try common questions, edge cases, and adversarial scenarios. Check that the AI follows your prompt rules and uses knowledge base content correctly.

AI

AI knowledge base

The Knowledge Base is a library of articles that the AI uses to answer questions. When a customer asks something, the AI searches the knowledge base for relevant articles and uses them to generate an accurate, grounded response.

Knowledge base
Knowledge baseSources feeding into a knowledge store, then an AI generating a grounded, cited answer.Knowledge baseworkspaceSourcesWebsite crawlHelp articlesFAQsImported docsKnowledgesemantic + keywordAIGrounded answerwith a cited source."Refunds take 3–5business days."1INGESTCrawl, FAQ, import2RETRIEVESemantic + keyword3GROUNDEDAnswers from your content
Crawl your site and import docs into the knowledge base; the AI retrieves the right pieces and answers, grounded and cited.

How it works

1
Customer asks a question

"What is your return policy?"

2
AI searches the knowledge base

OpsIQ finds the "Return Policy" article by matching keywords and semantic meaning.

3
AI generates a response

The AI reads the article and writes a natural-language answer based on the article content.

4
Customer gets an accurate answer

The response is grounded in your actual policy, not the AI's general training data.

Creating good articles

One topic per article

Write a separate article for each topic: return policy, shipping rates, account setup, password reset. Do not combine unrelated topics.

Write like a FAQ

Start with the question customers ask, then provide the answer. This helps the AI match questions to articles.

Be specific

"Returns must be initiated within 30 days of delivery" is better than "We have a return policy."

Include edge cases

What about international returns? What about digital products? What about items bought on sale? Cover the exceptions.

Keep it current

Review articles quarterly. Delete outdated information. Update pricing, policies, and procedures when they change.

Starter articles you should write

Shipping and delivery

Shipping costs, delivery times, tracking, international shipping, and handling delays.

Returns and refunds

Return window, conditions, process, refund timeline, and exceptions.

Account management

Password reset, email change, account deletion, and data export.

Pricing and billing

Plan descriptions, billing cycle, payment methods, invoices, and currency.

Product guides

How to use each product or feature. Step-by-step instructions with screenshots.

Troubleshooting

Common problems and solutions. Error messages and their fixes.

Contact information

Business hours, support channels, response times, and escalation paths.

Legal and compliance

Privacy policy summary, terms of service summary, GDPR data requests.

Connector knowledge

Each connector can contribute knowledge to the AI. When a connector is enabled, its built-in knowledge articles (product catalog, common questions, platform-specific troubleshooting) are automatically available to the AI. You can toggle connector knowledge on or off per connector in the Connector settings.

Token budget

The knowledge base has a configurable token ceiling (default: 32,000 tokens) that controls how much knowledge context is sent to the AI per conversation. If your knowledge base is very large, the AI selects the most relevant articles within this budget. Increase the ceiling if the AI is not finding relevant articles; decrease it if you want to reduce token costs.

How many articles should I have?+

Start with 5-10 articles covering your most common questions. Add more as you identify gaps through AI History and AI Insights. Most businesses need 20-50 articles for comprehensive coverage.

Can I import articles from another system?+

Currently, articles are created manually in OpsIQ. You can copy-paste content from existing FAQs, help centers, or documents.

What format should articles be in?+

Plain text works best. The AI understands natural language better than structured HTML or markdown. Write as you would explain to a customer.

AI

AI evaluation and Watchtower

Evaluation sets turn critical customer questions into repeatable tests for answer quality, citations, escalation and action safety.

Product screen
AI EvaluationAI Evaluation lists golden test cases, required behaviours, latest results and scheduled Watchtower runs.AI EvaluationworkspaceSETS6CASES84PASS RATE96%LIVE WORKSPACE VIEWShipping policyCitation requiredPassRefund requestHuman confirmation requiredPassUnsupported claimForbidden actionPassMigration questionExpected source missingFail1CREATE CASESGolden input and rules2RUN SAFELYDry run or live eval3WATCHSchedule daily or weekly
AI Evaluation lists golden test cases, required behaviours, latest results and scheduled Watchtower runs.

Full administrators can create evaluation sets with a prompt, expected source labels, required citations, human-confirmation rules, escalation expectations and forbidden actions. Run a set directly, dry-run it, or replay selected history.

Watchtower schedules daily or weekly checks through cron and runs a bounded number of cases (up to eight per scheduled pass). Review failures alongside provider/model, prompt version, knowledge version, actions proposed and cost before changing production behaviour.

AI

Languages and translation

Languages manages translated customer-facing text and the behaviour used when OpsIQ follows a customer’s language.

Product screen
LanguagesThe Languages page shows the source language, translated languages, draft/live state and customer-language behaviour.LanguagesworkspaceSOURCEEnglishLANGUAGES4LIVE3LIVE WORKSPACE VIEWFrenchInterface and contentLiveGermanInterface and contentLiveSpanishDraft translationDraftFollow customerReply in detected languageOn1SET SOURCEOriginal operator language2ADD LANGUAGETranslate in background3PUBLISHDraft or live
The Languages page shows the source language, translated languages, draft/live state and customer-language behaviour.

OpsIQ translates operator-entered customer-facing text. Set the source language correctly before creating translations, add target languages, then review drafts before publishing. “Follow customer language” controls response language; translating the widget interface controls its buttons, labels and system text.

Translation scope can be draft-only or live. Do not rely on machine translation for legal, refund, security or safety text without human review.

Support

Help center

Your Help Center is a self-serve help site built from the articles you publish. Customers can read and search it on its own public page, and right inside the chat widget, so they can find answers on their own before they ever open a conversation. Everything in it comes from your knowledge base, so the same content that grounds your AI also powers your public help.

Where your customers see it

Its own public page

A clean, searchable help site at <code>/help.php</code>. Customers browse by category, search, and open any article. You can give it your own name and style.

Inside the chat widget

A help link in the chat widget so customers can search your articles without leaving the chat. If they still need a person, they are one tap away from starting a conversation.

Turn it on

1
Open the Help Center page

Go to <code>Config, then Help Center</code> in your admin and switch on <strong>Enable public Help Center</strong>.

2
Give it a name and a look

Set the Help Center name, which shows in the header and the browser tab, and pick a visual style. You can turn the top navigation off for a clean page with no menu.

3
Publish some articles

Nothing shows until you publish articles to it. The next part covers how.

Publish articles to the Help Center

Articles live in your knowledge base. An article appears in the Help Center once it is published and marked public. There are a few ways to do this:

Publish one article

Open the article, mark it published, and turn on the option to show it in the Help Center.

Publish everything at once

Use the <strong>Publish All</strong> button to push your whole published set to the Help Center in one click, instead of doing them one at a time.

Turn FAQs into articles

Already have FAQs? Use <strong>Publish all to Help</strong> to turn them into help articles so they sit alongside everything else.

Import an existing knowledge base

Moving from another help desk? The Import KB button on the Articles tab brings an existing knowledge base in for you. You have three ways to point it at your content:

Paste a URL

Give it the address of your current help center. If it recognizes the platform (for example Zendesk) it reads the exact category tree from that platform. Otherwise it crawls the site and rebuilds the structure from the pages, importing only the real articles and skipping login, pricing, and contact pages.

Pick a connected app

If a platform is already connected to this workspace and it holds a knowledge base, it shows up in a dropdown under <strong>Import from a connected app</strong>. Select it and import, no URL or password needed. The app is only listed once it is connected and set up.

Upload a CSV

No live site to point at? Upload a spreadsheet with <code>title</code>, <code>category</code>, and <code>body</code> columns. Put <code>Parent / Child</code> in the category column to build nested categories.

Whichever way you choose, you get a preview first: the articles it found, grouped by category, each with a checkbox so you can drop anything you do not want. Nothing is saved until you click Import. Afterwards you can Undo the whole import in one click, or Re-sync a URL or connected-app import later to pull in new and changed articles.

💡
Developers: any connector can advertise its knowledge base to this dropdown by declaring a <code>kb_capabilities</code> block in its <code>settings.json</code> (type <code>kb_source</code>, with an <code>adapter</code> and a <code>base_template</code>). See the Connectors section and the platform-connector reference.

Organize with AI

A tidy help center is easy to browse and easier to search. The Organize with AI button does the tidying for you. In one click it reads your published articles, sorts them into sensible categories, and adds tags. It creates a category when it needs one, reuses a category that already fits, and skips anything you have already organized, so you can run it again any time you add new articles. Turn on Let AI organise into subcategories in Help Center settings and it can also file articles under nested Parent / Child categories, which is handy right after importing a knowledge base that had sub-sections.

💡
Categories give customers a way to browse, and tags sharpen search on both the public page and in the widget. You can rename or move things afterwards. The AI gives you a strong starting point, not a setup you are stuck with.

The Help Center inside your chat widget

You can show the Help Center right inside the chat widget so people search answers before they message you. In your chat widget settings, choose where the help link appears:

In the header

A small help icon at the top of the widget.

At the bottom

A text link under the message box, for example "Browse help center". You can change the wording.

Both places

Show it in the header and at the bottom for the most visibility.

The help link has its own color control under the widget Appearance settings. Leave it on None to match your launcher color, or pick a Solid color or a Gradient. The whole help experience follows your widget theme, so it always looks like part of your brand.

Put your help center on your own web address

Out of the box your help center already has a clean, shareable address of its own (for example /help/your-help-center). You can go one step further and serve it under your own domain, so customers and search engines see it as part of your brand — for example yourdomain.com/help or help.yourdomain.com. Everything keeps working on your domain: links, images, search and the article ratings.

Under your main site

In <strong>Config, then Help Center</strong>, open the <strong>Embed</strong> tab and find "Show your help center on your own web address". Pick your setup — Cloudflare, Nginx or Apache — copy the ready-made block, and paste it into your site. Each option has a <strong>Setup guide</strong> button next to it with the exact steps.

On a subdomain

Prefer <code>help.yourdomain.com</code>? The same panel has a subdomain option. On Cloudflare a subdomain is the most reliable route, and it gives you a clean address with nothing after it.

💡
Using Cloudflare? It only runs its Worker on an address that is proxied through Cloudflare (the orange cloud). Your main domain often points straight at your website, so a rule placed on the main domain can quietly do nothing. The dependable way is a proxied subdomain like <code>help.yourdomain.com</code> — the Setup guide walks you through the one DNS record and the route.
Good for SEO. Once your help center is on your own domain, search engines index your articles under your brand. Each page declares its correct address and the sitemap lists them, so the same article is never indexed twice.
💡
Using the in-widget help link too? In the chat widget's "Open in help center" settings, set <strong>Where the link goes</strong> to <strong>Your own help center domain</strong> and enter the same address. Then those article links open on your domain as well, not on the OpsIQ address.

See how your whole help center is doing

Beyond single-article votes, the Help Center has its own analytics. Switch it on in Help Center settings and it quietly records how people use your help — the most-viewed articles, what they search for, and searches that came back empty (a ready-made to-write list) — working out visitor country and device on its own, so it does not need the chat widget installed to report. Every number is shown for both places your help appears, the public page and the in-widget help, as well as combined, so you can see how much each one is actually used.

💡
Analytics stays off until you switch it on, and you can have visitor IP addresses anonymized. Nothing is recorded before you opt in.

Choose what appears on each part of the page

Each section of the Help Center — the categories on the home page, the popular articles, the article list on a category page and more — has its own simple rule. For each one you can show or hide it, and show all items, a set number, the latest, or only the ones you feature with a star. When a rule caps a list, customers still get a "Show all" link, so nothing is truly out of reach.

You also decide how the helpful votes look: hidden, a friendly ratio like "12 of 14 found this helpful", or plain thumbs counts. A minimum-votes setting stops a brand-new article showing an awkward "0 out of 0".

See which articles are working

Every article shows a Was this helpful? prompt. Each yes or no is counted per article, so you can see at a glance which articles answer questions well and which ones need a rewrite. Repeated votes from the same visitor are ignored, so the counts stay honest.

Text and labels

You can change the headings and labels on the Help Center to match your voice. Leave any field blank and it falls back to a sensible default, so you only edit the wording you actually want to change.

The Help Center shares one library with your AI. Every article you publish here is the same content the AI uses to answer chats and tickets, so improving one improves the other.

Common questions

Do I need to write separate content for the Help Center?+

No. It is built from the same knowledge base articles the AI already uses. Publish an article once and it can serve both.

Can I keep some articles internal?+

Yes. Only articles you publish and mark public appear in the Help Center. Anything unpublished stays out of it.

Will customers still be able to reach a person?+

Yes. The widget help link sits a tap away from starting a conversation, so self-serve never traps anyone.

Growth & SEO

Site Intelligence (SEO suite)

Site Intelligence is OpsIQ's built-in SEO and search-visibility suite. It crawls your site like a search engine, tracks where you rank, researches keywords, watches backlinks and competitors, scans your local map presence, checks page speed, and turns it all into customer-ready reports — with an AI analyst that explains what to fix and can draft the fixes. It is a premium feature; when enabled it appears as Site Intelligence in the sidebar. Every domain's data stays separate — crawls, rankings and reports never mix between domains.

Site Intelligence
Site Intelligence dashboardAn SEO dashboard showing a site-health score, keyword rank tracking and a traffic trend.Site Intelligenceyoursite.com86SITE HEALTH3 critical issuesKeyword rank trackingai helpdesk#3live chat saas#7crm for agencies#12Organic clicks1CRAWLFinds technical issues2TRACKRanks, keywords, backlinks3AI ANALYSTExplains and drafts fixes
The Site Intelligence overview: a site-health score from the latest crawl, live keyword rank tracking, an organic-clicks trend, and the three-step loop — crawl, track, let the AI draft the fixes.

Run a crawl — start here

A crawl is OpsIQ visiting your pages the way a search engine would, to find technical issues: broken links, missing titles, thin content, slow pages, indexing problems.

1
Start the crawl

On the Overview, click to start a crawl. OpsIQ queues it and works through your pages in the background; a status indicator shows progress.

2
Read the reports

When it finishes, open the issues and the page list. Each issue is grouped by severity so you tackle the biggest wins first.

3
Let the AI help

The AI analyst produces a plain-language brief of what is wrong and why it matters — and can generate suggested fixes you review before applying.

What Site Intelligence tracks

Crawls & site health

Scans your pages for technical SEO issues and lists every page with its problems. Re-run any time, or schedule it.

Rank tracking

Add the keywords you care about; OpsIQ checks where your site ranks and tracks movement over time.

Keyword research

Discover new keyword ideas to target, with the AI keyword coach to help prioritise.

Backlinks

See who links to you, refresh the list, and disavow links you do not want associated with your site.

Competitors

Add competitor domains and compare your visibility against theirs, with an AI competitor analysis.

Local (map) grid

Scan local-listing visibility across a geographic grid to see where you show up on the map, plus Google Business Profile tools.

Page speed

Run page-speed checks so you can fix slow pages that hurt rankings and conversions.

AI content

Generate content briefs and drafts aimed at the keywords you are targeting.

Reports

Build printable, customer-ready reports of everything above.

Connect Google for accurate data

Two Google connectors turn estimates into real numbers:

Google Search Console

Search

Pull the exact queries, clicks and impressions Google reports for your site, map your property, and surface ranking opportunities straight from Google's own data.

Google Analytics 4

Traffic

Bring your traffic and engagement data alongside your SEO data, so reports show visibility and behaviour together.

Scheduled refreshes & white-label reports

You do not have to run everything by hand. Scheduled refreshes re-run crawls, rank checks, keyword checks, backlink refreshes, local-grid scans and report generation on a cadence (daily or weekly depending on plan and volume). These run through the OpsIQ cron — see the Cron and automation section. Generated reports export as printable, customer-ready documents: agencies send each client a regular SEO update, and because every domain's data is separate, each client only ever sees their own.

Some Site Intelligence features call external data providers and AI through OpsIQ's configured provider — they work out of the box when the suite is enabled for your plan. If a refresh does not run, confirm the OpsIQ cron is running (see Cron and automation).
Do I need to add anything to my site for SEO tracking?+

Crawls, rank tracking, keyword research and backlinks work without touching your site. For traffic and exact search data, connect Google Search Console and GA4.

Can I track more than one domain?+

Yes. Add each domain separately; their crawls, rankings and reports stay fully isolated from one another.

How often should I crawl?+

Weekly is plenty for most sites; crawl on demand after a big content or structure change. Set a schedule so you never forget.

Growth & SEO

Auto-Implement (SEO Agent)

Auto-Implement is the part of Site Intelligence that actually applies the fixes the crawl and AI analyst recommend, instead of only advising you. The agent works strictly from what Site Intelligence already found — it can never invent a change — and walks each fix through the same safe loop: a dry-run preview, your per-step approval, the live write, an automatic snapshot, and a re-crawl that proves the open-issue count went down. It is a Managed-AI-only feature; it appears as the Auto-Implement (rocket) action inside the Site Intelligence section, and it is off until you turn it on.

Auto-Implement
Auto-Implement SEO agentA flow showing recommended SEO fixes moving through preview, approval and a live write, with a prove-it re-crawl.Auto-Implementyoursite.comRecommended fixesAdd missing <title>approvedFix robots.txtapprovedSubmit sitemap.xmlreviewDRY-RUN PREVIEW (DIFF)+ <title>AI Helpdesk - OpsIQ</title>+ <meta name=description ...>- <title>Home</title>ApproveSkipPROVE IT - RE-CRAWLOpen issues 124Snapshot saved1PREVIEWDry-run diff of each fix2APPROVE & WRITESSH or hosted API3PROVE & ROLLBACKRe-crawl + snapshot
How a session runs: the agent lists the fixes Site Intelligence already recommended, shows a dry-run diff of each one, applies the ones you approve over SSH or a hosted API, snapshots before every write, and re-crawls to prove the open-issue count dropped.

What it can change

The agent only ever applies fixes that Site Intelligence (or the AI analyst) already recommended for that domain. Across the supported platforms that covers:

Server config

sitemap.xml, robots.txt, and redirect, canonical and header rules in .htaccess (Apache / LiteSpeed) or the nginx config.

Redirect chains

Collapses a multi-hop redirect chain down to a single hop straight to the final URL, inside the same managed .htaccess block, so speed and link value stop leaking through the extra hops.

Page <head>

Missing or weak page titles, meta descriptions, canonical tags and structured-data (schema) blocks.

WordPress SEO

Yoast, Rank Math and SEOPress titles & meta, and image alt text, applied through WP-CLI on the SSH path or the REST API on the hosted path.

WordPress structured data

Adds JSON-LD (schema) to pages that are missing it. On the SSH path a small managed helper (a must-use plugin) prints the markup so it works with or without an SEO plugin; on the hosted path your SEO plugin carries it.

Internal links

Adds one relevant internal link inside existing WordPress content to rescue orphan pages and connect related posts. One link per page, never inside a heading, an existing link or a shortcode, and always approved by you first.

Thin-page content rewrites

Drafts full replacement content for thin pages (turned on by a crawl option, see below). Every draft is reviewed and approved by you before anything publishes, and the old content is kept so it can be restored.

Page cache (WordPress)

Turns on W3 Total Cache page caching when the crawl finds speed problems and that plugin is installed, so pages serve faster.

Shopify SEO

Product and collection SEO titles & descriptions, page and blog-article SEO, plus 301 redirects, through the Shopify Admin API.

Webflow SEO

Per-page SEO title and meta description through the Webflow Data API v2.

Prepare the fixes automatically (two crawl options)

The Site Intelligence Configure panel for a domain (its crawl settings) has two options that decide how much the agent lines up for you ahead of time. Both are off by default and both use AI credit, so you switch them on only when you want that work done for you.

Auto-prepare AI fixes after each crawl

Every crawl also writes the concrete fix content (titles, meta descriptions, alt text, schema, redirects) for what it found, so the fixes are ready to review and apply the moment the crawl finishes instead of being generated later on demand. Uses AI credit on each crawl.

AI content rewrites (thin pages)

The agent may draft full replacement content for thin pages. Nothing is ever published on its own: each draft appears as a change you review side by side and approve or reject, the previous content is kept so it is reversible, and it is limited to a few pages per pass. Uses AI credit per draft.

💡
Both options only prepare and draft work. Every change still goes through the same per-step approval, snapshot and rollback as any other fix, so turning them on never puts anything live by itself.

Two ways it connects

SSH / SFTP path

Self-managed

For sites on your own server, the agent connects over SSH/SFTP using credentials you store, edits the server config and page files directly, and runs WP-CLI for WordPress. Best when you have shell access and want full control of files.

Hosted-API path (no SSH)

No shell

For platforms that do not allow SSH, the agent works entirely through an official API connector — WordPress (REST + Application Passwords), Webflow (Data API v2) and Shopify (Admin API). Nothing is installed on the host.

💡
Wix and Squarespace have no public SEO-write API, so on those platforms Auto-Implement runs in advisory mode: it shows you the exact change to make (the precise title, meta or setting) for you to apply by hand. Everything else is read-only and safe.

Turn on the connectors

The agent reaches each platform through a connector:

Built in

Shopify and WordPress connectors ship with OpsIQ — just enable them under Connectors and add the store / site credentials.

From the Marketplace

Webflow, Wix and Squarespace install from Connectors → Marketplace, then connect the same way.

How a session runs

1
Pick the fixes

Open Auto-Implement (rocket) from the Site Intelligence section. It lists the issues Site Intelligence already found that it can fix on this domain.

2
Preview each change

For every fix the agent shows a dry-run diff — exactly what it will write — before anything touches the live site.

3
Approve step by step

You approve (or skip) each change individually. Nothing is applied without your explicit go-ahead on that step.

4
It writes, then snapshots

On approval the agent makes the live change over SSH or the hosted API and saves a snapshot first, so any change can be rolled back.

5
Prove it, live

As it applies each change the agent immediately re-checks that exact page and shows a per-step “fixed live” verdict, so you watch each fix land on the live page as it happens. At the end it re-crawls the whole site and confirms the open-issue count dropped.

Safety & billing

SEO-only

The agent can only do what Site Intelligence recommended for that domain — it cannot make arbitrary changes to your site or server.

Per-step approval

Every write is previewed as a diff and applied only after you approve that specific step.

Snapshot & rollback

A snapshot is saved before each write, so any change can be reverted.

Live per-step proof

Each changed page is re-checked the instant it is written and gets a “fixed live” verdict, so a fix is confirmed against the live page right away, not only in the closing re-crawl.

Content is never auto-published

Internal links and thin-page content rewrites are higher-impact, so they are always shown to you for approval and are never applied automatically, whatever mode you run.

Managed-AI only

Auto-Implement runs on Managed AI; it is blocked when a workspace is using its own (BYOK) keys.

Billing

AI tokens bill normally as you use them, plus one flat per-use fee per Auto-Implement session — both drawn from the same Managed-AI credit.

Auto-Implement is off by default. Enable it on the AI configuration page (Auto-Implement card) and make sure the connector for your platform is connected first.
Does it change anything without asking?+

No. Every change is previewed as a dry-run diff and applied only after you approve that exact step. A snapshot is saved before each write so you can roll back.

Do I need SSH access?+

Not on WordPress, Shopify or Webflow — those work through their official APIs with no shell access. SSH is only one of the two paths, used when you want the agent to edit server config and files directly on your own server.

How do I know it worked?+

After applying the approved fixes the agent re-crawls the site and shows the open-issue count before and after, so you can confirm the fixes reduced the issues.

Will it rewrite or publish page content on its own?+

No. AI content rewrites are off until you turn them on in the crawl options, they are limited to a few thin pages per pass, and every draft is shown to you for side-by-side approval before anything publishes. The previous content is kept, so a rewrite can always be reverted.

Can I use it with my own AI keys?+

No. Auto-Implement is Managed-AI only and is blocked under BYOK. It bills AI tokens normally plus one flat per-use fee per session, from the same Managed-AI credit.

Growth & SEO

Promotion Studio

The Promotion Studio turns your website into a conversion engine. Design pop-ups, banners, slide-ins, top/bottom bars, full-screen takeovers, inline blocks and even country-based redirects — then show the right message to the right visitor at the right moment. Everything is delivered through the OpsIQ widget already on your site, so there is nothing extra to install. You design and save campaigns any time; they only show once you Publish them and the studio is switched on for your workspace.

Promotion Studio
Promotion Studio designerA visual campaign designer with a blocks palette, a pop-up on the canvas, and a targeting panel.Promotion Studio - DesignerBLOCKSxWelcome, {first_name}!Get 15% off your first orderSAVE15Claim my couponTARGETINGCountryUS, CATriggerExit-intentA/B split50 / 50Publish1DESIGNDrag blocks onto canvas2TARGETCountry, page, audience3MEASUREA/B winner + AI insight
The visual designer: a blocks palette on the left, your campaign on the canvas (here a personalised coupon pop-up using a {first_name} token), and the targeting + publish panel on the right.

The big picture

Campaign

What

One promotion — a pop-up, banner, bar, slide-in, full-screen, inline block or geo-redirect. Each has a goal: sales, lead, sign-up, chat, survey, announcement.

Design & versions

How

You build the look in the visual editor. Every save creates a new version, so you can always roll back — nothing is ever lost.

Targeting

Who

Who sees it: country, page, device, traffic source, returning vs new, schedule, and — with a connector — your logged-in customers.

Triggers

When

When it appears: instantly, on delay, on scroll, on exit-intent, when idle, on a click, after N pages, or from chat / ticket activity.

Analytics

Results

Live impressions, click-through, conversions, a drop-off funnel, country / page / device splits, A/B winners and an AI insight.

Launch your first promotion in 5 steps

1
Start from a template or blank

Open Promotion Studio and click New campaign, or pick a ready-made design from the Templates gallery. A draft opens in the designer.

2
Design it

Drag in blocks — headings, text, buttons, images, badges, stats, countdowns, forms, coupons, videos, ratings, spin-wheels. Style colours, gradients and 3D effects with the sliders. Preview Desktop / Tablet / Mobile, and use Free move to place anything anywhere.

3
Personalise it

Type tokens like {first_name}, {country} or {company} into any text. At show-time they become the visitor's real values.

4
Target & trigger

Choose who sees it (country, page, device, audience) and when it fires (delay, scroll, exit-intent). Leave a rule blank to mean everyone.

5
Check, then publish

Click Check for a quick pre-launch scan, then Publish. It goes live within seconds and starts collecting analytics.

Blocks you can build

Content

Core

Heading, paragraph, list, quote, image, icon, badge, stat, divider and spacer — the building blocks of any message.

Call to action

Core

Buttons with real actions: open a link, start a chat, create a ticket, copy a coupon, or jump to a page.

Urgency & capture

Premium

Countdown timers, forms (email / phone / text), coupon reveals and video embeds.

Gamified & feedback

Premium

Spin-to-win wheels, scratch cards, NPS / star ratings and multi-step funnels.

Layout & effects

Premium

Columns, progress bars, social share, social proof tickers, yes/no two-step, quizzes, and 3D effects — tilt, glow, parallax, glassmorphism.

Personalisation tokens

Type any of these in headings, paragraphs, buttons, badges, stats, lists or quotes. They are replaced with the visitor's live details the moment the promotion shows (always cleaned for safety):

Available 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)

Targeting reference

Country & location

Show only in (or hide from) chosen countries, cities or timezones via GeoIP. Great for region-specific offers or a geo-redirect.

Pages & URLs

Limit to certain pages using equals / starts-with / contains / regex, and exclude pages too.

Device

Desktop, tablet or mobile — e.g. a slim bar on mobile, a modal on desktop.

Visitor type

New, returning, known (in your CRM) or anonymous; CRM segments, lifecycle stage, lead score or browser language.

Traffic source

By UTM (utm_source, utm_campaign) or referring site — e.g. only visitors from a specific ad.

Schedule & frequency

Start / end dates, time-of-day windows, and how often a person can see it (per session, per day, after they close / click / convert).

A/B traffic split

Show to a percentage of visitors and run variants head-to-head; the same person always sees the same variant.

Audiences (logged-in)

With a connector enabled, target by live account state — e.g. customers with unpaid invoices, or active subscribers.

Triggers

Pick how the promotion appears: Immediately, after a delay, on scroll depth, on exit-intent, when idle, on a click of an element, after a number of pages viewed, on form-abandon, or from chat / ticket activity. Developers can fire one from their own code with window.OpsIQPromo.fire('event').

Target logged-in customers (connectors)

This is what makes OpsIQ promotions special: connect a platform like WHMCS (or any connector that supports audiences) and the studio can target visitors by their live account state.

1
Enable an audience connector

Under Connectors, enable one that exposes audience facts (WHMCS does out of the box). Customers are recognised securely when logged into that platform — OpsIQ never trusts a typed-in email.

2
Add an audience rule

In the campaign's Targeting > Audience, require logged-in and add rules like unpaid invoices >= 1, subscription is past-due, or account credit > 0.

3
Personalise with their data

Use tokens such as {first_name} or {balance_due}. A "You have an overdue invoice" reminder writes itself.

Audience targeting is fail-safe: if the connector cannot confirm a fact (or the visitor is not logged in), the promotion simply does not show — so a billing-targeted offer never reaches the wrong person. Building your own connector? See "Promotion audience targeting" below.

Connected commerce (the studio superpower)

Product cards from your store

Live data

A Product block pulls real items — name, price, sale price, image, link — straight from WHMCS, WooCommerce, Shopify or your OpsIQ billing. Tick "Keep fresh" and the card updates its price from the platform every hour while published.

Store-provisioned coupons

Coupons

A coupon block can create the real discount code in your store the moment you publish, so the code a visitor reveals always works at checkout.

Order-truth revenue

Attribution

Real orders from your platforms are matched back to campaigns hourly — by coupon code used or by the lead's email — so the revenue you see is from actual sales, not estimates.

Real social proof

Trust

The social-proof ticker can lead with genuine recent orders ("Ada ordered Starter Plan · 2h ago") — first name and item only, never emails or amounts.

Experiments & journeys

A/B variants & auto-winner

Split traffic across design variants; let the studio promote the statistical winner automatically, or hand traffic to the bandit optimiser which shifts visitors toward what converts as evidence comes in.

Holdout uplift

Reserve a slice of visitors who see nothing, so you can prove the campaign itself causes the lift.

Segment variants

Different content per audience on the SAME campaign — mobile visitors, big carts, returning customers — each segment gets its own version.

Trigger experiments

Variants can also test WHEN to appear: immediate vs delayed vs exit-intent, measured head-to-head.

Journeys (chaining)

Target by what someone did with another campaign — "saw campaign A but didn't convert" — to build multi-step promotion sequences.

Teasers

A small pill visitors can reopen after closing the campaign, so a closed pop-up is never gone for good.

Know what happened

Click heatmap

Designer

In the designer, toggle the heatmap to paint real visitor clicks over every block of your design.

Step funnel

Funnels

Multi-step campaigns show exactly where people drop off, screen by screen.

Compare campaigns

Studio

Put up to four campaigns side by side — impressions, clicks, conversions — best value highlighted.

Weekly story & digest

AI

Every Monday a digest lands in your notifications; the 📖 Weekly story button writes a plain-language summary with next steps whenever you want one.

Working comfortably

AI copilot & ideas

Chat with the design copilot to edit the canvas ("make the headline urgent, add a countdown"), get campaign ideas from your own traffic data, translate a campaign per country, or auto-fix a low design score.

Brand Kit import

One command reads your website and proposes your real brand colours and fonts; save and every picker leads with them.

Multi-screen funnels

Steps blocks get true per-screen editing — tabs for each screen, add or reorder screens, and the preview follows along.

Named versions & presence

Name important versions ("Launch candidate"), restore any of them, and see a warning when a teammate is editing the same campaign.

Device strip & rulers

See desktop, tablet and mobile side by side in one view; toggle pixel rulers for precise placement.

Hosted page & channels

Every campaign can also be a standalone hosted page for bios and QR codes, an email drip sequence for captured leads, or a one-click web-push draft.

Enterprise safety

Publish freeze windows (change-freeze periods), an emergency pause-all switch, approvals, audit trail and version rollback.

Do I need to add code to my site?+

No. Promotions are delivered by the same OpsIQ widget you already installed. Design, publish, done.

Will visitors see the same pop-up over and over?+

No — set frequency caps (per session / per day, or stop after someone closes, clicks or converts). Sensible defaults are applied.

Who can publish?+

Publishing, pausing, archiving and rolling back are limited to workspace owners and full administrators. Any team member can create and design drafts.

Growth & SEO

Promotion Designer

Promotion Designer is a responsive block editor for building, reviewing, versioning and publishing a campaign experience.

Product screen
Promotion DesignerThe designer combines a live canvas, device previews, blocks, personalisation variables, comments and version history.Promotion DesignerworkspaceVIEWPORTDesktopVERSIONv12STATEDraftLIVE WORKSPACE VIEWHero blockHeadline, media and CTAEditOffer blockDiscount and deadlineEditPersonalisationContact and campaign variablesReadyLaunch checkComments and validationReview1BUILD BLOCKSEdit live layout2PREVIEWDesktop, tablet, mobile3PUBLISHVersioned release
The designer combines a live canvas, device previews, blocks, personalisation variables, comments and version history.

Use blocks to compose the experience, preview each supported viewport and insert approved personalisation variables. Review comments and AI-media provenance before launch. Saving creates versions so a previous design can be inspected or restored.

Growth & SEO

Promotion templates

Templates provide a searchable, categorised starting gallery for Promotion Studio campaigns.

Product screen
Promotion templatesThe template gallery filters premium layouts and applies workspace brand colours when a template becomes a draft.Promotion templatesworkspaceCATEGORYConversionRESULTS24BRANDAppliedLIVE WORKSPACE VIEWExit offerModal with urgency and CTAPreviewNew visitor welcomeBanner and benefit listPreviewProduct launchHero, proof and countdownPreviewFeedback requestCompact survey promptPreview1FILTERCategory and search2PREVIEWInspect the full design3USECreate a branded draft
The template gallery filters premium layouts and applies workspace brand colours when a template becomes a draft.

Search or filter by category, load additional results, preview the complete experience, then choose Use template. The new campaign remains a draft and can be changed in Promotion Designer before publication.

Growth & SEO

Promotion analytics

Promotion analytics connects impressions and clicks to conversions, audience context, connector action outcomes and campaign learning.

Product screen
Promotion analyticsPromotion analytics shows headline performance, audience and trigger breakdowns, leads export and connector action results.Promotion analyticsworkspaceIMPRESSIONS42.8kCTR6.4%CONVERSIONS814LIVE WORKSPACE VIEWCountryUnited Kingdom · 31%BreakdownPage/pricing · 22%BreakdownTriggerExit intent · 44%BreakdownConnector actionCoupon created · 97% successOutcome1MEASUREImpressions to conversion2SLICEPage, country, device3LEARNApply the insight
Promotion analytics shows headline performance, audience and trigger breakdowns, leads export and connector action results.

Read impressions, click-through rate and conversions together. Break results down by country, page, trigger and device; export captured leads when necessary. Connector action outcomes show whether the promotion’s promised follow-up actually ran. AI insight and learning summaries should be treated as hypotheses to validate, not automatic proof.

Growth & SEO

Announcements

Announcements publish a message in the widget notification area with optional targeting, schedule and call to action.

Product screen
AnnouncementsThe Announcement editor includes content, CTA, audience, segment, page rule, active dates and visual style.AnnouncementsworkspaceACTIVE3AUDIENCESegmentSCHEDULEJul 22–29LIVE WORKSPACE VIEWTitlePlanned maintenanceReadyContentMarkdown messageReadyCTARead the updateOptionalRulePricing pages · active customersTarget1WRITETitle and Markdown2TARGETAudience, segment, page3SCHEDULEActive window
The Announcement editor includes content, CTA, audience, segment, page rule, active dates and visual style.

Choose all visitors, signed-in visitors or new visitors; optionally narrow the audience with a contact segment and page rule. Set active-from/active-to dates and an active flag. Premium style presets and colours change presentation but do not replace clear content.

Growth & SEO

Push campaigns

Push campaigns send browser notifications to subscribed visitors after they have left the site.

Product screen
Push campaignsThe push composer shows subscription reach, content, media, actions, target rules and schedule state.Push campaignsworkspaceSUBSCRIBERS8,214SENT31.6kCLICK RATE5.8%LIVE WORKSPACE VIEWTitleYour cart is waitingReadyBodyReturn today for free deliveryReadyCTAOpen cartReadyScheduleSend now or scheduledDraft1PREPARE PUSHTitle, body, icon2TARGETAudience, segment, page3SENDNow, schedule or draft
The push composer shows subscription reach, content, media, actions, target rules and schedule state.

Configure Web Push keys first under the Web Push settings. A campaign can include title, body, icon, hero image, badge, CTA and up to two action buttons; a persistent notification remains until the visitor interacts.

Target by audience, optional contact segment and page rule. Save a draft, schedule it or send immediately. Use the subscription and click metrics to judge reach. HTTPS and a correctly hosted service worker are required on embedded third-party sites; see Web Push on third-party sites.

Growth & SEO

Proactive messages

Proactive Messages reach out automatically the moment a visitor's behaviour matches a rule — before they ask. You build each as a rule with three parts: what should happen, when it should fire, and how often. Everything is delivered through the OpsIQ widget already on your site.

Proactive
Proactive messagesA proactive-rule composer in three parts: choose an action (chat, banner, tour, push, email), add conditions, and set a frequency cooldown.Proactive Messagesworkspace1 · ActionChat messageBannerTourPushEmail2 · Conditionspage = /pricingtime on page > 20sreturning3 · FrequencyOnce per sessionStatus1ACTIONChat, banner, email, push…2CONDITIONSPage, time, score, returning3FREQUENCYCooldown per visitor
Every proactive rule is three choices: what happens (chat, banner, tour, push, email, webhook), when (conditions), and how often (cooldown).

The three parts of a rule

1
What should happen (action)

Show a chat bubble or on-page banner, start a Guided Tour, send a web push or email, assign to a department, or fire a webhook. Tokens like {{visitor_name}} and {{page_title}} become real values.

2
When it should fire (conditions)

Narrow who triggers it: page/URL, time on page, scroll depth, lead score, returning vs new, idle. With no conditions, the rule fires for every visitor — add at least one to target it. Conditions combine with AND.

3
How often (frequency)

Set a cooldown so the same person is not pestered — e.g. once per session or once per day. Each rule has an on/off status.

⚠️
The workspace toggle "Run time/idle rules hourly" lets server-side actions (email, push, webhook, assign) fire on a schedule for known contacts who are not currently on the page — so you can "email idle hot leads" automatically. It needs the OpsIQ cron running. Leave it off if you only want live on-page nudges.
Will it fire for everyone?+

Only if you add no conditions. Add at least one condition (page, lead score, returning…) to target the right visitors.

How do these relate to flows and tours?+

They work together: a proactive rule can start a Guided Tour, and a Chatbot Flow can be triggered by a proactive rule. Start with a single chat-message rule, then layer the others on.

Growth & SEO

Chatbot flows

Chatbot Flows script branching conversations inside your chat widget — greetings, keyword answers, guided paths — with no code. A flow is a set of connected steps (nodes): you ask a question, the visitor picks an option, and the flow sends them down the matching branch. Only Active flows run on your site.

How it works
Chatbot flowsA flow canvas: a greeting node branches into three option buttons, each leading to a next step — look up order, or hand off to a human.GreetingHi! How can I help?Track my orderBilling questionTalk to a humanLook up order→ Human agentTriggers: Greeting · Keyword · Manual · After-details · On-chat-end
Chatbot flows

Flow vs the AI — when to use which

Use a flow

When the path is predictable and you want it identical every time — booking steps, a returns wizard, a "which plan?" chooser, collecting an email before handoff. Flows never improvise.

Use the AI

When questions are open-ended — "does this work with my setup?". The Customer Chat AI answers from your trained knowledge. A flow can hand off to the AI (or a human) at any step.

Triggers

Greeting

Runs as the opening message when a visitor first opens the chat.

Keyword

Runs when the visitor types a word you listed (e.g. refund, pricing, cancel).

After details / After delay

Starts once contact details are shared, or a set time into the conversation.

On chat end / Proactive

Runs as the chat wraps up (e.g. a rating), or is started by a Proactive Message rule.

Build one in four steps

1
Create the flow

Click New Flow, name it, pick a trigger type (and keywords if Keyword), save. It starts switched off.

2
Open the canvas

Click Edit Canvas — the visual builder where you add steps (messages, questions with buttons, branches) and connect them.

3
Add branches and a hand-off

For each choice, draw a branch to the next step. End paths by resolving, handing to the AI, or transferring to a human.

4
Enable it

Click Enable. The flow goes live in your widget immediately. Disable any time without losing the design.

Do flows replace the AI?+

No — they run side by side. Use flows for predictable paths and the AI for open-ended questions; a flow can always hand off to either.

Growth & SEO

Guided tours

Guided Tours are step-by-step walkthroughs that point at parts of your page with speech bubbles and a spotlight, guiding a visitor through onboarding or a new feature. They are fully themed and built in a visual designer with a live preview. A tour runs only when it is marked Active.

How it works
Guided toursA dimmed page with a spotlight ring around an Add-deal button and a themed speech bubble reading Step 1 of 4 with a Next button.+ Add dealSTEP 1 OF 4Create your first dealClick here to add a deal to your pipeline.Next →
Guided tours

How a tour is built

Steps

Each step targets an element and shows a bubble with your text. Add as many stops as the walkthrough needs and order them.

Presets & theme

Start from a preset or design your own bubble — colours, gradients, spotlight — with a live preview on the right.

Trigger

Optionally link a Proactive Rule so the tour auto-starts when that rule fires (e.g. a returning visitor's first dashboard visit).

Active toggle

A tour is eligible to run only while Active is ticked. Untick to take it down without deleting it.

Build one in four steps

1
New tour

Click New Guided Tour, name it, and optionally link a Proactive Rule so it starts automatically.

2
Add steps

Add each stop: choose the element it points to and write the bubble text. Reorder until the path flows.

3
Design it

Pick a preset or style the bubble yourself. The live preview shows exactly what visitors see.

4
Activate

Tick Active and save. The tour can now run — on its own trigger, or started by a Proactive Message rule.

How do tours start?+

On their own trigger, or via a Proactive Message rule's "Guided tour" action — so you decide which visitors see which tour and when.

Growth & SEO

Conversion goals

Conversion Goals turn an activity you care about — an inbound webhook event, a chat message, a ticket resolution — into a recorded conversion with full attribution. When the activity fires, OpsIQ logs a conversion against the contact and ties it back to the campaigns, segments and sources that led there.

How it works
Conversion goalsA goal flow: a payment.succeeded webhook event becomes a recorded "purchase" conversion worth $49, attributed to its source and campaign, with quick-start preset chips above.Quick startStripe purchaseDemo bookedNewsletter signuppayment.succeededinbound webhookConversion"purchase" · $49Attributedsource · campaign
Conversion goals

Define a goal in three steps

1
Pick the trigger activity

Click New conversion goal. Choose the activity type that counts as a conversion, or use a Quick-start preset — Stripe purchase, Demo booked, Newsletter signup or Subscription started.

2
Name it and set a value

Give the conversion a name (purchase, demo_booked, signup) and optionally a fixed value and an attribution window.

3
Save

Save and enable. From then on, whenever the activity fires, OpsIQ records a conversion against the contact with attribution to the preceding touches.

Goals are already wired into inbound webhooks: any goal whose trigger matches an inbound event's type fires automatically the moment the event lands. Use the Inbound Webhooks page to connect Stripe, Calendly or any system that can POST JSON.
What can be a conversion?+

Any recorded activity — an inbound webhook event (payment.succeeded), a chat email capture, a ticket resolution — anything on the contact timeline.

Analytics

Custom dashboards

Custom Dashboards let you build your own view of the metrics that matter, instead of relying only on the standard Overview. Add the widgets you want, drag and resize them into the layout you like, save it, and share it with your team.

Custom dashboards
Custom dashboardsA dashboard builder with KPI and chart widget tiles, a dashed drop zone, and an Add-widget button.Custom DashboardsworkspaceMy dashboard+ Add widgetVISITORS2,481REVENUE$8.2kTRAFFICDrag a widget hereTOP PAGES/pricing/docs/signup1ADD WIDGETSPick metrics & charts2ARRANGEDrag & resize3SHAREWith your team
Build your own board: add KPI, chart and list widgets, drag and resize them into the layout you want, then share it with the team.

Build one in three steps

1
Add widgets

Click Add Widget and pick the metric or chart you want to track. Repeat for everything you want on the board.

2
Arrange the layout

Drag widgets to reposition and drag their edges to resize. KPIs across the top, charts below — whatever reads best.

3
Save & share

Save the dashboard and share it with your team so everyone watches the same numbers.

Keep separate boards for separate jobs — a "daily glance" board with live counts, and a "monthly review" board with trend charts — so each stays focused.
Growth & SEO

Outreach campaigns

Outreach is OpsIQ's 1:1 and bulk email engine: compose a personalised message or run a campaign to a CRM segment, with reply detection, send-time control, open/click tracking, a tracking pixel and one-click unsubscribe. It is consent-gated and CAN-SPAM / CASL compliant.

Outreach
Outreach campaignsThe Outreach screen with Composer/Campaigns/Templates/Replies tabs and a campaign table showing sent, open-rate and reply-rate.OutreachworkspaceCampaignsComposerTemplatesRepliesCAMPAIGNSENTOPENREPLYJune newsletter1,20048%7%Trial follow-up34062%14%Win-back82039%5%Reply detection auto-stops follow-ups · one-click unsubscribe on every send11:1 & BULKCompose or campaign2TRACKEDOpens, clicks, replies3COMPLIANTUnsubscribe built in
The Outreach engine: send 1:1 or run campaigns to a segment, track opens and replies, and stay compliant with built-in unsubscribe and reply detection.

The four tabs

Composer

Write a personalised 1:1 email with {tokens} from the contact and CRM.

Campaigns

Send to a CRM segment, scheduled or now, with caps and send-time control.

Templates

Reusable message templates for repeated outreach.

Replies

Reply detection records responses and auto-stops follow-ups to anyone who replied.

How a campaign runs

1
Pick an audience

Choose a CRM segment (or upload a list). Suppression and consent are applied automatically.

2
Compose

Write the message with personalisation tokens; preview against a real contact.

3
Schedule & send

Send now or at the best time. A tracking pixel records opens; clicks and replies are attributed.

Outreach is consent- and suppression-gated, includes a one-click unsubscribe on every send, and follows CAN-SPAM / CASL — replies automatically stop further follow-ups.
Analytics

Scheduled reports

Scheduled Reports email a chosen metric set to chosen recipients on a schedule — daily, weekly or monthly — as a printable, white-label PDF. Set it once and the report lands in inboxes automatically through the OpsIQ cron.

Scheduled reports
Scheduled reportsThe scheduled-reports screen: a table of reports with their schedule, recipients and last-sent time, plus a Save-report button.Scheduled ReportsworkspaceScheduled reports+ Save reportREPORTSCHEDULERECIPIENTSLAST SENTWeekly trafficMon 9:00[email protected]2d agoSEO client reportMonthly[email protected]Jun 1Sales summaryDaily[email protected]todayDelivered as a white-label PDF via the OpsIQ cron1AUTOMATEDDaily · weekly · monthly2WHITE-LABELPDF to clients3RECIPIENTSEmailed on schedule
Set a report once — metric set, range, schedule, recipients — and OpsIQ emails a white-label PDF automatically on your cadence.

Set up a report

1
Choose what to send

Pick the metric set (traffic, SEO, sales, support…) and a date range.

2
Set schedule & recipients

Daily, weekly or monthly, at a time you choose, to one or more email recipients.

3
Save

Save and enable. The report generates and emails itself on schedule — no manual step.

💡
Scheduled reports run through the OpsIQ cron — if a report does not arrive, confirm the cron is running (see Cron and automation).
Privacy

Privacy & compliance

The Privacy & Compliance page is the single place to show an auditor you handle personal data responsibly: the consent ledger, the admin access log, your data residency and retention policy, and a ready-to-print DPA — in one tabbed view. Only full administrators can open it.

Privacy & compliance
Privacy & complianceThe Privacy & Compliance screen: tabs for Consent ledger, Access log, Residency and DPA, with a consent ledger table of grants and revokes by channel.Privacy & ComplianceworkspaceConsent ledgerAccess logResidencyDPACONTACTCHANNELACTIONDATE[email protected]emailGrantedJun 12[email protected]pushRevokedJun 10[email protected]marketingGrantedJun 9Searchable proof of every consent grant and revoke, by channel1CONSENT LEDGERProof of every grant2ACCESS LOGWho touched data3DPAPrintable template
One auditor-ready screen: a searchable consent ledger (grants/revokes by channel), an access log of who touched data, residency/retention settings, and a printable DPA.

The four tabs

Consent ledger

A searchable record of every consent grant and revoke — by contact, channel (email, push, SMS, in-widget), action, source and date. Your proof a contact agreed (or withdrew).

Access log

Who on your team viewed, edited, exported, erased or messaged a contact's data — with the admin, contact, action, stated reason and IP. Exactly what a regulator asks for.

Residency & retention

Declare where this workspace's data lives, set how many days activity rows are kept (0 = forever), and record your data controller and DPO.

DPA template

A printable Data Processing Addendum that fills in your controller, address, DPO, residency and retention. Print or save as PDF.

Privacy & Compliance pairs with the Cookie consent studio (which collects consent) and the Export page (which produces the data copy for a DSAR). See also Cron and automation for the nightly retention cleanup.
Connectors

Connect your platforms

Connectors link OpsIQ to external platforms: e-commerce stores, billing systems, payment processors, email providers, and custom APIs. Once connected, the AI can look up orders, customer data, subscriptions, and more — and take actions with your approval.

How it works
Connectors hubOpsIQ core connected to WHMCS, Shopify, Stripe, WooCommerce, SendGrid and Google Business Profile, each showing a connected status.WHMCSShopifyStripeWooCommerceSendGridGoogle BPOpsIQCORE1PLUG IN25+ pre-built connectors2AI CONTEXTReal platform data3ACTIONSDone with your approval
Connectors

Pre-installed connectors

WHMCS

Billing

Web hosting billing: clients, services, tickets, invoices, domains, servers.

Shopify

E-commerce

E-commerce: orders, customers, products, inventory, payments, webhooks, GDPR.

WooCommerce

E-commerce

WordPress e-commerce: orders, customers, products, coupons, shipping.

Stripe

Payments

Payments: charges, customers, invoices, subscriptions, payouts, disputes.

Paystack

Payments

African payments: transactions, customers, plans, subscriptions.

BigCommerce

E-commerce

E-commerce: orders, customers, products, categories, brands.

Magento 2

E-commerce

E-commerce: orders, customers, products, categories, inventory.

PrestaShop

E-commerce

E-commerce: orders, customers, products, cart rules, carriers.

OpenCart

E-commerce

E-commerce: orders, customers, products, categories.

osCommerce

E-commerce

Legacy e-commerce: orders, customers, products.

Zendesk

Support

Helpdesk: tickets, users, organizations, comments.

Google Business Profile

Marketing

Local business: reviews, posts, Q&A, insights. Uses OAuth.

Amazon SES

Email

Email delivery: send transactional emails via Amazon SES.

Postmark

Email

Email delivery: send transactional emails via Postmark.

Resend

Email

Email delivery: send transactional emails via Resend.

SendGrid

Email

Email delivery: send emails and manage templates via SendGrid.

Mailgun

Email

Email delivery: send emails via Mailgun.

Installing a connector

1
Go to Connectors

Navigate to Connectors in the admin sidebar.

2
Find the connector

Browse the list or search. Connectors are grouped by category.

3
Enable it

Click the connector and toggle Enable.

4
Enter credentials

Fill in the required fields: API key, URL, tokens, etc. Each connector has specific requirements documented in its settings panel.

5
Test connection

Click "Test Connection." A green result means the connector can reach the external platform. A red result shows the error.

6
Configure features

Choose which features to enable: knowledge sync, webhook sync, AI actions. Not all connectors support all features.

What connectors give you

AI context

The AI can look up customer data, orders, subscriptions, and more through the connector. When a customer chats, the AI has real platform data to reference.

AI context (connector authors)

Your connector's ContextProvider feeds the ticket-AI a read-only account summary of the ticket owner. Resolve the customer by <code>customer_id</code> when known; otherwise — on ticket auto-replies, where the ctx flag <code>customer_trust_email</code> is true — look the account up by <code>customer_email</code> (the verified ticket sender). Remote platforms expose a <code>/context/customer-by-email</code> endpoint and the connector calls it. This is what makes the AI quote a real balance/invoice instead of saying “please log in.” Honour the operator's data-class toggles (<code>customer_sections</code>, <code>customer_allow_credit</code>) and stay strictly read-only — never emit secrets.

Customer directory (connector authors)

Your connector's IdentityProvider feeds three universal ticket lookups: <code>lookupCustomerById()</code> (customer card), <code>lookupCustomerServices()</code> (product/service table), and <code>listCustomers($query,$limit)</code> — the "Search customer or type email" picker on the native Compose-New-Ticket form. Return rows of <code>{id, external_id, name, email, company, phone, platform, platform_label}</code>. <strong>Remote rule:</strong> if your customers live in another database or service, fetch them over your platform's API inside these methods — never read the other system's tables directly (in the OpsIQ DB they're empty placeholders, which is why a local read returns an empty picker). Gate the remote path on your configured API URL; keep a local read only as a same-DB fallback.

Email-piped tickets — detection & routing (connector authors)

When inbound email becomes a native ticket, OpsIQ detects the sender by calling <code>lookupCustomerById(0, ['email'=>$sender])</code> across every connector; the first match "owns" the customer and its <code>platform</code> slug is stamped on the <code>ticket.created</code> event as <code>_pipe_owner_platform</code> (empty = guest). So a WHMCS-customer email opens a ticket in WHMCS (WHMCS numbering, mirrored as one), while an unknown sender stays a native guest. <strong>If your connector mirrors native tickets onto its own platform</strong>, your <code>ticket.created</code> handler must gate on this: <code>if (array_key_exists('_pipe_owner_platform',$payload) && $payload['_pipe_owner_platform'] !== '<your-slug>') return;</code> — the key is absent on non-piped (chat/manual/AI) tickets, so those mirror as before. Per-department control lives under Team & Departments → Open tickets via email (Anyone / Customers only / Off).

Actions

The AI can perform actions through the connector: create tickets, update orders, cancel subscriptions — all with your approval through the Trust Layer.

Knowledge

Connectors contribute platform-specific knowledge articles to the AI. Shopify connector adds e-commerce troubleshooting; WHMCS connector adds hosting knowledge.

Knowledge-base import (connector authors)

If your platform hosts a knowledge base, declare a <code>kb_capabilities</code> block in <code>settings.json</code> (type <code>kb_source</code>) and your connector appears in the Help Center editor's <strong>Import KB → Import from a connected app</strong> dropdown whenever it is enabled and configured in the workspace. It is declarative — no method to implement: name a built-in <code>adapter</code> (<code>zendesk</code> for the exact-tree Help Center API, or <code>crawl</code> for any KB site) and a <code>base_template</code> such as <code>https://{subdomain}.zendesk.com</code>, which OpsIQ fills from your connector's stored settings. Credentials never leave the server; the browser only sends the connector slug. To support a new platform, add an <code>opsiq_kb_<platform>_manifest()</code> adapter and reference it by name. Full reference: <code>connectors/PLATFORM_CONNECTORS.md</code> §5.

Webhooks

Some connectors register webhooks with the external platform for real-time event notifications (new orders, ticket updates, etc.).

Sales tracking

E-commerce connectors feed revenue data into the Sales dashboard for attribution and analytics.

💡
Connectors are workspace-scoped. Each workspace can have different connectors enabled with different credentials. A WHMCS workspace uses the WHMCS connector; a Shopify workspace uses the Shopify connector.
Can I use multiple connectors at once?+

Yes. You can have Shopify for orders and Stripe for payments in the same workspace. The AI merges data from all enabled connectors.

What if my platform is not listed?+

Use the Connector Builder to create a custom connector for any platform with a REST API. Or check the Marketplace for community-built connectors.

Do connectors work with self-hosted OpsIQ?+

Yes. Connectors work identically in both cloud and self-hosted editions.

Connectors

How AI actions work

Every connector declares a set of actions: things the AI can do through the external platform. Actions are the bridge between "the AI says" and "the AI does."

AI actions
How AI actions workA customer request mapped to a delete-type action card, then a checklist: permission checked, you confirm, API called.How AI actions workworkspace"Cancel my subscription"customerAIcancel_subscriptiondeleteconfirm requiredparams: subscription_id (from context)ACTION TYPESreadwritedeletePermission & role checkedYou confirm the actionAPI called · result reported1DECLAREDEach connector lists actions2GATEDPermission + confirm3THEN RUNAPI call, result back
A request becomes a declared action — typed read/write/delete — that is permission-checked, confirmed, then executed and reported.

The action lifecycle

1
Customer asks for something

"Cancel my subscription." The AI identifies this requires the "cancel_subscription" action.

2
AI checks permissions

Is this action allowed? Is it enabled? Does the current user have the right role?

3
AI gathers parameters

The action needs a subscription ID. The AI looks it up from the customer context or asks the customer.

4
Confirmation

For destructive or high-impact actions, the AI asks for confirmation before executing.

5
Execution

The action calls the external platform API.

6
Result

The AI reports the result to the customer.

Action types

Read actions

Look up data without changing anything. Examples: list_orders, get_customer. Safe, no confirmation needed.

Write actions

Create or modify data. Examples: create_ticket, update_order. May require confirmation.

Delete actions

Remove data. Examples: cancel_subscription. Always require confirmation.

HTTP actions

Declared in actions.json — generic API calls defined declaratively.

Capability tags

Optional per-action "capability" field in actions.json — a connector-neutral class tag (e.g. "tickets" for a ticket read/lookup, "ticket_create" for opening a ticket). OpsIQ gates the whole class uniformly across every connector: ticket reads drop out of the AI when the operator turns off AI Ticket Awareness, and ticket creation is reserved for OpsIQ's own composer (so a connector's create tool can't duplicate it). Declare it and your connector conforms — OpsIQ never needs to know your action names. The Connector Builder exposes it as a Capability dropdown per action.

Code actions

Implemented in PHP in the connector class. Full control over logic.

Example action definition
{
  "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" }
    }
  }
}
Connectors

Build a connector

The Connector Builder lets you create a complete connector for any platform with a REST API. No coding required for basic connectors.

Build a connector
Connector BuilderA no-code connector form: name, auth type, base URL, an action mapping, a passing test and a publish button.Connector BuilderworkspaceConnector BuilderNameMy PlatformAuthOAuth 2.0 (PKCE)Base URLhttps://api.example.com/v2ActionGET/customers → list_customersTest passedPackage connector1NO-CODEName, auth, base URL2ANY APIKey, Bearer, Basic, HMAC, OAuth3PUBLISHInto /connectors/<slug>/
Point the builder at any REST API — set auth, base URL and actions, test it, and publish a working connector. No code needed.

Connector Builder wizard

The wizard has six steps, shown as tabs across the top. You can jump between them freely, and Save draft in the footer keeps your work at any point.

1
Identity

Name, slug, one-line description and an icon. The slug becomes the folder name under /connectors/, so it is lowercase with no spaces. This step is also where you tick the capabilities you want — each one adds working code to your connector, so you configure it rather than write it. The full list is below.

2
Auth

Pick the authentication pattern the platform uses and fill in its fields. Enter real test credentials here as well: they are used for the connection test on the next step, and they are not stored after you publish.

3
Test

Enter the API base URL and a verify endpoint, then run a live connection test using the credentials from step 2. Do this before you define any actions — if the auth or the base URL is wrong, every action you write afterwards would fail for the same reason and you would be debugging the wrong thing.

4
Actions

Define each operation: name, HTTP method, endpoint path, parameters, response field mapping, and the reliability settings described below. You can run each action individually against the live API from this step.

5
Triggers

Map the webhook events your platform sends onto OpsIQ events, so things that happen on your platform can start work in OpsIQ.

6
Review and publish

A summary of every action, trigger and capability you configured, plus any warnings. It also states plainly which advanced abilities the wizard cannot generate for you, so there are no surprises. Publishing writes the connector into /connectors/<slug>/ and it appears in the Connectors hub like a built-in one. Afterwards you can run a dry-run check or submit it to the marketplace.

💡
The wizard does not have a knowledge-authoring step. A knowledge file describing your platform is generated for you from the name, description, auth type and actions you defined, and it is loaded into the AI when the connector is enabled.

Defining an action (step 4)

Every action has the following settings. Only the first four are required; the rest control who may run it and how carefully.

Action key and label

The key is what the AI calls; the label is what a human reads. Keys are namespaced with your connector slug automatically, so two connectors can both have a "list_orders" without colliding.

HTTP method

GET, POST, PUT, PATCH or DELETE.

URL path

Appended to the base URL. Use {name} for placeholders, for example /opportunities/{id}/stage

Parameters

For each parameter you also choose where it goes: <b>body</b>, <b>path</b>, <b>query</b> or <b>header</b>. A path parameter fills a {placeholder}; a query parameter is appended to the URL.

Response mapping

Say which field in the JSON response means what — which is the customer name, which is the email, which is the order total. This is what lets the AI read your platform's data rather than guess at it.

Who can use it

Your team (admin AI), signed-in customers (customer chat), both, or the writing assistant. Customer actions run only for the signed-in customer, and identity fields are locked to them automatically so one customer cannot ask about another.

Requires confirmation

A human must approve before the action runs.

Destructive

Marks the action as deleting or changing state. Used to warn before it runs.

Required permission

The admin must hold this permission for the AI to run the action on their behalf; full administrators always pass. Choose from manage_integrations, manage_general, manage_billing, manage_sales_bridge, manage_knowledge, manage_appearance, manage_behavior, manage_permissions, manage_dangerzone, reply_to_chats, escalate_to_ticket, send_agent_email — or none, meaning any authenticated admin.

Description / AI hint

Optional, but worth writing. It tells the AI when to reach for this action, for example "Use this when the admin asks to change a deal stage". A good hint is the difference between an action the AI uses correctly and one it ignores.

Capability

Optional class tag, either tickets (a ticket read or lookup) or ticket_create (opens a ticket). Tagging lets OpsIQ gate the whole class at once — for example, hiding ticket reads when an operator turns AI ticket awareness off.

List path

Optional. For endpoints that return a list, the dotted path to the array, for example data or data.items

Error path

Optional. A body field whose presence means the call failed, for example error.message — useful for APIs that return HTTP 200 on failure.

Run it

Each action can be run against the live API from this step, so you can fix a wrong path or field name before anyone else uses it.

⚠️
Write actions are protected by default. Any action using POST, PUT, PATCH or DELETE starts out requiring the manage_integrations permission <b>and</b> human confirmation before it runs. This is deliberate — a new write action fails closed rather than letting the AI change your data unsupervised. You can change both on the action, but change them knowingly.
💡
To be callable from customer chat, an action must be read-only: leave both Requires confirmation and Destructive unticked. An action a customer can trigger that also changes state is not something the wizard will let you ship by accident.

Receiving webhooks (step 5)

The Triggers step gives you a webhook URL to register with your platform, and verifies every request that arrives on it.

Signature header

The header your platform signs with, for example X-Hub-Signature-256.

Signature algorithm

HMAC-SHA1, HMAC-SHA256 or HMAC-SHA512.

Signature scheme

Simple — a plain hex or base64 digest. Or Stripe-style — the t=…,v1=… format used by Stripe and several platforms that copied it.

Signature prefix

Optional. Some platforms prefix the digest, for example sha256=. Leave it empty if yours does not.

Event mappings

Map each event your platform sends onto the OpsIQ event it should raise.

Auto-registering the webhook

If your platform has an API for managing its own webhooks, you do not have to register the URL by hand. Open Auto-register this webhook on enable and point it at two of the actions you defined in step 4:

Create-webhook action

Called when an admin enables the connector. You give the parameter name that carries the URL, optionally the one that carries the event list, and the path in the response that holds the new webhook's id.

Delete-webhook action

Called when the connector is disabled, using the id captured above, so disabling the connector also stops your platform sending to a dead endpoint.

Capabilities you can switch on

Tick a capability and the builder writes the code for it. You supply the endpoint and a field mapping; everything else is handled.

Actions

Operations the AI can run on your platform: list orders, find a customer, issue a refund.

Triggers

Receive webhooks from your platform and turn them into OpsIQ events.

AI tickets

AI Triage and the reply Copilot on tickets that stay on your platform. Pick the endpoint that returns one ticket with its replies and map the fields; OpsIQ reads the thread through it.

Mailbox and contacts

Show a customer's mail on their timeline, send from a deal, and sync your address book into the OpsIQ CRM.

Customer import

Page through your customer list and import each one as an OpsIQ contact. This is what the Import button runs.

Context

Push live data from your platform into every AI conversation.

Identity

Work out which of your customers a visitor is, and show their profile and purchases on a ticket.

Sales and billing

Feed revenue events and MRR figures into the OpsIQ dashboards.

Inbound tickets

Turn tickets and emails your platform delivers by webhook into OpsIQ support threads.

Outbound replies

Post OpsIQ staff replies back to the platform the thread originated on.

Sync users

Import your staff accounts into OpsIQ admin users.

Sync departments

Import your support departments into OpsIQ.

Promo targeting and product feed

Let Promotion Studio target on facts you know about a person, and render your real products inside a promotion.

Native IP blocking

When OpsIQ blocks an IP, call your platform's own block API so the block is enforced there too.

Security events

Receive blocked-IP threat signals from OpsIQ.

Platform knowledge for the AI

Every connector you build ships a short reference describing what your platform is and what its actions do. The OpsIQ admin AI reads it whenever your connector is enabled, so it understands your platform rather than just seeing a list of action names. This is generated for you.

API passthrough

Your connector always gets a general-purpose call so the AI can reach an endpoint you did not define a typed action for. Use typed actions where you can; this is the escape hatch.

⚠️
Everything the builder generates is real, working code in your connector folder. You can read it, and you can hand-edit it — but re-publishing from the wizard overwrites the file, so copy it out first if you want to keep changes.

Reliability settings on every action

Retries

How many times to retry a failed call, with a backoff that doubles each attempt. Only timeouts, 429s and 5xx errors are retried; a 4xx is your request's fault and repeating it would just burn your rate limit.

Rate limit

A per-minute ceiling for this action, so a busy trigger cannot hammer your platform. Leave it at 0 for no limit.

Timeout

How long to wait for your platform before giving up.

Confirmation

Require a human to approve before the action runs. Use it for anything destructive.

Authentication types

Step 2 offers seven patterns. Pick the one that matches your platform's API documentation — the generator emits the right HTTP client for it.

API key in header

A static key sent as a fixed header, for example X-API-Key. You give the header name and the label the admin form should show. This sends the key as a header only; if your API expects the key as a query parameter instead, use Custom headers or a full-code connector.

Bearer token

Token sent as Authorization: Bearer <token>. Common for modern APIs.

Basic auth

Username and password, base64-encoded into the Authorization header. You choose the labels both fields show on the admin form.

HMAC-signed

A public key plus a secret, with the request body signed. You give the signature header, the key header and the timestamp header your platform expects.

OAuth 2.0 (client credentials)

Server-to-server, with no user interaction and no redirect. You give the token URL and an optional scope; the admin supplies a client ID and secret. Use this when your platform issues credentials to an application rather than to a person.

OAuth 2.0 (Connect button)

The authorization-code flow with PKCE, for Stripe, Shopify, Slack and QuickBooks-style apps. You give the authorization URL, the token URL and the scope. After publishing, the admin clicks Connect on the connector, authorizes on your platform, and OpsIQ stores the refresh token and mints access tokens on demand. The redirect URI to register in your OAuth app is shown on the connector's settings page.

Custom headers

A free-form JSON header map for anything the patterns above do not cover, for example {"X-API-Key":"{api_key}","X-Tenant":"{tenant_id}"}. Each placeholder becomes a field on the admin form.

💡
PKCE applies to the Connect-button flow only. The client-credentials flow has no redirect and no user step, so PKCE does not apply to it.

Pagination styles

Offset

Uses offset and limit parameters. Example: ?offset=100&limit=50.

Page

Uses page number. Example: ?page=3&per_page=50.

Cursor

Uses a cursor token from the previous response.

Link header

Uses the Link response header with rel="next".

Advanced: custom PHP code

Custom connector PHP example
<?php
namespace OpsIQ\Connectors\MyPlatform;

use OpsIQ\Connectors\AbstractConnector;

class MyPlatformConnector extends AbstractConnector
{
    public function identifier(): string { return "myplatform"; }
    public function label(): string     { return "My Platform"; }

    public function testConnection(): array
    {
        $resp = $this->http("GET", "/me");
        return $resp["ok"]
            ? ["status" => "ok", "message" => "Connected"]
            : ["status" => "error", "message" => $resp["error"]];
    }

    protected function runAction(string $action, array $params): array
    {
        return match ($action) {
            "list_customers" => $this->http("GET", "/customers", [
                "query" => ["page" => $params["page"] ?? 1],
            ]),
            default => ["error" => "Unknown action: $action"],
        };
    }
}

Mirror tickets into the native ticket system

When your platform owns a ticket, mirror it into OpsIQ from your connector using the ticket ingest helper your connector inherits (create for a new ticket, add-reply for follow-ups). Emit and subscribe to the universal ticket events in your connector's subscribers() method — ticket.created, ticket.replied, ticket.updated, ticket.deleted. Auto-reply, escalation, SLA and CSAT all hook the same events, so you inherit them with no extra code.

Say who wrote the opening message

A ticket is always for the customer, but the opening message may be written by staff — an agent opening a ticket on the customer's behalf, or reaching out proactively. Every helpdesk supports this, so it is part of the universal ticket.created contract rather than something each connector solves privately.

author_type

client (default) or admin. Omit it and the customer is assumed.

author_id

The staff id when author_type=admin. Never the customer id.

author_name

Agent or department display name. Falls back to "Staff".

author_email

The agent address. NEVER the customer one — a staff message under the customer e-mail is a reporting and audit error.

This is not cosmetic. Consumers read author_type to decide whose turn it is. A staff-written opening reported as client leaves auto-reply eligible to answer a message your own agent wrote, and makes your platform's echo of that opening look like a fresh customer message — which then lands as a duplicate and flips the ticket to answered. Map your platform's signal onto it in your connector's event normaliser, never in the consumers.

Centralised blocking

When an agent blocks a sender, that applies across every channel immediately — e-mail, chat, portal, widget and every connector twin — because the block is enforced centrally, before any connector sees the message. Your connector inherits it by doing nothing. There is no inbound work to implement and no way to get it wrong.

The optional half is outbound: telling your platform a customer was blocked here. Implement it only if your platform can express something equivalent.

capabilities()

Must include block_registry AND the class must implement BlockRegistryInterface. The flag is a claim; the interface is the guarantee — the registry requires both.

blockSender($b)

Receives kind (email|domain|ip), value, reason, admin_id, expires_at, site_key. Returns [result, detail?, remote_ref?].

unblockSender($b)

Same payload, reversed. Must be idempotent — unblocking something never blocked is noop, not an error.

isSenderBlocked($b)

For reconciliation, so drift is reported rather than discovered by a customer. Returns [result, blocked?].

Result values

ok

Applied on your platform. Include remote_ref when you have an id worth recording.

noop

Already in the requested state.

unsupported

Your platform has no equivalent concept. NOT an error.

failed

You could have done it and it went wrong. Include detail; it lands in the audit trail.

Declining is a correct answer. Many platforms have no "block this sender" concept and offer only ACCOUNT suspension, which stops billing, logins and services rather than just support mail. Mapping "an agent blocked a spam address" onto "close this client's account" would let one mis-clicked block terminate a paying customer's services. If that is the only lever you have, return unsupported and leave it alone.

Declining also covers the case where the platform can do it but will not let you. Check for an API, not a feature: a lever that exists only in the platform's admin UI is a lever your connector does not have.

Worked example — Zendesk (the reference implementation)

Read connectors/zendesk/connector.php alongside this. It is short, and every branch below is a decision you will face too.

email → ok

PUT /api/v2/users/{id} with suspended=true. A suspended end user's new requests divert to Suspended Tickets instead of opening one — genuinely the same idea as blocking a sender, and it stops no billing because Zendesk end users have none. Returns the user id as remote_ref.

domain → unsupported

Zendesk CAN suspend a whole domain, but only through the suspend: keyword in the Admin Center blocklist textarea, and no API writes that field. The feature exists; the lever does not.

ip → unsupported

No ticket-level IP block exists.

unknown address → noop

Zendesk cannot pre-suspend an address it has never seen. Nothing to do is not a failure, and the local block still stops the ticket.

agent or admin → unsupported

REFUSED. Suspending staff would lock a colleague out of the helpdesk. A staff address reaching a blocklist is far more likely to be a mistake than an instruction — check the role before you act on it.

That last row is the one worth copying. The contract cannot stop you mapping a block onto something destructive, so each connector has to decide for itself what it will refuse. Refusing loudly, with a detail an operator can read, beats obeying.

Report honestly. Notice how few of those rows are ok. That is the correct outcome, not a gap: a domain block still works — it is enforced in core the moment it is written — it simply cannot be mirrored outward. Returning ok for something you did not do would tell an operator the block reached your platform when it never left OpsIQ.

Rules

The local block always wins

It is written BEFORE you are called and stands whatever you return. You cannot prevent an operator blocking someone.

Never throw

A throw is treated as unsupported and recorded. Return failed with a detail instead so the reason survives.

Be idempotent

The same block may be announced more than once.

Return quickly

Fan-out is synchronous with the operator click. Queue slow work rather than holding the request open.

Do not call back in

Never re-block into OpsIQ from your handler. The registry skips the originating connector, but a second hop would loop.

Every announcement is written to opsiq_block_registry_log — operation, kind, value, reason, admin, origin, connector slug, result, detail and timestamp — so an operator can see a block arrived from your platform rather than from an agent, and what each connector did about it.

Push attachments correctly

Hand an attachments array to create()/addReply(). Each item carries the file in one of three shapes:

content_b64

Base64 of the RAW file bytes — use for files behind auth (most inbound cases). OpsIQ decodes it and re-hosts the file for you. The most portable shape.

url / source_url

A public https URL (e.g. a Zendesk content_url). Must be https; passes an SSRF / allowlist check before it is stored.

stored_path

A stored file reference you already wrote (what the native composer uploader produces).

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 filenames only (not bytes), so the reliable inbound pattern is: read the bytes where your code already runs — inside the platform, or from the webhook payload — base64 them, and ship them as content_b64 on the event.

Outbound (OpsIQ → your platform). When an agent attaches a file, the ticket.replied payload gives you the reply's files as stored_path items under the OpsIQ file store. Read them and push in your platform's own format — and check the platform docs, the encoding matters: WHMCS wants base64_encode(json_encode([[name,data]])) (JSON, not serialize); Zendesk uploads raw bytes to /uploads.json for a token then sets comment.uploads; Gmail sends a multipart/mixed RFC-822 message base64url-encoded in raw; Amazon SES inbound attachments need the S3 receive action (the SNS path caps at 150 KB).

Remote platforms: API + webhook, never another app's tables

If your platform is a separate app or database (a hosted SaaS, a remote WHMCS, a different DB on the same server), never write its tables directly — a cross-database write lands on whatever connection is active and silently misses the real rows. Always: outbound = call the platform's signed REST API (replies, status, department, deletes); inbound = the platform POSTs a signed webhook, your handleWebhook() verifies it and fires the matching ticket.* event. To stop a mirror loop, tag what you push with an origin marker (e.g. mirror_origin:'opsiq'); the platform echoes it on the webhook and your inbound handler skips its own echoes. Check OpsIQEvents::isMirroredEvent() at the top of every handler.

Mirror status, priority & department

A reply moves status automatically — an agent reply → answered, a customer reply → customer_reply; mirror that the same way. For explicit changes subscribe to ticket.updated and read payload['changes'] (e.g. {status:'closed'}).

Status: OpsIQ's canonical set is open, customer_reply, answered, in_progress, pending, closed. Keep a small two-way map to your platform's vocabulary, and make sure your column actually accepts the values you write (an ENUM missing a value gets silently dropped to empty by some databases). Department: the OpsIQ department id is meaningless on your side — never send it. Send the descriptor (name, email and slug) and resolve it against your own departments by e-mail → name → slug, so “Billing Department” lands in your Billing department instead of general. Trigger on both ticket.escalated and a department_id change in ticket.updated.

💡
Status / priority / subject / department / delete mirroring is gated by per-connector toggles (mirror_status_changes, mirror_priority_changes, mirror_subject_changes, mirror_department_changes, mirror_deletes) read through the shared OpsIQ\Connectors\MirrorOptions helper. Embed that block in your settings.json and every ticket-mirror connector reads the toggles identically.

Link a ticket to a product / service

If the customer chose a specific product when opening the ticket, stamp a hint so the agent sees a focused service card (with a one-click "view other products" modal for the rest). Pass any of these to create():

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

A platform service-code, e.g. WHMCS S396 (service 396) / D11 (domain 11). OpsIQ decomposes the optional type-letter + id and matches your service list, with a type guard so a domain code never matches a product of the same id. Expose a matching ref on each service for an exact match.

related_domain

A domain name; matched as a substring against each service's detail / domain.

💡
Build the attachment list once, in the shape above, and OpsIQ handles the rest: hosted URLs are passed through and base64 content is stored and re-hosted for you. You never need to write per-platform file handling.
⚠️
Action keys must be 3-80 characters, lowercase, letters/numbers/underscores. After adding new AJAX routes, run php tools/gen_route_registry.php.
Connectors

Connector package and lifecycle reference

This is the source-level contract for building a connector that OpsIQ can discover, configure, validate, enable, execute, test, sign and distribute.

Developer reference
Connector packageA connector package has a required connector implementation and manifest, with optional actions, recipes, knowledge, assets and signature metadata.Connector packagedeveloperMANIFESTv1LIFECYCLEManagedWORKSPACEScopedLIVE WORKSPACE VIEWconnector.phpConnector class / factoryRequiredsettings.jsonManifest and settings schemaRequiredactions.jsonAction definitionsOptionalsignature.jsonPackage signature metadataRelease1DECLAREManifest and capabilities2IMPLEMENTLifecycle and providers3VALIDATETest, sign, package
A connector package has a required connector implementation and manifest, with optional actions, recipes, knowledge, assets and signature metadata.

Minimum package

connectors/example_platform/
├── connector.php          # connector implementation / entry point
├── settings.json          # manifest + configuration schema
├── actions.json           # optional action catalogue
├── README.md              # setup, scopes, webhooks and limits
├── workflow_recipes.json  # optional reusable recipes
├── knowledge.json         # optional provider knowledge
├── profile.json           # optional connector profile
├── src/                   # optional client/provider classes
├── assets/                # optional admin assets
└── signature.json         # signed release metadata

Manifest contract

settings.json uses manifest version 1. The validator expects a slug, name, version, manifest_version, compatibility, description and capabilities. Compatibility declares opsiq_min and opsiq_max. Release status is one of production, beta, preview or template; capability maturity uses levels L1–L6. Legacy packages can be normalised with warnings, but a new package should pass without warnings.

Core connector interface

  • Identity and setup: slug(), name(), description(), capabilities(), settingsSchema(), testConnection().
  • Lifecycle: onEnable() and onDisable(). Disable must be non-destructive; data purge is a separate deliberate operation.
  • Inbound/sync: handleWebhook(), poll(), backfill(). Poll handles incremental work; backfill imports history and must be safe to repeat.
  • Support: pushReply() where the platform accepts replies.
  • Actions: registerActions() supplies executable action contracts.
  • Security: securityCapabilities(), syncBlockedIp(), removeBlockedIp(), testSecuritySync().

The abstract base also offers optional chunked backfill, customer listing, email-account discovery/creation, subscribers, admin/customer detection, billing/context/identity providers, response extraction, retrying HTTP calls, JSON-path access, fuzzy ranking and pagination helpers.

Capabilities and authentication

Supported capability names include actions, triggers, context, identity, sales, billing, inbound_ticket, outbound_reply, sync_users, sync_departments, security_events, customer_import, security_native_block, promo_audience, promo_feed, email_mailbox, native_api, ai_brain_aware and ai_tickets. The builder provides API key, bearer, basic, HMAC, OAuth 2 client credentials, OAuth 2 authorisation code and custom authentication templates.

Registry lifecycle

  1. Discovery loads the package and validates its manifest.
  2. Configuration is stored per workspace; secrets are encrypted.
  3. Connection test proves credentials without enabling the connector.
  4. Enable calls onEnable(), synchronises action definitions and can start the initial backfill.
  5. Polling/webhook/subscriber execution always carries workspace context.
  6. Disable calls onDisable() and stops activity without deleting imported data.
  7. Purge is a separate explicit operation.

Correctness rules

  • Use the workspace/site key in every read, write, cache key, deduplication key and webhook lookup.
  • Make backfill, webhook ingestion and write actions idempotent. Record an external ID/event ID wherever the platform provides one.
  • For remote systems, use their API; never assume their database tables exist in the OpsIQ connection.
  • Return structured, customer-safe errors. Never expose secrets, raw provider traces or another workspace’s existence.
  • Declare only capabilities the package actually implements. An actions.json catalogue does not make an action usable until the connector is installed, enabled, configured and its connection is valid.

Testing and release

Run PHP lint, manifest validation, connection tests, action schema tests, webhook signature/replay tests, workspace-isolation tests, backfill-repeat tests, disabled-connector tests and failure/retry tests. A marketplace package should then be signed and verified, include setup/permissions/webhook documentation, and state its true release status. The connector tile and manifest are the authoritative availability signal.

Connectors

Connector recipes

Step-by-step recipes for common connector setups.

Recipes
Connector recipeA Shopify setup recipe as a checklist: create app, grant scopes, paste token and test, enable webhooks, place a test order.Connector recipeShopifyRecipe · Shopify with webhooksCreate a custom app in Shopify adminGrant scopes: read_orders, read_customers…Paste store domain + token, click TestEnable Webhook sync (orders auto-register)Place a test order → appears in Sales in 30s1STEP BY STEPCopy-paste recipes2REAL PLATFORMSShopify · WHMCS · Stripe · GBP3VERIFYTest order shows in 30s
Each recipe is a checklist you follow top to bottom — here, Shopify with real-time order webhooks, verified by a test order.

Recipe: Shopify with real-time webhooks

Scenario:
Goal: Connect Shopify with automatic order sync and GDPR compliance.
What to do:

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.

Recipe: WHMCS integration

Scenario:
Goal: Connect WHMCS so AI can look up clients, services, tickets, and invoices.
What to do:

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.

Recipe: Stripe payments

Scenario:
Goal: Track Stripe payments and let AI look up transactions.
What to do:

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: https://your-domain.com/connectors.php?slug=stripe 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.

Recipe: Google Business Profile

Scenario:
Goal: Connect GBP for review management, posts, and insights.
What to do:

1. Create a Google Cloud project, enable Business Profile API. 2. Create OAuth 2.0 credentials (Web application). 3. Set redirect URI: https://your-domain.com/connectors.php?slug=google_business_profile 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.

Connectors

Extend the CRM & Site Intelligence

OpsIQ subsystems are open for extension. A connector can plug a new capability into the CRM or Site Intelligence with no changes to OpsIQ core, via the platform capability registry (\OpsIQ\Platform\CapabilityRegistry). Declare the capability, implement its small method set, ship the connector — OpsIQ discovers it and wires it into the UI, the Customer 360 timeline and the install prompts.

Extend CRM & SI
Platform capabilitiesA connector on the left feeding capability buses — CRM, Site Intelligence, Analytics — discovered by the CapabilityRegistry.Platform capabilitiesworkspaceYour connectordeclares capabilitiesCRMcalendar · enrichment · esign · payments · mailboxSite Intelligencelocal_listing · rank_dataAnalyticsweb_analytics — report & ingestCapabilityRegistrydiscovers it & wires the UI + timeline1DECLARECapabilities, not core edits2PLUG INCRM · SI · Analytics buses3AUTO-WIREDUI, timeline, prompts
A connector declares capabilities (calendar, enrichment, rank data, analytics…) and OpsIQ auto-wires them into CRM and Site Intelligence — no core changes.

Declare capabilities

Declarative (settings.json)

Add a <code><domain>_capabilities</code> array — best for no-code/marketplace connectors. Domains: <code>crm</code>, <code>site_intelligence</code>.

In code (connector.php)

Implement <code>crmCapabilities()</code> / <code>siCapabilities()</code> returning the same descriptors.

Declare a CRM calendar provider (settings.json)

Scenario:
Goal: make a calendar connector appear in the CRM Schedule-meeting panel.
What to do:

"crm_capabilities": [ { "type": "calendar", "label": "Calendar (Acme)", "actions": ["createEvent","listEvents","freeBusy"], "requires_auth": true } ]

Declare a Site Intelligence provider (settings.json)

Scenario:
Goal: feed local-listing data into Site Intelligence.
What to do:

"site_intelligence_capabilities": [ { "type": "local_listing", "actions": ["listLocations","listReviews","getInsights"], "requires_auth": true } ]

Capability buses and their method surface

crm / calendar

<code>createEvent($settings,$params)</code> → {success,event_id,html_link,meet_link}; <code>listEvents</code>; <code>freeBusy</code>. Driven by \OpsIQ\CRM\CalendarBridge.

crm / enrichment

<code>enrich($settings,$params)</code> → {success,traits}. Driven by \OpsIQ\CRM\EnrichmentBridge (also runs automatically on company create when a provider is connected).

crm / esign

<code>sendForSignature($settings,$params)</code> → {success,envelope_id,sign_url}. Driven by \OpsIQ\CRM\EsignBridge.

site_intelligence / local_listing

<code>listLocations</code>, <code>listReviews</code>, <code>getInsights</code>. Ships via the Google Business Profile connector.

site_intelligence / rank_data

<code>keywordRanks($settings,$params)</code> → {success,ranks}. Driven by \OpsIQ\SiteIntelligence\RankDataBridge. Ships: SerpApi connector.

analytics / web_analytics

<code>report($settings,$params)</code> (sync/export) + <code>ingest($settings,$events)</code> (import). Driven by \OpsIQ\Analytics\WebAnalyticsBridge. Ships: Google Analytics (GA4) connector — Data API for reports, Measurement Protocol for import. Analytics is open for connectors like CRM + Site Intelligence (domain <code>analytics</code> / <code>analytics_capabilities</code>).

payments / payment_provider

<code>listPayments</code>, <code>customerPayments</code>, <code>createPaymentLink</code>. Driven by \OpsIQ\Payments\PaymentsBridge — show a customer's payments on the CRM timeline + send a payment link on a deal. Ships: Stripe Payments connector. Domain <code>payments</code> / <code>payments_capabilities</code>.

mailbox / email_sync

<code>listMessages</code> + <code>sendMessage</code>. Driven by \OpsIQ\Mailbox\MailboxBridge — a customer's emails on the Customer 360 timeline + send email from a deal. Ships: Gmail + Outlook/Microsoft 365 connectors. Domain <code>mailbox</code> / <code>mailbox_capabilities</code>.

Shared OAuth app + ONE redirect

All Google connectors share ONE app via \OpsIQ\OAuth\SharedGoogleApp — set <code>google_oauth_client_id</code>/<code>_secret</code> once and Calendar, Analytics, Business Profile + Gmail all work (the per-connector "(optional)" fields are overrides). They also share ONE redirect URI — <code><site>/connectors.php?oauth=callback</code> (no per-connector slug) — because Google exposes no API to add redirect URIs to an app; OpsIQ recovers the connector from the signed OAuth <code>state</code> nonce. Register that single URI once and every Google connector (present + future) authorizes with no further Console setup. Return <code>SharedGoogleApp::resolve(...)</code>’s <code>redirect_uri</code> from your <code>oauthParams()</code>; never hard-code a per-slug redirect. Microsoft connectors do the same via \OpsIQ\OAuth\SharedMicrosoftApp (<code>microsoft_oauth_*</code>).

Import buttons are capability-gated

The <strong>Import</strong> (historical backfill) and <strong>Import customers</strong> buttons show ONLY for connectors that actually implement them — detected by reflection, so there is no flag to declare. Override <code>backfill()</code> or <code>backfillChunk()</code> to earn the Import button; override <code>listCustomers()</code> (return {email, first_name, …} pages) to earn Import customers. Inherit the <code>AbstractConnector</code> no-op and the button stays hidden, so the UI never offers an import a connector cannot perform.

AI across buses

The CRM agent proposes and books meetings off deal signals (\OpsIQ\CRM\MeetingProposer → CalendarBridge), and auto-enriches new accounts — the “AI operates the CRM” loop, executed across connector buses.

Client-chat ticket lookup (fetchTicket())

Two-tier, no core changes

When a visitor references a ticket number in the client chat ("what's the status of T-000123?"), OpsIQ resolves it in two tiers. <strong>Tier 1</strong> reads the shared OpsIQ ticket store — every connector with <code>inbound_ticket</code> mirrors its tickets there, so synced tickets just work for ALL connectors with zero per-connector code. <strong>Tier 2</strong> is a live fallback for OLD tickets that were never mirrored: core calls an OPTIONAL <code>fetchTicket()</code> on each enabled connector that implements it. It is <strong>duck-typed</strong> (discovered by <code>method_exists()</code>, like <code>contextProviders()</code>/<code>audienceCatalog()</code>), so the signed <code>ConnectorInterface</code> is untouched and connectors that don't need it (email/chat sources that create tickets natively) simply omit it.

⚠️
Ownership is mandatory and yours to enforce. <code>fetchTicket()</code> receives the VERIFIED visitor identity in <code>$ctx</code> (<code>client_id</code> + <code>client_email</code> — the same verified identity the client chat AI uses). Resolve the platform customer from that identity and query ONLY that customer's tickets, then re-check ownership on the detail record. Return <code>null</code> on any miss, mismatch, or error — never another customer's data. A return of <code>null</code> degrades gracefully to "couldn't find that ticket".
connector.php — the fetchTicket() contract (reference: connectors/whmcs and connectors/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
    }
}

How the platform uses it

Discovery

<code>CapabilityRegistry::providers($domain,$type)</code> lists providers with installed/enabled/ready status (filesystem-based; DB only for the enabled flag).

Selection

<code>CapabilityRegistry::active($domain,$type)</code> returns the first ready provider with its loaded connector and settings — bridges call this instead of hardcoding slugs.

Notify-to-install

Where a feature needs a capability that is not connected yet, the UI shows a one-click Connect/Install prompt — never a dead control.

Full guide

See <code>connectors/PLATFORM_CONNECTORS.md</code> (CRM + Site Intelligence) and <code>connectors/CRM_CONNECTORS.md</code> in the package.

Connectors

Customer self-service lookups & refunds (build your connector for customer chat)

Signed-in customers can ask the customer chat AI about their OWN account — "my balance", "my orders", "did support answer my ticket" — and, if the business enables it, request refunds. All of it is powered by YOUR connector's declarations: no OpsIQ core changes, no platform hardcoding. The AI calls your lookups as native tools (it cannot invent one), identity is locked server-side to the verified customer, and results are automatically trimmed for the AI.

Declare a customer lookup

In your <code>actions.json</code>, a read-only action becomes customer-callable with ALL THREE: <code>"scope":"client"</code>, <code>"requires_confirmation":false</code>, <code>"is_destructive":false</code>. ⚠️ The value <code>customer</code> is NOT valid for scope — use <code>client</code> or <code>both</code>.

The identity rule (mandatory)

Name your identity parameter from the standard set — <code>client_id</code>, <code>customer_id</code>, <code>client_identifier</code>, <code>customer_identifier</code>, <code>account_id</code>, <code>email</code>, <code>customer_email</code>. OpsIQ locks and auto-fills it from the platform-verified signed-in customer; the AI never sees or chooses identity. A non-standard name fails closed (denied, never leaked).

What must stay admin-only

Anything not scoped by that identity: fetch-by-bare-id (<code>order_id</code>/<code>ticket_id</code> alone), store-wide lists, free-text searches. Those are cross-customer leaks on any platform — keep them <code>"scope":"admin"</code>.

Refunds — what your connector provides

Two raw operations, policy-free: (1) a payment-verification read filterable by identity AND a transaction reference (your API must AND the filters), e.g. <code>whmcs_get_transactions</code>; (2) a refund execute action (<code>scope:"admin"</code>, <code>requires_confirmation:true</code>, <code>is_destructive:true</code> — never customer-exposed), e.g. <code>whmcs_refund_order</code>. The business picks both keys in Settings → Client Chat; OpsIQ re-verifies the payment server-side, applies the business's policy box (amount cap, age window, monthly limit), issues inside the box, and files a review ticket for everything else.

No-code builder

The Connector Builder's action editor has the same controls: set "Who can use it" to Signed-in customers, leave both write checkboxes off, and use a standard identity parameter name.

Reference implementations

The "Customer Self-Service" entries in <code>connectors/whmcs/actions.json</code>, <code>woocommerce/actions.json</code>, <code>oscommerce/actions.json</code>; full contract in <code>connectors/README.md</code> §8.1–8.2 and <code>ConnectorInterface::registerActions()</code>.

Connectors

Promotion audience targeting (promo_audience)

Let the Promotion Studio target campaigns by LIVE client and billing state from YOUR platform — "has an unpaid invoice", "order pending", "subscription cancelled". Any connector (pre-installed, marketplace, or one you build yourself) joins by implementing two small methods. No OpsIQ core changes, no platform hardcoding: your connector appears as a platform in the studio Targeting tab with its own dropdown of facts, and several connectors can be enabled side by side.

Promo audience
Promotion audience targetingA verified identity passed to a connector audienceFlags call producing facts that drive a targeting rule, with a fail-closed note.Promotion audience targetingworkspaceLogged-inverified identityaudienceFlags()your connectorFACTSunpaid_invoices = 2RULEunpaid_invoices ≥ 1Campaign showsFails closed: unknown client or any error → the campaign stays hidden.1TWO METHODSaudienceCatalog + Flags2LIVE STATEUnpaid, pending, status3FAIL-SAFENever shows to wrong person
Your connector answers live billing facts for the logged-in visitor; the studio targets on them — and fails closed so a billing offer never reaches the wrong person.

How it works

1
Declare your facts

Implement audienceCatalog() on your connector class. It returns a label and the list of keys your platform can answer. Each key shows up in the studio dropdown under your platform name.

2
Answer for one client

Implement audienceFlags(array $identity). OpsIQ calls it at delivery time with the VERIFIED logged-in visitor identity (from the widget identity token — the same identity the client chat AI uses). Return a flat key => value map.

3
Done

Enable the connector. The Promotion Studio Targeting tab grows a "Client & billing" section listing your platform; admins build rules like "unpaid_invoices >= 1"; every fact also becomes a personalization variable such as {unpaid_invoices}.

connector.php — the complete promo_audience contract
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'],
    ];
}

Contract rules

Advertise the capability

Add <code>'promo_audience'</code> to your connector's <code>capabilities()</code> array so the platform and marketplace list it as audience-capable (discovery also works from method presence, but declaring it is the clean signal). The pre-installed <code>connectors/whmcs</code> connector is the full reference implementation.

Key naming

Lowercase snake_case, 2-60 chars, matching ^[a-z0-9_]+$. Types: number, text, bool. Undeclared keys returned by audienceFlags() are still usable in rules, but declare everything you support so admins can see it.

Identity is verified

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.

Fail closed — always

On ANY error (API down, client not found, timeout) return []. A rule whose fact is missing makes the campaign NOT show. A billing-targeted popup must never reach the wrong person; OpsIQ enforces this in the rule matcher too.

Performance

audienceFlags() is called at most once per connector per page view, and ONLY when a published campaign actually uses your platform's rules. Anonymous visitors cost you zero calls. Keep it to 1-2 API calls; OpsIQ memoizes within the request.

Operators provided for free

Admins combine your keys with =, !=, >, >=, <, <=, contains, is set, is empty — you only supply values.

Personalization tokens

Every fact doubles as a variable in campaign copy: {unpaid_invoices}, {client_status}, plus the built-ins {first_name} and {client_email}. Values are sanitized before rendering.

No-code marketplace connectors

Automatic facts

Declarative (JSON-only) marketplace connectors get promo_audience for FREE: if your connector declares customers/users, invoices, orders or subscriptions resources, OpsIQ derives customer_status, unpaid_invoices, amount_due, pending_orders, active_subscriptions and subscription_status from your existing search actions. No code at all.

Custom catalog (settings.json)

Add an audience_capabilities object — {"label": "My Platform", "keys": [{"key": "open_carts", "label": "Open carts", "type": "number"}]} — to control exactly which facts (and labels) appear in the studio dropdown.

Testing your provider

1
Enable the connector

Connectors > your connector > Enable. Then open any campaign's Targeting tab — your platform must appear under "Client & billing (connectors)".

2
Build a rule

Add: Your platform · a key · >= · 1 and set "Logged-in clients only". Save and publish.

3
Verify both directions

Log in to your platform as a client who matches the rule (popup must show) and as one who does not (popup must stay hidden). Logged-out visitors never match logged-in rules.

Fire a campaign from your own code (custom trigger)

Why

Beyond the built-in triggers (delay, scroll, exit-intent, idle, click, pages-viewed, chat / ticket activity), you can fire a campaign from anywhere in your site or connector front-end — after a successful checkout step, when a cart is abandoned, when your SPA changes route, etc.

How

Set the campaign trigger to <strong>Custom</strong> with an event name (e.g. <code>checkout_failed</code>), then call the global hook from your page:

your site / connector front-end JS
// Any campaign whose Custom trigger event matches will be evaluated
// (it still respects targeting, frequency caps and audience rules).
window.OpsIQPromo && window.OpsIQPromo.fire('checkout_failed');
💡
Firing an event never bypasses targeting or frequency — it only releases the “when”. The campaign still has to pass every rule (geo, audience, consent, caps) before it shows.
The full how-to-use guide (designing, blocks, analytics, A/B, publishing) lives in the in-app Help Center under <strong>Engage → Promotion Studio</strong>. The capability here is discovered automatically from any ENABLED connector in connectors/ or marketplace_connectors/ — there is nothing to register. Ship the two methods, and the studio does the rest.
Connectors

Connector marketplace

The Marketplace lets you discover, install, and publish connectors built by the community.

Marketplace
Connector marketplaceA searchable grid of community connector cards with categories, install buttons and star ratings.Connector marketplaceworkspaceSearch connectors…CalendlySchedulingInstall★ 4.8HubSpotCRMInstall★ 4.6MailchimpEmailInstall★ 4.7QuickBooksAccountingInstall★ 4.5TwilioSMSInstall★ 4.9NotionDocsInstall★ 4.41DISCOVERCommunity connectors2INSTALLOne click3PUBLISHSign & submit yours
Browse community connectors, install in one click, or sign and publish your own — pre-installed and marketplace tiers both searchable.

Finding and installing connectors

1
Browse

Go to Connectors > Marketplace. Search by name, category, or platform.

2
Review

Check the description, supported actions, and ratings.

3
Install

Click Install. The connector package downloads and installs to marketplace_connectors/.

4
Configure

Enable it in Connectors, enter API credentials, and test.

Publishing a connector

1
Build and test

Use the Connector Builder. Verify all actions work.

2
Package

Generate profile.json, actions.json, knowledge.json, and PHP files.

3
Sign

Run php tools/resign_all_connectors.php to sign the package.

4
Submit

Upload through the marketplace submission flow for review.

Two connector tiers

Pre-installed (connectors/)

Ship with OpsIQ. Maintained by the OpsIQ team.

Marketplace (marketplace_connectors/)

Installed from marketplace. Can be declarative or custom PHP.

💡
Always check BOTH directories when looking for a connector. Stripe is pre-installed — searching only marketplace would miss it.
Developer

API and webhook builder

The API and Webhook Builder lets you create custom API endpoints and webhook listeners inside OpsIQ without writing raw PHP.

API builder
API and webhook builderA builder choosing a trigger type (inbound webhook, schedule, event, manual) that feeds into a configurable action.API & webhook builderworkspaceTRIGGERInbound webhookSchedule (cron)OpsIQ eventManualActionMap incoming fields →create ticket / notify / call APISave endpoint1TRIGGERSWebhook · schedule · event · manual2NO RAW PHPBuilt in the UI3ACTIONMap fields, then run
Build endpoints without raw PHP: pick a trigger — inbound webhook, schedule, event or manual — then map fields to an action.

Triggers

Event

Run when something happens in OpsIQ, or when an external system posts a matching event to your webhook URL. Type the event name, for example ticket.created.

Schedule

Use one of the built-in interval events as the event name: cron.minutely, cron.hourly or cron.daily. The Actions and Triggers screen has buttons for these, so you do not have to remember them.

Phrase

Run when an admin asks the AI for it in plain language. Add the phrase that should match, for example find customer.

Inbound webhook

An external system sends an HTTP POST to your OpsIQ webhook URL with an event name. Any trigger listening for that event fires.

Only run it sometimes: conditions

An event trigger can carry conditions, so it only runs when the incoming data matches. Without conditions it runs every time the event fires.

Field

A path into the event data. Use a dot for nested values, for example customer.email.

Match all or any

Choose whether every rule must match, or just one of them.

Text tests

equals, does not equal, contains, does not contain, starts with, is one of, is not one of. Matching ignores capitals.

Number tests

greater than, at least, less than, at most. Numbers written as text still compare correctly.

Presence tests

is present, is missing, is empty, is not empty.

Only page the on-call engineer for urgent tickets

Scenario:
Event ticket.created, with one rule: priority equals urgent.
What to do:

The action runs for urgent tickets and is skipped for everything else. No filtering needed at your end.

💡
If you leave the rules blank the trigger runs on every matching event, which is the same behaviour as before conditions existed.

Actions

Send webhook

Send HTTP POST to an external URL with a custom payload.

Create ticket

Create a support ticket with specified department, subject, and message.

Send email

Send an email with a custom template.

Update record

Update a customer, ticket, or CRM record.

Run connector action

Execute a connector action.

Developer

Triggers cookbook

Ready-to-use trigger-action recipes for common automations.

How it works
Triggers cookbookA recipe flow: an uptime.down webhook passes a production filter, then fans out to create an urgent ticket and notify Slack.uptime.downmonitor webhookif prodfilterCreate urgent ticketNotify Slack #ops
Triggers cookbook

Auto-create ticket from monitoring

Scenario:
Monitoring system sends POST when server goes down.
What to do:

Trigger: Inbound webhook Condition: payload.status = "down" Action: Create ticket — Dept: Technical, Subject: "Server {{payload.hostname}} down", Priority: Urgent

Slack notification on big orders

Scenario:
Slack message every time a customer places an order over $100.
What to do:

Trigger: Event (order.completed) Condition: order.amount > 100 Action: Send webhook to Slack incoming webhook URL with order details

Weekly digest email

Scenario:
Summary email to management every Monday at 9am.
What to do:

Trigger: Schedule (Monday 09:00) Action: Send email with last week's stats pulled from the REST API

Escalate stale tickets

Scenario:
If a ticket has no reply for 24 hours, assign to team lead.
What to do:

Trigger: Schedule (every hour) Condition: ticket.status = "Open" AND ticket.last_reply_age > 86400 Action: Assign to team-lead, add internal note

Developer

Building your first action

This walkthrough creates a simple connector action from scratch.

Building actions
Building an actionAn action-definition form: name lookup_order, a GET request to /orders/{id}, a typed id parameter, and a passing 200 test.New actionworkspaceNew actionNamelookup_orderRequestGET/orders/{id}Paramsid · string200 · order found1DEFINEName, method, endpoint2PARAMSTyped inputs3TESTLive 200 result
Build one action from scratch — name it, set the method and endpoint, declare typed params, and test it to a live 200.

Two kinds of action

Before you start, decide which one you need. Both are configured in the same screen.

Call an external API

The action sends an HTTP request to your platform. Choose this when OpsIQ needs to reach out and do something on your side.

Run a connector action

The action runs something an installed connector already provides. Choose this when the work is already available and you just want to trigger it. You pick the connector action from a list, so there is nothing to wire up.

The second option is how you reuse everything your connectors can already do without building any of it again: read a ticket thread, look up a customer, import contacts, and so on. Pick the connector action from the dropdown and you are done.
1
Plan the action

Example: "lookup_product" — look up a product by name, return price, stock, and description.

2
Define in actions.json

Add the action definition:

actions.json — lookup_product
{
  "lookup_product": {
    "label": "Look up a product",
    "description": "Find a product by name",
    "method": "GET",
    "endpoint": "/api/products/search",
    "params": {
      "name": { "type": "string", "label": "Product name", "required": true }
    },
    "response_mapping": {
      "id": "$.data.id",
      "name": "$.data.name",
      "price": "$.data.price",
      "stock": "$.data.stock_quantity"
    }
  }
}
3
Test with dry-run

In connector settings, use dry-run to test with sample data.

4
Verify AI usage

Ask admin AI: "Look up product Widget Pro." The AI should find and execute the action.

⚠️
After adding actions, regenerate the route registry: php tools/gen_route_registry.php
Developer

Inbound event endpoints

Inbound endpoints accept signed JSON from another system and turn it into deduplicated contact activity that can feed timelines, scoring and workflows.

Product screen
Inbound endpointsEach inbound source has its own URL, secret, mapping and recent activity result.Inbound endpointsworkspaceSOURCES5ACCEPTED12.4kREJECTED18LIVE WORKSPACE VIEWBilling platformsubscription eventsHealthyProduct appsignup and usage eventsHealthyEvent IDprovider_event_idDedupeSignatureX-OpsIQ-Inbound-SignatureHMAC1CREATE SOURCEURL and secret2MAP PAYLOADEmail, event and ID3VERIFYHMAC then ingest
Each inbound source has its own URL, secret, mapping and recent activity result.

Create one source per sending system. OpsIQ generates a URL/token and secret. Send JSON with Content-Type: application/json and sign the exact raw body using HMAC-SHA256:

X-OpsIQ-Inbound-Signature: sha256=<hex hmac>

Map JSON paths for the contact email, event name and optional event ID. The event ID is the preferred deduplication key. Accepted activity enters the contact timeline and can affect lead scoring, segments, lifecycle rules and workflows.

Reject invalid signatures before parsing business data. Rotate a secret by updating both sides inside a controlled window; do not log the secret.

Developer

Outbound webhook operations

Outbound webhook administration creates signed subscriptions, tests endpoints and monitors asynchronous delivery and retry health.

Product screen
Outbound webhooksThe outbound webhook page lists HTTPS endpoints, event subscriptions, delivery health and a one-click signed test.Outbound webhooksworkspaceENDPOINTS7SUCCESS99.2%RETRYING4LIVE WORKSPACE VIEWCRM mirrorcontact.* and deal.*HealthySupport busticket.* and chat.*HealthyData warehouse*RetryingTest deliverySigned sample payloadReady1SUBSCRIBEHTTPS URL and events2AUTHENTICATEHMAC signature3OBSERVEDelivery rail and retries
The outbound webhook page lists HTTPS endpoints, event subscriptions, delivery health and a one-click signed test.

Full administrators create an HTTPS endpoint, choose specific events or the wildcard, store the secret safely and send a test. OpsIQ signs the raw payload with HMAC-SHA256:

X-OpsIQ-Signature: sha256=<hex hmac>

Verify the signature before deserialising or acting. Delivery is asynchronous and automatically retried after approximately 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours. Use the recent-delivery rail to inspect status, response code and attempt count.

Your receiver must be idempotent because any asynchronous system can redeliver. Return a 2xx response only after durable acceptance.

Developer

Webhooks

Webhooks let external systems notify OpsIQ when something happens (inbound), and let OpsIQ notify external systems when something happens internally (outbound).

Webhooks
Outbound webhooksThe outbound webhooks screen: an endpoints table with name, subscribed events, recent delivery status dots, and a Send-test button.Outbound webhooksworkspaceEndpoints+ Save endpointNAMEEVENTSDELIVERIESSlack #sales-alertshttps://hooks.slack.com/…lead.created, saleTestCRM mirrorhttps://api.acme.com/hookcontact.*, ticket.createdTestZapierhttps://hooks.zapier.com/…chat.startedTest1ENDPOINTSName, events, URL2SIGNEDHMAC + auto-retried3SEND TESTVerify deliveries
The real outbound-webhooks screen: each endpoint with its events, recent delivery health, and a one-click Send test — signed and retried.

Outbound webhooks

Subscribing

Go to Settings > Webhooks. Add an endpoint URL and select events to receive.

Events

ticket.created, ticket.replied, chat.started, chat.message, order.completed, crm.deal.stage_changed, crm.contact.created, etc.

Retry

Failed deliveries retry with exponential backoff. After 15 consecutive failures, the endpoint is auto-disabled.

Signing

Every request includes an HMAC signature in X-OpsIQ-Signature. Always verify.

SSRF protection

OpsIQ will not send to private/internal IPs (127.x, 10.x, 172.16.x, 192.168.x, 169.254.169.254).

Async delivery

Webhooks are delivered via the job queue, not blocking OpsIQ operations.

Stable event ID

Each event has a unique event_id that stays the same across retries for deduplication.

Verifying webhook signatures

PHP — verify webhook signature
<?php
$payload   = file_get_contents("php://input");
$signature = $_SERVER["HTTP_X_OPSIQ_SIGNATURE"] ?? "";
$secret    = "opsiq_whsec_your_secret";

$expected = hash_hmac("sha256", $payload, $secret);
if (!hash_equals($expected, $signature)) {
    http_response_code(401);
    exit(json_encode(["error" => "Invalid signature"]));
}

$event = json_decode($payload, true);
// Process the event...
http_response_code(200);
echo json_encode(["received" => true]);
Node.js — verify webhook signature
const crypto = require("crypto");

app.post("/opsiq-webhook", (req, res) => {
    const payload  = JSON.stringify(req.body);
    const sig      = req.headers["x-opsiq-signature"];
    const expected = crypto.createHmac("sha256", "opsiq_whsec_xxx")
        .update(payload).digest("hex");

    if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig || "")))
        return res.status(401).json({ error: "Invalid signature" });

    console.log("Webhook:", req.body);
    res.json({ received: true });
});
How do I test webhooks locally?+

Use ngrok to expose your local server. Set the webhook endpoint to your ngrok URL.

What if my endpoint is temporarily down?+

OpsIQ retries with exponential backoff. If your endpoint recovers within the retry window, no events are lost.

Developer

API keys

API keys authenticate requests to the OpsIQ REST API. Each key has scoped permissions.

API keys
API keysThe API keys screen: an issue panel with access level and scope chips, beside a list of existing masked keys with revoke buttons.API keysworkspaceIssue a keyAccessRead onlyRestrictedScopescontacts.readtickets.readevents.writeIssue keyYour keysZapier integrationopq_••••4f2aRevokeMobile appopq_••••91c7RevokeAnalytics exportopq_••••2db0Revoke1SCOPEDRead-only or restricted2PER-ACTIONPick exact scopes3REVOCABLERotate anytime
The real API keys screen: issue a scoped, read-only or restricted key by picking exact scopes — and revoke any key anytime.

Creating an API key

1
Go to Settings > API Keys

Navigate to API key management.

2
Click Create Key

Give it a descriptive name.

3
Select scopes

Give the key only what it needs. Scopes come in read and write pairs per area, so a reporting integration can be granted reads and nothing else.

Available scopes

Pick the narrowest set that does the job. admin satisfies every scope below, so use it only when you genuinely need broad access.

crm.read / crm.write

Contacts, companies, deals, activities, segments, outreach, conversions, lifecycle and CRM webhooks.

tickets.read / tickets.write

List and read tickets and their messages; reply, update, open and run bulk queue operations.

conversations.read / conversations.write

Read live-chat conversations and message history; send messages, assign and change status.

kb.read / kb.write

Knowledge base entries.

chat.read / chat.write

Saved reply templates.

connectors.read

See which connectors are installed, what they can do, and test their credentials.

automations.read

See your actions, triggers and their run history.

departments.read

Departments available for routing.

notifications.read

Notifications for a named operator.

analytics.read

Report sections, CSV exports and scheduled report definitions.

site_intelligence.read

Monitored sites and their SEO reports.

files.read

Signed download links for attachments.

status.write

Status page components and incidents.

writing

AI writing helpers: draft, summarise, translate, rewrite, compose, analyse.

admin

Everything, including a small number of sensitive actions that are deliberately not reachable by any narrow scope: erasing a contact, changing privacy settings, and reading the access log.

💡
Call meta.actions with your key to see exactly which actions it can run on your install. That is always more reliable than working from a list.

Access levels

All

The key may call anything its scopes allow.

Read only

Every write is refused, whatever the scopes say. The safest choice for reporting, dashboards and anything that should never change data.

Restricted

You list the exact actions the key may call. Anything else is refused, even within an allowed scope.

4
Copy the key

Shown once. Starts with "opq_". Store it securely.

🚫
Never share API keys in public code, client-side JavaScript, or version control. Use environment variables.
Developer

Connect your website

The OpsIQ widget is a JavaScript snippet you add to your website for tracking, AI chat, ticket creation, and customer identification.

How it works
Connect your websiteA one-line script tag on the left and, on the right, a web page with the OpsIQ chat bubble appearing in the corner.<!-- paste before </body> --><script src="https://cdn.opsiq.io/w.js" data-site="ws_8a2f" async></script>
Connect your website

Basic installation

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

Configuration attributes

data-site-key

Required. Your site key from Connected Sites.

data-mode

Optional. "chat" (default), "tickets", or "both".

data-position

Optional. "bottom-right" (default) or "bottom-left".

data-color

Optional. Primary color hex code.

data-greeting

Optional. Initial greeting message.

data-language

Optional. UI language: "en", "es", "fr", "de", "pt", "ar", etc.

data-identity-token

Optional. Server-generated signed identity token.

SPA support

Manual SPA route tracking
// 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 rules

CSP rules for widget
script-src 'self' https://your-opsiq-domain.com;
connect-src 'self' https://your-opsiq-domain.com;
frame-src https://your-opsiq-domain.com;
Does the widget slow my website?+

No. Under 15 KB gzipped, loads async after page content.

Can I customize the appearance?+

Use data-color for primary color. Contact support for CSS override options.

Developer

Widget install recipes

Platform-specific installation guides.

How it works
Widget install recipesPlatform install cards for WordPress, Shopify and Google Tag Manager, each saying where to add the widget.WPWordPressInstall the plugin, enteryour site key, save.ShopShopifyPaste the snippet intotheme.liquid before /body.GTMTag ManagerCustom HTML tag, all pages.
Install recipes

WordPress

Scenario:
Add to all pages of a WordPress site.
What to do:

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:
Add to your Shopify store.
What to do:

Online Store > Themes > Edit Code > Layout > theme.liquid. Paste before </body>. Save.

React / Next.js

Scenario:
Add to a React or Next.js app.
What to do:

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:
Add to your WHMCS client area.
What to do:

Setup > General Settings > Other > Global Footer Content. Paste the snippet. Or edit your template footer.tpl.

Google Tag Manager

Scenario:
Add via GTM.
What to do:

Create Custom HTML tag, paste snippet. Trigger: All Pages. Publish.

Developer

Visitor identity

Identity connects anonymous visitors to known customers. When identified, OpsIQ links browsing history, chats, and tickets to the customer profile.

How it works
Visitor identityA flow: a user logs in on your site, you issue a signed identity token, and OpsIQ unifies their sessions, chats and tickets into one profile.User logs inon your siteSigned tokenidentity_token (HMAC)One profilesessions+ chats+ tickets
Visitor identity

Dynamic identify call

Dynamic identity push
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["identify", {
  email: "[email protected]",
  name: "Jane Smith",
  customer_id: "cust_1001",
  plan: "pro",
  company: "Acme Inc",
}]);

Server-signed identity token (recommended)

PHP — generate identity token
<?php
$secret  = "opsiq_whsec_your_secret";
$payload = json_encode([
    "site_key" => "site_abc123",
    "customer" => [
        "id"    => $user->id,
        "email" => $user->email,
        "name"  => $user->name,
    ],
    "iat" => time(),
    "exp" => time() + 900,
]);
$token = base64_encode($payload) . "." . hash_hmac("sha256", $payload, $secret);
🚫
Always generate identity tokens on the server, never in client-side JavaScript.
What if a visitor clears cookies?+

They become anonymous until they log in again. OpsIQ links the new anonymous record when re-identified.

Developer

Plugins and SDKs

OpsIQ provides SDK packages and plugins for common platforms.

How it works
Plugins and SDKsFour packages: PHP SDK, Node.js SDK, WordPress plugin and WHMCS module, each with its install command.PHPPHP SDKcomposer require opsiq/sdkJSNode.js SDKnpm i @opsiq/sdkWPWordPress pluginOne-click install & connectWHWHMCS moduleAddon for billing + ticket relay
Plugins & SDKs
PHP SDK

Composer package: identity token generation, action API helpers, webhook signature verification.

JavaScript SDK

Browser-side: tracking, identity, custom events, chat control.

WordPress plugin

Widget injection, identity from WP user sessions, WooCommerce sync.

WHMCS module

Full integration: widget, ticket relay, identity, admin AI.

Shopify theme extension

App embed with automatic customer identity.

PHP SDK quick start

PHP SDK example
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);
Developer

REST API

The OpsIQ REST API lets you programmatically access all platform features.

How it works
REST APIA terminal showing a POST to the OpsIQ API with a Bearer key, listing open tickets, and the paged JSON response.$ 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

Request format

Send the key as Authorization: Bearer opq_... or X-OpsIQ-Key: opq_.... Use one authentication header, not both.

API request 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"
}

Common actions

The API is action-based: send an action name in the body. POST {"action":"meta.actions"} (no key required) for the authoritative, per-install list of every action and the scope it needs.

crm.contacts.list

List CRM contacts (scope crm.read). Params: q, status, source, tag, lead score, limit.

crm.contacts.upsert

Resolve-or-create a contact (scope crm.write). Params: email plus fields, tags, notes.

crm.deals.list

List CRM deals (scope crm.read). Params: status, stage_id, company_id, owner_admin_id, pipeline_id, limit.

crm.activities.record

Record a lifecycle/business activity for a contact (scope crm.write). Params: email or contact_id, event, value, currency.

crm.conversions.record

Record a conversion (scope crm.write). Params: contact_id or email, conversion_type, value, currency.

crm.events.list

Poll the CRM event stream (scope crm.read). Params: limit.

tickets.list

List tickets (scope tickets.read). Params: page, per_page, sort, order, status, priority, department_id, assigned_admin_id, client_email, search.

tickets.get

One ticket and its messages (scope tickets.read). Params: ticket_id or ticket_number, include_messages, messages_limit.

tickets.reply

Post a reply to a ticket (scope tickets.write). Params: ticket_id or ticket_number, body, author_type, author_name, internal.

tickets.update

Update a ticket (scope tickets.write). Params: ticket_id or ticket_number, status, priority, subject, department_id, assigned_admin_id.

tickets.open

Open a support ticket (scope tickets.write). Params: customer_email, customer_name, subject, body, priority.

tickets.bulk

Run a bulk queue operation (scope tickets.write). Params: operation, ids.

conversations.list

List live-chat conversations (scope conversations.read). Params: page, per_page, status, assigned_admin_id, client_email, search.

conversations.get

One conversation and its messages (scope conversations.read). Params: conversation_id or thread_key, include_messages.

conversations.messages

Paged message history (scope conversations.read). Params: conversation_id, page, per_page, include_internal.

conversations.send

Send a message into a conversation (scope conversations.write). Params: conversation_id, message, sender_type, internal.

conversations.update

Assign, re-status or re-title a conversation (scope conversations.write). Params: conversation_id, status, assigned_admin_id, subject.

connectors.list / .get / .test

See which connectors are installed, what each one can do, and whether its credentials work (scope connectors.read).

automations.actions.list

The actions your Actions builder will run (scope automations.read).

automations.triggers.list

What will fire and on which conditions (scope automations.read).

automations.runs.list

Execution history for debugging an integration (scope automations.read). Params: status, action_key.

departments.list

Departments you can route a ticket to (scope departments.read).

notifications.list

Notifications for one operator (scope notifications.read). Params: admin_id (required), unread_only.

analytics.export

A report section as CSV (scope analytics.read). Params: section, preset, from, to. Call analytics.sections.list for valid values.

site_intelligence.sites.list / .reports.list

Monitored sites and their SEO reports (scope site_intelligence.read).

files.get

A short-lived signed download link for an attachment (scope files.read). Params: reference, ttl.

💡
meta.actions is always authoritative. It returns every action available on your install with the scope each one needs, so you never have to guess or hard-code this list.

Paging, filtering and sorting

Every list action uses the same parameters, so you learn them once.

page / per_page

Page number starting at 1, and page size. Default 50, maximum 200. limit and offset are also accepted if you prefer them.

sort / order

Field to sort by, and asc or desc (default desc). Each action accepts a fixed set of sort fields; anything else is ignored rather than erroring.

filters

Send filters as an object, or pass a filter as a top-level parameter. Unknown filters are ignored.

What comes back

items, page, per_page, count, total and has_more. Keep requesting pages until has_more is false.

Paged, filtered, sorted list 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
}

Errors

Every failure returns the same shape, with a stable code you can branch on. Do not match on the human-readable error text, which may be reworded.

Error response
{
  "success": false,
  "code": "missing_scope",
  "error": "API key missing required scope. Needed one of: tickets.read, admin",
  "request_id": "req_8f2c1a9d4b7e"
}
missing_api_key / invalid_api_key

No key was sent, or the key is wrong or expired. HTTP 401.

missing_scope

The key is valid but lacks the scope this action needs. HTTP 403.

read_only_key / action_restricted

The key is read-only, or this action is not in its allow-list. HTTP 403.

unknown_action

No such action. Call meta.actions for the current list. HTTP 400.

missing_parameter / invalid_parameter

A required parameter is absent, or a value is not accepted. HTTP 400.

not_found

The record does not exist, or is not in the workspace this key can see. HTTP 404.

rate_limited

The hourly limit for this key is used up. HTTP 429.

server_error

Something failed on our side. The request_id identifies the attempt if you need to report it. HTTP 500.

Safe retries

If a write times out you cannot tell whether it landed. Send an idempotency_key and a repeat of the same call returns the original result instead of doing the work twice.

Idempotent write
{
  "action": "tickets.reply",
  "ticket_id": 4192,
  "body": "Thanks, that is now fixed.",
  "idempotency_key": "your-unique-id-for-this-attempt"
}
How long it lasts

A key is remembered for 24 hours against the same action and API key.

What you get back

The original response, plus idempotent_replay: true so you can tell it was a replay.

Failures stay retryable

Only successful writes are remembered. If a call failed, sending it again with the same key runs it again, which is what you want.

Reads

Reads ignore the key. Repeating a read is harmless.

Test without changing anything

Add dry_run: true to any write. Your key, scopes and parameters are all checked exactly as normal, then the call stops before anything is created or changed.

Dry run: verify credentials and payload safely
{
  "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."
}
Use dry_run while you are building. It is the quickest way to confirm a key has the right scopes and your payload is shaped correctly, without creating test data you then have to clean up.

Rate limits

Per-key limit

A configurable hourly limit per API key (default 1000 requests per hour). Set it per key under Settings, API Keys.

When exceeded

HTTP 429 with code rate_limited, plus a Retry-After header telling you how many seconds to wait. The limit resets at the top of the next clock hour.

Knowing where you stand

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (a Unix timestamp). Watch Remaining and slow down before you run out rather than waiting to be refused.

Telling 429 from 401

A 429 means wait and try again. A 401 means the key itself is wrong or expired, so retrying will not help until you fix the key.

Pre-auth brute-force guard

Repeated failed-auth attempts from one IP are throttled separately. Valid keys never trip this.

Best practice

Back off when Remaining gets low, and honour Retry-After after a 429 instead of retrying immediately.

Versions and stability

Current version

v1. Every response carries X-OpsIQ-API-Version and X-OpsIQ-API-Status so you can confirm what you are talking to.

How you will be warned

If a version is ever retired, responses gain standard Deprecation and Sunset headers, and meta.actions reports deprecated and sunset_at. Check those in your monitoring and you will never be surprised.

What will not change

Existing action names, their parameters and their error codes. New actions and new optional fields may be added at any time, so ignore fields you do not recognise rather than failing on them.

A complete integration, start to finish

This is the whole loop: find work, read it, act on it, and confirm what you did.

Full ticket workflow over the 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}
💡
Everything above works the same way for conversations: conversations.list, conversations.get, conversations.send and conversations.update follow the identical pattern, parameters and response shape.

Every action, with the scope it needs

This list is generated from the running catalogue, so it always matches the version you are on. meta.actions returns the same information as JSON.

analytics (3)

analytics.export

Read. Scope: analytics.read, admin.

analytics.scheduled.list

Read. Scope: analytics.read, admin.

analytics.sections.list

Read. Scope: analytics.read, admin.

automations (3)

automations.actions.list

Read. Scope: automations.read, admin.

automations.runs.list

Read. Scope: automations.read, admin.

automations.triggers.list

Read. Scope: automations.read, admin.

chat (3)

chat.saved_replies.add

Write. Scope: chat.write, admin.

chat.saved_replies.list

Read. Scope: chat.read, admin.

chat.saved_replies.save

Write. Scope: chat.write, admin.

connectors (3)

connectors.get

Read. Scope: connectors.read, admin.

connectors.list

Read. Scope: connectors.read, admin.

connectors.test

Read. Scope: connectors.read, admin.

conversations (5)

conversations.get

Read. Scope: conversations.read, admin.

conversations.list

Read. Scope: conversations.read, admin.

conversations.messages

Read. Scope: conversations.read, admin.

conversations.send

Write. Scope: conversations.write, admin.

conversations.update

Write. Scope: conversations.write, admin.

crm (64)

crm.access_log.list

Read. Scope: admin.

crm.activities.list

Read. Scope: crm.read.

crm.activities.record

Write. Scope: crm.write.

crm.consent_log.list

Read. Scope: crm.read.

crm.contacts.detail

Read. Scope: crm.read.

crm.contacts.erase

Write. Scope: admin.

crm.contacts.export

Read. Scope: crm.read.

crm.contacts.import.list

Read. Scope: crm.read.

crm.contacts.import.run

Write. Scope: crm.write.

crm.contacts.list

Read. Scope: crm.read.

crm.contacts.next_action

Read. Scope: crm.read.

crm.contacts.open_chat

Write. Scope: crm.write.

crm.contacts.open_ticket

Write. Scope: crm.write.

crm.contacts.resync

Write. Scope: crm.write.

crm.contacts.save

Write. Scope: crm.write.

crm.contacts.send_email

Write. Scope: crm.write.

crm.contacts.upsert

Write. Scope: crm.write.

crm.conversions.goals.delete

Write. Scope: crm.write.

crm.conversions.goals.list

Read. Scope: crm.read.

crm.conversions.goals.save

Write. Scope: crm.write.

crm.conversions.list

Read. Scope: crm.read.

crm.conversions.record

Write. Scope: crm.write.

crm.deals.advance

Write. Scope: crm.write.

crm.deals.create

Write. Scope: crm.write.

crm.deals.detail

Read. Scope: crm.read.

crm.deals.list

Read. Scope: crm.read.

crm.deals.update

Write. Scope: crm.write.

crm.events.catalog

Read. Scope: crm.read.

crm.events.list

Read. Scope: crm.read.

crm.inbound.activity

Read. Scope: crm.read.

crm.inbound.endpoints.delete

Write. Scope: crm.write.

crm.inbound.endpoints.list

Read. Scope: crm.read.

crm.inbound.endpoints.save

Write. Scope: crm.write.

crm.inbound.endpoints.test

Write. Scope: crm.write.

crm.lifecycle.evaluate

Write. Scope: crm.write.

crm.lifecycle.rules.delete

Write. Scope: crm.write.

crm.lifecycle.rules.list

Read. Scope: crm.read.

crm.lifecycle.rules.save

Write. Scope: crm.write.

crm.outreach.campaigns.delete

Write. Scope: crm.write.

crm.outreach.campaigns.list

Read. Scope: crm.read.

crm.outreach.campaigns.save

Write. Scope: crm.write.

crm.outreach.campaigns.send

Write. Scope: crm.write.

crm.outreach.send

Write. Scope: crm.write.

crm.outreach.templates.delete

Write. Scope: crm.write.

crm.outreach.templates.list

Read. Scope: crm.read.

crm.outreach.templates.preview

Read. Scope: crm.read.

crm.outreach.templates.save

Write. Scope: crm.write.

crm.privacy_settings.get

Read. Scope: crm.read.

crm.privacy_settings.save

Write. Scope: admin.

crm.segments.delete

Write. Scope: crm.write.

crm.segments.list

Read. Scope: crm.read.

crm.segments.members

Read. Scope: crm.read.

crm.segments.preview

Read. Scope: crm.read.

crm.segments.save

Write. Scope: crm.write.

crm.segments.suggestions.accept

Write. Scope: crm.write.

crm.segments.suggestions.dismiss

Write. Scope: crm.write.

crm.segments.suggestions.list

Read. Scope: crm.read.

crm.webhooks.delete

Write. Scope: crm.write.

crm.webhooks.list

Read. Scope: crm.read.

crm.webhooks.save

Write. Scope: crm.write.

crm.webhooks.test

Write. Scope: crm.write.

crm.workflows.delete

Write. Scope: crm.write.

crm.workflows.list

Read. Scope: crm.read.

crm.workflows.save

Write. Scope: crm.write.

departments (1)

departments.list

Read. Scope: departments.read, admin.

files (1)

files.get

Read. Scope: files.read, admin.

kb (6)

kb.faq.delete

Write. Scope: kb.write, admin.

kb.faq.generate

Write. Scope: kb.write, admin.

kb.faq.import

Write. Scope: kb.write, admin.

kb.faq.list

Read. Scope: kb.read, read, admin.

kb.faq.save

Write. Scope: kb.write, admin.

kb.faq.set_status

Write. Scope: kb.write, admin.

meta (2)

meta.actions

Read. Scope: no scope required.

meta.me

Read. Scope: no scope required.

notifications (1)

notifications.list

Read. Scope: notifications.read, admin.

site_intelligence (2)

site_intelligence.reports.list

Read. Scope: site_intelligence.read, admin.

site_intelligence.sites.list

Read. Scope: site_intelligence.read, admin.

status (3)

status.components.save

Write. Scope: status.write, admin.

status.incidents.create

Write. Scope: status.write, admin.

status.incidents.resolve

Write. Scope: status.write, admin.

tickets (16)

tickets.assignment_rules.delete

Write. Scope: tickets.write, admin.

tickets.assignment_rules.save

Write. Scope: tickets.write, admin.

tickets.bulk

Write. Scope: tickets.write, admin.

tickets.get

Read. Scope: tickets.read, admin.

tickets.list

Read. Scope: tickets.read, admin.

tickets.open

Write. Scope: tickets.write, admin.

tickets.open_guest

Write. Scope: tickets.write, admin.

tickets.reply

Write. Scope: tickets.write, admin.

tickets.sla.delete

Write. Scope: tickets.write, admin.

tickets.sla.save

Write. Scope: tickets.write, admin.

tickets.tags.add

Write. Scope: tickets.write, admin.

tickets.tags.list

Read. Scope: tickets.read, admin.

tickets.tags.remove

Write. Scope: tickets.write, admin.

tickets.update

Write. Scope: tickets.write, admin.

tickets.views.delete

Write. Scope: tickets.write, admin.

tickets.views.save

Write. Scope: tickets.write, admin.

todos (1)

todos.add

Write. Scope: todos.write, admin.

writing (6)

writing.analyze

Write. Scope: writing.

writing.compose

Write. Scope: writing.

writing.reply

Write. Scope: writing.

writing.rewrite

Write. Scope: writing.

writing.summarize

Write. Scope: writing.

writing.translate

Write. Scope: writing.

Is there an OpenAPI/Swagger spec?+

Yes. The machine-readable OpenAPI 3.0 document is at /api/v1/openapi.php (import it into Postman, Insomnia, Stoplight, or a code generator). Human-readable developer docs are at /api/docs/.

How do I work with more than one workspace?+

Send site_key in the request body to choose a workspace. A key issued for one workspace stays pinned to it; a key with admin context can select any workspace it is permitted to see, and is refused for any it is not.

Which actions can a read-only key call?+

Any action marked as a read. Set the permissions mode on the key to read_only and every write is refused with read_only_key, so a reporting integration cannot change anything even by mistake.

Why did I get not_found for something I can see in the admin?+

The key is scoped to a workspace. Records in other workspaces return not_found rather than a permission error, so the API never confirms whether something exists elsewhere.

Developer

Events API

Send custom events from your server or website to OpsIQ for analytics, experiments, CRM triggers, and webhook conditions.

How it works
Events APIA track() call sending a custom demo_booked event into OpsIQ, which feeds conversion goals, segments and triggers.OpsIQ.track("demo_booked", {value: 0, plan: "pro"});Conversion goalsSegmentsTriggers & webhooksBrowser (OpsIQ.track) or server-side POST /v1/events
Events API

Browser-side events

Browser event tracking
window.OpsIQ = window.OpsIQ || [];
window.OpsIQ.push(["track", "button_clicked", {
  button: "signup",
  page: "/pricing",
  variant: "green"
}]);

Server-side events

Server-side, record activities and conversions against a contact through the action API. Use crm.activities.record for lifecycle/business activity and crm.conversions.record for conversions. There is no events.send action; the inbound CRM event receiver lives at /v1/inbound.php?t=<token> for third-party systems that push events in.

Server-side activity (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"
}

Naming convention

Dot notation

"order.completed" not "orderCompleted".

Past tense

"button.clicked" not "button.click".

Be specific

"pricing.plan_selected" not "user_action".

Developer

How data flows through OpsIQ

Understanding the data flow helps you debug integrations and optimize performance.

How it works
How data flowsData flows from the widget and beacon into OpsIQ core (CDP, identity graph, AI brain, analytics, CRM) then out via webhooks and the REST API.Widget& beaconOpsIQ coreCDP · identity graphAI brainanalytics · CRMWebhooks outREST API
Data flow

Inbound data flow

1
Widget beacon

The JavaScript widget sends page views, clicks, and chat messages to /beacon.php.

2
Event ingestion

Events stored in opsiq_events with site_key, event type, customer, and properties.

3
Session assembly

Session builder groups page views into sessions (via cron).

4
Identity resolution

When identified, anonymous records are linked to the customer profile.

5
Connector sync

Connectors pull data from external platforms and store in the connector cache.

6
AI context

AI assembles context from: visitor history, customer profile, connector data, KB, and prompt.

Outbound data flow

1
Event fires

Internal event fires (ticket.created, chat.message, order.completed).

2
Job queue

Event placed in the async job queue.

3
Webhook dispatch

Dispatcher signs and sends to all subscribed endpoints.

4
Retry on failure

Failed deliveries retried with exponential backoff.

Settings

Settings reference

Settings control how OpsIQ behaves across tracking, AI, tickets, security, and branding.

Settings
SettingsThe settings screen: a left nav (General, Branding, Notifications, Security, Danger zone) and toggle rows for AI auto-reply, tracking, CSAT and data retention.SettingsworkspaceGeneralBrandingNotificationsSecurityDanger zoneAI auto-replyTrack visitorsCSAT surveyData retention365 days1PER-WORKSPACEEvery option scoped2TOGGLESTurn features on/off3AI CONFIGInherited, overridable
The real Settings screen: a tabbed nav with simple toggle rows — AI auto-reply, visitor tracking, CSAT, retention — all scoped per workspace.

General settings

Business name

Your company name. Used in AI responses, emails, and widget header.

Industry

Your business industry. Helps the AI understand context.

Timezone

All analytics and timestamps use this timezone.

Default currency

Currency for revenue reporting.

Support hours

Business hours for auto-reply scheduling and SLA timers.

Tracking settings

Session timeout

Inactivity time before a session ends. Default: 30 minutes.

Active threshold

How long a visitor is "live" after last page load. Default: 90 seconds.

IP anonymization

Replace last IP octet with 0 for GDPR compliance.

Do Not Track

Respect DNT browser headers.

Excluded IPs

IP addresses to skip in tracking. Add your team IPs.

Excluded pages

URL patterns to skip. Example: /admin/*

Data retention

How long to keep visitor data. Default: 90 days.

Branding settings

Logo

Appears in admin header, emails, and widget.

Primary color

Accent color throughout the admin UI and widget.

Favicon

Browser tab icon for your OpsIQ admin.

Settings

Managing your team

Invite team members and assign roles to control who can access what.

Team
Team & departmentsThe team screen: a table of admins with contact, role badge (Owner, Full Admin, Agent) and the departments each can access.Team & departmentsworkspaceTeam & departments+ Save admin userCONTACTROLEDEPARTMENTSAO[email protected]Ada OwusuOwnerAllKM[email protected]Kojo MensahFull AdminAllRT[email protected]Rita TettehAgentBillingSB[email protected]AgentSupport1TEAMInvite & manage admins2ROLESOwner · Full Admin · Agent3SCOPEDPer-department access
The real team screen: every admin with their contact, role and the departments they can reach — agents scoped, owners full.

Roles

Owner

Full access including license, billing, and danger zone. One per installation.

Full Admin

Full access except license and danger zone. Can manage admins.

Agent

Limited to assigned departments. Tickets, chats, and analytics only.

Inviting team members

1
Go to Team

Navigate to Team in the sidebar.

2
Click Invite

Enter the team member's email.

3
Set role

Choose Owner, Full Admin, or Agent.

4
Assign departments

For Agents, select accessible departments.

5
Send invite

They receive an email with a setup link.

Settings

Team performance

How your support team is performing. Only accessible to Owners and Full Admins.

Team performance
Team performanceThe team-performance screen: agents ranked by a composite score bar, CSAT and a reward balance with a Pay button per row.Team performanceworkspaceTeam performanceAGENTSCORECSATBALANCERTRita Tetteh4.8$42PaySBSam Boateng4.5$28PayKMKojo Mensah4.2$15PayAOAda Owusu4.9$51Pay1SCOREDComposite performance2CSAT & LOADRatings + volume3REWARDSPay agent balances
The real team-performance screen: each agent scored on volume and CSAT, with a reward balance you can pay out per row.

Metrics

Resolution time

Average time from ticket creation to resolution per agent.

First response time

Average time to first staff reply. Most important SLA metric.

Handle depth

Average number of replies needed to resolve a ticket.

Workload

Open ticket count per agent right now.

Channel distribution

Breakdown of chat vs. tickets vs. email per agent.

CSAT breakdown

Customer satisfaction scores per agent vs. team average.

Trend comparison

Current period vs. previous period comparison.

Busiest hours

When each agent handles the most tickets. Use for shift planning.

Who is online

OpsIQ tracks admin online status via a 60-second heartbeat. Admins not seen in 5 minutes are offline. The status widget appears in the admin navigation.

Settings

Your sites (workspaces)

Sites (workspaces) let you manage multiple websites from one OpsIQ installation. Each has its own tracking, AI, connectors, and team access.

Sites
Your sitesThe sites screen: a list of workspaces, each with its domain, type, connector, status badge and an Open button, plus Add-new-site.Your sitesworkspaceYour sites+ Add new siteSshop.acme.comeCommerce · Shopify connectorActiveOpenHhost.acme.comHosting · WHMCS connectorActiveOpenBblog.acme.comContent · no connectorSetupOpen1MULTI-SITEOne workspace per site2ISOLATEDData never mixes3PER-SITEOwn settings & connectors
The real Sites screen: each site is its own isolated workspace — own domain, connector and settings — added and opened from one list.

Creating a site

1
Go to Connected Sites

Navigate to Connected Sites.

2
Add a new site

Enter name, domain, and description.

3
Copy the site key

Each site gets a unique key (site_xxx) for the widget snippet.

4
Configure independently

Each site has its own AI, connectors, and settings.

How many sites can I have?+

Depends on your license plan. Check your license details.

Settings

License and plan

Your OpsIQ license controls features, site limits, and AI credit balance.

License
License CenterThe OpsIQ License Center: plan, an Active status badge, the masked license key, an AI-credit meter, and a Force-remote-check button.License CenterworkspaceOpsIQ License CenterPlanBusinessStatusActiveKeyOPSIQ-••••-••••-2F9CAI credits$68 leftForce remote check1PLAN & STATUSActive, at a glance2KEYHMAC-cached locally3CREDITSAI balance & limits
The real License Center: your plan and active status, the masked key, your AI-credit balance, and a one-click force re-verify.
License key

Enter in Settings > License. Validated against the OpsIQ licence server.

License heartbeat / validation

OpsIQ normally reads its signed local licence cache and refreshes validation when required. Use Force remote check when you need an immediate result; Diagnostics identifies DNS, HTTPS or server-time problems.

Plan

Determines feature availability and limits.

Site limit

Maximum number of workspaces.

AI credits

If using Managed AI, your credit balance is shown here.

Expiration

Renew before expiration to avoid service interruption.

What happens when my license expires?+

Tracking, tickets, and CRM continue. AI features pause until renewal. Data is preserved.

Settings

Profile, password and two-factor authentication

Each administrator can maintain their own identity, working preferences, password and two-factor authentication.

Product screen
My profileThe profile page separates personal details, language/timezone, avatar/signature, password and two-factor authentication.My profileworkspacePROFILECompleteTIMEZONEEurope/Athens2FAEnabledLIVE WORKSPACE VIEWName and emailPersonal identityEditLanguage and timezoneDates and interfaceEditAvatar and signatureReplies and team presenceEditPassword and 2FAAccount protectionSecure1UPDATE PROFILEIdentity and locale2SECURE LOGINPassword and 2FA3SAVEApply to this admin
The profile page separates personal details, language/timezone, avatar/signature, password and two-factor authentication.

Profile settings belong to the signed-in administrator and do not change workspace branding. Use a unique password and enable two-factor authentication. Changing an email or authentication setting may require re-verification or a fresh sign-in.

Settings

Notification preferences

Notification preferences control which operational events reach an administrator in the product or by email.

Product screen
Notification preferencesThe notification page provides per-event in-app and email choices plus a recent notification list.Notification preferencesworkspaceIN-APPOnEMAILSelectiveUNREAD4LIVE WORKSPACE VIEWTicket assignedIn-app and emailOnCustomer repliedIn-appOnSLA riskIn-app and emailOnAI approvalIn-app and emailOn1CHOOSE EVENTSOnly useful signals2CHOOSE CHANNELIn-app or email3REVIEWRecent notifications
The notification page provides per-event in-app and email choices plus a recent notification list.

Preferences cover ticket assignment, customer replies, SLA warnings, chat handoff and AI approval events. Keep urgent operational signals enabled somewhere; turning off email does not necessarily turn off the in-app notification.

Settings

Security overview

The Security Overview is the first screen for assessing blocks, login attacks, threat sessions, security trends and event integrity.

Product screen
Security overviewSecurity Overview combines current risk cards, a 14-day trend, attacker list, event feed and integrity status.Security overviewworkspaceACTIVE BLOCKS18FAILED LOGINS42HIGH THREAT3LIVE WORKSPACE VIEWAuto-blocked7-day total and sourceTrendLatest attackersIP, country and reasonReviewSecurity eventsRisk and action resultFeedHash-chain integrityTamper-evident event chainValid1READ HEADLINECurrent exposure2OPEN EVIDENCEAttackers and events3ACTBlock, investigate, export
Security Overview combines current risk cards, a 14-day trend, attacker list, event feed and integrity status.

Use the headline cards for triage, then open the related Audit, Failed Logins, Blocked IPs or JavaScript Errors page for record-level work. The 14-day trend is more useful than a single spike. High-threat sessions should be investigated against visitor, request and authentication evidence before a permanent block is applied.

Settings

Tamper-evident audit log

The audit log records who did what, when, to which object, at what risk level and whether it succeeded.

Product screen
Activity auditThe audit page provides searchable tamper-evident activity with action, actor, risk, target and result.Activity auditworkspaceEVENTS18.2kHIGH RISK21INTEGRITYValidLIVE WORKSPACE VIEWConnector enabled[email protected] · ShopifySuccessAPI key revoked[email protected] · key 19SuccessSettings changed[email protected] · AISuccessPermission denied[email protected] · exportBlocked1FILTERAction, risk and actor2INSPECTTarget and result3EXPORTCSV or JSON
The audit page provides searchable tamper-evident activity with action, actor, risk, target and result.

Filter by action, risk and actor; export CSV or JSON for an investigation. The hash chain helps detect missing or altered audit rows, but it does not replace protected backups and restricted database access. Treat audit exports as sensitive because they may identify users, records and security actions.

Operations

Diagnostics

Diagnostics turns subsystem checks into plain-English health results and direct next actions.

Product screen
DiagnosticsDiagnostics groups health checks for the widget, AI, tickets, integrations, Site Intelligence, background tasks, CRM automation, licensing and storage.DiagnosticsworkspaceHEALTHY13WARNING2FAILED1LIVE WORKSPACE VIEWWidgetBeacon and chat endpointsHealthyBackground tasksCron heartbeat lateWarningEmailOutbound test failedFailedConnectorsRegistry and event intakeHealthy1REFRESHRun current checks2OPEN WARNINGRead evidence3FIX AND RETESTConfirm recovery
Diagnostics groups health checks for the widget, AI, tickets, integrations, Site Intelligence, background tasks, CRM automation, licensing and storage.

The page checks Site Speed, rank/keyword/backlink/local data, AI and action gateway, tickets, crawler/audits, integration/event intake, background tasks, CRM automations, licence, widget and related product services. It intentionally reports operator-readable causes rather than exposing raw secrets.

After a change, Refresh and confirm the affected subsystem returns healthy. A green diagnostics page is necessary but not sufficient for launch; complete the Pre-launch checklist as well.

Settings

Security and access

OpsIQ includes multiple security layers to protect your admin, data, and API access.

How it works
Security and accessA security shield beside enabled controls: two-factor, OIDC SSO, SCIM 2.0, OAuth2 PKCE, CSRF/CSP, IP firewall, rate limits and a secrets vault.Two-factor (TOTP)OIDC SSOSCIM 2.0OAuth2 PKCECSRF + CSPIP firewallRate limitsSecrets vault
Security

Security features

Admin authentication

Email/password with optional 2FA.

Login lockout

Temporary lock after too many failed attempts.

IP blocking

Block IPs or CIDR ranges from accessing tracked sites.

Threat scoring

Behavior-based threat scores. High-threat visitors can be auto-blocked.

HTTPS enforcement

Required for all connections. HTTP redirects to HTTPS.

HSTS headers

Strict-Transport-Security prevents downgrade attacks.

CSRF protection

All admin forms include CSRF tokens.

XSS protection

All user input is escaped. CSP headers restrict script execution.

SSRF protection

Outbound webhooks block private/internal IP addresses.

Recommended setup

1
Enable 2FA

For all admin accounts.

2
Strong passwords

Minimum 12 characters, mixed.

3
Review accounts

Remove access for former team members.

4
Monitor failed logins

Check weekly for suspicious patterns.

5
Keep updated

Apply updates promptly for security patches.

Settings

Roles and permissions

Role-Based Access Control lets you control what each team member can do.

Roles & permissions
Roles and permissionsA role-by-capability matrix: Owner has everything; Full Admin lacks billing and danger zone; Agent has only scoped tickets.Roles & permissionsworkspaceSETTINGSBILLINGDANGERTICKETSOwnerFull AdminAgentscoped13 ROLESOwner · Full Admin · Agent2GRANULARPer-page + per-department3DEFAULT-DENYForgotten routes blocked
The role matrix at a glance: Owner gets everything, Full Admin everything but billing and danger zone, Agent only their scoped tickets.

Default roles

Owner

Everything including license, danger zone, and installation management.

Full Admin

Everything except license and danger zone. Can manage team.

Agent

Respond to assigned-department tickets and chats, view analytics. No settings, team, or security access.

Can I create custom roles?+

Not currently. Three built-in roles plus department assignment gives granular control.

Settings

Blocked IPs

Manage IP addresses blocked from accessing your tracked sites.

Blocked IPs
Blocked IPsThe blocked-IPs screen: a block-an-IP/CIDR form beside a Blocked Addresses table with each entry, date, reason and an Unblock button.Blocked IPsworkspaceBlock an IP / CIDR203.0.113.0/24Reason (optional)BlockBlocked addresses203.0.113.9Jun 12 · brute forceUnblock45.12.0.0/16Jun 10 · spamUnblock102.89.6.2Jun 9 · abuseUnblock1BLOCKIP or CIDR range2LISTWho & when, with reason3UNBLOCKOne click
The real Blocked IPs screen: block a single IP or a CIDR range, and manage the list — each with its date, reason and one-click unblock.

How to block

1
Go to Security > Blocked IPs

2
Add an IP or CIDR range

Example: 203.0.113.42 or 203.0.113.0/24

3
Add a reason

Document why: spam, abuse, scraping, etc.

Will blocking affect legitimate users?+

If customers share a corporate IP or VPN, blocking that IP blocks everyone on it. Use narrow blocks.

Settings

Failed logins

All unsuccessful login attempts to your OpsIQ admin.

Failed logins
Failed loginsThe failed-logins screen: a table of accounts/IPs with failure counts, time of last attempt, and a Block button per row.Failed loginsworkspaceFailed login attemptsACCOUNT / IPFAILEDLASTACTION[email protected] · 41.62.10.472m agoBlock[email protected] · 102.89.6.2318m agoBlockunknown · 45.12.9.71226m agoBlock[email protected] · 88.21.4.921h agoBlock1WATCHFailed login attempts2COUNTSPer account / IP3ACTBlock from the row
The real Failed logins screen: every account/IP with its failure count and last attempt — block a brute-force source straight from the row.

What each entry shows

Date/time

When the attempt happened.

Email

Email address used.

IP address

Source of the attempt.

Country

Geographic location.

Reason

Wrong password, locked, or not found.

Warning signs

Many attempts, same email

Password guessing. Ensure 2FA is enabled.

Many attempts, different emails

Automated attack. Block the source IP.

Unusual countries

If your team is local, foreign attempts are likely attacks.

Settings

AI security analyst

An opt-in analyst layer over the Security pages: verdicts, incident briefs, a daily digest, a weekly posture check, Ask Security, and 0-token block policies. It never runs in the visitor request path.

Every Security page records what happened, but reading it still takes judgment. The AI security analyst adds that judgment in place, and it is built to spend almost nothing: it never sits in the beacon or login path, deterministic rules settle the obvious cases with no AI call, verdicts are cached, and the analyst's best output is a deterministic rule that then enforces forever at zero tokens. Turn features on in Settings → Security; all default off.

What it adds

Verdict chips + Explain

Blocked IPs and Failed Logins rows show a benign / suspicious / hostile chip with a confidence score. Explain opens the reasoning, the facts used, and one-click Block / Release actions. Cached 24h, so re-viewing an IP is free.

Incident briefs

Related events cluster into one incident (login wave, URL scan, auto-block burst) with a plain-English timeline and one recommended next step. Ongoing attacks fold into the same incident.

Daily digest

One recap per day: yesterday versus your baseline, blocks, incidents, and the single thing to do. Quiet days send a deterministic all-clear at zero tokens.

Weekly posture check

A Monday hardening checklist (2FA gaps, lockout threshold versus real attack volume, alerts off) with a severity, effort and exact fix per item.

Ask Security

A question box on the Security Overview that answers from your live security state. Deep server questions are handed to the admin engineer chat rather than guessed.

Policy proposals + autopilot

The analyst proposes concrete block rules as Approve / Dismiss cards; approved rules enforce at zero tokens with a live hit counter. Optional autopilot approves only the safest rules automatically.

Settings

AI security analyst (security_ai_enabled)

Master switch — enables verdict chips, Explain, and Ask Security. Only ambiguous IPs reach the model, batched into one call.

Incident briefs (security_ai_incidents)

Clusters events into incidents and writes each new story. Runs on the existing hourly security cron.

Daily digest (security_ai_digest)

One security recap per day on the bell and the Overview. Quiet days cost nothing.

Weekly posture check (security_ai_posture)

Monday hardening checklist on the Overview. The checklist is fully deterministic.

Policy autopilot (security_ai_autopilot)

Lets the analyst activate its safest proposals unattended: reversible time-limited blocks only, single IPs or ranges no wider than /24, never shared/mobile/private, capped 10 per hour, always audited and undoable.

💡
Every call is tagged security_ai with its own monthly cap in AI Config → Cost Guardrails (default 300k tokens). If the cap is hit, features degrade to deterministic reads — blocking, lockouts and alerts never depend on this budget. The analyst can never delete data, change settings, touch the audit ledger, or make a permanent ban.
Operations

Cron and automation

OpsIQ uses one product scheduler to run email polling, ticket automation, analytics rollups, retention, AI queues, CRM work, reports and connector jobs.

Product screen
Cron and automationOne product cron entry supplies the heartbeat; OpsIQ decides which internal jobs are due.Cron and automationserverHEARTBEATEvery minuteRUNNERcron/all.phpHEALTHSettingsLIVE WORKSPACE VIEWUnified product runneropsiq/cron/all.phpRequiredTicket and email queuesShort scheduled workActiveAnalytics and retentionInternal cadenceScheduledConnector subscribersDeclared cron eventsScoped1INSTALL ONE LINERun the product scheduler every minute2CHECK CRON SETUPConfirm CLI heartbeats3USE DIAGNOSTICSInvestigate late or failed work
One product cron entry supplies the heartbeat; OpsIQ decides which internal jobs are due.

Required product cron entry

Add this single line to the crontab for the same server and PHP environment that runs OpsIQ:

OpsIQ product crontab entry
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1

Replace /path/to/opsiq with the installation root. Use the full PHP CLI path when the host requires one, for example /usr/bin/php8.4.

Do not use the top-level /cron.php for product work. In this repository that runner belongs to a separate non-product service outside this handbook. The OpsIQ product runner is opsiq/cron/all.php.

What the unified scheduler drives

Ticket and AI queues

Processes due auto-replies, escalations, approvals and other queued product work.

Inbound email

Polls configured mailboxes where polling is the selected intake method.

Analytics and sessions

Assembles sessions and refreshes scheduled aggregates when they are due.

CRM and engagement

Runs scoring, lifecycle, workflow, campaign and scheduled-report tasks that are enabled.

Retention and maintenance

Performs due cleanup, archive, expiry and integrity work.

Connectors

Dispatches connector cron subscribers and polling only for installed, enabled and configured connectors.

Verify cron

  1. Open Settings - Cron Setup and confirm the product runner exists.
  2. Use Run now once, then confirm the admin and polling heartbeats update.
  3. Check Diagnostics for a late heartbeat, PHP CLI, database or file-path problem.
  4. Inspect /tmp/opsiq-cron.log or the log path you selected when a manual run fails.

Keep connector handlers short, idempotent and workspace-scoped. Batch long synchronisations and store a cursor/checkpoint so the next run can continue safely.

🚫
When the product cron stops, time-based OpsIQ work stops or becomes late even though ordinary admin pages may still load.
Operations

Hosted deployment operations

A hosted OpsIQ deployment uses the same product screens and workflows while the hosting operator manages the server layer. Commercial sign-up, plans, billing and account-portal procedures are outside this handbook.

Product screen
Hosted deploymentHosted operation changes who maintains the infrastructure; it does not change how customers use OpsIQ.Hosted deploymentworkspacePRODUCT UISame OpsIQINFRASTRUCTUREOperator-managedWORKSPACE DATAIsolatedLIVE WORKSPACE VIEWApplication runtimePHP, web server and databaseManagedProduct cronScheduled by hosting operatorVerifyBackups and updatesProvider policy and evidenceReviewOpsIQ settingsSites, AI, team and connectorsYour team1OPERATE OPSIQ NORMALLYUse the same product navigation2VERIFY SERVICE HEALTHUse Diagnostics and status evidence3KNOW RESPONSIBILITYSeparate product settings from hosting work
Hosted operation changes who maintains the infrastructure; it does not change how customers use OpsIQ.

What the hosting operator normally manages

  • Web server, PHP runtime, database service, TLS and storage.
  • The unified product cron and its server-level logs.
  • Application updates, infrastructure monitoring and the backup process defined by the hosting agreement.

What an OpsIQ administrator still manages

  • Websites and widget installation, AI settings, knowledge, mailboxes and customer-support workflows.
  • Team access, departments, security controls, API keys, connectors, automations and data-retention settings.
  • Product verification through Diagnostics, the audit log, connector tests and real end-to-end checks.

Operational checks

Do not assume that a managed service means every product integration is healthy. Confirm the latest backup evidence and retention policy with the hosting operator, and use OpsIQ Diagnostics after changes to DNS, email, AI providers, websites or connectors.

This section covers product operations only. Commercial onboarding, subscriptions, billing and customer-account administration remain outside the OpsIQ handbook.

Operations

Self-hosting OpsIQ

A self-hosted OpsIQ installation runs on infrastructure you control. You are responsible for the runtime, database, TLS, product cron, backups, updates and monitoring.

Product screen
Self-hostingSelf-hosting gives infrastructure control and makes your team responsible for every operating dependency.Self-hostingserverPHP8.4+DATABASEMySQL 5.7+SCHEDULEREvery minuteLIVE WORKSPACE VIEWRuntime extensionscurl, pdo_mysql, mbstring, jsonRequiredAdditional extensionsxml, openssl, zip, intl, gdRequiredDatabase alternativeMariaDB 10.3+ with InnoDBSupportedTransportHTTPS and outbound provider accessVerify1PREPARE THE SERVERMatch runtime requirements2INSTALL AND CONFIGUREUse a dedicated database and HTTPS3ADD PRODUCT CRONRun opsiq/cron/all.php
Self-hosting gives infrastructure control and makes your team responsible for every operating dependency.

Minimum software contract

PHP

PHP 8.4 or newer. Required extensions: curl, pdo_mysql, mbstring, json, xml, openssl, zip, intl and gd.

Database

MySQL 5.7+ or MariaDB 10.3+ using InnoDB. Create a dedicated database and least-privileged application user.

Web server

Apache or Nginx configured for the OpsIQ front controller, static assets and required rewrites.

HTTPS

Required for admin sessions, widget traffic, API keys, webhooks and provider calls.

Outbound access

Allow DNS and HTTPS access to the AI, email, connector and licence endpoints you actually enable.

File access

The web and CLI users must be able to read application files and write only to the documented runtime/storage locations.

Cron

Run the OpsIQ product scheduler every minute with the same application configuration and database access as the web process.

Installation sequence

  1. Upload the release to the intended document root and preserve the supplied directory structure.
  2. Create the database and application user, then enter the database, canonical URL and licence settings.
  3. Run the installer/setup flow and create the first owner account.
  4. Enable HTTPS and verify redirects, cookies and the public widget/API paths.
  5. Add the unified OpsIQ product cron:
Self-hosted product cron
* * * * * php /path/to/opsiq/opsiq/cron/all.php >> /tmp/opsiq-cron.log 2>&1
  1. Open Settings - Cron Setup and Diagnostics; run the scheduler once and resolve every failed dependency.
  2. Configure backup, restore testing, log retention and update procedures before adding production data.

Updating safely

  1. Read the release notes and check the required PHP/extensions before changing files.
  2. Back up the database and application/configuration files, then prove the backup can be restored in a test location.
  3. Deploy the new files without deleting installation-specific configuration or runtime data.
  4. Run the supplied migration/preflight process and verify login, widget tracking, tickets, email, AI, connectors and cron.
  5. Keep the previous release and database backup available for the documented rollback window.
🚫
The repository top-level /cron.php is not the OpsIQ product scheduler. Point product automation only at opsiq/cron/all.php.
⚠️
Do not delete .schema_cache.json as routine maintenance. Remove it only when the product instructions explicitly require a schema-cache rebuild.
Operations

Production guide

Checklist and best practices for running OpsIQ in production.

Production guide
Production guideA go-live checklist: custom domain and SSL, AI trained, connectors and cron, backups and retention, and team roles.Go-live checklistworkspaceBefore you go liveCustom domain + SSL configuredAI trained on your contentConnectors tested · cron runningBackups scheduled · retention setTeam roles assigned & reviewed1GO-LIVEPre-launch checklist2VERIFYDomain · SSL · backups3CONFIDENTShip when it is green
A go-live checklist so nothing is missed: domain + SSL, trained AI, tested connectors and cron, backups and retention, and team roles.

Before going live

HTTPS configured

SSL installed, HTTP redirects, HSTS enabled.

Cron running

Verify via diagnostics page.

AI tested

Chat as a customer. Verify accuracy and tone.

Widget installed

On all website pages. Verify with Live Feed.

Backup configured

Automated daily database and file backups.

Error logging

PHP error log enabled and monitored.

Team invited

All members have accounts with correct roles.

Knowledge base populated

At least 5-10 articles.

Daily: Check dashboard, clear ticket queue, spot-check AI conversations.

Weekly: Review AI Insights, update KB, check team performance, review security.

Monthly: Review analytics trends, audit connectors, update AI training, verify backups.

Operations

Pre-launch checklist

Run the source gates and complete real product checks before a release or first production launch. A command being available is not evidence that it passed in your environment.

Product screen
Release verificationThe release view shows required gates to run; it does not pre-label them as passed.Release verificationserverRUNTIMEPHP 8.4SOURCE GATESRun locallyOUTCOMEEvidence-basedLIVE WORKSPACE VIEWRequired extensionsCheck before the suiteGatePHP syntax sweepAll project PHP filesGateAI evaluation and PHPUnitRun when dependencies are presentGateStatic and browser checksRun when configuredGate1RUN THE CHECKSCapture the actual output2FIX EVERY REQUIRED FAILUREDo not replace evidence with assumptions3TEST THE PRODUCTVerify real user journeys
The release view shows required gates to run; it does not pre-label them as passed.

Source and release gates

Run the repository checks from the installation root and keep their complete output with the release record.

Primary preflight gate
php tools/preflight.php
Extended release gate
php tools/release_gate.php

The preflight checks the PHP 8.4 runtime and required extensions, performs a PHP syntax sweep, runs the AI evaluation ship gate and full PHPUnit suite, and runs PHPStan/Node checks when those tools are installed. The extended gate also includes smoke, clean-install/schema and browser end-to-end checks when their environment is configured.

A skipped check is not a pass. Record why it was unavailable, install the missing dependency or run it in the correct CI/staging environment before release.

Product checks

1. Authentication and roles

Sign in as each intended role; verify allowed and denied pages/actions.

2. Widget and tracking

Load a real site in a private browser; verify beacon traffic, Live Feed, visitor and session records.

3. Chat and AI

Ask representative questions; verify knowledge grounding, safety, escalation and AI history.

4. Tickets

Create, assign, reply, escalate, close and reopen through every enabled intake path.

5. Email

Test outbound delivery and each configured inbound mailbox or webhook path.

6. CRM and analytics

Create a controlled contact/deal/conversion and verify dashboards, funnels, scoring and reports.

7. Connectors

Run connection tests, one read, one safe write/dry run and webhook/polling paths for each enabled connector.

8. API and webhooks

Verify narrow scopes, rate limits, idempotent retries, signatures and duplicate handling.

9. Cron

Run the unified product scheduler and confirm all required heartbeats in Cron Setup/Diagnostics.

10. Security

Verify 2FA, CSRF/session controls, audit entries, key revocation and workspace isolation.

11. Backup and restore

Restore a current backup into a separate test environment and verify data and configuration.

12. Observability and rollback

Confirm logs/alerts, preserve request IDs and prove the rollback procedure.

⚠️
Deploy only after every required gate and business-critical journey has current evidence for the exact release and environment.
Developer

Web Push on third-party sites

Browser push notifications — including OpsIQ Push Campaigns — need a service worker served from the SAME ORIGIN as the page. The OpsIQ widget loads from your OpsIQ deployment, so a third-party site cannot register OpsIQ's worker directly. Host one small file on the site's own domain to enable push there. Campaigns deliver through BOTH supported methods.

How it works
Web pushAn OS-style push notification above two delivery method cards: Built-in VAPID and Pusher Beams.Your storeYour cart is waiting — 10% off todaynowBuilt-in (VAPID)No third partyHost one filePusher BeamsUse your accountHost the worker
Web push

Why this is needed

Browsers only let a page register a service worker from its own origin. The widget loads cross-origin from your OpsIQ deployment, so it cannot install the push worker on a customer site — until you host the worker on that site's origin, the widget silently skips push (no error, no subscription). You have two options below; OpsIQ Push Campaigns publish through both.

Option A — Self-hosted Web Push (VAPID, no third party)

1. Download the worker from your OpsIQ deployment: https://YOUR-OPSIQ/opsiq/opsiq-push-sw.js

2. Upload it to your web root so it is reachable at https://yoursite.com/opsiq-push-sw.js. The widget auto-detects this path on the page's own origin and registers it — no snippet change needed. (It uses a narrow scope, so it never replaces a service worker you already run.)

Optional: if you must host it at a non-standard path, point the widget at it before the snippet — it is only accepted when same-origin:

Optional — only if the file is NOT at the web root
<script>window.OpsIQ=window.OpsIQ||{};window.OpsIQ.pushSwUrl="/custom/opsiq-push-sw.js";</script>

3. In OpsIQ, generate VAPID keys (Settings → Client Chat AI → Advanced → Web Push). The widget then asks visitors for notification permission and subscribes them.

Behind a CDN/Cloudflare? Make sure /opsiq-push-sw.js returns HTTP 200 (purge the cache if it was 404 before you uploaded — a cached 404 will block registration).

Option B — Pusher Beams (managed provider)

1. In OpsIQ settings set the push provider to Pusher Beams and enter your Beams Instance ID and Secret Key.

2. Host the Beams service worker on the site's root as /service-worker.js. Copy https://YOUR-OPSIQ/opsiq/pusher-beams-service-worker.js, or merge this line into your existing root worker:

Beams worker — host at https://yoursite.com/service-worker.js
importScripts("https://js.pusher.com/beams/service-worker.js");

3. That's it. The widget auto-loads the Beams SDK and subscribes each visitor to the per-site interest opsiq-site-<your-site-key>. No other wiring needed.

How campaigns deliver

Push Campaigns publish through both methods at once: visitors on the self-hosted VAPID worker get the encrypted Web Push, and visitors subscribed via Pusher Beams get the Beams publish. Each visitor is reached through whichever they subscribed to, so you can run same-origin VAPID on some sites and cross-origin Beams on others.

HTTPS is required for service workers and Web Push (localhost is exempt for testing). The admin chat inbox already uses the same Beams interest mechanism for operator alerts.

Operations

Troubleshooting

Common issues and how to fix them.

General

Blank page+

Check PHP error logs. Causes: old PHP (need 8.4+), missing extension, DB connection failed, wrong file permissions.

Dashboard shows zeros+

Check: widget installed? Cron running? Date range correct? IP excluded?

AI

AI does not respond+

Check: provider configured? API key valid (use Test connection)? Budget exhausted? Workspace AI config correct?

AI gives wrong answers+

Check: knowledge base up to date? Prompt clear? Connector lookups returning correct data? Review conversation in AI History.

AI is slow+

Depends on: provider API speed, context size (large KB = more tokens = slower), network latency. Try a faster model.

Tracking

Widget missing+

Check: script in page source? JS errors in console? CSP blocking? Ad blocker?

Unknown country+

GeoIP not configured. Use Cloudflare (automatic) or MaxMind GeoLite2 database.

Tickets

Emails not creating tickets+

Check: mailbox connected? Cron running? App password changed? IMAP settings correct?

Auto-reply not working+

Check: enabled? Department allowed? AI configured? Cron running? Human replied first?

Connectors

Connection failed+

Check: credentials correct? Key expired? API accessible from server? Base URL correct?

Connected but no data+

Check: API key scopes? Webhook sync enabled? Cron running?

Performance

Slow pages+

Check: database performance (SHOW PROCESSLIST), PHP memory (increase to 1GB), enable opcache, reduce retention period.

Operations

Widget not logging visits

Use this focused check when the widget loads incorrectly or Live Feed stays empty.

When the widget is not logging visits, verify the site key, load the page in a private browser, check the browser Network/Console panels for blocked beacon or widget requests, review Content-Security-Policy and ad blockers, confirm the site is active in OpsIQ, and open Diagnostics. A visible chat bubble does not by itself prove that the analytics beacon was accepted.

Reference

Glossary

Definitions for terms used throughout OpsIQ.

Action

Something the AI can do through a connector or the platform.

Agent

A team member with limited access, or an AI agent.

BYOK

Bring Your Own Key — you provide your own AI API key.

Connector

A plugin integrating an external platform with OpsIQ.

CSAT

Customer Satisfaction score.

Deal

A revenue opportunity in the CRM.

Department

A ticket category for routing and access control.

Escalation

Moving a ticket to a different department or from AI to human.

GeoIP

Visitor location detection from IP address.

Handoff

Transferring a conversation from AI to human.

Identity token

Signed token identifying a website visitor.

Knowledge base

Articles the AI uses to answer questions.

Lead

A visitor showing buying intent.

Lead score

0-100 number indicating conversion likelihood.

Lifecycle stage

Where a customer is: Lead, Prospect, Customer, At Risk, Churned.

Managed AI

AI provided as part of your OpsIQ plan.

Pipeline

Visual board of deal stages.

RBAC

Role-Based Access Control.

Session

A series of page views within a timeout window.

Site key

Unique identifier for a tracked website.

SLA

Service Level Agreement — target response times.

Token

Unit of AI text. Roughly 4 characters = 1 token.

Trust Layer

Safety system controlling AI autonomy.

Webhook

HTTP callback for event notifications.

Widget

JavaScript code embedded on your website.

Workspace

A site with its own tracking, AI, connectors, and team. Same as "site."

Reference

Get more help

If this documentation does not answer your question:

Admin AI

Click "Ask OpsIQ" in the admin. Has access to this documentation and your platform data.

Support ticket

Include: what you tried, what happened, what you expected, and any error messages.

Email

Email support with your license key and issue description.

Tips for effective support requests

Include the page

Which admin page (URL or name).

Include the setting

Exact setting name and current value.

Include the error

Exact error message with codes.

Include the steps

What you did, step by step.

Include expected vs actual

What should happen vs what did happen.

💡
The more specific your request, the faster the answer. "It does not work" requires investigation. "Clicking Save on AI Configuration gives error code 502" gets a direct answer.