Overview
The Intercom integration allows your customers to report issues directly in Intercom. Every issue submitted through Marker.io's widget automatically becomes a trackable conversation in Intercom, with contextual screenshots, session replay and technical logs.
How it works
As soon as your support agent answers your customer in Intercom, the conversation will continue within Intercom. Hereβs an example of what your support agents will see in Intercom:
Benefits
Zero Manual Entry - All issues details transfer automatically from Marker.io to Intercom
Instant Visibility - Support agents see issues immediately in Intercom
Rich Technical Context - Browser info, console logs, and screenshots available for developers
Complete Tracking - Every issue becomes a trackable conversation with full history
Enterprise feature
To enable Intercom webhooks on your workspace, contact us for a demo β
Data captured
Customer-facing message 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 it up
You will need to use webhooks to listen when a new issue is created, then use it to create a new conversation in Intercom.
To make implementation easy, we created two guides for how to integrate webhooks with Intercom more easily.
Connect Intercom via n8n
How it works
n8n Webhook receives Marker.io issue data
Format and extract relevant information from the payload
Create/update contact in Intercom with reporter details
Start conversation 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
Intercom account with API access
Intercom Access Token with appropriate permissions
Admin ID from your Intercom workspace
n8n Setup Instructions
Step 1: Import the Workflow
Import this workflow into your n8n instance or copy/paste the code to import into n8n (at the end of this section)
The workflow contains 5 nodes:
Webhook trigger
Format Marker.io Data (Code node)
Create/Update Contact (HTTP Request)
Create Conversation (HTTP Request)
Add Internal Note (HTTP Request)
Code to import into n8n
Code to import into n8n
{ "nodes": [ { "parameters": { "httpMethod": "POST", "path": "e373c60f-8530-4368-a486-fcc41f410b6c", "options": {} }, "type": "n8n-nodes-base.webhook", "typeVersion": 2, "position": [ 2120, -80 ], "id": "e98a66fe-bed4-4b3f-b273-7e0e5f55bf74", "name": "Webhook1", "webhookId": "e373c60f-8530-4368-a486-fcc41f410b6c" }, { "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 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 }\\n}];" }, "id": "cd579b01-1cee-4cc7-9014-347703ef9479", "name": "Format Marker.io Data1", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 2340, -80 ] }, { "parameters": { "method": "POST", "url": "<https://api.intercom.io/contacts>", "authentication": "predefinedCredentialType", "nodeCredentialType": "intercomApi", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "role", "value": "user" }, { "name": "email", "value": "={{ $json.reporterEmail }}" }, { "name": "name", "value": "={{ $json.reporterName }}" } ] }, "options": {} }, "id": "3eec8d76-a9f6-465f-9580-ea00c77ee4a5", "name": "Create/Update Contact1", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 2560, -80 ], "continueOnFail": true }, { "parameters": { "method": "POST", "url": "<https://api.intercom.io/conversations>", "authentication": "predefinedCredentialType", "nodeCredentialType": "intercomApi", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "from", "value": "={{ { \\"type\\": \\"user\\", \\"email\\": $('Format Marker.io Data1').item.json.reporterEmail } }}" }, { "name": "body", "value": "={{ $('Format Marker.io Data1').item.json.messageBody }}" }, { "name": "message_type", "value": "inapp" } ] }, "options": {} }, "id": "f8c15e83-a647-449d-bde5-56b0c6688d92", "name": "Create Conversation1", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 2780, -80 ], "credentials": { "intercomApi": { "id": "", "name": "Intercom account" } } }, { "parameters": { "method": "POST", "url": "=https://api.intercom.io/conversations/{{ $json.conversation_id }}/parts", "authentication": "predefinedCredentialType", "nodeCredentialType": "intercomApi", "sendHeaders": true, "specifyHeaders": "json", "jsonHeaders": "[\\n {\\n \\"name\\": \\"Accept\\",\\n \\"value\\": \\"application/json\\"\\n },\\n {\\n \\"name\\": \\"Intercom-Version\\",\\n \\"value\\": \\"2.13\\"\\n }\\n ]", "sendBody": true, "bodyParameters": { "parameters": [ { "name": "message_type", "value": "note" }, { "name": "body", "value": "={{ $('Format Marker.io Data1').item.json.noteBody }}" }, { "name": "admin_id" } ] }, "options": {} }, "id": "56ba62f9-fa83-4706-9f81-2cf3fa75aa6c", "name": "Add Internal Note1", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 3000, -80 ], "credentials": { "intercomApi": { "id": "", "name": "Intercom account" } } }, { "parameters": { "content": "# Marker.io to Intercom integration\\n\\n**Automatically create Intercom conversations with full technical context when your team receive new Marker.io issues**\\n\\n## π― What this template does\\n\\nThis workflow creates a seamless bridge between Marker.io and Intercom, your customer support platform. Every issue submitted through Marker.io's widget automatically becomes a trackable conversation in Intercom, complete with technical details and visual context. Centralizing customers issues in Intercom helps your support agents continue the conversation right where they work every day.\\n\\nWhen a bug is reported, the workflow:\\n- Creates or updates the reporter as an Intercom contact\\n- Opens a new conversation with the reporter and the all issue details\\n- Adds a comprehensive internal note with technical metadata\\n- Preserves all screenshots, browser info, and custom data\\n\\n## β¨ Benefits\\n\\n- **Zero manual entry** - All bug details transfer automatically\\n- **Instant visibility** - Support agents sees 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\\n## π‘ Use Cases\\n\\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 the support tickets\\n\\n## π§ How it works\\n\\n1. **N8N Webhook receives** Marker.io bug report data\\n2. **Format and extract** relevant information from the payload\\n3. **Create/update contact** in Intercom with reporter details\\n4. **Start conversation** with the Title and Bug description\\n5. **Add internal note** with 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\\n- **Marker.io account** with webhook capabilities\\n- **Intercom account** with API access\\n- **Intercom Access Token** with appropriate permissions\\n- **Admin ID** from your Intercom workspace\\n\\n## π Setup Instructions\\n\\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 Intercom credentials**:\\n - Create an Intercom app or use existing API credentials from the Intercom Develper Hub\\n - Add credentials to both HTTP Request nodes\\n - Update the `admin_id` in the \\"Add Internal Note\\" node with the id of one of your intercom admin\\n\\n4. **Test the integration**:\\n - Create a test issue in Marker.io\\n - Verify the conversation appears in Intercom\\n - Check that all data transfers correctly\\n\\n\\n## π Data Captured\\n\\n### Customer-facing message includes:\\n- Issue title\\n- Description\\n\\n### Internal note includes:\\n- π Marker ID\\n- π Priority level and issue type\\n- π Due date (if set)\\n- π₯οΈ Browser and OS details\\n- π€ Develper 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 our webhook events](<https://help.marker.io/en/articles/3738778-webhook-notifications>)", "height": 2220, "width": 700 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 1300, -720 ], "id": "f959f7b1-8ff7-4ae8-bd98-07e6c4f77524", "name": "Sticky Note2" }, { "parameters": { "content": "## π¨ 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**Contact creation failing:**\\n- Ensure Intercom API token has contact write permissions\\n- Check email format in reporter data\\n\\n**Missing internal note:**\\n- Verify admin_id is correct (find in Intercom settings)\\n- Ensure API token belongs to the admin user\\n\\n**Data not appearing:**\\n- Check webhook payload structure hasn't changed\\n- Verify all field paths in the Format node", "height": 420, "width": 440, "color": 5 }, "type": "n8n-nodes-base.stickyNote", "typeVersion": 1, "position": [ 2080, 460 ], "id": "fc2a3297-bb46-4cdd-ae3c-0d3aab97cfab", "name": "Sticky Note3" } ], "connections": { "Webhook1": { "main": [ [ { "node": "Format Marker.io Data1", "type": "main", "index": 0 } ] ] }, "Format Marker.io Data1": { "main": [ [ { "node": "Create/Update Contact1", "type": "main", "index": 0 } ] ] }, "Create/Update Contact1": { "main": [ [ { "node": "Create Conversation1", "type": "main", "index": 0 } ] ] }, "Create Conversation1": { "main": [ [ { "node": "Add Internal Note1", "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: "Intercom Integration with n8n"
URL: Paste your n8n webhook URL
Events: Select "Issue Created"
Projects: Choose specific projects or "All Projects"
Step 3: Set up Intercom Credentials
Create Intercom API credentials:
Go to Intercom Developer Hub
Create a new app or use existing
Generate Access Token with permissions:
Read/Write Contacts
Read/Write Conversations
Add credentials to n8n:
Create new Intercom credentials in n8n
Add to all HTTP Request nodes
Update Admin ID:
Find your admin ID in Intercom settings > Workspace > Teammates > Click on admin name > Copy ID from URL (screenshot how to find your admin ID)
screenshot
Update
admin_id
in the "Add Internal Note" node
Step 4: Test the Integration
Use Marker.io's "Send sample webhook" feature
Or create a test issue in Marker.io
Verify the conversation appears in Intercom
Check that all data transfers correctly
βΌοΈ 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.
Disable Reporter notification in Marker.io Workspace > General > Email notifications
Disable Issue received email
Disable Issue resolved email
Troubleshooting
Contact creation failing:
Contact creation failing:
Ensure Intercom API token has contact write permissions in your Intercomβs Developer Hub
Check email format in reporter data
Verify API endpoint:
https://api.intercom.io/contacts
Missing internal note:
Missing internal note:
Verify
admin_id
is correct (find in Intercom settings)Ensure API token belongs to the admin user
Check Intercom-Version header is set to "2.13"
Data not appearing:
Data not appearing:
Check webhook payload structure hasn't changed
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 Intercom via Zapier
How it works
Zapier receives webhook from Marker.io with issue data
Format and extract relevant information from the payload
Create/update contact in Intercom with reporter details
Start conversation 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
Intercom 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/Update Contact (Intercom app)
Create Conversation (Intercom app)
Add Internal Note (Intercom app)
Step 2: Configure the Webhook
Go to Marker.io: Workspace Settings β Webhooks
Click Create webhook
Configure:
Name: "Intercom 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 Code app in ZapierCode:
// 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/Update Intercom Contact
Add action: Intercom - Create user
Configure:
Email: Map
Json Reporter Email
from Step 2Full Name: Map
Json Reporter Name
from Step 2
Step 5: Create Conversation
Add action: Intercom - Create Conversation
Configure:
Contact type:
User
Contact:
ID
from Step 3Body: Map
Json Message Body
from Step 2
Step 6: Add Internal Note
Add action: Intercom - Reply to Conversation
Configure:
Conversation ID:
ID
from Step 5Reply Type: admin_note
Admin ID: Same
ID
as your Intercom AccountReply Body:
Json Node Body
from Step 2Attachments:
Json Screenshot Url
from Step 2
Step 7: Test and Activate
Test each step individually
Create a test issue in Marker.io
Verify conversation appears in Intercom
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
Contact creation failing:
Contact creation failing:
Verify email field is mapped correctly
Check Intercom connection in Zapier
Ensure proper Intercom API permissions
Conversation not created:
Conversation not created:
Confirm contact was created successfully
Check message body isn't empty
Verify Intercom app has conversation permissions
Missing internal note:
Missing internal note:
Ensure admin account is selected
Check note content isn't exceeding limits
Verify conversation ID is passed correctly
More
To learn more about webhooks, check out our general webhook notifications guide