# Lifecycle state transform

**URL:** <https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967>\
**Category:** SHF Discussion and Questions\
**Tags:** transforms, accounts, identity-security-cloud\
**Created:** [February 12, 2026, 8:07am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967 "2026-02-12T08:07:31Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 12, 2026, 8:07am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/1 "2026-02-12T08:07:31Z")

</div>

I have a case : If an employee resigns, when their status changes to Inactive, all access will be disabled, and seven days after the Inactive date, all access will be deleted.  
what should do I ?

---

<div class="post-metadata">

**Author:** ![rpriya](https://avatars.discourse-cdn.com/v4/letter/r/bc79bd/32.png) [@rpriya](https://developer.sailpoint.com/discuss/u/rpriya)\
**Post date:** [February 12, 2026, 8:32am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/2 "2026-02-12T08:32:42Z")

</div>

Hi @rsobar  
By all access will be disabled or deleted, do you mean the accounts themselves will be disabled and deleted?

To configure this, create two lifecycle states under the relevant Identity Profile: _Inactive_ and _Delete_.  
-For the _Inactive_ lifecycle state:  
Enable the lifecycle state, select _Disable Accounts_, and choose _All Sources_ under _Settings for Previous Accounts_.  
Set the Identity State to _Inactive (Short‑Term)_.

-For the Delete lifecycle state:  
Enable the lifecycle state, set the Identity State to _Inactive (Long‑Term)_, select _Delete Accounts_, and choose _All Sources_ under _Settings for Previous Accounts_.

And update Lifecycle State Transform with logic similar to the example below  
`{`  
`“name”: “testone”,`  
`“type”: “static”,`  
`“attributes”: {`  
`“isdeltelig”: {`  
`“attributes”: {`  
`“negativeCondition”: “no”,`  
`“positiveCondition”: “yes”,`  
`“firstDate”: “now”,`  
`“operator”: “gte”,`  
`“secondDate”: {`  
`“type”: “dateFormat”,`  
`“attributes”: {`  
`“inputFormat”: “yyyy-MM-dd’T’HH:mm”,`  
`“outputFormat”: “ISO8601”,`  
`“input”: {`  
`“attributes”: {`  
`“input”: {`  
`“type”: “firstValid”,`  
`“attributes”: {`  
`“ignoreErrors”: “true”,`  
`“values”: [`  
`{`  
`“attributes”: {`  
`“input”: {`  
`“attributes”: {`  
`“sourceName”: “”,`  
`“attributeName”: “”`  
`},`  
`“type”: “accountAttribute”`  
`},`  
`“inputFormat”: “yyyy-MM-dd”,`  
`“outputFormat”: “ISO8601”`  
`},`  
`“type”: “dateFormat”`  
`},`  
`"now"`  
`]`  
`}`  
`},`  
`“expression”: “+7d/d”,`  
`“roundUp”: false`  
`},`  
`“type”: “dateMath”`  
`}`  
`}`  
`}`  
`},`  
`“type”: “dateCompare”`  
`},`  
`“value”: “#if($isdeltelig == ‘yes’)delete#{else}inactive#end”`  
`}`  
`}`

---

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 12, 2026, 9:05am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/3 "2026-02-12T09:05:19Z")

</div>

Hi @rpriya ,

To delete an account, the All Sources option is not available.

 ![image](https://global.discourse-cdn.com/sailpoint/original/3X/9/0/9037d373a0faa916374a6981c416a93c4758b74c.png)

---

<div class="post-metadata">

**Author:** ![rpriya](https://avatars.discourse-cdn.com/v4/letter/r/bc79bd/32.png) [@rpriya](https://developer.sailpoint.com/discuss/u/rpriya)\
**Post date:** [February 12, 2026, 10:28am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/4 "2026-02-12T10:28:00Z")

</div>

@rsobar - Right, Delete Accounts won’t allow All sources to prevent mass deletion, please choose Specific Source and select the sources required

---

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 13, 2026, 3:22am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/5 "2026-02-13T03:22:41Z")

</div>

@rpriya , I use this transform in the Lifecycle State attribute in the mapping attribute, is that correct ?

---

<div class="post-metadata">

**Author:** ![iamnithesh](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/iamnithesh/32/42445_2.png) [@iamnithesh](https://developer.sailpoint.com/discuss/u/iamnithesh)\
**Post date:** [February 13, 2026, 3:44pm UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/6 "2026-02-13T15:44:42Z")

</div>

They should not have had that option there at all. You can delete all accounts as this will include HR source too that makes no sense

---

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 17, 2026, 8:13am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/7 "2026-02-17T08:13:55Z")

</div>

Hi @rpriya , if I don’t have an account attribute for the resignation date, only an account attribute for employee status that contains: active or inactive. How can I handle the case I asked about ?

---

<div class="post-metadata">

**Author:** ![JackSparrow](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/jacksparrow/32/19685_2.png) [@JackSparrow](https://developer.sailpoint.com/discuss/u/JackSparrow)\
**Post date:** [February 17, 2026, 9:55am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/8 "2026-02-17T09:55:34Z")

</div>

Hello @rsobar , so HR source doesn’t have any attribute that says the user’s last working date? In that case, you can have a custom identity attribute created something like lastDateWorked and have the same date populated when user become inactive in the HR system. Now you can use lastDateWorked + 7 days to calculate new lifecyclestate.

---

<div class="post-metadata">

**Author:** ![rpriya](https://avatars.discourse-cdn.com/v4/letter/r/bc79bd/32.png) [@rpriya](https://developer.sailpoint.com/discuss/u/rpriya)\
**Post date:** [February 17, 2026, 11:29am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/9 "2026-02-17T11:29:43Z")

</div>

@rsobar -Since the delete state is calculated based on _resignation date + 7 days_, you’ll need a way to capture the date the user first became inactive. If no account attribute exists for the resignation date, create an identity attribute that records the timestamp when the employee status changes from Active to Inactive. Here’s an example of transform to be used for the new identity attribute to capture inactivity date:

```auto
{
    "name": "testone",
    "type": "static",
    "attributes": {
        "currVal": {
            "type": "firstValid",
            "attributes": {
                "ignoreErrors": "true",
                "values": [
                    {
                        "type": "dateFormat",
                        "attributes": {
                            "inputFormat": "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS",
                            "outputFormat": "yyyy-MM-dd",
                            "input": {
                                "attributes": {
                                    "name": "<inactiveDateAttr>"
                                },
                                "type": "identityAttribute"
                            }
                        }
                    },
                    "none"
                ]
            }
        },
        "status": {
            "attributes": {
                "values": [
                    {
                        "attributes": {
                            "sourceName": "",
                            "attributeName": "<employeeStatus>"
                        },
                        "type": "accountAttribute"
                    },
                    "none"
                ]
            },
            "type": "firstValid"
        },
        "currDate": {
            "type": "dateFormat",
            "attributes": {
                "inputFormat": "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS",
                "outputFormat": "yyyy-MM-dd",
                "input": {
                    "attributes": {
                        "expression": "now",
                        "roundUp": false
                    },
                    "type": "dateMath"
                }
            }
        },
        "value": "#if($currVal == 'none' && $status == 'inactive')$currDate#{else}none#end"
    }
}

```

---

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 18, 2026, 6:52am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/10 "2026-02-18T06:52:10Z")

</div>

> [@rpriya](#):
>
> @rsobar -Since the delete state is calculated based on _resignation date + 7 days_, you’ll need a way to capture the date the user first became inactive. If no account attribute exists for the resignation date, create an identity attribute that records the timestamp when the employee status changes from Active to Inactive. Here’s an example of transform to be used for the new identity attribute to capture inactivity date:

@rpriya , from the transform code you provided, why is the result 2026-03-01, even though its still february .

 ![image](https://global.discourse-cdn.com/sailpoint/original/3X/5/b/5be2f52a0b41e3779e0a907bb17a68e416f8f1c2.png)

---

<div class="post-metadata">

**Author:** ![Deepak\_Chaudhary](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/deepak_chaudhary/32/34380_2.png) [@Deepak\_Chaudhary](https://developer.sailpoint.com/discuss/u/Deepak_Chaudhary)\
**Post date:** [February 18, 2026, 7:36am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/11 "2026-02-18T07:36:13Z")

</div>

@rsobar To implement a disable-then-delete workflow in SailPoint Identity Security Cloud (ISC), you should use a Lifecycle State (LCS) Transform to calculate the correct state based on the termination date.  
Since ISC does not have a “delayed action” button within a single lifecycle state, you must split the process into two distinct states: Inactive and Delete.

1. Configure the Two Lifecycle States  
Go to Admin \> Identities \> Identity Profiles and select your profile. Under the Provisioning tab, create or edit the following states:

State 1: Inactive  
Identity State: Set to Inactive (short-term).  
Settings for Previous Accounts: Select Disable Accounts for “All Sources”.  
Access Profiles: (Optional) Ensure no access profiles are assigned here to ensure all birthright access is also revoked.  
State 2: Terminated\_Delete  
Identity State: Set to Inactive (long-term). This state is required to enable the “Delete” option.  
Settings for Previous Accounts: Select Delete Accounts for “Specific Sources” (Note: “All Sources” is not available for deletion to prevent accidental mass wipes).

1. Implement the Lifecycle State Transform  
You need a Lifecycle State Transform to automatically move the user from “Inactive” to “Terminated\_Delete” exactly 7 days after their termination date.
2. Replace `terminationDate` with the actual name of the attribute in your identity profile that holds the exit date.

**JSON**

```auto
{
    "name": "Lifecycle State Transition Logic",
    "type": "static",
    "attributes": {
        "terminationDate": {
            "attributes": {
                "values": [
                    {
                        "attributes": {
                            "attributeName": "terminationDate",
                            "sourceName": "Workday"
                        },
                        "type": "identityAttribute"
                    },
                    "none"
                ]
            },
            "type": "firstValid"
        },
        "value": "#if($terminationDate == 'none')active#{else}#set($termDateObj = $dateTool.toDate('yyyy-MM-dd', $terminationDate))#set($sevenDaysLater = $dateTool.toCalendar($termDateObj))$sevenDaysLater.add(5, 7)#set($now = $dateTool.getSystemTime())#if($now < $sevenDaysLater.getTimeInMillis())inactive#{else}terminated_delete#end#end"
    }
}

```

---

<div class="post-metadata">

**Author:** ![rpriya](https://avatars.discourse-cdn.com/v4/letter/r/bc79bd/32.png) [@rpriya](https://developer.sailpoint.com/discuss/u/rpriya)\
**Post date:** [February 18, 2026, 8:16am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/12 "2026-02-18T08:16:26Z")

</div>

@rsobar - Update the **currDate** logic as below,

```auto
        "currDate": {

            "type": "dateMath",

            "attributes": {

                "expression": "now",

                "roundUp": false

            }

        } 

```

---

<div class="post-metadata">

**Author:** ![neeraj99](https://sea1.discourse-cdn.com/sailpoint/discuss/user_avatar/developer.sailpoint.com/neeraj99/32/14001_2.png) [@neeraj99](https://developer.sailpoint.com/discuss/u/neeraj99)\
**Post date:** [February 18, 2026, 8:08pm UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/13 "2026-02-18T20:08:02Z")

</div>

Hi @Deepak_Chaudhary  
I don’t think dateTool is available. Is this something you have tested out?

---

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 19, 2026, 4:30am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/14 "2026-02-19T04:30:06Z")

</div>

@rpriya , for currDate is working as expected. Next , regarding the transform code that i will attach below, why does seconDate contain null ?

```json
{
    "name": "Generate status delete",
    "type": "static",
    "attributes": {
        "isdeltelig": {
            "attributes": {
                "negativeCondition": "no",
                "positiveCondition": "yes",
                "firstDate": "now",
                "operator": "gte",
                "secondDate": {
                    "type": "dateFormat",
                    "attributes": {
                        "inputFormat": "yyyy-MM-dd’T’HH:mm",
                        "outputFormat": "ISO8601",
                        "input": {
                            "attributes": {
                                "input": {
                                    "type": "firstValid",
                                    "attributes": {
                                        "ignoreErrors": "true",
                                        "values": [
                                            {
                                                "attributes": {
                                                    "input": {
                                                        "attributes": {
                                                            "name": "zinactivedate"
                                                        },
                                                        "type": "identityAttribute"
                                                    },
                                                    "inputFormat": "yyyy-MM-dd",
                                                    "outputFormat": "ISO8601"
                                                },
                                                "type": "dateFormat"
                                            },
                                            "now"
                                        ]
                                    }
                                },
                                "expression": "+7d/d",
                                "roundUp": false
                            },
                            "type": "dateMath"
                        }
                    }
                }
            },
            "type": "dateCompare"
        },
        "value": "#if($isdeltelig == ‘yes’)delete#{else}inactive#end"
    }
}

```

---

<div class="post-metadata">

**Author:** ![rpriya](https://avatars.discourse-cdn.com/v4/letter/r/bc79bd/32.png) [@rpriya](https://developer.sailpoint.com/discuss/u/rpriya)\
**Post date:** [February 19, 2026, 8:13am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/15 "2026-02-19T08:13:48Z")

</div>

@rsobar -The `inputFormat` must follow the same format used in `zinactivedate`. If you’ve implemented the transform I shared earlier, then the expected format in `zinactivedate`would be `yyyy-MM-dd'T'HH:mm:ss.SSSSSSS`

---

<div class="post-metadata">

**Author:** ![rsobar](https://avatars.discourse-cdn.com/v4/letter/r/9fc348/32.png) [@rsobar](https://developer.sailpoint.com/discuss/u/rsobar)\
**Post date:** [February 19, 2026, 9:56am UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/16 "2026-02-19T09:56:03Z")

</div>

@rpriya I have adjusted it, but it still shows an error.

---

<div class="post-metadata">

**Author:** ![rpriya](https://avatars.discourse-cdn.com/v4/letter/r/bc79bd/32.png) [@rpriya](https://developer.sailpoint.com/discuss/u/rpriya)\
**Post date:** [February 19, 2026, 2:00pm UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/17 "2026-02-19T14:00:29Z")

</div>

@rsobar The transform works for me, you might have to troubleshoot it on your end. Also, ensure you’ve selected _Apply Changes_ on the identity profile—if it’s still in Preview mode, the calculated value won’t actually populate the identity attributes

---

<div class="post-metadata">

**Author:** ![system](https://global.discourse-cdn.com/sailpoint/original/2X/f/f2136700ed5e3703e0b85e02f6be799dacca7735.png) [@system](https://developer.sailpoint.com/discuss/u/system)\
**Post date:** [April 20, 2026, 2:00pm UTC](https://developer.sailpoint.com/discuss/t/lifecycle-state-transform/195967/18 "2026-04-20T14:00:43Z")

</div>

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.
