Bir marta yoz, hamma joyga avtomatik tarqat: Notion + Next.js + Make.com
Blog yuritishda eng qiyin ish yozish emas — tarqatish ekan. Buni o'z tajribamda bildim: maqola tayyor bo'lgach uni saytga chiqarish kerak, keyin Telegram kanalga e'lon, keyin LinkedIn'ga post. Har biri alohida qo'l mehnati va har birida biror narsani unutish juda oson. Oxiri madrimov.uz uchun shunday pipeline qurdimki, endi men faqat Notion'da yozaman — sayt, Telegram va LinkedIn'ga tarqatishni avtomatika o'z zimmasiga oladi. Quyida shu real tizimning arxitekturasi, Make.com ssenariylari va yo'lda olingan saboqlar.
Muammo: bitta maqola — uchta alohida ish
Avval jarayon shunday edi: maqolani yozaman, saytga qo'lda joylayman, keyin esimga tushganda Telegram kanalga havola tashlayman, LinkedIn esa ko'pincha umuman unutiladi. Natija:
- Ko'p qo'l mehnati: bir maqola uchun uch-to'rt marta copy-paste.
- Izchillik yo'qoladi: kanalga bugun chiqadi, saytga ertaga — yoki aksincha.
- Ritm buziladi: band haftada umuman hech narsa chiqmaydi.
Kontent ishlab chiqarishda eng qimmat resurs — yozishga ketadigan diqqat. Tarqatish esa mexanik ish, demak uni mashina qilishi kerak.
Arxitektura: Notion — yagona kontent manbasi
Butun tizim bitta printsipga quriladi: kontent faqat bitta joyda yashaydi. Menda bu — Notion database. Har bir maqola — bitta yozuv, kerakli property'lar bilan:
- Title va Slug — sayt URL'i uchun.
- Uch tildagi kontent — o'zbekcha, ruscha, inglizcha (sayt uch tilli).
- Tags — multi-select, mavzular bo'yicha.
- Published — checkbox: maqola saytda ko'rinadimi-yo'qmi, shu hal qiladi.
- PublishDate — rejalashtirilgan chiqish sanasi.
- TgPosted va LiPosted — checkbox'lar: maqola kanalga chiqdimi-yo'qmi.
Notion bu yerda CMS rolini o'ynaydi: qulay muharrir, mobil ilova, versiyalar tarixi — hammasi tekinga. Kontentni boshqa hech qayerga nusxalamayman: sayt ham, ssenariylar ham aynan shu database'dan o'qiydi.
Next.js tomonida: ISR va dependency'siz fetch
Sayt Next.js'da. Notion'dan ma'lumotni rasmiy SDK'siz, oddiy fetch bilan olaman — API bitta POST so'rovdan iborat, buning uchun alohida dependency ushlab turish shart emas:
// lib/notion.ts
export async function getPublishedPosts() {
const res = await fetch(
`https://api.notion.com/v1/databases/${process.env.NOTION_DB_ID}/query`,
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.NOTION_TOKEN}`,
"Notion-Version": "2022-06-28",
"Content-Type": "application/json",
},
body: JSON.stringify({
filter: { property: "Published", checkbox: { equals: true } },
sorts: [{ property: "PublishDate", direction: "descending" }],
}),
}
);
if (!res.ok) throw new Error(`Notion API: ${res.status}`);
const data = await res.json();
return data.results;
}Yangilanish uchun ISR (Incremental Static Regeneration) yetarli:
// app/blog/page.tsx
export const revalidate = 300; // 5 daqiqaNotion'da Published belgiladingizmi — ko'pi bilan 5 daqiqadan keyin maqola saytda. Webhook, build trigger, qo'lda deploy — hech narsa kerak emas. Blog uchun 5 daqiqalik kechikish hech kimga xalaqit bermaydi, evaziga tizim juda sodda bo'lib qoladi.
Make.com: Telegram kanalga avtomatik teaser
Endi tarqatish qismi. @madrimovblog kanali uchun Make.com'da uchta moduldan iborat ssenariy bor, har kuni ertalab soat 9 da ishga tushadi:
- Notion — Query a Database:
Published = truevaTgPosted = falsebo'lgan yozuvlarni topadi, limit — 1 ta. - Telegram — Send a Message: teaser matni va
https://madrimov.uz/blog/{slug}havolasi bilan kanalga post yuboradi. - Notion — Update a Database Item: o'sha yozuvda
TgPosted = truebelgilaydi.
Filtr mantig'i Notion API tilida shunday ko'rinadi:
{
"and": [
{ "property": "Published", "checkbox": { "equals": true } },
{ "property": "TgPosted", "checkbox": { "equals": false } }
]
}Uchinchi qadam — dedup'ning yuragi: belgilamasak, ertaga ssenariy o'sha maqolani yana topadi va kanal spamga aylanadi. Mos yozuv topilmasa ssenariy shunchaki jim tugaydi — bu normal holat, xato emas.
LinkedIn: xuddi shu naqsh, boshqa checkbox
LinkedIn uchun alohida ssenariy, lekin naqsh aynan bir xil: Published = true & LiPosted = false → post yuborish → LiPosted = true. Farq faqat matn formatida — LinkedIn'ga inglizcha annotatsiya va biroz rasmiyroq ohang ketadi. Yangi tarqatish kanali qo'shish endi juda arzon: bitta checkbox property va bitta ssenariy nusxasi.
Navbat: "haftada bir maqola" ritmini avtomatika ushlaydi
Tizimning eng sevimli qismim. Ilhom kelganda ketma-ket ikki-uch maqola yozib qo'yaman, har biriga kelajakdagi PublishDate beraman, Published esa o'chiq qoladi. Haftalik ssenariy (dushanba ertalab) shuni qiladi:
Published = falsevaPublishDate <= bugunbo'lgan yozuvni topadi.- Unda
Published = truebelgilaydi.
Shu bitta checkbox o'zgarishi butun zanjirni ishga tushiradi: 5 daqiqada ISR maqolani saytga chiqaradi, ertasi kuni ertalabki ssenariy Telegramga, keyin LinkedIn'ga tarqatadi. Men ta'tilda bo'lsam ham blog "haftada bir maqola" ritmida yashayveradi. Bu — kontent navbati (queue): yozish ilhomga bog'liq bo'lsin, chiqish esa jadvalga.
Nega Make.com, o'z kodim emas?
Men dasturchiman, bu ssenariylarni cron va kichik skript bilan o'zim ham yoza olardim. Lekin ataylab yozmadim:
- Cron uchun server (yoki serverless funksiya) ushlab turish va uni monitoring qilish kerak — bu ham kichik bo'lsa-da infra.
- Make'da retry, xatolik logi va bajarilish tarixi qutidan chiqadi. Telegram API bir marta 500 qaytarsa, o'zi qayta uradi.
- Ssenariyni vizual ko'rish oson: olti oydan keyin ochib qarasam ham bir qarashda tushunaman.
Qachon o'z kodini yozgan ma'qul? Murakkab transformatsiyalarda (masalan, markdown'ni boshqa formatga render qilish), katta hajmda (Make operatsiya soniga pul oladi — minglab ishga tushishda qimmatlashadi) va nozik ma'lumotlar bilan ishlashda. Mening holatimda oyiga 30 ga yaqin operatsiya bor — bepul tarifga ham bemalol sig'adi.
Saboqlar
Idempotentlik — birinchi qoida. Har bir tarqatish kanali uchun alohida "chiqdi" checkbox'i. Busiz ssenariy qayta ishga tushsa (retry, qo'lda test), obunachilar bir postni ikki marta oladi. Checkbox filtri tufayli ikkinchi urinish shunchaki bo'sh natija qaytaradi va hech narsa yubormaydi.
Test yozuvlarni alohida belgilang. Bir kuni test uchun yaratgan "asdf" maqolam kanalga chiqib ketishiga oz qoldi. Endi test yozuvlarda maxsus teg bor va barcha filtrlar uni chiqarib tashlaydi. Avtomatika testni haqiqiy kontentdan ajrata olmaydi — buni siz qilishingiz kerak.
Property nomlari — API kontrakt. Notion'da property nomini o'zgartirish oson — bir klik. Lekin TgPostedni TelegramPostedga o'zgartirsangiz, Make ssenariysi ham, saytdagi kod ham indamay sinadi: Notion xato bermaydi, shunchaki bo'sh qiymat qaytaradi. Nomlarni kod tarafida bitta konstantalar fayliga yig'ing va Notion'da biror nomni o'zgartirishdan oldin ikki marta o'ylang.
Xulosa
Butun tizim: Notion database, Next.js'da 30 qator fetch kodi va Make'da uchta mayda ssenariy. Hech qanday maxsus server, hech qanday murakkab deploy zanjiri. Eng muhim natija esa texnik emas: yozish bilan tarqatish o'rtasidagi ishqalanish yo'qolgach, yozishning o'zi ko'paydi. Agar siz ham blog, kanal yoki boshqa kontent oqimini yuritsangiz — bir marta yozib, qolganini mashinaga topshiring.