[{"data":1,"prerenderedAt":618},["ShallowReactive",2],{"content-query-xTVKswlHTd":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"layout":10,"author":11,"tags":12,"categories":17,"date":19,"faq":20,"image":33,"body":34,"_type":611,"_id":612,"_source":613,"_file":614,"_stem":615,"_extension":616,"sitemap":617},"/blog/confluence-webhooks","blog",false,"","Confluence Webhooks: Your Options on Cloud and Data Center","How to get webhooks out of Confluence — Data Center's native webhooks, Cloud's Automation web requests and Forge/Connect apps — plus payload notes, security and testing.","post","Karolis Rusenas",[13,14,15,16],"confluence","atlassian","webhooks","guide",[18],"tutorials","2026-07-07 12:00:00",[21,24,27,30],{"q":22,"a":23},"Does Confluence Cloud support webhooks?","Not through an admin UI like Jira's. On Cloud you have three routes: Automation rules with the 'Send web request' action (easiest), a Forge or Connect app that declares webhook subscriptions (for marketplace-grade integrations), or polling the REST API. Data Center/Server has native webhooks in the admin console.",{"q":25,"a":26},"How do I send a web request from Confluence Automation?","Create an Automation rule (space or site level), pick a trigger such as 'Page published', add the 'Send web request' action, set your URL, method POST, and a JSON body using smart values like {{page.id}} and {{page.title}}. You control headers too, so add an Authorization token your handler checks.",{"q":28,"a":29},"What events can Confluence webhooks fire on?","On Data Center: page created/updated/removed, blog post events, comment events, attachment events, space events and user events. On Cloud via Automation: whatever rule triggers exist — page published, page updated, comment added, and so on. Forge apps subscribe to product events like avi:confluence:published:page.",{"q":31,"a":32},"Are Confluence webhooks signed?","Data Center webhooks can include an HMAC signature header when a secret is configured (same X-Hub-Signature pattern as Jira). Automation web requests are not signed — put a secret token in a header yourself. Forge/Connect deliveries are authenticated by the platform (JWT for Connect).","/images/blog/heroes/route.jpg",{"type":35,"children":36,"toc":602},"root",[37,47,79,86,98,154,317,330,336,349,355,390,396,463,469,474,531,537,550,556,596],{"type":38,"tag":39,"props":40,"children":41},"element","p",{},[42],{"type":38,"tag":43,"props":44,"children":46},"img",{"alt":45,"src":33},"Confluence webhooks guide",[],{"type":38,"tag":39,"props":48,"children":49},{},[50,53,59,61,68,70,77],{"type":51,"value":52},"text","Jira makes webhooks easy; ",{"type":38,"tag":54,"props":55,"children":56},"strong",{},[57],{"type":51,"value":58},"Confluence",{"type":51,"value":60}," makes you choose your own adventure. There is no \"Webhooks\" page in Confluence Cloud's admin UI, which surprises everyone who arrives from Jira — yet you can absolutely get page and comment events pushed to your code. This guide maps the three real options and their trade-offs, then covers securing and testing them. (Both products share Atlassian's delivery infrastructure — the same ",{"type":38,"tag":62,"props":63,"children":65},"code",{"className":64},[],[66],{"type":51,"value":67},"Atlassian Webhook HTTP Client",{"type":51,"value":69}," that sends ",{"type":38,"tag":71,"props":72,"children":74},"a",{"href":73},"/blog/jira-webhooks-guide",[75],{"type":51,"value":76},"Jira webhooks",{"type":51,"value":78},".)",{"type":38,"tag":80,"props":81,"children":83},"h2",{"id":82},"option-1-cloud-automation-send-web-request",[84],{"type":51,"value":85},"Option 1 (Cloud): Automation \"Send web request\"",{"type":38,"tag":39,"props":87,"children":88},{},[89,91,96],{"type":51,"value":90},"The pragmatic choice for most teams. In ",{"type":38,"tag":54,"props":92,"children":93},{},[94],{"type":51,"value":95},"space settings → Automation",{"type":51,"value":97}," (or site-level automation):",{"type":38,"tag":99,"props":100,"children":101},"ol",{},[102,129,141],{"type":38,"tag":103,"props":104,"children":105},"li",{},[106,108,114,116,121,122,127],{"type":51,"value":107},"Create a rule with a trigger — ",{"type":38,"tag":109,"props":110,"children":111},"em",{},[112],{"type":51,"value":113},"Page published",{"type":51,"value":115},", ",{"type":38,"tag":109,"props":117,"children":118},{},[119],{"type":51,"value":120},"Page updated",{"type":51,"value":115},{"type":38,"tag":109,"props":123,"children":124},{},[125],{"type":51,"value":126},"Comment added",{"type":51,"value":128},"…",{"type":38,"tag":103,"props":130,"children":131},{},[132,134,139],{"type":51,"value":133},"Add the ",{"type":38,"tag":54,"props":135,"children":136},{},[137],{"type":51,"value":138},"Send web request",{"type":51,"value":140}," action.",{"type":38,"tag":103,"props":142,"children":143},{},[144,146,152],{"type":51,"value":145},"Set your URL, method ",{"type":38,"tag":62,"props":147,"children":149},{"className":148},[],[150],{"type":51,"value":151},"POST",{"type":51,"value":153},", content type JSON, and a body built from smart values:",{"type":38,"tag":155,"props":156,"children":160},"pre",{"className":157,"code":158,"language":159,"meta":7,"style":7},"language-json shiki shiki-themes github-dark","{\n  \"event\": \"page_published\",\n  \"pageId\": \"{{page.id}}\",\n  \"title\": \"{{page.title}}\",\n  \"space\": \"{{space.key}}\",\n  \"author\": \"{{page.lastModifiedBy.displayName}}\",\n  \"url\": \"{{page.url}}\"\n}\n","json",[161],{"type":38,"tag":62,"props":162,"children":163},{"__ignoreMap":7},[164,176,202,224,246,268,290,308],{"type":38,"tag":165,"props":166,"children":169},"span",{"class":167,"line":168},"line",1,[170],{"type":38,"tag":165,"props":171,"children":173},{"style":172},"--shiki-default:#E1E4E8",[174],{"type":51,"value":175},"{\n",{"type":38,"tag":165,"props":177,"children":179},{"class":167,"line":178},2,[180,186,191,197],{"type":38,"tag":165,"props":181,"children":183},{"style":182},"--shiki-default:#79B8FF",[184],{"type":51,"value":185},"  \"event\"",{"type":38,"tag":165,"props":187,"children":188},{"style":172},[189],{"type":51,"value":190},": ",{"type":38,"tag":165,"props":192,"children":194},{"style":193},"--shiki-default:#9ECBFF",[195],{"type":51,"value":196},"\"page_published\"",{"type":38,"tag":165,"props":198,"children":199},{"style":172},[200],{"type":51,"value":201},",\n",{"type":38,"tag":165,"props":203,"children":205},{"class":167,"line":204},3,[206,211,215,220],{"type":38,"tag":165,"props":207,"children":208},{"style":182},[209],{"type":51,"value":210},"  \"pageId\"",{"type":38,"tag":165,"props":212,"children":213},{"style":172},[214],{"type":51,"value":190},{"type":38,"tag":165,"props":216,"children":217},{"style":193},[218],{"type":51,"value":219},"\"{{page.id}}\"",{"type":38,"tag":165,"props":221,"children":222},{"style":172},[223],{"type":51,"value":201},{"type":38,"tag":165,"props":225,"children":227},{"class":167,"line":226},4,[228,233,237,242],{"type":38,"tag":165,"props":229,"children":230},{"style":182},[231],{"type":51,"value":232},"  \"title\"",{"type":38,"tag":165,"props":234,"children":235},{"style":172},[236],{"type":51,"value":190},{"type":38,"tag":165,"props":238,"children":239},{"style":193},[240],{"type":51,"value":241},"\"{{page.title}}\"",{"type":38,"tag":165,"props":243,"children":244},{"style":172},[245],{"type":51,"value":201},{"type":38,"tag":165,"props":247,"children":249},{"class":167,"line":248},5,[250,255,259,264],{"type":38,"tag":165,"props":251,"children":252},{"style":182},[253],{"type":51,"value":254},"  \"space\"",{"type":38,"tag":165,"props":256,"children":257},{"style":172},[258],{"type":51,"value":190},{"type":38,"tag":165,"props":260,"children":261},{"style":193},[262],{"type":51,"value":263},"\"{{space.key}}\"",{"type":38,"tag":165,"props":265,"children":266},{"style":172},[267],{"type":51,"value":201},{"type":38,"tag":165,"props":269,"children":271},{"class":167,"line":270},6,[272,277,281,286],{"type":38,"tag":165,"props":273,"children":274},{"style":182},[275],{"type":51,"value":276},"  \"author\"",{"type":38,"tag":165,"props":278,"children":279},{"style":172},[280],{"type":51,"value":190},{"type":38,"tag":165,"props":282,"children":283},{"style":193},[284],{"type":51,"value":285},"\"{{page.lastModifiedBy.displayName}}\"",{"type":38,"tag":165,"props":287,"children":288},{"style":172},[289],{"type":51,"value":201},{"type":38,"tag":165,"props":291,"children":293},{"class":167,"line":292},7,[294,299,303],{"type":38,"tag":165,"props":295,"children":296},{"style":182},[297],{"type":51,"value":298},"  \"url\"",{"type":38,"tag":165,"props":300,"children":301},{"style":172},[302],{"type":51,"value":190},{"type":38,"tag":165,"props":304,"children":305},{"style":193},[306],{"type":51,"value":307},"\"{{page.url}}\"\n",{"type":38,"tag":165,"props":309,"children":311},{"class":167,"line":310},8,[312],{"type":38,"tag":165,"props":313,"children":314},{"style":172},[315],{"type":51,"value":316},"}\n",{"type":38,"tag":39,"props":318,"children":319},{},[320,322,328],{"type":51,"value":321},"You define the payload, so your handler parses exactly what you designed — and you can set an ",{"type":38,"tag":62,"props":323,"children":325},{"className":324},[],[326],{"type":51,"value":327},"Authorization",{"type":51,"value":329}," header, which doubles as your authentication (Automation requests carry no signature). Limits to know: automation rules have monthly execution caps by plan, and complex conditions count against them.",{"type":38,"tag":80,"props":331,"children":333},{"id":332},"option-2-cloud-a-forge-or-connect-app",[334],{"type":51,"value":335},"Option 2 (Cloud): a Forge or Connect app",{"type":38,"tag":39,"props":337,"children":338},{},[339,341,347],{"type":51,"value":340},"If you are building a product integration rather than internal glue, declare event subscriptions in an app. Forge apps subscribe to events like ",{"type":38,"tag":62,"props":342,"children":344},{"className":343},[],[345],{"type":51,"value":346},"avi:confluence:published:page",{"type":51,"value":348}," and get platform-managed delivery and auth; Connect apps register webhooks in their descriptor and receive JWT-authenticated calls. This is the marketplace-grade path — more setup, but no automation caps and proper identity.",{"type":38,"tag":80,"props":350,"children":352},{"id":351},"option-3-data-centerserver-native-webhooks",[353],{"type":51,"value":354},"Option 3 (Data Center/Server): native webhooks",{"type":38,"tag":39,"props":356,"children":357},{},[358,360,365,367,372,374,380,382,388],{"type":51,"value":359},"Self-hosted Confluence has what Cloud lacks: ",{"type":38,"tag":54,"props":361,"children":362},{},[363],{"type":51,"value":364},"Administration → Webhooks",{"type":51,"value":366},", where you register a URL against events — page created/updated/removed, blog posts, comments, attachments, space and user events. Payloads are JSON with the entity and event metadata, and configuring a ",{"type":38,"tag":54,"props":368,"children":369},{},[370],{"type":51,"value":371},"secret",{"type":51,"value":373}," adds an HMAC signature header (the same ",{"type":38,"tag":62,"props":375,"children":377},{"className":376},[],[378],{"type":51,"value":379},"X-Hub-Signature",{"type":51,"value":381}," pattern Jira uses — verify HMAC-SHA256 over the raw body; test values in the free ",{"type":38,"tag":71,"props":383,"children":385},{"href":384},"/hmac-verification",[386],{"type":51,"value":387},"HMAC verifier",{"type":51,"value":389},").",{"type":38,"tag":80,"props":391,"children":393},{"id":392},"which-one",[394],{"type":51,"value":395},"Which one?",{"type":38,"tag":397,"props":398,"children":399},"table",{},[400,419],{"type":38,"tag":401,"props":402,"children":403},"thead",{},[404],{"type":38,"tag":405,"props":406,"children":407},"tr",{},[408,414],{"type":38,"tag":409,"props":410,"children":411},"th",{},[412],{"type":51,"value":413},"Situation",{"type":38,"tag":409,"props":415,"children":416},{},[417],{"type":51,"value":418},"Use",{"type":38,"tag":420,"props":421,"children":422},"tbody",{},[423,437,450],{"type":38,"tag":405,"props":424,"children":425},{},[426,432],{"type":38,"tag":427,"props":428,"children":429},"td",{},[430],{"type":51,"value":431},"Internal notification/sync on Cloud, quickly",{"type":38,"tag":427,"props":433,"children":434},{},[435],{"type":51,"value":436},"Automation web request",{"type":38,"tag":405,"props":438,"children":439},{},[440,445],{"type":38,"tag":427,"props":441,"children":442},{},[443],{"type":51,"value":444},"Marketplace app or multi-tenant integration",{"type":38,"tag":427,"props":446,"children":447},{},[448],{"type":51,"value":449},"Forge/Connect subscriptions",{"type":38,"tag":405,"props":451,"children":452},{},[453,458],{"type":38,"tag":427,"props":454,"children":455},{},[456],{"type":51,"value":457},"Data Center/Server instance",{"type":38,"tag":427,"props":459,"children":460},{},[461],{"type":51,"value":462},"Native webhooks",{"type":38,"tag":80,"props":464,"children":466},{"id":465},"testing-the-flow",[467],{"type":51,"value":468},"Testing the flow",{"type":38,"tag":39,"props":470,"children":471},{},[472],{"type":51,"value":473},"Whatever the source, the receiving loop is the same as any webhook:",{"type":38,"tag":99,"props":475,"children":476},{},[477,495,521],{"type":38,"tag":103,"props":478,"children":479},{},[480,485,487,493],{"type":38,"tag":54,"props":481,"children":482},{},[483],{"type":51,"value":484},"Capture one first.",{"type":51,"value":486}," Point the web request (or webhook) at a free ",{"type":38,"tag":71,"props":488,"children":490},{"href":489},"/webhook-bin",[491],{"type":51,"value":492},"Webhook Bin",{"type":51,"value":494}," and trigger the event — you will see the exact headers and body before writing a line of handler code.",{"type":38,"tag":103,"props":496,"children":497},{},[498,503,505,511,513,519],{"type":38,"tag":54,"props":499,"children":500},{},[501],{"type":51,"value":502},"Develop locally.",{"type":51,"value":504}," Confluence Cloud can only reach public URLs; forward deliveries to your machine with the relay agent (",{"type":38,"tag":62,"props":506,"children":508},{"className":507},[],[509],{"type":51,"value":510},"relay forward --bucket confluence http://localhost:8080/webhook",{"type":51,"value":512},") exactly as in the ",{"type":38,"tag":71,"props":514,"children":516},{"href":515},"/blog/receive-jira-webhooks-locally",[517],{"type":51,"value":518},"Jira local guide",{"type":51,"value":520}," — same Atlassian plumbing, same pattern.",{"type":38,"tag":103,"props":522,"children":523},{},[524,529],{"type":38,"tag":54,"props":525,"children":526},{},[527],{"type":51,"value":528},"Replay",{"type":51,"value":530}," captured events while you iterate instead of re-publishing pages.",{"type":38,"tag":80,"props":532,"children":534},{"id":533},"reliability-notes",[535],{"type":51,"value":536},"Reliability notes",{"type":38,"tag":39,"props":538,"children":539},{},[540,542,548],{"type":51,"value":541},"Automation web requests are fire-and-forget — a failed request is logged in the rule's audit log but not aggressively retried, so if the destination matters, front it with a stable endpoint that stores deliveries and ",{"type":38,"tag":71,"props":543,"children":545},{"href":544},"/features/durable-retries",[546],{"type":51,"value":547},"retries towards your service",{"type":51,"value":549},". Data Center webhooks likewise treat delivery as best-effort; design your consumer to reconcile against the REST API when in doubt.",{"type":38,"tag":80,"props":551,"children":553},{"id":552},"related-reading",[554],{"type":51,"value":555},"Related reading",{"type":38,"tag":557,"props":558,"children":559},"ul",{},[560,570,578,587],{"type":38,"tag":103,"props":561,"children":562},{},[563,568],{"type":38,"tag":71,"props":564,"children":565},{"href":73},[566],{"type":51,"value":567},"Jira webhooks: setup, payload and security",{"type":51,"value":569}," — the sibling guide",{"type":38,"tag":103,"props":571,"children":572},{},[573],{"type":38,"tag":71,"props":574,"children":575},{"href":515},[576],{"type":51,"value":577},"Test Jira webhooks locally",{"type":38,"tag":103,"props":579,"children":580},{},[581],{"type":38,"tag":71,"props":582,"children":584},{"href":583},"/blog/how-to-test-webhooks",[585],{"type":51,"value":586},"How to test webhooks",{"type":38,"tag":103,"props":588,"children":589},{},[590],{"type":38,"tag":71,"props":591,"children":593},{"href":592},"/blog/what-is-webhook",[594],{"type":51,"value":595},"What is a webhook",{"type":38,"tag":597,"props":598,"children":599},"style",{},[600],{"type":51,"value":601},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":204,"depth":204,"links":603},[604,605,606,607,608,609,610],{"id":82,"depth":178,"text":85},{"id":332,"depth":178,"text":335},{"id":351,"depth":178,"text":354},{"id":392,"depth":178,"text":395},{"id":465,"depth":178,"text":468},{"id":533,"depth":178,"text":536},{"id":552,"depth":178,"text":555},"markdown","content:blog:confluence-webhooks.md","content","blog/confluence-webhooks.md","blog/confluence-webhooks","md",{"loc":4},1783373261781]