All case studies

Accounting & tax services · Client work · 2026

200 tax emails a month, and nobody retypes a number.

Every month an accountant read social security and income tax amounts for about 200 clients out of accounting software and retyped them into 200 emails. Now the amounts travel on their own and arrive as drafts. A person still reads each one before it goes.

  • 24 h saved

    every month

    Two working days a month that used to go on copying figures from one screen into 200 emails.

  • One tax ID

    does the matching

    The number already on the declaration decides who receives it. Nobody picks a recipient from a list.

  • Drafts, not sends

    a person still approves

    The system writes 200 messages and sends none of them. The last step stays human on purpose.

Client
Polish accounting firm
Stack
  • n8n
  • Google Sheets
  • Gmail
  • Webhooks

Context

An accounting firm keeps the books for around 200 small companies. Once a month, every one of those clients has to be told two numbers: what they owe in social security contributions and what they owe in income tax. The numbers are not hard to find. They sit in the accounting software, already calculated, already correct.

Getting them from there into 200 emails was a person's job. Open the software, read the figure, switch to the mail client, type it, pick the right recipient, send. Then do it 199 more times, twice a month, because the two taxes fall due on different days.

Problem

About 24 hours a month, and the hours were the smaller half of it.

What retyping a number actually costs

  • A transposed digit reaches the client as a real amount. They pay it, and the correction costs more time than the original message.
  • The right figure sent to the wrong client is worse than a wrong figure: it discloses one client's numbers to another.
  • It has to happen on a fixed day of the month, so it lands on whoever is available rather than whoever knows the client.

None of this is a hard problem to solve. It is a boring problem that nobody has time to solve, which is why it survives for years inside firms that are otherwise well run.

What I built

The rule I designed to was that the machine does the retyping and the accountant keeps the judgement. So the pipeline stops one step short of sending.

  1. The amounts leave the accounting software as data. Instead of being read off a screen, the figures for a chosen period are exported directly and posted to the automation as JSON. The accountant picks the clients, or filters by which of the two deadlines is coming up.

  2. The tax ID decides who gets the message. Every declaration already carries the client's tax number. That number is the key, matched against the contact list, so nobody picks a recipient from a dropdown and nobody can pick the wrong one.

  3. Inactive clients drop out before anything is written. A client marked as no longer active is filtered out at that point, so a closed relationship never receives a demand for a payment.

  4. Each message is written as a draft, not sent. The system produces the whole month's correspondence in the mailbox, personalised, with the amount and the period in place, and stops there.

  5. Whatever failed comes back as a report. A client with no address on file, or a run that broke halfway, produces a message to the office rather than silence. Silence is the failure mode that costs you a month.

Accountingamounts per clientMatch by tax IDwho gets this oneWrite the draftone per clientAccountant readsand presses sendno address on fileMISSREPORTED TO THE OFFICE
Four automated steps and one deliberate stop: the drafts wait in the mailbox until a person reads them.

Result

The 24 hours a month of retyping stopped. The figures reach clients as they came out of the accounting software, which removes the entire class of error where a correct number becomes a wrong one on the way. Two weeks from first conversation to a working system.

What did not change is who is responsible for the message. The accountant still opens the drafts and sends them, which is the part clients would care about if you asked them.

The hard part

Deciding where to stop automating.

The obvious version of this sends the emails. It is less code, it is a better demo, and everyone asks for it. It is also the version where a bad run mails 200 wrong amounts to 200 companies before anybody notices, and where a firm whose product is being right about numbers has quietly outsourced being right about numbers to a workflow nobody on staff can read.

Drafts cost the accountant a few minutes of clicking a month. They buy a point in the process where a human being sees what is about to leave, with their name on it. That trade was the actual design decision on this project, and it was not a technical one.

What I would build differently today

In early 2026 this was a workflow, and the automation platform was the honest tool for it: the whole thing is a chain of five steps that runs twice a month.

Today I would still keep the shape, but not the plumbing. The contact list lives in a spreadsheet, which means the source of truth for who receives what is a document anyone can drag a row in. The message template lives inside the workflow, so changing a sentence means opening the automation platform. Both belong in an application with a screen, where the person who owns the client relationship can edit a template and correct an address without opening a developer tool. That used to be weeks of work, which is why it did not happen. It is not weeks any more.

What this actually says

The interesting part of this project was never the integration. Moving a number from one system to another is the least valuable thing an automation does.

The valuable part was drawing the line: this step is arithmetic, so a machine should do it; this step is responsibility, so a person keeps it. Getting that line in the right place is what makes a system somebody trusts on the day it is wrong, and it is a design question, not an engineering one.

See also.