Two places a tool can run
Pick the mode from where the work belongs. It is the first decision, and it changes what you build.Webhook mode
We POST the arguments to your endpoint and hand the AI what you return. Use it for anything that lives on your servers — CRM, booking, pricing, scoring.
Client mode
The tool runs in your visitor’s own browser, inside the session they are already signed into. Use it to act on the page in front of them.
Webhook mode
1
Define the function
Go to Developer → Tools and create a Custom Function: name, description, JSON-schema arguments, and the URL Waterr will call when the AI invokes it.
2
Mention it in a scenario prompt
Open your scenario, put your cursor in the script, and
@-mention the function. The mention wires it to the scenario for that meeting.3
(Optional) Set filler + on-resolve behavior
on_call— what the AI says when it decides to invoke the function.static_filler— a fixed phrase spoken while the tool call is in flight, so the participant hears something instead of silence.on_resolve— how the AI weaves the result back into the conversation.
Client mode — acting on your website
The assistant in your site’s chat widget can move the visitor around, prefill a form, or read their account — by asking your page to do it. Your page decides whether and how.1
Define the function
Developer → Tools → New tool, and set Execution mode to
Client. Leave the webhook URL empty.Give the arguments an enum, not free text. The model then picks from things you actually have, and nothing said in conversation can be turned into an arbitrary URL.2
Attach it to your scenario
@-mention it in the scenario script, the same as any other tool.3
Register a handler on your page
One handler per tool name, next to your embed snippet:Once the loader has landed you can register directly with
Waterr.on(name, fn).4
Try it
Open your site, start the call, and ask in plain language — “show me your pricing.”
What you return is what the AI hears
Handlers may be sync or async. The return value becomes the tool result, and throwing tells the persona the action failed so it can say so and carry on:Your handlers are the security boundary
The AI can only invoke names you registered — no matter what someone says to it. Authorize inside the handler: check the user, throw if they are not allowed, or show your own confirmation dialog before acting. Never register something you would not let a visitor trigger by asking for it politely.Client-mode tools need a page listening for them, so they work on the sidebar widget only. The same scenario used in a meeting room or over the phone will call the tool and time out. See which embeds support this.
Use cases
CRM lookups
Fetch account context when the participant identifies themselves.
Booking
Schedule a follow-up call at the end of a discovery session.
Live scoring
Score a participant answer against a rubric and adapt the next question.
Inventory / pricing
Quote real numbers instead of the AI guessing.
Guided navigation
Walk a visitor to the page they just asked about, mid-sentence.
Account self-service
Read the signed-in visitor’s plan or usage without them leaving the chat.
Related
- Custom Functions API — full schema, endpoints, the client-mode wire protocol, and limits.
- Live Website Events — the other direction: your site telling the assistant what the visitor is doing.
- Embed API — putting the widget on an authenticated page.

