Starting with version 6.1, it's possible to check the amount of available user licenses before creating a user.

When using SAML Just-In-Time provisioning, this works using a Groovy transformation on the "find User"-attribute, usually the username.

// In this example, it's assumed that the SAML Name ID contains the username.

// Check if the user already exists in the system and just
// return the Name ID in this case
def existingUser = findUserKeyByUsername(mapping.ATTR_NAMEID)
if(existingUser != null) {
    return mapping.ATTR_NAMEID

int freeLicenses = getAvailableJiraSoftwareUserLicenses();  // Jira Software
//int freeLicenses = getAvailableJSMUserLicenses();           // Jira Service Management
//int freeLicenses = getAvailableJiraCoreUserLicenses();      // Jira Core
//int freeLicenses = getAvailableBitbucketUserLicenses();     // Bitbucket
//int freeLicenses = getAvailableConfluenceUserLicenses();    // Confluence

// If there are less than 5 free license available, drop the user with an appropriate message
// Which will be shown on the error page.
if(freeLicenses < 5 ) {
	return dropAll("Not enough Licenses: $freeLicenses")
} else {
	return mapping.ATTR_NAMEID