Field Stories8 min read

The Overdue Invoice That Was Really a Dispute

By Ergini, Software & AI Developer

A composite story. The company and the people in it are invented. The problem, the rules and the system are real, and the full blueprint is in the use case library.

TL;DR

A composite story: an invented packaging distributor in Breda sends a Walloon bakery group a final notice with interest and a EUR 40 fee for an invoice the customer blocked weeks earlier, over a price the distributor itself had lowered. The reply explaining it, in French, sat unread while the schedule kept sending. The workflow I would build syncs payments first, reads every reply in any language, pauses only the disputed invoice, and gives the account manager the invoice, the order and the price agreement. Interest, fees, credit notes and terms stay with people.

Interest on the old price

"You lowered our price in April, and now you want interest on the old one?"

Nathalie buys packaging for a bakery group in Wallonia with four production sites, and she is on the phone with Ruben, the account manager who negotiated that April price with her. In front of her is a letter her accounts payable team forwarded that morning: a final notice for invoice 26-3318, €11,460, now 30 days overdue, announcing statutory interest and a €40 recovery fee if payment does not arrive within seven days.

Ruben works for a distributor of food packaging in Breda: trays, films and cartons for about 600 food producers in the Netherlands, Belgium and northern France, 55 people and around 450 open invoices at any time. (Both companies, and everyone at them, are made up.) He has not seen the final notice. He did not know the invoice was overdue. He did not know that the bakery had explained, in writing, nearly four weeks earlier, why it was not paying.

The bakery group buys about €380,000 a year from him, and Nathalie mentions, without raising her voice, that a second tray supplier passed their audit in the spring.

Three reminders and one reply in French

Esther, who runs finance, rebuilds the thread that afternoon.

In April, Ruben agreed new annual prices with the bakery: 6% off four tray articles from 1 May. He logged the deal in HubSpot and sent the new price list to the office, and three of the four prices were changed in NetSuite. The fourth, the tray the bakery orders most, still carries the old price. Invoice 26-3318 charges it on one line, €690 more than the bakery's purchase order says.

The bakery's accounts payable system matches every invoice against its order, finds the price difference and blocks the whole invoice. When the first reminder arrives, three days after the due date, a clerk there replies within two days: "Facture bloquée : le prix unitaire de l'article 40-212 ne correspond pas à notre commande. Merci de nous adresser un avoir." The unit price of one article does not match their order, and they would like a credit note.

The reply lands in the finance mailbox during the two weeks that Griet, who handles the Belgian accounts and reads French, is on holiday. The colleague covering for her marks it for Griet. By the time Griet is back, it sits under three hundred newer emails.

The reminder schedule never reads the mailbox. It reads the aging report, where the invoice is simply overdue, so it sends the second reminder on day 14 and the final template on day 30, the one that mentions interest and the fee. It did exactly what it was set up to do. Nobody set it up to listen.

Replies before reminders

Esther calls me after Ruben has spent a morning apologizing. She expects me to ask about the reminder templates. I ask for the mailbox instead: read access to the folder where replies to reminders land, and the last three months of them, as they came in.

A rough first sort takes an afternoon. There are 212 replies. Most are harmless: payment confirmations, out-of-office notices, requests for a copy of the invoice. Nineteen are disputes, about wrong quantities, a damaged delivery and three prices. Eleven of those nineteen invoices are still being reminded.

That settles the order of the build. A workflow that writes better reminders would have sent Nathalie a better-written final notice. The first job is not writing. It is reading: before any reminder goes out, the workflow has to know whether the customer has paid, promised or objected.

So every morning run starts with payments, from NetSuite and the bank feed, and a customer with an unmatched incoming payment is held until someone matches it. Then the thread: every reply since the last reminder is classified by a model, in whatever language it arrived, as paid, promise to pay, dispute, wrong contact, out of office, copy requested, payment plan requested, or legal or insolvency language. Invoice numbers, dates and amounts are extracted under a strict schema and checked against the open items. Only then does the cadence decide what, if anything, to send. The full sequence is in the collections follow-up blueprint.

Invoice 26-3318, run again

Here is the bakery's invoice as the schedule handled it, and as the workflow would:

Days after dueThe scheduleThe workflow
3First reminderFirst reminder, after the payment sync finds nothing from the bakery
5The reply in French waits for GrietClassified as a dispute about the price on one line. Reminders paused for 26-3318 only. A task for Ruben with the invoice, the bakery's order number and the April agreement from HubSpot
6NothingRuben confirms the price error, and Esther approves a credit note for €690
14Second reminderNothing sent while the dispute is open
30Final notice with interest and the €40 feeNothing sent. The corrected balance is back on the ordinary schedule

Two decisions carry the design. The pause applies to the disputed invoice, not the customer: the bakery's other open invoices keep their schedule, because a question about one tray price is no reason to stop collecting everything else. And the task goes to Ruben rather than finance, with the evidence already attached, because he is the one who knows what was agreed in April.

A promise that was really a condition

For the first weeks the workflow runs in shadow. It reads, classifies and plans every morning, finance compares the plan with what they would have done, and a weekly sample of classified replies is checked by hand, looking hardest at disputes filed as promises and the reverse.

The sample finds the mistake. A Flemish customer writes: "We betalen zodra de creditnota binnen is." We will pay as soon as the credit note arrives. The model files it as a promise to pay with no date, and the plan pauses the reminders to wait for money that will not come, because the credit note it depends on is a request nobody at the distributor has seen.

The rule that follows: a promise to pay needs a date and no condition. A reply that ties payment to something the distributor has to do first, a credit note, a replacement or a corrected invoice, is a dispute, and it goes to a person. Promises that pass the test are logged with their date in NetSuite and on the HubSpot company, and checked the day after that date.

What only a person can send

The workflow drafts and sends the early reminders in approved wording. Everything that changes what a customer owes, or how the relationship feels, belongs to someone with a name:

  • Interest and fees are Esther's call, case by case. The EU Late Payment Directive allows statutory interest and a €40 flat recovery fee on overdue B2B invoices. Whether to use them is a relationship decision, so they are gone from every template, and the workflow never adds them.
  • Key accounts get drafts, not sends. The bakery group is now flagged as one. Ruben sees each reminder as a draft first, and he can pause any account from HubSpot.
  • Credit notes, write-offs and payment plans stay with finance. A reply claiming "your colleague agreed 90 days" changes nothing: the model classifies it and routes it, because terms are not something it can grant. The prompt injection guide explains why the tools, not the prompt, set that limit.
  • Anything final is a person's decision: a delivery stop, a collection agency, a legal step.

When the workflow does answer by itself, to confirm a promised date, the message says it is automated, which is what Article 50 of the EU AI Act expects. Every reminder, reply and pause is logged on the invoice and on the customer, so anyone can see why a customer was or was not chased.

The next reply in French

Next August Griet will be on holiday again, and a reply in French will arrive about a price that does not match an order. This time it is read the morning it lands. The invoice it names stops being chased, Ruben has a task with the invoice, the order and the agreement before his first coffee, and he calls the customer before the customer has a reason to call him.

The reminders that still go out are the ordinary ones, to customers who simply have not paid yet, and they stop the morning a payment arrives. Nathalie gets her credit note, and the next thing she sees from the distributor is an invoice at the April price.

Ledger reminders, an AR tool, or your own rules

Start with what you already pay for. Xero and QuickBooks both send automatic invoice reminders, and for a few dozen customers on standard terms, switching those on solves most of the problem. Chaser, Upflow and Kolleno add staged cadences, payment portals and reply tracking on top of the common ledgers, and Esker covers the enterprise end. For many B2B companies one of these is the right answer.

A build earns its cost when the judgment depends on data those tools cannot see: price agreements in HubSpot, fulfillment records in the ERP, several entities, replies in three languages. It usually lands in the multi-step tier of AI workflow automation. The full blueprint has the cadence table, the flow and the cases where automated dunning embarrasses you, and the mailbox side is covered in AI email automation.

Frequently asked questions

Should payment reminders stop when a customer disputes an invoice?

Yes, for the disputed invoice. A reminder during an open dispute tells the customer nobody read their reply. Pause reminders for that invoice only, keep the schedule for undisputed invoices on the same account, and give the dispute to the person who can resolve it, with the invoice, the order and the delivery records attached. Resume only when a person closes the dispute.

Can AI read customer replies to payment reminders?

Yes, in several languages. A model can sort replies into paid, promise to pay, dispute, wrong contact, out of office and requests for a copy or a payment plan, and extract dates and invoice numbers under a strict schema. Code then checks those against the open items. A conditional promise, such as paying once a credit note arrives, should be treated as a dispute, not a promise.

Can we charge late payment interest to a business customer in the EU?

The EU Late Payment Directive allows statutory interest and a EUR 40 flat recovery fee on overdue B2B invoices. Whether to use them is a relationship decision, and it should not be automatic, least of all on an invoice the customer has already objected to. In a well-built collections workflow, only the finance lead can add interest or fees, case by case.

Is a custom collections workflow worth it over Xero or QuickBooks reminders?

Often not. Xero and QuickBooks both send automatic reminders, and tools such as Chaser, Upflow and Kolleno add cadences and reply tracking. A build earns its cost when the judgment needs data those tools cannot see: fulfillment records, price agreements in a CRM, several entities, or replies in several languages. It then usually lands in the multi-step tier of AI workflow automation.