How often do you write/import your transactions?

As I do them manually because banks in my country sucks ass, I tend to do them as often as I can. Most of the time, I do them right before I go to my bed and often times I do them right after transaction. It’s cumbersome to say the least but at least hledger add helps me ton.

How often do you guys do yours? How smooth is the csv import of yours? How much detail do you guys aim for?

1 Like

I never import. I do everything manually, and manually reconcile at statement time. Lately I have been enjoying Android NanoLedger app on my phone and just synch when I am at the computer. It might be a little extra effort, but I have gotten to a good workflow and I just feel more comfortable then just blindly trusting their data.


I aim to import/record/reconcile most active accounts (main bank, paypal, cash wallet) about every 2-3 days. I would aim for daily but my main bank often doesn’t update its CSV for several days (pending transactions are visible in the web UI but not in the downloaded CSV), which can be frustrating.

Sometimes it gets pushed down the queue and I might fall a week or two or even a month behind. Those take longer to catch up from, and there are more likely to be expenses or cash movements I can’t perfectly account for (“expenses:accounting-loss”).

The highest priority is recording ASAP (at least as a note, if not a full journal entry) transactions which won’t appear in bank CSV and are most likely to be forgotten, like small loans or cash transactions. I usually just write a line in the journal, or copy-paste a similar entry and leave it commented out. I don’t often use hledger add.

Importing is usually relatively smooth, for me it looks like this:

  • manually download main bank’s CSVs
  • run just csv to gather/clean those and download a paypal CSV
  • run just csv-import --dry to preview the converted new txns
  • look for "unknown"s and update CSV rules if needed to fix those
  • run just csv-import to do the import
  • open the journal file with emacs + ledger-mode + flycheck-hledger, and C-c ! l to show journal errors in a side window
  • select the imported txns and M-q to align the decimal marks
  • review them one at a time, doing any final entry/rule fixes, marking each cleared when done with C-c C-e
  • if the error window is showing recentassertions failure, I run just assert to generate balance assertions for the main asset accounts (with hledger close --assert), and copy some or all of that into the journal to satisfy the recentassertions check
  • I compare those calculated/asserted balances with the current real-world balances, in the CSV if available or in online registers (usually the bank has timed out and I must log in there again), and investigate any disagreements.

Some accounts (investments) update less often so I download/reconcile those monthly or so.

I aim for full detail, ie categorising everything and matching real world events/amounts as accurately as possible. As mentioned, sometimes “expenses:accounting loss” or “balance adjustments” are necessary if record keeping has been weak or delayed. I try to keep those to a minimum. I probably spend more time on all this than would be considered sensible. Some weeks I spend half an hour, others 5h or 10h (on catchup, deeper cleanup of journal/rules/scripts, and/or finance-related actions). The average so far this year is 3h/week.

(See also: hledgermatic)

1 Like

The regular stuff which is not tied to dates (e.g. I can fetch trx from my bank or broker whenever I want), I do about once a month. For other stuff (like credit card bills), I do it whenever I get a statement/bill.

My flow is based on beancount, fava, smart_importer and different specific importers.
The flow is the following

  • either importer is able to fetch the data from bank/institution or I have to manually fetch it and send it per mail to myself
  • importer runs and smart_importer suggests classification for each trx
  • I go through the trx and correct where necessary
1 Like

Manual, in the evening, before writing the diary entry for the say.

Consistency is paramount, detailed views can be extrated from the data later on anyways.


Once a week and I import my main bank account. Import is a great method to do it quickly and avoid manual mistakes.

1 Like

Cash ASAP, (my memory ain’t so great), other accounts where I can download history usually 3-5 days.

1 Like

I use Signal to send myself notes about the cash I’ve spent so I don’t forget about it.


Normally once a week. Together with my wife I have quite a few accounts. But it takes me maybe ten minutes to download the CSVs and import them to hledger. What takes the most time is probably to remind my wife to send me her transactions. :slight_smile:

For cash I have been using Nanoledger for a while. Keeping it synced using Syncthing. Importing it together with the rest of the transactions once a week. Works great so far.


I complained to a large-enough institution here, in the US, that CSV exports are industry-standard and that they (the institution) should implement such functionality into their website. After enough nagging (from me and very likely many others), it eventually happened. What’s the customer service like over there?

Multiple times a day. Very smooth, can handle thousands of transactions a day; fetched/written and imported in seconds thanks to hledger and docker-finance. As for details; above and beyond what the law requires.

1 Like

I import pretty much everything from CSV, and have maybe 10-20 manual transactions per year, half of which tend to be recorded valuations of some of my investments.

Everything else gets imported roughly monthly, and my workflow largely echoes that of @simonmic - grab csv, generated journals and summary reports for the current year, eyeball the diff of the summary reports, and if nothing raises my eyebrows - job done, moving on. Otherwise, I use hledger-ui to drill down into accounts/transactions that look “suspicious” for whatever reason, and maybe fix my csv classification rules


We should note, I treat CSVs as temporary and journals as primary data (“journal-first”), while I believe @adept treats CSVs as primary and regenerates the journals often (“csv-first”). Also I don’t commit reports and check their diffs, but he does.

Yes, that’s correct, good catch! :slight_smile:

I suppose the better way to say what I said would be : I have small per-year journals for manual entries that include a ton of .journal fles auto-generated from csvs

1 Like

I aim to import my main checking account every week, but in reality it is more like once a month. I consider all cash as an expense and don’t bother with it.

over time, I have converged to having a csv-first methodology as well. it’s just too time-consuming to write down all transactions. although this has resulted in an often out-of-date journals, it works for me as i review cashflow/expenses once a month.

I know my workflow needs a bit of refining:

  1. import csv
  2. check bal report to get an overview of unknown accounts
  3. update rules file with unknown accounts
  4. delete new imported transactions from journal
  5. re-import csv
1 Like

I try to do an import every Sunday.

I just switched to a new workflow:

  1. Download all transactions since last download for a particular ACCOUNT into bank.csv
  2. run a custom script ledimport which:
    • runs hledger --rules-file=ACCOUNT.rules -f bank.csv print >TMPFILE
    • opens TMPFILE in my editor
  3. edit TMPFILE: add comments, tags, … make sure its right
  4. add rules to ACCOUNT.rules for any transactions that didn’t get matched
  5. run a custom script ledassert which creates an assertion for the balance of ACCOUNT as reported by my bank
  6. run a custom script ledinstall TMPFILE which installs all the transactions into the correct transaction file
    • my transactions are organized in a directory as BUSINESS_NAME/YEAR.led
    • personal transactions are stored in personal/YEAR.led
  7. run make which builds my ledger
    • concats all transactions files, sorts by date, adds automatic transactions, …
  8. run a custom script ledcheck which checks various super-account assertions
    • like <2020-01-01 expenses == AMOUNT
      • expenses at the end of 2019 must equal AMOUNT

so far so good


I don’t import anything. I add transactions immediately if I can, but, more often, it’s when I’m at my computer later. I record cash in a separate journal, for which I maintain notes on my phone so I don’t forget. With other payment methods, I rely on the SMSs and emails I receive for every transaction. I add balance assertions a few times a week (based on the aforementioned SMSs and emails) and reconcile statements in case of any differences.

1 Like