Beancount와 청구서 만들기 및 추적
플레인‑텍스트 템플릿, 반복 가능한 워크플로, 그리고 “누가 아직 나에게 빚을 지고 있나요?” 라는 단일 쿼리
청구서는 끝낸 작업과 기다리는 결제 사이에 끼어 있는 번거로운 일처럼 느껴질 수 있습니다. 하지만 좋은 청구서 프로세스는 건전한 현금 흐름의 핵심입니다. 두 가지 역할을 수행합니다: 고객에게 무엇을 언제 지불해야 하는지 명확히 알려주고, 회계 시스템에 필요한 확실한 사실을 제공합니다.
전용 SaaS 앱은 깔끔하고 자동화된 PDF를 보낼 수 있지만, 월 구독료가 발생하고 데이터를 독점적인 사일로에 가두는 경우가 많습니다. Beancount를 활용한 가볍고 플레인 텍스트 방식은 강력한 대안을 제공합니다. 각 청구서를 명확한 회계 항목 집합으로 전환하면 버전 관리, 풍부한 메타데이터, 즉시 쿼리와 같은 모든 이점을 누릴 수 있습니다—구독이 필요 없습니다.
최소 실행 가능한 청구서 (절대 빼먹어서는 안 될 항목들)
장부에 기록하기 전에 전문적인 청구서가 필요합니다. 형식은 간단할 수 있지만 내용은 정확해야 합니다. 오랜 시간 검증된 소기업 관행에서 차용한 이 항목들은 절대 협상할 수 없습니다.
- 판매자 정보: 사업자명 및 실제 주소.
- 고 객 정보: 고객 이름 및 (가능하면) 주소.
- 청구서 번호: 재사용되지 않는 고유하고 순차적인 ID.
INV-045
는INV-044
다음 번호입니다. - 발행일 및 만기일: 청구서 발행일과 결제 예정일을 명확히 기재합니다.
- 항목: 서비스 또는 제품에 대한 명확한 설명, 수량, 단가, 그리고 항목 합계.
- 소계, 세금 및 총액: 계산식을 보여줘서 고객이 쉽게 이해할 수 있게 합니다.
- 선택 메모: 감사 인사, 송금 안내, 혹은 고객이 제공한 구매 주문 번호 등을 적을 수 있습니다.
시작을 돕기 위해 모든 필드를 포함한 바로 편집 가능한 템플릿 세트를 만들었습니다. 스프레드시트 버전은 합계를 미리 계산해 줍니다.
Note: 청구서 템플릿은 곧 제공됩니다! 그 사이에 위에 나열된 필드를 사용해 Google Docs, Word, Sheets, Excel 또는 기타 문서 형식으로 직접 만들 수 있습니다.
청구서를 장부에 기록하기
청구서 PDF를 고객에게 보낸 후에는 Beancount에 기록해야 합니다. 이는 수익을 발생 시점에 인식하는 중요한 단계이며, 결제 시점이 아니라 수익이 발생했을 때 인식합니다. 이 과정은 두 개의 별도 거래로 구성됩니다.
1. 청구서를 발행할 때:
총액을 Income
계정에서 Assets:AccountsReceivable
로 이동하는 거래를 생성합니다. 이는 장부에 디지털 IOU를 만들게 됩니 다.
; 2025‑07‑21 Invoice #045 Web design sprint for Acme Corp.
2025-07-21 * "Acme Corp" "INV-045 Web design sprint"
Assets:AccountsReceivable 3500.00 USD ; due:2025-08-04
Income:Design:Web
invoice_id: "INV-045"
contact_email: "ap@acme.example"
link: "docs/invoices/2025-07-21_Acme_INV-045.pdf"
여기서 AccountsReceivable
를 차변에, Income
계정을 대변에 기록합니다. 풍부한 메타데이터에 주목하세요: 만기일, 고유 invoice_id
, 그리고 보낸 PDF에 대한 직접 link:
가 포함됩니다.
2. 고객이 결제할 때:
현금이 은행 계좌에 들어오면 두 번째 거래를 기록해 IOU 를 “정산”합니다. 이는 AccountsReceivable
잔액을 체크 계좌로 옮깁니다.
2025-08-01 * "Acme Corp" "Payment INV-045"
Assets:Bank:Checking 3500.00 USD
Assets:AccountsReceivable
invoice_id: "INV-045"
INV-045
의 Assets:AccountsReceivable
잔액이 이제 0이 되었으며, 장부는 완벽히 균형을 이룹니다.
PDF 첨부:
link:
메타데이터 키는 Fava( Beancount의 웹 인터페이스)와 함께 사용할 때 특히 강력합니다. Fava는 거래 보기에서 클릭 가능한 링크를 바로 렌더링하므로 원본 문서를 클릭 한 번으로 열 수 있습니다. 이 워크플로는 2016년 기능 요청에서 이미 구상되었습니다(GitHub).
모든 미결 청구서를 나열하는 하나의 쿼리
그렇다면 아직 누가 나에게 돈을 빚지고 있나요? 이 시스템을 사용하면 이메일이나 스프레드시트를 뒤질 필요가 없습니다. 단 하나의 간단한 쿼리만 있으면 됩니다.
open-invoices.sql
라는 파일로 저장하세요:
SELECT
meta('invoice_id') AS id,
payee,
narration,
date,
number(balance) AS outstanding
WHERE
account = "Assets:AccountsReceivable"
AND balance != 0
ORDER BY
date;
터미널에서 실행합니다:
bean-query books.beancount open-invoices.sql
몇 초 만에 모든 미결 청구서에 대한 최신 연령 보고서를 받아볼 수 있습니다. 청구서 ID, 고객, 발행일, 미지급 금액이 표시됩니다. 별도의 소프트웨어는 필요 없습니다.
반복 작업 자동화
플레인 텍스트의 가장 큰 장점은 스크립트화가 가능하다는 점입니다. 이 워크플로의 지루한 부분을 자동화할 수 있습니다.
- 템플릿 + Pandoc = PDF: 청구서 템플릿을 Markdown 으로 유지합니다. 작은 Python 스크립트가 변수(고객명, 항목, 청구서 번호 등)를 채워주고, 명령줄 도구 Pandoc이 즉시 전문 PDF 로 변환합니다.
- Git Pre‑commit Hook: 장부를 Git 으로 관리한다면, 간단한 pre‑commit 훅을 만들어 커밋 전에 검사를 실행할 수 있습니다. 새
invoice_id
가 고유한지, 거래 포스팅이 0 으로 균형을 이루는지,link:
메타데이터에 지정된 파일이 실제 존재하는지 확인합니다. - Cron Job: 예약 작업(cron)을 설정해
open-invoices.sql
쿼리를 매일 밤 실행하고 요약을 이메일로 받아보세요. 매일 아침 누가 친절히 리마인드가 필요한지 바로 알 수 있습니다.
현실적인 주의사항
Beancount는 회계 도구이며 청구서 서비스가 아닙니다. 고객에게 자동 결제 알림을 보내거나 신용카드 결제를 처리해 주지는 않습니다. 워크플로는 다음과 같습니다: 템플릿 등을 사용해 청구서를 만들고 전송한 뒤, 장부에 회계 항목을 기록합니다.
대부분의 프리랜서와 소규모 사업체에게 이 수동 단계는 견고하고 감사 가능한 무료 회계 시스템을 완전히 소유하고 제어할 수 있다는 큰 장점에 비해 작은 비용에 불과합니다(beancount.io).
다음 단계
청구서를 직접 관리하고 싶으신가요? 시작 방법은 다음과 같습니다.
- 템플릿을 다운로드하고 다음 실제 청구서를 만들 때 순차적인 청구서 번호를 사용하세요.
- 보낸 PDF 를
docs/invoices/
와 같은 전용 폴더에 저장하고, Beancount 거래에link:
메타데이터 키로 참조하세요. open-invoices.sql
쿼리를 저장하고 주간 재무 검토 시 실행하도록 습관화하세요.
플레인 텍스트 회계가 폴리시나 제어를 포기한다는 의미는 아닙니다— 데이터베이스가 grep
가능할 뿐입니다. 간단한 템플릿과 위 스니펫만 있으면 더 빨리 결제받고 장부는 언제나 깔끔하게 유지됩니다.