B2B SaaS 결제 분쟁·차지백 운영 체크리스트 2026: 증빙부터 제출 기한까지

B2B SaaS 결제 분쟁·차지백 운영 체크리스트 2026: 증빙부터 제출 기한까지


B2B SaaS의 결제 분쟁 또는 차지백은 카드 결제가 되돌아왔다는 결과만 확인해서는 운영할 수 없습니다. 고객이 문제 삼은 원거래, invoice, subscription, 환불·credit, 고객 문의와 제품 로그, 결제 플랫폼이 표시한 제출 기한이 한 케이스에 연결돼야 합니다.

이 글은 법률, 계약, 회계, 세무 자문이 아닙니다. 카드 네트워크나 발급사의 판단을 대신 해석하지 않으며, 어떤 자료도 결과나 승소를 보장하지 않습니다. 실제 대응 가능 여부, 제출 기한, 허용 자료는 사용 중인 결제 플랫폼의 현재 분쟁 화면과 회사 내부 담당자 검토를 기준으로 확인해야 합니다.

금액 반영은 B2B SaaS 구독 청구 월말 대사 체크리스트와 연결합니다. 같은 거래의 환불·credit는 B2B SaaS 환불·크레딧 노트 추적 감사 체크리스트로 확인합니다. 결제 실패와 재시도는 B2B SaaS 결제 실패·dunning 자동화 체크리스트로 분리합니다. 내부 변경 이력은 B2B SaaS 감사 로그·관리자 변경 추적 체크리스트에서 확인하고, 지원 담당자가 고객 계정에 접근했다면 B2B SaaS support impersonation·customer access 감사 체크리스트와 함께 봅니다.

1. dispute·chargeback·refund를 한 상태로 합치지 않습니다

분쟁 알림, 차지백 반영, 환불, credit note, 결제 실패는 서로 다른 사건입니다. 같은 invoice에 결제 성공, 부분 환불, 고객 문의, 분쟁이 순서대로 생길 수 있습니다. money_moved=true 같은 한 값으로 덮어쓰면 대응과 월말 대사가 함께 틀어집니다.

Stripe 분쟁 개요Stripe의 분쟁 진행 방식은 접수부터 응답·결과까지 큰 흐름을 확인하는 공식 출발점입니다. 다만 Stripe의 상태 이름을 다른 플랫폼에 그대로 적용하지 말고 provider 원문 상태와 내부 workflow 상태를 따로 저장합니다.

사건 운영상 분리할 이유 연결할 원본
dispute 알림 현재 action과 제출 기한을 확인해야 함 dispute ID, 대시보드 원문
chargeback 반영 잔액·payout에 영향이 생길 수 있음 balance transaction, payout
refund 회사가 별도로 반환한 금액인지 확인 refund ID, 상태, 금액
credit note 현금 반환이 아닌 invoice 조정일 수 있음 credit note ID, invoice ID
payment failure 승인되지 않은 시도이며 분쟁이 아님 payment attempt, dunning 상태
customer complaint 플랫폼 분쟁 전 단계일 수 있음 support ticket, CRM activity

내부 workflow는 received → linked → deadline_checked → evidence_ready → approved → submitted_or_accepted → outcome_recorded로 움직입니다. approved 단계에서는 대응, 수용, 추가 검토, provider 지원 문의 중 하나를 선택하고 근거를 남깁니다.

2. 접수는 이메일이 아니라 플랫폼 원문으로 확정합니다

이메일이나 Slack 알림은 빠른 인지에는 유용하지만 source of truth가 아닙니다. 같은 알림이 중복될 수 있고 이후 상태가 바뀌어도 최초 메시지는 그대로 남습니다. 담당자는 플랫폼에 로그인해 dispute ID, 원거래, 현재 상태, 표시된 기한, 가능한 action을 확인해야 합니다.

Paddle의 분쟁 알림 안내는 통지 경로를 확인할 공식 문서입니다. 하지만 이메일 수신 성공을 접수 완료로 계산하지 않습니다. 내부 queue에 원문 ID가 멱등하게 생성되고 담당자가 대시보드를 확인해야 received를 통과합니다.

접수 레코드에는 내부 case ID, provider, provider dispute ID, source URL, 수신 시각, provider 원문 상태, 내부 workflow 상태, owner, backup owner, next checkpoint를 둡니다. 고객 이름이나 카드 정보보다 ID 연결을 우선합니다. source URL은 권한이 있는 담당자만 열 수 있게 하고 CRM·Slack에 원문 전체를 복사하지 않습니다.

3. 원거래·환불·고객 로그를 한 케이스로 연결합니다

접수 직후에는 고객 회사명보다 문제 된 원거래를 먼저 찾습니다. 같은 회사가 여러 workspace, 카드, invoice를 쓸 수 있고 카드 명세서 이름과 SaaS 브랜드가 다를 수 있습니다. 비슷한 회사명을 보고 거래를 고르면 잘못된 증빙을 연결할 위험이 있습니다.

연결 순서는 dispute ID → payment 또는 transaction → invoice/order → subscription → account/workspace입니다. 그 뒤 같은 원거래의 refund, credit note, adjustment와 고객 support ticket, 취소·다운그레이드 요청, 제품 사용 로그를 시간순으로 연결합니다.


{
  "case_id": "DSP-INTERNAL-ID",
  "provider_dispute_id": "PROVIDER-ID",
  "payment_id": "PAYMENT-ID",
  "invoice_id": "INVOICE-ID",
  "subscription_id": "SUBSCRIPTION-ID",
  "account_id": "ACCOUNT-ID",
  "refund_ids": [],
  "credit_note_ids": [],
  "support_ticket_ids": [],
  "audit_event_ids": [],
  "workflow_status": "linked"
}

이 레코드에는 전체 카드번호, 보안코드, 비밀번호, session token, support 대화 전문을 넣지 않습니다. 실제 원문은 접근 권한이 통제된 시스템에 두고 케이스에는 ID와 링크만 둡니다.

환불은 부분·전액, 요청·완료·실패 상태, 분쟁과의 선후 관계, 같은 invoice의 다른 payment 여부를 확인합니다. credit note를 현금 반환과 같다고 보거나 추가 환불을 자동 실행하지 않습니다. 제품 로그는 account·invoice 기간·entitlement와 연결하고 support impersonation, 내부 테스트, bot activity를 고객 action에서 제외합니다.

4. 제출 기한은 일반 숫자가 아니라 현재 대시보드 값을 씁니다

분쟁 운영에서 가장 위험한 습관은 과거 사례나 블로그의 “며칠 이내”를 현재 건에 복사하는 것입니다. 결제수단, 지역, 사유, provider 상태에 따라 일정과 action이 달라질 수 있습니다. 이 글에서는 공통된 기한 숫자를 제시하지 않습니다.

Stripe의 분쟁 대응 문서는 Dashboard에서 분쟁을 검토하고 대응하는 공식 절차를 설명합니다. 문서를 읽은 뒤에도 현재 케이스 화면에 표시된 기한과 입력란을 다시 확인해야 합니다.

시각 역할 운영 기준
provider_due_at 현재 케이스에 표시된 제출 기한 과거 케이스에서 복사하지 않음
due_at_verified_at 담당자가 화면에서 확인한 시각 확인자와 timezone 기록
internal_review_due_at 증빙 검토·승인 목표 시각 provider 기한보다 여유 있게 내부 합의
next_checkpoint_at 자료 부족 시 다시 볼 시각 무기한 hold 금지
submitted_at 실제 플랫폼 제출 시각 confirmation과 함께 기록

날짜만 표시되고 timezone이 불명확하면 임의로 현지 자정을 넣지 않습니다. deadline_precision=date_only, timezone_unconfirmed=true 같은 경고를 남기고 provider에 확인합니다. owner 부재 시 backup이 실제로 인수합니다.

5. evidence inventory부터 만들고 필요한 자료만 수집합니다

증빙은 많이 넣는다고 강해지지 않습니다. 분쟁 사유와 무관한 로그를 대량 첨부하면 핵심 사실을 찾기 어렵고 개인정보나 내부 정보가 불필요하게 노출될 수 있습니다. 먼저 “무엇을 설명하려는가”를 한 문장으로 적고 직접 연결되는 자료만 inventory에 올립니다.

evidence 그룹 확인할 내용 주의사항
transaction 결제 시각, 금액, 통화, 원거래 ID disputed amount와 같은 거래인지 확인
invoice/order 품목, 기간, 수량, account 연결 사후 수정된 현재값과 구분
subscription 시작, 갱신, 변경, 취소 상태 refund·access 상태와 별개로 저장
service delivery 해당 기간의 제공·entitlement 상태 로그인 한 번을 전체 이행으로 단정하지 않음
communication 청구·취소·환불 관련 고객 대화 내부 메모 전체를 복사하지 않음
refund/credit 금액, 상태, 생성·완료 시각 중복 반환 가능성 검토
audit log 플랜·billing·support access 변경 고객 action과 직원 action 분리
policy snapshot 당시 표시된 정책 버전 현재 페이지를 과거 상태로 단정하지 않음

inventory에는 evidence ID, 설명할 사실, source record ID, event 기간, captured_at, 검증자, 민감도, redaction 상태, 포함·제외 결정을 넣습니다. 캡처에는 account·기간 필터, timezone, 원본 URL도 기록합니다. 카드 보안코드, 비밀번호, API key, session token, 다른 고객 로그는 제외합니다. chronology는 추측이 아닌 시간·상태·evidence ID로 작성하고 파일 버전을 고정합니다.


6. 승인·제출 단계에서 decision과 package를 분리합니다

첫 번째 결정은 대응 자료를 제출할지, 수용할지, 추가 검토할지입니다. 두 번째 결정은 어떤 설명과 자료를 실제로 제출할지입니다. 한 번에 처리하면 사업 판단 전에 파일이 업로드되거나 자료는 준비됐는데 승인자가 없어 기한이 지나갈 수 있습니다.

금액만으로 자동 결정하지 않습니다. refund·credit 동시 존재, 원거래 매핑 실패, 취소 누락 주장, support access 로그, 반복 분쟁, deadline 불명확은 사람이 검토합니다. 계약이나 책임 해석은 내부 지정 전문가에게 넘깁니다.

승인 레코드에는 decision, approver, 결정 시각, 근거 한 줄, evidence package 버전, 고객 커뮤니케이션 필요 여부를 둡니다. 팀 이름만 적지 말고 실제 승인자와 backup을 지정합니다.

제출 직전에는 다음을 확인합니다.

  • dispute ID, 원거래, invoice, account가 같은 사건인가.
  • 현재 provider 상태와 대시보드 기한을 다시 봤는가.
  • disputed amount와 refund·credit 상태를 다시 확인했는가.
  • 분쟁 사유와 직접 연결되는 자료만 골랐는가.
  • 다른 고객 정보, token, 불필요한 내부 메모가 없는가.
  • chronology, 캡처, 원문 timestamp의 timezone이 일치하는가.
  • 승인된 버전과 업로드 파일이 같은가.
  • 고객에게 한 안내와 제출 내용이 모순되지 않는가.

제출 오류가 나면 버튼을 반복해서 누르기 전에 원문 상태를 새로 조회합니다. 제출 뒤 confirmation, submitted_at, 제출 파일 버전을 남기고 event 수신만으로 완료 처리하지 않습니다.

7. 고객 커뮤니케이션은 사실·다음 action·담당 창구로 제한합니다

고객이 먼저 문의했거나 분쟁 뒤 연락한 경우 billing 대응과 고객 대화를 분리해서 운영하면 안 됩니다. support는 어떤 invoice 문의를 접수했는지, 현재 확인 중인 항목, 고객에게 필요한 추가 정보, 다음 업데이트 시점과 담당 창구를 안내합니다.

결과를 보장하거나 고객 책임을 단정하지 않습니다. “반드시 분쟁이 취소된다”, “무조건 승소한다”, “항상 며칠 안에 끝난다”는 표현을 피합니다. 승인되지 않은 refund나 credit를 확정해 말하지 않고, 내부 risk score나 탐지 규칙도 공유하지 않습니다.

8. Stripe·Paddle·Chargebee·Recurly의 운영 경계를 구분합니다

같은 chargeback이라는 단어를 써도 provider별 판매자 구조, gateway, dispute가 표시되는 위치, event·transaction 모델이 다를 수 있습니다. 공통 스키마는 유지하되 실제 action과 deadline은 각 플랫폼의 현재 화면과 공식 문서로 확인합니다.

Stripe는 Disputes, Respond to disputes, How disputes work를 출발점으로 봅니다. dispute ID, 원 charge/payment, refund, 상태 변경을 연결하고 Dashboard의 현재 deadline과 evidence 입력란을 우선합니다.

Paddle은 disputes report, chargebacks 이해, 분쟁 알림을 함께 확인하고 내부 account ID mapping을 유지합니다.

Chargebee는 chargeback management, Events API, Transactions API를 연결합니다. event는 접수에, transaction은 원거래 연결에 쓰고 gateway의 최종 상태를 재조회합니다.

Recurly는 카드 chargeback 관리direct debit chargeback을 분리해 확인합니다. 카드 절차를 direct debit에 그대로 복사하지 말고 case에 payment method family와 gateway를 저장합니다.

9. outcome·월말 대사·재발 신호까지 닫습니다

provider 결과가 나왔다고 케이스가 모두 끝난 것은 아닙니다. 원문 outcome과 확인 시각을 기록하고, disputed amount·refund overlap·balance transaction·payout을 월말 대사에 연결해야 합니다. 고객에게 약속한 refund, credit, subscription 종료도 실제 상태와 맞춰야 합니다.

내부 outcome은 pending, responded, accepted, favorable, unfavorable, withdrawn, reconciliation_pending처럼 정규화할 수 있지만 provider 원문을 덮어쓰지 않습니다. favorable이라는 내부 값도 법률적 승소라고 확대하지 않습니다. 접수 월과 결과 월이 다를 수 있으므로 금액을 한 달의 단일 값으로 덮어쓰지 않습니다.

재발 신호는 고객 비난이 아니라 운영 원인으로 분류합니다. descriptor 혼동, 취소·refund 직후 분쟁, 특정 플랜·gateway 집중, 같은 account 반복, evidence 누락, deadline miss를 봅니다.

10. 공개 전 최종 체크리스트와 공식 출처

다음 항목이 모두 연결돼야 운영 초안으로 사용할 수 있습니다.

  1. provider dispute ID와 내부 case ID를 분리했습니다.
  2. 이메일이 아니라 현재 대시보드 원문을 확인했습니다.
  3. 원거래, invoice, subscription, account를 연결했습니다.
  4. refund와 credit의 금액·상태·시각을 확인했습니다.
  5. payment failure와 dispute를 분리했습니다.
  6. 현재 케이스의 deadline과 timezone을 확인했습니다.
  7. provider due date와 내부 review date를 분리했습니다.
  8. primary owner와 backup owner를 지정했습니다.
  9. evidence마다 source, 기간, captured_at, 검증자가 있습니다.
  10. support session과 내부 테스트를 고객 activity에서 제외했습니다.
  11. 다른 고객 정보와 인증정보를 제거했습니다.
  12. 대응·수용·보류 decision과 승인자를 기록했습니다.
  13. 승인 버전과 제출 파일이 같습니다.
  14. submission confirmation과 submitted_at을 남겼습니다.
  15. 고객 대화와 제출 내용이 모순되지 않습니다.
  16. provider 원문 outcome을 보존했습니다.
  17. balance·payout·refund overlap을 월말 대사에 연결했습니다.
  18. customer closure와 prevention task에 owner가 있습니다.

공식 출처는 아래 11개입니다. 기능과 화면은 바뀔 수 있으므로 실제 케이스에서 다시 확인합니다.