Install
1
Grab your snippet
Go to AI agents, open the agent, select the Channels tab and click Copy snippet under Embed snippet in the Web widget card. Each AI agent has its own widget and snippet. It looks like this:Always copy the snippet from Keloa: it holds the exact loader URL. The
agent value in that URL is your agent ID. The first line defines Keloa(…), so your page can call it before the widget has loaded.2
Paste before </body>
Drop the snippet just before the closing
</body> tag of your site. Every page that includes it will show the widget.Framework-specific notes:- WordPress — Appearance → Theme File Editor →
footer.php, or any insert-header plugin. - Webflow / Squarespace / Wix — Settings → Custom code → Footer.
- Next.js —
app/layout.tsxinside<body>, or usenext/scriptwithstrategy="afterInteractive". - Shopify (theme) —
theme.liquidbefore</body>.
3
Test
Open your site in an incognito window. A chat bubble appears in the bottom-right (or bottom-left, if you changed it). Click it, say hi, and watch the conversation arrive in your Inbox.
Configuration
Each AI agent has its own widget. Everything below is set per agent: go to AI agents, open the agent and select the Channels tab. The settings live in the Web widget card. Changes save automatically (the card shows Auto-saving, then Saved) and reach your site on the next loader fetch (CDN cache 60 seconds).Appearance
- Brand color — bubble and header background. Pick a colour or paste a hex value.
- Launcher position — Right (default) or Left.
- Header display name — the name in the widget header. Falls back to the AI agent’s name.
- Welcome message — the greeting shown when no intro bubbles are set. Leave it empty to use the built-in greeting.
- Quick questions — up to 6 chips that visitors can tap on a fresh chat instead of typing. Auto-seeded from your onboarding site scan and editable any time.
- Business-hours message — shown when the team is offline.
Intro bubbles
Up to 5 short “hello” bubbles shown when the widget opens. If the list is empty, the Welcome message is used instead.Privacy policy URL
Optional link in the small footer of the widget. Use it to point at your privacy policy.Allowed origins
Set per AI agent, under AI agents → your agent → Channels → Web widget → Allowed origins. Empty means the widget loads on any site that includes the snippet. Add hosts to restrict it, which helps when a third party copies your snippet onto an unrelated site.- Enter a host without
https://, a port or a path:www.acme.com. An exact host matches only itself, soacme.comdoesn’t coverwww.acme.com. *.acme.commatches every subdomain ofacme.com, but notacme.comitself.- Only add a wildcard for a domain you control. Keloa refuses wildcards over public suffixes (from the Public Suffix List) and over known shared-hosting platforms, such as
*.com,*.nl,*.co.uk,*.vercel.app,*.github.ioor*.myshopify.com. Keloa can’t know every hosting platform, so a wildcard it accepts isn’t proof that you control every site under it. For a site on a hosting platform, add its exact address (acme.vercel.app). - A host with non-ASCII letters is saved in its punycode form, which is what browsers send:
*.bücher.debecomes*.xn--bcher-kva.de.
localhost, 127.0.0.1, *.test and *.localhost also work over http and on any port.
Working hours (Business+)
Working hours configured in Settings → Workspace → Business hours are visible to the AI via the system prompt and surfaced in the widget when the customer asks about availability. Outside hours, the AI sets expectations on response time rather than promising live help. The hours field is a per-day window with a workspace timezone (Europe/Amsterdam by default). Enabling and editing this field requires the working_hours cap, available on Business and Scale plans.
Proactive triggers (Business+)
Coming soon. Proactive triggers are not yet shipped: the Web widget card has no setting for them yet. They will auto-open the widget with a contextual greeting, for example after some time on the page, at a scroll depth or on exit intent.
Branding (Business+)
Hide the small “Powered by Keloa” badge in the widget footer with the Branding switch in the Web widget card. Two-step gate: your plan must include thewidget_unbranded cap and you must turn the switch on.
Loading behaviour
- The loader script is small, served
async, and does nothing until the bubble is hovered or clicked. - The full widget iframe is lazy-loaded the first time the visitor interacts.
- A first-party session token is stored in
localStorageso returning visitors keep their conversation context. No cross-site cookies. - Conversations of signed-in users are never stored in the browser; they load from Keloa after the user’s token is verified.
- The public config endpoint (
/widget/v1/config) is cached for 60 seconds at the edge.
What the visitor experiences
Advanced
Identify signed-in users
If your site or app has accounts, your backend can sign a short-lived token that tells the widget who the signed-in user is. Keloa verifies it on every request, so nobody can chat as one of your users. Your team sees the user’s verified details in the inbox, and their conversations follow them across devices.identify call with just an email or name is ignored. See Identity verification for setup, server code samples and security guidance.
Plan caps for the widget
See Billing & plans for the full picture.