Skip to main content

Zendesk integration

Automatically create Zendesk tickets with full technical context when your team receives new Marker.io issues.

Updated today

Overview

The Zendesk integration allows your customers to report issues directly in Zendesk. Every issue submitted through Marker.io's widget automatically becomes a trackable ticket in Zendesk, with contextual screenshots, session replay and technical logs.

How it works

As soon as your support agent answers your customer in Zendesk, the ticket will continue within Zendesk. Here’s an example of what your support agents will see in Zendesk:

Benefits

  • Zero Manual Entry - All issues details transfer automatically from Marker.io to Zendesk

  • Instant Visibility - Support agents see issues immediately in Zendesk

  • Rich Technical Context - Browser info, console logs, and screenshots available for developers

  • Complete Tracking - Every issue becomes a trackable ticket with full history

Enterprise feature

To enable Zendesk webhooks on your workspace, contact us for a demo β†’


Data captured

Customer-facing ticket includes:

  • Issue title

  • Description

Internal note includes:

  • πŸ†” Marker ID

  • πŸ“Š Priority level and issue type

  • πŸ“… Due date (if set)

  • πŸ–₯️ Browser and OS details

  • πŸ€“ Developer Console & Network logs

  • 🌐 Website URL where issue occurred

  • πŸ”— Direct link to Marker.io issue

  • πŸ“· Screenshot of the issue

  • πŸ“¦ Any custom data fields


How to set this up

You will need to use webhooks to listen when a new issue is created, then use it to create a new ticket in Zendesk.

To make implementation easy, we created two guides for how to integrate webhooks with Zendesk more easily.

Connect to Zendesk via n8n

How it works

  1. n8n Webhook receives Marker.io issue data

  2. Format and extract relevant information from the payload

  3. Create/update user in Zendesk with reporter details

  4. Start ticket with the title and issue description

  5. Add internal note with full technical context and Marker.io links for the support agent

The result is a perfectly organized support ticket that your team can act on immediately, with all the context they need to reproduce and resolve the issue.

Prerequisites

  • Marker.io account with workspace webhooks

  • Zendesk account with API access

  • Zendesk Access Token with appropriate permissions

  • Admin ID from your Zendesk workspace

n8n Setup Instructions

Step 1: Import the Workflow

  1. Import this workflow into your n8n instance or copy the code snippet for n8n workflow (at the end of this section)

  2. The workflow contains 5 nodes:

    • Webhook trigger

    • Format Marker.io Data (Code node)

    • Create/Update User (HTTP Request)

    • Create Ticket (HTTP Request)

    • Add Internal Note (HTTP Request)

Code snippet for n8n workflow

{ "nodes": [ { "parameters": { "httpMethod": "POST", "path": "a1bfef52-25c9-4a7d-916f-87c0ca195305", "options": {} }, "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [ 300, -120 ], "id": "912f522b-6e2f-4c8d-9271-173a6b0ed780", "name": "Webhook", "webhookId": "a1bfef52-25c9-4a7d-916f-87c0ca195305" }, { "parameters": { "jsCode": "// Extract data from Marker.io webhook\nconst data = $input.first().json.body.data;\n\n// Format the conversation message\nconst issueTitle = data.title;\nconst issueDescription = data.description;\nconst markerId = data.markerId;\nconst priority = data.priority;\nconst issueType = data.issueType.name;\nconst publicUrl = data.publicUrl;\nconst privateUrl = data.privateUrl;\nconst dueDate = data.dueDate;\nconst browser = `${data.browser.name} ${data.browser.version}`;\nconst os = `${data.operatingSystem.family} ${data.operatingSystem.version}`;\nconst website = data.website.url;\nconst contextString = data.contextString;\n\n// Create formatted message body with Marker.io ticket link\nconst messageBody = `${issueTitle}\n${issueDescription}`;\n\n// Create formatted message body with Marker.io ticket link\nconst noteBody = `πŸ› **New Issue Reported via Marker.io**\n\n**Issue:** ${issueTitle}\n**ID:** ${markerId}\n**Type:** ${issueType}\n**Priority:** ${priority}\n**Due Date:** ${dueDate ? new Date(dueDate).toLocaleDateString() : 'Not set'}\n\n**Description:**\n${issueDescription}\n\n**Technical Details:**\nβ€’ Browser: ${browser}\nβ€’ OS: ${os}\nβ€’ Website: ${website}\nβ€’ Context: ${contextString}\n\n**Marker.io Links:**\nβ€’ πŸ”— [View Issue](${publicUrl})\n\n**Custom Data:**\n${Object.entries(data.customData || {}).map(([key, value]) => `β€’ ${key}: ${value}`).join('\\n')}`;\n\nreturn [{\n json: {\n reporterEmail: data.reporter.email,\n reporterName: data.reporter.name,\n messageTitle: data.title,\n messageBody: messageBody,\n noteBody: noteBody,\n issueId: data.id,\n markerId: markerId,\n priority: priority,\n issueType: issueType,\n publicUrl: publicUrl,\n privateUrl: privateUrl,\n projectId: data.project.id,\n reporterRole: data.reporter.role,\n }\n}];" }, "id": "9decf387-197b-4da6-9fd4-c01b19d031d3", "name": "Format Marker.io Data", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 520, -120 ] }, { "parameters": { "method": "POST", "url": "https://[REPLACE_SUBDOMAIN].zendesk.com/api/v2/users/create_or_update.json", "authentication": "predefinedCredentialType", "nodeCredentialType": "zendeskApi", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "user", "value": "={{ { \"name\": $json.reporterName, \"email\": $json.reporterEmail, \"role\": $json.reporterRole } }}" } ] }, "options": {} }, "id": "2dba9246-37f2-4c47-a09e-9d2cacbf28ae", "name": "Create/Update User", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 740, -120 ], "credentials": { "zendeskApi": { "id": "Tg28xCRiiqgHXbIa", "name": "Zendesk account" } }, "continueOnFail": true }, { "parameters": { "method": "POST", "url": "https://[REPLACE_SUBDOMAIN].zendesk.com/api/v2/tickets.json", "authentication": "predefinedCredentialType", "nodeCredentialType": "zendeskApi", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "ticket", "value": "={{ {\n \"subject\": $('Format Marker.io Data').item.json.messageTitle,\n \"comment\": {\n \"body\": $('Format Marker.io Data').item.json.messageBody\n },\n \"requester\": {\n \"email\": $('Format Marker.io Data').item.json.reporterEmail,\n \"name\": $('Format Marker.io Data').item.json.reporterName\n },\n \"priority\": $('Format Marker.io Data').item.json.priority,\n \"tags\": [\"marker-io\", $('Format Marker.io Data').item.json.issueType],\n \"custom_fields\": [\n {\n \"id\": 123456,\n \"value\": $('Format Marker.io Data').item.json.markerId\n }\n ]\n} }}" } ] }, "options": {} }, "id": "857bb007-3ada-4a0e-bd8b-7e30c2b228c8", "name": "Create Ticket", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 960, -120 ], "credentials": { "zendeskApi": { "id": "Tg28xCRiiqgHXbIa", "name": "Zendesk account" } } }, { "parameters": { "method": "PUT", "url": "=https://[REPLACE_SUBDOMAIN].zendesk.com/api/v2/tickets/{{ $json.ticket.id }}.json", "authentication": "predefinedCredentialType", "nodeCredentialType": "zendeskApi", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "ticket", "value": "={{ {\n \"comment\": {\n \"body\": $('Format Marker.io Data').item.json.noteBody,\n \"public\": false\n }\n} }}" } ] }, "options": {} }, "id": "ce5b6b09-9d82-4d0b-8a1c-fcbafa4e97d6", "name": "Add Internal Comment", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 1180, -120 ], "credentials": { "zendeskApi": { "id": "Tg28xCRiiqgHXbIa", "name": "Zendesk account" } } }, { "parameters": { "content": "# Marker.io to Zendesk Integration\n\n**Automatically create Zendesk tickets with full technical context when your team receives new Marker.io issues**\n\n## 🎯 What this template does\nThis workflow creates a seamless bridge between Marker.io and Zendesk, your customer support platform. Every issue submitted through Marker.io's widget automatically becomes a trackable ticket in Zendesk, complete with technical details and visual context. Centralizing customer issues in Zendesk helps your support agents continue the conversation right where they work every day.\n\nWhen an issue is reported, the workflow:\n- Creates or updates the reporter as a Zendesk user\n- Opens a new ticket with all issue details\n- Adds a comprehensive internal comment with technical metadata\n- Preserves all screenshots, browser info, and custom data\n- Automatically tags tickets for easy filtering\n\n## ✨ Benefits\n- **Zero manual entry** - All bug details transfer automatically\n- **Instant visibility** - Support agents see issues immediately \n- **Rich context** - Technical details preserved for developers\n- **Better collaboration** - Single source of truth for bugs\n- **Faster resolution** - No time wasted gathering information\n- **Smart organization** - Auto-tagging for efficient triage\n\n## πŸ’‘ Use Cases\n- **Product Teams**: Streamline bug triage without switching tools\n- **Support Teams**: Get technical context for customer-reported issues\n- **Development Teams**: Access browser info, console logs, and network logs directly from support tickets\n\n## πŸ”§ How it works\n1. **N8N Webhook receives** Marker.io issue data\n2. **Format and extract** relevant information from the payload\n3. **Create/update user** in Zendesk with reporter details\n4. **Create ticket** with the title and issue description\n5. **Add internal comment** with screenshot, full technical context and Marker.io links for the support agent\n\nThe result is a perfectly organized support ticket that your team can act on immediately, with all the context they need to reproduce and resolve the issue.\n\n## πŸ“‹ Prerequisites\n- **Marker.io account** with webhook capabilities\n- **Zendesk account** with API access\n- **Zendesk API token** with appropriate permissions\n\n## πŸš€ Setup Instructions\n1. **Import this workflow** into your n8n instance\n\n2. **Configure the Webhook**:\n - Copy the test/production webhook URL after saving\n - Add to Marker.io: Workspace Settings β†’ Webhooks β†’ Create webhook\n - Select \"Issue Created\" as the trigger event\n\n3. **Set up Zendesk credentials**:\n - Generate an API token from Zendesk Admin Center β†’ Apps and integrations β†’ APIs β†’ Zendesk API\n - Add credentials to all three HTTP Request nodes\n - Update your subdomain in the URLs (replace `[REPLACE_SUBDOMAIN]` with your subdomain)\n\n4. **Customize fields** (optional):\n - Update the custom field ID in \"Create Ticket\" node if you want to store Marker ID\n - Modify tags to match your workflow\n - Adjust priority mapping if needed\n\n5. **Test the integration**:\n - Create a test issue in Marker.io\n - Verify the ticket appears in Zendesk\n - Check that all data transfers correctly\n\n## πŸ“Š Data Captured\n\n### Customer-facing ticket includes:\n- Issue title (as subject)\n- Description (as ticket body)\n\n### Internal comment includes:\n- πŸ†” Marker ID\n- πŸ“Š Priority level and issue type\n- πŸ“… Due date (if set)\n- πŸ–₯️ Browser and OS details\n- πŸ€“ Developer console & network logs\n- 🌐 Website URL where issue occurred\n- πŸ”— Direct link to Marker.io issue\n- πŸ“· Screenshot of the issue\n- πŸ“¦ Any custom data fields\n\n[β†’ Read more about Marker.io webhook events](https://help.marker.io/en/articles/3738778-webhook-notifications)", "height": 2160, "width": 700 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ -540, -740 ], "id": "974302df-baf6-4fed-a2a8-26b702a522a0", "name": "Sticky Note2" }, { "parameters": { "content": "\n## 🚨 Troubleshooting\n\n**Webhook not triggering:**\n- Verify webhook URL is correct in Marker.io\n- Check that \"Issue Created\" event is selected\n- Test with Marker.io's webhook tester\n\n**User creation failing:**\n- Ensure Zendesk API token has user management permissions\n- Check email format in reporter data\n- Verify subdomain is correct in URLs\n\n**Ticket not appearing:**\n- Check API token has ticket creation permissions\n- Verify required fields are populated\n- Review Zendesk audit logs for errors\n\n**Internal comment missing:**\n- Ensure ticket was created successfully first\n- Verify API token permissions\n- Check that ticket ID is being passed correctly\n\n**Custom field not updating:**\n- Verify custom field ID is correct\n- Ensure field is active and visible to agents\n- Check field type matches the data format", "height": 620, "width": 440, "color": 5 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 280, 240 ], "id": "a821b1b9-2fba-408e-bb55-04ae69cd02e4", "name": "Sticky Note3" } ], "connections": { "Webhook": { "main": [ [ { "node": "Format Marker.io Data", "type": "main", "index": 0 } ] ] }, "Format Marker.io Data": { "main": [ [ { "node": "Create/Update User", "type": "main", "index": 0 } ] ] }, "Create/Update User": { "main": [ [ { "node": "Create Ticket", "type": "main", "index": 0 } ] ] }, "Create Ticket": { "main": [ [ { "node": "Add Internal Comment", "type": "main", "index": 0 } ] ] } }, "pinData": {}, "meta": { "instanceId": "b8d4a47d3554c1f7fcd3ee16a413d67d707f3769dee6d5380a7d25c6b616c836" } }

Step 2: Configure the Webhook

  1. Save the workflow to generate the webhook URL

  2. Copy the test webhook URL

  3. Go to Marker.io: Workspace Settings β†’ Webhooks β†’ Create webhook

  4. Configure:

    • Name: "Zendesk Integration with n8n"

    • URL: Paste your n8n webhook URL

    • Events: Select "Issue Created"

    • Projects: Choose specific projects or "All Projects"

Step 3: Set up Zendesk Credentials

  1. Create Zendesk API credentials:

  2. Add credentials to n8n:

    • Create new Zendesk credentials in n8n

    • Add to all HTTP Request nodes

  3. Update Zendesk Subdomain in all URLs of the workflow:

    • Copy your Zendesk subdomain from your url

    • Paste in all URLs fields from your n8n workflow

Step 4: Test the Integration

  1. Use Marker.io's "Send sample webhook" feature

  2. Or create a test issue in Marker.io

  3. Verify the ticket appears in Zendesk

  4. Check that all data transfers correctly

  5. ‼️ Finally, if all is working well, replace the Test url from n8n in Marker.io webhook with the Production url from n8n in Marker.io.

  6. Disable Reporter notification in Marker.io Workspace > General > Email notifications

    1. Disable Issue received email

    2. Disable Issue resolved email

Troubleshooting

Webhook not triggering:

  • Verify webhook URL is correct in Marker.io

  • Check that "Issue Created" event is selected

  • Test with Marker.io's webhook tester

  • Ensure webhook is activated in n8n

User creation failing:

  • Ensure Zendesk API token has enough permissions

  • Check email format in reporter data

Missing internal note:

  • Ensure Zendesk API token has enough permissions

Data not appearing:

  • Check webhook payload structure hasn't changed

  • Make sure you replace your subdomain url with the right Zendesk url

  • Verify all field paths in the Format node

  • Review n8n execution logs for errors

Webhook security (optional):

  • Validate signatures using X-Hub-Signature-256 header


Connect Zendesk via Zapier

How it works

  1. Zapier receives webhook from Marker.io with issue data

  2. Format and extract relevant information from the payload

  3. Create/update user in Zendesk with reporter details

  4. Start ticket with the title and issue description

  5. Add internal note with full technical context and Marker.io links for the support agent

The result is a perfectly organized support ticket that your team can act on immediately, with all the context they need to reproduce and resolve the issue.

Prerequisites

  • Marker.io account with webhook capabilities

  • Zendesk account with API access

  • Zapier account (Professional plan or higher for multi-step Zaps & Premium apps)

Zapier Setup Instructions

Step 1: Create the Trigger

  1. Import this Zapier template in your Zapier account.

  2. The workflow contains 5 nodes:

    • Webhooks trigger by Zapier with Catch Raw webhook

    • Format Marker.io Data (Code app)

    • Create ticket (Zendesk app)

    • Add cmment to ticket Note (Zendesk app)

Step 2: Configure the Webhook

  1. Go to Marker.io: Workspace Settings β†’ Webhooks

  2. Click Create webhook

  3. Configure:

    • Name: "Zendesk Integration with Zapier"

    • URL: Paste the Zapier webhook URL

    • Events: Select "Issue Created"

    • Projects: Choose specific projects or "All Projects"

  4. Test: Click "Send sample webhook" in Marker.io

  5. Verify in Zapier that the test was received

Step 3: Parse the Webhook Data

  1. Add action: Code by Zapier (JavaScript)

  2. Input Data: Map lead_json to Raw Body:{…} variable from the webhook Screenshot of the Zapier code app

Code snippet for Zapier code block

// Zapier Code Block - Extract data from Marker.io webhook

// Parse the incoming JSON
const leadJson = inputData.lead_json || '{}';
const data = JSON.parse(leadJson).data || {};

// Extract relevant fields from the data
const issueTitle = data.title || '';
const issueDescription = data.description || '';
const markerId = data.markerId || '';
const priority = data.priority || '';
const issueType = data.issueType ? data.issueType.name : '';
const publicUrl = data.publicUrl || '';
const privateUrl = data.privateUrl || '';
const dueDate = data.dueDate || '';
const browser = `${data.browser ? data.browser.name : ''} ${data.browser ? data.browser.version : ''}`;
const os = `${data.operatingSystem ? data.operatingSystem.family : ''} ${data.operatingSystem ? data.operatingSystem.version : ''}`;
const website = data.website ? data.website.url : '';
const contextString = data.contextString || '';

// Extract screenshot URL - it's directly in data.screenshotUrl
const screenshotUrl = data.screenshotUrl || '';

// Extract reporter information
const reporterEmail = data.reporter ? data.reporter.email : '';
const reporterName = data.reporter ? data.reporter.name : '';

// Create formatted message body with Marker.io ticket link
const messageBody = `${issueTitle}\n${issueDescription}`;

// Create formatted note body with screenshot
const noteBody = `πŸ› **New Issue Reported via Marker.io**

**Issue:** ${issueTitle}
**ID:** ${markerId}
**Type:** ${issueType}
**Priority:** ${priority}
**Due Date:** ${dueDate ? new Date(dueDate).toLocaleDateString() : 'Not set'}

**Description:**
${issueDescription || 'No description provided'}

**Technical Details:**
β€’ Browser: ${browser}
β€’ OS: ${os}
β€’ Website: ${website}
β€’ Context: ${contextString}

**Marker.io Links:**
β€’ πŸ”— [View Ticket (Public)](${publicUrl})

${screenshotUrl ? `![Screenshot](${screenshotUrl})` : ''}

**Custom Data:**
${Object.entries(data.customData || {}).map(([key, value]) => `β€’ ${key}: ${value}`).join('\n')}`;

// Return the structured output
output = [{
json: {
reporterEmail: reporterEmail,
reporterName: reporterName,
issueTitle: issueTitle,
messageBody: messageBody,
noteBody: noteBody,
issueId: data.id || '',
markerId: markerId,
priority: priority,
issueType: issueType,
publicUrl: publicUrl,
privateUrl: privateUrl,
projectId: data.project ? data.project.id : '',
screenshotUrl: screenshotUrl,

// Additional useful fields
browser: browser,
os: os,
website: website,
contextString: contextString,
createdAt: data.createdAt || '',
updatedAt: data.updatedAt || '',
status: data.status || '',
projectName: data.project ? data.project.name : '',

// Network and console info
networkSummary: data.network ? data.network.summary : '',
networkUrl: data.network ? data.network.url : '',

// Session recording URLs
fullStorySessionUrl: data.fullStorySessionUrl || '',
logRocketSessionUrl: data.logRocketSessionUrl || '',

// Screen info
screenWidth: data.screenSize ? data.screenSize.width : '',
screenHeight: data.screenSize ? data.screenSize.height : '',
viewportWidth: data.viewport ? data.viewport.width : '',
viewportHeight: data.viewport ? data.viewport.height : ''
}
}];

Step 4: Create Ticket

  1. Add action: Zendesk - Create ticket

  2. Configure:

    • Subject: Json Issue Title from Step 2

    • Requester Name: Json Reporter Name from Step 2

    • Requester Email: Json Reporter Email from Step 2

    • First Comment/Description format: Plain Text/Markdown

    • First Comment/Description: Json Message Body from Step 2

    • Should the first Comment be public?: yes

    • Tags: marker-io, Json Issue Type from Step 2

    • Status: null

Step 5: Add Comment to Ticket

  1. Add action: Zendesk - Add Comment to Ticket

  2. Configure:

Step 6: Test and Activate

  1. Test each step individually

  2. Create a test issue in Marker.io

  3. Verify tickets appears in Zendesk

  4. Turn on your Zap

  5. Disable Reporter notification in Marker.io Workspace > General > Email notifications

    1. Disable Issue received email

    2. Disable Issue resolved email

Troubleshooting

Webhook not received:

  • Test with webhook.site first

  • Check that "Issue Created" event is selected

  • Check Zapier webhook URL is correct

Ticket not created:

  • Confirm user was created successfully

  • Check message body isn't empty

  • Verify Zendesk app has enough permissions

Missing internal note:

  • Verify ticket ID is passed correctly


More

Did this answer your question?