メインコンテンツまでスキップ

Webhookオートメーション

Basic以上

オートメーションにはBasic以上が必要です。Basicは1件、Proは3件、Ultraは10件まで作れます。Freeでは、この行にProにアップグレードしてオートメーションを利用と表示されます。

Webhookは、データを自動で受け取るウェブ上のアドレスです。オートメーションを使うと、TellDoneは新しいメモの準備ができた時点で、そのメモとタスク、イベントをこのアドレスに送ります。新しいレポートも、準備ができた時点で送られます。ZapierやMake、n8nなどのツールが、それを受けて動作できます。タスクとイベントは、それぞれ1件ずつ個別に送られます。

送信する内容を選ぶ​

オートメーションごとに、送信内容で個別に設定します。1つでも、複数の組み合わせでも選べます:

  • メモ - 処理済みのメモ全体(タイトル、文字起こし、要約、種類、タグ、優先度、言語、作成日)
  • メモ + 音声 - Ultraプランで、各メモの配信に、音声ファイルへの24時間有効なダウンロードリンクを追加します。メモはオンのままにしてください。オフにするとメモは送られません
  • タスク - 抽出されたタスクごとに1回の配信
  • イベント - 抽出されたカレンダーイベントごとに1回の配信
  • レポート - 生成された日次、週次、月次、年次のレポート(プランに含まれる種類)ごとに1回の配信。静かな日のプレースホルダーや、短い静かな週のレポートは送られません

これらはオートメーションの設定でいつでも変更できます。変更は新しい配信にのみ適用されます。

送信するタイミングを選ぶ​

データの選択の下にある4つの個別のスイッチ、作成、更新、完了、削除で、どの変更が配信のきっかけになるかを決めます。トリガーは、その上にある対応するデータのスイッチと組み合わせて初めて動作します。たとえば、完了で完了したタスクが送られるのは、タスクがオンのときだけです。

作成が送られるのは、録音またはテキストメモからTellDoneが作ったメモと、そこで見つかったタスクとイベントです。手作業やAIアシスタントで追加したタスクとイベント、そして音声で追記した新しい項目は、「作成」としては送られません。更新、完了、削除が送られるのは、アプリ内または音声で追記を使って項目を変更したときです。Smart Contextや、AIアシスタント、Todoist、Notion、Microsoft To Doでの変更では、配信は送られません。

各配信のeventフィールドには、何が起きたかが入ります。たとえばtask.created、task.completed、calendar_event.updatedです。

Webhookの設定方法​

Zapier、Make、n8n向けのオートメーション設定

  1. 設定 > 連携 > オートメーションを開きます
  2. 新しいオートメーションをタップします

新しいオートメーションのWebhook設定

  1. 名前を入力します(たとえば「My Zapier webhook」)
  2. オートメーションサービスのWebhook URLを貼り付けます
  3. 送信するデータ(メモ、Ultraではメモ + 音声、タスク、イベント、レポート)と、使うトリガー(作成、更新、完了、削除)を選びます
  4. 必要に応じて、認証ヘッダーを追加します。保護されたエンドポイント向けに、Authorizationヘッダーとして送られるトークンです
  5. 保存をタップします
  6. 署名シークレットをコピーします。全文が表示されるのは、オートメーションを最初に作成したときと、シークレットを更新した後だけです。配信が本当にTellDoneから届いたことを確認するのに必要です(Webhookの署名を検証するを参照)
  7. テスト送信をタップすると、データを一切変更せずに、サンプルのペイロードがエンドポイントに送られます。HTTPコードと応答時間付きの成功、または理由付きのエラーが表示されます。テスト送信は配信ログに表示されません

送信される内容​

すべての配信は、3つのフィールドを持つJSONオブジェクトです。event(イベントの種類)、timestamp、data(実際の内容)です。テスト送信には"test": trueも含まれます。イベントの種類ごとの内容は次のとおりです。

メモ(note.created)​

AIが作成したタイトル、文字起こし全文、要約、メモの種類、タグ、優先度、言語、作成日が含まれます。

{
"event": "note.created",
"timestamp": "2026-02-27T14:38:00.512345+00:00",
"data": {
"note_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meeting notes - Project Alpha",
"transcript": "Full transcript text...",
"summary": "Brief AI-generated summary...",
"type": "meeting",
"tags": ["work", "project-alpha"],
"priority": "high",
"language": "en",
"created_at": "2026-02-27T10:00:00.284117+00:00"
}
}

Ultraプランでは、メモの配信に録音へのリンク(audio_url、audio_format、duration_seconds)を含めることもできます。リンクは24時間で期限切れになります。オートメーションのメモ + 音声オプションでオンにします。

タスク(task.created)​

タスクごとに1回の配信です。3件のタスクがあるメモは、3回に分けて配信されます。

{
"event": "task.created",
"timestamp": "2026-02-27T14:38:01.204718+00:00",
"data": {
"note_id": "550e8400-...",
"note_title": "Meeting notes - Project Alpha",
"task_id": "660f9511-...",
"title": "Send proposal to client",
"description": "Include pricing for Q2",
"priority": "high",
"due_date": "2026-03-01",
"reminder_at": "2026-02-28T09:00:00+00:00",
"tags": ["work"],
"status": "todo",
"cancel_reason": null,
"cancelled_at": null,
"created_at": "2026-02-27T10:00:00.284117+00:00"
}
}

イベント(calendar_event.created)​

カレンダーイベントごとに1回の配信です。

{
"event": "calendar_event.created",
"timestamp": "2026-02-27T14:38:02.093361+00:00",
"data": {
"note_id": "550e8400-...",
"note_title": "Meeting notes",
"event_id": "770a0622-...",
"title": "Team standup",
"description": "Weekly sync",
"start": "2026-03-03T07:00:00+00:00",
"end": "2026-03-03T07:30:00+00:00",
"location": "Zoom",
"is_all_day": false,
"attendees": ["alice@example.com"],
"tags": ["work"],
"created_at": "2026-02-27T10:00:00.284117+00:00",
"timezone": "Europe/Istanbul",
"start_local": "2026-03-03T10:00:00+03:00",
"end_local": "2026-03-03T10:30:00+03:00",
"start_date": "2026-03-03",
"end_date": "2026-03-03"
}
}

startとendはUTCです。start_local、end_local、start_date、end_dateは、自分のタイムゾーン(timezone)で表されます。終日イベントの場合、end_dateはイベントの最終日です。

レポート(report.created)​

日次、週次、月次、年次のレポートが生成されたときに送られます。

{
"event": "report.created",
"timestamp": "2026-02-28T00:05:00.731902+00:00",
"data": {
"report_id": "880b1733-...",
"report_type": "daily",
"period_start": "2026-02-27",
"period_end": "2026-02-27",
"content_md": "# Daily Report\n\n...",
"content_json": {
"productivity_score": 72,
"day_type": "planning",
"tasks_created": 5,
"tasks_completed": 3
},
"created_at": "2026-02-28T00:05:00.418253+00:00"
}
}

セキュリティ​

すべての配信には、オートメーションの署名シークレットを使ったHMAC-SHA256で署名が付きます。各配信には、次のヘッダーが含まれます:

  • X-LP-Signature - HMAC-SHA256の署名(sha256=...)
  • X-LP-Timestamp - 署名に使われたUnixタイムスタンプ
  • X-LP-Event - イベントの種類(たとえばnote.created、task.completed、calendar_event.updated、report.created)
  • X-LP-Delivery-Id - 配信ごとに固有のID(重複の排除に便利)
  • User-Agent - 常にTellDone-Webhooks/1.0

TellDoneがAuthorizationヘッダーを送るのは、オートメーションに認証ヘッダーを追加した場合だけです。形式は2通りあります。Header-Name: valueは名前付きのヘッダーを送り、値だけを書くとAuthorization: <value>が送られます。署名シークレットがヘッダーで送られることはありません。

署名シークレットはオートメーションごとに独立しているので、1つを更新しても、ほかのWebhookには影響しません。シークレットの全文が表示されるのは、オートメーションを最初に作成したときと、更新した後だけです。それ以外のときは、プレビュー(whsec_...last4)のみが表示されます。新しいシークレットに替えるには、オートメーションの設定でシークレットを更新をタップします。URLや認証ヘッダーは変えずに、新しいHMACキーが生成されます。古いシークレットはすぐに使えなくなります。

受け付けられるのは、ドメイン名を使ったHTTPSのURLだけです。HTTP、IPアドレス(パブリックでもプライベートでも)、ユーザー名やパスワードを含むURL、プライベートネットワークのアドレスを指すドメインは拒否されます。TellDoneは、送信のたびにアドレスをもう一度確認します。たとえばドメインがそのときに名前解決できないなどで確認に失敗した場合、配信は停止され、再試行されません。

Webhookの署名を検証する​

すべてのWebhookには署名が付いているので、本当にTellDoneから届いたものかを確認できます。署名は次のように計算されます:

HMAC-SHA256(signing_secret, timestamp + "." + raw_body)

結果は16進数でエンコードされ、署名ヘッダーでは先頭にsha256=が付きます。

リクエストの生の本文を使う

TellDoneは、区切り文字の後にスペースを入れたJSONを生成します(たとえば{"event": "note.created"})。本文を解析してからシリアライズし直すと、署名が一致しなくなります。必ず、リクエスト本文の生のバイト列で検証してください。

Python​

import hmac
import hashlib

def verify_signature(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
payload = f"{timestamp}.".encode() + raw_body
expected = "sha256=" + hmac.new(
secret.encode(), payload, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)

# Flask example
@app.route("/webhook/telldone", methods=["POST"])
def telldone_webhook():
raw_body = request.get_data() # raw bytes, NOT request.json
signature = request.headers.get("X-LP-Signature", "")
timestamp = request.headers.get("X-LP-Timestamp", "")

if not verify_signature(raw_body, signature, timestamp, SIGNING_SECRET):
abort(403)

data = request.json
# process webhook...

Node.js​

const crypto = require("crypto");

function verifySignature(rawBody, signature, timestamp, secret) {
const payload = `${timestamp}.${rawBody}`;
const expected =
"sha256=" +
crypto.createHmac("sha256", secret).update(payload).digest("hex");
const a = Buffer.from(signature);
const b = Buffer.from(expected);
// timingSafeEqual throws if the lengths differ, e.g. when the header is missing
return a.length === b.length && crypto.timingSafeEqual(a, b);
}

// Express example (use express.raw to get the raw body)
app.post("/webhook/telldone", express.raw({ type: "application/json" }), (req, res) => {
const rawBody = req.body.toString();
const signature = req.headers["x-lp-signature"] || "";
const timestamp = req.headers["x-lp-timestamp"] || "";

if (!verifySignature(rawBody, signature, timestamp, SIGNING_SECRET)) {
return res.status(403).send("Invalid signature");
}

const data = JSON.parse(rawBody);
// process webhook...
});

リプレイ対策(任意)​

リプレイ攻撃を防ぐには、タイムスタンプが新しいことを確認します:

import time

def verify_timestamp(timestamp: str, tolerance_seconds: int = 300) -> bool:
try:
return abs(time.time() - int(timestamp)) < tolerance_seconds
except (ValueError, TypeError):
return False

よくある間違い​

間違い対処
解析してシリアライズし直した本文を使うリクエストの生の本文を使う
JavaScriptのJSON.stringify()(スペースなしのコンパクトな形式)リクエストの生の本文を使う
タイムスタンプの接頭辞を忘れるペイロードの形式はtimestamp + "." + body
文字列を直接比較するhmac.compare_digestまたはtimingSafeEqualを使う

再試行のルール​

エンドポイントが失敗した場合、TellDoneは配信ごとに次のスケジュールで再試行します:

試行間隔
1回目の再試行30秒
2回目の再試行2分
3回目の再試行15分
4回目の再試行1時間
5回目の再試行4時間

5回目の再試行も失敗すると、その配信は失敗としてマークされ、それ以上は再試行されません。アプリでは赤い×印で表示されます。完全な配信ログから、自分で再送することもできます。すべての配信(オートメーションの配信が5件を超えるとリンクが表示されます)を開き、失敗した配信でもう一度試すをタップします。短い最近の配信リストには、再試行の操作はありません。

応答の種類ごとの扱いは、次のとおりです:

  • 2xx - 配信成功
  • 4xx(429を除く)- すぐに失敗としてマークされ、再試行されません(エンドポイントがデータをはっきり拒否したため)
  • 429(Too Many Requests)- Retry-Afterで示された秒数の後に再試行されます(指定がなければ60秒)。この再試行は5回までに限られませんが、1回ごとに、オートメーションがオフになる20回の失敗にカウントされます
  • 5xxまたはタイムアウト - 上のスケジュールで再試行されます

配信が繰り返し失敗したとき​

配信が失敗し続けると、TellDoneがお知らせし、最終的にオートメーションをオフにします。

3回失敗したとき:受信箱の警告​

3回連続で失敗すると(再試行も数えます)、TellDoneは受信箱に、オートメーション「名前」で失敗が続いていますというタイトルのメッセージを送ります。引用符の中には、オートメーションの名前が入ります。そこから設定 > 連携 > オートメーションを開いて、配信を確認し、どうするかを決められます。

20回失敗したとき:自動で無効化​

自動で無効化

同じオートメーションで20回連続して失敗すると(再試行も数えます)、TellDoneは、動作していないアドレスへの送信を止めるために、そのオートメーションをオフにします。オートメーションのツール側で問題を直してから、設定 > 連携 > オートメーションで有効スイッチをもう一度オンにしてください。オンに戻しても失敗の回数はリセットされないので、配信が1回成功するまでは、1回失敗するだけでもう一度オフになります。

失敗した試行はすべて数えられるので、5回の再試行がすべて失敗した配信1件で、カウントは6増えます。そのため、失敗する配信が約4件続くと、オートメーションが自動でオフになることがあります。カウンターは、次に配信が成功するとゼロに戻ります。

Webhookの管理​

  • 有効 - このスイッチをオフにすると、削除せずにオートメーションを止められます。いつでもオンに戻せます。オフの間は何も送られません。その間のメモやレポートはあとから送られることはなく、再試行待ちの配信は破棄されます
  • 配信 - 最近の配信には、直近5件が、ステータス、HTTPコード、応答時間とともに表示されます。それより増えると、すべての配信から過去30日間のログを開けます。すべて、配信済み、エラーで絞り込めます。失敗した配信でもう一度試すをタップすると、次の予定された再試行を待たずに再送できます
  • テスト送信 - 選んだデータの種類にかかわらず、サンプルのメモ(note.created、本文に"test": true付き)を送ります。データは一切変更されません。オートメーションを保存すると使えるようになります。テスト送信は、月間の上限にカウントされません
  • シークレットを更新 - URLや認証ヘッダーは変えずに、新しいHMAC署名シークレットを生成します
  • 編集 - URL、認証ヘッダー、データの選択(メモ / メモ + 音声 / タスク / イベント / レポート)、トリガー(作成 / 更新 / 完了 / 削除)を更新できます。変更はすぐに反映されます
  • オートメーションを削除 - オートメーションと、そのすべての配信ログを完全に削除します

各配信のステータスは、アイコンで表示されます:

アイコン意味
緑のチェック配信済み
黄色の時計待機中または送信中
赤い三角失敗、TellDoneが再試行します
赤い×印失敗、自動の再試行はこれ以上ありません

完全なログでは、赤い三角または赤い×印の配信でもう一度試すをタップできます。

配信の上限​

上限は2つあります。プランによって決まる月間の上限と、急な集中を防ぐための、すべての有料プランで1時間あたり100件の上限です。

プランオートメーション月間の配信数1時間あたりの上限
Free00-
Basic1300100
Pro33,000100
Ultra1015,000100

上限に達したときの動作:

  • 月間の上限に達したとき - 配信は待機します。失敗として表示され(「Monthly webhook limit exceeded」)、TellDoneは5分ごとにもう一度試します。上限は毎月1日の00:00 UTCにリセットされ、その後に送信されます。ただし、その時点で30日より古い配信は送信されません。リセット後に送信された配信は、新しい月にカウントされます。
  • 1時間の上限に達したとき - 配信は保留され、約5分後に再試行されます。短時間に集中しても、データは失われません。

月間の上限にカウントされるのは、成功した配信だけです。1時間の上限には、再試行を含むすべての試行がカウントされます。テスト送信は、どちらの上限にもカウントされません。

プランを変更しても、オートメーションとその設定は保持されます。Freeでは送信が止まり、アップグレードするまで開けません。Basicでは、すでにあったオートメーションは月300件の配信の範囲で送信を続けますが、追加したり、2つ以上をオンにしたりはできません。

テストイベントを除外する​

テスト送信をタップすると、ペイロードの最上位に"test": trueが含まれます。オートメーションのツール側でこのフィールドを確認し、あれば処理をスキップできます。

プラットフォーム別ガイド​

お使いのオートメーションツールでの詳しい設定手順は、こちらをご覧ください:

  • Zapier - Zapで、TellDoneを数千のアプリに接続
  • Make - ビジュアルなオートメーションのシナリオを作成(旧Integromat)
  • n8n - セルフホストまたはクラウドのワークフローでTellDoneのWebhookを使う
  • カスタムエンドポイント - HTTPSのPOSTリクエストを受け付けるサービスなら、TellDoneのWebhookで使えます

活用アイデア​

  • Zapier経由でタスクをGoogleスプレッドシートに送る
  • Make経由でメモからSlackのメッセージを作る
  • n8n経由でイベントを独自のCRMに記録する
  • すべてのメモをクラウドストレージにバックアップする
  • レポートをチームのダッシュボードに転送する

関連ページ​

  • 受信箱とサポート - Webhookが繰り返し失敗すると、受信箱にメッセージが届きます
  • Zapier - Zapierの設定手順
  • Make - Makeの設定手順
  • n8n - n8nの設定手順
  • Todoist - 専用のタスク双方向同期(Webhook不要)
  • Notion - 専用のNotion連携
  • メール転送 - メモのデータをメールで受け取る