Las cuentas por pagar (CxP) son el dinero que tu negocio debe a sus proveedores por bienes o servicios que ya has recibido pero aún no has pagado. En el mundo de la contabilidad, las CxP se clasifican como un pasivo corriente en tu balance general: un monto que normalmente vence dentro del próximo año y, a menudo, dentro de 30 a 60 días.
Este concepto es central en la contabilidad de acumulación, donde registras el gasto y el pasivo correspondiente en el momento en que llega la factura, no cuando realmente envías el dinero. Esta guía te mostrará cómo gestionar todo el flujo de trabajo de CxP de manera limpia y eficiente utilizando la herramienta de contabilidad de texto plano, Beancount.
Resumen Rápido
Antes de profundizar en los detalles, cubramos lo esencial:
- Cuentas por Pagar (CxP) representan tus deudas a corto plazo con los proveedores. Las encontrarás en la sección
Liabilities(Pasivos) de tu balance general. - Acumulación vs. Efectivo: Las CxP son un concepto que solo existe si llevas tus libros sobre una base de acumulación. Beancount es compatible con flujos de trabajo de acumulación, y su interfaz web, Fava, mostrará tus pasivos correctamente.
- CxP vs. CxC: Es simple: Las cuentas por pagar son lo que debes, mientras que las cuentas por cobrar (CxC) son lo que otros te deben.
Dónde Viven las CxP en Beancount (y Fava)
Para comenzar a rastrear las CxP, primero debes declarar una cuenta para ellas en tu libro mayor. Una convención estándar es:
Liabilities:AccountsPayable
Opcionalmente, puedes crear subcuentas para proveedores principales (por ejemplo, Liabilities:AccountsPayable:ForestPaintSupply).
En Fava, esta cuenta aparecerá en tu Balance General bajo Liabilities. Puedes hacer clic en ella para profundizar y ver los asientos que componen el saldo. Incluso puedes ver esto en acción en el libro mayor de ejemplo público de Fava, que incluye una cuenta Liabilities:AccountsPayable.
Convención de signos: Beancount almacena los saldos de pasivos como créditos (números negativos). Un saldo de -500.00 USD en Liabilities:AccountsPayable significa que debes $500. El informe de partidas abiertas que se muestra a continuación invierte el signo con -SUM(number) para que cada factura impaga muestre un monto pendiente positivo. Una factura totalmente liquidada suma cero y se excluye con HAVING.
Componentes de Beancount que Usarás
Un flujo de trabajo sólido de CxP en Beancount se basa en algunas características principales:
- Cuentas: Usarás principalmente tu cuenta
Liabilities:AccountsPayable, una cuenta de efectivo comoAssets:Bank:Checking, y tus diversas cuentas de gastos (por ejemplo,Expenses:Supplies). - Metadatos: Puedes adjuntar datos clave-valor a cualquier transacción. Para CxP, usarás metadatos como
invoice:(factura),due:(vencimiento),terms:(términos) ydocument:(documento). Estableceoption "documents"a una carpeta para que Beancount pueda descubrir archivos allí; en Fava, soltar un archivo sobre una fila del diario inserta una entrada de metadatosdocument:, y habilitarplugin "fava.plugins.link_documents"vincula esas entradas a las directivas de Documento descubiertas. - Etiquetas y Enlaces: Usa
#tags(como#ap) para filtrar fácilmente y^links(como^INV-10455) para vincular programáticamente una factura y su pago posterior. Esto crea un rastro claro y auditable en el diario — pero los enlaces por sí solos no son suficientes para la consulta de facturas abiertas a continuación. - Consultas (BQL): El lenguaje de consulta similar a SQL de Beancount (BQL) te permite ejecutar informes potentes, como listar todas las cuentas por pagar abiertas ordenadas por fecha de vencimiento, directamente desde la línea de comandos con
bean-queryo en la página "Consulta" de Fava.
Identidad de la factura (requerida para consultas de facturas abiertas): Cada factura y cada pago que la liquida — completo, parcial o con descuento por pronto pago — deben llevar los mismos metadatos de transacción invoice: y due:, además del mismo ^link. La consulta agrupa por payee (beneficiario), any_meta('invoice') y any_meta('due'). Si un pago omite esas claves, su asiento de CxP cae en un grupo separado (payee, null, null) y una factura liquidada aún parece abierta. Mantén (payee, invoice) único entre proveedores. Campos opcionales solo de factura como terms: y document: no necesitan repetirse en los pagos.
Flujo de Trabajo Central de CxP en Beancount
Gestionar las CxP en tu libro mayor implica dos o tres pasos clave: registrar la factura, pagarla y, a veces, manejar pagos parciales o descuentos.
1) Registrar la Factura del Proveedor (Esto Crea el Pasivo)
Primero, registras el gasto y creas la cuenta por pagar cuando llega la factura.
; Optionally set your documents folder in your main Beancount file:
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 USDEsta única entrada logra dos cosas críticas:
- Reconoce inmediatamente el gasto de $500 en el período correcto (agosto) — una vez. No vuelvas a registrar el gasto en el pago.
- Acredita las CxP por $500 (
-500.00 USD), registrando que debes esa cantidad a Forest Paint Supply.
El enlace ^INV-10455 junto con los metadatos invoice: / due: forman la identidad de la factura. Cada pago posterior de esta factura debe reutilizar los tres.
2) Pagar la Factura (Esto Liquida el Pasivo)
Cuando pagas la factura, creas una transacción que mueve dinero desde tu cuenta bancaria para liquidar el pasivo. Copia invoice: y due: de la factura al pago para que ambos asientos compartan un grupo de consulta.
a) Pago Estándar (Sin Descuento):
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USDEsta entrada reduce tu saldo de CxP en $500 y el saldo de tu cuenta corriente en la misma cantidad. El pasivo de esta factura ahora está liquidado (la suma de CxP del grupo es cero). El gasto permanece en la factura de agosto — el pago no toca Expenses:.
b) Descuento por Pronto Pago (por ejemplo, "2/10, n/30") — elige exactamente un método:
Si los términos son "2/10, n/30", puedes obtener un descuento del 2% si pagas dentro de los 10 días. Para nuestra factura de $500, eso es un descuento de $10. El bloque a continuación muestra dos alternativas mutuamente excluyentes: La Opción 1 está activa; la Opción 2 está completamente comentada para que un pegado no registre ambas. Para usar la Opción 2 en su lugar, comenta la Opción 1 y descomenta la Opción 2. Nunca dejes ambas activas — eso liquida las CxP dos veces e inventa un segundo beneficio de $10. Qué cuenta de ingresos vs. gastos uses es una decisión de política contable para tus libros; Beancount no exige una sobre la otra.
; Pick EXACTLY ONE of the two transactions below for a given invoice.
; Do not paste both into the same ledger — that clears AP twice.
; Option 1: Record the discount as other income
2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -490.00 USD
Income:Discounts:Payables -10.00 USD
; Option 2: Reduce the original expense directly
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Expenses:Supplies:Paint -10.00 USDEn cualquiera de las alternativas por sí sola, liquidas el pasivo completo de $500, reduces el saldo bancario por los $490 que realmente pagaste y contabilizas el beneficio de $10. Reemplaza la transacción de pago completo estándar con la alternativa elegida — no apiles un pago con descuento sobre el pago en efectivo de $500, y no combines este bloque con la sección 2a para la misma factura.
3) Manejo de Pagos Parciales
Reutiliza la misma identidad invoice: / due: / ^link en cada pago a plazos para que cada pago reduzca el mismo grupo de factura abierta.
; Invoice for $1,200
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
; First payment of $400
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
; Final payment of $800
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USDDespués del primer pago, la suma de CxP del grupo de factura es -800.00 USD (aún debes $800). Después del pago final, es cero. Filtrar el diario por ^INV-9001 aún muestra el historial completo.
Consultas Útiles (BQL)
Puedes ejecutar estas consultas en la pestaña "Consulta" de Fava o desde la línea de comandos con bean-query (referencia BQL). Verificadas a continuación con Beancount 3.2.3 y beanquery 0.2.0.
Consejo: La función
any_meta()busca una clave de metadatos primero en el asiento y luego recurre a la transacción — por lo que los valoresinvoice:/due:a nivel de transacción aparecen en el conjunto de resultados.
CxP Abiertas por Proveedor (Vista de Saldo):
Esta consulta suma el inventario de pasivos por proveedor. Un total de crédito (negativo) es lo que aún debes a ese proveedor.
SELECT payee, COST(SUM(position)) AS amount
WHERE account ~ "^Liabilities:AccountsPayable"
GROUP BY payee
ORDER BY payee;Facturas abiertas en una fecha fija (informe de partidas abiertas):
Un informe de partidas abiertas responde "¿qué queda sin pagar?". Debe (1) cortar en una fecha de referencia explícita para que los pagos posteriores no puedan liquidar silenciosamente una instantánea anterior, (2) agrupar por la identidad compartida de la factura (payee + invoice: + due:), (3) excluir grupos liquidados (cero) y (4) mostrar un monto pendiente positivo — no un crédito de CxP firmado crudo.
Fecha de referencia utilizada en todo lo siguiente: 2025-09-04.
Libro mayor inicial de CxP descargable
Descarga accounts-payable-starter.bean — un libro mayor autocontenido generado a partir del bloque completo a continuación (aperturas de cuentas, efectivo inicial ficticio, facturas liquidadas / parciales / impagas, con fecha de referencia 2025-09-04). Cada nombre y monto son datos de muestra ficticios. No se requiere ningún PDF de factura, carpeta de documentos u otro archivo para validarlo o consultarlo.
Primera ejecución desde un directorio temporal limpio (fijado en Beancount 3.2.3 / beanquery 0.2.0):
# Save the download as accounts-payable-starter.bean in this directory, then:
uvx --from beancount==3.2.3 bean-check accounts-payable-starter.bean
uvx --from beanquery==0.2.0 --with beancount==3.2.3 bean-query accounts-payable-starter.bean \
"SELECT payee, any_meta('invoice') AS invoice, any_meta('due') AS due, -SUM(number) AS outstanding WHERE account ~ '^Liabilities:AccountsPayable' AND date <= 2025-09-04 GROUP BY payee, invoice, due HAVING SUM(number) < 0 ORDER BY due, payee"bean-check sale con código 0 y sin salida. La consulta devuelve las cinco filas abiertas en la tabla esperada a continuación (Forest ausente; Acme pendiente 800.00; suma del pendiente positivo = 1500.00). Regenera la descarga confirmada con yarn generate:ap-starter después de editar el bloque; yarn generate:ap-starter --check falla si el artefacto está desactualizado.
Pega este fixture completo (aperturas + efectivo inicial + las tres formas de factura, más filas de vencidas hoy / vencidas / casos límite para el envejecimiento). Las alternativas de descuento por pronto pago para INV-10455 permanecen completamente comentadas — activa exactamente una solo si reemplazas el pago estándar de Forest; nunca dejes ambas opciones de descuento activas junto con ese pago.
; accounts-payable-starter — complete runnable AP workflow
option "operating_currency" "USD"
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Equity:Opening-Balances USD
2025-01-01 open Liabilities:AccountsPayable USD
2025-01-01 open Expenses:Supplies:Paint USD
2025-01-01 open Expenses:Parts USD
2025-01-01 open Expenses:Office USD
2025-01-01 open Income:Discounts:Payables USD
; Fictional opening cash — enough to cover every payment in this ledger
2025-01-01 * "Opening balance"
Assets:Bank:Checking 5000.00 USD
Equity:Opening-Balances -5000.00 USD
; Settled before as-of — must disappear from the open report
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USD
; Early-payment discount alternatives for INV-10455 — mutually exclusive with
; the standard payment above AND with each other. To take 2/10 instead: delete
; (or comment out) the 2025-09-01 payment, then uncomment EXACTLY ONE option.
; Never leave both options active — that clears AP twice.
;
; Option 1: Record the discount as other income
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Income:Discounts:Payables -10.00 USD
;
; Option 2: Reduce the original expense directly
; 2025-08-12 * "Forest Paint Supply" "Early payment discount INV-10455" ^INV-10455
; invoice: "INV-10455"
; due: "2025-09-04"
; Liabilities:AccountsPayable 500.00 USD
; Assets:Bank:Checking -490.00 USD
; Expenses:Supplies:Paint -10.00 USD
; Partial before as-of; final $800 payment is AFTER 2025-09-04
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
2025-08-20 * "Acme Parts" "Payment INV-9001 (1/3)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 400.00 USD
Assets:Bank:Checking -400.00 USD
2025-09-05 * "Acme Parts" "Payment INV-9001 (final)" ^INV-9001
invoice: "INV-9001"
due: "2025-09-09"
Liabilities:AccountsPayable 800.00 USD
Assets:Bank:Checking -800.00 USD
; Unpaid — not yet due as of 2025-09-04
2025-08-15 * "Bright Office Co" "INV-220" ^INV-220
invoice: "INV-220"
due: "2025-09-14"
Expenses:Office 300.00 USD
Liabilities:AccountsPayable -300.00 USD
; Unpaid — due today (as-of == due)
2025-08-20 * "Helix Industries" "INV-440" ^INV-440
invoice: "INV-440"
due: "2025-09-04"
Expenses:Parts 200.00 USD
Liabilities:AccountsPayable -200.00 USD
; Unpaid — 30 days overdue as of 2025-09-04
2025-07-06 * "Metro Hardware" "INV-77" ^INV-77
invoice: "INV-77"
due: "2025-08-05"
Expenses:Parts 150.00 USD
Liabilities:AccountsPayable -150.00 USD
; Overpayment — credit balance (not an amount due; see edge cases)
2025-08-01 * "Credit Vendor" "INV-C1" ^INV-C1
invoice: "INV-C1"
due: "2025-08-20"
Expenses:Parts 100.00 USD
Liabilities:AccountsPayable -100.00 USD
2025-08-18 * "Credit Vendor" "Overpay INV-C1" ^INV-C1
invoice: "INV-C1"
due: "2025-08-20"
Liabilities:AccountsPayable 150.00 USD
Assets:Bank:Checking -150.00 USD
; Missing due metadata — still open; age into a separate bucket, do not drop
2025-08-12 * "No Due Co" "INV-ND" ^INV-ND
invoice: "INV-ND"
Expenses:Office 50.00 USD
Liabilities:AccountsPayable -50.00 USDConsulta de partidas abiertas (beanquery 0.2.0 admite HAVING SUM(number) < 0; no admite comparar un inventory con 0 usando COST(SUM(position)) != 0):
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
-SUM(number) AS outstanding
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04
GROUP BY payee, invoice, due
HAVING SUM(number) < 0
ORDER BY due, payee;Filas esperadas al 2025-09-04 (derivadas independientemente de las transacciones: factura − pagos con fecha ≤ referencia; Forest suma a 0 y está ausente):
| payee | invoice | due | outstanding |
|---|---|---|---|
| No Due Co | INV-ND | (vacío) | 50.00 |
| Metro Hardware | INV-77 | 2025-08-05 | 150.00 |
| Helix Industries | INV-440 | 2025-09-04 | 200.00 |
| Acme Parts | INV-9001 | 2025-09-09 | 800.00 |
| Bright Office Co | INV-220 | 2025-09-14 | 300.00 |
Suma del pendiente positivo = 1,500.00. La factura de $500 de Forest desapareció. Acme aún muestra $800 ($1,200 − $400); el pago de $800 del 2025-09-05 es después de la fecha de referencia, por lo que no puede cerrar esta instantánea.
Concilia con el pasivo de CxP en el mismo corte:
SELECT COST(SUM(position)) AS ap_balance
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04;Esperado: ap_balance = (-1450.00 USD). Independientemente: pendiente abierto $1,500 menos el crédito de proveedor de $50 (abajo) = $1,450 adeudados → inventario de pasivo -1450.00 USD.
Mueve la fecha de referencia un día después (date <= 2025-09-05) y vuelve a ejecutar la consulta de partidas abiertas: la fila de Acme desaparece (pago final incluido), y ap_balance se convierte en (-650.00 USD). Un pago después de la fecha del informe nunca reescribe el informe anterior.
Créditos de proveedor / sobre pagos: HAVING SUM(number) < 0 mantiene solo los montos que aún debes. Un sobre pago invierte la suma de CxP del grupo a positivo. Lístalos por separado — no trates un saldo de CxP positivo como "monto adeudado":
SELECT payee,
any_meta('invoice') AS invoice,
any_meta('due') AS due,
SUM(number) AS credit
WHERE account ~ "^Liabilities:AccountsPayable"
AND date <= 2025-09-04
GROUP BY payee, invoice, due
HAVING SUM(number) > 0
ORDER BY payee;Esperado: una fila — Credit Vendor / INV-C1 / 2025-08-20 / credit = 50.00 (pagaste de más $50).
due: faltante: INV-ND aún aparece en el informe abierto con un vencimiento vacío. Clasifícalo por antigüedad en un segmento dedicado missing-due (a continuación); nunca lo omitas silenciosamente.
Listar Facturas con PDFs Adjuntos:
SELECT date, payee, any_meta('invoice') AS invoice, any_meta('document') AS file
WHERE account ~ "^Liabilities:AccountsPayable"
ORDER BY date DESC;Dónde Ver las CxP en Fava
- Balance General: Navega a
Balance Sheet→Liabilities→AccountsPayablepara ver el saldo total y profundizar en los detalles de la transacción. - Diario: Filtra el diario por
account:Liabilities:AccountsPayableo un enlace específico como^INV-xxxxpara ver el ciclo de vida completo de una factura. - Documentos: Con
option "documents"establecido, Beancount descubre archivos bajo ese árbol. Las vistas de Documentos de Fava y el pluginlink_documents(ver arriba) conectan esos archivos con transacciones que llevan metadatosdocument:.
Envejecimiento de CxP, Rotación y Conciencia de Flujo de Efectivo
Programa de envejecimiento (exportación reproducible + segmentos): beanquery 0.2.0 puede emitir las filas de partidas abiertas anteriores, pero no proporciona una expresión integrada de segmentos de envejecimiento sobre los metadatos due. Exporta el informe abierto y luego clasifica en segmentos de manera determinista contra la misma fecha de referencia.
bean-query -f csv -o open-ap.csv accounts-payable-starter.bean \
"SELECT payee, any_meta('invoice') AS invoice, any_meta('due') AS due, -SUM(number) AS outstanding WHERE account ~ '^Liabilities:AccountsPayable' AND date <= 2025-09-04 GROUP BY payee, invoice, due HAVING SUM(number) < 0 ORDER BY due, payee"Columnas CSV: payee, invoice, due, outstanding.
Regla de segmento para la fecha de referencia D = 2025-09-04 y el due de cada fila (ISO YYYY-MM-DD):
| Condición | Segmento |
|---|---|
due vacío | missing-due |
due > D | not-yet-due |
due == D | due-today |
1 ≤ (D − due) ≤ 30 | 1-30-overdue |
31 ≤ (D − due) ≤ 60 | 31-60-overdue |
(D − due) ≥ 61 | 61+-overdue |
Python compacto (solo stdlib) que implementa esa tabla:
from datetime import date
AS_OF = date(2025, 9, 4)
# Apply bucket() to each CSV row's due column (ISO YYYY-MM-DD or empty).
def bucket(due: str | None) -> str:
if not due:
return "missing-due"
days = (AS_OF - date.fromisoformat(due)).days
if days < 0:
return "not-yet-due"
if days == 0:
return "due-today"
if days <= 30:
return "1-30-overdue"
if days <= 60:
return "31-60-overdue"
return "61+-overdue"Envejecimiento esperado para las filas abiertas al 2025-09-04:
| invoice | due | días vencidos | segmento | outstanding |
|---|---|---|---|---|
| INV-ND | (vacío) | — | missing-due | 50.00 |
| INV-77 | 2025-08-05 | 30 | 1-30-overdue | 150.00 |
| INV-440 | 2025-09-04 | 0 | due-today | 200.00 |
| INV-9001 | 2025-09-09 | −5 | not-yet-due | 800.00 |
| INV-220 | 2025-09-14 | −10 | not-yet-due | 300.00 |
El vencido hoy no se pliega en "corriente": due == as-of es su propio segmento. No vencido aún requiere due > as-of.
- Ratio de Rotación de CxP:
Compras Totales a Proveedores ÷ CxP Promedio. Una métrica relacionada, Días de Pago Pendientes (DPO), es aproximadamente365 ÷ Ratio de Rotación. - Si No Puedes Pagar a Tiempo: Las CxP están destinadas a deuda a corto plazo. Si un proveedor acepta un reembolso formal a más largo plazo, reclasifica fuera de CxP a un pagaré — mantén la misma identidad de factura en la conversión para que el grupo de CxP se liquide.
2025-10-01 * "Helix Industries" "Convert overdue AP to 12-month note" ^INV-1110
invoice: "INV-1110"
due: "2025-09-15"
Liabilities:AccountsPayable 2000.00 USD
Liabilities:NotesPayable -2000.00 USDMejores Prácticas para CxP en un Libro Mayor de Texto Plano
- Ve sin Papel: Almacena los PDF de facturas bajo tu árbol de documentos y adjúntalos con la clave de metadatos
document:(y la carga de Fava /link_documentscuando uses Fava). - Reutiliza la Identidad de Factura en los Pagos: Pon los mismos
invoice:,due:y^linken la factura y en cada pago que la liquide. - Informa Contra una Fecha de Referencia: Corta las consultas de partidas abiertas y de antigüedad con
date <= AAAA-MM-DDpara que un pago posterior no pueda reescribir una instantánea anterior; envejece con la mismaD. - Mantén los Metadatos Ordenados: Usar consistentemente
invoice:,due:yterms:mejora la búsqueda, las consultas y las revisiones financieras. - Acumulación en Todo Momento: Si quieres informes útiles de CxP, comprométete a llevar tus libros sobre una base de acumulación. Beancount y Fava manejan los saldos de acumulación en el Balance General sin plugins especiales.
Inicio Rápido para Copiar y Pegar: Factura de Proveedor + Pago
Para el flujo de trabajo completo de partidas abiertas (liquidada + parcial + impaga, fecha de referencia, antigüedad), prefiere el inicio de CxP descargable anterior. El par mínimo de factura + pago a continuación aún muestra la identidad en ambas partes: abre las cuentas primero (o incluye estas aperturas en tu libro mayor principal). Los metadatos opcionales document: se omiten aquí para que nada fuera del libro mayor sea necesario.
option "operating_currency" "USD"
2025-01-01 open Assets:Bank:Checking USD
2025-01-01 open Liabilities:AccountsPayable USD
2025-01-01 open Expenses:Supplies:Paint USD
; ---- Bill ----
2025-08-05 * "Forest Paint Supply" "Paint order INV-10455" ^INV-10455 #ap
invoice: "INV-10455"
due: "2025-09-04"
Expenses:Supplies:Paint 500.00 USD
Liabilities:AccountsPayable -500.00 USD
; ---- Payment (no discount) ----
2025-09-01 * "Forest Paint Supply" "Payment INV-10455" ^INV-10455
invoice: "INV-10455"
due: "2025-09-04"
Liabilities:AccountsPayable 500.00 USD
Assets:Bank:Checking -500.00 USDCon Beancount 3.2.3 y beanquery 0.2.0, cargar este inicio no produce errores, la cuenta de CxP suma a cero y la consulta de factura + vencimiento devuelve un solo grupo (Forest Paint Supply, INV-10455, 2025-09-04) cuyo monto está vacío (liquidada) — no una fila facturada más una fila de pago huérfana (…, null, null).
Este guía tiene fines educativos y no constituye asesoramiento fiscal, legal o financiero.
Referencias y Lecturas Adicionales:
- Sintaxis del lenguaje Beancount — cuentas, metadatos, etiquetas, enlaces y documentos (verificado 2026-09-11)
- Referencia del Lenguaje de Consulta de Beancount (BQL) (verificado 2026-09-11)
- Características de Fava — carga de documentos y
link_documents(verificado 2026-09-11) any_meta()para consultar metadatos de transacción/asiento (Martin Blais, lista de correo de Beancount; verificado 2026-09-11)





