Webhooks
Event catalog
Every event type you can subscribe to, grouped by what it is about. The list is generated from the API's source, so it always matches what the API accepts.
Subscribing
Subscribe to single events (lead.won), a group (lead.*) or everything (*). Each event's data.object has the id and object of the record it is about plus the fields listed below; the envelope around it is the same for every event.
field, label, old, new, from and to on change events: field is the field's key, label its name in the workspace's language, old and new the stored values (ids for references), and from and to the same values as shown to people (names instead of ids, where Kweko has them).
Events marked as not sent yet are accepted in subscriptions so you can prepare for them.
Events
lead.*
| Event | When | data.object |
|---|---|---|
lead.created | A lead was created: in Kweko, through the API, by an import, from an inbound message or call, or by an integration. | From the API and the Kweko app: number, name, amount, currency, pipeline_id, stage_id, owner_id, source, tags. Leads created from messages, calls and integrations carry their own fields. |
lead.updated | In the catalog, but Kweko does not send it yet. You can subscribe to it today. | Not documented yet. |
lead.stage_changed | A lead moved to another stage. | from, to (stage ids), pipeline_id, from_type, to_type (incoming, open, won or lost). |
lead.pipeline_changed | A lead moved to another pipeline. | from, to (pipeline ids). |
lead.owner_changed | A lead got another owner. | field, label, old, new, from, to. |
lead.field_changed | A field of a lead changed (one event per field). | field (the field key), label (in the workspace's language), old, new, from, to. |
lead.won | A lead reached a won stage. | stage_id, amount, loss_reason. |
lead.lost | A lead reached a lost stage. | stage_id, amount, loss_reason. |
lead.reopened | Listed in the catalog. | Not documented yet. |
lead.deleted | A lead was deleted. | name, number. |
lead.restored | A deleted lead was restored. | name. |
contact.*
| Event | When | data.object |
|---|---|---|
contact.created | A contact was created. | From the API and the Kweko app: name, phones, tags. |
contact.updated | A field of a contact changed (one event per field). | field, label, old, new, from, to. |
contact.deleted | A contact was deleted. | name. |
contact.opted_out | A contact asked not to get marketing messages: STOP in a chat, the unsubscribe link of an SMS broadcast, or a member. Broadcasts and follow-up sequences skip them. | contact_id, source (keyword, link or manual). |
contact.opt_out_removed | A member removed a contact's opt-out (the client asked to hear from you again). | contact_id. |
company.*
| Event | When | data.object |
|---|---|---|
company.created | A company was created. | name, tags. |
company.updated | A field of a company changed (one event per field). | field, label, old, new, from, to. |
company.deleted | A company was deleted. | name. |
message.*
| Event | When | data.object |
|---|---|---|
message.received | A client wrote in a connected channel. | conversation_id, message_id, channel_id, channel, text, lead_id, contact_id; button when the client tapped a reply button (its id; text is its label), start for a Telegram /start link payload, new_conversation on the first message of a conversation. |
message.sent | An outgoing message was accepted by the channel, or the owner of a Telegram Business account wrote to a client from their own Telegram app (then external is true). | message_id, conversation_id, status; for owner messages also external, channel_id, channel, text, lead_id, contact_id. |
message.delivered | The channel reported an outgoing message as delivered. | message_id, conversation_id, status. |
message.read | The channel reported an outgoing message as read. | message_id, conversation_id, status. |
message.failed | An outgoing message could not be sent. | message_id, conversation_id, status, error. |
message.edited | A message was edited in the messenger (Telegram bot and Telegram Business chats). | message_id, conversation_id, channel_id, channel, text (the new text). |
message.deleted | A message was deleted in the messenger (Telegram Business chats). It stays in the Kweko history, marked deleted. | message_id, conversation_id, channel_id, channel. |
conversation.*
| Event | When | data.object |
|---|---|---|
conversation.created | The first message of a new conversation arrived. | The same fields as message.received. |
conversation.assigned | A conversation got an assignee (for example when a member first replies). | conversation_id, assignee_id. |
conversation.status_changed | A conversation was resolved, reopened or snoozed. | conversation_id, from, to, and until for snoozes. |
conversation.snoozed | A conversation was snoozed. | conversation_id, from, to, until. |
conversation.opted_out | Listed in the catalog. | Not documented yet. |
bot.*
| Event | When | data.object |
|---|---|---|
bot.started | A chat bot flow or the AI operator started talking in a conversation (one at a time per conversation). | conversation_id, automation_id, automation_name, kind (bot or agent), run_id. |
bot.handoff | A bot or the AI operator handed the conversation to a person (a handoff step, the client asked for a person, a low-confidence or ungrounded answer, or a turn or credit cap). The assignee (or the admins) are notified. | conversation_id, lead_id, reason, automation_name, member_ids. |
bot.stopped | A member took a conversation over from the bot with “Take over”. | conversation_id. |
sequence.*
| Event | When | data.object |
|---|---|---|
sequence.enrolled | A lead was enrolled in a follow-up sequence (by a member, in bulk, or by an automation). | lead_id, sequence_id, sequence_name, run_id. |
sequence.exited | A follow-up sequence stopped early for a lead: the client replied, the lead changed stage, or it was won or lost. | lead_id, sequence_id, sequence_name, run_id, reason (replied, stage_changed or lead_closed). |
broadcast.*
| Event | When | data.object |
|---|---|---|
broadcast.scheduled | An owner or admin confirmed a broadcast for a later time, or moved the time of a scheduled one. | broadcast_id, name, channel, scheduled_at, recipients (the confirmed count; the audience is checked again when it starts), estimated_cost, rescheduled, and previous_scheduled_at when it was moved. |
broadcast.unscheduled | A scheduled broadcast was called off before it started and is a draft again (canceled, or its audience or channel changed). | broadcast_id, name, scheduled_at, reason (canceled or audience_changed). |
broadcast.started | An owner or admin confirmed a broadcast, or its scheduled time came; sending starts at a paced rate. | broadcast_id, name, channel (telegram, whatsapp or sms), recipients, skipped (counts by reason), estimated_cost, and scheduled_at when it was scheduled. |
broadcast.completed | Every recipient of a broadcast was handled. | broadcast_id, name, channel, sent, failed, skipped. |
broadcast.paused | A broadcast was paused. | broadcast_id, name. |
broadcast.resumed | A paused broadcast was resumed. | broadcast_id, name. |
broadcast.canceled | A broadcast was canceled; recipients not reached yet are skipped. | broadcast_id, name. |
broadcast.failed | A scheduled broadcast could not start at its time (plan or daily limit, channel disconnected, nobody left to reach, template no longer approved); nothing was sent and the person who scheduled it is notified. | broadcast_id, name, channel, scheduled_at, reason (monthly_limit, daily_limit, channel_unavailable, no_recipients, template, audience, too_many_recipients or no_permission). |
task.*
| Event | When | data.object |
|---|---|---|
task.created | A task was created. | task_id, title, type, due_at, assignee_id, and entity_type, entity_id when it belongs to a record. |
task.updated | A task was changed. | The task.created fields and changed (the changed field names). |
task.completed | A task was completed. | The task.created fields and result. |
task.overdue | A task passed its due time without being completed. | The task.created fields. |
task.snoozed | A task was snoozed. | The task.created fields and until. |
task.deleted | Listed in the catalog. | Not documented yet. |
note.*
| Event | When | data.object |
|---|---|---|
note.created | A note was added to a lead, contact or company. id and object are those of the record. | note_id, mentions (member ids). |
note.updated | Listed in the catalog. | Not documented yet. |
note.deleted | Listed in the catalog. | Not documented yet. |
product.*
| Event | When | data.object |
|---|---|---|
product.created | A product was added to the catalog. | name, price. |
product.updated | A product was changed. | name, price. |
product.archived | A product was archived. | name, price. |
product.deleted | Listed in the catalog. | Not documented yet. |
form.*
| Event | When | data.object |
|---|---|---|
form.submitted | A visitor sent a Kweko website form (embedded with widget.js or on the hosted page). The lead it created or was added to is the event's record; a new lead also sends lead.created. | form_id, form_name, submission_id, lead_id, contact_id, outcome (lead_created or note_added), answers (field, label, value), utm, referrer, landing_page. |
booking.*
| Event | When | data.object |
|---|---|---|
booking.created | A customer booked online (hosted page or widget.js). status is confirmed, or pending when bookings need approval. The contact (and lead, when the service creates one) are new or found by phone. | id, status, service_name, member_id, customer_name, starts_at, ends_at, when (workspace time), contact_id, lead_id, task_id. |
booking.rescheduled | The customer moved their booking with the manage link. | The booking.created fields plus from and from_when. |
booking.canceled | A booking was canceled by the customer or by staff. | The booking.created fields plus canceled_by (customer or staff) and from_status. |
booking.status_changed | Staff confirmed a request or marked a visit as completed or no_show. | The booking.created fields plus from_status. |
proposal.*
| Event | When | data.object |
|---|---|---|
proposal.viewed | The client opened an online proposal page (a document shared as a link). Counted once per visitor per 30 minutes; link previews and the seller's own previews are not. | proposal_id, lead_id, document_id, invoice_id, title, kind, first (the first open), view_count, device. |
proposal.accepted | The client accepted an online proposal (typed name and a checkbox; not a digital signature). | The proposal.viewed identifiers, accepted_name, accepted_at. |
proposal.declined | The client declined an online proposal. | The proposal.viewed identifiers, reason (may be empty). |
bulk_job.*
| Event | When | data.object |
|---|---|---|
bulk_job.started | A bulk change started in the background. | entity, action, total. |
bulk_job.completed | A bulk change finished. | Not documented yet. |
bulk_job.undone | A bulk change was undone. | Not documented yet. |
limit.*
| Event | When | data.object |
|---|---|---|
limit.warning | The workspace is close to a plan limit. | key, limit, current, plan. |
limit.reached | The workspace reached a plan limit. | key, limit, current, plan. |
restriction.*
| Event | When | data.object |
|---|---|---|
restriction.applied | Kweko paused a feature of the workspace (anti-abuse protection). | stage, feature, reason_code. |
restriction.lifted | A restriction ended. | Not documented yet. |
pipeline.*
| Event | When | data.object |
|---|---|---|
pipeline.updated | A pipeline was renamed or its settings changed. | name. |
field.*
| Event | When | data.object |
|---|---|---|
field.created | A custom field was created. | entity, key, type. |
field.updated | A custom field was changed. | Not documented yet. |
field.deleted | A custom field was deleted. | Not documented yet. |
member.*
| Event | When | data.object |
|---|---|---|
member.joined | Someone accepted an invite and joined the workspace. | role. |
member.deactivated | A member was deactivated. | status. |
webhook.*
| Event | When | data.object |
|---|---|---|
webhook.disabled | Kweko disabled one of your webhooks after failed deliveries. | reason, last_status, last_error. |