If you run a one-person consultancy, late invoices cost you twice: once in cash flow, and again in the 20 awkward minutes it takes to write a reminder that's firm but doesn't burn the relationship. This tutorial builds a Claude Code skill that does the awkward part: it reads a plain-text invoice list, works out who is overdue, and drafts the right reminder for how late each one is. You still press send.
You need Claude Code installed (https://code.claude.com/docs/en/setup).
1. What a skill is
A skill is a folder containing a SKILL.md file. The top of the file is YAML "frontmatter" with a description; Claude reads that description to decide when the skill applies. The rest is plain-English instructions. Project skills live in .claude/skills/<name>/SKILL.md inside your project folder. No code required.
2. Keep your data in a file Claude can read
Create business/invoices.md:
| invoice | client | amount | currency | issued | due | status | last_reminder |
|---|---|---|---|---|---|---|---|
| 2026-014 | acme | 2400 | USD | 2026-09-01 | 2026-09-15 | sent | |
| 2026-015 | brightline | 1800 | USD | 2026-10-01 | 2026-10-31 | sent | |
A markdown table beats a spreadsheet here: Claude can read and update it reliably, and you can read it too.
3. Write the skill
Create .claude/skills/invoice-chase/SKILL.md:
---
name: invoice-chase
description: Draft reminders for unpaid invoices, escalating by how overdue they are. Use when the user mentions an overdue, late, or unpaid invoice, or asks "who owes me money".
---
# Invoice chase
Run `date +%F` first and compute days overdue explicitly for each open invoice.
| Days overdue | Tone | Must include |
|---|---|---|
| -3 to 0 | Friendly heads-up | invoice #, amount, due date, payment details |
| 1-7 | Polite reminder | + "could you confirm when this is scheduled?" |
| 8-21 | Firm | + offer to resend, ask who in accounts to contact |
| 22-45 | Final notice | + date work pauses / late fee applies |
| 45+ | Stop drafting | list options (call, pause work, demand letter) |
Rules: under 90 words; never accuse before stage 4; save drafts to
clients/<client>/drafts/; update last_reminder; never send email.
Three design choices matter more than the wording:
-
"Run
date +%Ffirst." Language models are bad at knowing today's date. Making the skill check it, then show the subtraction, prevents a reminder that calls a 3-day-late invoice "over a month overdue". - A ladder, not a vibe. "Be firm but polite" gives you random output. A table keyed on days overdue gives you the same, defensible escalation every time.
- "Never send." The skill writes drafts to files. That one line is what makes it safe to give an AI access to your client relationships.
4. Try it
Open a terminal in your project folder, run claude, and type:
Who owes me money?
Claude picks up the skill from its description, lists open invoices by days overdue with totals, and offers to draft reminders. Then:
Chase the overdue ones.
You get one draft per invoice, at the right stage, saved in each client's drafts/ folder.
5. Make "never send" enforceable with a hook
Instructions can be ignored; hooks can't. A PreToolUse hook runs before every shell command Claude tries, and exit code 2 blocks the command. Add .claude/settings.json:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash",
"hooks": [ { "type": "command", "command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/no-send.sh" } ] } ] } }
and .claude/hooks/no-send.sh:
#!/usr/bin/env bash
input="$(cat)"
if printf '%s' "$input" | grep -Eq '(sendmail|mailx? +-s|smtp|api\.sendgrid|hooks\.slack\.com)'; then
echo "Blocked: this workspace only drafts messages." >&2; exit 2
fi
exit 0
Now even if a future instruction says "just send it", the command is stopped and Claude is told why.
What to build next
The same pattern (data in a markdown file, a ladder of situations, drafts only) works for proposal follow-ups and post-meeting recaps. I've published this skill plus client-follow-up and meeting-to-tasks as a free folder you can drop into Claude Code: https://solostackkits.gumroad.com/l/free-consultant-skills
Disclosure: I make Solo Stack Kits; the free sample above is ours, and there's a paid version with more skills.
Not affiliated with Anthropic; "Claude" is a trademark of Anthropic.
Browse 279 more Claude Code workflows: https://solostackkits.surge.sh
Top comments (0)