← 블로그 목록

AI 전화가 끝나면 카카오 알림톡 자동 발송하기

ClawOps 통화 요약 웹훅과 메시지 API를 연결해 AI 전화에서 수집한 이름과 요청을 승인된 카카오 알림톡으로 자동 발송하는 방법을 실제 운영 테스트로 검증했습니다.

전화에서 이렇게 말해봤습니다.

"제 이름은 권혁이고 카카오 알림 쪽으로 안내를 보내주세요."

통화가 끝난 뒤 받아쓰기와 요약이 차례로 완료됐고, 1분 17초 만에 카카오 알림톡이 발송 완료 상태가 됐습니다. 아래 화면은 예시 디자인이 아니라 2026년 9월 1일 ClawOps 운영 환경에서 직접 건 통화의 결과입니다.

실제 알림톡 발송 완료 기록

이 경험을 만들 때 알림톡 발송 코드를 VoiceML이나 콜 플로우 안에 넣는 게 좋을까요? 결론부터 말하면 통화 후 자동 발송은 별도 서버에서 직접 구현하는 편이 가장 안전합니다.

AI 전화 종료
  → ClawOps 받아쓰기
  → ClawOps 통화 요약
  → summary.completed 웹훅
  → 우리 서버가 고객명·발송 여부 확인
  → ClawOps 메시지 API
  → 카카오 알림톡
     └ 실패하면 SMS/LMS 폴백

콜 플로우는 통화 중 분기와 연결에, VoiceML은 음성 응답에 적합합니다. 반면 알림톡은 통화가 끝난 뒤 생성되는 요약, 승인된 템플릿, 중복 발송 방지, 실패 시 문자 대체 발송을 다뤄야 합니다. 수명 주기가 다르므로 웹훅 후처리로 분리하면 코드도 운영도 단순해집니다.

실제로 준비한 것

이번 테스트에서는 ClawOps의 다음 기능을 사용했습니다.

  1. AI 전화 에이전트와 070 번호
  2. 통화 녹음, 받아쓰기, 통화 요약 부가서비스
  3. 연결된 카카오톡 채널과 승인된 알림톡 템플릿
  4. summary.completed 이벤트를 받을 HTTPS 웹훅
  5. ClawOps Node.js SDK v0.36 이상과 API 키

통화 인텔리전스는 녹음 → 받아쓰기 → 요약 순서로 실행됩니다. 따라서 요약 웹훅을 쓰려면 앞 단계도 모두 켜져 있어야 합니다.

통화 녹음·받아쓰기·요약 활성화 화면

알림톡은 별도로 부가서비스를 켜는 기능이 아닙니다. Trial에서는 발송할 수 없고, 결제 중인 계정은 바로 사용할 수 있으며 실제 발송 건수에 따라 추가 과금됩니다. 발송 전에는 카카오톡 채널 연결과 템플릿 승인이 필요합니다.

카카오톡 채널은 ClawOps 대시보드의 알림톡 메뉴에서 연결합니다.

연결된 카카오톡 채널

채널을 연결한 뒤 템플릿을 등록하고 카카오 승인을 기다립니다. 알림톡 본문은 API를 호출할 때 자유롭게 바꾸는 방식이 아닙니다. 승인된 본문은 고정하고 #{이름} 같은 변수만 실제 값으로 치환해야 합니다.

승인된 알림톡 템플릿 목록

1. 전화에서 발송 의도와 고객 정보를 받는다

이번 데모는 고객이 이름과 알림톡 요청을 자연스럽게 말하도록 AI 에이전트를 구성했습니다. 별도의 버튼 입력이나 키패드는 필요 없습니다.

실제 통화 받아쓰기

통화가 끝나자 ClawOps가 전체 대화를 요약했습니다. 실제 요약에는 고객 이름과 “카카오 알림으로 안내 요청”이라는 결정 사항이 남았습니다.

실제 통화 요약

데모에서는 기존 기본 요약의 자연어 문장에서 값을 읽었습니다. 빠르게 검증하기에는 충분하지만, 운영 환경에서는 요약 출력 형식을 JSON으로 고정하는 것을 권장합니다.

{
  "customerName": "권혁",
  "sendAlimtalk": true,
  "requestType": "signup_guide"
}

이렇게 하면 AI가 “알림톡”을 “카카오 알림”으로 바꿔 요약해도 키워드 정규식에 의존하지 않습니다. 템플릿이 여러 개라면 requestType을 템플릿 선택 키로 사용하면 됩니다.

2. summary.completed 웹훅을 받는다

ClawOps 대시보드의 API & Webhooks에서 서버 주소를 등록하고 summary.completed 이벤트를 선택합니다. 요청 본문은 application/x-www-form-urlencoded 형식이며, 운영 서버에서는 반드시 X-Signature를 검증해야 합니다.

아래는 핵심만 남긴 Node.js 예시입니다.

npm install @teamlearners/clawops@^0.36.0 express
import express from "express";
import { ClawOps } from "@teamlearners/clawops";

const app = express();
const clawops = new ClawOps(); // CLAWOPS_API_KEY, CLAWOPS_ACCOUNT_ID 사용
app.use(express.urlencoded({ extended: false }));

app.post("/webhooks/clawops", async (req, res) => {
  // 실제 운영에서는 원본 요청값으로 X-Signature를 먼저 검증하세요.
  res.sendStatus(204);

  if (req.body.Event !== "summary.completed") return;

  const direction = req.body.Direction;
  const customerPhone = direction === "outbound"
    ? req.body.To
    : req.body.From;

  const summary = JSON.parse(req.body.SummaryJson || "{}");
  const result = readStructuredResult(summary);

  if (!result.sendAlimtalk) return;

  await sendAlimtalk({
    to: customerPhone,
    name: result.customerName,
    callId: req.body.CallId,
  });
});

여기서 Direction 처리가 중요합니다. 수신 통화에서는 고객 번호가 From이지만, AI가 먼저 건 발신 통화에서는 고객 번호가 To입니다. 한쪽만 가정하면 테스트는 통과해도 실제 발신 캠페인에서 알림이 나가지 않습니다.

웹훅에는 같은 이벤트가 다시 전달될 수 있습니다. 응답은 먼저 204로 빠르게 돌려주고, 실제 처리는 큐나 비동기 작업으로 넘기세요. 그리고 CallId 기준으로 이미 처리한 통화인지 저장해야 합니다.

3. 승인된 템플릿으로 알림톡을 보낸다

웹훅에서 얻은 고객 번호와 이름을 ClawOps 메시지 API에 전달합니다.

async function sendAlimtalk({ to, name, callId }) {
  return clawops.messages.create({
    to,
    from: process.env.CLAWOPS_FROM_NUMBER,
    kakao: {
      channelId: process.env.KAKAO_CHANNEL_ID,
      templateId: process.env.KAKAO_TEMPLATE_ID,
      variables: {
        "#{홍길동}": name,
        "#{url}": "https://claw-ops.com",
      },
    },
    fallback: {
      body: `${name}님, 전화로 요청하신 안내입니다. ` +
        "알림톡 발송에 실패해 문자로 대신 보냈습니다.",
    },
    idempotencyKey: `call-alimtalk:${callId}`,
  });
}

channelIdtemplateId는 대시보드에서 확인한 값을 환경변수에 보관합니다. SDK는 CLAWOPS_API_KEYCLAWOPS_ACCOUNT_ID를 자동으로 읽습니다. API 키나 서명 키는 Git 저장소에 넣지 마세요.

Fallback은 알림톡 전송이 실패했을 때 SMS/LMS로 대신 보내는 안전망입니다. 카카오톡 미사용자, 차단된 채널 등에서도 안내를 놓치지 않을 수 있지만 대체 문자는 별도로 과금됩니다.

IdempotencyKey에는 통화 ID를 포함했습니다. 네트워크 재시도나 웹훅 재전달이 있어도 같은 통화에서 동일한 알림이 두 번 생성되는 것을 막기 위해서입니다. 애플리케이션 DB에서도 CallId에 고유 제약을 두면 더 안전합니다.

운영 테스트에서 실제로 발견한 두 가지

이번 글을 위해 코드를 작성한 뒤 바로 성공한 것은 아닙니다. 실제 전화를 걸어보니 로컬 테스트에서는 보이지 않던 문제가 두 개 드러났습니다.

첫째, 고객은 “알림톡”이라고 말했지만 요약 모델은 이를 “카카오 알림”으로 정리했습니다. 단어 하나를 찾는 방식은 쉽게 깨집니다. 초기 데모의 표현 범위를 넓혀 다시 검증했고, 운영용 설계는 앞서 본 구조화 JSON 방식으로 정리했습니다.

둘째, 최초 웹훅 코드는 고객 번호가 항상 From이라고 가정했습니다. 실제 테스트는 AI가 고객에게 건 아웃바운드 통화였기 때문에 고객은 To였습니다. Direction을 기준으로 번호를 고르도록 수정한 뒤 실제 웹훅을 다시 처리했고 알림톡이 정상 발송됐습니다.

이 두 문제 때문에라도 “코드 예시가 그럴듯해 보인다”에서 멈추지 말고, 반드시 아래 전체 경로를 운영 환경에서 한 번 통과시켜야 합니다.

실제 전화 → 실제 받아쓰기 → 실제 요약 → 서명된 웹훅
→ 승인 템플릿 → 실제 수신 번호 → 발송 상태 확인

이번 검증에서는 통화가 정상 종료된 뒤 받아쓰기와 요약이 완료됐고, 동일 통화 ID를 멱등성 키로 사용한 알림톡 메시지가 발송 완료가 되는 것까지 확인했습니다.

어떤 경우에 이 구조가 잘 맞을까

  • 병원·식당 예약 통화 후 예약 일시와 위치 보내기
  • 부동산 상담 후 매물 링크 보내기
  • AS 접수 후 접수번호와 방문 예정일 보내기
  • 채용 전화 인터뷰 후 일정 선택 링크 보내기
  • 결제 안내 통화 후 승인된 결제 정보 보내기

시나리오별로 템플릿을 따로 승인받고, 요약의 requestType으로 템플릿을 선택하면 하나의 웹훅 서버로 여러 자동화를 운영할 수 있습니다.

반대로 통화 도중 인증번호를 즉시 보내고 고객이 전화에서 그 값을 읽어야 한다면, 통화 에이전트의 도구 호출로 메시지 API를 실행하는 편이 맞습니다. 이 글의 구조는 통화 종료 후 요약을 바탕으로 보내는 후속 안내에 최적화돼 있습니다.

정리: 통화는 대화, 알림톡은 후처리

마법 같은 경험은 복잡한 화면에서 나오지 않습니다. 고객은 전화에서 원하는 것을 말하고, 전화를 끊은 뒤 익숙한 카카오톡에서 정확한 안내를 받습니다.

구현 경계만 명확히 잡으면 됩니다.

  • AI 에이전트·콜 플로우: 고객과 대화하고 필요한 정보를 확인
  • 받아쓰기·통화 요약: 대화를 후처리에 쓸 데이터로 변환
  • 웹훅 서버: 업무 규칙, 보안, 중복 방지, 템플릿 선택
  • ClawOps 메시지 API: 알림톡 발송과 문자 폴백

즉, 콜 플로우나 VoiceML에 모든 것을 넣기보다 작은 웹훅 서버를 직접 구현하는 것이 베스트입니다. ClawOps가 전화 인프라와 카카오 발송을 맡고, 제품에 고유한 업무 규칙만 직접 소유하는 방식입니다.

ClawOps 대시보드에서 시작하기 · 개발 문서 보기

이전 글

AI 전화 상담원에 구글 캘린더 연결하기 — Zapier MCP로 코드 없이 예약 조회·생성

ClawOps AI 전화 API로 시작하기

070 번호 발급부터 AI 음성 통화까지, REST API 몇 줄이면 됩니다.