Get app lifecycle subscriptions

Learn how to read, update, and delete app feature-level lifecycle event subscriptions via the platform API

🚧

Only available in versions 2026-04 and later

Feature-level lifecycle event subscriptions let app developers receive webhook notifications when users interact with specific app feature instances (for example, when a board view is duplicated, an object is created, or a column extension is deleted). These subscriptions give developers fine-grained control over how and where events are delivered.

  • Feature-level subscriptions: Subscribe only to the feature-level events you care about
  • Per-event routing: Route different event types to different webhook endpoints
  • Sync/async handling: Choose synchronous or asynchronous handling per event
  • Clear identifiers: Manage subscriptions using clear feature identifiers
Supported Event Types
<tbody>
  <tr><td>AppFeatureBoardColumnExtension:delete</td><td>When a column extension is deleted</td></tr>
  <tr><td>AppFeatureBoardColumnExtension:duplicate</td><td>When a column extension is duplicated</td></tr>
  <tr><td>AppFeatureBoardColumnExtension:export</td><td>When a column extension is exported</td></tr>
  <tr><td>AppFeatureBoardView:delete</td><td>When a board view containing your app feature is deleted</td></tr>
  <tr><td>AppFeatureBoardView:duplicate</td><td>When a board view containing your app feature is duplicated</td></tr>
  <tr><td>AppFeatureBoardView:restore</td><td>When a board view containing your app feature is restored</td></tr>
  <tr><td>AppFeatureColumn:create</td><td>When a custom column is created</td></tr>
  <tr><td>AppFeatureColumn:delete</td><td>When a custom column is deleted</td></tr>
  <tr><td>AppFeatureObject:archive</td><td>When a custom object instance is archived</td></tr>
  <tr><td>AppFeatureObject:create</td><td>When a custom object instance is created</td></tr>
  <tr><td>AppFeatureObject:delete</td><td>When a custom object instance is deleted</td></tr>
  <tr><td>AppFeatureObject:duplicate</td><td>When a custom object instance is duplicated</td></tr>
  <tr><td>AppFeatureObject:import</td><td>When custom objects are imported</td></tr>
  <tr><td>AppFeatureObject:publish</td><td>When a custom object is published</td></tr>
  <tr><td>AppFeatureObject:restore</td><td>When a custom object instance is restored from the archive</td></tr>
  <tr><td>AppFeatureObject:unpublish</td><td>When a custom object is unpublished</td></tr>
  <tr><td>AppFeatureObject:update\_attributes</td><td>When a custom object's attributes are updated</td></tr>
</tbody>

Queries

Get app lifecycle subscriptions

  • Only works for app collaborators
  • Returns an array containing metadata about an app's feature-level lifecycle event subscriptions
  • Can only be queried directly at the root; can't be nested within another query
query {
  get_app_lifecycle_subscriptions(app_id: "123", version_id: "456") {
    id
    entity_id
    event_type
    webhook_url
    is_sync
  }
}

Arguments

ArgumentTypeDescription
app_idID!The app's unique identifier.
version_idIDThe app version's unique identifier. If not provided, the active version will be returned.

Fields

FieldTypeDescription
created_atDateThe subscription's creation date.
entity_idIDThe entity's unique identifier or complete slug.
entity_typeStringThe type of entity (e.g., "appFeature").
event_typeStringThe lifecycle event type (e.g., "AppFeatureColumn:create"). View the full list of supported event types above.
idIDThe subscription's unique identifier.
is_syncBooleanWhether the app’s handling of the event is synchronous.
updated_atDateThe subscription's last updated date.
webhook_urlStringThe webhook URL for notifications.

Mutations

  • Event types must match the app feature type. For example, you cannot subscribe to AppFeatureObject:create events on a board view app feature.
  • 🚧 You can't delete subscriptions for live app versions.

Update app lifecycle subscription

Updates all existing subscriptions' configurations. Returns [LifecycleSubscriptionKind!].

mutation {
  update_app_lifecycle_subscription(
    entity_identifier: "my-app::my-object-feature"
    entity_type: "appFeature"
    input: {
      lifecycle_events: [
        {
          event_type: "AppFeatureObject:create"
          webhook_url: "https://myapp.com/webhooks/lifecycle"
          is_sync: false
        }
        {
          event_type: "AppFeatureObject:delete"
          webhook_url: "https://myapp.com/webhooks/lifecycle"
          is_sync: false
        }
        {
          event_type: "AppFeatureObject:update_attributes"
          webhook_url: "https://myapp.com/webhooks/lifecycle"
          is_sync: true
        }
      ]
    }
  ) {
    id
    event_type
    webhook_url
    is_sync
  }
}

Arguments

ArgumentTypeDescription
entity_identifierID!The entity's unique identifier or complete slug (e.g., app_slug::feature_slug). If using the slug, the request is applied to the app’s resolved active version.
entity_typeString!The entity's type. Currently only supports appFeature.
inputUpdateLifecycleSubscriptionsInput!The entity's lifecycle event configuration input.
💡

When using a full app slug, the API automatically resolves which app version the request applies to.

  • If the active version is a draft, the request is applied to that draft version.
  • If the active version is not opted in (i.e., not draft-enabled), the request is applied to the live version.
  • If there is no live version, the request is applied to the latest draft version.

Delete app lifecycle subscription

Deletes all app lifecycle subscriptions. Returns a Boolean indicating if the deletion was successful or if no subscriptions exist.

mutation {
  delete_app_lifecycle_subscription(
    entity_identifier: "my-app::my-object-feature"
    entity_type: "appFeature"
  )
}

Arguments

ArgumentTypeDescription
entity_identifierStringThe entity's unique identifier or complete slug (e.g., app_slug::feature_slug). If using the slug, the active version will be deleted.
entity_typeStringThe entity's type. Currently only supports appFeature.

Event flow

Once a feature-level lifecycle subscription is configured via the API, the following flow occurs whenever a subscribed event is triggered.

sequenceDiagram
    participant MondayPlatform as monday platform
    participant MondayAppsService as monday app service
    participant YourApp as Your app

    MondayPlatform->>MondayAppsService: Lifecycle event triggered
    MondayAppsService->>MondayAppsService: Look up subscription
    MondayAppsService->>YourApp: POST to webhook URL

    alt Sync Mode (is_sync: true)
        YourApp-->>MondayAppsService: HTTP 200 (success) or 4XX (failure)
        MondayAppsService->>MondayPlatform: Notify result
        Note right of MondayPlatform: Update UI
    else Async Mode (is_sync: false)
        YourApp-->>MondayAppsService: HTTP 202 (acknowledged)
        Note right of YourApp: Process event...
        YourApp->>MondayAppsService: POST to back_to_url with result
        MondayAppsService->>MondayPlatform: Notify result
        Note right of MondayPlatform: Update UI
    end

Webhook security

All feature-level lifecycle webhook requests are authenticated using a JWT signed with your app’s signing secret.

Your server must verify the JWT in each request to confirm it was sent by monday.com. Receiving a payload without verifying the signature doesn't guarantee that the request is authentic.

Webhook request

When a subscribed feature-level event is triggered, monday.com sends a POST request to the configured webhook URL.

  • Authorization: JWT signed with your app’s signing secret (used to verify the request came from monday)
  • Content-Type: application/json
  • X-Apps-Event-Id: Unique event ID for tracking

Verifying the webhook request

To ensure the request was sent by monday.com:

  1. Retrieve the JWT from the Authorization header.
  2. Verify the JWT signature using your app’s signing secret.
  3. Reject the request if verification fails.

Read more about the Authorization header here.

Synchronous vs asynchronous mode

Each feature-level lifecycle event can be handled independently, either synchronously or asynchronously.

  • Respond with HTTP 202 to acknowledge receipt
  • Process the event in the background
  • Call back\_to\_url when processing is complete

Async Response Example

curl -X POST "{back_to_url}" \
  -H "Content-Type: application/json" \
  -d '{"success": true}'

Best for: Complex calculations, external API calls, database operations, file processing

  • Respond with HTTP 202 to acknowledge receipt
  • Process the event in the background
  • Call back\_to\_url when processing is complete

Async Response Example

curl -X POST "{back_to_url}" \
  -H "Content-Type: application/json" \
  -d '{"success": true}'

Best for: Complex calculations, external API calls, database operations, file processing