KnowDesk: AI Customer Support Platform with 300+ Agents
KnowDesk is more than a knowledge base chatbot - it is an AI customer support platform with 300+ purpose-built agents. Connect your docs (Google Docs, PDFs, Notion, Confluence, plain text) and deploy a branded AI widget in minutes. Support Agents handle WISMO queries, returns, and carrier claims. Brand Agents review ad copy, listings, and content for brand consistency. Retention Agents run abandoned cart flows, winback campaigns, and VIP segmentation. Mission Control aggregates GA4, Stripe, and Gorgias into one view with anomaly alerts. When a conversation needs a human, agents reply from the Live Inbox. When a customer asks about an order, the AI looks it up live.
This guide covers every feature - from your first widget deploy to configuring agents, Mission Control, QA Reviews, Vertical AI, and the Partner Integration API. Follow sections in order for your first setup, or jump using the left navigation.
Getting Started#
Follow these four steps to go from signup to a live widget on your website.
</body> tag on any page. That's it - your widget is live.Knowledge Base#
The knowledge base is the foundation of your AI support bot. KnowDesk is a knowledge base chatbot - it only answers from what you connect here, never from general internet knowledge. The more structured your content, the more accurate the answers.
Supported source types#
Adding a Google Drive source#
To connect a Google Doc:
- Go to Knowledge Base in your dashboard
- Click + Add Source
- Select Google Drive
- Give the source a descriptive name (e.g. "Operations SOP")
- Open your Google Doc and copy the file ID from the URL:
docs.google.com/document/d/FILE_ID/edit - Paste the file ID into the field and click Add Source
- Click Sync - the source status changes to SYNCED within a few seconds
Connecting ClickUp#
KnowDesk can read your ClickUp Spaces, Docs, and Chat channels as knowledge sources. Connect via OAuth - no API key needed.
- Spaces - all tasks and content within a space
- Docs - individual ClickUp document pages
- Chat channels - message history from a ClickUp Chat channel
Syncing sources#
Connected sources that read a live copy - Google Docs, websites, sitemaps, help centres, GitHub and Airtable - re-sync on their own every few hours. Manual text, PDFs, videos, Notion, Confluence and ClickUp don't, so click the ⟳ Sync button after editing one of those, or to pull any change in right away. Syncing typically takes 2–10 seconds depending on document size.
Plan limits#
| PLAN | KNOWLEDGE SOURCES |
|---|---|
| Starter | 1 source |
| Growth | 10 sources |
| Scale | 25 sources |
| Enterprise | Unlimited |
Video Knowledge Base#
Upload your tutorial videos, product walkthroughs, onboarding recordings, or any audio content and KnowDesk automatically transcribes the content using AI. The transcript is indexed with timestamps, so the AI can reference the exact moment where relevant content appears - and users see clickable time links in the widget to jump directly to that point.
How it works#
[2:14] Your content here. The source status changes to synced and the AI can immediately answer questions from the video.Timestamp links in the widget#
When the AI answers a question from a video source, it includes the timestamp of the relevant moment - for example: "As shown at [2:14], you connect your account by clicking Settings → Integrations."
Users see a clickable chip below the answer that reads ▶ 2:14. Clicking it opens the video at that exact moment in a new tab. No extra setup needed - this works automatically for any synced video source.
Supported file formats#
| FORMAT | TYPE | NOTES |
|---|---|---|
| MP4 / MOV | Video | Most common. Works with screen recordings, Loom exports, YouTube downloads. |
| WebM / MKV | Video | Browser-recorded video. Works with most recording tools. |
| MP3 / M4A | Audio | Ideal for podcast-style onboarding recordings or audio-only walkthroughs. |
| WAV / OGG | Audio | Uncompressed audio. Large files - use MP3 for smaller uploads. |
Widget Configuration#
The Widget Config page controls everything your users see - brand name, colour, welcome message, tone, and suggested prompts. Changes save immediately and take effect on your live widget without any redeployment.
Brand settings#
AI behaviour#
Tone - Controls how the AI writes responses:
- Casual - Clear, direct, and conversational. Sounds like a knowledgeable teammate.
- Formal - Complete sentences, professional language, structured responses.
- Technical - Assumes domain knowledge, uses precise terminology.
Suggested Prompts - Up to 4 quick-start buttons shown in the widget before the user types. Enter one per line. Example: "How do I escalate a client issue?" or "What is our refund policy?"
Dark / Light mode#
Toggle whether the widget renders in dark or light mode. This affects only the widget appearance - not your dashboard. Choose whichever matches your website's background.
Voice AI - Phone Support#
Voice AI gives your business a dedicated phone number answered by a real-time AI agent - not a menu tree, an actual conversation. It automatically inherits the same knowledge base, brand tone, and Vertical AI tools you already configured in Widget Config, so there's nothing to rebuild - just a number to turn on.
1. Get a phone number#
Open Dashboard → Voice AI. The Numbers panel lets you provision a number two ways:
Once a number is active, assign it to the widget whose knowledge base and Vertical AI setup should answer those calls. If you run multiple widgets, use the Widget selector at the top of the settings panel to switch between them.
2. Configure the caller experience#
Thanks for calling {{brand_name}} - how can I help?. The {{brand_name}} placeholder pulls from your widget's brand name automatically.alloy) and a Language. Leave language on Auto-detect to let the AI follow whatever language the caller speaks - it switches fluidly mid-call without ever asking the caller to pick from a menu.Settings reference#
| Field | Type | Required | Description |
|---|---|---|---|
voice_greeting_script | string | No | Opening line spoken when the call connects. Supports the {{brand_name}} placeholder. |
voice_tts_voice_id | string | No | Text-to-speech voice, e.g. alloy. Defaults to alloy. |
voice_language | string | No | auto, or an ISO code (en, es, fr, pt, de). auto follows whatever the caller speaks. |
voice_max_call_duration | number | No | Hard cap on call length, in seconds. Defaults to 600. |
voice_forward_number | string | No | E.164 phone number for live warm transfer, e.g. +1 415 555 0100. |
voice_after_hours_action | string | No | voicemail or forward - what happens on a transfer attempt outside your team's hours. |
voice_collect_name / _email / _phone | boolean | No | Which caller details the AI actively asks for and saves. |
Minutes, wallet, and overage#
The top of the Voice AI page shows three live numbers: minutes used this billing cycle, minutes included on your plan, and your prepaid wallet balance. When included minutes run out mid-cycle, calls continue drawing from the wallet rather than cutting off - top it up any time from the Buy Minutes panel.
Call log#
Every call is logged with its transcript, duration, and outcome - resolved by AI, transferred to a human, or escalated. Missed calls that couldn't be answered live appear in the callback queue so your team can follow up.
Embed the AI Chat Widget on Your Website#
Your embed code is a single script tag. It's the easiest way to embed an AI chat widget on any website - Webflow, WordPress, Shopify, Next.js, or plain HTML. Copy it from Widget Config → Embed Code and paste it before </body>.
<script
src="https://knowdesk.io/widget.js"
data-key="kd_live_your_api_key_here">
</script>Where to paste it#
Paste the script tag just before the closing </body> tag on every page you want the widget to appear.
<!DOCTYPE html>
<html>
<head>
<title>Your Website</title>
</head>
<body>
<!-- Your website content -->
<!-- KnowDesk Widget - paste here -->
<script
src="https://knowdesk.io/widget.js"
data-key="kd_live_your_api_key_here">
</script>
</body>
</html>Works on any platform#
Mobile apps: the Android and iOS SDK#
Put your support chat inside your own Android and iOS apps. It's the same chat as your website widget - AI answers from your knowledge base, hand-over to live agents, tickets, ratings, attachments, transcripts and browser calls - shown full-screen, plus push notifications when an agent replies. New widget features reach your app without an app update.
| Android | iOS | |
|---|---|---|
| Package | io.knowdesk:knowdesk-android | KnowDesk (Swift Package or CocoaPods) |
| Minimum version | Android 6.0 (API 23) | iOS 13 |
| Push notifications | Firebase Cloud Messaging | Apple Push Notifications (or Firebase) |
| Size | No third-party dependencies beyond AndroidX | No dependencies (UIKit + WebKit) |
Before you start#
Android#
dependencies {
implementation("io.knowdesk:knowdesk-android:1.0.0")
}class MyApp : Application() {
override fun onCreate() {
super.onCreate()
KnowDesk.init(this, "kd_live_your_api_key")
}
}
// e.g. in your Help screen
helpButton.setOnClickListener { KnowDesk.open(this) }Push notifications on Android use your app's own Firebase project. Pass the token to KnowDesk and forward messages that arrive while the app is open:
FirebaseMessaging.getInstance().token.addOnSuccessListener { KnowDesk.setPushToken(it) }
class MyMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) = KnowDesk.setPushToken(token)
override fun onMessageReceived(m: RemoteMessage) {
if (KnowDesk.handlePush(this, m.data, m.notification?.title, m.notification?.body)) return
// ...your own messages
}
}
// Your launcher activity: a tapped reply notification opens the chat
override fun onCreate(savedInstanceState: Bundle?) { /* ... */ KnowDesk.handleIntent(this, intent) }
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent); KnowDesk.handleIntent(this, intent) }
// Android 13+: ask at a moment that makes sense, e.g. after the first chat
KnowDesk.requestNotificationPermission(activity)iOS#
In Xcode choose File → Add Package Dependencies… and enter https://github.com/knowdesk/knowdesk-ios, or add pod 'KnowDesk' to your Podfile.
import KnowDesk
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
KnowDesk.configure(apiKey: "kd_live_your_api_key")
return true
}
// e.g. in your Help screen
KnowDesk.present(from: self)Add these to Info.plist so customers can attach photos and make browser calls from the chat:
| Key | Example text |
|---|---|
NSMicrophoneUsageDescription | Talk to our support team from the chat. |
NSCameraUsageDescription | Send a photo to our support team. |
NSPhotoLibraryUsageDescription | Attach a photo to your support chat. |
// after the user allows notifications
UIApplication.shared.registerForRemoteNotifications()
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken token: Data) {
KnowDesk.setPushToken(token) // or KnowDesk.setFirebaseToken(fcmToken) if you use Firebase on iOS
}
// UNUserNotificationCenterDelegate
func userNotificationCenter(_ c: UNUserNotificationCenter, willPresent n: UNNotification,
withCompletionHandler done: @escaping (UNNotificationPresentationOptions) -> Void) {
done(KnowDesk.shouldPresentInForeground(n.request.content.userInfo) ? [.banner, .sound] : [])
}
func userNotificationCenter(_ c: UNUserNotificationCenter, didReceive r: UNNotificationResponse,
withCompletionHandler done: @escaping () -> Void) {
KnowDesk.handleNotificationTap(r.notification.request.content.userInfo) // opens the chat
done()
}Signed-in users#
When your app knows who the customer is, tell KnowDesk. Their chat history then follows them to every phone, they're never asked for their name and email, and agents see who they are. To stop anyone pretending to be another user, your server signs the user id with the widget's identity secret (HMAC-SHA256, hex) and the app passes that signature on. Never put the secret in the app.
// Android
KnowDesk.identify(user.id, userHashFromYourServer, user.name, user.email)
// iOS
KnowDesk.identify(userId: user.id, userHash: userHashFromYourServer, name: user.name, email: user.email)
// on sign-out (forgets the chat on this device, stops its notifications)
KnowDesk.logout()// Node.js
const userHash = crypto.createHmac("sha256", process.env.KNOWDESK_IDENTITY_SECRET).update(String(user.id)).digest("hex");
// PHP
$userHash = hash_hmac("sha256", (string) $user->id, getenv("KNOWDESK_IDENTITY_SECRET"));
# Python
user_hash = hmac.new(os.environ["KNOWDESK_IDENTITY_SECRET"].encode(), str(user.id).encode(), hashlib.sha256).hexdigest()Push notifications#
When an agent replies in the Live Inbox, KnowDesk sends the notification with your app's own push keys, so it carries your app's name and icon. Add them in Widget Config → Mobile apps:
| Service | What to add | Where to find it |
|---|---|---|
| Firebase Cloud Messaging | The service-account JSON file | Firebase console → Project settings → Service accounts → Generate new private key |
| Apple Push Notifications | Key ID, Team ID, Bundle ID and the .p8 key | Apple Developer → Certificates, IDs & Profiles → Keys → + (Apple Push Notifications service) |
Open the chat once in your app with notifications allowed, then use Send a test notification. For iOS development builds, tick Development builds (sandbox); untick it for TestFlight and the App Store.
Unread badge and events#
// Android
KnowDesk.listener = object : KnowDeskListener() {
override fun onUnreadCountChanged(count: Int) { helpBadge.isVisible = count > 0 }
override fun onError(message: String) { Log.w("KnowDesk", message) }
}
// iOS - class MyHelp: KnowDeskDelegate { func knowDesk(unreadCountChanged count: Int) { ... } }
KnowDesk.delegate = selfWhite-label partners#
If your clients use your own domain, load the chat from it so your brand is used throughout: KnowDeskOptions(baseUrl = "https://help.yourdomain.com") on Android, KnowDeskOptions(baseURL: URL(string: "https://help.yourdomain.com")!) on iOS.
Analytics#
The Analytics page gives you a unified view of all support activity across every channel - AI widget conversations, escalated tickets, live agent replies, and inbound email threads - in one dashboard.
Key metrics#
Channel breakdown#
The channel breakdown shows how support volume is split between the widget, email inbound, and agent-handled conversations. Use this to understand which channels your customers prefer and where to focus knowledge base improvements.
Conversation history#
Every conversation is logged and viewable in full - widget chats, agent replies, and email threads all in one place. Click any row to expand it and read the full exchange. Filter by status (open / resolved / escalated) or by source (widget / email).
Escalation & Ticketing#
When the AI can't fully resolve a conversation, KnowDesk automatically escalates it - creating a ticket in your helpdesk provider, populating it with the full conversation, and syncing its status back to your dashboard in real time. No copy-paste, no manual triage.
How escalation works#
Tickets dashboard#
All escalated conversations appear in your Tickets dashboard. You can filter by status (open, pending, resolved, closed), date range, and provider. Click any row to read the full conversation transcript and see the AI-generated subject and priority.
AI-powered ticket enrichment#
Per-widget configuration#
On Growth plans and up, each widget can have its own escalation destination. For example, your Sales widget can escalate to Freshdesk while your Support widget escalates to Zendesk. Configure this in Widget Config → Escalation.
Two-way status sync#
KnowDesk automatically polls Freshdesk, Zendesk, Intercom, and Zoho Desk for ticket status changes and mirrors them in your Tickets dashboard. Click ⟳ Sync Status at any time for an immediate refresh.
Custom webhook#
The webhook destination sends a POST request to any URL you configure whenever a ticket is created or updated.
{
"event": "ticket.created",
"ticket_id": "kd_tk_abc123",
"subject": "Can't access my account after password reset",
"priority": "high",
"status": "open",
"user_name": "Jane Smith",
"user_email": "[email protected]",
"description": "User: I've been locked out...
AI: Let me help...",
"created_at": "2026-06-06T12:34:56Z",
"widget_id": "wdg_abc123",
"company_id": "cmp_xyz456"
}Live Agent Inbox#
The Live Agent Inbox lets your team reply to widget conversations in real time, directly from the KnowDesk dashboard. When a conversation is escalated - either because the customer asked to speak to a human, or because the AI could not find an answer - it lands in the Live Inbox and your agents can take over instantly.
Replies appear in the customer's chat widget immediately. No separate live chat tool, no new tab, no copy-pasting between systems.
How it works#
Refresh rate#
The conversation list refreshes automatically every 15 seconds. When you have a conversation open, the message thread refreshes every 6 seconds to pick up new customer messages without you having to do anything.
Sources#
The Live Inbox shows conversations from two sources - widget (escalated chat conversations) and email (inbound email tickets). Each conversation shows a source label so your agents can tell at a glance which channel they are handling.
To ask a teammate for help on a conversation, coach an agent with whispered replies, or call the customer - free in the browser or on their phone - see Huddle.
Huddle: Team Chat & Calls#
Huddle puts team chat, voice calls and customer calling inside the Live Inbox, so an agent never leaves a conversation to get help, talk a problem through with a colleague, or speak to the customer. Open it with the Huddle button at the top of the Live Inbox.
Team chat#
- Team channel and direct messages
- One channel for the whole workspace plus one-to-one messages, with unread counts, @mentions and presence: online, busy, away or on a call.
- Get help
- On any conversation, Get help opens a team thread linked to it, with a 3-line AI summary of the chat (who the customer is, the issue, what was tried). Whoever joins becomes a collaborator and is shown in the conversation header. The customer sees nothing.
- Whisper replies
- Owners, admins and QA leads watching a live chat can draft a reply only the agent sees. The agent inserts it with one click, edits it if needed, and sends it as their own.
- @KnowDesk
- Ask @KnowDesk a question in any thread - for example “what is our refund policy for sale items?” - and it answers from the workspace's knowledge base.
- Translation
- Team messages can be shown in each reader's dashboard language.
- Notifications
- In-app, desktop and sound alerts for mentions, help requests and calls. Do not disturb silences all of them.
When a conversation is resolved or closed, its help threads are marked solved. QA reviewers see the help threads and who joined, whispered or called on the conversation's review page (hidden in blind reviews).
Calls between teammates#
Start a free voice call from a direct message, a help thread or the Team channel. Calls run in the browser - there are no call charges - with mute, screen share, microphone and speaker choice, a call-quality indicator and a speaking ring on each person. A call keeps going while you move between dashboard pages. Ringing reaches teammates on any dashboard page; unanswered calls show a missed-call notice, and the thread gets a call log line with who joined and for how long.
Choosing the call engine#
In Widget Config → Calls (Huddle), owners and admins choose the engine for each widget's calls:
| Engine | What it is | Set-up |
|---|---|---|
| Cloudflare Calls (default) | Managed by KnowDesk, with a built-in relay (TURN) for strict office networks. | Nothing to set up. |
| LiveKit | Your own LiveKit server or LiveKit Cloud. | Server URL (wss://…), API key and API secret. The secret is stored encrypted and never shown again. |
Use Test connection to check the choice. Saving LiveKit details while Cloudflare is selected keeps them as a fallback: if a call can't connect, it offers to move everyone to the other engine. Tick Use for team calls on the widget whose engine staff-to-staff calls should use.
Calling customers#
Open a conversation in the Live Inbox and choose 📞 Call in its header.
Voice AI hand-over to an agent's browser#
Agents who switch on Take phone calls in this browser in the Huddle panel receive Voice AI hand-overs: when the AI decides a caller needs a person, it rings an online agent's browser with the AI's briefing on screen, before trying your forwarding number. The tab needs to stay open to receive calls.
AI on calls, recording and consent#
| Setting (Widget Config → Calls with customers) | What it does | Default |
|---|---|---|
| Live transcript, suggested answers and call summary | Transcribes both sides as people speak, suggests answers from your knowledge base on the agent's screen, and after the call saves a summary and a QA score to the conversation as an internal note. | On |
| Record calls | Records both sides. Owners, admins, QA and the agents on the call can play recordings from the conversation's call history and the QA review page. | Off |
| Keep recordings (days) | Recordings are deleted automatically after this many days (1-365). | 30 |
| Call links expire after (minutes) | How long an unopened call link stays valid (5-1440). | 30 |
Nothing is recorded or transcribed until the customer agrees. On a browser call they answer a question on the call page; on a phone call a spoken notice plays when they answer and the agent confirms the reply. If the customer says no, the call goes ahead without recording or transcript, and the conversation shows “Not recorded”.
Omnichannel - WhatsApp, Messenger, Instagram, Slack & Telegram#
Omnichannel lets customers reach you on the messaging apps they already use - WhatsApp Business, Facebook Messenger, Instagram, Slack, and Telegram - while your team answers everything from the single Live Agent Inbox. Inbound messages land in the same place as widget chats and email tickets, and every reply your team sends routes back automatically to the exact channel the customer wrote from - just like email. There is also a hosted WebChat page you can share as a plain link, with nothing to embed.
How it works#
Supported channels#
Email is also a channel in the same inbox - see Email Inbound for its setup.
Connecting a channel#
Every channel is configured per widget. Open Dashboard → Widgets → your widget → Omnichannel, then connect the channels you want. Connect once and the channel works everywhere that widget is embedded.
Telegram
- In Telegram, open @BotFather and send
/newbot. Give the bot a name and username. - BotFather replies with an HTTP API token (looks like
123456:ABC-DEF...). Copy it. - In the KnowDesk Omnichannel card, click Connect next to Telegram.
- Paste the token and click Connect. KnowDesk registers the webhook and shows the bot username as the connection label.
WhatsApp, Messenger & Instagram (via Facebook)
- In the Omnichannel card, click Connect via Facebook.
- Sign in with the Facebook account that manages your Page / WhatsApp Business account and grant the requested permissions.
- Back in KnowDesk, choose which assets to attach to this widget: a Facebook Page for Messenger, an Instagram account, and/or a WhatsApp number.
- Click Confirm. KnowDesk subscribes each channel's webhook and the rows show as connected.
Slack
- Click Connect next to Slack in the Omnichannel card.
- Authorize the KnowDesk app in your Slack workspace and pick the channel to link.
- Messages posted in that channel become conversations in the Live Inbox; agent replies post back into the same Slack thread.
Hosted WebChat
- Click Enable next to WebChat.
- KnowDesk generates a public page at
knowdesk.io/chat/your-slug. - Share that link anywhere - an email signature, a QR code, a social bio, a support article. No website or embed code required.
How replies route back#
KnowDesk records the origin channel on every conversation. When the AI or an agent sends a message, it is delivered back through that same channel using the stored credentials - Messenger replies go to Messenger, Telegram replies go to Telegram, and so on. If a provider rejects a delivery (for example, WhatsApp's 24-hour customer-service window has closed), the failure is surfaced in the Live Inbox rather than failing silently.
Benefits#
- One inbox for everything - agents handle every channel in one screen, with no app-switching and no lost context.
- The same AI on every channel - knowledge-base answers, order lookup, escalation, and QA reviews all work identically no matter where the customer wrote from.
- No friction for customers - people stay in the app they already use and get replies there natively.
- Per-widget control - connect a channel to one widget or brand without affecting any other widget.
- Full history and analytics - every channel conversation is logged, searchable, and included in analytics with a per-channel breakdown.
Order Lookup - Stripe, Shopify & Paystack#
Connect your payment processor or e-commerce store and the AI widget will be able to look up order and payment details directly in the chat. When a customer asks "where is my order?" or "was my payment processed?", the AI queries your connected platform in real time and shares the details - no human needed.
Connecting a platform#
- Go to Commerce Integrations in your dashboard navigation
- Click Connect next to the platform you want to add
- Enter your API credentials:
- Stripe - Secret Key (starts with
sk_live_) - Shopify - Store domain (e.g.
mystore.myshopify.com) + Admin API token - Paystack - Secret Key (starts with
sk_live_)
- Stripe - Secret Key (starts with
- Click Save. KnowDesk stores credentials encrypted and uses them for order lookups only.
How order lookup works in the chat#
Once connected, the AI automatically detects when a customer is asking about an order or payment. It then:
Security#
Your API credentials are stored encrypted in KnowDesk's secure storage. They are never exposed to the customer, logged in conversation history, or returned in any widget response. The lookup happens server-side on your Cloudflare Worker.
Email Inbound - Support Emails as Tickets#
Email Inbound automatically converts every email your customers send to your support address into a ticket in the KnowDesk dashboard. The sender gets an instant acknowledgement. Your team handles everything from the Live Inbox. Nothing gets lost.
Your inbound address#
Each widget has a unique inbound address in this format:
inbound+{your_widget_api_key}@knowdeskio-workers.comFind your full inbound address in Integrations → Email Inbound in your dashboard.
Setting up forwarding#
What happens when an email arrives#
Workflow Automation#
Workflows let you automate support processes without code. Each workflow starts from a trigger - a chat intent, a live-call event, a QA outcome, a resolved conversation, or a manual run - then walks through paths of steps on a visual canvas, branching on any field the trigger or an earlier step produced. Steps call ready-made blocks: order lookups, returns, tickets, win-back emails, SLA checks, warm call transfers, custom webhooks and more.
You’ll find everything under Dashboard → Workflows, which has three tabs: Rules, Block Library and My Workflows.
Example · Refund request from chat
- TriggerChat intent · Return request
- ActionLook up order status
- Branchfound = true?
- YesActionStart a return / RMA
- ElseActionCreate a ticket for a human
Core concepts#
- Trigger
- What starts a run: a chat intent rule, a live-call event, a QA outcome, a resolved conversation, or a manual/test run.
- Path
- A box on the canvas holding an ordered list of steps. Every workflow has one entry path where the run begins.
- Step
- Either an action (calls a block) or a delay (waits up to 10 minutes). Steps in a path run top to bottom.
- Branch
- A connection from one path to the next. It can carry a condition, or be the “else” branch used when no condition matches.
- Block
- A reusable action from the Block Library - 42 blocks across 11 categories, each available on specific plans.
- Run
- One execution of a workflow. Every run is recorded with the status and output of each step.
The three tabs#
| Tab | What it's for |
|---|---|
| Rules | The six chat-intent rules that detect what a customer is asking - order status, returns & refunds, carrier claims, address changes, wholesale inquiries and frustration/escalation. Each rule has editable trigger phrases (with * wildcards) you can tune or reset to defaults, plus a feed of recent activity. |
| Block Library | Every action a workflow can call, grouped by category, with a clear note of which plan each one needs. |
| My Workflows | Create workflows from a template or from scratch, build them on the canvas, test them safely, take them live and review their run history. |
Triggers#
| Trigger | Fires when | Options |
|---|---|---|
| Chat intent | A customer message matches one of your Rules | Order status question · Return request · Carrier claim · Address change · Wholesale inquiry · Frustrated / escalation |
| Live call event | Something happens on a Voice AI call | Call answered · ID verification passed or failed · Call running long · Voicemail reached |
| QA outcome | A QA review reaches an outcome | Review auto-fails |
| Conversation resolved | A conversation is marked resolved | - |
| Manual | You run it yourself from the dashboard | Ideal for testing or one-off jobs |
| Good to know | |
|---|---|
| Chat rules cover every chat channel | Website widget, WhatsApp, Messenger, Instagram, Slack, Telegram - and new inbound emails, which are checked against the same rules. |
| Once per conversation | A workflow runs at most once per conversation, so a customer repeating themselves doesn’t trigger it again and again. |
| Manual means manual | A Manual workflow never runs on its own and receives no conversation data - pick a trigger under “Name, status & trigger” for it to run on real chats or calls. |
| Change the trigger any time | Use the “Runs when” picker on the workflow - no need to rebuild it. |
Build your first workflow#
{{field}} placeholders - they’re filled in from the trigger and earlier steps when the workflow runs.Branches and conditions#
When a path finishes its steps, its branches are checked in order. The first branch whose condition matches wins; if none match, the else branch is used; if there’s no else branch, the run ends. A path can have any number of branches (switch/case style), and several branches can lead back into the same path.
| Operator | Matches when |
|---|---|
equals | The field's value equals the value you enter (compared as text). |
not_equals | The field's value is anything other than the value you enter. |
exists | The field has a value (not empty, null or missing). |
not_exists | The field is empty, null or missing. |
contains | The field is text that includes your value - case-insensitive. |
Conditions can read nested fields with dot paths, for example order.status or summary.total_conversations. The field picker suggests every output a block really returns, and where a field has known values (such as true / false), those are suggested too.
Templating with {{field}}#
Any text setting can include placeholders. When the step runs, each {{field}} is replaced with that value from the trigger or an earlier step - dot paths work here too. If a value doesn’t exist, the placeholder is left as-is so you can spot it in Run history.
Hi {{customer_name}}, your order {{order.id}} is {{order.status}}.
We've opened ticket {{ticket_id}} and will update you within 24 hours.Built-in fields reference#
Every run carries a context: the fields its trigger supplies, plus everything each block returns as it finishes. Branch conditions and {{field}} placeholders read from it. These are the fields you can rely on.
From the trigger
Chat intent - widget, WhatsApp, social and inbound email:
| Field | What it means | Values / example |
|---|---|---|
conversation_id | The conversation that matched the rule. Steps use it to read the chat and update it. | e.g. 3f2a9c1e-… |
channel | Where the chat came from — branch on it to route by source. | widget · email · whatsapp · messenger · instagram · slack · telegram · voice |
message | The customer message that matched the rule (for email: the email body). | e.g. Where is my order? |
matched_text | The text or phrase that matched the rule. | e.g. where is my order |
trigger | Which chat rule fired. | wismo · returns · claims · edit · wholesale · urgency |
customer_email | The customer’s email, when the conversation has one. | e.g. [email protected] |
email | Same as customer_email — some blocks (e.g. order lookup) read this name. | e.g. [email protected] |
customer_name | The customer’s name, when known. | e.g. Jane Smith |
Live call event (Voice AI):
| Field | What it means | Values / example |
|---|---|---|
call_id | The Voice AI call that raised the event. | e.g. call_7c21… |
to | The caller’s phone number — used by Send a follow-up SMS. | e.g. +15555550123 |
customer_email | The caller’s email, when identified. | e.g. [email protected] |
customer_name | The caller’s name, when identified. | e.g. Jane Smith |
result | Only on “ID verification passed or failed”: the outcome of the check. | e.g. passed |
QA outcome:
| Field | What it means | Values / example |
|---|---|---|
review_id | The review that auto-failed — Flag for coaching and Notify the QA manager use it. | e.g. rev_31c8… |
conversation_id | The conversation that was reviewed. | e.g. 3f2a9c1e-… |
agent_name | The agent whose conversation was reviewed. | e.g. Sam Rivera |
overall_score | The review’s overall score (0–100). | e.g. 41 |
Conversation resolved:
| Field | What it means | Values / example |
|---|---|---|
conversation_id | The conversation that was resolved. | e.g. 3f2a9c1e-… |
channel | Where the conversation came from. | widget · email · whatsapp · messenger · instagram · slack · telegram · voice |
customer_email | The customer’s email, when known. | e.g. [email protected] |
customer_name | The customer’s name, when known. | e.g. Jane Smith |
Manual:
A manual run supplies no fields - only what you enter in the test console’s Test data.
Channel values
| channel | Where the chat came from |
|---|---|
widget | Your website chat widget |
email | A new inbound email |
whatsapp | WhatsApp Business |
messenger | Facebook Messenger |
instagram | Instagram DMs |
slack | Slack |
telegram | Telegram |
voice | A Voice AI phone call |
From blocks (available after the step runs)
When a step finishes, its result merges into the context - a later step or branch can use these. Where a field only ever takes certain values, they’re listed (and the branch editor suggests them).
Support & Tickets
| Block | Field | What it means | Values |
|---|---|---|---|
| Look up order status | ok | Succeeded | true · false |
found | Order found | true · false | |
| File a carrier claim | ok | Succeeded | true · false |
status | Claim status | filed | |
platform_note_written | Platform note written | true · false | |
| Edit order address | ok | Succeeded | true · false |
updated | Address updated | true · false | |
| Start a return / RMA | ok | Succeeded | true · false |
status | Return status | approved · initiated | |
auto_approved | Auto-approved | true · false | |
| Route a wholesale inquiry | ok | Succeeded | true · false |
ticket_created | Ticket created | true · false | |
| Triage for escalation | ok | Succeeded | true · false |
decision | Decision | continue · escalate · priority_escalate | |
escalated | Escalated | true · false | |
priority | Priority | low · normal · high · urgent |
Email & Retention
| Block | Field | What it means | Values |
|---|---|---|---|
| Send welcome email | ok | Succeeded | true · false |
sent | Email sent | true · false | |
| Send cart recovery email | ok | Succeeded | true · false |
sent | Email sent | true · false | |
| Send post-purchase survey | ok | Succeeded | true · false |
sent | Email sent | true · false | |
| Send win-back email | ok | Succeeded | true · false |
sent | Email sent | true · false | |
| Score churn risk | ok | Succeeded | true · false |
risk_score | Risk score (0-100) | Text / number | |
risk_level | Risk level | low · medium · high | |
factors.days_since_last_purchase | Days since last purchase | Text / number | |
factors.order_count | Order count | Text / number | |
factors.total_spent | Total spent | Text / number | |
| Tag VIP customers | ok | Succeeded | true · false |
segment | Segment | VIP · Loyal · At Risk · Dormant · New | |
metrics.order_count | Order count | Text / number | |
metrics.total_spent | Total spent | Text / number | |
send_time_recommendation.time | Recommended send time | Text / number | |
| Review campaign performance | ok | Succeeded | true · false |
overall | Overall | on_track · needs_attention · underperforming | |
metrics.open_rate | Open rate % | Text / number | |
metrics.click_rate | Click rate % | Text / number | |
metrics.unsub_rate | Unsubscribe rate % | Text / number | |
benchmark_flags.length | Number of benchmark flags | Text / number |
Ops & Reporting
| Block | Field | What it means | Values |
|---|---|---|---|
| Pull performance snapshot | ok | Succeeded | true · false |
summary.total_conversations | Total conversations | Text / number | |
summary.team_csat_avg | Team CSAT average | Text / number | |
summary.agents_active | Active agents | Text / number | |
| Check SLA breaches | ok | Succeeded | true · false |
summary.total_checked | Conversations checked | Text / number | |
breached.length | Number of breaches | Text / number | |
compliant.length | Number compliant | Text / number | |
| Send weekly report | ok | Succeeded | true · false |
| Forecast staffing needs | ok | Succeeded | true · false |
analysis.avg_daily_tickets | Avg daily tickets | Text / number | |
analysis.weekly_trend | Weekly trend | Text / number | |
analysis.trend_pct | Trend % | Text / number |
Content & Brand
| Block | Field | What it means | Values |
|---|---|---|---|
| Check copy against brand guidelines | ok | Succeeded | true · false |
approved | Approved | true · false | |
score | Compliance score (0-100) | Text / number | |
| Check image against brand guidelines | ok | Succeeded | true · false |
approved | Approved | true · false | |
score | Compliance score (0-100) | Text / number | |
| Review ad copy | ok | Succeeded | true · false |
approved | Approved | true · false | |
| QA a product listing | ok | Succeeded | true · false |
approved | Approved | true · false | |
score | Quality score (0-100) | Text / number | |
| QA a translation | ok | Succeeded | true · false |
approved | Approved | true · false | |
score | Quality score (0-100) | Text / number | |
| Check user-generated content | ok | Succeeded | true · false |
compliant | Compliant | true · false | |
action | Action | approve · flag · remove | |
sentiment | Sentiment | positive · neutral · negative · mixed | |
| Review an email template | ok | Succeeded | true · false |
approved | Approved | true · false | |
| Audit brand voice drift | ok | Succeeded | true · false |
Mission Control
| Block | Field | What it means | Values |
|---|---|---|---|
| Pull cross-platform overview | ok | Succeeded | true · false |
knowdesk.conversations_total | Total conversations | Text / number | |
knowdesk.conversations_open | Open conversations | Text / number | |
knowdesk.sla_breached | SLA breaches | Text / number | |
knowdesk.csat_avg | CSAT average | Text / number | |
| Scan for anomalies | ok | Succeeded | true · false |
metrics.current.volume | Current 7d volume | Text / number | |
metrics.current.csat_avg | Current 7d CSAT | Text / number | |
metrics.current.sla_breach_rate | Current SLA breach rate | Text / number | |
metrics.previous.volume | Previous 7d volume | Text / number | |
| Attribute revenue | ok | Succeeded | true · false |
attribution.conversations_resolved | Conversations resolved | Text / number | |
attribution.ecommerce_conversations | Ecommerce conversations | Text / number | |
attribution.estimated_revenue_at_risk.cents | Revenue at risk (cents) | Text / number | |
| Fetch a department playbook | ok | Succeeded | true · false |
department | Department | Text / number |
Vertical AI
| Block | Field | What it means | Values |
|---|---|---|---|
| Search vertical data | ok | Succeeded | true · false |
| Write back a booking | ok | Succeeded | true · false |
| Look up ecommerce order (vertical) | ok | Succeeded | true · false |
| Start ecommerce return (vertical) | ok | Succeeded | true · false |
| Look up a transaction | ok | Succeeded | true · false |
Fintech
| Block | Field | What it means | Values |
|---|---|---|---|
| Run a fintech task | ok | Succeeded | true · false |
raw_status | Upstream HTTP status | Text / number |
Escalation
| Block | Field | What it means | Values |
|---|---|---|---|
| Escalate & create ticket | ok | Succeeded | true · false |
ticket_id | Ticket ID | Text / number | |
priority | Priority | low · normal · high · urgent | |
provider | Provider | Text / number |
Voice AI (calls)
| Block | Field | What it means | Values |
|---|---|---|---|
| Send a follow-up text | ok | Succeeded | true · false |
QA
| Block | Field | What it means | Values |
|---|---|---|---|
| Notify the QA manager | ok | Succeeded | true · false |
| Flag for a coaching session | ok | Succeeded | true · false |
When is a field available?#
A field exists from the moment it’s created: trigger fields from the start, block fields only after that block’s step finishes. A placeholder for a field that doesn’t exist yet stays as written - for example {{ticket_id}} inside the very step that creates the ticket. The Connection check flags these: “only a later step creates it” or “this step is what creates it”.
| You want | Do this |
|---|---|
| The new ticket’s ID in a Slack alert | Put {{ticket_id}} in the Slack webhook step that runs after the ticket step. |
| A field from an earlier step in a branch | Branch from the path that ran that step (or any path after it) - branches are checked once a path’s steps finish. |
| A value for testing that the trigger can’t supply | Add it in Test data → Extra fields, e.g. {"priority": "urgent"}. |
A step’s own settings always win over context fields with the same name - so an escalation step’s message setting is what gets sent, even though a chat trigger also carries the customer’s message.
Route by channel#
Steps in a path always run top to bottom, so to do something different per channel, branch on channel. Example: hand website chats to the Live Inbox, but turn emails into a help-desk ticket - and alert Slack only for urgent cases.
| Path | Steps | Branches (first match wins) |
|---|---|---|
| Path 1 | Triage for escalation | decision equals continue → End · channel equals email → Email path · else → Path 2 |
| Path 2 | Escalate & create ticket, type = live_chat | priority equals urgent → Path 3 · else → End |
| Email path | Escalate & create ticket, type = ticket | priority equals urgent → Path 3 · else → End |
| Path 3 | Call a custom webhook (Slack) | - |
Delays#
Add a delay step to wait before the next action - for example, a short pause before a follow-up. Delays are capped at 10 minutes per step. On live-call workflows, delay steps are skipped so callers never hear dead air.
Ready-made templates#
| Template | Trigger | What it does |
|---|---|---|
| Auto-resolve order status | Order status question | Looks up the order; if nothing is found, opens a ticket instead of leaving the customer stuck. |
| Frustrated customer → human | Frustrated / escalation | Runs AI triage and escalates to a real ticket whenever it decides not to continue. |
| Damaged item → filed claim | Carrier claim | Files the carrier claim, then opens a ticket so a human tracks it to resolution. |
| Wholesale inquiry routing | Wholesale inquiry | Routes the B2B inquiry and opens a ticket for your sales team. |
| Return / RMA kickoff | Return request | Starts the return; if policy blocks it, opens a ticket for manual review. |
| QA auto-fail → notify & flag | Review auto-fails | Emails the QA manager and flags the conversation for coaching. |
| Resolved conversation → win-back list | Conversation resolved | Feeds the customer into your win-back email flow (exploratory). |
Custom webhooks (Slack, Teams or your own API)#
The Call a custom webhook block connects a workflow to anything that isn’t pre-built. It sends an HTTPSPOST with a JSON body containing the step’s own settings plus everything the trigger and earlier steps supplied.
https://hooks.slack.com/services/). Microsoft Teams and most tools offer the same.text, so add a setting named text and write your message with placeholders.{
"text": "🔔 Refund request from {{customer_email}} - order {{order.id}} is {{order.status}}",
"customer_email": "[email protected]",
"order": { "id": "4821", "status": "delivered" }
}Escalate & create ticket: Live Inbox or help-desk ticket#
| type setting | What happens |
|---|---|
live_chat | Hands the conversation to your Live Inbox. No help-desk ticket is created and no ticket_id is returned. |
ticket (or any other value) | Creates a ticket in your connected help desk (Email, Freshdesk, Zendesk, Intercom, Zoho or Webhook) with the conversation attached; returns ticket_id, priority and provider. |
Want both? Add the step twice in the same path - live_chat first, then ticket - or route by channel (above).
- Your message becomes an internal note
- The step’s message setting is added to the conversation as an internal note from “Workflow” - never shown as something the customer said.
- Closed conversations go back to the Queue
- Escalating a closed or resolved conversation clears the previous agent and puts it back in the Queue.
- Ticket integrations are per widget
- A ticket uses the help desk connected to the widget the chat came in on. Connect it for every widget that should create tickets - the Connection check lists which widgets are covered.
- AI subject & priority
- On plans with AI priority, the ticket’s subject and priority are set by AI from the conversation.
Workflows on live calls#
Call-event workflows run inside the live call, so they can act on it directly with three Voice AI blocks: warm transfer to a human with a briefing, end the call, and send a follow-up SMS.
| Call event | How it runs |
|---|---|
| Call answered | In the background - the conversation continues immediately. |
| ID verification passed or failed | Waited on briefly, so a warm transfer can happen before the call moves on. Your existing verification handling always runs as normal. |
| Call running long | In the background. |
| Voicemail reached | In the background. |
Test & verify#
Every workflow has a Test & verify console with three modes. Your canvas is saved automatically before each run, and the execution log replays each step - click any line to inspect it in Step output.
| Mode | What it does | Sends anything? |
|---|---|---|
| Simulate | Walks your workflow with the test data - branches are evaluated for real, and each action shows the exact payload it would send. | No |
| Connection check | Checks every step on every path can really run: plan access, store connection, active widget, help-desk integration per widget, server setup, webhook address (HTTPS and the domain resolves), fields that won’t be filled, trigger switched on. Each problem comes with a “How to fix”. Result: Ready, Warnings or Not ready. | No - not even recorded as a run |
| Live run | Really runs every step - tickets, emails, Slack posts and store updates happen. Only for Live workflows, and it asks you to confirm. | Yes |
Test data
The form matches your trigger. For chat rules it shows whether your message fires the rule, using your real phrases. Other fields:
- Channel
- Pretend the chat came from widget, email, whatsapp… to test channel branches.
- Conversation ID (optional)
- Paste a real conversation ID from the Live Inbox to test with its full chat. Left empty, your test message is used as the conversation.
- Extra fields
- Any other values as JSON, e.g.
{"priority": "urgent"}to send a Simulate run down your urgent branch. In a Live run, block results replace these.
Every simulation and live run is also listed in Run history with a Test or Live badge, its status and each step’s output.
Limits and safety#
| Guardrail | Limit |
|---|---|
| Actions per company | 20 per minute across all workflows |
| Actions per run | 25 |
| Delay per step | 10 minutes |
| Paths visited per run | 200 (protects against accidental loops) |
| Custom webhook | HTTPS only · 8-second timeout · 100 KB response recorded |
| Plan access | Re-checked every time an action runs, not only when you save |
Troubleshooting#
| Problem | What to check |
|---|---|
| My workflow never fires | Make sure its status is Live. For chat intents, check the matching rule's trigger phrases in the Rules tab cover how your customers phrase it. |
| A step shows “blocked” | That block needs a plan your workspace isn't on, or the per-minute action limit was reached. Check the Block Library for plan requirements. |
| The wrong branch ran | Branches are checked in order and the first match wins. Open the run in Run history to see the values each condition saw. |
| My webhook failed | Confirm the URL is https and reachable, responds within 8 seconds, and returns a 2xx status. |
| A placeholder wasn't replaced | The field didn't exist at that point in the run. Check the spelling and dot path, and that an earlier step actually returns it. |
| “No URL set for this webhook” | The webhook needs a setting named url (left box) with the https address as its value (right box). Typing the address into the name box is a common slip - the Connection check spots it. |
| It never runs on real chats | Check the trigger isn’t Manual, the workflow is Live, and the chat rule is switched on in Rules. Run the Connection check. |
| {{conversation_id}} is never filled | Manual workflows have no conversation. Pick a chat, call, QA or resolved-conversation trigger. |
| “No ticket integration configured” | The help desk isn’t connected for the widget the chat came in on. Connect it for that widget in Widget Config → Escalation & ticketing. |
| My urgent branch never runs | priority is set by the triage AI from the conversation. Use Simulate with {"priority": "urgent"} in Extra fields to check the routing. |
| Triage fails with “transcript or conversation_id required” | The run has no conversation. Real chat runs always have one; for tests, leave Conversation ID empty and enter a message - it’s used as the transcript. |
QA Reviews - Agent Quality Scorecard#
KnowDesk's built-in QA module lets you score any support conversation across 9 weighted attributes, run calibration sessions to align your QA team, and give every agent a private coaching portal - all without a separate tool. It is designed to replace ad-hoc spreadsheet reviews with a structured, auditable, data-driven process.
The 9 QA Attributes#
Every review scores the following attributes on a 1–5 scale. Each can be independently weighted, have auto-fail enabled, or be disabled entirely from the Settings tab.
| ATTRIBUTE | WHAT IT MEASURES | CAN BE N/A |
|---|---|---|
| Empathy & Tone | How well the agent acknowledged the customer's situation and matched the appropriate emotional register | No |
| Problem Resolution | Was the customer's core issue actually resolved or meaningfully progressed? | No |
| Response Accuracy | Were the answers factually correct and aligned with company policy? | No |
| Communication Clarity | Was the agent's language clear, concise, and free of jargon? | No |
| Response Timeliness | Did the agent respond within expected SLA windows? | Yes |
| Escalation Handling | Was escalation to human or other channels handled correctly and without delay? | Yes |
| Policy Compliance | Did the agent follow company policies, scripts, and legal/compliance guidelines? | No |
| Proactive Assistance | Did the agent anticipate follow-up needs and offer additional relevant help? | No |
| Documentation Quality | Were internal notes, ticket fields, and tags completed accurately? | Yes |
Score scale#
How to start a QA review#
Smart Queue - AI-prioritised sampling#
Enable Smart Queue from the toggle in the Queue tab. KnowDesk scores each conversation across four risk signals and surfaces the most important ones first:
Calibration Sessions#
Calibration ensures your QA reviewers are scoring consistently. In a calibration session, a second reviewer scores the same conversation independently - KnowDesk then computes a per-attribute and overall inter-reviewer agreement rate. A QA Lead (or admin/owner) resolves any differences and sets the final agreed scores.
Agreement rate calculation
| SCORE DIFFERENCE | AGREEMENT RATE |
|---|---|
| Exact match (diff = 0) | 100% |
| Off by 1 | 75% |
| Off by 2 | 50% |
| Off by 3 or more | 25% |
The overall agreement rate is the average across all non-N/A attribute pairs. ≥80% is considered strong, 60–79% moderate, below 60% divergent and requires discussion before resolution.
Starting a calibration review
- Go to QA Reviews → Queue
- Find a conversation that already has a submitted review
- Click Calibrate next to that conversation
- A second draft review is created with the is_calibration flag
- A second QA reviewer opens the conversation and scores it independently - without seeing the first reviewer's scores
- After submission, a QA Lead navigates to QA Reviews → Calibration and clicks Compare & Resolve
Resolving a calibration session
On the calibration comparison page, the QA Lead sees Reviewer A scores and Reviewer B scores side by side for every attribute. For attributes where scores differ, quick-pick buttons let you Use A, Use B, or Average with one click. A resolution note documents the rationale. On submission, the original review's final scores are updated and the calibration review is marked resolved.
Agent Coaching Portal#
Every team member with the Member role gets a personal QA Scores page at /dashboard/qa/my-scores. This private portal shows all their submitted QA reviews, per-attribute score averages, coaching notes from reviewers, and an "Areas to Focus On" panel highlighting their three lowest-scoring attributes.
Agents are notified on their dashboard home when new unviewed QA reviews are waiting. The notification clears automatically once they visit their coaching portal. No email setup required - the notification is in-product.
QA Settings - Weights, Auto-Fail & Attribute Configuration#
Admin, owner, and QA Lead roles can configure the scorecard from QA Reviews → Settings. Three controls are available per attribute:
QA Analytics & Weekly Reports#
The Analytics tab inside QA Reviews shows aggregate metrics across all submitted reviews: total reviews, average QA score, open disputes, auto-fail count, agent leaderboard sorted by score, attribute performance heatmap (average score per attribute), and a weekly score trend chart.
Admin, owner, and QA Lead roles can click Send Weekly Report to generate a styled HTML email report covering the last 7 days - agent leaderboard, attribute averages, score trends - and preview it before sending. The report is logged in the qa_report_logs table for audit purposes.
Roles and QA access#
| ROLE | SCORE CONVERSATIONS | CALIBRATION | SETTINGS & REPORTS | AGENT COACHING PORTAL |
|---|---|---|---|---|
| Owner | ✓ | ✓ + resolve | ✓ | - |
| Admin | ✓ | ✓ + resolve | ✓ | - |
| QA Lead | ✓ | ✓ + resolve | ✓ | - |
| QA | ✓ | Score only | View only | - |
| Member | - | - | - | ✓ |
Team Management#
Add your colleagues so they can access the dashboard. Each team member gets a role that controls what they can see and do.
Roles#
Inviting a team member#
- Go to Team in your dashboard
- Click + Invite Member
- Enter their email address and choose their role
- Click Send Invite
- They receive a magic link by email - clicking it creates their account and gives them access
Billing & Plans#
All plans include a 7-day free trial. Toggle between monthly and annual pricing below - annual saves 20%.
Managing your subscription#
Billing is handled by Stripe. To upgrade, downgrade, or cancel - go to Billing → Manage Billing. This opens the Stripe customer portal where you can update your plan, payment method, or download invoices.
Shopify billing#
Merchants who install KnowDesk via the Shopify App Store are billed through Shopify's native billing system - not Stripe. Plan selection happens in the Shopify app on first install. To upgrade or cancel, manage app subscriptions directly from your Shopify admin.
Settings#
Company info#
Update your company name, website, and support email. These are used internally and on invoices.
Google Drive integration#
To allow KnowDesk to read your Google Docs, share them with the service account email shown in Settings → Google Drive Integration. Set the permission to Viewer. You only need to do this once per document.
Widget API key#
Your API key is the unique identifier in your embed code. It's safe to have in your website's HTML - it only authorises the widget to load content, not to modify data.
Password#
Change your password from the Settings page. Enter your new password twice to confirm. You'll remain logged in on your current device.
WordPress & Shopify Plugins#
KnowDesk is available as a free installable plugin for WordPress and Shopify. Both plugins embed your widget using your API key - no code changes needed on your site.
WordPress Plugin#
The KnowDesk WordPress plugin is available free on the official WordPress Plugin Directory. It works on any WordPress site running version 5.8 or higher, including WooCommerce stores and multisite networks.
Installation
kd_live_. Paste it into the Widget API Key field and click Verify key to confirm it is active, then Save settings.Display settings reference
Shopify App#
The KnowDesk Shopify app embeds your widget on your storefront using a Theme App Extension - the modern Shopify standard that does not use the deprecated script_tags API. It is fully compliant with Shopify App Store review requirements.
Installation
read_themes scope.kd_live_) from your KnowDesk dashboard. Click Verify key then Save settings.Partner Integration API#
The KnowDesk Partner Integration API allows platforms - such as Freshdesk, Zendesk, Intercom, help desk tools, and app marketplaces - to track customer installs and payments and automatically earn revenue share commission. This API is for Integration Partners who list KnowDesk in their marketplace or plugin directory.
How it works#
The integration flow has three stages:
Authentication#
All API requests must include your API key in the X-Api-Key header. Your API key is available in the KnowDesk admin panel under Partners → Integration Apps.
| Field | Type | Required | Description |
|---|---|---|---|
X-Api-Key | string | Yes | Your unique integration API key. Prefixed kd_int_live_ for production. |
X-Webhook-Signature | string | No | HMAC-SHA256 signature of the raw request body. Recommended for security. |
Content-Type | string | Yes | Must be application/json |
POST /api/integrations/freshdesk/track HTTP/1.1
Host: knowdesk.io
X-Api-Key: kd_int_live_a1b2c3d4e5f6g7h8i9j0
X-Webhook-Signature: sha256=3a5b8c...
Content-Type: application/jsonSigning requests (recommended)#
For added security, sign each request body with your webhook_secret using HMAC-SHA256 and include the result in the X-Webhook-Signature header. KnowDesk verifies this signature before processing.
const crypto = require('crypto');
function signPayload(body, secret) {
return 'sha256=' + crypto
.createHmac('sha256', secret)
.update(JSON.stringify(body))
.digest('hex');
}
const payload = { event: 'install', external_account_id: 'fd_acct_123' };
const signature = signPayload(payload, process.env.KD_WEBHOOK_SECRET);
// Include in request:
// X-Webhook-Signature: sha256=3a5b8c9d...Base URL#
https://knowdesk.io/api/integrations/{your-app-slug}/trackReplace {your-app-slug} with the slug assigned to your integration (e.g. freshdesk, zendesk, intercom). Your slug is shown in the KnowDesk admin panel.
Event: install#
Send this event when a user in your platform installs or activates KnowDesk. This creates the attribution record that ties future payments to your integration.
/api/integrations/{slug}/track| Field | Type | Required | Description |
|---|---|---|---|
event | string | Yes | Must be "install" |
external_account_id | string | Yes | Your platform's unique identifier for this customer account. Stable across sessions. |
external_email | string | No | The customer's email address. Used to match with their KnowDesk account if company_id is unavailable. |
company_id | string | No | The KnowDesk company UUID, if known. Provides the most reliable attribution - skip if not available. |
{
"event": "install",
"external_account_id": "fd_acct_abc123",
"external_email": "[email protected]",
"company_id": null
}{
"ok": true,
"event": "install_recorded"
}// 401 - Invalid or missing API key
{
"error": "Invalid API key or app not found"
}
// 401 - Signature mismatch
{
"error": "Invalid webhook signature"
}
// 500 - Database error
{
"error": "Internal error - please retry"
}Event: payment#
Send this event whenever the attributed customer makes a successful payment to KnowDesk. KnowDesk calculates your commission automatically based on the amount_cents and the commission percentage configured for your integration in the admin panel.
/api/integrations/{slug}/track| Field | Type | Required | Description |
|---|---|---|---|
event | string | Yes | Must be "payment" |
external_account_id | string | Yes | Same identifier used in the install event. |
amount_cents | integer | Yes | The payment amount in cents (e.g. 4900 for $49.00). Used to calculate your commission. |
invoice_id | string | No | The Stripe invoice ID from the payment. Used for audit trail and duplicate prevention. |
plan | string | No | Optional plan name - "starter", "growth", or "enterprise". |
{
"event": "payment",
"external_account_id": "fd_acct_abc123",
"amount_cents": 14900,
"invoice_id": "in_1Abc2DefGhi3Jkl",
"plan": "growth"
}{
"ok": true,
"event": "payment_recorded"
}Behind the scenes, KnowDesk:
- Finds the
integration_installsrow for thisexternal_account_id - Calculates your commission:
amount_cents × (commission_pct / 100) - Creates a
partner_earningsrecord withstatus: "pending" - Updates the integration app's
revenue_shared_centstotal - After 7 days the earning is confirmed and included in your next monthly payout
Event: uninstall#
Send this event when a customer removes or deactivates KnowDesk from your platform. Commission generation stops from this point. The customer's existing confirmed earnings are not affected.
/api/integrations/{slug}/track| Field | Type | Required | Description |
|---|---|---|---|
event | string | Yes | Must be "uninstall" |
external_account_id | string | Yes | The same account ID used at install time. |
{
"event": "uninstall",
"external_account_id": "fd_acct_abc123"
}{
"ok": true,
"event": "uninstall_recorded"
}Commission calculation#
Your commission percentage is configured by the KnowDesk admin team when your integration is approved. The default for Integration Partners is 20%. This can be adjusted by the KnowDesk team at any time from the admin panel.
Viewing your earnings#
All commission records are visible in your integration's revenue dashboard in the KnowDesk admin panel under Partners → Integration Apps → [Your App] → Revenue. You can also query earnings programmatically:
/api/integrations/{slug}/earningsGET /api/integrations/freshdesk/earnings?from=2025-01-01&to=2025-12-31
X-Api-Key: kd_int_live_a1b2c3d4e5f6g7h8i9j0{
"app": "freshdesk",
"period": {
"from": "2025-01-01",
"to": "2025-12-31"
},
"install_count": 42,
"total_revenue_cents": 328500,
"total_commission_cents": 65700,
"commission_pct": 20,
"status_breakdown": {
"pending": 12300,
"confirmed": 18400,
"paid": 35000
},
"recent_earnings": [
{
"id": "pe_abc123",
"amount_cents": 2980,
"commission_pct": 20,
"mrr_cents": 14900,
"status": "confirmed",
"period_start": "2025-05-01",
"created_at": "2025-05-03T14:22:11Z"
}
]
}Payout schedule#
Earnings follow this lifecycle:
Error reference#
| STATUS | ERROR | CAUSE |
|---|---|---|
| 400 | Missing API key | X-Api-Key header not included |
| 400 | Unknown event type | event must be "install", "payment", or "uninstall" |
| 401 | Invalid API key or app not found | API key does not match or the app is inactive |
| 401 | Invalid webhook signature | X-Webhook-Signature does not match computed HMAC |
| 404 | Install not found | payment event sent for an external_account_id with no prior install event |
| 429 | Rate limited | More than 100 requests per minute from the same API key |
| 500 | Internal error | Transient server error - safe to retry after 5 seconds |
Full integration example#
Below is a complete Node.js example showing the full install → payment → uninstall flow using the KnowDesk Partner Integration API.
const crypto = require('crypto');
const fetch = require('node-fetch'); // or native fetch in Node 18+
const API_KEY = process.env.KD_API_KEY; // kd_int_live_...
const WH_SECRET = process.env.KD_WEBHOOK_SECRET;
const BASE_URL = 'https://knowdesk.io/api/integrations/your-slug/track';
function sign(body) {
return 'sha256=' + crypto
.createHmac('sha256', WH_SECRET)
.update(JSON.stringify(body))
.digest('hex');
}
async function track(payload) {
const res = await fetch(BASE_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Api-Key': API_KEY,
'X-Webhook-Signature': sign(payload),
},
body: JSON.stringify(payload),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error || 'KnowDesk API error');
return data;
}
// 1. Customer installs KnowDesk from your marketplace
await track({
event: 'install',
external_account_id: 'acct_abc123',
external_email: '[email protected]',
});
// 2. Customer's subscription payment succeeds (hook into Stripe webhook)
await track({
event: 'payment',
external_account_id: 'acct_abc123',
amount_cents: 14900, // $149.00
invoice_id: 'in_stripe_invoice_id',
plan: 'growth',
});
// 3. Customer uninstalls
await track({
event: 'uninstall',
external_account_id: 'acct_abc123',
});Testing your integration#
Use the test API key (prefixed kd_int_test_) during development. Test events are processed identically to production but do not create real commission records. Your test API key is available alongside your live key in the KnowDesk admin panel.
https://knowdesk.io/api/integrations/your-slug/track
X-Api-Key: kd_int_test_a1b2c3d4e5f6g7h8i9j0Apply to the Integration Partner programme. Once approved (within 48 hours) you will receive your api_key, webhook_secret, and integration slug - everything you need to start tracking installs and earning 20% recurring commission on every paying customer.
Vertical AI#
Vertical AI transforms your KnowDesk widget into an industry-specific AI assistant. Instead of a generic Q&A bot, visitors get a structured booking, intake, or product-lookup experience - all powered by your own data. Available on Growth, Scale and Enterprise plans.
Activating Vertical AI#
Real Estate#
The Real Estate vertical lets visitors search your property listings, ask about availability, and submit booking or viewing requests - all inside the widget. Your data is synced from a spreadsheet, database, or REST API.
Required data columns
| COLUMN | DESCRIPTION | REQUIRED |
|---|---|---|
| Property Name | Listing title shown to visitors | Yes |
| Location | City, neighbourhood, or full address | Yes |
| Price | Numeric price or rent amount | Yes |
| Type | apartment, house, villa, office, etc. | Yes |
| Bedrooms | Number of bedrooms | No |
| Bathrooms | Number of bathrooms | No |
| Features | Comma-separated amenities (pool, parking, gym…) | No |
| Status | available, under offer, sold, let | Yes |
| Image URL | Publicly accessible image link | No |
| Listing URL | Link to the full listing page | No |
Healthcare#
The Healthcare vertical allows patients to check provider availability, ask about appointment types, and submit booking requests. Your appointment and provider data is pulled from a spreadsheet or API.
Required data columns
| COLUMN | DESCRIPTION | REQUIRED |
|---|---|---|
| Doctor Name | Full name of the provider | Yes |
| Department | Cardiology, General Practice, Dermatology, etc. | Yes |
| Date | Appointment date (YYYY-MM-DD) | Yes |
| Time | Start time (HH:MM 24h or 12h AM/PM) | Yes |
| Duration | Session length in minutes | No |
| Status | available, booked, cancelled | Yes |
| Notes | Location, floor, or preparation instructions | No |
Legal#
The Legal vertical allows prospective clients to check attorney availability, understand practice areas, and schedule consultations - directly inside the widget.
Required data columns
| COLUMN | DESCRIPTION | REQUIRED |
|---|---|---|
| Attorney Name | Full name of the attorney or consultant | Yes |
| Practice Area | Family Law, Corporate, Immigration, etc. | Yes |
| Date | Session date (YYYY-MM-DD) | Yes |
| Time | Start time | Yes |
| Duration | Session length in minutes | No |
| Session Type | in-person, video, phone | No |
| Status | available, booked, cancelled | Yes |
Data Source Setup (Real Estate, Healthcare & Legal)#
All three verticals use the same five data source types. Choose the one that matches where your data lives.
Google Sheets
docs.google.com/spreadsheets/d/SPREADSHEET_ID/edit. Paste it into the Spreadsheet ID field. Optionally specify the sheet tab name (defaults to the first sheet).Airtable
airtable.com/BASE_ID/.... The table name is the tab label at the top (e.g. "Listings").data.records:read scope on the target base.REST API
data.listings).CSV Upload
Notion
?v= parameter: notion.so/yourworkspace/DATABASE_ID?v=....Ecommerce#
The Ecommerce vertical connects your store platform directly to the widget, enabling customers to look up orders, understand return policies, submit post-purchase issues, and complete intake forms - all without leaving the chat.
Platform connections
Setting up Shopify
yourstore.myshopify.com). Do not include https://.read_orders and read_customers scopes. Copy the token.Setting up WooCommerce
https://yourstore.com), and paste the Consumer Key and Consumer Secret. Click Save.Order lookup rules
Configure how customers identify their order. You can enable lookup by email address, order number, or both. You can also require the customer to provide both to match - useful for stores with high volume where order numbers may collide.
Return policy
Paste your return policy text in the Return Policy field. The AI reads this verbatim when customers ask about returns or refunds. Keep it plain text - no HTML or markdown needed.
Post-resolution actions
Choose what happens after the AI answers a post-purchase question. Options: escalate to live agent, create a support ticket (if escalation is configured), or show a custom message. You can set a different action per question type (refund request vs. delivery inquiry vs. general complaint).
Custom Question Flow Builder#
All four verticals include a question flow builder. This lets you define the structured questions the AI asks before fulfilling a visitor request - for example, asking for name, phone, and preferred viewing time before recording a property enquiry.
Adding a question
- In the Vertical AI panel, scroll to Intake Questions
- Click + Add Question
- Enter the question text (e.g. "What is your preferred viewing date?")
- Choose the response type: Text, Date, Phone, or Email
- Mark as Required if the visitor must answer before proceeding
- Click Save
Questions are shown to visitors in the order they appear in the list. Drag to reorder. The AI does not proceed to the booking confirmation step until all required questions are answered.
Confirmation emails
Enable Send confirmation email in the Vertical AI panel to automatically email the visitor a summary of their submission. The email includes their answers, the time of submission, and a reference number. No SMTP setup required - KnowDesk sends it from your configured support email.
What the visitor sees#
AI Agents#
KnowDesk ships 300+ AI agents across four categories - Support, Content & Brand, Email & Retention, and Ops & Reporting. Unlike generic chatbots, each agent is pre-trained for a specific workflow. You activate them from the Agents tab in your dashboard; no prompt engineering or custom training required.
Agent availability depends on your plan. Agents marked Growth+ require a Growth plan or higher. Agents marked Scale+ require a Scale plan. Enterprise agents are available on the Enterprise plan only.
Support Agents handle the repetitive, high-volume tickets that drain CS team capacity. Each agent knows the precise data fields, API calls, and response templates for its use case.
Brand Agents enforce visual and verbal consistency across every customer-facing surface - ad copy, product listings, support replies, and UGC content.
Retention Agents run proactive outreach flows that recover revenue and extend customer lifetime value - without requiring a separate ESP or CRM automation tool.
Mission Control is KnowDesk's unified ops dashboard. It aggregates GA4, Stripe, and Gorgias data into one view, surfaces anomalies automatically, and gives ops teams a single pane of glass for revenue attribution and support performance.
Migrating from Another Helpdesk#
KnowDesk includes a full data migration engine so you can switch from Intercom, Zendesk, Freshdesk, or Zoho Desk without losing your conversation history, customer context, or support intelligence. Your historical data is imported, your customers never notice the switch, and the AI has full context from day one.
What Gets Migrated#
Each imported record is normalised into a common schema and stored in your KnowDesk account:
- Conversations - full message body, platform reference ID
- Contacts - visitor name and email address
- Topics / Tags - conversation labels mapped to KnowDesk topics
- CSAT Scores - satisfaction ratings normalised to a 0–5 scale
- Resolution Time - time-to-resolve in seconds, stored for analytics
How to Run an Import#
Go to Dashboard → Data Migration and follow the 6-step wizard:
- Select platform - choose your source helpdesk (Intercom, Zendesk, Freshdesk, or Zoho Desk)
- Upload file - drag and drop your export file (JSON, CSV, or XML, up to 50 MB). Auto-detection reads the file structure and identifies the platform automatically. You can override the detected platform if needed.
- Review field mapping - KnowDesk auto-maps source fields to its own schema. You can enable or disable any field before proceeding.
- Confirm - review the record count, contact count, and mapping summary before starting.
- Import - records are processed in the background in batches of 100. A live progress bar updates every few seconds. You can close the page - the import continues server-side.
- Done - a summary shows how many conversations and contacts were imported, how many errors occurred, and a link to download the error log if any records failed.
Exporting Data From Your Current Platform#
Before uploading to the import wizard, you need to export your data from your current helpdesk. Steps vary by platform:
- Log in as Admin and click the Reports icon in the left sidebar.
- Open the Export tab and set Export type to Tickets.
- Choose your date range. Export in yearly chunks if you have more than 50 MB of data.
- Under Fields, include: Ticket ID, Subject, Description, Status, Priority, Created At, Requester Name, Requester Email, Tags.
- Select CSV format and click Export.
- Download the file from the link in the confirmation email or from Reports → Export History.
- Log in as Admin and open Admin Center (grid icon → Admin Center).
- Go to Tools → Reports → Full ticket export.
- Choose JSON (recommended - retains full conversation threads) or CSV.
- Click Request file. Zendesk emails you a download link when ready.
- Extract the file if it arrives as a ZIP.
- Log in as Workspace Owner or Admin.
- Click the Settings gear in the bottom-left, then go to General → Export.
- Under Conversations, set your date range and click Request export.
- Download the ZIP file from the link in the email.
- Extract the ZIP and locate the conversations JSON file.
- Log in as Administrator and click the Setup gear icon in the top bar.
- Go to Data Administration → Export.
- Select Tickets as the module, then choose CSV or XML format.
- Apply a Created Time date filter to limit the export size if needed.
- Click Export - Zoho Desk emails you when the file is ready.
- Download from Setup → Data Administration → Export History.
AI Memory Layer#
After a successful import, KnowDesk automatically builds an AI Memory Layer - a profile for every unique contact in your imported data. Each profile aggregates:
- Number of past conversations
- Most common issue types (from conversation topics)
- Average CSAT score
- Date of last contact
- A plain-text summary: "Customer name: Alice · Previous interactions: 4 conversations · Past issues: billing, shipping · Average satisfaction: 3.8/5 · Last contact: 12 July 2026"
When a returning visitor opens the widget and their email address is known (either from a pre-chat form or a previous session), KnowDesk injects this context into the AI system prompt automatically. The AI greets them by name and responds with awareness of their history - without you writing any code.
Contacts with an average CSAT score below 3.0 are automatically flagged as coaching needed, surfacing them for your QA team.
Platform Field Mapping Reference#
KnowDesk auto-maps these fields from each supported platform:
| Source Platform | Source Field | KnowDesk Field |
|---|---|---|
| Intercom | contact.name / contact.email | visitor_name / visitor_email |
| Intercom | conversation.id | ref_id |
| Intercom | conversation.body | content |
| Intercom | conversation.tags | topics |
| Intercom | resolution.time | resolution_time_seconds |
| Intercom | csat.score | csat_score |
| Zendesk | ticket.requester_name / email | visitor_name / visitor_email |
| Zendesk | ticket.id | ref_id |
| Zendesk | ticket.description | content |
| Zendesk | ticket.tags | topics |
| Freshdesk | contact.name / email | visitor_name / visitor_email |
| Freshdesk | ticket.id | ref_id |
| Freshdesk | ticket.description | content |
| Freshdesk | ticket.tags | topics |
| Zoho Desk | contact.Last_Name / Email | visitor_name / visitor_email |
| Zoho Desk | id | ref_id |
| Zoho Desk | description | content |
| Zoho Desk | cf.tags | topics |
Import History#
Past import jobs are listed at the bottom of the Data Migration page with their status (queued, processing, complete, error), record counts, and timestamps. You can download the error log for any failed job in JSON format.
Frequently Asked Questions#
A complete self-service customer support portal - and the tools to keep it excellent
KnowDesk is more than a chatbot platform. It's a complete self-service customer support portal that deflects tickets, answers questions instantly, and monitors support quality - all from a single dashboard your entire team can access from day one.
If your priority is reducing ticket volume, the Knowledge Base and Widget Configuration sections of this documentation explain how to train your AI on existing content - product guides, policy documents, FAQs, Notion pages, and Confluence spaces - so customers get accurate answers without opening a ticket. A well-configured self-service portal typically deflects 60–80% of inbound queries without any human involvement.
For teams focused on accountability and continuous improvement, KnowDesk functions as customer service quality monitoring software through its built-in QA module. Team leads can score AI and agent responses, flag low-quality interactions, set passing thresholds, and generate QA reports across any time period. Every conversation is logged, searchable, and auditable - giving you the visibility to raise support standards across your whole team, not just spot-check individual agents.
KnowDesk also supports live agent inboxes, email inbound, Shopify and Stripe order lookups, multilingual conversations, and vertical AI agents tuned to specific departments. Use this documentation as your operational reference - and if you need help at any point, our support team is reachable via the chat widget in the bottom right corner, powered by KnowDesk itself.