cStar fires 35 webhook event types across 7 categories. Subscribe to the ones you care about. You don't have to take them all.
All payload fields are snake_case. The wrapper envelope (id, type, created_at, team_id, data) is the same for every event.
Categories
| Category | Events |
|---|---|
| Tickets | ticket.created, ticket.updated, ticket.closed, ticket.message_added, ticket.deleted, ticket.assigned |
| Customers | customer.created, customer.updated, customer.deleted, customer_group.created, customer_group.updated, customer_group.deleted |
| Articles | article.created, article.published, article.updated, article.deleted |
| Team | team.preferences_updated, agent.preferences_updated |
| Gamification | boss.spawned, boss.damaged, boss.defeated, player.level_up, player.achievement_unlocked, player.xp_gained, player.quest_completed, player.streak_milestone, social.one_up_sent, social.high_five_sent |
| Community | community_post.created, community_post.updated, community_post.status_changed, community_post.commented, community_post.deleted, community_post.voted |
| Surveys | survey.submitted |
Ticket Events
ticket.created
Fired when a new ticket is created via app, widget, API, or email.
{
"id": "evt_ticket_created_a1B2c3D4",
"type": "ticket.created",
"created_at": "2026-04-27T18:42:11.000Z",
"team_id": "team_01H8X9YZ7E0J3K4M5N6U",
"data": {
"ticket": {
"id": "tkt_01H8X9YZ7E0J3K4M5N6P",
"prefixed_id": "CST-1024",
"title": "Cannot reset password",
"status": "new",
"priority": "normal",
"channel": "widget",
"customer_id": "cus_01H8X9YZ7E0J3K4M5N6Q",
"created_at": "2026-04-27T18:42:11.000Z"
},
"customer": {
"id": "cus_01H8X9YZ7E0J3K4M5N6Q",
"name": "Casey Patel",
"email": "casey@example.com"
}
}
}
ticket.updated
Fired when a ticket's status, priority, assignment, tags, title, notes, or custom fields change. The changes block uses { field: { from, to } } shape and may contain any subset of watched fields.
{
"data": {
"ticket": {
"id": "tkt_01H8X9YZ7E0J3K4M5N6P",
"prefixed_id": "CST-1024",
"status": "open",
"priority": "high"
},
"changes": {
"priority": { "from": "normal", "to": "high" },
"tags": { "from": ["bug"], "to": ["bug", "feature-request"] }
}
}
}
ticket.closed
Fired when a ticket is resolved or closed.
{
"data": {
"ticket": {
"id": "tkt_01H8X9YZ7E0J3K4M5N6P",
"prefixed_id": "CST-1024",
"status": "resolved",
"resolved_at": "2026-04-27T19:08:43.000Z"
},
"changes": { "status": { "from": "open", "to": "resolved" } }
}
}
ticket.message_added
Fired when a new message is added to a ticket. The customer block is omitted on agent or system replies.
{
"data": {
"ticket": { "id": "tkt_01H8X9YZ7E0J3K4M5N6P", "dashboard_url": "..." },
"message": {
"id": "msg_01H8X9YZ7E0J3K4M5N6R",
"sender": "agent",
"sender_name": "Riley",
"content": "I just sent a reset link to your inbox.",
"created_at": "2026-04-27T18:55:02.000Z"
},
"customer": { "id": "cus_01H8X9YZ7E0J3K4M5N6Q", "name": "Casey Patel", "email": "casey@example.com" }
}
}
ticket.deleted
Fired when a ticket is deleted. The deleted row's title and metadata aren't included because the row is gone by the time the webhook is sent.
{ "data": { "id": "CST-1024" } }
ticket.assigned
Fired when a ticket is assigned to an agent.
{
"data": {
"ticket": { "id": "tkt_01H8X9YZ7E0J3K4M5N6P", "prefixed_id": "CST-1024" },
"assignee": { "id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley", "email": "riley@acme.test" },
"previous_assignee": null
}
}
Customer Events
customer.created
{
"data": {
"customer": {
"id": "cus_01H8X9YZ7E0J3K4M5N6Q",
"name": "Casey Patel",
"email": "casey@example.com",
"status": "active",
"tags": ["trial"],
"created_at": "2026-04-27T18:42:11.000Z"
}
}
}
customer.updated
Same shape as customer.created plus a changes block.
{
"data": {
"customer": { "id": "cus_01H8X9YZ7E0J3K4M5N6Q", "tags": ["trial", "paying"] },
"changes": { "tags": { "from": ["trial"], "to": ["trial", "paying"] } }
}
}
customer.deleted
Sends only the customer ID.
{ "data": { "id": "cus_01H8X9YZ7E0J3K4M5N6Q" } }
customer_group.created, customer_group.updated, customer_group.deleted
Customer group lifecycle. The deleted variant sends only { customer_group: { id } }.
{
"data": {
"group": {
"id": "grp_01H8X9YZ7E0J3K4M5N6T",
"name": "Pro Plan",
"color": "indigo",
"member_count": 38
}
}
}
Article Events
article.created, article.published, article.updated
{
"data": {
"article": {
"id": "art_01H8X9YZ7E0J3K4M5N6U",
"title": "How to reset your password",
"slug": "how-to-reset-your-password",
"is_public": true,
"published_at": "2026-04-27T19:00:00.000Z"
}
}
}
article.deleted
Sends only the article ID.
{ "data": { "id": "art_01H8X9YZ7E0J3K4M5N6U" } }
Team Events
team.preferences_updated
Fires when team-wide UX preferences change. Useful for keeping CRM mirrors in sync with feature toggles like bossBattlesEnabled.
{
"data": {
"team_id": "team_01H8X9YZ7E0J3K4M5N6U",
"changed": ["bossBattlesEnabled"],
"preferences": { "bossBattlesEnabled": false }
}
}
agent.preferences_updated
Per-user preferences (e.g., boringMode toggled).
{
"data": {
"team_id": "team_01H8X9YZ7E0J3K4M5N6U",
"member_id": "mem_01H8X9YZ7E0J3K4M5N6U",
"agent_id": "agt_01H8X9YZ7E0J3K4M5N6U",
"changed": ["boringMode"],
"preferences": { "boringMode": true }
}
}
Gamification Events
boss.spawned
{
"data": {
"boss": { "id": "boss_thunder_drake", "name": "The Thunder Drake", "level": 4, "max_hp": 1200 }
}
}
boss.damaged
Fires every time a closed ticket damages the active boss.
{
"data": {
"boss": { "id": "boss_thunder_drake", "current_hp": 740 },
"damage": 120,
"by": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" }
}
}
boss.defeated
{
"data": {
"boss": { "id": "boss_thunder_drake", "name": "The Thunder Drake" },
"final_blow_by": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"team_xp_awarded": 1500
}
}
player.level_up
{
"data": {
"player": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"level": { "from": 7, "to": 8 },
"title_unlocked": "Apprentice Healer"
}
}
player.achievement_unlocked
Note the namespace: it's player.achievement_unlocked, not achievement.unlocked.
{
"data": {
"player": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"achievement": { "id": "first_resolve", "name": "First Resolve", "xp": 50 }
}
}
player.xp_gained
{
"data": {
"player": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"amount": 75,
"reason": "ticket.resolved",
"ticket_id": "tkt_01H8X9YZ7E0J3K4M5N6P"
}
}
player.quest_completed
{
"data": {
"player": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"quest": { "id": "resolve_5_tickets", "name": "Resolve 5 tickets today", "xp": 100 }
}
}
player.streak_milestone
Fires at 3, 5, 10, and 25 day milestones.
{
"data": {
"player": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"streak_days": 5,
"milestone": 5
}
}
social.one_up_sent
{
"data": {
"from": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6S", "name": "Riley" },
"to": { "agent_id": "usr_01H8X9YZ7E0J3K4M5N6V", "name": "Sam" },
"ticket_id": "tkt_01H8X9YZ7E0J3K4M5N6P",
"message": "Great empathy on this one"
}
}
social.high_five_sent
Cross-team recognition.
{
"data": {
"from_team": { "id": "team_acme", "name": "Acme Support" },
"to_team": { "id": "team_globex", "name": "Globex Support" },
"message": "Thanks for the assist!"
}
}
Community Events
community_post.created
{
"data": {
"post": {
"id": "post_01H8X9YZ7E0J3K4M5N6W",
"prefixed_id": "IDEA-42",
"title": "Add Slack-style threading to tickets",
"status": "open",
"visibility": "public",
"topic": "feature-requests",
"created_at": "2026-04-27T18:42:11.000Z"
}
}
}
community_post.updated
Same shape as created.
community_post.status_changed
Fires on transitions like Open to Planned to Completed.
{
"data": {
"post": {
"id": "post_01H8X9YZ7E0J3K4M5N6W",
"title": "Add Slack-style threading to tickets",
"status": "planned",
"visibility": "public"
}
}
}
community_post.commented
{
"data": {
"comment": {
"id": "cmt_01H8X9YZ7E0J3K4M5N6X",
"post_id": "post_01H8X9YZ7E0J3K4M5N6W",
"content": "Bumping for visibility.",
"author_id": "cus_01H8X9YZ7E0J3K4M5N6Q",
"created_at": "2026-04-27T18:55:02.000Z"
}
}
}
community_post.deleted
{
"data": {
"post": {
"id": "post_01H8X9YZ7E0J3K4M5N6W",
"prefixed_id": "IDEA-42",
"title": "Add Slack-style threading to tickets"
}
}
}
prefixed_id and title are best-effort. Always present from the dashboard, sometimes absent when deleted via the v1 API. Subscribers should rely on id only.
community_post.voted
{
"data": {
"post": { "id": "post_01H8X9YZ7E0J3K4M5N6W", "vote_count": 13 },
"voter": { "id": "cus_01H8X9YZ7E0J3K4M5N6Q" },
"direction": "up"
}
}
Survey Events
survey.submitted
{
"data": {
"survey": {
"id": "svy_01H8X9YZ7E0J3K4M5N6Y",
"ticket_id": "tkt_01H8X9YZ7E0J3K4M5N6P",
"score": 5,
"comment": "Resolved fast, thank you!",
"submitted_at": "2026-04-27T19:30:00.000Z"
},
"customer": {
"id": "cus_01H8X9YZ7E0J3K4M5N6Q",
"email": "casey@example.com"
}
}
}
Flat Payload Mode
When Flat Payload is enabled on a webhook, nested fields in data are duplicated at a flat root key with underscore-separated names. Easier to use in visual automation builders like Zapier:
{
"id": "evt_ticket_created_a1B2c3D4",
"type": "ticket.created",
"data": { "ticket": { "id": "tkt_abc", "title": "Help" } },
"flat": { "ticket_id": "tkt_abc", "ticket_title": "Help" }
}