This site contains the documentation that is relevant to older WSO2 product versions and offerings.
For the latest WSO2 documentation, visit https://wso2.com/documentation/.

Customer Creation in SalesBinder

The first use case in the SalesBinder business scenario is used for customer creation. This page describes the relevant tasks and the operations you use in the SalesBinder connector and the other ESB connectors.

Overview

The flow for customer creation is illustrated in the following diagram. The ESB connectors for Clevertim will be used to connect to each service. 

In this use case, customer creation is initiated by either retrieving selected companies from the Clevertim CRM API using the getCompany operation and then creating customer accounts, prospect accounts and supplier accounts in the SalesBinder API using the createAccount operation, or by creating customer, prospect and supplier accounts directly in the SalesBinder API. 

Clevertim operations
SalesBinder operations
Samples
Sample Template for Creating Customers in SalesBinder
<?xml version="1.0" encoding="UTF-8"?>
<!-- This template is to create customers in SalesBinder-->
<template xmlns="http://ws.apache.org/ns/synapse" name="salesbinder-createCustomers">
   <!--Sales Binder parameters-->
   <parameter name="salesbinder.apiKey" description="Encrypted alphanumeric string to authenticate the Sales Binder credentials." />
   <parameter name="salesbinder.apiUrl" description="The salesbinder API URL." />
   <parameter name="salesbinder.contextId" description="The context ID which defines the Account type." />
   <parameter name="salesbinder.url" description="Company website address." />
   <parameter name="salesbinder.billingAddress1" description="Part one of the billing address of the account . " />
   <parameter name="salesbinder.billingAddress2" description="Part two of the billing address of the account . " />
   <parameter name="salesbinder.billingPostalCode" description="The post code of the billing address. " />
   <parameter name="salesbinder.billingCity" description="The city for which the billing address belong. " />
   <parameter name="salesbinder.billingCountry" description="Billing country of the account. " />
   <parameter name="salesbinder.shippingAddress1" description="Part one of the shipping address of the account. " />
   <parameter name="salesbinder.shippingAddress2" description="Part two of the shipping address of the account. " />
   <parameter name="salesbinder.shippingPostalCode" description="Post code of the shipping address." />
   <parameter name="salesbinder.shippingCountry" description="Shipping country of the account." />
   <parameter name="salesbinder.shippingCity" description="The city which the shipping address belongs" />
   <parameter name="salesbinder.name" description="Name of the account." />
   <parameter name="salesbinder.officeEmail" description="Office email of the account." />
   <parameter name="salesbinder.officeFax" description="Office fax of the account." />
   <parameter name="salesbinder.billingRegion" description="Billing region the account." />
   <parameter name="salesbinder.shippingRegion" description="Shipping region of the account." />
   <parameter name="salesbinder.customerLabelId" description="Customer labeld ID of the account." />
   <parameter name="salesbinder.officeNumber" description="Office number of the account." />
   
   
   <!--common parameters-->
   <parameter name="clevertimcrm.id" description="Id as Key value pair(s) for response handler (Ex. id1:value1,id2:value2)." />
   <sequence>
      <property name="salesbinder.apiKey" expression="$func:salesbinder.apiKey" />
      <property name="salesbinder.apiUrl" expression="$func:salesbinder.apiUrl" />
      <property name="salesbinder.contextId" expression="$func:salesbinder.contextId" />
      <property name="salesbinder.url" expression="$func:salesbinder.url" />
      <property name="salesbinder.billingAddress1" expression="$func:salesbinder.billingAddress1" />
      <property name="salesbinder.billingAddress2" expression="$func:salesbinder.billingAddress2" />
      <property name="salesbinder.billingPostalCode" expression="$func:salesbinder.billingPostalCode" />
      <property name="salesbinder.billingCity" expression="$func:salesbinder.billingCity" />
      <property name="salesbinder.billingCountry" expression="$func:salesbinder.billingCountry" />
      <property name="salesbinder.shippingAddress1" expression="$func:salesbinder.shippingAddress1" />
      <property name="salesbinder.shippingAddress2" expression="$func:salesbinder.shippingAddress2" />
      <property name="salesbinder.shippingPostalCode" expression="$func:salesbinder.shippingPostalCode" />
      <property name="salesbinder.shippingCountry" expression="$func:salesbinder.shippingCountry" />
      <property name="salesbinder.name" expression="$func:salesbinder.name" />
      <property name="salesbinder.officeEmail" expression="$func:salesbinder.officeEmail" />
      <property name="salesbinder.officeFax" expression="$func:salesbinder.officeFax" />
      <property name="salesbinder.customerLabelId" expression="$func:salesbinder.customerLabelId" />
      <property name="salesbinder.billingRegion" expression="$func:salesbinder.billingRegion" />
      <property name="salesbinder.shippingRegion" expression="$func:salesbinder.shippingRegion" />
      <property name="salesbinder.officeNumber" expression="$func:salesbinder.officeNumber" />
      <property name="clevertimcrm.id" expression="$func:clevertimcrm.id" />
      <!--Process creating Account only if the salesbinder api key is given-->
      <filter source="boolean(get-property('salesbinder.apiKey'))" regex="true">
         <then>
		 
            <!--Call SalesBinder createAccount method create Accounts with the specific type-->
            <salesbinder.init>
               <apiUrl>{$ctx:salesbinder.apiUrl}</apiUrl>
               <apiKey>{$ctx:salesbinder.apiKey}</apiKey>
            </salesbinder.init>
            <property name="authorizationHeader" expression="$trp:Authorization" />
            <salesbinder.createAccount>
               <billingAddress1>{$ctx:salesbinder.billingAddress1}</billingAddress1>
               <shippingPostalCode>{$ctx:salesbinder.shippingPostalCode}</shippingPostalCode>
               <shippingAddress1>{$ctx:salesbinder.shippingAddress1}</shippingAddress1>
               <url>{$ctx:salesbinder.url}</url>
               <contextId>{$ctx:salesbinder.contextId}</contextId>
               <billingPostalCode>{$ctx:salesbinder.billingPostalCode}</billingPostalCode>
               <officeEmail>{$ctx:salesbinder.officeEmail}</officeEmail>
               <name>{$ctx:salesbinder.name}</name>
               <billingCity>{$ctx:salesbinder.billingCity}</billingCity>
               <shippingCountry>{$ctx:salesbinder.shippingCountry}</shippingCountry>
               <billingCountry>{$ctx:salesbinder.billingCountry}</billingCountry>
               <shippingCity>{$ctx:salesbinder.shippingCity}</shippingCity>
               <billingAddress2>{$ctx:salesbinder.billingAddress2}</billingAddress2>
               <officeFax>{$ctx:salesbinder.officeFax}</officeFax>
               <shippingAddress2>{$ctx:salesbinder.shippingAddress2}</shippingAddress2>
               <billingRegion>{$ctx:salesbinder.billingRegion}</billingRegion>
               <officeNumber>{$ctx:salesbinder.officeNumber}</officeNumber>
               <shippingRegion>{$ctx:salesbinder.shippingRegion}</shippingRegion>
               <customerLabelId>{$ctx:salesbinder.customerLabelId}</customerLabelId>
            </salesbinder.createAccount>
            <filter source="$axis2:HTTP_SC" regex="302">
               <then>
                  <property name="uri.var.location" expression="$trp:Location" />
                  <property name="Authorization" expression="$ctx:authorizationHeader" scope="transport" type="STRING" />
                  <call>
                     <endpoint>
                        <http method="get" uri-template="{uri.var.location}" />
                     </endpoint>
                  </call>
				  
                  <property name="salesbinder.customerId" expression="json-eval($.Customer.id)" />
				  
                  <filter source="boolean(get-property('salesbinder.customerId'))" regex="false">
                     <then>
                        <filter source="boolean(get-property('clevertimcrm.id'))" regex="false">
                           <then>
                              <property name="id" value="{}" />
                           </then>
                           <else>
                              <property name="id" expression="fn:concat('{ companyId:',get-property('clevertimcrm.id'),'}')" />
                           </else>
                        </filter>
						
                        <property name="status" value="error" />
                        <property name="message" expression="json-eval($)" />
                     </then>
                     <else>
                        <filter source="boolean(get-property('clevertimcrm.id'))" regex="false">
                           <then>
                              <property name="id" expression="fn:concat('{ accountId:',get-property('salesbinder.customerId'),'}')" />
                           </then>
                           <else>
                              <property name="id"
                                 expression="fn:concat('{ companyId:',get-property('clevertimcrm.id'),',accountId:',get-property('salesbinder.customerId'),'}')" />
                           </else>
                        </filter>
						
                        <property name="status" value="success" />
                        <property name="message" value="The Account has been created successfully." />
                     </else>
                  </filter>
               </then>
               <else>
                  <filter source="boolean(get-property('clevertimcrm.id'))" regex="false">
                     <then>
                        <property name="id" value="{}" />
                     </then>
                     <else>
                        <property name="id" expression="fn:concat('{ companyId:',get-property('clevertimcrm.id'),'}')" />
                     </else>
                  </filter>
                  <property name="status" value="error" />
                  <property name="message" expression="json-eval($)" />
               </else>
            </filter>
			 <!--Call the responseHandler template-->
            <call-template target="responseHandlerTemplate">
               <with-param name="activity" value="salesbinder_createAccount" />
               <with-param name="id" value="{$ctx:id}" />
               <with-param name="status" value="{$ctx:status}" />
               <with-param name="message" value="{$ctx:message}" />
            </call-template>
         </then>
      </filter>
   </sequence>
</template> 
Sample Proxy for Retrieving Selected Set of Companies from Clevertim CRM and Creating New Accounts (Customers, Prospects and Suppliers) in SalesBinder, or Creating Accounts Directly in SalesBinder
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="salesBinder_createCustomers" transports="https http" startOnLoad="true" trace="disable">
   <target>
      <inSequence>
         <!-- CleverTim Properties-->
         <property name="clevertimcrm.apiUrl" value="https://www.clevertim.com" />
         <property name="clevertimcrm.apiKey" expression="json-eval($.cleverTimCrmApiToken)" />
         <property name="clevertimcrm.companyCount" expression="count(//cleverTimCrmCompanyIds)" scope="operation" />
         <property name="clevertimcrm.companyIndex" expression="0" scope="operation" />
         
		 <!-- SalesBinder Properties-->
         <property name="salesbinder.apiUrl" expression="json-eval($.salesBinderApiUrl)" />
         <property name="salesbinder.apiKey" expression="json-eval($.salesBinderApiToken)" />
         <property name="salesbinder.customerCount" expression="count(//salesbinderCustomers)" scope="operation" />
         <property name="salesbinder.customerIndex" expression="0" scope="operation" />
        
		<!--Array of salesbinder customer object Map-->
         <property name="salesbinder.customerObjects" expression="json-eval($.salesbinderCustomers)" />
         <filter xpath="get-property('operation','clevertimcrm.companyCount') = 0">
            <then>
               <filter xpath="get-property('operation','salesbinder.customerCount') = 0">
                  <then>
                     <property name="id" value="{}" />
                     <property name="status" value="Skipped" />
                     <property name="message" value="No entries to process." />
                     <call-template target="responseHandlerTemplate">
                        <with-param name="id" value="{$ctx:id}" />
                        <with-param name="activity" value="salesbinder_createCustomers" />
                        <with-param name="status" value="{$ctx:status}" />
                        <with-param name="message" value="{$ctx:message}" />
                     </call-template>
                     <loopback />
                  </then>
                  <else>
					 <!--Call createAccountIterator sequence to create customers directly 
						   in salesbinder-->
                     <sequence key="createAccountIterator" />
                  </else>
               </filter>
            </then>
            <else>
               <!--FOR EACH company : BEGIN-->
               <iterate continueParent="false" id="companies" expression="//cleverTimCrmCompanyIds" sequential="true">
                  <target>
                     <sequence>
                        <property name="clevertimcrm.companyId" expression="//cleverTimCrmCompanyIds/id/text()" />
                        <property name="clevertimcrm.copiedToShip" expression="//cleverTimCrmCompanyIds/copiedToShip/text()" />
                        <filter source="boolean(get-property('clevertimcrm.companyId'))" regex="false">
                           <then>
                              <property name="id" value="{}" />
                              <property name="status" value="Skipped" />
                              <property name="message" value="No company ID is given to process." />
                              <call-template target="responseHandlerTemplate">
                                 <with-param name="id" value="{$ctx:id}" />
                                 <with-param name="activity" value="clevertimcrm_retrieveCompanies" />
                                 <with-param name="status" value="{$ctx:status}" />
                                 <with-param name="message" value="{$ctx:message}" />
                              </call-template>
                           </then>
                           <else>
						     <!--Call CleverTimCRM getCompany method retrieve cdetails for a specific selected company-->
                              <clevertimcrm.init>
                                 <apiUrl>{$ctx:clevertimcrm.apiUrl}</apiUrl>
                                 <apiKey>{$ctx:clevertimcrm.apiKey}</apiKey>
                              </clevertimcrm.init>
                              <clevertimcrm.getCompany>
                                 <id>{$ctx:clevertimcrm.companyId}</id>
                              </clevertimcrm.getCompany>
                              <filter source="$axis2:HTTP_SC" regex="200">
                                 <then>
                                    <property name="clevertimcrm.id" expression="json-eval($.content[0].id)" />
							  
							        <!--Process only if the specified company ID is valid-->
                                    <filter xpath="get-property('clevertimcrm.id') = '[]'">
                                       <then>
                                          <property name="id" expression="fn:concat('{companyId:',get-property('clevertimcrm.companyId'),'}')" />
                                          <property name="status" value="Skipped" />
                                          <property name="message" value="Company ID does not belong to an existing company." />
                                          <call-template target="responseHandlerTemplate">
                                             <with-param name="id" value="{$ctx:id}" />
                                             <with-param name="activity" value="clevertimcrm_retrieveCompanies" />
                                             <with-param name="status" value="{$ctx:status}" />
                                             <with-param name="message" value="{$ctx:message}" />
                                          </call-template>
                                       </then>
                                       <else>
                                          <property name="clevertimcrm.type" expression="json-eval($.content[0].ctype)" />
                                          <property name="clevertimcrm.name" expression="json-eval($.content[0].cn)" />
                                          <property name="clevertimcrm.email" expression="json-eval($.content[0].email[0])" />
                                          <property name="clevertimcrm.url" expression="json-eval($.content[0].website[0])" />
                                          <property name="clevertimcrm.billingAddress" expression="json-eval($.content[0].address)" />
                                          <property name="clevertimcrm.billingCity" expression="json-eval($.content[0].city)" />
                                          <property name="clevertimcrm.billingPostcode" expression="json-eval($.content[0].postcode)" />
                                          <property name="clevertimcrm.url" expression="json-eval($.content[0].website[0])" />
                                          <property name="clevertimcrm.billingCountry" expression="json-eval($.content[0].country)" />
                                          <filter xpath="get-property('clevertimcrm.copiedToShip')= 'true'">
                                             <then>
                                                <property name="salesbinder.shippingAddress" expression="get-property('clevertimcrm.billingAddress')" />
                                                <property name="salesbinder.shippingCity" expression="get-property('clevertimcrm.billingCity')" />
                                                <property name="salesbinder.shippingPostCode" expression="get-property('clevertimcrm.billingPostcode')" />
                                                <property name="salesbinder.shippingCountry" expression="get-property('clevertimcrm.billingCountry')" />
                                             </then>
                                          </filter>
										  <!-- Process only for the three company types (Customer,prospect and supplier)-->
                                          <switch source="get-property('clevertimcrm.type')">
                                             <case regex="C">
                                                <property name="salesbinder.contextId" value="2" />
                                             </case>
                                             <case regex="P">
                                                <property name="salesbinder.contextId" value="8" />
                                             </case>
                                             <case regex="S">
                                                <property name="salesbinder.contextId" value="10" />
                                             </case>
                                             <default>
                                                <property name="id" expression="fn:concat('{companyId:',get-property('clevertimcrm.companyId'),'}')" />
                                                <property name="status" value="Skipped" />
                                                <call-template target="responseHandlerTemplate">
                                                   <with-param name="activity" value="clevertimcrm_retrieveCompanies" />
                                                   <with-param name="id" value="{$ctx:id}" />
                                                   <with-param name="status" value="{$ctx:status}" />
                                                   <with-param name="message" value="This company does not belong to a required account type" />
                                                </call-template>
                                             </default>
                                          </switch>
                                          <header name="Via" action="remove" scope="transport" />
										  
										  <!--Call SalesBinder salesbinder-createCustomers template to create Accounts with the specific type-->
                                          <call-template target="salesbinder-createCustomers">
                                             <!-- parameter values will be passed on to a sequence template -->
                                             (
                                             <with-param name="salesbinder.apiKey" value="{$ctx:salesbinder.apiKey}" />
                                             |
                                             <with-param name="salesbinder.apiUrl" value="{$ctx:salesbinder.apiUrl}" />
                                             |
                                             <with-param name="salesbinder.contextId" value="{$ctx:salesbinder.contextId}" />
                                             |
                                             <with-param name="salesbinder.url" value="{$ctx:clevertimcrm.url}" />
                                             |
                                             <with-param name="salesbinder.billingAddress1" value="{$ctx:clevertimcrm.billingAddress}" />
                                             |
                                             <with-param name="salesbinder.billingPostalCode" value="{$ctx:clevertimcrm.billingPostcode}" />
                                             |
                                             <with-param name="salesbinder.billingCity" value="{$ctx:clevertimcrm.billingCity}" />
                                             |
                                             <with-param name="salesbinder.billingCountry" value="{$ctx:clevertimcrm.billingCountry}" />
                                             |
                                             <with-param name="salesbinder.shippingAddress1" value="{$ctx:salesbinder.shippingAddress}" />
                                             |
                                             <with-param name="salesbinder.shippingPostalCode" value="{$ctx:salesbinder.shippingPostCode}" />
                                             |
                                             <with-param name="salesbinder.shippingCountry" value="{$ctx:salesbinder.shippingCountry}" />
                                             |
                                             <with-param name="salesbinder.name" value="{$ctx:clevertimcrm.name}" />
                                             |
                                             <with-param name="salesbinder.officeEmail" value="{$ctx:clevertimcrm.email}" />
                                             |
                                             <with-param name="clevertimcrm.id" value="{$ctx:clevertimcrm.companyId}" />
                                             |
                                             ) *
                                          </call-template>
                                       </else>
                                    </filter>
                                 </then>
                                 <else>
                                    <property name="id" value="{}" />
                                    <property name="status" value="Error" />
                                    <property name="message" expression="json-eval($)" />
                                    <call-template target="responseHandlerTemplate">
                                       <with-param name="activity" value="clevertimcrm_retrieveCompanies" />
                                       <with-param name="id" value="{$ctx:id}" />
                                       <with-param name="status" value="{$ctx:status}" />
                                       <with-param name="message" value="{$ctx:message}" />
                                    </call-template>
                                 </else>
                              </filter>
                           </else>
                        </filter>
                        <property name="clevertimcrm.companyIndex" expression="get-property('operation','clevertimcrm.companyIndex') + 1"
                           scope="operation" />
						   
						<!--Process direct customer creation once the customer creation done for the clevertimcrm companies-->
                        <filter xpath="get-property('operation','clevertimcrm.companyIndex') = get-property('operation', 'clevertimcrm.companyCount')">
                           <then>
                              <property name="salesbinder.customerIndex" expression="0" scope="operation" />
                              <filter xpath="get-property('operation','salesbinder.customerCount') = 0">
                                 <then>
                                    <loopback />
                                 </then>
                                 <else>
									<!--Set the salesbinderCustomers Payload for iteration.-->
                                    <payloadFactory media-type="json">
                                       <format>{
                                          "salesbinderCustomers": $1
                                          }
                                       </format>
                                       <args>
                                          <arg expression="get-property('salesbinder.customerObjects')" />
                                       </args>
                                    </payloadFactory>
                       
									<!--Call createAccountIterator sequence to create customers directly -->
                                    <sequence key="createAccountIterator" />
                                 </else>
                              </filter>
                           </then>
                        </filter>
                     </sequence>
                  </target>
               </iterate>
               <!--FOR EACH company end : END-->
            </else>
         </filter>
      </inSequence>
      <outSequence>
         <property name="messageType" value="application/json" scope="axis2" />
         <payloadFactory media-type="json">
            <format>{
               "Response":{
                  "process":"salesbinder_createCustomers",
                  "activityResponse":[$1]
               }
               }
            </format>
            <args>
               <arg expression="get-property('operation', 'responseString')" />
            </args>
         </payloadFactory>
         <send />
      </outSequence>
   </target>
   <description />
</proxy>                                                          
Sample Request for Retrieving Selected Set of Companies from Clevertim CRM and Creating New Accounts (Customers, Prospects and Suppliers) in SalesBinder, or Creating Accounts Directly in SalesBinder
{
    "cleverTimCrmApiToken": "5uTsIJPGoaEnC4xo72Ce2zBDy1hAnS6zPh1VVSII9AiKydcV59Z12723 ",
    "cleverTimCrmCompanyIds": [
        {
            "id": "159898",
            "copiedToShip": "true"
        },
        {
            "id": "160989",
            "copiedToShip": "true"
        },
        {
            "id": "160988",
            "copiedToShip": "false"
        }
    ],
    "salesBinderApiUrl": "https://yas.salesbinder.com",
    "salesBinderApiToken": "046c9968e60bfe7853ee5a1f37849caa9d14937a"
}