← IAM Ideas
IAM Ideas 2026-08-31

Iiq Request Status Decoder

Turns IdentityIQ's raw completion/execution status pair into a plain-English answer for the help desk agent staring at a "Completed Pending Verification / Terminated" request and a confused user.

Iiq Request Status Decoder

IIQ Request Status Decoder

Turns IdentityIQ's raw completion/execution status pair into a plain-English answer for the help desk agent staring at a "Completed Pending Verification / Terminated" request and a confused user.

Date: 2026-08-31 Type: App Theme: UX + Detect Platform: SailPoint IdentityIQ Status: Idea

What it is

A single-page, read-only app that loads a list of IdentityRequest records and decodes each one into four buckets a non-engineer can act on: Done, In Progress, False Failure (no action), and Needs Escalation. Click a request and you get the raw completionStatus/executionStatus/currentStep fields side by side with a sentence that says what actually happened and what to do next.

Who it serves

Tier 1 / Tier 2 help desk agents fielding "where's my access?" tickets, plus the end users who filed them. The native IIQ "Track My Access Requests" quicklink already shows these requests. This app sits on the same data and answers the question that page doesn't: is this a real problem, or is IIQ still catching up with itself?

The IIQ pain it addresses

IIQ's Lifecycle Manager tracks every access request as an IdentityRequest with two status fields that don't always agree. completionStatus covers the approval/provisioning path (Pending, Approved, Rejected, Completed, Cancelled, or "Completed Pending Verification"). executionStatus covers the workflow engine underneath it (Executing, Verifying, Terminated, Completed). A request can sit at "Completed Pending Verification" / "Verifying" for a while, and that's normal: IIQ is waiting for an aggregation or targeted read-back to confirm the entitlement actually landed on the target system.

The problem shows up when that verification window closes. A SailPoint community thread from 2026 documents a request whose role assignment succeeded on the target system, but the request stayed "Incomplete" with a timeout error, because the aggregation read-back never matched what was provisioned before maxVerificationDays ran out on the Identity Request Maintenance task. From the outside, that looks identical to a genuine provisioning failure: same "Terminated" execution status, same stuck request in the queue. A help desk agent can't tell the two apart from the native status fields alone, so both get escalated, and both waste an engineer's time chasing something that, in roughly half the cases, already worked.

How it works

Two panels. The left panel lists every request with a decoded status badge instead of the raw IIQ string, filterable by the four buckets and searchable by request ID, requester, requestee, description, or application. The right panel shows the selected request's decoded explanation in a colored banner (blue for in-progress, green for done, amber for false-failure, red for escalate), a one-line suggested action, and a raw-fields table underneath so an agent who wants the actual IIQ values can still see them.

The decoding logic lives in one place in script.js. The interesting branch: when completionStatus is "Completed Pending Verification" and executionStatus is "Terminated," the app checks a simulated entitlementConfirmedOnTarget flag (standing in for what a real deployment would get from a Link/aggregation cross-check) and splits the same raw status into "access is actually there, verification just timed out" versus "access really isn't there, escalate."

What's in this folder

  • README.md — this file
  • cover-image.png — cover art
  • metadata.md — generation metadata
  • requirements.md — functional/non-functional spec, including the decoding rules table
  • index.html, style.css, script.js — the app
  • sample-data.json — 17 synthetic IdentityRequest records covering all four decoded buckets, including matched pairs of "verification timeout, access present" and "verification timeout, access missing"

How to run / read it

Open index.html in any modern browser. If the browser blocks local fetch() calls from file://, run python3 -m http.server in this folder and open http://localhost:8000 instead.

Estimated impact

No hard number here. This is a design assumption, not a measured result. The claim it rests on: if a meaningful share of "Terminated" verification requests in a given IIQ instance are false failures (access already granted, read-back just timed out), then every one of those that gets auto-classified instead of hand-investigated by an engineer is a ticket the help desk can close on the spot instead of routing upstream. The actual rate would need to be measured against a real deployment's IdentityRequest history before anyone should plan headcount around it.

Why this fits an IIQ shop with 500+ connectors

Verification read-back depends on the target connector's aggregation timing, and at 500+ connectors that timing is wildly inconsistent. A fast JDBC app confirms in seconds; a batch mainframe connector might not aggregate until the next nightly run. The wider that spread gets, the more "Terminated" requests are really just slow connectors outrunning maxVerificationDays, not broken ones. A fixed status page can't tell the difference at any scale. A decoder that cross-references the actual entitlement state can, connector by connector.

Sources

  1. Official documentation:
    • https://documentation.sailpoint.com/identityiq/help/lifecycle_manager/lifecyc_manager_compo.html — Track My Requests component: the Completion Status values (Pending, Approved, Rejected, Completed, Cancelled, Completed Pending Verification) and Execution Status values (Executing, Verifying, Terminated, Completed) this app's decoding rules are built from.
  2. Community / current research:
    • https://developer.sailpoint.com/discuss/t/access-request-error/207057 — community thread describing an access request where the entitlement was granted but the request stayed "Incomplete" after a verification timeout, including the "This request timed out waiting for verification of one or more items" error text and the maxVerificationDays setting on the Identity Request Maintenance task.
Requirements

Requirements — IIQ Request Status Decoder

Purpose

A read-only, single-page app that translates IdentityIQ IdentityRequest completion/execution status pairs into a plain-English answer for the two questions a help desk agent or end user actually asks: "did I get the access?" and "do I need to escalate this?" It also flags the one state where those two statuses lie to each other — a request stuck in Terminated execution after maxVerificationDays even though the entitlement already landed on the target system.

Functional requirements

  1. Load data. On page load, fetch("sample-data.json") and parse into an array of IdentityRequest-shaped records. No build step, no bundler, no CDN dependency.
  2. Request list.
    • Render every request as a row: Request ID, requestee, description, application, request date, and a decoded status pill (see decoding rules below) instead of the raw completionStatus string.
    • Filter chips: All, In Progress, Needs Escalation, False Failure (no action), Done. Exactly one filter active at a time.
    • Free-text search box matches Request ID, requester, requestee, description, and application (case-insensitive substring match).
    • Clicking a row selects it and loads the detail panel. The first request in the list is selected by default on load.
  3. Decoding rules (implemented once in script.js, not duplicated in the DOM layer):
    • completionStatus: "Completed" → Done. "Access is active on <application>."
    • completionStatus: "Pending" → In Progress. "Waiting on <currentStep>." No escalation.
    • completionStatus: "Rejected" → Done (denied). "<currentStep> denied the request."
    • completionStatus: "Cancelled" → Done (cancelled). "Requester cancelled before provisioning."
    • completionStatus: "Completed Pending Verification" with executionStatus: "Verifying" and daysInVerification < maxVerificationDays → In Progress. "Provisioned; IIQ is confirming the read-back on <application>. Normal — should clear within <maxVerificationDays - daysInVerification> day(s)."
    • completionStatus: "Completed Pending Verification" with executionStatus: "Terminated" (i.e. the verification window in the Identity Request Maintenance task's maxVerificationDays elapsed) and entitlementConfirmedOnTarget: true → False Failure, no action. "Access IS present on <application> — verification timed out on the read-back, not the grant. Do not re-provision; close the ticket with this explanation."
    • Same Terminated case but entitlementConfirmedOnTarget: false → Needs Escalation. "Access was NOT found on <application> after the verification window closed. Escalate to IAM engineering with this Request ID — provisioning likely failed silently."
  4. Detail panel.
    • Header: Request ID, type, requester → requestee, application, request date.
    • Decoded status banner (large, colored by category: in-progress = blue, done = green, false-failure = amber, needs-escalation = red) with the full explanation sentence from the decoding rules.
    • Raw fields table: completionStatus, executionStatus, currentStep, entitlementConfirmedOnTarget, lastAggregationCheck, daysInVerification / maxVerificationDays — so an agent who wants the underlying IIQ values can still see them next to the plain-English read.
    • Suggested action line, one sentence, tied to the category (e.g. "No action — reply to the requester with the explanation above" vs. "Escalate to IAM engineering, priority high").
  5. Summary bar above the list: total requests, count in each of the four filter categories. Recomputed from the currently loaded dataset, not hard-coded.
  6. No auth, no network calls beyond the local fetch. The app must open directly via file:// (falling back to python3 -m http.server if the browser blocks local fetch) with no login, no API key, and no external endpoint.

Non-functional requirements

  • Vanilla HTML/CSS/JS only. No frameworks, no CDN scripts.
  • Dark theme, consistent with the rest of the IAM-Ideas App folders.
  • All rendering paths must escape user-visible strings pulled from JSON (see escapeHtml in script.js) since descriptions and requester/requestee names could, in a real deployment, contain characters someone typed into a free-text field.
  • The dataset must include at least one record in each decoded category — Done, In Progress (both plain-pending and mid-verification), False Failure, and Needs Escalation — so every branch in the decoding rules is exercised by sample-data.json.

What this app is not

  • It does not connect to a live IdentityIQ instance. Production wiring would poll the IdentityRequest REST resource (or a scheduled export) plus a Link/aggregation read-back to populate entitlementConfirmedOnTarget — neither is in scope for this prototype.
  • It cannot cancel a request, resend a reminder, or reassign a work item — those already exist on IIQ's native "Track My Access Requests" quicklink. This app is a triage lens on top of that data, not a replacement for it.
  • The entitlementConfirmedOnTarget field simulates what an aggregation/read-back cross-check would report. It is not sourced from a real target-system query in this prototype — see Unverified assumptions in metadata.md.

More from IAM Ideas