@wonsukchoi/crondex 0.22.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +16 -15
  2. package/catalog.json +4839 -118
  3. package/jobs/automotive/ase-certification-expiry-check.yaml +36 -0
  4. package/jobs/automotive/csi-score-monitor.yaml +33 -0
  5. package/jobs/automotive/customer-pay-warranty-pay-mix-tracker.yaml +47 -0
  6. package/jobs/automotive/fi-product-attachment-rate-tracker.yaml +39 -0
  7. package/jobs/automotive/loaner-fleet-availability-check.yaml +40 -0
  8. package/jobs/automotive/manufacturer-recall-notice-check.yaml +39 -0
  9. package/jobs/automotive/parts-reorder-point-check.yaml +36 -0
  10. package/jobs/automotive/repair-cycle-time-trend-monitor.yaml +42 -0
  11. package/jobs/automotive/service-appointment-no-show-tracker.yaml +38 -0
  12. package/jobs/automotive/service-bay-utilization-check.yaml +38 -0
  13. package/jobs/automotive/shop-supply-reorder-check.yaml +31 -0
  14. package/jobs/automotive/trade-in-appraisal-variance-check.yaml +39 -0
  15. package/jobs/automotive/used-vehicle-inventory-aging-check.yaml +35 -0
  16. package/jobs/construction/critical-path-material-lead-time-review.yaml +43 -0
  17. package/jobs/construction/daily-jobsite-log-compliance-check.yaml +34 -0
  18. package/jobs/construction/equipment-utilization-cost-check.yaml +35 -0
  19. package/jobs/construction/heavy-equipment-inspection-compliance-check.yaml +34 -0
  20. package/jobs/construction/jobsite-safety-incident-near-miss-tracker.yaml +35 -0
  21. package/jobs/construction/lien-waiver-collection-tracker.yaml +27 -0
  22. package/jobs/construction/permit-application-approval-backlog-check.yaml +33 -0
  23. package/jobs/construction/project-budget-variance-check.yaml +34 -0
  24. package/jobs/construction/punch-list-completion-tracker.yaml +36 -0
  25. package/jobs/construction/retainage-holdback-release-tracker.yaml +33 -0
  26. package/jobs/construction/rfi-response-time-tracker.yaml +33 -0
  27. package/jobs/construction/subcontractor-pay-application-approval-tracker.yaml +35 -0
  28. package/jobs/construction/submittal-shop-drawing-review-check.yaml +45 -0
  29. package/jobs/construction/weather-delay-impact-log.yaml +44 -0
  30. package/jobs/education/chronic-absenteeism-tracker.yaml +34 -0
  31. package/jobs/education/department-budget-variance-check.yaml +37 -0
  32. package/jobs/education/enrollment-withdrawal-trend-tracker.yaml +39 -0
  33. package/jobs/education/facility-work-order-backlog-check.yaml +34 -0
  34. package/jobs/education/free-reduced-lunch-eligibility-renewal-check.yaml +36 -0
  35. package/jobs/education/iep-504-review-deadline-tracker.yaml +35 -0
  36. package/jobs/education/parent-teacher-conference-noshow-tracker.yaml +29 -0
  37. package/jobs/education/school-bus-route-ontime-check.yaml +40 -0
  38. package/jobs/education/standardized-test-registration-deadline-check.yaml +35 -0
  39. package/jobs/education/substitute-teacher-fill-rate-tracker.yaml +35 -0
  40. package/jobs/education/teacher-certification-expiry-tracker.yaml +35 -0
  41. package/jobs/education/textbook-inventory-shortage-check.yaml +32 -0
  42. package/jobs/fleet/accident-incident-report-tracker.yaml +34 -0
  43. package/jobs/fleet/driver-mvr-review-tracker.yaml +34 -0
  44. package/jobs/fleet/driver-safety-score-monitor.yaml +39 -0
  45. package/jobs/fleet/ev-battery-health-check.yaml +36 -0
  46. package/jobs/fleet/fuel-efficiency-trend-monitor.yaml +33 -0
  47. package/jobs/fleet/geofence-violation-check.yaml +37 -0
  48. package/jobs/fleet/lease-return-condition-check.yaml +33 -0
  49. package/jobs/fleet/tire-wear-replacement-check.yaml +30 -0
  50. package/jobs/fleet/toll-violation-tracker.yaml +34 -0
  51. package/jobs/fleet/vehicle-pool-scheduling-conflict-check.yaml +37 -0
  52. package/jobs/fleet/vehicle-tco-tracker.yaml +41 -0
  53. package/jobs/fleet/vehicle-utilization-rate-check.yaml +37 -0
  54. package/jobs/growth/cohort-retention-curve-monitor.yaml +39 -0
  55. package/jobs/growth/customer-health-score-monitor.yaml +37 -0
  56. package/jobs/growth/dau-mau-engagement-ratio-check.yaml +39 -0
  57. package/jobs/growth/dormant-account-reactivation-check.yaml +39 -0
  58. package/jobs/growth/expansion-revenue-opportunity-tracker.yaml +44 -0
  59. package/jobs/growth/feature-adoption-rate-tracker.yaml +44 -0
  60. package/jobs/growth/nps-trend-tracker.yaml +40 -0
  61. package/jobs/growth/onboarding-funnel-dropoff-check.yaml +39 -0
  62. package/jobs/growth/paywall-upgrade-prompt-conversion-check.yaml +40 -0
  63. package/jobs/growth/product-qualified-lead-tracker.yaml +42 -0
  64. package/jobs/growth/referral-program-performance-tracker.yaml +35 -0
  65. package/jobs/growth/trial-to-paid-conversion-rate-tracker.yaml +48 -0
  66. package/jobs/growth/winback-reactivation-campaign-tracker.yaml +46 -0
  67. package/jobs/hospitality/adr-revpar-tracker.yaml +43 -0
  68. package/jobs/hospitality/cancellation-rate-spike-check.yaml +21 -0
  69. package/jobs/hospitality/group-booking-space-utilization-check.yaml +40 -0
  70. package/jobs/hospitality/guest-complaint-sla-tracker.yaml +34 -0
  71. package/jobs/hospitality/guest-satisfaction-score-monitor.yaml +41 -0
  72. package/jobs/hospitality/linen-inventory-turnover-check.yaml +35 -0
  73. package/jobs/hospitality/loyalty-points-reconciliation-check.yaml +33 -0
  74. package/jobs/hospitality/minibar-charge-reconciliation-check.yaml +38 -0
  75. package/jobs/hospitality/occupancy-forecast-variance-check.yaml +33 -0
  76. package/jobs/hospitality/ota-rate-parity-check.yaml +36 -0
  77. package/jobs/hospitality/overbooking-risk-alert.yaml +38 -0
  78. package/jobs/hospitality/room-maintenance-work-order-tracker.yaml +31 -0
  79. package/jobs/hospitality/upsell-upgrade-conversion-tracker.yaml +37 -0
  80. package/jobs/insurance/adjuster-caseload-balance-check.yaml +45 -0
  81. package/jobs/insurance/agent-broker-license-expiry-tracker.yaml +40 -0
  82. package/jobs/insurance/cat-event-exposure-monitor.yaml +37 -0
  83. package/jobs/insurance/claims-aging-backlog-tracker.yaml +48 -0
  84. package/jobs/insurance/doi-filing-deadline-tracker.yaml +42 -0
  85. package/jobs/insurance/loss-ratio-by-line-monitor.yaml +43 -0
  86. package/jobs/insurance/policy-lapse-rate-monitor.yaml +41 -0
  87. package/jobs/insurance/premium-payment-delinquency-tracker.yaml +42 -0
  88. package/jobs/insurance/quote-to-bind-conversion-tracker.yaml +41 -0
  89. package/jobs/insurance/reinsurance-treaty-renewal-tracker.yaml +38 -0
  90. package/jobs/insurance/siu-fraud-referral-tracker.yaml +36 -0
  91. package/jobs/insurance/subrogation-recovery-tracker.yaml +41 -0
  92. package/jobs/insurance/underwriting-queue-sla-monitor.yaml +45 -0
  93. package/jobs/logistics/3pl-performance-scorecard.yaml +45 -0
  94. package/jobs/logistics/bol-freight-class-accuracy-audit.yaml +33 -0
  95. package/jobs/logistics/cargo-insurance-claim-status-check.yaml +39 -0
  96. package/jobs/logistics/carrier-load-tender-acceptance-check.yaml +34 -0
  97. package/jobs/logistics/carrier-otd-performance-scorecard.yaml +41 -0
  98. package/jobs/logistics/carrier-rate-contract-renewal-check.yaml +35 -0
  99. package/jobs/logistics/cross-dock-dwell-time-watch.yaml +43 -0
  100. package/jobs/logistics/freight-invoice-rate-audit.yaml +38 -0
  101. package/jobs/logistics/fuel-surcharge-rate-monitor.yaml +40 -0
  102. package/jobs/logistics/international-shipment-documentation-check.yaml +36 -0
  103. package/jobs/logistics/linehaul-transit-time-variance-check.yaml +43 -0
  104. package/jobs/logistics/proof-of-delivery-reconciliation-check.yaml +38 -0
  105. package/jobs/logistics/route-load-optimization-check.yaml +32 -0
  106. package/jobs/manufacturing/changeover-time-tracker.yaml +29 -0
  107. package/jobs/manufacturing/critical-spare-parts-stock-check.yaml +29 -0
  108. package/jobs/manufacturing/first-pass-yield-report.yaml +37 -0
  109. package/jobs/manufacturing/lot-traceability-audit.yaml +37 -0
  110. package/jobs/manufacturing/non-conformance-report-backlog-check.yaml +34 -0
  111. package/jobs/manufacturing/oee-efficiency-check.yaml +37 -0
  112. package/jobs/manufacturing/osha-recordable-incident-audit.yaml +37 -0
  113. package/jobs/manufacturing/production-schedule-adherence-check.yaml +35 -0
  114. package/jobs/manufacturing/safety-certification-expiry-check.yaml +37 -0
  115. package/jobs/manufacturing/scrap-waste-rate-watch.yaml +33 -0
  116. package/jobs/manufacturing/shift-handoff-report.yaml +37 -0
  117. package/jobs/manufacturing/supplier-quality-ppm-watch.yaml +38 -0
  118. package/jobs/manufacturing/tooling-die-wear-check.yaml +31 -0
  119. package/jobs/manufacturing/work-order-backlog-check.yaml +37 -0
  120. package/jobs/marketing/ad-creative-fatigue-check.yaml +44 -0
  121. package/jobs/marketing/affiliate-partner-performance-check.yaml +38 -0
  122. package/jobs/marketing/attribution-discrepancy-check.yaml +42 -0
  123. package/jobs/marketing/brand-share-of-voice-check.yaml +43 -0
  124. package/jobs/marketing/campaign-roas-cpa-anomaly-check.yaml +41 -0
  125. package/jobs/marketing/competitor-ad-creative-watch.yaml +40 -0
  126. package/jobs/marketing/email-list-growth-rate-check.yaml +43 -0
  127. package/jobs/marketing/landing-page-conversion-drop-check.yaml +44 -0
  128. package/jobs/marketing/mql-to-sql-handoff-sla-check.yaml +29 -0
  129. package/jobs/marketing/mql-volume-pace-check.yaml +34 -0
  130. package/jobs/marketing/paid-search-negative-keyword-waste-check.yaml +37 -0
  131. package/jobs/marketing/press-release-pickup-tracking.yaml +32 -0
  132. package/jobs/marketing/webinar-registration-attendance-check.yaml +38 -0
  133. package/jobs/restaurant/comp-void-anomaly-tracker.yaml +39 -0
  134. package/jobs/restaurant/daily-sales-flash-report.yaml +36 -0
  135. package/jobs/restaurant/delivery-platform-commission-reconciliation.yaml +33 -0
  136. package/jobs/restaurant/delivery-receiving-discrepancy-check.yaml +33 -0
  137. package/jobs/restaurant/food-handler-permit-expiry-tracker.yaml +33 -0
  138. package/jobs/restaurant/gift-card-liability-check.yaml +45 -0
  139. package/jobs/restaurant/kitchen-ticket-time-watch.yaml +38 -0
  140. package/jobs/restaurant/liquor-pour-cost-variance-check.yaml +34 -0
  141. package/jobs/restaurant/menu-86-frequency-tracker.yaml +39 -0
  142. package/jobs/restaurant/menu-item-profitability-check.yaml +33 -0
  143. package/jobs/restaurant/pos-end-of-day-reconciliation-check.yaml +31 -0
  144. package/jobs/restaurant/table-turnover-rate-tracker.yaml +36 -0
  145. package/jobs/restaurant/waitlist-conversion-check.yaml +37 -0
  146. package/jobs/retail/cash-office-deposit-variance-check.yaml +34 -0
  147. package/jobs/retail/competitor-price-monitoring-check.yaml +42 -0
  148. package/jobs/retail/damaged-merchandise-writeoff-tracker.yaml +41 -0
  149. package/jobs/retail/employee-discount-abuse-check.yaml +39 -0
  150. package/jobs/retail/layaway-special-order-pickup-tracker.yaml +33 -0
  151. package/jobs/retail/loyalty-enrollment-redemption-rate-tracker.yaml +37 -0
  152. package/jobs/retail/markdown-execution-audit-check.yaml +29 -0
  153. package/jobs/retail/planogram-compliance-audit-check.yaml +36 -0
  154. package/jobs/retail/pos-void-refund-anomaly-tracker.yaml +42 -0
  155. package/jobs/retail/price-tag-audit-accuracy-check.yaml +37 -0
  156. package/jobs/retail/sales-per-square-foot-tracker.yaml +36 -0
  157. package/jobs/retail/seasonal-staffing-coverage-check.yaml +35 -0
  158. package/jobs/retail/store-closing-checklist-compliance-check.yaml +32 -0
  159. package/jobs/retail/visual-merchandising-compliance-check.yaml +40 -0
  160. package/jobs/veterinary/appointment-no-show-rate-tracker.yaml +49 -0
  161. package/jobs/veterinary/boarding-kennel-capacity-utilization-check.yaml +39 -0
  162. package/jobs/veterinary/client-payment-plan-delinquency-check.yaml +36 -0
  163. package/jobs/veterinary/dvm-license-dea-registration-expiry-check.yaml +41 -0
  164. package/jobs/veterinary/microchip-registration-verification-check.yaml +40 -0
  165. package/jobs/veterinary/patient-record-completeness-audit.yaml +41 -0
  166. package/jobs/veterinary/pet-medication-refill-backlog-check.yaml +36 -0
  167. package/jobs/veterinary/puppy-kitten-vaccine-series-compliance-check.yaml +39 -0
  168. package/jobs/veterinary/senior-pet-wellness-recall-tracker.yaml +43 -0
  169. package/jobs/veterinary/spay-neuter-followup-compliance-check.yaml +35 -0
  170. package/jobs/veterinary/specialist-referral-followup-check.yaml +38 -0
  171. package/jobs/veterinary/surgical-schedule-utilization-check.yaml +36 -0
  172. package/jobs/veterinary/vet-staff-ce-credit-tracking.yaml +36 -0
  173. package/jobs/warehousing/conveyor-sortation-downtime-watch.yaml +48 -0
  174. package/jobs/warehousing/labor-productivity-rate-check.yaml +33 -0
  175. package/jobs/warehousing/mhe-preventive-maintenance-check.yaml +38 -0
  176. package/jobs/warehousing/order-fulfillment-sla-watch.yaml +42 -0
  177. package/jobs/warehousing/shift-headcount-coverage-check.yaml +33 -0
  178. package/jobs/warehousing/slotting-velocity-review-check.yaml +44 -0
  179. package/jobs/warehousing/warehouse-damage-writeoff-review.yaml +41 -0
  180. package/jobs/warehousing/warehouse-near-miss-incident-rate-watch.yaml +47 -0
  181. package/jobs/warehousing/warehouse-space-utilization-check.yaml +39 -0
  182. package/jobs/warehousing/wave-pick-batch-efficiency-check.yaml +33 -0
  183. package/jobs/warehousing/wms-integration-error-check.yaml +36 -0
  184. package/jobs/warehousing/yard-trailer-detention-watch.yaml +41 -0
  185. package/lib/category-descriptions.js +12 -12
  186. package/lib/duplicates-allowlist.js +10 -0
  187. package/package.json +2 -2
@@ -0,0 +1,39 @@
1
+ id: dau-mau-engagement-ratio-check
2
+ version: 1
3
+ name: DAU/MAU Engagement Ratio Check
4
+ description: >
5
+ Computes the daily-active-to-monthly-active user ratio (a standard
6
+ stickiness measure) and flags when it drops below a healthy floor. Use
7
+ this if "engagement feels down lately" has ever been a gut feeling
8
+ nobody could confirm with a number until the next board deck.
9
+ category: growth
10
+ tags: [growth, engagement, stickiness, dau-mau]
11
+ schedule: "0 9 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ stats=$(curl -s -H "Authorization: Bearer {{analytics_api_token}}" "{{analytics_api_url}}");
16
+ dau=$(echo "$stats" | grep -o '"dau":[0-9]*' | head -n1 | cut -d: -f2);
17
+ mau=$(echo "$stats" | grep -o '"mau":[0-9]*' | head -n1 | cut -d: -f2);
18
+ if [ -z "$dau" ] || [ -z "$mau" ] || [ "$mau" -eq 0 ]; then echo "ERROR: could not compute DAU/MAU from {{analytics_api_url}}"; exit 1; fi;
19
+ ratio=$(awk "BEGIN{printf \"%.1f\", ($dau/$mau)*100}");
20
+ if awk "BEGIN{exit !($ratio < {{min_ratio_pct}})}"; then
21
+ echo "WARNING: DAU/MAU ratio ${ratio}% (min {{min_ratio_pct}}%) — $dau DAU / $mau MAU";
22
+ exit 1;
23
+ else echo "OK: DAU/MAU ratio ${ratio}% — $dau DAU / $mau MAU"; fi
24
+ variables:
25
+ analytics_api_url:
26
+ default: "https://api.example-analytics.com/v1/engagement/summary"
27
+ description: Product analytics endpoint returning current dau and mau counts.
28
+ analytics_api_token:
29
+ default: "your-api-token"
30
+ description: API token for the analytics platform.
31
+ min_ratio_pct:
32
+ default: 15
33
+ description: Minimum acceptable DAU/MAU ratio percent before flagging.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: >
36
+ Generic REST pattern — point at your analytics platform's (Amplitude,
37
+ Mixpanel, PostHog) engagement summary endpoint; adjust field names to
38
+ match its response shape. 15-20% is a common "sticky product" floor for
39
+ B2B SaaS, but tune to your product's natural usage cadence.
@@ -0,0 +1,39 @@
1
+ id: dormant-account-reactivation-check
2
+ version: 1
3
+ name: Dormant Account Reactivation Check
4
+ description: >
5
+ Flags accounts that have gone completely silent — no login at all for
6
+ an extended stretch — regardless of payment status, so they can be
7
+ routed into a reactivation effort instead of being written off
8
+ silently. Use this if accounts that stopped logging in months ago only
9
+ come up again when finance asks why you're still paying to host them.
10
+ category: growth
11
+ tags: [growth, dormant-accounts, reactivation, retention]
12
+ schedule: "0 9 1 * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ file={{accounts_csv_path}}; dormant_days={{dormant_days}};
17
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
18
+ today=$(date +%s);
19
+ tail -n +2 "$file" | while IFS=',' read -r account email last_login flagged; do
20
+ [ "$flagged" = "yes" ] && continue;
21
+ l_epoch=$(date -d "$last_login" +%s 2>/dev/null || date -j -f "%Y-%m-%d" "$last_login" +%s 2>/dev/null);
22
+ [ -z "$l_epoch" ] && continue;
23
+ days=$(( (today-l_epoch)/86400 ));
24
+ if [ "$days" -ge "$dormant_days" ]; then echo "DORMANT: $account ($email) — last login $days day(s) ago"; fi
25
+ done
26
+ variables:
27
+ accounts_csv_path:
28
+ default: "./account-last-login.csv"
29
+ description: "Path to a CSV with header: account_name,email,last_login_date,already_flagged (last_login_date is YYYY-MM-DD, already_flagged is yes/no)."
30
+ dormant_days:
31
+ default: 60
32
+ description: Days with no login before an account counts as dormant.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: >
35
+ Zero-token. You maintain account-last-login.csv yourself (or export
36
+ from your user database) — mark already_flagged=yes after routing an
37
+ account into reactivation outreach. Distinct from churn-risk-watch
38
+ (partial usage drop-off on paying accounts) — this catches accounts
39
+ with zero activity at all, paying or not.
@@ -0,0 +1,44 @@
1
+ id: expansion-revenue-opportunity-tracker
2
+ version: 1
3
+ name: Expansion Revenue Opportunity Tracker
4
+ description: >
5
+ Reviews usage-based consumption (API calls, storage, records processed,
6
+ etc.) against each account's plan allowance and flags accounts
7
+ regularly running over, before it becomes a support complaint about
8
+ being throttled. Use this if the first sign of an account outgrowing
9
+ its plan is a "why did my job fail" ticket instead of a proactive
10
+ expansion conversation.
11
+ category: growth
12
+ tags: [growth, expansion, upsell, usage-based]
13
+ schedule: "0 9 * * 1"
14
+ timezone: "UTC"
15
+ runner: agent-prompt
16
+ prompt: |
17
+ Pull consumption metrics (e.g. API calls, storage used, records
18
+ processed — whatever your plan limits are metered on) for each paying
19
+ account from {{usage_source}} over the last {{lookback_days}} days.
20
+ 1. Compare each account's usage against its plan's included allowance.
21
+ 2. Flag accounts that exceeded the allowance, or came within
22
+ {{near_limit_pct}}% of it, on {{repeat_occurrences}} or more days in
23
+ the window.
24
+ 3. List flagged accounts with their overage amount and current plan, so
25
+ the account owner can start an expansion conversation.
26
+ variables:
27
+ usage_source:
28
+ default: "your metering/billing system or usage database"
29
+ description: Where consumption/usage-metering data lives.
30
+ lookback_days:
31
+ default: 30
32
+ description: Window of usage to evaluate.
33
+ near_limit_pct:
34
+ default: 90
35
+ description: Percent of plan allowance that counts as "near the limit."
36
+ repeat_occurrences:
37
+ default: 3
38
+ description: Number of days within the window an account must hit/near the limit to be flagged.
39
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
40
+ notes: >
41
+ No generic script mode — usage-metering schemas vary too much per
42
+ product to hardcode a query. Distinct from seat-utilization-upsell-check
43
+ (seat-count based) — this looks at metered/consumption-based usage
44
+ instead of seat count, since not every plan is priced per seat.
@@ -0,0 +1,44 @@
1
+ id: feature-adoption-rate-tracker
2
+ version: 1
3
+ name: Feature Adoption Rate Tracker
4
+ description: >
5
+ Tracks what percent of active accounts have used a specific feature at
6
+ least once, and flags when adoption is stuck below target. Use this if
7
+ you shipped a feature, called it done, and never actually checked
8
+ whether anyone uses it.
9
+ category: growth
10
+ tags: [growth, feature-adoption, activation, product]
11
+ schedule: "0 9 1 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ file={{accounts_csv_path}}; feature="{{feature_column}}"; target={{target_adoption_pct}};
16
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
17
+ header=$(head -1 "$file");
18
+ col=$(echo "$header" | tr ',' '\n' | grep -nx "$feature" | cut -d: -f1);
19
+ [ -n "$col" ] || { echo "ERROR: column $feature not found in $file"; exit 1; };
20
+ total=0; used=0;
21
+ tail -n +2 "$file" | while IFS=',' read -ra row; do
22
+ total=$((total+1));
23
+ val="${row[$((col-1))]}";
24
+ [ "$val" = "yes" ] || [ "$val" = "1" ] || [ "$val" = "true" ] && used=$((used+1));
25
+ echo "$total $used";
26
+ done | tail -1 | { read -r t u;
27
+ pct=$(awk "BEGIN{printf \"%.1f\", ($u/$t)*100}");
28
+ echo "Feature adoption for $feature: $u/$t accounts (${pct}%)";
29
+ if awk "BEGIN{exit !($pct < $target)}"; then echo "WARNING: adoption below target (${target}%)"; exit 1; fi;
30
+ }
31
+ variables:
32
+ accounts_csv_path:
33
+ default: "./account-feature-usage.csv"
34
+ description: "Path to a CSV with an account identifier column plus one column per tracked feature (yes/no, 1/0, or true/false)."
35
+ feature_column:
36
+ default: "used_new_dashboard"
37
+ description: Column name for the feature to check adoption of.
38
+ target_adoption_pct:
39
+ default: 30
40
+ description: Minimum adoption percent expected before flagging as behind.
41
+ compatible_agents: [generic, claude, codex]
42
+ notes: >
43
+ Zero-token. You export account-feature-usage.csv from your product
44
+ analytics tool (one boolean column per feature you want to track).
@@ -0,0 +1,40 @@
1
+ id: nps-trend-tracker
2
+ version: 1
3
+ name: NPS Trend Tracker
4
+ description: >
5
+ Computes Net Promoter Score from a survey response log and flags when
6
+ it drops meaningfully from the prior period. Use this if NPS only gets
7
+ looked at once a quarter in a slide, instead of catching a slide in
8
+ sentiment while there's still time to find out why.
9
+ category: growth
10
+ tags: [growth, nps, sentiment, retention]
11
+ schedule: "0 9 1 * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ file={{nps_responses_csv_path}}; drop_threshold={{drop_threshold_points}};
16
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
17
+ total=$(tail -n +2 "$file" | wc -l | tr -d ' ');
18
+ if [ "$total" -eq 0 ]; then echo "No NPS responses recorded in $file"; exit 0; fi;
19
+ promoters=$(tail -n +2 "$file" | awk -F',' '$2>=9 {c++} END{print c+0}');
20
+ detractors=$(tail -n +2 "$file" | awk -F',' '$2<=6 {c++} END{print c+0}');
21
+ nps=$(awk "BEGIN{printf \"%.0f\", (($promoters-$detractors)/$total)*100}");
22
+ prev={{previous_nps_score}};
23
+ drop=$((prev - nps));
24
+ echo "NPS: $nps (from $total responses; $promoters promoters, $detractors detractors) — previous: $prev";
25
+ if [ "$drop" -ge "$drop_threshold" ]; then echo "WARNING: NPS dropped $drop points since last period"; exit 1; fi
26
+ variables:
27
+ nps_responses_csv_path:
28
+ default: "./nps-responses.csv"
29
+ description: "Path to a CSV with header: respondent_email,score (score is 0-10)."
30
+ previous_nps_score:
31
+ default: 40
32
+ description: NPS score from the prior period, to compare against (update after each run).
33
+ drop_threshold_points:
34
+ default: 10
35
+ description: Point drop in NPS from the previous period that triggers a warning.
36
+ compatible_agents: [generic, claude, codex]
37
+ notes: >
38
+ Zero-token. Export nps-responses.csv from your survey tool (Delighted,
39
+ Wootric, or your own in-app survey) and update previous_nps_score after
40
+ each run to track period-over-period movement.
@@ -0,0 +1,39 @@
1
+ id: onboarding-funnel-dropoff-check
2
+ version: 1
3
+ name: Onboarding Funnel Drop-off Check
4
+ description: >
5
+ Computes the step-by-step completion rate across your onboarding funnel
6
+ and flags whichever step is losing the most users. Use this if you know
7
+ onboarding completion isn't great but have never actually seen where in
8
+ the funnel people give up.
9
+ category: growth
10
+ tags: [growth, onboarding, funnel, activation]
11
+ schedule: "0 9 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ file={{funnel_csv_path}}; drop_threshold={{step_dropoff_threshold_pct}};
16
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
17
+ prev_count=0; prev_step="start";
18
+ tail -n +2 "$file" | while IFS=',' read -r step count; do
19
+ if [ "$prev_count" -gt 0 ]; then
20
+ drop_pct=$(awk "BEGIN{printf \"%.1f\", (($prev_count-$count)/$prev_count)*100}");
21
+ flag="";
22
+ awk "BEGIN{exit !($drop_pct >= $drop_threshold)}" && flag=" <-- HIGH DROP-OFF";
23
+ echo "$prev_step -> $step: $prev_count -> $count (-${drop_pct}%)$flag";
24
+ fi;
25
+ prev_count=$count; prev_step=$step;
26
+ done
27
+ variables:
28
+ funnel_csv_path:
29
+ default: "./onboarding-funnel.csv"
30
+ description: "Path to a CSV with header: step,users_reached, ordered from first onboarding step to last, one row per step."
31
+ step_dropoff_threshold_pct:
32
+ default: 30
33
+ description: Step-over-step drop percent that flags a step as a major leak.
34
+ compatible_agents: [generic, claude, codex]
35
+ notes: >
36
+ Zero-token. Export onboarding-funnel.csv from your product analytics
37
+ tool's funnel report. Distinct from onboarding-completion-stall-check
38
+ (flags individual users stuck on a step) — this looks at aggregate
39
+ step-to-step drop-off across the whole funnel instead.
@@ -0,0 +1,40 @@
1
+ id: paywall-upgrade-prompt-conversion-check
2
+ version: 1
3
+ name: Paywall/Upgrade Prompt Conversion Check
4
+ description: >
5
+ Reviews how often users who hit a paywall or upgrade prompt actually
6
+ convert, and flags prompts that are being seen a lot but converting
7
+ poorly. Use this if an upgrade prompt has ever quietly annoyed users for
8
+ months with a near-zero conversion rate and nobody looked at the
9
+ numbers until a redesign project asked "does this even work?"
10
+ category: growth
11
+ tags: [growth, paywall, upgrade-prompt, conversion, product-led-growth]
12
+ schedule: "0 9 * * 1"
13
+ timezone: "UTC"
14
+ runner: agent-prompt
15
+ prompt: |
16
+ Pull paywall/upgrade-prompt impression and conversion data from
17
+ {{analytics_hint}} for the last {{lookback_days}} days, broken down by
18
+ prompt location or trigger (e.g. feature-gate modal, usage-limit
19
+ banner, pricing page CTA).
20
+ 1. Compute the view-to-upgrade conversion rate for each prompt.
21
+ 2. Flag any prompt with {{min_impressions}}+ impressions but a
22
+ conversion rate under {{min_conversion_rate_pct}}%.
23
+ 3. For flagged prompts, suggest likely causes based on what's visible
24
+ (wrong audience being shown the prompt, unclear value proposition,
25
+ price shown too early, friction in the upgrade flow itself).
26
+ variables:
27
+ analytics_hint:
28
+ default: "product analytics tool (e.g. Amplitude, Mixpanel, PostHog)"
29
+ description: Where paywall/upgrade-prompt impression and conversion events are tracked.
30
+ lookback_days:
31
+ default: 30
32
+ description: Window of prompt data to evaluate.
33
+ min_impressions:
34
+ default: 100
35
+ description: Minimum impressions a prompt needs before its conversion rate is judged.
36
+ min_conversion_rate_pct:
37
+ default: 2
38
+ description: Conversion rate percent below which a well-seen prompt gets flagged.
39
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
40
+ notes: No generic script mode — diagnosing why a specific prompt underconverts needs judgment about UX and audience, not just a rate comparison.
@@ -0,0 +1,42 @@
1
+ id: product-qualified-lead-tracker
2
+ version: 1
3
+ name: Product-Qualified Lead (PQL) Tracker
4
+ description: >
5
+ Reviews free/trial users' in-product usage for signals that they're
6
+ ready for a sales conversation — hitting usage limits, inviting
7
+ teammates, using premium-gated features — and flags them as PQLs. Use
8
+ this if self-serve users who are clearly ready to buy only get noticed
9
+ when they email support asking how to upgrade.
10
+ category: growth
11
+ tags: [growth, pql, product-led-growth, activation]
12
+ schedule: "0 9 * * 2"
13
+ timezone: "UTC"
14
+ runner: agent-prompt
15
+ prompt: |
16
+ Review usage data for free/trial accounts from {{analytics_hint}} over
17
+ the last {{lookback_days}} days.
18
+ 1. Identify accounts showing buying-intent signals: approaching or
19
+ hitting a usage limit, inviting {{team_invite_threshold}}+ teammates,
20
+ repeatedly hitting a paywalled/premium feature, or a sustained
21
+ increase in core-feature usage.
22
+ 2. Score each candidate account as a PQL if it shows two or more of
23
+ these signals.
24
+ 3. List PQLs ranked by signal strength, with which signals triggered
25
+ the flag, so sales/success can prioritize outreach.
26
+ variables:
27
+ analytics_hint:
28
+ default: "product analytics tool (e.g. Amplitude, Mixpanel, PostHog)"
29
+ description: Where in-product usage data lives.
30
+ lookback_days:
31
+ default: 14
32
+ description: Window of usage activity to evaluate.
33
+ team_invite_threshold:
34
+ default: 2
35
+ description: Number of teammate invites within the window that counts as a buying-intent signal.
36
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
37
+ notes: >
38
+ No generic script mode — combining multiple usage signals into a
39
+ qualification judgment needs reasoning about the product's specific
40
+ activation moments. Distinct from marketing's MQL jobs (marketing-sourced
41
+ leads from campaigns/forms) — this looks at existing free/trial users'
42
+ in-product behavior instead.
@@ -0,0 +1,35 @@
1
+ id: referral-program-performance-tracker
2
+ version: 1
3
+ name: Referral Program Performance Tracker
4
+ description: >
5
+ Computes referral-to-signup and referral-to-paid conversion rates from
6
+ a referral log and flags when the program's performance drops. Use this
7
+ if a referral program launched with fanfare and nobody has checked its
8
+ numbers since.
9
+ category: growth
10
+ tags: [growth, referrals, virality, conversion]
11
+ schedule: "0 9 * * 1"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ file={{referrals_csv_path}}; min_rate={{min_conversion_rate_pct}};
16
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
17
+ total=$(tail -n +2 "$file" | wc -l | tr -d ' ');
18
+ converted=$(tail -n +2 "$file" | awk -F',' '$3=="paid" {c++} END{print c+0}');
19
+ signed_up=$(tail -n +2 "$file" | awk -F',' '$3=="signed_up" || $3=="paid" {c++} END{print c+0}');
20
+ if [ "$total" -eq 0 ]; then echo "No referrals recorded in $file"; exit 0; fi;
21
+ signup_rate=$(awk "BEGIN{printf \"%.1f\", ($signed_up/$total)*100}");
22
+ paid_rate=$(awk "BEGIN{printf \"%.1f\", ($converted/$total)*100}");
23
+ echo "Referral performance: $total referrals, ${signup_rate}% signed up, ${paid_rate}% converted to paid";
24
+ if awk "BEGIN{exit !($paid_rate < $min_rate)}"; then echo "WARNING: referral-to-paid rate below ${min_rate}%"; exit 1; fi
25
+ variables:
26
+ referrals_csv_path:
27
+ default: "./referrals.csv"
28
+ description: "Path to a CSV with header: referral_id,referrer_email,status (status is one of: pending,signed_up,paid)."
29
+ min_conversion_rate_pct:
30
+ default: 10
31
+ description: Minimum acceptable referral-to-paid conversion rate percent.
32
+ compatible_agents: [generic, claude, codex]
33
+ notes: >
34
+ Zero-token. Export referrals.csv from your referral program tool
35
+ (ReferralCandy, Rewardful, or your own tracking table).
@@ -0,0 +1,48 @@
1
+ id: trial-to-paid-conversion-rate-tracker
2
+ version: 1
3
+ name: Trial-to-Paid Conversion Rate Tracker
4
+ description: >
5
+ Computes the trial-to-paid conversion rate for recently-ended trial
6
+ cohorts and can summarize what's changed if the rate moves. Use this if
7
+ trial conversion rate is a number that only gets calculated by hand
8
+ once a quarter for a board deck, instead of being watched continuously.
9
+ category: growth
10
+ tags: [growth, trials, conversion, activation]
11
+ schedule: "0 9 1 * *"
12
+ timezone: "UTC"
13
+ runner: hybrid
14
+ command: >
15
+ file={{trials_csv_path}}; min_rate={{min_conversion_rate_pct}};
16
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
17
+ ended=$(tail -n +2 "$file" | awk -F',' '$2=="ended" {c++} END{print c+0}');
18
+ converted=$(tail -n +2 "$file" | awk -F',' '$2=="converted" {c++} END{print c+0}');
19
+ total=$((ended+converted));
20
+ if [ "$total" -eq 0 ]; then echo "No ended trials recorded in $file"; exit 0; fi;
21
+ rate=$(awk "BEGIN{printf \"%.1f\", ($converted/$total)*100}");
22
+ echo "Trial-to-paid conversion: $converted/$total (${rate}%)";
23
+ if awk "BEGIN{exit !($rate < $min_rate)}"; then echo "WARNING: conversion rate below ${min_rate}%"; exit 1; fi
24
+ prompt: |
25
+ The trial-to-paid conversion rate for the recent trial cohort in
26
+ {{trials_csv_path}} is below {{min_conversion_rate_pct}}%.
27
+ 1. Look at the trials that ended without converting and note any
28
+ pattern visible in the data (e.g. low usage before expiry, specific
29
+ plan tier, signup source).
30
+ 2. Suggest one or two concrete follow-ups (e.g. targeted win-back
31
+ outreach, a longer trial for a specific segment) based on what the
32
+ data shows.
33
+ script_note: >
34
+ `command` computes the trial-to-paid conversion rate with zero tokens
35
+ and flags if it's below target. `prompt` (only needed when the rate is
36
+ flagged) digs into why and suggests a fix, which needs judgment.
37
+ variables:
38
+ trials_csv_path:
39
+ default: "./trial-outcomes.csv"
40
+ description: "Path to a CSV with header: user_email,outcome (outcome is 'ended' for trials that expired without converting or 'converted' for trials that became paid)."
41
+ min_conversion_rate_pct:
42
+ default: 15
43
+ description: Minimum acceptable trial-to-paid conversion rate percent.
44
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
45
+ notes: >
46
+ Distinct from trial-expiring-nudge (per-user nudge before expiry) —
47
+ this tracks the aggregate conversion rate after trials have already
48
+ ended, as a health metric rather than an outreach trigger.
@@ -0,0 +1,46 @@
1
+ id: winback-reactivation-campaign-tracker
2
+ version: 1
3
+ name: Win-Back Reactivation Campaign Tracker
4
+ description: >
5
+ Tracks how canceled customers targeted by a win-back campaign are
6
+ responding, and can draft the next outreach touch for non-responders.
7
+ Use this if a win-back campaign has ever gone out once and then nobody
8
+ followed up with the customers who didn't respond.
9
+ category: growth
10
+ tags: [growth, winback, reactivation, churn]
11
+ schedule: "0 9 * * 1"
12
+ timezone: "UTC"
13
+ runner: hybrid
14
+ command: >
15
+ file={{winback_csv_path}}; wait_days={{followup_wait_days}};
16
+ [ -f "$file" ] || { echo "ERROR: $file not found"; exit 1; };
17
+ today=$(date +%s);
18
+ tail -n +2 "$file" | while IFS=',' read -r email canceled_date sent_date status; do
19
+ [ "$status" = "reactivated" ] || [ "$status" = "declined" ] && continue;
20
+ s_epoch=$(date -d "$sent_date" +%s 2>/dev/null || date -j -f "%Y-%m-%d" "$sent_date" +%s 2>/dev/null);
21
+ [ -z "$s_epoch" ] && continue;
22
+ days=$(( (today-s_epoch)/86400 ));
23
+ if [ "$days" -ge "$wait_days" ]; then echo "NO RESPONSE: $email — canceled $canceled_date, win-back sent $days day(s) ago"; fi
24
+ done
25
+ prompt: |
26
+ For each customer flagged as "NO RESPONSE" (from {{winback_csv_path}},
27
+ win-back email sent {{followup_wait_days}}+ days ago with no reply):
28
+ 1. Draft a short, low-pressure follow-up touch — a different angle than
29
+ the first email (e.g. a specific improvement made since they left,
30
+ or a direct ask for feedback on why they canceled).
31
+ 2. Keep it under 100 words. Don't send — draft only.
32
+ script_note: >
33
+ `command` lists which canceled customers were sent a win-back email and
34
+ haven't responded, zero tokens. `prompt` drafts the follow-up touch for
35
+ each, which needs judgment on tone and angle.
36
+ variables:
37
+ winback_csv_path:
38
+ default: "./winback-campaign.csv"
39
+ description: "Path to a CSV with header: email,canceled_date,winback_sent_date,status (status is one of: sent,reactivated,declined)."
40
+ followup_wait_days:
41
+ default: 10
42
+ description: Days to wait after the win-back email before flagging for a follow-up touch.
43
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
44
+ notes: >
45
+ You maintain winback-campaign.csv yourself (update status as customers
46
+ respond) — doesn't integrate with any CRM/ESP directly.
@@ -0,0 +1,43 @@
1
+ id: adr-revpar-tracker
2
+ version: 1
3
+ name: ADR and RevPAR Tracker
4
+ description: >
5
+ Calculates yesterday's average daily rate (ADR) and revenue per
6
+ available room (RevPAR) from your rooms-sold export and flags a drop
7
+ against your target. Use this if a soft revenue night has ever gone
8
+ unnoticed for a week because nobody was watching the daily numbers,
9
+ only the monthly total.
10
+ category: hospitality
11
+ tags: [hospitality, revenue-management, adr, revpar]
12
+ schedule: "0 6 * * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' -v target_adr="{{target_adr_usd}}" -v target_revpar="{{target_revpar_usd}}" -v rooms="{{total_rooms}}" '
17
+ NR==1 {next}
18
+ { rooms_sold += 1; revenue += $2 }
19
+ END {
20
+ if (rooms_sold > 0) {
21
+ adr = revenue / rooms_sold;
22
+ revpar = revenue / rooms;
23
+ printf "ADR: $%.2f (target $%.2f) | RevPAR: $%.2f (target $%.2f) | rooms sold: %d/%d\n", adr, target_adr, revpar, target_revpar, rooms_sold, rooms;
24
+ if (adr < target_adr) printf "LOW ADR: $%.2f below target $%.2f\n", adr, target_adr;
25
+ if (revpar < target_revpar) printf "LOW REVPAR: $%.2f below target $%.2f\n", revpar, target_revpar;
26
+ } else print "WARNING: no rooms sold recorded for the date";
27
+ }
28
+ ' "{{rooms_sold_csv}}"
29
+ variables:
30
+ rooms_sold_csv:
31
+ default: "./rooms-sold-yesterday.csv"
32
+ description: "CSV with header row, columns: room_number,rate_paid_usd — one row per room sold yesterday."
33
+ total_rooms:
34
+ default: 100
35
+ description: Total available rooms in the property (denominator for RevPAR).
36
+ target_adr_usd:
37
+ default: 175
38
+ description: Target average daily rate in USD.
39
+ target_revpar_usd:
40
+ default: 120
41
+ description: Target revenue per available room in USD.
42
+ compatible_agents: [generic, claude, codex]
43
+ notes: Export the rooms-sold CSV from your PMS nightly before this runs; ADR = revenue / rooms sold, RevPAR = revenue / total available rooms.
@@ -0,0 +1,21 @@
1
+ id: cancellation-rate-spike-check
2
+ version: 1
3
+ name: Cancellation Rate Spike Check
4
+ description: >
5
+ Checks yesterday's reservation cancellation rate against your trailing
6
+ baseline and flags a spike. Use this if a booking-engine glitch, a rate
7
+ error, or bad local news has ever driven a wave of cancellations that
8
+ wasn't caught until the week's occupancy numbers came in soft.
9
+ category: hospitality
10
+ tags: [hospitality, reservations, cancellations, revenue-management]
11
+ schedule: "0 8 * * *"
12
+ timezone: "UTC"
13
+ runner: shell
14
+ command: >
15
+ psql "{{database_url}}" -t -c "select round(100.0 * sum(case when status = 'cancelled' then 1 else 0 end) / nullif(count(*), 0), 1) from reservations where booked_date = current_date - interval '1 day';"
16
+ variables:
17
+ database_url:
18
+ default: "postgres://user:pass@host:5432/db"
19
+ description: Connection string for the reservations database.
20
+ compatible_agents: [generic, claude, codex]
21
+ notes: Assumes a `reservations` table with `status` and `booked_date` columns tracking same-day cancellations against bookings made that day — adjust the query for your PMS schema and compare the printed rate against your normal baseline manually. Complements reservation-noshow-check, which tracks no-shows rather than advance cancellations.
@@ -0,0 +1,40 @@
1
+ id: group-booking-space-utilization-check
2
+ version: 1
3
+ name: Group Booking and Event Space Utilization Check
4
+ description: >
5
+ Reviews upcoming event space bookings against total bookable hours for
6
+ the week and flags rooms sitting mostly empty, plus any booking missing
7
+ a signed contract or deposit close to the event date. Use this if event
8
+ space has ever gone underbooked for weeks with nobody noticing until
9
+ the sales team reviewed the quarter.
10
+ category: hospitality
11
+ tags: [hospitality, events, group-sales, revenue-management]
12
+ schedule: "0 7 * * 1"
13
+ timezone: "UTC"
14
+ runner: agent-prompt
15
+ prompt: |
16
+ Pull the event space booking calendar from {{events_system}} for the
17
+ next {{lookback_weeks}} weeks.
18
+ 1. Calculate utilization percentage (booked hours / bookable hours) per
19
+ event space/room, and flag any space below {{min_utilization_pct}}%.
20
+ 2. List any booking within {{deposit_deadline_days}} days of its event
21
+ date that's still missing a signed contract or deposit.
22
+ 3. Note any space with a pattern of last-minute cancellations, since
23
+ that's worth a stricter deposit policy.
24
+ 4. Suggest one action for the most underbooked space (promo, package
25
+ deal, or reallocating it to guest room inventory for that period).
26
+ variables:
27
+ events_system:
28
+ default: "your events/catering management system"
29
+ description: System tracking event space bookings (e.g. "Cvent", "Tripleseat", "Delphi").
30
+ lookback_weeks:
31
+ default: 4
32
+ description: How many weeks ahead to review bookings.
33
+ min_utilization_pct:
34
+ default: 40
35
+ description: Utilization percentage below which a space is flagged as underbooked.
36
+ deposit_deadline_days:
37
+ default: 14
38
+ description: Days before an event that a missing contract/deposit becomes urgent.
39
+ compatible_agents: [claude, codex, hermes, openclaw, generic]
40
+ notes: Utilization targets vary a lot by property size and market — adjust min_utilization_pct to your historical baseline rather than a generic number.
@@ -0,0 +1,34 @@
1
+ id: guest-complaint-sla-tracker
2
+ version: 1
3
+ name: Guest Complaint Resolution SLA Tracker
4
+ description: >
5
+ Checks logged guest complaints (not maintenance requests) against your
6
+ resolution SLA and flags any still open past the deadline. Use this if
7
+ a service complaint has ever sat unresolved long enough that the guest
8
+ checked out still angry, instead of getting a recovery gesture while
9
+ they were still on property.
10
+ category: hospitality
11
+ tags: [hospitality, guest-experience, complaints, sla]
12
+ schedule: "0 */4 * * *"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' -v hours="{{sla_hours}}" '
17
+ NR==1 {next}
18
+ $3 == "open" {
19
+ cmd = "date -d \"" $2 "\" +%s 2>/dev/null || date -j -f \"%Y-%m-%d %H:%M\" \"" $2 "\" +%s 2>/dev/null";
20
+ cmd | getline logged_epoch; close(cmd);
21
+ "date +%s" | getline now_epoch; close("date +%s");
22
+ age_hours = (now_epoch - logged_epoch) / 3600;
23
+ if (age_hours >= hours) printf "OVERDUE: room %s — %s (open %d hrs, category: %s)\n", $1, $4, age_hours, $5;
24
+ }
25
+ ' "{{complaints_csv_path}}"
26
+ variables:
27
+ complaints_csv_path:
28
+ default: "./guest-complaints.csv"
29
+ description: "CSV with columns: room_number,logged_at (YYYY-MM-DD HH:MM),status (open/closed),summary,category (noise/cleanliness/service/billing/other)."
30
+ sla_hours:
31
+ default: 2
32
+ description: Target hours to resolve or acknowledge a guest complaint before it's flagged overdue.
33
+ compatible_agents: [generic, claude, codex]
34
+ notes: Distinct from guest-maintenance-request-backlog-check — this tracks service/experience complaints logged by front desk or guest services, not physical repair tickets.
@@ -0,0 +1,41 @@
1
+ id: guest-satisfaction-score-monitor
2
+ version: 1
3
+ name: Guest Satisfaction Score Monitor
4
+ description: >
5
+ Tracks your rolling average guest satisfaction score (post-stay survey
6
+ or aggregated review rating) and flags a meaningful drop against your
7
+ trailing baseline. Use this if satisfaction has ever slid gradually
8
+ over several weeks without triggering any single alarm, until it shows
9
+ up as a rate hit in the OTA ranking algorithm.
10
+ category: hospitality
11
+ tags: [hospitality, guest-experience, satisfaction, reputation]
12
+ schedule: "0 9 * * 1"
13
+ timezone: "UTC"
14
+ runner: shell
15
+ command: >
16
+ awk -F',' -v window="{{trailing_weeks}}" -v drop="{{alert_drop_points}}" '
17
+ NR==1 {next}
18
+ { scores[NR-1]=$2; dates[NR-1]=$1; n=NR-1 }
19
+ END {
20
+ if (n < window*2) { print "Not enough data yet for a trailing comparison"; exit 0; }
21
+ recent_sum=0; baseline_sum=0;
22
+ for (i=n-window+1; i<=n; i++) recent_sum += scores[i];
23
+ for (i=n-window*2+1; i<=n-window; i++) baseline_sum += scores[i];
24
+ recent_avg = recent_sum/window; baseline_avg = baseline_sum/window;
25
+ diff = baseline_avg - recent_avg;
26
+ printf "Recent %d-week avg: %.2f | Prior %d-week avg: %.2f\n", window, recent_avg, window, baseline_avg;
27
+ if (diff >= drop) printf "ALERT: satisfaction dropped %.2f points (threshold %.2f)\n", diff, drop;
28
+ }
29
+ ' "{{weekly_scores_csv}}"
30
+ variables:
31
+ weekly_scores_csv:
32
+ default: "./weekly-satisfaction-scores.csv"
33
+ description: "CSV with header row, columns: week_start_date,avg_score — one row per week, oldest first, ordered chronologically."
34
+ trailing_weeks:
35
+ default: 4
36
+ description: Number of weeks in each comparison window (recent vs. prior).
37
+ alert_drop_points:
38
+ default: 0.3
39
+ description: Point drop (on your survey's scale) between the two windows that triggers an alert.
40
+ compatible_agents: [generic, claude, codex]
41
+ notes: Score scale depends on your source (5-point survey, 10-point NPS-style, or 100-point aggregate) — keep alert_drop_points proportional to whatever scale weekly-satisfaction-scores.csv uses. Complements guest-review-response-check, which handles individual review replies rather than the trend.