Textkernel Search + Match: Setup and Configuration Guide

Note: To take advantage of the features mentioned in this documentation, your Org needs to be using (Undefined variable: bh4SFVersions.Latest Package Version) or newer. See Release Notes for more details about which features were introduced in each release. If you would like to upgrade to the current release, contact Bullhorn for Salesforce Support.

This configuration guide is designed for Salesforce System Administrators. Please see Textkernel Search + Match: Overview for general information and a list of guides designed for end-users.

Overview

This configuration guide is used to enable Textkernel Search + Match in tandem with Bullhorn for Salesforce Professional Services and Textkernel. The steps in this guide can be used for both SandboxClosed Non Production Environments are used by customers to test new features prior to them going live. and Production Orgs. Textkernel Search + Match requires the Bullhorn for Salesforce 2020.10 GA Release (Package Version 5.31.2) or newer.

Steps

Select a Textkernel Environment and Enter Credentials

Textkernel provides two environments, one for your Production Org and another for Sandbox Orgs. There are two corresponding sets of credentials provided by Textkernel for accessing Production and Sandboxes, respectively. All the steps in this guide need to be completed in both Orgs, unless specified otherwise.

Activate the environment:

  1. Go to Setup > Custom Metadata TypesTextkernel configuration.
  2. In the EnvironmentClosed In Salesforce terminology, any type of instance where the application can be used, like a production instance (where users use the product daily) or a testing environment (a Salesforce instance created just to develop and test features). Or can be used with reference to an external database Type field enter Production or Sandbox depending on the type of Org being configured.
  3. In Environment enter Custom.
  4. Navigate to the Textkernel Management Component tab, click on Single Tenant settings and click the Manage custom settings button. You may need to create a Tab for the Textkernel Management Component if it is not yet configured.
  5. Enter the credentials provided by Textkernel in the form that pops up.

Create a Search and Match Page

  1. Go to Setup >Tabs.
  2. Scroll down to the Lightning Component Tabs related list and click on New.
  3. Populate the following fields:
    • Lightning component: TR1:TextkernelIframe
    • Tab Label: <desired_label>
    • Tab Name: <desired_name>
    • Tab Style: <desired_icon>
    • Description: <optional>
  4. Click on Next.
  5. Add tab visibility to the necessary profiles and Save.

Enable Candidate Search, Job Search, and Portal

  1. Go to Setup > Custom Metadata Types > Textkernel configuration and click Manage Records.
  2. Choose Textkernel Configuration.
  3. On this page, enable these three checkboxes:

Configure Candidate Indexing with Textkernel

These steps will configure the standard Candidate Data Model, which defines what Candidate data is synced with Textkernel and indexed. This involves customizing the trace message format (TMFClosed A technical term, not specific to BH4SF. It's a file format used in parsing.) file, which is a structured text file that contains instructions for parsing and formatting. This data model customization needs to be coordinated between the Bullhorn for Salesforce Professional Services team and Textkernel to be able to be implemented.

Changes to Out-of-the-Box TMF

For any change to the TMF, go to Setup > Custom Metadata Types > Textkernel object configuration and click on Manage Records, then choose Edit Candidate.

Checkboxes in the TMF require either a numeric value or a true/false value. The default is True/False but this can be customized by adding attributes:

  • To send 1/0, add the attribute bhtk:convertBooleanToNumeric="true"
  • To send yes/no, add the attribute bhtk:convertBooleanToYesNo="true"

These additional attributes should be added to the respective TMF nodes. For Contact nodes, update the itemGroup tag for respective fields. For all related objects and fields (such as Education/Employment), update the Field tag

In some Orgs, <ItemGroup> with the OtherCountryCode field may need to be removed from the TMF, per this screenshot:

Configure Which Contacts are Indexed

  1. Go to Setup > Custom Metadata Types > Textkernel configuration and click on Manage Records.
  2. Check if these two fields are on the page layout and if not, add them:

For example, you could use a checkbox field DoNotIndex__c and configure this setting as follows:

  • Candidate Filter Field: DoNotIndex__c
  • Candidate Filter Value: False

This will result in all ContactsClosed A contact (or client contact) is the person who the recruiter is working with at a Company. In Talent Rover a Contact can be either a Client Contact or a Candidate Contact. Both types of Contacts are stored in the same object (Contact). that have the DoNotIndex__c checkbox unchecked to be included in the Indexing.

Do not use package field TR1__donotuseinsam__c for this configuration, as there is logic attached to this field that results in Contacts with TR1__donotuseinsam__c = True being excluded from search results.

Start Indexing

  1. Go to the Textkernel Management tab.
  2. Click on Queue all CandidatesClosed A person looking for a job. A candidate can also be referred to as a Job Seeker, Applicant, or Provider. for Indexing.
  3. Once they are queued, click on Start Indexer.

Configure Job Indexing with Textkernel

These steps will configure the standard VacancyClosed A job (vacancy, position, role) is an opening for which a customer's client needs a placement. Data Model, which defines what Job data is synced with Textkernel and indexed. There is an option to customize the data model which needs to be coordinated between the Bullhorn for Salesforce Professional Services team and Textkernel to be implemented.

Add the Job Indexing Template

  1. Go to Setup > Custom Metadata Types > Textkernel object configurations > Job.
  2. On the Job .mdt record, paste the standard TMF template (see below) into the TemplateClosed In BH4SF, this mainly refers to email templates field and Save. Make sure that Object is set to Job on this record.
  3. Go to Setup >Custom Metadata Types >Textkernel configuration and in the Activation of module section and select the Job search enabled checkbox.

Start Job Indexing

  1. Go to the Textkernel Management Component tab and click on Queue All JobsClosed A job (vacancy, position, role) is an opening for which a customer's client needs a placement. for Indexing.
  2. Once queueing is complete, click on Start Indexer.

Standard Job Indexing TMF

Copy
<?xml version="1.0" encoding="UTF-8"?>
<Vacancy api_version="tk_vacancy_01.4" xmlns:bhtk="http://www.bullhorn.com/BHTK_DomParser/xml_namespace">
    <Language></Language>
    <JobTitle bhtk:object="TR1__Job__c" bhtk:field="TR1__Job_Title__c" />
    <Location></Location>
    <ReferenceNumber bhtk:object="TR1__Job__c" bhtk:field="TR1__Job_Number__c" />
    <NumberOfOpenings bhtk:object="TR1__Job__c" bhtk:field="TR1__Number_of_Openings__c"/>
    <ApplicationDeadline></ApplicationDeadline>
    <StartDate bhtk:object="TR1__Job__c" bhtk:field="TR1__Estimated_Start_Date__c"/>
    <PostingDate bhtk:object="TR1__Job__c" bhtk:field="TR1__Open_Date__c"/>

    <Organization>
        <Name bhtk:object="TR1__Job__c" bhtk:field="TR1__Account_Name__c" />
        <Address></Address>
        <Phone></Phone>
        <Email bhtk:object="TR1__Job__c" bhtk:field="TR1__Contact_Email__c" />
        <Fax></Fax>
        <Website bhtk:object="TR1__Job__c" bhtk:field="TR1__Account__r.Website" />
        <ContactPerson bhtk:object="TR1__Job__c" bhtk:field="TR1__Contact__r.Name" />
        <Industry bhtk:object="TR1__Job__c" bhtk:field="TR1__Industry__c" />
    </Organization>
    <CandidateRequirements>
        <Experience bhtk:object="TR1__Job__c" bhtk:field="TR1__Years_of_Experience__c"/>
        <Education bhtk:object="TR1__Job__c" bhtk:field="TR1__Education_Requirements__c"/>
        <Competences></Competences> 
        <ComputerSkills bhtk:object="TR1__Job__c" bhtk:field="TR1__Computer_Systems__c" /> 
        <DrivingLicenses></DrivingLicenses>
        <LanguageSkills></LanguageSkills>
    </CandidateRequirements>
    <ConditionsBenefits>
        <ContractType></ContractType>
        <EmploymentType></EmploymentType>
        <HoursPerWeek></HoursPerWeek>
        <WorkingHours></WorkingHours>
    </ConditionsBenefits>
    <Sections>
        <EmployerDescription></EmployerDescription>
        <JobDescription></JobDescription>
        <CandidateProfile></CandidateProfile>
        <ConditionsBenefits bhtk:object="TR1__Job__c" bhtk:field="TR1__Bonus__c"/>
        <ApplicationProcedure></ApplicationProcedure>
    </Sections>
    <VacancyDocument bhtk:object="TR1__Job__c" bhtk:field="TR1__Client_Job_Description__c" />
    <UserArea>
        <Location>
            <City bhtk:object="TR1__Job__c" bhtk:field="TR1__City__c"/>
            <ZipCode bhtk:object="TR1__Job__c" bhtk:field="TR1__Postal_Code__c"/>
            <State bhtk:object="TR1__Job__c" bhtk:field="TR1__State_Area__c"/>
            <CountryCode bhtk:object="TR1__Job__c" bhtk:field="TR1__Country__c"/>
        </Location>
        <RecordTypeName bhtk:object="TR1__Job__c" bhtk:field="RecordType.Name" />
        <RecordTypeID bhtk:object="TR1__Job__c" bhtk:field="RecordTypeId" />
        <Level bhtk:object="TR1__Job__c" bhtk:field="TR1__Level__c" />
        <OtherExperience bhtk:object="TR1__Job__c" bhtk:field="TR1__Other_Experience__c" />
        <PrimaryBackground bhtk:object="TR1__Job__c" bhtk:field="TR1__Primary_Background__c" />
        <RegionalArea bhtk:object="TR1__Job__c" bhtk:field="TR1__Regional_Area__c" />
        <SecondaryBackground bhtk:object="TR1__Job__c" bhtk:field="TR1__Secondary_Background__c" />
        <Status bhtk:object="TR1__Job__c" bhtk:field="TR1__Status__c" />
        <SalaryHigh bhtk:object="TR1__Job__c" bhtk:field="TR1__Salary_High__c" />
        <ClosedReason bhtk:object="TR1__Job__c" bhtk:field="TR1__Closed_Reason__c" />
        <Division bhtk:object="TR1__Job__c" bhtk:field="TR1__Division__c" />
        <MaximumBillRate bhtk:object="TR1__Job__c" bhtk:field="TR1__Maximum_Bill_Rate__c" />
        <MaximumPayRate bhtk:object="TR1__Job__c" bhtk:field="TR1__Maximum_Pay_Rate__c" />
        <PrimaryMatchingRequirement bhtk:object="TR1__Job__c" bhtk:field="TR1__Primary_Matching_Requirement__c" />
        <ExperienceRequirements bhtk:object="TR1__Job__c" bhtk:field="TR1__Experience_Requirements__c" />
        <Account bhtk:object="TR1__Job__c" bhtk:field="TR1__Account__c" />
        <Contact bhtk:object="TR1__Job__c" bhtk:field="TR1__Contact__c" />
    </UserArea>
</Vacancy>

Add a Textkernel Portal Signing Certificate

Create a Signing Certificate

A Signing Certificate must be configured for each Org in a single-tenant environment (Production or Sandbox), while all Orgs in the same environment can share the same Portal Account.

  1. Go to Setup > Security > Certificate and Key Management.
  2. Click the Create CA-Signed Certificate button.
  3. Fill all the required fields according to the help text provided for each field. The Key Size field value must be 2048.

    When creating the certificate, follow this required naming convention: TKPortal_[org id]_[year]. For example: TKPortal_11111111111_2020.

    A valid email address where the certificate expiration reminder will be sent has to be entered in the Email Address field. This email address needs to be monitored for these types of requests. When the certificate is about to expire, Bullhorn has to create a new certificate and submit a new signing request.

  4. Click Save to create a certificate, which will be referred to as the signing certificate.

See Textkernel Search + Match: Portal Certificate Creation for more details about certificate creation.

Get the Signing Certificate Signed by Bullhorn

  1. Open the certificate detail page and click the Download Certificate Signing Request button. Save the .csr file to your computer.
  2. Send the .csr file to Bullhorn through Professional Services. Bullhorn will sign the certificate using the .csr file and provide a .crt file, which is a signed version of the certificate. Additionally, Bullhorn will provide intermediate and root certificate files with .crt extension. Save them to your computer.

Upload the Signed Certificate into the Org

  1. Go back to the certificate record that was created earlier. On the certificate detail page, click the Upload Signed Certificate button.
  2. Click Choose File, select the .crt file for the certificate provided by Bullhorn and click Save.

Configure the Textkernel Portal Configuration Custom Metadata Type

To complete the configuration of the TextKernelClosed A BH4SF partner. One of the Search and Match / Resume Parsin services providers integrated with BH4SF Portal Configuration Custom Metadata Type, you need a few values from your Portal Account.

Contact Textkernel and provide the following information:

  • JWT Issuer
  • Portal Account Name. The Portal account name is always the same as the Candidate Search environment name without the '_cv' .

Textkernel will provide back the following:

  • URL
  • Account name (Configuration Service Username)
  • Admin password (Configuration Service Password)
  1. Go to Setup > Custom Metadata Types > Textkernel Portal Configuration.
  2. Click the Manage Textkernel Portal Configurations button.
  3. Click on New
  4. Fill in all the required fields following the instructions below. Save after entering all the information.

Label

Enter in any name, such as Textkernel Portal Config.

Textkernel Portal Configuration Name

This will be automatically populated after entering a label.

Login URL

Textkernel will provide this when Portal Account is created. The URL must be completed by adding ssoClosed Single Sign On is an authentication process that allows a user to access multiple applications with one set of login credentials./jwt/login?jwt=

For example, if Textkernel provides https://staging.textkernel.nl/tkportal/ then the correct Login URL will be: https://staging.textkernel.nl/tkportal/sso/jwt/login?jwt=

Signing Certificate Name

Copy this from Setup > Security > Certificate and Key Management and click on the name to open the record and copy the value in the Unique Name field.

Account Name

Textkernel will provide this when the Portal Account is created.

JWT Issuer

This is entered in the format [CN value from Certificate record] : BH4Force Partner Services Intermediate CA.

A colon must be used to separate the two parts, the second part is always the same. The first part comes from the Certificate record:

  1. Go to SetupSecurity > Certificate and Key Management.
  2. Select your certificate in the Certificates section.
  3. On the Certificate record, go to the Certificate field and copy the string just after CN=.

The correct JWT Issuer value based on the screenshot above would be tkportal_emea5:BH4Force Partner Services Intermediate CA.

Signing Certificate

Open the .crt file of the signing certificate with any text editor. Copy all the text content between the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- lines and paste it into the Signing Certificate field.

Intermediate Certificate

Repeat steps above for Signing Certificate except with the Intermediate certificate provided by Bullhorn. Paste the text into the Intermediate Certificate field.

Root Certificate

Repeat steps above for Signing Certificate except with the Root certificate provided by Bullhorn. Paste the text into the Root Certificate field.

Configuration Service Username

This is the Account name Textkernel will provide when the Portal Account is created.

Configuration Service Password

This is the Admin Password Textkernel will provide when the Portal Account is created.

Search Policy URL

Use this format:

Prod Environment: Service Endpoint URL + /portal/config/searchPolicy

UAT Environment: Service Endpoint URL + /tkportal/config/searchPolicy

User Config URL

Bullhorn will provide the Service Endpoint URL.

Prod Environment: Service Endpoint URL + /portal/config/user

UAT Environment: Service Endpoint URL + /tkportal/config/user

Portal CSS customization options

  1. Go to Setup > Custom Metadata Types > Textkernel configuration
  2. If you are upgrading an existing Org, pull the following new fields on the page layout:
    • Portal CSS url
    • Candidate CSS url
    • Job CSS url


  3. Enter this value in the Portal CSS url field: https://tr-tkportalcss.s3-eu-west-1.amazonaws.com/bhtkportal.css

Configure Search Policies

Add Field to Contacts and Jobs Objects to Store Access Criteria

  1. Go to Setup > Picklist Value Sets > Textkernel Access RolesClosed A job (vacancy, position, role) is an opening for which a customer's client needs a placement..
    • The values added to this picklist will be used to mark Contact and Job records for inclusion in a search policy. For example, you might have London Office, New York Office, Rome Office as values in this picklist.
  2. Create two new multi-picklist fields called Textkernel Access Roles, one each on the Contact and Job Objects. Choose the Textkernel Access Roles global picklist when creating this field. Make sure that this field has at least one selected value.

The Textkernel Access Roles fields on Contact and Job records need to be populated with the relevant values to indicate which Access Roles should have visibility of the record. A mass record update might be necessary. These values/access roles will be associated to Users, so once Users and Contact/ Job records are indexed with Textkernel, only records that have values matching a UserClosed In Salesforce terminology, this is anybody that has login access to an instance. In BH4SF instances, usually the staff of recruiting companies access roleClosed A job (vacancy, position, role) is an opening for which a customer's client needs a placement. will be visible for that User.

Enable Sharing for Candidates and Jobs

  1. Go to Setup > Custom Metadata Type > Textkernel Configuration and click on Manage Records.
  2. Choose Textkernel configuration and in the Sharing section enable these two checkboxes:
    • Candidate sharing enabled
    • Job sharing enabled
  3. Enter the API Name of the multi-select picklist fields you created on the Contacts object and Job objects in the Candidate sharing field and Job sharing field.

Create a Search Policy

  1. Go to App Launcher > TKClosed An abbreviation for Textkernel Portal Search Policies (System Admins only have access to this tab) and click on New.
  2. Select which Access Roles you want to enable for Contacts and Jobs with this Policy:

Create a Search Policy Assignment

  1. After creating a Search Policy record, click on the Related tab on the same record.
  2. Click on New to create a Search Policy AssignmentClosed A Job position record to associate Users to the policy you have created.

Assign Permission Set

Assign the Module textkernel user permissions permission set to each user who is using Textkernel Search + Match, if not already assigned.

Add the Match! Button to Contact and Job Records

Contact Object

  1. Go to Setup > Object Manager > Contact > Buttons, Links, and Actions.
  2. Go to Create Button or Link.
  3. Fill in the following information:
    • Label: Match! (or preferred label)
    • Display Type: Detail Page Button
    • Behavior: Display in new window
    • Content Source: URL
  4. Enter this script in formula input field:
    Copy
    {!URLFOR("/lightning/cmp/tr1__TextkernelIframe",null,['tr1__candidateId'= CASESAFEID(Organization.Id) + '_' + CASESAFEID(Contact.Id),'tr1__selectedTab'='jobSearch'])}
  5. Save and add the button to the relevant Contact page layout.

Job Object

  1. Go to Setup > Object Manager > Job > Buttons, Links, and Actions.
  2. Go to Create Button or Link.
  3. Fill in the following information:
    • Label: Match! (or preferred label)
    • Display Type: Detail Page Button
    • Behavior: Display in new window
    • Content Source: URL
  4. Enter this script in formula input field:
    Copy
    {!URLFOR("/lightning/cmp/tr1__TextkernelIframe",null,['tr1__jobId'= CASESAFEID(Organization.Id) + '_' + CASESAFEID(TR1__Job__c.Id),'tr1__selectedTab'='candidateSearch'])}
  5. Save and add the button to the relevant Contact page layout.

Configure Resume Parsing

Confirm Connection Record

Confirm with Bullhorn that your Org is set up correctly for Textkernel Resume ParsingClosed A process which converts an unstructured form of resume data into the structured format..

Set Textkernel as the Search and Match Provider

  1. Go to Setup > Custom Metadata Types > Search & Match Configuration then click on Manage Records.
  2. Click Edit and select Textkernel from the Provider Type dropdown.

Add the Lightning Document Parser

  1. Go to Setup > User Interface > Publisher Layouts.
  2. Click on the Edit link next to the Publisher Layout Name Global Layout.
  3. From Mobile & Lightning Actions on the left, drag and Drop Resume Parser (be sure to choose the one with API name of TR1__Lightning_Resume_Parser) to the Salesforce and Lightning Experience Actions section, then Save

If the Org is switching to Lightning for the first time, a domain name will need to be created to enable any of the custom components. Go to Setup > CompanyClosed A Company is the organization where the contact works. This can also be called the Client. Settings > My Domain to set that up.

Configure Data Mapping from Resume to Contact Record

Refer to Resume Parsing with Textkernel: Parsing Architecture and Field Mapping for more information.

Configure External Searches and Import Candidates Functionality

Refer to Textkernel Search + Match: External Searches and Import Candidates Configuration Guide for more information.