결제 직후 한 통은 카카오 알림톡이다. 채널을 추가하지 않은 번호에도 정보성 템플릿만 나간다. 광고 문장은 반려되고, 친구톡은 2025년 12월 31일로 끝났다. 솔라피 표준 단가 13원에 부가세 10%가 붙는다. 결제 커밋과 발송은 나눈다. 개발자, API, 스타트업, Next.js, 백엔드 기준으로 심사, 대체 문자, 아웃박스만 본다.
결제 완료를 이메일만 보냈더니, 사용자가 입금이 안 됐다고 물어본 적 있으신가요? 한국에서는 카카오톡 알림이 먼저 열립니다. 알림톡은 채널을 추가하지 않은 번호에도 정보성 한 통을 넣습니다. 템플릿은 카카오 심사를 통과해야 하고, 광고 문장이 한 줄이라도 있으면 반려됩니다. 친구톡은 2025년 12월 31일로 끝났고, 2026년 광고 칸은 브랜드 메시지입니다. 메일 디엔에스는 디킴 글에 두고, 카카오 로그인 주소는 터널 글에 있습니다. 여기는 결제 직후 한 통만 봅니다.
12개 사이트를 돌리며 저는 토스 웹훅이 끝난 뒤에야 알림을 넣습니다. 숫자는 2026년 8월 카카오 비즈메시지 가이드와 솔라피 가격표 기준입니다.
알림톡이 문자보다 먼저 열리는 이유
결제 직후 한 통은 카카오톡으로 보냅니다. 문자는 알림톡이 실패했을 때만 넘깁니다. 메일은 영수증과 디킴이 필요한 자리입니다.
알림톡은 카카오톡 채널을 추가하지 않은 번호에도 나갑니다. 카카오 공식 가이드가 주문 확인, 결제 완료, 배송 안내처럼 구매자가 꼭 봐야 하는 정보성 메시지라고 적습니다. 채널 친구가 아닌 사람에게 프로모션을 넣는 칸이 아닙니다. 그 칸은 브랜드 메시지입니다.
문자는 번호만 있으면 됩니다. 다만 스팸함과 통신사 필터를 먼저 만납니다. 알림톡은 카카오톡 알림 목록에 채널 이름으로 뜹니다. 솔라피 표준 단가는 알림톡 13원, 단문 18원, 장문 45원입니다. 모두 부가세 별도입니다. 같은 내용을 장문으로 보내면 한 통이 세 배가 됩니다.
칸
누구에게
무엇을
심사
언제 쓰나
알림톡
번호만 있으면 됨. 채널 친구 아님
승인된 템플릿만
영업일 2일 안. 필수
결제 완료, 예약 확정, 배송
문자
국내 번호
자유 문장. 발신번호 등록
없음
알림톡 실패 대체, 해외 번호 제외 확인
이메일
가입 메일
영수증, 첨부
디킴 정렬
증빙. 즉시 확인용이 아님
브랜드 메시지
채널 친구. 확장 발송은 별도 심사
자유형 또는 템플릿
광고면 (광고) 표시, 8시~20시 50분
이벤트, 재구매 안내. 결제 완료 칸 아님
카카오 로그인 리다이렉트는 콘솔 주소 문제입니다. 그 자리는 터널에 있습니다. 메일이 스팸함으로 가면 디킴입니다. 여기는 전화번호로 한 통이 나가는 자리만 봅니다.
채널만 만들었다고 안 나갑니다 | 비즈니스 채널로 바꾸고, 홈공개를 켜고, 고객센터 전화 또는 주소를 넣어야 합니다. 알림톡은 카카오 공식 딜러사나 그 위를 감싼 솔라피 같은 발송사를 통합니다. 디벨로퍼스 메시지 에이피아이와 칸이 다릅니다.
결제 완료 템플릿은 어디서 반려되나
결제 금액, 주문 번호, 결제일만 있는 문장은 통과하는 달이 많습니다. 같은 칸에 할인 쿠폰이나 앱 설치 버튼을 넣으면 반려됩니다.
카카오 심사 가이드는 정보성만 받습니다. 계약 이행, 거래 완료, 수신자가 반드시 알아야 하는 필수 정보입니다. 형식이 고정된 반복 메시지여야 합니다. 가끔 보내는 공지, 변수로만 채운 본문, 변수가 40개를 넘는 템플릿, 버튼 이름에 변수를 넣은 템플릿은 반려 칸입니다. 심사는 영업일 기준 2일 안에 순차로 처리한다고 가이드가 적습니다.
가이드가 발송 불가로 적어 둔 삽입 문구가 있습니다. 앱 설치를 유도하는 문장, 무료 체험이나 할인 쿠폰을 조건으로 개인정보 등록을 유도하는 문장, 수신자가 동의하지 않은 쿠폰 발급 안내입니다. 포인트 소멸 안내는 유상 거래 적립이면 정보성으로 보는 예시가 있습니다. 동의 없이 쿠폰을 만들어 놓고 자랑하는 문장은 다른 칸입니다.
문장
심사에서 자주 가는 칸
고치는 법
주문 #{번호} 결제가 완료됐습니다. 금액 #{원}
승인 쪽. 거래 완료
변수마다 예시 텍스트를 넣는다
결제 완료. 지금 앱 설치하고 쿠폰 받으세요
반려. 앱 설치, 쿠폰 유도
설치와 쿠폰 문장을 뺀다
#{본문}
반려. 변수만 있는 템플릿
고정 문장을 남기고 숫자만 변수로
이번 주 공지입니다. #{내용}
반려. 간헐 공지
알림톡이 아니라 브랜드 메시지 또는 메일
가이드가 한 줄을 분명히 적습니다. 카카오 심사는 수신 동의와 계약 내용을 확인할 수 없어서, 심사 기준이 정보통신망법과 완전히 같지 않을 수 있습니다. 심사를 통과해도 법령 위반의 책임은 전송자에게 있습니다. 신고가 많이 모이면 사업자등록번호 기준으로 알림톡과 브랜드 메시지가 영구 중지될 수 있다고 적혀 있습니다. 법률 판단은 이 글의 범위가 아닙니다. 템플릿을 넣기 전에 카카오 심사 가이드와 한국인터넷진흥원 스팸 방지 안내서를 같이 엽니다.
심사 통과가 법령 면책이 아닙니다 | 카카오 가이드가 전송자 책임이라고 적습니다. 승인된 템플릿에 광고 문장을 나중에 변수로 끼워 넣는 방식은 신고와 차단으로 이어질 수 있습니다. 변수 예시는 실제 발송과 같은 종류의 값만 넣습니다.
결제 금액과 주문 번호만 있는 문장은 통과 쪽에 가깝다. 쿠폰과 앱 설치를 붙이면 반려 칸이다
한 통 13원, 부가세는 카드에 따로 붙는다
솔라피 웹 가격표는 알림톡 1건 13원입니다. 부가세는 빠져 있습니다. 한국 카드로 충전하면 10퍼센트가 따로 찍힙니다.
2026년 8월 솔라피 표준 단가입니다. 알림톡 13원, 단문 18원, 장문 45원, 네이버 톡톡 13원. 알림톡은 한글과 영어 합쳐 1,000자입니다. 월 발송량이 1만 건을 넘으면 할인 구간이 열립니다. 최근 3개월 평균으로 조정된다고 가격표가 적습니다. 엔에이치엔 클라우드 같은 공식 딜러사 단가는 계약마다 다릅니다. 1인 개발자는 솔라피 콘솔 충전이 먼저인 달이 많습니다.
13원에 부가세 10퍼센트를 붙이면 14.3원입니다. 단문은 19.8원입니다. 결제 완료 한 통을 알림톡으로 보내고 실패만 단문으로 넘기면, 성공 건은 장문보다 싸게 끝납니다. 실패율 가정이 없으면 월 예산을 못 짭니다. 저는 사이드 프로젝트 첫 달 예산을 알림톡 성공 200건, 대체 문자 20건으로 잡았습니다. 200 곱하기 14.3원과 20 곱하기 19.8원을 더하면 약 3,256원입니다. 콘솔 최소 충전 단위는 그보다 큽니다. 잔액이 남습니다.
타입
표준 단가 (부가세 별도)
카드 실청구 가늠
글자
알림톡
13원
14.3원
1,000자
단문
18원
19.8원
단문 제한
장문
45원
49.5원
장문 제한
키와 시크릿은 환경 변수에 둡니다. 레포에 올리면 시크릿 체크 글의 사고와 같습니다. 발신번호는 대체 문자용입니다. 알림톡만 성공하면 발신번호가 카카오톡에 보이지 않습니다. 대체 문자가 나갈 때 그 번호가 찍힙니다.
솔라피 공식 예제 형태로 결제 완료 알림톡 한 통
// https://github.com/solapi/solapi-nodejs/blob/master/examples/javascript/common/src/kakao/send/send_alimtalk.js
const { SolapiMessageService } = require('solapi')
const messageService = new SolapiMessageService(
process.env.SOLAPI_API_KEY,
process.env.SOLAPI_API_SECRET
)
// 수신·발신 번호에서 하이픈을 뺀다. 공식 예제가 그렇게 적는다
// disableSms 기본은 대체 문자 허용. 인증번호처럼 카카오만 원할 때 true
async function sendPaymentAlimtalk({ to, orderId, amountKrw }) {
return messageService.send({
to,
from: process.env.SOLAPI_FROM,
kakaoOptions: {
pfId: process.env.SOLAPI_PF_ID,
templateId: process.env.SOLAPI_TEMPLATE_PAYMENT,
variables: {
'#{주문번호}': String(orderId),
'#{금액}': String(amountKrw)
}
}
})
}
솔라피 표준 단가는 부가세 별도다. 한국 카드 충전은 10퍼센트가 따로 붙는다
친구톡 칸을 그대로 두면 2026년에 깨진다
친구톡은 2025년 12월 31일로 끝났습니다. 솔라피 공지는 2026년 1월 1일부터 친구톡 요청을 브랜드 메시지 자유형으로 바꾼다고 적습니다.
예전에 채널 친구에게 가벼운 안내를 친구톡으로 넣던 코드가 남아 있으면, 지금 나가는 칸이 달라집니다. 브랜드 메시지는 광고 내용을 넣을 수 있고, 그때는 (광고) 표시와 수신 거부, 발송 시간 8시부터 20시 50분 한국 시간이 붙습니다. 결제 완료를 친구톡으로 넣던 팀은 알림톡 템플릿으로 옮기는 편이 맞습니다. 결제 완료는 정보성 칸입니다.
브랜드 메시지 확장 발송은 채널 친구 5만 명 이상과 별도 심사가 필요하다고 솔라피 가이드가 적습니다. 사이드 프로젝트 첫 달에는 그 칸이 열리지 않습니다. 상담톡은 카카오 공식 딜러사로만 도입됩니다. 채널 관리자센터의 1대 1 채팅과 상품이 다릅니다.
구 코드를 지울 때는 템플릿 아이디만 바꾸지 않습니다. 메시지 타입 필드가 친구톡으로 남아 있으면 브랜드 메시지로 빠집니다. 솔라피 발송 로그에서 타입이 어떻게 찍히는지 한 건을 봅니다. 로그 웹훅이 두 번 오면 멱등 글입니다.
결제 커밋과 발송을 한 쿼리에 묶지 않는다
토스 웹훅으로 결제가 확정된 뒤에 알림 행을 넣습니다. 같은 트랜잭션에서 솔라피를 호출하지 않습니다. 외부 에이피아이가 3초를 넘기면 결제도 같이 롤백됩니다.
순서는 단순합니다. 웹훅에서 결제 상태를 완료로 바꿉니다. 같은 디비 트랜잭션 안에 알림 아웃박스 한 줄을 넣습니다. 커밋이 끝난 뒤에 워커가 솔라피를 호출합니다. 아웃박스 아이디를 멱등 키로 씁니다. 솔라피가 타임아웃이어도 결제는 이미 남아 있습니다. 워커가 다시 보내면 같은 아이디라 두 번 과금되지 않게 막습니다. 이중 쓰기 자체는 아웃박스 글에 있습니다. 여기는 알림톡 한 줄만 붙입니다.
결제 확정과 알림 행을 한 트랜잭션에 넣고, 발송은 워커가 한다
// 웹훅 핸들러. 솔라피 호출은 여기 두지 않는다
async function markPaidAndEnqueueAlimtalk(client, { paymentKey, orderId, phone, amountKrw }) {
await client.query('BEGIN')
try {
const paid = await client.query(
`UPDATE payments SET status = 'paid', paid_at = now()
WHERE payment_key = $1 AND status = 'pending'
RETURNING id`,
[paymentKey]
)
if (paid.rowCount === 0) {
await client.query('ROLLBACK')
return { duplicate: true }
}
await client.query(
`INSERT INTO notification_outbox
(id, channel, template_key, payload, status)
VALUES ($1, 'alimtalk', 'payment_done', $2, 'pending')
ON CONFLICT (id) DO NOTHING`,
[orderId, JSON.stringify({ to: phone, orderId, amountKrw })]
)
await client.query('COMMIT')
return { duplicate: false }
} catch (err) {
await client.query('ROLLBACK')
throw err
}
}
워커는 pending 행만 집어 공식 send 를 호출합니다. 응답의 그룹 아이디를 저장하고 sent 로 바꿉니다. 실패하면 횟수를 올리고, 솔라피나 엔에이치엔이 연속 5초를 넘기면 회로를 엽니다. 그 패턴은 회로 차단에 있습니다. 웹훅이 같은 결제 키로 다시 오면 위 쿼리의 pending 조건에서 0행이 나옵니다. 알림 행을 다시 넣지 않습니다.
웹훅 안에서 await send 를 부르지 않습니다 | 토스와 카카오 콜백은 빨리 200을 줘야 재시도가 멈춥니다. 발송은 아웃박스 워커 몫입니다. 콜백 주소 자체는 터널 글입니다.
결제를 먼저 커밋한다. 워커가 솔라피를 호출하고, 같은 주문 번호로 두 번 넣지 않는다
대체 문자가 두 번 나가는 자리
알림톡이 실패하면 솔라피가 문자로 넘깁니다. disableSms 를 켜지 않은 기본값입니다. 워커가 타임아웃을 실패로 보고 다시 보내면, 첫 호출의 문자가 늦게 도착하고 둘째 호출이 또 문자를 엽니다.
공식 예제 주석이 disableSms 를 true 로 주면 대체 발송이 꺼진다고 적습니다. 철자가 disbaleSms 로 적힌 줄이 예제에 있습니다. 필드 이름은 disableSms 입니다. 인증번호처럼 카카오톡에만 있어야 하는 통은 대체를 끕니다. 결제 완료는 대체를 켜 두되, 워커 재시도는 솔라피 메시지 아이디가 생긴 뒤에는 보내지 않습니다.
카카오톡이 깔리지 않은 번호, 해외 번호, 채널이 차단된 번호는 알림톡이 거절됩니다. 해외 번호는 대체 문자도 국내 단문 요금이 아닙니다. 가입 폼에서 국가 번호를 나누고, 한국 번호만 알림톡 큐에 넣습니다. 발신번호가 없으면 대체 문자가 거절됩니다. 콘솔에서 발신번호를 등록한 뒤에 from 칸을 채웁니다.
템플릿 변수가 문자열이어야 합니다. 숫자를 그대로 넣으면 에스디케이가 거절하는 달이 있습니다. String 으로 감쌉니다. 하이픈이 있는 010-1234-5678 은 공식 예제가 빼라고 적습니다. 미리보기 문구에 변수를 넣으면 심사에서 반려됩니다. 미리보기는 고정 문장만 둡니다.
단가와 메뉴 이름은 수시로 바뀝니다. 위 표는 2026년 8월 공개 문서 기준이며, 콘솔에 찍힌 잔액과 심사 결과를 우선합니다. 법령 해석은 공식 안내서와 자문 몫입니다.
자주 묻는 질문
개인 명의로도 알림톡을 보낼 수 있나?
사업자 인증이 된 비즈니스 채널이 필요합니다. 채널만 만들고 개인 프로필로 남기면 알림톡 템플릿 칸이 열리지 않습니다. 홈공개와 고객센터 정보까지 채운 뒤에 딜러사 또는 솔라피에 채널을 붙입니다. 사이드 프로젝트가 아직 사업자가 없으면 문자와 메일만 열고, 사업자 등록 후에 알림톡 심사를 넣습니다.
친구톡 코드가 아직 남아 있으면?
2026년 1월 1일부터 솔라피는 친구톡 요청을 브랜드 메시지 자유형으로 바꿉니다. 결제 완료는 알림톡 템플릿으로 옮깁니다. 브랜드 메시지에 광고 문장이 들어가면 (광고) 표시와 저녁 8시 50분 제한이 붙습니다. 발송 로그의 타입 한 줄을 보고 구 코드를 지웁니다.
카카오 심사를 통과하면 광고성 규제에서 끝나나?
가이드가 아니라고 적습니다. 심사는 수신 동의와 계약을 확인하지 못합니다. 법령 위반 책임은 전송자에게 있고, 신고가 쌓이면 사업자등록번호로 영구 중지될 수 있습니다. 이 글은 법률 자문이 아닙니다. 템플릿을 넣기 전에 카카오 심사 가이드와 한국인터넷진흥원 안내서를 엽니다.
인증번호도 알림톡으로 보내나?
보낼 수는 있습니다. 대체를 끄지 않으면 실패 시 문자로 번호가 한 번 더 갑니다. 인증번호는 disableSms 를 true 로 두고, 실패하면 사용자가 다시 요청하게 합니다. 결제 완료는 대체를 켜 두되 워커 재시도만 막습니다.
해외 번호 사용자에게도 나가나?
알림톡은 카카오톡이 있는 국내 번호 중심입니다. 해외 번호는 거절되거나 대체 요금이 달라집니다. 가입 때 국가 번호를 나누고, 한국 010만 알림톡 큐에 넣습니다. 그 외는 메일로 영수증을 보냅니다.
솔라피 키가 깃허브에 올라가면?
콘솔에서 키를 폐기하고 새로 발급합니다. 잔액이 남아 있으면 타인이 문자를 태울 수 있습니다. 환경 변수와 프리커밋 시크릿 스캔을 시크릿 체크 글 순서대로 붙입니다. 로그에 수신 번호를 그대로 남기지 않습니다.