WXWebchatix Docs

Webchatix documentation

Telegram-first live chat: the visitor writes into the website widget, your team answers from Telegram and the web dashboard. Sections on the left, details on the right.

In 5 minutes

  1. Open the bot → /start — an account on the Free plan and the first site are created.
  2. Copy the HTML snippet and paste it into your site before </body>.
  3. /panel — a one-time link into the web dashboard (or the “Web dashboard” menu item).
  4. Invite an operator: /invite or menu → “Team” → ➕.
  5. Connect a Telegram group: add the bot to the group (or run /addgroup there) and assign it to a site under Routes.
  6. Fallback for a whole site in one group: /bindsite site_key inside the group.

Plans and billing

Registration is open: /start in the bot creates an account on the Free plan. Paid plans are bought by card in the dashboard, section Billing — payment goes through Stripe.

PlanWebsitesClients / monthOperatorsPer month
free1301$0
basic2010005$10 ($8 paid yearly)
unlimited$20 ($16 paid yearly)

Prices are shown per month. Paying for a year is 20% cheaper and is charged as a single payment ($96 and $192 a year); yearly is preselected in the dashboard.

Premium (Basic and above): templates, active invite, visibility rules, notes, ratings.

A client is a unique visitor who started a chat in the current calendar month — the counter resets on the 1st.

How payment works

  • Dashboard → Billing: current plan, usage, plan switch, list of invoices with PDF links.
  • Card details never reach our servers — the payment page and the customer portal belong to Stripe.
  • Changing the plan mid-period is prorated by Stripe; cancelling keeps the paid plan until the end of the paid period, then the account returns to Free.
  • The email address in the same section receives the receipt, the failed-payment notice and a renewal reminder several days in advance.
  • Platform can still set any plan manually: /setplan <id|tg> <plan>.

Bot menu

The main menu after /start / /menu. Buttons usually come two per row.

ItemWhat it does
🌐 SitesThe account's site list: settings, Online/Offline, snippet, deletion.
👥 TeamOperators / members of the account.
➕ InviteCode and deep link for a new operator.
💬 GroupsTelegram groups that take requests: connect, assign to a site, disconnect.
🔗 Web dashboardMagic login link (single use, ~10 min).
🗺 RoutesWho receives dialogs from which site/page.
⚙️ PanelQuick access: ops / sites / routes.
📝 TemplatesCanned replies (Basic and above).
💳 Plans and billingPrices, card payment, invoices (owner).
👑 OwnerHand ownership over to another member.
🗑 Delete accountCascade deletion after confirming by name.
🛠 PlatformADMIN_IDS only: account list / setplan.

Site card

  • Online / Offline — pause the widget (chat offline).
  • Settings — branding fields, invite, GDPR and so on (two buttons per row).
  • Operator — route this site to a person or a group.
  • Delete — confirmed by the site name.

Bot commands

CommandWhoMeaning
/start [CODE]everyoneOnboarding / redeem an invite.
/menumemberThe account main menu.
/helpeveryoneCommand reference for your role.
/panelmemberMagic link to the web dashboard.
/newsite [name | origin]admin+Create a site (+ CORS origins).
/sitesadmin+Site list.
/addgroupadmin+ in a groupConnect the group as a group operator (no chat_id needed).
/bindsite KEYadmin+ in a groupBind the group as the fallback chat.
/inviteadmin+Operator invite.
/op_me CODEanyoneAccept an invite.
/tplmemberList / add / del / send with reply + /tpl id.
/notememberNote on a dialog (Basic and above).
/releasememberRelease a dialog (+ ask for a rating).
/langeveryoneBot interface language: en / pl / de / ru.
/setrole id roleownerowner|admin|operator.
/crm on|offownerTurn the account CRM bridge on/off.
/deleteaccountownerDelete the account.
/setplanplatformChange the account plan.
/platformplatformAccount overview + link to /admin/platform/.
/idin a chatShow chat_id.

Web dashboard

Tenant login: the link from /panel or a token on /admin/login/. The platform owner has a separate entrance: /admin/platform/ (password admin_password).

SectionWhat for
OverviewCounters and recent dialogs; the company name; the CRM bridge for the owner — switch and webhook link (empty falls back to the one in config).
SitesCreation, snippet, full widget settings.
OperatorsMembers, invites, roles, groups.
RoutesAssignments: site → operator/group.
DialogsHistory, release, notes, rating.
TemplatesTemplate CRUD + rating summary (Basic and above).
AccountsPlatform only: plan, suspend, impersonate, delete.

Site settings

Available in the bot (“Settings”) and in the web dashboard under Sites → gear icon.

FieldMeaning
Name / title / subtitleThe chat header.
Greeting / logoThe first message and the brand.
Online from–to, TZ, pauseThe Online/Offline status.
Escalation (min)Alert when there is no answer.
Colour / position / offsetsThe widget button.
Language / sounden|pl|de|ru and an mp3 URL.
Allowed originsCORS: comma-separated domains or *.
Invite *Bubble invitation (Basic and above).
Visibility JSONWhere to show the button/invite (Basic and above).
GDPRConsent checkbox before the first send.

Visibility example

{"include":["/pricing","/contacts"],"exclude":["/admin"],"desktop":true,"mobile":true}

Website widget

<script async src="https://YOUR_DOMAIN/widget/webchatix.js"
  data-site-key="YOUR_KEY"></script>

Control from the page:

webchatix("show");   // show the button
webchatix("hide");   // hide it
webchatix("open");   // open the chat
webchatix("close");  // close the panel

The widget language follows data-lang, then the page <html lang>, then the browser; en / pl / de / ru are supported, with English as the fallback. After changing the settings, reload the client page (the widget version sits in the ?v= query).

If your site sets a Content-Security-Policy, allow the widget domain in three directives: script-src, style-src and connect-src. The widget loads its styling from a separate webchatix.css file, so you do not need to keep 'unsafe-inline' in style-src for it.

Operators and roles

  • owner — full control, plan requests, account deletion, CRM, ownership transfer.
  • admin — sites, invites, routes, settings.
  • operator — answers in dialogs, notes/templates depending on the plan.

One Telegram user = one owned account. In other people's accounts you can be an operator by invitation.

Groups

Besides people, a Telegram group can be an operator: requests arrive as a card in the chat and anyone in the group answers by replying to it. To connect one, add the bot to the group (menu → 💬 Groups → “Connect a group”) or run /addgroup inside it — no chat_id to type, the bot reads it itself. Groups do not count against the plan's operator limit.

Dialogs

  • The customer message goes to Telegram (group/operator according to the route).
  • Claim — takes the dialog; a system message lands in the history.
  • Transfer — only to an active member of the same account.
  • Release — you can ask the visitor for a rating.
  • Notes — visible to the team, not to the customer (Basic and above).
  • Templates — reply to the dialog plus /tpl id, or the template button → Reply.

Platform (application owner)

Telegram IDs from ADMIN_IDS / platform_tg_ids plus the admin_password.

  • Web: /admin/platform/ → accounts, setplan, suspend, impersonate, delete.
  • Bot: /platform, /setplan id|tg plan.

Impersonation is logged into platform_audit (who/IP/account).

Security and GDPR

  • Accounts are isolated by account_id.
  • The magic link is single use; link issuing is rate limited.
  • Suspend switches off the widget, the bot and the tenant dashboard.
  • CORS: set allowed_origins (do not leave * in production without a reason).
  • The GDPR checkbox comes before the customer's first message.
  • Upload quota depends on the plan (max_upload_mb).
  • No more than 10 new sites per hour per account.

Backup and deploy

SQLite backup script with rotation:

chmod +x scripts/backup-sqlite.sh
# daily cron:
15 3 * * * /path/to/chat-widget/scripts/backup-sqlite.sh

Copies: data/backups/chat_*.sqlite.gz (14 by default).

After updating the rewrite rules in aaPanel, add docs next to faq|contact|blog and the language prefixes pl|de|ru, then restart the bot.