정산 원장 템플릿
서로 다른 거래·지급 필드를 공통 내부 원장에 매핑한다. 실제 운영 기준과 검증 항목을 함께 제공한다.
이 장은 두 서비스를 같은 주제에서 비교한 뒤 두 공급자의 상세 설명을 모두 담습니다. 기능 노출·계약 요율·국가별 결제수단은 계정과 시점에 따라 달라질 수 있으므로 실제 스토어와 각 절의 공식 출처를 확인하세요.
주제별 비교
| 비교 항목 | Paddle | Lemon Squeezy |
|---|---|---|
| 주문 식별 | transaction·subscription·customer ID를 보존한다. | order identifier/order number·subscription/customer ID를 보존한다. |
| 수수료·지급 | payout reconciliation report의 실제 열을 매핑한다. | CSV에 없는 필드는 dashboard·reverse invoice·API로 보완한다. |
| 예외 | 미매칭·환불·조정·환차를 예외 큐에 남긴다. | 미매칭·환불·조정·환차를 예외 큐에 남긴다. |
Paddle 상세
핵심 요약
- 월마감은 보고서를 내려받는 일이 아니라 같은 거래를 Paddle report·내부 주문 DB·payout reconciliation·bank statement·전표에서 다시 맞춰보는 작업이다.
- transaction ledger, payout 대사, exception 등 6종 CSV 파일 세트를 표준 컬럼으로 맞춰 거래·세금·수수료·환불·환율을 추적한다.
remittance_reference별 balance movement 합계와 remittance advice·은행 입금액을 대조하고 Paddle fee, rebate, SWIFT/중개은행 fee를 분리한다.- 미매칭·payout 누락·은행 차이·환불 월차이·unknown 결제수단·세무 검토 건은 exception queue 상태값으로 담당자에게 배정한다.
- 원본 CSV는 수정하지 않고 정규화 테이블을 따로 만들며, 한국 고객·KRW·국내 B2B 예외 거래는 별도 태그를 둔다.
월마감은 보고서를 내려받는 일이 아니라 같은 거래를 여러 원장에서 다시 맞춰보는 일입니다. 이 장에서는 Paddle report, 내부 주문 DB, payout reconciliation report, bank statement, 회계 전표를 한 흐름으로 묶는 템플릿을 정리합니다.
파일 세트
| 파일 | 소스 | 목적 |
|---|---|---|
paddle_transactions_YYYY_MM.csv | Paddle export | 거래, 세금, 수수료, 환불 원장 |
paddle_payout_reconciliation_YYYY_MM.csv | Paddle payout reconciliation report | 지급 묶음과 지급 통화 확인 |
internal_orders_YYYY_MM.csv | 내부 DB | 고객, 워크스페이스, 권한 매칭 |
bank_statement_YYYY_MM.csv | 은행 | 실제 입금, wire fee, 환율 확인 |
fx_rates_YYYY_MM.csv | 회계 기준 환율 | KRW 전표 환산 |
exceptions_YYYY_MM.csv | 재무/운영 | 미매칭, 환불 지연, chargeback 추적 |
표준 거래 원장 컬럼
month,paddle_transaction_id,paddle_subscription_id,internal_order_id,workspace_id,customer_country,payment_method_type,payment_currency,gross_amount,tax_amount,paddle_fee,refund_amount,net_amount,remittance_reference,book_fx_rate,krw_amount,exception_note
2026-08,txn_01,sub_01,ord_01,ws_01,KR,kakao_pay,KRW,29000,2636,1450,0,24914,REM-2026-08-001,1,24914,| 컬럼 | 기준 |
|---|---|
gross_amount | 고객이 결제한 총액. 통화별 최소 단위 처리 여부 확인 |
tax_amount | Paddle이 계산/처리한 거래세. 한국 법인의 신고 판단과 혼동 금지 |
paddle_fee | Paddle transaction fee. payment method/country별 분석 가능하게 보관 |
refund_amount | 원 transaction과 연결. 환불 발생월과 원 결제월을 둘 다 보관 |
net_amount | Paddle transaction/report 기준 정산 대상 금액 |
book_fx_rate | 회사 회계정책상 적용 환율 |
krw_amount | 전표 입력용 원화 환산액 |
payout 대사 컬럼
remittance_reference,balance_movement_date,balance_movement_type,balance_currency,balance_movement_in_balance_currency,remittance_amount,bank_received_amount,bank_fee,matched,exception_note
REM-2026-08-001,2026-08-12,transaction,USD,7835.00,7835.00,7820.00,15.00,true,| 점검 | 기준 |
|---|---|
| remittance 매칭 | remittance_reference별 balance_movement_in_balance_currency 합계가 remittance advice와 일치 |
| 은행 입금액 | bank statement의 실제 입금액과 payout reconciliation report를 대조 |
| wire fee | Paddle fee와 은행/중개은행 수수료를 분리 |
| FX | Paddle conversion, 은행 환전, 장부 환율을 별도 컬럼으로 분리 |
| 미매칭 | 다음 월 이월인지, 환불/chargeback인지, 누락 export인지 기록 |
회계 전표 예시
회계 계정은 회사 정책과 세무사 검토로 확정합니다. 아래는 구조 예시입니다.
| 상황 | 차변 | 대변 | 메모 |
|---|---|---|---|
| Paddle 정산 매출 인식 | 외상매출금/Paddle receivable | 매출 또는 기타수익 | 총액/순액 인식 정책 확정 필요 |
| Paddle fee 인식 | 지급수수료 | 외상매출금/Paddle receivable | transaction fee breakdown 첨부 |
| payout 입금 | 외화예금 | 외상매출금/Paddle receivable | payout reconciliation report와 bank statement 첨부 |
| 은행 수수료 | 지급수수료 | 외화예금 | Paddle fee와 분리 |
| 환차손익 | 외환차손익 | 외화예금/외상매출금 | 장부 환율과 입금 환율 차이 |
| 환불 | 매출 차감 또는 환불 비용 | 외상매출금/Paddle receivable | 원 transaction ID 연결 |
월마감 SQL 체크
-- Paddle transaction과 내부 주문 미매칭
select
p.paddle_transaction_id,
p.paddle_subscription_id,
p.net_amount,
p.payment_currency
from finance_paddle_transactions p
left join orders o on o.paddle_transaction_id = p.paddle_transaction_id
where p.month = :month
and o.id is null;
-- payout별 합계와 은행 입금 대조
select
remittance_reference,
sum(net_amount) as transaction_net_sum,
max(bank_received_amount) as bank_received_amount,
sum(net_amount) - max(bank_received_amount) as diff
from finance_reconciliation
where month = :month
group by remittance_reference
having abs(sum(net_amount) - max(bank_received_amount)) > :tolerance;exception queue
| 상태 | 의미 | 담당 |
|---|---|---|
missing_internal_order | Paddle 거래는 있으나 내부 주문이 없음 | Engineering |
missing_remittance | 거래는 있으나 remittance reference가 아직 없음 | Finance |
bank_diff | payout reconciliation report와 은행 입금액 차이 | Finance |
refund_cross_month | 환불월과 결제월이 다름 | Finance/Support |
unknown_payment_method | 새 결제수단 타입 유입 | Data/Engineering |
tax_review | 세무 판단이 필요한 거래 | Finance/Tax |
운영 원칙
- 원본 CSV는 수정하지 않고, 정규화 테이블을 따로 만듭니다.
transaction_id,subscription_id,remittance_reference를 회계 전표 메모에 남깁니다.- 한국 고객, 한국 통화, 국내 B2B 예외 거래는 별도 태그를 둡니다.
- 월마감 후 exception이 남으면 다음 달 첫 영업일에 재무/개발/CS가 함께 review합니다.
참고 자료
- Paddle Developer - Generate reports
- Paddle Developer - Reports API
- Paddle Help - Is there a fee taken for payouts?
- Paddle Developer - Payout reconciliation report
- Paddle Developer - Payout report improvements
- Paddle Help - Statements, reverse invoices and remittance advice
Lemon Squeezy 상세
핵심 요약
- Orders CSV의
subtotal,tax,total은 USD cents이며currency는 checkout 표시 통화다. identifier와order_number를 고객 결제 증빙·내부 주문과 연결한다.- payout reverse invoice와 은행 입금은 주문 CSV와 별도 자료다.
- 수수료·환전 차이는 실제 dashboard와 계약 자료를 붙여 기록한다.
입력 파일 세트
| 파일/화면 | 주요 열 | 용도 |
|---|---|---|
| Orders CSV | identifier, order_number, currency, currency_rate, subtotal, tax, total, date_utc | 거래·세금 원장 |
| Order/Subscription API | 객체 ID, status, total_usd, refunded_amount_usd, 구독 정보 | CSV에 없는 환불 상태·webhook 보정 |
| Payout 대시보드·reverse invoice | payout 날짜·지급액, 계정에 실제 표시되는 수수료·차감 근거 | 공급자 정산 근거 |
| 은행/PayPal 내역 | 입금일, 통화, 실제 수취액, 환율·수수료 | 현금 대사 |
| 내부 DB | workspace ID, entitlement, 플랜, 결제 intent | 제품 제공 증거 |
CSV의 subtotal, discount_total, tax, total은 공식 컬럼 설명상 USD cents입니다. currency가 KRW라고 해서 숫자 total을 원화로 해석하면 수천 배 오류가 납니다. currency_rate는 표시 환율을 설명할 뿐 은행 입금 환율과 같지 않습니다. 공식 CSV 열 목록에는 환불액·플랫폼 수수료·payout ID가 없으므로 이 값들은 CSV에서 추정하지 않습니다.
표준 거래 원장
order_identifier,order_number,date_utc,customer_country,product_name,variant_name,display_currency,currency_rate,subtotal_usd_cents,discount_usd_cents,tax_usd_cents,total_usd_cents,refund_usd_cents,internal_workspace_id,source_file여기서 refund_usd_cents는 CSV 원본 열이 아닙니다. Order API의 refunded_amount_usd 등 확인한 근거를 연결해 채우고, 값이 없으면 0으로 가정하지 않고 미확인으로 둡니다.
개인정보가 들어간 원본 CSV는 접근 통제하고, 월마감 분석본은 이름·이메일을 최소화합니다. 주문 ID가 없거나 동일 ID가 중복될 때는 exception queue로 보냅니다.
지급·은행 연결표
payout_reference,payout_created_at,payout_paid_at,period_start,period_end,gross_eligible_usd,platform_fees_usd,refunds_adjustments_usd,payout_fee_usd,net_payout_usd,reverse_invoice_file,bank_value_date,bank_currency,bank_amount,fx_rate,unmatched_reason이 표는 내부 표준 템플릿이지 Lemon Squeezy의 공식 CSV 스키마가 아닙니다. Getting paid는 reverse invoice를 지급액의 기록으로 설명할 뿐, 주문별 수수료와 보류·차감을 모두 담는다고 명시하지 않습니다. 대시보드에 없는 필드는 계산 근거와 담당자를 명시하고 미확인 상태로 둡니다. 순지급액이 주문 합계와 맞지 않으면 13일 보류, 최소 USD 50, 기간 경계, 환불·분쟁, payout 비용을 확인합니다.
payout_reference는 내부 연결 키입니다. reverse invoice·dashboard에 실제로 존재하는 식별자를 우선 기록하고, 없으면 문서명·생성일·금액을 조합한 내부 키를 만듭니다. 주문 하나를 지급 건 하나에 억지로 배부하지 않습니다. 13일 보류와 최소 지급액 때문에 거래월, 지급 생성월, 은행 입금월이 다를 수 있습니다.
예외 큐와 재처리
| 예외 | 탐지 | 담당자와 닫는 조건 |
|---|---|---|
missing_order | 앱 유료 권한은 있는데 Order API/CSV에서 원주문을 못 찾음 | 제품: test/live 및 webhook·API ID 확인, 정당한 주문으로 연결하거나 권한 회수 |
duplicate_order | 동일 identifier가 내부 원장에 여러 번 반영됨 | 엔지니어링: 원본·재전송 식별, 한 주문으로 수렴하고 중복 side effect 보정 |
unmatched_refund | 환불 API/dashboard 값이 원주문·CS 티켓에 연결되지 않음 | CS·재무: 환불 사유·금액·귀속 기간 확인 |
unexplained_payout | reverse invoice/은행 입금과 내부 지급 장부 차이가 남음 | 재무: 보류·이월·수수료·분쟁·환율 증빙 첨부 |
currency_mismatch | USD cents를 KRW 또는 은행 수취액과 같은 숫자로 비교함 | 재무: 표시 통화, USD 처리, 지급 통화를 분리해 재계산 |
예외마다 type, store_id, order_identifier, subscription_id, payout_reference, first_seen_at, owner, evidence_url, status, resolution을 남깁니다. 플랫폼 원본 export나 API 응답은 수정하지 않고, 보정 분개와 이유를 별도 기록합니다. 월말에 열린 예외의 금액·건수와 다음 달 이월 여부를 승인받습니다.
내부 order_ledger에 CSV를 정규화했다고 가정한 PostgreSQL 확인 예시는 다음과 같습니다. 이 테이블은 자사 스키마 예시이고, 공식 Lemon Squeezy API 테이블이 아닙니다.
-- 한 스토어에서 같은 공식 identifier가 중복 적재됐는지 검사
SELECT store_id, order_identifier, COUNT(*) AS rows_loaded
FROM order_ledger
WHERE source = 'lemonsqueezy_orders_csv'
GROUP BY store_id, order_identifier
HAVING COUNT(*) <> 1;
-- 환불이 일어난 주문에서 API 확인값이 비어 있는 건을 수동 검토
SELECT store_id, order_identifier, order_status, refund_usd_cents
FROM order_ledger
WHERE order_status IN ('refunded', 'partially_refunded')
AND refund_usd_cents IS NULL;실제 Order API의 상태 문자열과 환불 필드를 적재할 때 정규화한 값에 맞춰 두 번째 질의를 수정합니다. NULL을 자동으로 0으로 바꾸면 누락이 사라져 보이므로 금액을 확인하기 전까지 미확인으로 유지합니다.
전표 검토 예시
거래 발생: 계약 구조에 따른 매출/미수금/수수료/거래세 구분
payout 확정: 미수금 ↔ 지급대기/외화예금 대체
은행 입금: 외화 지급액 ↔ 실제 원화 입금액, 환차손익·은행 수수료
환불/분쟁: 원거래·해당 기간과 연결한 수정 전표총액/순액 매출 인식, 세금 계정, 적용 환율은 계약과 한국 회계기준에 따라 세무사·회계사와 확정합니다. 고객 영수증과 공급자 reverse invoice를 동일 문서로 취급하지 않습니다.
월마감 체크
- CSV 기간과 UTC/한국시간 경계를 기록했다.
- webhook/API 주문 수와 CSV 주문 수가 맞는다.
- USD cents를 소수점 두 자리 USD로 변환했다.
- 환불·분쟁 건의 원주문과 귀속월을 연결했다.
- reverse invoice별 payout과 은행 입금이 설명된다.
- 보류·미지급 잔액이 다음 달 기초로 이월된다.
- 열린 예외 큐의 원인·담당자·차액·재검토일이 승인됐다.