Template · Accounting & finance

Overdue invoice reminders

Each Monday, Claude Code reads the newest AR aging export in your folder, works out who is overdue and by how much with a script, and drafts one reminder per customer: friendly at 15 days, firm at 45, final notice at 90. You tick the ones to send at the approval gate, and only those go out.

Download .json

Schedule0 9 * * 1Overdue invoice remindersMon · 09:00
Pipeline
  1. Find AR export Shell
  2. Draft reminders Claude Code · Sonnet
  3. Pick reminders to send You
  4. Send reminders Shell
Email7 reminders sent$84,210 overdue across 9 customers; 2 held back by youSent
The pipeline

What each step does

  1. Find AR export

    Shell

    Picks the newest CSV in the folder.

  2. Draft reminders

    Claude Code · Sonnet

    Totals what each customer owes by age with a script and drafts one reminder per overdue customer.

  3. Pick reminders to send

    You

    You tick the reminders to send. Leave out customers you’re already talking to.

  4. Send reminders

    Shell

    Sends the picked reminders to your billing inbox through a webhook.

Set it up

From copy to first run

  1. Copy the pipeline JSON with the button above.
  2. In Jimothy, open Pipelines → New pipeline, paste it under “Or import a pipeline JSON” and click Import.
  3. Under Workspace, choose the folder where you save the weekly AR aging export.
  4. Fill in the variables below under Pipeline settings → Variables.
  5. Triggers → Add trigger → Schedule, cron 0 9 * * 1 (Mondays at 09:00).

Export the AR aging report as CSV with customer, contact email, invoice number, due date and open amount. The newest .csv in the folder is used.

Variables

What to fill in

The prompts and commands read these as {{vars.<name>}}. The examples are placeholders: replace them with your own.

VariableWhat to put in itExample
companyYour company name, used to sign reminders.Acme Inc.
toneHow reminders should sound at each stage.1–30 days: friendly nudge, assume it slipped through. 31–60 days: firm, ask for a paymen…
sendWebhookUrlWhere the picked reminders go, e.g. a Zapier hook that sends each one from your billing inbox.—
Show the pipeline JSON
{
  "jimothyPipeline": 1,
  "name": "Overdue invoice reminders",
  "description": "Drafts a reminder for each overdue customer from your AR aging export and sends the ones you pick.",
  "icon": "workflow",
  "color": "#15803d",
  "repo": {
    "mode": "inplace",
    "localPath": ""
  },
  "concurrency": 1,
  "variables": {
    "company": "Acme Inc.",
    "tone": "1–30 days: friendly nudge, assume it slipped through. 31–60 days: firm, ask for a payment date. 61–90 days: mention possible service pause. Over 90 days: final notice before collections, polite and specific.",
    "sendWebhookUrl": ""
  },
  "steps": [
    {
      "id": "find",
      "name": "Find AR export",
      "type": "shell",
      "description": "Picks the newest CSV in the folder.",
      "timeoutMinutes": 1,
      "command": "f=$(ls -t -- *.csv 2>/dev/null | head -1); [ -n \"$f\" ] || { echo \"Put the AR aging export (.csv) in $(pwd)\"; exit 1; }; echo \"$f\""
    },
    {
      "id": "drafts",
      "name": "Draft reminders",
      "type": "agent",
      "description": "Totals what each customer owes by age with a script and drafts one reminder per overdue customer.",
      "harnessId": "claude-code",
      "model": "sonnet",
      "dependsOn": [
        "find"
      ],
      "timeoutMinutes": 20,
      "prompt": "Read the AR aging export {{steps.find.output | trim}} in the current folder. Do not modify any file.\n\nWith a script (not mental arithmetic), group open invoices by customer and work out each customer's total overdue amount and the age of their oldest overdue invoice as of today. Skip customers with nothing overdue.\n\nFor each overdue customer, draft a reminder email following this tone guide:\n{{vars.tone}}\n\nList every invoice number, due date and amount in the email. Plain text, signed \"Accounts receivable, {{vars.company}}\".\n\nYour final answer is one section per customer, oldest debt first, in exactly this shape:\n### Reminder 1: <Customer> · <total overdue> · <days> days\nTo: <contact email>\nSubject: <subject>\n\n<email body>\n\nNothing before the first section."
    },
    {
      "id": "pick",
      "name": "Pick reminders to send",
      "type": "approval",
      "description": "You tick the reminders to send. Leave out customers you’re already talking to.",
      "dependsOn": [
        "drafts"
      ],
      "choices": {
        "fromStep": "drafts",
        "mode": "multiple"
      },
      "approvalMessage": "Pick the reminders to send this week."
    },
    {
      "id": "send",
      "name": "Send reminders",
      "type": "shell",
      "description": "Sends the picked reminders to your billing inbox through a webhook.",
      "dependsOn": [
        "pick"
      ],
      "timeoutMinutes": 2,
      "command": "printf '{\"reminders\":%s}' {{steps.pick.selected | json}} | curl -fsS -X POST -H 'Content-Type: application/json' --data @- {{vars.sendWebhookUrl}}"
    }
  ]
}