Employee Feedback Analyzer

Analyze employee surveys, feedback, and reviews to identify themes, sentiment, and actionable insights.

This workflow processes anonymous feedback to surface organizational health metrics and improvement opportunities while maintaining privacy.

Implementation

1import { relay } from "@relayplane/workflows";
2
3const result = await relay
4 .workflow("employee-feedback")
5
6 // Step 1: Categorize feedback themes
7 .step("categorize-themes")
8 .with("openai:gpt-4o")
9 .prompt(`Categorize this employee feedback by theme:
10
11{{feedbackResponses}}
12
13Theme categories:
14- Leadership & Management
15- Compensation & Benefits
16- Work-Life Balance
17- Career Development
18- Team Collaboration
19- Company Culture
20- Tools & Resources
21- Communication
22- Diversity & Inclusion
23- Remote Work / Office
24
25For each response:
26- Primary theme
27- Secondary themes (if any)
28- Specific sub-topic
29
30Return theme distribution summary.`)
31
32 // Step 2: Analyze sentiment
33 .step("sentiment-analysis")
34 .with("anthropic:claude-3.5-sonnet")
35 .depends("categorize-themes")
36 .prompt(`Analyze sentiment across feedback:
37
38Feedback: {{feedbackResponses}}
39Themes: {{categorize-themes.output}}
40
41For each theme:
42- Sentiment score (-1 to +1)
43- Volume (number of mentions)
44- Trend vs previous period (if available): {{previousData}}
45- Key positive phrases
46- Key negative phrases
47
48Also identify:
49- Overall organization sentiment
50- Most improved areas
51- Declining areas (red flags)`)
52
53 // Step 3: Extract specific concerns
54 .step("extract-concerns")
55 .with("anthropic:claude-3.5-sonnet")
56 .depends("categorize-themes", "sentiment-analysis")
57 .prompt(`Extract specific concerns and suggestions:
58
59Feedback: {{feedbackResponses}}
60Themes: {{categorize-themes.output}}
61Sentiment: {{sentiment-analysis.output}}
62
63For top negative themes, identify:
64- Root cause patterns
65- Specific examples (anonymized)
66- Frequency of mention
67- Which teams/departments affected
68
69Also extract:
70- Concrete employee suggestions
71- Wins to celebrate
72- Quick wins (easy fixes)
73
74Be specific enough to act on.`)
75
76 // Step 4: Generate recommendations
77 .step("recommendations")
78 .with("openai:gpt-4o")
79 .depends("categorize-themes", "sentiment-analysis", "extract-concerns")
80 .prompt(`Generate actionable recommendations:
81
82Analysis: {{extract-concerns.output}}
83Sentiment: {{sentiment-analysis.output}}
84
85For each major issue:
86- Recommended action
87- Owner (HR, Leadership, Managers, specific team)
88- Effort level (low/medium/high)
89- Expected impact
90- Success metric
91
92Prioritize by:
931. Impact on retention
942. Quick wins first
953. Systemic issues that affect multiple themes`)
96
97 // Step 5: Generate executive report
98 .step("executive-report")
99 .with("anthropic:claude-3.5-sonnet")
100 .depends("categorize-themes", "sentiment-analysis", "extract-concerns", "recommendations")
101 .prompt(`Create executive feedback report:
102
103Themes: {{categorize-themes.output}}
104Sentiment: {{sentiment-analysis.output}}
105Concerns: {{extract-concerns.output}}
106Recommendations: {{recommendations.output}}
107
108Survey: {{surveyName}}
109Period: {{surveyPeriod}}
110Response Rate: {{responseRate}}
111
112Format:
113# Employee Feedback Report - {{surveyPeriod}}
114
115## Executive Summary
116- Key metrics (eNPS, response rate)
117- Top 3 wins
118- Top 3 concerns
119
120## Sentiment Overview
121- Overall score and trend
122- By theme breakdown
123
124## Key Themes
125
126### 🟢 Positive Themes
127- What employees love
128
129### 🟡 Neutral/Mixed
130- Areas with polarized feedback
131
132### 🔴 Concerns
133- Issues requiring attention
134
135## Recommended Actions
136- Prioritized action plan
137- Quick wins
138- Strategic initiatives
139
140## Next Steps
141- Follow-up timeline
142- Communication plan
143
144Data-driven, actionable, balanced tone.`)
145
146 .run({
147 feedbackResponses: surveyResponses,
148 previousData: lastQuarterData,
149 surveyName: "Q4 2024 Engagement Survey",
150 surveyPeriod: "October-November 2024",
151 responseRate: "78%",
152 });
153
154// Send to HR leadership
155await sendEmail({
156 to: ["hr-leadership@company.com"],
157 subject: "Q4 Employee Feedback Analysis",
158 body: result.steps["executive-report"].output,
159});
160
161// Create Jira initiatives for recommendations
162const recommendations = JSON.parse(result.steps["recommendations"].output);
163for (const rec of recommendations.filter(r => r.priority === "high")) {
164 await createInitiative({
165 title: rec.action,
166 owner: rec.owner,
167 epic: "Employee Experience",
168 description: rec.details,
169 });
170}

Anonymous Survey Integration

1// Culture Amp / Lattice integration
2import { relay } from "@relayplane/workflows";
3
4async function analyzeSurveyResults(surveyId: string) {
5 // Fetch anonymous responses (no PII)
6 const responses = await cultureAmp.surveys.getResponses(surveyId);
7
8 // Process in aggregate - never analyze individual responses
9 const result = await relay
10 .workflow("employee-feedback")
11 .run({
12 feedbackResponses: responses.map(r => r.anonymousResponse),
13 previousData: await getPreviousSurveyData(),
14 surveyName: responses.surveyTitle,
15 });
16
17 // Create dashboard
18 await updateFeedbackDashboard({
19 surveyId,
20 themes: result.steps["categorize-themes"].output,
21 sentiment: result.steps["sentiment-analysis"].output,
22 recommendations: result.steps["recommendations"].output,
23 });
24
25 return result;
26}

Team-Level Analysis

1// Analyze by team (requires min 5 responses for anonymity)
2const teams = ["Engineering", "Sales", "Product", "Marketing"];
3const teamReports = {};
4
5for (const team of teams) {
6 const teamResponses = responses.filter(r => r.department === team);
7
8 // Skip if too few responses (anonymity protection)
9 if (teamResponses.length < 5) {
10 teamReports[team] = { status: "insufficient_responses" };
11 continue;
12 }
13
14 const analysis = await relay
15 .workflow("employee-feedback")
16 .run({
17 feedbackResponses: teamResponses,
18 surveyPeriod: "Q4 2024",
19 });
20
21 teamReports[team] = {
22 sentiment: analysis.steps["sentiment-analysis"].output,
23 concerns: analysis.steps["extract-concerns"].output,
24 };
25}
26
27// Compare teams
28await generateTeamComparison(teamReports);

Sample Output

1# Employee Feedback Report - Q4 2024
2
3## Executive Summary
4**Response Rate:** 78% (312/400 employees)
5**eNPS:** 32 (up from 28 in Q3)
6**Overall Sentiment:** +0.42 (Positive)
7
8### Top Wins
91. **Remote work flexibility** - 89% satisfaction rate
102. **Team collaboration** - "Best team I've worked with" mentioned 47 times
113. **Learning opportunities** - New L&D program rated highly
12
13### Top Concerns
141. **Career progression clarity** - Unclear paths to promotion
152. **Compensation transparency** - Want more market data
163. **Meeting overload** - "Too many meetings" mentioned 34 times
17
18## Sentiment by Theme
19
20| Theme | Score | Trend | Volume |
21|-------|-------|-------|--------|
22| Team Collaboration | +0.72 | ↑ | 156 |
23| Remote Work | +0.68 | → | 134 |
24| Company Culture | +0.54 | ↑ | 89 |
25| Work-Life Balance | +0.31 | ↓ | 78 |
26| Career Development | -0.22 | ↓ | 112 |
27| Compensation | -0.31 | → | 94 |
28
29## 🔴 Key Concerns
30
31### Career Development (-0.22)
32**Root Causes:**
33- No documented promotion criteria
34- Limited visibility into growth opportunities
35- Managers not trained on career conversations
36
37**Employee Quotes:**
38- "I don't know what I need to do to get promoted"
39- "My manager doesn't discuss my career goals"
40- "No clear path from IC to management"
41
42**Affected Teams:** Engineering (35%), Product (28%), Sales (22%)
43
44### Meeting Overload
45**Data:**
46- Average 18 meetings/week per employee
47- 34 mentions of "too many meetings"
48- Peak meeting times: 10am-12pm, 2-4pm
49
50**Employee Quotes:**
51- "No time for deep work"
52- "Could this meeting be an email?"
53
54## Recommended Actions
55
56### Immediate (This Month)
571. **Publish promotion criteria** - Define clear requirements for each level
58 - Owner: HR + Department Heads
59 - Effort: Medium
60 - Impact: High
61
622. **Implement meeting-free focus time** - Block 9-11am Tue/Thu
63 - Owner: Leadership
64 - Effort: Low
65 - Impact: Medium
66
67### Short-term (This Quarter)
683. **Manager training on career conversations** - 2-hour workshop
69 - Owner: L&D Team
70 - Budget: $5,000
71 - Metric: Post-training survey score >4.2
72
734. **Compensation transparency initiative** - Share market data
74 - Owner: Compensation Team
75 - Timeline: February
76
77## Next Steps
78- [ ] Share report with leadership team - Nov 22
79- [ ] All-hands communication - Nov 29
80- [ ] Action planning sessions by department - Week of Dec 2
81- [ ] Follow-up pulse survey - January

Privacy Best Practices

  • Minimum response threshold: Only analyze groups of 5+ responses
  • Remove identifiers: Strip names, dates, unique phrases
  • Aggregate only: Never surface individual responses
  • Secure storage: Encrypt feedback data at rest
  • Limited access: Only HR and leadership see detailed reports
Impact: Companies using structured feedback analysis see 23% higher retention and 31% better eNPS scores on average.