SYNON 記事 マーケティングオートメーション
FUNCTIONAL SPECIFICATION

マーケティングオートメーションサービス
機能仕様書

Version 1.2 作成日: 2026-08-13 想定利用形態: 自社利用ツール

マーケティングオートメーションサービス 機能仕様書

項目 内容
文書名 マーケティングオートメーションサービス 機能仕様書
バージョン 1.2
作成日 2026-08-13
想定利用形態 自社利用ツール(社内営業支援)
ステータス レビュー待ち

目次

  1. はじめに
  2. システム概要
  3. 機能要件
  4. 画面仕様
  5. データベース設計
  6. 内部API設計
  7. 外部連携仕様
  8. 非機能要件
  9. 法令・運用上の注意事項
  10. 今後の検討事項
  11. 改訂履歴

1. はじめに

1.1 目的

本書は、自社の新規開拓営業を効率化するマーケティングオートメーション(以下「本システム」)の機能仕様を定義する。本システムは、企業リストの収集・管理からメール/問い合わせフォームによるアプローチ実行、効果分析までを一元的に支援する。

1.2 スコープ

本書が対象とする範囲は以下のとおり。

以下は本書のスコープ外とする。

1.3 用語定義

用語 定義
企業(Company) アプローチ対象となる法人。本システムの管理単位
アプローチ(Approach) 1企業に対する1回の営業接触(メール送信またはフォーム送信)
キャンペーン 同一テンプレート・同一条件で複数企業にまとめてアプローチする単位
リストアップ 都道府県・業種を条件にインターネットから企業情報を収集する処理
連絡先抽出 企業サイトからサイトURL・問い合わせフォームURL・メールアドレスを抽出する処理
返答 アプローチに対する相手企業からの返信(メール返信・フォーム経由の連絡等)
ADコード 本文内URLに自動付与する計測パラメータ一式(UTMパラメータ+アプローチ単位の追跡コード)
クリック反応 アプローチ本文内のリンクがクリックされたこと。返答に準ずる「反応」として分析対象とする
SendGrid メール送信基盤として利用する外部サービス。本システムからメール送信API(v3)を呼び出す
GA4 Google Analytics 4。自社サイトへのアクセスログ収集・取得に利用する

2. システム概要

① 企業リスト収集(F-01 自動 / F-03 CSV)② 連絡先自動抽出(F-02)③ 企業検索・対象選定(F-04)④ アプローチ実行(メール / フォーム)⑤ 返答管理・効果分析(F-04 / F-07)
図1 全体業務フロー(機能の連携イメージ)

2.1 システム構成(想定)

ユーザー(ブラウザ)本システムWebフロントエンド(SPA)APIサーバ(REST API)データベース(SQLite・WALモード)ジョブキュー非同期ワーカー収集 / 抽出 / フォーム送信/ GAデータ同期企業情報ソース(検索・公開DB)対象企業サイト(クロール / フォーム)SendGrid API(メール送信)Google Analytics(GA4)HTTPSジョブ登録結果保存検索・収集クロール / フォーム送信メール送信APIData API(定期取得)Event Webhook通知(送達 / 開封 / クリック / バウンス)
図2 システム構成図(想定)

2.2 技術スタック(想定)

レイヤ 想定技術 備考
フロントエンド React または Vue(SPA) 画面仕様は特定FWに依存しない
バックエンド Node.js(NestJS)/ Python(FastAPI)等 REST API
DB SQLite(WALモード) 単一ファイルDB。書き込みはアプリケーション経由で直列化。全文検索はFTS5を利用。将来のRDBMS移行に備えORM経由でアクセスする
非同期処理 ジョブキュー(BullMQ / Celery 等) 収集・抽出・フォーム送信・GA同期は非同期実行
クローラ ヘッドレスブラウザ(Playwright 等) フォーム検出・フォーム送信に使用
メール送信 SendGrid API(v3) 本システムはSMTPを直接持たない
アクセス解析 Google Analytics 4(Data API) 自社サイトのアクセスログを定期取得

2.3 想定ユーザーと権限

自社利用のため権限は最小構成とする。

ロール 権限
管理者(admin) 全機能。ユーザー管理、環境設定(SendGrid APIキー・GA連携設定等)、データ削除
一般(member) 企業管理・アプローチ実行・テンプレート管理・分析閲覧

3. 機能要件

機能一覧を以下に示す。詳細は各節を参照。

機能ID 機能名 概要
F-01 企業リストアップ 都道府県・業種を条件にインターネットから企業情報を収集・保存
F-02 連絡先自動抽出 企業サイトからサイトURL・問い合わせフォームURL・メールアドレスを抽出・保存
F-03 企業情報CSVインポート CSVファイルから企業情報を一括登録
F-04 企業検索・アプローチ管理 企業の検索、アプローチ履歴・ステータス管理、メール/フォーム営業の実行
F-05 メールテンプレート管理 メール営業用テンプレートの複数保存・管理
F-06 フォームテンプレート管理 フォーム営業用テンプレートの複数保存・管理
F-07 分析 月別・四半期別・半期別・年間のアクセス数・返答率・クリック反応率の集計・可視化
F-08 メール送信(SendGrid API連携) SendGridメール送信APIの呼び出しによるメール送信と送達イベント管理
F-09 Google Analytics連携 本文内URLへのADコード自動付与と、GA4アクセスログの収集・クリック反応分析
F-10 環境設定 SendGrid APIキー・GA連携情報等の登録・検証・管理

3.1 F-01 企業リストアップ

3.1.1 概要

ユーザーが都道府県と業種を指定すると、インターネット上の公開情報から該当する企業をリストアップし、企業マスタに保存する。

3.1.2 入力

項目 必須 内容
都道府県 47都道府県から1つ以上選択(複数選択可)
業種 業種マスタから1つ以上選択(複数選択可)。日本標準産業分類(大分類・中分類)をベースとする
最大取得件数 - 1回の収集ジョブの上限件数(デフォルト100件、最大1,000件)
キーワード - 任意の絞り込みキーワード(例:「製造 金属加工」)

3.1.3 処理仕様

条件を入力(都道府県・業種・上限件数)収集ジョブを非同期起動情報ソースを検索し企業候補を収集※ レート制限・robots.txt遵守既存データと重複?重複スキップ(重複件数に加算)→ 次の候補の処理へ新規企業マスタへ保存(source=auto)連絡先抽出ジョブを自動起動(F-02)完了(進捗・件数を画面表示)
図3 企業リストアップ(F-01)処理フロー
  1. ユーザーが条件を指定して「リストアップ開始」を実行すると、収集ジョブを非同期で起動する。
  2. ワーカーは検索エンジンAPI・公開企業データベース等の企業情報ソースを検索し、条件に合致する企業の候補を収集する。
  3. 収集した各候補について、以下を取得する:企業名、住所(都道府県)、業種、サイトURL(判明した場合)、電話番号(判明した場合)。
  4. 既存データとの重複判定を行う(判定キー:企業名の正規化文字列+都道府県。サイトURLのドメイン一致も重複とみなす)。
  5. 重複しない企業を企業マスタに 収集元=auto として保存する。
  6. 保存完了後、各企業に対して連絡先抽出ジョブ(F-02)を自動起動する。
  7. ジョブの進捗(待機中/実行中/完了/失敗、収集件数、重複スキップ件数)を画面で確認できる。

3.1.4 制約・例外

3.2 F-02 連絡先自動抽出

3.2.1 概要

企業のサイトURLを起点にクロールし、問い合わせフォームURLとメールアドレスを自動抽出して企業情報に保存する。

3.2.2 起動契機

3.2.3 処理仕様

抽出ジョブ開始(自動 / CSVオプション / 手動)サイトURL登録済?なしWeb検索で公式サイトを推定(確度低 → 要確認フラグ)ありサイトをクロール(最大20ページ・深さ2階層)問い合わせフォームURL抽出(リンク・URLパターン+form検証)メールアドレス抽出(mailto:・本文 / info@等を優先)抽出結果を保存抽出ステータス更新完了(ステータス: 抽出済 /フォーム無し / メール無し / 失敗)
図4 連絡先自動抽出(F-02)処理フロー
  1. サイトURL未設定の企業は、企業名+都道府県でWeb検索し公式サイトを推定する。推定確度が低い場合は「サイトURL要確認」フラグを立てる。
  2. サイトのトップページおよび主要ページ(最大20ページ、深さ2階層まで)をクロールする。
  3. 問い合わせフォームURLの抽出:
  4. リンクテキスト・URLパスのパターンマッチ(「お問い合わせ」「お問合せ」「contact」「inquiry」「form」等)
  5. ページ内に <form> 要素と入力フィールド(氏名・メール・本文相当)が存在することを確認したURLを採用
  6. メールアドレスの抽出:
  7. ページ本文・mailto: リンクからメールアドレス形式の文字列を抽出
  8. 複数検出時は優先順位(info@ > contact@ > sales@ > その他)で代表アドレスを決定し、全件を候補として保存
  9. 抽出結果を企業情報に保存し、抽出ステータス(未抽出/抽出済/抽出失敗/フォーム無し・メール無し)を更新する。

3.2.4 出力項目

項目 内容
サイトURL 公式サイトのトップURL
問い合わせフォームURL 検出したフォームページのURL(複数候補時は代表1件+候補リスト)
メールアドレス 代表メールアドレス+検出された全候補
抽出日時 最終抽出実行日時
抽出ステータス 未抽出/抽出済/抽出失敗/フォーム無し/メール無し

3.3 F-03 企業情報CSVインポート

3.3.1 概要

CSVファイルをアップロードして企業情報を一括登録する。

3.3.2 CSVフォーマット

文字コードはUTF-8(BOM付き可)およびShift_JISに対応する。1行目はヘッダ行とする。

列名 必須 内容
企業名 法人名
都道府県 47都道府県名(表記ゆれは正規化:「東京」→「東京都」等)
業種 - 業種マスタ名称と突合。未一致時は「その他」+元の値をメモに保持
サイトURL - http(s)形式
問い合わせフォームURL - http(s)形式
メールアドレス - RFC準拠形式チェック
電話番号 - 任意形式
住所 - 任意テキスト
メモ - 任意テキスト

3.3.3 処理仕様

CSVファイルをアップロード(UTF-8 / Shift_JIS・最大10,000行)バリデーション(必須・形式・重複)結果プレビュー(正常 / エラー / 重複の件数)エラー行のみのCSVをダウンロード可重複時の動作を選択(スキップ / 空欄のみ補完)インポート実行(source=csv)連絡先の自動抽出オプションON?はい抽出ジョブを起動(F-02)いいえ完了(結果サマリ表示)
図5 企業情報CSVインポート(F-03)処理フロー
  1. アップロード後、まずバリデーション結果のプレビューを表示する(正常行数/エラー行数/重複行数)。
  2. エラー行(必須欠落・形式不正)は行番号と理由を一覧表示し、エラー行のみのCSVをダウンロードできる。
  3. 重複判定はF-01と同一ロジック。重複時の動作は「スキップ/上書き(空欄項目のみ補完)」をインポート時に選択できる。
  4. ユーザーが「インポート実行」を確定した時点で正常行を 収集元=csv として保存する。
  5. オプション「連絡先を自動抽出する」ON時は、サイトURL・フォームURL・メールのいずれかが欠けている行に対しF-02を起動する。
  6. 1ファイルの上限は10,000行・10MBとする。

3.4 F-04 企業検索・アプローチ管理

3.4.1 概要

保存済みの企業を検索し、過去のアプローチ有無・状況を確認したうえで、メール営業またはフォーム営業を実行する。

3.4.2 検索条件

条件 内容
キーワード 企業名・メモの部分一致
都道府県 複数選択
業種 複数選択
アプローチステータス 複数選択(下記ステータス定義参照)
連絡先の有無 メールあり/フォームあり/両方なし
収集元 auto / csv / manual
最終アプローチ日 期間指定(例: 90日以上アプローチなし)

検索結果は一覧表示(ページング、既定50件/頁)し、並び替え(企業名/最終アプローチ日/登録日)に対応する。検索結果はCSVエクスポートできる。

3.4.3 アプローチステータス定義

初期値未アプローチアプローチ済(返答待ち)返答あり商談中成約見送りアプローチ不可(送信対象から除外)アプローチ実行(自動)返答登録手動手動配信停止・バウンス(自動)/ 手動※ ステータスは手動でも変更可能(全遷移を履歴に記録)。「アプローチ不可」はすべてのステータスから遷移し、 以後のメール / フォーム一括送信の対象から自動的に除外される。
図6 アプローチステータス遷移図(F-04)

企業ごとに以下のステータスを保持する。ステータスはアプローチ実行・返答登録により自動更新され、手動変更も可能とする。

ステータス コード 内容 遷移契機
未アプローチ not_approached 一度もアプローチしていない 初期値
アプローチ済(返答待ち) approached メールまたはフォームを送信済み アプローチ実行(自動)
返答あり replied 相手から返答があった 返答登録(手動/自動)
商談中 negotiating やり取りが進行中 手動
成約 won 成約に至った 手動
見送り lost 断られた・見込みなし 手動
アプローチ不可 do_not_contact 配信停止依頼・連絡先無効等。以後の送信対象から除外 手動/バウンス・配信停止(自動)

3.4.4 アプローチ実行

対象企業を選択(検索結果から複数選択)自動除外(連絡先なし・アプローチ不可・送信済)アプローチ手段メール営業フォーム営業メールテンプレート選択差し込みプレビュー確認本文URLへADコード付与(F-09)→ SendGrid送信API呼び出し(F-08)受付結果を記録(失敗時は最大3回リトライ)フォームテンプレート選択実行モード半自動(既定)自動フォームへ自動入力ユーザー確認のうえ送信項目自動マッピング→ 自動送信失敗時CAPTCHA検出・失敗時は手動対応待ち一覧へ送信成功アプローチ履歴に記録ステータスを「返答待ち」へ更新
図7 アプローチ実行(キャンペーン)フロー(F-04)

メール営業:

  1. メールテンプレート(F-05)を選択する。
  2. 差し込み変数を展開したプレビューを対象企業ごとに確認できる。
  3. 送信対象からの自動除外: メールアドレス未登録/do_not_contact/同一テンプレートで送信済(オプション)。
  4. 本文内URLにADコードを自動付与し(F-09)、SendGridメール送信API(F-08)を呼び出して、結果(受付成功/失敗)をアプローチ履歴に記録する。
  5. 企業ステータスを approached に更新する。

フォーム営業:

  1. フォームテンプレート(F-06)を選択する。
  2. 実行モードは2種類とする:
  3. 半自動モード(既定): システムがフォームページを開き、テンプレート内容を各項目へ自動入力した状態でユーザーに提示。ユーザーが内容と送信可否を確認して送信する。
  4. 自動モード: ワーカーがフォーム項目を自動マッピングして送信まで実行する。CAPTCHA検出時・項目マッピング失敗時は自動送信を中止し「手動対応待ち」として一覧化する。
  5. 本文内URLにはメール営業と同様にADコードを自動付与する(F-09)。
  6. 送信結果(送信済/送信失敗/CAPTCHAによりスキップ/手動対応待ち)をアプローチ履歴に記録し、ステータスを更新する。

3.4.5 アプローチ履歴・返答管理

3.5 F-05 メールテンプレート管理

3.5.1 概要

メール営業に使用するテンプレートを複数保存・管理する。

3.5.2 項目

項目 必須 内容
テンプレート名 管理用名称(一意)
件名 差し込み変数使用可
本文 テキスト形式(HTMLメールは将来拡張)。差し込み変数使用可
差出人名 - 未指定時は環境設定(F-10)の既定値
返信先アドレス - 未指定時は環境設定(F-10)の既定値
ステータス 下書き/有効/アーカイブ

3.5.3 差し込み変数

本文・件名内で以下の変数を使用できる。送信時に企業情報で展開する。

変数 展開内容
{{company_name}} 企業名
{{prefecture}} 都道府県
{{industry}} 業種
{{sender_name}} 差出人担当者名
{{sender_company}} 自社名

3.6 F-06 フォームテンプレート管理

3.6.1 概要

フォーム営業に使用するテンプレートを複数保存・管理する。フォームの標準的な入力項目に対応する値のセットとして定義する。

3.6.2 項目

項目 必須 内容
テンプレート名 管理用名称(一意)
会社名 自社名
担当者名(姓・名) 送信者の氏名
ふりがな(せい・めい) - かな・カナ両対応
メールアドレス 返信受取用アドレス
電話番号 ハイフンあり/なし両形式を保持
郵便番号・住所 - フォームに項目がある場合に使用
部署・役職 - 同上
件名 - 問い合わせ件名欄がある場合に使用
本文 営業メッセージ。差し込み変数使用可(F-05と同一変数)。本文内URLはADコード自動付与の対象(F-09)
ステータス 下書き/有効/アーカイブ

3.6.3 フォーム項目自動マッピング

自動モード(F-04)では、フォームの各入力欄をラベル・name属性・placeholder等から解析し、テンプレート項目へマッピングする。

3.7 F-07 分析

3.7.1 概要

アプローチ活動の成果を期間別に集計・可視化する。

3.7.2 集計期間

四半期・半期・年度の起点(1月始まり/4月始まり)は環境設定で選択できる(既定: 4月始まり)。

3.7.3 指標定義

指標 定義
アプローチ数 期間内に実行したアプローチ件数(メール受付成功+フォーム送信成功)。手段別内訳を表示
アクセス数 アプローチ起点の自社サイト等へのアクセス数。計測リダイレクト(F-09)による即時計測値(速報)と、GA4同期による確定値の2段構成で表示する
クリック反応数 期間内に本文内リンクをクリックした企業数(アプローチ単位で重複排除)。計測リダイレクト・SendGridクリックイベント・GA4ログを統合して判定する(F-09)
クリック反応率 クリック反応数 ÷ アプローチ数(%)
返答数 期間内に「返答あり」となったアプローチ件数
返答率 返答数 ÷ アプローチ数(%)。返答はアプローチ実行日の属する期間に帰属させる
拡張返答率 (返答数+クリック反応数)÷ アプローチ数(%)。環境設定「クリックを返答に含める」ON時に返答率と併記表示する(F-09)
ステータス内訳 期間内アプローチ対象企業の現在ステータス構成比

3.7.4 画面仕様

分析ダッシュボード(画面イメージ・サンプル値)月別四半期半期年間期間: 2026-03 〜 2026-08アプローチ数1,284 件アクセス数402 件クリック反応178 社返答数96 件返答率7.5 %01002000%5%10%18026-0322026-0416026-0524026-0621026-0727426-08アプローチ数(件・左軸)返答率(%・右軸)手段別内訳(アプローチ数)メール 62%フォーム 38%※ 表示値はサンプル。アクセス数は速報値(リダイレクト計測)とGA4確定値を切替表示。下部にテンプレート別・業種別等のクロス集計表(CSV可)
図8 分析ダッシュボード 画面イメージ(F-07)

3.8 F-08 メール送信(SendGrid API連携)

3.8.1 概要

メール送信は自前のSMTPを使用せず、SendGridのメール送信API(v3 Mail Send)を呼び出して行う。APIの詳細インターフェースは7章に定義する。

3.8.2 処理仕様

  1. メール営業実行時、対象企業ごとにテンプレートの差し込み変数を展開し、本文内URLへADコードを付与(F-09)したうえで、メール送信APIへ1件ずつ登録する。
  2. API呼び出し結果(X-Message-Id・受付成否)をアプローチ履歴に保存する。custom_args にキャンペーンID・アプローチID・追跡コードを設定し、後続イベントとの突合キーとする。
  3. 失敗時は指数バックオフで最大3回リトライする。レート超過(429)時は Retry-After に従う。リトライ後も失敗した場合は「送信失敗」として一覧化し、再実行できる。
  4. SendGridのEvent Webhook(送達・開封・クリック・バウンス・スパム報告・配信停止)を受信し、アプローチ履歴と分析指標に反映する。
  5. バウンス(恒久的エラー)が通知された企業のメールアドレスは「無効」フラグを立て、以後の送信対象から除外する。スパム報告・配信停止の通知を受けた企業はステータスを do_not_contact に更新する。
  6. SendGridのAPIキー等の認証情報は環境設定(F-10)で管理する。

3.9 F-09 Google Analytics連携(リンク自動計測)

3.9.1 概要

メール本文・フォーム本文に含まれるURLに、送信時に計測パラメータ(ADコード)を自動付与する。リンクがクリックされると、本システムでアクセスを即時計上したうえで自社サイトへ誘導し、自社サイトに設置したGoogle Analytics(GA4)の計測タグでアクセスログに記録される。本システムはGA4からアクセスログを定期取得してアプローチ単位で突合し、「クリック反応」として分析(F-07)に反映する。

本システム相手企業自社サイト(GA計測タグ設置)Google Analytics(GA4)送信直前に本文内URLを検出→ ADコード付き計測URLへ書換① メール / フォーム送信(計測URL入り)② リンククリック GET /r/{tracking_code}→ アクセス数を即時計上(速報値)③ 302リダイレクト(ADコード付きURL)④ ページ閲覧(utm_source=ma&utm_content=…)⑤ 計測タグがアクセス送信⑥ Data APIで定期取得(1時間毎の増分+日次確定)⑦ セッション・PV等(utm_content別)→ tracking_codeでアプローチと突合し ga_access として保存 → クリック反応を分析(F-07)※ GA4の集計反映は24〜48時間遅延し得るため、リダイレクト即時計測(速報値)とGA同期(確定値)の2段階で表示する。クリック反応はSendGridクリックイベントとも統合判定
図9 リンク自動計測とGoogle Analytics連携(F-09)

3.9.2 ADコード自動付与

対象: 差し込み変数展開後のメール本文・フォーム本文に含まれる http(s) 形式のURL(送信直前に書き換え)。配信停止リンク等のシステム生成リンクは対象外。

付与するパラメータ(ADコード):

パラメータ 内容
utm_source ma(既定・変更可) 流入元識別子
utm_medium email / form アプローチ手段
utm_campaign cp_{キャンペーンID} キャンペーン識別子
utm_content {tracking_code} アプローチ単位の一意な追跡コード(ADコードの本体)

書き換え方式:

書き換え例:

テンプレート本文内のURL:
  https://www.example.co.jp/service

送信時(計測リダイレクト経由・既定):
  https://ma.example.com/r/Ab3xK9pQ

クリック後のリダイレクト先(ADコード付与済み):
  https://www.example.co.jp/service
    ?utm_source=ma&utm_medium=email&utm_campaign=cp_123&utm_content=Ab3xK9pQ

3.9.3 GAアクセスログ収集

  1. GA4 Data API(runReport)を定期実行し(既定: 1時間毎の増分取得+日次の確定同期)、自社サイトのアクセスログを取得する。
  2. 取得ディメンション: datesessionSourcesessionMediumsessionCampaignName(utm_campaign)、sessionManualAdContent(utm_content)。取得指標: sessionsengagedSessionsscreenPageViews
  3. utm_content(=tracking_code)でアプローチと突合し、送達イベント(event_type=ga_access)として保存する。突合できないレコードはキャンペーン単位で集計値として保持する。
  4. GA4の集計データは反映まで24〜48時間の遅延があり得るため、分析画面では計測リダイレクトによる即時計測(速報値)とGA同期による確定値を区別して表示する。
  5. GA連携の認証にはGoogleサービスアカウントを使用する(環境設定 F-10 で登録)。

3.9.4 クリック反応の分析

3.10 F-10 環境設定

3.10.1 概要

外部サービスの認証情報・送信既定値・システム全体の動作設定を管理する。設定画面(S-12)から管理者(admin)のみが操作できる。

3.10.2 設定項目

SendGrid設定:

項目 内容
APIキー SendGridのAPIキー(Mail Send権限)。暗号化保存し、画面上はマスク表示(末尾4文字のみ)
接続テスト APIキーの有効性検証(API疎通)と、指定アドレスへのテスト送信
差出人既定値 差出人メールアドレス・差出人名・返信先アドレスの既定値
送信ドメイン認証 Domain Authentication(SPF/DKIM)の設定状態を表示し、未設定時は警告する
Event Webhook Webhook受信URL(本システムのエンドポイント)の表示と、署名検証用公開鍵の登録
送信レート 1分あたり最大送信数・1日あたり送信上限

Google Analytics設定:

項目 内容
GA4プロパティID 連携対象のGA4プロパティ
サービスアカウント サービスアカウントキー(JSON)のアップロード。暗号化保存
接続テスト Data APIの疎通確認
同期間隔 増分同期の間隔(既定1時間)・日次確定同期の実行時刻
ADコード既定値 utm_source の値(既定: ma)、リダイレクト経由/直接付与の選択、既存utm上書き可否
クリックの扱い 「クリックを返答に含める」「クリック検知時にステータス自動更新」のON/OFF(既定: 両方OFF)

共通設定:

項目 内容
共通フッター メール本文末尾に自動挿入する署名・表示義務事項・配信停止案内(9章参照)
年度起点 分析の四半期・半期・年度の起点月(1月/4月、既定4月)
ユーザー管理 ユーザーの追加・無効化・ロール変更

3.10.3 処理仕様


4. 画面仕様

4.1 画面一覧

画面ID 画面名 概要 関連機能
S-01 ログイン ID/パスワード認証 共通
S-02 ダッシュボード 直近のアプローチ数・返答率・クリック反応・実行中ジョブのサマリ F-07
S-03 企業リストアップ 都道府県・業種指定と収集ジョブの起動・進捗確認 F-01
S-04 企業一覧・検索 検索条件・結果一覧・一括アプローチ起点 F-04
S-05 企業詳細 企業情報・連絡先・アプローチ履歴・ステータス変更 F-02/F-04
S-06 CSVインポート ファイルアップロード・プレビュー・実行 F-03
S-07 メールテンプレート一覧/編集 テンプレートのCRUD・プレビュー F-05
S-08 フォームテンプレート一覧/編集 テンプレートのCRUD F-06
S-09 キャンペーン実行(メール) テンプレート選択・対象確認・プレビュー・実行 F-04/F-08
S-10 キャンペーン実行(フォーム) テンプレート選択・半自動/自動選択・進捗と手動対応待ち一覧 F-04/F-06
S-11 分析 期間別グラフ・クロス集計・CSVエクスポート F-07
S-12 環境設定 SendGrid設定・GA連携設定・共通フッター・年度起点・ユーザー管理 F-10
S-01 ログインS-02 ダッシュボード企業管理S-03リストアップS-04企業一覧・検索S-05企業詳細S-06CSVインポートアプローチ実行S-09 メール営業実行S-10 フォーム営業実行テンプレート管理S-07 メールテンプレートS-08 フォームテンプレート分析・設定S-11 分析S-12 設定選択企業へアプローチ
図10 画面構成・遷移図

4.2 主要画面の補足

S-04 企業一覧・検索

S-05 企業詳細

S-09/S-10 キャンペーン実行

S-12 環境設定


5. データベース設計

DBはSQLite(WALモード)を使用する。日時はISO 8601形式のTEXT(UTC)、JSONはTEXTに格納する。外部キー制約は PRAGMA foreign_keys=ON で有効化する。

5.1 ER概要

industries(業種)id PKcode・nameparent_id(自己参照)companies(企業)id PKname・name_normalizedprefecture_code・industry_id FKsite_url・contact_form_urlemail・email_invalidapproach_statuslast_approached_atsource・memocompany_contacts(連絡先候補)id PKcompany_id FKkind(email / form_url)value・is_primarystatus_histories(履歴)id PKcompany_id FKfrom_status → to_statuschanged_by・reasonusers(ユーザー)id PKemail・namerole(admin / member)approaches(アプローチ)id PKcompany_id FK・campaign_id FKchannel(mail / form)result・sendgrid_message_idtracking_code(ADコード)clicked・first_clicked_atreplied_at・reply_memoapproached_atapproach_events(イベント)id PKapproach_id FKevent_type(+ga_access)source(sendgrid/redirect/ga)occurred_at・payloadmail_templates(+versions)id PK・namestatusversions: subject・bodyform_templates(+versions)id PK・namestatusversions: 会社名・担当者・本文campaigns(キャンペーン)id PKchannel・form_modetemplate_version_id FKstatus・executed_atcreated_by FK1n1n1n1n1n1n1n版(template_version)経由で参照作成者(created_by)※ ジョブ管理系(listing_jobs 等)・settings(環境設定)・ga_campaign_stats(GA未突合集計)は省略。テンプレートは版(versions)で履歴管理。
図11 ER図(主要テーブルの関連)

5.2 テーブル定義(主要)

companies(企業)

カラム 制約 内容
id INTEGER PK AUTOINCREMENT 企業ID
name TEXT NOT NULL 企業名
name_normalized TEXT NOT NULL, INDEX 重複判定用正規化名
prefecture_code TEXT NOT NULL, INDEX JIS X 0401 都道府県コード(2桁)
industry_id INTEGER FK(industries) 業種
site_url TEXT サイトURL
site_url_verified INTEGER DEFAULT 0 サイトURL確認済フラグ(0/1)
contact_form_url TEXT 問い合わせフォームURL
email TEXT 代表メールアドレス
email_invalid INTEGER DEFAULT 0 バウンス等による無効フラグ(0/1)
phone TEXT 電話番号
address TEXT 住所
source TEXT NOT NULL auto / csv / manual
extraction_status TEXT DEFAULT 'pending' pending / done / failed / no_form / no_email
approach_status TEXT NOT NULL DEFAULT 'not_approached', INDEX 3.4.3のステータスコード
last_approached_at TEXT INDEX 最終アプローチ日時(ISO 8601)
memo TEXT メモ
created_at / updated_at TEXT NOT NULL 作成・更新日時

company_contacts(抽出連絡先候補)

カラム 内容
id INTEGER PK
company_id INTEGER FK(companies)
kind TEXT email / form_url
value TEXT 抽出値
is_primary INTEGER 代表フラグ(0/1)
extracted_at TEXT 抽出日時

industries(業種マスタ)

カラム 内容
id INTEGER PK
parent_id INTEGER 大分類への自己参照(中分類の場合)
code TEXT 産業分類コード
name TEXT 業種名

mail_templates / mail_template_versions

テーブル 主要カラム
mail_templates id, name(UNIQUE), status(draft/active/archived), current_version_no, created_by, created_at, updated_at
mail_template_versions id, template_id FK, version_no, subject, body, from_name, reply_to, created_at

form_templates / form_template_versions

テーブル 主要カラム
form_templates id, name(UNIQUE), status, current_version_no, created_by, created_at, updated_at
form_template_versions id, template_id FK, version_no, company_name, person_last_name, person_first_name, kana_last, kana_first, email, phone, postal_code, address, department, title, subject, body, created_at

campaigns(キャンペーン)

カラム 内容
id INTEGER PK
name TEXT キャンペーン名
channel TEXT mail / form
template_version_id INTEGER 使用テンプレート版(mail/formいずれかのversion)
form_mode TEXT semi_auto / auto(formのみ)
status TEXT draft / running / done / canceled
created_by INTEGER FK(users) 実行者
executed_at TEXT 実行日時

approaches(アプローチ)

カラム 内容
id INTEGER PK
company_id INTEGER FK(companies), INDEX 対象企業
campaign_id INTEGER FK(campaigns), INDEX 所属キャンペーン(単発時はNULL可)
channel TEXT mail / form
result TEXT accepted / sent / failed / skipped_captcha / manual_pending
sendgrid_message_id TEXT SendGridの X-Message-Id(メール時)
tracking_code TEXT UNIQUE ADコード・アクセス計測用の一意コード
clicked INTEGER DEFAULT 0 クリック反応フラグ(0/1。重複排除済み)
first_clicked_at TEXT 初回クリック日時
replied_at TEXT 返答日時
reply_channel TEXT 返答手段(mail/form/phone/other)
reply_memo TEXT 返答内容メモ
approached_at TEXT, INDEX アプローチ日時
created_by INTEGER FK(users) 実行者

approach_events(送達イベント)

カラム 内容
id INTEGER PK
approach_id INTEGER FK(approaches), INDEX
event_type TEXT delivered / opened / clicked / bounced / spam_report / unsubscribed / access / ga_access
source TEXT sendgrid / redirect / ga
occurred_at TEXT 発生日時
payload TEXT(JSON) 通知の生データ・GAディメンション等

ga_campaign_stats(GA集計・未突合分)

カラム 内容
id INTEGER PK
date TEXT 集計日
utm_campaign TEXT キャンペーン識別子
utm_content TEXT 追跡コード(突合できなかったもの含む)
sessions / engaged_sessions / page_views INTEGER GA4指標
synced_at TEXT 同期日時

settings(環境設定)

カラム 内容
key TEXT PK 設定キー(例: sendgrid.api_key, ga.property_id, footer.body, fiscal.start_month)
value TEXT 設定値。秘匿情報は暗号化した値を格納
is_secret INTEGER 秘匿フラグ(0/1)。1の場合は画面上マスク表示
updated_by INTEGER FK(users) 最終更新者
updated_at TEXT 最終更新日時

listing_jobs(リストアップジョブ)/ extraction_jobs(抽出ジョブ)/ import_jobs(インポートジョブ)

テーブル 主要カラム
listing_jobs id, prefecture_codes(JSON), industry_ids(JSON), keyword, max_count, status(queued/running/done/failed), found_count, saved_count, dup_count, created_by, started_at, finished_at, error
extraction_jobs id, company_id FK, trigger(auto/csv/manual), status, result_summary, started_at, finished_at, error
import_jobs id, filename, total_rows, ok_rows, error_rows, dup_rows, dup_policy(skip/merge), auto_extract(0/1), status, created_by, created_at

status_histories(ステータス変更履歴)

カラム 内容
id INTEGER PK
company_id INTEGER FK(companies)
from_status / to_status TEXT 変更前後
changed_by INTEGER FK(users) NULL可 NULL=システム自動
reason TEXT approach_executed / reply_registered / manual / bounce / unsubscribe 等
changed_at TEXT

users(ユーザー)

カラム 内容
id INTEGER PK
email TEXT UNIQUE ログインID
name TEXT 表示名
role TEXT admin / member
password_hash TEXT bcrypt等
is_active INTEGER 0/1

5.3 SQLite利用上の設計方針


6. 内部API設計

REST APIとして設計する。認証はセッションまたはJWT。すべて /api/v1 配下。

6.1 エンドポイント一覧

メソッド パス 機能
POST /listing-jobs リストアップジョブ起動(F-01)
GET /listing-jobs, /listing-jobs/{id} ジョブ一覧・進捗取得
POST /companies/{id}/extract 連絡先再抽出(F-02)
POST /import-jobs CSVアップロード・検証(F-03)
POST /import-jobs/{id}/execute インポート確定実行
GET /companies 企業検索(F-04。クエリで3.4.2の条件指定)
GET/PATCH /companies/{id} 企業詳細取得・更新(ステータス変更含む)
POST /companies/{id}/reply 返答あり登録
GET /companies/export 検索結果CSVエクスポート
GET/POST /mail-templates メールテンプレート一覧・作成(F-05)
GET/PATCH/DELETE /mail-templates/{id} 取得・更新(新版作成)・アーカイブ
GET/POST /form-templates フォームテンプレート一覧・作成(F-06)
GET/PATCH/DELETE /form-templates/{id} 取得・更新・アーカイブ
POST /campaigns キャンペーン作成(対象企業+テンプレート指定)
POST /campaigns/{id}/execute キャンペーン実行(F-04/F-08)
GET /campaigns/{id} 実行状況・結果取得
GET /campaigns/{id}/manual-pending フォーム手動対応待ち一覧
GET /analytics/summary 分析サマリ(F-07。period=month/quarter/half/year)
GET /analytics/export 分析CSVエクスポート
POST /webhooks/sendgrid SendGrid Event Webhook受信(7章)
POST /integrations/ga/sync GAデータ手動同期の起動(F-09)
GET /r/{tracking_code} 計測用リダイレクト(アクセス計上→ADコード付与済みURLへ302)
GET/PUT /settings 環境設定の取得・更新(F-10。管理者のみ)
POST /settings/sendgrid/test SendGrid接続テスト・テスト送信(F-10)
POST /settings/ga/test GA Data API疎通確認(F-10)

6.2 共通仕様


7. 外部連携仕様

本章では SendGrid(メール送信)と Google Analytics 4(アクセスログ取得)の連携仕様を定義する。認証情報はいずれも環境設定(F-10)で管理する。

本システム(API / ワーカー)SendGrid相手企業① メール送信API呼び出しPOST /v3/mail/send(ADコード付与済み)202 Accepted(X-Message-Id)② メール配信③ Event Webhook: delivered / open④ 本文リンクをクリック GET /r/{tracking_code}→ アクセス数を即時計上し、ADコード付与済みURLへ302リダイレクト(F-09)⑤ Event Webhook: click⑥ メール返信・フォーム経由の連絡→ ユーザーが「返答あり」を登録(ステータス: replied)⑦ Event Webhook: bounce / spamreport / unsubscribe→ bounce: メール無効化 / spamreport・unsubscribe: 「アプローチ不可」へ更新※ WebhookはSigned Event Webhook(署名検証)必須。イベント欠損に備え、日次でSuppressions(バウンス一覧)を照会して整合を取る
図12 SendGrid API連携シーケンス(F-08)

7.1 SendGrid メール送信API

エンドポイント: POST https://api.sendgrid.com/v3/mail/send

認証: Authorization: Bearer {API_KEY}

リクエスト例:

{
  "personalizations": [
    {
      "to": [{ "email": "info@example.co.jp" }],
      "custom_args": {
        "campaign_id": "123",
        "approach_id": "456",
        "tracking_code": "Ab3xK9pQ"
      }
    }
  ],
  "from": { "email": "sales@synon.co.jp", "name": "株式会社Synon 田中" },
  "reply_to": { "email": "mtanaka@synon.co.jp" },
  "subject": "【ご提案】◯◯業務の効率化について",
  "content": [
    { "type": "text/plain", "value": "株式会社◯◯ ご担当者様 …" }
  ]
}

レスポンス: 成功時 202 Accepted(ボディなし)。レスポンスヘッダ X-Message-Id を受付IDとして保存する。

ステータスコード 本システムの扱い
202 Accepted result=accepted として履歴保存
400 バリデーションエラー result=failed(リトライしない)。エラー内容を履歴に記録
401/403 認証エラー ジョブ中断、管理者へ通知(APIキーの確認を案内)
413 ペイロード超過 result=failed(リトライしない)
429 レート超過 Retry-After に従い再試行
5xx 指数バックオフで最大3回リトライ

7.2 SendGrid Event Webhook

SendGridのEvent Webhookを POST /api/v1/webhooks/sendgrid で受信する。Signed Event Webhook(公開鍵による署名検証)を必須とし、公開鍵は環境設定(F-10)で登録する。

受信イベント例:

[
  {
    "email": "info@example.co.jp",
    "event": "delivered",
    "timestamp": 1786800000,
    "sg_message_id": "dXNlcjEg...",
    "campaign_id": "123",
    "approach_id": "456",
    "tracking_code": "Ab3xK9pQ"
  }
]

custom_args に設定した値が各イベントにそのまま含まれるため、approach_id で該当アプローチを特定し、approach_events に保存する。

SendGridイベント 本システムの扱い
processed / delivered event_type=delivered として保存
open event_type=opened として保存
click event_type=clicked として保存し、クリック反応判定(F-09)に反映
bounce(恒久)/ dropped event_type=bounced。企業の email_invalid を1に更新
spamreport 企業ステータスを do_not_contact に更新
unsubscribe / group_unsubscribe 企業ステータスを do_not_contact に更新

7.3 Google Analytics 4(Data API)連携

認証: Googleサービスアカウント(JSONキー)。対象GA4プロパティに閲覧者権限を付与する。

取得方法: GA4 Data API properties/{propertyId}:runReport を定期実行する(既定: 1時間毎の増分+日次確定同期)。

リクエスト例:

{
  "dateRanges": [{ "startDate": "2026-08-11", "endDate": "2026-08-13" }],
  "dimensions": [
    { "name": "date" },
    { "name": "sessionCampaignName" },
    { "name": "sessionManualAdContent" }
  ],
  "metrics": [
    { "name": "sessions" },
    { "name": "engagedSessions" },
    { "name": "screenPageViews" }
  ],
  "dimensionFilter": {
    "filter": {
      "fieldName": "sessionSource",
      "stringFilter": { "value": "ma" }
    }
  }
}

7.4 連携設定項目

環境設定(F-10)で管理する。詳細は 3.10.2 参照。

分類 設定
SendGrid APIキー / 差出人既定値 / Event Webhook署名公開鍵 / 送信レート・送信上限
Google Analytics GA4プロパティID / サービスアカウントキー / 同期間隔
ADコード utm_source既定値 / リダイレクト経由・直接付与の選択 / 既存utm上書き可否

8. 非機能要件

分類 要件
性能 企業検索は10万件規模で2秒以内に応答。検索はINDEX+FTS5、分析は日次集計テーブルで担保
可用性 業務時間帯(平日9-19時)の稼働を優先。計画停止は夜間に実施
スケール 企業データ最大50万件、アプローチ履歴最大500万件を想定。SQLite単一ファイルで対応可能な規模とし、超過が見込まれる場合はPostgreSQL移行を検討(ORM経由のため移行容易性を確保)
DB書き込み SQLiteはWALモードで運用し、書き込みはジョブキュー経由で直列化。busy_timeout設定によりロック競合を回避
セキュリティ 全通信TLS。パスワードはbcryptハッシュ。APIキー・サービスアカウントキー等の秘匿情報は暗号化保存。ロールベース認可。Webhookは署名検証
監査 ログイン、データ更新、キャンペーン実行、環境設定変更の監査ログを1年間保持
バックアップ SQLiteオンラインバックアップ(VACUUM INTO)による日次スナップショット+世代管理。保持30日
ジョブ制御 収集・抽出・フォーム送信・GA同期ジョブはリトライ・タイムアウト(1ジョブ最大60分)・同時実行制御を持つ
クロール礼儀 同一ドメインへのアクセス間隔を最低5秒あける。User-Agentを明示。robots.txt を尊重

9. 法令・運用上の注意事項

本システムは営業目的の電子メール送信・フォーム送信を行うため、以下の遵守を機能・運用の両面で担保する。

9.1 特定電子メール法(迷惑メール防止法)

9.2 フォーム営業

9.3 Webスクレイピング

9.4 運用ルール(推奨)


10. 今後の検討事項

# 項目 内容
1 SendGridプランの選定 送信量に応じたプラン選定。Email Activity API(履歴照会・有償)の利用可否、専用IP・IPウォームアップの要否
2 企業情報ソースの選定 検索エンジンAPI/法人番号公表サイト/有償企業DBなど、リストアップに使う情報ソースと利用規約・コストの精査
3 返信メールの自動検知 返信先メールボックスのIMAP監視等による「返答あり」自動更新
4 HTMLメール対応 テンプレートのHTML化と開封計測の精度向上
5 重複判定の高度化 法人番号による名寄せ、表記ゆれ吸収の強化
6 通知機能 返答発生・クリック反応・ジョブ失敗時のSlack/メール通知
7 GA連携の拡張 GA4のBigQueryエクスポート利用によるセッション単位の詳細分析、コンバージョンイベント連携

改訂履歴

日付 変更内容
1.0 2026-08-13 初版作成
1.1 2026-08-13 HTML版に図解(構成図・フロー図・ER図等)を追加
1.2 2026-08-13 Google Analytics連携(F-09)・環境設定(F-10)を追加。DBをSQLiteに変更。メール送信をdevcloud APIからSendGrid APIに変更

本書はドラフトです。レビュー後、確定版として版数を更新してください。