{
  "name": "Conrad | Inquiry to follow-up | Demonstration",
  "nodes": [
    {
      "parameters": {},
      "id": "conrad-manual",
      "name": "Run demonstration",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        0,
        260
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "// Demonstration fixtures. No live inbox, CRM, or external messages.\nreturn [{ json: { inquiries: [\n  {\n    \"id\": \"ENQ-101\",\n    \"name\": \"Morgan\",\n    \"email\": \" MORGAN@EXAMPLE.TEST \",\n    \"request\": \"Connect our website inquiries to the CRM.\",\n    \"source\": \"Website\"\n  },\n  {\n    \"id\": \"ENQ-102\",\n    \"name\": \"Casey\",\n    \"email\": \"casey@example.test\",\n    \"request\": \"Prepare a quote for a customer portal.\",\n    \"source\": \"Referral\"\n  },\n  {\n    \"id\": \"ENQ-103\",\n    \"name\": \"Rowan\",\n    \"email\": \"rowan@example.test\",\n    \"request\": \"Automate the weekly operations report.\",\n    \"source\": \"Website\"\n  },\n  {\n    \"id\": \"ENQ-104\",\n    \"name\": \"Taylor\",\n    \"email\": \"taylor@example.test\",\n    \"request\": \"Connect campaign inquiries to follow-up.\",\n    \"source\": \"Campaign\"\n  },\n  {\n    \"id\": \"ENQ-105\",\n    \"name\": \"Morgan\",\n    \"email\": \"morgan@example.test\",\n    \"request\": \"Include an owner for each new inquiry.\",\n    \"source\": \"Website\"\n  },\n  {\n    \"id\": \"ENQ-106\",\n    \"name\": \"Alex\",\n    \"email\": \"\",\n    \"request\": \"Set up a shared sales pipeline for our team.\",\n    \"source\": \"Website\"\n  }\n] } }];"
      },
      "id": "conrad-fixtures",
      "name": "Receive six inquiries",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        240,
        260
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "function checkInquiries(inquiries                    )                   {\n  return inquiries.map(item => {\n    const name = item.name.trim().replace(/\\s+/g, ' ');\n    const email = item.email.trim().toLowerCase();\n    const request = item.request.trim().replace(/\\s+/g, ' ');\n    const issues           = [];\n    if (name.length < 2) issues.push('Name is missing.');\n    if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) issues.push('Reply email is missing or invalid.');\n    if (request.length < 12) issues.push('The request needs more detail.');\n    return { ...item, name, email, request, issues };\n  });\n}\nconst input = $input.all()[0].json;\nreturn [{ json: { received: input.inquiries.length, checked: checkInquiries(input.inquiries) } }];"
      },
      "id": "conrad-check",
      "name": "Check and normalize",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        480,
        260
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "function combineInquiries(checked                           ) {\n  const contacts                                                                                         = [];\n  const review                   = [];\n  const duplicates                                 = [];\n  for (const item of checked) {\n    if (item.issues.length) { review.push({ ...item, issues: [...item.issues] }); continue; }\n    const existing = contacts.find(contact => contact.email === item.email);\n    if (existing) {\n      existing.sourceIds.push(item.id);\n      if (!existing.requests.includes(item.request)) existing.requests.push(item.request);\n      duplicates.push({ id: item.id, matchedId: existing.id, email: item.email });\n    } else contacts.push({ id: item.id, name: item.name, email: item.email, requests: [item.request], sourceIds: [item.id] });\n  }\n  return { contacts, review, duplicates };\n}\nconst input = $input.all()[0].json;\nreturn [{ json: { received: input.received, combined: combineInquiries(input.checked) } }];"
      },
      "id": "conrad-merge",
      "name": "Merge repeat inquiries",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        720,
        260
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "function assignFollowUps(combined                                     , received        )                   {\n  const followUps = combined.contacts.map(contact => ({\n    id: `FOLLOW-${contact.id.slice(4)}`, name: contact.name, email: contact.email,\n    request: contact.requests.join(' '), sourceIds: [...contact.sourceIds],\n    owner: /campaign/i.test(contact.requests.join(' ')) ? 'Campaigns team' : 'Project team',\n    nextStep: 'Review the request and arrange a conversation.',\n  }));\n  return { received, followUps, review: combined.review.map(item => ({ ...item, issues: [...item.issues] })), duplicates: combined.duplicates.map(item => ({ ...item })) };\n}\nconst input = $input.all()[0].json;\nreturn [{ json: { demonstration: true, externalExecution: false, ...assignFollowUps(input.combined, input.received) } }];"
      },
      "id": "conrad-follow-up",
      "name": "Prepare follow-ups",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        960,
        260
      ]
    }
  ],
  "connections": {
    "Run demonstration": {
      "main": [
        [
          {
            "node": "Receive six inquiries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Receive six inquiries": {
      "main": [
        [
          {
            "node": "Check and normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check and normalize": {
      "main": [
        [
          {
            "node": "Merge repeat inquiries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge repeat inquiries": {
      "main": [
        [
          {
            "node": "Prepare follow-ups",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "pinData": {},
  "tags": []
}
