enrollment_state and a step in enrollment_step. Use the state to decide what your app does, and the step to tell the user what is happening.
Read both with list VPP enrollments; retrieve a VPP enrollment adds the timeline. Connect shows the steps on the Enrollment page.
States
Steps
A step that does not apply is
SKIPPED: a tariff already connected, no telemetry required, dispatch_test_required set to false, or no approval needed. Timeline entries still PENDING carry time_expected, so you can show what comes next and when.
A request to leave needs the VPP operator’s approval, and the operator cannot refuse it. A request left unanswered ends when the notice_days of the enrollment’s terms have passed, so take the number of days in the UNENROLLING message from terms.notice_days.
Suspension reasons
AnACTIVE enrollment can carry warnings, which do not stop dispatch. A critical reason suspends the enrollment at once, and so does a warning left past its grace period. The enrollment returns to ACTIVE when every reason clears.

