Home Advanced functionality

Advanced functionality

Christian
By Christian
4 articles

Workflow Expressions in Simply CRM

Workflow Expressions in Simply CRM Workflow expressions allow you to build powerful, flexible automations inside Simply CRM. They make it possible to calculate values, manipulate text, work with dates, query other modules, and process structured data — all without writing custom code. Expressions are evaluated when a workflow runs and can be used to: - Update field values - Control workflow conditions - Build dynamic email content - Prepare data for integrations and webhooks Below is the complete reference of all workflow expressions available in Simply CRM, including how they work and practical examples for each. Core operators and conditional logic Arithmetic operators Supported operators: +, -, *, / Examples - amount + 25 - (quantity * listprice) - discount_amount Comparison operators Supported operators: ==, <, >, <=, >= Examples - amount > 1000 - closingdate < get_date('today') if(condition, value_if_true, value_if_false) Evaluates a condition and returns one of two values depending on whether the condition is true or false. Examples - if(amount > 1000, 'High value', 'Normal') - if(str_contains(interests, 'Support'), 'Send support pack', 'Skip') Text & string functions substring(string, start, end) Returns part of a string starting at a given position. If end is omitted, the substring continues to the end of the string. Examples - substring(subject, 0, 10) - substring(email, 0, 3) - substring(accountname, 5) preg_replace_str_only(pattern, replacement, subject) Performs a regular-expression-based replace on a string. If the replacement is [], it is treated as an empty string. Examples - preg_replace_str_only('/\s+/', '', phone) - preg_replace_str_only('/\D+/', '', cf_vat_number) - preg_replace_str_only('/^INV-/', '', invoice_no) split(string, seperator, index) Splits a string by a separator and returns the value at the specified index (0-based). Examples - split(email, '@', 0) - split(email, '@', 1) - split(cf_tags, ',', 2) concat(value1, value2, ...) Joins multiple values together into a single text string. Examples - concat(firstname, ' ', lastname) - concat('Deal: ', potentialname, ' (', amount, ')') - concat('https://example.com/ticket/', ticket_no) changeCase(sourcefield, operation) Changes the case of a string. Supported operations include: upper, lower, ucfirst, ucwords. Multibyte variants are also supported. Examples - changeCase(lastname, 'upper') - changeCase(firstname, 'ucfirst') - changeCase(fullname, 'ucwords') UrlDecode(sourcefield) Decodes URL-encoded text (for example %20 → space). Examples - UrlDecode(cf_url_params) - UrlDecode('Hello%20World%21') - Decode webhook payload fragments stored in a field Date & time functions get_date('today' | 'tomorrow' | 'yesterday') Returns a date value relative to the current day. Examples - get_date('today') - add_days(get_date('tomorrow'), 7) - if(closingdate < get_date('yesterday'), 'Overdue', 'OK') add_days(datefield, number_of_days) Adds days to a date or datetime value. Examples - add_days(createdtime, 7) - add_days(duedate, 1) - add_days(get_date('today'), 14) sub_days(datefield, number_of_days) Subtracts days from a date or datetime value. Examples - sub_days(duedate, 3) - sub_days(closingdate, 30) - sub_days(get_date('today'), 1) add_months(datefield, number_of_months) Adds months to a date or datetime value. Examples - add_months(createdtime, 1) - add_months(closingdate, 3) - add_months(get_date('today'), 12) sub_months(datefield, number_of_months) Subtracts months from a date or datetime value. Examples - sub_months(closingdate, 1) - sub_months(get_date('today'), 6) - sub_months(contract_end_date, 2) add_time(timefield, minutes) Adds minutes to a time or datetime value. Examples - add_time(meeting_start, 30) - add_time(createdtime, 15) - add_time(get_date('today'), 60) sub_time(timefield, minutes) Subtracts minutes from a time or datetime value. Examples - sub_time(meeting_start, 10) - sub_time(deadline, 60) - sub_time(modifiedtime, 5) time_diff(date1, date2) Returns the time difference between two date/time values. If only one parameter is provided, the difference is calculated against the current time. Examples - time_diff(modifiedtime, createdtime) - time_diff(closingdate) - if(time_diff(closingdate) < 0, 'Overdue', 'On time') time_diffdays(date1, date2) Returns the difference between two dates in days. If only one parameter is provided, it compares against the current date. Examples - time_diffdays(closingdate, createdtime) - time_diffdays(duedate) - if(time_diffdays(duedate) > 30, 'Long lead', 'Normal') getDateValue(datefield, format) Formats a date or datetime value using a PHP-style date format. Examples - getDateValue(createdtime, 'Y-m-d') - getDateValue(duedate, 'd/m/Y') - concat('Due: ', getDateValue(duedate, 'd/m/Y')) Numeric functions power(base, exponent) Raises a number to a given power. Examples - power(2, 3) - power(probability, 2) - power(amount, 0.5) GetTime(decimal_hours) Converts a decimal hour value into HH:MM format. Examples - GetTime(1.5) - GetTime(cf_estimated_hours) - concat('Duration: ', GetTime(cf_duration_decimal)) Multi-select & list handling str_contains(value1, value2) Checks whether two pipe-separated (|##|) lists share at least one common value. Designed for multi-select picklist fields. Examples - str_contains(interests, 'Support') - str_contains(interests, 'Support|##|Renewals') - if(str_contains(cf_regions, 'EMEA'), 'EU team', 'Other') Cross-module & advanced functions GetFieldValue(field_reference) Returns the value of a field from the current record or from a referenced record. Examples - GetFieldValue(email) - GetFieldValue((contact_id : (Contacts) firstname)) - GetFieldValue((account_id : (Accounts) accountname)) searchModule(module, field, operator, value, returnFields) Searches another module and returns matching records as JSON. Supported operators: equal, contains, notequal. Examples - searchModule('Contacts','lastname','contains','Smith','[id,email]') - searchModule('Accounts','accountname','equal','[Acme,Globex]','[id,accountname]') - searchModule('Users','email1','contains','@example.com','[id,user_name]') json_get(fieldname, path) Extracts a value from a JSON object using dot notation. Examples - json_get(cf_payload, 'customer.name') - json_get(cf_payload, 'items[0].sku') - json_get(cf_payload, 'meta.version\\.raw') json_set(fieldname, path, value) Sets or updates a value inside a JSON object using dot notation. Examples - json_set(cf_payload, 'customer.name', 'Alice') - json_set(cf_payload, 'items[0].qty', 3) - json_set(cf_payload, 'meta.lastUpdated', get_date('today')) jsonArrayMerge(value1, value2) Merges two JSON objects or arrays into one. Examples - jsonArrayMerge('{"a":1}', '{"b":2}') - jsonArrayMerge(cf_jsondata, '{"status":"new"}') - Merge two integration payloads into a single object json_get_line_items(recordId) Returns inventory line items (Products & Services) as JSON. If no record ID is provided, the current record is used. Examples - json_get_line_items(id) - retrieves the line items of the current record (just referenced as id) - Store line items in a custom JSON field - Extract totals or quantities from returned line item data RecurrenceRuleAsDates(rule, format, endDate, startDate) Expands a recurrence rule into a list of dates within a given range. Examples - RecurrenceRuleAsDates(recurrence_rule, 'd/m/Y', '31/12/2026', '01/01/2026') - Generate scheduled dates from repeating events - Use recurrence output to drive task or event creation

Last updated on Feb 04, 2026

Advanced JSON Fields in Simply CRM (SurveyJS-based)

Simply CRM supports advanced dynamic fields that allow administrators to build complex forms, calculators, and structured data inputs directly inside a record. These fields use a SurveyJS-style JSON definition, which means admins can configure rich interfaces such as: - Dynamic tables (matrixes) - Calculated fields - Conditional logic - Multi-tab layouts - Structured data collections - Configurable calculators Instead of creating dozens of traditional CRM fields, you can define an entire structured form inside a single JSON field. How It Works An Advanced JSON Field consists of two parts. 1. JSON Definition (admin configuration) This defines what the user sees in the CRM interface. It includes: - Field types - Layout - Calculations - Conditional logic - Structured data collections The definition is stored in the JSON Definition property of the field. 2. JSON Data (record value) When a user fills out the form: - The resulting values are stored as JSON on the record - The JSON structure mirrors the definition - The stored data can later be used in: - automation - reporting - integrations - workflows Example stored data: { "totalMargin": 4200, "totalCost": 11800, "orderLines": [ { "description": "Installation service", "quantity": 2, "unitPrice": 3000, "lineTotal": 6000 } ] } Why Use JSON Fields? Advanced JSON fields are useful when you need: - Complex calculations - Repeating rows - Structured objects - Configurable forms - Dynamic calculators - Multi-row pricing structures Typical use cases include: Use CaseExamplePricing calculatorsMargin / profit calculationsQuote buildersVendor pricing tablesProject estimationsTime + material breakdownStructured configurationsInstallation specificationsCost modelsBudget calculations Layout Structure SurveyJS normally uses pages, but in Simply CRM these are mapped to tabs. This is configured in the meta section at the beginning of the JSON definition. Example: { "meta": { "pageNav": "tabs", "tabsStyle": "top", "tabLabels": "title" } } Mapping: SurveyJS ConceptSimply CRMPageTabPanelSectionQuestionField Example JSON Structure A simple configuration might look like this: { "meta": { "pageNav": "tabs" }, "pages": [ { "name": "pricing", "title": "Pricing Calculator", "elements": [ { "type": "matrixdynamic", "name": "pricingLines", "title": "Items", "columns": [ { "name": "vendor", "title": "Vendor" }, { "name": "price", "title": "Price" }, { "name": "discount", "title": "Discount %" } ] } ] } ] } This creates: - A tab called Pricing Calculator - A dynamic table - Columns for vendor, price, and discount - Rows that users can add or remove Dynamic Matrix Tables One of the most powerful features is the dynamic matrix (matrixdynamic). It allows users to: - Add rows - Edit values - Perform row calculations - Aggregate totals Example table in the CRM: VendorPriceDiscountMarginNordic Supplies100010%auto calculatedGlobal Hardware8005%auto calculated Matrix rows can include: - dropdown fields - numeric fields - calculated values - conditional visibility - read-only columns Calculations and Expressions SurveyJS supports expressions directly in the JSON definition. Example expression: sumInArray({pricingLines}, 'price') This allows you to calculate: - totals - margins - discounts - averages - derived values Fields can also be configured as read-only calculated outputs. Conditional Logic Fields and sections can appear or disappear based on logic. Example: "visibleIf": "{rowIndex} = 5" Logic can be used for: - conditional fields - optional sections - workflow-driven forms - step-based calculations Default Values Fields can automatically populate using expressions. Example configuration: "defaultValueExpression": "sumInArray({pricingLines}, 'discountAmount')" Data Storage All values entered by the user are stored as JSON in the record. Advantages: - flexible structure - easy API integration - no need to create many CRM fields - easy to export/import Example stored record: { "pricingLines": [ { "vendor": "Nordic Supplies", "price": 1000, "discount": 10 } ], "totalPrice": 900 } Admin Configuration Advanced JSON forms are configured using a JSON type field. Administrators simply define the form structure inside the JSON Definition field. To configure this: 1. Edit or create a field in the module (see: https://help.simply-crm.com/hc/simply-crm-support/articles/how_to_add_or_edit_fields_in_a_module) 2. Select Field Type: JSON 3. Paste the SurveyJS-style JSON definition into the JSON Definition field 4. Save the field Once saved, Simply CRM will automatically: - render the form in the CRM interface - apply calculations and logic - store the resulting values as JSON on the record Administrators only maintain the JSON definition — the CRM handles rendering and saving the data automatically. Best Practices Keep calculations inside the JSON Avoid external scripts where possible. Use matrix tables for repeating data Examples: - products - suppliers - order lines - project tasks Use expressions for totals Example: sumInArray() Keep field names consistent Example naming style: unitPrice lineTotal discountPct marginValue When to Use JSON Fields vs Normal Fields Use normal CRM fields when you need: - simple values - easy filtering - standard reporting Use JSON fields when you need: - complex structures - dynamic forms - repeating tables - advanced calculations - configurable workflows Advanced JSON fields make it possible to build powerful, flexible interfaces directly inside Simply CRM without custom development.

Last updated on Mar 07, 2026

Simply CRM Customer Portal Admin Guide

This guide explains how to administer the Simply CRM Customer Portal from the web interface: how the portal connects to your CRM, how you control what customers see, and how you configure modules, views, and payments. Portal URL The portal runs on its own URL, based on your CRM address. Format: portal-yourcrm.simply-crm.com Example: - CRM URL: mycrm.simply-crm.com - Portal URL: portal-mycrm.simply-crm.com General Settings In the General Settings main tab you can configure: Default Module Choose the main module shown to customers after they log in. Date Format Controls how dates are displayed across the portal. Time Format Controls how times are displayed across the portal. Default Language The language preselected in the login language selector. Decimals Precision How many digits are shown after the decimal separator. Decimals Separator Symbol used between integer and decimal part. Thousands Separator Symbol used to separate thousands in numbers. Limit Available Languages Restrict which languages customers can choose on login. Leave empty to allow all languages installed in your CRM. Module Sorting Reorder modules in the portal sidebar. Modules not listed will appear after the ones you specify. API Credentials In the API Credentials main tab you can configure: Platform Url The URL of your CRM instance (used to provide data to the portal). API Username The CRM user used for all operations coming from the portal. API Key / Password The API key of the CRM user used for portal operations. Note: Whenever you change the CRM URL, API user, or API key, the portal will validate the new configuration. The new settings are only saved if the connection succeeds. :contentReference[oaicite:0]{index=0} Portal Admin User In the Portal Admin User main tab you can configure: Admin Username The username used to access the portal configuration area. Admin Password The password used to access the portal configuration area. Admin Email Email used for internal portal communications (if needed) and for admin password reset. Theme Configuration In the Portal Theme Configuration tab you can customize the portal look and feel: Basic Color The primary color used across the portal (links, header navbar, primary buttons, dashboard widgets, etc.). Portal Logo Logo shown across the portal and on the login screen. Portal Brand Text shown at the bottom of the login box and in the portal footer (copyright, slogan, link, etc.). Portal Title Text shown in the browser tab title (for example: “MyBusiness Support Portal”). Colored Sidebar If enabled, the left sidebar uses the Basic Color (instead of white background). Default Currency Defines the default currency used across the portal when a record-specific currency is not set. Currency Name The full name (e.g., Euro, Dollars). Currency Symbol Symbol used to identify the currency (e.g., €, $, £). Currency Code ISO-4217 currency code. Incorrect values can cause issues with payment options. :contentReference[oaicite:1]{index=1} PayPal Integration Configure payment processing through PayPal: Is Enabled Enable/disable PayPal payments. Sandbox Mode Enable for testing with PayPal sandbox credentials. Disable for real payments. API User / API Key / API Signature Credentials from your PayPal account settings. Note: When you update PayPal credentials, the portal validates the connection and only saves the settings if the check succeeds. :contentReference[oaicite:2]{index=2} Editable Information In the Customer Profile tab you decide whether customers can update their own information, and which fields are editable. There are two main sections: Contact information Edit Enabled Allow customers to edit their Contact-related information. Editable Fields Choose which Contact fields are editable. These fields appear in the Contact section of the My Preferences tab. Organization information Edit Enabled (Organization) Allow customers to edit their Organization-related information. Editable Fields (Organization) Choose which Organization fields are editable. These fields appear in the Organization section of the My Preferences tab. Note: When customers update data in the portal, it is automatically updated in your CRM Contact and Organization modules. :contentReference[oaicite:3]{index=3} Customer Roles / Profiles You can create different customer profiles (roles) and automatically assign them based on condition rules. - Profiles are matched based on the logged customer/contact and organization fields. - Priority is from the last created profile to the first. - If no profile matches, the customer is assigned a default profile that can see all configuration. After creating profiles, you can restrict module configurations to specific profiles using the module setting “Allowed Customer Profiles”. :contentReference[oaicite:4]{index=4} Module Concept The portal uses a dynamic module architecture and can interact with almost any CRM module. A module configuration is a set of rules for a single CRM module where you control: - Which actions are allowed (comments, PDF export, attachments, create, edit, etc.) - Which records are visible (via conditions) - Which fields and views are available You can create multiple configurations for the same CRM module. Example: - “Open Tickets” (comments and attachments enabled) - “Closed Tickets” (comments and attachments disabled) :contentReference[oaicite:5]{index=5} Create a Module Configuration To create a new module configuration: 1. Log in to the portal configuration area 2. Click the “Add Module” button in the left sidebar 3. Set the following: Source Module Which CRM module you want to configure. Module Route (URL) The URL route customers will use to access this module in the portal. It must be unique. Module Label The label customers will see in the portal sidebar and in actions related to this configuration. :contentReference[oaicite:6]{index=6} Module General Settings For each module configuration, you can configure: Module Label Label shown to customers. Is Enabled Enable/disable this module configuration. Icon Icon used for the module. PDF Download Enabled Allow customers to generate and download PDFs for records. - If PDFMaker PRO is installed and configured, PDFs are generated via PDFMaker. - Otherwise, standard CRM templates are used. Comments Enabled If the module supports comments, customers can read and write comments. Upload Attachments Enabled If enabled (and if the Documents module is configured with write permissions), customers can upload documents related to the records they can see. :contentReference[oaicite:7]{index=7} Visibility Conditions Visibility conditions define which records customers can see. This works like CRM filter conditions. Condition Operator options: - Show All Retrievable Records Shows all retrievable records for this module (no conditions). - Don’t Retrieve Records Retrieves no records directly (useful when using visibility inheritance). - Match All Conditions Customers see only records matching all conditions. - Match At Least One Condition Customers see records matching at least one condition. Condition Rows Add as many rows as needed. Each row contains: - Target Field (any field in the module, including picklists and relations) - Comparator (changes based on the field type) - Target Value (input changes based on field type) Special target values exist for relationship fields, including: - Logged Customer - Logged Customer Organization :contentReference[oaicite:8]{index=8} Visibility Inheritance Visibility inheritance lets you show records even when the module does not have a direct Contact or Organization relationship field. Example: Products often do not link directly to contacts, but they can be related through invoices, quotes, sales orders, or many-to-many relations. Visibility inheritance is a multi-select field where you can inherit visibility from other configured modules that have the needed relationships. :contentReference[oaicite:9]{index=9} Dashboard Settings Control whether a module appears on the portal dashboard and how it is displayed. Show on Dashboard Toggle to show/hide the module widget on the main dashboard. Widget Type Choose one: - Totals Count (total number of records, optionally grouped) - Bar Chart (record counts grouped by a selected field) - Doughnut Chart (record counts grouped by a selected field) Group Field Field used to group the record counts in the widget (for example, Quote Status). :contentReference[oaicite:10]{index=10} Module Views Configure how records are displayed for each module. Available views: List View Mandatory. Shows records as a paginated list. You choose which fields appear and how many records per page. Grid View Optional. Similar to List View but displayed as a grid/cards. Kanban View Optional. Shows records in a Kanban board grouped by a selected field, with configurable panels. Calendar View Optional. Shows records in a calendar. Requires: - Start Date Field Optionally: - End Date Field (for date ranges) - Start/End time fields Gantt View Optional. Common for tasks/projects. Requires at least: - Start Date Field Optionally: - End Date Field and Progress (depending on your module setup) :contentReference[oaicite:11]{index=11} Hidden Fields Hide fields from the record details view so customers only see the information you want them to see. To hide a field, select it from the dropdown list and save the configuration. :contentReference[oaicite:12]{index=12} Create View Allow customers to create new records from the portal. Create Enabled Enable/disable record creation. Create Fields Choose which fields customers can fill in when creating a record. Default Values for Created Records Set predefined values for created records (e.g., assign to a specific user, set a picklist value, etc.). Important: All mandatory fields must be set (either shown to the customer or set via default values) or the record will not be created. :contentReference[oaicite:13]{index=13} Edit View Allow customers to edit existing records from the portal. Edit Enabled Enable/disable editing. Edit Fields Choose which fields customers can edit. Default Values for Updated Records Set predefined values that are applied when a customer updates a record (for example, automatically change a ticket status). :contentReference[oaicite:14]{index=14} Related Records Show related records based on the related list tabs in your CRM. Examples: - Documents related to a record - Tasks and Tickets related to a Project If you have multiple configurations for a related module (for example, “Open Tickets” and “Closed Tickets”), you can choose which configuration the customer should open when clicking a related record. :contentReference[oaicite:15]{index=15} Inventory Modules This tab appears only for modules that use the Inventory block (Quotes, Sales Orders, Purchase Orders, Invoices, etc.). Available options: Enable Inventory Block Show the inventory lines (products/services) at the bottom of the record details page. Inventory Currency Field Choose the field that defines the currency for each record. If set to default, the portal default currency is used. Inventory Line Fields Choose which line-level fields are shown for each product/service row. Totals Fields Choose which summary totals appear at the bottom of the inventory block (discount, tax, totals before/after tax, etc.). :contentReference[oaicite:16]{index=16} Get Paid Fast If a payment gateway (such as PayPal) is configured, you can enable payments for records in a module. Enable Payment Enable/disable the Pay Now button on records. Payment Amount Field Choose which numeric field contains the amount to be paid. Payment Currency Field Choose which field defines the payment currency for the record. If set to default, the portal default currency is used. :contentReference[oaicite:17]{index=17} Update Records When a Payment Is Processed You can automatically update record fields after a payment attempt from the portal. You can define field updates for two scenarios: - On Success Payment - On Cancel Payment You can set as many fields as needed (for example, updating a payment status field). :contentReference[oaicite:18]{index=18}

Last updated on Mar 07, 2026

Publish a Filter as an External Feed

Publish a Filter as an External Feed You can publish a module filter as an external feed, allowing the filtered data to be accessed through a URL and used by external systems such as webforms, integrations, or other applications. This feature extends the normal filter functionality. If you are unfamiliar with filters, see: https://help.simply-crm.com/hc/simply-crm-support/articles/how_to_create_a_custom_filter What an External Feed Does An external feed makes a saved CRM filter accessible through a URL. The filter remains the single source of truth, meaning the feed always uses: - The filter’s module - The filter’s conditions - The filter’s sort order Additional URL parameters can be used to further narrow the results, but never expand them. Common use cases include: - Providing product lists to webforms or websites - Sharing customer phone numbers with a phone system - Making filtered CRM data available to external tools How to Create an External Feed 1. Go to the module where the data is stored. 2. Create or open a Custom Filter. 3. Open the Edit Filter screen. 4. Enable Create external feed. 5. Save the filter. When enabled: - A feed key is automatically generated. - The feed URL becomes available and can be copied. Feed Access and Keys All feeds require a key to be accessed. - The key is automatically generated when the feed is enabled. - The key must be included in the feed URL. - If the key is removed or revoked, the feed becomes inaccessible. This ensures that only systems with the correct URL and key can access the data. Example Feed URLs An external feed URL may look like this: https://yourcompany.simply-crm.com/feed.php?filterid=1234&key=abcd1234example This URL returns the results of the saved filter. You can also add additional parameters to further narrow the results using fields that are already shown in the filter. Example: https://yourcompany.simply-crm.com/feed.php?filterid=1234&key=abcd1234example&name=lego In this example, the feed will only return records where the Name field matches lego, in addition to the conditions already defined in the filter. Another example: https://yourcompany.simply-crm.com/feed.php?filterid=1234&key=abcd1234example&cf_row=1 Here, the results are further filtered to only include records where cf_row matches 1. How Feed Filtering Works When a feed is accessed: 1. The saved filter runs first 2. Any additional URL parameters are applied as extra AND conditions 3. The result set can only be narrowed, never expanded This means you can use parameters such as &name=lego or &cf_row=1 to limit the results further, but never to show records outside the original filter. Limits To keep the feature safe and efficient: - Feeds return a limited number of rows per request - Basic rate limiting and caching may apply If you want, I can also tighten the wording a bit more so it feels even more like a finished Simply-chat HC article.

Last updated on Mar 07, 2026