AutomationFlowsData & Sheets › Manual Touchpoint Intake

Manual Touchpoint Intake

07 - Manual Touchpoint Intake. Uses googleSheets. Event-driven trigger; 16 nodes.

Event trigger★★★★☆ complexity16 nodesGoogle Sheets
Data & Sheets Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "07 - Manual Touchpoint Intake",
  "nodes": [
    {
      "id": "a7000000-0000-0000-0000-0000000000n1",
      "name": "Overview Note RU",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -460,
        -260
      ],
      "parameters": {
        "content": "## 07 \u2014 \u0420\u0443\u0447\u043d\u043e\u0439 \u043f\u0440\u0438\u0451\u043c \u0442\u043e\u0447\u0435\u043a \u043a\u0430\u0441\u0430\u043d\u0438\u044f (Manual Touchpoint Intake) \u2014 Stage 3.1\n\n\u041d\u0415 \u043f\u0430\u0440\u0441\u0435\u0440 \u0438 \u041d\u0415 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440. \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u0451\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432.\n\n\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442:\n1. \u0420\u0443\u0447\u043d\u043e\u0439 \u0441\u0442\u0430\u0440\u0442.\n2. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 agent_requests (request_type=manual_intake).\n3. \u0411\u0435\u0440\u0451\u0442 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 12 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 (Avito, Dzen, VK, Telegram, \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b/\u043e\u0442\u0437\u044b\u0432\u044b, \u0444\u043e\u0440\u0443\u043c, \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b).\n4. \u0414\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442: record_id, dedup_key, text_hash, region_hint, urgency_hint, lead_intent_hint, confidence_score, lead_temperature, next_action. \u0411\u0415\u0417 LLM.\n5. \u0427\u0438\u0442\u0430\u0435\u0442 market_record_registry \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0435\u0434\u0443\u043f \u043f\u043e dedup_key (\u0432 \u0440\u0435\u0435\u0441\u0442\u0440\u0435 / \u0432 \u0431\u0430\u0442\u0447\u0435 / \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e).\n6. \u041f\u0438\u0448\u0435\u0442 \u0412\u0421\u0415 12 \u0441\u0442\u0440\u043e\u043a \u0432 raw_market_records (40 \u043a\u043e\u043b\u043e\u043d\u043e\u043a) \u2014 \u044d\u0442\u043e \u0430\u0443\u0434\u0438\u0442-\u0441\u043b\u0435\u0434 \u043f\u0440\u0438\u0451\u043c\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b \u0438 \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435.\n7. \u041f\u0438\u0448\u0435\u0442 \u0422\u041e\u041b\u042c\u041a\u041e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 market_record_registry (15 \u043a\u043e\u043b\u043e\u043d\u043e\u043a).\n8. \u041f\u0438\u0448\u0435\u0442 \u043e\u0434\u0438\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 agent_requests (21 \u043a\u043e\u043b\u043e\u043d\u043a\u0430), status=needs_review.\n9. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0432\u043e\u0434\u043a\u0443 \u043f\u0440\u043e\u0433\u043e\u043d\u0430.\n\n\u0427\u0415\u0413\u041e \u041d\u0415 \u0414\u0415\u041b\u0410\u0415\u0422:\n- \u041d\u0415 \u0441\u043a\u0440\u0435\u0439\u043f\u0438\u0442, \u041d\u0415 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 Apify/Firecrawl/Claude, \u041d\u0415 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 API.\n- \u041d\u0415 \u043f\u0438\u0448\u0435\u0442 agent_memory.\n- \u041d\u0415 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 LLM (\u044d\u0442\u043e Stage 3.2 \u2014 Touchpoint Analyzer).\n- \u041d\u0415 Telegram-\u0431\u043e\u0442, \u041d\u0415 \u043f\u0430\u0440\u0441\u0435\u0440, \u041d\u0415 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435, active=false.",
        "height": 640,
        "width": 600,
        "color": 4
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000n2",
      "name": "Setup and Test Note RU",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        180,
        -260
      ],
      "parameters": {
        "content": "## \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0438 \u0442\u0435\u0441\u0442 (\u0432\u0440\u0443\u0447\u043d\u0443\u044e)\n\n1. \u041d\u0415 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c workflow (active=false).\n2. \u0412\u043a\u043b\u0430\u0434\u043a\u0438 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c:\n   - agent_requests (21 \u043a\u043e\u043b\u043e\u043d\u043a\u0430)\n   - raw_market_records (40 \u043a\u043e\u043b\u043e\u043d\u043e\u043a)\n   - market_record_registry (15 \u043a\u043e\u043b\u043e\u043d\u043e\u043a)\n   - agent_memory (13 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u2014 \u0437\u0434\u0435\u0441\u044c \u041d\u0415 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f)\n   Stage 2 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u044e\u0442\u0441\u044f.\n3. \u041f\u041e\u0421\u041b\u0415 \u0418\u041c\u041f\u041e\u0420\u0422\u0410 \u043f\u0435\u0440\u0435\u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a\u0440\u0435\u0434\u0435\u043d\u0448\u043b (ID \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b) \u043d\u0430 \u0442\u0440\u0451\u0445 Google Sheets \u043d\u043e\u0434\u0430\u0445:\n   Read market_record_registry, Append raw_market_records, Append market_record_registry, Append agent_requests\n   \u2192 Google Sheets - Marketing Scout Service Account.\n4. \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c PASTE_SPREADSHEET_ID_HERE \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 Spreadsheet ID \u043d\u0430 \u0432\u0441\u0435\u0445 Google Sheets \u043d\u043e\u0434\u0430\u0445.\n5. \u0412\u043d\u0435\u0448\u043d\u0438\u0445 API-\u043a\u043b\u044e\u0447\u0435\u0439 \u0437\u0434\u0435\u0441\u044c \u043d\u0435\u0442 (\u043d\u0435\u0442 Apify/Firecrawl/Claude).\n\n\u041f\u0435\u0440\u0432\u044b\u0439 \u0442\u0435\u0441\u0442 (\u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u0435\u0441\u0442\u0440):\n1. Execute Workflow \u043e\u0434\u0438\u043d \u0440\u0430\u0437.\n2. \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e: 12 \u0441\u0442\u0440\u043e\u043a \u0432 raw_market_records; \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 ~12 \u0432 market_record_registry; 1 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 agent_requests (status=needs_review).\n3. Final Summary Output: total_records=12, unique_count, duplicate_count, irrelevant_count=2, platform_counts, record_type_counts.\n\n\u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043e\u043d (\u0440\u0435\u0435\u0441\u0442\u0440 \u0443\u0436\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d):\n- \u0422\u0435 \u0436\u0435 12 \u2192 \u0432\u0441\u0435 dedup_status=duplicate_in_registry, approval_status=duplicate; raw_market_records \u0441\u043d\u043e\u0432\u0430 +12 (\u0430\u0443\u0434\u0438\u0442), \u0440\u0435\u0435\u0441\u0442\u0440 +0.\n\n\u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c: 0 (\u043d\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432, \u043d\u0435\u0442 LLM). estimated_analysis_cost_usd \u2014 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043b\u0430\u043d.",
        "height": 640,
        "width": 600,
        "color": 4
      }
    },
    {
      "id": "a7000000-0000-0000-0000-000000000002",
      "name": "Manual Start",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        120,
        420
      ],
      "parameters": {}
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000rq",
      "name": "Set Manual Intake Request",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        320,
        420
      ],
      "parameters": {
        "jsCode": "// One manual-intake request. Deterministic id; no external calls.\nfunction pad(n){return String(n).padStart(2,'0');}\nfunction moscowIsoNow(){var m=new Date(Date.now()+10800000);return m.toISOString().replace('Z','+03:00');}\nfunction moscowStamp(){var z=function(n){return String(n).padStart(2,'0');};var m=new Date(Date.now()+10800000);return m.getUTCFullYear()+z(m.getUTCMonth()+1)+z(m.getUTCDate())+'_'+z(m.getUTCHours())+z(m.getUTCMinutes())+z(m.getUTCSeconds());}\nconst now=moscowIsoNow();\nconst stamp=moscowStamp();\nreturn [{ json: {\n  agent_request_id:'agentreq_'+stamp,\n  created_at:now,\n  requested_by:'operator',\n  request_text:'\u0440\u0443\u0447\u043d\u043e\u0439 \u0442\u0435\u0441\u0442 \u0442\u043e\u0447\u0435\u043a \u043a\u0430\u0441\u0430\u043d\u0438\u044f: \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u044b, \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438, \u041c\u043e\u0441\u043a\u0432\u0430',\n  request_type:'manual_intake',\n  source_scope:'manual_mixed_sources',\n  platforms:'avito,dzen,vk,telegram,forum,reviews,web',\n  query:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430; \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0434\u0435\u043d\u044c\u0433\u0438; \u0437\u0430\u0439\u043c \u043f\u043e\u0434 \u041f\u0422\u0421; \u0431\u0440\u043e\u043a\u0435\u0440\u044b',\n  region:'\u041c\u043e\u0441\u043a\u0432\u0430',\n  service_focus:'secured_lending',\n  requested_limit:12\n}}];"
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000rg",
      "name": "Read market_record_registry",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        540,
        420
      ],
      "alwaysOutputData": true,
      "onError": "continueRegularOutput",
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "read",
        "documentId": {
          "__rl": true,
          "value": "PASTE_SPREADSHEET_ID_HERE",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "market_record_registry",
          "mode": "name"
        },
        "options": {}
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000mr",
      "name": "Set Manual Records",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        760,
        420
      ],
      "parameters": {
        "jsCode": "// Fixed array of 12 manually-provided example records (operator notes). No external calls.\nconst records = [\n  { platform:'avito', source_type:'classified', source_url:'https://www.avito.ru/moskva/predlozheniya_uslug/pomosch_v_poluchenii_kredita_kreditnyy_broker_4379480780', text_context:'\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 Avito: \u00ab\u041f\u043e\u043c\u043e\u0449\u044c \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u0440\u0435\u0434\u0438\u0442\u0430 / \u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440\u00bb. \u0426\u0435\u043d\u0430 \u043e\u0442 30 000 \u20bd. \u0420\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0443, \u043f\u043e\u043c\u043e\u0449\u044c \u0444\u0438\u0437\u043b\u0438\u0446\u0430\u043c \u0438 \u0431\u0438\u0437\u043d\u0435\u0441\u0443.', record_type_hint:'competitor_activity', touchpoint_type:'competitor_listing', competitor_related:true, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430', service_hint:'credit_broker' },\n  { platform:'avito', source_type:'classified', source_url:'https://www.avito.ru/moskva/predlozheniya_uslug/kreditnyy_broker._realnaya_pomosch_s_kreditami_7961833832', text_context:'\u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 Avito: \u00ab\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440. \u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u0441 \u043a\u0440\u0435\u0434\u0438\u0442\u0430\u043c\u0438\u00bb. \u0426\u0435\u043d\u0430 \u043e\u0442 500 \u20bd. \u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0431\u0430\u043d\u043a\u043e\u0432.', record_type_hint:'competitor_activity', touchpoint_type:'competitor_listing', competitor_related:true, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430', service_hint:'credit_broker' },\n  { platform:'dzen', source_type:'social_content', source_url:'https://dzen.ru/id/62f60855a481471c44a877a4', text_context:'\u041a\u0430\u043d\u0430\u043b \u00ab\u0412\u0430\u0448 \u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0411\u0440\u043e\u043a\u0435\u0440\u00bb \u043d\u0430 \u0414\u0437\u0435\u043d: \u0432\u0441\u0451 \u043e \u043a\u0440\u0435\u0434\u0438\u0442\u0430\u0445 \u0438 \u0438\u043f\u043e\u0442\u0435\u043a\u0435, \u0440\u0430\u0437\u0431\u043e\u0440 \u043a\u0435\u0439\u0441\u043e\u0432, \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u0439 \u043a\u0430\u043d\u0430\u043b.', record_type_hint:'competitor_activity', touchpoint_type:'competitor_content_channel', competitor_related:true, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u044b \u0438\u043f\u043e\u0442\u0435\u043a\u0430 \u0431\u0440\u043e\u043a\u0435\u0440', service_hint:'credit_broker' },\n  { platform:'dzen', source_type:'social_content', source_url:'https://dzen.ru/a/agwcFsrUsS23bWfb', text_context:'\u0421\u0442\u0430\u0442\u044c\u044f \u00ab\u041c\u0447\u0438\u043c \u043d\u0430 \u0441\u0434\u0435\u043b\u043a\u0443 \u0432 \u0421\u0430\u043c\u0430\u0440\u0443\u00bb \u043e\u0442 \u00ab\u041a\u0440\u0435\u0434\u0438\u0442 \u0438 \u041f\u043e\u0440\u044f\u0434\u043e\u043a\u00bb: \u043a\u0435\u0439\u0441 \u0432\u044b\u0435\u0437\u0434\u0430 \u043d\u0430 \u0441\u0434\u0435\u043b\u043a\u0443. \u0415\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432.', record_type_hint:'competitor_activity', touchpoint_type:'competitor_content_post', competitor_related:true, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u043a\u0435\u0439\u0441 \u0441\u0434\u0435\u043b\u043a\u0430', service_hint:'credit_broker' },\n  { platform:'vk', source_type:'social_search', source_url:'https://vk.com/search?c[q]=\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439+\u0431\u0440\u043e\u043a\u0435\u0440+\u041c\u043e\u0441\u043a\u0432\u0430&c[section]=auto', text_context:'\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0432\u044b\u0434\u0430\u0447\u0430 VK \u043f\u043e \u0442\u0435\u043c\u0435 \u00ab\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430\u00bb. \u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430/\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432.', record_type_hint:'market_signal', touchpoint_type:'source_candidate', competitor_related:false, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u041c\u043e\u0441\u043a\u0432\u0430', service_hint:'credit_broker' },\n  { platform:'yandex_maps', source_type:'review_platform', source_url:'https://yandex.ru/maps/org/vash_kreditny_broker/58664902214/reviews/', text_context:'\u041e\u0442\u0437\u044b\u0432\u044b \u043d\u0430 \u00ab\u0412\u0430\u0448 \u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0411\u0440\u043e\u043a\u0435\u0440\u00bb \u0432 \u042f\u043d\u0434\u0435\u043a\u0441.\u041a\u0430\u0440\u0442\u0430\u0445. \u0420\u0435\u0439\u0442\u0438\u043d\u0433 5.0, 66 \u043e\u0442\u0437\u044b\u0432\u043e\u0432. \u041c\u043e\u0441\u043a\u0432\u0430, \u0443\u043b. \u0417\u043e\u043b\u043e\u0442\u043e\u0440\u043e\u0436\u0441\u043a\u0438\u0439 \u0412\u0430\u043b, 11. \u0410\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u0441 \u043e\u0442\u0437\u044b\u0432\u0430\u043c\u0438.', record_type_hint:'market_signal', touchpoint_type:'review_source', competitor_related:true, competitor_name:'\u0412\u0430\u0448 \u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0411\u0440\u043e\u043a\u0435\u0440', interest_topic:'\u043e\u0442\u0437\u044b\u0432\u044b \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440', service_hint:'credit_broker' },\n  { platform:'telegram', source_type:'social_channel', source_url:'https://t.me/creditbrokers', profile_url:'https://t.me/creditbrokers', profile_name:'\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0411\u0440\u043e\u043a\u0435\u0440 \u0440\u0444', author_handle:'@creditbrokers', text_context:'\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 Telegram-\u0447\u0430\u0442/\u043a\u0430\u043d\u0430\u043b \u00ab\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0411\u0440\u043e\u043a\u0435\u0440 \u0440\u0444\u00bb: \u0431\u0430\u043d\u043a\u0438, \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u044b, \u0431\u0440\u043e\u043a\u0435\u0440\u044b/\u043f\u0430\u0440\u0442\u043d\u0451\u0440\u044b, \u0440\u0438\u0435\u043b\u0442\u043e\u0440\u044b. \u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e.', record_type_hint:'market_signal', touchpoint_type:'source_candidate', competitor_related:false, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u044b \u0431\u0430\u043d\u043a\u0438 \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u044b', service_hint:'credit_broker' },\n  { platform:'telegram', source_type:'social_channel', source_url:'https://t.me/fintrack_cbr', profile_url:'https://t.me/fintrack_cbr', profile_name:'\u0424\u0438\u043d\u0442\u0440\u0435\u043a \u0426\u0411 \u0420\u0424', author_handle:'@fintrack_cbr', text_context:'Telegram-\u043a\u0430\u043d\u0430\u043b \u0411\u0430\u043d\u043a\u0430 \u0420\u043e\u0441\u0441\u0438\u0438 \u043e \u043b\u0438\u0447\u043d\u044b\u0445 \u0444\u0438\u043d\u0430\u043d\u0441\u0430\u0445. \u0410\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u0437\u0430\u0434\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e \u043a\u0440\u0435\u0434\u0438\u0442\u0430\u0445; \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.', record_type_hint:'market_signal', touchpoint_type:'source_candidate', competitor_related:false, interest_topic:'\u043b\u0438\u0447\u043d\u044b\u0435 \u0444\u0438\u043d\u0430\u043d\u0441\u044b \u043a\u0440\u0435\u0434\u0438\u0442\u044b', service_hint:'consumer_credit' },\n  { platform:'web', source_type:'website', source_url:'https://www.zen.com', text_context:'ZEN.COM \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0435 \u0444\u0438\u043d\u0442\u0435\u0445-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0435 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u043e\u043c\u0443 \u0431\u0440\u043e\u043a\u0435\u0440\u0441\u0442\u0432\u0443 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438.', record_type_hint:'irrelevant', touchpoint_type:'irrelevant_source', competitor_related:false, interest_topic:'irrelevant', service_hint:'unknown' },\n  { platform:'dzen', source_type:'social_content', source_url:'https://dzen.ru/b/agcCqW1Xn1cVb1Nh', text_context:'\u0421\u0442\u0430\u0442\u044c\u044f \u00ab\u041c\u0438\u043a\u0440\u043e\u0431\u0438\u0437\u043d\u0435\u0441: \u0434\u043e 15% \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0442\u044c 2026 \u0433\u043e\u0434\u00bb. \u0423\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043a\u0440\u0435\u0434\u0438\u0442\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u043a\u043e\u043b\u044c\u0437\u044c, \u043d\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043d\u0430 \u0443\u0441\u043b\u0443\u0433\u0443 \u0431\u0440\u043e\u043a\u0435\u0440\u0430.', record_type_hint:'irrelevant', touchpoint_type:'weak_market_noise', competitor_related:false, interest_topic:'\u043c\u0438\u043a\u0440\u043e\u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b', service_hint:'unknown' },\n  { platform:'banki_forum', source_type:'forum', source_url:'https://www.banki.ru/forum/?PAGE_NAME=read&FID=36&TID=252009', text_context:'\u0424\u043e\u0440\u0443\u043c Banki.ru, \u0432\u0435\u0442\u043a\u0430 \u00ab\u041a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u2014 \u0432\u0440\u0430\u0433 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433?\u00bb. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442, \u043a\u0430\u043a \u043d\u0430\u0439\u0442\u0438 \u0447\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u0431\u0440\u043e\u043a\u0435\u0440\u0430, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e, \u043f\u0440\u043e\u0441\u044f\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0441 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0431\u0430\u043d\u043a\u0430. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0433\u043e\u0440\u044f\u0447\u0438\u0439 \u043b\u0438\u0434-\u043f\u0430\u0442\u0442\u0435\u0440\u043d: \u00ab\u041e\u0442\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 3 \u0431\u0430\u043d\u043a\u0430\u0445, \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438, \u043d\u0443\u0436\u0435\u043d \u043a\u0440\u0435\u0434\u0438\u0442 700 \u0442\u044b\u0441. \u2014 \u043a\u0443\u0434\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f?\u00bb', record_type_hint:'question_objection', touchpoint_type:'forum_discussion', competitor_related:false, interest_topic:'\u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u043e\u0442\u043a\u0430\u0437 \u0431\u0430\u043d\u043a\u0430 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a\u0438', probable_need:'\u043d\u0443\u0436\u0435\u043d \u043a\u0440\u0435\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0432 \u0431\u0430\u043d\u043a\u043e\u0432', service_hint:'credit_broker' },\n  { platform:'zoon', source_type:'review_platform', source_url:'https://zoon.ru/msk/p-other-kreditnye_brokery/', text_context:'Zoon.ru, \u043e\u0442\u0437\u044b\u0432\u044b \u043f\u043e \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u043c \u0431\u0440\u043e\u043a\u0435\u0440\u0430\u043c \u041c\u043e\u0441\u043a\u0432\u044b. \u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0435 \u043e\u0442\u0437\u044b\u0432\u044b: \u00ab\u041e\u0434\u043e\u0431\u0440\u0438\u043b\u0438 \u043a\u0440\u0435\u0434\u0438\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u0431\u0435\u0437 \u043f\u043e\u0440\u0443\u0447\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u043a\u0443\u0447\u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u043a. \u041a\u043e\u043c\u0438\u0441\u0441\u0438\u044e \u0437\u0430\u043f\u043b\u0430\u0442\u0438\u043b \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u043d\u0435\u0433\u00bb. \u0413\u043e\u0440\u044f\u0447\u0438\u0439 \u0440\u044b\u043d\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d: \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0449\u0435\u0442 \u0431\u0440\u043e\u043a\u0435\u0440\u0430, \u0433\u043e\u0442\u043e\u0432 \u043f\u043b\u0430\u0442\u0438\u0442\u044c \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.', record_type_hint:'market_signal', touchpoint_type:'review_source', competitor_related:true, interest_topic:'\u043e\u0442\u0437\u044b\u0432\u044b \u043a\u0440\u0435\u0434\u0438\u0442\u043d\u044b\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u044b \u041c\u043e\u0441\u043a\u0432\u0430', probable_need:'\u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u0431\u0440\u043e\u043a\u0435\u0440\u0435 \u0441 \u043e\u043f\u043b\u0430\u0442\u043e\u0439 \u0437\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442', service_hint:'credit_broker' }\n];\nreturn records.map((r,i)=>({ json: Object.assign({ _index: i+1 }, r) }));"
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000nm",
      "name": "Normalize Manual Records",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        980,
        420
      ],
      "parameters": {
        "jsCode": "// Deterministic normalization only. No LLM, no external calls.\nfunction pad(n){return String(n).padStart(2,'0');}\nfunction moscowIsoNow(){var m=new Date(Date.now()+10800000);return m.toISOString().replace('Z','+03:00');}\nfunction moscowStamp(){var z=function(n){return String(n).padStart(2,'0');};var m=new Date(Date.now()+10800000);return m.getUTCFullYear()+z(m.getUTCMonth()+1)+z(m.getUTCDate())+'_'+z(m.getUTCHours())+z(m.getUTCMinutes())+z(m.getUTCSeconds());}\nconst now=moscowIsoNow();\nconst stamp=moscowStamp();\nconst req=$('Set Manual Intake Request').first().json;\nconst reqId=req.agent_request_id;\nconst reqQuery=req.query||'';\nfunction str(v){return v==null?'':String(v).trim();}\nfunction low(v){return str(v).toLowerCase();}\nfunction any(b,arr){for(const w of arr){if(b.indexOf(w)>=0)return true;}return false;}\nfunction normUrl(u){u=str(u);if(!u)return '';try{const x=new URL(u.split('#')[0]);x.hostname=(x.hostname||'').toLowerCase();let p=x.pathname||'/';if(p.length>1&&p.endsWith('/'))p=p.slice(0,-1);x.pathname=p;return x.toString();}catch(e){return u.toLowerCase();}}\nfunction hashText(s){s=str(s);let h=5381;for(let i=0;i<s.length;i++){h=((h<<5)+h+s.charCodeAt(i))>>>0;}return ('00000000'+h.toString(16)).slice(-8);}\nconst recs=$('Set Manual Records').all().map(i=>i.json);\nconst out=[];let idx=0;\nfor(const r of recs){\n  idx++;\n  const platform=low(r.platform);\n  const source_type=low(r.source_type);\n  const source_url=normUrl(r.source_url);\n  const post_url=normUrl(r.post_url);\n  const profile_url=normUrl(r.profile_url);\n  const text_context=str(r.text_context);\n  const comment_text=str(r.comment_text);\n  const rth=low(r.record_type_hint)||'unknown';\n  const tpt=low(r.touchpoint_type)||'';\n  const blob=(text_context+' '+comment_text+' '+str(r.interest_topic)+' '+str(r.probable_need)).toLowerCase();\n  const text_hash=hashText(text_context+'||'+comment_text);\n  let dedup_key;\n  if(post_url){dedup_key=platform+'::post::'+post_url;}\n  else if(source_url){dedup_key=platform+'::source::'+source_url;}\n  else if(profile_url&&text_hash){dedup_key=platform+'::profile_text::'+profile_url+'::'+text_hash;}\n  else{dedup_key=platform+'::text::'+text_hash;}\n  let region_hint='';\n  if(any(blob,['\u043c\u043e\u0441\u043a\u0432\u0430','\u043c\u0441\u043a','moscow','\u043f\u043e\u0434\u043c\u043e\u0441\u043a\u043e\u0432\u044c\u0435']))region_hint='\u041c\u043e\u0441\u043a\u0432\u0430/\u041c\u041e';\n  let urgency_hint='low';\n  if(any(blob,['\u0441\u0440\u043e\u0447\u043d\u043e','\u0441\u0435\u0433\u043e\u0434\u043d\u044f','\u043e\u0442\u043a\u0430\u0437\u0430\u043b','\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a','\u043d\u0443\u0436\u043d\u044b \u0434\u0435\u043d\u044c\u0433\u0438']))urgency_hint='high';\n  else if(any(blob,['\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f','\u0438\u0449\u0435\u0442','\u0432\u043e\u043f\u0440\u043e\u0441','\u043a\u0443\u0434\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f']))urgency_hint='medium';\n  let lead_intent_hint;\n  if(rth==='competitor_activity'||rth==='irrelevant'||tpt==='source_candidate'||tpt==='irrelevant_source'||tpt==='weak_market_noise')lead_intent_hint='low';\n  else if(rth==='question_objection'||tpt==='forum_discussion'||tpt==='review_source'||rth==='market_signal')lead_intent_hint='medium';\n  else lead_intent_hint='low';\n  if(urgency_hint==='high'&&any(blob,['\u043d\u0443\u0436\u0435\u043d \u043a\u0440\u0435\u0434\u0438\u0442','\u043d\u0443\u0436\u043d\u044b \u0434\u0435\u043d\u044c\u0433\u0438','\u043e\u0442\u043a\u0430\u0437\u0430\u043b','\u043f\u0440\u043e\u0441\u0440\u043e\u0447\u043a'])&&rth!=='competitor_activity'&&rth!=='irrelevant')lead_intent_hint='high';\n  let confidence_score=1;\n  if(rth==='competitor_activity'&&source_url)confidence_score=80;\n  else if(rth==='question_objection'||rth==='market_signal')confidence_score=70;\n  if(tpt==='source_candidate')confidence_score=40;\n  if(rth==='irrelevant')confidence_score=1;\n  let lead_temperature='none';\n  if(rth==='competitor_activity'||rth==='irrelevant')lead_temperature='none';\n  else if(tpt==='source_candidate')lead_temperature='cold';\n  else if(rth==='question_objection'||tpt==='forum_discussion'||(tpt==='review_source'&&str(r.probable_need)))lead_temperature='warm';\n  else if(rth==='market_signal')lead_temperature='warm';\n  if(lead_intent_hint==='high'&&urgency_hint==='high')lead_temperature='hot';\n  let next_action='investigate';\n  if(rth==='irrelevant')next_action='ignore';\n  else if(rth==='competitor_activity')next_action='monitor';\n  else if(rth==='client_pain')next_action='create_content';\n  else if(rth==='question_objection')next_action='investigate';\n  else if(rth==='market_signal')next_action='investigate';\n  const estimated_analysis_cost_usd=(rth==='irrelevant')?0:0.02;\n  out.push({ json: {\n    record_id:'rec_'+stamp+'_'+idx,\n    agent_request_id:reqId,\n    created_at:now,\n    source_type:source_type,\n    platform:platform,\n    source_url:source_url,\n    post_url:post_url,\n    profile_url:profile_url,\n    profile_name:str(r.profile_name),\n    author_handle:str(r.author_handle),\n    published_at:'',\n    region_hint:region_hint,\n    service_hint:low(r.service_hint),\n    query:reqQuery,\n    text_context:text_context,\n    comment_text:comment_text,\n    contact_public:'',\n    contact_channel:'none',\n    dedup_key:dedup_key,\n    record_type_hint:rth,\n    touchpoint_type:tpt,\n    lead_intent_hint:lead_intent_hint,\n    urgency_hint:urgency_hint,\n    interest_topic:str(r.interest_topic),\n    probable_need:str(r.probable_need),\n    competitor_related:(r.competitor_related===true||low(r.competitor_related)==='true'),\n    competitor_name:str(r.competitor_name),\n    semantic_keywords:'',\n    ad_channel_hint:'',\n    confidence_score:confidence_score,\n    lead_temperature:lead_temperature,\n    next_action:next_action,\n    responsible:'',\n    dedup_status:'pending',\n    approval_status:'new',\n    approved_by:'',\n    approved_at:'',\n    estimated_analysis_cost_usd:estimated_analysis_cost_usd,\n    manager_note:'',\n    notes:'stage_3_1_manual_intake'\n  }});\n}\nreturn out;"
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000dd",
      "name": "Dedup Against Registry",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1200,
        420
      ],
      "parameters": {
        "jsCode": "// Dedup against market_record_registry (by dedup_key) and within this batch. No external calls.\nfunction str(v){return v==null?'':String(v).trim();}\nconst recs=$('Normalize Manual Records').all().map(i=>i.json);\nconst __req=$('Set Manual Intake Request').first().json||{};\nlet reg=[];\ntry{reg=$('Read market_record_registry').all().map(i=>i.json).filter(Boolean);}catch(e){reg=[];}\nconst regSet=new Set(reg.map(r=>str(r&&r.dedup_key)).filter(Boolean));\nconst seen=new Set();\nconst out=[];\nfor(const r of recs){\n  const key=str(r.dedup_key);\n  let dedup_status='unique';\n  let approval_status=r.approval_status||'new';\n  if(key&&regSet.has(key)){dedup_status='duplicate_in_registry';approval_status='duplicate';}\n  else if(key&&seen.has(key)){dedup_status='duplicate_in_batch';approval_status='duplicate';}\n  else{dedup_status='unique';if(key)seen.add(key);}\n  const __irr=(str(r.record_type_hint)==='irrelevant');\n  out.push({ json: Object.assign({}, r, { dedup_status:dedup_status, approval_status:approval_status,\n    source_run_id:str(__req.agent_request_id), data_mode:'manual_test',\n    quality_status:(__irr?'quarantined':'healthy'), report_eligible:(!__irr), review_status:'confirmed', quality_flags:'' }) });\n}\nreturn out;"
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000ar",
      "name": "Append raw_market_records",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        1420,
        420
      ],
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "PASTE_SPREADSHEET_ID_HERE",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "raw_market_records",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {}
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000br",
      "name": "Build Registry Rows",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1640,
        280
      ],
      "parameters": {
        "jsCode": "// Build market_record_registry rows for UNIQUE records only (15 columns). No external calls.\nfunction str(v){return v==null?'':String(v).trim();}\nfunction hashText(s){s=str(s);let h=5381;for(let i=0;i<s.length;i++){h=((h<<5)+h+s.charCodeAt(i))>>>0;}return ('00000000'+h.toString(16)).slice(-8);}\nfunction moscowIsoNow(){var m=new Date(Date.now()+10800000);return m.toISOString().replace('Z','+03:00');}\nconst now=moscowIsoNow();\nconst recs=$('Dedup Against Registry').all().map(i=>i.json);\nconst out=[];\nfor(const r of recs){\n  if(str(r.dedup_status)!=='unique')continue;\n  const text_hash=hashText(str(r.text_context)+'||'+str(r.comment_text));\n  out.push({ json: {\n    dedup_key:str(r.dedup_key),\n    source_type:str(r.source_type),\n    platform:str(r.platform),\n    source_url:str(r.source_url),\n    post_url:str(r.post_url),\n    profile_url:str(r.profile_url),\n    author_handle:str(r.author_handle),\n    text_hash:text_hash,\n    first_seen_at:now,\n    last_seen_at:now,\n    last_route:'raw_market_records',\n    last_processing_status:'intake_recorded',\n    last_entity_type:str(r.record_type_hint),\n    agent_request_id:str(r.agent_request_id),\n    note:'manual_intake_stage_3_1'\n  }});\n}\nreturn out;"
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000rr",
      "name": "Append market_record_registry",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        1860,
        280
      ],
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "PASTE_SPREADSHEET_ID_HERE",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "market_record_registry",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {}
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000bq",
      "name": "Build agent_requests Row",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1640,
        560
      ],
      "parameters": {
        "jsCode": "// One agent_requests row (21 columns). status=needs_review. No external calls.\nfunction str(v){return v==null?'':String(v).trim();}\nconst req=$('Set Manual Intake Request').first().json;\nconst recs=$('Dedup Against Registry').all().map(i=>i.json);\nconst total=recs.length;\nconst unique=recs.filter(r=>str(r.dedup_status)==='unique').length;\nconst duplicate=recs.filter(r=>str(r.dedup_status).indexOf('duplicate')===0).length;\nconst irrelevant=recs.filter(r=>str(r.record_type_hint)==='irrelevant').length;\nlet cost=0;for(const r of recs){cost+=Number(r.estimated_analysis_cost_usd)||0;}\ncost=Math.round(cost*1000)/1000;\nreturn [{ json: {\n  agent_request_id:req.agent_request_id,\n  created_at:req.created_at,\n  requested_by:'operator',\n  request_text:req.request_text,\n  request_type:'manual_intake',\n  source_scope:'manual_mixed_sources',\n  platforms:'avito,dzen,vk,telegram,forum,reviews,web',\n  query:req.query,\n  region:'\u041c\u043e\u0441\u043a\u0432\u0430',\n  service_focus:'secured_lending',\n  requested_limit:12,\n  status:'needs_review',\n  plan_summary:'Manual mixed-source touchpoint intake for Stage 3.1.',\n  estimated_source_cost_usd:0,\n  estimated_analysis_cost_usd:cost,\n  approval_required:false,\n  approved_by:'',\n  approved_at:'',\n  result_summary:total+' records normalized; '+unique+' unique; '+duplicate+' duplicates; '+irrelevant+' irrelevant.',\n  next_action:'Review raw_market_records, then build Touchpoint Analyzer.',\n  notes:'No scraping, no LLM, no external API.'\n}}];"
      }
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000aq",
      "name": "Append agent_requests",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        1860,
        560
      ],
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "PASTE_SPREADSHEET_ID_HERE",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "agent_requests",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {}
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000
    },
    {
      "id": "a7000000-0000-0000-0000-0000000000fs",
      "name": "Final Summary Output",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2080,
        560
      ],
      "parameters": {
        "jsCode": "// Final run summary. No external calls.\nfunction str(v){return v==null?'':String(v).trim();}\nconst req=$('Set Manual Intake Request').first().json;\nconst recs=$('Dedup Against Registry').all().map(i=>i.json);\nconst total=recs.length;\nconst unique=recs.filter(r=>str(r.dedup_status)==='unique').length;\nconst duplicate=recs.filter(r=>str(r.dedup_status).indexOf('duplicate')===0).length;\nconst irrelevant=recs.filter(r=>str(r.record_type_hint)==='irrelevant').length;\n// Audit rows = every intake record stored (incl. irrelevant). Irrelevant rows are STORED audit rows,\n// NOT hard-skipped (S3-D19). Eligible-for-analysis = unique AND relevant. Estimated future Claude cost\n// (WF08) is derived ONLY from eligible-unique rows; THIS workflow performs no analysis (actual cost=0).\nconst EST_ANALYSIS_COST_PER_RECORD_USD=0.004; // claude-sonnet-4-6 rough per-record estimate (documented)\nconst eligible_unique_for_analysis=recs.filter(r=>str(r.dedup_status)==='unique'&&str(r.record_type_hint)!=='irrelevant').length;\nconst estimated_future_analysis_cost_usd=Math.round(eligible_unique_for_analysis*EST_ANALYSIS_COST_PER_RECORD_USD*10000)/10000;\nconst platform_counts={};const record_type_counts={};\nfor(const r of recs){\n  const p=str(r.platform)||'unknown';platform_counts[p]=(platform_counts[p]||0)+1;\n  const t=str(r.record_type_hint)||'unknown';record_type_counts[t]=(record_type_counts[t]||0)+1;\n}\nreturn [{ json: {\n  workflow:'07 - Manual Touchpoint Intake',\n  agent_request_id:req.agent_request_id,\n  total_records:total,\n  unique_count:unique,\n  duplicate_count:duplicate,\n  irrelevant_count:irrelevant,\n  platform_counts:platform_counts,\n  record_type_counts:record_type_counts,\n  data_mode:'manual_test',\n  audit_rows_written:total,\n  raw_market_records_written:total,\n  eligible_unique_for_analysis:eligible_unique_for_analysis,\n  irrelevant_items:irrelevant,\n  hard_skipped_items:0,\n  actual_analysis_cost_usd:0,\n  estimated_future_analysis_cost_usd:estimated_future_analysis_cost_usd,\n  cost_status:'not_applicable',\n  external_calls:0,\n  llm_calls:0,\n  registry_rows_written:unique,\n  next_action:'Review raw_market_records and market_record_registry; then design/build the Touchpoint Analyzer (Stage 3.2). No scraping, no LLM here.'\n}}];"
      }
    },
    {
      "id": "wf07-build-runlog",
      "name": "Build live_source_runs Row",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        2000,
        820
      ],
      "parameters": {
        "jsCode": "function moscowIsoNow(){var m=new Date(Date.now()+10800000);return m.toISOString().replace('Z','+03:00');}\n// WF07 live_source_runs ledger (23 cols, DEC-126). Manual deterministic intake; no external calls, no LLM.\nfunction str(v){return v==null?'':String(v).trim();}\nconst req=$('Set Manual Intake Request').first().json||{};\nconst recs=$('Dedup Against Registry').all().map(i=>i.json);\nconst total=recs.length;\nconst unique=recs.filter(r=>str(r.dedup_status)==='unique').length;\nconst dup=recs.filter(r=>str(r.dedup_status).indexOf('duplicate')===0).length;\nconst irrelevant=recs.filter(r=>str(r.record_type_hint)==='irrelevant').length;\nreturn [{ json: {\n  run_id:str(req.agent_request_id)||('manual_'+Date.now()),\n  created_at:moscowIsoNow(),\n  workflow:'WF07 - Manual Touchpoint Intake',\n  source_family:'other',\n  platform:'manual',\n  mode:'deterministic',\n  approval_token_used:'no',\n  source_allowlist:'manual_mixed_sources',\n  max_items:Number(req.requested_limit)||12,\n  items_received:total,\n  items_relevant:total-irrelevant,\n  items_written_raw:total,\n  items_unique:unique,\n  items_duplicate:dup,\n  data_mode:'manual_test',\n  irrelevant_items:irrelevant,\n  hard_skipped:0,\n  external_calls:0,\n  estimated_source_cost_usd:0,\n  llm_calls:0,\n  estimated_llm_cost_usd:0,\n  status:'completed',\n  error_summary:'',\n  operator_next_action:'Review raw_market_records, then run WF08.',\n  notes:'Manual intake; no scraping, no LLM, no external API.'\n}}];"
      }
    },
    {
      "id": "wf07-app-runlog",
      "name": "Append live_source_runs",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4,
      "position": [
        2220,
        820
      ],
      "parameters": {
        "authentication": "serviceAccount",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "PASTE_SPREADSHEET_ID_HERE",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "live_source_runs",
          "mode": "name"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {}
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "maxTries": 3,
      "waitBetweenTries": 5000
    }
  ],
  "connections": {
    "Manual Start": {
      "main": [
        [
          {
            "node": "Set Manual Intake Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Manual Intake Request": {
      "main": [
        [
          {
            "node": "Read market_record_registry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read market_record_registry": {
      "main": [
        [
          {
            "node": "Set Manual Records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Manual Records": {
      "main": [
        [
          {
            "node": "Normalize Manual Records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Manual Records": {
      "main": [
        [
          {
            "node": "Dedup Against Registry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedup Against Registry": {
      "main": [
        [
          {
            "node": "Append raw_market_records",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append raw_market_records": {
      "main": [
        [
          {
            "node": "Build Registry Rows",
            "type": "main",
            "index": 0
          },
          {
            "node": "Build agent_requests Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Registry Rows": {
      "main": [
        [
          {
            "node": "Append market_record_registry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build agent_requests Row": {
      "main": [
        [
          {
            "node": "Append agent_requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append agent_requests": {
      "main": [
        [
          {
            "node": "Final Summary Output",
            "type": "main",
            "index": 0
          },
          {
            "node": "Build live_source_runs Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build live_source_runs Row": {
      "main": [
        [
          {
            "node": "Append live_source_runs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a7000000-manual-touchpoint-intake-v001-stage-3-1-20260608"
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

07 - Manual Touchpoint Intake. Uses googleSheets. Event-driven trigger; 16 nodes.

Source: https://github.com/CodeVinci8/vinci-ai-pilot/blob/main/n8n/workflows/07_manual_touchpoint_intake.json — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

TrackCollect_deeper. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 80 nodes.

Google Sheets, HTTP Request, @N Octo N/N8N Nodes Json Database +1
Data & Sheets

This template is ideal for solo store owners, eCommerce marketers, automation beginners, or anyone using Shopify and Gmail who wants to recover lost revenue without coding.

HTTP Request, Gmail, Twilio +3
Data & Sheets

PCN. Uses googleSheets, httpRequest, @n-octo-n/n8n-nodes-json-database, itemLists. Event-driven trigger; 60 nodes.

Google Sheets, HTTP Request, @N Octo N/N8N Nodes Json Database +3
Data & Sheets

Product Ad Machine. Uses googleDrive, googleSheets, httpRequest, @ffmpeg-micro/n8n-nodes-ffmpeg-micro. Event-driven trigger; 60 nodes.

Google Drive, Google Sheets, HTTP Request +2
Data & Sheets

Basic AI SEO KW Research n8n DataForSEO Gumroad 030125. Uses googleSheets, googleDrive, httpRequest. Event-driven trigger; 56 nodes.

Google Sheets, Google Drive, HTTP Request