Mood Tracking
Mood Tracking captures daily team sentiment through quick check-ins, providing leadership with a pulse on team morale. Submissions can be named or anonymous (with cryptographic privacy guarantees), and results are aggregated into trend lines and distribution charts for discussion during AIC/TIER meetings.
People are the "P" in SQCDP. This module makes the human dimension of operational performance visible and actionable.
Overview
Team sentiment is a leading indicator of operational problems. When morale drops, quality and productivity follow. Yet most organizations have no systematic way to measure and track it. ProBeya's Mood Tracking module provides a lightweight, daily mechanism to capture how team members feel and surface trends before they become crises.
Getting Started
- Navigate to your board and open the Mood panel.
- Each team member clicks the mood icon and selects a level from 1 (very low) to 5 (very high).
- Optionally add a reason category and a short comment (max 280 characters).
- Choose whether to submit as named or anonymous.
- View the daily summary distribution and historical trend on the dashboard.
How It Works
Mood Submission
Each mood entry captures:
| Field | Type | Constraints | Description |
|---|---|---|---|
| Board ID | string | Required | The board this entry belongs to |
| Date | string | Required | The date of the mood entry (YYYY-MM-DD) |
| Mood Level | integer | 1-5, required | 1 = very unhappy, 5 = very happy |
| Reason Category | string | Max 100 chars, optional | Tag explaining the mood (e.g., "workload", "recognition", "tools") |
| Comment | string | Max 280 chars, optional | Free-text note with context |
| Anonymous | boolean | Default false | Whether to hide the submitter's identity |
Submissions are deduplicated per user per board per day. If a user submits twice on the same day, the second submission updates the first (upsert behavior). This prevents gaming while allowing people to change their mind throughout the day.
Anonymous Privacy
When a user submits anonymously, their userId is not stored in the database. Instead, a SHA-256 hash of userId + boardId + date is generated and stored as anonymousHash. This hash:
- Cannot be reversed to identify the user (SHA-256 is a one-way function)
- Still enables deduplication: same user, same board, same day produces the same hash
- Is unique per board and date: prevents cross-board correlation attacks
- Uses the format:
SHA256("{userId}:{boardId}:{date}")
The anonymousHash is used as the conflict target for the upsert operation when isAnonymous is true, while userId is used when submitting as named.
Daily Summary
The getDailySummary endpoint returns aggregated data for a specific board and date:
{
distribution: {
1: number; // Count of mood level 1
2: number; // Count of mood level 2
3: number; // Count of mood level 3
4: number; // Count of mood level 4
5: number; // Count of mood level 5
};
total: number; // Total number of respondents
average: number; // Mean mood level (rounded to 2 decimal places), or null if no entries
}
This powers the mood distribution bar chart displayed during TIER meetings, giving the facilitator an instant visual of team sentiment.
Trend Analysis
The getTrend endpoint returns daily averages over a configurable date range:
Array<{
date: string; // YYYY-MM-DD
avgMood: number; // Average mood level (rounded to 2 decimal places)
count: number; // Number of submissions that day
}>
Results are ordered chronologically and grouped by date using PostgreSQL's avg() aggregate. This data powers sparkline and trend-line visualizations, enabling teams to track whether overall sentiment is improving, stable, or declining over weeks and months.
Board Scoping
Mood tracking is scoped to a board. Each board has its own mood panel with independent submissions and analytics. There is no global mood view — sentiment is always contextualized to a specific team and their work area.
Before accepting a mood submission, the router verifies that the target board exists and belongs to the caller's organization, preventing cross-tenant data injection.
Configuration
- Mood levels: Fixed 1-5 scale (not configurable per organization)
- Reason categories: Free-text field; teams should agree on standard categories for cross-board comparison
- Comment length: Maximum 280 characters (Twitter-length constraint for brevity)
- Deduplication: Automatic per user per board per day — cannot be disabled
Permissions
| Action | Required Role |
|---|---|
| Submit a mood entry | Any board member |
| View daily summary | Any board member |
| View trend analytics | Board manager or admin |
Mood data is not editable by managers. Only the submitting user can update their own entry (by resubmitting on the same day). This prevents data manipulation and maintains trust in the anonymous submission system.
API Reference
| Procedure | Type | Description |
|---|---|---|
mood.submit | Mutation | Record a mood entry (named or anonymous, upsert per day) |
mood.getDailySummary | Query | Get distribution and average for a board/date |
mood.getTrend | Query | Get daily averages over a date range for trend visualization |
Tips & Best Practices
Include mood submission as the first step of the TIER meeting. When it becomes habitual, participation rates climb and the data becomes meaningful.
Never attempt to identify anonymous submissions. The trust that anonymity builds is more valuable than knowing who said what. If many people are unhappy, the trend data tells you enough.
A single bad day is noise. Three weeks of declining averages is a signal. Use the trend chart to identify sustained shifts and trigger deeper investigation.
Define a standard set of reason categories for your organization and communicate them to all teams. This enables cross-board comparison and root cause analysis.
Related Features
- KPI Boards — track mood averages as a "People" KPI
- TIER Meetings — review mood distribution during daily stand-ups
- Kaizen Ideas — low mood trends may surface improvement opportunities
- Shift Handover — mood context can complement shift communication