Skip to content
SlashClone
Made by@revopslab

Crm field audit

@revopslab/crm-field-audit

Audit the fields in any CRM export (HubSpot, Salesforce, or other CSV). Reports fill rates, placeholder junk like n/a and unknown, top values, and flags empty, sparse, constant, default-heavy, and likely duplicate fields, plus fill rates by owner or team. Ends with a cleanup plan: what to hide, merge, make required, or fix.

SkillRevOpsv1.0.0 (latest)Tested
Activity
New: be the first to try it
  1. 1{
  2. 2 "name": "crm-field-audit",
  3. 3 "owner": "revopslab",
  4. 4 "version": "1.0.0",
  5. 5 "type": "skill",
  6. 6 "description": "Audit the fields in any CRM export (HubSpot, Salesforce, or other CSV). Reports fill rates, placeholder junk like n/a and unknown, top values, and flags empty, sparse, constant, default-heavy, and likely duplicate fields, plus fill rates by owner or team. Ends with a cleanup plan: what to hide, merge, make required, or fix.",
  7. 7 "category": "revops",
  8. 8 "license": "MIT",
  9. 9 "compat": [
  10. 10 "claude-code"
  11. 11 ],
  12. 12 "permissions": {
  13. 13 "shell": [
  14. 14 "node scripts/field-audit.mjs"
  15. 15 ],
  16. 16 "files": {
  17. 17 "read": [
  18. 18 "./data/**"
  19. 19 ],
  20. 20 "write": [
  21. 21 "./out/**"
  22. 22 ]
  23. 23 }
  24. 24 },
  25. 25 "tests": {
  26. 26 "cases": [
  27. 27 {
  28. 28 "name": "flags empty, sparse, constant, default-heavy, placeholder, and duplicate fields",
  29. 29 "inputs": {
  30. 30 "data/companies.csv": "Record ID,Company Name,Domain,Industry,Industry (Custom),Employees,Annual Revenue,Lifecycle Stage,Country,Legacy Score,Partner Tier,Original Source,Owner,Region\n1,Northwind Traders,northwind.example,Retail,Retail,350,42000000,Customer,US,,,Organic search,Rep A,NA\n2,Contoso Robotics,contoso.example,Manufacturing,Manufacturing,1200,,Lead,DE,,Gold,n/a,Rep B,NA\n3,Fabrikam Health,fabrikam.example,Healthcare,Healthcare,4200,610000000,Lead,US,,,Paid search,Rep A,NA\n4,Tailspin Toys,tailspin.example,Retail,Retail,45,,Lead,US,,,n/a,Rep C,NA\n5,Litware,litware.example,Software,Software,12,,Lead,CA,,,Referral,Rep C,NA\n6,Adventure Works,adventure.example,Retail,Retail,600,88000000,Lead,US,,,n/a,,NA\n7,Wide World Importers,wideworld.example,Logistics,Logistics,250,,Lead,GB,,,Organic search,Rep B,NA\n8,Proseware,proseware.example,Software,,30,,Lead,US,,,Unknown,Rep C,NA\n9,Coho Winery,coho.example,Food and beverage,Food and beverage,80,,Lead,US,,,Event,Rep A,NA\n10,Lucerne Publishing,lucerne.example,Media,Media,150,21000000,Lead,US,,,n/a,Rep B,NA\n11,Woodgrove Bank,woodgrove.example,Financial services,Financial services,9000,,Lead,US,,,Paid social,Rep A,NA\n12,Alpine Ski House,alpine.example,,,25,,Lead,CH,,,,Rep C,NA\n"
  31. 31 },
  32. 32 "checks": [
  33. 33 {
  34. 34 "type": "command_exits_zero",
  35. 35 "command": "node scripts/field-audit.mjs data/companies.csv --group-by Owner --key-fields Industry,Employees,Owner --out out"
  36. 36 },
  37. 37 {
  38. 38 "type": "file_contains",
  39. 39 "path": "out/field-audit.md",
  40. 40 "text": "- Industry and Industry (Custom)"
  41. 41 },
  42. 42 {
  43. 43 "type": "output_matches_schema",
  44. 44 "path": "out/field-audit.json",
  45. 45 "schema": {
  46. 46 "type": "object",
  47. 47 "required": [
  48. 48 "summary",
  49. 49 "field_profiles",
  50. 50 "duplicates",
  51. 51 "by_group"
  52. 52 ],
  53. 53 "properties": {
  54. 54 "file_rows": {
  55. 55 "const": 12
  56. 56 },
  57. 57 "fields": {
  58. 58 "const": 14
  59. 59 },
  60. 60 "summary": {
  61. 61 "type": "object",
  62. 62 "properties": {
  63. 63 "empty": {
  64. 64 "const": 1
  65. 65 },
  66. 66 "sparse": {
  67. 67 "const": 1
  68. 68 },
  69. 69 "constant": {
  70. 70 "const": 1
  71. 71 },
  72. 72 "default_heavy": {
  73. 73 "const": 1
  74. 74 },
  75. 75 "placeholders": {
  76. 76 "const": 1
  77. 77 },
  78. 78 "possible_duplicates": {
  79. 79 "const": 1
  80. 80 }
  81. 81 }
  82. 82 },
  83. 83 "key_fields": {
  84. 84 "type": "array",
  85. 85 "minItems": 3,
  86. 86 "maxItems": 3
  87. 87 }
  88. 88 }
  89. 89 }
  90. 90 }
  91. 91 ]
  92. 92 },
  93. 93 {
  94. 94 "name": "NA as a region is a value, not a placeholder",
  95. 95 "inputs": {
  96. 96 "data/x.csv": "id,region,notes\n1,NA,\n2,NA,n/a\n3,EMEA,tbd\n"
  97. 97 },
  98. 98 "checks": [
  99. 99 {
  100. 100 "type": "command_exits_zero",
  101. 101 "command": "node scripts/field-audit.mjs data/x.csv --out out"
  102. 102 },
  103. 103 {
  104. 104 "type": "output_matches_schema",
  105. 105 "path": "out/field-audit.json",
  106. 106 "schema": {
  107. 107 "type": "object",
  108. 108 "properties": {
  109. 109 "field_profiles": {
  110. 110 "type": "array",
  111. 111 "minItems": 3,
  112. 112 "maxItems": 3,
  113. 113 "items": {
  114. 114 "type": "object",
  115. 115 "required": [
  116. 116 "field",
  117. 117 "fill_rate",
  118. 118 "flags"
  119. 119 ]
  120. 120 }
  121. 121 },
  122. 122 "summary": {
  123. 123 "type": "object",
  124. 124 "properties": {
  125. 125 "empty": {
  126. 126 "const": 1
  127. 127 },
  128. 128 "placeholders": {
  129. 129 "const": 1
  130. 130 }
  131. 131 }
  132. 132 }
  133. 133 }
  134. 134 }
  135. 135 }
  136. 136 ]
  137. 137 }
  138. 138 ]
  139. 139 }