외상매입금이란? 텍스트 기반 Beancount 친화적 가이드: 공급업체 청구서 추적
외상매입금(AP)은 이미 물품이나 서비스를 받았지만 아직 결제하지 않은 공급업체에 대해 기업이 지고 있는 채무를 의미합니다. 회계상에서는 외상매입금이 대차대조표의 유동부채로 분류되며, 일반적으로 1년 이내, 보통 30~60일 내에 상환해야 하는 금액입니다.
이 개념은 발생주의 회계의 핵심으로, 청구서가 도착하는 순간 비용과 해당 부채를 동시에 기록합니다(현금이 실제로 이동하는 시점이 아니라). 이 가이드는 텍스트 기반 회계 도구인 Beancount를 사용해 외상매입금 전 과정을 깔끔하고 효율적으로 관리하는 방법을 보여줍니다.
빠른 요약
세부 내용에 들어가기 전에 핵심을 정리합니다:
- 외상매입금(AP) 은 공급업체에 대한 단기 채무를 의미합니다. 대차대조표의
Liabilities
섹션에서 확인할 수 있습니다. - 발생주의 vs 현금주의: 외상매입금은 발생주의 회계 체계에서만 존재합니다. Beancount는 발생주의 워크플로를 완벽히 지원하며, 웹 인터페이스인 Fava가 부채를 정확히 표시합니다.
- AP vs AR: 간단히 말해, 외상매입금은 기업이 빚진 금액이고, 외상매출금(AR) 은 다른 기업이 우리에게 빚진 금액입니다.
Beancount와 Fava에서 외상매입금이 위치하는 곳
외상매입금을 추적하려면 먼저 원장에 해당 계정을 선언해야 합니다. 일반적인 관례는 다음과 같습니다.
Liabilities:AccountsPayable
주요 공급업체별로 서브계정을 만들 수도 있습니다(예: Liabilities:AccountsPayable:ForestPaintSupply
).
Fava에서는 이 계정이 대차대조표의 Liabilities
아래에 표시됩니다. 클릭하면 모든 미결 및 결제된 항목 목록을 확인할 수 있어 채무 현황을 한눈에 파악할 수 있습니다. 실제 예시는 Fava의 공개 예제 원장에서도 확인할 수 있습니다.
Beancount에서 사용할 핵심 구성 요소
견고한 외상매입금 워크플로는 몇 가지 핵심 기능에 의존합니다:
- 계정:
Liabilities:AccountsPayable
, 현금 계정(Assets:Bank:Checking
) 및 다양한 비용 계정(Expenses:Supplies
등)을 주로 사용합니다. - 메타데이터: 거래마다 키‑값 형태의 메타데이터를 첨부할 수 있습니다. 외상매입금에서는
invoice:
,due:
,terms:
,document:
등을 활용합니다. Fava는document:
키를 인식해 문서 폴더를 지정하면 클릭 가능한 링크를 자동 생성합니다. - 태그 & 링크:
#ap
같은 태그로 손쉽게 필터링하고,^INV-10455
같은 링크로 청구서와 결제 거래를 논리적으로 연결합니다. 이렇게 하면 감사 가능한 흔적이 남습니다. - 쿼리(BQL): Beancount의 SQL‑유사 언어인 BQL을 이용해 강력한 보고서를 만들 수 있습니다. 예를 들어
bean-query
명령어나 Fava의 “Query” 페이지에서 미결 외상매입금을 기한 순으로 나열하는 쿼리를 실행할 수 있습니다.
Beancount에서 외상매입금 핵심 워크플로
외상매입금 관리는 청구서 기록 → 결제 → (선택) 부분 결제·할인 처리의 2~3단계로 이루어집니다.
1) 공급업체 청구서 기록 (부채 생성)
청구서가 도착하면 비용을 기록하고 동시에 외상매입금을 생성합니다.
; 옵션: 문서 폴더 지정
option "documents" "documents"
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
terms: "2/10, n/30"
document: "invoices/2025-08-05-forest-paint-INV-10455.pdf"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
이 한 줄 입력은 두 가지 중요한 일을 합니다:
- 8월 회계기간에 500 USD 비용을 즉시 인식합니다.
- 동일 금액의 외상매입금 부채를 생성해 Forest Paint Supply에 대한 채무를 표시합니다.
^INV-10455
링크는 고유 식별자로, 이후 결제 거래에 동일 링크를 붙여 청구서와 결제를 논리적으로 연결합니다.
2) 청구서 결제 (부채 소멸)
청구서를 결제하면 은행 계좌에서 자금을 이동시켜 부채를 소멸시킵니다.
a) 일반 결제 (할인 없음)
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD
이 거래는 외상매입금 잔액을 500 USD 감소시키고, 체크 계좌도 동일 금액만큼 감소시켜 부채를 정산합니다.
b) 조기 결제 할인 (예: “2/10, n/30”)
조건이 “2/10, n/30”이면 10일 이내 결제 시 2 % 할인을 받을 수 있습니다. 500 USD 청구서라면 10 USD 할인이 적용됩니다. 아래 두 방법 중 하나를 선택해 일관되게 기록합니다.
; 방법 1: 할인액을 기타수익으로 기록
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Income:Discounts:Payables -10.00 USD
; 방법 2: 원래 비용을 직접 감소
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Expenses:Supplies:Paint -10.00 USD
두 경우 모두 외상매입금 500 USD가 완전히 소멸하고, 실제 지급액 490 USD와 10 USD 할인(또는 수익)이 반영됩니다.
3) 부분 결제 처리
Beancount의 링크 기능을 활용하면 부분 결제도 깔끔하게 추적할 수 있습니다.
; 1,200 USD 청구서
2025-08-10 * "Acme Parts" "INV-9001" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Expenses:Parts 1200.00 USD
Liabilities:AccountsPayable -1200.00 USD
; 첫 번째 결제 400 USD
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
; 최종 결제 800 USD
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USD
세 거래 모두 ^INV-9001
링크를 공유하므로, 해당 청구서와 연관된 모든 결제 내역을 한 번에 필터링할 수 있습니다.
유용한 BQL 쿼리
Fava의 “Query” 탭이나 bean-query
명령줄에서 다음 쿼리를 실행해 보세요.
팁:
any_meta()
함수는invoice:
·document:
같은 메타데이터를 결과에 포함시키는 데 매우 유용합니다.
공급업체별 미결 외상매입금 (잔액 보기)
SELECT payee, COST(SUM(position)) AS amount
WHERE account "^Liabilities:AccountsPayable"
GROUP BY payee
ORDER BY payee;
청구서·기한별 미결 외상매 입금
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
COST(SUM(position)) AS amount
WHERE account "^Liabilities:AccountsPayable"
GROUP BY payee, invoice, due
ORDER BY due, payee;
첨부 PDF가 있는 청구서 목록
SELECT date, payee, any_meta('invoice') AS invoice, any_meta('document') AS file
WHERE account "^Liabilities:AccountsPayable"
ORDER BY date DESC;