Briggs Rajagopalan
03/12/2026, 4:06 PMDevRev
03/12/2026, 4:08 PM<!-- The Custom Login ID component accepts any username format -->
<!-- No email/phone validation required -->
Key Benefits
• Create any username without email/phone sanitization requirements
• Support external IDs or custom identifiers
• No email/phone requirement for password-based authentication
The Custom Login ID field is specifically designed for usernames or external IDs that must be uniquely associated with a user . Whatever value users enter in this field becomes their unique identifier for sign up and sign in actions.
Customize Password Authentication | Descope Documentation
Login ID Fields in Flows | Descope Documentation
Authentication Overview | Descope DocumentationBriggs Rajagopalan
03/12/2026, 4:21 PMDevRev
03/12/2026, 4:22 PM// Create user with username as login ID
const resp = await descopeClient.management.user.create(
'username123', // loginId as username
{
displayName: 'User Name',
// No email/phone required
}
);
2. Use additional login IDs to include usernames alongside required email/phone :
additionalLoginIds: ["username123"]
Current Limitation
The invitation system requires email or phone for sending invitation messages . Even with Custom Login ID components in flows, the invitation process itself needs a communication channel (email/SMS) to deliver the invitation link.
For pure username-only scenarios without any contact information, you'll need to create users directly through the Management SDK rather than using the invitation system.
Customize User Invites | Descope Documentation
Users in the Backend | Descope Documentation
Using the User Invite Action | Descope DocumentationBriggs Rajagopalan
03/12/2026, 4:29 PMDevRev
03/12/2026, 4:30 PMadditionalIdentifiers to add usernames :
// Update existing user to add username
const resp = await descopeClient.management.user.update(
'existing-user-id',
{
additionalIdentifiers: ['username123', 'another-username']
}
);
Console Workaround
In the Console user invite/creation, you can add usernames by selecting "Add as Login Id" when adding user attributes . This adds the username to the user's login ID collection.
Via Flows
Use Update User actions in flows with "Add to login IDs" enabled to associate usernames with existing users .
The key concept is that usernames are treated as login IDs, not separate user attributes. Users can have multiple login IDs including emails, phones, and custom identifiers like usernames .
Update User Status | API Reference | Descope Documentation
Customize User Invites | Descope Documentation
Link User Identities | Descope Documentation
Login ID Fields in Flows | Descope DocumentationBriggs Rajagopalan
03/12/2026, 4:31 PMDevRev
03/12/2026, 4:32 PMadditionalIdentifiers :
await descopeClient.management.user.update(userId, {
additionalIdentifiers: ['username123']
});
2. During User Creation - When creating users via API, include usernames in additionalIdentifiers
3. User Invite Workaround - When inviting users, use "Add as Login Id" checkbox for custom fields
Why It's Disabled
The Console restricts direct login ID editing to prevent accidental changes that could lock users out. Login IDs are critical authentication identifiers, so modifications are intentionally limited to API/SDK operations where you have more control and can handle errors programmatically.
For username management, you'll need to use the Management API rather than the Console interface.
Update User Status | API Reference | Descope Documentation
Get User's Login History | API Reference | Descope Documentation
Customize User Invites | Descope DocumentationBriggs Rajagopalan
03/12/2026, 5:22 PMDevRev
03/12/2026, 5:22 PMBriggs Rajagopalan
03/12/2026, 5:28 PMDevRev
03/12/2026, 5:28 PMform.externalId is not populated during sign-in for existing users. The form context only contains data from screens that collect user input - it doesn't automatically contain user attributes.
Use user.customAttributes.externalId Instead
For existing users, check their custom attributes using the user context :
user.customAttributes.externalId
Correct Condition Setup
1. Set your condition to check: user.customAttributes.externalId
2. Use operator: "Is Empty" or "Is Not Empty"
3. Connect the appropriate path to your username collection screen
Alternative Approach
If the user hasn't signed in yet, use unauthUser.customAttributes.externalId to check attributes before authentication completes .
Key Point
form.externalId only exists if a previous screen in the current flow collected that input. For existing user attributes, always use user.customAttributes.<attribute-name> or unauthUser.customAttributes.<attribute-name>.
The screen should now appear when the user's externalId custom attribute is empty.
Dynamic Keys & Values | Descope DocumentationBriggs Rajagopalan
03/12/2026, 5:30 PMDevRev
03/12/2026, 5:30 PMexternalId (or whatever name you prefer)
4. Choose the appropriate data type (likely "String")
5. Save the attribute
Then Update Your Condition
Once created, you can reference it in your flow condition as:
• user.customAttributes.externalId (for authenticated users)
• unauthUser.customAttributes.externalId (before authentication)
Important Note
Existing users won't have this attribute populated until you either:
• Update them via Management API
• They go through a flow that sets this value
• You import/update users with this attribute
The custom attribute must exist in your project schema before you can use it in conditions or store values in it.Briggs Rajagopalan
03/12/2026, 10:32 PM