Connect
- Open Settings → Integrations → Kapso and click Connect Kapso.
- Paste your Kapso project API key. Create one in your Kapso project’s settings under API Keys. Zelto uses it to list your WhatsApp numbers, read conversations, and register its webhook.
Import your numbers
In Kapso, an agent speaks as a WhatsApp phone number, so in Zelto each imported number is an agent. Import from Agents → Add Agent → Kapso, or from the Get started connect step, which lists every number in the project with its recent conversation volume. Importing a number does three things:- Registers Zelto’s webhook on the number in Kapso, subscribed to the
whatsapp.conversation.inactiveandwhatsapp.conversation.endedevents with a 60-minute inactivity window. Nothing to paste. - Backfills the conversations active in the last 30 days (or the last 2000, whichever is smaller) from the onboarding picker, 14 days from the Agents page.
- Reads the agent’s prompt when the number is answered by a Kapso Workflow:
Zelto follows the workflow bound to the number and stores its
agentnode’s system prompt on the Zelto agent. Numbers answered by an external agent (your own server behind a Kapso webhook) import without a prompt — Kapso has none to give.
How a WhatsApp thread becomes conversations
A Kapso conversation is one contact’s whole thread with your number. It lives until someone closes it by hand, so it is not the right unit to analyze: a repeat customer would be one endless transcript. Zelto instead splits each thread into sessions — bursts of messages with no gap of 60 minutes or more inside them — and stores one Zelto conversation per session. A session is ingested once it has been quiet for the gap (that is exactly when Kapso fireswhatsapp.conversation.inactive) or when the thread is
ended. Inbound messages are the customer’s turns; outbound messages are the
agent’s. Images, documents, locations, interactive replies and audio (using
Kapso’s transcript) render as bracketed turns.
Kapso does not record whether an outbound message came from the AI, a human in
the Kapso inbox, or your API. Zelto attributes every outbound turn to the agent.
If a human took the conversation over, their replies read as agent turns.
Delivery paths
- Webhook (primary) — the session-closed events above. Kapso signs each delivery with the shared secret shown under Manage; Zelto verifies it and only accepts events for numbers you imported.
- Hourly sync (safety net) — every imported number is re-read on the hour for threads active since the last sync, so a paused or missed webhook is caught within the hour. The two paths dedupe on the session, so nothing lands twice.
Registering the webhook by hand
If Zelto could not register the webhook (for example a key without webhook permissions), open Settings → Integrations → Kapso → Manage and create the webhook in Kapso yourself:- URL — the webhook URL shown on the card.
- Secret — the webhook secret shown on the card, pasted as
secret_key. - Events —
whatsapp.conversation.inactiveandwhatsapp.conversation.ended. - Inactivity window — 60 minutes, so Kapso’s idea of “quiet” matches Zelto’s session boundary.
Verify the first conversation
Message your WhatsApp number, exchange a few turns, then wait for the quiet period to pass. The session appears in Conversations with the Kapso badge on its agent. Until then, the agent’s Connections card shows the last webhook Kapso delivered and flags a rejected one — a401 almost
always means the secret on the Kapso webhook doesn’t match the one on the card.
Connection status & disconnecting
The card lists the connected projects, the webhook URL and the shared secret. Disconnect removes the stored API key and, best-effort, the webhooks Zelto registered on your numbers with that key; already-ingested conversations are kept.Related
- Chatbot & text conversations — the generic upload path for text agents on other platforms.
- Conversations — where WhatsApp sessions land.
- Agents — how Zelto models each number.
- Findings — what analysis surfaces from each session.

