Guide · Invoicing

Invoice Chaser: a late fee check you can run yourself

What it is

Invoice Chaser is a Claude skill for freelancers with an overdue invoice. You give it the invoice details. It works out how many days overdue it is, the late fee under your contract and which reminder stage applies, then drafts a chaser email.

The money and date math lives in a small Python script (late_fee.py, Python 3, standard library only). That part is the same every time, so you can check it without Claude, without an API key and without a network.

Check the numbers yourself

Download late_fee.py, run-script.sh and expected-script-output.json into one folder (SKILL.md is optional) and run:

bash run-script.sh

It runs this input and compares the output with expected-script-output.json. It prints PASS and exits 0 on a match.

python3 late_fee.py --amount 2400 --due 2026-09-15 --today 2026-10-16 --monthly-rate 0.015

Expected: 31 days overdue, late fee 36.69, total due 2436.69, stage 3 (final notice), 8.28 more per week.

Version 1.0.0 of the script also reports stage_by_days and reminders_sent. Stage comes from days overdue, and reminders you already sent can move it forward but never back: stage = the higher of the stage by days and (reminders sent + 1), capped at 4. Add --reminders-sent 2 to the command to tell it you already sent stages 1 and 2. With this input the stage stays 3.

Money is calculated with exact decimals and the interest is rounded once to cents, half up. Bad input (a negative rate or grace period, a zero or non-numeric amount, a bad date) returns a JSON error and exit code 2. Once a cap is reached, the extra per week is 0.

The formula is amount x monthly rate x 12 / 365 x days overdue. Simple interest, no compounding.

Downloads

Full free sample with tests, README and MIT license: Invoice Chaser sample v1.0.0

SKILL.md refers to scripts/late_fee.py and a references folder inside the full skill; here late_fee.py is a single file next to it.

What happened when we ran it in Claude

We ran this input once on a free Claude.ai account on Oct 23, 2026, with this exact SKILL.md (SHA-256 starts e760b295):

Invoice INV-1042, $2,400, issued Sept 1, due Sept 15 (net 14). Client: Daniel Reyes, Brightline Coffee Roasters - I did their packaging design. My contract says "1.5% per month on overdue balances". I sent a friendly reminder on Sept 22 and a follow-up on Oct 2, no reply. Today is Oct 16. Payment link: https://pay.example.com/inv-1042. I'm Priya, Priya Shah Design.

Claude read the skill, ran the script and answered with this status line:

INV-1042 · $2,400.00 · 31 days overdue · Stage 3 (final notice; stages 1 and 2 already sent) · Late fee per contract: $2,400 × 1.5% × 12/365 × 31 days = $36.69 · Total now: $2,436.69 (grows about $8.28 per week)

Then it wrote a final notice email, a dated follow-up schedule and two short replies for likely client answers. Those match the script. The email wording is Claude's and changes on every run. That run used the earlier version of late_fee.py. Version 1.0.0 gives the same numbers for this input, and run-script.sh checks that.

Claude.ai reply to the test input: status line INV-1042, $2,400.00, 31 days overdue, Stage 3 final notice, late fee $36.69, total now $2,436.69, followed by the start of the final notice email draft.End of the Claude reply: the email sign-off, the next steps and schedule, and two short replies to likely client answers.
Made-up client and placeholder payment link (pay.example.com).

What we did not test

Good to know

Need clean invoice and quote templates for the next job? The Invoice & Quote Set has auto totals, an invoice log for days overdue, and fillable PDFs.

See the Invoice & Quote Set, $9.99

Or keep the free Invoice Chaser sample and browse the product page.

Made by Kitwise Studio