Home Main category

Main category

Christian Thor
By and 3 others
14 articles

Sale Opportunity Forecasting

Sale Opportunity Forecast in Simply CRM Introduction The Sale Opportunity Forecast feature in Simply CRM is designed to help organizations manage and predict current and future sales opportunities. This tool provides insights into your company’s overall sales pipeline, allowing you to view opportunities by team, individual users, and specific stages. It also supports advanced configurations like financial year settings, targets, and opportunity type mappings for more accurate forecasting. Features of the Sale Opportunity Forecast Forecast Hierarchy Simply CRM's forecast allows you to configure teams and users hierarchically, making it easier to manage forecasting across different levels of the organization. The hierarchy visualization includes: - Administrator: Shown at the top with all users as subordinates. - Vertical Connection: Displays users at the same level. - Horizontal Connection: Indicates senior-subordinate relationships. - Authorization Levels: Darker blue boxes indicate higher authorization, while lighter blue boxes represent lower authorization. You can easily add subordinates by hovering over a user and clicking the "+" button, or remove users with the delete button. FY (Financial Year) Configuration The forecast includes customizable Financial Year (FY) Configuration options: - Period: Choose between monthly or quarterly periods. - Number of Periods: Set the number of periods in your financial year. - FY Start Date: Define the start date for the financial year to align forecasts with your fiscal periods. Sales Stage Mapping This feature allows you to map each sales stage to a broader category (e.g., Pipeline, Best Case, Committed, Closed). This helps ensure accurate reporting by categorizing opportunities consistently across your teams. Opportunity Type Mapping Similar to sales stage mapping, opportunity type mapping allows you to categorize opportunities (e.g., New Business, Resale). This categorization improves forecasting accuracy and reporting clarity. Targets You can assign targets for each financial year per sales representative or team. These targets can be based on opportunity type or other custom criteria. To adjust a target, simply click on the value, type in the new amount, and click anywhere on the screen to save. Understanding the Forecast Report The Forecast Report is where users and managers can view the forecast data in detail. Here’s how it works: - View Forecast: Clicking this button opens the forecast report. - User and Sales Team List: Located in the left sidebar, this displays a list of users and their teams. - Sort by User: Clicking on a user reveals a "speedometer" style graph and their progress. - Sort by Period: The period dropdown allows you to sort the report by the financial periods (e.g., months or quarters) configured during setup. Under the Best Case Chart, you'll find a list view of opportunities, which can be expanded to show details by sales stage or user. You can also sort the opportunities by periods, users, or teams to get a clear overview of the forecast. Conclusion The Sale Opportunity Forecast in Simply CRM provides an intuitive and powerful tool for managing and predicting sales performance. By configuring financial periods, sales stages, and opportunity types, you can generate accurate forecasts that help teams stay on track with their targets. For more information or assistance with setting up your forecast, please reach out to our support team.

Last updated on Sep 22, 2024

Introduction to Webhooks

An introduction to Simply CRM Webhooks Webhooks in Simply CRM let you send or receive information automatically when things happen—like a little messenger running between Simply CRM and your favorite apps. Whether it’s sending information out (outgoing) or receiving it (incoming), webhooks make your life easier by automating things you’d normally have to do manually. If you're already familiar with how webhooks work, feel free to jump straight to how to set up incoming webhooks or outgoing webhooks. Here’s what we’ll cover: - What webhooks are (in a way that makes sense). - Where to find webhook settings in Simply CRM. - How to test your webhooks without the frustration. - Security and authentication. - Understanding the data format (JSON). What Are Webhooks? Webhooks are like smart notifications that automatically send or receive information when something important happens. It’s like getting an automatic email whenever something changes—but instead of a person sending it, it’s Simply CRM telling another system, or receiving a message from another system. Examples: - Outgoing Webhook: When a deal in Simply CRM is updated, an outgoing webhook can instantly send that information to your accounting software. You don’t need to lift a finger. - Incoming Webhook: When someone signs up on your website, their information can be sent straight to Simply CRM, creating a new contact automatically. Where to Find Webhooks in Simply CRM You can set up webhooks in two places: 1. Incoming Webhooks: These receive data from external systems. Head over to Settings > Webhooks > Incoming to set them up. This is great when you want Simply CRM to take in new data from other services (like new signups from your website). 2. Outgoing Webhooks: These are part of workflows, so you can trigger them when something happens inside Simply CRM (like when a deal is updated). Go to Settings > Automation > Workflows and choose the action "Send Webhook." Testing Your Webhooks Testing is a smart move to make sure your webhooks are doing what they’re supposed to do. Here’s how you can test both incoming and outgoing webhooks without too much hassle: Using Postman Postman lets you simulate how your webhook will send or receive data. It’s great for testing outgoing webhooks from Simply CRM, but you can also use it to simulate incoming webhooks. 1. Download Postman (Yay! It's free!). 2. Create a new request in Postman. 3. Set the request method to POST. 4. For outgoing webhooks, enter the external service’s URL that will receive the data. - Add your test data (like a sample deal update or contact creation). - Click send and check the external service to see if it got the data. 5. For incoming webhooks, you’ll do the reverse—enter Simply CRM’s webhook URL in Postman. - Add some sample data (like a new signup), and check if it creates a new contact in Simply CRM. 6. You can learn more about using Postman here. Using webhook.site Webhook.site is another super handy tool that makes it easy to receive and inspect webhook data. This is especially helpful for testing outgoing webhooks to see exactly what Simply CRM is sending. 1. Go to webhook.site and grab your unique URL. 2. For outgoing webhooks, paste this URL into your Simply CRM webhook settings as the destination. - When the webhook triggers, you’ll see the data appear instantly on webhook.site’s dashboard. 3. For incoming webhooks, you can use webhook.site to simulate the service that sends data to Simply CRM. - Grab your incoming webhook URL from Simply CRM and trigger the event on webhook.site to see what your system receives. 4. You can explore more about webhook.site here. Security (Authentication) Let’s talk security—because you don’t want just anyone messing with your webhooks. Simply CRM offers a couple of simple ways to keep things secure: - Basic Auth: Think of it like logging into a website with a username and password. You’ll provide these, and Simply CRM will send them with the webhook to prove it’s coming from you. - API Tokens: This works like a secret password hidden in the URL. Add the token to your webhook URL, and it verifies that the request is legit. Understanding the Data Format (JSON) Webhooks in Simply CRM use JSON (JavaScript Object Notation) to send or receive information. Don’t worry—it’s not as scary as it sounds. JSON is just a way to organize the data so that it’s clear and readable by both systems. Here’s an example of the type of data Simply CRM might receive when someone signs up on your website: jsonKopier kode{ "event": "new.signup", "data": { "email": "newuser@example.com", "name": "New User", "signup_date": "2024-10-23" } } In this case, Simply CRM would receive details about a new signup: their email, name, and the date they signed up. Conclusion Webhooks are a simple yet powerful way to automate tasks and make your systems work together. Whether you’re sending or receiving data, webhooks make things easier by doing it automatically—so you don’t have to. Make sure to test them using tools like Postman or webhook.site, and set up proper security to keep things running smoothly. For more specific guides on setting up webhooks, check out these articles: - Incoming Webhooks - Outgoing Webhooks

Last updated on Oct 24, 2024

Incoming Webhooks

Simply CRM Incoming Webhooks Welcome to the guide for setting up Incoming Webhooks in Simply CRM. If you haven’t already checked out our introduction to webhooks or are curious about outgoing webhooks, feel free to give them a quick read first to get a fuller picture of how Simply CRM uses webhooks to send and receive data. We also have a slightly more elaborate guide on How to Create and Manage Incoming Webhooks if you need this. Incoming webhooks allow Simply CRM to receive data from external systems or applications, automatically creating or updating records without any manual input. How to Set Up Incoming Webhooks Here’s how you can set up incoming webhooks in Simply CRM: 1. Go to Settings: Navigate to Settings > Webhooks > Incoming to manage your incoming webhooks. 2. Create a New Webhook: Click on the button to create a new webhook. 3. Fill Out the Webhook Details: When setting up the webhook, you'll be prompted to complete the following fields: - Webhook Name: Choose a name to identify your webhook. - Module Name: Select the Simply CRM module where the incoming data will be recorded (e.g., Contacts, Deals). - Is Active: Choose whether the webhook should be active or paused. - Mandatory Fields: Specify which fields must be filled to create or update a record. Fields marked in red are required. 4. Configure the Data Fields: After selecting your module, define which fields the webhook will populate from the incoming data. For each field, you can choose: - VALUE: A fixed value to be used for this field. - FIELD: Pull the value directly from the incoming data (JSON). Testing Your Incoming Webhooks To make sure everything’s set up correctly, it's important to test your incoming webhooks. You can use tools like Postman or webhook.site to simulate and inspect the incoming data: - Postman: Create a POST request to simulate sending data to your webhook. Enter the Simply CRM webhook URL, add your test data in JSON format, and send the request. This helps you check whether your webhook is receiving and processing data as expected. - webhook.site: Use webhook.site to inspect the data your webhook receives. Simply trigger an event from your external system, and webhook.site will display the incoming data for you to verify. Both tools are easy to use, and we’ve mentioned them in our general webhooks guide, so feel free to check that out for more details. JSON Format for Incoming Webhooks The data sent to Simply CRM via incoming webhooks is structured in JSON format. This ensures that the information is well-organized and can be processed by Simply CRM. Here’s an example of a typical JSON payload: jsonKopier kode{ "event": "new.contact", "data": { "name": "John Doe", "email": "johndoe@example.com", "phone": "123456789" } } This example shows how a new contact’s information (name, email, phone) could be sent to Simply CRM, where the system would create a new record based on the incoming data. Conclusion Incoming webhooks are a powerful way to streamline data entry in Simply CRM. By automatically pulling in data from external systems, you can save time and reduce manual work. Whether you’re receiving new signups, updates from other platforms, or any other data, incoming webhooks keep your CRM up-to-date. Be sure to also check out our guides on outgoing webhooks and the general introduction to webhooks to explore more ways to automate and integrate Simply CRM into your workflows.

Last updated on Oct 23, 2024

Outgoing Webhooks

Outgoing webhooks in Simply CRM let you send data to, or retrieve data from, an external system automatically when a workflow is triggered. This is useful when you want to: - send CRM data to another system - fetch data from an external API - use the response from an external system to create or update records in Simply CRM If you are new to webhooks, these related articles are also useful: - Introduction to Webhooks - Incoming Webhooks - Outgoing Webhooks Where to find it Go to: Settings > Automation > Workflows Create or edit a workflow, and in the Actions section choose Add WebHook. If you need more background on workflows and webhook basics, see: - Introduction to Webhooks - Outgoing Webhooks Main webhook settings When adding an outgoing webhook, you can configure the following. Action Title An internal name for the webhook action. Description An optional internal description of what the webhook does. URL to Notify This is the external endpoint that Simply CRM will call. Example: https://api.example.com/offers You can also include query parameters directly in the URL. HTTP method Choose the method that should be used for the request, for example: - GET - POST The correct method depends on what the external system expects. Authorization Type You can choose how the request should be authenticated: - Basic Authentication - No Authentication - Token - Bearer Token Use the type required by the receiving API. Request Type This controls how the data is sent. A common option is: - query — sends data as query parameters Use the request type required by the external system. Key / Value fields You can add as many key/value rows as needed. - Key = the parameter name - Value = the value to send - Header Field = if checked, the key/value pair is sent as a request header instead of normal request data This can be used for: - fixed values - CRM field values - credentials - API keys - custom parameters required by the external API Important behavior when selecting fields from dropdowns When you select a field from a dropdown, * is appended automatically. This means the workflow will search values in the database dynamically. If you type the field name manually instead of selecting it from the dropdown, it will not be overwritten automatically. You can also manually enter your own custom parameter names. Using predefined variables You can use predefined variables in the webhook configuration. This works in: - the URL - the Value fields - credentials such as username, password, token, API key, and similar fields Examples: - $$global_wordpress_url$$ - $$global_api_username$$ - $$global_api_key$$ - $$global_magento_apikey$$ These values are defined centrally under: Admin > Predefined Settings This is useful when: - the same integration is used in multiple workflows - credentials or base URLs should be maintained in one place - you want to avoid hardcoding sensitive values into every workflow Example Instead of writing: https://my-wordpress-site.com/wp-json/custom-endpoint you can write: $$global_wordpress_url$$/wp-json/custom-endpoint If the predefined setting is updated later, workflows using it will automatically use the new value. Example: storing a temporary API token in a global value A predefined value can also be filled from a webhook response and then reused in other webhook calls. Example: $$global_magento_apikey$$ This is useful when an external system requires a temporary token that only stays valid for a limited time, for example 1 hour. Example setup You could create a workflow with a timed trigger that runs every 45 minutes. That workflow could contain a webhook that: 1. logs in to Magento 2. retrieves a valid API token 3. saves that returned token into the predefined setting global_magento_apikey Other workflows can then use: $$global_magento_apikey$$ in their headers, URL values, or other webhook parameters. This allows you to centralize token handling and reuse the latest valid token across multiple webhook actions. Using date variables You can also use dynamic date variables in the webhook. Examples: - $$get_date('today')$$ - $$get_date('yesterday')$$ These return dynamic date values when the workflow runs. This is useful when the external API expects a date filter in the request, for example: - fetch records from today - fetch records from yesterday - limit returned data based on a date Example https://api.example.com/orders?date=$$get_date('today')$$ Or as a value: - Key: from_date - Value: $$get_date('yesterday')$$ Skip duplicates by saving and comparing past response This option allows the webhook action to compare the newest response with the previous response. When enabled: 1. Simply CRM saves the latest webhook response 2. on the next run, the new response is compared with the previously saved response 3. if the response is identical to the last saved response, the action is skipped This is useful when the webhook is used to regularly fetch data from an external system, but you only want Simply CRM to continue processing when the returned data has actually changed. Typical use cases - polling an external API on a schedule - avoiding repeated creation of identical data - reducing unnecessary updates when the external result has not changed Important note This compares the full latest response against the previously saved response. If the response is unchanged, the webhook step is skipped. Handle Response The Handle Response section is used when you want to take values from the webhook response and save them into fields in Simply CRM. For each row: - choose the destination CRM field on the left - define the source value from the webhook response on the right Example response [ { "title": "Example Deal", "price": 2500, "customer_no": "CUST-1001", "created_on": "2025-03-01", "end_date": "2025-03-31" } ] Example mapping - potentialname -> [*].title - amount -> [*].price - customer_no -> [*].customer_no - createdtime -> [*].created_on - closingdate -> [*].end_date In this example, [*] means the response contains multiple records and that the mapping should use values from all returned items. Extracting values from the response You can extract values from the response using path expressions. Multiple records Use: [*].customer_no if you want the customer_no value from all returned records. This is typically used when the response contains many records and you want Simply CRM to create or update multiple CRM records based on the returned data. First record only Use: [0].customer_no if you only want the value from the first record in the response. This is useful when you only want to process the first returned item. Nested arrays You can also extract values from nested arrays. Example: items.[*].quantity This means: - go into the items array - retrieve the quantity value from all records inside that array You can use similar structures for other nested response formats. Examples: - items.[*].sku - items.[*].name - data.[0].customer_no - response.items.[*].quantity Nested object example If the webhook response contains nested JSON objects, you can access sub-values using dot notation. Example: { "statistics": { "counts": { "all": 7380, "closed": 6954, "opened": 426 } } } To get the value 426, use: statistics.counts.opened in the Handle Response source field. Record Matching The Record Matching dropdown allows you to define how Simply CRM should identify whether a returned record already exists. Here you choose an existing field in Simply CRM that should act as the unique identifier. Typical examples: - record number - email address - external ID - customer number - order number How it works When the webhook response is processed: 1. Simply CRM reads the value from the mapped field in Handle Response 2. it checks whether a record already exists with the same value in the field selected under Record Matching 3. if a match is found, the existing record is updated 4. if no match is found, a new record is created Important requirement For Record Matching to work, the matching value must also be filled in Handle Response. That means you must first map the response value to a CRM field in Handle Response, and then select that same field in Record Matching. If the value is not mapped in Handle Response, Simply CRM has nothing to compare against and cannot match existing records. Example If the response contains: [ { "customer_no": "CUST-1001", "title": "Example Deal", "price": 2500 } ] You could map: - customer_no -> [*].customer_no - potentialname -> [*].title - amount -> [*].price Then choose customer_no in Record Matching. Result: - if a record already exists with customer_no = CUST-1001, that record is updated - if no record with that customer number exists, a new record is created This is especially useful when syncing data from external systems without creating duplicates. Example setup Below is a typical example of an outgoing webhook used to fetch records from an external API and create or update CRM records. URL $$global_external_api_url$$/offers Authentication / header values Examples: - Username -> $$global_api_username$$ - Password -> $$global_api_password$$ - APIKey -> $$global_api_key$$ If these should be sent as headers, enable Header Field on those rows. Duplicate checking Enable Skip duplicates by saving and comparing past response if you only want processing to continue when the response changes. Handle Response example - potentialname -> [*].title - amount -> [*].price - customer_no -> [*].customer_no - createdtime -> [*].created_on - closingdate -> [*].end_date Record Matching example Choose a unique field such as: - customer number - email - order number - external ID If a returned record matches an existing value in that field, the existing record is updated instead of creating a new one. Testing and troubleshooting When testing outgoing webhooks, check: - that the URL is correct - that the authentication type matches the external API - that required headers are marked as Header Field - that the response structure matches your Handle Response mappings - that the matching field in Record Matching is also mapped in Handle Response For testing, tools like Postman and webhook.site are useful. The current webhooks overview article also recommends those tools. (help.simply-crm.com) If records are not being updated as expected: - verify that the returned value really exists in the webhook response - verify that the target CRM field is mapped correctly - verify that the selected Record Matching field contains the same value in existing records If no new data is being processed: - check whether Skip duplicates by saving and comparing past response is enabled - if enabled, the response may be identical to the previous run and therefore intentionally skipped Related articles - Introduction to Webhooks - Incoming Webhooks - Outgoing Webhooks -

Last updated on Mar 11, 2026

Simply CRM Facebook Leads Integration Terms of Service

Welcome to the Simply CRM Facebook Leads Integration. These Terms of Service ("Terms") govern your use of the Simply CRM Facebook Leads Integration ("Integration"), a feature that enables users to automatically sync leads collected via Facebook Lead Ads to their Simply CRM account. By using the Integration, you agree to comply with and be bound by these Terms. If you do not agree to these Terms, you may not use the Integration. 1. Service Description The Simply CRM Facebook Leads Integration allows paying Simply CRM users to automatically synchronize leads generated from Facebook Lead Ads into their respective Simply CRM accounts. The Integration is offered as a feature of the Simply CRM platform and is available at no additional charge to our existing CRM customers. 2. Eligibility To use the Integration, you must: - Be a paying user of Simply CRM. - Have an active Simply CRM account. - Have an active Facebook account with access to Facebook Lead Ads. - Provide the necessary permissions for the integration to access and sync lead data from your Facebook Lead Ads. 3. Data Collection and Use By using the Integration, you authorize Simply CRM to collect lead data from your Facebook Lead Ads and automatically transfer it into your Simply CRM account. The data collected will include, but is not limited to: - Lead contact information (name, email, phone number, etc.). - Any other data collected via your Facebook Lead Ads. Simply CRM will store and process this data solely for the purpose of providing the integration service. We will not share or sell this data to third parties. Your use of the Integration is subject to our Privacy Policy. 4. User Responsibilities You are responsible for: - Ensuring that your Facebook account and Facebook Lead Ads comply with Facebook's policies and applicable laws. - Managing and securing access to your Simply CRM and Facebook accounts. - Providing accurate and complete information when setting up the Integration. Simply CRM is not responsible for any errors or issues caused by incorrect setup, user error, or non-compliance with Facebook's advertising guidelines. 5. No Additional Fees The Facebook Leads Integration is provided as a free feature to active Simply CRM customers. There are no additional fees for using the Integration. However, Simply CRM reserves the right to introduce new features or premium services in the future that may incur additional costs. 6. Limitations and Availability Simply CRM will make reasonable efforts to ensure the Integration is available and functioning. However, we do not guarantee: - Continuous, uninterrupted, or error-free operation of the Integration. - Compatibility with all Facebook features or future updates to Facebook’s platform. Simply CRM reserves the right to modify, suspend, or discontinue the Integration at any time without prior notice. 7. Termination Simply CRM may terminate or suspend your access to the Integration without notice if: - You violate these Terms. - You fail to comply with Facebook's terms or Simply CRM’s terms. - Your Simply CRM account is inactive or canceled. Upon termination, your ability to use the Integration will cease immediately. 8. Liability Simply CRM is not liable for: - Any indirect, incidental, special, or consequential damages that may result from the use of the Integration. - Any loss of data or leads due to errors, network issues, or third-party service disruptions (e.g., Facebook outages). You agree to use the Integration at your own risk and acknowledge that Simply CRM provides the service on an "as-is" basis without warranties of any kind. 9. Changes to Terms Simply CRM reserves the right to modify these Terms at any time. Changes will be posted on this page, and your continued use of the Integration after the effective date of the updated Terms constitutes acceptance of the modified Terms. 10. Contact Information If you have any questions about these Terms or the Simply CRM Facebook Leads Integration, please contact us at support@simply-crm.com By using the Simply CRM Facebook Leads Integration, you acknowledge that you have read, understood, and agreed to these Terms of Service.

Last updated on Nov 04, 2024

What Are Product Bundles in Simply CRM?

Product bundles in Simply CRM allow you to group multiple products or services together and sell them as a single package. This is especially useful when you regularly offer a set of products together—for example, a starter kit, service packages, or a hardware + support combo. Each bundle includes: - A parent product (the bundle itself) - One or more child products (the items included in the bundle) This feature helps streamline your sales process, simplify invoicing, and provide clear visibility into what’s included in each offer. Benefits of Using Product Bundles - Sell multiple items as a single unit - Save time on data entry - Apply discounts to the full package or individual items - Ensure consistent pricing and product combinations - Improve reporting on bundled offers How to Create a Product Bundle in Simply CRM Follow these steps to create a new product bundle: 1. Navigate to the Products module Go to Inventory > Products in the main menu. 2. Create or edit the parent product This will be the bundle that contains the grouped items. Click Add Product or open an existing one. 3. Scroll to the ‘Bundle Items’ section Find the section labeled Product Bundles or Sub Products (depending on your version). 4. Add child products Click Add Product Line and select the individual products you want to include. Specify quantity and price if needed. 5. Save the product Once your bundle is set up, click Save. You can now use this bundle in Quotes, Invoices, Sales Orders, and more. How to Use Product Bundles in Sales Documents When creating a new Quote, Invoice, or Sales Order: 1. Add the bundle product to the item list. 2. The child products will be automatically listed below. 3. You can adjust quantities or apply discounts as needed. 4. Save and send the document like usual. Tips and Best Practices - Use clear names for bundle products so your team and customers know what’s included. - If pricing needs to be adjusted frequently, consider setting bundle prices dynamically based on the child products. - Use descriptions in the bundle to explain what’s included in simple terms for the customer. If you have any questions about using product bundles in Simply CRM, don’t hesitate to contact our support team.

Last updated on Mar 28, 2025

Guide to Meeting Scheduler

You can find this feature in your CRM under: Settings → Other Settings → Meeting Scheduler Setup 🔧 Setting up a new schedule 1. Create a new schedule - Click "Add User" to start the setup. 2. Fill in basic information - Subject: The meeting name or type (e.g. Demo, Support, Consultation). - Description: A short text explaining what the meeting is about. - Location: Where the meeting will take place (e.g. “Teams link” or “I will call you on your phone number”). 3. Choose meeting length - You can allow multiple durations: 15, 30, 45, or 60 minutes. - The person booking will select one of these. 4. Select user(s) - Add the CRM user who should be bookable (e.g. simplysupport). - If Check User Existence is enabled, the system validates that the user actually exists in CRM. 5. Workdays - Select the weekdays when meetings can be booked (e.g. Monday–Friday). 6. Workhours - Set available hours for booking (e.g. 09:00 – 17:00). 7. TimeZone - Choose the timezone for this schedule (e.g. Europe/Brussels). - On the booking page, the time will automatically adjust to the visitor’s local timezone. 8. Minimum notice - Define how far in advance a meeting can be booked (e.g. 0 minutes = immediate booking allowed). 9. Name and email (when adding a new user) - If you want to add a new CRM user, enter their name and email here. 📋 Overview of configured schedules Once created, schedules will appear in the table below: - Users: Which CRM user(s) can be booked - Subject, Location, Description: Information shown to the person booking - Workdays & Workhours: Available booking days and times - TimeZone: Timezone for this schedule - Minimum Notice: Shortest allowed booking notice - Length of Meeting: The durations available (15, 30, 45, 60 min) - Copy URL: Shareable link to the public booking page - Edit: Adjust the configuration - Delete: Remove a schedule 🌍 Booking – what the customer sees When you share the Copy URL, the customer will see a booking page like in your screenshot: 1. They choose the meeting length (15, 30, 45, or 60 minutes). 2. They pick an available date and time from the calendar. 3. They see your subject, description, and location (e.g. “I will call you on your phone number”). 4. The booking is saved in the system. ✅ Summary - Set up users with availability, meeting lengths, and timezones. - Share the booking link (Copy URL) with customers or partners. - Customers can book meetings directly in your schedule based on your defined settings.

Last updated on Oct 01, 2025

Connect Microsoft Business Central to Simply CRM

Connect Microsoft Business Central to Simply CRM This guide shows you how to connect Microsoft Dynamics 365 Business Central with Simply CRM, so data can be synced and used in your CRM. You will set up an app in Azure, give it the right permissions, and connect it to Simply CRM. What you need before you start Make sure you have: - An active Microsoft Dynamics 365 Business Central account - Access to Azure Active Directory (Microsoft Entra ID) - A custom domain that is validated in Azure - Admin access to your Microsoft tenant (to approve permissions) Step 1: Validate your domain in Azure Your domain must be validated before Microsoft allows API access. - Go to Azure / Entra ID - Add and validate your custom domain using DNS - Confirm that: - The domain shows as verified - You can log in to the Microsoft 365 admin center with this domain Step 2: Create an app in Azure You need to create an application that Simply CRM can use to access Business Central. - Go to Azure Portal → App registrations - Create a new application - Set a Web redirect URL to: - https://sai.simplyhq.com/bc365_auth.php - After creating the app: - Copy the Tenant ID - Copy the Client ID - Create a Client Secret - Save the secret value (you will not be able to see it again) Step 3: Add API permissions Your app must have access to Business Central. In your Azure app: - Go to API permissions - Add permissions for Dynamics 365 Business Central - Make sure these permissions are added: - app_access (Application) - Automation.ReadWrite.All (Application) - user_impersonation (Delegated) - Also add: - Microsoft Graph → User.Read (Delegated) Then: - Click Grant admin consent - Confirm that the status shows as Granted Step 4: Enter credentials in Simply CRM In Simply CRM: - Go to the Business Central integration settings - Enter: - Tenant ID - Client ID - Client Secret value - Click Log in to BusinessCentral365 You will be redirected to Microsoft to approve access. Step 5: Confirm the connection After you are redirected back to Simply CRM: - The Business Central integration status should turn green - If it is red, the connection failed Troubleshooting (if it does not work) If the connection fails, check: - The domain is fully validated in Azure - The Client Secret is correct and not expired - Admin consent was granted for all permissions - The redirect URL matches exactly - You are logging in with a Microsoft admin user Next steps Once connected, you can start syncing data between Business Central and Simply CRM. If you need help with what data is synced or how to use it in Simply CRM, see the related integration guides in the helpdesk.

Last updated on Feb 23, 2026

Sales Opportunity Forecast

Overview The Sales Opportunity Forecast module in Simply CRM helps you project expected revenue based on open sales opportunities. It provides visibility into pipeline value, weighted forecasts, and expected closing performance. Use it to: - Track revenue targets - Review projected income - Monitor pipeline health - Support cash-flow planning How Forecasting Works The forecast is calculated from your Opportunities (Deals) using: - Sales Stage - Amount - Probability - Expected Close Date Weighted Forecast Formula Forecast Amount = Opportunity Amount × Probability (%) Example: - Deal Value: $10,000 - Probability: 60% - Forecast Contribution: $6,000 Key Features 1) Forecast by Time Period View expected revenue by: - Month - Quarter - Year - Custom date range 2) Forecast by Sales Rep Analyze projected revenue by individual users for: - Performance reviews - Target tracking - Coaching and performance management 3) Forecast by Sales Stage See how projected revenue is distributed across your pipeline stages (e.g., Prospecting, Proposal, Negotiation, Closed Won) to identify bottlenecks. 4) Probability-Based Projections The module calculates weighted revenue using probability values assigned to each sales stage. To adjust stage probabilities: - Settings → Sales Stages How to Use the Module Step 1: Confirm Opportunity Data For accurate forecasting, ensure each opportunity includes: - Amount - Sales Stage - Probability - Expected Close Date Step 2: Open the Module Navigate to: - Sales → Sales Opportunity Forecast Step 3: Apply Filters Filter results by: - Date range - Sales rep - Sales stage - Team Step 4: Review Results The module displays: - Total pipeline value - Weighted forecast total - Number of opportunities - Breakdown by stage and/or user Best Practices - Keep probabilities realistic - Update close dates regularly - Re-stage or close stalled opportunities - Review forecasts weekly - Align stage probabilities with historical performance Common Use Cases Revenue Planning Estimate upcoming revenue for budgeting and financial planning. Sales Performance Tracking Compare forecasted revenue against actual closed revenue. Cash-Flow Prediction Anticipate income based on expected close dates. Executive Reporting Provide leadership with a clear snapshot of projected revenue and pipeline health. Troubleshooting Forecast Numbers Look Incorrect Check: - Are probabilities assigned to all sales stages? - Are opportunity amounts completed? - Are expected close dates accurate? - Are filters excluding relevant records? Forecast Is Lower Than Expected Common causes: - Opportunities concentrated in low-probability stages - Missing close dates - Early-stage heavy pipeline - Narrow date filters applied Summary The Sales Opportunity Forecast module in Simply CRM provides probability-weighted visibility into future revenue. Maintaining accurate opportunity data and realistic stage probabilities ensures reliable forecasting and stronger sales planning.

Last updated on Mar 02, 2026

Simply CRM Workflow Action Expressions Guide

This guide explains the workflow expressions available in Simply CRM for Update fields and related workflow actions that use the same expression engine. It includes: - supported expression syntax - available functions - practical examples - important usage notes What these expressions are used for Workflow expressions let a workflow calculate, transform, or retrieve values when it runs. Typical uses include: - filling a field from other fields - combining text values - calculating dates - formatting text - applying conditions - reading related-record values - working with JSON data in advanced workflows Basic syntax rules Strings use single quotes Use: 'Open' Not: "Open" Fields can be referenced directly Example: firstname Expressions can be combined Example: concat(firstname, ' ', lastname) Arithmetic and comparisons are supported Examples: amount + 100 quantity * unit_price amount >= 5000 Conditional logic is supported Syntax: if condition then value_if_true else value_if_false end Example: if amount > 1000 then 'Large deal' else 'Standard deal' end Fields from related records can be read directly Syntax: (reference_field : (Module) fieldname) Example: (account_id : (Accounts) phone) This reads the phone field from the related Account record referenced by account_id. Common examples Use a field value directly firstname Returns the value of firstname. Build a full name concat(firstname, ' ', lastname) Example result: John Smith Categorize a record by amount if amount > 1000 then 'Large deal' else 'Standard deal' end Read a related record field (account_id : (Accounts) phone) Returns the related Account phone number. Supported functions 1. substring(string, start, end) Returns part of a string. Example substring(subject, 0, 10) Returns the first 10 characters of subject. Example substring(accountname, 3, 8) Returns characters from position 3 to 8. Note If used with only 2 parameters, it returns the text from the start position to the end of the string. 2. preg_replace_str_only(pattern, replacement, subject) Performs a regex replacement on a string. Example preg_replace_str_only('/[^0-9]/', '', phone) Removes all non-numeric characters from a phone number. Example result If phone is: +49 (123) 456-789 Result: 49123456789 3. split(string, separator, index) Splits a string and returns one part. Example split(email, '@', 0) Returns the part before @. Example split(email, '@', 1) Returns the domain part of the email. Example result If email is: john@example.com Then: split(email, '@', 0) returns: john and: split(email, '@', 1) returns: example.com 4. concat(a, b, ...) Joins multiple values together. Example concat(firstname, ' ', lastname) Result: John Smith Example concat('INV-', invoice_no) Result: INV-100045 Note This function can accept more than two values. Example: concat(firstname, ' ', lastname, ' - ', email) 5. time_diff(a, b) Returns the difference between two date/time values. Example time_diff(closingdate, createdtime) Returns the time difference between closingdate and createdtime. 6. time_diff(a) Returns the difference between the current date/time and the provided value. Example time_diff(duedate) Useful in advanced date/time calculations. 7. time_diffdays(a, b) Returns the difference in days between two date/time values. Example time_diffdays(closingdate, createdtime) Returns the number of days between the two dates. 8. time_diffdays(a) Returns the number of days between now and the provided value. Example time_diffdays(duedate) Useful for overdue or remaining-days logic. 9. add_days(datefield, noofdays) Adds days to a date. Example add_days(closingdate, 7) Returns a date 7 days after closingdate. Example add_days(30) Returns a date 30 days from today. Common use Set a due date 14 days from today: add_days(14) 10. sub_days(datefield, noofdays) Subtracts days from a date. Example sub_days(closingdate, 3) Returns a date 3 days before closingdate. Example sub_days(10) Returns the date 10 days before today. 11. add_months(datefield, noofmonths) Adds months to a date. Example add_months(start_date, 1) Returns a date 1 month after start_date. Example add_months(contract_start_date, 12) Returns the anniversary date one year later. 12. sub_months(datefield, noofmonths) Subtracts months from a date. Example sub_months(contract_end_date, 2) Returns a date 2 months before contract_end_date. 13. get_date('today') Returns today’s date. Example get_date('today') 14. get_date('tomorrow') Returns tomorrow’s date. Example get_date('tomorrow') 15. get_date('yesterday') Returns yesterday’s date. Example get_date('yesterday') Common use Set a field to the current date: get_date('today') 16. add_time(timefield, minutes) Adds minutes to a time value. Example add_time(time_start, 30) Returns a time 30 minutes after time_start. Example add_time(15) Returns the current time plus 15 minutes. 17. sub_time(timefield, minutes) Subtracts minutes from a time value. Example sub_time(time_end, 45) Returns a time 45 minutes before time_end. 18. power(base, exponential) Raises a number to a power. Example power(2, 3) Returns: 8 Example power(quantity, 2) Returns the square of quantity. 19. getDateValue(dateValue, format) Formats a date/time value. Example getDateValue(createdtime, 'd/m/Y') Formats createdtime as day/month/year. Example getDateValue(createdtime, 'l j \of F Y h:i:s A') Could produce something like: Monday 4 of March 2026 09:15:22 AM Example getDateValue('d/m/Y') Formats the current date/time using the given format. Common use Store a user-friendly date string: getDateValue(closingdate, 'd.m.Y') 20. str_contains(a, b) Checks whether two |##|-separated multi-value strings share at least one common value. Example str_contains(cf_1234, 'Blue|##|Green') Returns true if cf_1234 contains either Blue or Green. Important note This is not a normal substring search. It is mainly useful for multi-select picklist style values. Example If cf_1234 contains: Red|##|Blue|##|Yellow then: str_contains(cf_1234, 'Blue|##|Green') returns true. 21. RecurrenceRuleAsDates(sourcefield, format, endDate, startDate) Creates a comma-separated list of dates from a recurrence rule field. Example RecurrenceRuleAsDates(recurrence_rule, 'd/m/Y', '31/12/2026', '01/01/2026') Useful in advanced scheduling or recurrence-based workflows. 22. GetFieldValue(sourcefield) Returns a field value. Example GetFieldValue(firstname) Returns the value of firstname. Example with related field GetFieldValue((account_id : (Accounts) phone)) Returns the phone number from the related Account. Note In many simple cases, the field can be used directly without wrapping it in GetFieldValue(). 23. GetTime(sourcefield) Converts a decimal hour value into HH:MM. Example GetTime(1.5) Returns: 01:30 Example GetTime(hours_worked) If hours_worked is 2.75, the result would be: 02:45 24. UrlDecode(sourcefield) URL-decodes a string. Example UrlDecode(cf_encoded_text) If the field contains: Hello%20World it returns: Hello World 25. changeCase(sourcefield, operation) Changes the letter case of text. Supported operations: - 'upper' - 'lower' - 'ucfirst' - 'ucwords' Example changeCase(lastname, 'upper') Result: SMITH Example changeCase(firstname, 'ucfirst') Result: John Example changeCase(accountname, 'ucwords') If the value is: big blue systems the result is: Big Blue Systems Common use Normalize all-uppercase imports: changeCase(firstname, 'ucfirst') 26. searchModule(module, field, operator, value, returnFields) Searches another module and returns matching records as JSON. Supported operators: - 'equal' - 'contains' - 'notequal' Example searchModule('Contacts', 'email', 'equal', email, '[firstname,lastname,email]') Searches Contacts where email exactly matches the current record email. Example searchModule('Accounts', 'accountname', 'contains', accountname, '[id,accountname,phone]') Searches Accounts whose account name contains the current record account name. Note This is an advanced function, mainly useful for integrations and automation logic. 27. jsonArrayMerge(param1, param2) Merges two JSON arrays or JSON objects. Example jsonArrayMerge('{"a":1}', '{"b":2}') Result: {"a":1,"b":2} Example jsonArrayMerge(cf_json_part1, cf_json_part2) Combines two JSON values from fields. 28. json_get(fieldname, key) Reads a value from JSON using a key path. Example json_get(cf_json_payload, 'customer.name') Returns the nested value of customer.name. Example json_get(cf_json_payload, 'items[0].sku') Returns the sku of the first item in the items array. Example If cf_json_payload contains: {"customer":{"name":"John"}} then: json_get(cf_json_payload, 'customer.name') returns: John 29. json_set(fieldname, key, value) Sets or updates a value in JSON. Example json_set(cf_json_payload, 'customer.name', firstname) Updates customer.name using the current record firstname. Example json_set(cf_json_payload, 'status', 'Processed') Sets the top-level status value to Processed. Example If cf_json_payload contains: {"status":"New"} then: json_set(cf_json_payload, 'status', 'Processed') returns updated JSON similar to: {"status":"Processed"} 30. json_get_line_items(recordId) Returns line items from an inventory record as JSON. Example json_get_line_items(id) Useful in modules such as: - Quotes - Sales Orders - Purchase Orders - Invoices This is mainly for advanced integrations or JSON transformations. 31. getfieldOptions(Module.fieldname) Returns the available picklist options for a field as JSON. Example getfieldOptions('HelpDesk.ticketstatus') Returns the available values for the ticketstatus field in HelpDesk. Note This is mostly useful in advanced workflows or integrations. Arithmetic operators These operators can be used directly in expressions. Addition amount + 100 Adds 100 to amount. Subtraction amount - discount_amount Subtracts discount_amount from amount. Multiplication quantity * unit_price Calculates the total from quantity and unit price. Division amount / 2 Divides amount by 2. Comparison operators These operators can be used inside conditions. Equal amount == 1000 Greater than amount > 0 Less than amount < 0 Greater than or equal amount >= 500 Less than or equal amount <= 2000 Conditional expressions The expression engine supports if / then / else / end. Basic example if bill_country == 'Denmark' then 'DK' else 'Other' end Another example if amount >= 10000 then 'Enterprise' else 'SMB' end Nested example if amount > 10000 then 'Large' else if amount > 5000 then 'Medium' else 'Small' end Use nested conditions carefully to keep expressions readable. Related field syntax A field from a related record can be read using: (reference_field : (Module) fieldname) Example (contact_id : (Contacts) email) Returns the email of the related Contact. Example (account_id : (Accounts) phone) Returns the phone number of the related Account. Practical use Fill a field on the current record with a value from a linked Account: (account_id : (Accounts) website) Practical examples 1. Build a full name concat(firstname, ' ', lastname) 2. Create a due date 14 days from today add_days(14) 3. Create a due date 7 days after another date add_days(closingdate, 7) 4. Convert text to uppercase changeCase(lastname, 'upper') 5. Capitalize a first name changeCase(firstname, 'ucfirst') 6. Extract an email domain split(email, '@', 1) If email is john@example.com, the result is: example.com 7. Strip formatting from a phone number preg_replace_str_only('/[^0-9]/', '', phone) 8. Categorize a deal by amount if amount >= 10000 then 'Enterprise' else 'SMB' end 9. Pull a related Account phone number (account_id : (Accounts) phone) 10. Read a value from JSON json_get(cf_api_response, 'data.customer_id') 11. Format a date for display getDateValue(closingdate, 'd.m.Y') 12. Prefix a reference number concat('CASE-', ticket_no) Important notes 1. Always use single quotes for text Correct: 'Closed Won' Incorrect: "Closed Won" 2. concat() can take multiple parts Example: concat(firstname, ' ', lastname, ' (', email, ')') 3. str_contains() is for multi-value strings It checks overlap in values separated by |##|, not ordinary text search. 4. Some functions are advanced These are typically used in more advanced workflows or integrations: - searchModule() - jsonArrayMerge() - json_get() - json_set() - json_get_line_items() - getfieldOptions() - RecurrenceRuleAsDates() 5. Related-record syntax is especially useful Example: (account_id : (Accounts) phone) This makes it possible to pull values directly from linked records without custom code. Quick reference Text functions - substring() - preg_replace_str_only() - split() - concat() - UrlDecode() - changeCase() Date and time functions - time_diff() - time_diffdays() - add_days() - sub_days() - add_months() - sub_months() - get_date() - add_time() - sub_time() - getDateValue() - GetTime() Logic and numeric functions - power() - if / then / else / end - arithmetic operators - comparison operators Related-record access - (reference_field : (Module) fieldname) - GetFieldValue() JSON and advanced functions - searchModule() - jsonArrayMerge() - json_get() - json_set() - json_get_line_items() - getfieldOptions() - RecurrenceRuleAsDates() Summary These workflow expressions support: - field-based calculations - text formatting - date arithmetic - conditional logic - related-record lookups - JSON transformation - module search functions Most commonly used expressions include: - concat() - changeCase() - split() - add_days() - get_date() - if ... then ... else ... end - related-record syntax such as (account_id : (Accounts) phone)

Last updated on Mar 08, 2026