<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Solo Stack Kits</title>
    <description>The latest articles on DEV Community by Solo Stack Kits (@solostackkits).</description>
    <link>https://dev.to/solostackkits</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4183035%2F00671ef7-c8dc-4ac0-8d94-3c3cb0e2947c.png</url>
      <title>DEV Community: Solo Stack Kits</title>
      <link>https://dev.to/solostackkits</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solostackkits"/>
    <language>en</language>
    <item>
      <title>How to Build a Claude Code Skill That Chases Your Unpaid Invoices (Without Ever Sending an Email)</title>
      <dc:creator>Solo Stack Kits</dc:creator>
      <pubDate>Tue, 13 Oct 2026 19:50:26 +0000</pubDate>
      <link>https://dev.to/solostackkits/how-to-build-a-claude-code-skill-that-chases-your-unpaid-invoices-without-ever-sending-an-email-5h9p</link>
      <guid>https://dev.to/solostackkits/how-to-build-a-claude-code-skill-that-chases-your-unpaid-invoices-without-ever-sending-an-email-5h9p</guid>
      <description>&lt;p&gt;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 &lt;strong&gt;skill&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;You need Claude Code installed (&lt;a href="https://code.claude.com/docs/en/setup" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/setup&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What a skill is
&lt;/h2&gt;

&lt;p&gt;A skill is a folder containing a &lt;code&gt;SKILL.md&lt;/code&gt; file. The top of the file is YAML "frontmatter" with a &lt;code&gt;description&lt;/code&gt;; Claude reads that description to decide when the skill applies. The rest is plain-English instructions. Project skills live in &lt;code&gt;.claude/skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt; inside your project folder. No code required.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Keep your data in a file Claude can read
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;business/invoices.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;| 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 | |
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A markdown table beats a spreadsheet here: Claude can read and update it reliably, and you can read it too.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Write the skill
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;.claude/skills/invoice-chase/SKILL.md&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;invoice-chase&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;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".&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="gh"&gt;# Invoice chase&lt;/span&gt;
Run &lt;span class="sb"&gt;`date +%F`&lt;/span&gt; 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/&lt;span class="nt"&gt;&amp;lt;client&amp;gt;&lt;/span&gt;/drafts/; update last_reminder; never send email.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three design choices matter more than the wording:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Run &lt;code&gt;date +%F&lt;/code&gt; first."&lt;/strong&gt; 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".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A ladder, not a vibe.&lt;/strong&gt; "Be firm but polite" gives you random output. A table keyed on days overdue gives you the same, defensible escalation every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"Never send."&lt;/strong&gt; The skill writes drafts to files. That one line is what makes it safe to give an AI access to your client relationships.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  4. Try it
&lt;/h2&gt;

&lt;p&gt;Open a terminal in your project folder, run &lt;code&gt;claude&lt;/code&gt;, and type:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who owes me money?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Claude picks up the skill from its description, lists open invoices by days overdue with totals, and offers to draft reminders. Then:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Chase the overdue ones.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get one draft per invoice, at the right stage, saved in each client's &lt;code&gt;drafts/&lt;/code&gt; folder.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Make "never send" enforceable with a hook
&lt;/h2&gt;

&lt;p&gt;Instructions can be ignored; hooks can't. A &lt;strong&gt;PreToolUse hook&lt;/strong&gt; runs before every shell command Claude tries, and exit code 2 blocks the command. Add &lt;code&gt;.claude/settings.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"PreToolUse"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"matcher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bash &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;$CLAUDE_PROJECT_DIR&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;/.claude/hooks/no-send.sh"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and &lt;code&gt;.claude/hooks/no-send.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nv"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Eq&lt;/span&gt; &lt;span class="s1"&gt;'(sendmail|mailx? +-s|smtp|api\.sendgrid|hooks\.slack\.com)'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Blocked: this workspace only drafts messages."&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;2
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now even if a future instruction says "just send it", the command is stopped and Claude is told why.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to build next
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;client-follow-up&lt;/code&gt; and &lt;code&gt;meeting-to-tasks&lt;/code&gt; as a free folder you can drop into Claude Code: &lt;a href="https://solostackkits.gumroad.com/l/free-consultant-skills" rel="noopener noreferrer"&gt;https://solostackkits.gumroad.com/l/free-consultant-skills&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I make Solo Stack Kits; the free sample above is ours, and there's a paid version with more skills.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Not affiliated with Anthropic; "Claude" is a trademark of Anthropic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Browse 279 more Claude Code workflows: &lt;a href="https://solostackkits.surge.sh" rel="noopener noreferrer"&gt;https://solostackkits.surge.sh&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>claudecode</category>
      <category>freelancing</category>
    </item>
  </channel>
</rss>
