'Statement', 'columns' => 'Columns', 'review' => 'Review']; ?>
$label) { $i++; $done = array_search($key, array_keys($steps)) < array_search($step, array_keys($steps)); ?> 1) { ?> ' : $i . '. ' ?> · Start over
is part way through - nothing from it is imported yet. Carry on with it

Import Deposits

When a deposit doesn't say - ACH, a check or a wire is read from its text.
The CSV your bank's website exports - often under Download, Export or Activity. Up to lines. Only the money in is brought in here.

How it goes

  • The columns are worked out for you, and kept on the account - a statement already imported for expenses goes straight to the review.
  • Each deposit is matched to what it pays: an invoice number in its text, the client it came from last time or whose name is in it, or the only invoice owing that much. A client's invoices are paid oldest first, and a deposit short of them leaves the last one part paid.
  • Payouts from the payment provider and transfers from your other accounts come in as transfers, not income. Anything else is other income, with its category and client.
  • Deposits brought in before, and ones that match a payment or income entered by hand within days, are left out unless you tick them.
  • Nothing is imported until you press Import on the review.
payer remembered See them
$invoice['invoice_id'], 'ref' => $invoice['ref'], 'balance' => $invoice['balance'], 'due' => $invoice['due'], 'scope' => mb_strimwidth($invoice['scope'], 0, 60, '...'), 'currency' => $invoice['currency']]; } $payer_options = ''; foreach ($clients as $client_id => $client_name) { if (isset($owing[$client_id])) { $payer_options .= ''; } } $client_options = ''; foreach ($clients as $client_id => $client_name) { $client_options .= ''; } $category_options = ''; foreach ($categories as $category_id => $category) { $category_options .= ''; } $account_options = ''; foreach ($accounts as $account_id => $row) { if ($account_id !== intval($import['account_id'])) { $account_options .= ''; } } $count = ['new' => 0, 'imported' => 0, 'entered' => 0, 'recorded' => 0, 'problem' => 0, 'payment' => 0]; $total_new = 0; $total_paying = 0; foreach ($lines as $line) { $count[$line['state']]++; if ($line['state'] === 'new') { $total_new += $line['amount']; if ($line['action'] === 'payment' && $line['invoice_ids'] && $line['how'] !== 'over') { $count['payment']++; $total_paying += $line['amount']; } } } $states = [ 'new' => ['label' => 'New', 'tone' => 'primary'], 'imported' => ['label' => 'Imported before', 'tone' => 'secondary'], 'entered' => ['label' => 'Entered already?', 'tone' => 'warning'], 'recorded' => ['label' => 'Recorded already', 'tone' => 'secondary'], 'problem' => ['label' => "Can't read", 'tone' => 'danger'], ]; $matched_icons = ['number' => 'fa-hashtag', 'rule' => 'fa-magic', 'name' => 'fa-user', 'amount' => 'fa-equals', 'payout' => 'fa-globe', 'transfer' => 'fa-exchange-alt']; ?>
New deposits
came in
Paying invoices
Already in
imported before · look entered
Columns
Change them' . $count['problem'] . " can't be read" : '' ?> · charge - bring them in as expenses
Every line on this statement reads as money out. If it has deposits, check which way round the amounts are.

The deposits

class="">
Date On the statement Amount It is What it pays, or where it goes
aria-label="Import this deposit">
?' ?>
-' ?>
Open it # ·
Money moved between your accounts - not income.
No money in on this statement.