KT Sparks

Bulgarian accounting firm · 10-15 people · bookkeeping for 100+ client companies

Hands-Free Bank Statement Retrieval

Skip a single bank account and the month closes on partial data. This firm carried that exposure twice a month: three bank portals covering 70+ client companies, with a 2FA prompt at every login. Today no one pulls a statement manually.

Hands-Free Bank Statement Retrieval
Industry
Accounting & Bookkeeping
Function
Finance & Accounting
Region
Bulgaria
Duration
6 weeks
Team
3 people

Results

70+
client companies handled twice a month
All accounts at all banks, no one involved.
3
bank portals driven by RPA
Copes with 2FA by SMS and by app.
~25 h
of manual effort returned each month
About 300 hours over a year.

01

The challenge

The firm is a Bulgarian accounting and financial-management practice. Its team of 10-15 keeps the books for over 100 client companies.

The closing ran twice a month. Before each one, a person had to work through three banks' online portals, ProCredit Bank, UniCredit Bulbank and UBB, going company profile by company profile for over 70 companies. Each login triggered 2FA: an SMS code or a confirmation in an app. Then came the account-by-account routine. Open the account, download the statement and the balance, rename the file to the firm's naming rule, save it in the correct SharePoint folder.

The real price of the manual routine

  • Hours. Every run cost 5-6 hours per large bank, plus 1-2 hours for the small one.
  • Dependence on a few people. Only the handful of staff who held the banking credentials and got the codes could do the work. When they were on holiday or off sick, the closing waited.
  • Gaps in the data. Skip one account and the closing rested on partial data. Nobody knew until the figures failed to reconcile.
  • Growth with a ceiling. Each new client company meant more manual hours, so growing the business meant hiring.
  • No API option. For this use case the banks provide no statement API. The only route in is the web portal a human would use.

02

What we did

We delivered a robot that collects statements with no one watching, running on a self-hosted n8n platform. It reaches the banks with RPA through their online portals, not through an API.

An RPA engine we built into n8n

We did not license a separate RPA product for each robot. We wrote browser automation connectors of our own, and they run natively in n8n workers, built on the long-term-support release of Playwright. The library holds over 50 custom activities and can drive any application that runs in a browser. The browser acts like a real person: human-like typing, pacing and navigation. There is no per-robot RPA licence and no separate robot runtime, and capacity grows with the n8n workers.

A configuration file the accountants control

Each bank account is one Excel row: the bank, the company profile exactly as the portal names it, the company ID, the account, the authentication method, who owns the credential, the destination path and an on/off switch. A new account, a new company or an entire new client means adding a row. No change request needed.

Two routes through 2FA

2FA typeWhat the robot does
One-time SMS codeWe capture the code automatically and hand it to the robot via a webhook, and the login finishes by itself
Approval in a banking appThe credential owner gets a form that takes one click to answer. The robot waits, then carries on. Approval remains with the access owner

Designed to look like an ordinary user to the bank

  • Sessions grouped by credential. Every company profile under one credential at a bank is processed in one session. Logins are not repeated and nothing gets locked out.
  • A dedicated sub-automation for each bank handles navigation, login, choosing the company and account, and the download. Each one is built from the same activity library.

Files land where the next robot looks for them

The robot downloads statements and balances in PDF and Excel and converts them where a bank's export format needs it. It renames each file to the firm's rule and uploads it via the Microsoft Graph API into SharePoint folders organised by date. Credentials are kept in an encrypted store.

  • Scheduled runs happen on the 5th and the 15th of every month. An authenticated link starts an extra run on demand.
  • Any single account can be turned off without affecting the rest.

Stack

LayerTools
OrchestrationSelf-hosted n8n running in worker mode
RPAOur Playwright-based n8n nodes with 50+ activities
2FASMS codes caught by webhook, one-click forms for app approvals, data tables in n8n
Document storageMicrosoft SharePoint and the Microsoft Graph API
Configuration and securityConfiguration in Excel, encrypted store for credentials

03

The outcome

ManualAutomated
Time to collect statements for one closing11-14 hours in three portalsRuns unattended
Who is neededCredential holders onlyNo one
Adding a bank accountOne more manual step on every runA single row in the configuration
Naming and filingDone manuallySame rule applied every time
  • Twice a month, statements for 70+ companies at 3 banks are collected with no one at the keyboard.
  • Roughly 25 hours of manual effort gone every month, close to 300 hours over a year.
  • The closing no longer waits for whoever is in the office with the codes.
  • Every file is named and stored under a single rule. It feeds the robot that reconciles the bank accounts that runs next, and that robot could not work without it.
  • A new bank account takes one configuration row, not developer hours.
  • An engine the firm can reuse. The same 50+ activities can automate any other portal or web app the firm relies on.

What teams usually overlook

Banks redesign their portals with no warning. Without monitoring and a maintenance plan, a robot just stops, and no one finds out until closing day. Both are part of what we build from the start.