Skip to content
SlashClone

Saas usage dashboard

@usagemetrics/saas-usage-dashboard

Turn a product events CSV (timestamp, account_id, user_id, event) into one self-contained HTML dashboard: DAU, WAU, MAU, stickiness, active accounts, top features, activation rate, weekly retention, and accounts trending down. No external scripts; open it in any browser or attach it to an email.

SkillDatav1.0.0 (latest)Tested
Activity
New: be the first to try it
  1. 1{
  2. 2 "name": "saas-usage-dashboard",
  3. 3 "owner": "usagemetrics",
  4. 4 "version": "1.0.0",
  5. 5 "type": "skill",
  6. 6 "description": "Turn a product events CSV (timestamp, account_id, user_id, event) into one self-contained HTML dashboard: DAU, WAU, MAU, stickiness, active accounts, top features, activation rate, weekly retention, and accounts trending down. No external scripts; open it in any browser or attach it to an email.",
  7. 7 "category": "data",
  8. 8 "license": "MIT",
  9. 9 "compat": ["claude-code"],
  10. 10 "permissions": {
  11. 11 "shell": ["node scripts/usage-dashboard.mjs"],
  12. 12 "files": { "read": ["./data/**"], "write": ["./out/usage-dashboard*"] }
  13. 13 },
  14. 14 "tests": {
  15. 15 "cases": [
  16. 16 {
  17. 17 "name": "builds the dashboard from the example events",
  18. 18 "inputs": {},
  19. 19 "checks": [
  20. 20 { "type": "command_exits_zero", "command": "node scripts/usage-dashboard.mjs examples/events.csv --activation-event shared_dashboard --out out/usage-dashboard.html" },
  21. 21 { "type": "file_contains", "path": "out/usage-dashboard.html", "text": "<svg viewBox" },
  22. 22 { "type": "file_contains", "path": "out/usage-dashboard.html", "text": "Accounts trending down" },
  23. 23 { "type": "file_not_contains", "path": "out/usage-dashboard.html", "text": "<script" },
  24. 24 {
  25. 25 "type": "output_matches_schema",
  26. 26 "path": "out/usage-dashboard.json",
  27. 27 "schema": {
  28. 28 "type": "object",
  29. 29 "required": ["dau", "wau", "mau", "stickiness", "activation", "top_features", "retention", "accounts_trending_down"],
  30. 30 "properties": {
  31. 31 "as_of": { "const": "2026-10-30" },
  32. 32 "dau": { "const": 14 },
  33. 33 "wau": { "const": 32 },
  34. 34 "mau": { "const": 42 },
  35. 35 "active_accounts_30d": { "const": 12 },
  36. 36 "activation": { "type": "object", "properties": { "rate": { "const": 0.5909 } } },
  37. 37 "accounts_trending_down": {
  38. 38 "type": "array",
  39. 39 "minItems": 3,
  40. 40 "maxItems": 3,
  41. 41 "items": { "type": "object", "properties": { "account": { "enum": ["bluebird-labs", "harbor-retail", "juniper-bank"] } } }
  42. 42 }
  43. 43 }
  44. 44 }
  45. 45 }
  46. 46 ]
  47. 47 },
  48. 48 {
  49. 49 "name": "counts DAU, WAU, and MAU exactly on a tiny log",
  50. 50 "inputs": {
  51. 51 "data/events.csv": "timestamp,account_id,user_id,event\n2026-10-01T10:00:00Z,a1,u1,ran_query\n2026-10-25T10:00:00Z,a1,u2,ran_query\n2026-10-30T09:00:00Z,a2,u3,created_report\n2026-10-30T11:00:00Z,a2,u3,login\n2026-10-30T12:00:00Z,a1,u2,ran_query\n"
  52. 52 },
  53. 53 "checks": [
  54. 54 { "type": "command_exits_zero", "command": "node scripts/usage-dashboard.mjs data/events.csv --out out/usage-dashboard.html" },
  55. 55 {
  56. 56 "type": "output_matches_schema",
  57. 57 "path": "out/usage-dashboard.json",
  58. 58 "schema": {
  59. 59 "type": "object",
  60. 60 "properties": {
  61. 61 "dau": { "const": 2 },
  62. 62 "wau": { "const": 2 },
  63. 63 "mau": { "const": 3 },
  64. 64 "top_features": { "type": "array", "minItems": 2, "maxItems": 2 }
  65. 65 }
  66. 66 }
  67. 67 }
  68. 68 ]
  69. 69 }
  70. 70 ]
  71. 71 }