نوشن
Notion
فضای کاری همهکاره - یادداشت، دیتابیس، ویکی و مدیریت پروژه
نمای کلی
نود Notion یکی از کاربردیترین نودهای n8n برای مدیریت دانش و سازماندهی اطلاعات است.
Notion چیست؟
Notion یک فضای کاری همهکاره (All-in-One Workspace) است که یادداشتبرداری، مدیریت پروژه، ویکی تیمی و دیتابیس را در یک پلتفرم ترکیب کرده است. API رسمی Notion امکان اتوماسیون کامل محتوا را فراهم میکند.
مفاهیم کلیدی:
- Pages: صفحات Notion، واحد اصلی محتوا هستند. هر صفحه میتواند شامل متن، Blockها و زیرصفحات باشد
- Databases: جداول ساختاریافته با Propertyهای مختلف (متن، عدد، تاریخ، Select، Relation و غیره)
- Blocks: واحدهای سازنده محتوا (متن، هدینگ، لیست، کد، تصویر، Embed و ...)
- Properties: فیلدهای دیتابیس با انواع مختلف (Title, Rich Text, Number, Select, Multi-select, Date, Checkbox, URL, Email, Phone, Formula, Relation, Rollup, People, Files, Created Time, Last Edited Time)
انواع نمایش دیتابیس (Views):
- Table: نمای جدولی (مانند Excel)
- Board: نمای Kanban (مانند Trello)
- Timeline: نمای زمانی (Gantt Chart)
- Calendar: نمای تقویمی
- List: نمای لیستی ساده
- Gallery: نمای گالری با کارتهای تصویری
انواع Block:
- متن (Paragraph)، هدینگ (H1, H2, H3)، لیست (Bulleted, Numbered)
- چکلیست (To-do)، Toggle، Callout، Quote
- بلوک کد (Code)، تصویر (Image)، ویدیو (Video)
- Embed، Bookmark، فایل، Divider، Table of Contents
محدودیتهای API:
- Rate Limit: میانگین 3 درخواست در ثانیه
- حداکثر 100 آیتم در هر درخواست pagination
- حداکثر 2000 کاراکتر برای rich_text در هر بلوک
- فقط صفحات و دیتابیسهایی که با Integration به اشتراک گذاشته شدهاند قابل دسترسی هستند
احراز هویت
احراز هویت Notion
روش ۱: Internal Integration (توصیه شده)
#### مراحل ساخت Integration:
- 1به آدرس [notion.so/my-integrations](https://www.notion.so/my-integrations) بروید
- 2روی "New integration" کلیک کنید
- 3نام Integration را وارد کنید (مثل: "n8n Automation")
- 4Workspace مورد نظر را انتخاب کنید
- 5قابلیتها (Capabilities) را تنظیم کنید:
- Read content: خواندن محتوای صفحات و دیتابیسها
- Update content: ویرایش محتوا
- Insert content: ایجاد محتوای جدید
- Read user information: دسترسی به اطلاعات کاربران (اختیاری)
- 1Internal Integration Secret را کپی کنید:
secret_abc123XYZ...#### اتصال به صفحات/دیتابیسها (بسیار مهم!):
- 1صفحه یا دیتابیس مورد نظر را در Notion باز کنید
- 2از منوی ⋯ (سه نقطه بالا-راست) گزینه "Connections" را انتخاب کنید
- 3Integration خود را پیدا و انتخاب کنید
- 4بدون این مرحله، API هیچ دسترسیای به محتوا ندارد!
#### تنظیم در n8n:
- 1Credentials > Notion API
- 2Internal Integration Secret وارد کنید
- 3Test Connection بزنید
روش ۲: OAuth2 (برای Public Integrations)
- مناسب برای اپلیکیشنهایی که چندین کاربر دارند
- نیاز به Client ID و Client Secret
- کاربر باید دسترسی را تایید کند
نکات امنیتی:
- Secret را در جایی امن ذخیره کنید
- حداقل دسترسیهای لازم را فعال کنید
- برای هر پروژه Integration جداگانه بسازید
عملیاتهای موجود
createPage
ایجاد صفحه جدید در Notion (درون صفحه والد یا دیتابیس)
getPage
دریافت اطلاعات و Propertyهای یک صفحه با Page ID
updatePage
ویرایش Propertyها، آیکون یا کاور یک صفحه موجود
archivePage
آرشیو (حذف نرم) یک صفحه - قابل بازیابی است
queryDatabase
کوئری دیتابیس با فیلتر، مرتبسازی و pagination
createDatabaseItem
افزودن رکورد جدید به دیتابیس Notion
updateDatabaseItem
ویرایش Propertyهای یک رکورد موجود در دیتابیس
getDatabase
دریافت ساختار و تنظیمات دیتابیس (Propertyها و انواع آنها)
search
جستجو در تمام صفحات و دیتابیسهای قابل دسترسی
appendBlockChildren
اضافه کردن محتوا (Blockها) به انتهای یک صفحه یا بلوک والد
getBlockChildren
دریافت لیست Blockهای فرزند یک صفحه یا بلوک
deleteBlock
حذف یک بلوک از صفحه (آرشیو میشود)
getUser
دریافت اطلاعات یک کاربر Workspace
listUsers
دریافت لیست تمام کاربران و رباتهای Workspace
کاربردهای متداول
کاربردهای رایج
۱. یادداشت خودکار جلسات (Meeting Notes)
ثبت خودکار یادداشت جلسات از Google Calendar:
Google Calendar Trigger (جلسه جدید)
→ Notion (createPage)
Parent: database_id (دیتابیس جلسات)
Properties:
Title: "جلسه: {{$json.summary}}"
Date: {{$json.start.dateTime}}
Attendees: {{$json.attendees.map(a => a.email).join(', ')}}
Children:
- heading_2: "دستور جلسه"
- to_do: "بررسی وضعیت پروژه"
- to_do: "تصمیمات"
- heading_2: "نتایج"
- paragraph: ""۲. CRM در دیتابیس Notion
مدیریت مشتریان و سرنخها:
Webhook (فرم تماس سایت)
→ Notion (createDatabaseItem)
Database: "CRM مشتریان"
Properties:
Name: {{$json.name}}
Email: {{$json.email}}
Phone: {{$json.phone}}
Status: "سرنخ جدید"
Source: "وبسایت"
Date: {{$now}}
→ Telegram (اعلان به تیم فروش)۳. خط تولید محتوا (Content Pipeline)
انتشار خودکار مطالب از Notion به وبسایت:
Schedule (هر ساعت)
→ Notion (queryDatabase)
Database: "تقویم محتوا"
Filter: Status = "آماده انتشار"
→ Loop
→ Notion (getBlockChildren) - محتوای کامل
→ Code (تبدیل Blockها به HTML/Markdown)
→ WordPress/API (انتشار پست)
→ Notion (updateDatabaseItem)
Status: "منتشر شده"
Published Date: {{$now}}۴. همگامسازی تسکها (Task Sync)
سینک بین Notion و ابزارهای مدیریت پروژه:
Notion Trigger (تسک جدید/تغییر)
→ IF (Status تغییر کرده)
→ Jira/Trello/Asana (بهروزرسانی تسک)
→ IF (تسک جدید)
→ Jira (ایجاد Issue)
→ Notion (updatePage: Jira Link اضافه)۵. پایگاه دانش خودکار (Knowledge Base)
ساخت ویکی خودکار از منابع مختلف:
Slack Trigger (پیامهای مهم با ایموجی 📌)
→ Notion (createPage)
Parent: "پایگاه دانش تیم"
Title: "از Slack: {{$json.text.substring(0, 50)}}"
Children:
- callout: "منبع: Slack - {{$json.channel}}"
- paragraph: {{$json.text}}
- bookmark: {{$json.links[0]}}۶. پورتال مشتری (Client Portal)
مدیریت پروژههای مشتری:
Webhook (پروژه جدید)
→ Notion (createPage)
Parent: "پروژههای مشتریان"
Icon: "📁"
Children:
- heading_1: "اطلاعات پروژه"
- table: مشخصات پروژه
- heading_1: "مایلستونها"
- to_do: مراحل پروژه
- heading_1: "فایلها"
→ Email (ارسال لینک به مشتری)۷. برد Sprint Planning
مدیریت اسپرینت با Kanban Board:
Schedule (شروع اسپرینت جدید)
→ Notion (queryDatabase)
Database: "Backlog"
Filter: Priority = "High" AND Sprint = null
→ Loop
→ Notion (updateDatabaseItem)
Sprint: "اسپرینت {{$json.sprintNumber}}"
Status: "To Do"
→ Telegram (اعلان شروع اسپرینت)۸. ردیاب عادتها (Habit Tracker)
ثبت خودکار عادتهای روزانه:
Schedule (هر شب ساعت ۲۳)
→ HTTP Request (دریافت آمار روز از اپها)
→ Notion (createDatabaseItem)
Database: "عادتهای روزانه"
Properties:
Date: {{$today}}
Exercise: {{$json.steps > 8000}}
Reading: {{$json.readingMinutes}}
Water: {{$json.waterGlasses}}
Sleep: {{$json.sleepHours}}۹. پیگیری فاکتورها (Invoice Tracking)
مدیریت مالی در دیتابیس Notion:
Webhook (فاکتور جدید از سیستم مالی)
→ Notion (createDatabaseItem)
Database: "فاکتورها"
Properties:
Invoice Number: {{$json.number}}
Client: {{$json.clientName}}
Amount: {{$json.total}}
Status: "صادر شده"
Due Date: {{$json.dueDate}}
Items: {{$json.items.map(i => i.name).join(', ')}}۱۰. ویکی تیمی با بهروزرسانی خودکار
بهروزرسانی مستندات تیم به صورت خودکار:
GitHub Trigger (Release جدید)
→ Notion (search)
Query: "مستندات {{$json.repo}}"
→ Notion (appendBlockChildren)
Block: صفحه مستندات
Children:
- heading_3: "نسخه {{$json.tag}} - {{$today}}"
- paragraph: {{$json.releaseNotes}}
- dividerنکات حرفهای
نکات حرفهای
۱. صفحات را با Integration به اشتراک بگذارید!
این مهمترین نکته است. بدون Share کردن، API هیچ دسترسیای ندارد:
صفحه/دیتابیس → ⋯ → Connections → انتخاب Integration۲. فرمت rich_text
همه متنها در Notion باید در قالب rich_text باشند:
[{
"type": "text",
"text": {"content": "متن شما اینجا"}
}]برای متن با استایل:
[{
"type": "text",
"text": {"content": "متن Bold"},
"annotations": {"bold": true}
}]۳. نگاشت انواع Property
هر نوع Property فرمت ورودی خاصی دارد:
Title: {title: [{text: {content: "عنوان"}}]}
Rich Text: {rich_text: [{text: {content: "متن"}}]}
Number: {number: 1500}
Select: {select: {name: "انتخاب"}}
Multi-select: {multi_select: [{name: "تگ۱"}, {name: "تگ۲"}]}
Date: {date: {start: "2024-01-15", end: "2024-01-20"}}
Checkbox: {checkbox: true}
URL: {url: "https://example.com"}
Email: {email: "info@example.com"}
Phone: {phone_number: "+989123456789"}
People: {people: [{id: "user-id"}]}۴. تفاوت Database و Page
- Database: ساختار جدولی با Propertyها، قابل فیلتر و مرتبسازی
- Page: صفحه محتوا با Blockها
- هر رکورد دیتابیس یک Page است (با دو parent type متفاوت)
۵. فیلتر دیتابیس (Filter Syntax)
{
"and": [
{"property": "Status", "select": {"equals": "فعال"}},
{"property": "Priority", "select": {"equals": "بالا"}},
{"property": "Due Date", "date": {"before": "2024-12-31"}}
]
}عملگرهای فیلتر: equals, does_not_equal, contains, does_not_contain, starts_with, ends_with, is_empty, is_not_empty, before, after, on_or_before, on_or_after
۶. مرتبسازی (Sort Syntax)
[
{"property": "Priority", "direction": "descending"},
{"property": "Created Time", "direction": "ascending"}
]۷. Pagination با start_cursor
برای دریافت همه نتایج:
Notion (queryDatabase, page_size: 100)
→ IF (has_more == true)
→ Set (cursor = next_cursor)
→ Loop back → Notion (start_cursor: cursor)
→ Merge همه نتایج۸. آرشیو به جای حذف
Notion API حذف دائم ندارد. از Archive استفاده کنید:
Notion (updatePage)
pageId: "..."
archived: trueآرشیو قابل بازگشت است (archived: false).
۹. محتوای صفحه با Block Children
برای اضافه کردن محتوا به صفحه، از appendBlockChildren استفاده کنید:
{
"children": [
{"type": "heading_2", "heading_2": {"rich_text": [{"text": {"content": "عنوان"}}]}},
{"type": "paragraph", "paragraph": {"rich_text": [{"text": {"content": "متن"}}]}},
{"type": "to_do", "to_do": {"rich_text": [{"text": {"content": "تسک"}}], "checked": false}}
]
}۱۰. Propertyهای فقط خواندنی
این Propertyها توسط API قابل تغییر نیستند:
- Formula: محاسبه خودکار
- Rollup: جمعآوری از Relation
- Created Time: زمان ایجاد (خودکار)
- Last Edited Time: آخرین ویرایش (خودکار)
- Created By: ایجادکننده (خودکار)
- Last Edited By: آخرین ویرایشگر (خودکار)
۱۱. تنظیم کاور و آیکون
{
"icon": {"type": "emoji", "emoji": "📋"},
"cover": {"type": "external", "external": {"url": "https://example.com/image.jpg"}}
}۱۲. Notion Formulas
Formulas در Notion مثل فرمولهای Excel هستند. از API فقط خواندنی:
prop("Price") * prop("Quantity")
if(prop("Status") == "Done", "✅", "⏳")۱۳. فیلدهای خودکار
created_time و last_edited_time به صورت خودکار توسط Notion مدیریت میشوند و نیاز به ست کردن دستی ندارند.
۱۴. Template Databases
میتوانید دیتابیسهای الگو بسازید و از API رکوردهای جدید با ساختار یکسان ایجاد کنید. Template صفحه محتوای پیشفرض تعیین میکند.
۱۵. Multi-select به صورت آرایه
Multi-select را به صورت آرایهای از نامها ارسال کنید:
{
"multi_select": [
{"name": "برنامهنویسی"},
{"name": "دیزاین"},
{"name": "مدیریت"}
]
}اگر گزینهای وجود نداشته باشد، Notion خودکار آن را ایجاد میکند.
رفع مشکلات
خطاهای رایج و راهحلها
۱. خطای 401 Unauthorized
علت: Integration Secret اشتباه یا منقضی شده
راهحل
- Secret را از [notion.so/my-integrations](https://www.notion.so/my-integrations) بررسی کنید
- مطمئن شوید Secret کامل کپی شده (با پیشوند
secret_) - Integration حذف نشده باشد
- Credential در n8n را بروز کنید
۲. خطای 404 - صفحه یا دیتابیس پیدا نشد
علت: صفحه/دیتابیس با Integration به اشتراک گذاشته نشده
راهحل
- این رایجترین مشکل است! حتماً صفحه/دیتابیس را با Integration به اشتراک بگذارید
- در Notion روی صفحه: ⋯ → Connections → Integration خود را اضافه کنید
- صفحات والد را هم باید Share کنید
- Page ID را بررسی کنید (32 کاراکتر بدون خطتیره از URL)
۳. خطای 400 - Validation Error (فرمت Property اشتباه)
علت: ساختار Property مطابق نوع فیلد نیست
راهحل
- هر نوع Property فرمت خاصی دارد:
Title: {title: [{text: {content: "متن"}}]}
Rich Text: {rich_text: [{text: {content: "متن"}}]}
Number: {number: 42}
Select: {select: {name: "گزینه"}}
Multi-select: {multi_select: [{name: "تگ۱"}, {name: "تگ۲"}]}
Date: {date: {start: "2024-01-15"}}
Checkbox: {checkbox: true}
URL: {url: "https://example.com"}
Email: {email: "test@example.com"}- نام Property باید دقیقاً مطابق دیتابیس باشد (حساس به حروف بزرگ/کوچک)
۴. خطای 409 Conflict
علت: تداخل در ویرایش همزمان
راهحل
- بین درخواستهای متوالی فاصله بگذارید
- از Retry on Fail استفاده کنید
- از ویرایش همزمان یک صفحه خودداری کنید
۵. خطای 429 Rate Limit
علت: بیش از 3 درخواست در ثانیه (میانگین)
راهحل
- از Wait Node استفاده کنید (حداقل 350ms بین درخواستها):
Loop → Notion → Wait (400ms) → Next- درخواستها را Batch کنید
- از Retry-After header استفاده کنید
- عملیات سنگین را در ساعات کمترافیک انجام دهید
۶. Block Type پشتیبانی نمیشود
علت: برخی انواع Block فقط خواندنی هستند
راهحل
- انواع قابل ایجاد: paragraph, heading_1/2/3, bulleted_list_item, numbered_list_item, to_do, toggle, code, callout, quote, divider, bookmark, image, embed
- انواع فقط خواندنی: table_of_contents, breadcrumb, column_list, synced_block
- از نوع Block مناسب استفاده کنید
۷. خطای فرمت rich_text
علت: ساختار rich_text معتبر نیست
راهحل
- فرمت صحیح:
[{
"type": "text",
"text": {"content": "متن شما"},
"annotations": {"bold": false, "italic": false, "color": "default"}
}]- حداکثر 2000 کاراکتر در هر بلوک rich_text
- برای متن طولانی، چندین بلوک ایجاد کنید
۸. مشکل دسترسی به صفحات والد
علت: Integration به صفحه والد دسترسی ندارد
راهحل
- هم صفحه والد و هم زیرصفحات باید با Integration به اشتراک گذاشته شوند
- برای دیتابیسهای درون صفحه، صفحه والد را Share کنید
- دسترسی به صورت آبشاری (Cascade) به زیرصفحات منتقل میشود
