The card fee watcher: the rate you agreed, and the rate you actually pay
One number a month, what every EUR 100 of card sales really costs you, split by the kind of card that paid it, with an alarm when it moves
Setup: A weekend (~6-12 h)Running cost: $0-12/mo(software included)Time saved: none directly— it finds money rather than hours: on EUR 500,000 a year of card turnover, 0.1 percentage point is EUR 500 and a 0.3 point drift is EUR 1,500 a year, against EU consumer interchange capped at 0.2%/0.3% while commercial cards remain uncapped at 1.3-2.4% (EuroCommerce, 05/2026) and core scheme and processing fees up more than 25% in real terms 2017-2023, at least GBP 170m a year for UK businesses (PSR MR22/1.10, 06/03/2025)After setup: Runs unattended— reads, computes and reports by itself; whether to renegotiate, switch acquirer or write the Article 9 letter stays with youData lives: Your server— This is your full sales ledger by day, channel and card type, which is your trading position in one table. It stays on your box; the only outbound calls are to your own provider's reporting API with your own credentials.
Built for small businesses in general — not a sector list.
Before you start
At least one full month of settlement or payout files, and the bank credits that match them - a dashboard summary screen is not enough, you need the rows
Your acquiring contract, for the agreed markup, the per-transaction fee, the monthly minimum, the terminal rental and the notice period
A decision, written down once, on whether turnover includes refunded sales and whether it includes VAT, because a rate computed two ways is a rate nobody trusts
A card category field in your files, or a provider you are willing to write to under Article 9 to get one - without it you get the blended number and never the cause
Three months of acquirer invoices to backtest against, because the engine has to land on the invoice total before it is allowed an opinion
A machine that stays on, with roughly 8 GB of RAM free if your provider only publishes PDFs and you want the local model as a fallback reader
What breaks firstFAILS SILENTLY
fee coverage: the provider stops supplying interchange-level detail and the interchange, scheme fee and markup columns arrive empty, so the sum still runs and returns a flatteringly low rate. Adyen documents this explicitly - those columns are blank when the underlying acquirer does not supply the detail. Count the rows carrying a value each month and alarm when that coverage drops, and always reconcile the computed fee total against the acquirer invoice.
Version history
v1.0 · 2026-09-01 — First release. Grist as the fee ledger plus a separate contract table, n8n as the monthly job, Docling for the acquirers that only publish a portal PDF. Carries the 2026 regulatory picture: EU commercial card interchange still uncapped at 1.3-2.4% (EuroCommerce, 05/2026), inter-regional caps extended to November 2029, PSR Specific Directions 22 and 23 on scheme fee transparency, and the US Visa/Mastercard settlement preliminarily approved 09/06/2026 which moves surcharging the opposite way.
One number a month: what every €100 of card sales actually costs you, split by the kind of card that paid it. Built from files your provider is already obliged to give you, computed on your own machine, with an alarm when the number moves.
The architecture
the same flow as text
[ Settlement / payout files ] + [ Bank statement ] + [ What your contract says you pay ]
▼
[ n8n — once a month, after the last payout lands ]
│ CSV or API straight in; portal PDF via Docling first
▼
[ Grist — the fee ledger ]
│ one row per settled transaction: gross, fee, scheme, card category, channel
│ second table: the rates your contract actually promises
▼
[ Three numbers, every month ]
├─ blended effective rate, against the trailing three months
├─ effective rate per card category, and each category's share
└─ payout reconciliation: gross − fees − refunds − chargebacks vs the bank credit
Nothing is sent to your provider. You decide what to ask them for.
The design decision worth defending is that the ledger and the contract live in two separate tables. The ledger is what happened. The contract is what was promised. Keeping them apart is what lets you answer the only question your acquirer will actually respond to, which is not "this feels expensive" but "in July you charged me 1.71% blended while my contract prices consumer debit at interchange plus 0.35%, and here are the 214 rows".
The problem
Almost no small business can tell you its effective card rate. That is the only number that matters here: total card fees divided by total card turnover, for one month, in one figure. Ask ten owners and nine will quote the rate on the contract, which is a different number and always the lower one.
The arithmetic is worth doing before the tooling. On €500,000 a year taken by card, one tenth of a percentage point is €500. A shop whose effective rate drifts from 1.35% to 1.65% across three years, on flat sales, is paying €1,500 a year more than it did and has received no letter about it. That is roughly one part-time month, and it leaves the account in amounts too small to notice, forty euro at a time.
The drift usually has nothing to do with the markup you negotiated. It is the mix of cards your customers hand over. In the EU, interchange on consumer cards is capped at 0.2% for debit and 0.3% for credit by Regulation (EU) 2015/751. Commercial cards were left out of that cap, and interchange on them runs between 1.3% and 2.4%, up to six times the consumer rate; EuroCommerce asked the EU institutions to close that gap in May 2026 and it is still open. Cards issued outside the EEA are capped, but higher, and the caps were voluntarily extended to November 2029: 0.2% and 0.3% in the shop, 1.15% and 1.5% online. On top of that sits the scheme fee, and the UK Payment Systems Regulator found in its March 2025 final report that Mastercard and Visa raised core scheme and processing fees by more than 25% in real terms between 2017 and 2023, at least £170 million a year extra for UK businesses. Your rate did not change. Your customers' cards did.
The part most owners do not know is that in Europe the split is yours by right. Article 12 of the same regulation says that after each transaction the acquirer must give the merchant the transaction reference, the amount credited, and the charges "indicating separately the merchant service charge and the amount of the interchange fee". It may only aggregate that with your prior and explicit consent. Article 9 goes further: the acquirer must offer and charge merchant service charges individually specified per card category and per brand, unless you asked in writing for a blended charge. Most small merchants signed the blended version without reading that sentence. Un-signing it is a letter, not a lawsuit.
Tool choices — and why
Grist
(Apache-2.0, 11.7k stars, v1.7.18 released 28/08/2026) holds both tables. An effective rate is a formula, and Grist is the rare self-hosted tool that is a real database and still lets the formula sit in the cell where a bookkeeper expects to find it. Its built-in charts are enough for the one line you need, which is the blended rate over twenty-four months. Baserow (open-core, non-premium features under MIT, 5.7k stars) does the same job if you already run it, with more of the arithmetic pushed into n8n.
n8n
(Sustainable Use License, free for internal business use, 203.0k stars, v2.36.9 released 31/08/2026) is the monthly job: fetch, load, compute, compare, alert. One workflow per provider, because no two settlement formats agree on anything.
Docling
(MIT, 65.8k stars, v2.124.0 released 31/08/2026) exists in this stack for one reason. Bank acquirers such as Worldline, Nexi, CCV, Elavon and Barclaycard typically publish a monthly PDF in a portal and nothing else. Docling turns that into tables. Where the layout shifts between months, a small model on Ollama (MIT, 179.8k stars, v0.33.2 released 27/08/2026) reads the fee block, and every figure it proposes gets confirmed against the payout total before it enters the ledger. If the two do not agree to the cent, the month does not load.
Where the data comes from, and the catch for each
Adyen is the most generous: the Settlement details report is a CSV with separate columns for Commission, Markup, Scheme Fees and Interchange, plus a Payment Method Variant field that is your card category, and it can be scheduled and fetched rather than clicked. Adyen's own documentation notes those fee columns are empty when the underlying acquirer does not supply interchange-level information. Stripe gives everyone payout reconciliation and balance transactions, but the Interchange & Fees report that carries the actual split is only available on interchange-plus pricing. Mollie has a Settlements API that returns settlement costs per payment method with a rate and a count, and no API at all for the settlement CSV, which stays a dashboard download; its Balance Report export collapses withheld fees onto a single line. SumUp, Zettle and the rest of the flat-rate terminals give you transactions and one rate, which is enough for the blended number and nothing more.
Above roughly fifty thousand transactions a year
, drop DuckDB (MIT, 40.9k stars, v1.5.5) between the files and Grist. It reads CSV and Parquet directly with no server to run, does the grouping in a second, and hands Grist the monthly summary instead of a million rows. Below that volume it is a dependency you do not need. Metabase (open source edition AGPL-3.0, 49.0k stars, v0.63.15 released 26/08/2026) is the answer if you want a real dashboard rather than one Grist chart.
Running cost
Software €0. If n8n is already running for another blueprint in this library, marginal cost is €0. Standalone, one small VPS at roughly €5–12 a month carries the ledger, the job and the PDF reader. No per-transaction fee, which would be an unusually poor joke here.
Setup outline
1. Before building anything, take one full month of settlement files and divide total fees by total card turnover. Write the number down. If it is more than 0.2 points above the headline rate in your contract, you have a phone call to make this week and a project to do afterwards.
2. Decide your conventions once and write them in the sheet: does turnover include refunded sales, do you count VAT, does a chargeback fee belong to the month of the sale or the month of the dispute. Every one of these moves the answer, and a rate computed two ways is a rate nobody trusts.
3. Build the ledger in Grist: date, provider, transaction reference, gross, net, total fee, and where the file gives it, interchange, scheme fee and markup separately. Then the two columns that carry the whole blueprint: card category and channel.
4. Build the contract table next to it: agreed markup in basis points, per-transaction fee, which components are passed through and which are fixed, monthly minimum, terminal rental, PCI charges, and the notice period on the acquiring contract. That last field is the one you will want at negotiation time.
5. Wire one n8n workflow per provider. Fetch or read, normalise into the ledger's columns, and log the source file name and its row count so a silently truncated export is visible.
6. Reconcile the payout: gross minus fees minus refunds minus chargebacks should equal the credit on your bank statement, to the cent. Alert on any gap. This one check catches the missing payout, the duplicated file and your own arithmetic in a single line.
7. Set two alarms. One when the blended effective rate moves more than your threshold against the trailing three-month average, ten basis points is a sane start. One when any card category's share of turnover moves more than two points, because that is the cause the first alarm will not name.
8. If your files carry no split, write the letter. Cite Article 9 and Article 12 of Regulation (EU) 2015/751, ask for merchant service charges individually specified by card category and brand, and withdraw any consent you gave to aggregated reporting. In the UK, the PSR's Specific Directions 22 and 23 on scheme fee transparency point the same way. What comes back is your negotiating position.
9. Backtest before you trust it. Reproduce three months you already have acquirer invoices for. If the engine does not land on the invoice total, the ledger is wrong, not the invoice.
Pitfalls — the real ones
Blended pricing hides the cause by design
On a single flat rate the effective rate is still computable and still worth watching, but when it rises you cannot tell whether your customers changed cards or your acquirer changed its mind. That is precisely the situation Article 9 was written for, and it is why step 8 exists.
Empty columns are not zero fees
Adyen leaves Interchange, Scheme Fees and Markup blank when the acquirer behind it does not supply the detail. Sum those blanks and you get a beautifully low rate that is wrong. Count how many rows actually carry a value and alarm when that coverage falls, because this failure is silent and flattering.
The fee is often not on the transaction
Plenty of acquirers debit fees monthly as one lump, which makes a per-transaction join impossible. The monthly ratio still works, and a blueprint that insists on transaction-level attribution will simply never load a month.
Refunds break the denominator
A refund usually returns the sale to the customer and does not return the interchange to you. Net refunds off turnover and you understate your rate; ignore them and you overstate it. Pick one, print it on the sheet.
You probably cannot surcharge your way out of this in Europe
PSD2 Article 62(4) bans surcharging on the cards the interchange caps cover, and per EuroCommerce 16 of the 27 member states have gone further with a complete ban, which sweeps in commercial cards too. The United States is moving the other way: on 9 June 2026 Judge Brian Cogan granted preliminary approval to the revised $38 billion Visa and Mastercard settlement, which trims posted credit interchange by 10 basis points for five years, caps standard consumer credit at 1.25% for eight, splits the honour-all-cards rule so merchants may decline premium and commercial products, and widens surcharging rights. Final approval is expected late 2026 or into 2027. Know which side of that line your till sits on before you print a sign.
Refusing commercial cards sounds better than it works
The regulation lets you decline them, but merchants mostly cannot tell which card is commercial: the BIN ranges are not published and tokenisation makes it harder every year. Measuring what they cost you is realistic today. Turning them away at the counter is not.
One month is not a trend
Card mix swings with your season, your tourists and your December. Always compare against a trailing average, and do not send anyone an angry email in the first quarter of running this.
This is not legal, tax or financial advice
What your acquiring contract obliges, what your national rules allow on surcharging, and what it costs to leave before the notice period are questions for your own lawyer or accountant. The engine does division and keeps a record. It does not know your contract.
Verified repos
Grist — Apache-2.0, 11.7k stars, v1.7.18 released 28/08/2026 n8n — Sustainable Use License (free self-hosted internal use), 203.0k stars, v2.36.9 released 31/08/2026 Docling — MIT, 65.8k stars, v2.124.0 released 31/08/2026 Ollama — MIT, 179.8k stars, v0.33.2 released 27/08/2026 DuckDB — MIT, 40.9k stars, v1.5.5 (checked 01/09/2026) — only above ~50k transactions a year Metabase — open source edition AGPL-3.0, 49.0k stars, v0.63.15 released 26/08/2026 — optional dashboard Baserow — open-core, non-premium features under MIT, 5.7k stars (checked 01/09/2026) — alternative ledger if you already run one