AI for Distribution Companies: Chase Late Invoices and Credit Holds

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for AI for Distribution Companies: Chase Late Invoices and Credit Holds.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for AI for Distribution Companies: Chase Late Invoices and Credit Holds.

Export the receivables ageing report, match it to open credits and disputes, then use AI to group overdue accounts into reminder stages and draft messages. A human should verify the balance, promises to pay and customer relationship before sending. Apply a credit hold only after an authorised person checks the written rule and approves it in the trading system.

A distribution ledger can make a solvent customer look late when a credit note, short shipment or unapplied remittance is still being processed. Age alone is therefore a poor automatic hold trigger. Build a review queue that shows evidence and exceptions; do not let an AI assistant change a customer's credit status or promise that orders will be released.

Follow me on Instagram@sagnikteaches

Start with an ageing file that reflects the trading account

The useful starting point is a dated export of open customer invoices, not a list of names and overdue totals copied from a dashboard. Include account ID, invoice ID, issue date, due date, open amount, currency, payment terms and last payment date where available. Add credit notes, unapplied receipts, disputes, promised-payment notes and current hold status from their authoritative systems. If these live elsewhere, export them as separate files and join them by account and invoice reference. A matching name is not a safe join key: similarly named trade customers can have different accounts.

Connect on LinkedInSagnik Bhattacharya

Set the as-at date and freeze the file for the review. A payment received after the export should be treated as a later update, not silently mixed into the original calculation. Keep the untouched export, a working copy and an approvals log. ChatGPT's documented data-analysis function accepts spreadsheet files and can group rows; clear headers and one record per row help it inspect them. Use the model to propose a queue, then confirm the totals and joins in the ledger or spreadsheet.

Subscribe on YouTube@sagnikteaches

Take an illustrative account outside the worked example below, B212, with invoice I781 for $2,400 due 15 days ago. A $400 credit note has been approved but not yet applied. The open invoice export still says $2,400, while the amount worth chasing is provisionally $2,000 once accounts staff confirm the credit belongs to I781. Do not send “you owe $2,400” from the ageing file alone. Mark it “balance confirmation needed”, and let the finance owner resolve the credit before a reminder.

Another account has three invoices under the same purchase order, one of which is disputed because a pallet was short. The AI may group all three into a $6,000 overdue total. If $1,100 is genuinely in dispute and $4,900 is undisputed, the message should ask about the undisputed portion while naming the dispute for internal follow-up. It should not call the whole account delinquent. The operational point is important for distributors: sales, warehouse and finance may each hold part of the evidence.

Define “days overdue” as the number of days after the contractual due date on the chosen as-at date. A negative number means not due. A zero means due today, not one day late. If your export supplies an ageing bucket, calculate a sample of rows independently because buckets can be based on invoice date rather than due date. Keep credit terms in the account master record. The broader quote-to-cash tutorial explains the flow from quotation to payment; here the focus is the daily review of open trade balances.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

Write reminder tiers that match the account history

Use tiers as prompts for a person, not as automatic penalties. An illustrative policy could be: one to seven days overdue, courteous check that the invoice was received; eight to 21 days, attach a statement and request a payment date; 22 to 35 days, ask an account owner to review commitments and unresolved claims; beyond 35 days, prepare a hold review if the exposure threshold is also met. These thresholds are examples for a small distributor, not a rule for every business or contract. Terms, disputes and strategic accounts change the tone and escalation.

Make suppression rules explicit. Do not draft a reminder for an invoice marked paid, a balance with an unapplied payment under investigation, an active dispute awaiting credit, or an account with a documented promise to pay that has not yet expired. A promise deserves its own review date. Suppression should have a reason and an owner; otherwise a customer can disappear from the chase list indefinitely. Ask for an “exception reason” column instead of removing these rows entirely.

An illustrative first-stage draft might read: “Hello [first name], our records show invoice [invoice reference] for [confirmed amount] fell due on [date]. Could you confirm it reached the right person and let us know the expected payment date? If you have already paid, please send the remittance reference so we can reconcile it.” Before sending, check the contact, amount, attachments and any recent credit. The message asks for information without asserting a reason for delay.

At the second stage, a distribution customer may have 14 open invoices. Sending 14 separate reminders is likely to irritate them and create 14 replies. A statement-level message can list invoice IDs, due dates and confirmed open balances, with the dispute excluded or clearly labelled. The account owner can choose one conversation for the total. If the customer buys through several divisions, confirm which purchasing entity owns each invoice before consolidating them.

Consider a reseller who paid $3,600 yesterday, but the bank receipt was not allocated when the ageing file was exported. The model will classify the account as 28 days overdue unless the payment list is supplied. The correct output is “pending allocation; ask accounts to match receipt”, not a firm reminder. This is a reason to compare a few high-value rows with the current ledger immediately before sending, especially when the export is more than a day old.

Work a seven-account ledger before automating anything

In an illustrative worked example, a small distribution company has seven customer accounts with $32,400 gross open invoices at close of business. The ledger shows $5,800 not yet due, $8,200 one to seven days overdue, $7,600 eight to 21 days overdue, $6,400 22 to 35 days overdue, and $4,400 over 35 days overdue. Those five groups sum to $32,400. The exported balance is a starting control total, not a demand amount. A $900 approved credit and a $1,500 payment awaiting allocation require reconciliation before messages are released.

Account A101 has $5,800 not yet due: no chase. A102 has $4,200 five days overdue and no dispute: first-stage check. A103 has $4,000 seven days overdue and the $1,500 customer payment waiting to be allocated: hold the reminder until accounts match the receipt. A104 has $7,600 across two invoices, one with a $900 approved credit: second-stage statement after the net balance is confirmed. A105 has $6,400 30 days overdue, including a $1,100 short-shipment dispute: account manager review and a carefully separated request for the undisputed sum. A106 has $2,600 42 days overdue but a written promise to pay tomorrow: check the promise date first. A107 has $1,800 48 days overdue, no active dispute and a new order waiting: prepare a hold review. The account values sum to $32,400.

The first AI output should be a table of proposed actions, not seven ready-to-send emails. It may recommend one first-stage check, one statement after credit reconciliation, one account-manager discussion, one promise follow-up and one hold review. A103 is suppressed pending payment allocation; A101 is excluded because it is not due. That is five actionable rows, one reconciliation row and one no-action row. The finance lead should compare the AI result with a spreadsheet filter and the live account notes.

Suppose the assistant writes “A107 exceeds the credit limit and must be stopped”. The export did not include A107's credit limit, so this claim is unsupported. Fix it to “A107 meets the illustrative age condition; credit limit and current exposure must be checked before a hold decision”. A strong queue identifies missing evidence. A weak one hides it behind confident wording. Keep that before-and-after example in the team's prompt guidance.

For a quick independent check, add the open invoice amounts by account in a pivot table. Confirm that A104's two invoices total $7,600 and that the $900 credit has not already reduced the export balance. Confirm that A103's $4,000 is still open in the system. Then sample the AI's days-overdue calculation for the oldest and newest rows. The aim is to catch double subtraction of credits, duplicate invoice IDs and off-by-one date errors before any relationship is affected.

Make a credit hold a documented decision

A hold policy should state who can recommend one, who can approve it, what evidence is required, how the customer is told and how the hold is released. A useful illustrative trigger might be both an undisputed balance more than 35 days overdue and an open exposure above $1,500, with no unexpired promise-to-pay or approved exception. The two conditions prevent a $20 administrative balance from blocking a valuable order. Your actual trading terms and authority limits determine the real rule. Have a qualified adviser review terms or debt-recovery wording where necessary.

For A107, the proposed decision record could say: “$1,800 undisputed, 48 days overdue as at [date]; new order O442 pending; no receipt or promise recorded; finance recommends temporary hold; sales owner to check customer context; authorised manager to approve or decline by [time].” The AI can assemble this draft from supplied fields. It cannot know whether a pending bank transfer arrived, whether a delivery failure created a legitimate claim, or whether a senior manager made a separate arrangement. Those checks happen before anyone changes account status.

Keep three states in the working sheet: “proposed”, “approved” and “applied in system”. A proposed hold is not an active hold. Log the approver, timestamp, reason, affected orders and review date. If the manager declines, record the exception reason and next review. A spreadsheet colour or AI sentence should never become the source of truth for the account's trading status. The credit-control software comparison for distributors is covered in this related tutorial; selecting software is a separate choice from writing the policy.

A useful counterexample is an account with a $2,100 overdue balance that is all subject to a documented short-delivery dispute. Even if its age and exposure cross the illustrative threshold, it does not meet the “undisputed” condition. The output should route the case to the claims owner, request a resolution date, and leave credit status for an authorised manager. Another customer may have a clean history but a one-off invoice misaddressed to the wrong buyer. Fix the master data rather than escalating the wording.

Prompt for evidence, then edit the customer language

Upload only the fields needed for the decision, and check your AI service's data settings before using customer records. Replace personal names with account IDs if possible. Give the assistant a rule table and an explicit prohibition on sending messages or changing holds. OpenAI documents CSV analysis, but the model's ability to produce a table does not make its classification a ledger fact. Treat the output as a worklist for finance and account staff.

Review the attached open-invoice, credit, payment and dispute exports.
As-at date: [date]. Join only on exact account_id and invoice_id.
Calculate days overdue from due_date. Do not infer missing due dates.
Show gross open balance and separately show any credits or unapplied cash.
Do not subtract a credit unless its invoice allocation is confirmed.
Group accounts into: not due; 1-7; 8-21; 22-35; over 35 days.
Suppress reminders for paid items, active disputes and unexpired promises,
but list each suppressed item with a reason and owner.
Draft a hold REVIEW only when an undisputed amount is over 35 days
overdue and exposure exceeds $1,500. Never mark a hold as applied.
Return one row per account with invoice IDs, evidence, next action,
missing facts and the human approver needed. Flag every unmatched ID.
Then draft reminder wording for the approved candidates only.

An illustrative output might draft, “Your account is on hold until payment is made.” That is unsuitable if no authorised person has approved a hold. Change it to an internal note: “Hold review proposed; do not notify customer yet.” After approval, use the company's authorised wording, with the exact amount and release condition checked by finance. The distinction between an internal recommendation and an external statement should be prominent in every output.

For A105, the draft should not threaten a hold over a disputed shipment. A better illustrative message is: “Hello [first name], we are reviewing the reported short shipment on invoice [reference]. Our current records also show [confirmed undisputed amount] due on [date]. Could you confirm the payment date for that portion while our team resolves the claim?” The sales owner should check whether combining those two topics in one email suits the relationship; sometimes separate messages are clearer.

If a customer replies with a remittance, reference number or complaint, do not paste a long free-form chain into the model and accept its interpretation unchecked. Attach it to the account, have accounts verify the payment, and update the queue. AI is useful for extracting a promised date or drafting a polite reply, but the ledger and correspondence remain the evidence. For supplier-invoice matching, which is a different side of the books, see invoice-to-purchase-order matching.

Run the queue with a close-of-day control

Give every worklist row one owner and one next review date. The finance assistant might handle allocation checks, an account manager might handle a short-shipment dispute, and a credit manager might approve holds. The final daily record should say how many reminders were approved, sent, suppressed and returned for correction. If the same account appears on two days, the second draft must reflect yesterday's contact rather than repeat it. Keep the sent message ID or a note of the call in the source system.

A simple weekly test is to compare the AI worklist with a manual review of a sample of accounts: did it miss a payment, include a disputed balance, miscalculate age, or propose a hold without evidence? Track the errors by cause and fix the export or rule, not only the prompt. An account with a missing due date needs master-data correction. A duplicate reminder needs a communication-history field. A false hold candidate needs a sharper dispute or approval rule.

Measure outcomes that matter to the distribution team: confirmed overdue balance, number of old undisputed invoices, promises kept, disputes awaiting warehouse evidence, and orders delayed by approved holds. Avoid claiming a reduction in late payment merely because more reminders were drafted. Run the process manually until the staff can explain every hold recommendation and the customer messages have no unsupported balances. The invoice reminder wording tutorial offers additional tone examples, while this distributor process keeps the account-level credits, disputes and order-release decision together.

Prevent the sales and finance hand-off from losing a promise

In a small distribution company, credit control often sits between people who have different views of the same account. Finance sees the unpaid invoice, sales knows the buyer promised a part payment, and the warehouse knows that one pallet was short. Give the queue a shared note format: account ID, confirmed fact, source record, person who checked it, decision, and next date. The AI should summarise those notes only after they have been entered by a person. It must not turn a sales comment such as “they should pay soon” into a dated promise.

For an illustrative hand-off, A105's account manager records: “Buyer reports 10 missing units on I804; warehouse investigation W17 open; buyer says undisputed $5,300 will be paid on [date], subject to confirmation.” Finance then checks whether the $5,300 matches the ledger after the proposed credit and records the confirmed amount. Until then, the reminder is a draft. This short hand-off is more useful than a long AI-generated account biography because it distinguishes a customer statement from an internally verified balance.

Set a clear release procedure for an approved hold. A payment notification alone is not necessarily a cleared receipt, and a promise does not necessarily settle the balance. The authorised person checks the agreed condition, records evidence in the account system, releases the affected order if appropriate, and tells the order desk. If an old hold remains on an account after payment, the automation has merely moved the delay to a different part of the workflow. Review approved holds each day alongside proposed ones.

Further reads

Sources: OpenAI documentation, Data analysis with ChatGPT and Uploading files and audio to ChatGPT (checked November 2026).

Want a credit-control queue your team can trust?

On a 1:1 call we'd map the ageing export, your reminder stages and the approval point for holds before any message is connected to your existing tools.

Book a 1:1 call with me