【Notion API × WordPress】フォームの申込データを自動登録して簡易ワークフローを作る
この記事のAI要約
WordPressのフォーム送信データをNotionのデータベースに自動登録する仕組みを紹介します。フォームからのメール通知だけでは管理が煩雑になりやすく、申込者情報の一覧化や対応状況の共有に課題が生じます。この方法を使えば、セミナー申込や簡易申請の受付内容をNotion上で一元管理でき、フィルタやステータス管理も容易になります。Notionは直感的に使え、導入も手軽なため、規模の小さい業務ワークフローの構築に適しています。既存のWordPressサイトで手軽に運用効率を上げたい担当者に特に有用です。
gpt-4.1-miniによる自動要約
これまでに、WordPress上のフォームからのお問い合わせデータをCRMのリード情報として連携する方法や、CRMとWordPressの双方向同期のメソッドをご紹介してきました。
CRMとの連携は、営業管理や顧客管理を本格的に行ううえで非常に有効です。
問い合わせ後の追客、案件化、担当者の割り当て、履歴管理など、顧客接点を継続的に管理する場合には、CRMを中心にした設計が適しているケースが多くあります。
一方で、すべての業務において、そこまで本格的な仕組みが必要になるわけではありません。
例えば、セミナー申込、イベント受付、資料請求、社内外の簡易申請フォームなど、まずは「一覧で確認できる」「チームで共有できる」「対応状況を管理できる」程度の仕組みがあれば十分なケースもあります。
実際に弊社のお客様からも、
「CRMの導入はちょっと大掛かり」
「もっと簡易的にやる方法はない?」
という声を数多くいただきました。
そこで今回はWordPressのフォームとNotionを連携し、申込データを自動でデータベース化することで、簡易的な業務ワークフローを構築する方法をご紹介します。
INDEX
このメソッドを紹介する背景
Webサイトのフォームは、多くの場合「メール通知」のために使われています。
フォームから送信があると、管理者宛にメールが届き、担当者が内容を確認する。ここまでは一般的な運用です。
しかし、申込や問い合わせの件数が増えてくると、メール通知だけでは管理しづらくなってきます。
例えば、セミナー申込の場合を考えると、次のような作業が発生します。
- 申込メールを確認する
- 申込者情報を一覧に転記する
- 参加者数を集計する
- 担当者間で共有する
- 対応状況を更新する
- 必要に応じて備考やメモを追記する
このような作業は一つひとつは小さなものですが、毎回手作業で行っていると、それなりの負担になります。
また、メールは情報の蓄積や共有にはあまり向いていません。過去の申込を探す、特定のイベントだけを絞り込む、対応済み・未対応を管理する、といった用途では、どうしても限界があります。
そこで、フォームから送信されたデータを、そのままNotionのデータベースに登録します。
WordPressフォーム
↓
Notionデータベース
↓
一覧管理・共有・ステータス管理
この流れを作ることで、フォームを単なる通知手段ではなく、業務データの入口として扱うことができます。
Notionを利用するメリット
Notionを使うメリットは、導入のしやすさと柔軟性にあります。
本格的なCRMや業務システムは非常に強力ですが、その分、初期設定や運用ルールの整備、ユーザー教育などが必要になります。営業管理や顧客管理を本格化する場合には適していますが、すべての用途で最初からそこまでの仕組みが必要とは限りません。
Notionの場合、すでに社内で利用している企業も多く、データベースの作成やビューの切り替えも比較的直感的に行えます。
例えば、セミナー申込管理であれば、次のような項目を用意するだけでも運用できます。
| 会社名 | 申込者の所属会社 |
|---|---|
| 氏名 | 申込者名 |
| メールアドレス | 連絡先 |
| 電話番号 | 必要に応じた連絡先 |
| 備考 | 申込時の補足内容 |
| ステータス | 未対応 / 対応済 / 参加予定など |
このようなデータをNotion上に登録しておけば、担当者はブラウザ上で一覧を確認でき、必要に応じてフィルタや並び替えを行えます。
例えば、
- セミナーごとに申込者を絞り込む
- 未対応の申込だけを表示する
- 担当者ごとにビューを分ける
- 参加予定者だけを一覧化する
- 備考欄に対応メモを残す
といった使い方ができます。
また、Notionはチーム共有もしやすいため、「担当者だけがメールで把握している」という状態を避けやすくなります。申込状況をチーム全体で確認できるようになるだけでも、運用上のストレスはかなり減ります。
つまり、Notionは大規模な業務システムの代替というより、軽量な業務データベースとして使いやすいツールです。
実装方法の概要
ここからは、実装方法の概要を見ていきます。
実装の流れはシンプルです。
WordPressのフォーム送信後に、送信内容を取得し、Notion APIを使ってNotionデータベースに1件のレコードとして登録します。
全体像は次のようになります。
- WordPressフォームから申込
- フォーム送信完了時のフックを実行
- 入力内容を取得
- Notion API用のデータ形式に整形
- Notionデータベースに登録
実装イメージとしては、WordPress側でフォーム送信後の処理にフックし、wp_remote_post() を使ってNotion APIにリクエストを送信します。
add_action( 'mwform_after_send_xxx', 'intactis_mwform_connect_notion' );
if ( ! function_exists( 'intactis_mwform_connect_notion' ) ) {
function intactis_mwform_connect_notion( $Data ) {
// フォームの入力値を取得
// Notion API用に整形
// wp_remote_post() でNotionへ送信
}
}
フォームプラグインによって送信後フックの名称は変わりますが、考え方は同じです。
重要なのは、フォーム送信後に単にメールを送るだけではなく、送信データを業務データとして扱う処理を追加することです。
使用するAPI
今回利用する主なAPIは、次の2つです。
WordPress HTTP API
WordPressから外部サービスへHTTPリクエストを送るために、wp_remote_post() を使用します。
Notion APIへデータを送信する場合も、WordPressの標準関数を使うことで、外部ライブラリを追加せずに実装できます。
$response = wp_remote_post(
'https://api.notion.com/v1/pages',
[
'headers' => [
'Authorization' => 'Bearer ' . $token,
'Notion-Version' => '2022-06-28',
'Content-Type' => 'application/json',
],
'body' => wp_json_encode( $body ),
'timeout' => 20,
]
);
WordPress標準のHTTP APIを使うことで、WordPress環境に合わせたエラーハンドリングやタイムアウト設定も行いやすくなります。
Notion API
Notion側では、データベースに新しいページを作成するAPIを利用します。
Notionのデータベースは、API上では「ページの集合」として扱われます。そのため、フォームから送信された1件の申込情報を、Notionデータベース上の1レコードとして追加するイメージになります。
送信するデータは、Notionデータベースのプロパティ型に合わせて組み立てます。
例えば、会社名や備考は rich_text、氏名をタイトル項目として扱う場合は title、メールアドレスは email、電話番号は phone_number といった形です。
$body = [
'parent' => [
'database_id' => $database_id,
],
'properties' => [
'氏名' => [
'title' => intactis_build_notion_rich_text( $name ),
],
'会社名' => [
'rich_text' => intactis_build_notion_rich_text( $company ),
],
'メールアドレス' => [
'email' => $email,
],
'電話番号' => [
'phone_number' => $tel,
],
'備考' => [
'rich_text' => intactis_build_notion_rich_text( $message ),
],
],
];
ここで注意が必要なのは、Notion側のプロパティ名とAPIで指定するキー名を一致させる必要があるという点です。
Notion側の列名が「氏名」なのに、API側で「名前」と指定すると登録に失敗します。実装前に、Notionデータベースのプロパティ名と型を整理しておくことが重要です。
実装上の注意点
仕組み自体はシンプルですが、実際に運用するためにはいくつか工夫が必要です。
Notionの型に合わせてデータを整形する
Notion APIでは、プロパティの型ごとに送信するデータ形式が異なります。
例えば、テキスト項目とメール項目では構造が違います。
'会社名' => [
'rich_text' => intactis_build_notion_rich_text( $company ),
],
'メールアドレス' => [
'email' => $email,
],
このように、Notion側の型に合わせてデータを整える必要があります。
従って、テキスト系の項目については共通関数を用意しておくと便利です。
if ( ! function_exists( 'intactis_build_notion_rich_text' ) ) {
function intactis_build_notion_rich_text( $value ) {
$value = (string) $value;
if ( '' === $value ) {
return [];
}
return [
[
'text' => [
'content' => $value,
],
],
];
}
}
のような関数を用意しておくことで、title や rich_text の値を毎回同じ形で組み立てられます。
また、実装が読みやすくなるだけでなく、空文字の場合の処理も統一できます。
フォームの値をそのまま信用しすぎない
フォームから送信された値は、必ずサニタイズしてから利用します。
$company = sanitize_text_field( $company );
$name = sanitize_text_field( $name );
$email = sanitize_email( $email );
$tel = sanitize_text_field( $tel );
$message = sanitize_textarea_field( $message );
また、フォームプラグインによっては、電話番号やチェックボックスなどが配列で渡ってくることがあります。
その場合は、Notionに送る前に文字列として扱いやすい形に整形します。
if ( is_array( $value ) ) {
$value = array_map( 'sanitize_text_field', $value );
$value = array_filter( $value, static function( $item ) {
return '' !== trim( $item ) && '-' !== trim( $item );
} );
$value = implode( '-', $value );
}
このような処理を挟むことで、Notion側に不要な文字列や空データが入るのを防げます。
関連する投稿情報から日付を取得する
今回の実装では、単純にフォームで入力された値だけをNotionに送るのではなく、WordPress内部の情報も組み合わせています。
例えば、セミナー申込の場合、申込ページに渡された投稿IDから、対象セミナーの日付を取得してNotionに登録する、といったことができます。
if ( ! function_exists( 'intactis_get_schedule_date_for_notion' ) ) {
function intactis_get_schedule_date_for_notion( $post_id ) {
$post_id = absint( $post_id );
if ( empty( $post_id ) ) {
return '';
}
$post = get_post( $post_id );
if ( ! $post || 'publish' !== $post->post_status ) {
return '';
}
$date = mysql2date( 'Y-m-d', $post->post_date );
return $date ? $date : '';
}
}
この関数では、投稿IDをもとに投稿情報を取得し、投稿日時をNotionで扱いやすい Y-m-d 形式に変換しています。
このようにしておくと、申込者に日付を選ばせる必要がありません。
例えば、
セミナー詳細ページ
↓
申込ページ
↓
フォーム送信
という導線の場合、どのセミナーに対する申込なのかは、WordPress側ですでに分かっています。
その情報を使えば、ユーザーに余計な入力をさせずに、正しいセミナー日をNotionに登録できます。
これは入力ミスを防ぐうえでも有効です。
エラーログを適切に残す
外部API連携では、通信エラーや認証エラーが起こる可能性があります。
例えば、
- Notion APIキーが無効になった
- データベースの権限が変更された
- Notion側のプロパティ名が変わった
- ネットワークエラーが発生した
といったケースです。
そのため、APIのレスポンスコードを確認し、エラー時にはログを残すようにします。
if ( is_wp_error( $response ) ) {
error_log( '[intactis_mwform_connect_notion] WP_Error: ' . $response->get_error_message() );
return;
}
$response_code = wp_remote_retrieve_response_code( $response );
$response_body = wp_remote_retrieve_body( $response );
if ( $response_code < 200 || $response_code >= 300 ) {
error_log( '[intactis_mwform_connect_notion] API Error (' . $response_code . '): ' . $response_body );
return;
}
成功ログを毎回残すとログが増えすぎることもあるため、本番運用ではエラー時だけログを残す設計でもよいと思います。
活用例
下記はスポーツチームのサイトでチーム外から練習参加メンバーを募るためのビジター募集フォームの連携例です。
こちらのサイトでは毎回ビジターフィーの管理のためにこの連携を使用し、参加メンバー管理と当日のフィー請求を効率化しています。
まとめ
WordPressのフォームから送信されたデータをNotionに自動登録することで、メール通知だけでは難しかった一覧管理、共有、ステータス管理がしやすくなります。
本格的なCRMや業務システムが必要なケースもありますが、用途によっては、よりシンプルな構成でも十分に運用できる場合があります。
今回のように、WordPressとNotion APIを組み合わせることで、既存のWebサイトを活かしながら、軽量な業務ワークフローを構築できます。
重要なのは、どのツールを使うかだけではなく、業務の流れをどう設計するかです。
フォームから届く情報を、ただメールで受け取るだけで終わらせず、チームで活用できるデータとして扱う。
その小さな設計変更だけでも、日々の運用はかなり変わります。
弊社では、業務課題に応じたWebサイトの活用方法や、外部サービスとの連携を含めた実装をご提案しています。
フォーム運用やデータ連携でお困りのことがありましたら、お気軽にご相談ください。