DEV Community

Solo Stack Kits
Solo Stack Kits

Posted on

How to Build a Claude Code Skill That Chases Your Unpaid Invoices (Without Ever Sending an Email)

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 | |
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

Three design choices matter more than the wording:

  1. "Run date +%F first." 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".
  2. 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.
  3. "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" } ] } ] } }
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)