Home Configuring Simply

Configuring Simply

Christian
By Christian and 1 other
• 25 articles

How to use the Mail Converter module in Simply CRM

We understand that modern businesses heavily rely on email as their main communication channel. It’s not uncommon for us to cycle through hundreds and even thousands of emails. If left unhandled, these emails will quickly pile up and create a nuisance in your inbox. To help solve this problem, Simply CRM has developed the Mail Converter module, which allows you to quickly and efficiently manage your inbox. Mail Converter scans and streamline tasks by automatically creating appropriate records in Simply CRM. In case you need a custom solution for your email correspondence, Simply CRM allows you to define specific rules and actions that will be performed on your emails. Keep in mind that all of your emails will be scanned automatically, unless you manually disable the Mail Scanner task in the Scheduler. The Mail Converter operations Depending on your specific needs and preferred settings, the Mail Converter can perform many different operations on your emails. The following table breaks down these operations and the records associated with them. | Record | Operation | |---|---| | Lead | 1. Create leads 2. Attach emails to leads | | Contact | 1. Create contacts 2. Attach emails to contacts | | Ticket | 1. Create tickets (with the corresponding contact) 2. Create tickets (without the corresponding contact) 3. Attach emails to tickets | | Organization | 1. Create organizations 2. Attach emails to organizations | | Deals | 1. Create deals (with the corresponding contacts) 2. Create deals (without the corresponding contacts) 3. Attach emails to deals | How to configure your mailbox in Simply CRM The Mail Converter scans your mailbox in Simply CRM and performs the appropriate actions depending on the email content. However, in order to use the Mail Converter, you must first configure your mailbox in Simply CRM. To configure your mailbox, open your instance of Simply CRM and go to Settings under the User option in the top right corner. In the new window, open Other Settings and choose Mail Converter. Press Create Mailbox or Add Mailbox. Enter the mailbox details, as shown in the following screenshot. The following table breaks down the mailbox details and explains how each option is used in Simply CRM. | Field | Description | |---|---| | Scanner Name | Provide a label for your mailbox. This is only used for your own reference. | | Server | Enter the IMAP mail server name. imap.gmail.com for Gmail, for exmaple. | | User Name | Enter a unique email client user name | | Password | Provide the email client password | | Protocol | Fill this field in accordance with your mail server configuration | | SSL Type | Fill this field in accordance with your mail server configuration | | SSL Method | Fill this field in accordance with your mail server configuration | | Look For | Select All to scan all emails or choose Unread to scan only unread emails | | After Scan | Select the label that will be used on your emails after they are scanned | | Status | Enable this checkbox to make your mailbox active | | Time Zone | Select the time zone of the IMAP server | After you enter all the details, press Next to continue your work and start selecting the folders that you want to add from your email client. When you select all the necessary folders, press Next. Important: You must select at least one folder to go to the next step. In the last step, you will need to specify the rule conditions and actions. In Simply CRM, you can use rules to define what actions will be performed on your emails, after the system scans your email messages. Keep in mind that incoming emails will be scanned regularly to check whether or not they meet the criteria you specified. Follow the instructions below to set up rules in a mailbox. Open the Mail Converter and select the desired mailbox. In the detailed view, press on the Add Rule button in the top right corner. This will open the following pop-up window, where you will be asked to enter the rule details. Fill in the fields by entering the necessary details and press Save. The next table breaks down each option in the Add Rule pop-up window and describes what actions they perform. | Field | Description | |---|---| | Match | All Conditions means that all specified conditions need to be matched for the rule action to be performed. Any Conditions means that only one condition needs to be fulfilled for the rule action to be performed. | | From | Compares your criteria with the From field of your incoming emails. | | To | Compares your criteria with the To field of your incoming emails. | | CC | Compares your criteria with the CC field of your incoming emails. | | BCC | Compares your criteria with the BCC field of your incoming emails. This filter only works when the BCC field is visible to you. | | Subject | Compares your criteria with the subject of your emails, taking into consideration the selected condition (Contains, Not Contains, Equals, Not Equals, Begin, End, Regex) | | Body | Compares your criteria with the body of your emails, taking into consideration the selected condition (Contains, Not Contains, Equals, Not Equals, Begin, End, Regex) | Through rules actions, Simply CRM allows you to set the mapping of your CRM fields with the email body content. To initiate this process, use a delimiter that will highlight the content that needs to be mapped onto your CRM fields. How Mail Converter creates records in Simply CRM After scanning your emails, Mail Converter will create records for the emails that fulfil the specified criteria. Simply CRM will automatically map the information from the email to appropriate CRM fields. The following table explains what actions Mail Converter can perform on your records. | Action | Description | |---|---| | Create Ticket (With Contact) | Creates a ticket record with the following information: Ticket title = email subject Contact Name = Contact name in Simply CRM depending on the email. If there is no existing contact in Simply, a new record will be created. Description = email body All email attachments are linked to the ticket The system will perform a lookup to check whether an existing contact or organization corresponds to the FROM field in the email. If a matching record is found, the ticket will be associated with it. | | Create Ticket (Without Contact) | Creates a ticket record with the following information: Ticket title = email subject Contact Name is left empty Description = email body All email attachments are linked to the ticket The system will perform a lookup to check whether an existing contact or organization corresponds to the FROM field in the email. If a matching record is found, the ticket will be associated with it. | | Update Ticket | Updates existing ticket records with the following information: Comment = Email body Selects Regex in the Subject field, and pastes the following code Ticket Id[^:]?: ([0-9]+) in the text area. | | Create Lead | Creates a lead record with the following information: Last Name = email subject; in case the email subject is empty, the FROM field will be used as the last name Primary Email = the FROM field in the email Description = email body All email attachments will create separate documents in Simply CRM, and the documents will be associated with the lead record. Assigned To is configured as specified in the Mail Converter rule. | | Create Contact | Creates a contact record with the following information: Last Name = email subject; in case the email subject is empty, the FROM field will be used as the contact name Primary Email = the FROM field in the email Description = email body All email attachments will create separate documents in Simply CRM, and the documents will be associated with the lead record. Assigned To is configured as specified in the Mail Converter rule. | | Create Organization | Creates an organization record with the following information: Organization Name = email subject; in case the email subject is empty, the FROM field will be used as the organization name Primary Email = the FROM field in the email Description = email body All email attachments will create separate documents in Simply CRM, and the documents will be associated with the lead record. Assigned To is configured as specified in the Mail Converter rule. | | Create Deal (With Contact) | Creates a Deals record with the following information: Deal name = email subject; in case the email subject is empty, the FROM field will be used as the organization name Contact Name = Contact name in Simply CRM, depending on the email. If there is no existing contact in Simply, a new record will be created. Description = email body All email attachments are linked to the deal. | | Create Deal (Without Contact) | Creates a new Deals record with the following information: Deal = email subject Contact Name is left empty Description = email body All email attachments are linked to the deal. | | Add to Contact [FROM] | Simply CRM performs a lookup to check if any existing contact records match the FROM email field. If the system finds a matching record, a new email record will be created and attached to the contact. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Contact [TO] | Simply CRM performs a lookup to check if any existing contact records match the TO email field. If the system finds a matching record, a new email record will be created and attached to the contact. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Leads [FROM] | Simply CRM performs a lookup to check if any existing lead records match the FROM email field. If the system finds a matching record, a new email record will be created and attached to the lead. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Leads [TO] | Simply CRM performs a lookup to check if any existing lead records match the TO email field. If the system finds a matching record, a new email record will be created and attached to the lead. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Organization [FROM] | Simply CRM performs a lookup to check if any existing organization records match the FROM email field. If the system finds a matching record, a new email record will be created and attached to the organization. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Organization [TO] | Simply CRM performs a lookup to check if any existing organization records match the TO email field. If the system finds a matching record, a new email record will be created and attached to the organization. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Deal [FROM] | Simply CRM performs a lookup to check if any existing Deals records match the FROM email field. If the system finds a matching record, a new email record will be created and attached to the deal. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Deal [TO] | Simply CRM performs a lookup to check if any existing Deals records match the TO email field. If the system finds a matching record, a new email record will be created and attached to the deal. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Ticket [FROM] | Simply CRM performs a lookup to check if any existing ticket records match the FROM email field. If the system finds a matching record, a new email record will be created and attached to the ticket. All email attachments will create new documents that will be associated with the appropriate contact. | | Add to Ticket [TO] | Simply CRM performs a lookup to check if any existing ticket records match the TO email field. If the system finds a matching record, a new email record will be created and attached to the ticket. All email attachments will create new documents that will be associated with the appropriate contact. | Important: The Update fields should have a higher priority than the Create Tickets rule. An automated email is sent to your customers whenever a ticket is created. If the customers reply to this email, the reply will be saved as a comment in the existing ticket. It’s recommended that you configure the From Email field in the outgoing server using the same email that you used to set up a mailbox in the Mail Converter. If you need help using the Mail Converter module in Simply CRM, feel free to reach out to us through LiveChat or email us at support@simply-crm.com.

Last updated on Aug 26, 2024

How to add or edit fields in a module

Simply CRM allows you to personalize your record view by adding or editing fields inside modules. How to personalize your record view In Simply CRM, each module has a defined number of fields and blocks that are used to store information. The Module Layouts & Fields option allows you to create custom fields, edit existing field properties, or move the fields across various blocks. There are two ways to open the Module Layouts & Fields option. You can open it by expanding the User drop-down menu in the top right corner and selecting Settings. Then, go to Module Management and choose the Module Layouts & Fields feature. Alternatively, you can open this feature by going through an existing module. In that case, you will need to open a module, e.g. Deals, and select the Customize option in the top right corner. There, you will go to Deals Layouts & Fields. Create a custom block Each module in Simply comes with a few default blocks, but you can always add more blocks to your modules. Follow the instruction below to create a custom block. Press the Add Block button. Set the block name and configure the Add After option by selecting a block from the drop-down menu. Click Save. ### Add a custom field You can further expand your modules by adding custom fields to complement the default ones. To create a custom field, press the Add Custom Field button on the right side. Enter the field details in the resulting pop-up window. You can configure the field name in the Label Name box and specify the field length in the second mandatory option. Don’t forget to provide the default value and enable or disable special field properties for your custom field. After you enter all the relevant information, click Save. Simply CRM supports a number of different field types. Keep reading for a detailed breakdown of all available field types. | Field Type | Description | Information | |---|---|---| | Text | Used to add text | Label: Provide field name Length: Provide field size Maximum characters: 255 | | Decimal | Used to add decimals | Label: Provide field name Length: Provide field size Decimal: Provide number of decimal places Maximum characters: 59 | | Integer | Used to add integers | Label: Provide field name Length: Provide field size Maximum characters: 255 | | Percent | Used to add percentages | Label: Provide field name | | Currency | Used to add currencies | Label: Provide field name Length: Provide field size Maximum characters: 255 | | Date | Used to add dates | Label: Provide field name | | Email | Used to add email addresses | Label: Provide field name | | Phone | Used to add phone numbers | Label: Provide field name | | Picklist | Used to add drop-down fields | Label: Provide field name Picklist values: Provide picklist values | | Checkbox | Used to add checkboxes | Label: Provide field name | | Text area | Used to add long text | Label: Provide field name | | Multi-select Combo Box | Used to add the picklist field to select multiple values | Label: Provide field name Picklist values: Provide picklist values | | Skype | Used to add Skype ID | Label: Provide field name | | Time | Used to add time | Label: Provide field name | | URL | Used to add website addresses | Label: Provide field name | Create a custom Picklist field In addition to default fields, you can also add Picklist fields to your instance of Simply CRM. Follow the instructions given below to create a new Picklist field. Press the Add Custom Field button in the top right corner and enter the field details in the resulting pop-up box. Select Picklist as the field type. Then, you can start adding Picklist values. Enter value L1 and press Enter to add a Picklist value. You can repeat this until you have the necessary number of values. Set the default field value and check or uncheck the specific field properties listed in the pop-up box. When you finish adding all the details, press Save to create your custom Picklist field. Rearrange fields Simply CRM lets you freely rearrange your fields and move them across blocks. Follow these steps to rearrange your fields: 1. In the Layouts & Fields of a specific module, click on the field that you want to move. 2. Drag the field to your preferred locations. 3. Press the Save Layout button to confirm the changes. ### Edit field properties Once a field is created, its Field Type can’t be changed, to preserve the data structure and integrity. If you need a different field type, create a new field. The Label Name, however, can be changed at any time, so you can rename a field without losing its data. Simply CRM allows you to edit the field properties by pressing the pencil icon in the top right corner of the field’s block. In the resulting pop-up window, you’ll be able to edit the following settings: Label Name, Mandatory Field, Key Field View, Mass Edit, Quick Create and Header View. Each of these options can be enabled or disabled for custom fields. When editing preset fields, some of these properties may be limited to preserve data integrity. You can check whether or not a field property can be edited by simply hovering over it in the pop-up window. If the cursor turns into a warning symbol, the property cannot be edited. After you finish customizing the field properties, click Save to confirm the changes. Make fields mandatory or non-mandatory Simply CRM lets you have complete power over fields. This means you can select which fields are mandatory or non-mandatory. Mandatory fields must always be filled in and you cannot create or import any records without entering data in the mandatory fields. Here is how you can make a field mandatory in Simply. Click on the Edit field button to open the edit pop-up box and check the Mandatory Field checkbox. Press Save to apply the change. Alternatively, you can just click on the Mandatory option within the field. If you want to make a field non-mandatory, follow the same procedure, but uncheck the Mandatory Field box. Important: Some fields cannot be made non-mandatory. For example, the Last Name field in Contacts must be mandatory to create a relation between modules. When an admin attempts to mark a field in an existing workflow, list, mailroom action, etc., he will receive a warning about the change. Delete fields In case you no longer need your custom fields or you are not satisfied with the fields, you can delete them by pressing on the trash can icon. You can delete a custom block by pressing the Delete Custom Block button in the top right corner. When you delete a custom field, all data associated with it will be lost. If you want to preserve the data, you can hide the field to make it invisible to other users. You can still view the hidden fields by pressing the View Hidden Fields button in the top right corner. Important: You cannot delete the default fields, as they can only be hidden. Hide fields In case you need to preserve the data within the fields that you no longer need, you can use the hide option. Follow the instructions below to hide a custom field. Click on the Edit option in the form of a pencil within a field. In the resulting pop-up, press on the slider that says Show Field to turn it off. Click Save to update the field properties. Important: Both default and custom fields can be hidden. However, mandatory fields can never be hidden.

Last updated on Oct 06, 2026

How to integrate Billy in Simply CRM

Billy’s Billing is a popular invoicing and accounting application that allows business owners and managers to track their incomes and expenses. You can find out more by visiting their official website at Billy.dk. Simply CRM fully integrates the Billy’s accounting system into its dashboard and provides you with a complete overview of all your accounting data. If you have a Billy account or want to set up Billy for your company, please follow the instructions below. We will help you set up an account and integrate it into your instance of Simply CRM. Continue reading for more information. Integrate Billy in Simply CRM To integrate your Billy account with Simply CRM, you will need to perform the following steps: 1. Set up a Billy.dk account 2. Generate the Billy API key 3. Configure your Billy account in Simply CRM How to set up a Billy account In order to integrate Billy in Simply CRM, you must first have an active Billy account. If you have a Billy account, feel free to skip this step. Otherwise, please follow the instructions below. Visit the Billy.dk website and sign up for a trial account using the Opret gratis bruger option in the top right corner or simply fill out the registration form in the center of the homepage. You will be automatically logged into your new account. Enter your company’s information and fill out all the forms necessary to complete the registration process. Important: Unless you finish the registration process, you won’t be able to access the option to generate the Billy API key. How to generate the Billy API key When you complete the registration, click on the gear icon in the bottom left corner to open your account settings. In the new sidebar, select Adgangsnøgler to open the API Keys. In the new window, press the Opret adgangsnøgle button in the top right corner, as shown in the image above. In the resulting pop-up window, enter the API Key name in the Navn field and press Opret. When you press the button, a new pop-up window with your API key will appear. Copy this key and then return to Simply CRM. How to configure Billy in Simply CRM When you log into your instance of Simply CRM, go to Settings. Press on Other Settings option and choose Billy’s Billing. In the Billy module, press the Edit button and enter your API key in the API Key field. Then, press Save to confirm your settings. If you’ve entered the correct data, the Status icon will turn green. When you enter your API key successfully, you will be able to change your Billy integration settings using the Edit button in the top right corner. The following table breaks down all the options that you can configure. | Option name | Option description | |---|---| | API Key | The key used to connect your Billy account with your instance of Simply CRM. | | Mapping | Mapping allows you to match Simply CRM fields to their Billy counterparts to quickly transfer your data. You can choose between default and custom mapping. Default – all fields are preset. Custom – you choose how the fields will be mapped. | | Sync mode | Sync mode describes how your data will be synchronized. Manual – the data will only sync when you press on the Sync button in the Billy module. Automatic – the data will sync automatically every three hours, starting from the next cron update. | | Sync direction | Sync direction specifies what app has priority when syncing data. Simply CRM → Billy means that the data will be synced from Simply to Billy. Simply CRM ← Billy means that the data will be synced from Billy to Simply CRM. Simply CRM ↔ Billy means that the data will sync both ways. | | Priority module for invoice and credit note sync | Determines what module has priority when synchronizing invoices in Billy. You can choose between organizations and contacts here. Organizations – prioritizes invoices from companies. Contacts – prioritizes personal invoices. | | Status | Specifies the status of the Billy-Simply CRM connection. Red means that the connection failed and green means that the connection has been established successfully. | Important: If you select two-way synchronization, you’ll need to set the app has priority. If you choose Send CRM data first, the Billy data will be updated with your Simply CRM records. Conversely, if you select Send Billy data first, your Simply CRM data will be updated with your Billy records. How to use your Billy data in Simply CRM Once you integrate your Billy account in Simply CRM, you can synchronize your data for specific modules or in bulk. To synchronize your data in bulk, simply visit the Billy’s Billing module under Settings > Other Settings. In the module, press the Sync button in the top right corner. All modules will be immediately synchronized. Important: If you set the Sync mode to Automatic, your data will automatically sync every three hours. If you need to synchronize your data immediately, use the Sync button. If you only want to synchronize a single record, you can perform the sync by locating the desired record in its module. You can access your modules using the menu on the left side. Important: Billy can only be used in the following modules – Contacts, Organizations, Products and Invoices. If you want to synchronize an Organization record, open the Organizations module from the menu. In the list view of organizations, press the record that you need to synchronize and open its detailed view. In the detailed view, press the Sync to Billy button in the top right corner. A new pop-up window with the synchronization status will appear on your screen. If your synchronization fails, please revisit the instructions on integrating Billy in Simply CRM and make sure you’ve connected your Billy account correctly.

Last updated on Aug 27, 2024

How to anonymize your data in Simply CRM

Simply CRM allows you to anonymize your contacts, leads and organizations data to provide your clients with an additional layer of privacy and security. Further, it protects private and sensitive data by removing personally identifiable information from the system. By setting up the Anonymizer module, you can choose what data can be anonymized as well as who can perform the anonymization within your company. This allows you to protect your and your clients’ activities while maintaining the data integrity. How to set up the Anonymizer module If you want to anonymize your company’s data, you’ll first need to activate the Anonymizer module. To achieve this, open Settings and select Apps under App management. Scroll through the list to find the Anonymizer block among the available apps. Then, press on the Activate button in the bottom right corner. When you activate the module, go back to Settings. Select Other Settings and choose Anonymizer from the drop-down menu. In the new window, press the Edit button to start configuring the Anonymizer settings. As you can see in the image below, Simply CRM provides a clear overview of all anonymization options. In the first field, you’ll need to specify what users can view and use the Anonymizer button in your instance of Simply CRM. We recommend that you only allow the most trustworthy people in your organization to use anonymization. If you leave this field empty, all users will be able to anonymize your records. Important: Once anonymized, the personal data of your records will be lost permanently. You will not be able to recover your data. When you specify the minimum role necessary to anonymize data, you can select what modules will have the anonymization option activated. Simply CRM allows you to data anonymization in three modules: Contacts, Leads and Organizations. You can activate the Anonymizer in each of these modules by simply pressing the check box next to the module name. For each module, you’ll be able to configure what fields will be anonymized by selecting them from the drop-down. When you finish configuring the Anonymizer settings, press the Save button in the top right corner. How to anonymize your records Once you configure the Anonymizer, you’ll be able to use it within the modules you specified in the anonymization settings. For example, if you configured the Anonymizer as shown in the previous screenshot, you can open the Contacts module to test the anonymization process. To access Contacts, press on the person icon on the left menu. Press on a contact record in the module to open its detailed view. There, you’ll find the Anonymize button in the top right corner. Anonymize Button in the Contacts ModuleWhen you press the button, you’ll be asked to confirm the anonymization. Remember that this action is not reversible. Once anonymized, the personal data is lost forever. Press Yes to confirm the action. You can see how the data anonymization affected our record in the screenshot below. As we defined in the Anonymizer settings earlier, First Name and Last Name fields were changed to Anonymous.

Last updated on Aug 27, 2024

The Simply CRM Web Service Tutorial

Simply provides a simple, powerful and secure application programming interface (API) to work with the entities stored within. To use this document, you should have a basic familiarity with software development, web services, and Simply CRM. The web service provides an easier way to integrate Simply with your other software systems. The API call characteristics REST – API is REST based, which means that all the communication between the client and the server can happen over HTTP in the form of GET or POST requests. JSON – JSON is used to encode the response and the request. Requests and responses – Your client application prepares and submits a service request to the API. The API processes the request and returns a response, and then the client application handles the response. Committed automatically – Every operation that writes to a Simply object is committed automatically. This is analogous to the AUTOCOMMIT setting in SQL. The API response Response Object All responses will have one of the following two formats. If the request is processed successfully: <code>Response{ <br></br> success:Boolean=true <br></br> result:Object //The Operation Result object <br></br>} <br></br></code> If a failure occurs while processing the request: <code>Reponse{ <br></br> success:Boolean=false <br></br> error:ErrorObject <br></br>} <br></br></code> Error object <code>ErrorObject{ <br></br> errorCode:String //String representation of the error type <br></br> errorMessage:String //Error message from the api. <br></br>} <br></br></code> errorCode is a string representation of the error type. Error handling The response for any web service request is a JSON object. The object has a field success which will have the value true if the operation was a success and false otherwise. If success is false, the response object will contain a field error which will contain the JSON object. The error object will contain two fields errorType, a single word description of the error, and errorMsg, a string containing a description of the error. The example code is written in Php and has two dependencies the Laminas library and Http_Request2. The requirements to run examples given in the tutorial 1. An installation of Simply with the web service; 2. Php to run the example code; 3. HTTP_Request2 which can be installed by doing a pear install HTTP_Request2; 4. Laminas, for which you will need to download the Laminas framework. Logging in The API does not use the password for logins. Instead, Simply provides a unique access key for each user. To get the user key, go to the My Preferences panel of a specific user. There, you will find the Access Key field. Important: It is required to enter the IP in the Whitelist IP field under My Preferences on the user’s profile in Simply CRM that is being used to access the API. Each login starts a client session with the server, authenticates the user and returns a sessionId which will be used for all subsequent communication with the server. Logging in is a two-step process. In the first step, the client obtains the challenge token from the server, which is used along with the user’s access key to log in. GetChallenge Get a challenge token from the server. This must be a GET request. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=getchallenge <br></br><br></br> &username=[username] <br></br></code> GetChallenge example To get the challenge token, you need to execute the following code. <?php <br></br>require_once 'HTTP/Request2.php'; <br></br>$endpointUrl = 'https://tr.simply-crm.dk/webservice.php'; <br></br>//username of the user who is to logged in. <br></br>$userName="API"; <br></br><br></br>try { <br></br> $request = new HTTP_Request2($endpointUrl . "?operation=getchallenge&username=" . $userName, HTTP_Request2::METHOD_GET); <br></br> $response = $request->send(); <br></br> if (200 == $response->getStatus()) { <br></br> $jsonResponse = json_decode($response->getBody(),true); <br></br> $challengeToken = $jsonResponse['result']['token']; <br></br> echo $challengeToken; <br></br> } else { <br></br> echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' . <br></br> $response->getReasonPhrase(); <br></br> } <br></br><br></br>}catch (HTTP_Request2_Exception $e) { <br></br> echo 'Error: ' . $e->getMessage(); <br></br>} <br></br><br></br>?> GetChallenge result An object representing the response result of a getchallenge operation. <code>GetChallengeResult{ <br></br> token:String //Challenge token from the server. <br></br> serverTime:TimeStamp //The current server time. <br></br> expireTime:TimeStamp //The time when the token expires. <br></br>} <br></br></code> Now that you have the challenge token you can go ahead with the login. The access key field in the login operation is the md5 checksum of the concatenation of the challenge token and the user’s own access key. The login operation, as opposed to getchallenge, is a post request. Login Login to the server using the challenge token obtained in the getchallenge operation. URL format <code>Request Type:POST <br></br>http://Simply_url/webservice.php?operation=login <br></br><br></br> &username=[username] <br></br> &accessKey=[accessKey] <br></br></code> For accessKey, create a md5 string after concatenating user accesskey from the My Preference page and the challenge token obtained from the getchallenge result. Login example <code>//e.g. <br></br>//access key of the user admin, found on my preferences page.<br></br>$userAccessKey = 'dsf923rksdf3'; <br></br><br></br>//create md5 string concatenating user accesskey from my preference page<br></br>//and the challenge token obtained from get challenge result. <br></br>$generatedKey = md5($challengeToken.$userAccessKey); <br></br>//login request must be POST request. <br></br>$httpc->post("$endpointUrl",<br></br> array('operation'=>'login', 'username'=>$userName, <br></br> 'accessKey'=>$generatedKey), true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse.<br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('login failed:'.$jsonResponse['error']['errorMsg']); <br></br><br></br>//login successful extract sessionId and userId from LoginResult to it can used for further calls. <br></br>$sessionId = $jsonResponse['result']['sessionName']; <br></br>$userId = $jsonResponse['result']['userId']; <br></br><br></br></code> The session ID is used to identify the current session and will be a common parameter in all subsequent requests. Login result An object representing the response result of a login operation. <code>LoginResult{ <br></br> sessionId:String //Unique Identifier for the session <br></br> userId:String //The Simply id for the logged in user <br></br> version:String //The version of the webservices api <br></br> SimplyVersion:String //The version of the Simply crm. <br></br>} <br></br></code> Getting information The API provides two operations to get information about the available Simply objects. The first one is listtypes, which provides a list of available modules. This list only contains modules the logged in user has access to. List types List the names of all the Simply objects available through the API. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=listtypes <br></br> <br></br> &sessionName=[session id] <br></br></code> Returns a map containing the key ‘types’ with the value being a list of the Simply object names. List types example <code>//listtypes request must be GET request.<br></br>$httpc->get("$endpointUrl?sessionName=$sessionId&operation=listtypes");<br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse.<br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('list types failed:'.$jsonResponse['error']['errorMsg']); <br></br>//Get the List of all the modules accessible. <br></br>$modules = $jsonResponse['result']['types']; <br></br></code> The second operation is describe and it provides detailed type information about a Simply object. Describe Get the type information about a given Simply object. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=describe <br></br> <br></br> &sessionName=[session id] <br></br> &elementType=[elementType] <br></br></code> Describe example <code>//e.g. <br></br>//Simply Object name which need be described or whose information is requested. <br></br>$moduleName = 'Contacts'; <br></br><br></br>//use sessionId created at the time of login. <br></br>$params = "sessionName=$sessionId&operation=describe&elementType=$moduleName"; <br></br>//describe request must be GET request.<br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse.<br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('describe object failed:'.$jsonResponse['error']['errorMsg']);<br></br>//get describe result object. $description = $jsonResponse['result']; <br></br><br></br></code> The description consists of the following fields: | Name | Description | |---|---| | Label | The label used for the name of the module. | | Name | The name of the module. | | Createable | A boolean value specifying whether the object can be created. | | Updateable | A boolean value specifying whether the object can be updated. | | Deleteable | A boolean value specifying whether the object can be deleted. | | Retrieveable | A boolean value specifying whether the object can be retrieved. | | Fields | An array containing the field names and their type information. | Each element in the fields array describes a particular field in the object. | Name | Description | |---|---| | Name | The name of the field, as used internally by Simply. | | Label | The label used for displaying the field name. | | Mandatory | A boolean that specifies whether the field is mandatory. Mandatory fields must be provided when creating a new object. | | Type | A map that describes the type information for the field. | | Default | The default value for the field. | | Nillable | A boolean that specifies whether the field can be set to null. | | Editable | A boolean that specifies whether the field can be modified. | The type field is particularly important as it describes what type of the field is. This is a map that will contain at the least one element called name, which specifies the name of the type. | Name | Description | |---|---| | String | A one line text field. | | Text | A multiline text field. | | Integer | A multiline text field. | | Double | A field for for floating point numbers. | | Boolean | A boolean field, which can have the values true or false. | | Time | A string in the format hh:mm, which is based on the user’s time format settings. | | Date | A string representing a date, the type map will contain another element called format which is the format in which the value of this field is expected, its based on the user’s settings date format. | | Datetime | A string representing the date and time, which is based on the user’s date format settings. | | Autogenerated | The fields for which the values are generated automatically by Simply. This is usually an object’s ID field. | | Reference | A field that shows a relation to another object. The type map will contain another element called refersTo, which is an array containing the modules to which the field can point. | | Picklist | A field that can a hold one of a list of values. The map will contain two elements, picklistValues, which is a list of possible values, and defaultValue, which is the default value for the picklist. | | Multipicklist | A picklist field where multiple values can be selected. | | Phone | A field used to store phone numbers. | | Email | A field used to store email IDs. | | URL | A field used to store URLs. | | Skype | A field used to store Skype IDs or phone numbers. | | Password | A field used to store passwords. | | Owner | A field that defines the owner of the field, which can be a group or an individual user. | Describe result <code>DescribeResult{ <br></br> label:String //label of the module. <br></br> name:String //name of the module, as one provided in request. <br></br> createable:Boolean //true if the logged-in user is allowed create records of type and false otherwise. <br></br> updateable:Boolean //true if the logged-in user is allowed update records of type and false otherwise. <br></br> deleteable:Boolean //true if the logged-in user is allowed delete records of type and false otherwise. <br></br> retrieveable:Boolean //true if the logged-in user is allowed retrieveable records of type and false otherwise. <br></br> fields:Array //array of type Field. <br></br>} <br></br></code> Field <code>Field{ <br></br><br></br> name:String //name of the field. <br></br><br></br><br></br> label:String //label of the field. <br></br> mandatory:Boolean //true if the needs to be provided with value while doing a create request and false otherwise. <br></br> type:FieldType //an instance of FieldType. <br></br> default:anyType //the default value for the field. <br></br> nillable:Boolean //true if null can provided a value for the field and false otherwise. <br></br> editable:Boolean //true if field can provided with a value while create or update operation. <br></br>} <br></br></code> FieldType <code>FieldType{ <br></br> name:Type //field type <br></br> refersTo:Array //an array of Simply object names of types of record to which the field can refer to, its only defined for reference FieldType. <br></br> picklistValues:Array //an array of type PicklistValue type. its only defined for picklist Fieldtype. <br></br> defaultValue:String //an value of the default selected picklist value, its only defined for picklist Fieldtype. <br></br> format:String //date format in which date type field need to populated with, eg, mm-dd-yyyy. its only defined for Date Fieldtype. <br></br>} <br></br></code> The picklist field value needs to provided explicitly. <code>PicklistValue{ <br></br> name:String //name of the picklist option. <br></br> value:String //value of the picklist option. <br></br>} <br></br></code> A describeResult object example //$description from the example above. For instance,print_r($description) might display: <code>Array <br></br>( <br></br> [label] => Contacts <br></br> [name] => Contacts <br></br> [createable] => 1 <br></br> [updateable] => 1 <br></br> [deleteable] => 1 <br></br> [retrieveable] => 1 <br></br> [fields] => Array <br></br> ( <br></br> [0] => Array <br></br> ( <br></br> [name] => account_id <br></br> [label] => Account Name <br></br> [mandatory] => <br></br> [type] => Array <br></br> ( <br></br> [name] => reference, <br></br> [refersTo] => Array <br></br> ( <br></br> "Accounts" <br></br> ) <br></br> ) <br></br> [default] => <br></br> [nillable] => 1 <br></br> [editable] => 1 <br></br> ) <br></br> ) <br></br>) <br></br><br></br></code> CRUD Operations The API provides operations to create, retrieve, update and delete CRM entity objects. Create Create a new entry on the server. URL format <code>Request Type: POST <br></br><br></br>http://Simply_url/webservice.php?operation=create <br></br><br></br> &sessionName=[session id] <br></br> &element=[object] <br></br> &elementType=[object type] <br></br><br></br></code> Create example Example 1 You can create a contact using the create operation. In this case, the mandatory fields are lastname and assigned_user_id. <code>//e.g. <br></br>//fill in the details of the contacts.userId is obtained from loginResult. <br></br>$contactData = array('lastname'=>'Valiant', 'assigned_user_id'=>$userId); <br></br>//encode the object in JSON format to communicate with the server. <br></br>$objectJson = Zend_JSON::encode($contactData); <br></br>//name of the module for which the entry has to be created. <br></br>$moduleName = 'Contacts'; <br></br><br></br>//sessionId is obtained from loginResult. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'create', <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br>//Create must be POST Request. $httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br>$savedObject = $jsonResponse['result']; <br></br>$id = $savedObject['id']; <br></br></code> $savedObject is a map containing the fields of the new object including an ID field which can be used to refer to the object. Example 2 Create a contact and associate it with an existing account. <code>//e.g 2 <br></br>//Create a Contact and associate with an existing Account. <br></br>$queryResult = doQuery("select accountname,id from accounts where accountname='Simply';"); <br></br>$accountId = $queryResult[0]['id']; <br></br>//For more details on how do a query request please refer the query operation example. <br></br><br></br>//fill in the details of the contacts.userId is obtained from loginResult. <br></br>$contactData = array('lastname'=>'Valiant', 'assigned_user_id'=>$userId,'account_id'=>$accountId); <br></br>//encode the object in JSON format to communicate with the server. <br></br>$objectJson = Zend_JSON::encode($contactData); <br></br>//name of the module for which the entry has to be created. <br></br>$moduleName = 'Contacts'; <br></br><br></br>//sessionId is obtained from loginResult. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'create', <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br>//Create must be POST Request. <br></br>$httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br>$savedObject = $jsonResponse['result']; <br></br>$id = $savedObject['id']; <br></br></code> Example 3 Create a contact and associate it with a new account. <code>//e.g 3 <br></br><p>//Create a Contact and associate with a new Account. <br></br></p><p>//fill in the details of the Accounts. userId is obtained from loginResult. <br></br>$accountData = array('accountname'=>'Simply', 'assigned_user_id'=>$userId); <br></br>//encode the object in JSON format to communicate with the server. <br></br>$objectJson = Zend_JSON::encode($accountData); <br></br>//name of the module for which the entry has to be created. <br></br>$moduleName = 'Accounts'; <br></br></p><p>//sessionId is obtained from loginResult. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'create', <br></br></p> <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br><br></br>//Create must be POST Request. $httpc->post(“$endpointUrl”, $params, true); $response = $httpc->currentResponse(); //decode the json encode response from the server. $jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br><br></br>$account = $jsonResponse['result']; $accountId = $account['id']; <br></br><br></br>$contactData = array(‘lastname’=>’Valiant’, ‘assigned_user_id’=>$userId,’account_id’=>$accountId); <br></br><br></br>//encode the object in JSON format to communicate with the server. $objectJson = Zend_JSON::encode($contactData); //name of the module for which the entry has to be created. $moduleName = ‘Contacts’; <br></br> <br></br>//sessionId is obtained from loginResult. <br></br>$params = array(“sessionName”=>$sessionId, “operation”=>’create’, <br></br> <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br> <br></br>//Create must be POST Request. $httpc->post(“$endpointUrl”, $params, true); $response = $httpc->currentResponse(); //decode the json encode response from the server. $jsonResponse = Zend_JSON::decode($response['body']); <br></br> <br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br> $savedObject = $jsonResponse['result']; $id = $savedObject['id']; <br></br> <br></br></code> CreateResult A map representing the contents of a CRM entity based object. All reference fields are represented using ID type. A key called ID of type Id represents the object’s unique ID. This field is present for any object fetched from the database. Retrieve Retrieve an existing entry from the server. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=retrieve <br></br> &session_name=[session id] <br></br> &id=[object id <br></br><br></br></code> Retrieve example To retrieve an object using its ID, use the retrieve operation. You can retrieve the contact created in the create example. <code>//sessionId is obtained from loginResult. <br></br>$params = "sessionName=$sessionId&operation=retrieve&id=$id"; <br></br>//Retrieve must be GET Request. <br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br>//operation was successful get the token from the reponse.<br></br><br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('retrieve failed:'.$jsonResponse['error']['errorMsg']);<br></br><br></br>$retrievedObject = $jsonResponse['result']; <br></br></code> RetrieveResult A map representing the contents of a CRM entity based object. All reference fields are represented using Id type. A key called ID of type Id represents the object’s unique ID. This field is present for any object fetched from the database. Update To update a retrieved or newly created object, you can use the update operation. URL format <code>Request Type: POST <br></br><br></br>http://Simply_url/webservice.php?operation=update <br></br> &sessionName=[session id] <br></br> &element=[object] <br></br><br></br></code> Update example You can add a first name to the contact. <code>//retrievedObject from previous example(Example 1). <br></br>$retrievedObject['firstname'] = 'Prince'; <br></br>//encode the object in JSON format to communicate with the server. <br></br>$objectJson = Zend_JSON::encode($retrievedObject); <br></br><br></br>//sessionId is obtained from the login operation result. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'update', <br></br> "element"=>$objectJson); <br></br>//update must be a POST request. <br></br>$httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('update failed:'.$jsonResponse['error']['errorMsg']); <br></br><br></br>//update result object. <br></br>$updatedObject = $jsonResponse['result']; <br></br></code> UpdateResult A map representing the contents of a crmentity based object. All reference fields are represented using Id type. A key called ID of type Id represents the object’s unique ID. This field is present for any object fetched from the database. Delete To delete an object, use the delete operation. URL format <code>Request Type: POST <br></br><br></br>http://Simply_url/webservice.php?operation=delete <br></br> &sessionName=[session id] <br></br> &id=[object id] <br></br></code> Delete example <code> <br></br>//delete a record created in above examples, sessionId a obtain from the login result. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'delete', "id"=>$id); <br></br>//delete operation request must be POST request. <br></br>$httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('delete failed:'.$jsonResponse['error']['errorMsg']); <br></br><br></br></code> The delete operation does not have a result. The success flag is enough to find out if the operation was successful. Queries Simply provides a simple query language for fetching data. This language is quite similar to select queries in SQL. There are limitations: the queries work on a single module, embeded queries are not supported, and it does not support joins. But this is still a powerful way of getting data from Simply. Query always limits its output to 100 records. The client application can use the limit operator to get different records. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=query <br></br> <br></br> &sessionName=[session id] <br></br> &query=[query string] <br></br></code> Query example Example 1 <code>//query to select data from the server. <br></br>$query = "select * from Contacts where lastname='Valiant';"; <br></br>//urlencode to as its sent over http. <br></br>$queryParam = urlencode($query); <br></br>//sessionId is obtained from login result. <br></br>$params = "sessionName=$sessionId&operation=query&query=$queryParam"; <br></br>//query must be GET Request. <br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('query failed:'.$jsonResponse['errorMsg']); <br></br><br></br>//Array of SimplyObjects <br></br>$retrievedObjects = $jsonResponse['result']; <br></br></code> Example 2 Specify the columns to be fetched for each record. <code>//query to select data from the server. <br></br>$query = "select lastname,firstname,account_id,assigned_user_id from Contacts where lastname='Valiant';"; <br></br>//urlencode to as its sent over http. <br></br>$queryParam = urlencode($query); <br></br>//sessionId is obtained from login result. <br></br>$params = "sessionName=$sessionId&operation=query&query=$queryParam"; <br></br>//query must be GET Request. <br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse.<br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('query failed:'.$jsonResponse['errorMsg']); <br></br><br></br>//Array of SimplyObjects <br></br>$retrievedObjects = $jsonResponse['result']; <br></br></code> This will return an array containing arrays which represent the fields of each object that matched the query. QueryResult QueryResult is an array of SimplyObjects. SimplyObject A map representing the contents of a crmentity based object. All reference fields are represented using Id type. A key called ID of type Id represents the object’s unique ID. This field is present for any object fetched from the database. Query format <code>select * | <column_list> | <count(*)> <br></br>from <object> [where <conditionals>] <br></br>[order by <column_list>] [limit [<m>, ]<n>]; <br></br><br></br></code> The column list in the order by clause can have at most two column names. | Name | Description | |---|---| | column_list | A comma separated list of field names. | | object | The type name of the object. | | conditionals | The conditional operations or in clauses or like clauses separated by ‘and’ or ‘or’ operations these are processed from left to right. There is no grouping, that is bracket operators. | | conditional operators | <, >, <=, >=, =, != | | in clauses | in (). | | like clauses | in (). | | value list | A comma separated list of values. | | m, n | The integer values to specify the offset and limit respectively. | Sync Sync will return a SyncResult object containing the details of the changes after modifiedTime. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=sync <br></br><br></br> &sessionName=[session id] <br></br> &modifiedTime=[timestamp] <br></br> &elementType=[elementType] <br></br></code> elementType – This is an optional parameter. If specified only the changes for that module after the given time are returned. Otherwise, the changes to all user accessible modules after the given time are returned. TimeStamp – A long representation of the number of seconds since Unix epoch. Example 1 Create an account and capture it in the sync API. <code>//time after which all the changes on the server are needed. <br></br>$stime = time(); <br></br>//Create some data now so it is captured by the sync api response. <br></br>//Create Account. <br></br>//fill in the details of the Accounts.userId is obtained from loginResult. <br></br>$accountData = array('accountname'=>'Simply', 'assigned_user_id'=>$userId); <br></br>//encode the object in JSON format to communicate with the server. $objectJson = Zend_JSON::encode($accountData); <br></br>//name of the module for which the entry has to be created. <br></br>$moduleName = 'Accounts'; <br></br><br></br>//sessionId is obtained from loginResult. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'create', <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br>//Create must be POST Request. <br></br>$httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse.<br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br>$createResult = $jsonResponse['result']; <br></br><br></br>$params = "operation=sync&modifiedTime=$stime&sessionName=$sessionId"; <br></br><br></br>//sync must be GET Request. <br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('query failed:'.$jsonResponse['errorMsg']); <br></br><br></br>//Array of SimplyObjects <br></br>$retrievedObjects = $jsonResponse['result']; <br></br><br></br></code> The response contains the account that was created. Example 2 Create an account and a contact, use the sync API only for the Accounts module, only changes to Accounts module are returned. <code>//time after which all the changes on the server are needed. <br></br>$stime = time(); <br></br>//Create some data now so it is captured by the sync api response. <br></br><br></br>//fill in the details of the Accounts.userId is obtained from loginResult. <br></br>$accountData = array('accountname'=>'Simply', 'assigned_user_id'=>$userId); <br></br>//encode the object in JSON format to communicate with the server. <br></br>$objectJson = Zend_JSON::encode($accountData); <br></br>//name of the module for which the entry has to be created. <br></br>$moduleName = 'Accounts'; <br></br><br></br>//sessionId is obtained from loginResult. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'create', <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br>//Create must be POST Request. <br></br>$httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br>$createResult = $jsonResponse['result']; <br></br><br></br>//Create a Contact. <br></br>//fill in the details of the contacts.userId is obtained from loginResult. <br></br>$contactData = array('lastname'=>'Valiant', 'assigned_user_id'=>$userId); <br></br>//encode the object in JSON format to communicate with the server. <br></br>$objectJson = Zend_JSON::encode($contactData); <br></br>//name of the module for which the entry has to be created. <br></br>$moduleName = 'Contacts'; <br></br><br></br>//sessionId is obtained from loginResult. <br></br>$params = array("sessionName"=>$sessionId, "operation"=>'create', <br></br> "element"=>$objectJson, "elementType"=>$moduleName); <br></br>//Create must be POST Request. <br></br>httpc->post("$endpointUrl", $params, true); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('create failed:'.$jsonResponse['error']['errorMsg']); <br></br>$savedObject = $jsonResponse['result']; <br></br>$id = $savedObject['id']; <br></br><br></br>$params = "operation=sync&modifiedTime=$stime&sessionName=$sessionId"; <br></br><br></br>//sync must be GET Request. <br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('query failed:'.$jsonResponse['errorMsg']); <br></br>//Array of SimplyObjects <br></br>$retrievedObjects = $jsonResponse['result']; <br></br><br></br></code> SyncResult An object representing the response of a sync operation. <code>SyncResult{ <br></br> updated:[Object] //List of Objects created or modified. <br></br> deleted:[Id] //List of *Id* of objects deleted. <br></br> lastModifiedTime:Timstamp //time of the latest change. which can used in the next call to the Sync api to get all the latest changes that the client hasn't obtained. <br></br>} <br></br></code> Logging Out Logout Log out from the web service session, which leaves the webservice session invalid for furthur use. URL format <code>Request Type: GET <br></br><br></br>http://Simply_url/webservice.php?operation=logout <br></br><br></br>&sessionName=[session id] <br></br></code> Example <code>//SessionId is the session which is to be terminated. <br></br>$params = "operation=logout&sessionName=$sessionId"; <br></br><br></br>//logout must be GET Request. <br></br>$httpc->get("$endpointUrl?$params"); <br></br>$response = $httpc->currentResponse(); <br></br>//decode the json encode response from the server. <br></br>$jsonResponse = Zend_JSON::decode($response['body']); <br></br><br></br>//operation was successful get the token from the reponse. <br></br>if($jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('query failed:'.$jsonResponse['errorMsg']); <br></br>//logout successful session terminated. <br></br></code> Extending the Simply web client using web service Extend session Extends the current Simply web client session to the web service and returns a webservice session ID. When working the from within the Simply web client, the user can re-use the current authenticated session instead of logging in to Simply again to access the web service. Note: If the user extends a session, then the session will be tied together, so logging out from one (the web service or the web client) will log the user out of the other as well. For the extend session operation to work, cookies must be enabled on the client browser. URL format <code>Request Type: POST <br></br><br></br>http://Simply_url/webservice.php?operation=extendsession <br></br><br></br></code> Example <code> <br></br></code> This example is written is Javascript, as the Extend Session is only valid from the Simply web client. Requirements to run the example - JQUERY library – to do the ajax http request. - JSON library – json2.js file available with Simply at json.org. Example 1 <code> <br></br>//operation parameters. <br></br>var params = "operation=extendsession"; <br></br>//end point of the services. <br></br>var endPointUrl = "http://Simply_url/webservice.php"; <br></br><br></br>//extendSession is post request, invoke jquery http post request. <br></br>$.post(endPointUrl, params, function(result){ <br></br> //decode the json encode response from the server. <br></br> var jsonResponse = json.parse(result); <br></br><br></br> //operation was successful get the token from the reponse. <br></br> if(jsonResponse['success']==false) <br></br> //handle the failure case. <br></br> die('login failed:'+jsonResponse['error']['errorMsg']); <br></br><br></br> //login successful extract sessionId and userId from LoginResult so it can used for further calls. <br></br> var sessionId = jsonResponse['result']['sessionName']; <br></br> var userId = jsonResponse['result']['userId']; <br></br>}); <br></br></code>

Last updated on Aug 27, 2024

How to set up Multiple Senders in Simply CRM

The Multiple SMTP app in Simply CRM allows you to add multiple SMTP servers to your Simply instance. By configuring multiple SMTP servers, this extension lets you customize your messages and communicate with your contacts using a variety of email accounts. This way, you can separate your marketing and sales messages from support emails or allow your employees to send emails from their personalized company accounts. Thanks to Multiple SMTP, each user in your instance of Simply CRM will be able to add their own custom email address and send emails directly from Simply CRM.However, Multiple SMTP doesn’t just help you better organize your messaging, they allow you to collect more precise data for your marketing campaigns Multiple SMTP doesn’t just help you better organize your messaging, they allow you to collect more precise data for your marketing campaigns. In addition, using multiple email addresses can reduce the risk of your message ending up in the user’s spam folder, which helps increase your open rates. How to set up the multiple senders app In order to set up multiple senders, you’ll first need to activate the application from the App Store. To do that, go to Settings > App Management > Apps. Then, search for the Multiple SMTP app in the store. Once you find Multiple SMTP, press the Activate button to turn on the app. The app will instantly become available to you and you should receive the following notification, informing you about the app status, in the top right corner. Now, you can find the Multiple Senders option under Other Settings. When you open the app, you should see the Multiple Senders homepage with an Add New button in the top right corner. Press this button to add your email addresses to Simply CRM. However, before you start adding your email addresses, please make sure they are configured to allow Simply CRM to connect to them. If you are using Gmail, see this article for a step-by-step guide: - How to configure a Gmail account for Multiple Senders To add your email, you’ll need to fill out the form shown below: The following table breaks down each field and describes how to fill it out to successfully add your email account to Multiple Senders. | Field Name | Description | |---|---| | User Name | Defines the Simply CRM user that will be associated with the email account. | | SMTP Server | Specifies the SMTP server that is used to send out emails. | | SMTP User | Specifies the email address (user) that is connecting to the SMTP server. | | Password | The password of the email account specified in the SMTP User field. | | From Address | Specifies the email address that will be used to send emails. This email address should be the same as SMTP User. | | From Name | Specifies the name that will be shown when sending emails. | | Batch Count | Limits the number of messages that can be sent in a batch. | | Batch Delay | Defines the delay between emails sent in a batch. | | Auth | Select this option if you want the SMTP server to require authentication before sending emails. | Below, you’ll find an example of a Gmail address configured correctly. When you press save, the module should reload and send you back to its homepage, where you will see your new address added under Multiple SMTP Accounts. You should also receive a test email confirming that you successfully added your email address to Multiple Senders. The email will be sent from the address that you configured in Multiple Senders to the email address associated with your Simply CRM user account. How to use multiple emails in Simply CRM When you configure your email accounts and add them to the Multiple Senders app, you’ll be able to choose your preferred email address for each email that you send. If you’d like to send an individual email to a contact, you can open the Mail Manager app by pressing the mail icon in the top right corner. Then, press the Compose button in the top left corner of the Mail Manager app. In the resulting email pop-up, press the Outgoing Server button and select the preferred email user name that you configured in the Multiple Senders app. Important: In order to send emails from Simply CRM, you must first install the Mail Manager App and configure your inbox. If you’re unsure how to do that, please consult our in-depth guide on setting up the Mail Manager.

Last updated on Aug 27, 2024

How to configure a Gmail account for Multiple Senders

If you have activated the Multiple Senders app in Simply CRM and want to add your Gmail account to Simply, please read the following article for instructions on how to successfully configure your email address. In case you are unsure how to activate the Multiple Senders app, please visit our general guide. It will provide you with step-by-step instructions on activating the app and adding multiple email addresses. How to configure Gmail account settings In order for Simply CRM to connect to your email account, you’ll need to adjust your email settings. If you’re using Gmail, open your inbox, press the account avatar in the top right corner and select Manage Your Google Account. Manage Your Google Account Settings From the sidebar, select Security. On the Security settings page, turn off two-factor authentication. You will not be able to use your Gmail account unless your 2-step Verification option is set to Off. Next, scroll down to the Less Secure Apps section. If your account is configured to not allow less secure apps, you’ll need to press the Turn On Access (not recommended) button. When you press the button, you’ll get a new page showing your current settings. Press the slider button to turn on access for less secure apps. Before you move on, make sure the settings say: Allow less secure apps: On. If you do not allow less secure apps to connect to your account, you may have trouble adding your email address to Simply CRM. After you allow access for less secure apps, you should also solve the Display Unlock Captcha to ensure easy access to Simply. Visit the following page: https://accounts.google.com/b/0/DisplayUnlockCaptcha and press Continue. This way, you’ll ensure that your email account can be added to the Multiple Senders app in Simply CRM. Important: The Display Unlock Captcha configuration only lasts for 10 minutes. Once you press the Continue button, you should immediately add your address to Simply CRM. If you do not add it within 10 minutes, you may be required to repeat that step. How to add a Gmail account to Multiple Senders Now that you’ve configured your email account settings, you can go back to the Multiple Senders app and press the Add New button in the top right corner. Multiple Senders Homepage in Simply CRMTo add your email, you’ll need to fill out the form shown below: The following table breaks down each field and describes how to fill it out to successfully add your Gmail account to Multiple Senders. | Field Name | Description | |---|---| | User Name | Defines the Simply CRM user that will be associated with the email account. | | SMTP Server | Specifies the SMTP server that is used to send out emails. For Gmail, enter: tls://smtp.gmail.com:587. | | SMTP User | Specifies the email address (user) that is connecting to the SMTP server. | | Password | The password of the email account specified in the SMTP User field. | | From Address | Specifies the email address that will be used to send emails. This email address should be the same as SMTP User. | | From Name | Specifies the name that will be shown when sending emails. | | Batch Count | Limits the number of messages that can be sent in a batch. | | Batch Delay | Defines the delay between emails sent in a batch. | | Auth | Select this option if you want the SMTP server to require authentication before sending emails. | Below, you’ll find an example of a Gmail address configured correctly. When you press save, the module should reload and send you back to its homepage, where you will see your new address added under Multiple SMTP Accounts. You will also receive the following test email confirming that you successfully added your email address to Multiple Senders. Important: The email will be sent from the address that you configured in Multiple Senders to the email address associated with your Simply CRM user account. How to resolve the Gmail configuration errors SMTP Connect Failed When you try to add a new email address to Multiple Senders, you may receive the following error saying SMTP Connect () failed. If this issue occurs, please try resolving it by: - Double-checking all the information you entered for spelling mistakes - Ensure you’re entering the correct password - Re-check your email account settings - Re-do the Display Unlock Captcha - Try again within 10 minutes. StartTLS Error In case you receive an error saying your mail was not accepted due to STARTTLS, as shown below: Make sure your SMTP Server field contains the tls:// prefix before the SMTP server name: smtp.gmail.com:587. In other words, enter tls://smtp.gmail.com:587 in the Auth field, as demonstrated in the following image: Authentication Error If you receive the following authentication error, please try checking the box next to the Auth field. In case you encounter an error not described here, please contact our support team through LiveChat. We will make sure the issue is resolved as soon as possible. Once you add your account to Simply CRM, you can start enjoying all the benefits that the Multiple Senders app offers. For more details on how to use this module, please visit our Multiple Senders support guide.

Last updated on Aug 27, 2024

How to integrate Xero with Simply CRM

Xero is a powerful online accounting software that helps small businesses better manage their incomes, expenses, inventory and invoices. Since its launch in 2010, Xero has positioned itself as the industry leader for bookkeepers and accountants from all over the world. Today, Simply CRM is happy to announce that our system fully integrates with Xero to provide a centralized overview of all your financial data. If you’re ready to integrate Xero with Simply CRM, contact our support and we’ll install the integration module for you, free of any charge. If you already have Xero installed on your instance, continue reading to find out how you can sync your Xero data with Simply CRM. Important: Simply CRM uses the latest module version – XTiger 0.0006 for Xero. How to generate a Xero API key Before you start using your Xero records in Simply CRM, you’ll first need to generate a Xero API key, which will allow us to sync the data between the systems. To get your Xero API key, visit the Xero website and log into your account. Once you log in, open the My Apps page. Then, press the New App button in the top right corner. In the resulting window, you’ll need to enter the following information: | Field | Information | |---|---| | App Name | Enter your preferred app name here. For example, Simply App. | | OAuth 2.0 grant type | Select Auth Code Web App to ensure a smooth experience. | | Company or application URL | Enter the URL of your Simply CRM instance here. | | Privacy Policy URL | You can leave this field blank or enter the URL to your privacy policy page. | | OAuth 2.0 redirect URI | Here, you’ll need to enter the following URL: https://instanceURL/modules/XTiger/callback.php. Replace instanceURL with the URL of your Simply CRM instance. For example, https://simplytest.simply-crm.com/modules/XTiger/callback.php. | Once you enter the necessary information, click on the checkbox to agree to the Xero Terms and Conditions. Then, press the Create app button at the bottom of the page. After you create the app, you’ll be led to the page with the app details, as shown below. Here, you’ll need to copy your client ID, generate the secret key and the referral ID (XTID). Create a copy of all three data points in a local file immediately. You’ll later need these credentials to establish a connection between Xero and Simply. How to install and configure the Xero app As we mentioned earlier, our support team will be more than happy to install the Xero app on your instance of Simply. Just drop us a quick message through live chat or our contact page. Important: After you approach us with an installation request, please allow some time for our support team to install the app on your instance. We will typically set up the Xero app within 24 hours. Once the Xero app is installed on your instance, you’ll need to configure it. In this step, you’ll need to open the Tools menu on the left and select Xtiger. Click the Install button to start the installation process. Open a new window then copy and paste the URL https://instancename/index.php?module=XTiger&view=List&service_set=API#. Replace the ‘instancename’ with the name of your instance. For example, https://nwl.simply-crm.com/index.php?module=XTiger&view=List&service_set=API#. Then, click the Edit button in the top right corner. You’ll need to enter the following information here: | Field | Information | |---|---| | Consumer Key | Enter the Xero Client ID here. | | Consumer Secret | Paste the Client Secret key in this field. | | Service | Select Cron here. | | Duplicate Handling | Select Skip. If you choose Add Suffix, the system will add a unique contact or organization ID during the sync. | Once you enter all the necessary data, press the Save button in the top right corner. If you’re saving the credentials for the first time, you’ll be led to a new screen where you’ll have to allow access to your Xero account. Press the Allow access button at the bottom of the page to proceed with the integration. How to use Xero with Simply CRM When you finish configuring Xero in the XTiger app, you’ll be able to freely sync your data between the two systems. If you’re unsure how to perform the synchronization, follow our quick guide below. However, before you start synchronizing any data, it’s important to keep the following notes in mind. If you do not enter any data in the mandatory fields for the Organization, Products and Invoice modules, the records with the missing data will not be synced. Instead, they will return a failed notice. Make sure all mandatory fields are filled in before you start a sync. Similarly, please ensure that Xero and Simply CRM use the same base currency before initiating any syncs. You can perform a sync manually by opening the Xtiger app through the Tools menu. Simply select the module you wish to sync and press the Sync button. The Sync Results field on the right will inform you about the sync status, as shown below. How to sync Xero records with Simply CRM If you wish to sync your Xero records with Simply CRM, use the options highlighted below. By using these options, you’ll update your Simply CRM data with Xero records. The following table describes how each sync option works in Simply CRM. | Option | Result | |---|---| | Get Organisation from Xero | Syncs Xero data with contacts/organizations in Simply CRM. | | Get Invoice from Xero | Syncs invoices from Xero to Simply CRM. For more information, check the Xero documentation. | | Get Items from Xero | Syncs items from Xero with Simply CRM products. | | Get Accounts from Xero | Syncs accounts from Xero with Simply CRM. | How to sync Simply CRM records with Xero Simply CRM supports bidirectional synchronization, which means you can update your Xero data with the Simply CRM records. If you want to sync your Simply CRM data with Xero, you can use the following options. By using either of the options highlighted below, you’ll update your Xero data with Simply CRM records. The next table will describe how each of the options works: | Option | Result | |---|---| | Send Organisation to Xero | Syncs Organizations/Contacts from Simply to Xero. | | Send Invoice to Xero | Syncs Simply CRM invoices to Xero. | | Send Products to Xero | Syncs Simply CRM products to Xero. | Before you initiate a sync from Simply CRM to Xero, please consider the following guidelines and restrictions. You’ll need to make sure that the Xero Status field under Xero Information always has a value before syncing invoices. Otherwise, the sync may fail. It is currently impossible to update or change the Xero Status field to Paid or Voided through Simply CRM. This change needs to be done manually in Xero and synced back to Simply. Please note that this is a system limitation. Before syncing from Simply CRM, you should make sure that each product has an associated Xero account. You can associate a Xero account with a product by opening the product page and pressing the Xero Accounts button. Then, click on the Select XeroAccounts button to choose from the available Xero accounts. Before you press this button, you should first perform a Get Accounts from Xero sync to make your Xero Accounts available in Simply. Once you select a Xero account, its name will be displayed on the product page. You can then view, edit or unlink the account as necessary. Additional features available in Simply CRM Aside from Xtiger, which you can use to sync your data between Simply CRM and Xero, our system provides you with three more useful features to help you make the most of your Xero integration. With Xtiger, you get Xero Logs, Xero Accounts and Xero Queue. Xero Logs provides you with a list view of the sync result details, which includes the App Name, Success/Failed Result, Action Log, Flow, CRM ID, Xero ID, Error Message, Created Time, and Modified Time. You can use these logs to find out why any specific synchronization attempt failed. You’ll find Xero Logs by opening the menu on the left side and selecting Xero Logs under Tools. Xero Accounts displays a list view of the Xero Account details that have been synced from Xero. These details include Name, Account Code, Account Type, Tax Type, Class, Status, Description, Created Time, and Modified Time. Similar to Xero Logs, you can access Xero accounts by choosing Tools from the main menu on the left side. Xero Queue displays a list view of all records that are scheduled for a sync using the Add to Queue in the XTiger module. Important: Xero Queue is temporarily unavailable. We will update the article as soon as Xero Queue becomes functional. How can I deactivate my Xero account in Simply CRM? If you wish to remove the Xero app from Simply CRM, visit the Simply App Store. You can access the App Store by selecting Settings > App Management > Apps. Find the Xero app in the store and press the Deactivate button. What will happen to my records if I uninstall Xero from Simply CRM? Your records won’t change when you uninstall Xero, but you will no longer be able to sync your records with Xero. I keep receiving an error message saying: token_rejected. What should I do? If you are receiving the token_rejected error or a warning message saying or Check whether the provided tokens are correct or not, please try removing and re-authenticating your Xero account in Simply CRM. If the issue persists, you can contact our support through live chat.

Last updated on Aug 27, 2024

How to integrate Facebook with Simply CRM

The Facebook to Leads app allows you to connect your Facebook business page to Simply CRM. By integrating your page, you can use our apps to automatically generate leads, contacts and organizations based on the information your customers provide on Facebook. Here, we will explain how you can install and use Facebook to Leads to create a more efficient business. You can handle all customer interactions directly from your Simply CRM dashboard! How to install Facebook to Leads In order to use Facebook to Leads, you’ll first need to activate the app in your instance of Simply CRM. To activate this app, go to Settings. Hover over the App Management tab and click on Apps. Search through the available apps to locate Facebook to Leads. Press the green Activate button to install the app. The app should be immediately installed and you should receive the following notification on your screen. Important: If you do not receive this notification or you have trouble finding the Facebook to Leads app under Apps, please contact our support team through live chat. After you install Facebook to Leads, please make sure to configure your Facebook developer account. If you’re unsure how to do that, you can simply head over to Facebook for Developers and log in with your Facebook account. Your Facebook profile will automatically be upgraded to a Facebook developer account. How to connect Simply with Facebook You can access Facebook to Leads in Simply CRM by hovering over the Tools option on the left menu. From the expanded options, select Facebook to Leads. In the Facebook to Leads app, press the Start button to initiate the integration process. Now, you’ll be required to enter your App ID and App Secret. To acquire this data, you’ll need to go back to Facebook for Developers. Click on My Apps in the top right corner. In the new window, press the Create App button. In the resulting pop-up, select Manage Business Integrations and press Continue. Fill out the necessary fields with your details. Set the App Name to Simply CRM, enter your contact email address and select Yourself or your own business under App Purpose. If you have a Business Manager account, feel free to connect it with your app to get access to optional features. After you enter all the details, press the Create App button in the bottom right corner. Once you create the app, you’ll need to configure its settings. Go to Settings > Basic to acquire your App Secret and App ID, which you’ll need to integrate Facebook Leads into Simply CRM. Under App Domains, add localhost and the URL of your Simply CRM instance. Enter the Simply CRM website under the Privacy Policy and Terms of Service URL fields. Once you configure the app, your screen should look like this: Copy your App ID and App Secret from the page. You’ll need to enter them in your Facebook to Leads app when you initiate its installation in Simply CRM. After you save your App ID and App Secret, you’ll need to create a Facebook page for your business. Important: This step is mandatory, even if you already have a Facebook page for your business. The Facebook Developers studio does not allow you to use existing pages at this point, which means you need to create a new page. However, you don’t need to worry, as you’ll be able to switch to your existing page after you finish creating a dummy page. To create a new page, press the Create New Page button shown below. Follow the steps outlined in the Facebook page registration process to create a page similar to the dummy page we created below. Use the Manage Page menu to create a lead form for the newly created Facebook page. You’ll find this option under Publishing Tools > Leads Setup > Try Business Suite > Forms > Create Form. Once the form is create, you’ll need to get the Form ID from the Forms Library under Publishing Tools. Once you have the Form ID, go back to https://developers.facebook.com/tools/explorer/. Choose the Facebook App Name and Facebook Page on the left side to generate an access token. Make sure to select the new page you created earlier. If you want to use a pre-existing Facebook page for the integration, you’ll receive a prompt to connect your Facebook account once you press Get Page Access Token. From there on, you’ll be able to select which existing Facebook page you want to link to the Facebook for Developers account. Before you integrate the page, you’ll need to set the app permissions as shown in the next image. Then choose the page you want to use and copy the Access Token that the app generates for the selected page. Once your Facebook page is linked, you’ll notice that it goes back to User Token instead of Page Access. Please re-apply Get Page Access Token, and select the Facebook page you want to integrate. Then just click the copy button. No need to click on the Generate Access Token button. When you save the access token, you’ll need to extend the access token session. You can do that by visiting https://developers.facebook.com/ > More > Tools> Access Token Debugger. Paste your access token under Access Token, as shown below, and click Debug. All the details will be auto-generated here. Save your Page ID and App ID somewhere because you’ll need to use them to set up the integration in Simply CRM. Then, press Extend Access Token. Click Products + to add the Facebook login form. For the integration to work correctly, you’ll also need to whitelist your Redirect URI on Facebook. To achieve that, simply paste your URIs under Facebook for Developers > Facebook Login> Settings > Valid OAuth Redirect URIs. What follows are sample URLs. Please use your own Simply CRM instance URLs with the following paths: https://virtualjud.simply-crm.com/index.php?module=SMPFacebookLeads&view=Connect https://virtualjud.simply-crm.com/index.php https://virtualjud.simply-crm.com/accounts/facebook/login/callback/ Press Save Changes to confirm the configuration. Now that you’ve set up Facebook for Developers, you can move back to your instance of Simply CRM and open the Facebook to Leads app that we installed earlier. When you open the app, press Start to initiate the configuration process. Then, connect your page with Simply CRM by entering your App ID and App Secret. You’ll be promoted to choose the Facebook page you wish to select. Click Next and provide the permissions as needed. Then, scroll to the bottom and click Finish. Once you finish the configuration, you’ll get access to the Facebook to Leads homepage, as shown below. Click Create and enter the page ID of your preferred Facebook page. Then select the lead form from which the leads will be imported. Once you’ve chosen your page and lead form, you’ve successfully set up Facebook to Leads in your Simply CRM instance. In the end, you can test your configuration by visiting: https://developers.facebook.com/tools/lead-ads-testing/. Simply choose the page you set up and the form you created. Then, click Create Lead. If a new lead appears in your Simply CRM, you’ve successfully integrated Facebook for Leads. In case you have any problems, please revisit the instructions or reach out to our support team.

Last updated on Aug 27, 2024

How to use the MapView app in Simply CRM

Map View is a module that allows you to visualize the locations of your contacts, leads and organizations in Simply CRM. Maps appear as an additional tab next to the list view of records within the selected module. To enable the maps, you’ll need to activate the following apps from the Simply App Store: Map View and Address Autofill. Important: You need to activate both Map View and Address Autofill. Failure to activate both will result in a non-functional map view. For instructions on how to activate apps from the Simply App Store, please check our guide titled How to activate apps in Simply CRM. How to configure the Map View app When you activate the Map View app, open the Settings page and navigate to Map View under Other Settings. Here, you’ll be able to configure the Map View settings. The following table explains all the available options in the Map View module. | Option | Description | |---|---| | Enable | Specifies whether the map view will be enabled or disable within your instance of Simply CRM | | Map Center | Sets the center of the map, which will be denoted with a location pin | | Radius | Determines the radius within which the locations will be pinned on the map | | Enable On | Allows you to select the modules in which the map view will be available within your Simply CRM instance | | Is Default View | Allows you to choose whether the map view will be opened by default when you access the modules selected in the previous option | In addition to this, Simply CRM lets you configure certain module-specific settings, such as the address that will be shown or the pin color, for the map view. Address Shown lets you choose which address field will be used to populate the map view. Pin Color allows you to choose what color will be used for the location pins. Once you configure the Map View settings, press the Save button at the bottom of the page. The map view tab will immediately become available in the selected modules, as shown below. If your map view does not contain a central location, please make sure you added your company’s address when you were setting up your Simply CRM instance. To check your company’s address, open Settings from the profile drop-down menu in the top right corner. Settings in Simply CRM for Time Tracker Then, navigate to Company Details under Configuration. Scroll down to the Company Information box and fill out your company’s address. Please make sure to enter your company’s street, city and country. Once you’ve added your address, you can select what records will be shown on the map by simply checking the box next to their name on the Map View tab. New location pins corresponding to the address of your records will automatically show up on your map. In case you do not see the new locations on the map, click the Settings icon on the map to configure the map view. In the resulting pop-up window, fill out the Address Shown and Pin Color fields with your preferred settings, similar to what you did in the Map View module settings earlier. Then simply exit the pop-up and select the records of the locations you’d like to see on the map. In addition, you’ll have the standard Google Maps settings on your map view. In the top left corner of the map, you can switch between map and satellite view. On the right, you’ll have the options to find the closest route between locations, open the Google Maps page with the selected locations or view the map in full screen. By clicking on the icon in the bottom right corner, you’ll be able to navigate to the street view of the selected location. If you need further help with Map View, please contact our support team through live chat or email us at support@simply-crm.com.

Last updated on Aug 27, 2024

How to create Custom Pipelines

To create a custom pipeline go to your account Settings → App Settings and select Visual Pipeline option. Click on the Add Visual Pipeline button at the top right corner. In this window you are able to give a name to your new pipeline, let’s say Deals by Lead Source. Select the App from which the system will pull the data for this pipeline, for our example let’s use Deals. And choose the drop-down field for Pipeline Stages, in our case Lead Source. After that, you can select the list to which this Pipeline will apply. We will choose All Deals. You can then select the field to sum up on the header of your columns, and decide whether you want this Pipeline to be the default filter. Next options allow you to manage the visual aspect of your Pipeline. Add stages of the Pipeline and select the color of that stage by clicking on the Add Stage button. There is no limit to how many stages you can add. Then, select the fields that you want to have reflected in every pipeline card and the number of cards to be displayed on the screen. You can then decide whether to add an option to delete the card, by ticking the “Enable Delete On the bottom” checkbox. Once you have completed the set up, click Save.Your new Pipeline has now been added to the Deals App. You can select it from the Pipeline view drop-down at the top of your List. The custom pipeline is complete and ready to be used. Should you need any help, send us a note to support@simply-crm.com.

Last updated on Aug 27, 2024

Customer Value & Priority (Organisations)

Customer Value & Priority (Organisations) The Customer Value & Priority block on the Organisation record is used to automatically prioritize support in Simply CRM. These fields ensure that high-value or high-risk customers are answered faster and more consistently. Fields Overview Subscription value (Currency) Total recurring subscription revenue (typically last 12 months). - Filled automatically from Invoice records - Represents long-term SaaS revenue Service value (Currency) Total billable consulting / project revenue (last 12 months). - Filled automatically from Invoice records - Captures non-recurring revenue Deal value (Currency) Value of active deals expected to close within 90 days. - Pulled from late-stage Deals - Ensures renewals / upsells are prioritized Churn risk (Decimal 0–1) Risk that the customer may cancel. Calculated based on signals such as: - Overdue invoices - Negative sentiment - Cancellation-related keywords - Reduced usage Higher value = higher risk. Value score (Decimal 0–1) Combined customer importance score. This field is calculated automatically by the "Calculate Value Score" workflow on the Organisation module using an Update Fields action. The default formula used: (0.385 × Subscription value) + (0.165 × Service value) + (0.15 × Deal value) + (0.20 × Churn risk) This ensures: - Subscription revenue has the highest weight - Service revenue contributes but less than subscription - Active deals influence priority - Churn risk significantly increases urgency The workflow runs whenever relevant financial or risk fields are updated. Support priority (Integer) Final priority level used for support routing. Calculated from: - Organisation Value score - Ticket Severity - Ticket Age Higher number = higher urgency. How It Prioritizes Tickets When a Helpdesk ticket or email is created: 1. The Organisation’s Value score is retrieved. 2. The ticket is classified for Severity. 3. Ticket Age increases priority over time. 4. A final Support priority is calculated. 5. Tickets are sorted automatically in queues. This ensures: - High-revenue customers are prioritized - High churn-risk accounts receive faster attention - Critical outages are handled before general questions - SLA breaches trigger alerts automatically Workflows Used - Invoice → Organisation workflow Updates Subscription value and Service value (rolling 12 months) - Deal → Organisation workflow Updates Deal value for active late-stage deals - Calculate Value Score (Organisation workflow) Uses an Update Fields action to calculate Value score using the formula above - Ticket creation workflow Calculates Support priority Key Principle All scoring fields are: - Transparent - Stored directly on the Organisation - Automatically updated - Adjustable if needed This makes prioritization explainable, scalable, and reusable across Simply CRM environments.

Last updated on Feb 28, 2026

Recommended Ticket Stages and Automatic Waiting-Time Tracking

A clear ticket flow is the foundation of good support. We recommend starting with the standard stages below before customizing your setup. They are broadly usable and work well in most environments. As an administrator, you can adjust or rename statuses to match your internal processes. However, we recommend working with the standard options for a period first to evaluate how they fit your setup. This helps maintain consistent reporting, automation, and team workflows. Ticket Stages Active 1. New Ticket has been created. No agent has interacted yet. 2. Open An agent has started working on the ticket or it is awaiting internal action. If internal, it should be reassigned to the correct user. 3. Pending (Customer) Agent has replied and is waiting for customer response. 4. On Hold Waiting on a third party or internal dependency. Resolved 1. Solved Issue resolved. Can still be reopened if the customer replies within a defined period (e.g. X days). Final 1. Closed Final state. Cannot be reopened. Internal notes can always be used for internal communication without affecting the customer-facing status flow. Automatic Waiting-Time Tracking To make prioritization simple and transparent, we use two automatic fields on all HelpDesk tickets: - Hours Since Last Email (integer) - Last Email From (Customer / Support) Both fields are updated automatically by a workflow approximately every 30 minutes. Hours Since Last Email This field shows how many hours have passed since the oldest unanswered customer email in the ticket. It only counts situations where the customer has written after our last reply. How it works - If a customer writes and no agent has replied, the counter increases. - If multiple customer emails are unanswered, we count from the first unanswered one. - When an agent replies, the counter resets to 0. - If the customer writes again after an agent reply, the counter starts from that new message. Examples - Customer writes 100 hours ago → no reply → Hours Since Last Email = 100 - Customer writes 100 hours ago and again 80 hours ago → no replies → Hours Since Last Email = 100 - Customer writes 100 hours ago → agent replies → Customer writes again 80 hours ago → no reply → Hours Since Last Email = 80 - Customer writes → agent replies → Hours Since Last Email = 0 This ensures you always know how long a customer has been waiting. Last Email From This field shows who sent the most recent email in the ticket: - Customer → Action required from support - Support → Waiting for customer Together, these two fields give a quick and reliable overview of where action is needed and how long customers have been waiting.

Last updated on Mar 03, 2026

Buttons: one-click actions on records

Buttons let you add your own one-click actions to records in Simply CRM, for example "Close ticket" or "Mark as won". A button can update fields, open a short form, create a related record or start a workflow. Tasks that normally take several steps are done with one click, and the button only appears when it is relevant. Your team saves time, makes fewer mistakes and follows the same process every time. Administrators set up the buttons. Users just click them. What a button can do - Update fields in a popup: the user fills in selected fields and clicks Save. You can make some of the fields required. - Set a field automatically (silent field update): sets a dropdown or checkbox field to a fixed value. - Create a record in another module: for example a ticket from an organization. - Run workflows: for example to send an email or calculate dates from what the user entered in the popup. A button can combine these. Where a button is shown - Detail: on the record page. - List: in the list view of the module. - Related list: on each row of a related list tab. For example, a button on membership lines is shown on every membership line under a contact. The button runs on that row, not on the contact. - Summary widget: on each row of a "Related module" widget on the summary view (Custom Widgets), in its own column at the end of the row. It runs on that row, and only the widget refreshes afterwards. It is independent of Related list: a button can be in the widget without being in the tab. - Summary widget header: in the header of one chosen widget on the summary view (Custom Widgets), for example "Copy water volumes" in a water volume widget on a company. It runs on the record itself (the company), and only that widget refreshes afterwards. Choose the widget under Widget. A button can be shown in several places at once. A workflow can also open a button's popup by itself right after a record is saved, see "Ask the user in a popup after a save" below. Create a button The Buttons app is active by default. You can deactivate it under Settings > App Management > Apps if you do not want to use it. 1. Go to Settings > Other Settings > Buttons. 2. Click New Button. 3. Select the Module first. The other options depend on it. For a related list or summary widget row button, choose the module of the rows (for example Membership lines), not the module of the page. For a summary widget header button, choose the module of the page (for example Organizations). 4. Fill in the settings below and click Save. Basic settings | Setting | Description | |---|---| | Module | The module that gets the button. | | Button Title | The button text. | | Select View | Detail, List, Related list (row action), Summary widget (row action) and/or Summary widget header. Choose one or more. | | Widget | For Summary widget header: the Custom Widgets widget whose header shows the button. The list shows the widgets of all modules; pick one on the button's module. | | Icon/Label, Button Color | Icon, color and style (Solid or Border). | | Sequence | Button order. Lowest number first. If empty, buttons are shown in the order they were created. | | Active | Turns the button on or off. | | Popup Window Title, Popup Text | Title and help text in the popup. | | Save button text, Cancel button text | The texts on the popup's buttons, for example "Cancel membership" instead of Save. Default Save and Cancel. A known text (Save, Cancel, Add Contact …) is translated into the user's language; other texts are shown as written. | Modal Popup: update this record - Fields on Popup: fields the user fills in. Leave empty for a one-click update. - Required fields on popup: popup fields that must be filled in. The popup cannot be saved while they are empty, and the silent update and workflows do not run. - Silent Field Update: a dropdown or checkbox field and its new value. Set on click, or on Save if the popup has fields. - Workflows: run after saving, in the chosen order, and can use the values entered in the popup. Only active, manually triggered workflows in the same module. - Activate RichText for TextAreas: allows text formatting in the popup. Module Popup: create a record - Select Module: where the new record is created. - Fields on Popup: fields for the new record. - Popup Width %: width of the popup. Conditions (optional) Show the button only on records that match, for example when Status is not Cancelled. Choose whether all or any conditions must be met. Without conditions, the button is shown on all records. On a related list or summary widget, the conditions are checked for each row; in a widget header, on the record itself. Mobile app - Used in browser / Used in Mobile: where the button is available. - Mobile Function: call, SMS, email, map or quick create. - Mobile Location: top or bottom of the screen. Example: cancel a line from the related list A button "Cancel" on membership lines, shown in Related list: 1. Fields on Popup: End date. Required fields on popup: End date. 2. Save button text: Cancel membership. 3. Conditions: Status is not Cancelled, so the button disappears when the line is cancelled. 4. Workflows: a manual workflow that copies the end date to the cancellation date and sets today's date as the date the cancellation was received. The user opens a contact, clicks Cancel on the line, picks a date and clicks Cancel membership. The line is updated and the list refreshes. Select Summary widget as well (or instead) to offer the same button in a membership widget on the summary view. Ask the user in a popup after a save A workflow can open a button's popup for the user right after they save a record. Use it for optional questions, for example "Do you want to send a welcome email?" when a contact is created without an email address. 1. Create the button as described above: the fields on the popup, required fields, silent update and workflows. 2. Create a workflow in the same module. Choose when it runs: Only on the first save, Every time the record is saved or Every time a record is modified. Add conditions to limit it, for example "Email is empty", or "has changed" on a field. 3. Add the task Ask user (Button popup) and select the button. When a user saves a record that matches the workflow, the button's popup opens. OK saves the popup fields and runs the button's silent update and workflows, as a click on the button does. Cancel does nothing. If the button has no popup fields, the user is asked to confirm first. A save opens at most three popups, one after the other. Good to know: - Only the user who saves the record in Simply CRM is asked. Import, API calls and records saved by other workflows do not open a popup. - The popup opens after the record is saved. It cannot stop the save. - The user can close the popup. Use it for optional questions. Something that must always happen belongs in a normal workflow, or in a required field. - It works in both the new and the classic interface. Use a button - On a record: open the record and click the button. - On a related list row: in the classic interface, click the button on the row. In the new interface, open the row's actions menu and choose the button. - On a summary widget row: click the button at the end of the row (classic interface). - In a summary widget header: click the button in the widget's header (classic interface). If a popup opens, fill it in and click the save button. Troubleshooting Buttons missing in Settings? The app has been deactivated. Activate it under Settings > App Management > Apps. Button not shown? Check that it is active, set up for the right module and view, that the record matches the conditions, and that the user can edit the record. Button not shown on related list or widget rows? Select Related list or Summary widget under Select View, and make sure the button is set up on the module of the rows. Buttons that only run JavaScript are not shown on rows. In the new interface, buttons that create a record in another module are not shown on rows yet, and summary widgets are not supported yet. Button not shown in a widget header? Select Summary widget header and the right Widget, and set up the button on the module of the page, not of the widget's rows. Buttons that only run JavaScript are not shown there. Button cut off in a summary widget? The widget is too narrow. In the widget's settings (Custom Widgets), choose Wrap, show everything under Long rows, show fewer columns, or move the widget to a wider column. Popup cannot be saved? A required field is empty. Save or Cancel text not translated? Only known texts are translated. Your own text is shown as written in every language. Cannot choose fields? Select the Module first. Workflow not in the list? It must be active, in the same module and set to run manually. Field not available for silent update? Only dropdown and checkbox fields are supported. Popup does not open after a save? Check that the workflow is active and that the saved record matches its conditions, that the task points to an active button in the same module, that the button's own conditions match the record, and that the user can edit the record. Records saved by import, API or another workflow never open a popup.

Last updated on Oct 15, 2026

Custom Widgets: your own widgets on the Summary tab

Custom Widgets let you decide what is shown on the Summary tab of a record. You can add lists of related records, for example open tasks on a project, chosen fields of the record, and a box for writing comments, emails and SMS. With Own layout you can also move the built-in widgets, such as Key Fields and Comments, choose the number of columns, and build the whole page yourself. Administrators set up the widgets per module. All users see them on the records. What you can do - Show related records: list records from one or more related modules, with your own columns (also from linked records), sorting, grouping and filter. - Take the columns from a list filter: the widget shows the filter's columns, order, labels and widths, so one filter controls both the list view and the widget. - Show only the record's own records: for example only the organization's own sales orders, not also orders whose contact works there. - Show a widget only when relevant: for example only on companies that have a membership of a certain type. - Choose the look of a list: a clean list or a table with header and lines, with or without view and edit icons, and with long rows on one line or wrapped. - Show the number of records and the rest of the list: a count in the header, a "View all" link to the related tab, or a "Load more" button. - Show records from a hierarchy: the records of parent or child records, for example the membership lines of the company group or the contacts at related companies, instead of or together with the record's own. - Limit reference choices: when a record is added from a list, let a field such as Contact offer only the contacts of the company (and its group) in a dropdown. - Show and edit fields of the record: a Fields widget with chosen fields, for example the addresses, edited directly in the widget. - Build widgets in advance: untick Active to keep a widget without showing it, and tick it when it is needed. - Arrange the whole page: with Own layout, choose 1 to 6 columns and move the built-in widgets (Key Fields, Documents, Activities, Comments and others) between the custom widgets, or leave them out. - Create records quickly: add a quick create row at the top of a list. - Mark records as done: tick a checkbox on a row. Completed records are shown struck through. - Write from the record: add a composer for comments, emails and SMS. Set up a widget 1. Go to Settings > App Management > Custom Widgets. 2. Choose the module under Select Module. 3. Click Add Widget and choose the type under Select type of widget. 4. Fill in the settings below and click Save. 5. Drag the widget to the column and position you want. Use the pencil icon to edit a widget and the trash icon to delete it. To build a widget in advance, untick Active before you save it. The widget is kept but not shown on the records, in both the classic and the new interface. In the list it is dimmed and marked Inactive. Edit it and tick Active when it should be shown. Own layout: move the built-in widgets By default, the built-in widgets of a module (for example Key Fields and Documents on the left, Activities and Comments on the right) are shown at the top of their column, and custom widgets are added below them. Tick Own layout at the top of the page to place everything yourself for the selected module. The first time, the module's built-in widgets are added to the list as Built-in widget entries, in their standard places, so the page looks the same as before. Choose the number of Columns (1 to 6) and drag the entries to change the order or column. To leave out a built-in widget, untick Active or delete it; add it again with Add Widget > Built-in widget. Untick Own layout to go back to the standard layout; your arrangement is kept. With Own layout, Hide Default Widgets is not used, and built-in widgets that are not in the list are not shown. The columns and order also apply in the new interface for Key Fields, Documents, Activities and Comments. Other built-in widgets, such as Tickets or Milestones on projects, are only shown in the classic interface. Related module Shows a list of related records. | Setting | Description | |---|---| | Label | The widget title. | | Limit of entries | Number of records shown before the user loads more. | | Related module | One or more modules to list. The module must be related to the selected module. Required. | | Columns | The fields shown for each record, in the order of the chips (drag to change it). Under From a reference field, you can also pick fields of the linked record, for example (Organization) Name 2 on contacts. These columns are read-only and cannot be used for sorting or grouping. | | Columns from filter | Optional. A list filter of the related module that is shared with everyone. The widget then shows the filter's columns, in its order, with its labels and widths (see the article on custom filters), and Columns is hidden. Changes to the filter change this widget. The rows are not filtered by this setting. | | Sort By | The field and order (ASC or DESC). When set, users can also drag rows to change the order. | | Then sort by | Optional. A second field and order, used when two records have the same value in Sort By, for example category and then first name. | | Group by | Optional. A field and order. Records with the same value are shown together under a header with the value, for example per category or per year. The groups come first, then Sort By within each group. | | Only records where | Optional. A reference field of the related module that points to this module, for example Organization = this record on Sales Orders: only the organization's own orders, not also orders whose contact works there. Default None. | | List Filter | Only show records that match a saved list filter of the related module. None shows all related records. | | Show only when | Optional. A list filter of one of the module's related modules. The widget is only shown on records that have at least one related record in that filter, for example companies with a membership of a certain type. Always shows the widget on all records. | | Add button | Adds an Add button to the widget header that opens the form for a new related record. | | Quick Create Bar | Adds a row at the top of the list for creating a record (new interface). | | Status Field, Status Values | A dropdown field and the values that count as completed. Rows get a checkbox, and completed records are shown struck through. | | Widget Style | Default (list) or Timeline. | | Table style | Clean (a simple list) or Table (grey header row, border and lines between the rows). | | Icons on each row | View and edit, View only, Edit only or None. Controls the eye and pencil icons at the start of each row. | | Long rows | One line, scroll sideways keeps each row on one line, and the user scrolls to see more columns. Wrap, show everything wraps the text so all columns fit in the box. | | Show count | Yes shows the number of records in the header, for example "Contacts (201)". Default No. | | Show "View all" link | Yes (default) shows a "View all (N)" link under the list when there are more records than the limit. | | "Load more" button | Yes shows a "Load more" link under the list when there are more records than the limit. Default No. | | Fallback via hierarchy field | Optional. A field on the module that points to the same module, for example the parent organization. Empty = no hierarchy. | | Direction, Max depth | Up follows the field (the parent), Down finds records that point to this record (the children), Both does both. Max depth is how many levels are searched (default 5). | | Use the hierarchy | Only when the record has none (default): the hierarchy is used only when the record has no records of its own. Always (own + hierarchy): the record's own records plus those of the hierarchy. Only the hierarchy: only those of the hierarchy, for example the contacts at related companies when the company's own contacts are shown in another widget. | | Restricted reference choices | Optional, per reference field of the related module: which records the field may offer when a record is added from the widget. See below. | | Active | Shows the widget. Untick it to keep the widget without showing it. | Select button and Filter are not used in the new interface yet. The new interface shows the same records and columns as the classic interface: Columns from filter, Only records where, List Filter, Sort By, Then sort by, Group by, Show only when, the hierarchy and columns from linked records all apply. Table style, icons, long rows, Show count, "View all" and "Load more" are only used in the classic interface; the new interface loads more rows when the user scrolls. Without a choice, the widget looks as before. If the filter in Columns from filter is deleted or no longer shared with everyone, the widget shows its own Columns again. With Group by, the limit counts records, not groups. A group can therefore continue after the user loads more records; it does not get a second header. To use Show only when, first create the list filter in the related module, for example a filter on membership lines with the membership type you need. Count, View all and Load more The count and "View all (N)" count the same records as the list: after Only records where, List Filter, the header filter and the hierarchy, and only records the user may see. They are updated every time the widget reloads, for example after Add or a button. "View all (N)" opens the record's tab for that related list. It is not shown with Only records where, with Always (own + hierarchy) or Only the hierarchy, or when the rows come from the hierarchy, because the tab would show other records than the widget. Use "Load more" for those widgets. "Load more" adds the next records to the list, with the same sorting, grouping, filter and hierarchy. Buttons on the rows and editing in place also work on the added rows. When the widget reloads, it starts again from the first records. Records from a hierarchy With Only when the record has none, the widget looks one level away first (parent and children), then two levels away, and so on. The first level with records is shown. With Always or Only the hierarchy, the widget collects the records of every level up to Max depth. Example for related companies: related module Organizations, hierarchy field Member Of, direction Up, depth 1, Always. This shows the company's own subsidiaries plus the other companies in the same group. The records are combined, grouped, sorted and limited like the widget's own list. At most 200 records of the hierarchy are read. With Only records where, each record of the hierarchy shows its own records. Rows from another record are greyed out and have a hierarchy icon. Hover it to see which record they belong to, and click it to open that record. The rows can still be opened, edited and used with buttons. A record that points to itself, or a loop in the hierarchy, is handled safely. Restricted reference choices Use this when a field in the form should only offer records that belong to the record you are on. Example: when a contact category is added on a company, the Contact field only offers the contacts of the company and its group. 1. Tick Add button (classic interface) or Quick Create Bar (new interface). 2. Under Restricted reference choices, find the field, for example Contact Name. 3. Choose the relation the records must have to the record you are on, for example Related via Contacts. 4. Optionally choose + the hierarchy (also the records of the parent and child records, using the widget's hierarchy field, direction and Max depth) or + the record in a reference field (also the related records of the record in that field). When the user clicks Add in the widget, the field is shown as a dropdown with the allowed records instead of the search popup. The user can type to search; at most 50 records are shown, sorted by name, and only records the user may see. If the module has no quick create form, the full form opens with the same dropdown. The same dropdown is used when a column with the field is edited directly in the widget, and in the new interface's Quick Create Bar. The restriction only applies when the form is opened from this widget. Quick create from the top bar and other places is not affected. Buttons on the rows and in the header Buttons set up with the view Summary widget (see the article on Buttons) are shown in their own column at the end of each row. They run on the record in the row, and only the widget refreshes afterwards. Buttons set up with the view Summary widget header and this widget are shown in the widget's header. They run on the record itself, like the record's own buttons (including a popup, if set up), and the widget refreshes afterwards. Fields Shows chosen fields of the record itself, for example the billing and shipping address and the alternative debtor, with the label on the left and the value on the right. Users click a value to edit it directly in the widget. | Setting | Description | |---|---| | Label | The widget title. | | Fields | The fields to show, in this order. Drag them to change the order. | | Columns from filter | Optional. A list filter of this module that is shared with everyone: the widget shows its fields, in its order, with its labels. | | Restricted reference choices | Per reference field of the module: Related via a relation of this module, plus optionally + the record in a reference field. Example for the alternative debtor's addresses: field Delivery address, related via Addresses, + the record in Alternative debtor. | | Active | Shows the widget. Untick it to keep the widget without showing it. | Restricted reference fields are edited with a dropdown of the allowed records, as described above. Other reference fields are edited with the normal search field: type to search, use the search button to pick a record, or the x to clear the field. Click the pencil icon next to a reference value to edit it, because the value itself opens the record. After a reference field is saved, the widget reloads, so the choices of fields that depend on it ("+ the record in") are up to date. In the new interface, the Fields widget is shown and edited like Key Fields, with the chosen fields in their order. A restricted reference field is saved as soon as a record is picked. Built-in widget Places one of the module's built-in widgets (Key Fields, Activities, Documents, Comments, …). Used only when Own layout is on. | Setting | Description | |---|---| | Built-in widget | Which built-in widget to show. | | Label | The name in the list. The widget itself keeps its own title. | | Active | Shows or hides the widget. | Composer Lets users write comments, emails and SMS from the record. | Setting | Description | |---|---| | Label | The widget title. | | Modules TO Include | Comments, Email and/or SMS. Each becomes a tab in the composer. | | Submit Email As | A dropdown field on the record, for example Status on tickets. When sending an email, the user can set a new value at the same time. | | Height | The height of the composer. | | Active | Shows the widget. Untick it to keep the widget without showing it. | Email recipients can be picked from the email fields of linked records, for example the contact or organization. Other widget types Comments and Dashboard Widget can be set up, but are not shown in the new interface yet. Hide standard widgets Under Hide Default Widgets, tick Comments, Activities or Documents to hide them on the selected module. This is not used when Own layout is on; untick Active on the built-in widget instead. Use the widgets Open a record and go to the Summary tab. Click a row to open the record, or use Add or the quick create row to add a new one. Use the buttons at the end of a row or in the widget's header, if any are set up. Use Load more or View all under the list to see more records. In a Fields widget, click a value to edit it, then click Save. Troubleshooting A module is missing under Related module? It must be related to the selected module, so it is shown as a related list on the record. A widget is not shown at all? Check that Active is ticked; inactive widgets are dimmed and marked Inactive in the list. A widget is not shown on some records? Check Show only when: the record must have at least one related record in that list filter. Choose Always to show it everywhere. A filter is missing under Columns from filter? Only filters of that module that are shared with everyone are listed. Share the filter, or check the module. The widget shows more records than the record's own? The related list can include more, for example orders whose contact works at the organization. Choose the field under Only records where. If no field is listed for a new widget, save it and open it again. Fewer records than expected with a List Filter? Check the filter in the related module's list view: the widget shows the records that match the filter, up to the limit. No "View all" link? It is only shown when there are more records than the limit, and not with Only records where or the hierarchy modes Always and Only the hierarchy. Use "Load more" button there. Records from the hierarchy missing? Check the hierarchy field, the direction, Max depth and Use the hierarchy. With Only when the record has none, the hierarchy is not used when the record has records of its own. A reference field still shows the search popup in the Add form? Check that a relation is chosen for the field under Restricted reference choices, that the field is in the module's quick create form, and that the form was opened with Add in this widget. The dropdown has no records? The record has no related records through the chosen relation. Check the relation, and + the hierarchy or + the record in. A value in a Fields widget cannot be edited? The field is read-only for the user. A built-in widget disappeared after turning on Own layout? It is not in the list or not active. Add it with Add Widget > Built-in widget, or untick Own layout to go back to the standard layout. A column is empty in the new interface? It only has built-in widgets that are shown in the classic interface, such as Tickets or Milestones. Move other widgets there or choose fewer columns. No quick create row? Tick Quick Create Bar, and check that the user can create records in the related module.

Last updated on Oct 09, 2026

Timeline: rows from other modules than users

By default each row in the timeline is a user, and activities are shown on the row of the user they are assigned to. An administrator can also let the timeline show records from other modules as rows, for example assets, candidates or employees. Each row is then one record, and activities are shown on the row of the record they are linked to. Set it up Only administrators can do this. The settings apply to all users. 1. Open the calendar, choose Timeline and click the gear icon > Timeline settings. 2. Under Resource types, click Add module. 3. Choose the Module. Only modules that events, to-dos or project tasks have a relation field to can be chosen. 4. Choose the field that links events and to-dos to the module, the field for project tasks, or both. If you leave a field empty, that kind of activity is not shown on these rows. 5. Optionally choose where the activities are placed in time, see below. 6. Click Save. Untick Active in the list to hide a module from the timeline without deleting its setup. A module that is active also gets a Timeline layout on its own page, see below. Under Rows in the timeline you can also: | Setting | Description | |---|---| | Users | Untick it if the timeline should only show other modules. At least one module must then be active. | | Activities with several resources | An activity can be linked to several rows, for example a meeting with two assets. Show on all related rows shows it on each of them, marked with a link icon. Show on the first row only uses the first one. | | Show by default | The rows users see until they choose something else. | Choose the start and end of activities By default an activity is placed in the timeline from its start date and start time to its due date and end time. For each module you can choose other fields, for example a "Rental from" and a "Rental to" field, so the timeline shows the period that matters for that module. | Setting | Description | |---|---| | Start field and End field on events and to-dos | One datetime field each. | | Start field and End field on project tasks | One datetime field each. | - Only datetime fields can be chosen. Add a field of the type Datetime to events, to-dos or project tasks in the module's layout (Edit fields) first. - Leave a field empty to use the standard fields (start date and time, due date and end time). - An activity is never hidden because it lacks a value in the chosen fields. If the end is missing it ends at the standard end (or an hour after the start); if the start is missing it ends where the end field says; if both are missing it is placed by the standard start and end. Such an activity is drawn with a dashed border and a tooltip says why. Dragging or stretching it saves the chosen fields, and then it is complete. - To have the fields filled in when an activity is created, tick Quick create on them in the layout. - The choice is made per module and applies to everyone, in day, week and month. The timeline per user always uses the standard fields. Use it On the module's own page: Open the module, for example Assets, and choose Timeline next to List. The rows are the module's records. You choose which with the List button and the quick bar (for example Responsible), exactly as in the list, so the lists you see are the module's own. At most 200 rows are shown. Activities linked to the records are shown on them. In the calendar's timeline: Click Rows and choose a module, then one of its lists or pick records one by one. The chips Responsible and Status limit which activities are shown. Choose Users to see the timeline per user again. In both: - Move an activity to another record: drag it to that row. The relation field is changed; "Assigned to" stays the same. - Create an activity for a record: click or drag on its row. The new activity is linked to that record. - An activity shown on several rows can only be moved in time, not to another row. - Opening an activity from a module's timeline shows it in the calendar's quick view. Only lists and records you have access to are shown. Your choices are remembered. Troubleshooting A module is missing under Module? Events, to-dos or project tasks need a relation field to it. Add one in the module's layout (Edit fields), then open the timeline settings again. No Timeline next to List on a module? The module must be added under Resource types and be active. An activity is not shown? Its relation field must point to a record in the chosen list, and a field must be set for its kind of activity (events and to-dos, or project tasks). An activity has a dashed border? The start or end field you chose has no value on it, so it is placed by the standard start and end. Fill in the field, or drag the activity once. No datetime field to choose? Only active, editable fields of the type Datetime on events, to-dos or project tasks are offered. Add one in the module's layout (Edit fields). No Rows menu in the calendar's timeline? It is shown when at least one module besides Users is active.

Last updated on Oct 19, 2026

Set up phone calls with Simply Voice

Set up phone calls with Simply Voice Simply Voice lets your users make and receive calls from Simply CRM and the Simply Voice app, and logs every call. This guide is for administrators. Today Twilio is supported; other phone providers are added over time. What you need - A Twilio account with a phone number, an API key and a TwiML App. - Simply Voice enabled for your CRM (contact Simply support if the app says your CRM is not set up for Simply Voice). - An administrator login. 1. Connect your CRM Sign in to the Simply Voice app with your CRM e-mail and password. If you are an administrator and it is the first time for this CRM, the connection is set up automatically. Nothing else to enter. Your password is not stored. Behind the scenes Simply creates a system user called voice-server in your CRM. It is the voice server's own login: - It cannot be used to sign in with a password. - It has its own access key, which can only read the voice setup (your lines, users and phone hours, and the phone provider's keys). It cannot read or change anything else in your CRM, such as records or other settings. - It does not show in user lists or pickers. - It is not counted as a paid user. 2. Add your phone provider (Voice setups) Go to Settings > Integration > Voice setups and add a setup: - Vendor: Twilio. - Name: for example "Twilio, main account". - Account SID, Auth token, API key SID, API key secret, TwiML App SID. - Region is optional, for example ie1 for Ireland. Secret values are write-only. After saving you only see whether they are set. Leave a secret empty when editing to keep it. 3. Add your numbers (Voice lines) Go to Settings > Integration > Voice lines and add a line for each number: - Setup: the setup the number belongs to. - Number: international format, for example +4512345678. Each number can only be on one line. - Assigned to all users, or pick the Users on the line. Several users on one line all ring on incoming calls. - Record calls and an optional Recording notice that the other party hears before the call is connected. Recording calls is regulated. Tell callers that calls are recorded (use the recording notice) and check your own rules for how long you keep recordings. 4. Decide when phones may ring (Voice company policy) Go to Settings > Integration > Voice company policy: - Turn on Limit when the phone may ring, then choose the days, the from and to time (24 hour clock, for example 08:00 to 17:00) and the time zone. - Forward to this number outside these hours is optional. Without a number, nobody is rung outside the hours. This is independent of the working hours stored on employees. 5. Personal hours Every user follows the company policy by default. Under My preferences > Phone availability a user can choose Phone policy: - Company policy: follow the company policy (default). - Always available: no limits. - My own hours: own days, from, to and forward-to number. Anything left empty follows the company policy. The user's own time zone is used. Administrators can change these fields for any user. Troubleshooting - Calls do not ring: check that the number is on a line, the user is on the line, and the time is inside the hours of the company policy or the user's own hours. - The app says the CRM is not set up for Simply Voice: contact Simply support. - Changes seem slow: the voice server refreshes each CRM every few minutes.

Last updated on Oct 19, 2026

AI Agents: let AI work on your tickets

AI Agents let an AI model work on your records, for example tickets. The agent reads the record, its emails and comments, can use tools you give it, and writes an internal note and a reply draft. A person always decides what is sent. Set up an agent Open AI Agents (Tools menu; an administrator activates the module in Module Manager) and create an agent: - Name and Chat name: the chat name is what the agent is called in comments, for example "Claude support". - Instructions: what the agent should do and how it should write. Tip: ask for informal, short replies and for "only state what you have checked". You can also tell it how to sort requests (e.g. bug, wish, question) and what to do with each kind. - Description: what the agent does and how other agents hand work to it (see "Hand work to another agent"). - Provider and model: Anthropic, OpenAI or any OpenAI-compatible service. Empty uses the CRM's default AI settings. You use your own API key. - Tools (optional): a JSON list of MCP servers the agent may use, for example [{"mcp": "gitlab", "tools": ["search"]}, {"mcp": "simply"}]. tools is an optional allowlist. The address and key of each server are stored as global variables global_mcp_<n>_url and global_mcp_<n>_token, never on the agent. - Active: only active agents run. On the record (e.g. a ticket) choose the agent in the AI agent field. Run the agent - Write a comment that starts with @ai followed by what you want, for example "@ai check the error log". Or set AI status to Start. - A workflow can also start it with the action AI workflow action > Run AI agent. To run it on every new customer email, see Set up automatic support with AI. - The agent runs in the background and usually answers within a minute or two. - Steer it by writing new comments: it always follows your latest instructions. AI status | Status | Meaning | |---|---| | Start | The agent will run. | | Running | The agent is working. | | Waiting for user | The agent needs an answer from you, or has handed the next step to someone else (see its note). | | Waiting for approval | A tool needs a person's approval first, e.g. temporary access to a system. The agent starts again by itself after the decision. | | Done | The agent has finished. | | Error | Something went wrong; the reason is in the agent's comment. | What the agent writes - Internal note: short, at most a few lines. The first line always says who acts next (see below). Shown in the comments with the agent's chat name, a robot icon and an "AI" label. Comments addressed to the agent show "to AI". - Reply draft: in the Email tab you see "Agent has a reply draft ready". Click Show to read it, or Insert in email to put it in the email, edit and send as usual. When you send it, the draft is marked as used: a comment notes whether it was sent unchanged, edited or translated, and the draft disappears. Who acts next The note starts with Next: <who> - <what to do>. Who is one of: - a CRM group, e.g. DevOps or Support. The agent sees your groups that have active users, and the group's description tells it what the group handles. Tip: describe your groups under Settings > Groups. - another AI agent (see below) - a named colleague - Customer: only the customer or their supplier can act - None: the reply is ready to send When someone other than Customer or None is named, the status becomes Waiting for user. Hand work to another agent Other active agents that have a Description are part of the agent's team. Write in the description what the agent does and how to hand work to it, for example "Fixes code bugs. Hand over by creating a GitLab issue with the steps to reproduce." The agent first does what its own tools can do, then hands the work over the way the description says and names that agent as Next. Built-in CRM tools Agents can look up the customer's other tickets, emails and comments in the CRM themselves, read-only, to see if a request belongs to an ongoing matter: - customer_overview: the record's organization and contact, and their latest tickets and emails - search_records: search records in the allowed modules - get_record: read one record, an email's text or a record's comments They only return records the agent's assigned user may see. They are on by default for agents working on tickets. In Tools you can choose them with {"crm": ["customer_overview", "search_records", "get_record"]}, add "modules": [...] to change which modules can be read, or turn them off with {"crm": false}. Translate comments Every comment has Translate at the right end of its header line. It translates into your language on demand only, and Show original switches back. Tools and screenshots With tools, the agent can look things up itself (code, records, logs). Tools that return pictures, such as screenshots, are shown to the agent as images, so it can see what a page looks like.

Last updated on Nov 04, 2026

Set up automatic support with AI

With an AI agent on your tickets, every new customer email is read by AI before anyone on your team opens it. The agent finds the customer's context, works out what is needed, writes an internal note that says who acts next, and prepares a reply draft. A person always checks and sends the reply. This guide sets it up step by step. The agent itself is described in AI Agents: let AI work on your tickets. 1. Create the support agent Open AI Agents (Tools menu) and create an agent, for example "Support". Choose provider and model (or leave empty for your default AI settings) and set it to Active. Keep Autonomy at Drafts only. 2. Write its instructions The instructions are where the agent learns your business. Write them as you would brief a new colleague: - What you sell and who your customers are. - How to reply: language, tone, length, signature. Tip: "Only state what you have checked." - How to sort requests and what to do with each kind. Use your own categories, for example: - Software company: Bug (something that should work does not: find the cause), Improvement (a new wish: note it for a decision, promise nothing), Question (answer it). - Kitchen company: Complaint (book a service visit), New order (prepare a quote), Question. - Association: Membership, Event, Board matter. Ask the agent to write the category on the second line of its note, e.g. "Type: Complaint". 3. Describe your team The agent's note starts with Next: <who> - <what to do>, so it needs to know who does what: - Groups: under Settings > Groups, give each group with active users a short description of what it handles, e.g. "Installers: assembly and service visits". - Other AI agents (optional): an active agent with a Description can receive work from the support agent. Write in the description what it does and how to hand work to it. 4. Choose which customers get AI Use the field Incoming Message Automation on the organization (contacts get the organization's value when theirs is empty): | Value | Meaning | |---|---| | Automatic | The agent runs on every new email from this customer. | | Manual review | The agent also runs; use it for customers you want to watch more closely. | | Block | Never automatically, e.g. spam or customers you do not want AI on. | | Empty | Not automatically. | Tip: set Automatic for customers you have already had a real dialog with; they are hardly spam. 5. Start the agent on new email Create a workflow on Tickets, "Every time the record is saved": - Conditions (all): Last Email At has changed, Waiting for answer from is Support, AI status is not Running. - Conditions (any): the organization's Incoming Message Automation is Automatic or Manual review, or the contact's is. - Action: Update fields: AI agent = your support agent and AI status = Start. Or use AI workflow action > Run AI agent. You can always start the agent by hand with a comment that starts with @ai, also on customers set to Block. 6. Daily use 1. Open the ticket and read the agent's note. The first line says who acts next. 2. Click Insert in email on the reply draft, adjust it and send it. 3. To steer the agent, write a comment starting with @ai, e.g. "@ai the customer is on the old plan, check that first". Good to know - The agent never sends anything to the customer itself. - It only sees records its assigned user may see. - Access to other systems (e.g. a customer's own system) needs a person's approval first. - Each run uses your own AI provider's key and is billed by them.

Last updated on Nov 04, 2026

SLA policies for tickets

With SLA Policies you decide how fast tickets must be answered, how fast work must start, how often the customer must be updated and when the ticket must be solved. Simply CRM tracks it on every ticket and marks the ticket when a deadline is at risk or missed. If you don't see SLA Policies under Support, ask your administrator to activate the module. Who can change policies Administrators create and edit SLA policies. Other users can open and read the policies, but not change them. Create a policy 1. Go to Support → SLA Policies and click Add. 2. Policy: give it a name, set Active, and set Order. Tickets get the first active policy (lowest order) whose conditions they meet. 3. Applies when: add conditions, for example Priority equals Urgent, or Organization equals ACME. You can use any ticket field, so the policy works with your own priorities and values. 4. Targets (minutes): - First response within – time to the first reply. - Start of work within – optional; time until work on the ticket has started. - Work started when – the condition that marks work as started, e.g. Status equals In Progress. - Update customer every – optional; how often the customer must hear from you after that. - Resolve within – optional; time to solve the ticket. - "At risk" before deadline – how many minutes before a deadline the ticket is marked At risk. 5. Calendar: choose if the clock runs 24/7 or only in business hours. For business hours, set work days, start and end time, and holidays (one per line: DD-MM every year, or DD-MM-YYYY once). Times use the time zone of the user responsible for the policy. 6. Clock: - Pause the clock when – e.g. Status equals Wait For Response. The paused time does not count. - Fulfilled when – e.g. Status equals Closed. The SLA then stops. Make one policy per level, e.g. one for Urgent (1 hour) and one for Normal (8 hours). Choose the SLA on the organization Organizations have a SLA level field (Standard, Silver, Gold). Set the level on each customer and use it in the policy conditions, e.g. Organization → SLA level equals Gold and Priority equals P1. Then all tickets from Gold customers get the Gold targets, and you change a customer's SLA by changing one field on the organization. A policy for a single customer can still use Organization equals ACME with a lower order number, so it wins over the general ones. What you see on the ticket The SLA block on the ticket shows: - SLA policy – picked automatically. You can also pick one by hand; it is then kept. - SLA status – Running, At risk, Violated, Paused or Fulfilled. - SLA violated – stays checked once a deadline was missed. - First response due / at, Start of work due, Work started at, Next deadline, Resolution due. - Time remaining and Time elapsed in minutes (business time). Use them in list filters, e.g. tickets with less than 30 minutes left. The values are updated every 5 minutes. Only tickets created after the policy are tracked. A closed ticket keeps its final SLA result. What counts as a reply A reply is an email linked to the ticket that was sent from Simply CRM or from one of your users' addresses, or a public comment written by a user. Emails and portal comments from the customer are customer messages. Act when a deadline is at risk or missed Create a workflow on Tickets with the condition SLA status has changed to e.g. At risk or Violated. The workflow can send an email or SMS, assign the ticket to someone else, update fields or post in Slack or Mattermost (see below). Good to know: each time SLA status or SLA violated changes, Simply CRM saves the ticket once. This also runs your Ticket workflows set to run every time the record is saved, and the ticket's last modified by becomes the system administrator. Check those workflows, e.g. that they don't email the customer on every save. Notify a Slack or Mattermost channel 1. Create a bot. Mattermost: Integrations → Bot Accounts → Add Bot Account, and copy the access token. Slack: create an app with the scope chat:write, install it, and copy the Bot User OAuth Token (xoxb-…). 2. Invite the bot to the channel, e.g. /invite @yourbot in the channel. The bot can only post in channels it is a member of. 3. Set the global variables in Simply CRM: - global_chat_bot_token – the bot token. - global_chat_server_url – Mattermost only, your server address, e.g. https://chat.example.com. 4. In the workflow, add the action Webhook, choose the integration Slack / Mattermost and the action Send message (Mattermost bot) or Send message (Slack bot). 5. Pick the channel in the dropdown (in the new workflow editor) and write the message. Use {{fieldname}} for ticket values, e.g. {{ticket_title}}. If the channel list is empty, check the token, the server address and that the bot is in the channel. As an alternative without a bot, use Send message to a channel with the channel's incoming webhook URL.

Last updated on Nov 05, 2026

AI Copilot: ask AI about your records

AI Copilot is a chat assistant in Simply CRM. Click the round robot button at the bottom right to open it. Turn it on An administrator turns it on under Settings > Configuration Editor > AI Copilot > Simply Copilot. Copilot uses the CRM's own AI setup (your own API key for Anthropic, OpenAI or an OpenAI-compatible service). What it can do - Knows the record you have open. On a ticket, deal, contact etc. it gets the record's fields, latest comments, linked emails and an overview of the customer's other tickets and emails. "This", "it" and "the ticket" mean that record. - Looks up more data itself in every module you have access to, custom modules included: - searches records, also by any field, "assigned to me" and a date range, for example "my tasks and meetings this week" - counts and totals, for example "open tickets per owner" or "pipeline per sales stage with total amount" - a record's related lists, as shown in the CRM, for example the contacts or documents of a deal - an email's text and a record's comments - a module's fields and dropdown values, as your role sees them, for example "which values can the sales stage have?" - your saved lists (filters): it can list them and run one, for example "run my list Open Tickets: how many are there and which are the newest?" It runs the list exactly like the list view, with the list's conditions. - Can change data, if an administrator allows it: create and update records, add comments and delete records, each shown with a Confirm button first. See AI Copilot: let it change data. By default it only reads. - Only sees and changes what you may. It runs as you, with your permissions and the same sharing rules as the list view. It never sends emails. - Suggested questions match the record you have open, for example "Summarize this ticket" or "Suggest a reply to the customer". - Answers in your language. Click New chat to start over. The conversation is kept while the chat is open. Cost Each question uses AI tokens on your own API key. To keep the cost down, Copilot: - sends a compact version of the record (no bookkeeping fields such as created/modified time, no empty numbers, at most 5 comments and 5 emails) - answers from that context first and only looks up more when needed - counts in the database instead of reading every record, so "how many" questions stay cheap - keeps a module's fields and dropdown values in a cache for 15 minutes - sends the fixed parts first, so the AI provider can reuse them from its prompt cache. Follow-up questions on the same record are much cheaper (about 90% fewer uncached input tokens in our tests).

Last updated on Nov 06, 2026

AI Copilot: let it change data

An administrator decides whether AI Copilot may change data, and whether it asks first. Where Settings > Configuration Editor, section AI Copilot (below the switch that turns Copilot on). What Copilot may do - Only read (default): Copilot reads and answers, but never changes data. - Read and edit: Copilot may also create and update records and add comments. - Read, edit and delete: Copilot may also delete records (they go to the recycle bin). Ask for confirmation before changes On by default. Copilot then shows each change as a card in the chat, for example "Update Mobil Testlead deal – Sales stage: Contacted → Meeting agreed", with Confirm and Cancel. Nothing changes until the user clicks Confirm. Deleting always asks for confirmation, whatever this setting says. Safety - Copilot always works as the logged-in user, with their permissions. It can only change what the user could change themselves. - Changes are made like a normal save: workflows run, and the change is kept in the record's history under the user's name. - Copilot never sends emails. It can write a draft for the user to send. - Only Copilot in the app can change data. AI agents in workflows cannot. Tips - Say clearly what to change, for example "Set the sales stage on this deal to Meeting agreed" or "Create a task for me tomorrow at 10:00 linked to this ticket". - If a required field is missing, Copilot asks for it. - The open record is not reloaded after a change; refresh the page to see it.

Last updated on Nov 06, 2026

Message channels: connect SMS, WhatsApp or any other messaging service

All messages (SMS, WhatsApp, chat or any custom service) live in one module, Messages. Each message has a channel. You add channels yourself and connect each one with two workflows: one that sends and one that fetches new messages. No code is needed. 1. Add a channel 1. Open the Messages module and go to the picklist editor for the field Message channel. 2. Add a new value, e.g. Partner Portal. 3. Pick a color and an icon for the value. The channel now appears as its own tab in the message composer on records (e.g. Projects, Tickets, Deals, Contacts, Organizations). The tab, its underline and the message bubbles use the channel's color and icon. Internal comments stay separate and are never sent. 2. Send workflow (outgoing messages) When a user sends a message from the composer, a Messages record is created with direction Outbound. A workflow sends it to the external service. - Module: Messages - Trigger: when the record is first created - Conditions: Message channel = Partner Portal, Direction = Outbound, Message ID is empty - Task 1 – Webhook: POST to the service's API, e.g. https://api.example.com/messages, with a JSON body such as: { "conversation": "$conversation_id", "text": "$message_body", "author": "$sender_name" } Response mapping: the id the service returns (e.g. id) → Message ID. - Task 2 – Update fields: set Message status with this expression: if message_id == '' then 'Failed' else 'Sent' end Put API keys in global variables instead of directly in the workflow. 3. Poll workflow (incoming messages) A scheduled workflow fetches new messages, e.g. every 5 minutes, and creates them as Messages related to the record. - Module: the record the messages belong to, e.g. Projects - Trigger: scheduled, e.g. every 5 minutes - Task 1 – Webhook: GET e.g. https://api.example.com/messages?conversation=$cf_external_id. Response mapping: the list of messages (e.g. messages) → a text field on the record. The whole list is stored as JSON text. - Task 2 – Create record (multiple records from JSON): - Target module: Messages, JSON field: the text field from task 1 - Link field: Related to (client_id), so each message is related to the record - Unique fields: message_id,message_channel - Mappings, e.g. message_id = id, message_body = text, sender_name = author, Message channel = Partner Portal, Direction = Inbound Unique fields make sure a message is only created once, even if the same list is fetched again, and that your own outgoing messages coming back from the service are not imported twice. Field names in mappings: you can write just the field name (e.g. message_id). The module name is not needed. Good to know - Emails stay in the Emails module. - Check Workflow health and the webhook log on the workflow if a message is not sent or fetched.

Last updated on Nov 06, 2026