AutomationFlowsWeb Scraping › Ai-powered Daily Briefing V2 (http)

Ai-powered Daily Briefing V2 (http)

AI-Powered Daily Briefing V2 (HTTP). Uses httpRequest, emailSend. Scheduled trigger; 9 nodes.

Cron / scheduled trigger★★★★☆ complexity9 nodesHTTP RequestEmail Send
Web Scraping Trigger: Cron / scheduled Nodes: 9 Complexity: ★★★★☆ Added:

This workflow follows the Emailsend → HTTP Request recipe pattern — see all workflows that pair these two integrations.

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": "AI-Powered Daily Briefing V2 (HTTP)",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 8 * * *"
            }
          ]
        }
      },
      "id": "daily-trigger",
      "name": "Daily Trigger (8 AM Pacific)",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        240,
        400
      ]
    },
    {
      "parameters": {
        "jsCode": "// Get date for queries\nconst today = new Date().toISOString().split('T')[0];\nconst weekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\nconst weekFromNow = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];\n\nreturn [{ \n  today,\n  week_ago: weekAgo,\n  week_from_now: weekFromNow\n}];"
      },
      "id": "prepare-dates",
      "name": "Prepare Dates",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        460,
        400
      ]
    },
    {
      "parameters": {
        "url": "https://YOUR-PROJECT-REF.supabase.co/functions/v1/second-brain-mcp",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  jsonrpc: '2.0',\n  id: 1,\n  method: 'tools/call',\n  params: {\n    name: 'list-tasks',\n    arguments: {\n      status: 'pending',\n      due_date_to: $json.week_from_now,\n      limit: 50,\n      sort_by: 'due_date',\n      sort_order: 'asc'\n    }\n  }\n}) }}",
        "options": {}
      },
      "id": "get-tasks",
      "name": "Get Pending Tasks (MCP)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        680,
        300
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "url": "https://YOUR-PROJECT-REF.supabase.co/functions/v1/second-brain-mcp",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  jsonrpc: '2.0',\n  id: 2,\n  method: 'tools/call',\n  params: {\n    name: 'list-contacts',\n    arguments: {\n      contact_status: 'to reach out',\n      limit: 20,\n      format: 'summary'\n    }\n  }\n}) }}",
        "options": {}
      },
      "id": "get-followups",
      "name": "Get Follow-ups (MCP)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        680,
        400
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "url": "https://YOUR-PROJECT-REF.supabase.co/functions/v1/second-brain-mcp",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpHeaderAuth",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  jsonrpc: '2.0',\n  id: 3,\n  method: 'tools/call',\n  params: {\n    name: 'list-opportunities',\n    arguments: {\n      status: '0_research,1_to_apply',\n      limit: 10,\n      sort_by: 'weighted_score',\n      sort_order: 'desc',\n      format: 'summary'\n    }\n  }\n}) }}",
        "options": {}
      },
      "id": "get-opportunities",
      "name": "Get Top Opportunities (MCP)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        680,
        500
      ],
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Collect data from all parallel queries\nconst tasks = $('Get Pending Tasks (MCP)').item.json.result?.content?.[0]?.text || '{}';\nconst followups = $('Get Follow-ups (MCP)').item.json.result?.content?.[0]?.text || '{}';\nconst opportunities = $('Get Top Opportunities (MCP)').item.json.result?.content?.[0]?.text || '{}';\nconst dates = $('Prepare Dates').item.json;\n\n// Parse if strings\nlet parsedTasks, parsedFollowups, parsedOpportunities;\ntry {\n  parsedTasks = typeof tasks === 'string' ? JSON.parse(tasks) : tasks;\n  parsedFollowups = typeof followups === 'string' ? JSON.parse(followups) : followups;\n  parsedOpportunities = typeof opportunities === 'string' ? JSON.parse(opportunities) : opportunities;\n} catch (e) {\n  parsedTasks = { items: [] };\n  parsedFollowups = { items: [] };\n  parsedOpportunities = { items: [] };\n}\n\nreturn [{\n  tasks: parsedTasks.items || parsedTasks,\n  followups: parsedFollowups.items || parsedFollowups,\n  opportunities: parsedOpportunities.items || parsedOpportunities,\n  today: dates.today,\n  task_count: (parsedTasks.items || parsedTasks).length || 0,\n  followup_count: (parsedFollowups.items || parsedFollowups).length || 0,\n  opportunity_count: (parsedOpportunities.items || parsedOpportunities).length || 0\n}];"
      },
      "id": "aggregate-data",
      "name": "Aggregate Data",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        900,
        400
      ]
    },
    {
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "anthropicApi",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({\n  model: 'claude-sonnet-4-20250514',\n  max_tokens: 2048,\n  temperature: 0.5,\n  messages: [{\n    role: 'user',\n    content: `Generate a personalized daily briefing for ${$json.today}.\n\nDATA FROM SECOND BRAIN:\n\nPENDING TASKS (${$json.task_count}):\n${JSON.stringify($json.tasks, null, 2)}\n\nFOLLOW-UPS NEEDED (${$json.followup_count}):\n${JSON.stringify($json.followups, null, 2)}\n\nTOP OPPORTUNITIES (${$json.opportunity_count}):\n${JSON.stringify($json.opportunities, null, 2)}\n\nGENERATE BRIEFING:\n\n1. **Today's Priority** (1-2 sentences)\n   - ONE most important focus for today\n   - Why it matters\n\n2. **Critical Tasks** (Top 5)\n   - List by intelligent priority (urgency + importance + impact)\n   - Not just by due date\n   - Include context for each\n\n3. **Key Follow-ups** (Top 3)\n   - Who to reach out to\n   - Why (context from past interactions)\n   - Suggested talking points\n\n4. **Opportunities to Watch** (Top 2-3)\n   - Sorted by weighted_score\n   - Deadlines approaching\n   - Action items\n\n5. **Quick Wins** (<15 min tasks)\n   - 2-3 easy wins for momentum\n\n6. **Relationship Insights**\n   - Patterns in follow-ups\n   - Network gaps\n   - Connection opportunities\n\nTONE: Concise, actionable, motivating\nFORMAT: Well-formatted markdown (not HTML)\nLENGTH: ~400-600 words\n\nReturn ONLY the briefing content (no JSON wrapper).`\n  }]\n}) }}",
        "options": {}
      },
      "id": "generate-briefing",
      "name": "Generate Briefing (Claude API)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1120,
        400
      ],
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const response = $input.item.json;\nconst briefingContent = response.content?.[0]?.text || 'Failed to generate briefing';\nconst aggregateData = $('Aggregate Data').item.json;\n\nreturn [{\n  subject: `Daily Briefing - ${aggregateData.today}`,\n  briefing: briefingContent,\n  stats: {\n    tasks: aggregateData.task_count,\n    followups: aggregateData.followup_count,\n    opportunities: aggregateData.opportunity_count\n  },\n  timestamp: new Date().toISOString()\n}];"
      },
      "id": "format-email",
      "name": "Format Email",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1340,
        400
      ]
    },
    {
      "parameters": {
        "fromEmail": "your-email@example.com",
        "toEmail": "your-email@example.com",
        "subject": "={{ $json.subject }}",
        "emailFormat": "text",
        "text": "={{ `\ud83d\udcca SECOND BRAIN DAILY BRIEFING\\n${'='.repeat(50)}\\n\\nTasks: ${$json.stats.tasks} | Follow-ups: ${$json.stats.followups} | Opportunities: ${$json.stats.opportunities}\\n\\n${$json.briefing}\\n\\n${'='.repeat(50)}\\n\ud83e\udd16 Generated by Second Brain at ${$json.timestamp}` }}",
        "options": {}
      },
      "id": "send-email",
      "name": "Send Email Briefing",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        1560,
        400
      ],
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      }
    }
  ],
  "connections": {
    "Daily Trigger (8 AM Pacific)": {
      "main": [
        [
          {
            "node": "Prepare Dates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Dates": {
      "main": [
        [
          {
            "node": "Get Pending Tasks (MCP)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Follow-ups (MCP)",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Top Opportunities (MCP)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Pending Tasks (MCP)": {
      "main": [
        [
          {
            "node": "Aggregate Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Follow-ups (MCP)": {
      "main": [
        [
          {
            "node": "Aggregate Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Top Opportunities (MCP)": {
      "main": [
        [
          {
            "node": "Aggregate Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Data": {
      "main": [
        [
          {
            "node": "Generate Briefing (Claude API)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Briefing (Claude API)": {
      "main": [
        [
          {
            "node": "Format Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Email": {
      "main": [
        [
          {
            "node": "Send Email Briefing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    {
      "createdAt": "2025-12-16T00:00:00.000Z",
      "updatedAt": "2025-12-16T00:00:00.000Z",
      "id": "automation",
      "name": "Automation"
    },
    {
      "createdAt": "2025-12-16T00:00:00.000Z",
      "updatedAt": "2025-12-16T00:00:00.000Z",
      "id": "daily",
      "name": "Daily"
    }
  ],
  "triggerCount": 1,
  "updatedAt": "2025-12-16T00:00:00.000Z",
  "versionId": "2"
}

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

AI-Powered Daily Briefing V2 (HTTP). Uses httpRequest, emailSend. Scheduled trigger; 9 nodes.

Source: https://github.com/Brennan-Wilkerson/second-brain-public/blob/9fbdffa8aa93a5916041f9294dc03526cd14bcd9/n8n-workflows/ai-daily-briefing-v2.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

This workflow is an improvement of this workflow by Greg Brzezinka.

HTTP Request, Email Send, XML +1
Web Scraping

N8N-Self-Updater. Uses ssh, emailSend, httpRequest. Scheduled trigger; 27 nodes.

Ssh, Email Send, HTTP Request
Web Scraping

&gt; An automated n8n workflow originally built for DigitalOcean-based n8n deployments, but fully compatible with any VPS or cloud hosting (e.g., AWS, Google Cloud, Hetzner, Linode, etc.) where n8n ru

Ssh, Email Send, HTTP Request
Web Scraping

What if you could spot a major sales problem—or a winning campaign—the very next morning, instead of weeks later? Imagine receiving a beautiful, data-rich alert directly in your inbox the moment your

QuickBooks, HTTP Request, Email Send
Web Scraping

Track Changes Of Product Prices. Uses htmlExtract, functionItem, httpRequest, writeBinaryFile. Scheduled trigger; 25 nodes.

Html Extract, Function Item, HTTP Request +5