I believe your configuration is correct without seeing the connector-spec and the methods themselves. I would ensure that you are specifying the connector-spec configuration item with the key spConnEnableStatefulCommands. In addition, ensure you are calling the saveState before closing out your account list method.
Per my knowledge, the current SAAS Connector framework does not support handling of deleted/removed accounts during a delta aggregation, only during a full aggregation when the records no longer appear.
Similar to other OOB sources, the delta aggregation is a flag set on the configuration and once enabled, all aggregations will flow through the delta configuration.
When defining the code logic, it is important to ensure that you return all accounts when the stateful information is not available and ensures a proper state saving.
After you have run the aggregation with delta enabled, you can check the source’s connectorAttributes to see the state which was saved (get-source | SailPoint Developer Community). This may help indicate where a problem may be occurring.
I tested the custom SaaS connector aggregation scenarios.
Working:
Account Full Aggregation: worked
Account Delta Aggregation: worked for Create, Modify, and Delete
Entitlement Full Aggregation: worked for all entitlement types:
Group
Role
Profile
Not Working:
Entitlement Delta Aggregation:
Group: not working
Role: not working
Profile: not working
The connector spec has stateful commands enabled
"supportsStatefulCommands": true
The source config also has delta/stateful enabled:
"spConnEnableStatefulCommands": true
The SailPoint docs for std:entitlement:list mention Delta Aggregation / State using supportsStatefulCommands, spConnEnableStatefulCommands, res.saveState(state), input.stateful, and input.state.
Documentation: Entitlement List | SailPoint Developer Community
The connector is following the documented entitlement stateful pattern from SailPoint’s docs:
-- connector-spec.json:
"supportsStatefulCommands": true
{
"key": "spConnEnableStatefulCommands",
"label": "Enable Delta Aggregation",
"required": true,
"type": "checkbox"
}
-- src/index.ts saves state for entitlement aggregation:
const state = restClient.newState()
...
res.saveState(state)
-- src/my-client.ts handles entitlement input.stateful + input.state by selecting the delta path only when both are present:
const path = this.pathForState(listPath, deltaPath, state, stateful)
However, when I trigger Entitlement Aggregation from the ISC UI, ISC is invoking a full entitlement aggregation.
Observation:
Account delta works as expected after a full account aggregation, including Create, Modify, and Delete.
The issue appears specific to entitlement aggregation. When triggered from the ISC UI, entitlement aggregation is still calling std:entitlement:list as full aggregation, not with input.stateful=true.
Question:
Can anyone confirm whether entitlement delta is supported for custom SaaS connectors, and if yes, how to trigger delta for Group, Role, and Profile?