Bank CSV Import

Bank CSV Import

Overview

Most banks let you download a CSV file of transactions for any statement period. Instead of typing each line into TimelyChurch by hand, you can upload that file and let the system parse it, match it to your accounts and categories, and post each row as a transaction. Every imported row passes through a review queue so a human always confirms what hits the books before it lands in the ledger.

The Bank CSV Import workflow is designed for treasurers who reconcile monthly: download the bank's CSV, upload, review, accept. Most months take only a few minutes.

Where to Find It

Go to Finances > Accounting > Transactions (in Simple mode this tab is labeled Money In / Out). Click the small arrow on the New Transaction split button to open its menu, then choose Import from CSV. The same menu is where you create a New Expense, New Income, New Transfer, or New Journal Entry, and where you Export the filtered list to CSV.

If you have rows already waiting from a previous upload, the Transactions tab in the accounting navigation shows an amber count badge with the number of rows still to review, and the review queue appears inline at the top of the Transactions page.

Supported Bank Formats

TimelyChurch auto-detects the file format from the header row and applies a built-in parser. Recognized formats include:

  • Bank of America -- Standard checking-account CSV export.
  • CashApp -- Statement-style export from CashApp business accounts.
  • PayPal and Stripe -- Payment-processor activity exports.

If your bank's format is not auto-detected, the file is still importable as a generic CSV: you confirm or adjust the column mapping yourself in the next step (see "The Upload Flow" below). Rows that cannot be parsed cleanly are skipped, and any flagged as possible duplicates are surfaced in the review queue so you can confirm or exclude them.

The Upload Flow

Choosing Import from CSV opens a three-step modal:

  1. Step 1 -- Upload File. Select the bank account the file belongs to (only Asset-type accounts are listed) and choose the CSV file to upload, then click Next: Map Columns.
  2. Step 2 -- Map Columns. TimelyChurch reads the file, shows the detected source and a preview of the first few rows, and proposes a column mapping (date, description, amount, fee, payee/name, reference). For recognized banks this is usually correct as-is; for a generic CSV, confirm or adjust which column maps to each field.
  3. Step 3 -- Import. TimelyChurch runs duplicate detection (see below) and stages each parsed row in for review status. The rows then appear in the review queue on the Transactions page.

If you upload a file that has already been imported for this account, Step 2 shows an amber "This file was already imported" warning with the original import date and count, and you can choose Import Anyway or cancel.

The Review Queue

The review queue is the heart of the import flow. Every uploaded row stays here until you explicitly accept or exclude it -- nothing posts to your ledger automatically.

Each row in the queue shows:

  • The transaction date, description, and amount as parsed from the CSV.
  • A suggested category (the system tries to match based on description keywords and your prior categorizations).
  • A suggested payee/donor if the description matches an existing payee.
  • A method (payment method) you can override before accepting.
  • Any duplicate warnings (see next section).

For each row you can edit the suggested category, payee, method, and other details inline before deciding what to do with it. The rest of this section walks through classifying a row, handling donations and fees, and accepting -- one row at a time or in bulk.

Once accepted or excluded, a row leaves the review list. You can come back to the queue across multiple sessions -- nothing forces you to clear it in one sitting.

Classifying Each Row: Income, Expense, or Transfer

Every row has a Type control. It defaults to Auto (Income) or Auto (Expense) -- TimelyChurch decides income vs. expense from the sign of the amount in the CSV (money in is income, money out is an expense), so you can normally leave it on Auto. Switch it to Transfer for a row that simply moves money between two of your own accounts (for example, checking to savings) rather than being real income or a real expense.

Recording a Transfer

Setting a row's Type to Transfer swaps the category field for an Other account picker. Choose the account the money moved to or from -- the other side of the transfer. Only your bank/asset and liability accounts are listed, excluding the account you imported into. A transfer has no category, donor, or fee, so those fields are hidden for the row. You must pick the other account before the row will accept; TimelyChurch will not post a transfer that has no counterparty or that points back at the same account.

Donations: Choose a Donor or Mark It Anonymous

When a row's category is a giving category that requires a donor (tithes, offerings, and similar), you must attribute the gift before it will post. There are two ways:

  • Select the donor in the Donor name... search, or add a new person inline. The accepted gift is linked to that person, so it appears on their giving record and year-end statement.
  • Tick "Anonymous offering" for a genuinely donor-less gift -- cash in the plate, or an anonymous online gift. This records the donation with no donor and satisfies the requirement without a person.

The two are mutually exclusive: turning on Anonymous offering clears any selected donor, and choosing a donor clears the anonymous flag. If you try to accept a donation row with neither, TimelyChurch stops you and asks you to pick a donor or mark it anonymous. General income that is not a donation category (for example, book or coffee sales) needs no donor and posts on its own.

Processing Fees

When a row carries a processing fee -- Cash App, PayPal, and similar processors report the fee separately -- a purple Fee badge shows the amount and a Fee category picker appears under the description. Choose the expense category the fee should post to; only expense categories are listed, because a fee is always an expense. TimelyChurch records the gift at its gross amount and books the fee as a separate expense, so reports show both full giving and the net deposit. A row with a fee will not accept until you have chosen its fee category.

Tip: If you always send a processor's fees to the same category, TimelyChurch offers to remember it ("Always use this category for ... fees?") after you pick it a few times, so future imports fill it in automatically.

Accepting Rows

  • Accept one row with the green check in its Actions column. This posts a real transaction -- and, for a donation, the linked gift -- to your ledger and removes the row from the queue.
  • Exclude a row (the ×) if it should not become a transaction (for example, a bank fee already recorded elsewhere).
  • Accept in bulk: on the Review all page, Accept categorized posts every row that already has a category in one click. Rows still missing a donor, a fee category, or a transfer's other account are intentionally left in the queue so nothing lands half-classified. You can also select several rows and use Apply category to set one category across all of them before accepting.

Duplicate Detection (4 Layers)

Bank CSV files often overlap. If you upload June and July statements but they share the last few days of June, you would expect to import the same transactions twice. TimelyChurch uses four layers of duplicate detection to catch these cases automatically.

Layer 1: CSV File Hash

Every uploaded file is fingerprinted and that fingerprint is remembered. If you upload the same file a second time for the same account, TimelyChurch recognizes it and warns you before importing -- saving you from creating dozens of phantom duplicates.

Layer 2: Reference Number, or Amount + Date + Description

For each parsed row, the system checks whether a matching transaction already exists:

  • Tier 1 (high confidence): Matches an existing transaction's reference number exactly (checked across the whole church). This catches check numbers and bank-issued transaction IDs.
  • Tier 2 (medium confidence): Matches the same amount, the same date, and the same account, with a matching description -- for rows that have no reference number.

The check looks at both already-posted transactions and other rows still waiting in the review queue, so you cannot accidentally accept the same row twice from two different uploads.

Layer 3: Confirmation on Accept

When you accept a row that the system flagged as a likely duplicate, you are shown the existing transaction it conflicts with. You can either confirm it really is a separate transaction and post it anyway, or cancel and exclude the row.

Layer 4: Final Safety Net

As a last line of defense, TimelyChurch enforces a final guarantee that the same reference number cannot be posted twice for the same account. Even if something slipped past the earlier checks, this final guard rejects the duplicate before it lands in your ledger.

Best Practices

Reconcile before importing. Bank reconciliation is still the system of record for catching errors. Run a reconciliation each month using the imported data, not as a substitute for it.

Review categories carefully on the first few imports. The category suggester learns from your prior categorizations. The first month or two of imports may need more manual category corrections; later months get noticeably faster as the suggestions improve.

Exclude, do not delete. If a row should not post, click Exclude rather than ignoring it. Excluded rows are remembered, so re-uploading an overlapping file will not surface them again.

Keep imports tied to one account. Each upload is scoped to a single bank account. If you have multiple checking accounts, do a separate upload per account. This keeps duplicate detection and reconciliation clean.

Troubleshooting

"This file was already imported" -- The CSV file hash matches a previous upload for this account. Either you uploaded it twice, or the bank exported the same date range. Review the existing import, then choose Import Anyway only if you are sure the rows are new.

"Possible duplicate" flag on a row -- The system found a transaction with the same reference number, or the same amount, date, and description. Compare to the existing transaction; if they really are the same, exclude the row. If they happen to be coincidentally identical (rare), confirm and accept.

Rows fail to parse with no obvious error -- Your bank may have changed its CSV format, so auto-detection fell back to a generic import. Open the CSV in a spreadsheet, confirm the header row, and in Step 2 map the columns manually -- or re-export from the bank using its standard format.

We use cookies to personalize your experience. By continuing to visit this website you agree to our use of cookies

More