Creating webhooks in Merge

Last updated: June 26, 2026

Overview

Merge supports two webhook types: Merge webhooks sent to you (Merge sends events to your system) and third-party webhooks sent to Merge (Merge listens for events from a third-party system). This article walks through where to configure Merge webhooks in your Merge dashboard, the full list of supported events, and the shape of a webhook payload.

How do I create a webhook?

  1. Log in to your Merge dashboard and click Advanced in the left panel.

  2. Open the Webhooks page.

  3. Click +Webhook.

  4. Enter the Webhook URL and pick the webhook type you want to create. The full configuration guide is in the Merge webhooks overview.

Webhooks.png
  1. Use the Send a POST request button at the bottom of the page to test the webhook end-to-end.

Webhook Test.png

What webhook events are available?

  • Sync notificationsLinkedAccount.sync_completed and {common_model}.synced

  • Issue notificationsIssue.new, Issue.reopened, and Issue.resolved.

  • Common Model notifications{common_model}.synced, {common_model}.added, {common_model}.changed, and {common_model}.removed, where {common_model} is the actual model name (for example, candidate.changed or employee.added).

What does a webhook payload look like?

Every webhook payload contains three top-level objects:

  • hook — information about the webhook itself, including its id, event, and target URL.

  • linked_account — identifying information about the Linked Account that triggered the webhook, including integration, category, account_type (e.g., PRODUCTION), and the end-user fields.

  • data — the part that changes depending on your webhook configuration:

    • A Linked Account Issue webhook sends an issue object.

    • A sync notification webhook (LinkedAccount.sync_completed) sends an is_initial_sync boolean and a sync_status map keyed by Common Model.

    • A data-changed webhook sends the actual Common Model — a candidate.changed webhook sends the candidate object, an employee.added webhook sends the employee object, and so on.

Example LinkedAccount.sync_completed payload:

{
  "hook": {
    "id": "164f934e-5b1a-433e-9f7f-85c72b8cd155",
    "event": "LinkedAccount.sync_completed",
    "target": "https://typedwebhook.tools/webhook/620e9c36-9242-4f53-9ea5-fb908bc16556"
  },
  "linked_account": {
    "id": "0e7cceaa-9b5c-4d44-8606-6e99f2b83026",
    "integration": "Linear",
    "integration_slug": "linear",
    "category": "ticketing",
    "account_type": "PRODUCTION",
    "end_user_origin_id": null,
    "end_user_organization_name": "Merge Sandbox Account",
    "end_user_email_address": "[email protected]",
    "status": "COMPLETE",
    "webhook_listener_url": "https://api.merge.dev/api/integrations/webhook-listener/NklqLkUfSocPg2ROML79uBG_xUuIoImRFNkZGG6q7LfE_lETf8O3fA",
    "is_duplicate": null
  },
  "data": {
    "is_initial_sync": false,
    "integration_name": "Linear",
    "integration_id": "linear",
    "sync_status": {
      "ticketing.Comment": {
        "last_sync_finished": "2025-09-01T12:34:56Z",
        "last_sync_result": "DONE"
      }
    }
  }
}

Who should I contact for help?

If you have questions about configuring webhooks or interpreting payloads, reach out to us at [email protected].