Customizers
SaaS connectivity customizers are cloud-based connector customizers that make customizing Webservice SaaS connectors possible. By using a customizer, you can change a connector's input before the connector ingests the data, or you can change the connector's output before the output is sent to Identity Security Cloud.
Prerequisites
-
To use the customizers, SailPoint CLI is required. To set it up, refer to CLI | SailPoint Developer Community.
-
To build and upload the SaaS connector customizer, refer to Building and Uploading to Identity Security Cloud | SailPoint Developer Community.
-
To find the commands available to implement in a SaaS connector customizer, refer to Customizer Commands | SailPoint Developer Community.

If you want to change the input attributes before account creation, you can use the beforeStdAccountCreate
method. Let’s consider a use case where an attribute that is not present in the schema (userType), needs to be added before the account creation to determine which account type you want to create. Refer to the following template:
// Get connector source config
const config = await readConfig()
return createConnectorCustomizer()
.beforeStdAccountCreate(async (context: Context, input: StdAccountCreateInput) => {
logger.info(`Running before account, for account ${input.identity}`)
input.attributes.userType = 'member';
return input
})

If you want to change the output attributes after account read, you can use the afterStdAccountRead
method. Let’s consider a use case where an attribute that is not present in the schema (active), needs to be added after the account aggregation has been performed for determining whether the user is active or not. Refer to the following template:
// Get connector source config
const config = await readConfig()
return createConnectorCustomizer()
.afterStdAccountRead(async (context: Context, output: StdAccountReadOutput) => {
logger.info(`Running after account read for account ${output.identity}`)
output.attributes.isActive = true;
return output
})

If you want to change the input attributes before account aggregation, you can use the beforeStdAccountAggregation
method. Let’s consider a use case where you want to determine the number of accounts that were aggregated the last time aggregation was performed. Refer to the following template:
// Get connector source config
const config = await readConfig()
return createConnectorCustomizer()
.beforeStdAccountList(async (context: Context, input: StdAccountListInput) => {
logger.info(`Running before account list for account. State: ${input.state.last_aggregation_count}`)
return input
})

If you want to make changes in one or more operations as mentioned in the above templates, you can club them together. Refer to the following template:
// Get connector source config
const config = await readConfig()
return createConnectorCustomizer()
.beforeStdAccountList(async (context: Context, input: StdAccountListInput) => {
logger.info(`Running before account list for account. State: ${input.state.last_aggregation_count}`)
return input
})
.afterStdAccountRead(async (context: Context, output: StdAccountReadOutput) => {
logger.info(`Running after account read for account ${output.identity}`)
output.attributes.isActive = true;
return output
})
.beforeStdAccountCreate(async (context: Context, input: StdAccountCreateInput) => {
logger.info(`Running before account, for account ${input.identity}`)
input.attributes.userType = 'member';
return input
})