Skip to main content

Intercom integration

Automatically create Intercom conversations with full technical context when your team receives new Marker.io issues.

Updated today

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

  1. n8n Webhook receives Marker.io issue data

  2. Format and extract relevant information from the payload

  3. Create/update contact in Intercom with reporter details

  4. Start conversation 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

  • 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

  1. Import this workflow into your n8n instance or copy/paste the code to import into n8n (at the end of this section)

  2. 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

{ "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

  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: "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

  1. Create Intercom API credentials:

    • Create a new app or use existing

    • Generate Access Token with permissions:

      • Read/Write Contacts

      • Read/Write Conversations

  2. Add credentials to n8n:

    • Create new Intercom credentials in n8n

    • Add to all HTTP Request nodes

  3. 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

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

  2. Or create a test issue in Marker.io

  3. Verify the conversation appears in Intercom

  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

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:

  • 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:

  • Check webhook payload structure hasn't changed

  • 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 Intercom 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 contact in Intercom with reporter details

  4. Start conversation 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

  • 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

  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/Update Contact (Intercom app)

    • Create Conversation (Intercom app)

    • Add Internal Note (Intercom app)

Step 2: Configure the Webhook

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

  2. Click Create webhook

  3. Configure:

    • Name: "Intercom 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 Code app in Zapier

  3. Code:

// 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/Update Intercom Contact

  1. Add action: Intercom - Create user

  2. Configure:

    • Email: Map Json Reporter Email from Step 2

    • Full Name: Map Json Reporter Name from Step 2

Step 5: Create Conversation

  1. Add action: Intercom - Create Conversation

  2. Configure:

    • Contact type: User

    • Contact: ID from Step 3

    • Body: Map Json Message Body from Step 2

Step 6: Add Internal Note

  1. Add action: Intercom - Reply to Conversation

  2. Configure:

    • Conversation ID: ID from Step 5

    • Reply Type: admin_note

    • Admin ID: Same ID as your Intercom Account

    • Reply Body: Json Node Body from Step 2

    • Attachments: Json Screenshot Url from Step 2

Step 7: Test and Activate

  1. Test each step individually

  2. Create a test issue in Marker.io

  3. Verify conversation appears in Intercom

  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

Contact creation failing:

  • Verify email field is mapped correctly

  • Check Intercom connection in Zapier

  • Ensure proper Intercom API permissions

Conversation not created:

  • Confirm contact was created successfully

  • Check message body isn't empty

  • Verify Intercom app has conversation permissions

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

Did this answer your question?