plaintextaccounting.org

Syntax quick reference

Big 3 | Ledger | hledger | Beancount

Brief (incomplete) syntax overview for the journal file formats of Ledger, hledger and Beancount. Last tested: 2016. See also: PTA app docs, Cheatsheets


Contents:

Journal format

Things in square brackets are  optional. Some notes in the Ledger column are common to all.

Ledger
Ledger manual
Ledger CLI cheatsheet

hledger
hledger manual
Beginners corner: a basic hledger transaction
(Almost) everything you wanted to know about hledger transactions
Cost notation

Beancount
Beancount manual
Beancount Syntax Cheat Sheet

Basic example

; a comment

2016/1/1 set opening balance
   assets:checking       $500.00
   equity:opening balances

2016/1/5 farmer's market
   expenses:groceries     $50.00
   Assets:checking





Comments, directives, and/or transactions in any order

; a comment

2016/1/1 set opening balance
   assets:checking       $500.00
   equity:opening balances

2016/1/5 farmer's market
   expenses:groceries     $50.00
   assets:checking

; a comment

2016-01-01 open Assets:Checking
2016-01-01 open Equity:Opening-Balances
2016-01-01 open Expenses:Groceries

2016-01-01 txn "set opening balance"
   Assets:Checking         500.00 USD
   Equity:Opening-Balances

2016-01-05 txn "farmer's market"
   Expenses:Groceries     50 USD
   Assets:Checking

All referenced accounts must have an open directive.
Account names must begin with Assets, Liabilities, Equity, Income or Expenses (or other top-level names you have configured); all parts must be capitalised; spaces are not allowed.

Comments

; comment
# comment
% comment
| comment
* comment and org-mode outline node

Non-comment lines may end with a comment
Indented comments are attached to the preceding transaction or posting

; comment
# comment
* comment and org-mode outline node

; comment
Any unrecognised line is also a comment




Basic transactions

DATE [DESCRIPTION]
   ACCOUNT    AMOUNT
   ACCOUNT    [AMOUNT]

A transaction contains any number of indented postings (usually two), whose amounts must sum to zero
At least two spaces required between account and amount
One amount may be omitted

DATE [[PAYEE | ]NOTE]
   ACCOUNT    AMOUNT
   ACCOUNT    [AMOUNT]

Same, except DESCRIPTION can optionally be split by | into PAYEE and NOTE fields

DATE txn [["PAYEE"] "DESCRIPTION"]
   ACCOUNT    AMOUNT
   ACCOUNT    [AMOUNT]

PAYEE and DESCRIPTION must be in double quotes, can be multiline
No need for two spaces between account and amount

Dates

YYYY-MM-DD
YYYY/MM/DD
YYYY.MM.DD
MM-DD
MM/DD
MM.DD

Other formats specified with  --input-date-format

YYYY-MM-DD
YYYY/MM/DD
YYYY.MM.DD
MM-DD
MM/DD
MM.DD

YYYY-MM-DD
YYYY/MM/DD
YYYY.MM.DD




Only YYYY-MM-DD with 8 digits is officially supported

Account names

TOPACCT[:SUBACCT[:...]]

Revenues:Salary
liabilities:credit card:CITI 1234
other assets:house

Account names begin with a letter
May contain single spaces
May contain subaccounts separated by :

TOPACCT[:SUBACCT[:...]]





Same

TOPACCT[:SUBACCT[:...]]

Income:Salary
Liabilities:CreditCard:CITI-1234
Assets:House

Top level account must be one of Assets, Liabilities, Equity, Income, Expenses
Each subaccount must be capitalised
Letters, digits and hyphen are allowed (no spaces)
 

Amounts

One of
COMMODITY QUANTITY
QUANTITY COMMODITY
QUANTITY

10
$10.00
1,000.0001 USD
10 "prepaid classes"



COMMODITY is a symbol, word or phrase; if it contains spaces or numbers, it must be in double quotes
It can be on the left or right, with or without a separating space
QUANTITY is a number with 0 or more decimal places
Decimal point is
.
Digits can be grouped into thousands by
,
Amount styles influence the standard display style for each commodity

One of
COMMODITY QUANTITY
QUANTITY COMMODITY
QUANTITY

10
$10.00
1,000.0001 USD
10 "prepaid classes"
1.000.000,01
12,34,567.89

Decimal point is .  or ,
Digit group separator is ,  or .
Any digit grouping can be used, not just thousands

QUANTITY COMMODITY




10USD
1000.0001 USD





COMMODITY is all capital letters, on the right, and required
Decimal point is .
Digit group separator
,  is allowed and ignored

More transaction   features

DATE [FLAG] [(CODE)] DESCRIPTION
   [FLAG] ACCOUNT  AMOUNT [PRICE] [=BAL]
   ...
   [FLAG] ACCOUNT  [AMOUNT [PRICE] [=BAL]]

FLAG (aka STATE) is empty, ! or * meaning uncleared, pending or cleared
CODE is any string, in parentheses
DESCRIPTION can be a payee name, narration, or both

DATE [FLAG] [(CODE)] DESCRIPTION
   [FLAG] ACCOUNT  AMOUNT [PRICE] [=BAL]
   ...
   [FLAG] ACCOUNT  AMOUNT [PRICE] [=BAL]

DATE [txn|FLAG] [["PAYEE"] "DESCRIPTION"]
   [FLAG] ACCOUNT       AMOUNT [PRICE]
   ...
   [FLAG] ACCOUNT       AMOUNT [PRICE]

The txn keyword may be replaced by a FLAG
For just a payee, use "PAYEE" ""
 

Prices

One of
@ UNITPRICE
@@ TOTALPRICE
and/or one of
{LOTUNITPRICE}
{=FIXEDLOTUNITPRICE}
and/or
[LOTDATE]

A UNITPRICE or TOTALPRICE also records a market price on this date
A LOTDATE is written in square brackets

One of
@ FIXEDUNITPRICE
@@ FIXEDTOTALPRICE
and/or
{=FIXEDLOTUNITPRICE}




These do not record market prices
The lot price syntax is ignored

{LOTUNITPRICE[ / LOTDATE]}
and/or one of
@ UNITPRICE
@@ TOTALPRICE




Lot prices are remembered and form distinct commodities, other prices are not
If there is both a lot price and a regular price, the latter records a market price

Balance assertions

= AMOUNT (after posting amount & price)

2016-03-10
   Expenses:Food      $20
   Assets:Cash       $-20 = $80

Asserts the balance in this commodity
in this account, excluding subaccounts
at this point in the parse order

= AMOUNT (after posting amount & price)





Asserts the balance in this commodity
in this account, excluding subaccounts
on this day. Same day events are processed in parse order

DATE balance ACCOUNT AMOUNT

2014-08-09 balance Assets:Cash 562.00 USD
2014-08-09 balance Assets:Cash 210.00 CAD


Asserts the balance in this commodity
in this account, including subaccounts
at the start of this day

Balance assignments

= AMOUNT (no preceding/inferred posting amount)

2012-03-10 Adjustment
   Assets:Cash            = $50
   Expenses:Misc


Sets the posting amount so as to make the balance assertion true. (The other amountless posting allows the transaction to balance)

Directives

KEYWORD ARGS...
   [SUBDIRECTIVES]

account

alias
apply
assert
bucket
capture
check
comment
commodity
define
end
expr
fixed
include
P

payee
tag
test
year

Timeclock directives:
i
o
b
h

KEYWORD ARGS...


account (alias for apply)
alias
apply
comment
D
end
include

















[DATE] KEYWORD ARGS...
   [SUBDIRECTIVES]

DATE balance
DATE close
DATE commodity
DATE document
DATE event
DATE note
DATE open
DATE pad
DATE price
DATE txn
include
option
plugin
poptag
pushtag






account, open

account ACCOUNT

    [SUBDIRECTIVES]

account Revenues:Salary
account Expenses:Food:Chicken
   note chicken food expenses
   alias food
   payee ^(KFC|Popeyes)$
   check commodity == "$"
   assert commodity == "$"
   eval print("Hello!")
   default

Gives more error checking with --strict  or --pedantic
Optional subdirectives do more stuff

DATE open ACCOUNT [COMMODITY[,...]] [METHOD]

2014-05-01 open Assets:Cash USD,CAD









Every account posted to needs an open directive with prior date

close

DATE close ACCOUNT

commodity

commodity COMMODITY

commodity EUR
commodity $
  note American Dollars
  format $1,000.00
  nomarket
  default

Gives more error checking with --strict  or --pedantic
Optional subdirectives do more stuff

DATE commodity COMMODITY
   [METADATA]

1867-01-01 commodity CAD
   name: "Canadian Dollar"
   asset-class: "cash"



Attaches metadata to a commodity

market price

P DATE TIME COMMODITY UNITPRICE

P 2004/06/21 02:18:02 AAPL $32.91
P 2004/06/21 02:18:02 AU $400.00


Used by -V and -X
Also set by transaction prices

P DATE [TIME] COMMODITY UNITPRICE

P 2015/8/9 GBP $1.55


Used by -V
A time is ignored

DATE price COMMODITY AMOUNT

2014-07-09 price USD  1.08 CAD


Also set by transaction prices


(c) 2016-2024 Simon Michael & contributors | Send updates via github