정산 개요
Adit 캠페인의 정산 방식과 절차를 안내드립니다.
정산 시점
정산 레코드(Settlement)는 캠페인이 "업로드 완료(UPLOADED)" 상태가 되면 자동으로 생성됩니다.
이 시점에는 Settlement 1건만 생성됩니다(상태: SETTLEMENT_PENDING). 광고주 청구서(AdvertiserInvoice)와 Bolta 세금계산서 정발행은 이후 정산 요청/어드민 정발행 시점에 처리됩니다.
정산 방식
| 방식 | 코드 | 설명 | 수수료 | 원천징수 |
|---|---|---|---|---|
| Adit 정산 | ADIT_SETTLEMENT | 대행사가 중개 | 있음 (기본 20%) | 개인(INDIVIDUAL)만 3.3% |
| 매체사 직정산 | DIRECT_INVOICE | 파트너↔광고주 직접 | 없음 (0%) | 없음 (0%) |
정산 유형 변경: 어드민이 정산 유형을 ADIT_SETTLEMENT ↔ DIRECT_INVOICE로 변경할 수 있습니다. 변경 시 수수료/원천징수가 재계산되며 정산 상태가 SETTLEMENT_PENDING으로 초기화됩니다.
Adit 정산 플로우
캠페인 업로드 완료 → 정산 요청 → 입금 → 지급 순서로 진행됩니다.
┌─────────────────────────────────────────────────────────────────┐
│ │
│ 시스템 대행사 광고주 │
│ │
│ ⓪ 업로드 완료 시 │
│ → Settlement 자동 생성 (SETTLEMENT_PENDING) │
│ │
│ 파트너 │
│ │
│ ① 정산 요청 ──────────→ │
│ (사업자=법인/개인사업자: Bolta 역발행 자동) │
│ (개인: 역발행 스킵) │
│ │
│ ⑴ 어드민: Bolta 정발행 요청 (광고주 세금계산서, 수동) │
│ → AdvertiserInvoice 생성·연결 ───────────────→ │
│ │
│ ② 입금 ──────────→ │
│ ③ 입금 확인 │
│ │
│ ④ 세금계산서 요청 ←──── │
│ │
│ ⑤ 세금계산서 발행 ──────→ │
│ (Bolta 역발행 or 직접) │
│ │
│ ⑥ 정산금 수령 ←────────── │
│ (원천징수 차감 후) │
│ │
└─────────────────────────────────────────────────────────────────┘단계별 상세
| 단계 | 담당 | 액션 | 정산 상태 |
|---|---|---|---|
| 0 | 시스템 | 업로드 완료 → Settlement만 자동 생성 | SETTLEMENT_PENDING |
| 1 | 파트너 | 정산 요청 (사업자: Bolta 역발행 자동 요청 / 개인: 스킵) | → AWAITING_ADVERTISER_PAYMENT |
| 1-a | 어드민 | Bolta 정발행 요청(수동) → AdvertiserInvoice 생성·연결 + 광고주 세금계산서 발행 | - |
| 2 | 광고주 | 입금 | - |
| 3 | 어드민 | 입금 확인, 결제 확인 | → ADVERTISER_PAID |
| 4 | 어드민 | 파트너 지급 시작 (사업자: 세금계산서 수령 확인) | → PARTNER_PAYOUT_PROCESSING |
| 5 | 파트너 | 세금계산서 발행 (개인은 불필요) | - |
| 6 | 어드민 | 정산금 송금, 완료 처리 (→ 캠페인 COMPLETED) | → SETTLEMENT_COMPLETED |
정발행 시점: Bolta 정발행은 업로드 시 자동이 아니라, 어드민이 콘솔에서 수동 요청합니다(POST /api/admin/settlements/:id/retry-issuance, ADIT 정산 전용). AdvertiserInvoice가 없으면 이 시점에 자동 생성됩니다.
매체사 직정산 플로우
파트너가 광고주에게 직접 청구합니다.
┌─────────────────────────────────────────────────────────────────┐
│ │
│ 파트너 광고주 │
│ │
│ ① 정산 요청 ──────────────────────────────────→ │
│ (계좌 정보 안내) │
│ │
│ ② 세금계산서 발행 ────────────────────────────→ │
│ │
│ ③ 입금 ──────────→ │
│ │
│ ④ 입금 확인 처리 │
│ (파트너가 직접!) │
│ │
└─────────────────────────────────────────────────────────────────┘단계별 상세
| 단계 | 담당 | 액션 | 정산 상태 |
|---|---|---|---|
| 1 | 파트너 | 정산 요청 | → AWAITING_ADVERTISER_PAYMENT |
| 2 | 파트너 | 광고주에게 세금계산서 발행 | - |
| 3 | 광고주 | 파트너 계좌로 직접 입금 | - |
| 4 | 파트너 | 입금 확인 처리 | → SETTLEMENT_COMPLETED |
매체사 직정산에서는 파트너가 직접 "입금 확인"을 해야 캠페인이 완료됩니다.
정산 상태
| 상태 | 코드 | 설명 |
|---|---|---|
| 🕐 정산 대기 | SETTLEMENT_PENDING | 파트너 정산 요청 전 |
| 📤 결제 대기 | AWAITING_ADVERTISER_PAYMENT | 정산 요청됨, 광고주 입금 대기 |
| ✅ 결제 완료 | ADVERTISER_PAID | 광고주 입금 확인됨 (ADIT 정산만) |
| 🔄 지급 처리 중 | PARTNER_PAYOUT_PROCESSING | 파트너 지급 처리 중 (ADIT 정산만) |
| 💰 정산 완료 | SETTLEMENT_COMPLETED | 정산 완료 |
| ❌ 정산 취소 | SETTLEMENT_CANCELLED | 정산 취소 |
SETTLEMENT_PENDING
│
│ 파트너: 정산 요청
▼
AWAITING_ADVERTISER_PAYMENT
│
│ 어드민: 입금 확인
▼
ADVERTISER_PAID
│
│ 어드민: 지급 시작
▼
PARTNER_PAYOUT_PROCESSING
│
│ 어드민: 정산 완료
▼
SETTLEMENT_COMPLETED수수료 체계
수수료율 기본값
| 항목 | 기본값 | 설정 위치 | 비고 |
|---|---|---|---|
| Adit 정산 수수료 | 20% | 파트너별 설정 (Partner.commissionRate) | 캠페인별 오버라이드 가능 |
| 직정산 수수료 | 0% (고정) | - | 변경 불가 |
수수료율 적용 우선순위 (ADIT 정산)
- 캠페인별 수수료 (Campaign.commissionRate) — 설정되어 있으면 최우선 적용
- 파트너별 수수료 (Partner.commissionRate) — 캠페인에 설정 안 된 경우
- 시스템 기본값 — 20%
개인(INDIVIDUAL) 파트너 VAT 보전 (+10%)
개인(INDIVIDUAL) 파트너 + ADIT 정산인 경우, 위에서 정해진 수수료율에 +10%p가 가산됩니다. 개인은 세금계산서를 발행할 수 없어 Adit이 매입세액 공제를 받지 못하므로, 그 손실분(VAT)을 수수료로 보전합니다.
예: 기본 20% → 개인은 30% 적용. (법인사업자·개인사업자는 가산 없음)
원천징수
원천징수는 개인(INDIVIDUAL) 파트너 + ADIT 정산(ADIT_SETTLEMENT)인 경우에만 적용됩니다. 개인사업자(INDIVIDUAL_BUSINESS)는 적용 대상이 아닙니다.
| 조건 | 원천징수율 | 적용 여부 |
|---|---|---|
| 개인(INDIVIDUAL) + ADIT 정산 | 3.3% (소득세 3% + 지방소득세 0.3%) | ✅ |
| 개인사업자(INDIVIDUAL_BUSINESS) + ADIT 정산 | 0% | ❌ |
| 법인사업자(CORPORATE_BUSINESS) + ADIT 정산 | 0% | ❌ |
| 모든 유형 + 매체사 직정산 | 0% | ❌ |
원천징수 계산 기준: 정산금(settlementAmount) 기준
정산금 계산
Adit 정산 (법인사업자)
수수료 = 캠페인 가격 × 수수료율
정산금 = 캠페인 가격 - 수수료
실지급액 = 정산금 (원천징수 없음)예시 (100만원, 수수료 20%, 법인사업자):
| 항목 | 금액 |
|---|---|
| 캠페인 가격 | 1,000,000원 |
| 수수료 (20%) | -200,000원 |
| 정산금 | 800,000원 |
| 원천징수 (0%) | 0원 |
| 실지급액 (payoutAmount) | 800,000원 |
파트너가 세금계산서 발행 시: 공급가액 800,000원 + VAT 80,000원 = 880,000원
Adit 정산 (개인사업자)
개인사업자(INDIVIDUAL_BUSINESS)는 법인사업자와 동일합니다 — VAT 보전(+10%)·원천징수 모두 없음. 위 법인사업자 예시와 같습니다.
Adit 정산 (개인 · INDIVIDUAL)
개인은 ① 수수료율에 +10%p 가산(VAT 보전), ② 정산금에 3.3% 원천징수가 적용됩니다.
수수료율 = (캠페인/파트너 수수료율) + 10 ← VAT 보전
수수료 = 캠페인 가격 × 수수료율
정산금 = 캠페인 가격 - 수수료
원천징수 = 정산금 × 3.3%
실지급액 = 정산금 - 원천징수예시 (100만원, 기본 수수료 20% → +10% = 30%, 개인):
| 항목 | 금액 |
|---|---|
| 캠페인 가격 | 1,000,000원 |
| 수수료 (20% + 10% = 30%) | -300,000원 |
| 정산금 | 700,000원 |
| 원천징수 (3.3%) | -23,100원 |
| 실지급액 (payoutAmount) | 676,900원 |
개인은 세금계산서를 발행하지 않으므로 Bolta 역발행도 진행하지 않습니다(주민등록번호·통장 확인 후 원천징수 차감하여 지급).
매체사 직정산
수수료와 원천징수 모두 0%:
| 항목 | 금액 |
|---|---|
| 캠페인 가격 | 1,000,000원 |
| 수수료 | 0원 |
| 정산금 | 1,000,000원 |
| 원천징수 | 0원 |
| 실지급액 | 1,000,000원 |
파트너가 세금계산서 발행 시: 공급가액 1,000,000원 + VAT 100,000원 = 1,100,000원
3계층 정산 구조
| 계층 | 모델 | 설명 |
|---|---|---|
| 1계층 | Settlement | 캠페인 단위 정산 (1:1) |
| 2계층-A | AdvertiserInvoice | 광고주 청구서 |
| 2계층-B | PartnerPayout | 파트너 지급 배치 |
Settlement 주요 필드
| 필드 | 설명 |
|---|---|
campaignPrice | 캠페인 가격 (스냅샷) |
commissionRate | 수수료율 (%) |
commissionAmount | 수수료 금액 |
settlementAmount | 정산금 (= campaignPrice - commissionAmount) |
withholdingTaxRate | 원천징수율 (%) — 개인+ADIT: 3.3%, 그 외: 0 |
withholdingTaxAmount | 원천징수 금액 |
payoutAmount | 실지급액 (= settlementAmount - withholdingTaxAmount) |
청구/지급 유형
| 유형 | 설명 | 현재 상태 |
|---|---|---|
건별 (PER_CAMPAIGN) | 캠페인 1건 = 청구서/지급 1건 | ✅ 지원 |
월별 (MONTHLY) | 여러 캠페인 합산 | 추후 지원 |
Bolta 세금계산서 연동
역발행 (Adit 정산 · 사업자 = 법인사업자/개인사업자)
사업자 파트너(법인사업자 또는 개인사업자)의 정산 요청 시 Bolta API를 통한 역발행이 자동으로 요청됩니다. (조건: businessEntityType !== 'INDIVIDUAL' + ADIT 정산)
| 단계 | 설명 |
|---|---|
| 1 | 파트너가 정산 요청 → Bolta 역발행 자동 요청 |
| 2 | 파트너에게 역발행 승인 URL 이메일 발송 (10분 유효) |
| 3 | 파트너가 승인 → 세금계산서 자동 발행 |
세금계산서는 파트너 명의로 발행되고, 공급받는자(수급자)는 정산 주체(Adit 또는 담당 대행사)가 됩니다.
개인 (INDIVIDUAL)
개인 파트너는 세금계산서를 발행할 수 없으므로 역발행을 스킵합니다. 대신 원천징수(3.3%)를 차감한 금액을 지급합니다.
정발행 (광고주 청구)
Adit 정산 시 광고주에게 발행하는 세금계산서는 어드민이 콘솔에서 수동으로 Bolta 정발행을 요청합니다(자동 아님). 정발행 요청 시 AdvertiserInvoice가 없으면 자동 생성됩니다.
| 단계 | 설명 |
|---|---|
| 1 | 어드민이 정발행 요청 (POST /api/admin/settlements/:id/retry-issuance, ADIT 전용) |
| 2 | Bolta API 정발행 → 성공 시 세금계산서 번호/URL 저장 |
| 3 | 실패 시 Slack 알림 + 어드민 재시도 |
정산 취소
| 상태 | 취소 가능 |
|---|---|
| SETTLEMENT_PENDING | ✅ |
| AWAITING_ADVERTISER_PAYMENT | ✅ |
| ADVERTISER_PAID | ✅ |
| PARTNER_PAYOUT_PROCESSING | ✅ |
| SETTLEMENT_COMPLETED | ❌ |
정산 완료 후에는 취소할 수 없습니다. 이미 송금이 완료된 상태입니다.