Skip to main content
Resource proficiency allows you to model how efficiently different resources can complete specific jobs. A senior technician might complete a complex repair 20% faster than a junior, while a specialist might be 30% slower at tasks outside their expertise. This directly affects the effective job duration and scheduling.

When to Use Proficiency

Proficiency is ideal when you want to:
  • Model skill levels that affect completion time (senior vs junior technicians)
  • Account for training and learning curves for new employees
  • Handle specialization trade-offs (fast at core tasks, slower at peripheral ones)
  • Get more accurate completion time predictions
  • Optimize schedules based on actual resource efficiency

How It Works

Each job can have a proficiency list that defines how the job duration changes when assigned to specific resources:
  • durationModifier < 1.0: Resource completes the job faster (e.g., 0.8 = 20% faster)
  • durationModifier = 1.0: Standard duration (default for unlisted resources)
  • durationModifier > 1.0: Resource completes the job slower (e.g., 1.5 = 50% slower)
The effective job duration is calculated as:
effective_duration = base_duration * durationModifier

Basic Example

In this example, a complex repair job has different completion times depending on which technician is assigned:
request
{
  "resources": [
    {
      "name": "senior-tech",
      "start": {"latitude": 51.05, "longitude": 3.72},
      "shifts": [{
        "from": "2024-01-15T08:00:00Z",
        "to": "2024-01-15T17:00:00Z"
      }]
    },
    {
      "name": "junior-tech",
      "start": {"latitude": 51.05, "longitude": 3.72},
      "shifts": [{
        "from": "2024-01-15T08:00:00Z",
        "to": "2024-01-15T17:00:00Z"
      }]
    }
  ],
  "jobs": [
    {
      "name": "complex-repair",
      "duration": 7200,
      "location": {"latitude": 51.06, "longitude": 3.73},
      "proficiency": [
        {
          "resource": "senior-tech",
          "durationModifier": 0.75
        },
        {
          "resource": "junior-tech",
          "durationModifier": 1.5
        }
      ]
    }
  ]
}
In this example:
  • The base duration is 7200 seconds (2 hours)
  • If assigned to senior-tech: 7200 * 0.75 = 5400 seconds (1.5 hours)
  • If assigned to junior-tech: 7200 * 1.5 = 10800 seconds (3 hours)
Resources not listed in the proficiency array use the default durationModifier of 1.0 (no modification to duration).

Use Cases

Skill-Based Efficiency

Model how expertise affects job completion time:
{
  "jobs": [
    {
      "name": "electrical-panel-installation",
      "duration": 10800,
      "tags": [{"name": "electrical", "hard": true}],
      "proficiency": [
        {"resource": "master-electrician", "durationModifier": 0.7},
        {"resource": "journeyman", "durationModifier": 1.0},
        {"resource": "apprentice", "durationModifier": 1.3}
      ]
    }
  ]
}

Training and Learning Curve

Account for experience levels as employees learn:
{
  "jobs": [
    {
      "name": "equipment-setup",
      "duration": 3600,
      "proficiency": [
        {"resource": "experienced-tech", "durationModifier": 0.8},
        {"resource": "new-hire-week-1", "durationModifier": 2.0},
        {"resource": "new-hire-week-4", "durationModifier": 1.3}
      ]
    }
  ]
}

Specialization Trade-offs

Model specialists who are fast at certain tasks but slower at others:
{
  "jobs": [
    {
      "name": "plumbing-repair",
      "duration": 5400,
      "proficiency": [
        {"resource": "plumber", "durationModifier": 0.8},
        {"resource": "generalist", "durationModifier": 1.2}
      ]
    },
    {
      "name": "electrical-work",
      "duration": 5400,
      "proficiency": [
        {"resource": "plumber", "durationModifier": 1.4},
        {"resource": "generalist", "durationModifier": 1.0}
      ]
    }
  ]
}

Combining with Other Features

With Rankings

Use proficiency for efficiency and rankings for preference. A resource might be fast but not preferred:
{
  "name": "specialized-task",
  "duration": 7200,
  "proficiency": [
    {"resource": "specialist", "durationModifier": 0.6}
  ],
  "rankings": [
    {"name": "specialist", "ranking": 1},
    {"name": "generalist", "ranking": 50}
  ]
}

With Tags (Hard Constraints)

Ensure only qualified resources can do the job, then optimize by proficiency:
{
  "name": "certified-work",
  "duration": 5400,
  "tags": [{"name": "certification-required", "hard": true}],
  "proficiency": [
    {"resource": "senior-certified", "durationModifier": 0.8},
    {"resource": "junior-certified", "durationModifier": 1.1}
  ]
}

With Time Windows

Proficiency affects whether jobs fit within time constraints. A job that doesn’t fit in a time window with one resource might fit when assigned to a faster resource:
{
  "name": "time-sensitive-job",
  "duration": 3600,
  "windows": [{
    "from": "2024-01-15T14:00:00Z",
    "to": "2024-01-15T15:30:00Z"
  }],
  "proficiency": [
    {"resource": "fast-worker", "durationModifier": 0.8}
  ]
}
A 1-hour job with a 0.8 modifier becomes 48 minutes, potentially fitting into a window that would be too tight for standard duration.

Best Practices

  1. Base duration on average: Set the base duration as the average completion time, then adjust with proficiency modifiers above and below 1.0.
  2. Only specify deviations: You only need to list resources whose proficiency differs from 1.0. Resources not in the list default to standard duration.
  3. Combine with rankings: Use proficiency for duration accuracy and rankings to express preference. A fast resource isn’t always the preferred choice.
  4. Validate modifiers: Ensure modifiers are realistic. Values below 0.5 or above 2.0 may indicate the base duration needs adjustment.
  5. Consider scheduling impact: Remember that proficiency affects departure times and all downstream scheduling. A 50% faster job creates 50% more slack time.

Technical Notes

  • The modifier is applied to the base duration before other adjustments (like durationSquash)
  • The effective duration affects departure time calculations and downstream scheduling
  • Resources must be referenced by their exact name as defined in the resources list