This workflow corresponds to n8n.io template #17375 — we link there as the canonical source.
This workflow follows the Notion → Slack 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 →
{
"id": "ENqU3njgZuvXl7i8",
"name": "Auto Page Summary \u2192 Notion",
"tags": [],
"nodes": [
{
"id": "e03975bb-e434-4e7b-a42b-57c55e8c8f1f",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
-160
],
"parameters": {
"width": 540,
"height": 1040,
"content": "## Auto Page Summary \u2192 Notion\n\n### How it works\n\nThis workflow is triggered by a webhook (e.g. a CMS \"page published\" hook) carrying a URL. It runs Snapshot Site's AI Analyze on that page, checks for API errors, then checks the page's own quality signals (blank page / CAPTCHA detected) before creating a structured Notion page with the AI summary, topics, heading outline, and a content-quality note. Pages that come back blank or CAPTCHA-walled are flagged to Slack instead of getting a garbage summary written to Notion.\n\n### Setup steps\n\n- Install the `n8n-nodes-snapshot-site` community node (Settings \u2192 Community nodes \u2192 Install \u2192 `n8n-nodes-snapshot-site`) \u2014 verified by n8n.\n- Add a Snapshot Site credential, a Slack credential, and a Notion credential.\n- Activate the workflow and copy the Webhook node's Production URL into your CMS's \"on publish\" hook (or call it manually with `{\"url\": \"https://...\"}`).\n- Set the Notion node's parent page and attach your Notion credential.\n- To test without a real webhook call: edit the URL in **Mock Webhook Payload**, then click **Execute workflow** \u2014 the Manual Trigger path feeds the exact same payload shape into the pipeline.\n\n### Customization\n\nSwap the webhook trigger for a Schedule Trigger + Google Sheets read (see the AI extraction pack pattern) if you'd rather batch-process a list of URLs instead of reacting to a publish event. Add more Analyze fields (e.g. `metadata.keywords`) to the Notion page as needed."
},
"typeVersion": 1
},
{
"id": "c8dbd0c4-56e0-4b9f-aab2-52a45f35fbf9",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
768,
112
],
"parameters": {
"color": 7,
"width": 560,
"height": 580,
"content": "## Receive and analyze\n\nReceives the published page's URL \u2014 from the real webhook, or from the Manual Trigger + mock payload below it for testing \u2014 and runs Snapshot Site's AI Analyze (summary + topics + quality checks) on it."
},
"typeVersion": 1
},
{
"id": "bfc5bdc7-1a7b-4534-a57b-cb96356b9baa",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1376,
48
],
"parameters": {
"color": 7,
"width": 576,
"height": 652,
"content": "## Handle errors and quality issues\n\nChecks for API errors first, then for blank-page/CAPTCHA content-quality issues \u2014 both get a Slack alert instead of a Notion entry."
},
"typeVersion": 1
},
{
"id": "3259a4dc-3f3c-4106-aa97-c438167dbce1",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1968,
-96
],
"parameters": {
"color": 7,
"width": 688,
"height": 636,
"content": "## Save to Notion\n\nBuilds a structured summary (topics, headings, quality note) and creates a Notion page for the analyzed content."
},
"typeVersion": 1
},
{
"id": "3e1fc88f-8753-4a96-bae0-cde58a410319",
"name": "When Page Published",
"type": "n8n-nodes-base.webhook",
"position": [
816,
288
],
"parameters": {
"path": "page-published",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "ea4a4c48-e5c4-4858-96f1-bd51403c46da",
"name": "When clicking 'Execute workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
816,
464
],
"parameters": {},
"typeVersion": 1
},
{
"id": "055d1c13-1d68-48f2-b1df-3d0d535adaf7",
"name": "Mock Webhook Payload",
"type": "n8n-nodes-base.set",
"position": [
1136,
464
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"name": "body.url",
"type": "string",
"value": "https://example.com"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "33526f46-22ad-4ae9-b73c-7d4c5e6d56b4",
"name": "Prepare Request",
"type": "n8n-nodes-base.noOp",
"position": [
1136,
304
],
"parameters": {},
"typeVersion": 1
},
{
"id": "ca2733ea-ec16-40c6-b590-339c52a31273",
"name": "Analyze Page",
"type": "n8n-nodes-snapshot-site.snapshotSite",
"onError": "continueErrorOutput",
"maxTries": 3,
"position": [
1408,
304
],
"parameters": {
"url": "={{ $json.body.url }}",
"operation": "analyze",
"requestOptions": {},
"additionalFields": {
"fullSize": true,
"enableQuality": true,
"enableSummary": true
}
},
"retryOnFail": true,
"typeVersion": 1,
"waitBetweenTries": 5000
},
{
"id": "a0c87c07-d9a8-496c-a03f-465d7c9c8e8b",
"name": "Check for API Error",
"type": "n8n-nodes-base.if",
"position": [
1616,
240
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.error === true }}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "40d0c098-30ee-420c-9e03-3255a5b0e857",
"name": "Build Failure Record",
"type": "n8n-nodes-base.set",
"position": [
1616,
544
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"name": "url",
"type": "string",
"value": "={{ $('Prepare Request').item.json.body.url }}"
},
{
"name": "message",
"type": "string",
"value": "={{ $json.error?.message || $json.message }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e94b5741-7f33-4536-90af-1e683ef4a6f4",
"name": "Notify Analysis Failure",
"type": "n8n-nodes-base.slack",
"position": [
1808,
544
],
"parameters": {
"text": "=\ud83d\udd34 Page analysis failed for {{ $json.url }}: {{ $json.message }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "name",
"value": "#content-ops-alerts"
},
"otherOptions": {
"unfurl_links": false,
"unfurl_media": false
}
},
"typeVersion": 2.1
},
{
"id": "93c404db-4670-43ed-8b26-52010bc67c33",
"name": "Check Content Quality",
"type": "n8n-nodes-base.if",
"position": [
2016,
304
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.quality.isBlank === true || $json.quality.hasCaptcha === true }}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "b2bf919f-7375-4050-80a8-a2eaf6162ee7",
"name": "Notify Content Quality Issue",
"type": "n8n-nodes-base.slack",
"position": [
2256,
80
],
"parameters": {
"text": "=\u26a0\ufe0f {{ $json.url }} came back {{ $json.quality.isBlank ? 'blank' : 'CAPTCHA-walled' }} \u2014 skipped Notion summary. HTTP status: {{ $json.quality.httpStatus }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "name",
"value": "#content-quality"
},
"otherOptions": {
"unfurl_links": false,
"unfurl_media": false
}
},
"typeVersion": 2.1
},
{
"id": "ce2ede4f-0134-426b-bb95-796ada57317a",
"name": "Build Notion Content",
"type": "n8n-nodes-base.code",
"position": [
2256,
304
],
"parameters": {
"jsCode": "const d = $input.item.json;\nconst topics = (d.topics || []).join(', ') || 'None detected';\nconst headingsText = [\n d.headings?.h1?.length ? `H1: ${d.headings.h1.join(' | ')}` : null,\n d.headings?.h2?.length ? `H2: ${d.headings.h2.join(' | ')}` : null,\n d.headings?.h3?.length ? `H3: ${d.headings.h3.join(' | ')}` : null,\n].filter(Boolean).join('\\n') || 'No headings detected';\nconst q = d.quality || {};\nconst qualityText = `Readability: ${q.readabilityScore ?? 'n/a'}/100 | Blank page: ${q.isBlank} | CAPTCHA: ${q.hasCaptcha} | HTTP status: ${q.httpStatus}` +\n (q.notes?.length ? ` | Notes: ${q.notes.join(', ')}` : '');\nreturn [{\n json: {\n pageTitle: d.metadata?.title || d.url,\n pageUrl: d.url,\n summary: d.summary || 'No summary generated',\n topics,\n headingsText,\n qualityText,\n }\n}];"
},
"typeVersion": 2
},
{
"id": "4b44377f-d3b0-4480-9c65-cb871ede6376",
"name": "Create Notion Page",
"type": "n8n-nodes-base.notion",
"position": [
2528,
304
],
"parameters": {
"title": "={{ $json.pageTitle }}",
"pageId": {
"__rl": true,
"mode": "id",
"value": "PLACEHOLDER"
},
"blockUi": {
"blockValues": [
{
"type": "heading_2",
"textContent": "=\ud83d\udd17 {{ $json.pageUrl }}"
},
{
"type": "heading_2",
"textContent": "Summary"
},
{
"textContent": "={{ $json.summary }}"
},
{
"type": "heading_2",
"textContent": "Topics"
},
{
"textContent": "={{ $json.topics }}"
},
{
"type": "heading_2",
"textContent": "Headings Found"
},
{
"textContent": "={{ $json.headingsText }}"
},
{
"type": "heading_2",
"textContent": "Content Quality"
},
{
"textContent": "={{ $json.qualityText }}"
}
]
},
"options": {}
},
"typeVersion": 2.2
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "130eda01-04e5-49d6-b048-a32359bce0d5",
"nodeGroups": [],
"connections": {
"Analyze Page": {
"main": [
[
{
"node": "Check for API Error",
"type": "main",
"index": 0
}
],
[
{
"node": "Build Failure Record",
"type": "main",
"index": 0
}
]
]
},
"Prepare Request": {
"main": [
[
{
"node": "Analyze Page",
"type": "main",
"index": 0
}
]
]
},
"Check for API Error": {
"main": [
[
{
"node": "Build Failure Record",
"type": "main",
"index": 0
}
],
[
{
"node": "Check Content Quality",
"type": "main",
"index": 0
}
]
]
},
"When Page Published": {
"main": [
[
{
"node": "Prepare Request",
"type": "main",
"index": 0
}
]
]
},
"Build Failure Record": {
"main": [
[
{
"node": "Notify Analysis Failure",
"type": "main",
"index": 0
}
]
]
},
"Build Notion Content": {
"main": [
[
{
"node": "Create Notion Page",
"type": "main",
"index": 0
}
]
]
},
"Mock Webhook Payload": {
"main": [
[
{
"node": "Prepare Request",
"type": "main",
"index": 0
}
]
]
},
"Check Content Quality": {
"main": [
[
{
"node": "Notify Content Quality Issue",
"type": "main",
"index": 0
}
],
[
{
"node": "Build Notion Content",
"type": "main",
"index": 0
}
]
]
},
"When clicking 'Execute workflow'": {
"main": [
[
{
"node": "Mock Webhook Payload",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow receives a published page URL via webhook, analyzes the page with Snapshot Site, posts failures or quality issues to Slack, and creates a structured summary page in Notion with the extracted summary, topics, headings, and content-quality notes. Receives a POST…
Source: https://n8n.io/workflows/17375/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Are you tired of the repetitive dance between git push, creating a pull request in GitHub, updating the corresponding task in JIRA, and then manually notifying your team in Slack, or Notion?
This workflow is an AI-assisted clean plate and object removal pipeline built for modern VFX production environments. It transforms a single plate image and removal brief into multiple high-quality cl
This workflow is an AI-driven FX concept generation pipeline that transforms a single VFX brief into multiple high-quality simulation-ready video concepts. It automates ideation, rendering, storage, a
This workflow receives a new-hire webhook, checks the hire’s personal email in RelayShield for breach and infostealer exposure, provisions a Google Workspace account via the Admin SDK, and logs both t
📝 Automation: Instantly Onboard New Clients from Tally Form to Notion, Google Drive & Slack This automation streamlines the client onboarding process by integrating Tally, Notion, Google Drive, and Sl