상품·가격·세금
Paddle Product/Price와 Lemon Squeezy Product/Variant/Price의 가격·세금 모델을 나란히 설계한다.
이 장은 두 서비스를 같은 주제에서 비교한 뒤 두 공급자의 상세 설명을 모두 담습니다. 기능 노출·계약 요율·국가별 결제수단은 계정과 시점에 따라 달라질 수 있으므로 실제 스토어와 각 절의 공식 출처를 확인하세요.
주제별 비교
| 비교 항목 | Paddle | Lemon Squeezy |
|---|---|---|
| 판매 단위 | Product와 Price ID를 checkout 항목으로 연결한다. | Product 안의 Variant로 checkout을 생성하며 API Price 객체도 구분한다. |
| 통화·세금 | 가격 override, tax mode와 상품 세금 분류를 확인한다. | 표시 통화와 USD 처리, product tax category와 checkout preview를 확인한다. |
| 사용량 | Paddle의 metered billing과 구독 변경 규칙을 확인한다. | Variant 집계 방식과 Usage records API로 후불 사용량을 보고한다. |
Paddle 상세
핵심 요약
- Product/Price 구조는 코드보다 먼저 정해야 월마감·환불·권한·가격 변경이 흔들리지 않는 가장 오래 남는 결정이다.
- Product는 가치 묶음(Pro/Team), Price는 주기·금액으로 나누고, 국가별 가격은 country-specific price override로 조정한다.
- KRW는 소수점 없는 통화이므로 가격·할인·환불·분석 파이프라인에서
1000원 = 1000으로 처리되는지 확인한다. Price ID는 코드·권한 매핑에 쓰이므로 임의 삭제·재사용하지 않고, 가격 변경 전 grandfathering 여부를 먼저 결정한다.- Product의
tax_category와 Price의tax_mode를 가격 출시 전에 확정하고 변경 영향을 기존 구독까지 검토한다. - 원화 가격은 환율뿐 아니라 세금 포함 표시·수수료·환불률까지 반영한 하한을 검토한다.
Paddle 연동에서 가장 오래 남는 결정이 Product/Price 구조입니다. 코드를 짜기 전에 상품 카탈로그와 회계 분석 단위부터 정해 둬야 월마감, 환불, 권한 부여, 가격 변경이 흔들리지 않습니다.
기본 모델
| 개념 | 권장 사용 |
|---|---|
| Product | 고객이 구매하는 가치 묶음. 예: Pro, Team, Enterprise |
| Price | 결제 주기와 금액. 예: Pro Monthly, Pro Annual |
| Product tax category | saas, standard, digital-goods 등 상품의 과세 분류 |
| Price tax mode | 세금 포함·별도 표시 정책. 지역 자동 판단에는 location 검토 |
| Price override | 국가별 가격·통화 조정 |
| Discount | 캠페인/쿠폰. 장기 할인 정책은 별도 관리 |
| Transaction | Checkout, renewal, upgrade 등 과금 이벤트 |
| Subscription | 반복 과금과 권한의 기준 객체 |
SaaS 구독 카탈로그 예시
| Product | Price | Billing cycle | 권한 |
|---|---|---|---|
| Pro | Pro Monthly | monthly | 개인 고급 기능 |
| Pro | Pro Annual | yearly | 개인 고급 기능 + 연간 할인 |
| Team | Team Monthly | monthly | 워크스페이스, 멤버, 협업 |
| Team | Team Annual | yearly | 워크스페이스, 멤버, 협업 + 연간 할인 |
Product를 너무 잘게 쪼개면 권한 매핑은 쉬워지지만 가격 변경과 리포팅이 복잡해집니다. 반대로 하나의 Product에 전부 욱여넣으면 결제·권한·회계 분석 단위가 흐려집니다.
과금 패턴별 모델
| 패턴 | Paddle 모델 | 내부에서 추가로 필요한 것 |
|---|---|---|
| 고정 월간·연간 | recurring Price | 플랜·권한 매핑 |
| 좌석 과금 | subscription item quantity | 승인된 좌석 수와 실제 사용 좌석 reconcile |
| tier·volume | Price quantity tiers | preview와 proration QA |
| add-on | 같은 subscription의 추가 item | add-on별 entitlement·해지 정책 |
| 선불 credit | recurring/one-time charge + 내부 credit ledger | 잔액·만료·환불·세금 정책 |
| 사용량 후불 | usage를 외부에서 계량하고 upcoming transaction에 custom item 추가 | 계량 원장, cutoff, 고객 검증, 과다 청구 방지 |
| paid trial | trial period의 할인된 charge | 한국 유료전환 동의와 trial 가격 표시 |
순수 사용량 과금은 Paddle이 사용량 원장을 대신 보관한다고 가정하지 않습니다. 내부 metering과 immutable usage ledger를 원장으로 두고 Paddle에는 청구 시점의 line item을 전달합니다.
국가별 가격
Paddle은 country-specific price override를 제공합니다. 같은 Price를 기준으로 한국·일본·EU 등 국가마다 가격을 따로 조정할 수 있습니다.
| 지역 | 통화 | 권장 방식 |
|---|---|---|
| 한국 | KRW | 심리 가격을 직접 지정. 원화는 소수점 없음 |
| 미국 | USD | 기준 가격 |
| EU | EUR | VAT 포함/별도 표시 정책 확인 |
| 일본 | JPY | 소수점 없음, 소비세 포함 표시 확인 |
KRW 처리
Paddle API는 통화별 최소 단위로 금액을 다룹니다. KRW는 소수점이 없는 통화이므로 내부 가격 계산,
할인, 환불, 분석 파이프라인에서 1000원 = 1000으로 처리되는지 확인하세요.
세금 포함/별도 표시
Paddle은 MoR 거래의 국가별 거래세를 계산하지만, 가격 페이지 문구는 자사가 책임져야 합니다.
product.tax_category
Product API의 tax_category는 계정에 활성화된 과세 카테고리 중 하나를 지정하는 필수 필드입니다. SaaS라고
모든 상품을 기계적으로 saas로 두지 말고, 소프트웨어 구현·전문 서비스·교육·디지털 상품을 별도 Product로
분리합니다. 카테고리를 바꾸면 기존 subscription item의 세금 계산과 고객 청구액에 영향을 줄 수 있으므로
Finance 승인과 checkout preview를 거칩니다.
price.tax_mode
지역별로 세금 포함/별도 표시를 자동 결정하려면 지원되는 계정·가격에서 tax_mode: location을 검토합니다.
기존 internal, external, account_setting 가격과 섞여 있을 수 있으므로 API 응답을 기준으로 inventory를
만들고, B2C 표시가격·B2B VAT ID·country override 조합을 sandbox와 live에서 확인합니다.
| 고객 유형 | 권장 문구 |
|---|---|
| B2C | 결제 단계에서 적용 세금이 포함되거나 추가될 수 있음을 표시 |
| B2B | VAT ID/사업자 정보 입력 가능성과 reverse charge 가능성을 안내 |
| 한국 개인 | 원화 가격, 자동결제 주기, 해지/환불 조건을 명확히 표시 |
| 한국 법인 | Paddle 인보이스 발행 구조와 한국 세금계산서 제공 여부를 사전 안내 |
원화 가격 sanity check
원화 가격은 미국 가격 × 환율로만 정하지 말고 세금 포함 표시, Paddle 수수료, 고정 수수료, 환불률까지
반영해 최소 가격을 다시 보세요. 아래 계산기는 가격 후보를 확정하는 장치가 아니라, 가격 하한을 빠르게
가늠해 보는 도구입니다.
가격 변경 원칙
Price ID는 코드와 권한 매핑에 들어가므로 임의 삭제/재사용하지 않습니다.- 기존 고객 grandfathering 여부를 가격 변경 전에 결정합니다.
- 연간 결제 고객에게 변경 가격이 언제 적용되는지 이메일과 포털에서 확인 가능해야 합니다.
- 국가별 가격 override는 환율보다 전환율·환불률·지원 비용 기준으로 조정합니다.
내부 데이터 모델
plans
- internal_plan_code
- paddle_product_id
- paddle_tax_category
- paddle_price_ids[]
- paddle_tax_modes[]
- entitlement_set
- display_name
subscriptions
- user_id / workspace_id
- paddle_customer_id
- paddle_subscription_id
- paddle_status
- current_price_id
- next_billed_at
- entitlement_snapshot참고 자료
- Paddle Developer - Prices
- Paddle Developer - Products API
- Paddle Help - Taxable categories
- Paddle Developer - Automatic tax-inclusive/exclusive prices
- Paddle Developer - Supported currencies
- Paddle Developer - Localize prices
- Paddle Developer - SaaS billing patterns
- Paddle Developer - Usage-based billing for AI companies
- Paddle Developer - Paid trials
Lemon Squeezy 상세
핵심 요약
- 판매 단위는 Product 안의 Variant이며 가격 모델은 Variant 수준에서 고른다.
- API에는 Price 객체도 있지만 checkout은 Store와 Variant 관계를 지정해 생성한다.
- SaaS 용도에 맞는 제품별 tax category를 고르고 고객 국가별 preview를 확인한다.
- KRW는 표시할 수 있지만 거래는 USD로 처리되므로 표시 가격과 정산 가격을 구분한다.
카탈로그 모델
| 개념 | Lemon Squeezy에서 하는 일 | 내부 매핑 |
|---|---|---|
| Store | 판매 계정·설정·지급 주체 | 환경별 store ID |
| Product | 고객에게 설명하는 상품, 세금 카테고리 | 내부 product key |
| Variant | Lite/Pro, 월/년, 라이선스 종류와 가격 모델 | 환경별 variant ID, 권한 수준 |
| Price | Variant의 가격 정보 API 객체 | 표시·대사용 snapshot |
| Checkout | 특정 variant를 판매하는 URL/API 객체 | 내부 checkout intent |
Variants는 기존 구매자 접근에 영향을 줄 수 있으므로, 판매 종료 때 삭제 대신 비활성화를 검토합니다. test와 live의 ID는 서로 다릅니다.
SaaS 카탈로그 예시
| Product | Variant | 과금 | 내부 권한 |
|---|---|---|---|
| 협업 SaaS | Starter Monthly | 월 정액 | starter |
| 협업 SaaS | Pro Monthly | 월 정액 + trial | pro |
| 협업 SaaS | Pro Annual | 연 정액 | pro |
| API Credits | 1,000 Credit Pack | 일회성 package | 선불 크레딧 |
고객이 다른 variant로 옮길 때 기존 구독을 중복 생성하지 않도록 subscription update API의 변경·비례청구 옵션을 확인합니다.
가격 모델 선택
Pricing models은 standard, package, 구독용 volume·graduated 모델을 안내합니다. 구독은 quantity를 갱신 시점에 청구하거나 usage-based billing을 켜서 사용량을 후불 보고할 수 있습니다. usage 원장의 중복·누락 방지와 정정 정책을 별도로 설계합니다.
| 요구 | 후보 모델 | 출시 전 검증 |
|---|---|---|
| 좌석당 월 고정 | standard + quantity | 수량 변경·갱신 금액 |
| 일정 크레딧 묶음 | package | 초과 단위 반올림 |
| 사용량에 따라 단가 변화 | volume 또는 graduated | 경계값·소급 과금 |
| 사용량 후불 | usage-based variant | usage record 재전송·마감 |
사용량 과금 운영 예시
Usage-based Billing은 네 가격 모델 모두에서 구독 사용량을 다음 갱신 때 후불 청구할 수 있다고 설명합니다. 사용량 과금 Variant의 checkout 첫 청구는 setup fee가 없으면 0이며, checkout에 보낸 quantity는 무시됩니다. 따라서 ‘가입 즉시 이번 달 예상 사용료 청구’로 안내하면 실제 결제와 어긋납니다.
집계 방식은 기간 내 합계, 기간 내 마지막 값, 기간과 무관한 마지막 값, 기간 내 최대값 중 선택합니다. 예를 들어 좌석 수를 마지막 값으로 보고할지, API 호출을 합계로 보고할지에 따라 청구액이 달라집니다. 다음을 제품 정책과 원장에 함께 저장합니다.
subscription_id · subscription_item_id · billing_period_start/end
meter_name · aggregation_mode · internal_usage_event_id
reported_quantity · report_time_utc · provider_usage_record_id
correction_reason · expected_next_invoice_amount · reviewer이 필드는 자사 내부 설계 예시입니다. Usage record 객체는 subscription_item_id, 양의 정수 quantity, increment 또는 set action을 사용합니다. increment 재전송은 이중 가산 위험이 있으므로 내부 이벤트 ID로 중복을 차단하고, 마감 전 집계값과 Lemon Squeezy에 등록된 기록을 대사합니다. 과거 사용량 정정 가능 범위와 청구 후 환불 절차도 고객 약관에 맞춰 정합니다.
세금과 통화
Tax categories는 개인용 SaaS, 기업 전용 SaaS, 다운로드 소프트웨어 등 상품별 분류를 둡니다. 범용 SaaS를 기업에서도 쓴다는 이유만으로 기업 전용 분류를 고르지 않습니다. 법적 분류를 제품 설명과 대조하고 스토어 담당자에게 확인합니다.
Sales tax and VAT에서 국가별 세금 계산 원칙을 확인하고, checkout preview로 고객 국가·사업자 세금번호·할인·세금 포함 여부에 따른 최종 청구액을 검증합니다. checkout의 표시 통화와 USD 처리, 이후 은행 입금 통화를 같은 필드로 저장하면 안 됩니다.
catalog_version
store_id, product_id, variant_id, price_id
internal_plan_key, entitlement_level, billing_interval
store_display_currency, displayed_amount
checkout_preview_total, tax_amount, processed_usd_amount
active_from, retired_at, test_or_live변경 관리
- 상품·variant·세금 카테고리 변경 이유와 승인자를 기록합니다.
- 신규 구매와 기존 구독의 가격 적용 시점을 분리합니다.
- test mode에서 checkout preview, 첫 결제, 갱신, variant 변경을 검증합니다.
- live 전환 시 새 ID 매핑과 이전 variant 판매 중단 여부를 리뷰합니다.