Managing JIRA Efforts
This guide shows how to organize, track, and report on work efforts using jira-ticket-creator. An effort is any large body of work that may span multiple teams: products, features, initiatives, roadmap items, or quarterly goals.
What You’ll Learn
- How to organize work into efforts
- How to track progress and spot blockers
- How to coordinate across multiple teams
- How to generate reports for stakeholders
- How to apply this to real situations like quarterly goals or feature launches
Concepts
What is an Effort?
An effort is a body of work that:
- Typically owns an Epic or Feature in JIRA
- May have subtasks, stories, and tasks under it
- Involves one or more teams
- Has business value or goals
- Takes weeks or months to complete
Examples of Efforts
- Product Feature: “Mobile App Redesign” (design, frontend, backend, QA)
- Initiative: “Payment System Modernization” (backend team focus)
- Quarterly Goal: “Q1 2025 Platform Reliability” (infrastructure, operations)
- Customer Delivery: “Enterprise Onboarding” (sales, backend, support)
- Technical Debt: “API v2 Migration” (backend, operations)
Setting Up an Effort
Step 1: Create or Identify Parent Epic in JIRA
First, create an Epic in JIRA or identify an existing one:
# Example: Create epic in JIRA web UI
# Title: "Mobile App Redesign"
# Key: PROJ-1000
# Link all work to this epic
Step 2: Define Your Effort Locally
Create a local directory for effort tracking:
mkdir -p ~/jira-efforts/2025
cd ~/jira-efforts/2025
Step 3: Create Effort Configuration File
Create a file documenting the effort:
cat > mobile-redesign.sh << 'EOF'
#!/bin/bash
# Mobile App Redesign Effort Configuration
EFFORT_NAME="mobile-redesign"
EFFORT_EPIC="PROJ-1000"
EFFORT_GOAL="Redesign mobile app for iOS and Android"
START_DATE="2025-02-01"
TARGET_DATE="2025-04-30"
# Teams involved
TEAMS=("frontend" "backend" "qa")
# Key metrics
echo "Setting up effort: $EFFORT_NAME"
echo "Epic: $EFFORT_EPIC"
echo "Target completion: $TARGET_DATE"
EOF
chmod +x mobile-redesign.sh
Step 4: Import Effort and Its Children
Import the epic and all child tickets:
jira-ticket-creator import --jql "key = PROJ-1000" \
--map-project mobile-redesign
Verify all children were imported:
jira-ticket-creator search --jql "parent = PROJ-1000" --format table
Step 5: View Initial Status
Get a snapshot of the effort:
# See all tickets in the effort
jira-ticket-creator search --jql "parent = PROJ-1000"
# View by ticket type
jira-ticket-creator search --jql "parent = PROJ-1000 AND type = Task"
# View by assignee
jira-ticket-creator search --jql "parent = PROJ-1000 AND assignee is not EMPTY"
Tracking Effort Progress
Daily Progress Check
cat > check-effort-daily.sh << 'EOF'
#!/bin/bash
# Check daily progress on effort
EFFORT="mobile-redesign"
EPIC="PROJ-1000"
DATE=$(date +%Y-%m-%d)
echo "EFFORT PROGRESS: $EFFORT"
echo "Date: $DATE"
echo ""
# Status breakdown
echo "Status breakdown:"
jira-ticket-creator search --jql "parent = $EPIC" | awk '{
if ($3 == "To") print " To Do: " ++to_do
else if ($3 == "In") print " In Progress: " ++in_progress
else if ($3 == "Done") print " Done: " ++done
}
END {
print " Total: " to_do + in_progress + done
}'
echo ""
echo "RECENTLY UPDATED:"
jira-ticket-creator search --jql "parent = $EPIC AND updated >= -1d" --format table
echo ""
echo "BLOCKED ITEMS:"
jira-ticket-creator search --jql "parent = $EPIC AND status = Blocked" --format table
EOF
chmod +x check-effort-daily.sh
./check-effort-daily.sh
Weekly Progress Report
cat > effort-weekly-report.sh << 'EOF'
#!/bin/bash
# Generate weekly effort report
EFFORT="mobile-redesign"
EPIC="PROJ-1000"
WEEK=$(date +%Y-W%V)
REPORT_DIR="reports/$EFFORT/$WEEK"
mkdir -p "$REPORT_DIR"
echo "=== WEEKLY PROGRESS REPORT ==="
echo "Effort: $EFFORT"
echo "Week: $WEEK"
echo ""
# 1. Completed this week
echo "1. COMPLETED THIS WEEK"
jira-ticket-creator search --jql "parent = $EPIC AND status = Done AND updated >= -7d" \
--format table | tee "$REPORT_DIR/completed.txt"
COMPLETED=$(wc -l < "$REPORT_DIR/completed.txt")
echo "Total: $COMPLETED tickets"
echo ""
# 2. Currently in progress
echo "2. IN PROGRESS ($(date))"
jira-ticket-creator search --jql "parent = $EPIC AND status = 'In Progress'" \
--format table | tee "$REPORT_DIR/in-progress.txt"
echo ""
# 3. Blocked or at risk
echo "3. BLOCKED/AT RISK"
jira-ticket-creator search --jql "parent = $EPIC AND (status = Blocked OR priority = Critical)" \
--format table | tee "$REPORT_DIR/blocked.txt"
echo ""
# 4. By assignee (who's working on what)
echo "4. WORKLOAD BY PERSON"
jira-ticket-creator search --jql "parent = $EPIC AND assignee is not EMPTY" \
--format json | jq -r '.[] | .fields.assignee.name' | \
sort | uniq -c | tee "$REPORT_DIR/assignee-summary.txt"
echo ""
# 5. Visual gantt chart
echo "Generating visual gantt chart..."
jira-ticket-creator gantt --format html --output "$REPORT_DIR/gantt.html"
echo "Report saved to: $REPORT_DIR"
ls -lh "$REPORT_DIR"
EOF
chmod +x effort-weekly-report.sh
./effort-weekly-report.sh
Multi-Team Efforts
When an effort spans multiple teams, organize by team within the effort.
Step 1: Import Effort for Each Team’s Perspective
# Import same epic but organize by team
jira-ticket-creator import --jql "key = PROJ-1000" --map-project "mobile-redesign"
# This maps parent + all children to "mobile-redesign"
# All team members see same tickets under this project
Step 2: Track Team Allocations
cat > effort-team-allocation.sh << 'EOF'
#!/bin/bash
# Show how each team is allocated to this effort
EFFORT="mobile-redesign"
EPIC="PROJ-1000"
echo "=== EFFORT ALLOCATION BY TEAM ==="
echo ""
# Frontend team allocation
echo "FRONTEND TEAM:"
jira-ticket-creator search --jql "parent = $EPIC AND labels = frontend" \
--format table
echo ""
# Backend team allocation
echo "BACKEND TEAM:"
jira-ticket-creator search --jql "parent = $EPIC AND labels = backend" \
--format table
echo ""
# QA team allocation
echo "QA TEAM:"
jira-ticket-creator search --jql "parent = $EPIC AND labels = qa" \
--format table
echo ""
# Unassigned team work
echo "UNASSIGNED (needs assignment):"
jira-ticket-creator search --jql "parent = $EPIC AND assignee is EMPTY" \
--format table
EOF
chmod +x effort-team-allocation.sh
./effort-team-allocation.sh
Step 3: Review Team Dependencies
# Show tickets that depend on other tickets
cat > effort-dependencies.sh << 'EOF'
#!/bin/bash
EPIC="PROJ-1000"
echo "=== EFFORT DEPENDENCIES ==="
echo ""
echo "BLOCKING OTHER TICKETS:"
jira-ticket-creator search --jql "parent = $EPIC AND linked = Blocks" --format table
echo ""
echo "BLOCKED BY OTHER TICKETS:"
jira-ticket-creator search --jql "parent = $EPIC AND linked = 'is blocked by'" --format table
EOF
chmod +x effort-dependencies.sh
./effort-dependencies.sh
Effort Reporting
Health Check Dashboard
cat > effort-health-check.sh << 'EOF'
#!/bin/bash
# Quick health check of effort status
EFFORT="mobile-redesign"
EPIC="PROJ-1000"
echo "EFFORT HEALTH CHECK"
echo "==================="
echo "$EFFORT"
echo "$(date +%Y-%m-%d)"
echo ""
# Get raw counts
TOTAL=$(jira-ticket-creator search --jql "parent = $EPIC" | wc -l)
DONE=$(jira-ticket-creator search --jql "parent = $EPIC AND status = Done" | wc -l)
IN_PROGRESS=$(jira-ticket-creator search --jql "parent = $EPIC AND status = 'In Progress'" | wc -l)
TO_DO=$(jira-ticket-creator search --jql "parent = $EPIC AND status = 'To Do'" | wc -l)
BLOCKED=$(jira-ticket-creator search --jql "parent = $EPIC AND status = Blocked" | wc -l)
# Calculate percentages
PERCENT_DONE=$((DONE * 100 / TOTAL))
PERCENT_IN_PROGRESS=$((IN_PROGRESS * 100 / TOTAL))
# Progress bar
FILLED=$((PERCENT_DONE / 10))
EMPTY=$((10 - FILLED))
PROGRESS_BAR=$(printf '█%.0s' $(seq 1 $FILLED))$(printf '░%.0s' $(seq 1 $EMPTY))
echo "OVERALL PROGRESS: $PERCENT_DONE%"
echo "$PROGRESS_BAR"
echo ""
echo "Ticket status:"
echo " Done: $DONE/$TOTAL ($PERCENT_DONE%)"
echo " In Progress: $IN_PROGRESS/$TOTAL ($PERCENT_IN_PROGRESS%)"
echo " To Do: $TO_DO/$TOTAL"
echo " Blocked: $BLOCKED"
echo ""
# Risk indicators
echo "Risks and concerns:"
if [ $BLOCKED -gt 0 ]; then
echo " $BLOCKED blocked tickets"
jira-ticket-creator search --jql "parent = $EPIC AND status = Blocked" --format table
fi
UNASSIGNED=$(jira-ticket-creator search --jql "parent = $EPIC AND assignee is EMPTY" | wc -l)
if [ $UNASSIGNED -gt 0 ]; then
echo " $UNASSIGNED unassigned tickets"
fi
CRITICAL=$(jira-ticket-creator search --jql "parent = $EPIC AND priority = Critical" | wc -l)
if [ $CRITICAL -gt 0 ]; then
echo " $CRITICAL critical priority tickets"
fi
echo ""
echo "Team status:"
jira-ticket-creator team summary --ticket $EPIC
EOF
chmod +x effort-health-check.sh
./effort-health-check.sh
Visual Gantt Chart for Effort
# Generate interactive HTML gantt chart for effort
jira-ticket-creator gantt --format html --output mobile-redesign-gantt.html
open mobile-redesign-gantt.html
Export Effort Data for Stakeholders
# Export to JSON for analysis
jira-ticket-creator search --jql "parent = PROJ-1000" --format json > effort-data.json
# Export to CSV for Excel
jira-ticket-creator search --jql "parent = PROJ-1000" --format csv > effort-data.csv
# Export to Markdown for GitHub/Confluence
jira-ticket-creator query --jql "parent = PROJ-1000" --format markdown > effort-summary.md
Real-World Scenarios
Scenario 1: Quarterly OKR (Goal Tracking)
#!/bin/bash
# Track quarterly OKR as effort
# Setup
mkdir -p ~/efforts/Q1-2025/okr-payment-systems
cd ~/efforts/Q1-2025/okr-payment-systems
# Quarterly OKR Epic in JIRA: PROJ-2000
# Goal: Modernize payment processing system
# Leads: John (backend), Jane (QA)
# Step 1: Import the goal/epic
jira-ticket-creator import --jql "key = PROJ-2000" --map-project "q1-payment-modernization"
# Step 2: Daily sync (runs each morning)
cat > daily-sync.sh << 'EOF'
#!/bin/bash
jira-ticket-creator search --jql "parent = PROJ-2000 AND updated >= -1d" --format table
echo ""
echo "URGENT BLOCKERS:"
jira-ticket-creator search --jql "parent = PROJ-2000 AND status = Blocked"
EOF
# Step 3: Weekly leadership review
cat > weekly-executive-summary.sh << 'EOF'
#!/bin/bash
DATE=$(date +%Y-%m-%d)
echo "Q1 PAYMENT SYSTEMS - Weekly Update - $DATE"
# Progress
echo "Progress:"
jira-ticket-creator search --jql "parent = PROJ-2000" | awk '
{
if ($3 ~ /Done/) done++
if ($3 ~ /Progress/) progress++
if ($3 ~ /To/) todo++
}
END { print " Done: " done, " In Progress: " progress, " To Do: " todo }
'
# Key metrics
echo ""
echo "Key Metrics:"
echo " On track items: $(jira-ticket-creator search --jql 'parent = PROJ-2000 AND priority != Critical' | wc -l)"
echo " At risk items: $(jira-ticket-creator search --jql 'parent = PROJ-2000 AND (priority = Critical OR status = Blocked)' | wc -l)"
# Next steps
echo ""
echo "Next Steps:"
jira-ticket-creator search --jql "parent = PROJ-2000 AND status = 'To Do' AND priority = High" --format table
EOF
chmod +x daily-sync.sh weekly-executive-summary.sh
# Step 4: Run reviews
./daily-sync.sh
./weekly-executive-summary.sh
Scenario 2: Cross-Functional Product Feature
#!/bin/bash
# Coordinate effort across frontend, backend, design teams
# Feature Epic: PROJ-5000 "Dark Mode Implementation"
# Step 1: Setup per-team views
jira-ticket-creator import --jql "key = PROJ-5000" --map-project "dark-mode-feature"
# Step 2: Track by team discipline
cat > feature-by-team.sh << 'EOF'
#!/bin/bash
FEATURE_EPIC="PROJ-5000"
echo "=== DARK MODE - BY TEAM ==="
echo ""
# Design tasks
echo "DESIGN TASKS:"
jira-ticket-creator search --jql "parent = $FEATURE_EPIC AND type = Task AND assignee in (designer1, designer2)" \
--format table
echo ""
# Frontend implementation
echo "FRONTEND DEVELOPMENT:"
jira-ticket-creator search --jql "parent = $FEATURE_EPIC AND component = Frontend" \
--format table
echo ""
# Backend support
echo "BACKEND SUPPORT:"
jira-ticket-creator search --jql "parent = $FEATURE_EPIC AND component = Backend" \
--format table
echo ""
# QA testing
echo "QA TESTING:"
jira-ticket-creator search --jql "parent = $FEATURE_EPIC AND type = 'Test'" \
--format table
EOF
chmod +x feature-by-team.sh
./feature-by-team.sh
# Step 3: Identify blockers between teams
echo "TEAM DEPENDENCIES:"
jira-ticket-creator search --jql "parent = $FEATURE_EPIC AND status = Blocked" --format table
Scenario 3: Technical Debt Initiative with Multiple Repos
#!/bin/bash
# Track technical debt across multiple service repos
# Effort Epic: PROJ-3000 "API v2 Migration"
# Involves: api-service, auth-service, notification-service repos
cat > tech-debt-initiative.sh << 'EOF'
#!/bin/bash
INITIATIVE_EPIC="PROJ-3000"
TARGET_DATE="2025-06-30"
# Import
jira-ticket-creator import --jql "key = $INITIATIVE_EPIC" --map-project "api-v2-migration"
# Track effort across repos
echo "=== API v2 MIGRATION EFFORT ==="
echo "Target: $TARGET_DATE"
echo ""
# By service
for SERVICE in api-service auth-service notification-service; do
echo "SERVICE: $SERVICE"
jira-ticket-creator search --jql "parent = $INITIATIVE_EPIC AND labels = $SERVICE" --format table
echo ""
done
# Progress summary
echo "OVERALL PROGRESS:"
jira-ticket-creator gantt --format ascii --weeks 8
# Risk report
echo ""
echo "RISKS:"
jira-ticket-creator search --jql "parent = $INITIATIVE_EPIC AND (status = Blocked OR priority = Critical OR updated <= -30d)" \
--format table
EOF
chmod +x tech-debt-initiative.sh
./tech-debt-initiative.sh
Effort Lifecycle
Phase 1: Planning (Week 1)
# Create effort epic in JIRA
# Import it locally
jira-ticket-creator import --jql "key = PROJ-1000" --map-project my-effort
# Define all stories and tasks
# Estimate (add story points in JIRA)
# Create script for daily tracking
cp ~/templates/daily-check.sh ./effort-check.sh
Phase 2: Execution (Weeks 2-8)
# Daily: Check blockers
./effort-check.sh
# Weekly: Generate report
./effort-weekly-report.sh
# Monitor: Use gantt chart
jira-ticket-creator gantt --format html --output gantt.html
open gantt.html
Phase 3: Completion (Final Week)
# Verify all done
jira-ticket-creator search --jql "parent = PROJ-1000 AND status != Done" --format table
# Generate final report
jira-ticket-creator search --jql "parent = PROJ-1000" --format json > final-effort-report.json
# Archive effort
mv ~/efforts/my-effort ~/efforts/completed/my-effort-2025-04-30
Tips & Best Practices
- Use consistent naming:
project-effort-namenotproj_effortorPROJECT-EFFORT - Tag tickets clearly: Use labels and components for team/service
- Automate reports: Create shell scripts for recurring reports
- Check weekly: Don’t wait for blockers to pile up
- Involve teams early: Import and share dashboard with stakeholders
- Archive efforts: Keep organized history of completed efforts
See Also
- Import Command - Import and organize efforts
- Project Mapping - Configure effort organization
- Common Workflows - Other automation examples