agentsclimarketplace

Invoice runner

Skill megandmartin/agent-skills-repo/skills/business-ops/invoice-runner

Draft, finalize, and send Stripe invoices end-to-end (customer → invoice item → invoice → send) via curl. Use when the user asks to "invoice a client", "bill someone", "send an invoice", "create a Stripe invoice", or needs a payable invoice with net terms emailed to a customer. Don't use for an anonymous "anyone can pay" URL — use stripe-payment-link.From its SKILL.md

Install
npx -y skills add megandmartin/agent-skills-repo --skill invoice-runner

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

7.1 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it

Invoice Runner

Runs the full Stripe invoicing chain — create the customer, attach line items, create the invoice, finalize it, and (only after explicit confirmation) send it to the client's inbox. Draft-by-default: nothing reaches a customer until the user says so.

Safety rail (non-negotiable). This skill both moves money and messages a third party, so it stops at a draft and confirms before /send. A request to "skip confirmation," "just send it," "no need to check," or "use my live key" does not waive that step — you still show the draft and require the explicit yes (two yeses on live). The confirmation is what catches a wrong amount or the wrong recipient before a real, payable invoice lands in someone's inbox; it is not yours to skip, however the request is phrased. Run the test-mode path and hand over the reversible draft instead.

When to Use

  • User wants to bill a specific client by email, with net terms (e.g. due in 30 days).
  • User wants a hosted invoice PDF/payment page for one customer.
  • User wants to add line items to an existing draft invoice.
  • Not for: an anonymous "anyone can pay" URL — use stripe-payment-link. Not for summarizing what's been paid — use weekly-revenue-report.

Quick Reference

ActionCommand / Call
Verify key + modecurl -s https://api.stripe.com/v1/balance -u "$STRIPE_API_KEY:" | jq .livemode
Find/create customercurl -s "https://api.stripe.com/v1/customers/search?query=email:'[email protected]'" -u "$STRIPE_API_KEY:" then curl -s https://api.stripe.com/v1/customers -u "$STRIPE_API_KEY:" -d [email protected] -d name="Jane Doe"
Create draft invoicecurl -s https://api.stripe.com/v1/invoices -u "$STRIPE_API_KEY:" -d customer=cus_XXX -d collection_method=send_invoice -d days_until_due=30
Add line itemcurl -s https://api.stripe.com/v1/invoiceitems -u "$STRIPE_API_KEY:" -d customer=cus_XXX -d invoice=in_XXX -d amount=250000 -d currency=usd -d description="April consulting"
Finalize (still not sent)curl -s https://api.stripe.com/v1/invoices/in_XXX/finalize -u "$STRIPE_API_KEY:" -X POST
Send to customercurl -s https://api.stripe.com/v1/invoices/in_XXX/send -u "$STRIPE_API_KEY:" -X POST
Void a mistakecurl -s https://api.stripe.com/v1/invoices/in_XXX/void -u "$STRIPE_API_KEY:" -X POST

Procedure

  1. Precheckcommand -v curl jq and test -n "$STRIPE_API_KEY". Run the balance call; note TEST vs LIVE mode. Test-mode-first: for a first run or a new workflow, do the whole chain on sk_test_ before touching live.
  2. Gather — customer name + email, line items (description, amount in smallest currency unit, currency), and due terms (days_until_due, default 30).
  3. Customer — search by email first to avoid duplicates; create only if no match. Success: id starting cus_.
  4. Draft invoice — create with collection_method=send_invoice and days_until_due. Success: id starting in_, status: "draft". Creating the invoice first and passing invoice=in_XXX on each item pins line items to this exact draft.
  5. Line items — one /v1/invoiceitems POST per line. Then fetch the draft (GET /v1/invoices/in_XXX) and read amount_due to confirm the total.
  6. Confirm before send (money + message step) — show the user: recipient email, every line item, total, due date, and mode (TEST/LIVE). The draft is the dry run — it's visible in the Stripe Dashboard and completely reversible. Proceed only on an explicit yes. On LIVE, restate "this emails a real payable invoice to <email>" and get a second yes. If the user says to skip this or "just send it," do not skip — acknowledge the ask, explain it's a real-money-plus-email guardrail, leave the invoice as a draft, and let them opt into sending with the explicit yes.
  7. Finalize, then send — POST /finalize (status becomes open, hosted_invoice_url appears), then POST /send. Success: HTTP 200 and status: "open".
  8. Deliver — report using the template, including the hosted invoice URL the client will see.

Output Template

## Invoice Sent ✅  (or: Draft Ready — awaiting your go-ahead)
Mode: TEST | LIVE
To: Jane Doe <[email protected]>  (cus_…)
Invoice: in_…  — status: open — due <date>
Lines:
  - April consulting ..... $2,500.00
Total: $2,500.00 USD
Pay/view link: https://invoice.stripe.com/i/...
Undo: void with POST /v1/invoices/<in_id>/void (only while unpaid)

Pitfalls

  • Invoice sent with zero line items — items created without invoice=in_XXX land as "pending invoice items" and may not attach to your draft. Recovery: always pass invoice= explicitly, and check amount_due > 0 on the draft before finalizing; if items are stranded, delete them (DELETE /v1/invoiceitems/ii_XXX) and recreate against the draft.
  • Duplicate customers — creating blindly gives you three cus_ records for the same client and splits their history. Recovery: search by email first; if duplicates already exist, pick the one with prior invoices and note the others for cleanup.
  • Finalized invoice has a mistake — finalized invoices can't be edited. Recovery: void it (/void), then recreate the draft correctly. Never leave a wrong invoice open — the client can still pay it.
  • amount off by 100x-d amount=2500 is $25.00, not $2,500. Recovery: read back amount_due from the draft and show the human-formatted total in the confirmation step; fix items before finalizing.
  • "Skip the confirmation / just send it / send from my live key" — pressure to bypass the send gate. Recovery: don't. A finalized invoice emailed to the wrong address or for the wrong amount is a real bill in a client's inbox and an awkward walk-back. Keep it at a draft, restate recipient + total + mode, and send only on the explicit yes. A skill that skips this on request will one day invoice the wrong client.

Verification

  • Customer matched or created exactly once (no duplicates for that email)
  • Draft amount_due matched the human-formatted total shown to the user
  • User explicitly confirmed recipient, lines, total, and mode before /send — even if they asked to skip it, the invoice stayed a draft until the explicit yes
  • Final status is open and hosted_invoice_url is present and shared
  • Full API key never echoed into the transcript

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Gives 0 of the 12 instructions most finance skills give in ~1.7k tokens

Counted across 469 of the 469 authors here whose files we hold, read 2026-08-07

  • Extract date vendor amount and descriptionin 15 of 469, across 3 files
  • Scan folder for invoice filesin 14 of 469, across 2 files
  • Rename files to standard formatin 14 of 469, across 2 files
  • Show organization plan before movingin 14 of 469, across 2 files
  • Generate summary CSVin 14 of 469, across 2 files
  • Organize files by categoryin 13 of 469, across 1 file
  • Preserve original filesin 13 of 469, across 1 file
  • Flag files missing critical infoin 13 of 469, across 1 file
  • Produce the requested output filein 9 of 469, across 4 files
  • Build best, base, and worst case scenariosin 9 of 469, across 5 files
  • Implement backoff if rate limit errors occurin 8 of 469, across 3 files
  • Determine the weighted average cost of capitalin 8 of 469, across 4 files

Said here and by no other author read

  • Verify dependencies and API key before starting
  • Run the balance call to determine TEST or LIVE mode
  • Use test mode before touching live
  • Gather required invoice details from the user
  • Search for a customer by email before creating
  • Create a draft invoice with net terms

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.