Understanding Transforms in SailPoint Identity Security Cloud

Transforms are helpful in transforming data into our required format or validating data before processing into SailPoint or processing from SailPoint to target applications.
To learn more about transforms have a look on sailpoint offical documentation.
https://developer.sailpoint.com/docs/extensibility/transforms
Below are some use cases for transforms.
1.Build display name by reading first name and last name from the HR System. (performed null check as well)
{
"name": "Transform_HR_System_DisplayName_Kp",
"type": "concat",
"attributes": {
"values": [
{
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "firstname"
}
},
""
],
"ignoreErrors": false
}
},
" ",
{
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "lastname"
}
},
""
],
"ignoreErrors": false
}
}
]
},
"internal": false}
2. Extract first two letters of firstname
{
"name": "HRMS_SubString_first2Letters_fname_KP",
"type": "substring",
"attributes": {
"begin": 0,
"end": 2,
"value": {
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "firstname"
}
}
},
"internal": false
}
3. Extract last 2 letters of the last name
{
"name": "HRMS_SubStrng_Last2Letters_lastname_KP",
"type": "rule",
"attributes": {
"name": "Cloud Services Deployment Utility",
"operation": "getEndOfString",
"numChars": "2",
"input": {
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "lastname"
}
},
"None"
],
"ignoreErrors": false
}
}
},
"internal": false}
4. You receive a country as below , need to return their country code.
India : IN
Netherlands : NL
United States of America : USA
Germany : DE
Canada : CA
Nepal : NP
France : FR
Philippines : PH
{
"name": "HRMS_LookUp_CountryCode_KP",
"type": "lookup",
"attributes": {
"table": {
"India": "IN",
"Netherlands": "NL",
"United States of America": "USA",
"Germany": "DE",
"Canada": "CA",
"Nepal": "NP",
"France": "FR",
"Philippines": "PH",
"United Kingdom": "UK",
"default": "None"
}
},
"internal": false
}
5. We receive mobile number from the HR System but it doesn’t have any country code, use the country from the HR Source and calculate mobile number with the country code.
{
"id": "cf84be09-8f56-4a9a-8c93-22b7daaa92a7",
"name": "HRMS_CountryCode_Kp",
"type": "concat",
"attributes": {
"values": [
{
"input": {
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "countrycode"
}
},
"US"
],
"ignoreErrors": false
}
},
"type": "lookup",
"attributes": {
"table": {
"US": "+1",
"CA": "+1",
"GB": "+44",
"AU": "+61",
"IN": "+91",
"DE": "+49",
"FR": "+33",
"IT": "+39",
"ES": "+34",
"MX": "+52",
"BR": "+55",
"CN": "+86",
"JP": "+81",
"KR": "+82",
"RU": "+7",
"ZA": "+27",
"SA": "+966",
"AE": "+971",
"AR": "+54",
"ID": "+62",
"default": "+1"
}
}
},
" ",
{
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "phone"
}
},
"1234567890"
],
"ignoreErrors": false
}
}
]
},
"internal": false
}
6. You receive a lastname from HR System, but there are chances that some identities didn’t have lastname. How do you handle this?
{
"name": "HRMS_ChkLastname_Kp",
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "lastname"
}
},
""
],
"ignoreErrors": false
},
"internal": false
}
7. Generate email in below format.
Format1 : firstnamelastname@domain.com
Format2: first letter of (firstname) +lastname@domain.com
Format3: employeeID@domain.com
Domain should be calculated based on below:
TCS: @tcs.com
Zudio: @zudio.com
Tanishq: @tanishq.com
Croma: @croma.com
IRCTC: @irctc.com
Format1 is below. Format2 and format3 are similar to that.
{
"name": "HRMS_email_generator_Kp",
"type": "concat",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "firstname"
}
},
".",
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "lastname"
}
},
{
"input": {
"type": "firstValid",
"attributes": {
"values": [
{
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "domain"
}
},
"default"
],
"ignoreErrors": false
}
},
"type": "lookup",
"attributes": {
"table": {
"TCS": "@tcs.com",
"Zudio": "@zudio.com",
"Tanishq": "@tanishq.com",
"Croma": "@croma.com",
"IRCTC": " @irctc.com",
"default": "@default.com"
}}}]},
"internal": false
}
8. Convert the lastname to lowercase.
{
"name": "HRMS_lastname_lowercase_Kp",
"type": "lower",
"attributes": {
"input": {
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "lastname"
}
}
},
"internal": false
}
9.convert the first name to uppercase.
Similar to lower :: change type as “upper”
10.convert first name :: first letter has to be in capital letter and remaining all has to be in small letters.
{
"name": "HRMS_firstname_selectedformat_Kp",
"type": "static",
"attributes": {
"value": {
"type": "concat",
"attributes": {
"values": [
{
"type": "upper",
"attributes": {
"input": {
"type": "substring",
"attributes": {
"begin": -1,
"end": 1,
"input": {
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "firstname"
}}}}}},
{
"type": "lower",
"attributes": {
"input": {
"type": "substring",
"attributes": {
"begin": 1,
"input": {
"type": "accountAttribute",
"attributes": {
"sourceName": "HRMS_KP",
"attributeName": "firstname"
}}}}}}]}}},
"internal": false
}
I appreciate you reading till the end! Let me know your thoughts or if there's anything I should add. Cheers! 🎉
Subscribe to my newsletter
Read articles from Kranthi directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Kranthi
Kranthi
👋 Hi, I’m Kranthi Kumar Puttapaka, a Certified SailPoint IAM Engineer with over 5 years of experience in building secure and scalable identity solutions. I help organizations streamline their Identity & Access Management (IAM) processes and strengthen their security posture. I specialize in designing and implementing enterprise-grade IAM systems using technologies like SailPoint IdentityIQ, Identity Security Cloud (ISC), Okta, Azure AD (Entra ID), and CyberArk. My focus areas include identity governance, access lifecycle automation, role-based access control, and Zero Trust security architectures. Over the years, I’ve led multiple SailPoint IIQ to ISC migration projects with zero downtime, developed custom connectors for seamless integrations, and implemented compliance frameworks like SOX, GDPR, HIPAA, and NIST. I also have hands-on experience with cloud platforms such as AWS and Azure, enabling organizations to adopt cloud-native identity governance. On the technical side, I work with Java, JavaScript, Python, and BeanShell for customization and automation. My toolkit includes Spring Boot, Spring Security, Docker, Terraform, and databases like MySQL, Oracle, MongoDB, and LDAP. Here on Hashnode, I write about IAM architecture patterns, SailPoint implementation deep dives, cloud identity strategies, Zero Trust security models, and real-world challenges I’ve solved in Identity Governance. Always excited to connect with fellow IAM professionals and share knowledge about building secure, scalable identity solutions. Let’s make the digital world more secure, one identity at a time!