본문으로 건너뛰기

Webhook 자동화

Basic 요금제 이상

Webhook은 유료 요금제가 필요해요. Basic: 1개, Pro: 3개, Ultra: 10개.

Webhook으로 TellDone을 어떤 외부 서비스에든 연결할 수 있어요. 음성 노트를 만들면 TellDone이 처리하고 추출된 데이터(노트, 할 일, 이벤트, 리포트)를 지정한 URL로 자동 전송해요. 각 할 일과 이벤트는 별도의 전송으로 보내져서 자동화 도구가 개별적으로 처리할 수 있어요.

보낼 항목 선택

각 자동화에는 자체 페이로드 토글이 있어요. 하나 또는 어떤 조합이든 선택할 수 있어요.

  • 노트 - 처리된 전체 노트(제목, 전사본, 요약, 태그, 언어)
  • 오디오 - Ultra 요금제에서, 노트 페이로드와 함께 오디오 파일에 대한 24시간 다운로드 링크 첨부
  • 할 일 - 추출된 할 일당 하나의 전송
  • 이벤트 - 추출된 캘린더 이벤트당 하나의 전송
  • 리포트 - 생성된 일간, 주간, 월간, 연간 리포트당 하나의 전송

토글은 자동화 설정에서 언제든지 변경할 수 있어요. 변경은 새 이벤트에만 적용돼요.

Webhook 설정

Zapier, Make, n8n용 설정 자동화

  1. 설정 > 연동 > Webhook 자동화로 이동하세요
  2. 새 자동화를 누르세요

새 자동화 Webhook 설정

  1. 이름을 입력하세요(예: "내 Zapier Webhook")
  2. 자동화 서비스의 Webhook URL을 붙여넣으세요
  3. 보낼 데이터를 선택하세요: 노트, 할 일, 이벤트, 리포트(또는 조합)
  4. 선택적으로 인증 헤더를 추가하세요. 안전한 엔드포인트를 위해 Authorization 헤더로 전송되는 토큰이에요
  5. 저장을 누르세요
  6. 서명 비밀 키를 복사하세요. 처음 자동화를 만들거나 회전 후에만 전체가 표시돼요. Webhook 진위 확인을 원한다면 필요해요
  7. 실제 이벤트를 만들지 않고 엔드포인트로 샘플 페이로드를 보내려면 **"테스트"**를 누르세요

Webhook URL은 HTTPS를 사용해야 해요. HTTP 주소와 사설 네트워크 IP는 허용되지 않아요.

전송되는 내용

모든 전송은 세 개의 필드(이벤트 유형의 event, timestamp, 실제 콘텐츠의 data)가 있는 JSON 객체예요. 각 이벤트 유형이 어떻게 생겼는지 보여드릴게요.

노트 (note.created)

AI가 생성한 제목, 전체 전사본, 요약, 노트 유형, 태그, 우선순위, 언어, 생성 날짜를 포함해요.

{
"event": "note.created",
"timestamp": "2026-02-27T14:38:00Z",
"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:00Z"
}
}

Ultra 요금제에서는 노트 전송에 오디오 녹음 링크(audio_url, audio_format, duration_seconds)도 포함될 수 있어요. 링크는 24시간 후에 만료돼요. 자동화를 만들 때 "노트 + 오디오" 옵션으로 활성화하세요.

할 일 (task.created)

할 일당 하나의 전송. 3개의 할 일이 있는 단일 노트는 3개의 별도 Webhook을 보내요.

{
"event": "task.created",
"timestamp": "2026-02-27T14:38:01Z",
"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:00Z",
"tags": ["work"],
"status": "todo",
"created_at": "2026-02-27T10:00:00Z"
}
}

이벤트 (calendar_event.created)

캘린더 이벤트당 하나의 전송.

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

리포트 (report.created)

일간, 주간, 월간, 연간 리포트가 생성될 때 전송돼요.

{
"event": "report.created",
"timestamp": "2026-02-28T00:05:00Z",
"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": "productive",
"tasks_created": 5,
"tasks_completed": 3
},
"created_at": "2026-02-28T00:05:00Z"
}
}

보안

모든 전송은 자동화의 서명 비밀 키를 사용해 HMAC-SHA256으로 서명돼요. 다음 헤더가 각 전송에 포함돼요.

  • X-LP-Signature - HMAC-SHA256 서명(sha256=...)
  • X-LP-Timestamp - 서명에 사용된 Unix 타임스탬프
  • X-LP-Event - 이벤트 유형(note.created, task.created, calendar_event.created, report.created)
  • X-LP-Delivery-Id - 고유 전송 ID(중복 제거에 유용)
  • User-Agent - 항상 TellDone-Webhooks/1.0

서명 헤더는 다른 설정과 관계없이 모든 전송과 함께 전송돼요.

기본적으로 모든 전송에는 자동화의 서명 비밀 키가 Authorization 헤더에 포함돼요. n8n Header Auth 같은 도구는 비밀 키를 인증 값으로 붙여넣기만 하면 바로 사용할 수 있어요. 설정에서 인증 헤더를 직접 입력하면 이 기본값이 대체돼요. 두 가지 형식을 사용할 수 있어요: 헤더이름: 값(지정된 헤더를 보냄) 또는 일반 값(Authorization: <값>으로 보냄).

각 자동화는 자체 서명 비밀 키를 가지고 있어, 하나를 회전해도 다른 Webhook에 영향을 주지 않아요. 비밀 키는 처음 자동화를 만들거나 회전 후에만 전체가 표시돼요. 다른 때는 미리보기(whsec_...마지막4자리)만 보여요. 새 것으로 교체하려면 자동화 설정의 **"비밀 키 회전"**을 누르세요. URL이나 인증 헤더 변경 없이 새 HMAC 키를 생성해요. 이전 비밀 키는 즉시 작동을 멈춰요.

HTTPS URL만 허용돼요. HTTP, IP 주소, 사설 네트워크 주소는 거부돼요.

Webhook 서명 검증

HMAC 검증

모든 전송에는 X-LP-Signature: sha256=<hex> 형식의 서명 헤더가 포함돼요. 아래 예시는 Python에서 검증하는 방법을 보여줘요.

모든 Webhook은 서명되어 있어 실제로 TellDone에서 왔는지 확인할 수 있어요. 서명은 다음과 같이 계산돼요.

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

결과는 hex로 인코딩되어 서명 헤더에서 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");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}

// 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

일반적인 실수

실수수정
파싱 + 재직렬화된 본문 사용원시 요청 본문 사용
JS의 JSON.stringify()(컴팩트, 공백 없음)원시 본문 사용 또는 Python 공백 맞추기
타임스탬프 접두사 잊기페이로드 형식은 timestamp + "." + body
문자열 직접 비교hmac.compare_digesttimingSafeEqual 사용

재시도 정책

엔드포인트가 실패하면 TellDone은 지수 백오프(몇 분, 그 다음 더 긴 간격)로 각 전송을 재시도해요.

시도지연
1차 재시도30초
2차 재시도2분
3차 재시도15분
4차 재시도1시간
5차 재시도4시간

5번 실패한 시도 후, 전송은 죽음으로 표시돼요. 전송 로그에서 수동으로 재시도할 수는 있어요.

TellDone이 다른 응답을 처리하는 방법:

  • 2xx - 성공적으로 전송됨
  • 4xx (429 제외) - 재시도 없이 즉시 죽음으로 표시(엔드포인트가 데이터를 명시적으로 거부)
  • 429 (요청이 너무 많음) - 재시도, Retry-After 헤더를 존중
  • 5xx 또는 시간 초과 - 위 일정으로 재시도

전송이 반복 실패할 때

무언가가 망가졌는지 알기 위해 전송 로그를 계속 지켜볼 필요가 없어요. TellDone이 연속 실패를 감시하고 두 단계로 알려줘요.

3회 실패 후: 받은 편지함 경고

연속 3회 전송 실패 후 TellDone은 받은 편지함"Webhook 실패" 카테고리에 메시지를 만들어요. 메시지는 영향을 받는 자동화의 이름을 보여주고 설정 > 연동 > 자동화 > [실패한 자동화] > 전송 로그로 바로 연결해서 응답을 검사하고 무엇을 할지 결정할 수 있게 해줘요.

받은 편지함 알림은 다운스트림 도구에서 누락된 데이터로 몇 주 후에 발견하는 대신 앱 아이콘 배지로 망가진 자동화를 알게 해줘요.

20회 실패 후: 자동 비활성화

자동 비활성화

같은 자동화에 대해 연속 20회 전송이 실패하면(받은 편지함 경고 후 카운트), TellDone이 망가진 엔드포인트로 핑을 멈추고 월 전송 할당량을 보호하기 위해 자동화를 자동으로 꺼요. 대상에서 문제를 수정한 다음 설정 > 연동 > 자동화에서 자동화를 다시 활성화하세요.

연속 실패 카운터는 다음 성공 전송에서 0으로 초기화돼요.

Webhook 관리

  • 일시 중지/재개 - 삭제 없이 자동화를 비활성화하고, 언제든 다시 활성화
  • 전송 로그 - 상태, HTTP 코드, 응답 시간이 있는 모든 전송 보기. 전송 완료나 오류로 필터링. 실패한 전송을 누르고 **"재시도"**를 선택하면 다음 예약된 재시도를 기다리지 않고 다시 보낼 수 있어요
  • 테스트 - 실제 이벤트를 만들지 않고 엔드포인트로 샘플 페이로드(본문에 "test": true 포함)를 보내려면 **"테스트"**를 누르세요. 테스트 전송은 월 할당량에 카운트되지 않아요
  • 비밀 키 회전 - URL이나 인증 헤더 변경 없이 새 HMAC 서명 비밀 키 생성
  • 편집 - URL, 인증 헤더, 페이로드 토글(노트 / 오디오 / 할 일 / 이벤트 / 리포트) 업데이트. 변경은 즉시 적용돼요
  • 삭제 - 자동화와 모든 전송 로그를 영구적으로 제거

전송 제한

Webhook 전송에는 두 가지 제한이 있어요: 월간 할당량(요금제에 따라 다른 하드 제한)과 시간당 버스트 제한(모든 유료 요금제에서 동일한 소프트 제한)이에요.

요금제Webhook월 전송시간당 버스트
Free00-
Basic1300100
Pro33,000100
Ultra1015,000100

Ultra 요금제는 노트 페이로드의 오디오 링크(24시간 만료)도 지원해요.

제한이 동작하는 방식:

  • 월간 한도 초과: 전송은 재시도 없이 실패로 표시돼요. 카운터가 초기화되는 다음 달 1일부터 새 전송이 다시 시작돼요.
  • 시간당 한도 초과: 전송은 연기되어 약 5분 후에 재시도되므로 짧은 버스트로 데이터가 손실되지 않아요. 영구적인 거부가 아니라 소프트 버스트 방지 장치예요.

테스트 전송과 전송 로그에서의 수동 재전송은 두 제한 모두에 포함되지 않아요.

테스트 이벤트 필터링

**"테스트"**를 누르면 페이로드의 최상위에 "test": true가 포함돼요. 자동화 도구에서 이 필드를 확인하고 있을 때 처리를 건너뛸 수 있어요.

플랫폼 가이드

자동화 도구별 단계별 설정 안내:

  • Zapier - Zap으로 TellDone을 수천 개의 앱에 연결
  • Make - 시각적 자동화 시나리오 구축(이전 Integromat)
  • n8n - 자체 호스팅 또는 클라우드 워크플로우에서 TellDone Webhook 사용
  • 사용자 엔드포인트 - HTTPS POST 요청을 받는 어떤 서비스든 TellDone Webhook과 작동해요

인기 있는 사용 사례

  • Zapier로 Google Sheet에 할 일 보내기
  • Make로 노트에서 Slack 메시지 만들기
  • n8n으로 사용자 CRM에 이벤트 기록
  • 모든 노트를 클라우드 저장소에 백업
  • 팀 대시보드에 리포트 전달

같이 보기

  • 받은 편지함과 지원 - Webhook이 반복 실패하면 받은 편지함에 메시지가 보여요
  • Zapier - 단계별 Zapier 설정
  • Make - 단계별 Make 설정
  • n8n - 단계별 n8n 설정
  • Todoist - 전용 양방향 할 일 동기화(Webhook 필요 없음)
  • Notion - 전용 Notion 연동
  • 이메일 전달 - 이메일로 노트 데이터 받기