{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "f88ccfcf-40e8-445f-bd14-e77f7226d878",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        0,
        0
      ],
      "parameters": {
        "path": "0c89174c-6bf6-4dc6-bdd6-1903d8d16baf",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2
    },
    {
      "id": "a7fdddc9-4355-4e8b-8add-cb28125c4c41",
      "name": "Format Marker.io Data",
      "type": "n8n-nodes-base.code",
      "position": [
        220,
        0
      ],
      "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 ? data.description : 'Not set';\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// Get screenshot URL and add .jpg extension\nlet screenshotUrl = data.screenshotUrl;\nif (screenshotUrl) {\n  // Replace the pattern: \"0?\" with \"0.jpg?\"\n  screenshotUrl = screenshotUrl.replace(/\\/0\\?/, '/0.jpg?');\n}\n\n// Create formatted message body with Marker.io ticket link\nconst titleBody = `${issueTitle}`;\n\n// Create formatted message body with Marker.io ticket link\nconst noteBody = `\ud83d\udc1b **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\u2022 Browser: ${browser}\n\u2022 OS: ${os}\n\u2022 Website: ${website}\n\u2022 Context: ${contextString}\n\n**Marker.io issue:** ${publicUrl}\n\n**Custom Data:**\n${Object.entries(data.customData || {}).map(([key, value]) => `\u2022 ${key}: ${value}`).join('\\n')}`;\n\nreturn [{\n  json: {\n    reporterEmail: data.reporter.email,\n    reporterName: data.reporter.name,\n    titleBody: titleBody,\n    nodeBody: 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    screenshotUrl: screenshotUrl\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "aaa5c6c1-1de5-417e-b294-13cd2adb2b3b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -840,
        -80
      ],
      "parameters": {
        "width": 700,
        "height": 2220,
        "content": "# Marker.io to ServiceNow Integration\n**Automatically create ServiceNow incidents with full technical context when bugs are reported through Marker.io**\n\n## \ud83c\udfaf What this template does\nThis workflow creates a seamless bridge between Marker.io and ServiceNow, your IT service management platform. Every issue submitted through Marker.io's widget automatically becomes a trackable incident in ServiceNow, complete with technical details and visual context. This ensures your IT team can track, prioritize, and resolve bugs efficiently within their existing ITSM workflow.\n\nWhen a bug is reported, the workflow:\n- Captures the complete Marker.io webhook payload\n- Formats all technical details and metadata\n- Creates a new incident in ServiceNow with the reporter information\n- Includes comprehensive technical context and Marker.io links\n- Preserves screenshots, browser info, and custom data\n\n## \u2728 Benefits\n- **Automated ticket creation** - No manual data entry required\n- **Complete context** - All bug details transfer automatically\n- **Faster triage** - IT teams see issues immediately in ServiceNow\n- **Better tracking** - Leverage ServiceNow's incident management capabilities\n- **Rich debugging info** - Browser, OS, and screenshot details preserved\n\n## \ud83d\udca1 Use Cases\n- **IT Service Desks**: Streamline bug reporting from end users\n- **Development Teams**: Track production issues with full technical context\n- **QA Teams**: Convert test findings directly into trackable incidents\n- **Support Teams**: Escalate customer-reported bugs to IT with complete details\n\n## \ud83d\udd27 How it works\n1. **N8N Webhook receives** Marker.io bug report data\n2. **JavaScript node formats** and extracts relevant information\n3. **ServiceNow node creates** incident with formatted details\n4. **Incident includes** title, description, reporter info, and technical metadata\n5. **Links preserved** to both public and private Marker.io views\n\nThe result is a fully documented ServiceNow incident that your IT team can immediately action, with all the context needed to reproduce and resolve the issue.\n\n## \ud83d\udccb Prerequisites\n- **Marker.io account** with webhook capabilities\n- **ServiceNow instance** with API access enabled\n- **ServiceNow credentials** (username/password or OAuth)\n- **Appropriate ServiceNow permissions** to create incidents\n\n## \ud83d\ude80 Setup Instructions\n1. **Import this workflow** into your n8n instance\n2. **Configure the Webhook**:\n   - Copy the production webhook URL after saving\n   - Add to Marker.io: Workspace Settings \u2192 Webhooks \u2192 Create webhook\n   - Select \"Issue Created\" as the trigger event\n3. **Set up ServiceNow credentials**:\n   - In n8n, create new ServiceNow credentials\n   - Enter your ServiceNow instance URL\n   - Add username and password for a service account\n   - Test the connection\n4. **Customize field mappings** (optional):\n   - Modify the JavaScript code to map additional fields\n   - Adjust priority mappings to match your ServiceNow setup\n   - Add custom field mappings as needed\n5. **Test the integration**:\n   - Create a test issue in Marker.io\n   - Verify the incident appears in ServiceNow\n   - Check that all data transfers correctly\n\n## \ud83d\udcca Data Captured\n### ServiceNow Incident includes:\n- **Short Description**: Issue title from Marker.io\n- **Description** containing:\n  - \ud83d\udc1b Issue title and ID\n  - \ud83d\udcca Priority level and issue type\n  - \ud83d\udcc5 Due date (if set)\n  - \ud83d\udcdd Full issue description\n  - \ud83d\udda5\ufe0f Browser version and details\n  - \ud83d\udcbb Operating system information\n  - \ud83c\udf10 Website URL where issue occurred\n  - \ud83d\udd17 Direct links to Marker.io issue (public and private)\n  - \ud83d\udce6 Any custom data fields\n  - \ud83d\udcf7 Screenshot URL with proper formatting\n\n## \ud83d\udd04 Workflow Components\n- **Webhook Node**: Receives Marker.io POST requests\n- **Code Node**: Processes and formats the data using JavaScript\n- **ServiceNow Node**: Creates the incident using ServiceNow API\n\n[\u2192 Read more about Marker.io webhook events](https://help.marker.io/en/articles/3738778-webhook-notifications)"
      },
      "typeVersion": 1
    },
    {
      "id": "6bc8eb42-948e-423a-9801-3bd6d657f208",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -100,
        980
      ],
      "parameters": {
        "color": 5,
        "width": 440,
        "height": 1160,
        "content": "## \ud83d\udea8 Troubleshooting\n\n**Webhook not triggering:**\n- Verify webhook URL is correctly copied from n8n to Marker.io\n- Check that \"Issue Created\" event is selected in Marker.io webhook settings\n- Ensure webhook is set to \"Active\" status in Marker.io\n- Test with Marker.io's webhook tester feature\n- Check n8n workflow is active and not in testing mode\n\n**ServiceNow incident not created:**\n- Verify ServiceNow credentials are correct and have not expired\n- Check that the service account has permissions to create incidents\n- Test ServiceNow connection directly in n8n credentials settings\n- Check ServiceNow API rate limits haven't been exceeded\n\n**Missing or incorrect data:**\n- Screenshot URL broken: The workflow already handles URL formatting, but verify Marker.io is generating screenshots\n- Custom data missing: Ensure custom fields exist in Marker.io before sending\n- Due date formatting issues: Check your ServiceNow date format requirements\n\n**JavaScript errors in Format node:**\n- Check webhook payload structure hasn't changed in Marker.io updates\n- Verify all field paths match current Marker.io webhook schema\n- Use n8n's data pinning to debug with actual webhook data\n- Check for undefined values when optional fields are missing\n\n**Connection issues:**\n- ServiceNow timeout: Increase timeout in node settings if needed\n- SSL/Certificate errors: Check ServiceNow instance SSL configuration\n- Network restrictions: Ensure n8n can reach your ServiceNow instance\n- Authentication failures: Regenerate ServiceNow credentials if needed\n\n**Testing tips:**\n- Use n8n's \"Execute Workflow\" with pinned test data\n- Enable webhook test mode in Marker.io for safe testing\n- Check ServiceNow incident logs for detailed error messages\n- Monitor n8n execution logs for specific failure points"
      },
      "typeVersion": 1
    },
    {
      "id": "ff7943a8-f52f-4e2e-a466-596bb89c6a25",
      "name": "ServiceNow",
      "type": "n8n-nodes-base.serviceNow",
      "position": [
        440,
        0
      ],
      "parameters": {
        "resource": "incident",
        "operation": "create",
        "authentication": "basicAuth",
        "additionalFields": {
          "caller_id": "",
          "description": "={{ $json.nodeBody }}"
        },
        "short_description": "={{ $json.titleBody }}"
      },
      "credentials": {
        "serviceNowBasicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Format Marker.io Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Marker.io Data": {
      "main": [
        [
          {
            "node": "ServiceNow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}