Asana
Project Management Tool
Asana
Overview
Asana is a project management tool with intuitive UI and rich features. It integrates task management, project tracking, and team collaboration, supporting various view formats (list, board, timeline, calendar). Popular among mid-sized teams and creative teams, it features user-friendly interface and balanced functionality.
Details
Asana is designed to make project management simple yet powerful, accommodating a wide range of users from technical to non-technical teams. Flexible display options and rich collaboration features help improve team productivity.
Key Features
- Multiple View Formats: List, board (Kanban), timeline (Gantt chart), and calendar views
- Custom Fields: Add unique fields tailored to project needs
- Automation Rules: Automate repetitive tasks and optimize workflows
- Goals Feature: Goal setting and progress visualization
- Proofing: Review and feedback for design and creative assets
- Portfolios: Integrated management of multiple projects
- Time Tracking: Built-in time tracking functionality
- Rich Integrations: Slack, Gmail, Adobe Creative Suite, Salesforce, and more
Target Teams
- Mid-sized development teams (10-100 people)
- Marketing and creative teams
- Product management teams
- Consulting and service businesses
- Non-profit organizations and educational institutions
Pros and Cons
Pros
- Intuitive and beautiful user interface
- Easy for non-technical users to get started
- Rich display options flexibly adapt to team needs
- Powerful automation features streamline workflows
- Free plan includes comprehensive basic features
- Excellent mobile app and offline sync
Cons
- Limited advanced project management features (dependencies, etc.)
- Lacks features for large enterprise environments
- Limited customization compared to enterprise tools
- Basic reporting functionality
- Paid plans can be expensive for small businesses
- Not suitable for complex workflows
Reference Pages
- Asana Official Website
- Asana Guide
- Asana API Documentation
- Asana Academy
- Asana Community
- Asana Pricing Plans
Code Examples
Basic Setup
# Install Asana CLI (unofficial)
npm install -g asana-cli
# Configure API key
export ASANA_ACCESS_TOKEN="your_personal_access_token"
# Check workspaces
asana workspaces
# Get project list
asana projects --workspace="workspace_gid"
Project Creation
# Asana Python SDK example
import asana
# Initialize client
client = asana.Client.access_token('your_personal_access_token')
# Create new project
project_data = {
'name': 'Website Redesign',
'notes': 'Q2 website redesign project',
'team': 'team_gid',
'layout': 'board', # list, board, timeline, calendar
'privacy_setting': 'team_visible',
'default_view': 'board',
'color': 'blue',
'start_on': '2024-01-01',
'due_on': '2024-03-31'
}
project = client.projects.create_project(project_data)
print(f"Project created: {project['name']} (ID: {project['gid']})")
# Create project sections
sections = [
{'name': 'Backlog'},
{'name': 'In Progress'},
{'name': 'Review'},
{'name': 'Complete'}
]
for section_data in sections:
section_data['project'] = project['gid']
section = client.sections.create_section(section_data)
print(f"Section created: {section['name']}")
Issue Management
# Task creation
task_data = {
'name': 'Login Page Design',
'notes': '''
## Requirements
- Responsive design support
- Brand guideline compliance
- Accessibility considerations
## Deliverables
- [ ] Wireframe
- [ ] Design mockup
- [ ] Prototype
''',
'projects': [project['gid']],
'assignee': 'user_gid',
'due_on': '2024-01-15',
'tags': ['design', 'frontend', 'priority:high'],
'custom_fields': {
'story_points': '5',
'priority': 'High',
'status': 'Not Started'
}
}
task = client.tasks.create_task(task_data)
# Create subtasks
subtasks = [
'User research analysis',
'Create wireframe',
'Create UI design',
'Create prototype',
'Design review'
]
for subtask_name in subtasks:
subtask_data = {
'name': subtask_name,
'parent': task['gid'],
'assignee': 'user_gid'
}
subtask = client.tasks.create_subtask(task['gid'], subtask_data)
# Update task
update_data = {
'completed': False,
'assignee': 'new_assignee_gid',
'due_on': '2024-01-20'
}
updated_task = client.tasks.update_task(task['gid'], update_data)
# Add comment to task
comment_data = {
'text': 'Initial design is complete. Please review.',
'is_pinned': False
}
client.stories.create_story_for_task(task['gid'], comment_data)
Workflow Configuration
# Create custom field
custom_field_data = {
'name': 'Priority',
'description': 'Task priority level',
'type': 'enum',
'enum_options': [
{'name': 'Low', 'color': 'green'},
{'name': 'Medium', 'color': 'yellow'},
{'name': 'High', 'color': 'orange'},
{'name': 'Critical', 'color': 'red'}
],
'workspace': 'workspace_gid'
}
custom_field = client.custom_fields.create_custom_field(custom_field_data)
# Add custom field to project
client.projects.add_custom_field_setting_for_project(
project['gid'],
{'custom_field': custom_field['gid'], 'is_important': True}
)
# Automation rule setup (limited via API, UI recommended)
automation_rule = {
'name': 'Auto-assign high priority tasks',
'trigger': {
'type': 'task_added_to_project',
'project': project['gid']
},
'condition': {
'type': 'custom_field_changed',
'custom_field': custom_field['gid'],
'value': 'Critical'
},
'action': {
'type': 'assign_task',
'assignee': 'project_manager_gid'
}
}
# Goal setup
goal_data = {
'name': 'Q1 Website Completion',
'notes': 'Complete Q1 website redesign',
'team': 'team_gid',
'time_period': {
'start_on': '2024-01-01',
'end_on': '2024-03-31'
},
'metric': {
'unit': 'percent',
'target_value': 100,
'initial_value': 0
}
}
goal = client.goals.create_goal(goal_data)
Reporting Features
# Project progress report
def generate_project_report(project_gid):
# Project basic information
project = client.projects.get_project(project_gid)
# Task list within project
tasks = list(client.tasks.get_tasks_for_project(
project_gid,
opt_fields=['name', 'completed', 'assignee', 'due_on', 'custom_fields']
))
# Calculate statistics
total_tasks = len(tasks)
completed_tasks = len([t for t in tasks if t.get('completed')])
completion_rate = (completed_tasks / total_tasks * 100) if total_tasks > 0 else 0
# Overdue tasks
from datetime import datetime
overdue_tasks = [
t for t in tasks
if t.get('due_on') and
datetime.fromisoformat(t['due_on']) < datetime.now() and
not t.get('completed')
]
# Statistics by assignee
assignee_stats = {}
for task in tasks:
if task.get('assignee'):
assignee_gid = task['assignee']['gid']
if assignee_gid not in assignee_stats:
assignee_stats[assignee_gid] = {'total': 0, 'completed': 0}
assignee_stats[assignee_gid]['total'] += 1
if task.get('completed'):
assignee_stats[assignee_gid]['completed'] += 1
return {
'project_name': project['name'],
'total_tasks': total_tasks,
'completed_tasks': completed_tasks,
'completion_rate': round(completion_rate, 2),
'overdue_count': len(overdue_tasks),
'assignee_stats': assignee_stats
}
# Team workload analysis
def analyze_team_workload(team_gid):
# Get team members
team_members = list(client.teams.get_team_members(team_gid))
workload_data = {}
for member in team_members:
# Active tasks for each member
member_tasks = list(client.tasks.get_tasks({
'assignee': member['gid'],
'completed_since': 'now',
'opt_fields': ['name', 'due_on', 'projects']
}))
workload_data[member['name']] = {
'active_tasks': len(member_tasks),
'upcoming_due': len([
t for t in member_tasks
if t.get('due_on') and
datetime.fromisoformat(t['due_on']) <= datetime.now() + timedelta(days=7)
])
}
return workload_data
Team Collaboration
# Slack integration webhook setup
webhook_data = {
'resource': 'task',
'target': 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK',
'filters': [
{'resource_type': 'task', 'action': 'added'},
{'resource_type': 'task', 'action': 'changed'},
{'resource_type': 'task', 'action': 'deleted'}
]
}
# Proofing (review) implementation
def create_review_task(asset_url, reviewers):
review_task_data = {
'name': f'Review: {asset_url}',
'notes': f'Asset URL: {asset_url}\n\nReview points:\n- Brand guideline compliance\n- Usability\n- Technical implementation feasibility',
'projects': [project['gid']],
'tags': ['review', 'creative'],
'custom_fields': {
'asset_url': asset_url,
'review_status': 'Pending'
}
}
review_task = client.tasks.create_task(review_task_data)
# Add reviewers
for reviewer_gid in reviewers:
client.tasks.add_followers_for_task(
review_task['gid'],
{'followers': [reviewer_gid]}
)
return review_task
# Portfolio dashboard
def create_portfolio_dashboard(portfolio_gid):
portfolio = client.portfolios.get_portfolio(portfolio_gid)
portfolio_projects = list(client.portfolios.get_items_for_portfolio(portfolio_gid))
dashboard_data = {
'portfolio_name': portfolio['name'],
'projects': []
}
for project in portfolio_projects:
project_stats = generate_project_report(project['gid'])
dashboard_data['projects'].append(project_stats)
return dashboard_data