[{"data":1,"prerenderedAt":399},["ShallowReactive",2],{"blog-post-zammad-plugin-selber-bauen-en":3},{"id":4,"title":5,"author":6,"body":7,"date":387,"description":388,"draft":389,"extension":390,"image":391,"imageAlt":391,"meta":392,"navigation":394,"path":395,"seo":396,"stem":397,"__hash__":398},"blogEn\u002Fblog\u002Fzammad-plugin-selber-bauen.md","Build your own Zammad plugin — integrations, API, and webhooks","Open ITSM Hub",{"type":8,"value":9,"toc":379},"minimark",[10,14,31,40,45,53,89,97,101,116,134,156,162,166,289,292,296,299,337,344,348,354,358,372,375],[11,12,5],"h1",{"id":13},"build-your-own-zammad-plugin-integrations-api-and-webhooks",[15,16,17,18,22,23,26,27,30],"p",{},"Searches for ",[19,20,21],"strong",{},"Zammad plugins",", ",[19,24,25],{},"Zammad integrations",", or “install a Zammad add-on” often hit a wall: there is ",[19,28,29],{},"no"," plugin store like OTOBO or Znuny. Teams still extend Zammad every day — through built-in modules, webhooks, and their own API services.",[15,32,33,34,39],{},"This article maps that search intent and the shortest path to a custom plugin. The full developer checklist lives in ",[35,36,38],"a",{"href":37},"\u002Fdocs\u002Fzammad-plugin-entwickeln","Build your own Zammad plugin",".",[41,42,44],"h2",{"id":43},"why-so-many-people-search-for-zammad-plugins","Why so many people search for Zammad plugins",[15,46,47,48,52],{},"Zammad is a standalone Ruby helpdesk (AGPL-3.0), not an OTRS fork. Anyone coming from Znuny or OTOBO expects ",[49,50,51],"code",{},".opm"," packages. In Zammad, an extension means:",[54,55,56,64,70],"ol",{},[57,58,59,60,63],"li",{},"A ",[19,61,62],{},"native integration"," in core (GitHub, GitLab, Slack, Teams, LDAP, CTI, Checkmk, …)",[57,65,66,69],{},[19,67,68],{},"Configuration"," (triggers, schedulers, core workflows, object manager)",[57,71,72,73,76,77,83,84],{},"An ",[19,74,75],{},"external integration"," via the ",[35,78,82],{"href":79,"rel":80},"https:\u002F\u002Fdocs.zammad.org\u002Fen\u002Flatest\u002Fapi\u002Fintro.html",[81],"nofollow","REST API"," or ",[35,85,88],{"href":86,"rel":87},"https:\u002F\u002Fadmin-docs.zammad.org\u002Fen\u002Flatest\u002Fmanage\u002Fwebhook\u002Fadd.html",[81],"webhooks",[15,90,91,92,96],{},"Open ITSM Hub collects those community projects in the ",[35,93,95],{"href":94},"\u002Fzammad-plugins","Zammad plugin directory"," — n8n nodes, MCP servers, PHP\u002FPython clients, Slack bridges, LDAP sync.",[41,98,100],{"id":99},"which-plugin-type-do-you-actually-need","Which plugin type do you actually need?",[15,102,103,106,107,110,111,39],{},[19,104,105],{},"“We want Slack \u002F Teams \u002F GitHub.”","\nCheck ",[19,108,109],{},"Admin → Integrations"," first. Many “plugins” are product features. Setup and tokens are in the ",[35,112,115],{"href":113,"rel":114},"https:\u002F\u002Fadmin-docs.zammad.org\u002Fen\u002Flatest\u002Fsystem\u002Fintegrations\u002Findex.html",[81],"admin documentation",[15,117,118,121,122,125,126,129,130,133],{},[19,119,120],{},"“When a ticket becomes X, system Y should do something.”","\nWebhook plus trigger. Zammad sends ",[49,123,124],{},"X-Zammad-Trigger"," and ",[49,127,128],{},"X-Zammad-Delivery","; optional HMAC via ",[49,131,132],{},"X-Hub-Signature",". No deploy into the Zammad container.",[15,135,136,139,140,143,144,22,148,22,152,39],{},[19,137,138],{},"“We are building a portal, ERP sync, or AI agent.”","\nYour plugin is a service with an access token against ",[49,141,142],{},"\u002Fapi\u002Fv1",". Building blocks: ",[35,145,147],{"href":146},"\u002Fpackages\u002Fdigital-bossn8n-nodes-zammad","n8n Zammad nodes",[35,149,151],{"href":150},"\u002Fpackages\u002Fzammad-mcp-server","zammad-mcp-server",[35,153,155],{"href":154},"\u002Fpackages\u002Fzammadpy","zammad_py",[15,157,158,161],{},[19,159,160],{},"“The UI must change in the core.”","\nThat is a fork, not a plugin. High cost on every Zammad upgrade — only with your own release process.",[41,163,165],{"id":164},"mini-example-create-a-ticket-via-api-your-first-plugin","Mini example: create a ticket via API (your first “plugin”)",[167,168,173],"pre",{"className":169,"code":170,"language":171,"meta":172,"style":172},"language-bash shiki shiki-themes one-dark-pro","curl -X POST https:\u002F\u002Fhelpdesk.example.com\u002Fapi\u002Fv1\u002Ftickets \\\n  -H \"Authorization: Token token=YOUR_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"title\": \"Request from the shop\",\n    \"group\": \"Users\",\n    \"customer\": \"customer@example.com\",\n    \"article\": {\n      \"subject\": \"Order 1042\",\n      \"body\": \"Customer asks about delivery status.\",\n      \"type\": \"note\",\n      \"internal\": false\n    }\n  }'\n","bash","",[49,174,175,199,210,220,229,235,241,247,253,259,265,271,277,283],{"__ignoreMap":172},[176,177,180,184,188,192,195],"span",{"class":178,"line":179},"line",1,[176,181,183],{"class":182},"sVbv2","curl",[176,185,187],{"class":186},"sVC51"," -X",[176,189,191],{"class":190},"subq3"," POST",[176,193,194],{"class":190}," https:\u002F\u002Fhelpdesk.example.com\u002Fapi\u002Fv1\u002Ftickets",[176,196,198],{"class":197},"sjrmR"," \\\n",[176,200,202,205,208],{"class":178,"line":201},2,[176,203,204],{"class":186},"  -H",[176,206,207],{"class":190}," \"Authorization: Token token=YOUR_TOKEN\"",[176,209,198],{"class":197},[176,211,213,215,218],{"class":178,"line":212},3,[176,214,204],{"class":186},[176,216,217],{"class":190}," \"Content-Type: application\u002Fjson\"",[176,219,198],{"class":197},[176,221,223,226],{"class":178,"line":222},4,[176,224,225],{"class":186},"  -d",[176,227,228],{"class":190}," '{\n",[176,230,232],{"class":178,"line":231},5,[176,233,234],{"class":190},"    \"title\": \"Request from the shop\",\n",[176,236,238],{"class":178,"line":237},6,[176,239,240],{"class":190},"    \"group\": \"Users\",\n",[176,242,244],{"class":178,"line":243},7,[176,245,246],{"class":190},"    \"customer\": \"customer@example.com\",\n",[176,248,250],{"class":178,"line":249},8,[176,251,252],{"class":190},"    \"article\": {\n",[176,254,256],{"class":178,"line":255},9,[176,257,258],{"class":190},"      \"subject\": \"Order 1042\",\n",[176,260,262],{"class":178,"line":261},10,[176,263,264],{"class":190},"      \"body\": \"Customer asks about delivery status.\",\n",[176,266,268],{"class":178,"line":267},11,[176,269,270],{"class":190},"      \"type\": \"note\",\n",[176,272,274],{"class":178,"line":273},12,[176,275,276],{"class":190},"      \"internal\": false\n",[176,278,280],{"class":178,"line":279},13,[176,281,282],{"class":190},"    }\n",[176,284,286],{"class":178,"line":285},14,[176,287,288],{"class":190},"  }'\n",[15,290,291],{},"Agents create tokens in personal preferences. Avoid basic auth; restrict permissions to what you need.",[41,293,295],{"id":294},"curated-integrations-to-learn-from","Curated integrations to learn from",[15,297,298],{},"Before starting from scratch, browse existing packages — filterable by category in the directory:",[300,301,302,313,316,323,330],"ul",{},[57,303,304,305,22,309],{},"ChatOps: ",[35,306,308],{"href":307},"\u002Fpackages\u002Fslack2zammad","slack2zammad",[35,310,312],{"href":311},"\u002Fpackages\u002Fmatrix-zammad","matrix-zammad",[57,314,315],{},"Automation: n8n nodes, Entra user sync",[57,317,318,319],{},"AI: MCP servers (Softoft-Orga vs. community) — ",[35,320,322],{"href":321},"\u002Fblog\u002Fzammad-mcp-server-vergleich","MCP comparison",[57,324,325,326],{},"Identity: ",[35,327,329],{"href":328},"\u002Fpackages\u002Fldap2zammad","zammad-ldap-sync",[57,331,332,333],{},"CMS: ",[35,334,336],{"href":335},"\u002Fpackages\u002Fzammad-wp","zammad-wp",[15,338,339,340,39],{},"Year overview: ",[35,341,343],{"href":342},"\u002Fblog\u002Fbeste-zammad-plugins-2026","Best Zammad plugins 2026",[41,345,347],{"id":346},"operations-and-privacy","Operations and privacy",[15,349,350,351,39],{},"A plugin that sends ticket text to n8n, an LLM, or a CRM processes personal data. Settle processing agreements, storage location, and logs before the webhook goes live. Technical guardrails (staging, least privilege, idempotency) are in the ",[35,352,353],{"href":37},"developer docs",[41,355,357],{"id":356},"next-steps","Next steps",[54,359,360,363,366],{},[57,361,362],{},"Check a native integration or a no-code webhook",[57,364,365],{},"Otherwise sketch an API service and token scopes",[57,367,368,369],{},"Test against staging, then list it in the ",[35,370,371],{"href":94},"directory",[15,373,374],{},"Zammad stays upgradeable — and you still get the integration admins are searching for.",[376,377,378],"style",{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html pre.shiki code .sjrmR, html code.shiki .sjrmR{--shiki-default:#56B6C2}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":172,"searchDepth":201,"depth":201,"links":380},[381,382,383,384,385,386],{"id":43,"depth":201,"text":44},{"id":99,"depth":201,"text":100},{"id":164,"depth":201,"text":165},{"id":294,"depth":201,"text":295},{"id":346,"depth":201,"text":347},{"id":356,"depth":201,"text":357},"2026-09-30","Develop a Zammad plugin without a marketplace: native integrations, webhooks, REST API, and n8n. A practical guide for admins and developers.",false,"md",null,{"language":393},"en",true,"\u002Fblog\u002Fzammad-plugin-selber-bauen",{"title":5,"description":388},"blog\u002Fzammad-plugin-selber-bauen","M8viex3UvGy0npdi9v8PMlN0kM4Lq1w0KzGYFeYanNU",1793464856536]