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
n8n Webhook receives Marker.io issue data
Format and extract relevant information from the payload
Create/update user in Zendesk with reporter details
Start ticket with the title and issue description
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
Import this workflow into your n8n instance or copy the code snippet for n8n workflow (at the end of this section)
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
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
Save the workflow to generate the webhook URL
Copy the test webhook URL
Go to Marker.io: Workspace Settings β Webhooks β Create webhook
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
Create Zendesk API credentials:
Make sure to enable βAllow API token accessβ in Apps & Integration > APIs > API configuration
Add credentials to n8n:
Create new Zendesk credentials in n8n
Add to all HTTP Request nodes
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
Troubleshooting
User creation failing:
User creation failing:
Ensure Zendesk API token has enough permissions
Check email format in reporter data
Missing internal note:
Missing internal note:
Ensure Zendesk API token has enough permissions
Data not appearing:
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):
Webhook security (optional):
Validate signatures using X-Hub-Signature-256 header
Connect Zendesk via Zapier
How it works
Zapier receives webhook from Marker.io with issue data
Format and extract relevant information from the payload
Create/update user in Zendesk with reporter details
Start ticket with the title and issue description
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
Import this Zapier template in your Zapier account.
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
Go to Marker.io: Workspace Settings β Webhooks
Click Create webhook
Configure:
Name: "Zendesk Integration with Zapier"
URL: Paste the Zapier webhook URL
Events: Select "Issue Created"
Projects: Choose specific projects or "All Projects"
Test: Click "Send sample webhook" in Marker.io
Verify in Zapier that the test was received
Step 3: Parse the Webhook Data
Add action: Code by Zapier (JavaScript)
Input Data: Map
lead_json
toRaw Body:{β¦}
variable from the webhook Screenshot of the Zapier code app
Code snippet for Zapier code block
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 ? `` : ''}
**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
Add action: Zendesk - Create ticket
Configure:
Subject:
Json Issue Title
from Step 2Requester Name:
Json Reporter Name
from Step 2Requester Email:
Json Reporter Email
from Step 2First Comment/Description format: Plain Text/Markdown
First Comment/Description:
Json Message Body
from Step 2Should the first Comment be public?: yes
Tags: marker-io,
Json Issue Type
from Step 2Status: null
Step 5: Add Comment to Ticket
Add action: Zendesk - Add Comment to Ticket
Configure:
Ticket:
ID
from Step 3Comment body:
Json Node Body
from Step 2Comment format: Plain Text/Markdown
Should the Comment be public?: No
Step 6: Test and Activate
Test each step individually
Create a test issue in Marker.io
Verify tickets appears in Zendesk
Turn on your Zap
Disable Reporter notification in Marker.io Workspace > General > Email notifications
Disable Issue received email
Disable Issue resolved email
Troubleshooting
Webhook not received:
Webhook not received:
Test with webhook.site first
Check that "Issue Created" event is selected
Check Zapier webhook URL is correct
Ticket not created:
Ticket not created:
Confirm user was created successfully
Check message body isn't empty
Verify Zendesk app has enough permissions
Missing internal note:
Missing internal note:
Verify ticket ID is passed correctly
More
Integrate Marker.io with Intercom
More documentation on webhook notifications