[{"data":1,"prerenderedAt":37},["ShallowReactive",2],{"blog-post-introducing-webhooks-send-your-kommunity-events-anywhere":3,"blog-related-introducing-webhooks-send-your-kommunity-events-anywhere":25},{"data":4},{"id":5,"locale":6,"title":7,"slug":8,"description":9,"content":10,"photo":11,"is_published":12,"created_at":13,"updated_at":14,"deleted_at":15,"category":16,"user":20},23,"en","Introducing Webhooks: send your Kommunity events anywhere","introducing-webhooks-send-your-kommunity-events-anywhere","Kommunity at your own endpoint and pipe RSVPs, ticket sales, new members and wall posts straight into Slack, your CRM, or anything you build","\u003Cp>Until now, the way to connect Kommunity to your other tools was Zapier. It's great &mdash; but it means everything has to route through a third party, and it stops where Zapier stops.\u003C/p>\r\n\r\n\u003Cp>Today we're adding a second, more direct option: \u003Cstrong>your own webhooks\u003C/strong>. Point Kommunity at any URL you control and we'll POST an event to it the moment something happens in your community &mdash; a ticket sold, a new RSVP, a member joining, a post on the wall. From there it'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>\r\n\r\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>\r\n\r\n\u003Ch3>What you can wire up\u003C/h3>\r\n\r\n\u003Cp>A few things people are already doing with it:\u003C/p>\r\n\r\n\u003Cul>\r\n  \u003Cli>\u003Cstrong>AI agents &amp; assistants\u003C/strong> &mdash; 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>\r\n  \u003Cli>\u003Cstrong>Slack / Discord\u003C/strong> &mdash; a live feed of ticket sales and new members in a team channel.\u003C/li>\r\n  \u003Cli>\u003Cstrong>Your CRM\u003C/strong> &mdash; every attendee and new member pushed straight into HubSpot, Salesforce, Notion, an Airtable base, or your own database.\u003C/li>\r\n  \u003Cli>\u003Cstrong>Ops &amp; analytics\u003C/strong> &mdash; stream events into a warehouse or dashboard to track RSVPs and revenue in real time.\u003C/li>\r\n  \u003Cli>\u003Cstrong>Automations\u003C/strong> &mdash; trigger a welcome email, a fulfilment step, or an internal alert the instant a ticket is bought.\u003C/li>\r\n\u003C/ul>\r\n\r\n\u003Ch3>Setting one up\u003C/h3>\r\n\r\n\u003Cp>Open your community's \u003Cstrong>Developer\u003C/strong> panel, go to the \u003Cstrong>Webhooks\u003C/strong> tab, and add an endpoint:\u003C/p>\r\n\r\n\u003Col>\r\n  \u003Cli>Paste your \u003Cstrong>Payload URL\u003C/strong> (e.g. \u003Ccode>https://your-service.com/webhooks/kommunity\u003C/code>).\u003C/li>\r\n  \u003Cli>Tick the \u003Cstrong>events\u003C/strong> you want that endpoint to receive &mdash; mix and match community, event and wall events freely.\u003C/li>\r\n  \u003Cli>Save. That's it &mdash; deliveries start immediately.\u003C/li>\r\n\u003C/ol>\r\n\r\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's Developer panel. Add as many endpoints as you need, each subscribed to a different set of events.\u003C/p>\r\n\r\n\u003Ch3>The events we send\u003C/h3>\r\n\r\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>\r\n\r\n\u003Cpre>\u003Ccode>{\r\n  \"event_type\": \"event.ticket.created\",\r\n  \"event_id\": \"...\",\r\n  \"event_slug\": \"annual-conf-2026\",\r\n  \"community_slug\": \"acme\",\r\n  \"community_name\": \"Acme Community\",\r\n  ...event-specific fields...\r\n}\u003C/code>\u003C/pre>\r\n\r\n\u003Cp>These are the events you can subscribe to:\u003C/p>\r\n\r\n\u003Ch4>Community\u003C/h4>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Event type\u003C/th>\u003Cth>Fires when\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>community.joined\u003C/code>\u003C/td>\u003Ctd>A member joins your community\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>community.left\u003C/code>\u003C/td>\u003Ctd>A member leaves your community\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Ch4>Events\u003C/h4>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Event type\u003C/th>\u003Cth>Fires when\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.created\u003C/code>\u003C/td>\u003Ctd>A new event is created\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.rsvp.join\u003C/code>\u003C/td>\u003Ctd>Someone RSVPs \"yes\"\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.rsvp.join_the_waiting_list\u003C/code>\u003C/td>\u003Ctd>Someone joins the waiting list\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.left\u003C/code>\u003C/td>\u003Ctd>Someone leaves an event\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.ticket.created\u003C/code>\u003C/td>\u003Ctd>A ticket is purchased\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.ticket.updated\u003C/code>\u003C/td>\u003Ctd>A ticket is updated\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>event.ticket.canceled\u003C/code>\u003C/td>\u003Ctd>A ticket is canceled or refunded\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Ch4>Wall\u003C/h4>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Event type\u003C/th>\u003Cth>Fires when\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>wall.post.created\u003C/code>\u003C/td>\u003Ctd>A new post is added to the community wall\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Ch3>What's in each payload\u003C/h3>\r\n\r\n\u003Cp>Every delivery includes the envelope above. Beyond that, each event type carries its own fields.\u003C/p>\r\n\r\n\u003Ch4>Member events\u003C/h4>\r\n\r\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>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Field\u003C/th>\u003Cth>Description\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>id\u003C/code>\u003C/td>\u003Ctd>Member ID\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>name\u003C/code>\u003C/td>\u003Ctd>Display name\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>username\u003C/code>\u003C/td>\u003Ctd>Username\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>avatar\u003C/code>\u003C/td>\u003Ctd>Avatar URL\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Ch4>Event created &mdash; \u003Ccode>event.created\u003C/code>\u003C/h4>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Field\u003C/th>\u003Cth>Description\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>id\u003C/code>\u003C/td>\u003Ctd>Event ID\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>name\u003C/code>\u003C/td>\u003Ctd>Event name\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>slug\u003C/code>\u003C/td>\u003Ctd>Event slug\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>detail\u003C/code>\u003C/td>\u003Ctd>Description (HTML)\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>detail_without_html\u003C/code>\u003C/td>\u003Ctd>Description as plain text\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>url\u003C/code>\u003C/td>\u003Ctd>Public event URL\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>start_date\u003C/code>\u003C/td>\u003Ctd>Start, ISO 8601\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>end_date\u003C/code>\u003C/td>\u003Ctd>End, ISO 8601\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Ch4>Ticket events\u003C/h4>\r\n\r\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>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Field\u003C/th>\u003Cth>Description\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>order_ticket_id\u003C/code>\u003C/td>\u003Ctd>Ticket ID\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>status\u003C/code>\u003C/td>\u003Ctd>Ticket status\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>attendee_name\u003C/code>\u003C/td>\u003Ctd>Attendee name\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>email\u003C/code>\u003C/td>\u003Ctd>Attendee email\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>phone_number\u003C/code>\u003C/td>\u003Ctd>Attendee phone (nullable)\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>pnr\u003C/code>\u003C/td>\u003Ctd>Booking reference / check-in code\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>ticket_name\u003C/code>\u003C/td>\u003Ctd>Ticket type name\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>paid_price\u003C/code>\u003C/td>\u003Ctd>Amount paid\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>discount_code\u003C/code>\u003C/td>\u003Ctd>Discount code used (nullable)\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>attendee_company_name\u003C/code>\u003C/td>\u003Ctd>Company (nullable)\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>attendee_title\u003C/code>\u003C/td>\u003Ctd>Job title (nullable)\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Ch4>Wall post &mdash; \u003Ccode>wall.post.created\u003C/code>\u003C/h4>\r\n\r\n\u003Cp>The post body itself is not included.\u003C/p>\r\n\r\n\u003Ctable>\r\n  \u003Cthead>\r\n    \u003Ctr>\u003Cth>Field\u003C/th>\u003Cth>Description\u003C/th>\u003C/tr>\r\n  \u003C/thead>\r\n  \u003Ctbody>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>id\u003C/code>\u003C/td>\u003Ctd>Post ID\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>wall\u003C/code>\u003C/td>\u003Ctd>Wall identifier\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>url\u003C/code>\u003C/td>\u003Ctd>Post URL\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>author_id\u003C/code>\u003C/td>\u003Ctd>Author ID\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>author_username\u003C/code>\u003C/td>\u003Ctd>Author username\u003C/td>\u003C/tr>\r\n    \u003Ctr>\u003Ctd>\u003Ccode>author_name\u003C/code>\u003C/td>\u003Ctd>Author name\u003C/td>\u003C/tr>\r\n  \u003C/tbody>\r\n\u003C/table>\r\n\r\n\u003Cp>A ticket sale, for example, lands on your endpoint like this:\u003C/p>\r\n\r\n\u003Cpre>\u003Ccode>{\r\n  \"event_type\": \"event.ticket.created\",\r\n  \"event_id\": \"...\",\r\n  \"event_slug\": \"annual-conf-2026\",\r\n  \"community_slug\": \"acme\",\r\n  \"community_name\": \"Acme Community\",\r\n  \"order_ticket_id\": \"...\",\r\n  \"status\": 1,\r\n  \"attendee_name\": \"Jane Doe\",\r\n  \"email\": \"jane@example.com\",\r\n  \"phone_number\": null,\r\n  \"pnr\": \"ABC123\",\r\n  \"ticket_name\": \"General Admission\",\r\n  \"paid_price\": 25,\r\n  \"discount_code\": null,\r\n  \"attendee_company_name\": null,\r\n  \"attendee_title\": null\r\n}\u003C/code>\u003C/pre>\r\n\r\n\u003Ch3>Verifying it's really us\u003C/h3>\r\n\r\n\u003Cp>Event deliveries carry a \u003Ccode>Kommunity-Signature-256\u003C/code> header. It's a fixed token, shown right in your Developer panel &mdash; compare the header on each incoming request against that value and reject anything that doesn't match. It's generated when the event (or community) is created and never changes, so verification is a single equality check.\u003C/p>\r\n\r\n\u003Ch3>Reliable by default\u003C/h3>\r\n\r\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't drop the event. And under \u003Cstrong>Recent deliveries\u003C/strong> in the Webhooks tab you can see every attempt &mdash; success or failure, the HTTP status we got back, and the exact JSON payload we sent &mdash; so debugging an integration takes seconds.\u003C/p>\r\n\r\n\u003Ch3>Try it\u003C/h3>\r\n\r\n\u003Cp>Head to your community's \u003Cstrong>Developer &rarr; Webhooks\u003C/strong> tab, add an endpoint, and pick your first event. Zapier isn't going anywhere &mdash; this just gives you a direct line when you'd rather own the integration yourself.\u003C/p>","https://media.kommunity.com/blog/2026-07-22/HNxaOA1UHmahaZSzLJbB4KyK6UopqTL7TNZOvuYW.png",true,"2026-07-21T08:55:04.000000Z","2026-07-22T07:24:20.000000Z",null,{"id":17,"title":18,"slug":19},3,"Updates","updates",{"id":21,"name":22,"username":23,"avatar":24},"6e0740bb-4f34-4e31-a94e-9b4cf8307ea3","Güven Atbakan","gatbakan","https://media.kommunity.com/avatar/6e0740bb-4f34-4e31-a94e-9b4cf8307ea3_avatar_6885a611e06e1.jpeg",{"data":26},[27],{"id":28,"locale":6,"title":29,"slug":30,"description":31,"content":32,"photo":33,"is_published":12,"created_at":34,"updated_at":34,"deleted_at":15,"category":35,"user":36},24,"Your event pass, now in Apple Wallet and Google Wallet","event-pass-apple-wallet-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.","\u003Cp>Getting into an event should be the easy part. Starting today, everyone who RSVPs or buys a ticket to your event can add their pass straight to \u003Cstrong>Apple Wallet\u003C/strong> and \u003Cstrong>Google Wallet\u003C/strong>, so the thing they need at the door is already on their phone, right on the lock screen.\u003C/p>\n\n\u003Ch3>One tap to add\u003C/h3>\n\n\u003Cp>Every RSVP confirmation and ticket email now carries an \u003Cem>Add to Apple Wallet\u003C/em> and \u003Cem>Add to Google Wallet\u003C/em> button. Attendees can also add the pass from their event page and from inside the app. No account to create, no PDF to dig out of an inbox; one tap and it's saved.\u003C/p>\n\n\u003Ch3>Check-in just got faster\u003C/h3>\n\n\u003Cp>Each pass carries the same QR code your team already scans at the door, so nothing changes in how you check people in. No more searching through screenshots or reprinting tickets. Attendees pull up the pass, you scan, they're in.\u003C/p>\n\n\u003Ch3>Passes that keep themselves up to date\u003C/h3>\n\n\u003Cp>Plans change, and the pass changes with them. Move the start time, switch the venue, or update the address, and the pass on everyone's phone updates automatically - with a notification so they notice. If an event is canceled, the pass is marked invalid so no one shows up to a closed door. Un-cancel it, and the passes come right back.\u003C/p>\n\n\u003Ch3>Built for community events of every kind\u003C/h3>\n\n\u003Cul>\n  \u003Cli>\u003Cstrong>Free, RSVP events\u003C/strong> get a check-in pass with a QR code &mdash; no ticketing required.\u003C/li>\n  \u003Cli>\u003Cstrong>Ticketed events\u003C/strong> get a pass per ticket, so each attendee in a group order has their own.\u003C/li>\n  \u003Cli>\u003Cstrong>Online events\u003C/strong> get a pass too, minus the door QR &mdash; it links straight back to the event page so members always know where to join.\u003C/li>\n\u003C/ul>\n\n\u003Ch3>How to turn it on\u003C/h3>\n\n\u003Cp>Nothing to set up. The wallet buttons appear automatically on new confirmation emails and event pages for your community. Your members bring the pass; you bring the event.\u003C/p>\n\n\u003Cp>This is one more step toward making Kommunity the home for your community and its events - from the first invite to the moment everyone walks through the door.\u003C/p>","https://media.kommunity.com/blog/2026-07-27/AzQa3A4WjzvE8LyvopmlU6cd5sjtUnolkLgJILn3.png","2026-07-27T17:46:10.000000Z",{"id":17,"title":18,"slug":19},{"id":21,"name":22,"username":23,"avatar":24},1787780019613]