この記事では、Notion APIを使ってある条件下でLINE通知ができる仕組みを構築する方法を紹介しています。
実際のコードサンプルも用意しますし、全て無料の範囲内でできるので参考にしてみてください。
この記事を読むメリット
- Notion APIを使ってLINE通知する方法が分かる
- LINE Notifyの代替案が分かる
きっかけ
最近Notion APIを触り始めて、何か便利になることを作れないかChatGPTに聞いてみたところ、今回の記事内容を一番に勧められました。
確かに、ToDoリストやタスク管理で期限が近かったり切れているものをLINEで通知してくれる仕組みは便利かもなと思いました。
Notionのリマインダーで通知もできますが、LINEの方がより通知に敏感だし、LINE通知の仕組みも勉強してみたかったのでこの仕組みを構築してみようと思います。
そしてLINE通知する方法でLINE Notifyというものがあったのですが、2025年3月でサービスが終了ということだったので代替案としてMessaging APIというものを使います。
Notion APIでLINE通知する構成
まずは今回実現したいことを整理します。
- Notionのタスク管理データベースの作成
- 17時に「今日」期限のタスクがあるかチェックして、あればLINEに通知
- 毎日17時に定期的に実行
続いては構成を紹介します。

使うものは、「Vercel」、「Notion API」、「LINE Messging API」になります。
また、Vercelの「Cron Jobs」というもので定期実行が可能なのでそれを使ってみます。
Vercelと相性が良いのと、今後複数のユーザー向けにアプリ化できることを想定して、Next.jsを使ってコードを書きます。
実装の流れ
続いて今回の実装の流れを簡単にまとめました。
- LINE Messaging APIのセットアップ
- Notionでタスクデータベース作成
- Notion Integrationを作成してタスクデータベースと接続
- Cron Jobsを作成
- Vercelにデプロイ
こんな感じで実装していきます。
LINE Messaging APIのセットアップ
まずはLINE Messaging APIのセットアップを行います。
このセットアップで、LINE公式アカウントからメッセージを送信できるようになります。
無料プランでも月に200通までは送信できるので個人で利用する分には困らなさそうでした。
個人に送信だけでなく、グループに送信も可能だったので今後の活用の幅は広そうです。
セットアップの流れは以下になります。
- LINE Official Account ManagerにLINEアカウントでログイン
- LINE公式アカウントを新規作成する
- LINE Messaging APIをLINE Developerで設定する
自分も初めてだったのでいろんな記事を参考にしました。
参考になった記事を共有しておきます。
全てのセットアップが完了して、LINE DevelopersのMessaging API設定の下にあるチャネルアクセストークンが取得できるようになればOKです。

Notionでタスクデータベース作成
続いては、Notionでタスクデータベースを作成します。

今回はシンプルに「タスク名」「期限」だけを入れるデータベースを作成しました。
必須なものは期限を設定する「日付」プロパティなので、それ以外の担当者やカテゴリーを設定するプロパティがあっても問題ないです。
タスク管理データベースをもっと機能豊富なものも検討したいという方は以下記事も参考にしてみてください。
Notion Integrationを作成してタスクデータベースと接続
続いてはNotion Integrationを作成してNotion APIが利用できる状態にします。
手順は以下になります。
- Notionでインテグレーションを作成する
- 対象データベースとインテグレーションを接続する
細かい手順は以下記事で紹介しているので参考にしてみてください。
以下画像のように「アクティブな接続」に作成したインテグレーションが表示されていればOKです。

Notion側でのAPIを使う準備はこれで完了です。
Scheduled Functionを作成
続いては定期的に処理実行させる仕組みとしてVercelの「Scheduled Function」を作成します。
このあとVercelにデプロイするので具体的なコードはNext.jsを使って記述していきます。
まずはNext.jsのセットアップから。
npx create-next-app@latest notion-line-task-notify-bot --typescript --app
cd notion-line-task-notify-bot
npm install
「notion-line-task-notify-bot」の部分はプロジェクト名なので自由に設定していただいて良いです。
今回のプロジェクト構成はこんな感じです。
notion-line-task-notify-bot/
├── app/
│ └── api/
│ └── notify/
│ └── route.ts # Cron Jobs
├── lib/
│ ├── notion.ts # Notion API ラッパー
│ └── line.ts # LINE送信処理
├── .env.local # 環境変数
├── vercel.json # スケジュール設定
└── ...
そしてコードの内容はこんな感じです。
- .envにトークンやIDをトークン
- Notion APIで「今日」期限のタスクを取得する処理
- LINEに通知する処理
- 上記を毎日17時に実行するスケジュール設定
- Vercelにデプロイ
.envにトークンやIDをトークン
まずは.envに必要な情報を登録します。
ローカルでも動きを確認するので、以下を.env.localに登録します。
NOTION_API_KEY=xxxx // Notionインテグレーションシークレットキー
NOTION_DATABASE_ID=xxxxxxxxxxxxxxxx // NotionデータベースID
LINE_CHANNEL_ACCESS_TOKEN=xxxxx // LINEチャネルアクセストークン
LINE_USER_ID=Uxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Uから始まるLINEユーザーID
LINEユーザーIDはLINE Developersの中の「あなたのユーザーID」という項目があるので、それをコピーします。
Notion APIで「今日」期限のタスクを取得する処理
続いてはNotion APIでタスクを取得する処理を書いていきます。
日付フォーマットのために「date-fns」を利用します。
以下を実行してインストールします。
npm install date-fns
続いてnotion.tsを以下のようにします。
import { format } from 'date-fns';
import 'dotenv/config';
export async function getTodayTasks(): Promise<string[]> {
const notionApiKey = process.env.NOTION_API_KEY!;
const databaseId = process.env.NOTION_DATABASE_ID!;
const today = format(new Date(), 'yyyy-MM-dd');
const res = await fetch(`https://api.notion.com/v1/databases/${databaseId}/query`, {
method: 'POST',
headers: {
Authorization: `Bearer ${notionApiKey}`,
'Notion-Version': '2022-06-28',
'Content-Type': 'application/json',
},
body: JSON.stringify({
filter: {
property: '期限', // タスクの期日プロパティ名
date: {
equals: today,
},
},
}),
});
const data = await res.json();
const tasks = data.results.map((page: any) => {
const titleProp = page.properties['タスク名']; // タスク名プロパティ
const text = titleProp?.title?.[0]?.plain_text ?? '(無題)';
return `「${text}」`;
});
return tasks;
}
一旦はタスク名を返すようにしています。
プロパティの箇所はデータベースを確認しながら入れてください。
LINEに通知する処理
続いてはLINEに通知する処理を作成していきます。
コードはこちら。
export async function sendLine(text: string) {
const LINE_API = 'https://api.line.me/v2/bot/message/push';
const message = `本日期限のタスクは以下です。\n\n${text}`;
const res = await fetch(LINE_API, {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.LINE_CHANNEL_ACCESS_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to: process.env.LINE_USER_ID,
messages: [{ type: 'text', text: message }],
}),
});
if (!res.ok) {
const error = await res.text();
console.error('LINE送信失敗:', error);
}
}
引数で受け取ったテキストをLINE通知のメッセージとして送信します。
毎日17時に実行するスケジュール設定
続いてはスケジュール設定をします。
route.tsに以下のように設定します。
import { sendLine } from '../../lib/line';
import { getTodayTasks } from '../../lib/notion';
export async function GET(request: Request) {
const tasks = await getTodayTasks();
if (tasks.length > 0) {
const message = tasks.map((t) => `🔔 ${t}`).join('\n');
await sendLine(message);
}
return new Response('OK', { status: 200 });
}
続いてvercel.jsonに以下のように設定します。
{
"crons": [
{
"path": "/api/notify",
"schedule": "0 8 * * *"
}
]
}
「notify」の箇所はフォルダ名になります。
時間はUTCなので日本時間で換算するなら-9時間したものを入れます。
Vercelのフリープランの場合、設定できるcronは1アカウントにつき1つらしいので他に設定があると、そもそもビルドエラーになります。
さらにフリープランの場合は、17時ちょうどに設定していても、実際に実行されるのは17-18時のどこかのタイミングらしいです。

ぴったりの時間にしたい場合は有料プランにする必要があります。
VercelにデプロイしてCronのテスト
これでVercelにデプロイします。
.env.localに書いていた内容はEnviroment Variablesに登録します。
デプロイが完了したら、Cronのテスト実行をしてみます。
Vercelの「Settings」の「Cron Jobs」ページに登録されたCronが表示されます。

「Run」をクリックすると、先ほど登録した処理が実行されます。
期限が「今日」のタスクがあればLINEに通知がくるはずです。

Notion APIとLINE Messaging APIで通知までできた
いかがだったでしょうか。
無料プランだと、いくつか制約がありますが、設定までが簡単にできるのでおすすめです。
今回、LINE Messaging APIとVercelのCronは初めて利用しましたが、ドキュメントを見ながらやるとスムーズにいきました。
AIで何でもかんでも聞いていましたが、公式ドキュメントでピンポイントで欲しい内容読み取れた方が安全かつ早い場合もあるなと感じました。
使い方が大事ですね。
今後の拡張として、複数ユーザーにも利用できるような仕組みや、LINEメッセージの内容にNotionデータベースの内容を盛り込むなどできるなと思ったのでやってみようと思います。
Notion APIの活用方法として、ぜひ参考にしてみてください。