무통장입금으로 구독 모델 운영하는 법

카드 자동결제 없이도 구독 서비스를 운영할 수 있습니다.
청구·매칭·연장을 자동화하는 상태 머신과 웹훅 설계, 입금자명 식별자 패턴까지 정리했습니다.
무통장입금은 자동 출금이 안 됩니다.
그러나 자동 청구·자동 매칭·자동 연장은 모두 가능합니다.
사람의 손이 필요한 건 고객이 한 번 입금하는 그 순간 하나뿐입니다.
카드 PG사를 거치지 않고 월 단위 멤버십이나 정기결제를 운영하려는 매장이 늘고 있습니다.
PG사 가입비 22만원, 연 관리비 11만원, 카드 수수료 3.3%는 매출 규모가 크지 않은 매장에 부담이 큰 비용 구조이기 때문입니다.
대안으로 무통장입금이 떠오르지만, “무통장입금은 자동결제가 안된다”는 점에 빠르게 포기하는 경우가 많습니다.
맞는 말이지만, 절반만 맞습니다.
“구독”의 정의부터 다시 잡습니다
무통장입금에서는 카드처럼 매달 자동으로 빼가는 흐름은 만들 수 없습니다.
대신 다음 3가지는 모두 시스템이 처리할 수 있습니다.
- 청구일이 다가오면 주문을 자동 생성합니다.
- 고객에게 입금 안내를 자동 발송합니다
- 입금이 들어오면 구독을 자동 연장합니다.
요악하면 카드 구독은 “출금 자동화”이고, 무통장입금 구독은 “청구·매칭·연장 자동화”입니다.
운영자가 직접 손대는 작업은 사실상 0건입니다.
5단계 상태 머신을 설계합니다.
구독을 단순히 “활성/비활성”으로 두면 미입금 처리가 무너집니다.
무통장입금 기반에서는 다음 5가지 상태로 나누시는 걸 권장드립니다.
| 상태 | 의미 | 진입 조건 | 다음 액션 |
|---|---|---|---|
| active | 정상 구독 중 | 입금 매칭 완료 | 다음 청구일 대기 |
| due | 청구일 도래 | 청구일 D-3 | 청구성 발행 + 안내 |
| grace | 유예기간 진입 | 청구일 결과 + 미입금 | 안내 재발송 |
| expired | 서비스 중단 | 유예기간 종료 | 데이터 30일 보관 |
| canceled | 사용자 직접 해지 | 해지 요청 | 만기까지 유지 |
상태 전이는 단방향이 아닙니다.grace상태에서 입금이 들어오면 active로 복귀하고, expired상태에서도 30일 안에 입금이 들어오면 복구할 수 있도록 설계하시는 게 좋습니다.
입금자명 식별자와 자동 청구를 붙입니다.
한 고객이 매월 입금하는 흐름에서 가장 중요한 건 매칭 정확도입니다.
이름만으로는 동명이인 충돌이 발생하므로, 구독 ID를 입금자명에 붙입니다.
입금자명: 홍길동
↓ 자동 변환
입금자명: 홍길동S0512
↑ 구독 ID 끝 4자리 (S = Subscription)매장 시스템에서 매일 새벽 cron으로 청구일이 다가오는 구독에 대해 페이싱크 주문(invoice)을 생성하시면 됩니다.
async function dailyBilling() {
const dueSubscriptions = await db.subscriptions.findDue({ daysAhead: 3 });
for (const subscription of dueSubscriptions ) {
const invoice = await paysync.invoices.create({
amount: subscription.plan.price,
payerName: `${subscription.customerName}S${subscription.id.slice(-4)}`,
account: subscription .merchantAccountId,
expiresAt: addDays(subscription .dueAt, 3), // 유예 3일
metadata: {
subscriptionId: subscription.id,
cycle: subscription.cycle
},
});
await notify(subscription.customer, invoice);
await db.subscriptions.setStatus(subscription.id, "due");
}
}주문이 만들어지면 카카오 알림톡 또는 이메일로 자동 안내가 나갈 수 있도록 합니다.
입금이 없을 경우 D+0, D+1, D+3에 자동 재안내를 발송하시는 걸 권장드립니다.
웹훅 한 번에 구독이 연장됩니다.
입금이 매칭되면 페이싱크가 매장 서버로 invoice.paid웹훅을 전송합니다.
매장은 이 웹훅 하나로 구독 연장 처리를 끝낼 수 있습니다.
app.post("/webhooks/paysync", verifySignature, async (req, res) => {
const body = req.body;
if (body.type === "invoice.paid") {
const invoice = body.invoice;
const subscriptionId = invoice.metadata.subscriptionId;
await db.subscriptions.extend(subscriptionId, { months: 1 });
await db.subscriptions.setStatus(subscriptionId, "active");
}
res.status(200).end();
});웹훅 처리 끝에 구독 상태가 active로 돌아오고, 다음 청구일이 +1개월로 갱신됩니다.
운영자는 새벽이든 주말이든 손댈 필요가 없습니다.
정리하면
무통장입금으로 구독을 운영하는 핵심은 “자동 출금”을 포기하고 “자동 청구·매칭·연장”으로 발상을 바꾸는 것입니다.
- 5단계 상태 머신으로 미입금·유예·해지 흐름을 명확히 합니다.
- 입금자명에 구독 식별자를 붙여 매월 매칭 정확도를 확보합니다.
- cron으로 청구서를 자동 발행하고 안내를 자동 발송합니다.
invoice.paid웹훅 한 번에 구독이 1개월 연장됩니다.
PG사 가입비와 카드 수수료가 부담이라면 무통장입금 구독은 충분히 현실적인 선택지입니다.
사업자 등록이 된 매장이라면 페이싱크의 현금영수증 자동 발급 기능을 이용하여 회계 처리 부담을 크게 덜 수 있습니다.
