상세 설계 문서

과금/플랜 설계

과금/플랜 설계 v1

1. 목적

이 문서는 부동산 계약/고객/매물 관리 SaaS의 1차 과금 모델을 정의한다.

과금은 실제 결제 자동화보다 먼저 계산 가능성, 설정 가능성, 이력 추적 가능성을 확보하는 것을 목표로 한다. 초기 무료 운영 기간에도 모든 사무소의 예상 과금액을 동일한 계산식으로 산출하고, 유료 전환 시 설정값만 변경하여 과금이 시작되도록 설계한다.

2. 과금 단계

단계 과금 포인트 설명 현재 무료 운영 유료 전환 후
1차 부동산 기본 과금 부동산 사무소 1곳당 월 기본 이용료 0원 사무소별 월 기본료 적용
2차 사용자 추가 과금 무료 인원 초과 활성 사용자 수 기준 과금 초과 인원 기록, 금액 0원 초과 1명당 월 단가 적용
3차 기능 추가 과금 기본 기능 외 유료 기능 사용 권한 기준 과금 권한과 예상 금액 기록 기능별 월정액/건별/상담 단가 적용

3. 기본 용어

용어 정의
부동산 사무소 과금의 최상위 고객 단위. Office에 해당
과금 정책 사무소별 기본료, 무료 인원, 초과 인원 단가, 과금 사용 여부
활성 사용자 로그인 가능하고 업무 기능을 사용할 수 있는 사용자
무료 인원 사용자 추가 과금 없이 포함되는 활성 사용자 수
초과 인원 max(활성 사용자 수 - 무료 인원, 0)
추가 기능 본사관리자가 사무소별로 켜는 선택 기능
예상 과금액 무료 운영 중에도 계산하는 가상의 월 이용료
확정 과금액 과금 사용 여부가 켜진 기간에 청구 대상으로 확정되는 금액

4. 과금 계산식

4.1 월 과금 총액

월 과금 총액
= 기본 과금액 + 사용자 추가 과금액 + 기능 추가 과금액

무료 운영 중에는 같은 식으로 예상 과금액을 계산하되, 실제 청구 금액은 0원으로 처리한다.

실제 청구 금액
= 과금 사용 여부가 true이면 월 과금 총액
= 과금 사용 여부가 false이면 0원

4.2 1차 과금: 부동산 기본 과금

기본 과금액 = 사무소별 기본 월 이용료

운영 원칙:

  • 부동산 사무소 단위로 월 기본료를 가진다.
  • 기본 월 이용료는 전체 공통값이 아니라 사무소별 설정값이다.
  • 무료 사무소, 할인 사무소, 제휴 사무소는 기본 월 이용료를 0원 또는 별도 금액으로 설정한다.
  • 정책 변경 시 과거 월의 계산 결과가 바뀌지 않도록 월별 스냅샷을 저장한다.

예시:

항목 무료 운영 유료 전환
기본 월 이용료 0원 10,000원
기본 과금액 0원 10,000원

4.3 2차 과금: 무료 인원 초과/사용자 추가

과금 대상 활성 사용자 수
= 활성 상태이고 billable=true인 사무소 소속 사용자 수

초과 인원 수
= max(과금 대상 활성 사용자 수 - 무료 인원, 0)

사용자 추가 과금액
= 초과 인원 수 × 초과 사용자 1명당 월 단가

과금 포함 대상:

역할 포함 여부 비고
부동산 오너 관리자 포함 사무소 운영 사용자
중개인 포함 계약/고객/매물 업무 사용자
중개보조인 포함 업무 기능 사용 사용자

과금 제외 가능 대상:

대상 제외 조건
비활성 사용자 status=inactive
초대 후 미가입 사용자 status=invited 등 실제 사용 전 상태
본사관리자 사무소 소속 과금 사용자가 아님
특별 면제 사용자 billable=false로 본사관리자가 지정

예시:

항목
무료 인원 2명
과금 대상 활성 사용자 수 4명
초과 인원 수 2명
초과 사용자 월 단가 5,000원
사용자 추가 과금액 10,000원

4.4 3차 과금: 기능 추가

기능 추가 과금은 본사관리자가 사무소별로 기능 권한과 금액을 설정한다.

월정액 기능 추가 과금액
= enabled=true인 사무소 기능의 monthlyFee 합계

건별 기능 추가 과금액
= 기능별 월 사용량 × 기능별 건당 단가

기능 추가 과금액
= 월정액 기능 추가 과금액 + 건별 기능 추가 과금액

1차 범위에서는 월정액 기능 과금을 우선 지원하고, 건별 과금은 사용량 테이블을 추가할 수 있도록 구조만 열어둔다.

기능 과금 예시:

기능 코드 기능명 과금 방식 기본 예시 단가 비고
kakao_contract_reminder 카카오 만료 알림 월정액 또는 건별 월 5,000원 실제 발송 비용은 추후 분리 가능
customer_popup 고객 예약 팝업 월정액 월 5,000원 사무소 단위 권한
listing_exchange 매물 교환/공동중개 월정액 월 5,000원 이상 정책 확정 후 세분화
advanced_pdf PDF 고급 출력 월정액 월 5,000원 템플릿/워터마크 등
bulk_excel_upload 엑셀 대량 업로드 월정액 월 5,000원 대량 처리 제한 필요
external_document_link 외부 문서 연동 상담 별도 협의 사무소별 개별 단가

5. 테이블 설계

5.1 핵심 테이블

테이블 목적
Office 부동산 사무소 기본 정보
OfficeBillingPolicy 사무소별 현재 과금 정책
OfficeBillingPolicyHistory 과금 정책 변경 이력
User 사무소 소속 사용자 및 과금 포함 여부
Feature 추가 기능 마스터
OfficeFeature 사무소별 기능 권한 및 기능 과금 설정
FeatureUsage 건별 과금이 필요한 기능 사용량
BillingUsage 월별 과금 계산 스냅샷
BillingAdjustment 할인, 면제, 수동 보정

5.2 OfficeBillingPolicy

필드 타입 예시 설명
id uuid 정책 ID
officeId uuid 부동산 사무소 ID
baseMonthlyFee integer 기본 월 이용료
includedUserLimit integer 무료 인원
extraUserMonthlyFee integer 초과 사용자 1명당 월 단가
billingEnabled boolean 실제 과금 여부
effectiveFrom date 정책 적용 시작일
effectiveTo date nullable 정책 적용 종료일
memo text nullable 특별 단가/할인 사유
createdBy uuid 설정한 본사관리자
createdAt datetime 생성일
updatedAt datetime 수정일

제약:

  • 사무소별로 같은 기간에 활성 정책은 1개만 존재해야 한다.
  • baseMonthlyFee, includedUserLimit, extraUserMonthlyFee는 0 이상이어야 한다.
  • 정책 변경 시 기존 행을 덮어쓰기보다 이력 테이블 또는 새 정책 기간으로 남긴다.

5.3 OfficeFeature

필드 타입 예시 설명
id uuid 사무소 기능 ID
officeId uuid 부동산 사무소 ID
featureId uuid 기능 마스터 ID
enabled boolean 사용 가능 여부
chargeType enum monthly, usage, consulting, free
monthlyFee integer 월정액 금액
unitFee integer nullable 건당 단가
freeTrialUntil date nullable 기능 무료 체험 종료일
effectiveFrom date 기능 적용 시작일
effectiveTo date nullable 기능 적용 종료일
memo text nullable 상담 내용/예외 정책
createdBy uuid 설정한 본사관리자
createdAt datetime 생성일
updatedAt datetime 수정일

5.4 BillingUsage

BillingUsage는 월별 계산 결과를 고정하는 스냅샷이다.

필드 타입 예시 설명
id uuid 월별 과금 ID
officeId uuid 부동산 사무소 ID
billingMonth char(7) YYYY-MM
billingEnabled boolean 해당 월 실제 과금 여부
baseFee integer 기본 과금액
activeUserCount integer 과금 대상 활성 사용자 수
includedUserLimit integer 무료 인원
extraUserCount integer 초과 인원 수
extraUserUnitFee integer 초과 사용자 월 단가
extraUserAmount integer 사용자 추가 과금액
monthlyFeatureAmount integer 월정액 기능 과금액
usageFeatureAmount integer 건별 기능 과금액
adjustmentAmount integer 할인/보정 금액. 할인은 음수
estimatedAmount integer 계산상 월 과금 총액
chargeAmount integer 실제 청구 금액
calculatedAt datetime 계산 시각
finalizedAt datetime nullable 확정 시각

계산 규칙:

extraUserCount = max(activeUserCount - includedUserLimit, 0)
extraUserAmount = extraUserCount × extraUserUnitFee
estimatedAmount = baseFee + extraUserAmount + monthlyFeatureAmount + usageFeatureAmount + adjustmentAmount
chargeAmount = billingEnabled ? max(estimatedAmount, 0) : 0

6. 관리자 설정 흐름

6.1 부동산 등록 시 1차 과금 설정

본사관리자 로그인
→ 부동산 등록
→ 오너 관리자 계정 생성
→ 기본 월 이용료 입력
→ 무료 인원 입력
→ 초과 사용자 월 단가 입력
→ 과금 사용 여부 선택
→ 적용 시작일 입력
→ 저장
→ OfficeBillingPolicy 생성

관리 화면 필수 입력값:

항목 기본값 설명
기본 월 이용료 0원 무료 운영 기간에는 0원
무료 인원 2명 사무소별 조정 가능
초과 사용자 월 단가 0원 무료 운영 기간에는 0원
과금 사용 여부 false 유료 전환 전까지 false
적용 시작일 등록일 정책 시작일

6.2 사용자 추가 시 2차 과금 확인

부동산 오너 관리자 로그인
→ 사용자관리
→ 중개인/중개보조인 추가
→ 활성 사용자 수 재계산
→ 무료 인원 초과 여부 표시
→ 예상 사용자 추가 과금액 표시
→ 저장
→ 본사관리자 화면의 예상 과금액 갱신

사용자 추가 화면에는 다음 정보를 보여준다.

표시 항목 예시
현재 활성 사용자 2명
무료 인원 2명
추가 후 활성 사용자 3명
초과 인원 1명
초과 사용자 월 단가 5,000원
추가 예상 금액 월 5,000원

무료 운영 중에도 같은 정보를 보여주되 현재 무료 운영 중으로 실제 청구는 0원 상태를 함께 표시한다.

6.3 기능 추가 시 3차 과금 설정

부동산 오너 관리자 또는 사용자 요청
→ 본사관리자 상담
→ 기능 마스터 확인
→ 사무소별 기능 권한 켜기
→ 과금 방식 선택
→ 월정액/건당 단가/무료 체험 종료일 입력
→ 적용 시작일 입력
→ 저장
→ OfficeFeature 생성 또는 갱신
→ 사용자 메뉴/버튼 활성화

본사관리자 기능 설정 화면:

항목 설명
기능명 추가할 기능 선택
사용 여부 메뉴/버튼 노출 여부
과금 방식 무료, 월정액, 건별, 상담
월정액 월 단위 기능 요금
건당 단가 사용량 기반 기능 요금
무료 체험 종료일 특정 기간 무료 제공
적용 시작일 기능 권한과 과금 적용 시작일
메모 상담 내용, 예외 승인 사유

7. 무료 운영 후 유료 전환 시나리오

7.1 무료 운영 단계

초기 운영 상태:

항목
billingEnabled false
기본 월 이용료 0원
초과 사용자 월 단가 0원
기능 월정액 0원 또는 기록용 금액
실제 청구 금액 0원

무료 운영 중에도 해야 할 일:

  • 사무소별 활성 사용자 수를 매월 기록한다.
  • 무료 인원 초과 여부를 관리자 화면에 표시한다.
  • 기능 권한 부여 이력을 저장한다.
  • 유료 전환 시 적용할 예상 단가를 미리 입력할 수 있게 한다.
  • 월별 BillingUsage를 생성해 과금 계산 검증 데이터를 쌓는다.

예시:

기본료 0원
활성 사용자 4명
무료 인원 2명
초과 인원 2명
초과 단가 0원
추가 기능 없음
예상 과금액 0원
실제 청구 금액 0원

7.2 유료 전환 준비

전환 전 본사관리자가 수행한다.

사무소별 현재 사용자 수 확인
→ 무료 인원 초과 사무소 확인
→ 기능 사용 사무소 확인
→ 유료 전환 적용일 결정
→ 사무소별 기본료/초과 단가/기능 단가 확정
→ 오너 관리자에게 예상 청구액 안내
→ 적용 시작일 기준 새 정책 생성

유료 전환 안내에 포함할 항목:

항목 설명
유료 전환일 실제 청구가 시작되는 날짜
기본 월 이용료 사무소 단위 월 기본료
무료 인원 추가 과금 없이 포함되는 인원
초과 사용자 단가 무료 인원 초과 1명당 월 요금
현재 활성 사용자 수 전환 시점 기준 사용자 수
추가 기능 목록 유료 기능 사용 권한
예상 월 청구액 전환 후 월 예상 금액

7.3 유료 전환 적용

유료 전환일에 정책을 다음처럼 변경한다.

항목 무료 운영 유료 전환
billingEnabled false true
기본 월 이용료 0원 10,000원
무료 인원 2명 2명
초과 사용자 월 단가 0원 5,000원
고객 예약 팝업 0원 5,000원

계산 예시:

부동산: 제주수공인중개사사무소
기본 월 이용료: 10,000원
무료 인원: 2명
활성 사용자: 4명
초과 인원: max(4 - 2, 0) = 2명
초과 사용자 월 단가: 5,000원
사용자 추가 과금액: 2명 × 5,000원 = 10,000원
추가 기능: 고객 예약 팝업 5,000원

월 과금 총액:
10,000원 + 10,000원 + 5,000원 = 25,000원

billingEnabled=true 이므로 실제 청구 금액:
25,000원

7.4 전환 월 일할 계산 정책

1차 설계에서는 운영 단순화를 위해 월 단위 과금을 기본으로 한다.

권장 정책:

상황 v1 정책
월 중 유료 전환 다음 달 1일부터 청구
월 중 사용자 추가 다음 달 청구분부터 반영
월 중 사용자 비활성화 다음 달 청구분부터 반영
월 중 기능 추가 다음 달 청구분부터 반영
월 중 기능 해지 다음 달 청구분부터 제외

예외적으로 즉시 과금이 필요하면 BillingAdjustment로 수동 보정한다.

8. 월별 과금 배치 흐름

매월 말 또는 매월 1일
→ 사무소 목록 조회
→ 사무소별 적용 정책 조회
→ 과금 대상 활성 사용자 수 계산
→ 초과 인원 계산
→ 활성 추가 기능 금액 계산
→ 사용량 기반 기능 금액 계산
→ 할인/수동 보정 반영
→ BillingUsage 생성
→ 본사관리자 검토
→ 필요 시 보정
→ 월 과금 확정

월별 계산은 재실행 가능해야 한다. 단, finalizedAt이 있는 월은 자동 덮어쓰기를 막고 본사관리자 승인 후 재계산한다.

9. 운영 화면 요약

9.1 본사관리자 과금 설정 화면

필수 영역:

영역 내용
기본 정책 기본료, 무료 인원, 초과 사용자 단가, 과금 사용 여부
사용자 현황 활성 사용자 수, 비활성 사용자 수, 초과 인원
기능 권한 기능별 사용 여부, 과금 방식, 금액, 적용일
예상 과금 기본 과금, 사용자 추가 과금, 기능 추가 과금, 합계
이력 정책 변경, 기능 권한 변경, 수동 보정

9.2 부동산 오너 관리자 화면

노출 권장 정보:

영역 내용
현재 플랜 무료 운영/유료 운영 여부
사용자 사용량 활성 사용자 수, 무료 인원, 초과 인원
추가 기능 사용 중인 기능 목록
예상 이용료 다음 달 예상 금액
사용자 추가 안내 추가 시 초과 과금 여부

부동산 오너 관리자는 단가를 임의 수정할 수 없고 조회만 가능하다. 단가 변경과 면제 처리는 본사관리자만 수행한다.

10. v1 범위와 제외 범위

v1 포함:

  • 사무소별 기본 과금 정책 설정
  • 무료 인원과 초과 사용자 단가 설정
  • 활성 사용자 기준 초과 인원 계산
  • 사무소별 추가 기능 권한과 월정액 설정
  • 무료 운영 중 예상 과금액 계산
  • 월별 과금 스냅샷 저장
  • 유료 전환 시 설정값 기반 청구 금액 계산

v1 제외:

  • 카드 결제 자동 승인
  • 세금계산서 자동 발행
  • PG 연동
  • 복잡한 일할 계산
  • 기능별 상세 사용량 과금 확정
  • 미납/정지 자동 처리

11. 핵심 원칙

  • 과금 정책은 코드에 고정하지 않고 DB 설정값으로 관리한다.
  • 무료 운영 중에도 유료 운영과 같은 계산식을 사용한다.
  • 정책 변경과 기능 권한 변경은 이력으로 남긴다.
  • 월별 과금 결과는 스냅샷으로 저장해 과거 청구액이 바뀌지 않게 한다.
  • 실제 청구 여부는 billingEnabled로 통제한다.
  • 부동산 오너 관리자는 사용자 추가 시 예상 과금 영향을 알 수 있어야 한다.
  • 본사관리자는 사무소별 예외 단가, 무료 제공, 할인, 수동 보정을 처리할 수 있어야 한다.