Visit data standard

Supplier specification for pseudonymised domiciliary care visit extracts. Contact minutes are actual end minus actual start. Only visits with both actual times are delivered visits.

Assessment criteria

CSV fields

visit_id,person_ref,worker_ref,shift_ref,core_team_flag,visit_zone,worker_zone,planned_start,planned_end,actual_start,actual_end,planned_travel_min,route_travel_min,route_miles,travel_mode,paid_minutes,change_date,change_reason,intro_flag,notice_date
  • Times: ISO 8601 with an offset (including Z). Dates: YYYY-MM-DD.
  • core_team_flag and intro_flag: Y or N. Visit and worker zones must be domiciliary care provider zone codes.
  • travel_mode: car_petrol, car_diesel, car_hybrid, car_plugin_hybrid, car_electric, car_unknown, public_transport, walk, cycle.
  • change_reason: blank, person_request, sickness, leave, vacancy, rescheduling or other. Provide change_date when a reason is present.
  • paid_minutes includes the visit plus preceding travel and waiting time.
  • A leg is a delivered visit other than the first in the worker’s shift, ordered by actual_start within worker_ref and shift_ref. Travel minutes and miles describe that preceding leg; leave all three travel fields blank on the first visit.
  • Package band: visits in the final 28 days ÷ 4, classified using the configured weekly band boundaries.
  • Raw visit_id, person_ref, worker_ref and shift_ref are browser-hashed with SHA-256 over salt + “:” + value. Names and addresses are never requested. Double-handed visits need one row per worker, each with its own visit_id.

Monthly formulas

TK1 · Travel-to-contact ratio
Sum of route travel minutes over legs ÷ sum of contact minutes.
TK2 · Driving per contact hour
Sum of route miles over legs with car_ travel mode ÷ sum of contact hours.
TK3 · Paid hours per contact hour
Sum of paid minutes ÷ sum of contact minutes.
TK4 · Zero-travel scheduling
100 × legs with planned travel minutes below route travel minutes ÷ all legs.
TK5 · In-zone delivery
100 × visits where worker zone equals visit zone ÷ delivered visits.
TK6 · Late rota changes
100 × visits changed within late_change_days before planned start, excluding person_request ÷ delivered visits.
TK7 · Travel emissions
100 × sum of route miles × travel-mode factor (kg CO₂e per mile) over legs ÷ contact hours. Conversion factors not set means unavailable; factors are never guessed.
CK1 · Core-team continuity
100 × visits with core_team_flag Y ÷ delivered visits.
CK2 · Different workers
Median distinct workers per person, by package band, in the last 28 days of the calendar month.
CK3 · Continuity of care index
Median per-person Bice–Boxerman index by package band: (sum of n_j² − n) ÷ (n × (n − 1)), where n_j is visits from worker j and n is total visits; only people meeting coc_min_visits.
CK4 · New-face rate
100 × visits by a worker with no earlier delivered visit to that person in new_face_lookback_days ÷ delivered visits. Unavailable until complete look-back history is present.
CK5 · Introduced before solo
100 × new-face visits with intro_flag Y ÷ new-face visits.
CK6 · Advance notice
100 × visits where notice_date is at least rota_notice_days before planned start ÷ delivered visits.
CK7 · Continuity survey
Yes to both ‘I usually know who is coming’ and ‘I mostly see workers I know’ ÷ survey responses (shown as a percentage).

Pilot settings and acceptance

Draft — calibrate in pilot. A month must cover the whole calendar month and meet the quality limits. Quality results also flag duplicate IDs, long visits, worker overlaps, implausible legs and unknown zones. Include the previous 3 months in the first upload for new-face checks.

new face lookback days
90
coc min visits
4
rota notice days
7
late change days
7
package bands visits per week
[
  7,
  14,
  28
]
ghg conversion factors
null
data quality
{
  "max_visit_minutes": 480,
  "max_zero_visit_days": 1,
  "implausible_leg_miles": 60,
  "max_flagged_visit_pct": 1,
  "implausible_leg_minutes": 120,
  "min_actual_coverage_pct": 95
}
data checks
{
  "C2": {
    "3": [
      {
        "op": ">=",
        "kpi": "CK5",
        "value": 80,
        "months": 3
      }
    ],
    "4": [
      {
        "op": ">=",
        "kpis": [
          "CK5",
          "CK6"
        ],
        "value": 90,
        "months": 6
      }
    ],
    "5": [
      {
        "op": ">=",
        "kpis": [
          "CK5",
          "CK6"
        ],
        "value": 95,
        "months": 12
      }
    ]
  },
  "C3": {
    "5": [
      {
        "op": "<",
        "kpi": "CK4",
        "value": 5,
        "months": 12
      }
    ]
  },
  "C4": {
    "3": [
      {
        "op": "exists",
        "kpis": [
          "CK1",
          "CK2",
          "CK3",
          "CK4"
        ],
        "months": 3
      }
    ],
    "4": [
      {
        "op": "exists",
        "kpis": [
          "CK1",
          "CK2",
          "CK3",
          "CK4",
          "CK5",
          "CK6",
          "CK7"
        ],
        "months": 6
      }
    ],
    "5": [
      {
        "op": "exists",
        "kpis": [
          "CK1",
          "CK2",
          "CK3",
          "CK4",
          "CK5",
          "CK6",
          "CK7"
        ],
        "months": 12
      }
    ]
  },
  "C5": {
    "3": [
      {
        "op": "any",
        "months": 3,
        "alternatives": [
          {
            "op": "improved_points",
            "kpi": "CK1",
            "value": 5,
            "months": 3
          },
          {
            "op": ">=",
            "kpi": "CK1",
            "value": 70,
            "months": 3
          }
        ]
      }
    ],
    "4": [
      {
        "op": "any",
        "months": 6,
        "alternatives": [
          {
            "op": "improved_points",
            "kpi": "CK1",
            "value": 10,
            "months": 6
          },
          {
            "op": ">=",
            "kpi": "CK1",
            "value": 80,
            "months": 6
          }
        ]
      },
      {
        "op": "rising",
        "kpi": "CK3",
        "months": 6
      }
    ],
    "5": [
      {
        "op": "peer_top_quartile",
        "kpis": [
          "CK1",
          "CK3"
        ],
        "months": 12
      }
    ]
  },
  "C7": {
    "3": [
      {
        "op": "count_in_last_months",
        "kpi": "CK7",
        "value": 1,
        "months": 12
      }
    ],
    "4": [
      {
        "op": "count_in_last_months",
        "kpi": "CK7",
        "value": 2,
        "months": 12
      }
    ]
  },
  "T1": {
    "3": [
      {
        "op": ">=",
        "kpi": "TK5",
        "value": 70,
        "months": 3
      }
    ],
    "4": [
      {
        "op": ">=",
        "kpi": "TK5",
        "value": 85,
        "months": 6
      }
    ],
    "5": [
      {
        "op": ">=",
        "kpi": "TK5",
        "value": 95,
        "months": 12
      }
    ]
  },
  "T2": {
    "3": [
      {
        "op": "<",
        "kpi": "TK4",
        "value": 5,
        "months": 3
      }
    ],
    "4": [
      {
        "op": "<",
        "kpi": "TK4",
        "value": 2,
        "months": 6
      }
    ],
    "5": [
      {
        "op": "<",
        "kpi": "TK4",
        "value": 1,
        "months": 12
      }
    ]
  },
  "T3": {
    "3": [
      {
        "op": "exists",
        "kpi": "TK6",
        "months": 3
      }
    ],
    "4": [
      {
        "op": "<",
        "kpi": "TK6",
        "value": 10,
        "months": 6
      }
    ],
    "5": [
      {
        "op": "<",
        "kpi": "TK6",
        "value": 5,
        "months": 12
      }
    ]
  },
  "T4": {
    "3": [
      {
        "op": "exists",
        "kpis": [
          "TK1",
          "TK2",
          "TK3",
          "TK5"
        ],
        "months": 3
      }
    ],
    "4": [
      {
        "op": "exists",
        "kpis": [
          "TK1",
          "TK2",
          "TK3",
          "TK4",
          "TK5",
          "TK6"
        ],
        "months": 6
      }
    ],
    "5": [
      {
        "op": "exists",
        "kpis": [
          "TK1",
          "TK2",
          "TK3",
          "TK4",
          "TK5",
          "TK6",
          "TK7"
        ],
        "months": 12
      }
    ]
  },
  "T5": {
    "3": [
      {
        "op": "any",
        "months": 3,
        "alternatives": [
          {
            "op": "improved_pct",
            "kpi": "TK1",
            "value": 5,
            "months": 3
          },
          {
            "op": "improved_pct",
            "kpi": "TK2",
            "value": 5,
            "months": 3
          }
        ]
      }
    ],
    "4": [
      {
        "op": "improved_pct",
        "kpis": [
          "TK1",
          "TK2"
        ],
        "value": 10,
        "months": 6
      }
    ],
    "5": [
      {
        "op": "peer_top_quartile",
        "kpis": [
          "TK1",
          "TK2"
        ],
        "months": 12
      }
    ]
  }
}