Workflow: Store Notion's Pages as Vector Documents into Supabase with OpenAI
Integrations: filter, noOp, notion, notionTrigger, stickyNote, stopAndError, summarize

{"id": "DvP6IHWymTIVg8Up", "meta": {"instanceId": "workflow-a64a096d", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:44.892180", "updatedAt": "2025-09-29T07:07:44.892189", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production"}, "name": "Store Notion's Pages as Vector Documents into Supabase with OpenAI", "tags": ["automation", "n8n", "production-ready", "excellent", "optimized"], "nodes": [{"id": "495609cd-4ca0-426d-8413-69e771398188", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [480, 400], "parameters": {"width": 637.1327972412109, "height": 1113.7434387207031, "content": "## Store Notion's Pages as Vector Documents into Supabase\n\n**This workflow assumes you have a Supabase project with a table that has a vector column. If you don't have it, follow the instructions here:** [Supabase Vector Columns Guide]({{ $env.WEBHOOK_URL }}\n\n## Workflow Description\n\nThis workflow automates the process of storing Notion pages as vector documents in a Supabase database with a vector column. The steps are as follows:\n\n1. **Notion Page Added Trigger**:\n   - Monitors a specified Notion database for newly added pages. You can create a specific Notion database where you copy the pages you want to store in Supabase.\n   - Node: `Page Added in Notion Database`\n\n2. **Retrieve Page Content**:\n   - Fetches all block content from the newly added Notion page.\n   - Node: `Get Blocks Content`\n\n3. **Filter Non-Text Content**:\n   - Excludes blocks of type \"image\" and \"video\" to focus on textual content.\n   - Node: `Filter - Exclude Media Content`\n\n4. **Summarize Content**:\n   - Concatenates the Notion blocks content to create a single text for embedding.\n   - Node: `Summarize - Concatenate Notion's blocks content`\n\n5. **Store in Supabase**:\n   - Stores the processed documents and their embeddings into a Supabase table with a vector column.\n   - Node: `Store Documents in Supabase`\n\n6. **Generate Embeddings**:\n   - Utilizes OpenAI's API to generate embeddings for the textual content.\n   - Node: `Generate Text Embeddings`\n\n\n7. **Create Metadata and Load Content**:\n   - Loads the block content and creates associated metadata, such as page ID and block ID.\n   - Node: `Load Block Content & Create Metadata`\n\n8. **Split Content into Chunks**:\n   - Divides the text into smaller chunks for easier processing and embedding generation.\n   - Node: `Token Splitter`\n\n\n\n"}, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow."}, {"id": "3f3e65dc-2b26-407c-87e5-52ba3b315fed", "name": "Embeddings OpenAI", "type": "n8n-nodes-base.noOp", "position": [2200, 760], "parameters": {"options": {}}, "typeVersion": 1, "notes": "This embeddingsOpenAi node performs automated tasks as part of the workflow."}, {"id": "6d2579b8-376f-44c3-82e8-9dc608efd98b", "name": "Token Splitter", "type": "n8n-nodes-base.noOp", "position": [2340, 960], "parameters": {"chunkSize": 256, "chunkOverlap": 30}, "typeVersion": 1, "notes": "This textSplitterTokenSplitter node performs automated tasks as part of the workflow."}, {"id": "79b3c147-08ca-4db4-9116-958a868cbfd9", "name": "Notion - Page Added Trigger", "type": "n8n-nodes-base.notionTrigger", "position": [1180, 520], "parameters": {"simple": false, "pollTimes": {"item": [{"mode": "everyMinute"}]}, "databaseId": {"__rl": true, "mode": "list", "value": "", "cachedResultUrl": "", "cachedResultName": ""}}, "typeVersion": 1, "notes": "This notionTrigger node performs automated tasks as part of the workflow."}, {"id": "e4a6f524-e3f5-4d02-949a-8523f2d21965", "name": "Notion - Retrieve Page Content", "type": "n8n-nodes-base.notion", "position": [1400, 520], "parameters": {"blockId": {"__rl": true, "mode": "url", "value": "={{ $json.url }}"}, "resource": "block", "operation": "getAll", "returnAll": true}, "typeVersion": 2.2, "notes": "This notion node performs automated tasks as part of the workflow."}, {"id": "bfebc173-8d4b-4f8f-a625-4622949dd545", "name": "Filter Non-Text Content", "type": "n8n-nodes-base.filter", "position": [1620, 520], "parameters": {"options": {}, "conditions": {"options": {"leftValue": "", "caseSensitive": true, "typeValidation": "strict"}, "combinator": "and", "conditions": [{"id": "e5b605e5-6d05-4bca-8f19-a859e474620f", "operator": {"type": "string", "operation": "notEquals"}, "leftValue": "={{ $json.type }}", "rightValue": "image"}, {"id": "c7415859-5ffd-4c78-b497-91a3d6303b6f", "operator": {"type": "string", "operation": "notEquals"}, "leftValue": "={{ $json.type }}", "rightValue": "video"}]}}, "typeVersion": 2, "notes": "This filter node performs automated tasks as part of the workflow."}, {"id": "b04939f9-355a-430b-a069-b11800066313", "name": "Summarize - Concatenate Notion's blocks content", "type": "n8n-nodes-base.summarize", "position": [1920, 520], "parameters": {"options": {"outputFormat": "separateItems"}, "fieldsToSummarize": {"values": [{"field": "content", "separateBy": "\n", "aggregation": "concatenate"}]}}, "typeVersion": 1, "notes": "This summarize node performs automated tasks as part of the workflow."}, {"id": "0e64dbb5-20c1-4b90-b818-a1726aaf5112", "name": "Create metadata and load content", "type": "n8n-nodes-base.noOp", "position": [2320, 760], "parameters": {"options": {"metadata": {"metadataValues": [{"name": "pageId", "value": "={{ $('Notion - Page Added Trigger').item.json.id }}"}, {"name": "createdTime", "value": "={{ $('Notion - Page Added Trigger').item.json.created_time }}"}, {"name": "pageTitle", "value": "={{ $('Notion - Page Added Trigger').item.json.properties.Page.title[0].text.content }}"}]}}, "jsonData": "={{ $('Summarize - Concatenate Notion's blocks content').item.json.concatenated_content }}", "jsonMode": "expressionData"}, "typeVersion": 1, "notes": "This documentDefaultDataLoader node performs automated tasks as part of the workflow."}, {"id": "187aba6f-eaed-4427-8d40-b9da025fb37d", "name": "Supabase Vector Store", "type": "n8n-nodes-base.noOp", "position": [2200, 520], "parameters": {"mode": "insert", "options": {}, "tableName": {"__rl": true, "mode": "list", "value": "", "cachedResultName": ""}}, "typeVersion": 1, "notes": "This vectorStoreSupabase node performs automated tasks as part of the workflow."}, {"id": "error-6e362e80", "name": "Error Handler", "type": "n8n-nodes-base.stopAndError", "typeVersion": 1, "position": [1000, 400], "parameters": {"message": "Workflow execution error", "options": {}}}], "active": false, "pinData": {}, "settings": {"executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000}, "versionId": "77f6b6f7-d699-4a7e-b3e7-fe8a60bde7ba", "connections": {"3f3e65dc-2b26-407c-87e5-52ba3b315fed": {"main": [[{"node": "error-handler-3f3e65dc-2b26-407c-87e5-52ba3b315fed-2eaebc41", "type": "main", "index": 0}]]}}, "description": "Automated workflow: Store Notion's Pages as Vector Documents into Supabase with OpenAI. This workflow integrates 10 different services: notionTrigger, stickyNote, filter, textSplitterTokenSplitter, summarize. It contains 10 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Store Notion's Pages as Vector Documents into Supabase with OpenAI. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}