Skip to content
SlashClone
Made by@ledgerly

Saas tool spend audit

@ledgerly/saas-tool-spend-audit

Audit your SaaS subscriptions from a simple list: annual spend, owners, upcoming renewals with decide-by dates, unused seats, stale tools, overlapping tools, and the savings from each fix. Writes a prioritized action list.

SkillFinancev1.0.0 (latest)Tested
Activity
New: be the first to try it
  1. 1{
  2. 2 "name": "saas-tool-spend-audit",
  3. 3 "owner": "ledgerly",
  4. 4 "version": "1.0.0",
  5. 5 "type": "skill",
  6. 6 "description": "Audit your SaaS subscriptions from a simple list: annual spend, owners, upcoming renewals with decide-by dates, unused seats, stale tools, overlapping tools, and the savings from each fix. Writes a prioritized action list.",
  7. 7 "category": "finance",
  8. 8 "license": "MIT",
  9. 9 "compat": ["claude-code"],
  10. 10 "permissions": {
  11. 11 "shell": ["node scripts/audit.mjs"],
  12. 12 "files": { "read": ["./data/**"], "write": ["./data/tools.csv", "./out/tool-audit*"] }
  13. 13 },
  14. 14 "tests": {
  15. 15 "cases": [
  16. 16 {
  17. 17 "name": "finds stale tools, unused seats, overlaps, and renewals in the example",
  18. 18 "inputs": {},
  19. 19 "checks": [
  20. 20 { "type": "command_exits_zero", "command": "node scripts/audit.mjs examples/tools.csv --as-of 2026-11-01 --out out/tool-audit" },
  21. 21 { "type": "file_exists", "path": "out/tool-audit.csv" },
  22. 22 { "type": "file_contains", "path": "out/tool-audit.md", "text": "2026-10-21 (**passed**, act now)" },
  23. 23 {
  24. 24 "type": "output_matches_schema",
  25. 25 "path": "out/tool-audit.json",
  26. 26 "schema": {
  27. 27 "type": "object",
  28. 28 "required": ["annual_spend", "likely_savings", "stale", "overlaps", "renewals", "no_owner"],
  29. 29 "properties": {
  30. 30 "tool_count": { "const": 14 },
  31. 31 "annual_spend": { "const": 102958.8 },
  32. 32 "likely_savings": { "const": 19366.8 },
  33. 33 "stale": { "const": ["Asana", "Loom", "Miro"] },
  34. 34 "no_owner": { "const": ["Microsoft Teams", "Confluence", "Loom"] },
  35. 35 "overlaps": { "type": "array", "minItems": 3, "maxItems": 3 },
  36. 36 "renewals": { "type": "array", "minItems": 7, "maxItems": 7 }
  37. 37 }
  38. 38 }
  39. 39 }
  40. 40 ]
  41. 41 },
  42. 42 {
  43. 43 "name": "right-sizes seats with headroom",
  44. 44 "inputs": {
  45. 45 "data/tools.csv": "tool,category,owner,cost,billing,seats,active_seats\nDesignApp,Design,Lead,12000,annual,20,10\n"
  46. 46 },
  47. 47 "checks": [
  48. 48 { "type": "command_exits_zero", "command": "node scripts/audit.mjs data/tools.csv --as-of 2026-11-01 --headroom-pct 10 --out out/tool-audit" },
  49. 49 {
  50. 50 "type": "output_matches_schema",
  51. 51 "path": "out/tool-audit.json",
  52. 52 "schema": {
  53. 53 "type": "object",
  54. 54 "properties": {
  55. 55 "likely_savings": { "const": 5400 },
  56. 56 "unused_seats": { "const": [{ "tool": "DesignApp", "action": "cut to 11 seats", "savings": 5400 }] }
  57. 57 }
  58. 58 }
  59. 59 }
  60. 60 ]
  61. 61 }
  62. 62 ]
  63. 63 }