FAQ

Everything you need to know to get the widget on your site, train the bot, and route the conversations you can't answer to your team.

Installing the widget

After signing up, every tenant gets a unique tenant_id (you'll see it in your admin URL: /admin/<tenant_id>). Drop this script tag anywhere before </body> on every page where you want the chat bubble to appear:

<script async src="https://enolachat.com/widget.js" data-tenant="YOUR_TENANT_ID"></script>

The script is tiny (a few KB). It injects an iframe scoped to your tenant so the chat UI's CSS and JavaScript can never collide with your site's. Your full snippet — with your tenant id pre-filled — lives at /admin → Install.

Where to paste it: a global footer, a layout component, or Google Tag Manager all work. The bubble appears bottom-right on every page that loads the script.

Training the bot

The bot answers based on the knowledge base you give it — a plain-text blob attached to your tenant. There are two ways to fill it:

  1. Paste FAQ text directly into Settings → Manual knowledge snippets. Best for small, hand-curated FAQs. This stays put when you re-index.
  2. Re-index a list of help-center URLs. In Settings, add one URL per line in the URL list, click Save, then Re-index URLs now. The server scrapes each page and writes the combined text into the Re-indexed content section. Both sections are merged together as the bot's context.

The scraper is a single-page fetcher — it does not follow links or expand sitemaps yet, so list every URL you want included. When FIRECRAWL_API_KEY is configured, pages are scraped via Firecrawl, which extracts just the main content (no nav, footer, or sidebar noise) and renders JavaScript-heavy pages. Without the key it falls back to a basic HTML fetcher that only sees the initial server-rendered HTML and keeps page chrome.

Each chat request gets the entire knowledge base as system-prompt context. That's fine for ~10 KB of FAQs; once you have many MB of docs you'll want real RAG retrieval (chunking + embeddings + top-k lookup). The schema already has kb_chunks with pgvector ready for that upgrade.

Escalation to humans

When a customer asks something the bot doesn't know, two things can happen:

  • Auto-escalation. The system prompt instructs Claude to reply with "I'm escalating this to our human support team — one moment." whenever the answer isn't in the knowledge base. The widget detects that phrase in the assistant's response and automatically posts the transcript to your Slack channel without the customer having to do anything.
  • Manual escalation. After a few messages the chat shows a "Talk to a human →" button. Clicking it sends the same transcript to Slack and tells the customer help is on the way.

Both routes post to your tenant's slack_webhook_url. If you haven't configured one, escalation silently succeeds on the widget side (no confusing error for the customer) but nothing arrives in Slack. Set up Slack next to fix that.

Setting up Slack

Slack escalations use an incoming webhook — one URL per channel, no OAuth flow required.

  1. Decide which channel should receive escalations (e.g. #support-handoffs).
  2. Go to api.slack.com/apps Create New AppFrom scratch. Name it (e.g. Enola Escalations) and pick your workspace.
  3. In the left sidebar choose Incoming Webhooks and toggle Activate Incoming Webhooks to On.
  4. Click Add New Webhook to Workspace → pick the channel → click Allow. Slack shows you a URL like https://hooks.slack.com/services/T0xxx/B0xxx/.... Copy it.
  5. In Enola open Settings → paste the URL into Slack webhook URL (escalations) Save.
  6. Test it: open the widget, send 2–3 messages that aren't covered by your KB, and either let the bot escalate itself or click Talk to a human. A formatted transcript should land in your Slack channel within a second.

The Slack message includes the tenant name, tenant id, and the full conversation. With two-way chat connected (Settings → Add to Slack), each conversation opens its own Slack thread, and when your team replies in that thread the message appears right back inside the customer's widget — a true bidirectional handoff. If you only set the legacy incoming webhook, escalation still works one-way (transcript posted to Slack, no replies back).

Branding & welcome message

Settings has fields for Display name, Brand color, and Welcome message. The live preview on the right of the form updates instantly as you type, so you can dial in the look before saving.

System prompt is the instruction layer the LLM sees on every request. Use it to set tone ("Be terse and friendly. Use British English.") and constraints ("Never quote a price; refer the user to billing instead."). The escalation phrase is appended automatically, so you don't need to include it.

Plans: Hobby vs Pro

There are two tiers:

  • Hobby — $0. Basic chat with no AI. Every visitor message is forwarded straight to your Slack channel and the widget shows a short acknowledgment ("our team has been notified"). It's a clean Slack-backed contact widget — embeddable on unlimited pages, with your branding and chat history.
  • Pro — $29/mo. Everything in Hobby plus the AI: answers grounded in your knowledge base, help-center URL ingestion, and smart auto-escalation to Slack only when the bot can't answer.

A workspace is on Pro while its subscription is trialing or active. If you never subscribe, or you downgrade, you simply fall back to Hobby — the widget keeps working, it just stops using AI. You're never hard-blocked.

Downgrading respects your billing cycle. Click Downgrade to Hobby on the Billing tab and you keep Pro (AI) for the rest of the time you've already paid for; the switch to Hobby happens automatically when that period ends. Changed your mind? Keep Pro cancels the scheduled downgrade.

Billing & trial

Every signup includes a 14-day free trial. The card is collected up front via Stripe Checkout, but no charge happens until day 15. Cancel anytime from the Stripe Customer Portal (linked from the Billing tab).

If your subscription lapses (past_due, canceled), you aren't cut off — the workspace simply drops to the free Hobby tier, so the widget keeps running and forwards messages to Slack without AI. Reactivate Pro anytime by updating your card in the portal or starting a new subscription.

Invoices, payment method, and cancellation all live in the Customer Portal — we don't build our own invoice UI because Stripe's is more thorough and stays compliant for us.

Question not covered here? Sign in and use the chat bubble on your own admin page — that's your own bot answering your own questions, which is the best dogfooding loop we have.