Automated analysis: 4 risk factor(s) detected (Script Execution, File System Access, Network Access, Environment Variable Access). Permissions: 7/100, Data handling: 85/100.
Manual bank reconciliation is one of the most time-consuming tasks in bookkeeping. Business owners and accountants spend hours comparing bank statements to invoices, searching for gaps, and documenting discrepancies. In Israel, managing multiple banks and credit cards makes the complexity even greater.
Author: @skills-il
Automate bank reconciliation for Israeli banks, including discrepancy detection and reconciliation report generation
npx skills-il add skills-il/accounting --skill israeli-bank-reconciliationAutomate the process of reconciling Israeli bank transactions against your accounting records. This skill leverages the open-source israeli-bank-scrapers library to fetch transactions and provides a structured workflow for matching, discrepancy detection, and report generation.
Install the required dependencies for bank scraping and data processing.
npm init -y
npm install israeli-bank-scrapers csv-parse csv-stringify dayjsIf you plan to use OFX import instead of scraping, also install:
npm install ofx-jsFor reference, the core scraping library is maintained at: https://github.com/eshaham/israeli-bank-scrapers
For users who want automated budget tracking alongside reconciliation, consider Caspion: https://github.com/brafdlog/caspion
Create a configuration file for your bank connections. Never hardcode credentials directly in scripts.
Create a file named bank-config.json with the following structure:
{
"accounts": [
{
"id": "main-business",
"bank": "hapoalim",
"credentials": {
"userCode": "${BANK_USER_CODE}",
"password": "${BANK_PASSWORD}"
}
}
]
}Supported bank identifiers:
hapoalim - Bank Hapoalimleumi - Bank Leumidiscount - Discount Bankmizrahi - Mizrahi Tefahototsar-hahayal - Otsar Ha-Hayalmercantile - Mercantile Discount Bankmax - Max (formerly Leumi Card)visa-cal - Visa Calisracard - IsracardStore actual credentials in environment variables, not in the config file.
Create a scraping script that fetches transactions for a configurable date range.
const { createScraper } = require('israeli-bank-scrapers');
async function fetchTransactions(bankId, credentials, startDate) {
const scraper = createScraper({
companyId: bankId,
startDate: startDate,
combineInstallments: false,
showBrowser: false
});
const result = await scraper.scrape(credentials);
if (!result.success) {
throw new Error(`Scrape failed: ${result.errorType} - ${result.errorMessage}`);
}
return result.accounts.flatMap(account =>
account.txns.map(txn => ({
date: txn.date,
amount: txn.chargedAmount,
description: txn.description,
memo: txn.memo || '',
reference: txn.identifier || '',
status: txn.status,
accountNumber: account.accountNumber
}))
);
}Load your invoices and receipts from CSV, or connect to your accounting system. The reconciliation expects records in a normalized format.
Expected accounting record format:
| Field | Type | Description |
|---|---|---|
date |
YYYY-MM-DD |
Transaction date |
amount |
number |
Amount in ILS (negative for expenses) |
reference |
string |
Invoice/receipt number |
vendor |
string |
Vendor or payee name |
category |
string |
Accounting category |
For CSV import, handle Israeli-specific formatting:
Configure rules for automatic transaction matching. The matching engine supports multiple strategies applied in priority order.
Exact match: Match by reference number and exact amount.
Fuzzy match: Match by date range (+/- 3 days), amount tolerance (within 1 ILS), and vendor name similarity.
Pattern match: Define regex patterns for recurring transactions (rent, utilities, subscriptions).
const matchingRules = [
{
name: 'exact-reference',
priority: 1,
match: (bankTxn, accRecord) =>
bankTxn.reference === accRecord.reference &&
Math.abs(bankTxn.amount - accRecord.amount) < 0.01
},
{
name: 'amount-date-fuzzy',
priority: 2,
match: (bankTxn, accRecord) => {
const dateDiff = Math.abs(
dayjs(bankTxn.date).diff(dayjs(accRecord.date), 'day')
);
const amountDiff = Math.abs(bankTxn.amount - accRecord.amount);
return dateDiff <= 3 && amountDiff <= 1.0;
}
},
{
name: 'recurring-pattern',
priority: 3,
patterns: [
{ regex: /חשמל|electric/i, category: 'utilities' },
{ regex: /ארנונה|municipal/i, category: 'municipal-tax' },
{ regex: /ביטוח|insurance/i, category: 'insurance' }
]
}
];Execute the matching process and categorize results into three buckets:
Additionally flag suspicious transactions:
Produce a structured report showing the reconciliation status.
The report should include:
Output formats:
User says: "Reconcile my Hapoalim business account for January 2026 against my QuickBooks export."
Actions:
israeli-bank-scrapersResult: A reconciliation report showing 98% match rate. The 8 unmatched bank entries are petty cash ATM withdrawals missing receipts. The 3 unmatched accounting records are checks not yet cleared. The report highlights one suspicious duplicate charge of 2,450 ILS at the same vendor on the same date.
User says: "I need to reconcile both my Leumi checking account and my Max credit card against my accounting system for Q4 2025."
Actions:
Result: Combined reconciliation report covering both accounts. Leumi checking shows 97% match rate with 12 unmatched items. Max credit card shows 91% match rate, with most unmatched items being installment splits. Report includes a recommendation to split 4 accounting entries to match the installment pattern. Total reconciliation difference: 127.50 ILS traced to a foreign currency conversion rounding difference.
User says: "I need to find all bank transactions from 2025 that don't have matching invoices before I file my annual tax return."
Actions:
Result: Found 34 expense transactions totaling 18,200 ILS without matching invoices. The largest gaps are: office supplies from a vendor billed in cash (6 transactions, 3,400 ILS), software subscriptions charged in USD and converted (8 transactions, 5,100 ILS), and parking/toll charges (20 small transactions, 9,700 ILS). Provides a prioritized list for the accountant to locate or create missing invoices.
israeli-bank-scrapers library documentation: https://github.com/eshaham/israeli-bank-scrapers - Consult when adding support for new bank types or troubleshooting scraper configuration.Cause: The bank credentials are incorrect, expired, or the account requires a password reset. Some Israeli banks also enforce periodic password changes. Solution: Verify credentials by logging into the bank's website manually. If the password was recently changed, update the environment variables. For banks requiring OTP or two-factor authentication, ensure the scraper configuration includes the required additional fields.
Cause: The date range may be too narrow, the account may have no activity, or the bank's scraper may require a different date format.
Solution: Expand the date range and verify that the startDate is a valid JavaScript Date object. Check that the bank account has transactions in the specified period by logging into the bank's website. Some scrapers return transactions from the start date to today, not to a specified end date.
Cause: Israeli accounting software often exports CSV with Windows-1255 (Hebrew) encoding or includes BOM markers that trip up UTF-8 parsers.
Solution: Convert the file to UTF-8 before parsing: iconv -f WINDOWS-1255 -t UTF-8 input.csv > output.csv. Alternatively, specify the encoding in the CSV parser options. Also check for semicolon delimiters (common in Israeli Excel exports) instead of commas.
Cause: Rounding differences in currency conversion, VAT calculations, or installment splitting can cause small discrepancies between bank amounts and accounting entries. Solution: Configure the matching tolerance threshold. For shekel amounts, a tolerance of 1.00 ILS handles most rounding cases. For transactions involving foreign currency conversion, increase tolerance to 5.00 ILS. If discrepancies are systematic, check whether VAT (17% in Israel) is included in bank amounts but excluded in accounting entries.
Supported Agents
Reconcile my Leumi bank statement for February 2026 against my accounting records. Identify unmatched transactions.
Check all my bank accounts and find invoices that were not recorded in the bookkeeping.
Generate a summary bank reconciliation report with matched, unmatched, and suspicious transactions.
Trust Score
This skill can execute scripts and commands on your system.
1 occurrences found in code
This skill can read and write files on your system.
1 occurrences found in code
This skill can make network requests to external services.
1 occurrences found in code
This skill can access environment variables which may contain secrets.
14 occurrences found in code
Import and export data between Hashavshevet accounting software and modern formats like JSON, CSV, and Excel, including Hebrew encoding conversion and cloud migration
Build SHAAM-compliant electronic invoices with allocation numbers per Israeli Tax Authority requirements
OCR and parse Israeli receipts and invoices with Hebrew and English text extraction
Want to build your own skill? Try the Skill Creator · Submit a Skill