monday.com webhooks created by an app: why you can't edit them, and how to fix one
If monday.com tells you a webhook on your board was created by an app and cannot be modified, it was made through the API with an app's integration token, and monday deliberately stops board users from switching those off. You fix it where it was made: in the app that created it, or through the API with that app's token. This article shows how to tell which kind of webhook you have, the queries that list, delete and recreate one, which token can see what, and the failure modes behind a webhook that stops firing, fires twice or posts into nothing.
By Saveez IrfanUpdated
In short
- A webhook created through monday's API with an integration app token cannot be turned off by board users. monday documents this as intentional, so a user cannot break the app by toggling it.
- There is no update for a webhook. To change its URL, event or column, create a new one and delete the old one, in that order.
- List a board's webhooks with the webhooks query. With app_webhooks_only: true it returns only the ones created by the app making the request. The query does not return the URL or the creator, so keep your own record of what you created.
- The token decides what you get. An app token gives you the lock and a signed JWT on every delivery. A personal token gives you neither, and reaches whatever that user can see.
- Removing a tool's webhook cleanly depends on the tool. Zapier's platform unsubscribes when a Zap is turned off. Make's instant modules use a recipe you add on the board, so deleting the scenario leaves that recipe posting to a dead address.
- monday retries a failed delivery once a minute for 30 minutes. Treat anything lost after that as gone, make every write safe to run twice, and put a sweep under anything that must not miss an event.
What does "created by an app, cannot be modified" mean?
It means the webhook was created through monday's API using a monday app's integration token rather than by someone on the board. monday's Webhooks reference says end users cannot disable webhooks created that way, so that the app is not disrupted by a curious user toggling it on and off. The lock is intentional, it is not a permissions error, and no board setting removes it.
So the fix has to happen where the webhook was made. If it belongs to a marketplace app or a tool you connected, remove or reconfigure it in that tool, or disconnect the app. If it belongs to an app you built, list the board's webhooks through the API with that app's token, delete the one you no longer want and create its replacement. Whichever route you take, find out which kind of webhook you have first, because the four kinds on a monday board are removed in four different ways.
App webhook or board recipe: which one do you have?
A board can receive outbound webhooks in four ways, and from a distance they look alike. The difference is who created each one and with which credential, and that decides who is able to turn it off.
| Kind | Created by | Can a board user turn it off? | How to remove it |
|---|---|---|---|
| Webhooks integration recipe | Someone on the board adds monday's Webhooks integration and pastes a URL. Make's instant monday.com modules are set up this way | Yes. It is a recipe on the board like any other | Delete the recipe in the board's Automations Center, where it was added. If a Make scenario was listening, delete or reassign its webhook in Make too |
| API webhook, personal token | A script or service calls create_webhook with someone's personal API token | monday documents the lock and the signed JWT as things you get by creating with an app token, which implies a personal-token webhook has neither | delete_webhook with its ID, or from the board if it is shown there |
| API webhook, app token | An app (yours or a marketplace app) calls create_webhook with its integration OAuth token | No. This is the one that says it cannot be modified | In the app, or delete_webhook called with that app's token |
| A third-party tool's instant trigger | The tool registers it when you switch the workflow on, through one of the routes above | Depends which route the tool used | Turn off or delete the Zap or workflow so the tool unsubscribes, then check the board |
Two places in monday show what is connected. On a board, the Automations page has a Manage tab, and its My connections tab lists the apps and integrations used on that board. Account admins can see every app and automation connection in the account under Administration, then Connections, then Automation connections. monday's Help Center also notes that uninstalling an app removes it from the account but does not automatically delete automations that were set up with it; those have to be deleted by hand. It does not say whether webhooks an app created through the API go with the app, so after an uninstall, check the board rather than assume.
Why does monday stop users switching app webhooks off?
Because the app depends on them. An app that keeps a board in step with another system, or reacts to status changes, breaks quietly when its webhook goes, and the person who switched it off is rarely the person who finds out. monday's answer is to let only the app control its own subscriptions. We think that is the right default for a marketplace, and the trade-off is real.
The cost lands when the app's side is broken or abandoned. If the vendor's endpoint is down, or the app you built was retired without its webhooks being deleted, the board keeps sending events and nobody on the board can stop it. The person who can is whoever holds that app's credentials. For an app you built, that is an argument for keeping the app's OAuth token, or the ability to generate one, somewhere a successor can find it, along with a record of every webhook the app created.
How do you list, delete and recreate a monday.com webhook through the API?
monday's API has one webhook query and two webhook mutations: webhooks, create_webhook and delete_webhook. There is no update. Requests go to https://api.monday.com/v2 as a POST with the token in the Authorization header. Reading needs the webhooks:read scope and writing needs webhooks:write. The examples below are complete GraphQL documents to send as the query value; replace the board and webhook IDs with your own.
monday's reference describes app_webhooks_only as returning only the webhooks created by the app initiating the request, so run it with the app's token. The Webhook type has four fields, id, board_id, event and config, and nothing else. It does not return the target URL or say who created it, which is why two webhooks with the same event and config cannot be told apart from the API alone. Your own record of what you created is the only way to know which one is yours, and which is the one pointing at a server that no longer exists.
Create before you delete. Done the other way round, events in the gap are lost, and monday will not replay them. Done this way, there is a short window in which both webhooks fire for the same event, which is harmless if the receiver is idempotent and a duplicate if it is not. On create, config is a JSON string, and only three events take it: change_specific_column_value with a column ID, change_status_column_value with a column ID and the label index, and item_moved_to_specific_group with a group ID. The URL is limited to 255 characters. For subitem events, pass the parent board's ID, and add a query parameter to the URL if one endpoint needs to tell subitem events from item events.
If you are fixing a webhook created by someone else's app, you will not have its token, and monday's reference does not say whether a personal token can delete a webhook another app created. Try it on a test board before you rely on it. The dependable route is through the app: reconfigure or disconnect it, or ask its vendor.
Which token should you create monday.com webhooks with?
For anything that must keep running, create webhooks with an app's integration token rather than a person's API token. monday's reference makes two features conditional on it: the lock that stops board users disabling the webhook, and a JWT in the Authorization header of each delivery that lets your endpoint prove the request came from monday.
| Token | Reach | What a webhook created with it gets |
|---|---|---|
| Personal API token | Everything the user can do in the UI. Their permissions mirror the user's own | Events delivered, with no lock and no signed JWT. If the person leaves and the account is deactivated, review what their token created |
| App OAuth token (integration feature) | The scopes the app was granted, including webhooks:read and webhooks:write if requested | The lock against users disabling it, a JWT on every delivery signed with the app's Signing Secret, and visibility through app_webhooks_only |
| Short-lived token from the JWT | The app's scopes, valid for five minutes | Good for an API call made while handling a delivery, not for creating webhooks from a scheduled job |
On the receiving side, verify the JWT against the app's Signing Secret with a standard library, check that aud matches your endpoint URL and that exp has not passed, and reject anything that fails. A personal-token webhook carries no such proof, so its endpoint is an open URL that anyone who learns it can post to. If you must use one, treat the payload as a hint: re-read the item through the API before acting on it.
Mind the reach of a personal token in either case. On the fleet-telematics build in our work, the monday.com token was account-wide and reached commission columns, so it lives in one server-side process and nothing else ever sees it. The same applies to a token that creates webhooks, because it can usually also read every board the person can.
The challenge on create, and what monday does when your endpoint fails
The challenge
When a webhook is created, by recipe or by create_webhook, monday sends a JSON POST to the URL containing a challenge field with a random token, and expects the same token back as a challenge field in the JSON response. If the endpoint does not echo it, the webhook is not created. That makes create_webhook a test of the endpoint as well as a registration: a URL that is down, behind authentication, or answering with a different body fails here. In our experience, the usual cause of a create that fails for no visible reason is an endpoint that returns 200 with an empty body or its own JSON instead of the echoed challenge.
Retries
monday's reference says requests sent through its webhook integration retry once a minute for 30 minutes. Plan around both halves of that sentence. Within the window, a slow or failing endpoint can receive the same event more than once, so the handler has to be safe to run twice. After the window, treat the event as lost: an outage of an hour on your side is an hour of board changes that will not arrive by webhook.
- Answer fast and do the work afterwards. Acknowledge the delivery, put the event on a queue or in a table, and process it from there, so a slow downstream API cannot turn into a failed delivery and a retry.
- Deduplicate on the event. Each payload carries a triggerUuid, along with the item (pulseId), the board, the column and changedAt. monday does not document whether a retry keeps the same triggerUuid, so use it as a first check and make the write itself idempotent anyway, with find-or-create on a stable key.
- Use previousValue. Column-change payloads carry the old value as well as the new one, so a handler can ignore an edit that did not change what it cares about without fetching the item.
How do Make, Zapier and n8n create monday.com webhooks?
Each tool does it differently, and the difference decides whether deleting the scenario or workflow also removes the webhook from the board. We are not affiliated with monday.com, Make, Zapier or n8n.
Make
Make's monday.com documentation describes instant modules as needing a webhook you set up in monday: create the webhook in Make, copy its address, then on the board add monday's Webhooks integration, pick a template and paste the address. The monday side is therefore an ordinary Webhooks recipe on the board, owned by whoever added it, and the Make connection itself uses a personal API token. Deleting the scenario does not touch that recipe. Make's help pages say a webhook not attached to any scenario for more than 120 hours is deactivated and answers 410 Gone, so the board goes on posting each event to an address that refuses it, and each failed delivery is retried for 30 minutes. The clean removal is both sides: delete the recipe on the board, then the scenario and its webhook in Make. Our monday.com and Make integration guide covers the trigger choice and the rest of the pairing.
Zapier
Zapier's app listing labels most of its monday.com triggers as instant. Zapier's platform documentation describes how instant (REST hook) triggers work: the integration subscribes when a Zap is turned on and unsubscribes when it is turned off. That makes turning off or deleting the Zap the clean way to remove its subscription. Zapier does not publish how its own monday.com app registers hooks on the board, so after turning a Zap off, list the board's webhooks and check that nothing is left behind.
n8n
n8n's built-in monday.com node is documented with board, column, group and item operations, with the HTTP Request node for anything else. To react to board events, the common pattern is a Webhook node whose production URL is registered on the board, by a Webhooks recipe or by create_webhook, and which returns the challenge so registration succeeds. monday.com also publishes its own n8n package with a trigger node. It is pre-1.0, and its README says to deactivate and reactivate the workflow after changing the webhook URL so the trigger re-registers. Whichever route you use, deactivating a workflow does not delete a recipe someone added by hand.
Why is a monday.com webhook not firing, firing twice, or firing into nothing?
| Symptom | Likely cause | Fix |
|---|---|---|
| Nothing arrives when a status changes | The webhook listens for a different event: change_specific_column_value on another column, or change_status_column_value configured for one label index | List the board's webhooks, read event and config, and recreate with the event and column you mean |
| Subitem changes never arrive | The webhook watches item events, or was created against the subitem board. change_specific_column_value does not support subitem columns | Use the subitem events (change_subitem_column_value, create_subitem and so on) with the parent board's ID |
| create_webhook fails | The endpoint did not echo the challenge, or the URL is longer than 255 characters | Return the challenge field unchanged in the JSON response; shorten the URL |
| The same event is handled twice | A retry after a slow or failed response, two webhooks for the same event (an old scenario and its replacement), or overlapping events, since change_column_value and change_status_column_value on the same board can both match one status edit | Acknowledge fast, deduplicate, make writes idempotent, and delete the webhook you replaced |
| Events post to a URL that no longer exists | An orphaned webhook: the scenario, workflow or server was deleted and the board side was not | Delete the recipe on the board, or delete_webhook with the right token |
| A webhook nobody can switch off | Created with an app token by an app that is broken or retired | Delete it through the app or with its token; for a marketplace app, disconnect it or ask the vendor |
| Changes were missed during an outage | Deliveries kept failing for longer than the 30-minute retry window | A scheduled sweep that compares the board with the other system and fills the gap |
What monday.com webhooks cannot tell you
There are 21 event types, covering item and subitem creation, names, column values, moves, archiving, deletion and restoring, updates, and column creation. There is no event for a group being created or a column being deleted, and a webhook is attached to one board, so changes across boards need one webhook per board. When the event you need is not on the list, a sweep that reads the board on a schedule is the answer, not a cleverer webhook.
Should you rely on monday.com webhooks alone?
Not for anything that must not miss an event. A webhook is the fast path, and it is not a guarantee: deliveries stop after 30 minutes of failure, a recipe can be switched off, and nothing in monday's documentation promises the order in which a burst of edits arrives. Pair the webhook with a scheduled sweep that compares the two systems and fixes the difference, and make both write through the same idempotent path.
That is the shape of the role sync in our Make projects library, which copies job roles between two monday.com workspaces. Two instant scenarios carry the changes, and a third runs every fifteen minutes and looks for anything they missed, checking by name before it creates anything so the overlap cannot duplicate. Across the three scenarios Make has counted 292 runs and 622 operations, and the sweep has polled 265 times with no misses recorded. The sweep costs two operations when there is nothing to do, which is a small price for not having to trust the webhook.
Where it breaks: a sweep has its own limits. That one reads the forty newest roles, which suits its volume and would need widening if hundreds arrived inside one window, and it matches by name, so a renamed role is created again on the other side. A sweep also costs something on every run, which our Make.com credits article puts in numbers. And if the requirement is really a database with a board in front of it, our monday.com page explains when to move the logic off the board altogether.
A disclosure. Skofi is paid to build and repair integrations on monday.com, including the webhook handling described here. We are not a monday.com partner and hold no certification or reseller arrangement with monday.com, Make, Zapier or n8n.
Common questions
Because it was created through the API with a monday app's integration token. monday's Webhooks reference says end users cannot disable webhooks created that way, so a user cannot disrupt the app by toggling them. Change or remove it in the app that created it, or through the API with that app's token.
If it is a Webhooks recipe on the board, delete the recipe in the board's Automations Center. If it was created through the API, list the board's webhooks with the webhooks query to get its ID, then call delete_webhook(id:) with a token that is allowed to remove it, which for an app-created webhook means that app's token.
Not in place. The API has create_webhook and delete_webhook and no update. Create the replacement first, then delete the old one, and make the receiver idempotent so the short overlap does not produce duplicates.
Usually the webhook listens for a different event than the one happening, for example a specific column other than the one being edited, or item events when the change is on a subitem. Check event and config with the webhooks query. Also check that the endpoint answered the challenge on create, and that it was not down for longer than monday's 30-minute retry window.
No. Make's instant monday.com modules rely on a Webhooks recipe that you add on the board with Make's address, and deleting the scenario leaves that recipe in place. Make deactivates a webhook detached from any scenario for more than 120 hours, after which it answers 410 Gone. Delete the recipe on the board as well.
It is an argument to the webhooks query. Set to true, it returns only the webhooks created by the app making the request, so it is useful only when you query with that app's token. The query returns each webhook's id, board_id, event and config, but not its URL or creator.
Create the webhook with an integration app token. Deliveries then carry a JWT in the Authorization header, signed with the app's Signing Secret. Verify the signature, check that aud matches your endpoint and that exp has not passed. Webhooks created with a personal token carry no such proof.
Sources
Statements about what a platform does are checked against the vendor’s own documentation as of 2026-10-21. Vendors change things, so check the current page before you rely on a limit or a price.
- Webhooks · monday.com (API reference)
- Authentication · monday.com (API reference)
- Authorization header · monday.com (apps documentation)
- Webhook integration · monday.com (Help Center)
- How to manage apps on your account · monday.com (Help Center)
- monday.com · Make (Apps documentation)
- Webhooks · Make (Help Center)
- REST Hook trigger · Zapier (Platform documentation)
- monday.com integrations · Zapier
- monday.com node · n8n (Docs)
- n8n-nodes-monday · monday.com (GitHub)
Drafted with AI assistance (Claude). Published under Saveez Irfan’s name, who is accountable for it. Editorial policy