[{"data":1,"prerenderedAt":41},["ShallowReactive",2],{"blog-post-introducing-webhooks-send-your-kommunity-events-anywhere":3,"blog-related-introducing-webhooks-send-your-kommunity-events-anywhere":20},{"data":4},{"slug":5,"title":6,"description":7,"content":8,"photo":9,"draft":10,"created_at":11,"updated_at":12,"category":13,"user":16},"introducing-webhooks-send-your-kommunity-events-anywhere","Introducing Webhooks: send your Kommunity events anywhere","Point Kommunity at your own endpoint and pipe RSVPs, ticket sales, and member events into your stack in real time.","\u003Cp>Until now, the way to connect Kommunity to your other tools was Zapier. It&#39;s great — but it means everything has to route through a third party, and it stops where Zapier stops.\u003C/p>\n\u003Cp>Today we&#39;re adding a second, more direct option: \u003Cstrong>your own webhooks\u003C/strong>. Point Kommunity at any URL you control and we&#39;ll POST an event to it the moment something happens in your community — a ticket sold, a new RSVP, a member joining, a post on the wall. From there it&#39;s yours: drop a message into Slack, update a record in your CRM, kick off a build, log it to a warehouse, whatever you like.\u003C/p>\n\u003Cp>No Zapier task limits, no waiting on an integration to exist. If your service can receive an HTTP request, it can receive Kommunity events.\u003C/p>\n\u003Ch3>What you can wire up\u003C/h3>\n\u003Cp>A few things people are already doing with it:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>AI agents &amp; assistants\u003C/strong> — pipe every RSVP, ticket and new member into your own AI workflow to summarize activity, draft personalized follow-ups, or answer questions about your community the moment things happen.\u003C/li>\n\u003Cli>\u003Cstrong>Slack / Discord\u003C/strong> — a live feed of ticket sales and new members in a team channel.\u003C/li>\n\u003Cli>\u003Cstrong>Your CRM\u003C/strong> — every attendee and new member pushed straight into HubSpot, Salesforce, Notion, an Airtable base, or your own database.\u003C/li>\n\u003Cli>\u003Cstrong>Ops &amp; analytics\u003C/strong> — stream events into a warehouse or dashboard to track RSVPs and revenue in real time.\u003C/li>\n\u003Cli>\u003Cstrong>Automations\u003C/strong> — trigger a welcome email, a fulfilment step, or an internal alert the instant a ticket is bought.\u003C/li>\n\u003C/ul>\n\u003Ch3>Setting one up\u003C/h3>\n\u003Cp>Open your community&#39;s \u003Cstrong>Developer\u003C/strong> panel, go to the \u003Cstrong>Webhooks\u003C/strong> tab, and add an endpoint:\u003C/p>\n\u003Col>\n\u003Cli>Paste your \u003Cstrong>Payload URL\u003C/strong> (e.g. \u003Ccode>https://your-service.com/webhooks/kommunity\u003C/code>).\u003C/li>\n\u003Cli>Tick the \u003Cstrong>events\u003C/strong> you want that endpoint to receive — mix and match community, event and wall events freely.\u003C/li>\n\u003Cli>Save. That&#39;s it — deliveries start immediately.\u003C/li>\n\u003C/ol>\n\u003Cp>You can add an endpoint at the \u003Cstrong>community level\u003C/strong> (all events across the community) or scope it to a \u003Cstrong>single event\u003C/strong> from that event&#39;s Developer panel. Add as many endpoints as you need, each subscribed to a different set of events.\u003C/p>\n\u003Ch3>The events we send\u003C/h3>\n\u003Cp>Every delivery is a JSON \u003Ccode>POST\u003C/code>. The body always starts with the same envelope so you know where it came from, followed by the fields for that specific event:\u003C/p>\n\u003Cpre>\u003Ccode>{\n  &quot;event_type&quot;: &quot;event.ticket.created&quot;,\n  &quot;event_id&quot;: &quot;...&quot;,\n  &quot;event_slug&quot;: &quot;annual-conf-2026&quot;,\n  &quot;community_slug&quot;: &quot;acme&quot;,\n  &quot;community_name&quot;: &quot;Acme Community&quot;,\n  ...event-specific fields...\n}\n\u003C/code>\u003C/pre>\n\u003Cp>These are the events you can subscribe to:\u003C/p>\n\u003Ch4>Community\u003C/h4>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Event type\u003C/th>\n\u003Cth>Fires when\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>community.joined\u003C/code>\u003C/td>\n\u003Ctd>A member joins your community\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>community.left\u003C/code>\u003C/td>\n\u003Ctd>A member leaves your community\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch4>Events\u003C/h4>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Event type\u003C/th>\n\u003Cth>Fires when\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>event.created\u003C/code>\u003C/td>\n\u003Ctd>A new event is created\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>event.rsvp.join\u003C/code>\u003C/td>\n\u003Ctd>Someone RSVPs &quot;yes&quot;\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>event.rsvp.join_the_waiting_list\u003C/code>\u003C/td>\n\u003Ctd>Someone joins the waiting list\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>event.left\u003C/code>\u003C/td>\n\u003Ctd>Someone leaves an event\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>event.ticket.created\u003C/code>\u003C/td>\n\u003Ctd>A ticket is purchased\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>event.ticket.updated\u003C/code>\u003C/td>\n\u003Ctd>A ticket is updated\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>event.ticket.canceled\u003C/code>\u003C/td>\n\u003Ctd>A ticket is canceled or refunded\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch4>Wall\u003C/h4>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Event type\u003C/th>\n\u003Cth>Fires when\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>wall.post.created\u003C/code>\u003C/td>\n\u003Ctd>A new post is added to the community wall\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch3>What&#39;s in each payload\u003C/h3>\n\u003Cp>Every delivery includes the envelope above. Beyond that, each event type carries its own fields.\u003C/p>\n\u003Ch4>Member events\u003C/h4>\n\u003Cp>\u003Ccode>community.joined\u003C/code>, \u003Ccode>community.left\u003C/code>, \u003Ccode>event.rsvp.join\u003C/code>, \u003Ccode>event.rsvp.join_the_waiting_list\u003C/code>, \u003Ccode>event.left\u003C/code>\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C/th>\n\u003Cth>Description\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C/code>\u003C/td>\n\u003Ctd>Member ID\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C/code>\u003C/td>\n\u003Ctd>Display name\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>username\u003C/code>\u003C/td>\n\u003Ctd>Username\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>avatar\u003C/code>\u003C/td>\n\u003Ctd>Avatar URL\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Cp>\u003Ccode>event.left\u003C/code> also carries a \u003Ccode>reason\u003C/code>, so you can tell whether someone left on their own or lost their place because their subscription ended:\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C/th>\n\u003Cth>Description\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>reason\u003C/code>\u003C/td>\n\u003Ctd>\u003Ccode>self\u003C/code> (the attendee or an organizer removed the registration), \u003Ccode>subscription_canceled\u003C/code> (a subscriber-only event whose subscription ended) or \u003Ccode>subscription_payment_failed\u003C/code> (the subscription ended because the payment could not be collected)\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch4>Event created — \u003Ccode>event.created\u003C/code>\u003C/h4>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C/th>\n\u003Cth>Description\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C/code>\u003C/td>\n\u003Ctd>Event ID\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C/code>\u003C/td>\n\u003Ctd>Event name\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>slug\u003C/code>\u003C/td>\n\u003Ctd>Event slug\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>theme_name\u003C/code>\u003C/td>\n\u003Ctd>Event page theme (nullable; \u003Ccode>null\u003C/code> means the classic layout)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>detail\u003C/code>\u003C/td>\n\u003Ctd>Description (HTML)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>detail_without_html\u003C/code>\u003C/td>\n\u003Ctd>Description as plain text\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>url\u003C/code>\u003C/td>\n\u003Ctd>Public event URL\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>start_date\u003C/code>\u003C/td>\n\u003Ctd>Start, ISO 8601\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>end_date\u003C/code>\u003C/td>\n\u003Ctd>End, ISO 8601\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch4>Ticket events\u003C/h4>\n\u003Cp>\u003Ccode>event.ticket.created\u003C/code>, \u003Ccode>event.ticket.updated\u003C/code>, \u003Ccode>event.ticket.canceled\u003C/code>. On a cancellation or refund, \u003Ccode>status\u003C/code> reflects the cancel/refund state.\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C/th>\n\u003Cth>Description\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>order_ticket_id\u003C/code>\u003C/td>\n\u003Ctd>Ticket ID\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>status\u003C/code>\u003C/td>\n\u003Ctd>Ticket status\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>attendee_name\u003C/code>\u003C/td>\n\u003Ctd>Attendee name\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>email\u003C/code>\u003C/td>\n\u003Ctd>Attendee email\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>phone_number\u003C/code>\u003C/td>\n\u003Ctd>Attendee phone (nullable)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pnr\u003C/code>\u003C/td>\n\u003Ctd>Booking reference / check-in code\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ticket_name\u003C/code>\u003C/td>\n\u003Ctd>Ticket type name\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>paid_price\u003C/code>\u003C/td>\n\u003Ctd>Amount paid\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>discount_code\u003C/code>\u003C/td>\n\u003Ctd>Discount code used (nullable)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>attendee_company_name\u003C/code>\u003C/td>\n\u003Ctd>Company (nullable)\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>attendee_title\u003C/code>\u003C/td>\n\u003Ctd>Job title (nullable)\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Ch4>Wall post — \u003Ccode>wall.post.created\u003C/code>\u003C/h4>\n\u003Cp>The post body itself is not included.\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Field\u003C/th>\n\u003Cth>Description\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C/code>\u003C/td>\n\u003Ctd>Post ID\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>wall\u003C/code>\u003C/td>\n\u003Ctd>Wall identifier\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>url\u003C/code>\u003C/td>\n\u003Ctd>Post URL\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>author_id\u003C/code>\u003C/td>\n\u003Ctd>Author ID\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>author_username\u003C/code>\u003C/td>\n\u003Ctd>Author username\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>author_name\u003C/code>\u003C/td>\n\u003Ctd>Author name\u003C/td>\n\u003C/tr>\n\u003C/tbody>\u003C/table>\n\u003Cp>A ticket sale, for example, lands on your endpoint like this:\u003C/p>\n\u003Cpre>\u003Ccode>{\n  &quot;event_type&quot;: &quot;event.ticket.created&quot;,\n  &quot;event_id&quot;: &quot;...&quot;,\n  &quot;event_slug&quot;: &quot;annual-conf-2026&quot;,\n  &quot;community_slug&quot;: &quot;acme&quot;,\n  &quot;community_name&quot;: &quot;Acme Community&quot;,\n  &quot;order_ticket_id&quot;: &quot;...&quot;,\n  &quot;status&quot;: 1,\n  &quot;attendee_name&quot;: &quot;Jane Doe&quot;,\n  &quot;email&quot;: &quot;jane@example.com&quot;,\n  &quot;phone_number&quot;: null,\n  &quot;pnr&quot;: &quot;ABC123&quot;,\n  &quot;ticket_name&quot;: &quot;General Admission&quot;,\n  &quot;paid_price&quot;: 25,\n  &quot;discount_code&quot;: null,\n  &quot;attendee_company_name&quot;: null,\n  &quot;attendee_title&quot;: null\n}\n\u003C/code>\u003C/pre>\n\u003Ch3>Verifying it&#39;s really us\u003C/h3>\n\u003Cp>Event deliveries carry a \u003Ccode>Kommunity-Signature-256\u003C/code> header. It&#39;s a fixed token, shown right in your Developer panel — compare the header on each incoming request against that value and reject anything that doesn&#39;t match. It&#39;s generated when the event (or community) is created and never changes, so verification is a single equality check.\u003C/p>\n\u003Ch3>Reliable by default\u003C/h3>\n\u003Cp>Every delivery is sent asynchronously and \u003Cstrong>retried automatically on failure\u003C/strong> with exponential backoff, so a brief blip on your side won&#39;t drop the event. And under \u003Cstrong>Recent deliveries\u003C/strong> in the Webhooks tab you can see every attempt — success or failure, the HTTP status we got back, and the exact JSON payload we sent — so debugging an integration takes seconds.\u003C/p>\n\u003Ch3>Try it\u003C/h3>\n\u003Cp>Head to your community&#39;s \u003Cstrong>Developer → Webhooks\u003C/strong> tab, add an endpoint, and pick your first event. Zapier isn&#39;t going anywhere — this just gives you a direct line when you&#39;d rather own the integration yourself.\u003C/p>\n","/assets/images/blog/posts/introducing-webhooks-send-your-kommunity-events-anywhere.jpg",false,"2026-07-21T08:55:04.000Z","2026-09-28T07:15:53.000Z",{"slug":14,"title":15},"updates","Updates",{"username":17,"name":18,"avatar":19},"gatbakan","Güven Atbakan","/assets/images/blog/authors/gatbakan.jpg",{"data":21},[22,33],{"slug":23,"title":24,"description":25,"photo":26,"draft":10,"created_at":27,"updated_at":27,"category":28,"user":29},"themed-event-pages","Your event page now carries your community's colors","A redesigned event page with 18 color themes, each drawn separately for light and dark. Pick one in the organizer panel, or keep the classic page.","/assets/images/blog/posts/themed-event-pages.jpg","2026-09-28T07:18:09.000Z",{"slug":14,"title":15},{"username":30,"name":31,"avatar":32},"pinarsuvac","Pınar Suvaç","/assets/images/blog/authors/pinarsuvac.jpg",{"slug":34,"title":35,"description":36,"photo":37,"draft":10,"created_at":38,"updated_at":38,"category":39,"user":40},"event-pass-apple-wallet-google-wallet","Your event pass, now in Apple Wallet and Google Wallet","Members can now add their event pass to Apple Wallet and Google Wallet in one tap. It lives on their phone, speeds up check-in at the door, and updates itself whenever the event changes.","/assets/images/blog/posts/event-pass-apple-wallet-google-wallet.jpg","2026-07-27T17:46:10.000Z",{"slug":14,"title":15},{"username":17,"name":18,"avatar":19},1790580269028]