npx skills add ...
npx skills add anthropics/knowledge-work-plugins --skill invoice-chase
Drafts overdue-invoice reminder emails from the ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books) plus PayPal, Stripe, and Airwallex data, matched to each customer's payment history and tone (gentle for good customers, firm for repeat late payers). Sends via PayPal with owner approval; everything else queues as a mail draft, with the Airwallex hosted pay link included where one exists. Use when the user asks "who owes me money," mentions overdue invoices, or wants to follow up on unpaid invoices.
npx skills add anthropics/knowledge-work-plugins --skill invoice-chase
Pull the AR aging report, score each customer by payment history, draft a tone-matched reminder for each overdue invoice, and present them to the owner. Nothing sends until the owner says so.
Ask the owner one question before running for the first time:
../../shared/tenant-scope.md).Do not ask again on subsequent runs. Stripe is not a setup question: when it is connected, its overdue invoices are pulled every run (reference/v2_sources.md).
Pull overdue receivables. Query the ledger's AR aging — MYOB, NetSuite, QuickBooks, Xero, or Zoho Books, whichever is connected (../../shared/connector-neutrality.md) — for all invoices more than 1 day past due. If Stripe is connected, also pull Stripe overdue invoices. If Airwallex is connected, also pull its unpaid invoices: list_billing_invoices with status: FINALIZED and payment_status: UNPAID (a voided invoice still reports UNPAID, so the status filter is not optional), then match each to the ledger by the ledger invoice number in its metadata — never by Airwallex's own number, which it assigns itself and which matches nothing in the books; with no metadata, match on customer plus amount plus due date. Amounts carry the business's currency code (../../shared/currency-and-locale.md).
Cross-reference payment history. For each overdue customer, query PayPal for settled transactions using these parameters:
transaction_status: S (settled only — filters out pending and denied transactions that inflate result size and increase rate-limit risk)If PayPal returns a 429 rate limit error:
If a customer shows a settled payment within the query window, flag as "possibly paid — verify" and exclude from the draft queue.
Run the same recent-payment check against every other connected processor or storefront — Stripe charges, Square payments, Shopify orders (list-orders by customer, paid status) — before drafting, over the last 14 days. PayPal alone is capped at 7 because of its rate limit; the 14-day rule in the approval gates is the standard, and the PayPal cap is the one exception, said in the output when it applies. The sources and the dedupe rule are in reference/v2_sources.md. A settlement in any of them is a "possibly paid — verify" flag, not a reminder.
Match on email where both sides have one. Processors and storefronts key customers by email; ledgers key by name. Use the ledger's customer email when it exposes one (QuickBooks, Xero, Zoho Books, NetSuite do; MYOB does not). Where only a name is available, a name-only match is uncertain: keep the customer in the draft queue and mark the row "name match only — verify" rather than treating it as paid or as unmatched.
If Airwallex is connected, its side of the check is the invoice itself: an Airwallex invoice whose payment_status is PAID while the ledger still shows the balance open is "possibly paid — verify" too. No date window and no rate-limit retry are needed; it is one list call.
Score each customer. Read reference/tone-matching.md for scoring logic. Result: good-payer, occasionally-late, or repeat-late.
Draft reminder emails. One email per customer — consolidate multiple overdue invoices into one email. Match tone to score. See reference/examples/gentle-reminder.md and reference/examples/firm-reminder.md.
Present drafts to owner. Show a summary table first:
| Customer | Amount Due | Days Late | Tone | Send via |
|---|---|---|---|---|
| Acme Corp | USD 1,200 | 18 days | Gentle | PayPal |
| Smith LLC | USD 450 | 47 days | Firm | Gmail draft |
| Pearl St Bistro | USD 467 | 91 days | Firm | Gmail draft + Airwallex pay link |
Then show each draft email in full. Wait for owner to say "send these" or approve individually.
Send or queue — only after approval.
hosted_url as the pay link in the body. hosted_url exists only when the invoice's collection_method is CHARGE_ON_CHECKOUT; a bank-transfer (OUT_OF_BAND) invoice may have none, so link its pdf_url instead and say so. For a ledger-only invoice, offer to mint a pay link with create_payment_link (title, amount, currency, reference and metadata carrying the ledger invoice number; never shopper_email — the reminder is the owner's draft, not an Airwallex email). Minting a link is part of the batch approval, not a separate send.Report what happened. List what was sent, what was queued as draft, and what was flagged (possibly paid, excluded).
../../shared/untrusted-content.md).Still works. Ask for the AR aging report as a CSV upload, score and draft from that, and hand the reminders back for manual send. Same tone-matching, same output — one extra step for the owner.
Read reference/v2_sources.md for the mapping:
metadata, never Airwallex's own numbering; skip VOIDED (reference/gotchas.md). Owners connect the airwallex-agentos connector (production); take the exact tool names from the connected server's tool list (../../shared/connector-call-shapes.md)Same tone-matching, same approval gates. More invoices in scope.
Reminders go out under the owner's name, so read the shared voice profile before drafting. The tone scoring in reference/tone-matching.md decides how firm the message is; the voice profile decides how it sounds. Both matter — a firm reminder that doesn't sound like the owner still gets rewritten by hand.
Deliver the reminder batch per the owner's stored output preference — never default to a markdown file. Check the ## Business context block's Output preference (shared style guide rule, ../../shared/artifact-style.md):
Reminders are sent or queued and the possibly-paid flags are named. If the chase was about covering an upcoming run, the natural next step is "can I make payroll" — /plan-payroll ties what these reminders should collect to the payroll date. Also nearby: "cash forecast" (cash-flow-snapshot) to see the 30/60/90-day picture with these collections projected in, and "close the month" (/close-month) once payments land. Offer at most three, and skip any offer the owner already declined this session.
The connectors named in this skill are the tested paths, not a wall. If the owner wants this flow to use a tool that isn't connected or listed, offer build-connector — it checks the connector directory first and connects through Zapier otherwise, never hand-building against a raw API. Once the connection exists, the tool joins this skill like any other optional connector, under the same approval gates.