Skip to main content

Webhook Notifications

Automatically notify external services when events occur in your workspace.

Updated today

What Are Webhooks?

Webhooks allow you to receive real-time updates when events happen in your Marker.io workspace. Think of them as “reverse APIs”—instead of pulling for data, we push it to your server when something happens.

Common use cases:

  • Push website feedback into tools you manage internally

  • Use Zapier Webhooks to connect Marker.io with any app in the Zapier ecosystem

  • Integrate Marker.io with unsupported project management tools

  • Trigger automations or alerts in Slack, Discord, etc.

  • Keep external databases in sync with feedback reports

Supported Events

Event Type

Description

issue.created

Triggered when a new issue is submitted

issue.updated

(coming soon)

issue.status_updated

(coming soon)

issue.assignee_updated

(coming soon)

comment.created

(coming soon)


Setting up Webhooks

Creating a Webhook

To create a new webhook:

  1. Go to Workspace Settings > Webhooks

  2. Click Create webhook

  3. Fill in the fields:

    • Name: A label for your webhook (e.g., “Slack alerts”)

    • URL: The endpoint where Marker.io will send the payload

    • Events: Select the events you want to listen to

    • Projects: Apply to all projects or select specific ones

Configuration Options

Events

  • Issue created: Triggers when someone reports a new issue

  • Issue updated: (coming soon)

  • Issue status updated: (coming soon)

  • Issue assignee updated: (coming soon)

  • Comment created: (coming soon)

Project targeting

  • All Projects: Webhook triggers for any selected event across your workspace

  • Specific Projects: Disable "Apply to all" and manually select target projects

Managing Your Webhooks

Once your webhooks are created, you can manage them from the Workspace Settings > Webhooks page.

  • Click on any webhook name to update its name, URL, events, or project scope.

  • Use "Send sample webhook" to test your endpoint

  • Delete webhooks permanently if it's no longer needed.

Payload Format

Each webhook event sends a POST request with the following top-level structure:

{
"type": "issue.created",
"webhookId": "6863faaef12d42a21ab51437",
"webhookTimestamp": 1751547415678,
"data": {
// Event-specific payload
}
}
  • type: What happened (like "issue.created")

  • webhookId: Unique ID of the webhook

  • webhookTimestamp: UNIX timestamp (ms) when the event was triggered

  • data: Full details of the event

Example: issue.created

Here's what you'll get when an issue is created:

{
"type": "issue.created",
"webhookId": "68690db898b5767ca2c3fbd7",
"webhookTimestamp": 1751876876200,
"data": {
"id": "6864f4ee8ea25470b6b7bc34",
"createdAt": "2025-07-07T08:27:56.199Z",
"updatedAt": "2025-07-07T08:27:56.199Z",
"markerId": "NT-1",
"title": "Sample issue",
"description": "Sample description",
"publicUrl": "https://marker.io/i/6864f4ee8ea25470b6b7bc34?advanced=1",
"privateUrl": "https://marker.io/projects/67dd8d16c5821a340c9af705/issues/all/6864f4ee8ea25470b6b7bc34",
"project": {
"id": "67dd8d16c5821a340c9af705",
"name": "No tool"
},
"destination": {
"id": "67dd8d16c5821a340c9af706",
"name": "No tool",
"platform": "notool"
},
"reporter": {
"id": "67dbe7d5a3808f271be6a5c6",
"name": "Sarah Johnson",
"email": "sarah.johnson@example.com",
"role": "admin"
},
"assignee": {
"id": "67dbe7d5a3808f271be6a5c6",
"name": "Alex Chen",
"email": "alex.chen@example.com"
},
"status": "open",
"priority": "medium",
"issueType": {
"id": "68501c291b2970f6885c6289",
"name": "Improvement",
"description": "Enhancements, feature requests, or suggestions."
},
"dueDate": "2025-07-14T08:27:56.199Z",
"platform": "notool",
"key": null,
"url": null,
"platformShortId": null,
"platformTitle": null,
"platformAssignees": [],
"platformPriority": null,
"platformStatus": null,
"fields": [
{
"id": "notool/assignee",
"fieldKey": "notool/assignee",
"label": "Assignee",
"fieldType": "markerUserSelect",
"value": null
},
{
"id": "notool/priority",
"fieldKey": "notool/priority",
"label": "Priority",
"fieldType": "select",
"value": null
},
{
"id": "notool/duedate",
"fieldKey": "notool/duedate",
"label": "Due date",
"fieldType": "datetime",
"value": null
}
],
"attachments": [],
"screenshotUrl": null,
"console": null,
"network": {
"details": {
"success": 4,
"failed": 0
},
"summary": "4 successful",
"url": "https://marker.io/i/6864f4ee8ea25470b6b7bc34?advanced=1&activePane=console"
},
"browser": {
"name": "Chrome",
"version": "137.0.0.0",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36"
},
"operatingSystem": {
"family": "OS X",
"version": "15.5.0"
},
"screenSize": {
"width": 1920,
"height": 1080,
"pixelRatio": 1
},
"viewport": {
"width": 1920,
"height": 974
},
"zoom": {
"zoomFactor": null
},
"website": {
"url": "https://app.marker.io/demo?destinationId=67938ea9b6c2d6a91868d8ad",
"pageTitle": "Marker.io",
"domain": "app.marker.io"
},
"browserStackLaunchUrl": null,
"fullStorySessionUrl": null,
"logRocketSessionUrl": null,
"customData": {
"plan": "free",
"username": "jane",
"collectionSize": 130
},
"contextString": "Captured in Chrome 137.0.0.0, 1920 x 974 viewport, @1x pixel ratio, OS X 15.5.0, desktop device"
}
}

Note: Some values may be null depending on the context (e.g., no assignee). More fields may appear automatically for integration projects.


Testing Webhooks

Want to make sure everything's working? Here's how:

  1. Go to your Webhooks page

  2. Click the three dots next to your webhook

  3. Hit Send sample webhook

  4. Check if your endpoint gets the test data

💡 Note: When you create a new webhook, we automatically send a sample issue.created payload to your endpoint. This helps confirm your server is receiving and processing events correctly.


Security & Signatures

Marker.io signs each webhook payload using your webhook’s secret. The signature is included in the X-Hub-Signature-256 header.

'Content-type': 'application/json' 'X-Hub-Signature-256': [YOUR SIGNATURE TOKEN]

To validate a webhook:

  • Compute an HMAC SHA-256 hash of the raw request body using your webhook secret.

  • Compare your computed hash to the one in the X-Hub-Signature-256 header.

  • Use a constant-time comparison method (e.g., crypto.timingSafeEqual) to prevent timing attacks (never compare using ==).

Important notes:

  • Signature format: sha256=<hex_digest>

  • The hash is based on the raw payload and the secret.

  • Ensure the payload is handled as UTF-8 if applicable.


Availability

Webhooks are available on the Team and Business plan.


FAQ

Why am I not receiving any webhooks?

  • Use a 3rd party service like webhook.site to confirm events are firing

  • Make sure your webhook is enabled and URL is publicly accessible

  • Your server must return a 200 OK within 30 seconds

  • Verify your server can handle the JSON we're sending

I'm using Cloudflare and not getting anything

Some customers reported issues when Bot Fight Mode is enabled. Try disabling it in Cloudflare settings to allow our webhook traffic.

image.png

Migrating from an old webhook project?

Follow this migration guide to switch from legacy to workspace-wide notifications.


With this guide, you can leverage the full potential of Marker.io's Webhooks integration, ensuring a seamless feedback collection and integration process.

Did this answer your question?