SDK Configuration

Helpshift provides several config options which can be used to customize behaviour of the SDK. These options are boolean flags which can be passed with the Helpshift APIs such as showConversation, showFAQs etc.

Applicable to SDK version 3.0.0 and above

Install Options

enableInAppNotification

Flag
enableInAppNotification
Values
"yes"/ "no"
Default
"yes"

If you want to disable the in-app notifications, please set this variable to "no" in the config dictionary passed to the install.

For Example:

HashMap config = new HashMap();
config.put("enableInAppNotification", "yes");
HelpshiftBridge.install(this, // "this" should be the application object
                        "YOUR_API_KEY",
                        "<YOUR_HELPSHIFT_DOMAIN>.helpshift.com",
                        "YOUR_APP_ID",
                        config);

enableDefaultFallbackLanguage

Available from SDK version 1.0.0 and above

Flag
HS_ENABLE_DEFAULT_FALL_BACK_LANGUAGE
values
yes/no
default
yes

You can enable or disable the SDK default fallback language when showing FAQs using this flag. When set to false, the Helpshift SDK will not fallback to the default language that is English, when showing FAQs. This flag is to be passed only in the config for the HelpshiftBridge.install call.

For Example:

HashMap config = new HashMap();
config.put("enableDefaultFallbackLanguage", "yes");
HelpshiftBridge.install(this, // "this" should be the application object
                        "YOUR_API_KEY",
                        "<YOUR_HELPSHIFT_DOMAIN>.helpshift.com",
                        "YOUR_APP_ID",
                        config);

Using Custom Fonts

Applicable to version 1.4.0 and above.

Add the font to your Resources/fonts folder.

Pass the font location relative to the Resources folder as follows during installation. If the font file DancingScript-Regular.ttf lies in the fonts folder inside the Resources folder, then your path is fonts/DancingScript-Regular.ttf.

For Example:

HashMap config = new HashMap();
config.put("font", "fonts/DancingScript-Regular.ttf");
HelpshiftBridge.install(this, // "this" should be the application object
                        "YOUR_API_KEY",
                        "<YOUR_HELPSHIFT_DOMAIN>.helpshift.com",
                        "YOUR_APP_ID",
                        config);

Test the font in simulator. Errors in font names are ignored by the SDK —

font-in-use.png

API Options

enableContactUs

Flag
enableContactUs
Values
HS_ENABLE_CONTACT_US_ALWAYS/HS_ENABLE_CONTACT_US_NEVER/HS_ENABLE_CONTACT_US_AFTER_VIEWING_FAQS
Default
HS_ENABLE_CONTACT_US_ALWAYS

The enableContactUs flag controls the visibility of Contact Us button -

HS_ENABLE_CONTACT_US_ALWAYS
show in the navigation bar, search, and after marking an FAQ unhelpful.
HS_ENABLE_CONTACT_US_AFTER_VIEWING_FAQS
show only while searching, on FAQ screen and after marking an FAQ unhelpful.
HS_ENABLE_CONTACT_US_NEVER
do not show "Contact Us" button anywhere in the SDK.
HS_ENABLE_CONTACT_US_AFTER_MARKING_ANSWER_UNHELPFUL
do not show "Contact Us" button until the user specifically marks an FAQ as unhelpful.

To override the default value you can pass the arguments in the options dictionary.

Example:

For Cocos2d-x 3.x :

ValueMap config;
config[HS_ENABLE_CONTACT_US] = HS_ENABLE_CONTACT_US_NEVER;
HelpshiftCocos2dx::showFAQs(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *enableContactUs = new CCString(HS_ENABLE_CONTACT_US_NEVER);

config->setObject(enableContactUs, HS_ENABLE_CONTACT_US);
HelpshiftCocos2dx::showFAQs(config);

This flag has no effect for the showConversation API call, since there is no Contact Us button in the conversation screen.

By using this option, you encourage users to read and search FAQs first instead of directly filing new tickets. This facilitates ticket avoidance.

gotoConversationAfterContactUs

Flag
gotoConversationAfterContactUs
Values
"yes"/ "no"
Default
"no"

The gotoConversationAfterContactUs flag will determine whether the user lands up in the conversation screen after starting a new conversation via "Contact Us". This only makes sense if the enableContactUs flag takes on the default value.

Example:

For Cocos2d-x 3.x :

ValueMap config;
config["gotoConversationAfterContactUs"] = Value("yes");
HelpshiftCocos2dx::showFAQs(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
config->setObject(new CCString("yes"), HS_GOTO_CONVERSATION_AFTER_CONTACT_US);
HelpshiftCocos2dx::showFAQs(config);

For showFAQs, showFAQSection and showSingleFAQ, setting gotoConversationAfterContactUs makes sense only if enableContactUs is yes.

requireEmail

Applicable to SDK version 3.5.0 and above

Flag
requireEmail
Values
"yes" / "no"
Default
"no"

The requireEmail flag will determine whether email is required or optional for starting a new conversation.

When the flag is set to yes customer's email will be required. If set to no email will be optional.

For example:

For Cocos2d-x 3.x :

ValueMap config;
config["requireEmail"] = Value("yes");
HelpshiftCocos2dx::showFAQs(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *requireEmail = new CCString("yes");
config->setObject(requireEmail, HS_REQUIRE_EMAIL);
HelpshiftCocos2dx::showFAQs(config);

If "New Issue Forwarding" is ON or if "Allow anonymous issues" is ON in the agent dashboard, then this flag will be ignored.

Once requireEmail flag is set, the SDK will use that value for all new conversations until it is changed again.

hideNameAndEmail

Applicable to SDK version 3.5.0 and above

Flag
hideNameAndEmail
Values
"yes" / "no"
Default
"no"

The hideNameAndEmail flag will hide the name and email fields when the user starts a new conversation.

When the flag is set to yes the name and email fields will be hidden. If set to no the default behaviour will resume.

If "New Issue Forwarding" is ON then this flag will be ignored when name and email are not available to the SDK. You can use the setNameAndEmail API, to supply the SDK with name and email in this case.

If "Allow anonymous issues" is ON, under app settings in the agent dashboard, then this flag will be ignored.

Also, if the requireEmail flag is set to no and email is not available to the SDK, then hideNameAndEmail flag will be ignored.

For example:

For Cocos2d-x 3.x :

ValueMap config;
config["hideNameAndEmail"] = Value("yes");
HelpshiftCocos2dx::showFAQs(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *hideNameEmail = new CCString("yes");
config->setObject(hideNameEmail, HS_HIDE_NAME_AND_EMAIL);
HelpshiftCocos2dx::showFAQs(config);

Once hideNameAndEmail flag is set, the SDK will use that value for all new conversations until it is changed again.

conversationPrefillText

Applicable to SDK version 3.5.0 and above

Flag
conversationPrefillText
Values
Non-empty string

The conversationPrefillText API option will prefill a new conversation description, with the supplied string. This is useful where you might want your users to send you diagnostic information in the conversation description, for example if the app hits an exception, etc.

Example:

For Cocos2d-x 3.x :

ValueMap config;
config[HS_CONVERSATION_PREFILL_TEXT] = Value("This is prefilled text");
HelpshiftCocos2dx::showConversation(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *prefill = new CCString("This is prefilled");
config->setObject(prefill, HS_CONVERSATION_PREFILL_TEXT);
HelpshiftCocos2dx::showConversation(config);

The conversationPrefillText option takes effect only for the showConversation API.

enableFullPrivacy

Applicable to SDK version 3.6.0 and above

Flag
enableFullPrivacy
Values
"yes" / "no"
Default
"no"

In scenarios where the user attaches objectionable content in the screenshots, it becomes a huge COPPA concern. The enableFullPrivacy flag will help solve this problem.

If this flag is set to yes, it enables full privacy controls for the SDK. The user can be disabled from attaching screenshots and sending personally identifiable information in meta-data. This helps developers ensure full COPPA compliance.

To send personally identifiable information through custom meta-data, the information must be added inside a dictionary with a "private-data" key. If this flag is set to yes, this data will be removed when the user starts a new conversation.

Example:

For Cocos2d-x 3.x :

ValueMap config;
config["enableFullPrivacy"] = Value("yes");
HelpshiftCocos2dx::showConversation(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *enableFullPrivacy = new CCString("yes");
config->setObject(enableFullPrivacy, HS_ENABLE_FULL_PRIVACY);
HelpshiftCocos2dx::showConversation(config);

Once enableFullPrivacy flag is set, the SDK will use that value for all further sessions until it is changed again.

showSearchOnNewConversation

Applicable to SDK version 3.6.0 and above

Flag
showSearchOnNewConversation
Values
"yes" / "no"
Default
"no"

If showSearchOnNewConversation flag is set to yes, the user will be taken to a view which shows the search results relevant to the conversation text that he has entered upon clicking the 'Send' button. This is to avoid tickets which are already answered in the FAQs. The user will still be able to start a new conversation with the same text. He can also go through one of the FAQs and find a solution to his query, and exit the session without submitting a ticket.

Default value is no, ie., this feature will not be enabled unless you explicitly pass yes for this flag.

Example:

For Cocos2d-x 3.x :

ValueMap config;
config[HS_SHOW_SEARCH_ON_NEW_CONVERSATION] = Value("yes");
HelpshiftCocos2dx::showConversation(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *showSearchOnNewConversation = new CCString("yes");
config->setObject(showSearchOnNewConversation, HS_SHOW_SEARCH_ON_NEW_CONVERSATION);
HelpshiftCocos2dx::showConversation(config);

The conversationPrefillText option takes effect only for the showConversation API.

showConversationResolutionQuestion

Applicable to version 1.0.0 and above.

Flag
HS_SHOW_CONVERSATION_RESOLUTION_QUESTION
Values
"yes"/"no"
Default
"yes"

By default the Helpshift SDK will show the conversation resolution question to the user, to confirm if the conversation was resolved. On resolving the conversation from the admin dashboard will now take the user directly to the "Start a new conversation" state. If you want to disable the conversation resolution question, set showConversationResolutionQuestion to no.

Default value is yes, ie., this feature will not be disabled unless you explicitly pass false for this flag.

Example :

For Cocos2d-x 3.x :

ValueMap config;
config[HS_SHOW_CONVERSATION_RESOLUTION_QUESTION] = Value("yes")
HelpshiftCocos2dx::showConversation(config);

For Cocos2d-x 2.x :

cocos2d::CCDictionary *config = new cocos2d::CCDictionary();
CCString *showConversationResolutionQuestion = new CCString("yes");
config->setObject(showConversationResolutionQuestion, HS_SHOW_CONVERSATION_RESOLUTION_QUESTION);
HelpshiftCocos2dx::showConversation(config);

customContactUsFlows

Applicable to Cocos2d-x plugin version 1.2.0 and above.

Option
customContactUsFlows
Value
List of Flows. Flows can be created by using the Guided Issue Filing APIs
Default
There is no default value for this configuration.

This configuration allows you to override the Contact Us buttons inside the Helpshift SDK and show Guided Issue Filing when a user taps on the Contact Us buttons.

Example :

Let's say you want the users to see a particular FAQ section, a single FAQ and 2 different Contact Us flows with different prefill texts when they tap the Contact Us buttons within the Helpshift SDK. In this case, you would configure the menuHelpCallback (a button which triggers Helpshift SDK) in the following way :

For Cocos2d-x 3.x :

void AppDelegate::menuHelpCallback(Ref* pSender) {
     ValueVector forms;

     ValueMap faqSectionFlow;
     faqSectionFlow[HS_FLOW_TYPE] = HS_FAQ_SECTION_FLOW;
     faqSectionFlow[HS_FLOW_TITLE] = Value("FAQ Section");
     faqSectionFlow[HS_FLOW_DATA] = "1";
     forms.push_back(Value(faqSectionFlow));

     ValueMap singleFAQFlow;
     singleFAQFlow[HS_FLOW_TYPE] = HS_SINGLE_FAQ_FLOW;
     singleFAQFlow[HS_FLOW_TITLE] = Value("Single FAQ");
     singleFAQFlow[HS_FLOW_DATA] = "2";
     forms.push_back(Value(singleFAQFlow));

     ValueMap conversationFlow1;
     conversationFlow1[HS_FLOW_TYPE] = HS_CONVERSATION_FLOW;
     conversationFlow1[HS_FLOW_TITLE] = Value("Contact us about our app");
     forms.push_back(Value(conversationFlow1));

     ValueMap conversationFlow2;
     conversationFlow2[HS_FLOW_TYPE] = HS_CONVERSATION_FLOW;
     conversationFlow2[HS_FLOW_TITLE] = Value("Contact us about our in-app purchase");
     forms.push_back(Value(conversationFlow2));

     ValueMap showFAQsConfig;
     showFAQsConfig[HS_CUSTOM_CONTACT_US_FLOWS] = Value(forms);
     showFAQsConfig[HS_ENABLE_CONTACT_US] = Value("yes");

 HelpshiftCocos2dx::showFAQs(showFAQsConfig);
}

For Cocos2d-x 2.x :

void AppDelegate::menuHelpCallback(Ref* pSender) {
    cocos2d::CCArray *forms = CCArray::create();

    cocos2d::CCDictionary *singleSectionForm = CCDictionary::create();
    singleSectionForm->setObject(new CCString(HS_SINGLE_FAQ_FLOW), HS_FLOW_TYPE);
    singleSectionForm->setObject(new CCString("Single Section"), HS_FLOW_TITLE);
    singleSectionForm->setObject(new CCString("95"), HS_FLOW_DATA);
    forms->addObject(singleSectionForm);

    cocos2d::CCDictionary *singleFAQForm = CCDictionary::create();
    singleFAQForm->setObject(new CCString(HS_FAQ_SECTION_FLOW), HS_FLOW_TYPE);
    singleFAQForm->setObject(new CCString("Single FAQ"), HS_FLOW_TITLE);
    singleFAQForm->setObject(new CCString("9"), HS_FLOW_DATA);
    forms->addObject(singleFAQForm);

    cocos2d::CCDictionary *conversationFlow1 = CCDictionary::create();
    conversationFlow1->setObject(new CCString(HS_CONVERSATION_FLOW), HS_FLOW_TYPE);
    conversationFlow1->setObject(new CCString("Contact us about our app"), HS_FLOW_TITLE);
    forms->addObject(conversationFlow1);

    cocos2d::CCDictionary *conversationFlow2 = CCDictionary::create();
    conversationFlow2->setObject(new CCString(HS_CONVERSATION_FLOW), HS_FLOW_TYPE);
    conversationFlow2->setObject(new CCString("Contact us about our
    in-app purchase"), HS_FLOW_TITLE);
    forms->addObject(conversationFlow2);

    cocos2d::CCDictionary *showFAQsConfig = CCDictionary::create();
    showFAQsConfig->setObect(forms, HS_CUSTOM_CONTACT_US_FLOWS);

 HelpshiftCocos2dx::showFAQs(showFAQsConfig);
}

Anytime the Helpshift SDK is presented via menuHelpCallback with this configuration, the Contact Us buttons in the SDK will redirect to Guided Issue Filing with the flows provided in the HS_CUSTOM_CONTACT_US_FLOWS list.

Once a particular flow is selected, the subsequent Contact Us buttons will not redirect to Guided Issue Filing again. They will function as normal Contact Us buttons. This is to avoid an infinite loop of Guided Issue Filing screens.

Custom flows can be nested by passing another custom flows configuration while creating a flow.

Example :

Let's say you want to configure singleFAQFlow in the above example to show showConversationFlow1 and showConversationFlow2 through the Contact Us buttons inside it. In this case, you would configure the menuHelpCallback button (a button which triggers Helpshift SDK) in the following way :

For Cocos2d-x 3.x :

void AppDelegate::menuHelpCallback(Ref* pSender) {
     ValueVector forms;

     ValueMap faqSectionFlow;
     faqSectionFlow[HS_FLOW_TYPE] = HS_FAQ_SECTION_FLOW;
     faqSectionFlow[HS_FLOW_TITLE] = Value("FAQ Section");
     faqSectionFlow[HS_FLOW_DATA] = "1";
     forms.push_back(Value(faqSectionFlow));

     ValueVector nestedCustomContactUsFlows;

     ValueMap conversationFlow1;
     conversationFlow1[HS_FLOW_TYPE] = HS_CONVERSATION_FLOW;
     conversationFlow1[HS_FLOW_TITLE] = Value("Contact us about our app");
     nestedCustomContactUsFlows.push_back(Value(conversationFlow1));

     ValueMap conversationFlow2;
     conversationFlow2[HS_FLOW_TYPE] = HS_CONVERSATION_FLOW;
     conversationFlow2[HS_FLOW_TITLE] = Value("Contact us about our in-app purchase");
     nestedCustomContactUsFlows.push_back(Value(conversationFlow2));

     ValueMap singleFAQFlowConfig;
     singleFAQFlowConfig[HS_CUSTOM_CONTACT_US_FLOWS] = Value(nestedCustomContactUsFlows);

     ValueMap singleFAQFlow;
     singleFAQFlow[HS_FLOW_TYPE] = HS_SINGLE_FAQ_FLOW;
     singleFAQFlow[HS_FLOW_TITLE] = Value("Single FAQ");
     singleFAQFlow[HS_FLOW_DATA] = "2";
     singleFAQFlow[HS_FLOW_CONFIG] = Value(singleFAQFlowConfig);
     forms.push_back(Value(singleFAQFlow));

     ValueMap showFAQsConfig;
     showFAQsConfig[HS_CUSTOM_CONTACT_US_FLOWS] = Value(forms);

     HelpshiftCocos2dx::showFAQs(showFAQsConfig);
}

For Cocos2d-x 2.x :

void AppDelegate::menuHelpCallback(Ref* pSender) {
    cocos2d::CCArray *forms = CCArray::create();

    cocos2d::CCDictionary *faqSectionFlow = CCDictionary::create();
    faqSectionFlow->setObject(new CCString(HS_FAQ_SECTION_FLOW), HS_FLOW_TYPE);
    faqSectionFlow->setObject(new CCString("FAQ Section"), HS_FLOW_TITLE);
    faqSectionFlow->setObject(new CCString("9"), HS_FLOW_DATA);
    forms->addObject(faqSectionFlow);

    cocos2d::CCArray *nestedCustomContactUsFlows = CCArray::create();

    cocos2d::CCDictionary *conversationFlow1 = CCDictionary::create();
    conversationFlow1->setObject(new CCString(HS_CONVERSATION_FLOW), HS_FLOW_TYPE);
    conversationFlow1->setObject(new CCString("Contact us about our app"), HS_FLOW_TITLE);
    nestedCustomContactUsFlows->addObject(conversationFlow1);

    cocos2d::CCDictionary *conversationFlow2 = CCDictionary::create();
    conversationFlow2->setObject(new CCString(HS_CONVERSATION_FLOW), HS_FLOW_TYPE);
    conversationFlow2->setObject(new CCString("Contact us about our in-app purchase"), HS_FLOW_TITLE);
    nestedCustomContactUsFlows->addObject(conversationFlow2);

    cocos2d::CCDictionary *singleFAQFlowConfig = CCDictionary::create();
    singleFAQFlowConfig->setObject(nestedCustomContactUsFlows, HS_CUSTOM_CONTACT_US_FLOWS);

    cocos2d::CCDictionary *singleFAQFlow = CCDictionary::create();
    singleFAQFlow->setObject(new CCString(HS_SINGLE_FAQ_FLOW), HS_FLOW_TYPE);
    singleFAQFlow->setObject(new CCString("Single FAQ"), HS_FLOW_TITLE);
    singleFAQFlow->setObject(new CCString("9"), HS_FLOW_DATA);
    singleFAQFlow->setObject(singleFAQFlowConfig, HS_FLOW_CONFIG);
    forms->addObject(singleFAQFlow);

    cocos2d::CCDictionary *showFAQsConfig = CCDictionary::create();
    showFAQsConfig->setObject(forms, HS_CUSTOM_CONTACT_US_FLOWS);

    HelpshiftCocos2dx::showFAQs(showFAQsConfig);
}

With this configuration, the Contact Us buttons in singleFAQFlow View will redirect to Guided Issue Filing with showConversationFlow1 and showConversationFlow2.

This configuration will work only when there is no open conversation for the user, otherwise every Contact Us button will transition to the chat screen.

Configuration Summary

Option / API showFAQs showFAQSection showSingleFAQ showConversation
enableContactUs Supported Supported Supported Not Supported
gotoConversationAfterContactUs Supported Supported Supported Supported
requireEmail Supported Supported Supported Supported
hideNameAndEmail Supported Supported Supported Supported
conversationPrefillText No effect No effect No effect Supported
enableFullPrivacy Supported Supported Supported Supported
showSearchOnNewConversation No effect No effect No effect Supported
showConversationResolutionQuestion Supported Supported Supported Supported
customContactUsFlows Supported Supported Supported Not Supported