Custom fields created via BTP extensibility wizard in onboarding not syncing to backend system

We’ve added custom fields to our onboarding forms using the new BTP extensibility wizard in SF H1 2024, but the data entered in these fields isn’t syncing to our backend HR system. The fields appear correctly on the forms and users can input data, but when we check our integration logs, these custom field values aren’t being included in the payload sent to our external system. Standard onboarding fields sync perfectly. We’ve verified the BTP extension deployment was successful and the data model mapping looks correct in the extension configuration. The form field binding seems proper as well, but somehow the custom data isn’t making it through. Is there an additional configuration step needed to include BTP-extended fields in outbound integration payloads? Here’s our field definition structure:


Extension: CustomOnboardingFields
Field: emergencyContactRelation
Type: String
Binding: ONB2_CustomData.relation

Any guidance on ensuring these extensions participate in data synchronization would be appreciated.

Thanks for the insights. I’ve checked our integration configuration and we’re using the standard Onboarding OData API. The OAuth scope includes basic onboarding permissions but I don’t see any BTP-specific scopes listed. How do I identify which scope is needed for our extension?

Let me provide a comprehensive solution addressing all aspects of BTP extension data synchronization.

Regarding BTP extension deployment: First, verify that your extension is not just deployed but also activated and published. In BTP cockpit, navigate to your SuccessFactors extension application and check the deployment status. The extension must show as ‘Active’ and ‘Published’ - simply being deployed isn’t sufficient for data synchronization. Additionally, confirm that the extension version matches what’s configured in your SuccessFactors instance. Version mismatches can cause silent data sync failures.

For data model mapping: The binding path ‘ONB2_CustomData.relation’ you’ve shown is correct syntactically, but you need to ensure the parent entity ONB2_CustomData is properly linked to the main onboarding entity. Open your extension definition in BTP and verify the entity relationship mapping. The custom entity should have a navigation property back to the standard Onboarding entity. Without this bidirectional relationship, the data remains isolated in the extension layer.

Regarding form field binding: Beyond the binding path, check the field metadata in the form configuration. BTP extension fields require an additional attribute ‘extensionField=“true”’ in the form XML. Here’s the corrected structure:


<field id="emergencyContactRelation"
       binding="ONB2_CustomData.relation"
       extensionField="true"
       extensionNamespace="CustomOnboardingFields"/>

For extension validation in integration context: Your integration needs three specific configurations. First, add the extension namespace to your OData query using the $expand parameter:


$expand=CustomOnboardingFields
$select=*,CustomOnboardingFields/*

Second, update your OAuth client to include the extension-specific scope. In API Center, edit your OAuth client and add scope ‘ext.CustomOnboardingFields.read’. Third, modify your integration mapping to explicitly reference the extension fields using dot notation: ‘CustomOnboardingFields.emergencyContactRelation’.

Critically, there’s a configuration in Integration Center that must be enabled for BTP extensions to participate in outbound flows. Navigate to Integration Center > Manage Integration Settings and enable ‘Include BTP Extensions in Standard Flows’. This global setting is disabled by default for performance reasons but is required for extension data to be included in integration payloads.

Another common issue is timing - BTP extension data is sometimes persisted asynchronously after the main onboarding record. If your integration triggers immediately on onboarding completion, it might execute before extension data is available. Add a small delay (30-60 seconds) to your integration trigger or implement a polling mechanism that checks for extension data availability before attempting synchronization.

Finally, verify that your backend system’s data model can accommodate the extension fields. The receiving system needs corresponding fields mapped to accept the custom data. Check your integration error logs specifically for ‘unmapped field’ or ‘unknown property’ errors which indicate the backend isn’t configured to receive the extension data.

Test your changes by creating a new onboarding record with custom field data, then manually trigger the integration and review the complete payload in the integration logs to confirm extension fields are now included.

I implemented this exact scenario last quarter and discovered a critical configuration point that’s not well documented. When you create custom fields through the BTP extensibility wizard, those fields are stored in a separate extension table rather than the standard onboarding entity. The standard OData API for onboarding retrieves data only from core tables by default. You need to enable the ‘Include Extension Fields’ parameter in your OData query. This is done by adding an expand clause that specifically references your extension namespace. Without this, the API response will only contain standard fields regardless of OAuth scope configuration.