Qply Documentation
Everything you need to add AI-powered live chat to your website. From a 60-second embed to advanced API integrations.
Quick Start
Get Qply running on your website in under a minute.
Create your account
Go to qply.io/app/signup and sign up with your email or Google account. You'll start with a 14-day free trial on your chosen plan.
Copy your embed code
After signing up, go to the Embed tab in your dashboard. You'll see a one-line script tag with your unique site key.
Paste it on your site
Add the script tag before </body> on any page. The widget will appear in the bottom-right corner.
Embed Snippet
Your embed code looks like this:
<script>
window.AIChatConfig = {
serverUrl: 'wss://api.qply.io',
siteKey: 'YOUR_SITE_KEY',
color: '#4F46E5',
consentRequired: false,
};
</script>
<script src="https://qply.io/widget.js" async></script>
Replace YOUR_SITE_KEY with the key from your Embed tab. The async attribute ensures it doesn't block page load.
consentRequired: set to true if your site serves visitors in the EU/UK/EEA/Switzerland or has a cookie banner. The widget will refuse to capture IP, geolocation, user-agent, and marketing attribution until your banner calls window.qply.consent('granted'). Most popular CMPs (Shopify, Cookiebot, OneTrust) are auto-detected. Leave it at false if you don't need consent gating. See Privacy & GDPR for full details.
HTML / Any Website
Paste the embed snippet before the closing </body> tag in your HTML:
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<!-- Your page content -->
<!-- Qply chat widget -->
<script>
window.AIChatConfig = {
serverUrl: 'wss://api.qply.io',
siteKey: 'YOUR_SITE_KEY',
color: '#4F46E5',
};
</script>
<script src="https://qply.io/widget.js" async></script>
</body>
</html>
WordPress
Two options for adding Qply to WordPress:
Option A: Theme editor (simple)
- Go to Appearance → Theme File Editor
- Open
footer.php(orheader.php) - Paste the embed snippet before
</body> - Click Update File
Option B: Plugin (recommended)
- Install a plugin like Insert Headers and Footers (by WPCode)
- Go to Code Snippets → Footer
- Paste your embed snippet
- Save
Shopify
- Go to Online Store → Themes → Actions → Edit Code
- Open
theme.liquid - Paste the embed snippet before
</body> - Click Save
The widget will appear on every page of your store, including product pages and checkout.
Webflow
- Go to Project Settings → Custom Code
- Paste the embed snippet in the Footer Code section
- Click Save Changes and Publish
Wix
- Go to Settings → Custom Code (or use Tracking & Analytics)
- Click + Add Code
- Paste the embed snippet
- Set placement to Body - end and apply to All pages
- Click Apply
React / Next.js
Load the widget script dynamically in your root layout or App component:
// app/layout.tsx (Next.js App Router)
import Script from 'next/script'
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Script id="qply-config" strategy="lazyOnload">{`
window.AIChatConfig = {
serverUrl: 'wss://api.qply.io',
siteKey: 'YOUR_SITE_KEY',
color: '#4F46E5',
};
`}</Script>
<Script
src="https://qply.io/widget.js"
strategy="lazyOnload"
/>
</body>
</html>
)
}
For plain React (Create React App / Vite):
// src/App.jsx
import { useEffect } from 'react'
function App() {
useEffect(() => {
window.AIChatConfig = {
serverUrl: 'wss://api.qply.io',
siteKey: 'YOUR_SITE_KEY',
color: '#4F46E5',
}
const s = document.createElement('script')
s.src = 'https://qply.io/widget.js'
s.async = true
document.body.appendChild(s)
return () => document.body.removeChild(s)
}, [])
return <div>{/* your app */}</div>
}
Colors & Branding
Customize the widget's appearance in Settings → Widget in your dashboard:
- Brand Color — header background, send button, launcher bubble
- Header Text Color — text color in the chat header (white or dark)
- Bot Name — display name for AI responses (e.g. "Qply AI", "Support Bot")
You can also use the Widget Preview tab to see changes in real-time before saving.
Position & Launcher
- Position — bottom-right (default) or bottom-left
- Launcher Emoji — the icon shown on the floating button (default: chat bubble)
Welcome Message
Set a welcome message in Settings → Widget. This appears when a visitor opens the chat for the first time. Examples:
- "Hi! How can we help you today?"
- "Welcome to [Company]! Ask me anything about our products."
Quick Questions
Add up to 4 quick-reply buttons that appear below the welcome message. These help visitors start a conversation with a single click.
Configure them in Settings → Widget → Quick Questions.
AI Auto-Reply
Qply uses AI to automatically answer visitor questions. Here's how it works:
- A visitor sends a message through the widget
- The AI searches your Knowledge Base for relevant information
- It generates a contextual reply based on your docs and training data
- If the AI can't answer or the visitor asks for a human, it triggers agent handoff
Knowledge Base
The Knowledge Base is how you train the AI. Better content = better answers.
Adding content
Go to the Knowledge tab in your dashboard. You can add content in three ways:
- Paste text — copy-paste FAQs, docs, product descriptions
- Upload files — PDF, TXT, DOCX files are extracted and chunked automatically
- Crawl a URL — enter a webpage URL and we'll extract the content
How it works
- You add content (text, file, or URL)
- Qply extracts the text and shows you a preview
- You review/edit the extracted text
- On save, the text is split into semantic chunks and indexed
- When a visitor asks a question, the AI searches these chunks for relevant context
Agent Handoff
When the AI can't answer a question or a visitor specifically asks for a human, the conversation is escalated:
- The conversation status changes to pending
- Online agents get a notification (browser + optional push)
- Any available agent can pick up the conversation from the dashboard
- Once an agent replies, the conversation is marked as open (human-handled)
Conversations
The main view of your dashboard. Here you can:
- See all visitor conversations in real-time
- Filter by status (open, closed, pending), channel (chat, email), tags
- Search across messages, visitor names, emails, and URLs
- Reply to visitors directly
- Close or reopen conversations
- Add internal notes (visible only to agents)
- Export conversations as CSV
Analytics
Track your support performance with built-in analytics:
- Conversation metrics — total, open, closed, pending counts
- AI resolution rate — percentage of conversations resolved without human intervention
- Average first response time — how fast your team responds
- CSAT score — customer satisfaction ratings
- Message volume — daily/weekly trends with date range picker
- Token usage — AI token consumption for the month
Live Visitors
See who's on your website right now. The Live tab shows:
- Visitor name/email (if provided)
- Current page URL
- Browser and device info
- Country/city (via GeoIP)
- Time on site
Team Management
Add team members from the Team tab:
- Admin — full access to all dashboard features, settings, and billing
- Agent — can view and reply to conversations only
Each agent gets a username and password to log in via "Sign in as Agent" on the login page. Agents can set their availability (online/away/offline).
Campaigns
Send proactive messages to visitors based on the page they're viewing. Use campaigns to:
- Welcome visitors on your pricing page
- Offer help on your checkout page
- Promote a feature to users on specific URLs
Configure campaigns in the Campaigns tab with a page URL pattern, message, and delay.
Plans & Pricing
| Feature | Starter ($12/mo) | Growth ($19/mo) | Pro ($49/mo) | Enterprise |
|---|---|---|---|---|
| AI replies/month | 300 | 1,000 | 5,000 | Unlimited |
| Agents | 1 | 2 | 5 | Unlimited |
| Knowledge base docs | 5 | 10 | 50 | Unlimited |
| Analytics | Basic | Advanced | Full + export | Full + export |
| Custom branding | — | — | Yes | Yes |
| File attachments | — | Yes | Yes | Yes |
| SSO / SAML | — | — | — | Yes |
| SLA | — | — | — | Yes |
Upgrade anytime from the Pricing tab in your dashboard. Billing is handled securely via Stripe.
Usage & Limits
Track your current usage in the dashboard sidebar (bottom):
- AI Replies — shows used / limit for the current month
- Tokens — total AI tokens consumed this month
Usage resets on the 1st of each month. If you hit your limit, AI auto-reply pauses but human agents can still respond. Upgrade your plan to continue.
Security Overview
Qply takes security seriously. Here's how your data is protected:
- Encryption in transit — all connections use TLS/HTTPS
- Password hashing — SHA-256 with constant-time comparison
- JWT tokens — signed with HS256, 24-hour expiry
- API keys — stored as SHA-256 hashes, never in plaintext
- CSP headers — Content Security Policy headers prevent XSS
- Rate limiting — brute-force protection on login and signup
- Multi-tenancy — workspace isolation ensures no cross-tenant data access
- Audit log — all admin actions are logged with actor, action, IP, and timestamp
Two-Factor Authentication
Enable 2FA for an extra layer of security:
- Go to Settings → Security
- Click Enable 2FA
- Scan the QR code with an authenticator app (Google Authenticator, Authy, 1Password)
- Enter the 6-digit code to verify
Once enabled, you'll need to enter a code from your authenticator app every time you log in.
Allowed Domains
Restrict which websites can load your chat widget. Go to Settings → Allowed Domains and add your domain(s).
If no domains are configured, the widget will load on any site with your embed code. We recommend adding your production domain to prevent unauthorized use of your site key.
GDPR Overview
If your website serves visitors in the EU, UK, EEA, or Switzerland, you are legally required to obtain explicit consent before any non-essential tracking runs. Qply is built to integrate cleanly with your existing cookie banner — when consent is denied, the widget switches to a minimal mode that does not capture IP address, geolocation, user-agent, or marketing attribution (UTMs, gclid, fbclid, etc.). The chat itself continues to work.
You (the website operator) are the data controller and are responsible for showing the cookie banner. Qply is the data processor, governed by our Data Processing Agreement.
Consent-Required Mode
Opt in to consent-aware behavior by setting consentRequired: true in your embed config:
<script>
window.AIChatConfig = {
serverUrl: 'wss://api.qply.io',
siteKey: 'YOUR_SITE_KEY',
color: '#4F46E5',
consentRequired: true,
};
</script>
<script src="https://qply.io/widget.js" async></script>
With this flag set, the widget defaults to denied and waits for an explicit signal before capturing tracking data. Without the flag (the default), the widget runs normally — appropriate for sites that don't serve EU/UK visitors and don't have a cookie banner.
data-consent-required="true" attribute is still supported for backwards compatibility, but the JS config form above is recommended.
Consent API
From your cookie banner's Accept/Decline handlers, call:
// User clicked Accept
window.qply.consent('granted');
// User clicked Decline
window.qply.consent('denied');
// User revoked previous consent
window.qply.consent('revoked'); // treated as denied
That's the entire integration. The widget will:
- Persist the choice in
localStorageso it survives page reloads - Fire a
qply:consentwindow event for any other listeners - Switch the chat WebSocket to consent-aware mode (sends
&consent=granted|deniedto the backend) - Skip attribution capture (UTMs, click IDs, referrer) when denied
Example with a custom banner:
<div id="cookie-banner">
We use cookies to improve your experience.
<button id="accept">Accept</button>
<button id="decline">Decline</button>
</div>
<script>
document.getElementById('accept').onclick = function () {
window.qply.consent('granted');
document.getElementById('cookie-banner').style.display = 'none';
};
document.getElementById('decline').onclick = function () {
window.qply.consent('denied');
document.getElementById('cookie-banner').style.display = 'none';
};
</script>
Listen for consent changes from anywhere in your code:
window.addEventListener('qply:consent', function (e) {
console.log('Qply consent state:', e.detail); // 'granted' | 'denied' | 'revoked'
});
CMP Auto-Detection
If you use one of the following Consent Management Platforms, Qply detects the consent state automatically — no integration code required:
- Shopify Customer Privacy API — reads
Shopify.customerPrivacy.userCanBeTracked() - Cookiebot — reads
Cookiebot.consent.marketing/statisticsand listens forCookiebotOnAccept/CookiebotOnDeclineevents - OneTrust — reads
OnetrustActiveGroupsfor the marketing category (C0004) and listens forOnConsentChanged
Just add data-consent-required="true" to the embed and you're done. Qply will sync with your CMP automatically, including live updates if the visitor changes their preferences mid-session.
window.qply.consent('granted'|'denied') from your CMP's accept/decline callback — the API works with any banner or framework.
What "denied" mode actually does
When consent is denied, the widget operates in minimal mode:
- Chat still works — visitors can send and receive messages
- Backend does not store IP address, country, or user-agent
- Marketing attribution (UTMs, gclid, fbclid, msclkid, ttclid, referrer) is not captured
- The widget signals
consent=deniedon the WebSocket so the backend honors it server-side
When the visitor later accepts, call window.qply.consent('granted') and the widget reconnects with full functionality on the next message.
Need help? Email us at [email protected] or use the chat widget on this page.
© 2025–2026 Qply, a product of Apptesterhub. All rights reserved. International billing via Apptesterhub LLC (Wyoming, USA). Third-party brands and trademarks mentioned on this site are the property of their respective owners; Qply is not affiliated with, endorsed by, or sponsored by them.
Qply