인프라 뼈대를 세웠다면 이제 내 시스템에 ‘돈이 들어오는 자동 정산 길목’을 연결해야 한다. 1인 SaaS 창업가에게 가장 적합한 결제 시스템은 명확하다. 유저가 가입 후 단 몇 번의 클릭만으로 카드 정보를 등록하고, 매달 정해진 날짜에 알아서 돈이 빠져나가는 ‘구독 결제 자동화 인프라’를 완성하는 것이다.
과거에는 정기 결제 시스템 하나를 연동하려면 보안 인증(PCI)부터 복잡한 전자결제 대행사(PG) 계약까지 수 주일의 시간과 수십만 원의 등록비가 깨졌다. 하지만 전 세계 인디 해커들의 표준 무기인 ‘스트라이프(Stripe)’를 활용하면, 비개발자도 단 몇 줄의 코드와 미리 만들어진 결제창 템플릿(Stripe Checkout)을 통해 단 하루 만에 글로벌 정기 구독 파이프라인을 구축할 수 있다.
💳 고정 지출 없이 연동하는 글로벌 결제 시스템의 특징
- 초기 등록 비용 및 월 고정비 0원: 국내 일반 PG사들과 달리 가입비나 월 유지비가 전혀 없다. 유저가 실제로 결제할 때만 건당 수수료(해외 카드 기준 약 3.4% + $0.3)가 발생하는 구조라 매출이 없으면 비용도 발생하지 않는다.
- Stripe Checkout (가장 강력한 무기): 복잡한 카드 번호 입력창, 보안 펜스, 반응형 디자인을 내가 직접 코딩할 필요가 없다. 스트라이프가 보안이 완벽하게 검증된 ‘결제 전용 페이지’를 호스팅해 주므로, 나는 유저를 그 주소로 리다이렉트(이동)만 시켜주면 끝난다.
- 글로벌 통화(달러, 원화, 엔화) 원클릭 수용: 국내외 유저를 가리지 않고 비자, 마스터, 애플페이, 구글페이를 모두 지원하므로 처음부터 글로벌 확장을 염두에 둔 1인 SaaS에 가장 최적화되어 있다.
⚙️ 데이터베이스와 결제 시스템의 연동 아키텍처 (Webhooks)
유저가 결제를 완료했을 때, 내 데이터베이스(Supabase)에 “이 사람은 이제부터 유료 회원입니다”라고 자동으로 업데이트해 주는 백엔드 핵심 메커니즘을 노트에 정리해 둔다. 이 연결이 꼬이면 유저가 돈을 내고도 서비스를 이용하지 못하는 치명적인 리스크가 발생한다.
Plaintext
[결제 완료 및 유저 권한 자동 갱신 흐름]1. [유저 행동] - 랜딩페이지에서 '월 29,000원 구독하기' 버튼을 클릭함.2. [스트라이프 이동] - 내 웹사이트가 유저를 Stripe Checkout 세션 페이지로 리다이렉트함. - 유저가 안전하게 카드 정보를 입력하고 결제 완료.3. [웹훅 트리거 (Stripe Webhook)] - 결제가 성공하는 순간, 스트라이프 서버가 내 백엔드(Supabase Edge Functions)로 "invoice.payment_succeeded"라는 신호를 보냄.4. [데이터베이스 갱신 (Supabase)] - 내 서버가 신호를 수신하여 해당 유저의 ID를 찾은 뒤, 이메일/회원 상태 컬럼을 [is_premium = true]로 자동 전환함.
💡 AI 수석 개발자에게 지시할 결제 세션 생성 코드 스펙
클로드(Claude)나 ChatGPT에게 “우리 서비스에 스트라이프 구독 결제 기능을 넣어줘”라고 요청할 때, 오류 없이 단번에 코드를 짜오도록 명시해야 하는 백엔드 API 설계 가이드라인이다.
JavaScript
// Next.js (API Route) 기반의 스트라이프 구독 세션 생성 코드 스펙import Stripe from 'stripe';const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);export default async function handler(req, res) { if (req.method === 'POST') { try { const { userId, userEmail } = req.body; // 1. 스트라이프 결제창 세션 빌드 const session = await stripe.checkout.sessions.create({ customer_email: userEmail, payment_method_types: ['card'], line_items: [ { price: process.env.STRIPE_PRICE_ID, // 스트라이프 대시보드에서 생성한 월 29,000원 상품 고유 ID quantity: 1, }, ], mode: 'subscription', // 'payment'(일회성)가 아닌 'subscription'(정기 구독) 모드 강제 success_url: `${process.env.NEXT_PUBLIC_SITE_URL}/success?session_id={CHECKOUT_SESSION_ID}`, // 결제 성공 시 리턴될 내 웹사이트 주소 cancel_url: `${process.env.NEXT_PUBLIC_SITE_URL}/pricing`, // 결제 취소 시 리턴될 주소 metadata: { userId }, // 내 DB와 매핑하기 위해 유저 ID를 메타데이터에 심어둠 }); res.status(200).json({ url: session.url }); } catch (err) { res.status(500).json({ error: err.message }); } }}
⚠️ 구독 결제 구현 시 반드시 체크해야 할 3가지 예외 처리
결제는 돈이 오가는 영역이라 조금의 틈만 보여도 악성 유저에게 뚫리거나 정산 오류가 난다. 독학하며 찾아낸 필수 방어선 규칙 3가지다.
- 결제 취소 및 카드 한도 초과(Subscription Paused) 대응
- 매달 정기 결제일이 되었을 때 유저의 카드가 한도 초과이거나 잔액이 부족하면 스트라이프는 결제 실패 신호(
customer.subscription.updated)를 보낸다. 이때 즉시 데이터베이스의 프리미엄 권한을false로 바꾸거나 이용 제한 안내 페이지로 유도하는 예외 처리를 백엔드에 반드시 걸어두어야 한다. 그렇지 않으면 돈은 안 내는데 무제한으로 내 시스템을 무료 이용하는 버그가 생긴다.
- 매달 정기 결제일이 되었을 때 유저의 카드가 한도 초과이거나 잔액이 부족하면 스트라이프는 결제 실패 신호(
- 테스트 모드(Stripe Test Mode)와 라이브 모드(Live Mode) 분리
- 실제 결제 기능을 붙이기 전, 스트라이프가 제공하는 가상 카드 번호(
4242 4242 4242 4242)로 결제 성공/실패 시나리오를 최소 10번 이상 테스트해야 한다. 테스트 환경에서 완벽하게 작동하는 것을 확인한 뒤, Vercel 환경변수에서STRIPE_SECRET_KEY를 실제 운영용 키로 스위칭해야 대참사를 막을 수 있다.
- 실제 결제 기능을 붙이기 전, 스트라이프가 제공하는 가상 카드 번호(
- 고객 자격 증명(Customer Portal) 링크 제공
- 1인 기업가는 유저들의 “구독 취소해 주세요”, “결제 카드 변경해 주세요” 같은 이메일 CS를 일일이 처리할 시간이 없다. 스트라이프가 제공하는 무료 기능인 ‘고객 포털(Customer Portal)’ 주소를 내 웹사이트 마이페이지에 버튼으로 달아두면, 유저가 알아서 구독을 해지하거나 카드를 바꿀 수 있어 관리 리소스를 획득 비용(CAC) 수준으로 줄일 수 있다.
- 인사이트 요약: 복잡한 금융 인프라를 직접 빌드하려 하지 말고, 잘 만들어진 글로벌 API 생태계의 거인(Stripe) 어깨 위에 내 비즈니스를 얹어야 한다. 월세 시스템을 위한 완전 자동화된 머니 파이프라인이 세팅되었으니, 기술적인 준비는 완벽하게 끝났다. 이제 다음 단계부터는 진짜 유저들을 내 사이트로 긁어모으는 무자본 마케팅 전술로 진입한다.
- 차기 분석 테스크: 리스트 009번 “광고비 0원으로 구글 검색 상위 노출을 독점하는 테크니컬 블로그 SEO(검색엔진 최적화) 세팅 및 핵심 키워드 배치 전략” 공부 시작. 내 마이크로 SaaS 페이지를 구글 로봇이 가장 좋아하는 구조로 튜닝하는 꼼수를 파헤쳐 보겠다.


댓글 남기기