통화 후 안내 문자 자동 발송: 전화와 문자를 잇는 시나리오
통화 후 안내 문자 자동 발송은 CALL_COMPLETED 웹훅으로 통화 결과와 요약을 받아 규칙에 맞는 문자를 POST /chat으로 보내고, SEND_RESULT 웹훅으로 전달 여부를 확인하는 흐름입니다. 상태별 규칙, 중복 방지, 비용을 정리했습니다.

통화 후 안내 문자 자동 발송은 KAT Cloud(캣클라우드)가 통화 종료 뒤 보내는 CALL_COMPLETED 웹훅으로 통화 상태와 요약을 받고, 내 서버가 규칙에 맞는 문자를 POST /chat-room과 POST /chat으로 보낸 다음, SEND_RESULT 웹훅으로 전달 여부를 확인하는 흐름입니다. 전화와 문자가 같은 번호, 같은 API로 오가므로 고객은 방금 통화한 번호로 확인 문자를 받습니다. 이 글은 특정 업종의 실제 사례가 아니라 예약·접수형 전화에 두루 쓸 수 있는 설계 예시입니다.
어떤 통화 뒤에 어떤 문자를 보낼까
모든 통화에 문자를 보내면 고객에게 소음이 됩니다. CALL_COMPLETED의 status(ANSWERED, MISSED, REJECTED, UNKNOWN)와 tag(AI, DIRECT, AI_TO_DIRECT, UNKNOWN), isInbound 값으로 규칙을 먼저 정합니다.
| 조건 | 상황 | 보낼 문자 |
|---|---|---|
ANSWERED + AI | AI가 접수·안내로 끝낸 통화 | 접수 내용 확인 문자 |
ANSWERED + AI_TO_DIRECT | 직원에게 넘어간 통화 | 담당자 상담 안내 또는 생략 |
ANSWERED + DIRECT | 직원이 바로 받은 통화 | 대개 생략(직원이 판단) |
MISSED | 받지 못한 통화 | 콜백 안내(번호당 하루 1회) |
REJECTED, UNKNOWN | 거절·확인 불가 | 보내지 않음 |
업종마다 규칙은 다릅니다. 병원이라면 예약 변경 확인, AS 접수라면 접수번호 안내, 식당이라면 예약 내용 확인이 첫 번째 줄에 들어갑니다. 부재중 기록은 status로 구분하고, 웹훅으로 받지 못한 기록이 있는지 통화 기록 증분 조회로 보완하면 빠짐이 줄어듭니다.
AI 통화가 문자로 이어지는 장면

AI 에이전트가 통화 중에 "문자로 보내 드릴게요"라고 말하도록 응대 지침(KAT Cloud 콘솔에서 설정)에 넣어 두면, 고객은 문자를 기다리게 되고 다시 전화하는 일이 줄어듭니다. 대신 약속한 문자는 반드시 나가야 하므로 아래 흐름에 실패 처리까지 넣어야 합니다. 직원이 판단해야 하는 내용, 예를 들어 확정이 필요한 예약은 "접수"와 "확정"을 문구에서 구분합니다.
처리 흐름: CALL_COMPLETED에서 SEND_RESULT까지

- 1웹훅을 받으면 먼저 200으로 응답합니다. 웹훅 타임아웃은 10초이므로 문자 발송은 큐에 넣어 비동기로 처리합니다.
- 2
callHistoryId로 이미 처리한 통화인지 확인합니다. - 3
status·tag·isInbound로 위 표의 규칙을 적용합니다. - 4문구는 정해진 템플릿에 summary에서 뽑은 값(날짜, 인원, 접수 내용)만 채웁니다.
- 5고객 번호(수신 통화면
fromNumber)와channelId로POST /chat-room을 호출해 채팅방 ID를 받습니다. 같은 조합이면 기존 채팅방 ID가 돌아옵니다. - 6
POST /chat에externalMessageId로call-{callHistoryId}를 넣어 보냅니다. - 7응답의
chatId를 저장해 두고,SEND_RESULT의resultStatus가4100(SMS),6600(LMS/MMS),7000(카카오) 중 하나면 성공으로 처리합니다.
const SUCCESS = new Set(['4100', '6600', '7000']);
async function onCallCompleted(data) {
if (await alreadyHandled(data.callHistoryId)) return;
const template = pickTemplate(data.status, data.tag, data.isInbound);
if (!template) return;
const customer = data.isInbound ? data.fromNumber : data.toNumber;
const room = await api.post('/chat-room', { channelId: data.channelId, phoneNumber: customer });
const chat = await api.post('/chat', {
chatRoomId: room.data.result,
content: template(extractFields(data.summary)),
externalMessageId: `call-${data.callHistoryId}`,
});
await saveSent(data.callHistoryId, chat.data.result.chatId);
}
async function onSendResult(data) {
await markDelivery(data.chatId, SUCCESS.has(data.resultStatus), data.resultMessage);
}summary와 sttAI의 구조는 통화 받아쓰기와 요약 데이터 구조에, 채팅 API 호출은 채팅 API로 문자 보내기에, 결과 코드 처리는 문자 발송 결과 확인에 자세히 있습니다. 웹훅 서버 뼈대는 Node.js(Express)로 웹훅 수신 서버 만들기에서 시작할 수 있습니다. 이벤트 형식은 API 문서의 웹훅 이벤트를 확인하세요.
월 비용 감 잡기
웹훅과 채팅 API는 비즈니스 요금제 그룹에서 쓸 수 있으므로 비즈니스 플랜(월 50,000원, 수신 3,000분·SMS 200건 포함)을 기준으로 합니다. 가정: 월 수신 1,000통, 통화당 청구 3분(3,000분), 음성 모델 Qwen3.8 Omni Flash Realtime(분당 10원), AI 받아쓰기·요약 사용, 통화 뒤 문자 1,000건. 부가세 별도입니다.
| 항목 | SMS로 보낼 때 | LMS로 보낼 때 |
|---|---|---|
| 비즈니스 플랜 | 50,000원 | 50,000원 |
| 수신 3,000분 | 포함 3,000분 이내, 0원 | 0원 |
| 음성 모델 | 3,000분 × 10원 = 30,000원 | 30,000원 |
| 받아쓰기·요약 | 3,000분 × 20원 = 60,000원 | 60,000원 |
| 문자 1,000건 | (1,000 − 200) × 10원 = 8,000원 | 1,000 × 32원 = 32,000원 |
| 합계 | 148,000원 | 172,000원 |
LMS 열은 포함 200건이 LMS에는 적용되지 않는다고 보고 보수적으로 계산했습니다. 1,000건 기준 차이는 24,000원이므로, 확인 문자는 90바이트(한글 약 45자) 안으로 줄여 SMS로 보내고 긴 안내만 LMS로 보내는 것이 경제적입니다. 단가는 요금에 있습니다.
도입 시 주의할 점
- 요약을 그대로 보내지 않기: AI 요약은 틀릴 수 있고 내부 메모 성격의 문장이 섞일 수 있습니다. 고객에게는 템플릿 문구와 확인된 값만 보냅니다.
- 녹음이 꺼진 통화:
isRecorded가 false인 통화는 요약과 받아쓰기가 없으므로 기본 문구를 쓰거나 보내지 않습니다. - 중복 발송 방지: 같은 이벤트를 두 번 처리하는 경우에 대비해
callHistoryId처리 기록과externalMessageId를 함께 씁니다. - 실패 처리: 결과 코드가 성공이 아니면 재시도 횟수를 정하고, 그래도 실패하면 담당자에게 알립니다. 웹훅을 못 받았을 때는
GET /chat(chatRoomId)으로 채팅방 메시지의sendStatus와resultStatus를 조회해 보완합니다. - 시간대와 내용: 새벽 부재중 통화의 콜백 안내는 아침으로 미루는 등 발송 시간을 정합니다. 정보성 문자에 광고 문구를 섞으면 별도 규정이 적용될 수 있으므로 실제 적용은 법률 검토가 필요합니다.
자주 묻는 질문
통화가 끝나면 문자는 언제 보낼 수 있나요?
KAT Cloud의 CALL_COMPLETED 웹훅은 통화가 끝나고 받아쓰기·요약 처리가 완료되면 전송되므로, 끊은 직후가 아니라 요약이 준비된 시점에 문자를 보낼 수 있습니다. 요약이 필요 없는 단순 안내라도 이 이벤트를 기준으로 삼으면 통화 결과(status, tag)를 확인한 뒤 보낼 수 있습니다.
같은 문자가 두 번 나가지 않게 하려면 어떻게 하나요?
내 서버가 callHistoryId별 처리 여부를 저장해 두고, KAT Cloud POST /chat의 externalMessageId에 통화 기록 ID를 넣어 보내는 방식이 안전합니다. externalMessageId는 API 문서에 중복 방지용 외부 메시지 ID로 정의되어 있습니다.
문자가 실제로 도착했는지 어떻게 확인하나요?
KAT Cloud에서 POST /chat 직후의 상태는 PENDING이고, 최종 결과는 SEND_RESULT 웹훅의 resultStatus로 옵니다. SMS는 4100, LMS·MMS는 6600, 카카오는 7000이면 전달 성공이며, 발송 응답의 chatId로 두 기록을 이어 붙입니다.
- #통화 후 문자
- #전화 문자 연동
- #CALL_COMPLETED
- #SEND_RESULT
- #사용 사례



